wujianwei
2026-01-12 acfe8943be0bb1440e0e6ba27ad9e694859e835e
service/src/main/java/com/ruoyi/cwgl/service/impl/PayableBillSettlementDetailServiceImpl.java
@@ -1,6 +1,10 @@
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;
@@ -14,10 +18,16 @@
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;
/**
@@ -33,6 +43,12 @@
    protected final Logger logger = LoggerFactory.getLogger(getClass());
    @Resource
    private PayableBillSettlementDetailMapper payableBillSettlementDetailMapper;
    @Resource
    private IPayableBillManagementService payableBillManagementService;
    @Resource
    private IPayableBillManagementLogService payableBillManagementLogService;
    /**
@@ -102,8 +118,29 @@
    @Override
    public int insertPayableBillSettlementDetail(PayableBillSettlementDetail payableBillSettlementDetail)
    {
        // 1. 设置创建时间
        payableBillSettlementDetail.setCreateTime(DateUtils.getNowDate());
        return payableBillSettlementDetailMapper.insertPayableBillSettlementDetail(payableBillSettlementDetail);
        payableBillSettlementDetail.setCreateBy(SecurityUtils.getUsername());
        // 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;
    }
    /**
@@ -115,7 +152,49 @@
    @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;
    }
@@ -128,8 +207,32 @@
    @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;
    }
    /**
@@ -139,8 +242,52 @@
     * @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;
    }
    /**
@@ -179,4 +326,60 @@
    {
        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);
    }
}