wujianwei
2025-07-29 86a375567eac064493b1fb7f3238bf8f81b83eed
service/src/main/java/com/ruoyi/cwgl/service/impl/DispatchOrderServiceImpl.java
@@ -1,9 +1,14 @@
package com.ruoyi.cwgl.service.impl;
import java.util.List;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
import com.ruoyi.common.utils.DateUtils;
import javax.annotation.Resource;
import com.ruoyi.cwgl.domain.DispatchOrderItem;
import com.ruoyi.cwgl.domain.vo.DispatchOrderItemVo;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.stereotype.Service;
import org.springframework.scheduling.annotation.Async;
@@ -72,6 +77,18 @@
    public List<DispatchOrder> selectDispatchOrderList(DispatchOrder dispatchOrder)
    {
        return dispatchOrderMapper.selectDispatchOrderList(dispatchOrder);
    }
    /**
     * 查询调度单列表
     *
     * @param dispatchOrder 调度单
     * @return 调度单
     */
    @DataSource(DataSourceType.CWSJ)
    @Override
    public List<DispatchOrder> selectDispatchOrderList2(DispatchOrder dispatchOrder)
    {
        return dispatchOrderMapper.selectDispatchOrderList2(dispatchOrder);
    }
    /**
@@ -179,4 +196,71 @@
    {
        return dispatchOrderMapper.deleteDispatchOrderById(id);
    }
    @DataSource(DataSourceType.CWSJ)
    @Override
    public List<DispatchOrderItemVo> selectDispatchOrderItem(String no) {
        // 使用Map来临时存储分组结果
        Map<String, DispatchOrderItemVo> summaryMap = new HashMap<>();
        List<DispatchOrderItem> dispatchOrderItems=dispatchOrderMapper.selectDispatchOrderItemByNo(no);
        Set<String> settableFeeItemSet = null;
        for (DispatchOrderItem dispatchOrderItem : dispatchOrderItems) {
            String settableFeeItems = dispatchOrderItem.getSettableFeeItems();
            if (settableFeeItemSet==null) {
                settableFeeItemSet = new HashSet<>(
                        Arrays.asList(settableFeeItems.split(",")));
            }
            // 判断是否可结算
            String feeItem = dispatchOrderItem.getFeeItem();
            int isSettable = isFeeItemSettable(feeItem, settableFeeItemSet);
            // 如果Map中不存在该费用类型,则创建新条目
            if (!summaryMap.containsKey(feeItem)) {
                DispatchOrderItemVo summary = new DispatchOrderItemVo();
                summary.setFeeItem(feeItem);
                summary.setReceivableFee(BigDecimal.ZERO);
                summary.setActualFee(BigDecimal.ZERO);
                summary.setIsSettlement(isSettable);
                summaryMap.put(feeItem, summary);
            }
            // 根据账单类型累加金额
            DispatchOrderItemVo summary = summaryMap.get(feeItem);
            if ("R".equals(dispatchOrderItem.getBillType())) { // 应收
                summary.setReceivableFee(summary.getReceivableFee().add(dispatchOrderItem.getSettleFee()));
                summary.setReceivableFeeCurrency(dispatchOrderItem.getCurrencyType());
            } else if ("P".equals(dispatchOrderItem.getBillType())) { // 应付
                summary.setActualFee(summary.getActualFee().add(dispatchOrderItem.getSettleFee()));
                summary.setActualFeeCurrency(dispatchOrderItem.getCurrencyType());
            }
        }
           // 转换为List并过滤、排序
        return summaryMap.values().stream()
                // 过滤掉应收应付都为0的记录
                .filter(dto -> dto.getReceivableFee().compareTo(BigDecimal.ZERO) != 0
                        || dto.getActualFee().compareTo(BigDecimal.ZERO) != 0)
                // 排序:可结算的在前,不可结算的在后;然后按总金额降序
                .sorted(Comparator.comparing(DispatchOrderItemVo::getIsSettlement).reversed()
                        .thenComparing(dto -> dto.getReceivableFee().add(dto.getActualFee()),
                                Comparator.reverseOrder()))
                .collect(Collectors.toList());
    }
    /**
     * 判断费用类型是否可结算
     */
    private static int isFeeItemSettable(String feeItem, Set<String> settableFeeItemSet) {
        if (feeItem == null || settableFeeItemSet == null) {
            return 0;
        }
            if (settableFeeItemSet.contains(feeItem)) {
                return 1;
            }
        return 0;
    }
}