diff --git a/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisInvoiceCancellationController.java b/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisInvoiceCancellationController.java index b8556a26e..de4e7750c 100644 --- a/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisInvoiceCancellationController.java +++ b/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisInvoiceCancellationController.java @@ -115,6 +115,60 @@ public class EmisInvoiceCancellationController extends EmisBaseController } } + /** + * 发票红冲登记 + */ + @PreAuthorize("@ss.hasPermi('emis:emisInvoiceCancellation:red')") + @Log(title = "发票红冲登记", businessType = BusinessType.UPDATE) + @PostMapping("/red") + public AjaxResult red(@RequestBody EmisInvoiceCancellation body) + { + if (body == null || body.getId() == null) { + return AjaxResult.error("id不能为空"); + } + String redInvoiceNo = body.getRedInvoiceNo(); + if (StringUtils.isEmpty(redInvoiceNo)) { + return AjaxResult.error("红冲发票号不能为空"); + } + if (!redInvoiceNo.matches("\\d+")) { + return AjaxResult.error("红冲发票号必须为纯数字"); + } + String userCode = SecurityUtils.getLoginUser().getUser().getEmpCode(); + String siteCode = SecurityUtils.getLoginUser().getUser().getOwnerSiteCode(); + try { + return toAjax(emisInvoiceCancellationService.red(body.getId(), redInvoiceNo, userCode, siteCode)); + } catch (EmisBizError e) { + return AjaxResult.error(e.getMessage(), e.getErrorCode()); + } + } + + /** + * 修改红冲发票号 + */ + @PreAuthorize("@ss.hasPermi('emis:emisInvoiceCancellation:redEdit')") + @Log(title = "修改红冲发票号", businessType = BusinessType.UPDATE) + @PostMapping("/red/edit") + public AjaxResult editRed(@RequestBody EmisInvoiceCancellation body) + { + if (body == null || body.getId() == null) { + return AjaxResult.error("id不能为空"); + } + String redInvoiceNo = body.getRedInvoiceNo(); + if (StringUtils.isEmpty(redInvoiceNo)) { + return AjaxResult.error("红冲发票号不能为空"); + } + if (!redInvoiceNo.matches("\\d+")) { + return AjaxResult.error("红冲发票号必须为纯数字"); + } + String userCode = SecurityUtils.getLoginUser().getUser().getEmpCode(); + String siteCode = SecurityUtils.getLoginUser().getUser().getOwnerSiteCode(); + try { + return toAjax(emisInvoiceCancellationService.editRed(body.getId(), redInvoiceNo, userCode, siteCode)); + } catch (EmisBizError e) { + return AjaxResult.error(e.getMessage(), e.getErrorCode()); + } + } + /** * 删除发票作废表 */ @@ -207,12 +261,10 @@ public class EmisInvoiceCancellationController extends EmisBaseController EmisSettleInvoiceRecord query = new EmisSettleInvoiceRecord(); query.setApplySeqNo(applySeqNo); query.setInvoiceNo(invoiceNo); - List invoiceList = emisSettleInvoiceRecordService.selectEmisSettleInvoiceRecordList(query); - if (invoiceList == null || invoiceList.isEmpty()) { + EmisSettleInvoiceRecord invoice = emisSettleInvoiceRecordService.selectInvoiceInfoWithDetail(query); + if (invoice == null) { return AjaxResult.error("发票不存在"); } - EmisSettleInvoiceRecord invoice = invoiceList.get(0); - if (!"2".equals(invoice.getInvoiceStatus())) { return AjaxResult.error("未开票"); } diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisInvoiceCancellation.java b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisInvoiceCancellation.java index eb1d0945c..aaeba4057 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisInvoiceCancellation.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisInvoiceCancellation.java @@ -13,6 +13,7 @@ package com.xdadan.erp.emis.domain; import com.fasterxml.jackson.annotation.JsonFormat; import com.xdadan.erp.common.annotation.Excel; import com.xdadan.erp.common.annotation.audit.DataAuditField; +import com.xdadan.erp.common.annotation.audit.DataAuditTable; import com.xdadan.erp.common.core.domain.BaseEntity; import lombok.Data; @@ -28,6 +29,7 @@ import java.util.List; * @date 2026-01-19 14:33:40 */ @Data +@DataAuditTable(tableName = "emis_invoice_cancellation", tableComment = "发票作废表", bizKey = "applySeqNo") public class EmisInvoiceCancellation extends BaseEntity { private static final long serialVersionUID = 1L; @@ -60,6 +62,17 @@ public class EmisInvoiceCancellation extends BaseEntity private String auditSiteCode; /* 驳回原因 */ private String auditRejectReason; + /* 开票状态 1-已开票 2-已作废,默认为1 */ + private String invoiceStatus; + /* 红冲发票号 */ + @DataAuditField(fieldComment = "红冲发票号") + private String redInvoiceNo; + /* 红冲发票登记人编码 */ + private String redCreateBy; + /* 红冲发票登记网点编码 */ + private String redCreateSite; + /* 红冲发票登记时间 */ + private String redCreateTime; // 扩展信息-查询返回 /* 开票记录表信息 */ @@ -78,5 +91,13 @@ public class EmisInvoiceCancellation extends BaseEntity private String custNo; /* 客户名称 */ private String customerName; + /* 运单号,多个用逗号隔开 */ + private String billCodes; + /* 销售联系人,多个用逗号隔开 */ + private String salesmens; + /* 红冲发票登记人名称 */ + private String redCreateByName; + /* 红冲发票登记网点名称 */ + private String redCreateSiteName; } diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisSettleInvoiceRecord.java b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisSettleInvoiceRecord.java index de3a005b3..657038094 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisSettleInvoiceRecord.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisSettleInvoiceRecord.java @@ -157,6 +157,10 @@ public class EmisSettleInvoiceRecord extends BaseEntity private String opManName; private String opSiteName; + /* 运单号,多个用逗号隔开 */ + private String billCodes; + /* 销售联系人,多个用逗号隔开 */ + private String salesmens; List invoiceRelList; diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisInvoiceCancellationMapper.java b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisInvoiceCancellationMapper.java index 7ba1ca8e0..c075e7e5e 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisInvoiceCancellationMapper.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisInvoiceCancellationMapper.java @@ -13,7 +13,10 @@ package com.xdadan.erp.emis.mapper; import java.util.List; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.xdadan.erp.common.annotation.audit.DataAuditLog; +import com.xdadan.erp.common.annotation.audit.OperateType; import com.xdadan.erp.emis.domain.EmisInvoiceCancellation; +import com.xdadan.erp.emis.service.impl.EmisInvoiceCancellationServiceImpl; import org.apache.ibatis.annotations.Param; /** @@ -105,4 +108,16 @@ public interface EmisInvoiceCancellationMapper extends BaseMapper 0; } + @Override + public int red(Long id, String redInvoiceNo, String redCreateBy, String redCreateSite) throws EmisBizError { + if (id == null) { + throw new EmisBizError(EmisBizErrorType.FAIL, "id必传"); + } + validateRedInvoiceNo(redInvoiceNo); + EmisInvoiceCancellation db = emisInvoiceCancellationMapper.selectEmisInvoiceCancellationById(id); + if (db == null) { + throw new EmisBizError(EmisBizErrorType.FAIL, "申请不存在"); + } + EmisInvoiceCancellation update = new EmisInvoiceCancellation(); + update.setId(id); + update.setRedInvoiceNo(redInvoiceNo); + update.setRedCreateBy(redCreateBy); + update.setRedCreateSite(redCreateSite); + // 开票状态:1-已开票 2-已作废 + update.setInvoiceStatus("2"); + update.setUpdateBy(redCreateBy); + update.setUpdateSite(redCreateSite); + return emisInvoiceCancellationMapper.updateRed(update); + } + + @Override + public int editRed(Long id, String redInvoiceNo, String updateBy, String updateSite) throws EmisBizError { + if (id == null) { + throw new EmisBizError(EmisBizErrorType.FAIL, "id必传"); + } + validateRedInvoiceNo(redInvoiceNo); + EmisInvoiceCancellation db = emisInvoiceCancellationMapper.selectEmisInvoiceCancellationById(id); + if (db == null) { + throw new EmisBizError(EmisBizErrorType.FAIL, "申请不存在"); + } + EmisInvoiceCancellation update = new EmisInvoiceCancellation(); + update.setId(id); + update.setRedInvoiceNo(redInvoiceNo); + update.setUpdateBy(updateBy); + update.setUpdateSite(updateSite); + return emisInvoiceCancellationMapper.updateRedInvoiceNo(update); + } + + /** + * 校验红冲发票号为纯数字 + */ + private void validateRedInvoiceNo(String redInvoiceNo) throws EmisBizError { + if (!StringUtils.hasText(redInvoiceNo)) { + throw new EmisBizError(EmisBizErrorType.FAIL, "红冲发票号不能为空"); + } + if (!redInvoiceNo.matches("\\d+")) { + throw new EmisBizError(EmisBizErrorType.FAIL, "红冲发票号必须为纯数字"); + } + } + private void validateRequired(EmisInvoiceCancellation emisInvoiceCancellation) throws EmisBizError { if (emisInvoiceCancellation == null || emisInvoiceCancellation.getInvoiceId() == null) { throw new EmisBizError(EmisBizErrorType.FAIL, "invoiceId必传"); diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSettleInvoiceRecordServiceImpl.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSettleInvoiceRecordServiceImpl.java index bc0a925ae..177a50ab1 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSettleInvoiceRecordServiceImpl.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSettleInvoiceRecordServiceImpl.java @@ -1204,4 +1204,15 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen return emisSettleInvoiceRecordMapper.batchCancelDelayInvoice(ids, cancelOpManCode, updateSite); } + /** + * 根据申请序号/发票号查询发票信息(含运单号billCodes、销售联系人salesmens) + * + * @param emisSettleInvoiceRecord 查询条件(applySeqNo、invoiceNo) + * @return 发票记录 + */ + @Override + public EmisSettleInvoiceRecord selectInvoiceInfoWithDetail(EmisSettleInvoiceRecord emisSettleInvoiceRecord) { + return emisSettleInvoiceRecordMapper.selectInvoiceInfoWithDetail(emisSettleInvoiceRecord); + } + } diff --git a/emis-biz/src/main/resources/mapper/EmisInvoiceCancellationMapper.xml b/emis-biz/src/main/resources/mapper/EmisInvoiceCancellationMapper.xml index 789186a6b..f305ec44d 100644 --- a/emis-biz/src/main/resources/mapper/EmisInvoiceCancellationMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisInvoiceCancellationMapper.xml @@ -19,9 +19,16 @@ + + + + + + + @@ -31,6 +38,10 @@ select="com.xdadan.erp.emis.mapper.EmisBaseMapper.selectEmpNameByCode"/> + + @@ -55,7 +66,9 @@ select c.id, c.invoice_id, c.apply_seq_no, c.apply_date, c.apply_reason, c.apply_text_url, c.apply_man_code, c.apply_site_code, c.audit_status, c.audit_date, c.audit_man_code, c.audit_site_code, - c.audit_reject_reason, c.remark, c.del_flag, c.create_by, c.create_time, c.update_by, + c.audit_reject_reason, c.invoice_status, + c.red_invoice_no, c.red_create_by, c.red_create_site, c.red_create_time, + c.remark, c.del_flag, c.create_by, c.create_time, c.update_by, c.update_time, c.create_site, c.update_site, i.id as inv_id, i.apply_seq_no as inv_apply_seq_no, i.apply_date as inv_apply_date, i.customer_code as inv_customer_code, i.customer_name as inv_customer_name, @@ -65,11 +78,14 @@ i.invoice_no as inv_invoice_no, i.invoice_status as inv_invoice_status, i.payment_status as inv_payment_status, GROUP_CONCAT(DISTINCT b.bill_month ORDER BY b.bill_month SEPARATOR ',') as bill_month, GROUP_CONCAT(DISTINCT b.cust_no ORDER BY b.cust_no SEPARATOR ',') as cust_no, - GROUP_CONCAT(DISTINCT b.cust_name ORDER BY b.cust_name SEPARATOR ',') as customer_name + GROUP_CONCAT(DISTINCT b.cust_name ORDER BY b.cust_name SEPARATOR ',') as customer_name, + GROUP_CONCAT(DISTINCT r.bill_no ORDER BY r.bill_no SEPARATOR ',') as bill_codes, + GROUP_CONCAT(DISTINCT b.salesmen ORDER BY b.salesmen SEPARATOR ',') as salesmens from emis_invoice_cancellation c left join emis_settle_invoice_record i on c.invoice_id = i.id and i.del_flag = '0' left join emis_settle_invoice_bill_rel rel on i.apply_seq_no = rel.apply_seq_no and rel.del_flag = '0' left join emis_settle_bill b on rel.settle_bill_no = b.settle_bill_no and b.del_flag = '0' + left join emis_settle_invoice_rel r on i.apply_seq_no = r.apply_seq_no and r.del_flag = '0' + + + insert into emis_settle_invoice_record