15815213711
2025-07-29 703132f32d403fc35fc937955be6d09c1c46a6a3
修改ID,修改加密方式
10个文件已修改
2个文件已添加
539 ■■■■■ 已修改文件
admin/src/main/resources/application-custom.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/src/main/java/com/ruoyi/cwgl/controller/DispatchOrderController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/src/main/java/com/ruoyi/cwgl/domain/DispatchOrder.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/src/main/java/com/ruoyi/cwgl/domain/vo/DispatchOrderItemVo.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/src/main/java/com/ruoyi/cwgl/domain/vo/DispatchOrderVo.java 199 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/src/main/java/com/ruoyi/cwgl/enums/FeeTypeEnums.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/src/main/java/com/ruoyi/cwgl/mapper/DispatchOrderMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/src/main/java/com/ruoyi/cwgl/service/IDispatchOrderService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/src/main/java/com/ruoyi/cwgl/service/impl/DispatchOrderServiceImpl.java 227 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/src/main/resources/mapper/cwgl/DispatchOrderMapper.xml 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ui/admin-ui3/src/api/cwgl/dispatchOrder.ts 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ui/admin-ui3/src/views/cwgl/dispatchOrder/index.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/main/resources/application-custom.yml
@@ -15,7 +15,7 @@
    userLockExpireTime: 60
  #上传下载 相关配置
  upload:
    profile: /Users/xiongbenda/Desktop/temp/uploadPath #上传目录
    profile: D:\temp\uploadPath #上传目录
    temp: temp  #临时文件夹
    multipart:
      max-file-size: 2GB # 单个文件大小
service/src/main/java/com/ruoyi/cwgl/controller/DispatchOrderController.java
@@ -85,6 +85,18 @@
        dispatchOrderService.export(dispatchOrder,exportKey);
        return AjaxResult.success("导出请求成功,请稍后点击下载...!");
    }
    /**
     * 导出调度单列表
     * @param dispatchOrder 查询条件对象
     */
    @PreAuthorize("@ss.hasPermi('cwgl:dispatchOrder:export')")
    @Log(title = "调度单", businessType = BusinessType.EXPORT)
    @GetMapping("/export2")
    public AjaxResult export2(DispatchOrder dispatchOrder,String exportKey)
    {
        dispatchOrderService.export2(dispatchOrder,exportKey);
        return AjaxResult.success("导出请求成功,请稍后点击下载...!");
    }
service/src/main/java/com/ruoyi/cwgl/domain/DispatchOrder.java
@@ -24,9 +24,10 @@
    /** 调度单号 */
    @Excel(name = "调度单号")
        @TableField("dispatch_no")
    @TableField("dispatch_no")
    private String dispatchNo;
    @TableField("customer_name")
    private String customerName;
    /** 运输方式 */
service/src/main/java/com/ruoyi/cwgl/domain/vo/DispatchOrderItemVo.java
@@ -17,7 +17,7 @@
@Data
public class DispatchOrderItemVo {
    private String dispatchNo;
    /** 费用类型 */
    private String feeItem;
service/src/main/java/com/ruoyi/cwgl/domain/vo/DispatchOrderVo.java
New file
@@ -0,0 +1,199 @@
package com.ruoyi.cwgl.domain.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
import lombok.Data;
import org.apache.poi.ss.usermodel.IndexedColors;
import java.math.BigDecimal;
import java.util.Date;
/**
 * 调度单对象 dispatch_order
 *
 * @author ruoyi
 * @date 2025-07-29
 */
@Data
public class DispatchOrderVo {
    @Excel(name = "序号")
    private Integer id;
    @Excel(name = "系统调度单号")
    private String dispatchNo;
    @Excel(name = "系统子单号")
    private String subOrderNo;
    @Excel(name = "订单日期", width = 30, dateFormat = "yyyy-MM-dd")
    private Date createTime;
    @Excel(name = "客户名称")
    private String customerName;
    @Excel(name = "项目名称")
    private String projectName;
    @Excel(name = "业务类型")
    private String businessType;
    @Excel(name = "大陆车牌")
    private String licensePlateNumber;
    @Excel(name = "港澳车牌")
    private String hkPlateNo;
    @Excel(name = "大陆司机")
    private String mainDriverName;
    @Excel(name = "港澳司机")
    private String hkDriver;
    @Excel(name = "托架/柜号")
    private String vehiclePlateId;
    @Excel(name = "订单需求车型")
    private String vehicleType;
    @Excel(name = "运输供应商")
    private String transportSupplier;
    @Excel(name = "无缝申报单位")
    private String seamlessDeclarationUnit;
    @Excel(name = "无缝号")
    private String seamlessNo;
    @Excel(name = "装货地点")
    private String loadingPlace;
    @Excel(name = "通关口岸")
    private String customsPort;
    @Excel(name = "卸货地点")
    private String unloadingPlaces;
    @Excel(name = "多点卸货数量")
    private Integer unloadingPointCount;
    @Excel(name = "构件号")
    private String componentNo;
    @Excel(name = "构件尺寸")
    private String componentSize;
    @Excel(name = "卸货时间", width = 30, dateFormat = "yyyy-MM-dd")
    private Date unloadingTime;
    @Excel(name = "国内骑司及超时情况")
    private String delayStatus;
    @Excel(name = "备注")
    private String remark;
    // ------------------- 客户费用(人民币) -------------------
    @Excel(name = "客户港车运费(人民币)",defaultValue = "0",backgroundColor = IndexedColors.DARK_YELLOW)
    private BigDecimal customerHkFeeRmb;
    @Excel(name = "客户大陆车运费(人民币)",backgroundColor = IndexedColors.DARK_YELLOW)
    private BigDecimal customerMainlandFeeRmb;
    @Excel(name = "客户报关费(人民币)",backgroundColor = IndexedColors.DARK_YELLOW)
    private BigDecimal customerCustomFeeRmb;
    @Excel(name = "客户多点装货(人民币)",backgroundColor = IndexedColors.DARK_YELLOW)
    private BigDecimal customerMultiLoadFeeRmb;
    @Excel(name = "客户超宽费(人民币)",backgroundColor = IndexedColors.DARK_YELLOW)
    private BigDecimal customerOverWidthFeeRmb;
    @Excel(name = "客户压夜超时(人民币)",backgroundColor = IndexedColors.DARK_YELLOW)
    private BigDecimal customerOvernightFeeRmb;
    @Excel(name = "客户杂费(人民币)",backgroundColor = IndexedColors.DARK_YELLOW)
    private BigDecimal customerMiscFeeRmb;
    @Excel(name = "客户合计(人民币)",backgroundColor = IndexedColors.DARK_YELLOW)
    private BigDecimal customerTotalRmb;
    // ------------------- 客户费用(港币) -------------------
    @Excel(name = "客户港车运费(港币)",defaultValue = "0",backgroundColor = IndexedColors.DARK_YELLOW)
    private BigDecimal customerHkFeeHkd;
    @Excel(name = "客户大陆车运费(港币)",backgroundColor = IndexedColors.DARK_YELLOW)
    private BigDecimal customerMainlandFeeHkd;
    @Excel(name = "客户报关费(港币)",backgroundColor = IndexedColors.DARK_YELLOW)
    private BigDecimal customerCustomFeeHkd;
    @Excel(name = "客户多点装货(港币)",backgroundColor = IndexedColors.DARK_YELLOW)
    private BigDecimal customerMultiLoadFeeHkd;
    @Excel(name = "客户超宽费(港币)",backgroundColor = IndexedColors.DARK_YELLOW)
    private BigDecimal customerOverWidthFeeHkd;
    @Excel(name = "客户压夜超时(港币)",backgroundColor = IndexedColors.DARK_YELLOW)
    private BigDecimal customerOvernightFeeHkd;
    @Excel(name = "客户杂费(港币)",backgroundColor = IndexedColors.DARK_YELLOW)
    private BigDecimal customerMiscFeeHkd;
    @Excel(name = "客户合计(港币)",backgroundColor = IndexedColors.DARK_YELLOW)
    private BigDecimal customerTotalHkd;
    // ------------------- 供应商费用 -------------------
    @Excel(name = "供应商名称",backgroundColor = IndexedColors.GREY_25_PERCENT)
    private String carrierName;
    // 人民币
    @Excel(name = "供应商港车运费(人民币)",backgroundColor = IndexedColors.GREY_25_PERCENT)
    private BigDecimal supplierHkFeeRmb;
    @Excel(name = "供应商大陆车运费(人民币)",backgroundColor = IndexedColors.GREY_25_PERCENT)
    private BigDecimal supplierMainlandFeeRmb;
    @Excel(name = "供应商报关费(人民币)",backgroundColor = IndexedColors.GREY_25_PERCENT)
    private BigDecimal supplierCustomFeeRmb;
    @Excel(name = "供应商多点装货(人民币)",backgroundColor = IndexedColors.GREY_25_PERCENT)
    private BigDecimal supplierMultiLoadFeeRmb;
    @Excel(name = "供应商超宽费(人民币)",backgroundColor = IndexedColors.GREY_25_PERCENT)
    private BigDecimal supplierOverWidthFeeRmb;
    @Excel(name = "供应商压夜超时(人民币)",backgroundColor = IndexedColors.GREY_25_PERCENT)
    private BigDecimal supplierOvernightFeeRmb;
    @Excel(name = "供应商杂费(人民币)",backgroundColor = IndexedColors.GREY_25_PERCENT)
    private BigDecimal supplierMiscFeeRmb;
    @Excel(name = "供应商合计(人民币)",backgroundColor = IndexedColors.GREY_25_PERCENT)
    private BigDecimal supplierTotalRmb;
    // 港币
    @Excel(name = "供应商港车运费(港币)",backgroundColor = IndexedColors.GREY_25_PERCENT)
    private BigDecimal supplierHkFeeHkd;
    @Excel(name = "供应商大陆车运费(港币)",backgroundColor = IndexedColors.GREY_25_PERCENT)
    private BigDecimal supplierMainlandFeeHkd;
    @Excel(name = "供应商报关费(港币)",backgroundColor = IndexedColors.GREY_25_PERCENT)
    private BigDecimal supplierCustomFeeHkd;
    @Excel(name = "供应商多点装货(港币)",backgroundColor = IndexedColors.GREY_25_PERCENT)
    private BigDecimal supplierMultiLoadFeeHkd;
    @Excel(name = "供应商超宽费(港币)",backgroundColor = IndexedColors.GREY_25_PERCENT)
    private BigDecimal supplierOverWidthFeeHkd;
    @Excel(name = "供应商压夜超时(港币)",backgroundColor = IndexedColors.GREY_25_PERCENT)
    private BigDecimal supplierOvernightFeeHkd;
    @Excel(name = "供应商杂费(港币)",backgroundColor = IndexedColors.GREY_25_PERCENT)
    private BigDecimal supplierMiscFeeHkd;
    @Excel(name = "供应商合计(港币)",backgroundColor = IndexedColors.GREY_25_PERCENT)
    private BigDecimal supplierTotalHkd;
}
service/src/main/java/com/ruoyi/cwgl/enums/FeeTypeEnums.java
New file
@@ -0,0 +1,28 @@
package com.ruoyi.cwgl.enums;
import lombok.Getter;
public enum FeeTypeEnums {
    FREIGHT("运费", "MainlandFee"),
    CUSTOM("报关费", "CustomFee"),
    MULTI_LOAD("多点装货", "MultiLoadFee"),
    OVER_WIDTH("超宽费", "OverWidthFee"),
    OVERNIGHT("压夜超时", "OvernightFee"),
    MISC("其他", "MiscFee");
    private final String label;
    @Getter
    private final String fieldSuffix;
    FeeTypeEnums(String label, String fieldSuffix) {
        this.label = label;
        this.fieldSuffix = fieldSuffix;
    }
    public static FeeTypeEnums from(String feeItem) {
        for (FeeTypeEnums t : values()) {
            if (t.label.equals(feeItem)) return t;
        }
        return MISC;
    }
}
service/src/main/java/com/ruoyi/cwgl/mapper/DispatchOrderMapper.java
@@ -1,10 +1,13 @@
package com.ruoyi.cwgl.mapper;
import java.util.List;
import java.util.Set;
import com.ruoyi.cwgl.domain.DispatchOrder;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.cwgl.domain.DispatchOrderItem;
import com.ruoyi.cwgl.domain.vo.DispatchOrderAttachmentVo;
import org.apache.ibatis.annotations.Param;
/**
@@ -89,6 +92,7 @@
    public int deleteDispatchOrderByIds(Integer[] ids);
    List<DispatchOrderItem> selectDispatchOrderItemByNo(String no);
    List<DispatchOrderItem> selectDispatchOrderItemByNos(@Param("nos") Set< String> nos);
    List<DispatchOrderAttachmentVo> selectDispatchOrderAttachment(String no);
}
service/src/main/java/com/ruoyi/cwgl/service/IDispatchOrderService.java
@@ -47,6 +47,7 @@
     * @return 调度单集合
     */
    public void export(DispatchOrder dispatchOrder, String exportKey) ;
    public void export2(DispatchOrder dispatchOrder, String exportKey) ;
    /**
service/src/main/java/com/ruoyi/cwgl/service/impl/DispatchOrderServiceImpl.java
@@ -1,11 +1,29 @@
package com.ruoyi.cwgl.service.impl;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.math.BigDecimal;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.PageUtil;
import com.github.pagehelper.Page;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.DateUtils;
import javax.annotation.Resource;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.common.utils.file.DownloadExportUtil;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.cwgl.domain.vo.DispatchOrderVo;
import com.ruoyi.cwgl.enums.FeeTypeEnums;
import org.springframework.beans.factory.annotation.Autowired;
import com.ruoyi.cwgl.domain.DispatchOrderItem;
import com.ruoyi.cwgl.domain.vo.DispatchOrderAttachmentVo;
@@ -39,7 +57,8 @@
    protected final Logger logger = LoggerFactory.getLogger(getClass());
    @Resource
    private DispatchOrderMapper dispatchOrderMapper;
    @Autowired
    private RedisCache redisCache;
    /**
     * 查询调度单
@@ -99,17 +118,219 @@
     * @param exportKey 导出功能的唯一标识
     * @return 调度单集合
     */
    @DataSource(DataSourceType.SLAVE)
    @DataSource(DataSourceType.CWSJ)
    @Async
    @Override
    public void export(DispatchOrder dispatchOrder,String exportKey) {
        super.export(DispatchOrder.class,exportKey,"dispatchOrderData",(pageNum)->{
            PageUtils.startPage(pageNum, Constants.EXPORT_PATE_SIZE);
            return selectDispatchOrderList(dispatchOrder);
            return selectDispatchOrderList2(dispatchOrder);
        });
    }
    @DataSource(DataSourceType.CWSJ)
    @Async
    @Override
    public void export2(DispatchOrder dispatchOrder,String exportKey) {
        //查询并导出数据文件
        String fileName =selectListExport(dispatchOrder,  "台账信息");
        //设置文件缓存
        DownloadExportUtil.setDownloadFile(redisCache, exportKey, fileName);
    }
    @DataSource(DataSourceType.CWSJ)
    public String selectListExport(DispatchOrder dispatchOrder, String  fileName)
    {
         fileName =ExcelUtil.encodeFileName(fileName);
        //数据集合
        List<DispatchOrder> dataList = new ArrayList<>();
        //导出表格对象
        ExcelUtil<DispatchOrderVo> excelUtil = new ExcelUtil<>(DispatchOrderVo.class);
        excelUtil.initialize("台账信息", null, Excel.Type.EXPORT);
        List<DispatchOrderVo> exportList;//导出的数组
        int pageNum =1,i = 1;
        boolean have=true;
        //region循环分页获取数据
        while (have) {
            Page<Object> page = PageUtils.startPage(pageNum, Constants.EXPORT_PATE_SIZE);
            List<DispatchOrder> dispatchOrders = selectDispatchOrderList2(dispatchOrder);
            if (dispatchOrders != null && !dispatchOrders.isEmpty()) {
                // 导出当前页的数据
                exportList=structureData(dispatchOrders,i);
                excelUtil.exportExcel(exportList);
                pageNum++;
            } else {
                // 没有数据时退出
                have = false;
            }
        }
        excelUtil.finishExport(fileName);
        return fileName;
    }
    /**
     * 封装数据
     * @param list
     * @return
     */
    @DataSource(DataSourceType.CWSJ)
    private List<DispatchOrderVo> structureData(List<DispatchOrder> list,int i) {
        List<DispatchOrderVo> exportList = new ArrayList<>();
        Set<String> dispatchNos = list.stream().map(DispatchOrder::getDispatchNo).collect(Collectors.toSet());
        Map<String, List<DispatchOrderItemVo>> itemMap = selectDispatchOrderItems(dispatchNos)
                .stream().collect(Collectors.groupingBy(DispatchOrderItemVo::getDispatchNo));
        for (DispatchOrder order : list) {
            try {
                DispatchOrderVo vo = BeanUtil.copyProperties(order, DispatchOrderVo.class);
                vo.setId(i++);
                // 初始化费用结构:Map<角色_币种, Map<费用类型, 金额>>
                Map<String, Map<FeeTypeEnums, BigDecimal>> feeMap = initFeeMap();
                Map<String, BigDecimal> totalMap = initTotalMap();
                List<DispatchOrderItemVo> items = itemMap.get(order.getDispatchNo());
                if (items != null) {
                    for (DispatchOrderItemVo item : items) {
                        if (!StringUtils.isNotEmpty(item.getFeeItem()) || item.getIsSettlement() == 0) continue;
                        FeeTypeEnums feeType = FeeTypeEnums.from(item.getFeeItem());
                        String actualCurrency = Optional.ofNullable(item.getActualFeeCurrency()).orElse("CNY");
                        String receivableCurrency = Optional.ofNullable(item.getReceivableFeeCurrency()).orElse("CNY");
                        addFee(feeMap, "customer_" + actualCurrency, feeType, item.getActualFee());
                        addTotal(totalMap, "customer_" + actualCurrency, item.getActualFee());
                        addFee(feeMap, "supplier_" + receivableCurrency, feeType, item.getReceivableFee());
                        addTotal(totalMap, "supplier_" + receivableCurrency, item.getReceivableFee());
                    }
                }
                // 设置 VO 字段
                setFeeToVo(vo, feeMap, totalMap);
                exportList.add(vo);
            } catch (Exception e) {
                logger.error("数据处理失败 id:{}", order, e);
            }
        }
        return exportList;
    }
    private Map<String, Map<FeeTypeEnums, BigDecimal>> initFeeMap() {
        Map<String, Map<FeeTypeEnums, BigDecimal>> map = new HashMap<>();
        for (String key : Arrays.asList("customer_CNY", "customer_HKD", "supplier_CNY", "supplier_HKD")) {
            Map<FeeTypeEnums, BigDecimal> subMap = new EnumMap<>(FeeTypeEnums.class);
            for (FeeTypeEnums feeType : FeeTypeEnums.values()) {
                subMap.put(feeType, BigDecimal.ZERO);
            }
            map.put(key, subMap);
        }
        return map;
    }
    private Map<String, BigDecimal> initTotalMap() {
        Map<String, BigDecimal> totalMap = new HashMap<>();
        for (String key : Arrays.asList("customer_CNY", "customer_HKD", "supplier_CNY", "supplier_HKD")) {
            totalMap.put(key, BigDecimal.ZERO);
        }
        return totalMap;
    }
    private void addFee(Map<String, Map<FeeTypeEnums, BigDecimal>> map, String key, FeeTypeEnums feeType, BigDecimal amount) {
        if (amount == null) return;
        Map<FeeTypeEnums, BigDecimal> subMap = map.get(key);
        subMap.put(feeType, subMap.get(feeType).add(amount));
    }
    private void addTotal(Map<String, BigDecimal> totalMap, String key, BigDecimal amount) {
        if (amount == null) return;
        totalMap.put(key, totalMap.get(key).add(amount));
    }
    private void setFeeToVo(DispatchOrderVo vo,
                            Map<String, Map<FeeTypeEnums, BigDecimal>> map,
                            Map<String, BigDecimal> totalMap) {
        for (String role : Arrays.asList("Customer", "Supplier")) {
            for (String currency : Arrays.asList("Rmb", "Hkd")) {
                String mapKey = role.toLowerCase() + "_" + ("Rmb".equals(currency) ? "CNY" : "HKD");
                Map<FeeTypeEnums, BigDecimal> feeTypeMap = map.get(mapKey);
                for (FeeTypeEnums feeType : FeeTypeEnums.values()) {
                    String methodName = "set" + role + feeType.getFieldSuffix() + currency;
                    invokeSetter(vo, methodName, feeTypeMap.get(feeType));
                }
                // 设置 total 字段
                String totalMethod = "set" + role + "Total" + currency;
                invokeSetter(vo, totalMethod, totalMap.get(mapKey));
            }
        }
    }
    private void invokeSetter(Object obj, String methodName, BigDecimal value) {
        try {
            Method method = obj.getClass().getMethod(methodName, BigDecimal.class);
            method.invoke(obj, value);
        } catch (Exception e) {
            logger.warn("调用方法失败: {}", methodName, e);
        }
    }
    @DataSource(DataSourceType.CWSJ)
    public List<DispatchOrderItemVo> selectDispatchOrderItems( Set<String> nos) {
        // 使用Map来临时存储分组结果
        Map<String, DispatchOrderItemVo> summaryMap = new HashMap<>();
        List<DispatchOrderItem> dispatchOrderItems=dispatchOrderMapper.selectDispatchOrderItemByNos(nos);
        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.setDispatchNo(dispatchOrderItem.getDispatchNo());
                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());
    }
    /**
     * 新增调度单
service/src/main/resources/mapper/cwgl/DispatchOrderMapper.xml
@@ -7,6 +7,7 @@
    <resultMap type="com.ruoyi.cwgl.domain.DispatchOrder" id="DispatchOrderResult">
        <result property="id"    column="id"    />
        <result property="dispatchNo"    column="dispatch_no"    />
        <result property="customerName"    column="customer_name"    />
        <result property="transportMode"    column="transport_mode"    />
        <result property="productName"    column="product_name"    />
        <result property="carrierName"    column="carrier_name"    />
@@ -111,6 +112,7 @@
    <select id="selectDispatchOrderList2" parameterType="com.ruoyi.cwgl.domain.DispatchOrder" resultMap="DispatchOrderResult">
        SELECT
        ts.DISPATCH_NO as 'dispatch_no',
        customer.`NAME` as 'customer_name',
        ts.TRANSPORT_MODE as 'transport_mode',
        ts.PRODUCT_ID as 'product_name',
        bp.NAME as 'carrier_name',
@@ -132,6 +134,7 @@
        ts.BE_RETURN as 'be_return',
        ts.DISPATCH_QUANTITY as 'dispatch_quantity',
        ts.DISPATCH_WEIGHT as 'dispatch_weight',
        ts.CREATED_TIME as 'create_time',
        ts.DISPATCH_VOLUME as 'dispatch_volume',
        -- ts.EMPTY_MILEAGE '空载里程(公里)',
        -- ts.EMPTY_FUEL '空载油耗(升)',
@@ -154,7 +157,8 @@
        FROM
        tms_shipment ts
        -- 订单表
        --     LEFT JOIN oms_order ord ON ts.DISPATCH_NO = ord.DISPATCH_CODE
        LEFT JOIN oms_order ord ON ts.DISPATCH_NO = ord.DISPATCH_CODE
        LEFT join base_customer customer on customer.ID=ord.CUSTOMER_ID
        left join tms_vehicle  vhc on ts.VEHICLE_ID=vhc.id
        left join base_provider bp on bp.ID=ts.CARRIER_ID
        -- 司机表
@@ -171,6 +175,41 @@
        </where>
        order by ts.CREATED_TIME desc
    </select>
    <select id="selectDispatchOrderItemByNos" resultType="com.ruoyi.cwgl.domain.DispatchOrderItem">
        SELECT
        bfd.ENTITY_ID as 'dispatch_no',
            bfd.CREATED_TIME AS feeDataCreatedTime,
            bfd.CHECK_STATUS AS checkStatus,
            bfd.CURRENCY_TYPE AS currencyType,
            bfd.FEE_ITEM AS feeItem,
            bfd.FEE_TIME AS feeTime,
            bfd.REMARK AS remark,
            bfd.SETTLE_FEE AS settleFee,
            bfd.STATUS AS feeDataStatus,
            bill.NAME AS billName,
            bill.STATUS AS billStatus,
            fb.TYPE AS billType,
            bt.FIELDS AS settableFeeItems
        FROM bms_fee_data bfd
                 LEFT JOIN bms_bill bill ON bill.ID = bfd.BILL_ID
                 LEFT JOIN bms_fee_book fb ON fb.ID = bill.FEE_BOOK_ID
                 LEFT JOIN bms_bill_template bt ON bt.ID = bill.BILL_TEMPLATE_ID
                 LEFT JOIN oms_order ord ON bfd.ENTITY_ID = ord.DISPATCH_CODE
        WHERE bfd.ENTITY_ID in
        <foreach collection="nos" item="no" open="(" separator="," close=")">
            #{no}
        </foreach>
    </select>
    <select id="selectDispatchOrderItemByNo" resultType="com.ruoyi.cwgl.domain.DispatchOrderItem">
            SELECT
ts.CREATED_TIME as createdTime,
ui/admin-ui3/src/api/cwgl/dispatchOrder.ts
@@ -65,6 +65,11 @@
        download('/cwgl/dispatchOrder/export',query);
    })
}
export const exportDispatchOrder2:requestType = (query) => {
    return new Promise<any>(()=>{
        download('/cwgl/dispatchOrder/export2',query);
    })
}
/**
 * 查询查看费用
ui/admin-ui3/src/views/cwgl/dispatchOrder/index.vue
@@ -3,14 +3,14 @@
    <avue-crud :option="option" :table-loading="pageF.loading" :data="tableData" :page="page"
      :permission="permissionList" :before-open="beforeOpen" v-model="form" ref="crudRef" @row-update="rowUpdate"
      @row-save="rowSave" @refresh-change="refreshChange" @row-del="rowDel" @search-change="searchChange"
      @search-reset="searchReset" @selection-change="selectionChange" @current-change="currentChange"
      @search-reset="searchReset" @selection-change="selectionChange" @current-change="currentChange"   v-model:search="queryParams"
      @size-change="sizeChange" @on-load="onLoad">
      <template #menu-left>
        <el-button type="warning" plain icon="Download" @click="handleExport"
          v-hasPermi="['cwgl:dispatchOrder:export']">导出
        </el-button>
        <el-button type="success" plain icon="Download" @click="handleExport"
        <el-button type="success" plain icon="Download" @click="handleExport2"
          v-hasPermi="['cwgl:dispatchOrder:export']">生成台账报表
        </el-button>
      </template>
@@ -52,7 +52,7 @@
  exportDispatchOrder,
  getDispatchOrder,
  listDispatchOrder,
  updateDispatchOrder, cwglDispatchOrderItem, cwglDispatchOrderattAchment
  updateDispatchOrder, cwglDispatchOrderItem, cwglDispatchOrderattAchment, exportDispatchOrder2
} from "@/api/cwgl/dispatchOrder";
import useCurrentInstance from "@/utils/useCurrentInstance";
import { computed, reactive, ref, toRefs } from "vue";
@@ -370,7 +370,12 @@
const attachmentChange = () => {
  // loadAttachmentData();
}
const handleExport2 =()=>{
  queryParams.value = proxy.addDateRangeNew(queryParams.value, queryParams.value?.actualDepartureTimeRange, 'actualDepartureTime') || {};
  queryParams.value = proxy.addDateRangeNew(queryParams.value, queryParams.value?.requiredArrivalTimeRange, 'requiredArrivalTime') || {};
  queryParams.value = proxy.addDateRangeNew(queryParams.value, queryParams.value?.actualArrivalTimeRange, 'actualArrivalTime') || {};
  exportDispatchOrder2(queryParams.value);
}
</script>
<style lang="scss" scoped>
.avue-dialog .el-dialog__body {