demand: TMS系统 - 客户账单管理 - 财务中心销账审核 -财务审核通过/总部驳回以后更新发票收款状态、已收金额

committer: heyu
This commit is contained in:
aike 2025-09-22 10:46:39 +08:00
parent d7946de5ce
commit 39b60f53bf
5 changed files with 212 additions and 178 deletions

View File

@ -17,16 +17,19 @@ import org.apache.ibatis.annotations.Param;
/**
* @ClassName EmisSettleInvoiceRecordMapper
* @Description <p> 开票记录表 Mapper 接口 </p>
* @Description
* <p>
* 开票记录表 Mapper 接口
* </p>
* @author linfso
* @date 2024-07-21 13:31:26
*/
public interface EmisSettleInvoiceRecordMapper extends BaseMapper<EmisSettleInvoiceRecord>
{
public interface EmisSettleInvoiceRecordMapper extends BaseMapper<EmisSettleInvoiceRecord> {
/**
* 主键查询
* @param id
* @return
*
* @param id
* @return
*/
public EmisSettleInvoiceRecord selectEmisSettleInvoiceRecordById(Long id);
@ -40,46 +43,42 @@ public interface EmisSettleInvoiceRecordMapper extends BaseMapper<EmisSettleInvo
/**
* 查询列表
*
* @param emisSettleInvoiceRecord
* @param emisSettleInvoiceRecord
* @return 集合
*/
public List<EmisSettleInvoiceRecord> selectEmisSettleInvoiceRecordList(EmisSettleInvoiceRecord emisSettleInvoiceRecord);
public List<EmisSettleInvoiceRecord> selectEmisSettleInvoiceRecordList(
EmisSettleInvoiceRecord emisSettleInvoiceRecord);
public List<EmisSettleInvoiceRecord> 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<EmisSettleInvo
public int auditCenterPass(EmisSettleInvoiceRecord emisSettleInvoiceRecord);
/**
* 根据运单号列表查询开票记录
*
* @param billCodes 运单号列表
* @return 开票记录列表
*/
public List<EmisSettleInvoiceRecord> selectInvoiceRecordListByBillCodes(@Param("billCodes") List<String> billCodes);
}

View File

@ -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: <p> 开票记录表 服务类接口 </p>
*/
/**
* @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: <p> 开票记录表 服务类接口 </p>
*/
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<EmisSettleInvoiceRecord> selectEmisSettleInvoiceRecordList(EmisSettleInvoiceRecord emisSettleInvoiceRecord);
public List<EmisSettleInvoiceRecord> 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<EmisSettleInvoiceRecord> selectInvoiceRecordListByBillCodes(List<String> billCodes);
}

View File

@ -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: <p> 开票记录表 实体类 </p>
*/
/**
* @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: <p> 开票记录表 实体类 </p>
*/
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<EmisSettleInvoiceRecord> selectEmisSettleInvoiceRecordList(EmisSettleInvoiceRecord emisSettleInvoiceRecord)
{
public List<EmisSettleInvoiceRecord> 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<EmisSettleInvoiceRel> listRelCheck=emisSettleInvoiceRecord.getInvoiceRelList();
if(!CollectionUtils.isEmpty(listRelCheck)){
//bug 1151:业务开票申请:业务提交开票申请时,需要判断当前账单中是否存在运单号出现在业务出账确认和月结现金出账确认未确认或不出账状态,
List<EmisSettleInvoiceRel> 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<EmisSettleInvoiceRel> listRel=emisSettleInvoiceRecord.getInvoiceRelList();
if(!CollectionUtils.isEmpty(listRel)){
for (EmisSettleInvoiceRel invoiceRel:listRel
) {
List<EmisSettleInvoiceRel> 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<settBillNoArr.length;i++){
String billNo=settBillNoArr[i];
EmisSettleBill emisSettleBill=getSettleBillBySettleBillNo(billNo);
if(emisSettleBill==null){
throw new EmisBizError(EmisBizErrorType.FAIL,"账单不存在");
for (int i = 0; i < settBillNoArr.length; i++) {
String billNo = settBillNoArr[i];
EmisSettleBill emisSettleBill = getSettleBillBySettleBillNo(billNo);
if (emisSettleBill == null) {
throw new EmisBizError(EmisBizErrorType.FAIL, "账单不存在");
}
if(!"1".equals(emisSettleBill.getBlConfirmSite())){
throw new EmisBizError(EmisBizErrorType.FAIL,"业务账单未确认");
if (!"1".equals(emisSettleBill.getBlConfirmSite())) {
throw new EmisBizError(EmisBizErrorType.FAIL, "业务账单未确认");
}
totalFee=totalFee.add(emisSettleBill.getRecMoney());
totalFee = totalFee.add(emisSettleBill.getRecMoney());
// 插入开票记录与账单的关系
emisSettleInvoiceRecordMapper.insertInvoiceRecordBillRel(applySeqNo,billNo);
emisSettleInvoiceRecordMapper.insertInvoiceRecordBillRel(applySeqNo, billNo);
}
if(BigDecimal.ZERO.compareTo(emisSettleInvoiceRecord.getApplyMoney())>=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<settBillNoArr.length;i++) {
String billNo=settBillNoArr[i];
for (int i = 0; i < settBillNoArr.length; i++) {
String billNo = settBillNoArr[i];
emisSettleBillService.reCalcSettleBillInvoiceStatus(billNo);
}
String empName=getCurrentUser().getEmpName();
String title=empName+"提交了开票申请,开票抬头:"+emisSettleInvoiceRecord.getCompanyName()+",开票金额:"+emisSettleInvoiceRecord.getApplyMoney()+",请及时开票!";
String empName = getCurrentUser().getEmpName();
String title = empName + "提交了开票申请,开票抬头:" + emisSettleInvoiceRecord.getCompanyName() + ",开票金额:"
+ emisSettleInvoiceRecord.getApplyMoney() + ",请及时开票!";
// 财务说不需要提醒
// sendNoticeToEmpUser("88888042,88888047,88888034", title, "", "/ruyERj/CenterInvoiceRecordDeal");
// 财务说不需要提醒
// sendNoticeToEmpUser("88888042,88888047,88888034", title, "",
// "/ruyERj/CenterInvoiceRecordDeal");
return 1;
}
/**
* 修改开票记录表
*
@ -228,8 +219,7 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
* @return 结果
*/
@Override
public int updateEmisSettleInvoiceRecord(EmisSettleInvoiceRecord emisSettleInvoiceRecord)
{
public int updateEmisSettleInvoiceRecord(EmisSettleInvoiceRecord emisSettleInvoiceRecord) {
return emisSettleInvoiceRecordMapper.updateEmisSettleInvoiceRecord(emisSettleInvoiceRecord);
}
@ -240,8 +230,7 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
* @return 结果
*/
@Override
public int deleteEmisSettleInvoiceRecordByIds(Long[] ids)
{
public int deleteEmisSettleInvoiceRecordByIds(Long[] ids) {
return emisSettleInvoiceRecordMapper.deleteEmisSettleInvoiceRecordByIds(ids);
}
@ -252,15 +241,14 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
* @return 结果
*/
@Override
public int deleteEmisSettleInvoiceRecordById(Long id)
{
public int deleteEmisSettleInvoiceRecordById(Long id) {
// 如果已开票不允许删除
return emisSettleInvoiceRecordMapper.deleteEmisSettleInvoiceRecordById(id);
}
/**
* 中心驳回
*
* @param inputObj
* @return
* @throws EmisBizError
@ -268,9 +256,10 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
@Override
public int auditCenterNoPass(EmisSettleInvoiceRecord inputObj) throws EmisBizError {
EmisSettleInvoiceRecord emisSettleInvoiceRecord = emisSettleInvoiceRecordMapper.selectEmisSettleInvoiceRecordById(inputObj.getId());
if("2".equals(emisSettleInvoiceRecord.getBlAudit()) ){
throw new EmisBizError(EmisBizErrorType.FAIL,"已驳回!");
EmisSettleInvoiceRecord emisSettleInvoiceRecord = emisSettleInvoiceRecordMapper
.selectEmisSettleInvoiceRecordById(inputObj.getId());
if ("2".equals(emisSettleInvoiceRecord.getBlAudit())) {
throw new EmisBizError(EmisBizErrorType.FAIL, "已驳回!");
}
// 审核不通过
@ -284,12 +273,13 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
emisSettleInvoiceRecordMapper.auditCenterNoPass(emisSettleInvoiceRecord);
String title="开票被驳回,原因【"+inputObj.getAuditNote()+"】审核人:"+getCurrentUser().getEmpName()+",开票抬头:"+emisSettleInvoiceRecord.getCompanyName()+",开票金额:"+emisSettleInvoiceRecord.getApplyMoney();
String title = "开票被驳回,原因【" + inputObj.getAuditNote() + "】审核人:" + getCurrentUser().getEmpName() + ",开票抬头:"
+ emisSettleInvoiceRecord.getCompanyName() + ",开票金额:" + emisSettleInvoiceRecord.getApplyMoney();
sendNoticeToEmpUser(emisSettleInvoiceRecord.getApplyManCode(), title, "", "/ruyERj/SiteInvoiceRecordApply");
// 重新计算开票状态
String[] settleBillArr=emisSettleInvoiceRecord.getSettleBillNo().split(",");
for(int i=0;i<settleBillArr.length;i++){
String[] settleBillArr = emisSettleInvoiceRecord.getSettleBillNo().split(",");
for (int i = 0; i < settleBillArr.length; i++) {
emisSettleBillService.reCalcSettleBillInvoiceStatus(settleBillArr[i]);
}
@ -297,9 +287,9 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
}
/**
* 审核通过
*
* @param inputObj
* @return
* @throws EmisBizError
@ -307,9 +297,10 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
@Override
public int auditCenterPass(EmisSettleInvoiceRecord inputObj) throws EmisBizError {
EmisSettleInvoiceRecord emisSettleInvoiceRecord = emisSettleInvoiceRecordMapper.selectEmisSettleInvoiceRecordById(inputObj.getId());
if("1".equals(emisSettleInvoiceRecord.getBlAudit()) ){
throw new EmisBizError(EmisBizErrorType.FAIL,"已审核!");
EmisSettleInvoiceRecord emisSettleInvoiceRecord = emisSettleInvoiceRecordMapper
.selectEmisSettleInvoiceRecordById(inputObj.getId());
if ("1".equals(emisSettleInvoiceRecord.getBlAudit())) {
throw new EmisBizError(EmisBizErrorType.FAIL, "已审核!");
}
// 审核通过
@ -323,8 +314,8 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
emisSettleInvoiceRecordMapper.auditCenterPass(emisSettleInvoiceRecord);
// 重新计算开票状态
String[] settleBillArr=emisSettleInvoiceRecord.getSettleBillNo().split(",");
for(int i=0;i<settleBillArr.length;i++){
String[] settleBillArr = emisSettleInvoiceRecord.getSettleBillNo().split(",");
for (int i = 0; i < settleBillArr.length; i++) {
emisSettleBillService.reCalcSettleBillInvoiceStatus(settleBillArr[i]);
}
@ -332,21 +323,31 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
}
public static void main(String[] args) {
BigDecimal totalMoney=BigDecimal.ZERO;
BigDecimal recMoney=BigDecimal.ZERO;
BigDecimal totalMoney = BigDecimal.ZERO;
BigDecimal recMoney = BigDecimal.ZERO;
totalMoney=totalMoney.add(BigDecimal.valueOf(200.2D));
totalMoney = totalMoney.add(BigDecimal.valueOf(200.2D));
recMoney=BigDecimal.valueOf(200.19D);
recMoney = BigDecimal.valueOf(200.19D);
System.out.println("==>{}"+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<EmisSettleInvoiceRecord> selectInvoiceRecordListByBillCodes(List<String> billCodes) {
if (CollectionUtils.isEmpty(billCodes)) {
return new ArrayList<>();
}
return emisSettleInvoiceRecordMapper.selectInvoiceRecordListByBillCodes(billCodes);
}
}

View File

@ -1308,28 +1308,49 @@ public class EmisWriteoffApplyServiceImpl extends EmisBaseService implements IEm
log.info("开始更新开票记录付款状态,申请ID: {}, 是否通过: {}", apply.getId(), isPass);
// 按账单号分组处理,避免重复更新同一账单
Map<String, List<EmisWriteoffApplyDetail>> billGroups = detailList.stream()
.filter(detail -> StringUtil.isNotBlank(detail.getSettleBillNo()))
.collect(java.util.stream.Collectors.groupingBy(EmisWriteoffApplyDetail::getSettleBillNo));
// 提取所有运单号
List<String> billCodes = detailList.stream()
.filter(detail -> StringUtil.isNotBlank(detail.getBillCode()))
.map(EmisWriteoffApplyDetail::getBillCode)
.distinct()
.collect(java.util.stream.Collectors.toList());
for (Map.Entry<String, List<EmisWriteoffApplyDetail>> entry : billGroups.entrySet()) {
String settleBillNo = entry.getKey();
List<EmisWriteoffApplyDetail> billDetails = entry.getValue();
if (CollectionUtils.isEmpty(billCodes)) {
log.warn("申请明细中没有有效的运单号,无法更新开票记录付款状态,申请ID: {}", apply.getId());
return;
}
// 根据运单号查询开票记录
List<EmisSettleInvoiceRecord> invoiceRecords = emisSettleInvoiceRecordService
.selectInvoiceRecordListByBillCodes(billCodes);
if (CollectionUtils.isEmpty(invoiceRecords)) {
log.warn("未找到对应的开票记录,运单号: {}, 申请ID: {}", billCodes, apply.getId());
return;
}
// 按 invoice_no 分组处理开票记录
Map<String, List<EmisSettleInvoiceRecord>> invoiceGroups = invoiceRecords.stream()
.filter(record -> StringUtil.isNotBlank(record.getInvoiceNo()))
.collect(java.util.stream.Collectors.groupingBy(EmisSettleInvoiceRecord::getInvoiceNo));
for (Map.Entry<String, List<EmisSettleInvoiceRecord>> entry : invoiceGroups.entrySet()) {
String invoiceNo = entry.getKey();
List<EmisSettleInvoiceRecord> 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<EmisSettleInvoiceRecord> 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);
// 继续处理其他发票,不抛出异常
}
}

View File

@ -228,6 +228,23 @@
where a.apply_seq_no = #{applySeqNo}
</select>
<select id="selectInvoiceRecordListByBillCodes" parameterType="java.util.List" resultMap="EmisSettleInvoiceRecordResult">
select distinct a.id, a.apply_seq_no, a.apply_date, a.apply_man_code, a.apply_site_code, a.customer_code, a.customer_name, a.settle_bill_no, a.settle_bill_name, a.apply_money, a.invoice_type, a.openbill_scope, a.company_name, a.company_tax_no, a.company_tel, a.company_address, a.invioce_remark, a.bank_name, a.bank_acc_no, a.contact, a.phone, a.real_tax_type, a.orig_open_money, a.add_tax_rate, a.add_open_money, a.open_money_max, a.open_money, ch.invoice_no, a.reced_money, a.payment_status, a.invoice_status, a.invoice_status_desc, a.recieve_address, a.email, a.file_path, a.remark, a.bl_audit, a.audit_date, a.audit_man_code, a.audit_site_code, a.audit_note, a.op_man_code, a.op_date, a.op_site_code, a.open_ch_id, a.open_ch_status, a.open_ch_status_desc, a.open_com_code, a.del_flag, a.create_by, a.create_time, a.update_by, a.update_time, a.create_site, a.update_site
from emis_settle_invoice_record a
left join emis_settle_invoice_ch_record ch on a.apply_seq_no = ch.apply_seq_no and ch.del_flag = '0'
where a.del_flag = '0'
and exists (
select 1 from emis_settle_invoice_rel rel
where rel.del_flag = '0'
and rel.apply_seq_no = a.apply_seq_no
and rel.bill_no in
<foreach item="billCode" collection="billCodes" open="(" separator="," close=")">
#{billCode}
</foreach>
)
order by a.invoice_no, a.apply_seq_no
</select>
<!-- 检查是否有重复太抬头开票,未审核 -->
<select id="checkOpenBillRepeat" parameterType="EmisSettleInvoiceRecord" resultType="int">
select count(1) from emis_settle_invoice_record