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,14 +17,17 @@ import org.apache.ibatis.annotations.Param;
/** /**
* @ClassName EmisSettleInvoiceRecordMapper * @ClassName EmisSettleInvoiceRecordMapper
* @Description <p> 开票记录表 Mapper 接口 </p> * @Description
* <p>
* 开票记录表 Mapper 接口
* </p>
* @author linfso * @author linfso
* @date 2024-07-21 13:31:26 * @date 2024-07-21 13:31:26
*/ */
public interface EmisSettleInvoiceRecordMapper extends BaseMapper<EmisSettleInvoiceRecord> public interface EmisSettleInvoiceRecordMapper extends BaseMapper<EmisSettleInvoiceRecord> {
{
/** /**
* 主键查询 * 主键查询
*
* @param id * @param id
* @return * @return
*/ */
@ -43,14 +46,11 @@ public interface EmisSettleInvoiceRecordMapper extends BaseMapper<EmisSettleInvo
* @param emisSettleInvoiceRecord * @param emisSettleInvoiceRecord
* @return 集合 * @return 集合
*/ */
public List<EmisSettleInvoiceRecord> selectEmisSettleInvoiceRecordList(EmisSettleInvoiceRecord emisSettleInvoiceRecord); public List<EmisSettleInvoiceRecord> selectEmisSettleInvoiceRecordList(
EmisSettleInvoiceRecord emisSettleInvoiceRecord);
public List<EmisSettleInvoiceRecord> selectInvoiceRecordListBySettleBillNo(String settleBillNo); public List<EmisSettleInvoiceRecord> selectInvoiceRecordListBySettleBillNo(String settleBillNo);
/** /**
* 检查是否重复 * 检查是否重复
* *
@ -59,7 +59,6 @@ public interface EmisSettleInvoiceRecordMapper extends BaseMapper<EmisSettleInvo
*/ */
public int checkUnique(EmisSettleInvoiceRecord emisSettleInvoiceRecord); public int checkUnique(EmisSettleInvoiceRecord emisSettleInvoiceRecord);
public int checkOpenBillRepeat(EmisSettleInvoiceRecord emisSettleInvoiceRecord); public int checkOpenBillRepeat(EmisSettleInvoiceRecord emisSettleInvoiceRecord);
/** /**
@ -70,8 +69,8 @@ public interface EmisSettleInvoiceRecordMapper extends BaseMapper<EmisSettleInvo
*/ */
public int insertEmisSettleInvoiceRecord(EmisSettleInvoiceRecord emisSettleInvoiceRecord); 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); public int updateHasPayByApplySeqNo(@Param("applySeqNo") String applySeqNo);
@ -103,5 +102,12 @@ public interface EmisSettleInvoiceRecordMapper extends BaseMapper<EmisSettleInvo
public int auditCenterPass(EmisSettleInvoiceRecord emisSettleInvoiceRecord); public int auditCenterPass(EmisSettleInvoiceRecord emisSettleInvoiceRecord);
/**
* 根据运单号列表查询开票记录
*
* @param billCodes 运单号列表
* @return 开票记录列表
*/
public List<EmisSettleInvoiceRecord> selectInvoiceRecordListByBillCodes(@Param("billCodes") List<String> billCodes);
} }

View File

@ -19,10 +19,10 @@ import com.xdadan.erp.emis.domain.exception.EmisBizError;
* @author linfso * @author linfso
* @date 2024-07-21 13:31:26 * @date 2024-07-21 13:31:26
*/ */
public interface IEmisSettleInvoiceRecordService public interface IEmisSettleInvoiceRecordService {
{
/** /**
* 主键查询 * 主键查询
*
* @param id * @param id
* @return * @return
*/ */
@ -34,8 +34,8 @@ public interface IEmisSettleInvoiceRecordService
* @param emisSettleInvoiceRecord 开票记录表 * @param emisSettleInvoiceRecord 开票记录表
* @return 开票记录表集合 * @return 开票记录表集合
*/ */
public List<EmisSettleInvoiceRecord> selectEmisSettleInvoiceRecordList(EmisSettleInvoiceRecord emisSettleInvoiceRecord); public List<EmisSettleInvoiceRecord> selectEmisSettleInvoiceRecordList(
EmisSettleInvoiceRecord emisSettleInvoiceRecord);
/** /**
* 检查是否重复 * 检查是否重复
@ -77,20 +77,23 @@ public interface IEmisSettleInvoiceRecordService
*/ */
public int deleteEmisSettleInvoiceRecordById(Long id); public int deleteEmisSettleInvoiceRecordById(Long id);
/** /**
* 中心驳回 * 中心驳回
*
* @param inputObj * @param inputObj
* @return * @return
* @throws EmisBizError * @throws EmisBizError
*/ */
public int auditCenterNoPass(EmisSettleInvoiceRecord inputObj) 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

@ -11,12 +11,10 @@
package com.xdadan.erp.emis.service.impl; package com.xdadan.erp.emis.service.impl;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; 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.*;
import com.xdadan.erp.emis.domain.enumtype.EmisBizErrorType; import com.xdadan.erp.emis.domain.enumtype.EmisBizErrorType;
import com.xdadan.erp.emis.domain.exception.EmisBizError; import com.xdadan.erp.emis.domain.exception.EmisBizError;
@ -29,10 +27,8 @@ import com.xdadan.erp.emis.service.IEmisSettleBillService;
import com.xdadan.erp.emis.utils.WaybillHelper; import com.xdadan.erp.emis.utils.WaybillHelper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.xdadan.erp.emis.mapper.EmisSettleInvoiceRecordMapper; import com.xdadan.erp.emis.mapper.EmisSettleInvoiceRecordMapper;
import com.xdadan.erp.emis.service.IEmisSettleInvoiceRecordService; import com.xdadan.erp.emis.service.IEmisSettleInvoiceRecordService;
@ -47,8 +43,7 @@ import org.springframework.transaction.annotation.Transactional;
@Slf4j @Slf4j
@Service @Service
public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implements IEmisSettleInvoiceRecordService public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implements IEmisSettleInvoiceRecordService {
{
@Autowired @Autowired
private EmisSettleInvoiceRecordMapper emisSettleInvoiceRecordMapper; private EmisSettleInvoiceRecordMapper emisSettleInvoiceRecordMapper;
@ -74,12 +69,10 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
* @return 开票记录表 * @return 开票记录表
*/ */
@Override @Override
public EmisSettleInvoiceRecord selectEmisSettleInvoiceRecordById(Long id) public EmisSettleInvoiceRecord selectEmisSettleInvoiceRecordById(Long id) {
{
return emisSettleInvoiceRecordMapper.selectEmisSettleInvoiceRecordById(id); return emisSettleInvoiceRecordMapper.selectEmisSettleInvoiceRecordById(id);
} }
/** /**
* 查询开票记录表列表 * 查询开票记录表列表
* *
@ -87,8 +80,8 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
* @return 开票记录表 * @return 开票记录表
*/ */
@Override @Override
public List<EmisSettleInvoiceRecord> selectEmisSettleInvoiceRecordList(EmisSettleInvoiceRecord emisSettleInvoiceRecord) public List<EmisSettleInvoiceRecord> selectEmisSettleInvoiceRecordList(
{ EmisSettleInvoiceRecord emisSettleInvoiceRecord) {
return emisSettleInvoiceRecordMapper.selectEmisSettleInvoiceRecordList(emisSettleInvoiceRecord); return emisSettleInvoiceRecordMapper.selectEmisSettleInvoiceRecordList(emisSettleInvoiceRecord);
} }
@ -99,8 +92,7 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
* @return 数量 * @return 数量
*/ */
@Override @Override
public int checkUnique(EmisSettleInvoiceRecord emisSettleInvoiceRecord) public int checkUnique(EmisSettleInvoiceRecord emisSettleInvoiceRecord) {
{
return emisSettleInvoiceRecordMapper.checkUnique(emisSettleInvoiceRecord); return emisSettleInvoiceRecordMapper.checkUnique(emisSettleInvoiceRecord);
} }
@ -143,18 +135,18 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
// 多个账单合并开票 // 多个账单合并开票
emisSettleInvoiceRecord.setSettleBillNo( emisSettleInvoiceRecord.setSettleBillNo(
WaybillHelper.formatQueryValue(emisSettleInvoiceRecord.getSettleBillNo()) WaybillHelper.formatQueryValue(emisSettleInvoiceRecord.getSettleBillNo()));
);
List<EmisSettleInvoiceRel> listRelCheck = emisSettleInvoiceRecord.getInvoiceRelList(); List<EmisSettleInvoiceRel> listRelCheck = emisSettleInvoiceRecord.getInvoiceRelList();
if (!CollectionUtils.isEmpty(listRelCheck)) { if (!CollectionUtils.isEmpty(listRelCheck)) {
// bug 1151:业务开票申请:业务提交开票申请时,需要判断当前账单中是否存在运单号出现在业务出账确认和月结现金出账确认未确认或不出账状态, // bug 1151:业务开票申请:业务提交开票申请时,需要判断当前账单中是否存在运单号出现在业务出账确认和月结现金出账确认未确认或不出账状态,
// 如果存在则不允许提交申请 并且弹窗提示(具体单号+出账未确认/确认不出账) // 如果存在则不允许提交申请 并且弹窗提示(具体单号+出账未确认/确认不出账)
for (EmisSettleInvoiceRel invoiceRel:listRelCheck for (EmisSettleInvoiceRel invoiceRel : listRelCheck) {
) { EmisSettleSubBill subBill = emisSettleSubBillMapper
EmisSettleSubBill subBill = emisSettleSubBillMapper.selectSettleSubBillBySubBillNo(invoiceRel.getBillNo()); .selectSettleSubBillBySubBillNo(invoiceRel.getBillNo());
if (!"1".equals(subBill.getBlConfirmSite())) { if (!"1".equals(subBill.getBlConfirmSite())) {
throw new EmisBizError(EmisBizErrorType.FAIL,"运单号:"+subBill.getBillNo()+" 业务出账未确认/确认不出账,不允许开票"); throw new EmisBizError(EmisBizErrorType.FAIL,
"运单号:" + subBill.getBillNo() + " 业务出账未确认/确认不出账,不允许开票");
} }
} }
} }
@ -162,8 +154,7 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
// 记录开票运单号 // 记录开票运单号
List<EmisSettleInvoiceRel> listRel = emisSettleInvoiceRecord.getInvoiceRelList(); List<EmisSettleInvoiceRel> listRel = emisSettleInvoiceRecord.getInvoiceRelList();
if (!CollectionUtils.isEmpty(listRel)) { if (!CollectionUtils.isEmpty(listRel)) {
for (EmisSettleInvoiceRel invoiceRel:listRel for (EmisSettleInvoiceRel invoiceRel : listRel) {
) {
invoiceRel.setId(null); invoiceRel.setId(null);
invoiceRel.setApplySeqNo(applySeqNo); invoiceRel.setApplySeqNo(applySeqNo);
@ -204,7 +195,6 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
// 插入开票记录 // 插入开票记录
emisSettleInvoiceRecordMapper.insertEmisSettleInvoiceRecord(emisSettleInvoiceRecord); emisSettleInvoiceRecordMapper.insertEmisSettleInvoiceRecord(emisSettleInvoiceRecord);
// 重算账单已开票金额 // 重算账单已开票金额
for (int i = 0; i < settBillNoArr.length; i++) { for (int i = 0; i < settBillNoArr.length; i++) {
String billNo = settBillNoArr[i]; String billNo = settBillNoArr[i];
@ -212,15 +202,16 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
} }
String empName = getCurrentUser().getEmpName(); String empName = getCurrentUser().getEmpName();
String title=empName+"提交了开票申请,开票抬头:"+emisSettleInvoiceRecord.getCompanyName()+",开票金额:"+emisSettleInvoiceRecord.getApplyMoney()+",请及时开票!"; String title = empName + "提交了开票申请,开票抬头:" + emisSettleInvoiceRecord.getCompanyName() + ",开票金额:"
+ emisSettleInvoiceRecord.getApplyMoney() + ",请及时开票!";
// 财务说不需要提醒 // 财务说不需要提醒
// sendNoticeToEmpUser("88888042,88888047,88888034", title, "", "/ruyERj/CenterInvoiceRecordDeal"); // sendNoticeToEmpUser("88888042,88888047,88888034", title, "",
// "/ruyERj/CenterInvoiceRecordDeal");
return 1; return 1;
} }
/** /**
* 修改开票记录表 * 修改开票记录表
* *
@ -228,8 +219,7 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
* @return 结果 * @return 结果
*/ */
@Override @Override
public int updateEmisSettleInvoiceRecord(EmisSettleInvoiceRecord emisSettleInvoiceRecord) public int updateEmisSettleInvoiceRecord(EmisSettleInvoiceRecord emisSettleInvoiceRecord) {
{
return emisSettleInvoiceRecordMapper.updateEmisSettleInvoiceRecord(emisSettleInvoiceRecord); return emisSettleInvoiceRecordMapper.updateEmisSettleInvoiceRecord(emisSettleInvoiceRecord);
} }
@ -240,8 +230,7 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
* @return 结果 * @return 结果
*/ */
@Override @Override
public int deleteEmisSettleInvoiceRecordByIds(Long[] ids) public int deleteEmisSettleInvoiceRecordByIds(Long[] ids) {
{
return emisSettleInvoiceRecordMapper.deleteEmisSettleInvoiceRecordByIds(ids); return emisSettleInvoiceRecordMapper.deleteEmisSettleInvoiceRecordByIds(ids);
} }
@ -252,15 +241,14 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
* @return 结果 * @return 结果
*/ */
@Override @Override
public int deleteEmisSettleInvoiceRecordById(Long id) public int deleteEmisSettleInvoiceRecordById(Long id) {
{
// 如果已开票不允许删除 // 如果已开票不允许删除
return emisSettleInvoiceRecordMapper.deleteEmisSettleInvoiceRecordById(id); return emisSettleInvoiceRecordMapper.deleteEmisSettleInvoiceRecordById(id);
} }
/** /**
* 中心驳回 * 中心驳回
*
* @param inputObj * @param inputObj
* @return * @return
* @throws EmisBizError * @throws EmisBizError
@ -268,7 +256,8 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
@Override @Override
public int auditCenterNoPass(EmisSettleInvoiceRecord inputObj) throws EmisBizError { public int auditCenterNoPass(EmisSettleInvoiceRecord inputObj) throws EmisBizError {
EmisSettleInvoiceRecord emisSettleInvoiceRecord = emisSettleInvoiceRecordMapper.selectEmisSettleInvoiceRecordById(inputObj.getId()); EmisSettleInvoiceRecord emisSettleInvoiceRecord = emisSettleInvoiceRecordMapper
.selectEmisSettleInvoiceRecordById(inputObj.getId());
if ("2".equals(emisSettleInvoiceRecord.getBlAudit())) { if ("2".equals(emisSettleInvoiceRecord.getBlAudit())) {
throw new EmisBizError(EmisBizErrorType.FAIL, "已驳回!"); throw new EmisBizError(EmisBizErrorType.FAIL, "已驳回!");
} }
@ -284,7 +273,8 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
emisSettleInvoiceRecordMapper.auditCenterNoPass(emisSettleInvoiceRecord); 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"); sendNoticeToEmpUser(emisSettleInvoiceRecord.getApplyManCode(), title, "", "/ruyERj/SiteInvoiceRecordApply");
// 重新计算开票状态 // 重新计算开票状态
@ -297,9 +287,9 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
} }
/** /**
* 审核通过 * 审核通过
*
* @param inputObj * @param inputObj
* @return * @return
* @throws EmisBizError * @throws EmisBizError
@ -307,7 +297,8 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
@Override @Override
public int auditCenterPass(EmisSettleInvoiceRecord inputObj) throws EmisBizError { public int auditCenterPass(EmisSettleInvoiceRecord inputObj) throws EmisBizError {
EmisSettleInvoiceRecord emisSettleInvoiceRecord = emisSettleInvoiceRecordMapper.selectEmisSettleInvoiceRecordById(inputObj.getId()); EmisSettleInvoiceRecord emisSettleInvoiceRecord = emisSettleInvoiceRecordMapper
.selectEmisSettleInvoiceRecordById(inputObj.getId());
if ("1".equals(emisSettleInvoiceRecord.getBlAudit())) { if ("1".equals(emisSettleInvoiceRecord.getBlAudit())) {
throw new EmisBizError(EmisBizErrorType.FAIL, "已审核!"); throw new EmisBizError(EmisBizErrorType.FAIL, "已审核!");
} }
@ -332,7 +323,6 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
} }
public static void main(String[] args) { public static void main(String[] args) {
BigDecimal totalMoney = BigDecimal.ZERO; BigDecimal totalMoney = BigDecimal.ZERO;
BigDecimal recMoney = BigDecimal.ZERO; BigDecimal recMoney = BigDecimal.ZERO;
@ -346,7 +336,18 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
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); log.info("开始更新开票记录付款状态,申请ID: {}, 是否通过: {}", apply.getId(), isPass);
// 按账单号分组处理,避免重复更新同一账单 // 提取所有运单号
Map<String, List<EmisWriteoffApplyDetail>> billGroups = detailList.stream() List<String> billCodes = detailList.stream()
.filter(detail -> StringUtil.isNotBlank(detail.getSettleBillNo())) .filter(detail -> StringUtil.isNotBlank(detail.getBillCode()))
.collect(java.util.stream.Collectors.groupingBy(EmisWriteoffApplyDetail::getSettleBillNo)); .map(EmisWriteoffApplyDetail::getBillCode)
.distinct()
.collect(java.util.stream.Collectors.toList());
for (Map.Entry<String, List<EmisWriteoffApplyDetail>> entry : billGroups.entrySet()) { if (CollectionUtils.isEmpty(billCodes)) {
String settleBillNo = entry.getKey(); log.warn("申请明细中没有有效的运单号,无法更新开票记录付款状态,申请ID: {}", apply.getId());
List<EmisWriteoffApplyDetail> billDetails = entry.getValue(); 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 { try {
// 计算该账单的总申请金额 // 计算该发票号对应的总申请金额
BigDecimal totalApplyMoney = billDetails.stream() BigDecimal totalApplyMoney = detailList.stream()
.filter(detail -> StringUtil.isNotBlank(detail.getBillCode()))
.map(detail -> detail.getApplyMoney() != null ? detail.getApplyMoney() : BigDecimal.ZERO) .map(detail -> detail.getApplyMoney() != null ? detail.getApplyMoney() : BigDecimal.ZERO)
.reduce(BigDecimal.ZERO, BigDecimal::add); .reduce(BigDecimal.ZERO, BigDecimal::add);
// 获取账单的当前已收金额 // 获取第一个开票记录作为参考(所有记录应该有相同的 apply_money 和 reced_money)
EmisWriteoffApplyDetail firstDetail = billDetails.get(0); EmisSettleInvoiceRecord firstRecord = invoiceList.get(0);
BigDecimal currentRecedMoney = BigDecimal.ZERO; BigDecimal applyMoney = firstRecord.getApplyMoney() != null ? firstRecord.getApplyMoney()
if (firstDetail.getEmisSettleBill() != null : BigDecimal.ZERO;
&& firstDetail.getEmisSettleBill().getRecedMoney() != null) { BigDecimal currentRecedMoney = firstRecord.getRecedMoney() != null ? firstRecord.getRecedMoney()
currentRecedMoney = firstDetail.getEmisSettleBill().getRecedMoney(); : BigDecimal.ZERO;
}
// 计算新的已收金额 // 计算新的已收金额
BigDecimal newRecedMoney; 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; String paymentStatus;
if (newRecedMoney.compareTo(BigDecimal.ZERO) == 0) { if (newRecedMoney.compareTo(BigDecimal.ZERO) == 0) {
paymentStatus = "0"; // 未付款 paymentStatus = "0"; // 未付款
} else if (newRecedMoney.compareTo(recMoney) >= 0) { } else if (newRecedMoney.compareTo(applyMoney) >= 0) {
paymentStatus = "1"; // 已付款 paymentStatus = "1"; // 已付款
} else { } else {
paymentStatus = "2"; // 部分付款 paymentStatus = "2"; // 部分付款
} }
// 查询该账单号对应的开票记录
List<EmisSettleInvoiceRecord> invoiceRecords = emisSettleInvoiceRecordService
.selectEmisSettleInvoiceRecordList(new EmisSettleInvoiceRecord() {
{
setSettleBillNo(settleBillNo);
}
});
// 更新每个开票记录 // 更新每个开票记录
int updateCount = 0; int updateCount = 0;
for (EmisSettleInvoiceRecord invoiceRecord : invoiceRecords) { for (EmisSettleInvoiceRecord invoiceRecord : invoiceList) {
invoiceRecord.setRecedMoney(newRecedMoney); invoiceRecord.setRecedMoney(newRecedMoney);
invoiceRecord.setPaymentStatus(paymentStatus); invoiceRecord.setPaymentStatus(paymentStatus);
int result = emisSettleInvoiceRecordService.updateEmisSettleInvoiceRecord(invoiceRecord); int result = emisSettleInvoiceRecordService.updateEmisSettleInvoiceRecord(invoiceRecord);
@ -1379,12 +1386,12 @@ public class EmisWriteoffApplyServiceImpl extends EmisBaseService implements IEm
} }
} }
log.info("开票记录付款状态更新成功,账单号: {}, 更新记录数: {}, 新已收金额: {}, 付款状态: {}, 申请金额: {}", log.info("开票记录付款状态更新成功,发票号: {}, 更新记录数: {}, 新已收金额: {}, 付款状态: {}, 申请金额: {}, 开票金额: {}",
settleBillNo, updateCount, newRecedMoney, paymentStatus, totalApplyMoney); invoiceNo, updateCount, newRecedMoney, paymentStatus, totalApplyMoney, applyMoney);
} catch (Exception e) { } catch (Exception e) {
log.error("更新开票记录付款状态失败,账单号: {}", settleBillNo, e); log.error("更新开票记录付款状态失败,发票号: {}", invoiceNo, e);
// 继续处理其他账单,不抛出异常 // 继续处理其他发票,不抛出异常
} }
} }

View File

@ -228,6 +228,23 @@
where a.apply_seq_no = #{applySeqNo} where a.apply_seq_no = #{applySeqNo}
</select> </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 id="checkOpenBillRepeat" parameterType="EmisSettleInvoiceRecord" resultType="int">
select count(1) from emis_settle_invoice_record select count(1) from emis_settle_invoice_record