wujianwei
2026-01-14 d9b20efa8bdb66f5e2cb1793314f57ed66e846b3
service/src/main/java/com/ruoyi/cwgl/service/impl/FundFlowClaimDetailServiceImpl.java
@@ -21,8 +21,17 @@
import com.ruoyi.cwgl.mapper.FundFlowMapper;
import com.ruoyi.cwgl.domain.FundFlowClaimDetail;
import com.ruoyi.cwgl.domain.FundFlow;
import com.ruoyi.cwgl.domain.ReceivableBillSettlementDetail;
import com.ruoyi.cwgl.domain.PayableBillSettlementDetail;
import com.ruoyi.cwgl.domain.ReceivableBillManagement;
import com.ruoyi.cwgl.domain.PayableBillManagement;
import com.ruoyi.cwgl.service.IFundFlowClaimDetailService;
import com.ruoyi.cwgl.service.IReceivableBillSettlementDetailService;
import com.ruoyi.cwgl.service.IPayableBillSettlementDetailService;
import com.ruoyi.cwgl.service.IReceivableBillManagementService;
import com.ruoyi.cwgl.service.IPayableBillManagementService;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.utils.SecurityUtils;
import java.math.BigDecimal;
/**
@@ -41,6 +50,18 @@
    
    @Resource
    private FundFlowMapper fundFlowMapper;
    @Resource
    private IReceivableBillSettlementDetailService receivableBillSettlementDetailService;
    @Resource
    private IPayableBillSettlementDetailService payableBillSettlementDetailService;
    @Resource
    private IReceivableBillManagementService receivableBillManagementService;
    @Resource
    private IPayableBillManagementService payableBillManagementService;
    /**
@@ -160,6 +181,7 @@
    @Override
    public int deleteFundFlowClaimDetailByIds(String ids)
    {
        return deleteFundFlowClaimDetailByIds(Convert.toIntArray(ids));
    }
@@ -173,6 +195,8 @@
    @Override
    public int deleteFundFlowClaimDetailByIds(Integer[] ids)
    {
        return fundFlowClaimDetailMapper.deleteFundFlowClaimDetailByIds(ids);
    }
@@ -185,6 +209,7 @@
    @Override
    public int deleteFundFlowClaimDetailById(Integer id)
    {
        return fundFlowClaimDetailMapper.deleteFundFlowClaimDetailById(id);
    }
@@ -196,75 +221,82 @@
     * @return 结果
     */
    @Override
    public int claimBill(Integer fundFlowId, List<FundFlowClaimDetail> claimDetails)
    public int claimBill(Integer fundFlowId, FundFlowClaimDetail claimDetail)
    {
        if (fundFlowId == null) {
            throw new RuntimeException("资金流水ID不能为空");
        }
        
        if (claimDetails == null || claimDetails.isEmpty()) {
        if (claimDetail == null ) {
            throw new RuntimeException("认领明细列表不能为空");
        }
        // 验证认领明细的必填字段
        for (FundFlowClaimDetail claimDetail : claimDetails) {
            if (claimDetail.getClaimAmount() == null || claimDetail.getClaimAmount().compareTo(BigDecimal.ZERO) <= 0) {
        //金额
        BigDecimal claimAmount = claimDetail.getClaimAmount();
        if (claimAmount == null || claimAmount.compareTo(BigDecimal.ZERO) <= 0) {
                throw new RuntimeException("认领金额必须大于0");
            }
        }
        
        // 查询资金流水信息
        FundFlow fundFlow = fundFlowMapper.selectFundFlowById(fundFlowId);
        String newStatus = getString(fundFlowId, claimDetails, fundFlow);
        // 根据总认领金额与交易金额的比较设置状态
        String newStatus = getString(fundFlowId, claimDetail, fundFlow);
        // 更新资金流水状态
        // 更新资金流水状态和已认领金额
        fundFlow.setStatus(newStatus);
        fundFlow.setClaimedAmount(fundFlow.getClaimedAmount().add(claimAmount)); // 设置已认领金额
        fundFlow.setUpdateTime(DateUtils.getNowDate());
        int updateResult = fundFlowMapper.updateFundFlow(fundFlow);
        if (updateResult <= 0) {
            throw new RuntimeException("更新资金流水状态失败,ID: " + fundFlowId);
        }
        
        // 先删除该资金流水ID下的所有认领明细(避免重复认领)
        fundFlowClaimDetailMapper.deleteFundFlowClaimDetailByFundFlowId(fundFlowId);
        // 批量保存所有账单认领明细
        for (FundFlowClaimDetail claimDetail : claimDetails) {
            // 设置资金流水ID
            claimDetail.setFundFlowId(fundFlowId);
            // 设置认领日期
            claimDetail.setClaimDate(DateUtils.getNowDate());
            // 设置创建时间
            claimDetail.setCreateTime(DateUtils.getNowDate());
        int insertResult = fundFlowClaimDetailMapper.insertFundFlowClaimDetail(claimDetail);
        // 新增:创建结算明细并更新账单状态
        if (insertResult > 0) {
            createSettlementDetailsAndUpdateBillStatus(claimDetail, fundFlow);
        }
        
        int insertResult = fundFlowClaimDetailMapper.insertFundFlowClaimDetailBatch(claimDetails);
        return insertResult;
    }
/**
 * 根据资金流水ID、认领详情列表和资金流水对象获取状态字符串
 * @param fundFlowId 资金流水ID,用于标识特定的资金流水记录
 * @param claimDetails 认领详情列表,包含所有认领金额信息
 * @param claimDetail 认领详情列表,包含所有认领金额信息
 * @param fundFlow 资金流水对象,包含交易金额等关键信息
 * @return 返回处理后的状态字符串
 * @throws RuntimeException 当资金流水对象为null时抛出异常
 */
    private static @NonNull String getString(Integer fundFlowId, List<FundFlowClaimDetail> claimDetails, FundFlow fundFlow) {
    private static @NonNull String getString(Integer fundFlowId, FundFlowClaimDetail claimDetail, FundFlow fundFlow) {
    // 检查资金流水对象是否为空,如果为空则抛出异常
        if (fundFlow == null) {
            throw new RuntimeException("资金流水不存在,ID: " + fundFlowId);
        }
        // 计算总认领金额
        BigDecimal totalClaimAmount = BigDecimal.ZERO;
        for (FundFlowClaimDetail claimDetail : claimDetails) {
            totalClaimAmount = totalClaimAmount.add(claimDetail.getClaimAmount());
        }
        BigDecimal totalClaimAmount = claimDetail.getClaimAmount();
        // 验证总认领金额不能超过交易金额
        String newStatus = getString(fundFlow, totalClaimAmount);
        return newStatus;
        return  getString(fundFlow, totalClaimAmount);
    }
    private static @NonNull String getString(FundFlow fundFlow, BigDecimal totalClaimAmount) {
@@ -284,4 +316,88 @@
        }
        return newStatus;
    }
    /**
     * 创建结算明细并更新账单状态
     */
    private void createSettlementDetailsAndUpdateBillStatus(FundFlowClaimDetail claimDetail, FundFlow fundFlow) {
            String billNo = claimDetail.getBillNo();
            BigDecimal claimAmount = claimDetail.getClaimAmount();
            Integer claimDetailId = claimDetail.getId();
            // 根据关联企业类型判断是应收账单还是应付账单
            if (fundFlow.getIncomeExpenseFlag().equals(0)) {
                // 应收账单
                createReceivableSettlementDetail(billNo, claimAmount, fundFlow, claimDetailId);
            } else  {
                // 应付账单
                createPayableSettlementDetail(billNo, claimAmount, fundFlow, claimDetailId);
        }
    }
    /**
     * 创建应收账单结算明细
     */
    private void createReceivableSettlementDetail(String billNo, BigDecimal claimAmount, FundFlow fundFlow, Integer claimDetailId) {
        try {
            // 根据账单编号查询应收账单
            ReceivableBillManagement bill = receivableBillManagementService.selectReceivableBillManagementBySystemNo(billNo);
            if (bill != null) {
                // 创建结算明细
                ReceivableBillSettlementDetail settlementDetail = new ReceivableBillSettlementDetail();
                settlementDetail.setBillId(bill.getId());
                settlementDetail.setClaimDetailId(claimDetailId); // 设置认领明细ID
                settlementDetail.setReceiptAmount(claimAmount);
                settlementDetail.setReceiptDate(fundFlow.getTransactionDate());
                settlementDetail.setSettlementMethod("银行转账"); // 根据实际情况设置
                settlementDetail.setCreateBy(SecurityUtils.getUsername());
                settlementDetail.setCreateTime(DateUtils.getNowDate());
                // 插入结算明细(会自动更新账单状态)
                receivableBillSettlementDetailService.insertReceivableBillSettlementDetail(settlementDetail);
                logger.info("成功创建应收账单结算明细,账单编号:{},金额:{},认领明细ID:{}", billNo, claimAmount, claimDetailId);
            } else {
                logger.warn("未找到对应的应收账单,账单编号:{}", billNo);
            }
        } catch (Exception e) {
            logger.error("创建应收账单结算明细失败,账单编号:{}", billNo, e);
            // 这里可以选择抛出异常或记录日志,但不中断整个认领流程
        }
    }
    /**
     * 创建应付账单结算明细
     */
    private void createPayableSettlementDetail(String billNo, BigDecimal claimAmount, FundFlow fundFlow, Integer claimDetailId) {
        try {
            // 根据账单编号查询应付账单
            PayableBillManagement bill = payableBillManagementService.selectPayableBillManagementBySystemNo(billNo);
            if (bill != null) {
                // 创建结算明细
                PayableBillSettlementDetail settlementDetail = new PayableBillSettlementDetail();
                settlementDetail.setBillId(bill.getId());
                settlementDetail.setClaimDetailId(claimDetailId); // 设置认领明细ID
                settlementDetail.setPaymentAmount(claimAmount);
                settlementDetail.setPaymentDate(fundFlow.getTransactionDate());
                settlementDetail.setSettlementMethod("银行转账"); // 根据实际情况设置
                settlementDetail.setCreateBy(SecurityUtils.getUsername());
                settlementDetail.setCreateTime(DateUtils.getNowDate());
                // 插入结算明细(会自动更新账单状态)
                payableBillSettlementDetailService.insertPayableBillSettlementDetail(settlementDetail);
                logger.info("成功创建应付账单结算明细,账单编号:{},金额:{},认领明细ID:{}", billNo, claimAmount, claimDetailId);
            } else {
                logger.warn("未找到对应的应付账单,账单编号:{}", billNo);
            }
        } catch (Exception e) {
            logger.error("创建应付账单结算明细失败,账单编号:{}", billNo, e);
            // 这里可以选择抛出异常或记录日志,但不中断整个认领流程
        }
    }
}