| | |
| | | package com.ruoyi.cwgl.service.impl; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | | import java.util.Objects; |
| | | import java.util.Set; |
| | | import java.util.stream.Collectors; |
| | | |
| | | import com.ruoyi.common.utils.DateUtils; |
| | | import javax.annotation.Resource; |
| | |
| | | import com.ruoyi.common.annotation.DataSource; |
| | | import com.ruoyi.common.enums.DataSourceType; |
| | | import com.ruoyi.common.core.service.BaseService; |
| | | import com.ruoyi.common.exception.ServiceException; |
| | | import com.ruoyi.common.utils.SecurityUtils; |
| | | |
| | | import com.ruoyi.cwgl.mapper.PayableBillSettlementDetailMapper; |
| | | import com.ruoyi.cwgl.domain.PayableBillSettlementDetail; |
| | | import com.ruoyi.cwgl.service.IPayableBillSettlementDetailService; |
| | | import com.ruoyi.cwgl.service.IPayableBillManagementService; |
| | | import com.ruoyi.cwgl.domain.PayableBillManagement; |
| | | import com.ruoyi.cwgl.service.IPayableBillManagementLogService; |
| | | import com.ruoyi.cwgl.domain.PayableBillManagementLog; |
| | | import com.ruoyi.common.core.text.Convert; |
| | | |
| | | /** |
| | |
| | | protected final Logger logger = LoggerFactory.getLogger(getClass()); |
| | | @Resource |
| | | private PayableBillSettlementDetailMapper payableBillSettlementDetailMapper; |
| | | |
| | | @Resource |
| | | private IPayableBillManagementService payableBillManagementService; |
| | | |
| | | @Resource |
| | | private IPayableBillManagementLogService payableBillManagementLogService; |
| | | |
| | | |
| | | /** |
| | |
| | | @Override |
| | | public int insertPayableBillSettlementDetail(PayableBillSettlementDetail payableBillSettlementDetail) |
| | | { |
| | | // 1. 设置创建时间 |
| | | payableBillSettlementDetail.setCreateTime(DateUtils.getNowDate()); |
| | | return payableBillSettlementDetailMapper.insertPayableBillSettlementDetail(payableBillSettlementDetail); |
| | | |
| | | // 2. 插入结算明细记录 |
| | | int result = payableBillSettlementDetailMapper.insertPayableBillSettlementDetail(payableBillSettlementDetail); |
| | | |
| | | // 3. 如果插入成功且billId不为空,则更新主表金额和状态 |
| | | if (result > 0 && payableBillSettlementDetail.getBillId() != null) { |
| | | updatePayableBillAmountAndStatus(payableBillSettlementDetail.getBillId()); |
| | | |
| | | // 记录添加结算明细操作日志 |
| | | PayableBillManagement billManagement = payableBillManagementService.selectPayableBillManagementById(payableBillSettlementDetail.getBillId()); |
| | | if (billManagement != null) { |
| | | PayableBillManagementLog log = new PayableBillManagementLog(); |
| | | log.setBillId(payableBillSettlementDetail.getBillId()); |
| | | log.setCreateBy(SecurityUtils.getUsername()); |
| | | log.setCreateTime(DateUtils.getNowDate()); |
| | | log.setOperation("添加结算明细,账单编号:" + billManagement.getSystemNo()); |
| | | payableBillManagementLogService.insertPayableBillManagementLog(log); |
| | | } |
| | | } |
| | | |
| | | return result; |
| | | } |
| | | |
| | | /** |
| | |
| | | @Override |
| | | public int insertPayableBillSettlementDetailBatch(List<PayableBillSettlementDetail> payableBillSettlementDetails) |
| | | { |
| | | // 1. 设置创建时间 |
| | | for (PayableBillSettlementDetail detail : payableBillSettlementDetails) { |
| | | detail.setCreateTime(DateUtils.getNowDate()); |
| | | } |
| | | |
| | | // 2. 批量插入结算明细记录 |
| | | int rows = payableBillSettlementDetailMapper.insertPayableBillSettlementDetailBatch(payableBillSettlementDetails); |
| | | |
| | | // 3. 如果插入成功,则更新相关主表金额和状态 |
| | | if (rows > 0) { |
| | | // 获取所有不重复的billId |
| | | Set<Integer> billIds = payableBillSettlementDetails.stream() |
| | | .map(PayableBillSettlementDetail::getBillId) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toSet()); |
| | | |
| | | // 更新每个账单主表的金额和状态 |
| | | for (Integer billId : billIds) { |
| | | updatePayableBillAmountAndStatus(billId); |
| | | } |
| | | |
| | | // 记录添加结算明细操作日志 |
| | | if (!billIds.isEmpty()) { |
| | | for (Integer billId : billIds) { |
| | | PayableBillManagement billManagement = payableBillManagementService.selectPayableBillManagementById(billId); |
| | | if (billManagement != null) { |
| | | PayableBillManagementLog log = new PayableBillManagementLog(); |
| | | log.setBillId(billId); |
| | | log.setCreateBy(SecurityUtils.getUsername()); |
| | | log.setCreateTime(DateUtils.getNowDate()); |
| | | |
| | | // 计算本次添加的明细数量 |
| | | long detailCount = payableBillSettlementDetails.stream() |
| | | .filter(detail -> billId.equals(detail.getBillId())) |
| | | .count(); |
| | | |
| | | log.setOperation("添加" + detailCount + "条结算明细,账单编号:" + billManagement.getSystemNo()); |
| | | payableBillManagementLogService.insertPayableBillManagementLog(log); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | return rows; |
| | | } |
| | | |
| | |
| | | @Override |
| | | public int updatePayableBillSettlementDetail(PayableBillSettlementDetail payableBillSettlementDetail) |
| | | { |
| | | // 1. 获取修改前的记录,用于后续更新主表 |
| | | PayableBillSettlementDetail oldDetail = null; |
| | | if (payableBillSettlementDetail.getId() != null) { |
| | | oldDetail = payableBillSettlementDetailMapper.selectPayableBillSettlementDetailById(payableBillSettlementDetail.getId()); |
| | | } |
| | | |
| | | // 2. 设置更新时间 |
| | | payableBillSettlementDetail.setUpdateTime(DateUtils.getNowDate()); |
| | | return payableBillSettlementDetailMapper.updatePayableBillSettlementDetail(payableBillSettlementDetail); |
| | | |
| | | // 3. 更新结算明细记录 |
| | | int result = payableBillSettlementDetailMapper.updatePayableBillSettlementDetail(payableBillSettlementDetail); |
| | | |
| | | // 4. 如果更新成功,则更新相关主表金额和状态 |
| | | if (result > 0) { |
| | | // 获取需要更新的billId(优先使用新记录的billId,如果没有则使用旧记录的billId) |
| | | Integer billId = payableBillSettlementDetail.getBillId(); |
| | | if (billId == null && oldDetail != null) { |
| | | billId = oldDetail.getBillId(); |
| | | } |
| | | |
| | | if (billId != null) { |
| | | updatePayableBillAmountAndStatus(billId); |
| | | } |
| | | } |
| | | |
| | | return result; |
| | | } |
| | | |
| | | /** |
| | |
| | | * @return 结果 |
| | | */ |
| | | @Override |
| | | public int updatePayableBillSettlementDetailBatch(List<PayableBillSettlementDetail> payableBillSettlementDetails){ |
| | | return payableBillSettlementDetailMapper.updatePayableBillSettlementDetailBatch(payableBillSettlementDetails); |
| | | public int updatePayableBillSettlementDetailBatch(List<PayableBillSettlementDetail> payableBillSettlementDetails) |
| | | { |
| | | // 1. 设置更新时间 |
| | | for (PayableBillSettlementDetail detail : payableBillSettlementDetails) { |
| | | detail.setUpdateTime(DateUtils.getNowDate()); |
| | | } |
| | | |
| | | // 2. 批量更新结算明细记录 |
| | | int rows = payableBillSettlementDetailMapper.updatePayableBillSettlementDetailBatch(payableBillSettlementDetails); |
| | | |
| | | // 3. 如果更新成功,则更新相关主表金额和状态 |
| | | if (rows > 0) { |
| | | // 获取所有不重复的billId |
| | | Set<Integer> billIds = payableBillSettlementDetails.stream() |
| | | .map(PayableBillSettlementDetail::getBillId) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toSet()); |
| | | |
| | | // 更新每个账单主表的金额和状态 |
| | | for (Integer billId : billIds) { |
| | | updatePayableBillAmountAndStatus(billId); |
| | | } |
| | | |
| | | // 记录修改结算明细操作日志 |
| | | if (!billIds.isEmpty()) { |
| | | for (Integer billId : billIds) { |
| | | PayableBillManagement billManagement = payableBillManagementService.selectPayableBillManagementById(billId); |
| | | if (billManagement != null) { |
| | | PayableBillManagementLog log = new PayableBillManagementLog(); |
| | | log.setBillId(billId); |
| | | log.setCreateBy(SecurityUtils.getUsername()); |
| | | log.setCreateTime(DateUtils.getNowDate()); |
| | | |
| | | // 计算本次修改的明细数量 |
| | | long detailCount = payableBillSettlementDetails.stream() |
| | | .filter(detail -> billId.equals(detail.getBillId())) |
| | | .count(); |
| | | |
| | | log.setOperation("修改" + detailCount + "条结算明细,账单编号:" + billManagement.getSystemNo()); |
| | | payableBillManagementLogService.insertPayableBillManagementLog(log); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | return rows; |
| | | } |
| | | |
| | | /** |
| | |
| | | { |
| | | return payableBillSettlementDetailMapper.deletePayableBillSettlementDetailById(id); |
| | | } |
| | | |
| | | /** |
| | | * 更新应付账单主表的金额和状态 |
| | | * |
| | | * @param billId 应付账单ID |
| | | */ |
| | | private void updatePayableBillAmountAndStatus(Integer billId) { |
| | | // 1. 查询应付账单主表记录 |
| | | PayableBillManagement billManagement = payableBillManagementService.selectPayableBillManagementById(billId); |
| | | if (billManagement == null) { |
| | | throw new ServiceException("应付账单主表记录不存在,ID:" + billId); |
| | | } |
| | | |
| | | // 2. 查询该账单的所有结算明细记录 |
| | | PayableBillSettlementDetail queryDetail = new PayableBillSettlementDetail(); |
| | | queryDetail.setBillId(billId); |
| | | List<PayableBillSettlementDetail> settlementDetails = payableBillSettlementDetailMapper.selectPayableBillSettlementDetailList(queryDetail); |
| | | |
| | | // 3. 计算总付款金额 |
| | | BigDecimal totalPaymentAmount = settlementDetails.stream() |
| | | .map(PayableBillSettlementDetail::getPaymentAmount) |
| | | .filter(amount -> amount != null) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | |
| | | // 4. 验证金额不能为负数 |
| | | if (totalPaymentAmount.compareTo(BigDecimal.ZERO) < 0) { |
| | | throw new ServiceException("付款金额不能为负数"); |
| | | } |
| | | |
| | | // 5. 计算待付金额(应结算金额 - 已付金额 - 减免金额) |
| | | BigDecimal totalAmount = billManagement.getTotalAmount() != null ? billManagement.getTotalAmount() : BigDecimal.ZERO; |
| | | BigDecimal discountAmount = billManagement.getDiscountAmount() != null ? billManagement.getDiscountAmount() : BigDecimal.ZERO; |
| | | BigDecimal pendingAmount = totalAmount.subtract(totalPaymentAmount).subtract(discountAmount); |
| | | |
| | | // 6. 验证待付金额不能为负数 |
| | | if (pendingAmount.compareTo(BigDecimal.ZERO) < 0) { |
| | | throw new ServiceException("待付金额不能为负数,当前计算值:" + pendingAmount); |
| | | } |
| | | |
| | | // 7. 更新主表金额 |
| | | billManagement.setPaidAmount(totalPaymentAmount); |
| | | billManagement.setPendingAmount(pendingAmount); |
| | | |
| | | // 8. 根据待付金额更新状态 |
| | | if (pendingAmount.compareTo(BigDecimal.ZERO) == 0) { |
| | | // 待付金额为0,状态改为3(已结算) |
| | | billManagement.setStatus("3"); |
| | | } else { |
| | | // 待付金额大于0,状态改为1(结算中) |
| | | billManagement.setStatus("1"); |
| | | } |
| | | |
| | | // 9. 更新主表记录 |
| | | billManagement.setUpdateTime(DateUtils.getNowDate()); |
| | | payableBillManagementService.updatePayableBillManagement(billManagement); |
| | | } |
| | | } |