From fee685fd37a4243e93f6a889ad34f39917623e5a Mon Sep 17 00:00:00 2001 From: aike <17730485278@139.com> Date: Sat, 7 Feb 2026 17:26:48 +0800 Subject: [PATCH 1/4] =?UTF-8?q?demand:=20=20=20TMS-=E8=B4=A2=E5=8A=A1?= =?UTF-8?q?=E4=B8=AD=E5=BF=83=E9=94=80=E8=B4=A6=E5=AE=A1=E6=A0=B8=EF=BC=9A?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E6=95=B0=E6=8D=AE=E5=B1=95=E7=A4=BA=E5=A2=9E?= =?UTF-8?q?=E6=B7=BB=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/emis/EmisWriteoffApplyController.java | 127 +++++++++++++++++- .../erp/emis/domain/EmisWriteoffApply.java | 3 + .../emis/domain/EmisWriteoffApplyDetail.java | 2 + .../mapper/EmisWriteoffApplyMapper.xml | 77 ++++++++++- 4 files changed, 204 insertions(+), 5 deletions(-) diff --git a/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisWriteoffApplyController.java b/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisWriteoffApplyController.java index 9919088de..7651146a8 100644 --- a/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisWriteoffApplyController.java +++ b/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisWriteoffApplyController.java @@ -19,6 +19,7 @@ import com.xdadan.erp.emis.domain.EmisWriteoffApplyDetail; import com.xdadan.erp.emis.domain.EmisSalesmenRel; import com.xdadan.erp.emis.domain.exception.EmisBizError; import com.xdadan.erp.emis.service.IEmisWriteoffApplyService; +import com.xdadan.erp.emis.service.IEmisSettleInvoiceRecordService; import com.xdadan.erp.emis.service.IEmisSalesmenRelService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -47,6 +48,9 @@ public class EmisWriteoffApplyController extends EmisBaseController { @Autowired private IEmisSalesmenRelService emisSalesmenRelService; + @Autowired + private IEmisSettleInvoiceRecordService emisSettleInvoiceRecordService; + /** * 查询销账申请列表 */ @@ -59,6 +63,12 @@ public class EmisWriteoffApplyController extends EmisBaseController { setPrivParams(emisWriteoffApply); + // 支持按发票号查询:将多行发票号格式化为逗号分隔 + if (emisWriteoffApply.getInvoiceNo() != null && !emisWriteoffApply.getInvoiceNo().trim().isEmpty()) { + emisWriteoffApply.setInvoiceNo( + com.xdadan.erp.emis.utils.WaybillHelper.formatQueryValue(emisWriteoffApply.getInvoiceNo())); + } + // 处理params参数,支持运单号、账单号多选查询 if (emisWriteoffApply.getParams() != null && emisWriteoffApply.getParams().containsKey("queryParams")) { String queryParams = (String) emisWriteoffApply.getParams().get("queryParams"); @@ -86,6 +96,49 @@ public class EmisWriteoffApplyController extends EmisBaseController { // 计算并设置申请账单相关字段 if (list != null) { + // 收集所有运单号,用于一次性查询对应的发票号 + java.util.Set allBillCodes = new java.util.HashSet<>(); + + for (EmisWriteoffApply apply : list) { + if (apply != null && apply.getDetailList() != null && !apply.getDetailList().isEmpty()) { + for (EmisWriteoffApplyDetail detail : apply.getDetailList()) { + if (detail != null && detail.getBillCode() != null && !detail.getBillCode().trim().isEmpty()) { + allBillCodes.add(detail.getBillCode().trim()); + } + } + } + } + + // 查询所有相关运单号对应的发票记录,并构造 billCode -> 发票号列表 映射 + java.util.Map> billInvoiceMap = new java.util.HashMap<>(); + if (!allBillCodes.isEmpty()) { + java.util.List billCodeList = new java.util.ArrayList<>(allBillCodes); + java.util.List invoiceRecords = + emisSettleInvoiceRecordService.selectInvoiceRecordListByBillCodes(billCodeList); + if (invoiceRecords != null) { + for (com.xdadan.erp.emis.domain.EmisSettleInvoiceRecord record : invoiceRecords) { + if (record == null || record.getInvoiceNo() == null + || record.getInvoiceNo().trim().isEmpty() + || record.getBillCodes() == null + || record.getBillCodes().trim().isEmpty()) { + continue; + } + String[] codes = record.getBillCodes().split(","); + for (String code : codes) { + if (code == null) { + continue; + } + String billCode = code.trim(); + if (billCode.isEmpty()) { + continue; + } + billInvoiceMap.computeIfAbsent(billCode, k -> new java.util.ArrayList<>()) + .add(record.getInvoiceNo().trim()); + } + } + } + } + for (EmisWriteoffApply apply : list) { if (apply != null && apply.getDetailList() != null && !apply.getDetailList().isEmpty()) { // 提取账单名称列表(去重) @@ -124,6 +177,23 @@ public class EmisWriteoffApplyController extends EmisBaseController { }) .reduce(BigDecimal.ZERO, BigDecimal::add); apply.setApplyRecMoney(totalAmount); + + // 计算并设置发票号列表(去重后用逗号拼接) + java.util.Set invoiceNos = new java.util.LinkedHashSet<>(); + for (EmisWriteoffApplyDetail detail : apply.getDetailList()) { + if (detail == null || detail.getBillCode() == null) { + continue; + } + java.util.List invList = billInvoiceMap.get(detail.getBillCode().trim()); + if (invList != null) { + for (String inv : invList) { + if (inv != null && !inv.trim().isEmpty()) { + invoiceNos.add(inv.trim()); + } + } + } + } + apply.setInvoiceNo(invoiceNos.isEmpty() ? "" : String.join(",", invoiceNos)); } } } @@ -142,6 +212,12 @@ public class EmisWriteoffApplyController extends EmisBaseController { emisWriteoffApply = new EmisWriteoffApply(); } + // 支持按发票号查询:将多行发票号格式化为逗号分隔 + if (emisWriteoffApply.getInvoiceNo() != null && !emisWriteoffApply.getInvoiceNo().trim().isEmpty()) { + emisWriteoffApply.setInvoiceNo( + com.xdadan.erp.emis.utils.WaybillHelper.formatQueryValue(emisWriteoffApply.getInvoiceNo())); + } + // 处理params参数,支持运单号、账单号多选查询 if (emisWriteoffApply.getParams() != null && emisWriteoffApply.getParams().containsKey("queryParams")) { String queryParams = (String) emisWriteoffApply.getParams().get("queryParams"); @@ -508,8 +584,57 @@ public class EmisWriteoffApplyController extends EmisBaseController { // 获取当前登录用户信息 String currentEmpName = getLoginUser().getUser().getEmpName(); - // 验证权限和账单状态 + // 先为返回的明细填充发票号信息(每个运单可能存在多张发票,逗号分隔) + java.util.Set allBillCodes = list.stream() + .filter(d -> d != null && d.getBillCode() != null && !d.getBillCode().trim().isEmpty()) + .map(d -> d.getBillCode().trim()) + .collect(java.util.stream.Collectors.toSet()); + + java.util.Map billInvoiceStrMap = new java.util.HashMap<>(); + if (!allBillCodes.isEmpty()) { + java.util.List billCodeListAll = new java.util.ArrayList<>(allBillCodes); + java.util.List invoiceRecords = + emisSettleInvoiceRecordService.selectInvoiceRecordListByBillCodes(billCodeListAll); + if (invoiceRecords != null) { + java.util.Map> billInvoiceSetMap = new java.util.HashMap<>(); + for (com.xdadan.erp.emis.domain.EmisSettleInvoiceRecord record : invoiceRecords) { + if (record == null || record.getInvoiceNo() == null + || record.getInvoiceNo().trim().isEmpty() + || record.getBillCodes() == null + || record.getBillCodes().trim().isEmpty()) { + continue; + } + String invoiceNo = record.getInvoiceNo().trim(); + String[] codes = record.getBillCodes().split(","); + for (String code : codes) { + if (code == null) { + continue; + } + String billCode = code.trim(); + if (billCode.isEmpty()) { + continue; + } + billInvoiceSetMap.computeIfAbsent(billCode, k -> new java.util.LinkedHashSet<>()) + .add(invoiceNo); + } + } + // 转换为逗号分隔的字符串 + for (java.util.Map.Entry> entry : billInvoiceSetMap.entrySet()) { + billInvoiceStrMap.put(entry.getKey(), + String.join(",", entry.getValue())); + } + } + } + + // 验证权限和账单状态,并设置每条明细的发票号 for (EmisWriteoffApplyDetail detail : list) { + if (detail != null && detail.getBillCode() != null) { + String invoiceStr = billInvoiceStrMap.get(detail.getBillCode().trim()); + if (invoiceStr != null) { + detail.setInvoiceNo(invoiceStr); + } + } + // 1. 验证用户权限:检查是否是运单的销售联系人/回款联系人/销售联系人关联的助理 if (!hasPermissionToViewBill(detail, currentEmpName)) { return error("您没有权限查看运单 " + detail.getBillCode() + " 的信息"); diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisWriteoffApply.java b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisWriteoffApply.java index 24de92fff..d56d2ac21 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisWriteoffApply.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisWriteoffApply.java @@ -80,6 +80,9 @@ public class EmisWriteoffApply extends BaseEntity { /* 收款来源 1-微信支付2支付宝 3-对公 */ private String payType; + /* 发票号 */ + private String invoiceNo; + /* 交易时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date tradeDate; diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisWriteoffApplyDetail.java b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisWriteoffApplyDetail.java index d53b14da0..e1fff8d69 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisWriteoffApplyDetail.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisWriteoffApplyDetail.java @@ -72,4 +72,6 @@ public class EmisWriteoffApplyDetail extends BaseEntity { @Excel(name = "快件类型") private String expressType; + /* 发票号(只作查询) */ + private String invoiceNo; } diff --git a/emis-biz/src/main/resources/mapper/EmisWriteoffApplyMapper.xml b/emis-biz/src/main/resources/mapper/EmisWriteoffApplyMapper.xml index 10bf15792..5caa58c85 100644 --- a/emis-biz/src/main/resources/mapper/EmisWriteoffApplyMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisWriteoffApplyMapper.xml @@ -45,19 +45,65 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select id, apply_no, apply_man_code, apply_man_name, apply_site_code, apply_site_name, apply_date, writeoff_amount, pay_type, trade_date, recipient, apply_memo, pay_id, bl_center_confirmed, center_confirm_man_code, center_confirm_man_name, center_confirm_date, center_confirm_note, center_reject_reason, bl_headquarters_confirmed, headquarters_confirm_man_code, headquarters_confirm_man_name, headquarters_confirm_date, headquarters_confirm_note, headquarters_reject_reason, revoke_date, revoke_man_code, revoke_man_name, revoke_reason, del_flag, create_by, create_time, update_by, update_time, remark from emis_writeoff_apply + select id, + apply_no, + apply_man_code, + apply_man_name, + apply_site_code, + apply_site_name, + apply_date, + writeoff_amount, + pay_type, + trade_date, + recipient, + apply_memo, + pay_id, + bl_center_confirmed, + center_confirm_man_code, + center_confirm_man_name, + center_confirm_date, + center_confirm_note, + center_reject_reason, + bl_headquarters_confirmed, + headquarters_confirm_man_code, + headquarters_confirm_man_name, + headquarters_confirm_date, + headquarters_confirm_note, + headquarters_reject_reason, + revoke_date, + revoke_man_code, + revoke_man_name, + revoke_reason, + del_flag, + create_by, + create_time, + update_by, + update_time, + remark + from emis_writeoff_apply @@ -348,6 +441,32 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" diff --git a/emis-biz/src/main/resources/mapper/EmisWriteoffApplyMapper.xml b/emis-biz/src/main/resources/mapper/EmisWriteoffApplyMapper.xml index 5caa58c85..b6e447f22 100644 --- a/emis-biz/src/main/resources/mapper/EmisWriteoffApplyMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisWriteoffApplyMapper.xml @@ -14,6 +14,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -45,67 +46,34 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select id, - apply_no, - apply_man_code, - apply_man_name, - apply_site_code, - apply_site_name, - apply_date, - writeoff_amount, - pay_type, - trade_date, - recipient, - apply_memo, - pay_id, - bl_center_confirmed, - center_confirm_man_code, - center_confirm_man_name, - center_confirm_date, - center_confirm_note, - center_reject_reason, - bl_headquarters_confirmed, - headquarters_confirm_man_code, - headquarters_confirm_man_name, - headquarters_confirm_date, - headquarters_confirm_note, - headquarters_reject_reason, - revoke_date, - revoke_man_code, - revoke_man_name, - revoke_reason, - del_flag, - create_by, - create_time, - update_by, - update_time, - remark - from emis_writeoff_apply + select id, apply_no, apply_man_code, apply_man_name, apply_site_code, apply_site_name, apply_date, writeoff_amount, pay_type, trade_date, recipient, apply_memo, pay_id, bl_center_confirmed, center_confirm_man_code, center_confirm_man_name, center_confirm_date, center_confirm_note, center_reject_reason, bl_headquarters_confirmed, headquarters_confirm_man_code, headquarters_confirm_man_name, headquarters_confirm_date, headquarters_confirm_note, headquarters_reject_reason, revoke_date, revoke_man_code, revoke_man_name, revoke_reason, del_flag, create_by, create_time, update_by, update_time, remark from emis_writeoff_apply @@ -291,7 +249,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" apply_site_name = #{applySiteName}, apply_date = #{applyDate}, writeoff_amount = #{writeoffAmount}, - pay_type = #{payType}, apply_memo = #{applyMemo}, pay_id = #{payId}, bl_center_confirmed = #{blCenterConfirmed}, @@ -450,6 +407,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -592,11 +550,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" From a37bdf19d1b5cd3eb93d43620877a5e1495c94b2 Mon Sep 17 00:00:00 2001 From: aike <17730485278@139.com> Date: Mon, 9 Feb 2026 11:48:59 +0800 Subject: [PATCH 3/4] =?UTF-8?q?demand:=20=20=20TMS-=E8=B4=A2=E5=8A=A1?= =?UTF-8?q?=E4=B8=AD=E5=BF=83=E9=94=80=E8=B4=A6=E5=AE=A1=E6=A0=B8=EF=BC=9A?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E6=95=B0=E6=8D=AE=E5=B1=95=E7=A4=BA=E5=A2=9E?= =?UTF-8?q?=E6=B7=BB=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapper/EmisWriteoffApplyDetailMapper.xml | 108 +----------------- 1 file changed, 4 insertions(+), 104 deletions(-) diff --git a/emis-biz/src/main/resources/mapper/EmisWriteoffApplyDetailMapper.xml b/emis-biz/src/main/resources/mapper/EmisWriteoffApplyDetailMapper.xml index d3e1ac713..6e65e7f56 100644 --- a/emis-biz/src/main/resources/mapper/EmisWriteoffApplyDetailMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisWriteoffApplyDetailMapper.xml @@ -290,95 +290,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and wad.settle_bill_no = #{settleBillNo} and wad.apply_money = #{applyMoney} - group by wad.id, wad.apply_id, wad.apply_no, wad.bill_code, wad.apply_money, wad.settle_bill_no, wad.del_flag, - wad.create_by, wad.create_time, wad.update_by, wad.update_time, wad.remark, - w.id, w.order_sn, w.cust_order_id, w.bill_code, w.bill_code_sub, w.order_status, w.waybill_status, w.order_type, w.order_date, - w.user_id, w.customer_code, w.customer_name, w.open_id, w.receive_name, w.receive_company, w.receive_mobile, w.receive_tel, - w.receive_country, w.receive_province, w.receive_city, w.receive_county, w.receive_town, w.receive_address, w.receive_postcode, - w.send_name, w.send_company, w.send_mobile, w.send_tel, w.send_country, w.send_province, w.send_city, - w.send_county, w.send_town, w.send_address, w.send_postcode, w.freight, w.salesmen, w.payee, w.payment_type, w.product_type, - tp.prod_name, w.parcel_qty, w.bill_weight, w.total_volume, w.send_date, w.dispatch_date, w.sign_man, w.sign_man_code, - w.sign_site_code, w.sign_date, w.timezone_offset, w.payment_status, w.payment_date, w.payment_remark, w.order_remark, w.data_from, - w.bl_special_goods, w.ext_info, w.lading_bill_code, w.company_code, w.departure_port, w.destination_port, w.box_quantity, w.settlement_weight, - w.send_site_code, send_site.site_name, w.dispatch_underling_site_code, dest_site.site_name, - sb.id, sb.settle_bill_no, sb.settle_bill_name, sb.settle_type, sb.settle_start_date, sb.settle_end_date, sb.bill_month, - sb.rec_money, sb.reced_money, sb.invoiced_money, sb.cust_no, sb.cust_name, sb.customer_code, sb.customer_name, sb.site_code, - sb.site_name, sb.satisfy_money, sb.allowance_money, sb.deduction_money, sb.other_money, sb.satisfy_reason, sb.allowance_reason, - sb.deduction_reason, sb.other_reason, sb.open_bill_status, sb.payment_status, sb.charge_status, sb.send_piece_sum, - sb.piece_number, sb.fee_weight, sb.uncollected_amount, sb.send_money_sum, sb.refund_amount, sb.refund_money, - sb.payee, sb.salesmen, sb.credit_period, sb.credit_period_type, sb.settle_day, sb.payment_due_date, sb.bl_send_oms, - sb.bl_confirm_center, sb.confirm_center_date, sb.confirm_center_note, sb.confirm_center_man_code, sb.confirm_center_code, - sb.bl_confirm_site, sb.confirm_site_date, sb.confirm_site_man_code, sb.confirm_site_note, sb.confirm_site_code, - ssb.id, ssb.bill_no, ssb.parent_bill_no, ssb.settle_bill_no, ssb.bill_code, ssb.bill_date, ssb.bill_fee, ssb.currency, - ssb.settle_type, ssb.bl_split, ssb.bl_merge, ssb.bill_month, ssb.cust_no, ssb.cust_name, ssb.customer_code, ssb.customer_name, - ssb.invoiced_money, ssb.reced_money, ssb.satisfy_money, ssb.allowance_money, ssb.deduction_money, ssb.other_money, - ssb.satisfy_reason, ssb.allowance_reason, ssb.deduction_reason, ssb.other_reason, ssb.open_bill_status, ssb.payment_status, - ssb.charge_status, ssb.payee, ssb.salesmen, ssb.bl_special_quote, ssb.bl_sensitive, ssb.bl_confirm_center, ssb.confirm_center_date, - ssb.confirm_center_note, ssb.confirm_center_man_code, ssb.confirm_center_code, ssb.bl_confirm_site, ssb.confirm_site_date, - ssb.confirm_site_man_code, ssb.confirm_site_note, ssb.confirm_site_code + group by wad.id, wad.apply_id, wad.apply_no, wad.bill_code order by wad.create_time desc @@ -441,32 +366,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" From a62bd3607f159758904054055e287cf66980214d Mon Sep 17 00:00:00 2001 From: aike <17730485278@139.com> Date: Mon, 9 Feb 2026 14:01:38 +0800 Subject: [PATCH 4/4] =?UTF-8?q?demand:=20=20=20TMS-=E8=B4=A2=E5=8A=A1?= =?UTF-8?q?=E4=B8=AD=E5=BF=83=E9=94=80=E8=B4=A6=E5=AE=A1=E6=A0=B8=EF=BC=9A?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E6=95=B0=E6=8D=AE=E5=B1=95=E7=A4=BA=E5=A2=9E?= =?UTF-8?q?=E6=B7=BB=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/emis/EmisWriteoffApplyController.java | 17 +++++++++++++++++ .../mapper/EmisWriteoffApplyMapper.xml | 16 ++++------------ 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisWriteoffApplyController.java b/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisWriteoffApplyController.java index 9919088de..f54c80327 100644 --- a/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisWriteoffApplyController.java +++ b/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisWriteoffApplyController.java @@ -124,6 +124,23 @@ public class EmisWriteoffApplyController extends EmisBaseController { }) .reduce(BigDecimal.ZERO, BigDecimal::add); apply.setApplyRecMoney(totalAmount); + + // 提取发票号列表(去重) + List invoiceNos = apply.getDetailList().stream() + .filter(detail -> detail != null && detail.getInvoiceNo() != null) + .flatMap(detail -> { + // 如果invoiceNo包含逗号,先拆分 + String invoiceNo = detail.getInvoiceNo().trim(); + if (invoiceNo.isEmpty()) { + return java.util.stream.Stream.empty(); + } + return Arrays.stream(invoiceNo.split(",")) + .map(String::trim) + .filter(no -> !no.isEmpty()); + }) + .distinct() + .collect(Collectors.toList()); + apply.setInvoiceNo(invoiceNos.isEmpty() ? "" : String.join(",", invoiceNos)); } } } diff --git a/emis-biz/src/main/resources/mapper/EmisWriteoffApplyMapper.xml b/emis-biz/src/main/resources/mapper/EmisWriteoffApplyMapper.xml index b6e447f22..aecd9b7ef 100644 --- a/emis-biz/src/main/resources/mapper/EmisWriteoffApplyMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisWriteoffApplyMapper.xml @@ -14,7 +14,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - @@ -50,15 +49,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"