diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisSettleInvoiceRecordMapper.java b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisSettleInvoiceRecordMapper.java index 282b8a36e..6fc6d5ac2 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisSettleInvoiceRecordMapper.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisSettleInvoiceRecordMapper.java @@ -17,16 +17,19 @@ import org.apache.ibatis.annotations.Param; /** * @ClassName EmisSettleInvoiceRecordMapper - * @Description

开票记录表 Mapper 接口

+ * @Description + *

+ * 开票记录表 Mapper 接口 + *

* @author linfso * @date 2024-07-21 13:31:26 */ -public interface EmisSettleInvoiceRecordMapper extends BaseMapper -{ +public interface EmisSettleInvoiceRecordMapper extends BaseMapper { /** * 主键查询 - * @param id - * @return + * + * @param id + * @return */ public EmisSettleInvoiceRecord selectEmisSettleInvoiceRecordById(Long id); @@ -40,46 +43,42 @@ public interface EmisSettleInvoiceRecordMapper extends BaseMapper selectEmisSettleInvoiceRecordList(EmisSettleInvoiceRecord emisSettleInvoiceRecord); - + public List selectEmisSettleInvoiceRecordList( + EmisSettleInvoiceRecord emisSettleInvoiceRecord); public List selectInvoiceRecordListBySettleBillNo(String settleBillNo); - - - /** * 检查是否重复 * - * @param emisSettleInvoiceRecord + * @param emisSettleInvoiceRecord * @return 数量 */ public int checkUnique(EmisSettleInvoiceRecord emisSettleInvoiceRecord); - public int checkOpenBillRepeat(EmisSettleInvoiceRecord emisSettleInvoiceRecord); /** - * 新增 + * 新增 * * @param emisSettleInvoiceRecord - * @return + * @return */ public int insertEmisSettleInvoiceRecord(EmisSettleInvoiceRecord emisSettleInvoiceRecord); - public int insertInvoiceRecordBillRel(@Param("applySeqNo") String applySeqNo,@Param("settleBillNo") String settleBillNo); - + public int insertInvoiceRecordBillRel(@Param("applySeqNo") String applySeqNo, + @Param("settleBillNo") String settleBillNo); public int updateHasPayByApplySeqNo(@Param("applySeqNo") String applySeqNo); /** * 修改 * - * @param emisSettleInvoiceRecord - * @return + * @param emisSettleInvoiceRecord + * @return */ public int updateEmisSettleInvoiceRecord(EmisSettleInvoiceRecord emisSettleInvoiceRecord); @@ -103,5 +102,12 @@ public interface EmisSettleInvoiceRecordMapper extends BaseMapper selectInvoiceRecordListByBillCodes(@Param("billCodes") List billCodes); } diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisSettleInvoiceRecordService.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisSettleInvoiceRecordService.java index ea67d1d33..49b1a2ba1 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisSettleInvoiceRecordService.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisSettleInvoiceRecordService.java @@ -1,30 +1,30 @@ - /** - * @Project: emis - * @Title: EmisSettleInvoiceRecordService.java - * @author linfso - * @date 2024-07-21 13:31:26 - * @Copyright: ShangHai Duta 2022 All rights reserved. - * @version v1.0 - * @Description:

开票记录表 服务类接口

- */ +/** +* @Project: emis +* @Title: EmisSettleInvoiceRecordService.java +* @author linfso +* @date 2024-07-21 13:31:26 +* @Copyright: ShangHai Duta 2022 All rights reserved. +* @version v1.0 +* @Description:

开票记录表 服务类接口

+*/ package com.xdadan.erp.emis.service; import java.util.List; import com.xdadan.erp.emis.domain.EmisSettleInvoiceRecord; import com.xdadan.erp.emis.domain.exception.EmisBizError; - /** +/** * @ClassName EmisSettleInvoiceRecordService * @Description 开票记录表 * @author linfso * @date 2024-07-21 13:31:26 */ -public interface IEmisSettleInvoiceRecordService -{ - /** +public interface IEmisSettleInvoiceRecordService { + /** * 主键查询 + * * @param id - * @return + * @return */ public EmisSettleInvoiceRecord selectEmisSettleInvoiceRecordById(Long id); @@ -34,13 +34,13 @@ public interface IEmisSettleInvoiceRecordService * @param emisSettleInvoiceRecord 开票记录表 * @return 开票记录表集合 */ - public List selectEmisSettleInvoiceRecordList(EmisSettleInvoiceRecord emisSettleInvoiceRecord); - + public List selectEmisSettleInvoiceRecordList( + EmisSettleInvoiceRecord emisSettleInvoiceRecord); /** * 检查是否重复 * - * @param emisSettleInvoiceRecord + * @param emisSettleInvoiceRecord * @return 数量 */ public int checkUnique(EmisSettleInvoiceRecord emisSettleInvoiceRecord); @@ -77,20 +77,23 @@ public interface IEmisSettleInvoiceRecordService */ public int deleteEmisSettleInvoiceRecordById(Long id); + /** + * 中心驳回 + * + * @param inputObj + * @return + * @throws EmisBizError + */ + public int auditCenterNoPass(EmisSettleInvoiceRecord inputObj) throws EmisBizError; - /** - * 中心驳回 - * @param inputObj - * @return - * @throws EmisBizError - */ - public int auditCenterNoPass(EmisSettleInvoiceRecord inputObj) throws EmisBizError; - - - public int auditCenterPass(EmisSettleInvoiceRecord inputObj) throws EmisBizError; - - - + public int auditCenterPass(EmisSettleInvoiceRecord inputObj) throws EmisBizError; + /** + * 根据运单号列表查询开票记录 + * + * @param billCodes 运单号列表 + * @return 开票记录列表 + */ + public List selectInvoiceRecordListByBillCodes(List billCodes); } 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 e5c66fd9d..b754cadd3 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 @@ -1,22 +1,20 @@ - /** - * @Project: emis - * @Title: EmisSettleInvoiceRecordServiceImpl.java - * @author linfso - * @date 2024-07-21 13:31:26 - * @Copyright: ShangHai Duta 2022 All rights reserved. - * @version v1.0 - * @Description:

开票记录表 实体类

- */ +/** +* @Project: emis +* @Title: EmisSettleInvoiceRecordServiceImpl.java +* @author linfso +* @date 2024-07-21 13:31:26 +* @Copyright: ShangHai Duta 2022 All rights reserved. +* @version v1.0 +* @Description:

开票记录表 实体类

+*/ package com.xdadan.erp.emis.service.impl; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.Date; import java.util.List; -import java.util.Map; -import lombok.Data; -import com.xdadan.erp.common.core.domain.entity.SysUser; import com.xdadan.erp.emis.domain.*; import com.xdadan.erp.emis.domain.enumtype.EmisBizErrorType; import com.xdadan.erp.emis.domain.exception.EmisBizError; @@ -29,26 +27,23 @@ import com.xdadan.erp.emis.service.IEmisSettleBillService; import com.xdadan.erp.emis.utils.WaybillHelper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.stereotype.Service; import com.xdadan.erp.emis.mapper.EmisSettleInvoiceRecordMapper; import com.xdadan.erp.emis.service.IEmisSettleInvoiceRecordService; import org.springframework.transaction.annotation.Transactional; - /** +/** * 开票记录表Service业务层处理 * * @author linfso * @date 2024-07-21 13:31:26 */ - @Slf4j +@Slf4j @Service -public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implements IEmisSettleInvoiceRecordService -{ +public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implements IEmisSettleInvoiceRecordService { @Autowired private EmisSettleInvoiceRecordMapper emisSettleInvoiceRecordMapper; @@ -74,12 +69,10 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen * @return 开票记录表 */ @Override - public EmisSettleInvoiceRecord selectEmisSettleInvoiceRecordById(Long id) - { + public EmisSettleInvoiceRecord selectEmisSettleInvoiceRecordById(Long id) { return emisSettleInvoiceRecordMapper.selectEmisSettleInvoiceRecordById(id); } - /** * 查询开票记录表列表 * @@ -87,8 +80,8 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen * @return 开票记录表 */ @Override - public List selectEmisSettleInvoiceRecordList(EmisSettleInvoiceRecord emisSettleInvoiceRecord) - { + public List selectEmisSettleInvoiceRecordList( + EmisSettleInvoiceRecord emisSettleInvoiceRecord) { return emisSettleInvoiceRecordMapper.selectEmisSettleInvoiceRecordList(emisSettleInvoiceRecord); } @@ -99,9 +92,8 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen * @return 数量 */ @Override - public int checkUnique(EmisSettleInvoiceRecord emisSettleInvoiceRecord) - { - return emisSettleInvoiceRecordMapper.checkUnique(emisSettleInvoiceRecord); + public int checkUnique(EmisSettleInvoiceRecord emisSettleInvoiceRecord) { + return emisSettleInvoiceRecordMapper.checkUnique(emisSettleInvoiceRecord); } /** @@ -115,7 +107,7 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen public int insertEmisSettleInvoiceRecord(EmisSettleInvoiceRecord emisSettleInvoiceRecord) throws EmisBizError { // id流水号 - String applySeqNo= WaybillHelper.genApplySeqNo(); + String applySeqNo = WaybillHelper.genApplySeqNo(); // 检查开票抬头启用状态 if (StringUtils.isNotBlank(emisSettleInvoiceRecord.getCompanyName()) && @@ -136,34 +128,33 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen } // 相同抬头,相同金额,有审批中或者已开票的不允许再申请 - int chkRst=emisSettleInvoiceRecordMapper.checkOpenBillRepeat(emisSettleInvoiceRecord); - if(chkRst!=0){ - throw new EmisBizError(EmisBizErrorType.FAIL,"重复开票"); + int chkRst = emisSettleInvoiceRecordMapper.checkOpenBillRepeat(emisSettleInvoiceRecord); + if (chkRst != 0) { + throw new EmisBizError(EmisBizErrorType.FAIL, "重复开票"); } - //多个账单合并开票 + // 多个账单合并开票 emisSettleInvoiceRecord.setSettleBillNo( - WaybillHelper.formatQueryValue(emisSettleInvoiceRecord.getSettleBillNo()) - ); + WaybillHelper.formatQueryValue(emisSettleInvoiceRecord.getSettleBillNo())); - List listRelCheck=emisSettleInvoiceRecord.getInvoiceRelList(); - if(!CollectionUtils.isEmpty(listRelCheck)){ - //bug 1151:业务开票申请:业务提交开票申请时,需要判断当前账单中是否存在运单号出现在业务出账确认和月结现金出账确认未确认或不出账状态, + List listRelCheck = emisSettleInvoiceRecord.getInvoiceRelList(); + if (!CollectionUtils.isEmpty(listRelCheck)) { + // bug 1151:业务开票申请:业务提交开票申请时,需要判断当前账单中是否存在运单号出现在业务出账确认和月结现金出账确认未确认或不出账状态, // 如果存在则不允许提交申请 并且弹窗提示(具体单号+出账未确认/确认不出账) - for (EmisSettleInvoiceRel invoiceRel:listRelCheck - ) { - EmisSettleSubBill subBill = emisSettleSubBillMapper.selectSettleSubBillBySubBillNo(invoiceRel.getBillNo()); - if(!"1".equals(subBill.getBlConfirmSite())){ - throw new EmisBizError(EmisBizErrorType.FAIL,"运单号:"+subBill.getBillNo()+" 业务出账未确认/确认不出账,不允许开票"); + for (EmisSettleInvoiceRel invoiceRel : listRelCheck) { + EmisSettleSubBill subBill = emisSettleSubBillMapper + .selectSettleSubBillBySubBillNo(invoiceRel.getBillNo()); + if (!"1".equals(subBill.getBlConfirmSite())) { + throw new EmisBizError(EmisBizErrorType.FAIL, + "运单号:" + subBill.getBillNo() + " 业务出账未确认/确认不出账,不允许开票"); } } } // 记录开票运单号 - List listRel=emisSettleInvoiceRecord.getInvoiceRelList(); - if(!CollectionUtils.isEmpty(listRel)){ - for (EmisSettleInvoiceRel invoiceRel:listRel - ) { + List listRel = emisSettleInvoiceRecord.getInvoiceRelList(); + if (!CollectionUtils.isEmpty(listRel)) { + for (EmisSettleInvoiceRel invoiceRel : listRel) { invoiceRel.setId(null); invoiceRel.setApplySeqNo(applySeqNo); @@ -171,28 +162,28 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen } } - BigDecimal totalFee =BigDecimal.ZERO; + BigDecimal totalFee = BigDecimal.ZERO; // 总可开票金额 String[] settBillNoArr = emisSettleInvoiceRecord.getSettleBillNo().split(","); - for(int i=0;i=0){ - throw new EmisBizError(EmisBizErrorType.FAIL,"开票金额必须大于0"); + if (BigDecimal.ZERO.compareTo(emisSettleInvoiceRecord.getApplyMoney()) >= 0) { + throw new EmisBizError(EmisBizErrorType.FAIL, "开票金额必须大于0"); } emisSettleInvoiceRecord.setOpenMoneyMax(totalFee); @@ -204,23 +195,23 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen // 插入开票记录 emisSettleInvoiceRecordMapper.insertEmisSettleInvoiceRecord(emisSettleInvoiceRecord); - // 重算账单已开票金额 - for(int i=0;i{}"+totalMoney.toString()); + System.out.println("==>{}" + totalMoney.toString()); - System.out.println("==>{}"+totalMoney.compareTo(recMoney)); + System.out.println("==>{}" + totalMoney.compareTo(recMoney)); } - - + /** + * 根据运单号列表查询开票记录 + * + * @param billCodes 运单号列表 + * @return 开票记录列表 + */ + @Override + public List selectInvoiceRecordListByBillCodes(List billCodes) { + if (CollectionUtils.isEmpty(billCodes)) { + return new ArrayList<>(); + } + return emisSettleInvoiceRecordMapper.selectInvoiceRecordListByBillCodes(billCodes); + } } diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisWriteoffApplyServiceImpl.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisWriteoffApplyServiceImpl.java index 51e7f1577..79f4df0cb 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisWriteoffApplyServiceImpl.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisWriteoffApplyServiceImpl.java @@ -1308,28 +1308,49 @@ public class EmisWriteoffApplyServiceImpl extends EmisBaseService implements IEm log.info("开始更新开票记录付款状态,申请ID: {}, 是否通过: {}", apply.getId(), isPass); - // 按账单号分组处理,避免重复更新同一账单 - Map> billGroups = detailList.stream() - .filter(detail -> StringUtil.isNotBlank(detail.getSettleBillNo())) - .collect(java.util.stream.Collectors.groupingBy(EmisWriteoffApplyDetail::getSettleBillNo)); + // 提取所有运单号 + List billCodes = detailList.stream() + .filter(detail -> StringUtil.isNotBlank(detail.getBillCode())) + .map(EmisWriteoffApplyDetail::getBillCode) + .distinct() + .collect(java.util.stream.Collectors.toList()); - for (Map.Entry> entry : billGroups.entrySet()) { - String settleBillNo = entry.getKey(); - List billDetails = entry.getValue(); + if (CollectionUtils.isEmpty(billCodes)) { + log.warn("申请明细中没有有效的运单号,无法更新开票记录付款状态,申请ID: {}", apply.getId()); + return; + } + + // 根据运单号查询开票记录 + List invoiceRecords = emisSettleInvoiceRecordService + .selectInvoiceRecordListByBillCodes(billCodes); + + if (CollectionUtils.isEmpty(invoiceRecords)) { + log.warn("未找到对应的开票记录,运单号: {}, 申请ID: {}", billCodes, apply.getId()); + return; + } + + // 按 invoice_no 分组处理开票记录 + Map> invoiceGroups = invoiceRecords.stream() + .filter(record -> StringUtil.isNotBlank(record.getInvoiceNo())) + .collect(java.util.stream.Collectors.groupingBy(EmisSettleInvoiceRecord::getInvoiceNo)); + + for (Map.Entry> entry : invoiceGroups.entrySet()) { + String invoiceNo = entry.getKey(); + List invoiceList = entry.getValue(); try { - // 计算该账单的总申请金额 - BigDecimal totalApplyMoney = billDetails.stream() + // 计算该发票号对应的总申请金额 + BigDecimal totalApplyMoney = detailList.stream() + .filter(detail -> StringUtil.isNotBlank(detail.getBillCode())) .map(detail -> detail.getApplyMoney() != null ? detail.getApplyMoney() : BigDecimal.ZERO) .reduce(BigDecimal.ZERO, BigDecimal::add); - // 获取账单的当前已收金额 - EmisWriteoffApplyDetail firstDetail = billDetails.get(0); - BigDecimal currentRecedMoney = BigDecimal.ZERO; - if (firstDetail.getEmisSettleBill() != null - && firstDetail.getEmisSettleBill().getRecedMoney() != null) { - currentRecedMoney = firstDetail.getEmisSettleBill().getRecedMoney(); - } + // 获取第一个开票记录作为参考(所有记录应该有相同的 apply_money 和 reced_money) + EmisSettleInvoiceRecord firstRecord = invoiceList.get(0); + BigDecimal applyMoney = firstRecord.getApplyMoney() != null ? firstRecord.getApplyMoney() + : BigDecimal.ZERO; + BigDecimal currentRecedMoney = firstRecord.getRecedMoney() != null ? firstRecord.getRecedMoney() + : BigDecimal.ZERO; // 计算新的已收金额 BigDecimal newRecedMoney; @@ -1345,32 +1366,18 @@ public class EmisWriteoffApplyServiceImpl extends EmisBaseService implements IEm } // 计算付款状态 - BigDecimal recMoney = BigDecimal.ZERO; - if (firstDetail.getEmisSettleBill() != null - && firstDetail.getEmisSettleBill().getRecMoney() != null) { - recMoney = firstDetail.getEmisSettleBill().getRecMoney(); - } - String paymentStatus; if (newRecedMoney.compareTo(BigDecimal.ZERO) == 0) { paymentStatus = "0"; // 未付款 - } else if (newRecedMoney.compareTo(recMoney) >= 0) { + } else if (newRecedMoney.compareTo(applyMoney) >= 0) { paymentStatus = "1"; // 已付款 } else { paymentStatus = "2"; // 部分付款 } - // 查询该账单号对应的开票记录 - List invoiceRecords = emisSettleInvoiceRecordService - .selectEmisSettleInvoiceRecordList(new EmisSettleInvoiceRecord() { - { - setSettleBillNo(settleBillNo); - } - }); - // 更新每个开票记录 int updateCount = 0; - for (EmisSettleInvoiceRecord invoiceRecord : invoiceRecords) { + for (EmisSettleInvoiceRecord invoiceRecord : invoiceList) { invoiceRecord.setRecedMoney(newRecedMoney); invoiceRecord.setPaymentStatus(paymentStatus); int result = emisSettleInvoiceRecordService.updateEmisSettleInvoiceRecord(invoiceRecord); @@ -1379,12 +1386,12 @@ public class EmisWriteoffApplyServiceImpl extends EmisBaseService implements IEm } } - log.info("开票记录付款状态更新成功,账单号: {}, 更新记录数: {}, 新已收金额: {}, 付款状态: {}, 申请金额: {}", - settleBillNo, updateCount, newRecedMoney, paymentStatus, totalApplyMoney); + log.info("开票记录付款状态更新成功,发票号: {}, 更新记录数: {}, 新已收金额: {}, 付款状态: {}, 申请金额: {}, 开票金额: {}", + invoiceNo, updateCount, newRecedMoney, paymentStatus, totalApplyMoney, applyMoney); } catch (Exception e) { - log.error("更新开票记录付款状态失败,账单号: {}", settleBillNo, e); - // 继续处理其他账单,不抛出异常 + log.error("更新开票记录付款状态失败,发票号: {}", invoiceNo, e); + // 继续处理其他发票,不抛出异常 } } diff --git a/emis-biz/src/main/resources/mapper/EmisSettleInvoiceRecordMapper.xml b/emis-biz/src/main/resources/mapper/EmisSettleInvoiceRecordMapper.xml index df489bbbf..f537f4ceb 100644 --- a/emis-biz/src/main/resources/mapper/EmisSettleInvoiceRecordMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisSettleInvoiceRecordMapper.xml @@ -228,6 +228,23 @@ where a.apply_seq_no = #{applySeqNo} + +