From 362f1b5e2f5722582d3c0901b4f8a47c7ba3f12f Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Wed, 19 Aug 2026 18:02:23 +0800 Subject: [PATCH] =?UTF-8?q?fix(bms):=E7=A7=91=E7=9B=AE=E7=BC=96=E7=A0=81?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E8=87=B4=E6=96=B0=E5=A2=9E=E8=B4=A6=E5=8D=95?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=EF=BC=8C=E7=A8=8E=E7=8E=87=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=8C=89=E7=BC=96=E7=A0=81+=E5=90=8D=E7=A7=B0=E5=8F=96?= =?UTF-8?q?=E5=94=AF=E4=B8=80=EF=BC=9B=E5=A4=8D=E5=88=B6=E8=B4=A6=E5=8D=95?= =?UTF-8?q?=E6=94=B9=E7=94=9F=E6=88=90=E6=96=B0=E8=AE=A1=E8=B4=B9=E6=B5=81?= =?UTF-8?q?=E6=B0=B4=20-=20getTaxRate=20=E5=A2=9E=E5=8A=A0=20SUBJECT=5FNAM?= =?UTF-8?q?E=20=E5=8C=B9=E9=85=8D=EF=BC=8C=E8=B4=B9=E7=94=A8=E7=A7=91?= =?UTF-8?q?=E7=9B=AE=E7=BC=96=E7=A0=81=E9=87=8D=E5=A4=8D=EF=BC=88=E5=A6=82?= =?UTF-8?q?1003=E5=90=8C=E6=97=B6=E6=9C=89=E8=BF=90=E8=BE=93=E5=A4=84?= =?UTF-8?q?=E7=90=86=E8=B4=B9/=E6=8A=A5=E5=85=B3=E8=B4=B93=EF=BC=89?= =?UTF-8?q?=E6=97=B6=E4=B8=8D=E5=86=8D=E6=8A=9B=20TooManyResultsException?= =?UTF-8?q?=EF=BC=8C=E6=9F=A5=E4=B8=8D=E5=88=B0=E7=A8=8E=E7=8E=87=E5=85=9C?= =?UTF-8?q?=E5=BA=950=20-=20addBill=E3=80=81=E5=BC=80=E7=A5=A8/NC=E6=8E=A8?= =?UTF-8?q?=E9=80=81=E5=85=B14=E5=A4=84=E8=B0=83=E7=94=A8=E7=82=B9?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E8=B0=83=E6=95=B4=EF=BC=9B=E8=AE=A1=E8=B4=B9?= =?UTF-8?q?=E6=B5=81=E6=B0=B4=E5=8F=B7=E4=B8=BA=E7=A9=BA=E6=97=B6=E5=8F=AA?= =?UTF-8?q?=E5=A4=84=E7=90=86=E8=87=AA=E8=BA=AB=E6=98=8E=E7=BB=86=EF=BC=8C?= =?UTF-8?q?=E9=98=B2=E7=A9=BA=E6=8C=87=E9=92=88=20-=20copyBill=20=E6=98=8E?= =?UTF-8?q?=E7=BB=86=E6=B8=85=E7=A9=BA=E8=AE=A1=E8=B4=B9=E6=B5=81=E6=B0=B4?= =?UTF-8?q?id=E5=B9=B6=E6=8C=89=E5=8E=9F=E6=B5=81=E6=B0=B4=E6=98=A0?= =?UTF-8?q?=E5=B0=84=E7=94=9F=E6=88=90=E6=96=B0JFLS=E6=B5=81=E6=B0=B4?= =?UTF-8?q?=E5=8F=B7=EF=BC=8C=E9=98=B2=E6=AD=A2=E5=A4=8D=E5=88=B6=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=E5=90=8E=E6=8A=8A=E5=8E=9F=E8=B4=A6=E5=8D=95=E7=9A=84?= =?UTF-8?q?=E6=B5=81=E6=B0=B4=E6=94=B9=E6=8C=82=E5=88=B0=E6=96=B0=E8=B4=A6?= =?UTF-8?q?=E5=8D=95=EF=BC=88=E5=8E=9F=E8=B4=A6=E5=8D=95=E6=98=8E=E7=BB=86?= =?UTF-8?q?=E4=B8=A2=E5=A4=B1=EF=BC=89=20-=20insertAndReturnId=20=E5=B8=81?= =?UTF-8?q?=E7=A7=8D=E7=A9=BA=E5=80=BC=E5=85=9C=E5=BA=95CNY=EF=BC=88?= =?UTF-8?q?=E4=B8=8EaddCost=E5=AF=B9=E9=BD=90=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BillManageApplicationService.java | 53 ++++++++++++++----- .../BillingStatementApplicationService.java | 4 ++ .../repository/mapper/BillDetailMapper.java | 2 +- .../persistence/BillManageImpl.java | 12 ++++- .../resources/mapper/BillDetailMapper.xml | 5 +- 5 files changed, 58 insertions(+), 18 deletions(-) diff --git a/mhd_bms/src/main/java/com/mhd/bms/application/server/billManage/BillManageApplicationService.java b/mhd_bms/src/main/java/com/mhd/bms/application/server/billManage/BillManageApplicationService.java index c5a4a3bdf..2c79c842e 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/application/server/billManage/BillManageApplicationService.java +++ b/mhd_bms/src/main/java/com/mhd/bms/application/server/billManage/BillManageApplicationService.java @@ -472,7 +472,11 @@ public class BillManageApplicationService { BeanUtils.copyProperties(billDetailDTO, billingStatementDTO); String firstSubjectCode = billDetailDTO.getFirstSubjectCode(); - Double taxRate = billDetailMapper.getTaxRate(firstSubjectCode); + // 科目编码可能重复,按编码+名称取唯一税率;科目删除/停用时兜底0,避免空指针 + Double taxRate = billDetailMapper.getTaxRate(firstSubjectCode, billDetailDTO.getFirstSubjectName()); + if (taxRate == null) { + taxRate = 0.0; + } BigDecimal amount = billingStatementDTO.getBillingAmount(); BigDecimal taxAmount = amount.divide(BigDecimal.ONE.add(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))),10, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))).setScale(2, BigDecimal.ROUND_HALF_UP); BigDecimal taxFreeFee = amount.subtract(taxAmount); @@ -484,16 +488,26 @@ public class BillManageApplicationService { billingStatementDTO.setBillManageId(billManageDO.getBillManageId()); billingStatementDTO.setBillingState(3); Long billingStatementId = billingStatementApplicationService.insertAndReturnId(billingStatementDTO); - //遍历billDetailDTOList集合,将计费流水号相同的,赋值计费流水id - billDetailDTOList.stream().filter(item -> item.getBillingFlow().equals(billDetailDTO.getBillingFlow())).forEach(item -> { - item.setBillingStatementId(billingStatementId); - item.setBillType(billManageDTO.getBillType()); - item.setBillManageId(billManageDO.getBillManageId()); - item.setBillNumber(billNumber); - item.setInvoiceItem(item.getFirstSubjectCode()); - item.setInvoiceItemName(item.getFirstSubjectName()); - item.setFeeType(item.getServiceItemsName()); - }); + //遍历billDetailDTOList集合,将计费流水号相同的,赋值计费流水id(流水号为空时只处理自身) + if (StringUtils.isNotBlank(billDetailDTO.getBillingFlow())) { + billDetailDTOList.stream().filter(item -> billDetailDTO.getBillingFlow().equals(item.getBillingFlow())).forEach(item -> { + item.setBillingStatementId(billingStatementId); + item.setBillType(billManageDTO.getBillType()); + item.setBillManageId(billManageDO.getBillManageId()); + item.setBillNumber(billNumber); + item.setInvoiceItem(item.getFirstSubjectCode()); + item.setInvoiceItemName(item.getFirstSubjectName()); + item.setFeeType(item.getServiceItemsName()); + }); + } else { + billDetailDTO.setBillingStatementId(billingStatementId); + billDetailDTO.setBillType(billManageDTO.getBillType()); + billDetailDTO.setBillManageId(billManageDO.getBillManageId()); + billDetailDTO.setBillNumber(billNumber); + billDetailDTO.setInvoiceItem(billDetailDTO.getFirstSubjectCode()); + billDetailDTO.setInvoiceItemName(billDetailDTO.getFirstSubjectName()); + billDetailDTO.setFeeType(billDetailDTO.getServiceItemsName()); + } } //同步更新已有计费流水(新增账单时可修改已有费用) List billDetailDTOListHasBillingStatementId = billDetailDTOList.stream() @@ -514,7 +528,11 @@ public class BillManageApplicationService { BigDecimal allTaxFreeFee = BigDecimal.ZERO; for (BillDetailDTO item : billDetailDTOList) { String firstSubjectCode = item.getFirstSubjectCode(); - Double taxRate = billDetailMapper.getTaxRate(firstSubjectCode); + // 同上:编码+名称取唯一税率,查不到兜底0 + Double taxRate = billDetailMapper.getTaxRate(firstSubjectCode, item.getFirstSubjectName()); + if (taxRate == null) { + taxRate = 0.0; + } BigDecimal amount = item.getBillingAmount(); BigDecimal taxAmount = amount.divide(BigDecimal.ONE.add(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))),10, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))).setScale(2, BigDecimal.ROUND_HALF_UP); BigDecimal taxFreeFee = amount.subtract(taxAmount); @@ -584,11 +602,20 @@ public class BillManageApplicationService { originalBill.setInvoiceMakeTime(null); originalBill.setNcId(null); originalBill.setSkNcId(null); - // 明细也清空id + // 明细清空id;同时清空计费流水id并按"原流水→新流水"映射生成新流水号, + // 否则提交addBill会走"更新已有流水"分支,把原账单的流水改挂到新账单上(原账单明细丢失) + Map flowMapping = new HashMap<>(); for (BillDetailPO detail : originalDetails) { detail.setBillDetailId(null); detail.setBillManageId(null); detail.setBillNumber(null); + detail.setBillingStatementId(null); + String oldFlow = detail.getBillingFlow(); + if (StringUtils.isNotBlank(oldFlow)) { + detail.setBillingFlow(flowMapping.computeIfAbsent(oldFlow, k -> OrderSequence.getOrderCode("JFLS"))); + } else { + detail.setBillingFlow(null); + } } originalBill.setBillDetailPOList(originalDetails); return originalBill; diff --git a/mhd_bms/src/main/java/com/mhd/bms/application/server/billingStatement/BillingStatementApplicationService.java b/mhd_bms/src/main/java/com/mhd/bms/application/server/billingStatement/BillingStatementApplicationService.java index a79c02dc4..28104f719 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/application/server/billingStatement/BillingStatementApplicationService.java +++ b/mhd_bms/src/main/java/com/mhd/bms/application/server/billingStatement/BillingStatementApplicationService.java @@ -568,6 +568,10 @@ public class BillingStatementApplicationService { handleDate(billingStatementDO); billingStatementDO.setDataSources(2); + // 币种为空时兜底CNY(与addCost一致;NC推送时该值作pk_currtype,空值会推送失败) + if (StringUtils.isEmpty(billingStatementDO.getSettlementCurrency())) { + billingStatementDO.setSettlementCurrency("CNY"); + } if(StringUtils.isEmpty(billingStatementDO.getBillingFlow())){ billingStatementDO.setBillingFlow(OrderSequence.getOrderCode("JFLS")); } diff --git a/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/mapper/BillDetailMapper.java b/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/mapper/BillDetailMapper.java index 044e5565c..ae3ca33c2 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/mapper/BillDetailMapper.java +++ b/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/mapper/BillDetailMapper.java @@ -21,5 +21,5 @@ public interface BillDetailMapper extends BaseMapper List getDetailsByBillManageIdAndGroup(@Param("billManageId") Long billManageId); - Double getTaxRate(@Param("code") String code); + Double getTaxRate(@Param("code") String code, @Param("name") String name); } \ No newline at end of file diff --git a/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/persistence/BillManageImpl.java b/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/persistence/BillManageImpl.java index 61c81134d..4649d3b7c 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/persistence/BillManageImpl.java +++ b/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/persistence/BillManageImpl.java @@ -211,7 +211,11 @@ public class BillManageImpl extends ServiceImpl im BigDecimal allTaxFreeFee = BigDecimal.ZERO; for (BillDetail item : billDetails) { String firstSubjectCode = item.getInvoiceItem(); - Double taxRate = billDetailMapper.getTaxRate(firstSubjectCode); + // 科目编码可能重复,按编码+名称取唯一税率;查不到兜底0,避免空指针 + Double taxRate = billDetailMapper.getTaxRate(firstSubjectCode, item.getInvoiceItemName()); + if (taxRate == null) { + taxRate = 0.0; + } BigDecimal amount = item.getBillingAmount(); BigDecimal taxAmount = amount.divide(BigDecimal.ONE.add(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))),10, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))).setScale(2, BigDecimal.ROUND_HALF_UP); BigDecimal taxFreeFee = amount.subtract(taxAmount); @@ -853,7 +857,11 @@ public class BillManageImpl extends ServiceImpl im BigDecimal allTaxFreeFee = BigDecimal.ZERO; for (BillDetail item : billDetails) { String firstSubjectCode = item.getInvoiceItem(); - Double taxRate = billDetailMapper.getTaxRate(firstSubjectCode); + // 科目编码可能重复,按编码+名称取唯一税率;查不到兜底0,避免空指针 + Double taxRate = billDetailMapper.getTaxRate(firstSubjectCode, item.getInvoiceItemName()); + if (taxRate == null) { + taxRate = 0.0; + } BigDecimal amount = item.getBillingAmount(); BigDecimal taxAmount = amount.divide(BigDecimal.ONE.add(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))),10, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(taxRate).divide(BigDecimal.valueOf(100))).setScale(2, BigDecimal.ROUND_HALF_UP); BigDecimal taxFreeFee = amount.subtract(taxAmount); diff --git a/mhd_bms/src/main/resources/mapper/BillDetailMapper.xml b/mhd_bms/src/main/resources/mapper/BillDetailMapper.xml index e8a730b62..f7727298d 100644 --- a/mhd_bms/src/main/resources/mapper/BillDetailMapper.xml +++ b/mhd_bms/src/main/resources/mapper/BillDetailMapper.xml @@ -49,7 +49,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND bill_manage_id = #{billManageId} GROUP BY INVOICE_ITEM,INVOICE_ITEM_NAME,FEE_TYPE - SELECT rate FROM @@ -57,7 +58,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" WHERE del_flag = 1 AND SUBJECT_CODE = #{code} + AND SUBJECT_NAME = #{name} - \ No newline at end of file