From 703132f32d403fc35fc937955be6d09c1c46a6a3 Mon Sep 17 00:00:00 2001
From: 15815213711 <a13118667520@163.com>
Date: 星期二, 29 七月 2025 19:12:07 +0800
Subject: [PATCH] 修改ID,修改加密方式

---
 ui/admin-ui3/src/api/cwgl/dispatchOrder.ts                                      |    5 
 service/src/main/java/com/ruoyi/cwgl/domain/DispatchOrder.java                  |    5 
 service/src/main/java/com/ruoyi/cwgl/service/IDispatchOrderService.java         |    1 
 service/src/main/java/com/ruoyi/cwgl/service/impl/DispatchOrderServiceImpl.java |  227 ++++++++++++++++++++++++
 service/src/main/java/com/ruoyi/cwgl/domain/vo/DispatchOrderVo.java             |  199 ++++++++++++++++++++++
 service/src/main/resources/mapper/cwgl/DispatchOrderMapper.xml                  |   41 ++++
 ui/admin-ui3/src/views/cwgl/dispatchOrder/index.vue                             |   13 +
 admin/src/main/resources/application-custom.yml                                 |    2 
 service/src/main/java/com/ruoyi/cwgl/mapper/DispatchOrderMapper.java            |    4 
 service/src/main/java/com/ruoyi/cwgl/domain/vo/DispatchOrderItemVo.java         |    2 
 service/src/main/java/com/ruoyi/cwgl/controller/DispatchOrderController.java    |   12 +
 service/src/main/java/com/ruoyi/cwgl/enums/FeeTypeEnums.java                    |   28 +++
 12 files changed, 527 insertions(+), 12 deletions(-)

diff --git a/admin/src/main/resources/application-custom.yml b/admin/src/main/resources/application-custom.yml
index 8aea326..51db08d 100644
--- a/admin/src/main/resources/application-custom.yml
+++ b/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 # 鍗曚釜鏂囦欢澶у皬
diff --git a/service/src/main/java/com/ruoyi/cwgl/controller/DispatchOrderController.java b/service/src/main/java/com/ruoyi/cwgl/controller/DispatchOrderController.java
index c5222e8..78d5aa6 100644
--- a/service/src/main/java/com/ruoyi/cwgl/controller/DispatchOrderController.java
+++ b/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("瀵煎嚭璇锋眰鎴愬姛锛岃绋嶅悗鐐瑰嚮涓嬭浇...!");
+    }
 
 
 
diff --git a/service/src/main/java/com/ruoyi/cwgl/domain/DispatchOrder.java b/service/src/main/java/com/ruoyi/cwgl/domain/DispatchOrder.java
index 927c1a7..5597898 100644
--- a/service/src/main/java/com/ruoyi/cwgl/domain/DispatchOrder.java
+++ b/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;
 
 
     /** 杩愯緭鏂瑰紡 */
diff --git a/service/src/main/java/com/ruoyi/cwgl/domain/vo/DispatchOrderItemVo.java b/service/src/main/java/com/ruoyi/cwgl/domain/vo/DispatchOrderItemVo.java
index 9956d37..77dfcd2 100644
--- a/service/src/main/java/com/ruoyi/cwgl/domain/vo/DispatchOrderItemVo.java
+++ b/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;
diff --git a/service/src/main/java/com/ruoyi/cwgl/domain/vo/DispatchOrderVo.java b/service/src/main/java/com/ruoyi/cwgl/domain/vo/DispatchOrderVo.java
new file mode 100644
index 0000000..1281a41
--- /dev/null
+++ b/service/src/main/java/com/ruoyi/cwgl/domain/vo/DispatchOrderVo.java
@@ -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 = "閫氬叧鍙e哺")
+    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;
+
+}
diff --git a/service/src/main/java/com/ruoyi/cwgl/enums/FeeTypeEnums.java b/service/src/main/java/com/ruoyi/cwgl/enums/FeeTypeEnums.java
new file mode 100644
index 0000000..e0190fa
--- /dev/null
+++ b/service/src/main/java/com/ruoyi/cwgl/enums/FeeTypeEnums.java
@@ -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;
+    }
+}
diff --git a/service/src/main/java/com/ruoyi/cwgl/mapper/DispatchOrderMapper.java b/service/src/main/java/com/ruoyi/cwgl/mapper/DispatchOrderMapper.java
index da39bdc..26b7d7d 100644
--- a/service/src/main/java/com/ruoyi/cwgl/mapper/DispatchOrderMapper.java
+++ b/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);
 }
diff --git a/service/src/main/java/com/ruoyi/cwgl/service/IDispatchOrderService.java b/service/src/main/java/com/ruoyi/cwgl/service/IDispatchOrderService.java
index 374c52c..223d114 100644
--- a/service/src/main/java/com/ruoyi/cwgl/service/IDispatchOrderService.java
+++ b/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) ;
 
 
     /**
diff --git a/service/src/main/java/com/ruoyi/cwgl/service/impl/DispatchOrderServiceImpl.java b/service/src/main/java/com/ruoyi/cwgl/service/impl/DispatchOrderServiceImpl.java
index 210d0af..602e6f3 100644
--- a/service/src/main/java/com/ruoyi/cwgl/service/impl/DispatchOrderServiceImpl.java
+++ b/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());
+
+            }
+        }
+        // 杞崲涓篖ist骞惰繃婊ゃ�佹帓搴�
+        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());
+    }
+
+
 
     /**
      * 鏂板璋冨害鍗�
diff --git a/service/src/main/resources/mapper/cwgl/DispatchOrderMapper.xml b/service/src/main/resources/mapper/cwgl/DispatchOrderMapper.xml
index e6341ce..7375dec 100644
--- a/service/src/main/resources/mapper/cwgl/DispatchOrderMapper.xml
+++ b/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,
diff --git a/ui/admin-ui3/src/api/cwgl/dispatchOrder.ts b/ui/admin-ui3/src/api/cwgl/dispatchOrder.ts
index 1eb189a..3479084 100644
--- a/ui/admin-ui3/src/api/cwgl/dispatchOrder.ts
+++ b/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);
+    })
+}
 
 /**
  * 鏌ヨ鏌ョ湅璐圭敤
diff --git a/ui/admin-ui3/src/views/cwgl/dispatchOrder/index.vue b/ui/admin-ui3/src/views/cwgl/dispatchOrder/index.vue
index bf5f280..6810e0b 100644
--- a/ui/admin-ui3/src/views/cwgl/dispatchOrder/index.vue
+++ b/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 {

--
Gitblit v1.8.0