package com.ruoyi.cwgl.service.impl; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.List; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.DateUtils; import javax.annotation.Resource; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.cwgl.domain.EstimatedReceivableBillLog; import com.ruoyi.cwgl.domain.PendingSettlementBusiness; import com.ruoyi.cwgl.mapper.EstimatedReceivableMapper; import com.ruoyi.cwgl.mapper.PendingSettlementBusinessMapper; import com.ruoyi.cwgl.service.IEstimatedReceivableBillLogService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.stereotype.Service; import org.springframework.scheduling.annotation.Async; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.ruoyi.common.utils.PageUtils; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.annotation.DataSource; import com.ruoyi.common.enums.DataSourceType; import com.ruoyi.common.core.service.BaseService; import com.ruoyi.cwgl.mapper.EstimatedReceivableBillMapper; import com.ruoyi.cwgl.domain.EstimatedReceivableBill; import com.ruoyi.cwgl.service.IEstimatedReceivableBillService; import com.ruoyi.common.core.text.Convert; /** * 预估应收账单Service业务层处理 * * @author ruoyi * @date 2025-08-07 */ @Service @Transactional(rollbackFor = Exception.class) public class EstimatedReceivableBillServiceImpl extends BaseService implements IEstimatedReceivableBillService { protected final Logger logger = LoggerFactory.getLogger(getClass()); @Resource private EstimatedReceivableBillMapper estimatedReceivableBillMapper; @Autowired private IEstimatedReceivableBillLogService logService; @Resource private PendingSettlementBusinessMapper pendingSettlementBusinessMapper; @Resource private EstimatedReceivableMapper estimatedReceivableMapper; /** * 查询预估应收账单 * * @param id 预估应收账单ID * @return 预估应收账单 */ @DataSource(DataSourceType.SLAVE) @Override public EstimatedReceivableBill selectEstimatedReceivableBillById(Integer id) { return estimatedReceivableBillMapper.selectEstimatedReceivableBillById(id); } /** * 查询预估应收账单 记录数 * * @param estimatedReceivableBill 预估应收账单 * @return 预估应收账单集合 */ @DataSource(DataSourceType.SLAVE) @Override public int selectEstimatedReceivableBillCount(EstimatedReceivableBill estimatedReceivableBill) { return estimatedReceivableBillMapper.selectEstimatedReceivableBillCount(estimatedReceivableBill); } /** * 查询预估应收账单列表 * * @param estimatedReceivableBill 预估应收账单 * @return 预估应收账单 */ @DataSource(DataSourceType.SLAVE) @Override public List selectEstimatedReceivableBillList(EstimatedReceivableBill estimatedReceivableBill) { return estimatedReceivableBillMapper.selectEstimatedReceivableBillList(estimatedReceivableBill); } /** * 查询预估应收账单列表 异步 导出 * * @param estimatedReceivableBill 预估应收账单 * @param exportKey 导出功能的唯一标识 * @return 预估应收账单集合 */ @DataSource(DataSourceType.SLAVE) @Async @Override public void export(EstimatedReceivableBill estimatedReceivableBill,String exportKey) { super.export(EstimatedReceivableBill.class,exportKey,"estimatedReceivableBillData",(pageNum)->{ PageUtils.startPage(pageNum, Constants.EXPORT_PATE_SIZE); return selectEstimatedReceivableBillList(estimatedReceivableBill); }); } /** * 新增预估应收账单 * * @param estimatedReceivableBill 预估应收账单 * @return 结果 */ @Override public int insertEstimatedReceivableBill(EstimatedReceivableBill estimatedReceivableBill) { estimatedReceivableBill.setCreateTime(DateUtils.getNowDate()); return estimatedReceivableBillMapper.insertEstimatedReceivableBill(estimatedReceivableBill); } /** * 新增预估应收账单[批量] * * @param estimatedReceivableBills 预估应收账单 * @return 结果 */ @Override public int insertEstimatedReceivableBillBatch(List estimatedReceivableBills) { int rows = estimatedReceivableBillMapper.insertEstimatedReceivableBillBatch(estimatedReceivableBills); return rows; } /** * 修改预估应收账单 * * @param estimatedReceivableBill 预估应收账单 * @return 结果 */ @Override public int updateEstimatedReceivableBill(EstimatedReceivableBill estimatedReceivableBill) { estimatedReceivableBill.setUpdateTime(DateUtils.getNowDate()); return estimatedReceivableBillMapper.updateEstimatedReceivableBill(estimatedReceivableBill); } @Override public int updateEstimatedReceivableBillName(EstimatedReceivableBill estimatedReceivableBill) { EstimatedReceivableBillLog estimatedReceivableBillLog = new EstimatedReceivableBillLog(); estimatedReceivableBillLog.setCreateTime(new Date()); estimatedReceivableBillLog.setBillId(estimatedReceivableBill.getId()); estimatedReceivableBillLog.setCreateBy(SecurityUtils.getUsername()); estimatedReceivableBillLog.setOperation("修改账单名称为"+estimatedReceivableBill.getBillName()); logService.insertEstimatedReceivableBillLog(estimatedReceivableBillLog); pendingSettlementBusinessMapper.updatePendingSettlementBusinessByBillId(estimatedReceivableBill.getId(),estimatedReceivableBill.getBillName()); return estimatedReceivableBillMapper.updateEstimatedReceivableBill(estimatedReceivableBill); } /** * 修改预估应收账单[批量] * * @param estimatedReceivableBills 预估应收账单 * @return 结果 */ @Override public int updateEstimatedReceivableBillBatch(List estimatedReceivableBills){ return estimatedReceivableBillMapper.updateEstimatedReceivableBillBatch(estimatedReceivableBills); } /** * 删除预估应收账单对象 * * @param ids 需要删除的数据ID * @return 结果 */ @Override public int deleteEstimatedReceivableBillByIds(String ids) { return deleteEstimatedReceivableBillByIds(Convert.toIntArray(ids)); } /** * 删除预估应收账单对象 * * * @param ids 需要删除的数据ID * @return 结果 */ @Override public int deleteEstimatedReceivableBillByIds(Integer[] ids) { return estimatedReceivableBillMapper.deleteEstimatedReceivableBillByIds(ids); } /** * 删除预估应收账单信息 * * @param id 预估应收账单ID * @return 结果 */ @Override public int deleteEstimatedReceivableBillById(Integer id) { return estimatedReceivableBillMapper.deleteEstimatedReceivableBillById(id); } @Override public int settlement(EstimatedReceivableBill estimatedReceivableBill) { Integer id = estimatedReceivableBill.getId(); EstimatedReceivableBill oldData = estimatedReceivableBillMapper.selectEstimatedReceivableBillById(id); //应结算金额 BigDecimal totalAmount = oldData.getTotalAmount()==null?BigDecimal.ZERO:oldData.getTotalAmount(); //已结算金额 BigDecimal settledAmount = oldData.getSettledAmount()==null?BigDecimal.ZERO:oldData.getSettledAmount(); //当前提交金额 BigDecimal settlementAmount = estimatedReceivableBill.getSettlementAmount(); EstimatedReceivableBillLog estimatedReceivableBillLog = new EstimatedReceivableBillLog(); estimatedReceivableBill.setSettledAmount(settlementAmount); estimatedReceivableBillLog.setCreateTime(new Date()); estimatedReceivableBillLog.setBillId(estimatedReceivableBill.getId()); estimatedReceivableBillLog.setCreateBy(SecurityUtils.getUsername()); estimatedReceivableBillLog.setOperation("本次提交金额"+ settlementAmount); estimatedReceivableBillLog.setFileName(estimatedReceivableBill.getAttachment()); logService.insertEstimatedReceivableBillLog(estimatedReceivableBillLog); settledAmount = settledAmount.add(settlementAmount); ListdispatchNos =pendingSettlementBusinessMapper.selectPendingSettlementBusinessDispatchNos(estimatedReceivableBill.getId()); // 检查当前提交金额+已结算金额是否超过应结算金额 if (settlementAmount.add(settledAmount).compareTo(totalAmount) > 0) { // 超过应结算金额,抛出异常或处理错误 throw new RuntimeException("当前提交金额加上已结算金额不能超过应结算金额"); } if (settlementAmount.add(settledAmount).compareTo(totalAmount) == 0) { //已结算大于应计算金额为已结算 estimatedReceivableBill.setStatus(2); estimatedReceivableMapper.updateEstimatedReceivableBillStatus(dispatchNos,3); }else { //否则部分结算 estimatedReceivableBill.setStatus(1); estimatedReceivableMapper.updateEstimatedReceivableBillStatus(dispatchNos,2); } return estimatedReceivableBillMapper.updateEstimatedReceivableBill(estimatedReceivableBill); } @Override public int cancelRelevancy(Integer id) { PendingSettlementBusiness pendingSettlementBusiness = pendingSettlementBusinessMapper.selectPendingSettlementBusinessById(id); if (pendingSettlementBusiness==null){ throw new ServiceException("待入账业务不存在"); } Integer billId = pendingSettlementBusiness.getBillId(); EstimatedReceivableBill estimatedReceivableBill = estimatedReceivableBillMapper.selectEstimatedReceivableBillById(billId); estimatedReceivableBill.setDispatchCount(estimatedReceivableBill.getDispatchCount()-1); //应结算金额修改 BigDecimal totalAmount = estimatedReceivableBill.getTotalAmount(); estimatedReceivableBill.setTotalAmount(totalAmount.subtract(pendingSettlementBusiness.getEstimatedTotalIncome())); EstimatedReceivableBillLog estimatedReceivableBillLog = new EstimatedReceivableBillLog(); estimatedReceivableBillLog.setCreateTime(new Date()); estimatedReceivableBillLog.setBillId(billId); estimatedReceivableBillLog.setCreateBy(SecurityUtils.getUsername()); String dispatchNo = pendingSettlementBusiness.getDispatchNo(); estimatedReceivableBillLog.setOperation("取消调度单"+ dispatchNo +"关联"); logService.insertEstimatedReceivableBillLog(estimatedReceivableBillLog); List dispatchNos = new ArrayList<>(); dispatchNos.add(dispatchNo); estimatedReceivableMapper.updateEstimatedReceivableBillStatus(dispatchNos,0); return pendingSettlementBusinessMapper.cancelRelevancy(id); } }