From 68b27795ae929f5300fc6fb301b31aada74a2e2f Mon Sep 17 00:00:00 2001
From: zhangback <zhangback@163.com>
Date: 星期二, 10 三月 2026 15:26:03 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/yagwly_fa_master' into yagwly_fa_master

---
 tms/src/main/java/com/ruoyi/tms/domain/TmsDispatchOrder.java                            |    3 
 ui/admin-ui3/src/hooks/usePagePlus.ts                                                   |  285 ++--
 ui/admin-ui3/src/views/tms/dispatchFeeSummaryViLog/index.vue                            |  105 +
 tms/src/main/resources/mapper/tms/TmsDispatchFeeSummaryViLogMapper.xml                  |  113 +
 admin/src/main/resources/application-custom.yml                                         |    8 
 tms/src/main/java/com/ruoyi/tms/service/ITmsDispatchFeeSummaryViLogService.java         |  102 +
 tms/src/main/java/com/ruoyi/tms/service/impl/TmsDispatchFeeSummaryViLogServiceImpl.java |  181 +++
 tms/src/main/java/com/ruoyi/tms/service/impl/TmsDispatchOrderImportLogServiceImpl.java  |  116 +
 tms/src/main/java/com/ruoyi/tms/domain/TmsDispatchFeeSummaryVi.java                     |    2 
 tms/src/main/java/com/ruoyi/tms/service/impl/TmsFinanceDetailServiceImpl.java           |   24 
 tms/src/main/resources/mapper/tms/TmsDispatchOrderImportLogMapper.xml                   |  101 +
 ui/admin-ui3/src/api/tms/tmsDispatchOrder.ts                                            |   14 
 ui/admin-ui3/src/views/tms/tmsDispatchFeeSummary/index.vue                              |  410 +++---
 tms/src/main/java/com/ruoyi/tms/mapper/TmsDispatchFeeSummaryViLogMapper.java            |   87 +
 ui/admin-ui3/src/views/tms/tmsDispatchOrder/index.vue                                   | 1416 ++++++++++++----------
 tms/src/main/java/com/ruoyi/tms/controller/TmsDispatchOrderImportLogController.java     |  103 +
 tms/src/main/resources/mapper/tms/TmsDispatchOrderMapper.xml                            |    2 
 tms/src/main/java/com/ruoyi/tms/service/impl/TmsDispatchOrderServiceImpl.java           |   29 
 tms/src/main/java/com/ruoyi/tms/controller/TmsDispatchFeeSummaryViController.java       |   11 
 tms/src/main/java/com/ruoyi/tms/service/ITmsFinanceDetailService.java                   |    4 
 ui/admin-ui3/src/api/tms/tmsDispatchFeeSummary.ts                                       |   10 
 tms/src/main/java/com/ruoyi/tms/mapper/TmsDispatchOrderImportLogMapper.java             |   62 +
 tms/src/main/java/com/ruoyi/tms/controller/TmsDispatchFeeSummaryViLogController.java    |  108 +
 ui/admin-ui3/src/layout/components/AppMain.vue                                          |    3 
 ui/admin-ui3/src/store/modules/user.ts                                                  |    2 
 tms/src/main/java/com/ruoyi/tms/controller/TmsFinanceDetailController.java              |    9 
 tms/src/main/java/com/ruoyi/tms/service/ITmsDispatchFeeSummaryViService.java            |    1 
 tms/src/main/java/com/ruoyi/tms/domain/TmsDispatchFeeSummaryViLog.java                  |   48 
 ui/admin-ui3/src/api/tms/tmsFinanceDetail.ts                                            |    1 
 ui/admin-ui3/src/api/tms/dispatchFeeSummaryViLog.ts                                     |   67 +
 tms/src/main/java/com/ruoyi/tms/domain/TmsDispatchOrderImportLog.java                   |   74 +
 tms/src/main/java/com/ruoyi/tms/service/ITmsDispatchOrderImportLogService.java          |   69 +
 tms/src/main/java/com/ruoyi/tms/service/impl/TmsDispatchFeeSummaryViServiceImpl.java    |   28 
 33 files changed, 2,595 insertions(+), 1,003 deletions(-)

diff --git a/admin/src/main/resources/application-custom.yml b/admin/src/main/resources/application-custom.yml
index 88d6ad6..fc593a6 100644
--- a/admin/src/main/resources/application-custom.yml
+++ b/admin/src/main/resources/application-custom.yml
@@ -32,11 +32,11 @@
   #鏁版嵁搴� 鐩稿叧閰嶇疆
   datasource:
     master: #涓绘暟鎹簱
-      ip: localhost # IP
-      port: 3306 #绔彛
-      database: ygawly_cwgl_test #鏁版嵁搴撳悕
+      ip: 61.143.42.70 # IP
+      port: 7006 #绔彛
+      database: ygawly_cwgl_test2 #鏁版嵁搴撳悕
       username: root #鐢ㄦ埛鍚�
-      password: 123456 #瀵嗙爜
+      password: ms@123 #瀵嗙爜
     slave: #浠庢暟鎹簱
       enabled: false  #鏄惁寮�鍚粠鏁版嵁搴� 鍏抽棴鏃朵互涓嬩俊鎭彲浠ヤ笉鐢ㄩ厤缃�
       ip:  # IP
diff --git a/tms/src/main/java/com/ruoyi/tms/controller/TmsDispatchFeeSummaryViController.java b/tms/src/main/java/com/ruoyi/tms/controller/TmsDispatchFeeSummaryViController.java
index 9b2d200..0122aa5 100644
--- a/tms/src/main/java/com/ruoyi/tms/controller/TmsDispatchFeeSummaryViController.java
+++ b/tms/src/main/java/com/ruoyi/tms/controller/TmsDispatchFeeSummaryViController.java
@@ -12,9 +12,7 @@
 import com.ruoyi.tms.domain.TmsDispatchOrder;
 import com.ruoyi.tms.service.ITmsDispatchFeeSummaryViService;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 
 @RestController
@@ -41,5 +39,12 @@
         return AjaxResult.success("瀵煎嚭璇锋眰鎴愬姛锛岃绋嶅悗鐐瑰嚮涓嬭浇...!");
     }
 
+    @PutMapping("/note")
+    public AjaxResult edit(@RequestBody TmsDispatchFeeSummaryVi bo)
+    {
+
+        return toAjax(tmsDispatchFeeSummaryViService.note(bo));
+    }
+
 
 }
diff --git a/tms/src/main/java/com/ruoyi/tms/controller/TmsDispatchFeeSummaryViLogController.java b/tms/src/main/java/com/ruoyi/tms/controller/TmsDispatchFeeSummaryViLogController.java
new file mode 100644
index 0000000..357ab86
--- /dev/null
+++ b/tms/src/main/java/com/ruoyi/tms/controller/TmsDispatchFeeSummaryViLogController.java
@@ -0,0 +1,108 @@
+package com.ruoyi.tms.controller;
+
+import java.util.List;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.utils.file.DownloadExportUtil;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.tms.domain.TmsDispatchFeeSummaryViLog;
+import com.ruoyi.tms.service.ITmsDispatchFeeSummaryViLogService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 娲捐溅鍙拌处澶囨敞璁板綍Controller
+ *
+ * @author ruoyi
+ * @date 2026-03-06
+ */
+@RestController
+@RequestMapping("/tms/dispatchFeeSummaryViLog")
+public class TmsDispatchFeeSummaryViLogController extends BaseController
+{
+    @Autowired
+    private ITmsDispatchFeeSummaryViLogService tmsDispatchFeeSummaryViLogService;
+
+
+
+    /**
+     * 鏌ヨ娲捐溅鍙拌处澶囨敞璁板綍鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('tms:dispatchFeeSummaryViLog:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(TmsDispatchFeeSummaryViLog tmsDispatchFeeSummaryViLog)
+    {
+        startPage();
+        List<TmsDispatchFeeSummaryViLog> list = tmsDispatchFeeSummaryViLogService.selectTmsDispatchFeeSummaryViLogList(tmsDispatchFeeSummaryViLog);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭娲捐溅鍙拌处澶囨敞璁板綍鍒楄〃
+     * @param tmsDispatchFeeSummaryViLog 鏌ヨ鏉′欢瀵硅薄
+     */
+    @PreAuthorize("@ss.hasPermi('tms:dispatchFeeSummaryViLog:export')")
+    @Log(title = "娲捐溅鍙拌处澶囨敞璁板綍", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(TmsDispatchFeeSummaryViLog tmsDispatchFeeSummaryViLog,String exportKey)
+    {
+        tmsDispatchFeeSummaryViLogService.export(tmsDispatchFeeSummaryViLog,exportKey);
+        return AjaxResult.success("瀵煎嚭璇锋眰鎴愬姛锛岃绋嶅悗鐐瑰嚮涓嬭浇...!");
+    }
+
+
+
+    /**
+     * 鑾峰彇娲捐溅鍙拌处澶囨敞璁板綍璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('tms:dispatchFeeSummaryViLog:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Integer id)
+    {
+        return AjaxResult.success(tmsDispatchFeeSummaryViLogService.selectTmsDispatchFeeSummaryViLogById(id));
+    }
+
+    /**
+     * 鏂板娲捐溅鍙拌处澶囨敞璁板綍
+     */
+    @PreAuthorize("@ss.hasPermi('tms:dispatchFeeSummaryViLog:add')")
+    @Log(title = "娲捐溅鍙拌处澶囨敞璁板綍", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody TmsDispatchFeeSummaryViLog tmsDispatchFeeSummaryViLog)
+    {
+        return toAjax(tmsDispatchFeeSummaryViLogService.insertTmsDispatchFeeSummaryViLog(tmsDispatchFeeSummaryViLog));
+    }
+
+    /**
+     * 淇敼娲捐溅鍙拌处澶囨敞璁板綍
+     */
+    @PreAuthorize("@ss.hasPermi('tms:dispatchFeeSummaryViLog:edit')")
+    @Log(title = "娲捐溅鍙拌处澶囨敞璁板綍", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody TmsDispatchFeeSummaryViLog tmsDispatchFeeSummaryViLog)
+    {
+        return toAjax(tmsDispatchFeeSummaryViLogService.updateTmsDispatchFeeSummaryViLog(tmsDispatchFeeSummaryViLog));
+    }
+
+    /**
+     * 鍒犻櫎娲捐溅鍙拌处澶囨敞璁板綍
+     */
+    @PreAuthorize("@ss.hasPermi('tms:dispatchFeeSummaryViLog:remove')")
+    @Log(title = "娲捐溅鍙拌处澶囨敞璁板綍", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Integer[] ids)
+    {
+        return toAjax(tmsDispatchFeeSummaryViLogService.deleteTmsDispatchFeeSummaryViLogByIds(ids));
+    }
+}
diff --git a/tms/src/main/java/com/ruoyi/tms/controller/TmsDispatchOrderImportLogController.java b/tms/src/main/java/com/ruoyi/tms/controller/TmsDispatchOrderImportLogController.java
new file mode 100644
index 0000000..c32ef77
--- /dev/null
+++ b/tms/src/main/java/com/ruoyi/tms/controller/TmsDispatchOrderImportLogController.java
@@ -0,0 +1,103 @@
+package com.ruoyi.tms.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.tms.domain.TmsDispatchOrderImportLog;
+import com.ruoyi.tms.service.ITmsDispatchOrderImportLogService;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 璋冨害鍗曞鍏ユ棩蹇桟ontroller
+ * 
+ * @author ruoyi
+ * @date 2026-03-06
+ */
+@RestController
+@RequestMapping("/tms/tmsDispatchOrderImportLog")
+public class TmsDispatchOrderImportLogController extends BaseController
+{
+    @Autowired
+    private ITmsDispatchOrderImportLogService tmsDispatchOrderImportLogService;
+
+    /**
+     * 鏌ヨ璋冨害鍗曞鍏ユ棩蹇楀垪琛�
+     */
+    @PreAuthorize("@ss.hasPermi('tms:tmsDispatchOrderImportLog:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(TmsDispatchOrderImportLog tmsDispatchOrderImportLog)
+    {
+        startPage();
+        List<TmsDispatchOrderImportLog> list = tmsDispatchOrderImportLogService.selectTmsDispatchOrderImportLogList(tmsDispatchOrderImportLog);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭璋冨害鍗曞鍏ユ棩蹇楀垪琛�
+     */
+    @PreAuthorize("@ss.hasPermi('tms:tmsDispatchOrderImportLog:export')")
+    @Log(title = "璋冨害鍗曞鍏ユ棩蹇�", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(TmsDispatchOrderImportLog tmsDispatchOrderImportLog, String exportKey)
+    {
+        tmsDispatchOrderImportLogService.export(tmsDispatchOrderImportLog, exportKey);
+        return AjaxResult.success("瀵煎嚭璇锋眰鎴愬姛锛岃绋嶅悗鐐瑰嚮涓嬭浇...!");
+    }
+
+    /**
+     * 鑾峰彇璋冨害鍗曞鍏ユ棩蹇楄缁嗕俊鎭�
+     */
+    @PreAuthorize("@ss.hasPermi('tms:tmsDispatchOrderImportLog:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Integer id)
+    {
+        return success(tmsDispatchOrderImportLogService.selectTmsDispatchOrderImportLogById(id));
+    }
+
+    /**
+     * 鏂板璋冨害鍗曞鍏ユ棩蹇�
+     */
+    @PreAuthorize("@ss.hasPermi('tms:tmsDispatchOrderImportLog:add')")
+    @Log(title = "璋冨害鍗曞鍏ユ棩蹇�", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody TmsDispatchOrderImportLog tmsDispatchOrderImportLog)
+    {
+        return toAjax(tmsDispatchOrderImportLogService.insertTmsDispatchOrderImportLog(tmsDispatchOrderImportLog));
+    }
+
+    /**
+     * 淇敼璋冨害鍗曞鍏ユ棩蹇�
+     */
+    @PreAuthorize("@ss.hasPermi('tms:tmsDispatchOrderImportLog:edit')")
+    @Log(title = "璋冨害鍗曞鍏ユ棩蹇�", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody TmsDispatchOrderImportLog tmsDispatchOrderImportLog)
+    {
+        return toAjax(tmsDispatchOrderImportLogService.updateTmsDispatchOrderImportLog(tmsDispatchOrderImportLog));
+    }
+
+    /**
+     * 鍒犻櫎璋冨害鍗曞鍏ユ棩蹇�
+     */
+    @PreAuthorize("@ss.hasPermi('tms:tmsDispatchOrderImportLog:remove')")
+    @Log(title = "璋冨害鍗曞鍏ユ棩蹇�", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Integer[] ids)
+    {
+        return toAjax(tmsDispatchOrderImportLogService.deleteTmsDispatchOrderImportLogByIds(ids));
+    }
+}
\ No newline at end of file
diff --git a/tms/src/main/java/com/ruoyi/tms/controller/TmsFinanceDetailController.java b/tms/src/main/java/com/ruoyi/tms/controller/TmsFinanceDetailController.java
index 5eba95d..b46726e 100644
--- a/tms/src/main/java/com/ruoyi/tms/controller/TmsFinanceDetailController.java
+++ b/tms/src/main/java/com/ruoyi/tms/controller/TmsFinanceDetailController.java
@@ -110,6 +110,15 @@
         }
     }
 
+    @PreAuthorize("@ss.hasPermi('tms:tmsFinanceDetail:add')")
+    @Log(title = "璐圭敤鏄庣粏", businessType = BusinessType.INSERT)
+    @PostMapping("save2")
+    public AjaxResult save2(@RequestBody List<TmsFinanceDetail> tmsFinanceDetails)
+    {
+        return toAjax(tmsFinanceDetailService.saveTmsFinanceDetail2(tmsFinanceDetails));
+
+    }
+
     /**
      * 淇敼璐圭敤鏄庣粏
      */
diff --git a/tms/src/main/java/com/ruoyi/tms/domain/TmsDispatchFeeSummaryVi.java b/tms/src/main/java/com/ruoyi/tms/domain/TmsDispatchFeeSummaryVi.java
index 31da13f..0ee8666 100644
--- a/tms/src/main/java/com/ruoyi/tms/domain/TmsDispatchFeeSummaryVi.java
+++ b/tms/src/main/java/com/ruoyi/tms/domain/TmsDispatchFeeSummaryVi.java
@@ -200,7 +200,7 @@
     @TableField(exist = false)
     private BigDecimal grossProfitRadioHkd;
 
-
+    private String remark;
 
 
 }
diff --git a/tms/src/main/java/com/ruoyi/tms/domain/TmsDispatchFeeSummaryViLog.java b/tms/src/main/java/com/ruoyi/tms/domain/TmsDispatchFeeSummaryViLog.java
new file mode 100644
index 0000000..698d41f
--- /dev/null
+++ b/tms/src/main/java/com/ruoyi/tms/domain/TmsDispatchFeeSummaryViLog.java
@@ -0,0 +1,48 @@
+package com.ruoyi.tms.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.annotation.Excel;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.util.Date;
+import lombok.Data;
+/**
+ * 娲捐溅鍙拌处澶囨敞璁板綍瀵硅薄 tms_dispatch_fee_summary_vi_log
+ *
+ * @author ruoyi
+ * @date 2026-03-06
+ */
+@Data
+public class TmsDispatchFeeSummaryViLog{
+
+
+    /**  */
+        @TableField("id")
+    private Integer id;
+
+
+    /** 澶磇d */
+    @Excel(name = "澶磇d")
+
+        @TableField("head_id")
+    private Integer headId;
+
+
+    /** 鍒涘缓鑰� */
+        @TableField("create_by")
+    private String createBy;
+
+
+    /** 鍒涘缓鏃堕棿 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+        @TableField("create_time")
+    private Date createTime;
+
+
+    /** 澶囨敞 */
+    @Excel(name = "澶囨敞")
+
+        @TableField("notes")
+    private String notes;
+
+
+}
diff --git a/tms/src/main/java/com/ruoyi/tms/domain/TmsDispatchOrder.java b/tms/src/main/java/com/ruoyi/tms/domain/TmsDispatchOrder.java
index b30c69e..40145c4 100644
--- a/tms/src/main/java/com/ruoyi/tms/domain/TmsDispatchOrder.java
+++ b/tms/src/main/java/com/ruoyi/tms/domain/TmsDispatchOrder.java
@@ -622,6 +622,7 @@
     @TableField("seamless_supplier_name")
     private String seamlessSupplierName;
 
-
+    @TableField("notes")
+    private String notes;
 
 }
\ No newline at end of file
diff --git a/tms/src/main/java/com/ruoyi/tms/domain/TmsDispatchOrderImportLog.java b/tms/src/main/java/com/ruoyi/tms/domain/TmsDispatchOrderImportLog.java
new file mode 100644
index 0000000..9a320f3
--- /dev/null
+++ b/tms/src/main/java/com/ruoyi/tms/domain/TmsDispatchOrderImportLog.java
@@ -0,0 +1,74 @@
+package com.ruoyi.tms.domain;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.annotation.Excel;
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+
+/**
+ * 璋冨害鍗曞鍏ユ棩蹇楀璞� tms_dispatch_order_import_log
+ * 
+ * @author ruoyi
+ * @date 2026-03-06
+ */
+@Data
+public class TmsDispatchOrderImportLog {
+
+    /** 涓婚敭 */
+    @TableField("id")
+    private Integer id;
+
+    /** 瀵煎叆鏃堕棿 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "瀵煎叆鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    @TableField("import_time")
+    private Date importTime;
+
+    /** 瀵煎叆鏂囦欢鍚嶇О */
+    @Excel(name = "瀵煎叆鏂囦欢鍚嶇О")
+    @TableField("file_name")
+    private String fileName;
+
+    /** 鎿嶄綔浜� */
+    @Excel(name = "鎿嶄綔浜�")
+    @TableField("operator")
+    private String operator;
+
+    /** 鎴愬姛琛屾暟 */
+    @Excel(name = "鎴愬姛琛屾暟")
+    @TableField("success_count")
+    private Integer successCount;
+
+    /** 澶辫触琛屾暟 */
+    @Excel(name = "澶辫触琛屾暟")
+    @TableField("failure_count")
+    private Integer failureCount;
+
+    /** 澶辫触璇存槑 */
+    @Excel(name = "澶辫触璇存槑")
+    @TableField("failure_description")
+    private String failureDescription;
+
+    /** 鍒涘缓鑰� */
+    @TableField("create_by")
+    private String createBy;
+
+    /** 鍒涘缓鏃堕棿 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField("create_time")
+    private Date createTime;
+
+    /** 鏇存柊鑰� */
+    @TableField("update_by")
+    private String updateBy;
+
+    /** 鏇存柊鏃堕棿 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField("update_time")
+    private Date updateTime;
+
+    /** 澶囨敞 */
+    @TableField("remark")
+    private String remark;
+}
\ No newline at end of file
diff --git a/tms/src/main/java/com/ruoyi/tms/mapper/TmsDispatchFeeSummaryViLogMapper.java b/tms/src/main/java/com/ruoyi/tms/mapper/TmsDispatchFeeSummaryViLogMapper.java
new file mode 100644
index 0000000..b20f8ad
--- /dev/null
+++ b/tms/src/main/java/com/ruoyi/tms/mapper/TmsDispatchFeeSummaryViLogMapper.java
@@ -0,0 +1,87 @@
+package com.ruoyi.tms.mapper;
+
+import java.util.List;
+import com.ruoyi.tms.domain.TmsDispatchFeeSummaryViLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+
+/**
+ * 娲捐溅鍙拌处澶囨敞璁板綍Mapper鎺ュ彛
+ * 
+ * @author ruoyi
+ * @date 2026-03-06
+ */
+public interface TmsDispatchFeeSummaryViLogMapper  extends BaseMapper<TmsDispatchFeeSummaryViLog>
+{
+    /**
+     * 鏌ヨ娲捐溅鍙拌处澶囨敞璁板綍
+     * 
+     * @param id 娲捐溅鍙拌处澶囨敞璁板綍ID
+     * @return 娲捐溅鍙拌处澶囨敞璁板綍
+     */
+    public TmsDispatchFeeSummaryViLog selectTmsDispatchFeeSummaryViLogById(Integer id);
+
+    /**
+     * 鏌ヨ娲捐溅鍙拌处澶囨敞璁板綍 璁板綍鏁�
+     *
+     * @param tmsDispatchFeeSummaryViLog 娲捐溅鍙拌处澶囨敞璁板綍
+     * @return 娲捐溅鍙拌处澶囨敞璁板綍闆嗗悎
+     */
+    public int selectTmsDispatchFeeSummaryViLogCount(TmsDispatchFeeSummaryViLog tmsDispatchFeeSummaryViLog);
+
+    /**
+     * 鏌ヨ娲捐溅鍙拌处澶囨敞璁板綍鍒楄〃
+     * 
+     * @param tmsDispatchFeeSummaryViLog 娲捐溅鍙拌处澶囨敞璁板綍
+     * @return 娲捐溅鍙拌处澶囨敞璁板綍闆嗗悎
+     */
+    public List<TmsDispatchFeeSummaryViLog> selectTmsDispatchFeeSummaryViLogList(TmsDispatchFeeSummaryViLog tmsDispatchFeeSummaryViLog);
+
+    /**
+     * 鏂板娲捐溅鍙拌处澶囨敞璁板綍
+     * 
+     * @param tmsDispatchFeeSummaryViLog 娲捐溅鍙拌处澶囨敞璁板綍
+     * @return 缁撴灉
+     */
+    public int insertTmsDispatchFeeSummaryViLog(TmsDispatchFeeSummaryViLog tmsDispatchFeeSummaryViLog);
+
+    /**
+     * 鏂板娲捐溅鍙拌处澶囨敞璁板綍[鎵归噺]
+     *
+     * @param tmsDispatchFeeSummaryViLogs 娲捐溅鍙拌处澶囨敞璁板綍
+     * @return 缁撴灉
+     */
+    public int insertTmsDispatchFeeSummaryViLogBatch(List<TmsDispatchFeeSummaryViLog> tmsDispatchFeeSummaryViLogs);
+
+    /**
+     * 淇敼娲捐溅鍙拌处澶囨敞璁板綍
+     * 
+     * @param tmsDispatchFeeSummaryViLog 娲捐溅鍙拌处澶囨敞璁板綍
+     * @return 缁撴灉
+     */
+    public int updateTmsDispatchFeeSummaryViLog(TmsDispatchFeeSummaryViLog tmsDispatchFeeSummaryViLog);
+
+    /**
+     * 淇敼娲捐溅鍙拌处澶囨敞璁板綍[鎵归噺]
+     *
+     * @param tmsDispatchFeeSummaryViLogs 娲捐溅鍙拌处澶囨敞璁板綍
+     * @return 缁撴灉
+     */
+    public int updateTmsDispatchFeeSummaryViLogBatch(List<TmsDispatchFeeSummaryViLog> tmsDispatchFeeSummaryViLogs);
+
+    /**
+     * 鍒犻櫎娲捐溅鍙拌处澶囨敞璁板綍
+     * 
+     * @param id 娲捐溅鍙拌处澶囨敞璁板綍ID
+     * @return 缁撴灉
+     */
+    public int deleteTmsDispatchFeeSummaryViLogById(Integer id);
+
+    /**
+     * 鎵归噺鍒犻櫎娲捐溅鍙拌处澶囨敞璁板綍
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteTmsDispatchFeeSummaryViLogByIds(Integer[] ids);
+}
diff --git a/tms/src/main/java/com/ruoyi/tms/mapper/TmsDispatchOrderImportLogMapper.java b/tms/src/main/java/com/ruoyi/tms/mapper/TmsDispatchOrderImportLogMapper.java
new file mode 100644
index 0000000..4d538fe
--- /dev/null
+++ b/tms/src/main/java/com/ruoyi/tms/mapper/TmsDispatchOrderImportLogMapper.java
@@ -0,0 +1,62 @@
+package com.ruoyi.tms.mapper;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.tms.domain.TmsDispatchOrderImportLog;
+
+/**
+ * 璋冨害鍗曞鍏ユ棩蹇桵apper鎺ュ彛
+ * 
+ * @author ruoyi
+ * @date 2026-03-06
+ */
+public interface TmsDispatchOrderImportLogMapper extends BaseMapper<TmsDispatchOrderImportLog> {
+    /**
+     * 鏌ヨ璋冨害鍗曞鍏ユ棩蹇�
+     * 
+     * @param id 璋冨害鍗曞鍏ユ棩蹇桰D
+     * @return 璋冨害鍗曞鍏ユ棩蹇�
+     */
+    public TmsDispatchOrderImportLog selectTmsDispatchOrderImportLogById(Integer id);
+
+    /**
+     * 鏌ヨ璋冨害鍗曞鍏ユ棩蹇楀垪琛�
+     * 
+     * @param tmsDispatchOrderImportLog 璋冨害鍗曞鍏ユ棩蹇�
+     * @return 璋冨害鍗曞鍏ユ棩蹇楅泦鍚�
+     */
+    public List<TmsDispatchOrderImportLog> selectTmsDispatchOrderImportLogList(TmsDispatchOrderImportLog tmsDispatchOrderImportLog);
+
+    /**
+     * 鏂板璋冨害鍗曞鍏ユ棩蹇�
+     * 
+     * @param tmsDispatchOrderImportLog 璋冨害鍗曞鍏ユ棩蹇�
+     * @return 缁撴灉
+     */
+    public int insertTmsDispatchOrderImportLog(TmsDispatchOrderImportLog tmsDispatchOrderImportLog);
+
+    /**
+     * 淇敼璋冨害鍗曞鍏ユ棩蹇�
+     * 
+     * @param tmsDispatchOrderImportLog 璋冨害鍗曞鍏ユ棩蹇�
+     * @return 缁撴灉
+     */
+    public int updateTmsDispatchOrderImportLog(TmsDispatchOrderImportLog tmsDispatchOrderImportLog);
+
+    /**
+     * 鍒犻櫎璋冨害鍗曞鍏ユ棩蹇�
+     * 
+     * @param id 璋冨害鍗曞鍏ユ棩蹇桰D
+     * @return 缁撴灉
+     */
+    public int deleteTmsDispatchOrderImportLogById(Integer id);
+
+    /**
+     * 鎵归噺鍒犻櫎璋冨害鍗曞鍏ユ棩蹇�
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteTmsDispatchOrderImportLogByIds(Integer[] ids);
+}
\ No newline at end of file
diff --git a/tms/src/main/java/com/ruoyi/tms/service/ITmsDispatchFeeSummaryViLogService.java b/tms/src/main/java/com/ruoyi/tms/service/ITmsDispatchFeeSummaryViLogService.java
new file mode 100644
index 0000000..bd5eba4
--- /dev/null
+++ b/tms/src/main/java/com/ruoyi/tms/service/ITmsDispatchFeeSummaryViLogService.java
@@ -0,0 +1,102 @@
+package com.ruoyi.tms.service;
+
+import java.util.List;
+import com.ruoyi.tms.domain.TmsDispatchFeeSummaryViLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+/**
+ * 娲捐溅鍙拌处澶囨敞璁板綍Service鎺ュ彛
+ * 
+ * @author ruoyi
+ * @date 2026-03-06
+ */
+public interface ITmsDispatchFeeSummaryViLogService extends IService<TmsDispatchFeeSummaryViLog>
+{
+    /**
+     * 鏌ヨ娲捐溅鍙拌处澶囨敞璁板綍
+     * 
+     * @param id 娲捐溅鍙拌处澶囨敞璁板綍ID
+     * @return 娲捐溅鍙拌处澶囨敞璁板綍
+     */
+    public TmsDispatchFeeSummaryViLog selectTmsDispatchFeeSummaryViLogById(Integer id);
+
+    /**
+     * 鏌ヨ娲捐溅鍙拌处澶囨敞璁板綍 璁板綍鏁�
+     *
+     * @param tmsDispatchFeeSummaryViLog 娲捐溅鍙拌处澶囨敞璁板綍
+     * @return 娲捐溅鍙拌处澶囨敞璁板綍闆嗗悎
+     */
+    public int selectTmsDispatchFeeSummaryViLogCount(TmsDispatchFeeSummaryViLog tmsDispatchFeeSummaryViLog);
+
+    /**
+     * 鏌ヨ娲捐溅鍙拌处澶囨敞璁板綍鍒楄〃
+     * 
+     * @param tmsDispatchFeeSummaryViLog 娲捐溅鍙拌处澶囨敞璁板綍
+     * @return 娲捐溅鍙拌处澶囨敞璁板綍闆嗗悎
+     */
+    public List<TmsDispatchFeeSummaryViLog> selectTmsDispatchFeeSummaryViLogList(TmsDispatchFeeSummaryViLog tmsDispatchFeeSummaryViLog);
+
+    /**
+     * 鏌ヨ娲捐溅鍙拌处澶囨敞璁板綍鍒楄〃 寮傛 瀵煎嚭
+     *
+     * @param tmsDispatchFeeSummaryViLog 娲捐溅鍙拌处澶囨敞璁板綍
+     * @param exportKey 瀵煎嚭鍔熻兘鐨勫敮涓�鏍囪瘑
+     * @return 娲捐溅鍙拌处澶囨敞璁板綍闆嗗悎
+     */
+    public void export(TmsDispatchFeeSummaryViLog tmsDispatchFeeSummaryViLog, String exportKey) ;
+
+
+    /**
+     * 鏂板娲捐溅鍙拌处澶囨敞璁板綍
+     * 
+     * @param tmsDispatchFeeSummaryViLog 娲捐溅鍙拌处澶囨敞璁板綍
+     * @return 缁撴灉
+     */
+    public int insertTmsDispatchFeeSummaryViLog(TmsDispatchFeeSummaryViLog tmsDispatchFeeSummaryViLog);
+
+    /**
+     * 鏂板娲捐溅鍙拌处澶囨敞璁板綍[鎵归噺]
+     *
+     * @param tmsDispatchFeeSummaryViLogs 娲捐溅鍙拌处澶囨敞璁板綍
+     * @return 缁撴灉
+     */
+    public int insertTmsDispatchFeeSummaryViLogBatch(List<TmsDispatchFeeSummaryViLog> tmsDispatchFeeSummaryViLogs);
+
+    /**
+     * 淇敼娲捐溅鍙拌处澶囨敞璁板綍
+     * 
+     * @param tmsDispatchFeeSummaryViLog 娲捐溅鍙拌处澶囨敞璁板綍
+     * @return 缁撴灉
+     */
+    public int updateTmsDispatchFeeSummaryViLog(TmsDispatchFeeSummaryViLog tmsDispatchFeeSummaryViLog);
+
+    /**
+     * 淇敼娲捐溅鍙拌处澶囨敞璁板綍[鎵归噺]
+     *
+     * @param tmsDispatchFeeSummaryViLogs 娲捐溅鍙拌处澶囨敞璁板綍
+     * @return 缁撴灉
+     */
+    public int updateTmsDispatchFeeSummaryViLogBatch(List<TmsDispatchFeeSummaryViLog> tmsDispatchFeeSummaryViLogs);
+    /**
+     * 鎵归噺鍒犻櫎娲捐溅鍙拌处澶囨敞璁板綍
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteTmsDispatchFeeSummaryViLogByIds(String ids);
+
+    /**
+     * 鎵归噺鍒犻櫎娲捐溅鍙拌处澶囨敞璁板綍
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteTmsDispatchFeeSummaryViLogByIds(Integer[] ids);
+
+    /**
+     * 鍒犻櫎娲捐溅鍙拌处澶囨敞璁板綍淇℃伅
+     * 
+     * @param id 娲捐溅鍙拌处澶囨敞璁板綍ID
+     * @return 缁撴灉
+     */
+    public int deleteTmsDispatchFeeSummaryViLogById(Integer id);
+}
diff --git a/tms/src/main/java/com/ruoyi/tms/service/ITmsDispatchFeeSummaryViService.java b/tms/src/main/java/com/ruoyi/tms/service/ITmsDispatchFeeSummaryViService.java
index 16f49be..909527e 100644
--- a/tms/src/main/java/com/ruoyi/tms/service/ITmsDispatchFeeSummaryViService.java
+++ b/tms/src/main/java/com/ruoyi/tms/service/ITmsDispatchFeeSummaryViService.java
@@ -11,4 +11,5 @@
 
     public void export(TmsDispatchFeeSummaryVi vi, String exportKey) ;
 
+    int note(TmsDispatchFeeSummaryVi bo);
 }
diff --git a/tms/src/main/java/com/ruoyi/tms/service/ITmsDispatchOrderImportLogService.java b/tms/src/main/java/com/ruoyi/tms/service/ITmsDispatchOrderImportLogService.java
new file mode 100644
index 0000000..3bad89b
--- /dev/null
+++ b/tms/src/main/java/com/ruoyi/tms/service/ITmsDispatchOrderImportLogService.java
@@ -0,0 +1,69 @@
+package com.ruoyi.tms.service;
+
+import java.util.List;
+import com.ruoyi.tms.domain.TmsDispatchOrderImportLog;
+
+/**
+ * 璋冨害鍗曞鍏ユ棩蹇桽ervice鎺ュ彛
+ * 
+ * @author ruoyi
+ * @date 2026-03-06
+ */
+public interface ITmsDispatchOrderImportLogService 
+{
+    /**
+     * 鏌ヨ璋冨害鍗曞鍏ユ棩蹇�
+     * 
+     * @param id 璋冨害鍗曞鍏ユ棩蹇桰D
+     * @return 璋冨害鍗曞鍏ユ棩蹇�
+     */
+    public TmsDispatchOrderImportLog selectTmsDispatchOrderImportLogById(Integer id);
+
+    /**
+     * 鏌ヨ璋冨害鍗曞鍏ユ棩蹇楀垪琛�
+     * 
+     * @param tmsDispatchOrderImportLog 璋冨害鍗曞鍏ユ棩蹇�
+     * @return 璋冨害鍗曞鍏ユ棩蹇楅泦鍚�
+     */
+    public List<TmsDispatchOrderImportLog> selectTmsDispatchOrderImportLogList(TmsDispatchOrderImportLog tmsDispatchOrderImportLog);
+
+    /**
+     * 鏂板璋冨害鍗曞鍏ユ棩蹇�
+     * 
+     * @param tmsDispatchOrderImportLog 璋冨害鍗曞鍏ユ棩蹇�
+     * @return 缁撴灉
+     */
+    public int insertTmsDispatchOrderImportLog(TmsDispatchOrderImportLog tmsDispatchOrderImportLog);
+
+    /**
+     * 淇敼璋冨害鍗曞鍏ユ棩蹇�
+     * 
+     * @param tmsDispatchOrderImportLog 璋冨害鍗曞鍏ユ棩蹇�
+     * @return 缁撴灉
+     */
+    public int updateTmsDispatchOrderImportLog(TmsDispatchOrderImportLog tmsDispatchOrderImportLog);
+
+    /**
+     * 鍒犻櫎璋冨害鍗曞鍏ユ棩蹇�
+     * 
+     * @param id 璋冨害鍗曞鍏ユ棩蹇桰D
+     * @return 缁撴灉
+     */
+    public int deleteTmsDispatchOrderImportLogById(Integer id);
+
+    /**
+     * 鎵归噺鍒犻櫎璋冨害鍗曞鍏ユ棩蹇�
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteTmsDispatchOrderImportLogByIds(Integer[] ids);
+
+    /**
+     * 瀵煎嚭璋冨害鍗曞鍏ユ棩蹇楀垪琛�
+     * 
+     * @param tmsDispatchOrderImportLog 璋冨害鍗曞鍏ユ棩蹇�
+     * @param exportKey 瀵煎嚭鍔熻兘鐨勫敮涓�鏍囪瘑
+     */
+    public void export(TmsDispatchOrderImportLog tmsDispatchOrderImportLog, String exportKey);
+}
\ No newline at end of file
diff --git a/tms/src/main/java/com/ruoyi/tms/service/ITmsFinanceDetailService.java b/tms/src/main/java/com/ruoyi/tms/service/ITmsFinanceDetailService.java
index 5ff6398..9c58bb8 100644
--- a/tms/src/main/java/com/ruoyi/tms/service/ITmsFinanceDetailService.java
+++ b/tms/src/main/java/com/ruoyi/tms/service/ITmsFinanceDetailService.java
@@ -56,7 +56,7 @@
      */
     public int insertTmsFinanceDetail(TmsFinanceDetail tmsFinanceDetail);
     public int saveTmsFinanceDetail(TmsFinanceDetail tmsFinanceDetail);
-
+    int saveTmsFinanceDetail2(List<TmsFinanceDetail> tmsFinanceDetails);
     /**
      * 鏂板璐圭敤鏄庣粏[鎵归噺]
      *
@@ -104,4 +104,6 @@
      * @return 缁撴灉
      */
     public int deleteTmsFinanceDetailById(Integer id);
+
+
 }
diff --git a/tms/src/main/java/com/ruoyi/tms/service/impl/TmsDispatchFeeSummaryViLogServiceImpl.java b/tms/src/main/java/com/ruoyi/tms/service/impl/TmsDispatchFeeSummaryViLogServiceImpl.java
new file mode 100644
index 0000000..87b2725
--- /dev/null
+++ b/tms/src/main/java/com/ruoyi/tms/service/impl/TmsDispatchFeeSummaryViLogServiceImpl.java
@@ -0,0 +1,181 @@
+package com.ruoyi.tms.service.impl;
+
+import java.util.List;
+
+import com.ruoyi.common.utils.DateUtils;
+import javax.annotation.Resource;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.stereotype.Service;
+import org.springframework.scheduling.annotation.Async;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import com.ruoyi.common.utils.PageUtils;
+import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.annotation.DataSource;
+import com.ruoyi.common.enums.DataSourceType;
+import com.ruoyi.common.core.service.BaseService;
+
+import com.ruoyi.tms.mapper.TmsDispatchFeeSummaryViLogMapper;
+import com.ruoyi.tms.domain.TmsDispatchFeeSummaryViLog;
+import com.ruoyi.tms.service.ITmsDispatchFeeSummaryViLogService;
+import com.ruoyi.common.core.text.Convert;
+
+/**
+ * 娲捐溅鍙拌处澶囨敞璁板綍Service涓氬姟灞傚鐞�
+ *
+ * @author ruoyi
+ * @date 2026-03-06
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class TmsDispatchFeeSummaryViLogServiceImpl  extends BaseService<TmsDispatchFeeSummaryViLogMapper, TmsDispatchFeeSummaryViLog> implements ITmsDispatchFeeSummaryViLogService
+{
+    protected final Logger logger = LoggerFactory.getLogger(getClass());
+    @Resource
+    private TmsDispatchFeeSummaryViLogMapper tmsDispatchFeeSummaryViLogMapper;
+
+
+    /**
+     * 鏌ヨ娲捐溅鍙拌处澶囨敞璁板綍
+     *
+     * @param id 娲捐溅鍙拌处澶囨敞璁板綍ID
+     * @return 娲捐溅鍙拌处澶囨敞璁板綍
+     */
+    @DataSource(DataSourceType.SLAVE)
+    @Override
+    public TmsDispatchFeeSummaryViLog selectTmsDispatchFeeSummaryViLogById(Integer id)
+    {
+        return tmsDispatchFeeSummaryViLogMapper.selectTmsDispatchFeeSummaryViLogById(id);
+    }
+
+    /**
+     * 鏌ヨ娲捐溅鍙拌处澶囨敞璁板綍 璁板綍鏁�
+     *
+     * @param tmsDispatchFeeSummaryViLog 娲捐溅鍙拌处澶囨敞璁板綍
+     * @return 娲捐溅鍙拌处澶囨敞璁板綍闆嗗悎
+     */
+    @DataSource(DataSourceType.SLAVE)
+    @Override
+    public int selectTmsDispatchFeeSummaryViLogCount(TmsDispatchFeeSummaryViLog tmsDispatchFeeSummaryViLog)
+    {
+        return tmsDispatchFeeSummaryViLogMapper.selectTmsDispatchFeeSummaryViLogCount(tmsDispatchFeeSummaryViLog);
+    }
+
+    /**
+     * 鏌ヨ娲捐溅鍙拌处澶囨敞璁板綍鍒楄〃
+     *
+     * @param tmsDispatchFeeSummaryViLog 娲捐溅鍙拌处澶囨敞璁板綍
+     * @return 娲捐溅鍙拌处澶囨敞璁板綍
+     */
+    @DataSource(DataSourceType.SLAVE)
+    @Override
+    public List<TmsDispatchFeeSummaryViLog> selectTmsDispatchFeeSummaryViLogList(TmsDispatchFeeSummaryViLog tmsDispatchFeeSummaryViLog)
+    {
+        return tmsDispatchFeeSummaryViLogMapper.selectTmsDispatchFeeSummaryViLogList(tmsDispatchFeeSummaryViLog);
+    }
+
+    /**
+     * 鏌ヨ娲捐溅鍙拌处澶囨敞璁板綍鍒楄〃 寮傛 瀵煎嚭
+     *
+     * @param tmsDispatchFeeSummaryViLog 娲捐溅鍙拌处澶囨敞璁板綍
+     * @param exportKey 瀵煎嚭鍔熻兘鐨勫敮涓�鏍囪瘑
+     * @return 娲捐溅鍙拌处澶囨敞璁板綍闆嗗悎
+     */
+    @DataSource(DataSourceType.SLAVE)
+    @Async
+    @Override
+    public void export(TmsDispatchFeeSummaryViLog tmsDispatchFeeSummaryViLog,String exportKey) {
+
+        super.export(TmsDispatchFeeSummaryViLog.class,exportKey,"tmsDispatchFeeSummaryViLogData",(pageNum)->{
+            PageUtils.startPage(pageNum, Constants.EXPORT_PATE_SIZE);
+            return selectTmsDispatchFeeSummaryViLogList(tmsDispatchFeeSummaryViLog);
+        });
+    }
+
+
+    /**
+     * 鏂板娲捐溅鍙拌处澶囨敞璁板綍
+     *
+     * @param tmsDispatchFeeSummaryViLog 娲捐溅鍙拌处澶囨敞璁板綍
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertTmsDispatchFeeSummaryViLog(TmsDispatchFeeSummaryViLog tmsDispatchFeeSummaryViLog)
+    {
+        tmsDispatchFeeSummaryViLog.setCreateTime(DateUtils.getNowDate());
+        return tmsDispatchFeeSummaryViLogMapper.insertTmsDispatchFeeSummaryViLog(tmsDispatchFeeSummaryViLog);
+    }
+
+    /**
+     * 鏂板娲捐溅鍙拌处澶囨敞璁板綍[鎵归噺]
+     *
+     * @param tmsDispatchFeeSummaryViLogs 娲捐溅鍙拌处澶囨敞璁板綍
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertTmsDispatchFeeSummaryViLogBatch(List<TmsDispatchFeeSummaryViLog> tmsDispatchFeeSummaryViLogs)
+    {
+        int rows = tmsDispatchFeeSummaryViLogMapper.insertTmsDispatchFeeSummaryViLogBatch(tmsDispatchFeeSummaryViLogs);
+        return rows;
+    }
+
+    /**
+     * 淇敼娲捐溅鍙拌处澶囨敞璁板綍
+     *
+     * @param tmsDispatchFeeSummaryViLog 娲捐溅鍙拌处澶囨敞璁板綍
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateTmsDispatchFeeSummaryViLog(TmsDispatchFeeSummaryViLog tmsDispatchFeeSummaryViLog)
+    {
+        return tmsDispatchFeeSummaryViLogMapper.updateTmsDispatchFeeSummaryViLog(tmsDispatchFeeSummaryViLog);
+    }
+
+    /**
+     * 淇敼娲捐溅鍙拌处澶囨敞璁板綍[鎵归噺]
+     *
+     * @param tmsDispatchFeeSummaryViLogs 娲捐溅鍙拌处澶囨敞璁板綍
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateTmsDispatchFeeSummaryViLogBatch(List<TmsDispatchFeeSummaryViLog> tmsDispatchFeeSummaryViLogs){
+        return tmsDispatchFeeSummaryViLogMapper.updateTmsDispatchFeeSummaryViLogBatch(tmsDispatchFeeSummaryViLogs);
+    }
+
+    /**
+     * 鍒犻櫎娲捐溅鍙拌处澶囨敞璁板綍瀵硅薄
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteTmsDispatchFeeSummaryViLogByIds(String ids)
+    {
+        return deleteTmsDispatchFeeSummaryViLogByIds(Convert.toIntArray(ids));
+    }
+
+    /**
+     * 鍒犻櫎娲捐溅鍙拌处澶囨敞璁板綍瀵硅薄
+     *
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteTmsDispatchFeeSummaryViLogByIds(Integer[] ids)
+    {
+        return tmsDispatchFeeSummaryViLogMapper.deleteTmsDispatchFeeSummaryViLogByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎娲捐溅鍙拌处澶囨敞璁板綍淇℃伅
+     *
+     * @param id 娲捐溅鍙拌处澶囨敞璁板綍ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteTmsDispatchFeeSummaryViLogById(Integer id)
+    {
+        return tmsDispatchFeeSummaryViLogMapper.deleteTmsDispatchFeeSummaryViLogById(id);
+    }
+}
diff --git a/tms/src/main/java/com/ruoyi/tms/service/impl/TmsDispatchFeeSummaryViServiceImpl.java b/tms/src/main/java/com/ruoyi/tms/service/impl/TmsDispatchFeeSummaryViServiceImpl.java
index 499a9a6..3c1b306 100644
--- a/tms/src/main/java/com/ruoyi/tms/service/impl/TmsDispatchFeeSummaryViServiceImpl.java
+++ b/tms/src/main/java/com/ruoyi/tms/service/impl/TmsDispatchFeeSummaryViServiceImpl.java
@@ -7,17 +7,14 @@
 import com.ruoyi.common.core.page.PageDomain;
 import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.common.core.service.BaseService;
+import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.file.DownloadExportUtil;
 import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.tms.domain.TmsDispatchFeeSummaryVi;
-import com.ruoyi.tms.domain.TmsPayableFeeItem;
-import com.ruoyi.tms.domain.TmsReceivableFeeItem;
-import com.ruoyi.tms.domain.TmsTrip;
-import com.ruoyi.tms.mapper.TmsDispatchFeeSummaryViMapper;
-import com.ruoyi.tms.mapper.TmsPayableFeeItemMapper;
-import com.ruoyi.tms.mapper.TmsReceivableFeeItemMapper;
+import com.ruoyi.tms.domain.*;
+import com.ruoyi.tms.mapper.*;
 import com.ruoyi.tms.service.ITmsDispatchFeeSummaryViService;
+import com.ruoyi.tms.service.ITmsDispatchOrderService;
 import com.ruoyi.tms.service.ITmsReceivableFeeService;
 import com.ruoyi.tms.service.ITmsTripService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -28,6 +25,7 @@
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -43,6 +41,10 @@
     private TmsReceivableFeeItemMapper tmsReceivableFeeItemMapper;
     @Resource
     private TmsPayableFeeItemMapper tmsPayableFeeItemMapper;
+    @Resource
+    private TmsDispatchOrderMapper tmsDispatchOrderMapper;
+    @Resource
+    private TmsDispatchFeeSummaryViLogMapper logMapper;
     @Override
     public Page<TmsDispatchFeeSummaryVi> list(PageDomain pageDomain,TmsDispatchFeeSummaryVi bo) {
         Page<TmsDispatchFeeSummaryVi> pageParam = new Page<>(pageDomain.getPageNum(), pageDomain.getPageSize());
@@ -178,5 +180,15 @@
         }
     }
 
-
+    @Override
+    public int note(TmsDispatchFeeSummaryVi bo) {
+        tmsDispatchOrderMapper.updateTmsDispatchOrder(new TmsDispatchOrder(){{setId(bo.getDispatchId().intValue());
+        setNotes(bo.getRemark());}});
+        TmsDispatchFeeSummaryViLog tmsDispatchFeeSummaryViLog = new TmsDispatchFeeSummaryViLog();
+        tmsDispatchFeeSummaryViLog.setNotes(bo.getRemark());
+        tmsDispatchFeeSummaryViLog.setHeadId(bo.getDispatchId().intValue());
+        tmsDispatchFeeSummaryViLog.setCreateBy(SecurityUtils.getUsername());
+        tmsDispatchFeeSummaryViLog.setCreateTime(new Date());
+        return logMapper.insertTmsDispatchFeeSummaryViLog(tmsDispatchFeeSummaryViLog);
+    }
 }
diff --git a/tms/src/main/java/com/ruoyi/tms/service/impl/TmsDispatchOrderImportLogServiceImpl.java b/tms/src/main/java/com/ruoyi/tms/service/impl/TmsDispatchOrderImportLogServiceImpl.java
new file mode 100644
index 0000000..85f12eb
--- /dev/null
+++ b/tms/src/main/java/com/ruoyi/tms/service/impl/TmsDispatchOrderImportLogServiceImpl.java
@@ -0,0 +1,116 @@
+package com.ruoyi.tms.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+import com.ruoyi.tms.mapper.TmsDispatchOrderImportLogMapper;
+import com.ruoyi.tms.domain.TmsDispatchOrderImportLog;
+import com.ruoyi.tms.service.ITmsDispatchOrderImportLogService;
+import com.ruoyi.common.utils.PageUtils;
+import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.annotation.DataSource;
+import com.ruoyi.common.enums.DataSourceType;
+import com.ruoyi.common.core.service.BaseService;
+
+/**
+ * 璋冨害鍗曞鍏ユ棩蹇桽ervice涓氬姟灞傚鐞�
+ * 
+ * @author ruoyi
+ * @date 2026-03-06
+ */
+@Service
+public class TmsDispatchOrderImportLogServiceImpl extends BaseService<TmsDispatchOrderImportLogMapper, TmsDispatchOrderImportLog> implements ITmsDispatchOrderImportLogService 
+{
+    @Autowired
+    private TmsDispatchOrderImportLogMapper tmsDispatchOrderImportLogMapper;
+
+    /**
+     * 鏌ヨ璋冨害鍗曞鍏ユ棩蹇�
+     * 
+     * @param id 璋冨害鍗曞鍏ユ棩蹇桰D
+     * @return 璋冨害鍗曞鍏ユ棩蹇�
+     */
+    @Override
+    public TmsDispatchOrderImportLog selectTmsDispatchOrderImportLogById(Integer id)
+    {
+        return tmsDispatchOrderImportLogMapper.selectTmsDispatchOrderImportLogById(id);
+    }
+
+    /**
+     * 鏌ヨ璋冨害鍗曞鍏ユ棩蹇楀垪琛�
+     * 
+     * @param tmsDispatchOrderImportLog 璋冨害鍗曞鍏ユ棩蹇�
+     * @return 璋冨害鍗曞鍏ユ棩蹇楅泦鍚�
+     */
+    @Override
+    public List<TmsDispatchOrderImportLog> selectTmsDispatchOrderImportLogList(TmsDispatchOrderImportLog tmsDispatchOrderImportLog)
+    {
+        return tmsDispatchOrderImportLogMapper.selectTmsDispatchOrderImportLogList(tmsDispatchOrderImportLog);
+    }
+
+    /**
+     * 鏂板璋冨害鍗曞鍏ユ棩蹇�
+     * 
+     * @param tmsDispatchOrderImportLog 璋冨害鍗曞鍏ユ棩蹇�
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertTmsDispatchOrderImportLog(TmsDispatchOrderImportLog tmsDispatchOrderImportLog)
+    {
+        return tmsDispatchOrderImportLogMapper.insertTmsDispatchOrderImportLog(tmsDispatchOrderImportLog);
+    }
+
+    /**
+     * 淇敼璋冨害鍗曞鍏ユ棩蹇�
+     * 
+     * @param tmsDispatchOrderImportLog 璋冨害鍗曞鍏ユ棩蹇�
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateTmsDispatchOrderImportLog(TmsDispatchOrderImportLog tmsDispatchOrderImportLog)
+    {
+        return tmsDispatchOrderImportLogMapper.updateTmsDispatchOrderImportLog(tmsDispatchOrderImportLog);
+    }
+
+    /**
+     * 鍒犻櫎璋冨害鍗曞鍏ユ棩蹇�
+     * 
+     * @param id 璋冨害鍗曞鍏ユ棩蹇桰D
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteTmsDispatchOrderImportLogById(Integer id)
+    {
+        return tmsDispatchOrderImportLogMapper.deleteTmsDispatchOrderImportLogById(id);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎璋冨害鍗曞鍏ユ棩蹇�
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteTmsDispatchOrderImportLogByIds(Integer[] ids)
+    {
+        return tmsDispatchOrderImportLogMapper.deleteTmsDispatchOrderImportLogByIds(ids);
+    }
+
+    /**
+     * 瀵煎嚭璋冨害鍗曞鍏ユ棩蹇楀垪琛�
+     *
+     * @param tmsDispatchOrderImportLog 璋冨害鍗曞鍏ユ棩蹇�
+     * @param exportKey 瀵煎嚭鍔熻兘鐨勫敮涓�鏍囪瘑
+     */
+    @DataSource(DataSourceType.SLAVE)
+    @Async
+    @Override
+    public void export(TmsDispatchOrderImportLog tmsDispatchOrderImportLog, String exportKey)
+    {
+        super.export(TmsDispatchOrderImportLog.class, exportKey, "tmsDispatchOrderImportLogData", (pageNum) -> {
+            PageUtils.startPage(pageNum, Constants.EXPORT_PATE_SIZE);
+            return selectTmsDispatchOrderImportLogList(tmsDispatchOrderImportLog);
+        });
+    }
+}
\ No newline at end of file
diff --git a/tms/src/main/java/com/ruoyi/tms/service/impl/TmsDispatchOrderServiceImpl.java b/tms/src/main/java/com/ruoyi/tms/service/impl/TmsDispatchOrderServiceImpl.java
index a226297..19fa9ae 100644
--- a/tms/src/main/java/com/ruoyi/tms/service/impl/TmsDispatchOrderServiceImpl.java
+++ b/tms/src/main/java/com/ruoyi/tms/service/impl/TmsDispatchOrderServiceImpl.java
@@ -118,6 +118,9 @@
     @Resource
     private TmsShelfMapper tmsShelfMapper;
 
+    @Autowired
+    private ITmsDispatchOrderImportLogService tmsDispatchOrderImportLogService;
+
 
     /**
      * 鏌ヨ璋冨害鍗曠鐞�
@@ -548,7 +551,17 @@
         int failureNum = 0;
         StringBuilder successMsg = new StringBuilder();
         StringBuilder failureMsg = new StringBuilder();
+        StringBuilder failureDescription = new StringBuilder();
         int line = 1;
+        
+        // 鍒涘缓瀵煎叆鏃ュ織瀵硅薄
+        TmsDispatchOrderImportLog importLog = new TmsDispatchOrderImportLog();
+        importLog.setImportTime(DateUtils.getNowDate());
+        importLog.setFileName("璋冨害鍗曞鍏ユ枃浠�"); // 杩欓噷闇�瑕佹牴鎹疄闄呮儏鍐佃幏鍙栨枃浠跺悕
+        importLog.setOperator(SecurityUtils.getUsername());
+        importLog.setCreateBy(SecurityUtils.getUsername());
+        importLog.setCreateTime(DateUtils.getNowDate());
+        
         for (TmsDispatchOrderImport tmsDispatchOrderImport : list){
             try
             {
@@ -722,12 +735,28 @@
                 failureNum++;
                 String msg = "<br/>" +  "璋冨害鍗曠"+line+"琛屽鍏ュけ璐ワ細";
                 failureMsg.append(msg + e.getMessage());
+                
+                // 璁板綍澶辫触璇存槑锛屽寘鍚鍙峰拰澶辫触鍘熷洜
+                failureDescription.append("绗�" + line + "琛岋細" + e.getMessage()).append("\n");
+                
                 log.error(msg, e);
             }finally {
                 line++;
             }
         }
 
+        // 璁剧疆瀵煎叆鏃ュ織鐨勭粺璁′俊鎭�
+        importLog.setSuccessCount(list.size() - failureNum);
+        importLog.setFailureCount(failureNum);
+        importLog.setFailureDescription(failureDescription.toString());
+        
+        // 淇濆瓨瀵煎叆鏃ュ織
+        try {
+            tmsDispatchOrderImportLogService.insertTmsDispatchOrderImportLog(importLog);
+        } catch (Exception e) {
+            log.error("淇濆瓨瀵煎叆鏃ュ織澶辫触锛�", e);
+        }
+
         if (failureNum > 0)
         {
             failureMsg.insert(0, "寰堟姳姝夛紝瀵煎叆澶辫触锛佸叡 " + failureNum + " 鏉℃暟鎹牸寮忎笉姝g‘锛岄敊璇涓嬶細");
diff --git a/tms/src/main/java/com/ruoyi/tms/service/impl/TmsFinanceDetailServiceImpl.java b/tms/src/main/java/com/ruoyi/tms/service/impl/TmsFinanceDetailServiceImpl.java
index ce326d6..cf963b6 100644
--- a/tms/src/main/java/com/ruoyi/tms/service/impl/TmsFinanceDetailServiceImpl.java
+++ b/tms/src/main/java/com/ruoyi/tms/service/impl/TmsFinanceDetailServiceImpl.java
@@ -2,6 +2,7 @@
 
 import java.math.BigDecimal;
 import java.util.Collections;
+import java.util.Date;
 import java.util.List;
 
 import cn.hutool.core.bean.BeanUtil;
@@ -9,6 +10,7 @@
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.enums.SystemDataNoEnum;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.DateUtils;
 import javax.annotation.Resource;
 
@@ -208,6 +210,28 @@
 
     }
 
+    @Override
+    public int saveTmsFinanceDetail2(List<TmsFinanceDetail> tmsFinanceDetails) {
+        String username = SecurityUtils.getUsername();
+        Long userId = SecurityUtils.getUserId();
+        Date nowDate = DateUtils.getNowDate();
+        for (TmsFinanceDetail tmsFinanceDetail : tmsFinanceDetails) {
+            if (StringUtils.isNotEmpty(tmsFinanceDetail.getFeeType() ) &&
+                    tmsFinanceDetail.getActualFeeAmount() != null) {
+                tmsFinanceDetail.setCreateBy(username);
+                tmsFinanceDetail.setInitialFeeAmount(tmsFinanceDetail.getActualFeeAmount());
+                tmsFinanceDetail.setCreateId(userId);
+                tmsFinanceDetail.setFeeCreateTime(nowDate);
+                tmsFinanceDetail.setCreateTime(nowDate);
+            }else {
+                throw new ServiceException("閲戦鎴栬�呰垂鐢ㄧ被鍨嬩笉鑳戒负绌�");
+            }
+        }
+
+        return tmsFinanceDetailMapper.insertTmsFinanceDetailBatch(tmsFinanceDetails);
+
+    }
+
     public void addItem (TmsFinanceDetail tmsFinanceDetail){
 //        if (tmsFinance == null){
 //
diff --git a/tms/src/main/resources/mapper/tms/TmsDispatchFeeSummaryViLogMapper.xml b/tms/src/main/resources/mapper/tms/TmsDispatchFeeSummaryViLogMapper.xml
new file mode 100644
index 0000000..43e73d1
--- /dev/null
+++ b/tms/src/main/resources/mapper/tms/TmsDispatchFeeSummaryViLogMapper.xml
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.tms.mapper.TmsDispatchFeeSummaryViLogMapper">
+
+    <resultMap type="com.ruoyi.tms.domain.TmsDispatchFeeSummaryViLog" id="TmsDispatchFeeSummaryViLogResult">
+        <result property="id"    column="id"    />
+        <result property="headId"    column="head_id"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="notes"    column="notes"    />
+    </resultMap>
+
+    <sql id="selectTmsDispatchFeeSummaryViLogVo">
+        select thisTab.id, thisTab.head_id, thisTab.create_by, thisTab.create_time, thisTab.notes from tms_dispatch_fee_summary_vi_log AS thisTab
+    </sql>
+    <sql id="selectTmsDispatchFeeSummaryViLogVoCount">
+        select count(0) from tms_dispatch_fee_summary_vi_log as thisTab
+    </sql>
+
+    <sql id="whereCondition">
+        <if test="headId != null "> and thisTab.head_id = #{headId}</if>
+        <if test="notes != null  and notes != ''"> and thisTab.notes = #{notes}</if>
+    </sql>
+
+    <!--鏌ヨ-->
+    <select id="selectTmsDispatchFeeSummaryViLogById" parameterType="Integer" resultMap="TmsDispatchFeeSummaryViLogResult">
+        <include refid="selectTmsDispatchFeeSummaryViLogVo"/>
+        where id = #{id}
+    </select>
+
+    <select id="selectTmsDispatchFeeSummaryViLogCount" parameterType="com.ruoyi.tms.domain.TmsDispatchFeeSummaryViLog" resultType="int">
+        <include refid="selectTmsDispatchFeeSummaryViLogVoCount"/>
+        <where>
+            <include refid="whereCondition"/>
+        </where>
+    </select>
+
+    <select id="selectTmsDispatchFeeSummaryViLogList" parameterType="com.ruoyi.tms.domain.TmsDispatchFeeSummaryViLog" resultMap="TmsDispatchFeeSummaryViLogResult">
+        <include refid="selectTmsDispatchFeeSummaryViLogVo"/>
+        <where>
+            <include refid="whereCondition"/>
+        </where>
+        order by thisTab.id desc
+    </select>
+
+    <!-- 鏂板 -->
+    <insert id="insertTmsDispatchFeeSummaryViLog" parameterType="com.ruoyi.tms.domain.TmsDispatchFeeSummaryViLog"  useGeneratedKeys="true" keyProperty="id">
+        insert into tms_dispatch_fee_summary_vi_log
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="headId != null">head_id,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="notes != null">notes,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="headId != null">#{headId},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="notes != null">#{notes},</if>
+         </trim>
+    </insert>
+
+    <insert id="insertTmsDispatchFeeSummaryViLogBatch" parameterType="java.util.List"  useGeneratedKeys="true" keyProperty="id">
+        insert into tms_dispatch_fee_summary_vi_log
+        <trim prefix="(" suffix=") values" suffixOverrides=",">
+            id,head_id,create_by,create_time,notes,
+        </trim>
+        <foreach item="item" index="index" collection="list" separator=",">
+            <trim prefix="(" suffix=") " suffixOverrides=",">
+                #{item.id},#{item.headId},#{item.createBy},#{item.createTime},#{item.notes},
+            </trim>
+        </foreach>
+    </insert>
+
+    <!-- 淇敼 -->
+    <update id="updateTmsDispatchFeeSummaryViLog" parameterType="com.ruoyi.tms.domain.TmsDispatchFeeSummaryViLog">
+        update tms_dispatch_fee_summary_vi_log
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="headId != null">head_id = #{headId},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="notes != null">notes = #{notes},</if>
+        </trim>
+        where id = #{id}
+    </update>
+    <!-- 淇敼 -->
+    <update id="updateTmsDispatchFeeSummaryViLogBatch" parameterType="java.util.List">
+        <foreach collection="list" item="item" index="index" separator=";">
+            update tms_dispatch_fee_summary_vi_log
+            <trim prefix="SET" suffixOverrides=",">
+                <if test="item.headId != null">head_id = #{item.headId},</if>
+                <if test="item.createBy != null">create_by = #{item.createBy},</if>
+                <if test="item.createTime != null">create_time = #{item.createTime},</if>
+                <if test="item.notes != null">notes = #{item.notes},</if>
+            </trim>
+        where id = #{item.id}
+        </foreach>
+    </update>
+
+    <!--鍒犻櫎-->
+    <delete id="deleteTmsDispatchFeeSummaryViLogById" parameterType="Integer">
+        delete from tms_dispatch_fee_summary_vi_log where id = #{id}
+    </delete>
+    <delete id="deleteTmsDispatchFeeSummaryViLogByIds" parameterType="Integer">
+        delete from tms_dispatch_fee_summary_vi_log where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+</mapper>
\ No newline at end of file
diff --git a/tms/src/main/resources/mapper/tms/TmsDispatchOrderImportLogMapper.xml b/tms/src/main/resources/mapper/tms/TmsDispatchOrderImportLogMapper.xml
new file mode 100644
index 0000000..9e04af9
--- /dev/null
+++ b/tms/src/main/resources/mapper/tms/TmsDispatchOrderImportLogMapper.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.tms.mapper.TmsDispatchOrderImportLogMapper">
+
+    <resultMap type="com.ruoyi.tms.domain.TmsDispatchOrderImportLog" id="TmsDispatchOrderImportLogResult">
+        <result property="id"    column="id"    />
+        <result property="importTime"    column="import_time"    />
+        <result property="fileName"    column="file_name"    />
+        <result property="operator"    column="operator"    />
+        <result property="successCount"    column="success_count"    />
+        <result property="failureCount"    column="failure_count"    />
+        <result property="failureDescription"    column="failure_description"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectTmsDispatchOrderImportLogVo">
+        select id, import_time, file_name, operator, success_count, failure_count, failure_description, create_by, create_time, update_by, update_time, remark from tms_dispatch_order_import_log
+    </sql>
+
+    <select id="selectTmsDispatchOrderImportLogList" parameterType="com.ruoyi.tms.domain.TmsDispatchOrderImportLog" resultMap="TmsDispatchOrderImportLogResult">
+        <include refid="selectTmsDispatchOrderImportLogVo"/>
+        <where>  
+            <if test="fileName != null  and fileName != ''"> and file_name like concat('%', #{fileName}, '%')</if>
+            <if test="operator != null  and operator != ''"> and operator like concat('%', #{operator}, '%')</if>
+            <if test="successCount != null "> and success_count = #{successCount}</if>
+            <if test="failureCount != null "> and failure_count = #{failureCount}</if>
+            <if test="failureDescription != null  and failureDescription != ''"> and failure_description like concat('%', #{failureDescription}, '%')</if>
+            <if test="importTime != null"> and import_time = #{importTime}</if>
+
+        </where>
+        order by import_time desc
+    </select>
+    
+    <select id="selectTmsDispatchOrderImportLogById" parameterType="Integer" resultMap="TmsDispatchOrderImportLogResult">
+        <include refid="selectTmsDispatchOrderImportLogVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertTmsDispatchOrderImportLog" parameterType="com.ruoyi.tms.domain.TmsDispatchOrderImportLog" useGeneratedKeys="true" keyProperty="id">
+        insert into tms_dispatch_order_import_log
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="importTime != null">import_time,</if>
+            <if test="fileName != null and fileName != ''">file_name,</if>
+            <if test="operator != null and operator != ''">operator,</if>
+            <if test="successCount != null">success_count,</if>
+            <if test="failureCount != null">failure_count,</if>
+            <if test="failureDescription != null">failure_description,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="remark != null">remark,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="importTime != null">#{importTime},</if>
+            <if test="fileName != null and fileName != ''">#{fileName},</if>
+            <if test="operator != null and operator != ''">#{operator},</if>
+            <if test="successCount != null">#{successCount},</if>
+            <if test="failureCount != null">#{failureCount},</if>
+            <if test="failureDescription != null">#{failureDescription},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="remark != null">#{remark},</if>
+         </trim>
+    </insert>
+
+    <update id="updateTmsDispatchOrderImportLog" parameterType="com.ruoyi.tms.domain.TmsDispatchOrderImportLog">
+        update tms_dispatch_order_import_log
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="importTime != null">import_time = #{importTime},</if>
+            <if test="fileName != null and fileName != ''">file_name = #{fileName},</if>
+            <if test="operator != null and operator != ''">operator = #{operator},</if>
+            <if test="successCount != null">success_count = #{successCount},</if>
+            <if test="failureCount != null">failure_count = #{failureCount},</if>
+            <if test="failureDescription != null">failure_description = #{failureDescription},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteTmsDispatchOrderImportLogById" parameterType="Integer">
+        delete from tms_dispatch_order_import_log where id = #{id}
+    </delete>
+
+    <delete id="deleteTmsDispatchOrderImportLogByIds" parameterType="String">
+        delete from tms_dispatch_order_import_log where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>
\ No newline at end of file
diff --git a/tms/src/main/resources/mapper/tms/TmsDispatchOrderMapper.xml b/tms/src/main/resources/mapper/tms/TmsDispatchOrderMapper.xml
index 6941f33..948cadd 100644
--- a/tms/src/main/resources/mapper/tms/TmsDispatchOrderMapper.xml
+++ b/tms/src/main/resources/mapper/tms/TmsDispatchOrderMapper.xml
@@ -115,6 +115,7 @@
         <result property="seamlessNumber"    column="seamless_number"    />
         <result property="seamlessSupplierId"    column="seamless_supplier_id"    />
         <result property="seamlessSupplierName"    column="seamless_supplier_name"    />
+        <result property="notes"    column="notes"    />
 
     </resultMap>
 
@@ -594,6 +595,7 @@
             <if test="seamlessNumber != null">seamless_number = #{seamlessNumber},</if>
             <if test="seamlessSupplierId != null">seamless_supplier_id = #{seamlessSupplierId},</if>
             <if test="seamlessSupplierName != null">seamless_supplier_name = #{seamlessSupplierName},</if>
+            <if test="notes != null">notes = #{notes},</if>
         </trim>
         where id = #{id}
     </update>
diff --git a/ui/admin-ui3/src/api/tms/dispatchFeeSummaryViLog.ts b/ui/admin-ui3/src/api/tms/dispatchFeeSummaryViLog.ts
new file mode 100644
index 0000000..c8b8c61
--- /dev/null
+++ b/ui/admin-ui3/src/api/tms/dispatchFeeSummaryViLog.ts
@@ -0,0 +1,67 @@
+import request,{download,requestType} from "@/utils/request";
+import {BaseEntityInterface} from "@/utils/globalInterface";
+export interface DispatchFeeSummaryViLogI extends BaseEntityInterface{
+            id ?:  number   ,            headId ?:  number   ,            createBy ?:  string   ,            createTime ?:  string   ,            notes ?:  string       }
+
+
+/**
+ * 鏌ヨ娲捐溅鍙拌处澶囨敞璁板綍鍒楄〃
+ */
+export const listDispatchFeeSummaryViLog:requestType = (query) => {
+    return request({
+        url: '/tms/dispatchFeeSummaryViLog/list',
+        method:'get',
+        params:query
+    })
+}
+/**
+ * 鏌ヨ娲捐溅鍙拌处澶囨敞璁板綍璇︾粏
+ */
+export const getDispatchFeeSummaryViLog:requestType = (id) => {
+    return request({
+        url: '/tms/dispatchFeeSummaryViLog/' + id,
+        method:'get'
+    })
+}
+
+/**
+ * 鏂板娲捐溅鍙拌处澶囨敞璁板綍
+ */
+export const addDispatchFeeSummaryViLog:requestType = (data) => {
+    return request({
+        url: '/tms/dispatchFeeSummaryViLog',
+        method: 'post',
+        data
+    })
+}
+
+/**
+ * 淇敼娲捐溅鍙拌处澶囨敞璁板綍
+ */
+export const updateDispatchFeeSummaryViLog:requestType = (data) => {
+    return request({
+        url: '/tms/dispatchFeeSummaryViLog',
+        method: 'put',
+        data
+    })
+}
+
+/**
+ * 鍒犻櫎娲捐溅鍙拌处澶囨敞璁板綍
+ */
+export const delDispatchFeeSummaryViLog:requestType = (id) => {
+    return request({
+        url: '/tms/dispatchFeeSummaryViLog/' + id,
+        method: 'delete'
+    })
+}
+
+
+/**
+ * 瀵煎嚭娲捐溅鍙拌处澶囨敞璁板綍
+ */
+export const exportDispatchFeeSummaryViLog:requestType = (query) => {
+    return new Promise<any>(()=>{
+        download('/tms/dispatchFeeSummaryViLog/export',query);
+    })
+}
diff --git a/ui/admin-ui3/src/api/tms/tmsDispatchFeeSummary.ts b/ui/admin-ui3/src/api/tms/tmsDispatchFeeSummary.ts
index 382b39c..b5e5606 100644
--- a/ui/admin-ui3/src/api/tms/tmsDispatchFeeSummary.ts
+++ b/ui/admin-ui3/src/api/tms/tmsDispatchFeeSummary.ts
@@ -20,3 +20,13 @@
         download('/tms/tmsDispatchFeeSummaryVi/export',query);
     })
 }
+/**
+ * 澶囨敞
+ */
+export const tmsDispatchFeeSummaryViNote:requestType = (data) => {
+    return request({
+        url: '/tms/tmsDispatchFeeSummaryVi/note',
+        method: 'put',
+        data
+    })
+}
diff --git a/ui/admin-ui3/src/api/tms/tmsDispatchOrder.ts b/ui/admin-ui3/src/api/tms/tmsDispatchOrder.ts
index 1831725..e8df9f9 100644
--- a/ui/admin-ui3/src/api/tms/tmsDispatchOrder.ts
+++ b/ui/admin-ui3/src/api/tms/tmsDispatchOrder.ts
@@ -274,4 +274,18 @@
     return new Promise<any>(() => {
         download('/tms/tmsDispatchOrder/importTemplate', query);
     })
+}
+/* 瀵煎叆鍘嗗彶璁板綍 */
+export const tmsTmsDispatchOrderImportLog: requestType = (id) => {
+    return request({
+        url: '/tms/tmsDispatchOrderImportLog/list' ,
+        method: 'get'
+    })
+}
+export const saveTmsFinanceDetail2:requestType = (data) => {
+    return request({
+        url: '/tms/tmsFinanceDetail/save2',
+        method: 'post',
+        data
+    })
 }
\ No newline at end of file
diff --git a/ui/admin-ui3/src/api/tms/tmsFinanceDetail.ts b/ui/admin-ui3/src/api/tms/tmsFinanceDetail.ts
index 9fc78ca..9fa1241 100644
--- a/ui/admin-ui3/src/api/tms/tmsFinanceDetail.ts
+++ b/ui/admin-ui3/src/api/tms/tmsFinanceDetail.ts
@@ -42,6 +42,7 @@
     })
 }
 
+
 /**
  * 淇敼璐圭敤鏄庣粏
  */
diff --git a/ui/admin-ui3/src/hooks/usePagePlus.ts b/ui/admin-ui3/src/hooks/usePagePlus.ts
index e1d54d9..76501e6 100644
--- a/ui/admin-ui3/src/hooks/usePagePlus.ts
+++ b/ui/admin-ui3/src/hooks/usePagePlus.ts
@@ -1,217 +1,169 @@
-import {reactive, ref, Ref, UnwrapRef} from "vue";
-import {PageF, PageInterface, PagesInterface} from "@/utils/globalInterface";
-
-import {ElMessage, ElMessageBox} from "element-plus";
-import {requestType} from "@/utils/request";
-
-
+import { reactive, ref, onMounted, onUnmounted } from "vue"; // 1. 寮曞叆鐢熷懡鍛ㄦ湡閽╁瓙
+import { PageF, PagesInterface } from "@/utils/globalInterface";
+import { ElMessage, ElMessageBox } from "element-plus";
+import { requestType } from "@/utils/request";
 
 /**
- * @description usePage 鎺ユ敹涓�涓猳pts 鍙傛暟锛岃繑鍥為�氱敤椤甸潰鎵�闇�鏁版嵁
- * @param {Object} opts.form 琛ㄥ崟瀵硅薄
- * @param {string} opts.title 椤甸潰鏍囬
- * @param {Object} opts.queryParams 鏌ヨ鍙傛暟
- * @param {Function} opts.getListApi 鑾峰彇鍒楄〃鏁版嵁鐨勬帴鍙�
- * @param {Function} opts.getDetailApi 鑾峰彇璇︽儏鏁版嵁鐨勬帴鍙�
- * @param {Function} opts.deleteApi 鍒犻櫎鏁版嵁鐨勬帴鍙�
- * @param {Function} opts.exportApi 瀵煎嚭鏁版嵁鐨勬帴鍙�
- * @param {Function} opts.getBeginListFunc 鑾峰彇鍓峠etList鏁版嵁鐨勬帴鍙�
- * @param {Function} opts.getListFunc 鎵ц瀹実etList鎴愬姛鍚庢墽琛岀殑閫昏緫
- * @param {Function} opts.resetFunc 鎵ц瀹宺eset鎴愬姛鍚庢墽琛岀殑閫昏緫
- * @param {Function} opts.resetQueryFunc 鎵ц瀹宺esetQuery鎴愬姛鍚庢墽琛岀殑閫昏緫
- * @param {Function} opts.handleSelectionChangeFunc 鎵ц瀹宧andleSelectionChange鎴愬姛鍚庢墽琛岀殑閫昏緫
+ * @description usePagePlus 澧炲姞鍏ㄥ眬鍥炶溅鎼滅储閫昏緫
  */
 export const usePagePlus = (opts: {
-    form?:any,
-    option?:any,
-    idKey?:any,
-    page:any,
-    queryParams?:any,
-    getListApi?:requestType,
-    addApi?:requestType,
-    updateApi?:requestType,
-    getDetailApi?:requestType,
-    deleteApi?:requestType,
-    exportApi?:requestType,
-    getBeginListFunc?:Function,
-    getListFunc?:Function,
-    resetFunc?:Function,
-    handleQueryFunc?:Function,
-    resetQueryFunc?:Function,
-    handleSelectionChangeFunc?:Function,
-    handleAddFunc?:Function,
-    handleUpdateFunc?:Function,
-    handleBeforeOpenFunc?:Function,
-    handleEndOpenFunc?:Function,
-    rowSaveBegin?:Function,
-    rowUpdateBegin?:Function,
-})=>{
-    const pageF = reactive({...PageF});
+    form?: any,
+    option?: any,
+    idKey?: any,
+    page: any,
+    queryParams?: any, // 纭繚澶栭儴浼犲叆鐨勬槸 ref 瀵硅薄
+    getListApi?: requestType,
+    addApi?: requestType,
+    updateApi?: requestType,
+    getDetailApi?: requestType,
+    deleteApi?: requestType,
+    exportApi?: requestType,
+    getBeginListFunc?: Function,
+    getListFunc?: Function,
+    resetFunc?: Function,
+    handleQueryFunc?: Function,
+    resetQueryFunc?: Function,
+    handleSelectionChangeFunc?: Function,
+    handleAddFunc?: Function,
+    handleUpdateFunc?: Function,
+    handleBeforeOpenFunc?: Function,
+    handleEndOpenFunc?: Function,
+    rowSaveBegin?: Function,
+    rowUpdateBegin?: Function,
+}) => {
+    const pageF = reactive({ ...PageF });
     const tableData = ref([]);
-    opts.idKey = opts.idKey?opts.idKey: 'id';
+    opts.idKey = opts.idKey ? opts.idKey : 'id';
+
     /**
      * 鑾峰彇鍒楄〃鏁版嵁
      */
-    const onLoad = (page:PagesInterface, params?:Object) =>{
-        if(opts.getBeginListFunc){
+    const onLoad = (page: PagesInterface, params?: Object) => {
+        if (opts.getBeginListFunc) {
             params = opts.getBeginListFunc!(params)
         }
         pageF.loading = true;
-        opts.getListApi!({pageNum:page.currentPage,pageSize:page.pageSize,...Object.assign(params?params:{},opts.queryParams.value)}).then((res:any)=>{
-            tableData.value = res.rows|| [];
+        opts.getListApi!({ 
+            pageNum: page.currentPage, 
+            pageSize: page.pageSize, 
+            ...Object.assign(params ? params : {}, opts.queryParams.value) 
+        }).then((res: any) => {
+            tableData.value = res.rows || [];
             pageF.loading = false;
             opts.page.total = res.total || 0;
-            if(opts.getListFunc){
+            if (opts.getListFunc) {
                 opts.getListFunc!(res)
             }
         })
     }
 
     /**
-     * 娓呯┖鎼滅储鍥炶皟鏂规硶
+     * 2. 鏂板锛氭墜鍔ㄨЕ鍙戞悳绱㈤�昏緫 (鐢ㄤ簬鍥炶溅鎼滅储)
      */
-    const searchReset = () =>{
-        opts.queryParams = {};
-        if (opts.handleQueryFunc){
+    const manualSearch = () => {
+        opts.page.currentPage = 1; // 鍥炶溅鎼滅储榛樿鍒囧洖绗竴椤�
+        if (opts.handleQueryFunc) {
+            opts.handleQueryFunc();
+        }
+        onLoad(opts.page, opts.queryParams.value);
+    }
+
+    /**
+     * 3. 鏂板锛氬叏灞�鎸夐敭鐩戝惉澶勭悊鍑芥暟
+     */
+    const handleKeyDown = (e: KeyboardEvent) => {
+        // 鍒ゆ柇鏄惁鎸変笅 Enter 閿�
+        if (e.key === 'Enter') {
+            // 鍏抽敭鍒ゆ柇锛氫负浜嗛槻姝㈠湪鏂板/缂栬緫寮圭獥杈撳叆鏃惰Е鍙戣儗鏅垪琛ㄥ埛鏂�
+            // 鍙湁褰撶劍鐐瑰湪 Input 妗嗕腑涓斾笉鍦ㄥ脊绐楀唴锛堥�氬父鏍规嵁涓氬姟鐘舵�佸垽鏂級鎵嶈Е鍙�
+            const target = e.target as HTMLElement;
+            if (target.tagName === 'INPUT') {
+                // 濡傛灉椤甸潰涓婃湁 open 鐘舵�佹帶鍒跺脊绐楋紝鍙互鍦ㄦ澧炲姞鍒ゆ柇鏉′欢
+                manualSearch();
+            }
+        }
+    };
+
+    // 4. 鎸傝浇鏃剁洃鍚紝鍗歌浇鏃剁Щ闄わ紝纭繚涓嶅奖鍝嶅叾浠栭潪 Avue 椤甸潰
+    onMounted(() => {
+        window.addEventListener("keydown", handleKeyDown);
+    });
+
+    onUnmounted(() => {
+        window.removeEventListener("keydown", handleKeyDown);
+    });
+
+    /** 娓呯┖鎼滅储鍥炶皟鏂规硶 */
+    const searchReset = () => {
+        opts.queryParams.value = {}; // 淇敼涓烘搷浣� .value
+        if (opts.handleQueryFunc) {
             opts.handleQueryFunc();
         }
         onLoad(opts.page);
     }
 
     /** 鎼滅储鎸夐挳鎿嶄綔 */
-    const searchChange = (params:any, done:any) => {
-        // opts.queryParams = params;
+    const searchChange = (params: any, done: any) => {
         opts.page.currentPage = 1;
-        if (opts.handleQueryFunc){
+        if (opts.handleQueryFunc) {
             opts.handleQueryFunc();
         }
-        console.log(params);
-        
-        onLoad(opts.page,params);
+        onLoad(opts.page, params);
         done();
-
     }
-    // 澶氶�夋閫変腑鏁版嵁
+
+    // --- 浠ヤ笅淇濇寔鍘熸湁閫昏緫涓嶅彉 ---
     const selectionChange = (selection?: any[]) => {
         pageF.ids = selection!.map(item => item[opts.idKey]);
         pageF.single = selection!.length != 1;
         pageF.multiple = !selection!.length;
-        if (opts.handleSelectionChangeFunc){
+        if (opts.handleSelectionChangeFunc) {
             opts.handleSelectionChangeFunc!(selection);
         }
     }
-    /** 鏂板鎿嶄綔 */
-    const rowSave = (row:any, done:any, loading:any) => {
-        if (opts.rowSaveBegin){
-            opts.rowSaveBegin!(row,loading);
+
+    const rowSave = (row: any, done: any, loading: any) => {
+        if (opts.rowSaveBegin) {
+            opts.rowSaveBegin!(row, loading);
         }
-        opts.addApi!(row).then(()=>{
-            ElMessage({
-                message: "鏂板鎴愬姛锛�",
-                type: 'success'
-            })
+        opts.addApi!(row).then(() => {
+            ElMessage({ message: "鏂板鎴愬姛锛�", type: 'success' });
             onLoad(opts.page);
-            done()
-        }).catch(()=>{
-            loading()
-        })
+            done();
+        }).catch(() => { loading() })
     }
 
-    /** 淇敼鎿嶄綔 */
-    const rowUpdate = (row:any, index:any, done:any, loading:any) => {
-        if (opts.rowUpdateBegin){
-            opts.rowUpdateBegin!(row,loading);
+    const rowUpdate = (row: any, index: any, done: any, loading: any) => {
+        if (opts.rowUpdateBegin) {
+            opts.rowUpdateBegin!(row, loading);
         }
-        opts.updateApi!(row).then((response:any) => {
-            ElMessage({
-                message: "淇敼鎴愬姛锛�",
-                type: 'success'
-            })
+        opts.updateApi!(row).then((response: any) => {
+            ElMessage({ message: "淇敼鎴愬姛锛�", type: 'success' });
             onLoad(opts.page);
-            done()
-        }).catch(()=>{
-            loading()
-        })
+            done();
+        }).catch(() => { loading() })
     }
 
-    const handleUpdate = ()=>{
-        if ( !(pageF?.ids)|| pageF?.ids?.length === 0) {
-            ElMessage({
-                message: "璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹紒",
-                type: 'warning'
-            })
-            return;
-        }
-        if(opts.handleUpdateFunc){
-            opts.handleUpdateFunc!()
-        }
-
-    }
-
-
-    const rowDel  = (row:any) =>{
-        ElMessageBox.confirm("纭畾灏嗛�夋嫨鏁版嵁鍒犻櫎锛�", '绯荤粺鎻愮ず', {confirmButtonText: '纭畾', cancelButtonText: '鍙栨秷', type: 'warning'}).then(() => {
+    const rowDel = (row: any) => {
+        ElMessageBox.confirm("纭畾灏嗛�夋嫨鏁版嵁鍒犻櫎锛�", '绯荤粺鎻愮ず', { confirmButtonText: '纭畾', cancelButtonText: '鍙栨秷', type: 'warning' }).then(() => {
             return opts.deleteApi!(row[opts.idKey]);
         }).then(() => {
             onLoad(opts.page);
-            ElMessage({
-                message: "鍒犻櫎鎴愬姛锛�",
-                type: 'success'
-            })
-        });
-    }
-    const handleDelete  = () =>{
-        if ( !(pageF?.ids)|| pageF?.ids?.length === 0) {
-            ElMessage({
-                message: "璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹紒",
-                type: 'warning'
-            })
-            return;
-        }
-        ElMessageBox.confirm("纭畾灏嗛�夋嫨鏁版嵁鍒犻櫎锛�", '绯荤粺鎻愮ず', {confirmButtonText: '纭畾', cancelButtonText: '鍙栨秷', type: 'warning'}).then(() => {
-            return opts.deleteApi!(pageF?.ids);
-        }).then(() => {
-            onLoad(opts.page);
-            ElMessage({
-                message: "鍒犻櫎鎴愬姛锛�",
-                type: 'success'
-            })
+            ElMessage({ message: "鍒犻櫎鎴愬姛锛�", type: 'success' });
         });
     }
 
-
-    /**
-     * 瀵煎嚭
-     */
-    const handleExport =()=>{
-        console.log(opts.queryParams.value)
-        opts.exportApi!(opts.queryParams.value);
+    const refreshChange = () => {
+        onLoad(opts.page, opts.queryParams.value);
     }
 
-    const beforeOpen = (done:any, type:string) => {
-        if(opts.handleBeforeOpenFunc){
-            opts.handleBeforeOpenFunc!(type)
-        }
-        if (["edit", "view"].includes(type)) {
-
-            opts.getDetailApi!(opts.form.value[opts.idKey]).then(res => {
-                opts.form.value = res.data;
-                if(opts.handleEndOpenFunc){
-                    opts.handleEndOpenFunc!(type,res)
-                }
-            });
-        }
-        done();
-    }
-    const currentChange = (currentPage:number) => {
+    const currentChange = (currentPage: number) => {
         opts.page.currentPage = currentPage;
     }
-    const sizeChange = (pageSize:number) => {
+    const sizeChange = (pageSize: number) => {
         opts.page.pageSize = pageSize;
     }
-    const refreshChange = () => {
-        onLoad(opts.page,opts.queryParams.value);
-    }
+
     return {
         pageF,
         tableData,
@@ -222,13 +174,20 @@
         rowSave,
         rowUpdate,
         rowDel,
-        handleDelete,
-        handleExport,
-        beforeOpen,
+        refreshChange,
         currentChange,
         sizeChange,
-        handleUpdate,
-        refreshChange
+        manualSearch, // 瀵煎嚭姝ゆ柟娉曞鐢�
+        // ...鍏朵粬鍘熸湁杩斿洖椤�
+        beforeOpen: (done: any, type: string) => {
+            if (opts.handleBeforeOpenFunc) opts.handleBeforeOpenFunc!(type);
+            if (["edit", "view"].includes(type)) {
+                opts.getDetailApi!(opts.form.value[opts.idKey]).then(res => {
+                    opts.form.value = res.data;
+                    if (opts.handleEndOpenFunc) opts.handleEndOpenFunc!(type, res);
+                });
+            }
+            done();
+        }
     }
-
-}
+}
\ No newline at end of file
diff --git a/ui/admin-ui3/src/layout/components/AppMain.vue b/ui/admin-ui3/src/layout/components/AppMain.vue
index 881ef26..e62169e 100644
--- a/ui/admin-ui3/src/layout/components/AppMain.vue
+++ b/ui/admin-ui3/src/layout/components/AppMain.vue
@@ -2,7 +2,8 @@
   <section class="app-main">
     <router-view v-slot="{ Component, route }">
 <!--      <transition>-->
-        <keep-alive :include="cachedViews">
+  <!-- :include="cachedViews" -->
+        <keep-alive >
           <component :is="Component" :key="route.fullPath" />
         </keep-alive>
 <!--      </transition>-->
diff --git a/ui/admin-ui3/src/store/modules/user.ts b/ui/admin-ui3/src/store/modules/user.ts
index 063b05e..b2c7657 100644
--- a/ui/admin-ui3/src/store/modules/user.ts
+++ b/ui/admin-ui3/src/store/modules/user.ts
@@ -6,6 +6,8 @@
 import {removeToken, setToken} from "@/utils/auth";
 import {sm4} from 'sm-crypto'
 import {encryptSm4} from "@/utils/Sm4Utils";
+import { sm3 } from "sm-crypto";
+
 export interface UserState {
     token: string | undefined,
     name: string | undefined,
diff --git a/ui/admin-ui3/src/views/tms/dispatchFeeSummaryViLog/index.vue b/ui/admin-ui3/src/views/tms/dispatchFeeSummaryViLog/index.vue
new file mode 100644
index 0000000..fbcd341
--- /dev/null
+++ b/ui/admin-ui3/src/views/tms/dispatchFeeSummaryViLog/index.vue
@@ -0,0 +1,105 @@
+<template>
+  <basicContainer>
+    <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"
+      @size-change="sizeChange" @on-load="onLoad">
+      <template #menu-left>
+        <el-button type="success" icon="Edit" :disabled="pageF.single" v-hasPermi="['tms:dispatchFeeSummaryViLog:edit']"
+          @click="handleUpdate">淇敼
+        </el-button>
+        <el-button type="danger" icon="Delete" :disabled="pageF.multiple" @click="handleDelete"
+          v-hasPermi="['tms:dispatchFeeSummaryViLog:remove']">鍒犻櫎
+        </el-button>
+        <el-button type="warning" plain icon="Download" @click="handleExport"
+          v-hasPermi="['tms:dispatchFeeSummaryViLog:export']">瀵煎嚭
+        </el-button>
+      </template>
+    </avue-crud>
+  </basicContainer>
+</template>
+
+<script setup name="dispatchFeeSummaryViLog" lang="ts">
+import { DispatchFeeSummaryViLogI, addDispatchFeeSummaryViLog, delDispatchFeeSummaryViLog, exportDispatchFeeSummaryViLog, getDispatchFeeSummaryViLog, listDispatchFeeSummaryViLog, updateDispatchFeeSummaryViLog } from "@/api/tms/dispatchFeeSummaryViLog";
+import useCurrentInstance from "@/utils/useCurrentInstance";
+import { computed, reactive, ref, toRefs } from "vue";
+import { PagesInterface, PageQueryInterface } from "@/utils/globalInterface";
+import { usePagePlus } from "@/hooks/usePagePlus";
+import { hasPermission } from "@/utils/permissionUtils";
+
+const { proxy } = useCurrentInstance();
+const crudRef = ref();
+
+const permissionList = computed(() => {
+  return {
+    addBtn: hasPermission(["tms:dispatchFeeSummaryViLog:add"]),
+    delBtn: hasPermission(["tms:dispatchFeeSummaryViLog:remove"]),
+    editBtn: hasPermission(["tms:dispatchFeeSummaryViLog:edit"]),
+    viewBtn: hasPermission(["tms:dispatchFeeSummaryViLog:query"]),
+  }
+})
+
+const data = reactive({
+  form: <DispatchFeeSummaryViLogI>{},
+  queryParams: <DispatchFeeSummaryViLogI & PageQueryInterface>{},
+  page: <PagesInterface>{
+    pageSize: 10,
+    total: 0,
+    currentPage: 1,
+  },
+  selectionList: [],
+})
+const { queryParams, form, page, selectionList } = toRefs(data);
+const option = ref({
+  pageKey: 'DispatchFeeSummaryViLog',
+  rowKey: 'id',
+  column: {
+    id: {
+      label: '',
+    },
+    headId: {
+      label: '澶磇d',
+      rules: [
+        {
+          required: true,
+          message: "澶磇d涓嶈兘涓虹┖", trigger: "blur"
+        }
+      ],
+    },
+    createBy: {
+      label: '鍒涘缓鑰�',
+    },
+    createTime: {
+      label: '鍒涘缓鏃堕棿',
+    },
+    notes: {
+      label: '澶囨敞',
+      type: 'textarea', minRows: 3, maxRows: 5,
+    },
+  }
+})
+
+const { tableData, pageF, rowSave, rowUpdate, rowDel, beforeOpen, searchChange,
+  searchReset, selectionChange, onLoad, currentChange, sizeChange, handleDelete, handleExport, handleUpdate, refreshChange } = usePagePlus({
+    form: form,
+    option: option,
+    queryParams: queryParams,
+    idKey: 'id',
+    page: page.value,
+    getListApi: listDispatchFeeSummaryViLog,
+    getDetailApi: getDispatchFeeSummaryViLog,
+    exportApi: exportDispatchFeeSummaryViLog,
+    deleteApi: delDispatchFeeSummaryViLog,
+    addApi: addDispatchFeeSummaryViLog,
+    updateApi: updateDispatchFeeSummaryViLog,
+    handleUpdateFunc: () => {
+      crudRef.value.rowEdit(selectionList.value[0]);
+    },
+    handleSelectionChangeFunc: (selection: any) => {
+      selectionList.value = selection;
+    }
+  })
+
+
+</script>
diff --git a/ui/admin-ui3/src/views/tms/tmsDispatchFeeSummary/index.vue b/ui/admin-ui3/src/views/tms/tmsDispatchFeeSummary/index.vue
index 52983c7..9091197 100644
--- a/ui/admin-ui3/src/views/tms/tmsDispatchFeeSummary/index.vue
+++ b/ui/admin-ui3/src/views/tms/tmsDispatchFeeSummary/index.vue
@@ -1,95 +1,80 @@
 <template>
   <basicContainer>
-    <avue-crud
-        :option="option"
-        :table-loading="pageF.loading"
-        :data="tableData"
-        :page="page"
-        :permission="permissionList"
-        :before-open="beforeOpen"
-        v-model="form" v-model:search="queryParams"
-        ref="crudRef"
-        @refresh-change="refreshChange"
-        @search-change="searchChange"
-        @search-reset="searchReset"
-        @selection-change="selectionChange"
-        @current-change="currentChange"
-        @size-change="sizeChange"
-        @on-load="onLoad"
-    >
+    <avue-crud :option="option" :table-loading="pageF.loading" :data="tableData" :page="page"
+      :permission="permissionList" :before-open="beforeOpen" v-model="form" v-model:search="queryParams" ref="crudRef"
+      @refresh-change="refreshChange" @search-change="searchChange" @search-reset="searchReset"
+      @selection-change="selectionChange" @current-change="currentChange" @size-change="sizeChange" @on-load="onLoad">
+      <template #remark="{ row }">
+        <el-input v-model="row.remark" readonly placeholder="鏆傛棤澶囨敞" @click="handleRemarkClick(row)"
+          style="cursor: pointer;" />
+      </template>
       <template #menu-left>
 
-        <el-button
-            type="warning"
-            plain
-            icon="Download"
-            @click="handleExport"
-            v-hasPermi="['tms:tmsDriver:export']"
-        >瀵煎嚭
+        <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['tms:tmsDriver:export']">瀵煎嚭
         </el-button>
       </template>
-      <template #address="{row}">
-          <div class="hot" @click="handleLogItinerary(row)">
-            <div>璧凤細{{row.shipperRegionLabel?.split('/').pop()}}({{row.shipperAddress}})</div>
-            <div>鎶碉細{{row.receiverRegionLabel?.split('/').pop()}}({{row.receiverAddress}})</div>
-          </div>
+      <template #address="{ row }">
+        <div class="hot" @click="handleLogItinerary(row)">
+          <div>璧凤細{{ row.shipperRegionLabel?.split('/').pop() }}({{ row.shipperAddress }})</div>
+          <div>鎶碉細{{ row.receiverRegionLabel?.split('/').pop() }}({{ row.receiverAddress }})</div>
+        </div>
 
       </template>
-      <template #license="{row}">
-        <div>{{row.licensePlate}}</div>
-        <div>{{row.licenseHk}}</div>
-        <div>{{row.licenseMo}}</div>
+      <template #license="{ row }">
+        <div>{{ row.licensePlate }}</div>
+        <div>{{ row.licenseHk }}</div>
+        <div>{{ row.licenseMo }}</div>
       </template>
-      <template #shelfCodeAndContainerNo="{row}">
-        <div>{{row.shelfCode}}</div>
-        <div>{{row.containerNo}}</div>
+      <template #shelfCodeAndContainerNo="{ row }">
+        <div>{{ row.shelfCode }}</div>
+        <div>{{ row.containerNo }}</div>
       </template>
-      <template #pShippingFee="{row}">
-        <div v-if="row.rshippingFeeRmb">{{row.rshippingFeeRmb}}RMB</div>
-        <div v-if="row.rshippingFeeHkd">{{row.rshippingFeeHkd}}HKD</div>
+      <template #pShippingFee="{ row }">
+        <div v-if="row.rshippingFeeRmb">{{ row.rshippingFeeRmb }}RMB</div>
+        <div v-if="row.rshippingFeeHkd">{{ row.rshippingFeeHkd }}HKD</div>
       </template>
-      <template #pServerFee="{row}">
-        <div v-if="row.pserverFeeRmb">{{row.pserverFeeRmb}}RMB</div>
-        <div v-if="row.pserverFeeHkd">{{row.pserverFeeHkd}}HKD</div>
+      <template #pServerFee="{ row }">
+        <div v-if="row.pserverFeeRmb">{{ row.pserverFeeRmb }}RMB</div>
+        <div v-if="row.pserverFeeHkd">{{ row.pserverFeeHkd }}HKD</div>
       </template>
-      <template #pActualFee="{row}">
-        <div v-if="row.pactualFeeRmb">{{row.pactualFeeRmb}}RMB</div>
-        <div v-if="row.pactualFeeHkd">{{row.pactualFeeHkd}}HKD</div>
+      <template #pActualFee="{ row }">
+        <div v-if="row.pactualFeeRmb">{{ row.pactualFeeRmb }}RMB</div>
+        <div v-if="row.pactualFeeHkd">{{ row.pactualFeeHkd }}HKD</div>
       </template>
-      <template #pTotal="{row}">
+      <template #pTotal="{ row }">
         <div class="hot" @click="handlePayableFeeView(row)">
 
-        <div v-if="row.ptotalRmb">{{row.ptotalRmb}}RMB</div>
-        <div v-if="row.ptotalHkd">{{row.ptotalHkd}}HKD</div>
+          <div v-if="row.ptotalRmb">{{ row.ptotalRmb }}RMB</div>
+          <div v-if="row.ptotalHkd">{{ row.ptotalHkd }}HKD</div>
         </div>
       </template>
 
-      <template #rShippingFee="{row}">
-        <div v-if="row.rshippingFeeRmb">{{row.rshippingFeeRmb}}RMB</div>
-        <div v-if="row.rshippingFeeHkd">{{row.rshippingFeeRmb}}HKD</div>
+      <template #rShippingFee="{ row }">
+        <div v-if="row.rshippingFeeRmb">{{ row.rshippingFeeRmb }}RMB</div>
+        <div v-if="row.rshippingFeeHkd">{{ row.rshippingFeeRmb }}HKD</div>
       </template>
-      <template #rServerFee="{row}">
-        <div v-if="row.rserverFeeRmb">{{row.rserverFeeRmb}}RMB</div>
-        <div v-if="row.rserverFeeHkd ">{{row.rserverFeeHkd}}HKD</div>
+      <template #rServerFee="{ row }">
+        <div v-if="row.rserverFeeRmb">{{ row.rserverFeeRmb }}RMB</div>
+        <div v-if="row.rserverFeeHkd">{{ row.rserverFeeHkd }}HKD</div>
       </template>
-      <template #rActualFee="{row}">
-        <div v-if="row.ractualFeeRmb">{{row.ractualFeeRmb}}RMB</div>
-        <div v-if="row.ractualFeeHkd">{{row.ractualFeeHkd}}HKD</div>
+      <template #rActualFee="{ row }">
+        <div v-if="row.ractualFeeRmb">{{ row.ractualFeeRmb }}RMB</div>
+        <div v-if="row.ractualFeeHkd">{{ row.ractualFeeHkd }}HKD</div>
       </template>
-      <template #rTotal="{row}">
+      <template #rTotal="{ row }">
         <div class="hot" @click="handleReceivableFeeView(row)">
-          <div v-if="row.rtotalRmb">{{row.rtotalRmb}}RMB</div>
-          <div v-if="row.rtotalHkd">{{row.rtotalHkd}}HKD</div>
+          <div v-if="row.rtotalRmb">{{ row.rtotalRmb }}RMB</div>
+          <div v-if="row.rtotalHkd">{{ row.rtotalHkd }}HKD</div>
         </div>
       </template>
 
-      <template #grossProfit="{row}">
-        <div v-if="row.grossProfitRmb">{{row.grossProfitRmb}}RMB</div>
-        <div v-if="row.grossProfitHkd">{{row.grossProfitHkd}}HKD</div>
+      <template #grossProfit="{ row }">
+        <div v-if="row.grossProfitRmb">{{ row.grossProfitRmb }}RMB</div>
+        <div v-if="row.grossProfitHkd">{{ row.grossProfitHkd }}HKD</div>
       </template>
-      <template #grossProfitRadio="{row}">
-        <div v-if="row.grossProfitRadioRmb">RMB:{{row.grossProfitRadioRmb}}%</div>
-        <div v-if="row.grossProfitRadioHkd">HKD:{{row.grossProfitRadioHkd}}%</div>
+      <template #grossProfitRadio="{ row }">
+        <div v-if="row.grossProfitRadioRmb">RMB:{{ row.grossProfitRadioRmb }}%</div>
+        <div v-if="row.grossProfitRadioHkd">HKD:{{ row.grossProfitRadioHkd }}%</div>
       </template>
 
 
@@ -100,38 +85,32 @@
   <el-dialog :title="pageF.title" v-model="pageF.open" class="avue-dialog avue-dialog--top" width="80%">
     <div v-if="optionType == 'receivableFee'">
       <el-descriptions :column="3" border>
-        <el-descriptions-item label="搴旀敹璐圭敤缂栧彿">{{form.systemNo}}</el-descriptions-item>
-        <el-descriptions-item label="璋冨害鍗曞彿">{{form.dispatchNo}}</el-descriptions-item>
-        <el-descriptions-item label="瀹㈡埛鍚嶇О">{{form.customerName}}</el-descriptions-item>
-        <el-descriptions-item label="椤圭洰鍚嶇О">{{form.projectName}}</el-descriptions-item>
-        <el-descriptions-item label="璋冨害鍗曠‘瀹氭椂闂�">{{form.dispatchConfirmTime}}</el-descriptions-item>
-        <el-descriptions-item label="璐圭敤鐢熸垚鏃堕棿">{{form.costGenerateTime}}</el-descriptions-item>
-        <el-descriptions-item label="鍏宠仈璐﹀崟缂栧彿">{{form.billRelationNo}}</el-descriptions-item>
-        <el-descriptions-item label="搴旀敹閲戦浜烘皯甯�">{{form.receivableRMBAmount}}</el-descriptions-item>
-        <el-descriptions-item label="搴旀敹閲戦娓竵">{{form.receivableHKBAmount}}</el-descriptions-item>
+        <el-descriptions-item label="搴旀敹璐圭敤缂栧彿">{{ form.systemNo }}</el-descriptions-item>
+        <el-descriptions-item label="璋冨害鍗曞彿">{{ form.dispatchNo }}</el-descriptions-item>
+        <el-descriptions-item label="瀹㈡埛鍚嶇О">{{ form.customerName }}</el-descriptions-item>
+        <el-descriptions-item label="椤圭洰鍚嶇О">{{ form.projectName }}</el-descriptions-item>
+        <el-descriptions-item label="璋冨害鍗曠‘瀹氭椂闂�">{{ form.dispatchConfirmTime }}</el-descriptions-item>
+        <el-descriptions-item label="璐圭敤鐢熸垚鏃堕棿">{{ form.costGenerateTime }}</el-descriptions-item>
+        <el-descriptions-item label="鍏宠仈璐﹀崟缂栧彿">{{ form.billRelationNo }}</el-descriptions-item>
+        <el-descriptions-item label="搴旀敹閲戦浜烘皯甯�">{{ form.receivableRMBAmount }}</el-descriptions-item>
+        <el-descriptions-item label="搴旀敹閲戦娓竵">{{ form.receivableHKBAmount }}</el-descriptions-item>
       </el-descriptions>
       <h3>璐圭敤鏄庣粏</h3>
     </div>
-    <avue-crud
-        :option="boxTableOption" ref="itemsTableRef"
-        :data="boxTableData"
-    >
-      <template #expand="{row}">
-        <avue-crud
-                   :option="boxItemTableOption" ref="itemsTableRef2"
-                   :data="row.payableFeeItems"
-        >
+    <avue-crud :option="boxTableOption" ref="itemsTableRef" :data="boxTableData">
+      <template #expand="{ row }">
+        <avue-crud :option="boxItemTableOption" ref="itemsTableRef2" :data="row.payableFeeItems">
         </avue-crud>
       </template>
-      <template #receivableAmount="{row}">
-        <div v-if="row.receivableAmountRMB > 0">{{row.receivableAmountRMB}}浜烘皯甯�</div>
-        <div v-if="row.receivableAmountHKD > 0">{{row.receivableAmountHKD}}娓竵</div>
+      <template #receivableAmount="{ row }">
+        <div v-if="row.receivableAmountRMB > 0">{{ row.receivableAmountRMB }}浜烘皯甯�</div>
+        <div v-if="row.receivableAmountHKD > 0">{{ row.receivableAmountHKD }}娓竵</div>
 
       </template>
 
-      <template #payableAmount="{row}">
-        <div v-if="row.payableRmbAmount > 0">{{row.payableRmbAmount}}浜烘皯甯�</div>
-        <div v-if="row.payableHkbAmount > 0">{{row.payableHkbAmount}}娓竵</div>
+      <template #payableAmount="{ row }">
+        <div v-if="row.payableRmbAmount > 0">{{ row.payableRmbAmount }}浜烘皯甯�</div>
+        <div v-if="row.payableHkbAmount > 0">{{ row.payableHkbAmount }}娓竵</div>
       </template>
     </avue-crud>
 
@@ -143,23 +122,38 @@
     </template>
   </el-dialog>
 
+  <el-dialog :title="remarkBox.title" v-model="remarkBox.open" width="500px">
+    <div style="margin-bottom: 20px;">
+      <el-input v-model="remarkBox.content" type="textarea" :rows="4" placeholder="璇疯緭鍏ュ娉ㄥ唴瀹�" />
+      <div style="margin-top: 15px; text-align: right;">
+        <el-button @click="remarkBox.open = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="submitRemark">纭� 瀹�</el-button>
+      </div>
+    </div>
+
+    <el-table :data="remarkBox.list" border stripe size="small">
+      <el-table-column prop="createTime" label="鎿嶄綔鏃堕棿" width="160" />
+      <el-table-column prop="createBy" label="鎿嶄綔浜�" width="100" />
+      <el-table-column prop="notes" label="澶囨敞鍐呭" />
+    </el-table>
+  </el-dialog>
 </template>
 
 <script setup name="tmsDriver" lang="ts">
 import {
-  listTmsDispatchFeeSummaryVi,exportTmsDispatchFeeSummaryVi
+  listTmsDispatchFeeSummaryVi, exportTmsDispatchFeeSummaryVi, tmsDispatchFeeSummaryViNote
 } from "@/api/tms/tmsDispatchFeeSummary";
 import useCurrentInstance from "@/utils/useCurrentInstance";
-import {computed, onMounted, reactive, ref, toRefs, watch} from "vue";
-import {PagesInterface, PageQueryInterface} from "@/utils/globalInterface";
-import {usePagePlus} from "@/hooks/usePagePlus";
-import {hasPermission} from "@/utils/permissionUtils";
-import {getTmsServiceProvider, listTmsServiceProvider} from "@/api/tms/tmsServiceProvider";
-import {listTmsTrip} from "@/api/tms/tmsTrip";
-import {getTmsReceivableFeeByDispatchNo} from "@/api/tms/tmsReceivableFee";
-import {getTmsPayableFeeByDispatchNo} from "@/api/tms/tmsPayableFee";
-
-const {proxy} = useCurrentInstance();
+import { computed, onMounted, reactive, ref, toRefs, watch } from "vue";
+import { PagesInterface, PageQueryInterface } from "@/utils/globalInterface";
+import { usePagePlus } from "@/hooks/usePagePlus";
+import { hasPermission } from "@/utils/permissionUtils";
+import { getTmsServiceProvider, listTmsServiceProvider } from "@/api/tms/tmsServiceProvider";
+import { listTmsTrip } from "@/api/tms/tmsTrip";
+import { getTmsReceivableFeeByDispatchNo } from "@/api/tms/tmsReceivableFee";
+import { getTmsPayableFeeByDispatchNo } from "@/api/tms/tmsPayableFee";
+import { listDispatchFeeSummaryViLog } from "@/api/tms/dispatchFeeSummaryViLog";
+const { proxy } = useCurrentInstance();
 const crudRef = ref();
 
 const permissionList = computed(() => {
@@ -180,12 +174,12 @@
     currentPage: 1,
   },
   selectionList: [],
-  boxTableOption:<any>{},
-  boxTableData:<any>[],
-  optionType:<any>{},
-  boxItemTableOption:{},
+  boxTableOption: <any>{},
+  boxTableData: <any>[],
+  optionType: <any>{},
+  boxItemTableOption: {},
 })
-const {queryParams, form, page, selectionList,boxTableOption,boxTableData,optionType,boxItemTableOption} = toRefs(data);
+const { queryParams, form, page, selectionList, boxTableOption, boxTableData, optionType, boxItemTableOption } = toRefs(data);
 const option = ref({
   pageKey: 'TmsDriver',
   rowKey: 'id',
@@ -197,65 +191,72 @@
   column: [
     {
       label: '涓嬪崟淇℃伅',
-      children:[
-        {label: '涓嬪崟鏃堕棿',prop: 'orderTime',width: 120},
-        {label: '涓嬪崟鏃堕棿',prop: 'orderTimeRange',width: 120,search: true, searchRange: true, type: 'date', format: 'YYYY-MM-DD', hide: true, searchSpan: 5, valueFormat: 'YYYY-MM-DD',},
-        {label: '瀹㈡埛',prop: 'customerName',width: 180,search: true,},
-        {label: '椤圭洰鍚嶇О',prop: 'projectName',width: 180,search: true},
-        {label: '杩愯緭璺嚎',prop: 'address',width: 300,search: true},
-        {label: '涓嬪崟杞﹀瀷',prop: 'requiredVehicleTypes',width: 120,type: 'select', dicUrl: '/system/dict/data/type/vehicle_type', dataType: 'string',search: true},
+      children: [
+        { label: '涓嬪崟鏃堕棿', prop: 'orderTime', width: 120 },
+        { label: '涓嬪崟鏃堕棿', prop: 'orderTimeRange', width: 120, search: true, searchRange: true, type: 'date', format: 'YYYY-MM-DD', hide: true, searchSpan: 5, valueFormat: 'YYYY-MM-DD', },
+        { label: '瀹㈡埛', prop: 'customerName', width: 180, search: true, },
+        { label: '椤圭洰鍚嶇О', prop: 'projectName', width: 180, search: true },
+        { label: '杩愯緭璺嚎', prop: 'address', width: 300, search: true },
+        { label: '涓嬪崟杞﹀瀷', prop: 'requiredVehicleTypes', width: 120, type: 'select', dicUrl: '/system/dict/data/type/vehicle_type', dataType: 'string', search: true },
       ]
     },
     {
+      label: '澶囨敞',
+      prop: 'remark',
+      width: 120,
+      slot: true, // 寮�鍚嚜瀹氫箟鎻掓Ы
+    },
+    {
       label: '娲捐溅淇℃伅',
-      children:[
-        {label: '璋冨害鍗曞彿',prop: 'dispatchNo',width: 180,search: true,},
-        {label: '鐘舵��',prop: 'status',width: 120,      type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/tms_dispatch_order_status',search: true
+      children: [
+        { label: '璋冨害鍗曞彿', prop: 'dispatchNo', width: 180, search: true, },
+        {
+          label: '鐘舵��', prop: 'status', width: 120, type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/tms_dispatch_order_status', search: true
         },
-        {label: '鎵胯繍鍟�',prop: 'providerName',width: 180,search: true},
-        {label: '杞︾墝',prop: 'license',width: 120},
-        {label: '鍙告満',prop: 'mainDriverName',width: 120},
-        {label: '鎵胯繍杞﹀瀷',prop: 'actualVehicleType',width: 120,type: 'select', dicUrl: '/system/dict/data/type/vehicle_type', dataType: 'string',search: true},
+        { label: '鎵胯繍鍟�', prop: 'providerName', width: 180, search: true },
+        { label: '杞︾墝', prop: 'license', width: 120 },
+        { label: '鍙告満', prop: 'mainDriverName', width: 120 },
+        { label: '鎵胯繍杞﹀瀷', prop: 'actualVehicleType', width: 120, type: 'select', dicUrl: '/system/dict/data/type/vehicle_type', dataType: 'string', search: true },
       ]
     },
     {
       label: '鎵胯繍淇℃伅',
-      children:[
-        {label: '鎵樻灦/鏌滃彿',prop: 'shelfCodeAndContainerNo',width: 120},
-        {label: '鍙e哺',prop: 'port',width: 120},
-        {label: '鏃犵紳渚涘簲鍟�',prop: 'seamlessSupplierName',width: 120},
-        {label: '鏃犵紳鍙�',prop: 'seamlessNumber',width: 120},
-        {label: '鏌ラ獙',prop: 'iscc',width: 120,type: 'select', dicUrl: '/system/dict/data/type/sys_number_is', dataType: 'string',},
-        {label: '鎶ュ叧鏈嶅姟鍟�',prop: 'customsServiceProviderName',width: 120,search: true},
-        {label: '瑁呭嵏鏈嶅姟鍟�',prop: 'loadingServiceProviderName',width: 120,search: true},
+      children: [
+        { label: '鎵樻灦/鏌滃彿', prop: 'shelfCodeAndContainerNo', width: 120 },
+        { label: '鍙e哺', prop: 'port', width: 120 },
+        { label: '鏃犵紳渚涘簲鍟�', prop: 'seamlessSupplierName', width: 120 },
+        { label: '鏃犵紳鍙�', prop: 'seamlessNumber', width: 120 },
+        { label: '鏌ラ獙', prop: 'iscc', width: 120, type: 'select', dicUrl: '/system/dict/data/type/sys_number_is', dataType: 'string', },
+        { label: '鎶ュ叧鏈嶅姟鍟�', prop: 'customsServiceProviderName', width: 120, search: true },
+        { label: '瑁呭嵏鏈嶅姟鍟�', prop: 'loadingServiceProviderName', width: 120, search: true },
 
       ]
-    },{
+    }, {
       label: '搴斾粯',
-      children:[
-        {label: '杩愯垂',prop: 'pShippingFee',width: 120},
-        {label: '澧炲�兼湇鍔�',prop: 'pServerFee',width: 120},
-        {label: '瀹炴姤瀹為攢',prop: 'pActualFee',width: 120},
-        {label: '搴斾粯灏忚',prop: 'pTotal',width: 120},
+      children: [
+        { label: '杩愯垂', prop: 'pShippingFee', width: 120 },
+        { label: '澧炲�兼湇鍔�', prop: 'pServerFee', width: 120 },
+        { label: '瀹炴姤瀹為攢', prop: 'pActualFee', width: 120 },
+        { label: '搴斾粯灏忚', prop: 'pTotal', width: 120 },
       ]
-    },{
+    }, {
       label: '搴旀敹',
-      children:[
-        {label: '杩愯垂',prop: 'rShippingFee',width: 120},
-        {label: '澧炲�兼湇鍔�',prop: 'rServerFee',width: 120},
-        {label: '瀹炴姤瀹為攢',prop: 'rActualFee',width: 120},
-        {label: '搴旀敹灏忚',prop: 'rTotal',width: 120},
+      children: [
+        { label: '杩愯垂', prop: 'rShippingFee', width: 120 },
+        { label: '澧炲�兼湇鍔�', prop: 'rServerFee', width: 120 },
+        { label: '瀹炴姤瀹為攢', prop: 'rActualFee', width: 120 },
+        { label: '搴旀敹灏忚', prop: 'rTotal', width: 120 },
       ]
-    },{
+    }, {
       label: '鍒╂鼎',
-      children:[
-        {label: '姣涘埄',prop: 'grossProfit',width: 120},
-        {label: '姣涘埄鐜�',prop: 'grossProfitRadio',width: 120},
+      children: [
+        { label: '姣涘埄', prop: 'grossProfit', width: 120 },
+        { label: '姣涘埄鐜�', prop: 'grossProfitRadio', width: 120 },
       ]
-    },{
+    }, {
       label: '澶囨敞',
-      children:[
-        {label: '',prop: 'remark',width: 120},
+      children: [
+        { label: '', prop: 'remark', width: 120 },
 
       ]
     }
@@ -315,26 +316,26 @@
 const YSGenerateItemTableOption = ref({
   menu: false,
   add: false,
-  header:false,
+  header: false,
   selection: false,
-  rowKey:'rowKey',
+  rowKey: 'rowKey',
 
-  column:{
-    feeType:{
+  column: {
+    feeType: {
       label: '璐圭敤绫诲瀷',
       type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/receivable_fee_type',
 
     },
-    feeName:{
+    feeName: {
       label: '璐圭敤鍚嶇О',
     },
-    registerTime:{
+    registerTime: {
       label: '鐧昏鏃堕棿',
     },
-    registerAmount:{
+    registerAmount: {
       label: '鐧昏閲戦',
     },
-    currency:{
+    currency: {
       label: '甯佸埗',
       type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/sys_currency',
 
@@ -344,23 +345,23 @@
 const YFGenerateTableOption = ref({
   menu: false,
   add: false,
-  header:false,
+  header: false,
   selection: false,
-  expand:true,
-  defaultExpandAll:true,
-  rowKey:'id',
-  column:{
-    dispatchNo:{
+  expand: true,
+  defaultExpandAll: true,
+  rowKey: 'id',
+  column: {
+    dispatchNo: {
       label: '璋冨害鍗曞彿',
     },
-    serviceProviderType:{
+    serviceProviderType: {
       label: '鏈嶅姟鍟嗙被鍨�',
       type: 'radio', dicUrl: '/system/dict/data/type/provider_type', dataType: 'string',
     },
-    serviceProviderName:{
+    serviceProviderName: {
       label: '鏈嶅姟鍟嗗悕绋�',
     },
-    payableAmount:{
+    payableAmount: {
       label: '搴斾粯璐圭敤',
     }
   }
@@ -368,26 +369,26 @@
 const YFGenerateItemTableOption = ref({
   menu: false,
   add: false,
-  header:false,
+  header: false,
   selection: false,
-  rowKey:'rowKey',
+  rowKey: 'rowKey',
 
-  column:{
-    feeType:{
+  column: {
+    feeType: {
       label: '璐圭敤绫诲瀷',
       type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/receivable_fee_type',
 
     },
-    feeName:{
+    feeName: {
       label: '璐圭敤鍚嶇О',
     },
-    registerTime:{
+    registerTime: {
       label: '鐧昏鏃堕棿',
     },
-    registerAmount:{
+    registerAmount: {
       label: '鐧昏閲戦',
     },
-    currency:{
+    currency: {
       label: '甯佸埗',
       type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/sys_currency',
 
@@ -425,7 +426,7 @@
   handleSelectionChangeFunc: (selection: any) => {
     selectionList.value = selection;
   },
-  getBeginListFunc:(params = {})=>{
+  getBeginListFunc: (params = {}) => {
     queryParams.value = proxy.addDateRangeNew(queryParams.value, queryParams.value?.orderTimeRange, 'orderTime') || {};
     return params;
   }
@@ -433,9 +434,9 @@
 const handleLogItinerary = (row: any) => {
   optionType.value = 'view';
   boxTableOption.value = itineraryTableOption.value;
-  listTmsTrip({dispatchOrderId: row.dispatchId, pageNum: 1, pageSize: 999}).then(res => {
+  listTmsTrip({ dispatchOrderId: row.dispatchId, pageNum: 1, pageSize: 999 }).then(res => {
     boxTableData.value = res.rows || [];
-    pageF.open =  true;
+    pageF.open = true;
     pageF.title = '鏌ョ湅琛岀▼';
   })
 }
@@ -443,7 +444,7 @@
 const handleReceivableFeeView = (row: any) => {
   optionType.value = 'receivableFee';
   boxTableOption.value = YSGenerateItemTableOption.value;
-  getTmsReceivableFeeByDispatchNo(row.dispatchNo).then(res=>{
+  getTmsReceivableFeeByDispatchNo(row.dispatchNo).then(res => {
     form.value = res.data || {};
     boxTableData.value = form.value.items || [];
     pageF.open = true;
@@ -455,7 +456,7 @@
   optionType.value = 'payableFee';
   boxTableOption.value = YFGenerateTableOption.value;
   boxItemTableOption.value = YFGenerateItemTableOption.value;
-  getTmsPayableFeeByDispatchNo(row.dispatchNo).then(res=>{
+  getTmsPayableFeeByDispatchNo(row.dispatchNo).then(res => {
     boxTableData.value = res.data || [];
     pageF.open = true;
     pageF.title = '搴斾粯璐圭敤鏄庣粏';
@@ -464,16 +465,65 @@
 
   })
 }
+// 鎺у埗澶囨敞寮圭獥鏄剧ず
+const remarkBox = reactive({
+  open: false,
+  title: '澶囨敞璁板綍',
+  content: '', // 鏂板澶囨敞鐨勫唴瀹�
+  list: []    // 澶囨敞鍘嗗彶鍒楄〃
+});
 
+const activeRow = ref({}); // 褰撳墠鎿嶄綔鐨勮
+
+// 鐐瑰嚮澶囨敞鍒楄Е鍙�
+const handleRemarkClick = (row) => {
+  activeRow.value = row;
+  remarkBox.content = ''; // 娓呯┖杈撳叆妗�
+  remarkBox.open = true;
+  remarkBox.list = [
+  ];
+  listDispatchFeeSummaryViLog({ headId: row.dispatchId }).then(res => remarkBox.list = res.rows || []);
+  // getRemarkHistory(row.id).then(res => remarkBox.list = res.data);
+
+};
+
+// 寮圭獥鐐瑰嚮纭畾鐨勯�昏緫
+const submitRemark = () => {
+  if (!remarkBox.content) {
+    // return ElMessage.warning('璇疯緭鍏ュ娉ㄥ唴瀹�');
+    return proxy.$modal.msgWarning("璇疯緭鍏ュ娉ㄥ唴瀹�");
+
+  }
+  // 鏇存柊鍓嶇琛ㄦ牸鏄剧ず锛堝疄闄呭簲璋冪敤淇濆瓨鎺ュ彛鍚庡埛鏂帮級
+
+  // 璋冪敤鍚庣鎺ュ彛绀轰緥锛�
+  // saveRemark({ id: activeRow.value.id, remark: remarkBox.content }).then(...)
+  tmsDispatchFeeSummaryViNote({ dispatchId: activeRow.value.dispatchId, remark: remarkBox.content }).then((res) => {
+    if (res.code == 200) {
+      //  remarkBox.open = false;
+      listDispatchFeeSummaryViLog({ headId: activeRow.value.dispatchId }).then((res1) => {
+        if (res1.code == 200) {
+          remarkBox.list = res1.rows || [];
+          remarkBox.content = ''; // 娓呯┖杈撳叆妗�
+          proxy.$modal.msgSuccess(res.msg);
+
+        }
+      });
+      // activeRow.value.remark = remarkBox.content; // 鏇存柊琛ㄦ牸鏄剧ず
+    }
+    // ElMessage.success('澶囨敞宸叉洿鏂�');
+  });
+};
 
 </script>
 <style scoped lang="scss">
-.hot{
+.hot {
   cursor: pointer;
   text-align: left;
   color: #409eff;
-  &:hover{
-   color: #f0ad4e;
+
+  &:hover {
+    color: #f0ad4e;
   }
 }
 </style>
diff --git a/ui/admin-ui3/src/views/tms/tmsDispatchOrder/index.vue b/ui/admin-ui3/src/views/tms/tmsDispatchOrder/index.vue
index 051f5ba..a90207d 100644
--- a/ui/admin-ui3/src/views/tms/tmsDispatchOrder/index.vue
+++ b/ui/admin-ui3/src/views/tms/tmsDispatchOrder/index.vue
@@ -1,25 +1,10 @@
 <template>
   <basicContainer>
-    <avue-crud
-        :option="option"
-        :table-loading="pageF.loading"
-        :data="tableData"
-        :page="page"
-        :permission="permissionList"
-        :before-open="beforeOpen"
-        v-model="form" v-model:search="queryParams"
-        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"
-        @size-change="sizeChange"
-        @on-load="onLoad"
-    >
+    <avue-crud :option="option" :table-loading="pageF.loading" :data="tableData" :page="page"
+      :permission="permissionList" :before-open="beforeOpen" v-model="form" v-model:search="queryParams" 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" @size-change="sizeChange" @on-load="onLoad">
       <template #menu-left>
         <!--        <el-button-->
         <!--            type="success"-->
@@ -36,184 +21,161 @@
         <!--            v-hasPermi="['tms:tmsDispatchOrder:remove']"-->
         <!--        >鍒犻櫎-->
         <!--        </el-button>-->
-        <el-button
-            type="warning"
-            plain
-            icon="Download"
-            @click="handleExport"
-            v-hasPermi="['tms:tmsDispatchOrder:export']"
-        >瀵煎嚭
+        <el-button type="warning" plain icon="Download" @click="handleExport"
+          v-hasPermi="['tms:tmsDispatchOrder:export']">瀵煎嚭
         </el-button>
-        <el-button
-            type="info"
-            icon="Upload"
-            @click="handleImport"
-            v-hasPermi="['tms:tmsDispatchOrder:import']">瀵煎叆</el-button>
-<!--        <el-button-->
-<!--            type="success"-->
-<!--            icon="Promotion"-->
-<!--            :disabled="pageF.multiple"-->
-<!--            @click="handleGenerate"-->
-<!--            v-hasPermi="['tms:tmsDispatchOrder:generate']"-->
-<!--        >鐢熸垚搴旀敹搴斾粯璐圭敤-->
-<!--        </el-button>-->
-        <el-button
-            type="warning"
-            icon="Female"
-            :disabled="pageF.single"
-            @click="handleDropHook"
-            v-hasPermi="['tms:tmsDispatchOrder:dropHook']"
-        >鐢╂寕
+        <el-button type="info" icon="Upload" @click="handleImport"
+          v-hasPermi="['tms:tmsDispatchOrder:import']">瀵煎叆</el-button>
+        <el-button type="info" plain icon="Document" @click="handleImportLog">瀵煎叆鏃ュ織</el-button>
+        <!--        <el-button-->
+        <!--            type="success"-->
+        <!--            icon="Promotion"-->
+        <!--            :disabled="pageF.multiple"-->
+        <!--            @click="handleGenerate"-->
+        <!--            v-hasPermi="['tms:tmsDispatchOrder:generate']"-->
+        <!--        >鐢熸垚搴旀敹搴斾粯璐圭敤-->
+        <!--        </el-button>-->
+        <el-button type="warning" icon="Female" :disabled="pageF.single" @click="handleDropHook"
+          v-hasPermi="['tms:tmsDispatchOrder:dropHook']">鐢╂寕
         </el-button>
-        <el-button
-            type="primary"
-            icon="Male"
-            :disabled="pageF.single"
-            @click="handleConnectHang"
-            v-hasPermi="['tms:tmsDispatchOrder:connectHang']"
-        >鎺ユ寕
+        <el-button type="primary" icon="Male" :disabled="pageF.single" @click="handleConnectHang"
+          v-hasPermi="['tms:tmsDispatchOrder:connectHang']">鎺ユ寕
         </el-button>
 
-        <el-button
-            type="warning"
-            icon="Avatar"
-            :disabled="!( isCustoms == 0)"
-            @click="handleCustoms"
-            v-hasPermi="['tms:tmsDispatchOrder:customs']"
-        >濮旀墭鎶ュ叧淇℃伅
+        <el-button type="warning" icon="Avatar" :disabled="!(isCustoms == 0)" @click="handleCustoms"
+          v-hasPermi="['tms:tmsDispatchOrder:customs']">濮旀墭鎶ュ叧淇℃伅
         </el-button>
-        <el-button
-            type="primary"
-            icon="UserFilled"
-            :disabled="!( isLoad == 0)"
-            @click="handleLoading"
-            v-hasPermi="['tms:tmsDispatchOrder:loading']"
-        >濮旀墭鍗歌揣淇℃伅
+        <el-button type="primary" icon="UserFilled" :disabled="!(isLoad == 0)" @click="handleLoading"
+          v-hasPermi="['tms:tmsDispatchOrder:loading']">濮旀墭鍗歌揣淇℃伅
         </el-button>
-        <el-button
-            type="primary"
-            icon="UserFilled"
-            :disabled="pageF.single"
-            @click="handleZZ"
-            v-hasPermi="['tms:tmsDispatchOrder:zzdj']"
-        >澧炲�间綔涓氱櫥璁�
+        <el-button type="primary" icon="UserFilled" :disabled="pageF.single" @click="handleZZ"
+          v-hasPermi="['tms:tmsDispatchOrder:zzdj']">澧炲�间綔涓氱櫥璁�
         </el-button>
-        <el-button
-            type="primary"
-            icon="Printer"
-            :disabled="pageF.single"
-            @click="handlePrint"
-            v-hasPermi="['tms:tmsDispatchOrder:print']"
-        >鎵胯繍鍗曟墦鍗�
+        <el-button type="primary" icon="Printer" :disabled="pageF.single" @click="handlePrint"
+          v-hasPermi="['tms:tmsDispatchOrder:print']">鎵胯繍鍗曟墦鍗�
         </el-button>
-        <el-button
-            type="primary"
-            icon="UserFilled"
-            :disabled="!zxhdjSingle"
-            @click="handleZXHDJ"
-            v-hasPermi="['tms:tmsDispatchOrder:zzdj']"
-        >瑁呭嵏璐х偣鐧昏
+        <el-button type="primary" icon="UserFilled" :disabled="!zxhdjSingle" @click="handleZXHDJ"
+          v-hasPermi="['tms:tmsDispatchOrder:zzdj']">瑁呭嵏璐х偣鐧昏
         </el-button>
-      </template>
-      <template #menu-before="{row}">
-        <el-link size="small" type="primary" @click="handleAddGoods(row)" class="link-btn"
-                 v-hasPermi="['tms:tmsGoodsDetail:add']" v-if="[0,1,2].includes(row.status)"
-                 :underline="false" icon="el-icon-document-add">杩愯緭璐у搧鐧昏
-        </el-link>
-        <el-link size="small" type="primary" @click="handleActual(row)" class="link-btn"
-                 v-hasPermi="['tms:tmsDispatchOrder:update']" v-if="[0,1,2].includes(row.status)"
-                 :underline="false" icon="el-icon-set-up">瀹為檯杩愯緭璁板綍
-        </el-link>
-        <el-link size="small" type="primary" v-if="row.status == 0" @click="handleConfirm(row)" class="link-btn"
-                 v-hasPermi="['tms:tmsDispatchOrder:confirmOrder']"
-                 :underline="false" icon="el-icon-pointer">纭畾
-        </el-link>
-        <el-link size="small" type="primary" v-if="[0,1,2].includes(row.status)" @click="handleClose(row)" class="link-btn"
-                 v-hasPermi="['tms:tmsDispatchOrder:closeOrder']"
-                 :underline="false" icon="el-icon-close">浣滃簾
-        </el-link>
-        <el-link size="small" type="primary" @click="handleCopy(row)" class="link-btn" :underline="false"
-                 v-hasPermi="['tms:tmsDispatchOrder:copyOrder']"
-                 icon="el-icon-connection">澶嶅埗
-        </el-link>
-        <el-link size="small" type="primary" v-if="[1,2].includes(row.status)" @click="handleUploadItinerary(row)"
-                 v-hasPermi="['tms:tmsTrip:add']"
-                 class="link-btn" :underline="false" icon="el-icon-upload">涓婁紶琛岀▼
-        </el-link>
-        <el-link size="small" type="primary" v-if="![0,1].includes(row.status)" @click="handleLogItinerary(row)"
-                 v-hasPermi="['tms:tmsTrip:list']"
-                 class="link-btn" :underline="false" icon="el-icon-view">鏌ョ湅琛岀▼
-        </el-link>
-        <el-link size="small" type="primary" v-if="[2].includes(row.status)" @click="handleOk(row)" class="link-btn"
-                 v-hasPermi="['tms:tmsDispatchOrder:okOrder']"
-                 :underline="false" icon="el-icon-circle-check">瀹屾垚琛岀▼
-        </el-link>
-<!--        <el-link size="small" type="primary" v-if="[2,3].includes(row.status)" @click="handleAddFinance(row)"-->
-<!--                 class="link-btn" v-hasPermi="['tms:tmsFinanceDetail:add']"-->
-<!--                 :underline="false" icon="el-icon-edit-pen">璐圭敤鐧昏-->
-<!--        </el-link>-->
-      </template>
-      <template #menu="{row}">
-        <el-link size="small" type="primary" @click="handleLog(row)" class="link-btn" :underline="false"
-                 icon="el-icon-tickets">鏃ュ織
-        </el-link>
       </template>
 
-      <template #shipperId-form="{disabled}">
+      <template #loadingServiceProviderName="{ row }">
+        <template v-if="String(row.isCustoms).trim() === '0' && !row.loadingServiceProviderName">
+          <el-link type="primary" underline="never" @click="handleCustomsAdd(row)"
+            style="font-weight: bold; cursor: pointer; color: #409eff;">
+            寰呮坊鍔�
+          </el-link>
+        </template>
+
+        <template v-else>
+          <span>{{ row.loadingServiceProviderName }}</span>
+        </template>
+      </template>
+
+      <!-- 鍗歌揣鏈嶅姟 -->
+      <template #customsServiceProviderName="{ row }">
+        <template v-if="String(row.isLoad).trim() === '0' && !row.customsServiceProviderName">
+          <el-link type="primary" underline="never" @click="handleLoadingAdd(row)"
+            style="font-weight: bold; cursor: pointer; color: #409eff;">
+            寰呮坊鍔�
+          </el-link>
+        </template>
+
+        <template v-else>
+          <span>{{ row.customsServiceProviderName }}</span>
+        </template>
+      </template>
+
+
+
+      <template #menu="{ row, index, size }">
+        <el-tooltip content="鏌ョ湅" placement="top" :enterable="false">
+          <el-link type="primary" icon="el-icon-view" :underline="false" class="link-btn"
+            @click="$refs.crudRef.rowView(row, index)">
+          </el-link>
+        </el-tooltip>
+
+        <el-tooltip content="缂栬緫" placement="top" :enterable="false">
+          <el-link type="primary" icon="el-icon-edit" :underline="false" class="link-btn"
+            @click="$refs.crudRef.rowEdit(row, index)">
+          </el-link>
+        </el-tooltip>
+
+      </template>
+      <template #menu-before="{ row }">
+        <el-tooltip content="杩愯緭璐у搧鐧昏" placement="top">
+          <el-link size="small" type="primary" @click="handleAddGoods(row)" class="link-btn"
+            v-hasPermi="['tms:tmsGoodsDetail:add']" v-if="[0, 1, 2].includes(row.status)" :underline="false"
+            icon="el-icon-document-add">
+          </el-link>
+        </el-tooltip>
+
+        <el-tooltip content="瀹為檯杩愯緭璁板綍" placement="top">
+          <el-link size="small" type="primary" @click="handleActual(row)" class="link-btn"
+            v-hasPermi="['tms:tmsDispatchOrder:update']" v-if="[0, 1, 2].includes(row.status)" :underline="false"
+            icon="el-icon-set-up">
+          </el-link>
+        </el-tooltip>
+
+        <el-tooltip content="澶嶅埗" placement="top">
+          <el-link size="small" type="primary" @click="handleCopy(row)" class="link-btn" :underline="false"
+            v-hasPermi="['tms:tmsDispatchOrder:copyOrder']" icon="el-icon-connection">
+          </el-link>
+        </el-tooltip>
+        <el-tooltip content="鏃ュ織" placement="top">
+          <el-link size="small" type="primary" @click="handleLog(row)" class="link-btn" :underline="false"
+            icon="el-icon-tickets">
+          </el-link>
+        </el-tooltip>
+      </template>
+
+      <!-- <template #menu="{row}">
+
+</template> -->
+
+      <template #shipperId-form="{ disabled }">
         <div style="display:flex; align-items: center;justify-content: space-between">
-          <avue-input-table :props="consignorProps" dataType="string"
-                            :children="consignorOption" :disabled="disabled"
-                            :on-load="onShipperLoad" suffixIcon="search"
-                            v-model="form.shipperId" style="width: 80%"
-                            @change="changeShipper"
-                            placeholder="璇烽�夋嫨瑁呰揣鐐�"></avue-input-table>
-          <el-button icon="plus"  :disabled="disabled" @click="handleAddShipper"></el-button>
+          <avue-input-table :props="consignorProps" dataType="string" :children="consignorOption" :disabled="disabled"
+            :on-load="onShipperLoad" suffixIcon="search" v-model="form.shipperId" style="width: 80%"
+            @change="changeShipper" placeholder="璇烽�夋嫨瑁呰揣鐐�"></avue-input-table>
+          <el-button icon="plus" :disabled="disabled" @click="handleAddShipper"></el-button>
         </div>
       </template>
-      <template #receiverId-form="{disabled}">
+      <template #receiverId-form="{ disabled }">
         <div style="display:flex; align-items: center;justify-content: space-between">
-          <avue-input-table :props="consignorProps"
-                            :children="consignorOption" dataType="string"
-                            :on-load="onConsignorLoad" suffixIcon="search"
-                            v-model="form.receiverId"  :disabled="disabled"
-                            @change="changeReceiver" style="width: 80%"
-                            placeholder="璇烽�夋嫨鍗歌揣鐐�"></avue-input-table>
-          <el-button icon="plus"  :disabled="disabled" @click="handleAddReceiver"></el-button>
+          <avue-input-table :props="consignorProps" :children="consignorOption" dataType="string"
+            :on-load="onConsignorLoad" suffixIcon="search" v-model="form.receiverId" :disabled="disabled"
+            @change="changeReceiver" style="width: 80%" placeholder="璇烽�夋嫨鍗歌揣鐐�"></avue-input-table>
+          <el-button icon="plus" :disabled="disabled" @click="handleAddReceiver"></el-button>
         </div>
       </template>
 
     </avue-crud>
     <el-dialog :title="pageF.title" v-model="pageF.open" class="avue-dialog avue-dialog--top" width="80%">
       <h2 v-if="optionType == 'addFinance'">鎶ヤ环璐圭敤</h2>
-      <avue-crud v-if="optionType == 'addFinance'"
-                 :option="itemsTableOption"
-                 :data="itemsTableData"
-                 @selection-change="selectionChange2"
-      >
-        <template #count="{row}">
+      <avue-crud v-if="optionType == 'addFinance'" :option="itemsTableOption" :data="itemsTableData"
+        @selection-change="selectionChange2">
+        <template #count="{ row }">
           <el-input-number v-model="row.count" @change="countChange(row)" placeholder="璇疯緭鍏ヨ璐规暟閲�"
-                           min="0"></el-input-number>
+            min="0"></el-input-number>
         </template>
       </avue-crud>
-      <h2 v-if="optionType == 'addFinance'">瀹炴姤瀹為攢璐圭敤</h2>
+      <h2 v-if="optionType == 'addFinance'">瀹炴姤瀹為攢璐圭敤1</h2>
       <avue-form v-if="optionType == 'addItinerary' || optionType == 'addFinance'" v-model="boxForm" ref="boxFormRef"
-                 :option="boxFormOption">
+        :option="boxFormOption">
 
       </avue-form>
-      <avue-crud
-          :option="boxTableOption"
-          :data="boxTableData"
-      >
+      <avue-crud :option="boxTableOption" :data="boxTableData">
       </avue-crud>
       <template #footer>
         <div class="dialog-footer">
           <el-button type="primary" v-if="optionType == 'addItinerary' || optionType == 'addFinance'"
-                     :loading="pageF.isUploading" @click="submitForm">
+            :loading="pageF.isUploading" @click="submitForm">
             {{ pageF.isUploading ? '鎻愪氦涓�' : '纭� 瀹�' }}
           </el-button>
 
-          <el-button type="primary" v-if="optionType == 'generate' " :loading="pageF.isUploading"
-                     @click="submitGenerate">
+          <el-button type="primary" v-if="optionType == 'generate'" :loading="pageF.isUploading"
+            @click="submitGenerate">
             {{ pageF.isUploading ? '鐢熸垚涓�' : '鐢熸垚璐圭敤' }}
           </el-button>
           <el-button @click="cancelBox">鍙� 娑�</el-button>
@@ -223,10 +185,7 @@
 
     <el-dialog :title="title" v-model="open" class="avue-dialog avue-dialog--top" width="40%">
       <div v-if="optionType === 'dropHook'">
-        <el-descriptions
-            :column="2"
-            border
-        >
+        <el-descriptions :column="2" border>
           <el-descriptions-item label="璋冨害鍗曞彿">{{ form.dispatchNo }}</el-descriptions-item>
           <el-descriptions-item label="瀹㈡埛">{{ form.customerName }}</el-descriptions-item>
           <el-descriptions-item label="娲惧嚭杞﹀瀷">{{ form.$actualVehicleType }}</el-descriptions-item>
@@ -237,10 +196,7 @@
         </el-descriptions>
       </div>
       <div v-if="optionType == 'connectHang'">
-        <el-descriptions style="margin-bottom: 20px"
-                         :column="2"
-                         border
-        >
+        <el-descriptions style="margin-bottom: 20px" :column="2" border>
           <el-descriptions-item label="璋冨害鍗曞彿">{{ form.dispatchNo }}</el-descriptions-item>
           <el-descriptions-item label="瀹㈡埛">{{ form.customerName }}</el-descriptions-item>
           <el-descriptions-item label="娲惧嚭杞﹀瀷">{{ form.$actualVehicleType }}</el-descriptions-item>
@@ -252,10 +208,7 @@
       </div>
 
       <div v-if="optionType == 'customs'">
-        <el-descriptions style="margin-bottom: 20px"
-                         :column="2"
-                         border
-        >
+        <el-descriptions style="margin-bottom: 20px" :column="2" border>
           <el-descriptions-item label="璋冨害鍗曞彿">{{ form.dispatchNo }}</el-descriptions-item>
           <el-descriptions-item label="瀹㈡埛">{{ form.customerName }}</el-descriptions-item>
           <el-descriptions-item label="椤圭洰鍚嶇О">{{ form.projectName }}</el-descriptions-item>
@@ -267,10 +220,7 @@
       </div>
 
       <div v-if="optionType == 'loading'">
-        <el-descriptions style="margin-bottom: 20px"
-                         :column="2"
-                         border
-        >
+        <el-descriptions style="margin-bottom: 20px" :column="2" border>
           <el-descriptions-item label="璋冨害鍗曞彿">{{ form.dispatchNo }}</el-descriptions-item>
           <el-descriptions-item label="瀹㈡埛">{{ form.customerName }}</el-descriptions-item>
           <el-descriptions-item label="椤圭洰鍚嶇О">{{ form.projectName }}</el-descriptions-item>
@@ -292,14 +242,8 @@
 
 
     <el-dialog title="璐у搧淇℃伅鐧昏" v-model="open2" class="avue-dialog avue-dialog--top" width="80%">
-      <avue-crud
-          :option="goodsTableOption"
-          v-model="goodsForm"
-          @row-update="rowGoodsUpdate"
-          @row-save="rowGoodsSave"
-          @row-del="rowGoodsDel"
-          :data="goodsTableData" ref="goodsCrudRef"
-      >
+      <avue-crud :option="goodsTableOption" v-model="goodsForm" @row-update="rowGoodsUpdate" @row-save="rowGoodsSave"
+        @row-del="rowGoodsDel" :data="goodsTableData" ref="goodsCrudRef">
       </avue-crud>
       <!--      <template #footer>-->
       <!--        <div class="dialog-footer">-->
@@ -312,9 +256,7 @@
     </el-dialog>
 
     <el-dialog title="瀹為檯杩愯緭淇℃伅" v-model="open3" class="avue-dialog avue-dialog--top" width="80%">
-      <avue-form v-model="actualForm"
-                 ref="actualFormRef"
-                 :option="actualFormOption">
+      <avue-form v-model="actualForm" ref="actualFormRef" :option="actualFormOption">
 
       </avue-form>
       <template #footer>
@@ -331,47 +273,59 @@
 
     <el-dialog title="澧炲�间綔涓氱櫥璁�" v-model="open4" class="avue-dialog avue-dialog--top" width="80%">
       <el-descriptions :column="3" border>
-        <el-descriptions-item label="璋冨害鍗曞彿">{{form.dispatchNo}}</el-descriptions-item>
-        <el-descriptions-item label="瀹㈡埛鍚嶇О">{{form.customerName}}</el-descriptions-item>
-        <el-descriptions-item label="椤圭洰鍚嶇О">{{form.projectName}}</el-descriptions-item>
-        <el-descriptions-item label="杩愯緭璺嚎">{{form.transportLine}}</el-descriptions-item>
-        <el-descriptions-item label="杞﹀瀷">{{form.$actualVehicleType}}</el-descriptions-item>
-        <el-descriptions-item label="杞︾墝">{{form.licensePlate}}</el-descriptions-item>
+        <el-descriptions-item label="璋冨害鍗曞彿">{{ form.dispatchNo }}</el-descriptions-item>
+        <el-descriptions-item label="瀹㈡埛鍚嶇О">{{ form.customerName }}</el-descriptions-item>
+        <el-descriptions-item label="椤圭洰鍚嶇О">{{ form.projectName }}</el-descriptions-item>
+        <el-descriptions-item label="杩愯緭璺嚎">{{ form.transportLine }}</el-descriptions-item>
+        <el-descriptions-item label="杞﹀瀷">{{ form.$actualVehicleType }}</el-descriptions-item>
+        <el-descriptions-item label="杞︾墝">{{ form.licensePlate }}</el-descriptions-item>
       </el-descriptions>
-      <avue-tabs :option="tabsOption" ref="tabsOptionRef"
-                 @change="handleChange"></avue-tabs>
+      <avue-tabs :option="tabsOption" ref="tabsOptionRef" @change="handleChange"></avue-tabs>
 
-        <avue-crud v-if="active !== 'tab4'"
-            :option="zzItemsTableOption" ref="itemsTableRef"
-            :data="zzItemsTableData"
-        >
-          <template #count="{row}">
-            <el-input-number v-model="row.count" placeholder="璁¤垂鏁伴噺"
-                             :min="0"></el-input-number>
-          </template>
-          <template #remark="{row}">
-            <el-input v-model="row.remark" placeholder="澶囨敞" ></el-input>
-          </template>
+      <avue-crud v-if="active !== 'tab4'" :option="zzItemsTableOption" ref="itemsTableRef" :data="zzItemsTableData">
+        <template #count="{ row }">
+          <el-input-number v-model="row.count" placeholder="璁¤垂鏁伴噺" :min="0"></el-input-number>
+        </template>
+        <template #remark="{ row }">
+          <el-input v-model="row.remark" placeholder="澶囨敞"></el-input>
+        </template>
 
 
-        </avue-crud>
+      </avue-crud>
 
       <div v-if="active === 'tab4'">
         <h2>瀹炴姤瀹為攢璐圭敤</h2>
-        <avue-form  v-model="boxForm" ref="boxFormRef"
-                    :option="boxFormOption">
+        <!-- <avue-form v-model="boxForm" ref="boxFormRef" :option="boxFormOption">
 
-        </avue-form>
-        <avue-crud
-            :option="boxTableOption"
-            :data="boxTableData"
-        >
+        </avue-form> -->
+        <avue-crud :option="expenditureTableOption" :data="tmsFinanceDetails">
+          <template #actualFeeAmount="{ row }">
+            <el-input-number v-model="row.actualFeeAmount" :precision="2" :min="0" controls-position="right"
+              placeholder="杈撳叆閲戦" style="width: 100%" />
+          </template>
+
+          <template #currency="{ row }">
+            <el-radio-group v-model="row.currency">
+              <el-radio v-for="item in sys_currency" :key="item.value" :label="item.value">
+                {{ item.label }}
+              </el-radio>
+            </el-radio-group>
+          </template>
+          <template #voucherUrl="{ row }">
+            <avue-upload v-model="row.voucherUrl" :action="'/common/upload2'" type="upload" accept="image/*"
+              @upload-after="(res, done, loading, column) => handleUploadAfter(res, done, loading, column, row)"></avue-upload>
+          </template>
+          <template #remark="{ row }">
+            <el-input v-model="row.remark" placeholder="濉啓澶囨敞" clearable />
+          </template>
+        </avue-crud>
+        <avue-crud :option="boxTableOption" :data="boxTableData">
+
         </avue-crud>
       </div>
       <template #footer>
         <div class="dialog-footer">
-          <el-button type="primary"
-                     :loading="pageF.isUploading" @click="submitTabForm">
+          <el-button type="primary" :loading="pageF.isUploading" @click="submitTabForm">
             {{ pageF.isUploading ? '鎻愪氦涓�' : '纭� 瀹�' }}
           </el-button>
 
@@ -382,22 +336,20 @@
 
     <el-dialog title="璋冨害鍗曚綔搴�" v-model="open5" class="avue-dialog avue-dialog--top" width="80%">
       <el-descriptions :column="3" border>
-        <el-descriptions-item label="璋冨害鍗曞彿">{{form.dispatchNo}}</el-descriptions-item>
-        <el-descriptions-item label="瀹㈡埛鍚嶇О">{{form.customerName}}</el-descriptions-item>
-        <el-descriptions-item label="椤圭洰鍚嶇О">{{form.projectName}}</el-descriptions-item>
-        <el-descriptions-item label="杩愯緭璺嚎">{{form.transportLine}}</el-descriptions-item>
-        <el-descriptions-item label="杞﹀瀷">{{form.$actualVehicleType}}</el-descriptions-item>
-        <el-descriptions-item label="杞︾墝">{{form.licensePlate}}</el-descriptions-item>
+        <el-descriptions-item label="璋冨害鍗曞彿">{{ form.dispatchNo }}</el-descriptions-item>
+        <el-descriptions-item label="瀹㈡埛鍚嶇О">{{ form.customerName }}</el-descriptions-item>
+        <el-descriptions-item label="椤圭洰鍚嶇О">{{ form.projectName }}</el-descriptions-item>
+        <el-descriptions-item label="杩愯緭璺嚎">{{ form.transportLine }}</el-descriptions-item>
+        <el-descriptions-item label="杞﹀瀷">{{ form.$actualVehicleType }}</el-descriptions-item>
+        <el-descriptions-item label="杞︾墝">{{ form.licensePlate }}</el-descriptions-item>
       </el-descriptions>
 
-      <avue-form  v-model="boxForm" ref="boxFormRef"
-                  :option="boxFormOption">
+      <avue-form v-model="boxForm" ref="boxFormRef" :option="boxFormOption">
 
       </avue-form>
       <template #footer>
         <div class="dialog-footer">
-          <el-button type="primary"
-                     :loading="pageF.isUploading" @click="submitForm5">
+          <el-button type="primary" :loading="pageF.isUploading" @click="submitForm5">
             {{ pageF.isUploading ? '鎻愪氦涓�' : '纭� 瀹�' }}
           </el-button>
 
@@ -409,32 +361,31 @@
     <el-dialog title="鎵胯繍鍗曟墦鍗�" v-model="open6" class="avue-dialog avue-dialog--top cydprint" width="80%">
       <div v-if="print == 0">
         <el-descriptions :column="3" border>
-          <el-descriptions-item label="璁㈠崟鍙�">{{form.dispatchNo}}</el-descriptions-item>
-          <el-descriptions-item label="鎵胯繍鏃ユ湡">{{form.orderTime}}</el-descriptions-item>
-          <el-descriptions-item label="杞︾墝">{{form.licensePlate}}</el-descriptions-item>
-          <el-descriptions-item label="璁㈣溅绫诲瀷">{{form.$actualVehicleType}}</el-descriptions-item>
+          <el-descriptions-item label="璁㈠崟鍙�">{{ form.dispatchNo }}</el-descriptions-item>
+          <el-descriptions-item label="鎵胯繍鏃ユ湡">{{ form.orderTime }}</el-descriptions-item>
+          <el-descriptions-item label="杞︾墝">{{ form.licensePlate }}</el-descriptions-item>
+          <el-descriptions-item label="璁㈣溅绫诲瀷">{{ form.$actualVehicleType }}</el-descriptions-item>
 
-          <el-descriptions-item label="鍙告満濮撳悕">{{form.mainDriverName}}</el-descriptions-item>
-          <el-descriptions-item label="鐢佃瘽">{{form.mainDriverMobile}}</el-descriptions-item>
-          <el-descriptions-item label="鎵樻灦鍙�/鏌滃彿">{{form.shelfCode}}/ {{form.containerNo}}</el-descriptions-item>
-          <el-descriptions-item label="瀹㈡埛鍚嶇О">{{form.customerName}}</el-descriptions-item>
-          <el-descriptions-item label="璧锋璺嚎">{{form.transportLine}}</el-descriptions-item>
-          <el-descriptions-item label="璋冨害鍛�">{{form.createBy}}</el-descriptions-item>
-          <el-descriptions-item label="鏄惁鎵撳嵃">{{form.$isPrint}}</el-descriptions-item>
-          <el-descriptions-item label="鍘嗗彶鎵撳嵃娆℃暟">{{form.printCount}}</el-descriptions-item>
+          <el-descriptions-item label="鍙告満濮撳悕">{{ form.mainDriverName }}</el-descriptions-item>
+          <el-descriptions-item label="鐢佃瘽">{{ form.mainDriverMobile }}</el-descriptions-item>
+          <el-descriptions-item label="鎵樻灦鍙�/鏌滃彿">{{ form.shelfCode }}/ {{ form.containerNo }}</el-descriptions-item>
+          <el-descriptions-item label="瀹㈡埛鍚嶇О">{{ form.customerName }}</el-descriptions-item>
+          <el-descriptions-item label="璧锋璺嚎">{{ form.transportLine }}</el-descriptions-item>
+          <el-descriptions-item label="璋冨害鍛�">{{ form.createBy }}</el-descriptions-item>
+          <el-descriptions-item label="鏄惁鎵撳嵃">{{ form.$isPrint }}</el-descriptions-item>
+          <el-descriptions-item label="鍘嗗彶鎵撳嵃娆℃暟">{{ form.printCount }}</el-descriptions-item>
         </el-descriptions>
         <h3 class="title" style="color: #333;font-weight: bold;">鍗曟嵁淇℃伅</h3>
-        <avue-form  v-model="boxForm" ref="boxFormRef"
-                    :option="boxFormOption">
+        <avue-form v-model="boxForm" ref="boxFormRef" :option="boxFormOption">
 
         </avue-form>
       </div>
       <div v-else>
         <div id="print">
           <img src="@/assets/img.png" alt="" style="width: 168px;height: 68px">
-          <h3 class="title" >鐝犳捣甯傛眹鐣呬氦閫氭姇璧勬湁闄愬叕鍙�</h3>
+          <h3 class="title">鐝犳捣甯傛眹鐣呬氦閫氭姇璧勬湁闄愬叕鍙�</h3>
           <div class="header">
-            <div class="order">璁㈠崟鍙凤細{{boxForm.dispatchNo}}</div>
+            <div class="order">璁㈠崟鍙凤細{{ boxForm.dispatchNo }}</div>
             <div class="sub-title">璐х墿鎵胯繍鍗曡瘉</div>
           </div>
           <table>
@@ -444,7 +395,7 @@
             </tr>
             <tr>
               <td>杞︾墝锛歿{ boxForm.licensePlate }}</td>
-              <td>璁㈣溅杞﹀瀷: {{boxForm.$actualVehicleType}}</td>
+              <td>璁㈣溅杞﹀瀷: {{ boxForm.$actualVehicleType }}</td>
             </tr>
             <tr>
               <td>鍙告満濮撳悕锛歿{ boxForm.mainDriverName }}</td>
@@ -452,7 +403,7 @@
             </tr>
 
             <tr>
-              <td>鎵樻灦鍙�/鏌滃彿锛歿{boxForm.shelfCode}}/ {{boxForm.containerNo}}</td>
+              <td>鎵樻灦鍙�/鏌滃彿锛歿{ boxForm.shelfCode }}/ {{ boxForm.containerNo }}</td>
               <td>琛岄┒鍙e哺锛歿{ boxForm.portName }}</td>
             </tr>
             <tr>
@@ -462,7 +413,7 @@
 
             <tr>
               <td>瀹㈡埛锛歿{ boxForm.customerName }}</td>
-              <td>鑱旂粶浜猴細{{ boxForm.contactName }} {{ boxForm.contactPhone }}  </td>
+              <td>鑱旂粶浜猴細{{ boxForm.contactName }} {{ boxForm.contactPhone }} </td>
             </tr>
             <tr>
               <td colspan="2">
@@ -476,8 +427,8 @@
             </tr>
             <tr>
               <td>
-                <div style="line-height: 24px">璋冨害鍛橈細{{boxForm.createBy}}</div>
-                <div style="line-height: 42px">鎵胯繍鍙告満锛歿{boxForm.mainDriverName}}</div>
+                <div style="line-height: 24px">璋冨害鍛橈細{{ boxForm.createBy }}</div>
+                <div style="line-height: 42px">鎵胯繍鍙告満锛歿{ boxForm.mainDriverName }}</div>
               </td>
               <td>鏀惰揣浜虹瀛�/鐩栫珷锛�</td>
             </tr>
@@ -489,7 +440,7 @@
           <div>3.涓�鍒囦氦鏄撳潎鎸夋湰鍏徃涔嬫爣鍑嗙粡钀ユ潯娆句负鍑嗭紝鏈叕鍙镐箣璐d换鍦ㄦ煇浜涙儏鍐典笅浼氳璞佸厤鎴栭檺 (鍒跺鏈夐』瑕侊紝娆㈣繋绱㈠彇)锛�</div>
 
         </div>
-      
+
       </div>
 
 
@@ -497,9 +448,8 @@
       <template #footer>
         <div class="dialog-footer">
           <el-button @click="print = 0" v-if="print == 1">閲嶆柊濉啓</el-button>
-          <el-button type="primary"
-                     :loading="pageF.isUploading" @click="submitForm6">
-            {{ pageF.isUploading ? '鎻愪氦涓�' : '纭� 瀹�' }}
+          <el-button type="primary" :loading="pageF.isUploading" @click="submitForm6">
+            {{ pageF.isUploading ? '鎻愪氦涓�' : '纭� 瀹�2' }}
           </el-button>
 
           <el-button @click="open6 = false">鍙� 娑�</el-button>
@@ -509,24 +459,16 @@
 
     <!-- 鐢ㄦ埛瀵煎叆瀵硅瘽妗� -->
     <el-dialog title="璋冨害鍗曞鍏�" v-model="upload.open" width="400px" append-to-body>
-      <el-upload
-          ref="uploadRef"
-          :limit="1"
-          accept=".xlsx, .xls"
-          :headers="upload.headers"
-          :action="upload.url + '?updateSupport=' + upload.updateSupport"
-          :disabled="upload.isUploading"
-          :on-progress="handleFileUploadProgress"
-          :on-success="handleFileSuccess"
-          :auto-upload="false"
-          drag
-      >
+      <el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers"
+        :action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading"
+        :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
         <el-icon class="el-icon--upload"><upload-filled /></el-icon>
         <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
         <template #tip>
           <div class="el-upload__tip text-center">
             <span>浠呭厑璁稿鍏ls銆亁lsx鏍煎紡鏂囦欢銆�</span>
-            <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" @click="importTemplate">涓嬭浇妯℃澘</el-link>
+            <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;"
+              @click="importTemplate">涓嬭浇妯℃澘</el-link>
           </div>
         </template>
       </el-upload>
@@ -540,49 +482,36 @@
 
 
     <el-dialog title="棰勯厤璁㈠崟瑁呭嵏璐х偣鐧昏" v-model="open7" class="avue-dialog avue-dialog--top" width="80%">
-      <avue-form v-model="shipperReceiverForm"
-                 ref="shipperReceiverFormRef"
-                 :option="shipperReceiverFormOption">
-        <template #dispatchNos="{disabled}">
-            <div class="dispatchNos">
-              <el-tag
-                  v-for="tag in shipperReceiverForm.dispatchNos"
-                  :key="tag"
-                  closable
-                  @close="handleCloseDispatchNo(tag)"
-              >
-                {{ tag }}
-              </el-tag>
-            </div>
+      <avue-form v-model="shipperReceiverForm" ref="shipperReceiverFormRef" :option="shipperReceiverFormOption">
+        <template #dispatchNos="{ disabled }">
+          <div class="dispatchNos">
+            <el-tag v-for="tag in shipperReceiverForm.dispatchNos" :key="tag" closable
+              @close="handleCloseDispatchNo(tag)">
+              {{ tag }}
+            </el-tag>
+          </div>
 
         </template>
-        <template #shipperId="{disabled}">
+        <template #shipperId="{ disabled }">
           <div style="display:flex; align-items: center;justify-content: space-between">
-            <avue-input-table :props="consignorProps" dataType="string"
-                              :children="consignorOption" :disabled="disabled"
-                              :on-load="onShipperLoad" suffixIcon="search"
-                              v-model="shipperReceiverForm.shipperId" style="width: 80%"
-                              @change="changeShipper2"
-                              placeholder="璇烽�夋嫨瑁呰揣鐐�"></avue-input-table>
-            <el-button icon="plus"  :disabled="disabled" @click="handleAddShipper2"></el-button>
+            <avue-input-table :props="consignorProps" dataType="string" :children="consignorOption" :disabled="disabled"
+              :on-load="onShipperLoad" suffixIcon="search" v-model="shipperReceiverForm.shipperId" style="width: 80%"
+              @change="changeShipper2" placeholder="璇烽�夋嫨瑁呰揣鐐�"></avue-input-table>
+            <el-button icon="plus" :disabled="disabled" @click="handleAddShipper2"></el-button>
           </div>
         </template>
-        <template #receiverId="{disabled}">
+        <template #receiverId="{ disabled }">
           <div style="display:flex; align-items: center;justify-content: space-between">
-            <avue-input-table :props="consignorProps"
-                              :children="consignorOption" dataType="string"
-                              :on-load="onConsignorLoad" suffixIcon="search"
-                              v-model="shipperReceiverForm.receiverId"  :disabled="disabled"
-                              @change="changeReceiver2" style="width: 80%"
-                              placeholder="璇烽�夋嫨鍗歌揣鐐�"></avue-input-table>
-            <el-button icon="plus"  :disabled="disabled" @click="handleAddReceiver2"></el-button>
+            <avue-input-table :props="consignorProps" :children="consignorOption" dataType="string"
+              :on-load="onConsignorLoad" suffixIcon="search" v-model="shipperReceiverForm.receiverId"
+              :disabled="disabled" @change="changeReceiver2" style="width: 80%" placeholder="璇烽�夋嫨鍗歌揣鐐�"></avue-input-table>
+            <el-button icon="plus" :disabled="disabled" @click="handleAddReceiver2"></el-button>
           </div>
         </template>
       </avue-form>
       <template #footer>
         <div class="dialog-footer">
-          <el-button type="primary"
-                     :loading="pageF.isUploading" @click="submitZxForm">
+          <el-button type="primary" :loading="pageF.isUploading" @click="submitZxForm">
             {{ pageF.isUploading ? '鎻愪氦涓�' : '纭� 瀹�' }}
           </el-button>
 
@@ -591,6 +520,10 @@
       </template>
     </el-dialog>
 
+    <el-dialog title="瀵煎叆鏃ュ織" v-model="importLogVisible" width="80%">
+      <avue-crud :data="importLogData" :option="importLogOption" :table-loading="importLogLoading"
+        @on-load="getImportLogList"></avue-crud>
+    </el-dialog>
   </basicContainer>
 </template>
 
@@ -615,46 +548,50 @@
   checkCloseOrder,
   closeOrder,
   printDispatchOrder,
-  importTemplateTmsDispatchOrder,ypdddjSumbit
+  importTemplateTmsDispatchOrder, ypdddjSumbit,
+  tmsTmsDispatchOrderImportLog,
+  saveTmsFinanceDetail2
 } from "@/api/tms/tmsDispatchOrder";
 import useCurrentInstance from "@/utils/useCurrentInstance";
-import {computed, onMounted, reactive, ref, toRefs, watch, getCurrentInstance, nextTick} from "vue";
-import {PagesInterface, PageQueryInterface} from "@/utils/globalInterface";
-import {usePagePlus} from "@/hooks/usePagePlus";
-import {hasPermission} from "@/utils/permissionUtils";
-import {getTmsProject, listTmsProject} from "@/api/tms/tmsProject";
-import {getTmsServiceProvider, listTmsServiceProvider} from "@/api/tms/tmsServiceProvider";
-import {getTmsLoadingServiceProvider, listTmsLoadingServiceProvider} from "@/api/tms/tmsLoadingServiceProvider";
-import {getTmsCustomsServiceProvider, listTmsCustomsServiceProvider} from "@/api/tms/tmsCustomsServiceProvider";
-import {getTmsDriver, listTmsDriver} from "@/api/tms/tmsDriver";
-import {getTmsVehicle, listTmsVehicle} from "@/api/tms/tmsVehicle";
-import {getTmsContainer, listTmsContainer} from "@/api/tms/tmsContainer";
-import {getTmsShelf, listTmsShelf} from "@/api/tms/tmsShelf";
-import {addTmsConsignor, getTmsConsignor, listTmsConsignor} from "@/api/tms/tmsConsignor";
-import {ElMessage, ElMessageBox, type ElUpload} from "element-plus";
-import {addTmsTrip, listTmsTrip} from "@/api/tms/tmsTrip";
+import { computed, onMounted, reactive, ref, toRefs, watch, getCurrentInstance, nextTick } from "vue";
+import { PagesInterface, PageQueryInterface } from "@/utils/globalInterface";
+import { usePagePlus } from "@/hooks/usePagePlus";
+import { hasPermission } from "@/utils/permissionUtils";
+import { getTmsProject, listTmsProject } from "@/api/tms/tmsProject";
+import { getTmsServiceProvider, listTmsServiceProvider } from "@/api/tms/tmsServiceProvider";
+import { getTmsLoadingServiceProvider, listTmsLoadingServiceProvider } from "@/api/tms/tmsLoadingServiceProvider";
+import { getTmsCustomsServiceProvider, listTmsCustomsServiceProvider } from "@/api/tms/tmsCustomsServiceProvider";
+import { getTmsDriver, listTmsDriver } from "@/api/tms/tmsDriver";
+import { getTmsVehicle, listTmsVehicle } from "@/api/tms/tmsVehicle";
+import { getTmsContainer, listTmsContainer } from "@/api/tms/tmsContainer";
+import { getTmsShelf, listTmsShelf } from "@/api/tms/tmsShelf";
+import { addTmsConsignor, getTmsConsignor, listTmsConsignor } from "@/api/tms/tmsConsignor";
+import { ElMessage, ElMessageBox, type ElUpload } from "element-plus";
+import { addTmsTrip, listTmsTrip } from "@/api/tms/tmsTrip";
 import {
   addTmsFinanceDetail,
   listTmsFinanceDetail,
   saveTmsFinanceDetail,
   updateTmsFinanceDetail
 } from "@/api/tms/tmsFinanceDetail";
-import {getTmsProductInfo, listTmsProductInfo} from "@/api/tms/tmsProductInfo";
-import {addTmsGoodsDetail, delTmsGoodsDetail, listTmsGoodsDetail, updateTmsGoodsDetail} from "@/api/tms/tmsGoodsDetail";
-import {getTransportRouteVi, listTransportRouteVi} from "@/api/tms/tmsTransportRouteVi";
-import {listTmsQuoteItem} from "@/api/tms/tmsQuotePlanItem";
-import {$DialogForm, randomId} from '@smallwei/avue'
-import {getTmsCustomerInfo, listTmsCustomerInfo} from "@/api/tms/tmsCustomerInfo";
-import {getAddressCode} from "@/api/tms/tmsRegion";
-import {mapRegeo} from "@/api/common";
-import {getDicts} from "@/api/system/dict/data";
-import {pushTmsQuoteFee} from "@/api/tms/tmsQuoteFee";
+import { getTmsProductInfo, listTmsProductInfo } from "@/api/tms/tmsProductInfo";
+import { addTmsGoodsDetail, delTmsGoodsDetail, listTmsGoodsDetail, updateTmsGoodsDetail } from "@/api/tms/tmsGoodsDetail";
+import { getTransportRouteVi, listTransportRouteVi } from "@/api/tms/tmsTransportRouteVi";
+import { listTmsQuoteItem } from "@/api/tms/tmsQuotePlanItem";
+import { $DialogForm, randomId } from '@smallwei/avue'
+import { getTmsCustomerInfo, listTmsCustomerInfo } from "@/api/tms/tmsCustomerInfo";
+import { getAddressCode } from "@/api/tms/tmsRegion";
+import { mapRegeo } from "@/api/common";
+import { getDicts } from "@/api/system/dict/data";
+import { pushTmsQuoteFee } from "@/api/tms/tmsQuoteFee";
 import { $Print } from '@smallwei/avue'
-import {getToken} from "@/utils/auth";
+import { getToken } from "@/utils/auth";
 
-const {appContext} = getCurrentInstance();
+const { appContext } = getCurrentInstance();
 
-const {proxy} = useCurrentInstance();
+const { proxy } = useCurrentInstance(
+);
+const { fee_type, sys_currency } = proxy.useDict('fee_type', 'sys_currency')
 const crudRef = ref();
 const boxFormRef = ref();
 const goodsCrudRef = ref();
@@ -696,20 +633,28 @@
   goodsForm: <any>{},
   open3: false,
   actualForm: <any>{},
-  isCustoms:<any> -1,
+  isCustoms: <any>-1,
   isLoad: -1,
-  open5:false,
-  open6:false,
-  open7:false,
-  zxhdjSingle:false,
+  open5: false,
+  open6: false,
+  open7: false,
+  zxhdjSingle: false,
 })
 const {
   queryParams, form, page, selectionList, open3,
   boxTableData, optionType,
   boxFormOption, boxForm, boxTableOption, title, open, open2,
-  goodsTableData, goodsForm, actualForm, selectionList2,isCustoms,isLoad,open5,open6,open7,zxhdjSingle
+  goodsTableData, goodsForm, actualForm, selectionList2, isCustoms, isLoad, open5, open6, open7, zxhdjSingle
 } = toRefs(data);
 const option = ref({
+  menuType: 'icon',
+  viewBtn: false, // 鍏抽棴鍘熺敓鏌ョ湅
+  editBtn: false, // 鍏抽棴鍘熺敓缂栬緫
+
+  searchIndex: 7, // 鍏抽敭锛氭姌鍙犳椂鏄剧ず鐨勪釜鏁帮紙鏍规嵁浣犵殑瀛楁鏁伴噺璋冩暣锛�
+  searchIcon: true, // 鍏抽敭锛氭樉绀烘姌鍙�/灞曞紑鎸夐挳
+  searchMenuSpan: 6, // 鎼滅储鎸夐挳鏍忓崰浣嶏紙鍙�夛級
+
   pageKey: 'TmsDispatchOrder',
   rowKey: 'id',
   labelWidth: 130,
@@ -732,7 +677,7 @@
               message: "璇烽�夋嫨杩愯緭璺嚎", trigger: "change"
             }
           ],
-          type: 'table', suffixIcon: 'search',dataType: 'string',
+          type: 'table', suffixIcon: 'search', dataType: 'string',
           change: (val: any) => {
             const table = crudRef.value?.getPropRef?.('quoteDetailId')?.$refs?.temp;
             if (!table) return;
@@ -799,7 +744,7 @@
             label: 'transportRoute',
             value: 'quoteDetailId'
           },
-          onLoad: ({page, value, data}: { page: any, value: any, data: any }, callback: any) => {
+          onLoad: ({ page, value, data }: { page: any, value: any, data: any }, callback: any) => {
             if (value) {
               let id = value;
               if (Array.isArray(value)) {
@@ -809,7 +754,7 @@
                 return callback(res.data || {})
               })
             } else {
-              listTransportRouteVi({pageSize: page.pageSize, pageNum: page.currentPage, ...data}).then(res => {
+              listTransportRouteVi({ pageSize: page.pageSize, pageNum: page.currentPage, ...data }).then(res => {
                 return callback({
                   total: res.total,
                   data: res.rows || [],
@@ -856,7 +801,7 @@
               message: "璁㈠崟绫诲瀷涓嶈兘涓虹┖", trigger: "change"
             }
           ],
-          change: ({value}: any) => {
+          change: ({ value }: any) => {
             option.value.group.forEach((item: any) => {
               if (item.prop == 'pcxx') {
                 item.column.shipperId.rules.forEach((cItem: any) => {
@@ -1046,7 +991,7 @@
           ],
         },
         isUrgent: {
-          label: '鏄惁绱ф��',value: '1',
+          label: '鏄惁绱ф��', value: '1',
           display: true,
           type: 'radio', dicUrl: '/system/dict/data/type/sys_number_is', dataType: 'string',
           rules: [
@@ -1121,7 +1066,7 @@
               message: "鏄惁鏄嚜钀ヨ溅闃熶笉鑳戒负绌�", trigger: "change"
             }
           ],
-          change: ({value}: any) => {
+          change: ({ value }: any) => {
             console.log(value)
             option.value.group.forEach((item: any) => {
               if (item.prop == 'pcxx') {
@@ -1139,7 +1084,7 @@
 
           },
         },
-        commissionModel:{
+        commissionModel: {
           label: '鎻愭垚妯″紡',
           display: true, type: 'radio', dicUrl: '/system/dict/data/type/commission_model', dataType: 'string',
           rules: [
@@ -1170,7 +1115,7 @@
               });
             }
           },
-          type: 'table', suffixIcon: 'search',dataType: 'string',
+          type: 'table', suffixIcon: 'search', dataType: 'string',
           children: {
             border: true,
             searchLabelWidth: 100,
@@ -1214,7 +1159,7 @@
             label: 'serviceShortName',
             value: 'id'
           },
-          onLoad: ({page, value, data}: { page: any, value: any, data: any }, callback: any) => {
+          onLoad: ({ page, value, data }: { page: any, value: any, data: any }, callback: any) => {
             if (value) {
               let id = value;
               if (Array.isArray(value)) {
@@ -1224,7 +1169,7 @@
                 return callback(res.data || {})
               })
             } else {
-              listTmsServiceProvider({pageSize: page.pageSize, pageNum: page.currentPage, ...data}).then(res => {
+              listTmsServiceProvider({ pageSize: page.pageSize, pageNum: page.currentPage, ...data }).then(res => {
                 return callback({
                   total: res.total,
                   data: res.rows || [],
@@ -1281,7 +1226,7 @@
             label: 'driverName',
             value: 'id'
           },
-          onLoad: ({page, value, data}: { page: any, value: any, data: any }, callback: any) => {
+          onLoad: ({ page, value, data }: { page: any, value: any, data: any }, callback: any) => {
             if (value) {
               let id = value;
               if (Array.isArray(value)) {
@@ -1294,7 +1239,7 @@
               listTmsDriver({
                 pageSize: page.pageSize,
                 pageNum: page.currentPage, ...data,
-                carrierType: form.value.operationMode,vehicleProviderId:form.value.vehicleProviderId
+                carrierType: form.value.operationMode, vehicleProviderId: form.value.vehicleProviderId
               }).then(res => {
                 return callback({
                   total: res.total,
@@ -1347,7 +1292,7 @@
             label: 'driverName',
             value: 'id'
           },
-          onLoad: ({page, value, data}: { page: any, value: any, data: any }, callback: any) => {
+          onLoad: ({ page, value, data }: { page: any, value: any, data: any }, callback: any) => {
             if (value) {
               let id = value;
               if (Array.isArray(value)) {
@@ -1359,7 +1304,7 @@
             } else {
               listTmsDriver({
                 pageSize: page.pageSize,
-                pageNum: page.currentPage, ...data,vehicleProviderId:form.value.vehicleProviderId,
+                pageNum: page.currentPage, ...data, vehicleProviderId: form.value.vehicleProviderId,
                 carrierType: form.value.operationMode
               }).then(res => {
                 return callback({
@@ -1433,7 +1378,7 @@
             label: 'licensePlate',
             value: 'id'
           },
-          onLoad: ({page, value, data}: { page: any, value: any, data: any }, callback: any) => {
+          onLoad: ({ page, value, data }: { page: any, value: any, data: any }, callback: any) => {
             if (value) {
               let id = value;
               if (Array.isArray(value)) {
@@ -1446,7 +1391,7 @@
               listTmsVehicle({
                 pageSize: page.pageSize,
                 pageNum: page.currentPage, ...data,
-                carrierType: form.value.operationMode,serviceProviderId:form.value.vehicleProviderId
+                carrierType: form.value.operationMode, serviceProviderId: form.value.vehicleProviderId
               }).then(res => {
                 return callback({
                   total: res.total,
@@ -1528,7 +1473,7 @@
               });
             }
           },
-          type: 'table', suffixIcon: 'search',dataType: 'string',
+          type: 'table', suffixIcon: 'search', dataType: 'string',
           children: {
             border: true,
             searchLabelWidth: 100,
@@ -1562,7 +1507,7 @@
             label: 'containerCode',
             value: 'id'
           },
-          onLoad: ({page, value, data}: { page: any, value: any, data: any }, callback: any) => {
+          onLoad: ({ page, value, data }: { page: any, value: any, data: any }, callback: any) => {
             if (value) {
               let id = value;
               if (Array.isArray(value)) {
@@ -1572,7 +1517,7 @@
                 return callback(res.data || {})
               })
             } else {
-              listTmsContainer({pageSize: page.pageSize, pageNum: page.currentPage, ...data}).then(res => {
+              listTmsContainer({ pageSize: page.pageSize, pageNum: page.currentPage, ...data }).then(res => {
                 return callback({
                   total: res.total,
                   data: res.rows || [],
@@ -1602,7 +1547,7 @@
               });
             }
           },
-          type: 'table', suffixIcon: 'search',dataType: 'string',
+          type: 'table', suffixIcon: 'search', dataType: 'string',
           children: {
             border: true,
             searchLabelWidth: 100,
@@ -1634,7 +1579,7 @@
             label: 'shelfCode',
             value: 'id'
           },
-          onLoad: ({page, value, data}: { page: any, value: any, data: any }, callback: any) => {
+          onLoad: ({ page, value, data }: { page: any, value: any, data: any }, callback: any) => {
             if (value) {
               let id = value;
               if (Array.isArray(value)) {
@@ -1644,7 +1589,7 @@
                 return callback(res.data || {})
               })
             } else {
-              listTmsShelf({pageSize: page.pageSize, pageNum: page.currentPage, ...data}).then(res => {
+              listTmsShelf({ pageSize: page.pageSize, pageNum: page.currentPage, ...data }).then(res => {
                 return callback({
                   total: res.total,
                   data: res.rows || [],
@@ -1740,17 +1685,54 @@
       display: false,
       search: true,
     },
+    licensePlate: {
+      label: '杞︾墝鍙�', minWidth: 120,
+      display: false,
+      search: true,
+    },
     customerName: {
       label: '瀹㈡埛',
       display: false, minWidth: 120,
       search: true,
     },
+    mainDriverName: {
+      label: '涓婚┚椹跺憳',
+      display: false, minWidth: 120,
+      search: true,
+    },
+    requiredVehicleTypes: {
+      label: '涓嬪崟杞﹀瀷', minWidth: 130,
+      display: false, type: 'select', search: true,
+      dicUrl: '/system/dict/data/type/vehicle_type',
+      dataType: 'string',
 
+    },
+    createTimeRange: {
+      label: '鍒涘缓鏃堕棿', display: false, search: true, searchRange: true, type: 'date',
+      format: 'YYYY-MM-DD', hide: true, searchSpan: 5,
+      valueFormat: 'YYYY-MM-DD',
+    },
+    updateTimeRange: {
+      label: '鏇存柊鏃堕棿', display: false, search: true, searchRange: true, type: 'date',
+      format: 'YYYY-MM-DD', hide: true, searchSpan: 5,
+      valueFormat: 'YYYY-MM-DD',
+    },
+    loadingServiceProviderName: {
+      label: '瑁呰揣鏈嶅姟鍟嗗悕绉�', minWidth: 150,
+      display: false,
+      search: true,
+    },
+    customsServiceProviderName: {
+      label: '鎶ュ叧鏈嶅姟鍟嗗悕绉�', minWidth: 150,
+      display: false,
+      search: true,
+    },
     projectName: {
       label: '椤圭洰鍚嶇О',
       display: false, minWidth: 120,
       search: true,
     },
+
     contractName: {
       label: '鍏宠仈鍚堝悓鍚嶇О', minWidth: 120,
       display: false,
@@ -1784,16 +1766,7 @@
       search: true,
     },
 
-    loadingServiceProviderName: {
-      label: '瑁呰揣鏈嶅姟鍟嗗悕绉�', minWidth: 150,
-      display: false,
-      search: true,
-    },
-    customsServiceProviderName: {
-      label: '鎶ュ叧鏈嶅姟鍟嗗悕绉�', minWidth: 150,
-      display: false,
-      search: true,
-    },
+
     isUrgent: {
       label: '鏄惁绱ф��',
       display: false, minWidth: 100,
@@ -1822,24 +1795,13 @@
       type: 'select', dicUrl: '/system/dict/data/type/sys_number_is', dataType: 'string',
 
     },
-    mainDriverName: {
-      label: '涓婚┚椹跺憳',
-      display: false, minWidth: 120,
-      search: true,
-    },
 
     // requiredVehicleTypes: {
     //   label: '瑕佹眰杩愯緭宸ュ叿绫诲瀷',
     //   display: false,
     //   search: true,
     // },
-    requiredVehicleTypes: {
-      label: '涓嬪崟杞﹀瀷',minWidth: 130,
-      display: false, type: 'select',  search: true,
-      dicUrl: '/system/dict/data/type/vehicle_type',
-      dataType: 'string',
 
-    },
     actualVehicleType: {
       label: '娲惧嚭杞﹀瀷', minWidth: 130,
       display: false,
@@ -1848,11 +1810,7 @@
 
     },
 
-    licensePlate: {
-      label: '杞︾墝鍙�', minWidth: 120,
-      display: false,
-      search: true,
-    },
+
 
     shipperName: {
       label: '瑁呰揣鐐瑰悕绉�',
@@ -1897,7 +1855,7 @@
     inStatusList: {
       label: '鐘舵��', minWidth: 150,
       type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/tms_dispatch_order_status',
-      display: false,multiple:true,
+      display: false, multiple: true,
       hide: true,
       search: true,
 
@@ -1930,11 +1888,7 @@
       hide: false,
       search: false,
     },
-    createTimeRange: {
-      label: '鍒涘缓鏃堕棿', display: false, search: true, searchRange: true, type: 'date',
-      format: 'YYYY-MM-DD', hide: true, searchSpan: 5,
-      valueFormat: 'YYYY-MM-DD',
-    },
+
     updateBy: {
       label: '鏇存柊浜�', minWidth: 150,
       addDisplay: false,
@@ -1951,11 +1905,7 @@
       hide: false,
       search: false,
     },
-    updateTimeRange: {
-      label: '鏇存柊鏃堕棿', display: false, search: true, searchRange: true, type: 'date',
-      format: 'YYYY-MM-DD', hide: true, searchSpan: 5,
-      valueFormat: 'YYYY-MM-DD',
-    },
+
     confirmTimeRange: {
       label: '纭鏃堕棿', display: false, search: true, searchRange: true, type: 'date',
       format: 'YYYY-MM-DD', hide: true, searchSpan: 5,
@@ -1992,8 +1942,8 @@
     tripType: {
       label: '琛岀▼绫诲瀷',
       display: true,
-      change: function ({value}: any) {
-        if (value == '5'){
+      change: function ({ value }: any) {
+        if (value == '5') {
           itineraryOption.value.column.iscc.display = true
         }
       },
@@ -2140,7 +2090,7 @@
         }
       ],
     },
-    currency:{
+    currency: {
       label: '甯佺',
       display: true,
       type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/sys_currency',
@@ -2160,7 +2110,7 @@
       action: '/common/upload2',
 
     },
-    remark:{
+    remark: {
       label: '澶囨敞',
       type: 'textarea', minRows: 3, maxRows: 5, span: 24
     },
@@ -2203,7 +2153,7 @@
       label: '閲戦',
       display: true,
     },
-    currency:{
+    currency: {
       label: '甯佺',
       display: true,
       type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/sys_currency',
@@ -2216,7 +2166,7 @@
       type: 'upload',
       action: '/common/upload2',
     },
-    remark:{
+    remark: {
       label: '澶囨敞',
     },
 
@@ -2330,7 +2280,7 @@
         label: 'licensePlate',
         value: 'id'
       },
-      onLoad: ({page, value, data}: { page: any, value: any, data: any }, callback: any) => {
+      onLoad: ({ page, value, data }: { page: any, value: any, data: any }, callback: any) => {
         if (value) {
           let id = value;
           if (Array.isArray(value)) {
@@ -2340,7 +2290,7 @@
             return callback(res.data || {})
           })
         } else {
-          listTmsVehicle({pageSize: page.pageSize, pageNum: page.currentPage, ...data}).then(res => {
+          listTmsVehicle({ pageSize: page.pageSize, pageNum: page.currentPage, ...data }).then(res => {
             return callback({
               total: res.total,
               data: res.rows || [],
@@ -2384,7 +2334,7 @@
         label: 'driverName',
         value: 'id'
       },
-      onLoad: ({page, value, data}: { page: any, value: any, data: any }, callback: any) => {
+      onLoad: ({ page, value, data }: { page: any, value: any, data: any }, callback: any) => {
         if (value) {
           let id = value;
           if (Array.isArray(value)) {
@@ -2394,7 +2344,7 @@
             return callback(res.data || {})
           })
         } else {
-          listTmsDriver({pageSize: page.pageSize, pageNum: page.currentPage, ...data}).then(res => {
+          listTmsDriver({ pageSize: page.pageSize, pageNum: page.currentPage, ...data }).then(res => {
             return callback({
               total: res.total,
               data: res.rows || [],
@@ -2414,7 +2364,7 @@
   labelWidth: 120,
   column: {
     customsServiceProviderId: {
-      label: '鎶ュ叧鏈嶅姟鍟�', span:24,
+      label: '鎶ュ叧鏈嶅姟鍟�', span: 24,
       display: true,
       rules: [
         {
@@ -2439,22 +2389,22 @@
         border: true,
         searchLabelWidth: 100,
         searchMenuSpan: 5,
-        column:{
+        column: {
           serviceCode: {
             label: '鏈嶅姟鍟嗙紪鐮�',
             search: true,
           },
           serviceShortName: {
-            label: '鏈嶅姟鍟嗙畝绉�',minWidth:150,
+            label: '鏈嶅姟鍟嗙畝绉�', minWidth: 150,
             search: true,
           },
           serviceName: {
-            label: '鏈嶅姟鍟嗗叏绉�',search: true,
+            label: '鏈嶅姟鍟嗗叏绉�', search: true,
           },
           serviceType: {
-            label: '鏈嶅姟绫诲瀷',minWidth:150,
+            label: '鏈嶅姟绫诲瀷', minWidth: 150,
             type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/service_type',
-            multiple:true,
+            multiple: true,
             search: true,
           },
         }
@@ -2463,7 +2413,7 @@
         label: 'serviceShortName',
         value: 'id'
       },
-      onLoad: ({page, value, data}: { page: any, value: any, data: any }, callback: any) => {
+      onLoad: ({ page, value, data }: { page: any, value: any, data: any }, callback: any) => {
         if (value) {
           let id = value;
           if (Array.isArray(value)) {
@@ -2473,7 +2423,7 @@
             return callback(res.data || {})
           })
         } else {
-          listTmsCustomsServiceProvider({pageSize: page.pageSize, pageNum: page.currentPage, ...data}).then(res => {
+          listTmsCustomsServiceProvider({ pageSize: page.pageSize, pageNum: page.currentPage, ...data }).then(res => {
             return callback({
               total: res.total,
               data: res.rows || [],
@@ -2492,7 +2442,7 @@
   labelWidth: 120,
   column: {
     loadingServiceProviderId: {
-      label: '瑁呭嵏鏈嶅姟鍟�',span:24,
+      label: '瑁呭嵏鏈嶅姟鍟�', span: 24,
       display: true,
       rules: [
         {
@@ -2517,22 +2467,22 @@
         border: true,
         searchLabelWidth: 100,
         searchMenuSpan: 5,
-        column:{
+        column: {
           serviceCode: {
             label: '鏈嶅姟鍟嗙紪鐮�',
             search: true,
           },
           serviceShortName: {
-            label: '鏈嶅姟鍟嗙畝绉�',minWidth:150,
+            label: '鏈嶅姟鍟嗙畝绉�', minWidth: 150,
             search: true,
           },
           serviceName: {
-            label: '鏈嶅姟鍟嗗叏绉�',search: true,
+            label: '鏈嶅姟鍟嗗叏绉�', search: true,
           },
           serviceType: {
-            label: '鏈嶅姟绫诲瀷',minWidth:150,
+            label: '鏈嶅姟绫诲瀷', minWidth: 150,
             type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/service_type',
-            multiple:true,
+            multiple: true,
             search: true,
           },
         }
@@ -2541,7 +2491,7 @@
         label: 'serviceShortName',
         value: 'id'
       },
-      onLoad: ({page, value, data}: { page: any, value: any, data: any }, callback: any) => {
+      onLoad: ({ page, value, data }: { page: any, value: any, data: any }, callback: any) => {
         if (value) {
           let id = value;
           if (Array.isArray(value)) {
@@ -2551,7 +2501,7 @@
             return callback(res.data || {})
           })
         } else {
-          listTmsLoadingServiceProvider({pageSize: page.pageSize, pageNum: page.currentPage, ...data}).then(res => {
+          listTmsLoadingServiceProvider({ pageSize: page.pageSize, pageNum: page.currentPage, ...data }).then(res => {
             return callback({
               total: res.total,
               data: res.rows || [],
@@ -2569,8 +2519,8 @@
   menuBtn: false,
   labelWidth: 120,
   column: {
-    closeWhy:{
-      label: '浣滃簾鍘熷洜',span:24,
+    closeWhy: {
+      label: '浣滃簾鍘熷洜', span: 24,
       type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/close_why',
       rules: [
         {
@@ -2579,10 +2529,10 @@
         }
       ],
     },
-    closeWhyRemark:{
+    closeWhyRemark: {
       label: '浣滃簾鍘熷洜璇存槑',
       type: 'textarea',
-      span:24,
+      span: 24,
     },
   }
 })
@@ -2634,7 +2584,7 @@
         label: 'productName',
         value: 'id'
       },
-      onLoad: ({page, value, data}: { page: any, value: any, data: any }, callback: any) => {
+      onLoad: ({ page, value, data }: { page: any, value: any, data: any }, callback: any) => {
         if (value) {
           let id = value;
           if (Array.isArray(value)) {
@@ -2908,7 +2858,7 @@
       name: 'tab4',
       value: '3',
     }
-    ]
+  ]
 })
 const tabsOptionRef = ref();
 const active = ref('tab1');
@@ -2920,16 +2870,16 @@
   menu: false,
   selection: false,
   column: {
-    freeName:{
+    freeName: {
       label: '璐圭敤鍚嶇О',
     },
-    unit:{
+    unit: {
       label: '璁¢噺鍗曚綅',
     },
-    count:{
-      label : '璁¤垂鏁伴噺'
+    count: {
+      label: '璁¤垂鏁伴噺'
     },
-    remark:{
+    remark: {
       label: '澶囨敞'
     }
   }
@@ -2973,20 +2923,20 @@
   },
   handleSelectionChangeFunc: (selection: any) => {
     selectionList.value = selection;
-    if (selection.length > 0){
+    if (selection.length > 0) {
       isCustoms.value = selection[0].isCustoms;
-      isLoad.value = selection[0].isLoad ;
-    }else{
+      isLoad.value = selection[0].isLoad;
+    } else {
       isCustoms.value = -1;
       isLoad.value = -1;
     }
     isCustoms.value = isCustoms.value == 0 && !pageF.single ? 0 : -1;
     isLoad.value = isLoad.value == 0 && !pageF.single ? 0 : -1;
-    zxhdjSingle.value = pageF.multiple|| true;
-    let yp = selection.filter((item:any) =>{
+    zxhdjSingle.value = pageF.multiple || true;
+    let yp = selection.filter((item: any) => {
       return item.orderType == 0
     });
-    if(yp.length > 0){
+    if (yp.length > 0) {
       zxhdjSingle.value = false;
     }
   },
@@ -2998,8 +2948,8 @@
     queryParams.value = proxy.addDateRangeNew(queryParams.value, queryParams.value?.orderTimeRange, 'orderTime') || {};
     return params;
   },
-  handleBeforeOpenFunc:(type:string)=>{
-    if(type == 'add'){
+  handleBeforeOpenFunc: (type: string) => {
+    if (type == 'add') {
       form.value = {};
     }
   }
@@ -3057,8 +3007,10 @@
 const handleUploadItinerary = (row: any) => {
   optionType.value = 'addItinerary';
   boxFormOption.value = itineraryOption.value;
+  console.log(itineraryOption.value);
+
   boxTableOption.value = itineraryTableOption.value;
-  listTmsTrip({dispatchOrderId: row.id, pageNum: 1, pageSize: 999}).then(res => {
+  listTmsTrip({ dispatchOrderId: row.id, pageNum: 1, pageSize: 999 }).then(res => {
     boxTableData.value = res.rows || [];
     pageF.open = true;
     pageF.title = '涓婁紶琛岀▼';
@@ -3071,6 +3023,8 @@
       vehicleNumber: row.licensePlate,
       vehicleId: row.vehicleId,
     }
+    console.log(boxForm.value);
+    
   })
 }
 const cancelBox = () => {
@@ -3126,7 +3080,7 @@
 const handleLogItinerary = (row: any) => {
   optionType.value = 'view';
   boxTableOption.value = itineraryTableOption.value;
-  listTmsTrip({dispatchOrderId: row.id, pageNum: 1, pageSize: 999}).then(res => {
+  listTmsTrip({ dispatchOrderId: row.id, pageNum: 1, pageSize: 999 }).then(res => {
     boxTableData.value = res.rows || [];
     pageF.open = true;
     pageF.title = '鏌ョ湅琛岀▼';
@@ -3138,7 +3092,7 @@
   optionType.value = 'addFinance';
   boxFormOption.value = financeOption.value;
   boxTableOption.value = financeTableOption.value;
-  const quotePlanItemRes = await listTmsQuoteItem({quotePlanId: row.quotePlanId, pageNum: 1, pageSize: 999});
+  const quotePlanItemRes = await listTmsQuoteItem({ quotePlanId: row.quotePlanId, pageNum: 1, pageSize: 999 });
   let items = quotePlanItemRes.rows || [];
   itemsTableData.value = items.map((item: any) => {
     return {
@@ -3229,8 +3183,9 @@
     }).finally(() => {
       pageF.isUploading = false;
     })
-  }else if (optionType.value === 'customs') {
-    customsOrder({id:form.value.id,
+  } else if (optionType.value === 'customs') {
+    customsOrder({
+      id: form.value.id,
       customsServiceProviderId: form.value.customsServiceProviderId,
       customsServiceProviderName: form.value.customsServiceProviderName,
     }).then(res => {
@@ -3243,8 +3198,9 @@
     }).finally(() => {
       pageF.isUploading = false;
     })
-  }else if (optionType.value === 'loading') {
-    loadingOrder({id:form.value.id,
+  } else if (optionType.value === 'loading') {
+    loadingOrder({
+      id: form.value.id,
       loadingServiceProviderId: form.value.loadingServiceProviderId,
       loadingServiceProviderName: form.value.loadingServiceProviderName,
     }).then(res => {
@@ -3257,7 +3213,7 @@
     }).finally(() => {
       pageF.isUploading = false;
     })
-  }else {
+  } else {
     connectHang({
       dispatchId: form.value.id,
       vehicleId: form.value.vehicleId,
@@ -3281,7 +3237,7 @@
 }
 
 const handleAddGoods = (row: any) => {
-  listTmsGoodsDetail({dispatchId: row.id, pageSize: 999, pageNum: 1}).then(res => {
+  listTmsGoodsDetail({ dispatchId: row.id, pageSize: 999, pageNum: 1 }).then(res => {
     goodsTableData.value = res.rows || [];
     form.value = row;
     open2.value = true;
@@ -3355,7 +3311,7 @@
   selectionList2.value = selection;
 }
 
-const onShipperLoad = ({page, value, data}: { page: any, value: any, data: any }, callback: any) => {
+const onShipperLoad = ({ page, value, data }: { page: any, value: any, data: any }, callback: any) => {
   if (value) {
     let id = value;
     if (Array.isArray(value)) {
@@ -3374,10 +3330,10 @@
       if (districtId) data.districtId = districtId;
       if (streetId) data.streetId = streetId;
     }
-    if (shipperReceiverForm.value.customerId ){
+    if (shipperReceiverForm.value.customerId) {
       form.value.customerId = shipperReceiverForm.value.customerId;
     }
-    listTmsConsignor({pageSize: page.pageSize, pageNum: page.currentPage, ...data,customerId: form.value.customerId}).then(res => {
+    listTmsConsignor({ pageSize: page.pageSize, pageNum: page.currentPage, ...data, customerId: form.value.customerId }).then(res => {
       return callback({
         total: res.total,
         data: res.rows || [],
@@ -3385,7 +3341,7 @@
     })
   }
 }
-const onConsignorLoad = ({page, value, data}: { page: any, value: any, data: any }, callback: any) => {
+const onConsignorLoad = ({ page, value, data }: { page: any, value: any, data: any }, callback: any) => {
   if (value) {
     let id = value;
     if (Array.isArray(value)) {
@@ -3404,10 +3360,10 @@
       if (districtId) data.districtId = districtId;
       if (streetId) data.streetId = streetId;
     }
-    if (shipperReceiverForm.value.customerId ){
+    if (shipperReceiverForm.value.customerId) {
       form.value.customerId = shipperReceiverForm.value.customerId;
     }
-    listTmsConsignor({pageSize: page.pageSize, pageNum: page.currentPage, ...data,customerId: form.value.customerId}).then(res => {
+    listTmsConsignor({ pageSize: page.pageSize, pageNum: page.currentPage, ...data, customerId: form.value.customerId }).then(res => {
       return callback({
         total: res.total,
         data: res.rows || [],
@@ -3415,7 +3371,7 @@
     })
   }
 }
-const changeShipper = ({value}: any) => {
+const changeShipper = ({ value }: any) => {
 
   if (value) {
     let id = value;
@@ -3450,7 +3406,7 @@
     })
   }
 }
-const changeReceiver = ({value}: any) => {
+const changeReceiver = ({ value }: any) => {
 
   if (value) {
     let id = value;
@@ -3486,13 +3442,13 @@
     })
   }
 }
-const consignorAddOption =ref({
+const consignorAddOption = ref({
   labelWidth: 120,
   group: [
     {
       label: '鍩虹淇℃伅',
       prop: 'jcxx',
-      column:{
+      column: {
         // consignorCode: {
         //   label: '瑁呭嵏璐х偣缂栫爜',minWidth: 150,
         //   addDisplay: false, disabled: true,
@@ -3508,7 +3464,7 @@
         //   ],
         // },
         consignorName: {
-          label: '瑁呭嵏璐х偣鍚嶇О',minWidth: 150,
+          label: '瑁呭嵏璐х偣鍚嶇О', minWidth: 150,
           addDisplay: true,
           editDisplay: true,
           viewDisplay: true,
@@ -3521,8 +3477,8 @@
             }
           ],
         },
-        customerName:{
-          label: '鎵�灞炲鎴�',minWidth: 150,disabled: true,
+        customerName: {
+          label: '鎵�灞炲鎴�', minWidth: 150, disabled: true,
         },
         // customerId: {
         //   label: '鎵�灞炲鎴�',minWidth: 150,
@@ -3617,7 +3573,7 @@
         //   ],
         // },
         consignorType: {
-          label: '瑁呭嵏璐х偣绫诲瀷',minWidth: 150,
+          label: '瑁呭嵏璐х偣绫诲瀷', minWidth: 150,
           type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/consignor_type',
           addDisplay: true,
           editDisplay: true,
@@ -3636,9 +3592,9 @@
     {
       label: '鑱旂郴浜轰俊鎭�',
       prop: 'lxrxx',
-      column:{
+      column: {
         contactName: {
-          label: '鑱旂郴浜哄鍚�',minWidth: 150,
+          label: '鑱旂郴浜哄鍚�', minWidth: 150,
           addDisplay: true,
           editDisplay: true,
           viewDisplay: true,
@@ -3652,7 +3608,7 @@
           ],
         },
         contactPhone: {
-          label: '鑱旂郴浜虹數璇�',minWidth: 150,
+          label: '鑱旂郴浜虹數璇�', minWidth: 150,
           addDisplay: true,
           editDisplay: true,
           viewDisplay: true,
@@ -3660,7 +3616,7 @@
           search: false,
         },
         contactEmail: {
-          label: '鑱旂郴浜洪偖绠�',minWidth: 150,
+          label: '鑱旂郴浜洪偖绠�', minWidth: 150,
           addDisplay: true,
           editDisplay: true,
           viewDisplay: true,
@@ -3672,12 +3628,12 @@
     {
       label: '鍦板潃淇℃伅',
       prop: 'dzxx',
-      column:{
+      column: {
 
         mapLocationDetail: {
-          label: '鍦板浘浣嶇疆',minWidth: 150,
+          label: '鍦板浘浣嶇疆', minWidth: 150,
           addDisplay: true,
-          editDisplay: true,span:24,
+          editDisplay: true, span: 24,
           viewDisplay: true,
           hide: true,
           search: false,
@@ -3697,23 +3653,23 @@
           //     console.log(form2.value,"form2")
           //   }
           // },
-          change: async ({value}:any)=>{
-            if (Array.isArray(value) && value.length === 3){
-                mapRegeo(value[1], value[0]).then(async res => {
-                  let params = res.data || {};
-                  if (params.info === "OK") {
-                    let {province, city, district, township} = params.regeocode.addressComponent || {};
-                    const res = await getAddressCode({province, city, district, township});
-                    const {provinceCode, cityCode, districtCode, townshipCode} = res.data || {};
-                    form2.value.regionLabel = province + " / " + city + " / " + district + " / " + township;
-                    form2.value.provinceId = provinceCode;
-                    form2.value.cityId = cityCode;
-                    form2.value.districtId = districtCode;
-                    form2.value.streetId = townshipCode;
-                    form2.value.dispatchTransportArea = params.regeocode.formatted_address || params.regeocode.formattedAddress;
-                    console.log(form2.value, "form2")
-                  }
-                });
+          change: async ({ value }: any) => {
+            if (Array.isArray(value) && value.length === 3) {
+              mapRegeo(value[1], value[0]).then(async res => {
+                let params = res.data || {};
+                if (params.info === "OK") {
+                  let { province, city, district, township } = params.regeocode.addressComponent || {};
+                  const res = await getAddressCode({ province, city, district, township });
+                  const { provinceCode, cityCode, districtCode, townshipCode } = res.data || {};
+                  form2.value.regionLabel = province + " / " + city + " / " + district + " / " + township;
+                  form2.value.provinceId = provinceCode;
+                  form2.value.cityId = cityCode;
+                  form2.value.districtId = districtCode;
+                  form2.value.streetId = townshipCode;
+                  form2.value.dispatchTransportArea = params.regeocode.formatted_address || params.regeocode.formattedAddress;
+                  console.log(form2.value, "form2")
+                }
+              });
             }
           },
         },
@@ -3733,9 +3689,9 @@
         // },
         electronicFenceRange: {
           label: '鐢靛瓙鍥存爮鑼冨洿',
-          addDisplay: true,minWidth: 150,
+          addDisplay: true, minWidth: 150,
           editDisplay: true,
-          viewDisplay: true,append:'绫�',
+          viewDisplay: true, append: '绫�',
           hide: false,
           search: true,
           rules: [
@@ -3750,12 +3706,12 @@
     {
       label: '鍏朵粬淇℃伅',
       prop: 'qtyxx',
-      column:{
+      column: {
         remark: {
-          label: '澶囨敞',minWidth: 150,
+          label: '澶囨敞', minWidth: 150,
           type: 'textarea', minRows: 3, maxRows: 5,
           addDisplay: true,
-          editDisplay: true,span:24,
+          editDisplay: true, span: 24,
           viewDisplay: true,
           hide: true,
           search: false,
@@ -3768,7 +3724,7 @@
 const dialForm = ref();
 
 const handleAddShipper = () => {
-  if (!form.value.customerId){
+  if (!form.value.customerId) {
     return ElMessage.error('璇峰厛閫夋嫨杩愯緭璺嚎');
   }
   form2.value = {
@@ -3778,33 +3734,33 @@
   };
   dialForm.value = $DialogForm(appContext)({
     title: '鏂板瑁呰揣鍦�',
-    data:form2.value,
+    data: form2.value,
     width: '80%',
     option: consignorAddOption.value,
     menuPosition: 'right',
-    callback: (res:any,) => {
+    callback: (res: any,) => {
       let data1 = res.data;
-      if (data1.mapLocationDetail){
-        data1.mapLocation = data1.mapLocationDetail[0]+','+data1.mapLocationDetail[1];
+      if (data1.mapLocationDetail) {
+        data1.mapLocation = data1.mapLocationDetail[0] + ',' + data1.mapLocationDetail[1];
         data1.addressDetail = data1.mapLocationDetail[2]
       }
-      addTmsConsignor({...form2.value,...data1}).then(res2=>{
+      addTmsConsignor({ ...form2.value, ...data1 }).then(res2 => {
         let active = res2.data || {};
         if (active) {
           let shipperRegionCode = '';
-          if (active.provinceId){
+          if (active.provinceId) {
             shipperRegionCode = active.provinceId;
           }
-          if (active.cityId){
-            shipperRegionCode =shipperRegionCode+ ","+active.cityId;
+          if (active.cityId) {
+            shipperRegionCode = shipperRegionCode + "," + active.cityId;
 
           }
-          if (active.districtId){
-            shipperRegionCode =shipperRegionCode+ ","+active.districtId;
+          if (active.districtId) {
+            shipperRegionCode = shipperRegionCode + "," + active.districtId;
 
           }
-          if (active.streetId){
-            shipperRegionCode =shipperRegionCode+ ","+active.streetId;
+          if (active.streetId) {
+            shipperRegionCode = shipperRegionCode + "," + active.streetId;
           }
           Object.assign(form.value, {
             shipperId: active.id,
@@ -3812,12 +3768,12 @@
             shipperRegionLabel: active.regionLabel,
             shipperAddress: active.addressDetail,
             shipperMobile: active.contactPhone,
-            shipperRegionCode:shipperRegionCode
+            shipperRegionCode: shipperRegionCode
           });
         }
         dialForm.value.close();
         res.done();
-      }).catch(err=>{
+      }).catch(err => {
         res.done();
       })
     },
@@ -3825,7 +3781,7 @@
 }
 
 const handleAddReceiver = () => {
-  if (!form.value.customerId){
+  if (!form.value.customerId) {
     return ElMessage.error('璇峰厛閫夋嫨杩愯緭璺嚎');
   }
   form2.value = {
@@ -3835,33 +3791,33 @@
   };
   dialForm.value = $DialogForm(appContext)({
     title: '鏂板鍗歌揣鍦�',
-    data:form2.value,
+    data: form2.value,
     width: '80%',
     option: consignorAddOption.value,
     menuPosition: 'right',
-    callback: (res:any,) => {
+    callback: (res: any,) => {
       let data1 = res.data;
-      if (data1.mapLocationDetail){
-        data1.mapLocation = data1.mapLocationDetail[0]+','+data1.mapLocationDetail[1];
+      if (data1.mapLocationDetail) {
+        data1.mapLocation = data1.mapLocationDetail[0] + ',' + data1.mapLocationDetail[1];
         data1.addressDetail = data1.mapLocationDetail[2]
       }
-      addTmsConsignor({...form2.value,...data1}).then(res2=>{
+      addTmsConsignor({ ...form2.value, ...data1 }).then(res2 => {
         let active = res2.data || {};
         if (active) {
           let receiverRegionCode = '';
-          if (active.provinceId){
+          if (active.provinceId) {
             receiverRegionCode = active.provinceId;
           }
-          if (active.cityId){
-            receiverRegionCode =receiverRegionCode+ ","+active.cityId;
+          if (active.cityId) {
+            receiverRegionCode = receiverRegionCode + "," + active.cityId;
 
           }
-          if (active.districtId){
-            receiverRegionCode =receiverRegionCode+ ","+active.districtId;
+          if (active.districtId) {
+            receiverRegionCode = receiverRegionCode + "," + active.districtId;
 
           }
-          if (active.streetId){
-            receiverRegionCode =receiverRegionCode+ ","+active.streetId;
+          if (active.streetId) {
+            receiverRegionCode = receiverRegionCode + "," + active.streetId;
           }
 
           Object.assign(form.value, {
@@ -3870,12 +3826,12 @@
             receiverRegionLabel: active.regionLabel,
             receiverAddress: active.addressDetail,
             receiverMobile: active.contactPhone,
-            receiverRegionCode:receiverRegionCode,
+            receiverRegionCode: receiverRegionCode,
           });
         }
         dialForm.value.close();
         res.done();
-      }).catch(err=>{
+      }).catch(err => {
         res.done();
       })
     },
@@ -3888,6 +3844,15 @@
   form.value = selectionList.value[0];
   optionType.value = 'customs';
   boxFormOption.value = customsOption.value;
+
+}
+
+const handleCustomsAdd = (selectionList) => {
+  title.value = '琛ュ厖濮旀墭瑁呭嵏淇℃伅';
+  open.value = true;
+  form.value = selectionList;
+  optionType.value = 'loading';
+  boxFormOption.value = loadingOption.value;
 }
 const handleLoading = () => {
   title.value = '琛ュ厖濮旀墭瑁呭嵏淇℃伅';
@@ -3896,32 +3861,40 @@
   optionType.value = 'loading';
   boxFormOption.value = loadingOption.value;
 }
+const handleLoadingAdd = (selectionList) => {
+  title.value = '琛ュ厖濮旀墭瑁呭嵏淇℃伅';
+  open.value = true;
+  form.value = selectionList;
+  optionType.value = 'loading';
+  boxFormOption.value = loadingOption.value;
+}
 const quotationItems = ref();
 const getQuotationItems = async () => {
-  let res = await  getDicts("sys_quotation_items");
+  let res = await getDicts("sys_quotation_items");
   quotationItems.value = res.data || [];
 }
 getQuotationItems();
 
-const getTabData = (val:string)=>{
+const getTabData = (val: string) => {
   console.log(val)
-  let filter = quotationItems.value.filter((item:any)=>{
+  let filter = quotationItems.value.filter((item: any) => {
     return item.remark == val;
   });
-  if (filter.length > 0){
-    zzItemsTableData.value = filter.map((item:any)=>{
-      return { rowKey: randomId() ,freeName: item.dictLabel,free: item.dictValue,unit: '娆�'}
+  if (filter.length > 0) {
+    zzItemsTableData.value = filter.map((item: any) => {
+      return { rowKey: randomId(), freeName: item.dictLabel, free: item.dictValue, unit: '娆�' }
     })
-  }else{
+  } else {
     zzItemsTableData.value = []
   }
 }
 
-const getTab4Data = ()=>{
+const getTab4Data = () => {
   listTmsFinanceDetail({
     dispatchOrderId: form.value.id, financeType: 2,
     pageNum: 1, pageSize: 999
   }).then(async res => {
+
     boxTableData.value = res.rows || [];
 
     boxForm.value = {
@@ -3934,39 +3907,76 @@
 
 
 
-const submitTabForm = ()=>{
-  if (['tab1','tab2','tab3'].includes(active.value)){
-    let quoteFeeItems = zzItemsTableData.value.filter((item:any)=>{
+const submitTabForm = () => {
+  if (['tab1', 'tab2', 'tab3'].includes(active.value)) {
+    let quoteFeeItems = zzItemsTableData.value.filter((item: any) => {
       return item.count && item.count > 0;
     })
-    console.log(quoteFeeItems)
-    pushTmsQuoteFee({...form.value,quoteFeeItems:quoteFeeItems}).then(res=>{
+    pushTmsQuoteFee({ ...form.value, quoteFeeItems: quoteFeeItems }).then(res => {
       ElMessage.success('淇濆瓨鎴愬姛');
       open4.value = false;
     })
-  }else if (active.value === 'tab4'){
-    if (Array.isArray(boxForm.value.feeVoucherUrl)) {
-      boxForm.value.feeVoucherUrl = boxForm.value.feeVoucherUrl.toString();
-    }
+  } else if (active.value === 'tab4') {
+    // if (Array.isArray(boxForm.value.feeVoucherUrl)) {
+    //   boxForm.value.feeVoucherUrl = boxForm.value.feeVoucherUrl.toString();
+    // }
     //boxForm.value.rowItems = boxTableData.value;
-    saveTmsFinanceDetail(boxForm.value).then(res => {
+    // console.log(tmsFinanceDetails.value);
+    // console.log(boxForm.value);
+// 1. 鎻愬彇濉啓浜嗛噾棰濈殑鏁版嵁锛堥噾棰濆ぇ浜�0锛�
+    const validDetails = tmsFinanceDetails.value.filter(item => item.actualFeeAmount && item.actualFeeAmount > 0);
+
+    if (validDetails.length === 0) {
+      ElMessage.warning('璇疯嚦灏戝~鍐欎竴椤硅垂鐢ㄩ噾棰�');
+      return;
+    }
+
+    // 2. 鏍¢獙锛氬~鍐欎簡閲戦鐨勬槸鍚﹂兘閫変簡甯佸埗
+    const incomplete = validDetails.find(item => !item.currency);
+    if (incomplete) {
+      ElMessage.error(`璐圭敤绫诲瀷銆�${incomplete.feeTypeName}銆戝凡濉啓閲戦锛岃閫夋嫨甯佸埗锛乣);
+      return; // 鎷︽埅鎻愪氦
+    }
+
+    // 3. 澶勭悊鍑瘉 URL (濡傛灉鏈夊崟寮犳垨澶氬紶涓婁紶鐨勯�昏緫)
+    // 鍋囪鍚庣闇�瑕佺殑鏄�楀彿鍒嗛殧鐨勫瓧绗︿覆
+    const submitData = validDetails.map(item => {
+      let url = item.voucherUrl;
+      if (Array.isArray(url)) {
+        url = url.join(',');
+      }
+      return { ...item, voucherUrl: url };
+    });
+
+
+    saveTmsFinanceDetail2(submitData).then(res => {
       ElMessage({
         message: "鎿嶄綔鎴愬姛锛�",
         type: 'success'
       })
+        open4.value = false;
+        onLoad(page.value)
       boxFormRef.value?.resetFields();
       getTab4Data();
     })
+    // saveTmsFinanceDetail(boxForm.value).then(res => {
+    //   ElMessage({
+    //     message: "鎿嶄綔鎴愬姛锛�",
+    //     type: 'success'
+    //   })
+    //   boxFormRef.value?.resetFields();
+    //   getTab4Data();
+    // })
   }
 }
 
 
 
-const handleChange = (column:any)=>{
+const handleChange = (column: any) => {
   active.value = column.prop;
-  if (['tab1','tab2','tab3'].includes(column.prop)){
+  if (['tab1', 'tab2', 'tab3'].includes(column.prop)) {
     getTabData(column.value)
-  }else if (column.prop === 'tab4'){
+  } else if (column.prop === 'tab4') {
     getTab4Data()
   }
 }
@@ -3978,38 +3988,38 @@
 
   boxFormOption.value = financeOption.value;
   boxTableOption.value = financeTableOption.value;
-  nextTick(()=>{
+  nextTick(() => {
     tabsOptionRef.value.active = "0";
 
   })
 }
 
-const handleClose = (row:any) => {
+const handleClose = (row: any) => {
 
-  if (row.status == 2){
-    checkCloseOrder(row.id).then(res=>{
+  if (row.status == 2) {
+    checkCloseOrder(row.id).then(res => {
       open5.value = true;
       form.value = row;
       boxFormOption.value = closeOption.value;
     });
-  }else{
+  } else {
     open5.value = true;
     form.value = row;
     boxFormOption.value = closeOption.value;
 
   }
 }
-const submitForm5 = () =>{
-  boxFormRef.value.validate((valid: boolean,done:any) => {
+const submitForm5 = () => {
+  boxFormRef.value.validate((valid: boolean, done: any) => {
     console.log(valid)
-    if(valid){
+    if (valid) {
       boxForm.value.id = form.value.id;
-      closeOrder(boxForm.value).then(res=>{
+      closeOrder(boxForm.value).then(res => {
         ElMessage.success('鎿嶄綔鎴愬姛');
         open5.value = false;
         done();
         onLoad(page.value)
-      }).catch(err=>{
+      }).catch(err => {
         done();
       })
     }
@@ -4019,54 +4029,54 @@
   menuBtn: false,
   labelWidth: 120,
   column: {
-    sixLinkNo:{
+    sixLinkNo: {
       label: '鍏仈鍗曞彿',
     },
-    portName:{
+    portName: {
       label: '琛岄┒鍙e哺',
       type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/sys_port',
     },
-    billNo:{
+    billNo: {
       label: '鎻愬崟鍙稴/O',
     },
-    terminalName:{
+    terminalName: {
       label: '鐮佸ご鍚�',
     },
-    cargoName:{
+    cargoName: {
       label: '璐х墿鍚�',
     },
-    pieceCount:{
+    pieceCount: {
       label: '浠舵暟',
     },
-    weight:{
+    weight: {
       label: '閲嶉噺',
     },
-    contactName:{
+    contactName: {
       label: '瀹㈡埛鑱旂粶浜�',
     },
-    contactPhone:{
+    contactPhone: {
       label: '鑱旂粶浜烘墜鏈哄彿',
     }
   }
 })
-const print =ref(0)
+const print = ref(0)
 const handlePrint = () => {
-  form.value =  selectionList.value[0];
+  form.value = selectionList.value[0];
   boxFormOption.value = printOption.value;
   boxForm.value = form.value
 
-  getTmsDriver(boxForm.value.mainDriverId).then(res=>{
+  getTmsDriver(boxForm.value.mainDriverId).then(res => {
     open6.value = true;
-    const driver =  res.data || {};
+    const driver = res.data || {};
     boxForm.value.mainDriverMobile = driver.mobile;
     print.value = 0
   })
 
 }
 
-const submitForm6 = ()=>{
+const submitForm6 = () => {
   print.value = 1;
-  printDispatchOrder(boxForm.value).then(res=>{
+  printDispatchOrder(boxForm.value).then(res => {
     $Print('#print');
     onLoad(page.value)
   })
@@ -4099,11 +4109,11 @@
   importTemplateTmsDispatchOrder();
 
 }
-const handleFileUploadProgress = (event:any, file:any) => {
+const handleFileUploadProgress = (event: any, file: any) => {
   upload.isUploading = true;
 };
 /** 鏂囦欢涓婁紶鎴愬姛澶勭悊 */
-const handleFileSuccess = (response:any, file:any) => {
+const handleFileSuccess = (response: any, file: any) => {
   upload.open = false;
   upload.isUploading = false;
   uploadRef.value!.clearFiles();
@@ -4119,8 +4129,8 @@
 const shipperReceiverFormOption = ref({
   menuBtn: false, labelWidth: 140,
   column: {
-    dispatchNos:{
-      label: '璋冨害鍗曞彿',span:24,
+    dispatchNos: {
+      label: '璋冨害鍗曞彿', span: 24,
       rules: [
         {
           required: true,
@@ -4129,7 +4139,7 @@
       ],
     },
     shipperId: {
-      label: '瑁呰揣鐐�', dataType: 'string',disabled:false,
+      label: '瑁呰揣鐐�', dataType: 'string', disabled: false,
       display: true,
       rules: [
         {
@@ -4154,7 +4164,7 @@
     },
     receiverId: {
       label: '鍗歌揣鐐�',
-      display: true, dataType: 'string',disabled:false,
+      display: true, dataType: 'string', disabled: false,
       rules: [
         {
           required: true,
@@ -4177,7 +4187,7 @@
   }
 });
 
-const changeShipper2 = ({value}: any) => {
+const changeShipper2 = ({ value }: any) => {
 
   if (value) {
     let id = value;
@@ -4212,7 +4222,7 @@
     })
   }
 }
-const changeReceiver2 = ({value}: any) => {
+const changeReceiver2 = ({ value }: any) => {
 
   if (value) {
     let id = value;
@@ -4251,43 +4261,43 @@
 
 const hasDifferentCustomer = (() => {
   const customerSet = new Set(
-      selectionList.value.map((item:any) => item.customerId)
+    selectionList.value.map((item: any) => item.customerId)
   );
   return customerSet.size > 1;
 })();
-const handleZXHDJ = ()=>{
-  if(hasDifferentCustomer){
+const handleZXHDJ = () => {
+  if (hasDifferentCustomer) {
     ElMessage.error('鍗曟鎿嶄綔鍙兘鎿嶄綔涓�涓鎴风殑鏁版嵁');
     return;
   }
-  let filter = selectionList.value.filter((item:any)=> !item.shipperId);
-  let filter2 = selectionList.value.filter((item:any)=> !item.receiverId);
+  let filter = selectionList.value.filter((item: any) => !item.shipperId);
+  let filter2 = selectionList.value.filter((item: any) => !item.receiverId);
   let zLen = filter.length || 0;
   let xLen = filter2.length || 0;
-  if (zLen == 0 && xLen == 0){
+  if (zLen == 0 && xLen == 0) {
     ElMessage.error('閫夋嫨鐨勬暟鎹凡瀹屾垚瀵硅鍗歌揣鐐圭櫥璁�');
     return;
   }
-  if(zLen >0 && xLen >0){
-    if (zLen > xLen){
+  if (zLen > 0 && xLen > 0) {
+    if (zLen > xLen) {
       ElMessage.error('閫夋嫨鐨勬暟鎹凡濉啓鍗歌揣鐐规暟鎹紝璇峰崟鐙紪杈�');
       return;
     }
-    if (zLen < xLen){
+    if (zLen < xLen) {
       ElMessage.error('閫夋嫨鐨勬暟鎹凡濉啓瑁呰揣鐐规暟鎹紝璇峰崟鐙紪杈�');
       return;
     }
   }
-  let item:any = selectionList.value[0];
+  let item: any = selectionList.value[0];
   shipperReceiverForm.value.customerId = item?.customerId
   shipperReceiverForm.value.customerCode = item?.customerCode
   shipperReceiverForm.value.customerName = item?.customerName;
-  shipperReceiverForm.value.dispatchNos = selectionList.value.map((item:any)=> item.dispatchNo) || [];
+  shipperReceiverForm.value.dispatchNos = selectionList.value.map((item: any) => item.dispatchNo) || [];
 
-  shipperReceiverFormOption.value.column.shipperId.disabled = zLen ==0;
-  shipperReceiverFormOption.value.column.shipperId.rules[0].required  = zLen !=0;
-  shipperReceiverFormOption.value.column.receiverId.disabled = xLen ==0;
-  shipperReceiverFormOption.value.column.receiverId.rules[0].required  = xLen !=0;
+  shipperReceiverFormOption.value.column.shipperId.disabled = zLen == 0;
+  shipperReceiverFormOption.value.column.shipperId.rules[0].required = zLen != 0;
+  shipperReceiverFormOption.value.column.receiverId.disabled = xLen == 0;
+  shipperReceiverFormOption.value.column.receiverId.rules[0].required = xLen != 0;
 
 
   open7.value = true;
@@ -4302,33 +4312,33 @@
   };
   dialForm.value = $DialogForm(appContext)({
     title: '鏂板瑁呰揣鍦�',
-    data:form2.value,
+    data: form2.value,
     width: '80%',
     option: consignorAddOption.value,
     menuPosition: 'right',
-    callback: (res:any,) => {
+    callback: (res: any,) => {
       let data1 = res.data;
-      if (data1.mapLocationDetail){
-        data1.mapLocation = data1.mapLocationDetail[0]+','+data1.mapLocationDetail[1];
+      if (data1.mapLocationDetail) {
+        data1.mapLocation = data1.mapLocationDetail[0] + ',' + data1.mapLocationDetail[1];
         data1.addressDetail = data1.mapLocationDetail[2]
       }
-      addTmsConsignor({...form2.value,...data1}).then(res2=>{
+      addTmsConsignor({ ...form2.value, ...data1 }).then(res2 => {
         let active = res2.data || {};
         if (active) {
           let shipperRegionCode = '';
-          if (active.provinceId){
+          if (active.provinceId) {
             shipperRegionCode = active.provinceId;
           }
-          if (active.cityId){
-            shipperRegionCode =shipperRegionCode+ ","+active.cityId;
+          if (active.cityId) {
+            shipperRegionCode = shipperRegionCode + "," + active.cityId;
 
           }
-          if (active.districtId){
-            shipperRegionCode =shipperRegionCode+ ","+active.districtId;
+          if (active.districtId) {
+            shipperRegionCode = shipperRegionCode + "," + active.districtId;
 
           }
-          if (active.streetId){
-            shipperRegionCode =shipperRegionCode+ ","+active.streetId;
+          if (active.streetId) {
+            shipperRegionCode = shipperRegionCode + "," + active.streetId;
           }
           Object.assign(shipperReceiverForm.value, {
             shipperId: active.id,
@@ -4336,12 +4346,12 @@
             shipperRegionLabel: active.regionLabel,
             shipperAddress: active.addressDetail,
             shipperMobile: active.contactPhone,
-            shipperRegionCode:shipperRegionCode
+            shipperRegionCode: shipperRegionCode
           });
         }
         dialForm.value.close();
         res.done();
-      }).catch(err=>{
+      }).catch(err => {
         res.done();
       })
     },
@@ -4349,7 +4359,7 @@
 }
 
 const handleAddReceiver2 = () => {
-  if (!form.value.customerId){
+  if (!form.value.customerId) {
     return ElMessage.error('璇峰厛閫夋嫨杩愯緭璺嚎');
   }
   form2.value = {
@@ -4359,33 +4369,33 @@
   };
   dialForm.value = $DialogForm(appContext)({
     title: '鏂板鍗歌揣鍦�',
-    data:form2.value,
+    data: form2.value,
     width: '80%',
     option: consignorAddOption.value,
     menuPosition: 'right',
-    callback: (res:any,) => {
+    callback: (res: any,) => {
       let data1 = res.data;
-      if (data1.mapLocationDetail){
-        data1.mapLocation = data1.mapLocationDetail[0]+','+data1.mapLocationDetail[1];
+      if (data1.mapLocationDetail) {
+        data1.mapLocation = data1.mapLocationDetail[0] + ',' + data1.mapLocationDetail[1];
         data1.addressDetail = data1.mapLocationDetail[2]
       }
-      addTmsConsignor({...form2.value,...data1}).then(res2=>{
+      addTmsConsignor({ ...form2.value, ...data1 }).then(res2 => {
         let active = res2.data || {};
         if (active) {
           let receiverRegionCode = '';
-          if (active.provinceId){
+          if (active.provinceId) {
             receiverRegionCode = active.provinceId;
           }
-          if (active.cityId){
-            receiverRegionCode =receiverRegionCode+ ","+active.cityId;
+          if (active.cityId) {
+            receiverRegionCode = receiverRegionCode + "," + active.cityId;
 
           }
-          if (active.districtId){
-            receiverRegionCode =receiverRegionCode+ ","+active.districtId;
+          if (active.districtId) {
+            receiverRegionCode = receiverRegionCode + "," + active.districtId;
 
           }
-          if (active.streetId){
-            receiverRegionCode =receiverRegionCode+ ","+active.streetId;
+          if (active.streetId) {
+            receiverRegionCode = receiverRegionCode + "," + active.streetId;
           }
 
           Object.assign(shipperReceiverForm.value, {
@@ -4394,64 +4404,181 @@
             receiverRegionLabel: active.regionLabel,
             receiverAddress: active.addressDetail,
             receiverMobile: active.contactPhone,
-            receiverRegionCode:receiverRegionCode,
+            receiverRegionCode: receiverRegionCode,
           });
         }
         dialForm.value.close();
         res.done();
-      }).catch(err=>{
+      }).catch(err => {
         res.done();
       })
     },
   })
 }
 
-const handleCloseDispatchNo = (tag:string)=>{
+const handleCloseDispatchNo = (tag: string) => {
   let indexOf = shipperReceiverForm.value.dispatchNos.indexOf(tag);
-  shipperReceiverForm.value.dispatchNos.splice(indexOf,1);
+  shipperReceiverForm.value.dispatchNos.splice(indexOf, 1);
 }
 
-const submitZxForm = ()=>{
-  shipperReceiverFormRef.value.validate((valid: boolean,done:any) => {
-    if(valid){
-      ypdddjSumbit(shipperReceiverForm.value).then(res=>{
+const submitZxForm = () => {
+  shipperReceiverFormRef.value.validate((valid: boolean, done: any) => {
+    if (valid) {
+      ypdddjSumbit(shipperReceiverForm.value).then(res => {
         ElMessage.success('鐧昏鎴愬姛');
         open7.value = false;
         onLoad(page.value);
 
         done();
-      }).catch(err=>{
+      }).catch(err => {
         done();
       })
     }
   })
 }
+const importLogVisible = ref(false);
+const importLogLoading = ref(false);
+const importLogData = ref([]);
 
+// 寮圭獥琛ㄦ牸閰嶇疆
+const importLogOption = {
+  header: false,
+  addBtn: false,
+  menu: false, // 浠呭睍绀猴紝涓嶉渶瑕佹搷浣滃垪
+  column: [
+    { label: '瀵煎叆鏃堕棿', prop: 'importTime', type: 'datetime', format: 'YYYY-MM-DD HH:mm:ss' },
+    { label: '瀵煎叆鏂囦欢鍚嶇О', prop: 'fileName' },
+    { label: '鎿嶄綔浜�', prop: 'operator' },
+    { label: '鎴愬姛琛屾暟', prop: 'successCount' },
+    { label: '澶辫触琛屾暟', prop: 'failureCount' },
+    { label: '澶辫触璇存槑', prop: 'failureDescription', overHidden: true }
+  ]
+};
+
+// 鎵撳紑鏃ュ織寮圭獥
+const handleImportLog = () => {
+  importLogVisible.value = true;
+};
+
+// 鑾峰彇鏃ュ織鍒楄〃鏁版嵁锛堥渶鏍规嵁瀹為檯 API 璋冩暣锛�
+const getImportLogList = () => {
+  importLogData.value = []
+  // 鍋囪鏈変竴涓� getLogApi 鐨勬帴鍙�
+  tmsTmsDispatchOrderImportLog().then(res => {
+    if (res.code == 200) {
+      importLogLoading.value = true;
+      importLogData.value = res.data;
+      importLogLoading.value = false;
+    }
+  });
+
+};
+// 1. 瀹氫箟鍞竴鐨勫彉閲忓悕
+const tmsFinanceDetails = ref([]); // 鏁版嵁婧�
+const expenditureTableOption = ref({
+  addBtn: false,
+  menu: false,
+  header: false,
+  border: true,
+  index: false,
+  selection: false,
+  column: [
+    {
+      label: '璐圭敤绫诲瀷',
+      prop: 'feeTypeName',
+      width: 150
+    },
+    {
+      label: '璐圭敤閲戦',
+      prop: 'actualFeeAmount',
+      slot: true,
+      width: 150
+    },
+    {
+      label: '甯佸埗',
+      prop: 'currency',
+      slot: true,
+      width: 200
+    },
+    {
+
+      label: '璐圭敤鍑瘉',
+      display: true,
+      span: 24,
+      accept: 'string', dataType: 'object',
+      type: 'upload',
+      // action: '/common/upload2',
+
+      prop: 'voucherUrl', // 杩欓噷鏀规垚 prop 灞炴��
+      slot: true,        // 寮�鍚彃妲�
+      width: 200
+    },
+    {
+      label: '澶囨敞',
+      prop: 'remark',
+      slot: true
+    }
+  ]
+});
+// 3. 鍥炴樉鍒濆鍖�
+const initExpenditureData = () => {
+  if (fee_type.value && fee_type.value.length > 0 && tmsFinanceDetails.value.length === 0) {
+    tmsFinanceDetails.value = fee_type.value.map(item => ({
+      feeType: item.value,
+      feeTypeName: item.label,
+      feeAmount: undefined,
+      currency: '',
+      voucherUrl: '',
+      remark: ''
+    }));
+  }
+};
+// 4. 鐩戝惉鍒囨崲
+watch(() => active.value, (val) => {
+  if (val === 'tab4') {
+    initExpenditureData();
+  }
+});
+const handleUploadAfter = (res, done, loading, column, row) => {
+  // res 鏄帴鍙h繑鍥炵殑瀹屾暣鏁版嵁
+  if (res && res.url) {
+    // 鎵嬪姩缁欒繖涓�琛岀殑鏁版嵁璧嬪��
+    row.voucherUrl = res.url;
+    console.log('涓婁紶鎴愬姛锛屽綋鍓嶈鏁版嵁锛�', row);
+  } else if (res.data && res.data.url) {
+    // 濡傛灉杩斿洖鐨勬暟鎹寘瑁瑰湪 data 閲�
+    row.voucherUrl = res.data.url;
+  }
+  done(); // 蹇呴』璋冪敤 done 缁撴潫涓婁紶鐘舵��
+};
 </script>
 <style lang="scss" scoped>
-
-::v-deep .cydprint .el-dialog__body{
- overflow: hidden;
+::v-deep .cydprint .el-dialog__body {
+  overflow: hidden;
   //padding: 0;
   margin: 0;
 }
-#print{
-  .title{
+
+#print {
+  .title {
     text-align: center;
     font-size: 14pt;
     color: #000;
-    line-height:23pt;
+    line-height: 23pt;
     font-weight: bold;
     margin: 0;
   }
-  .header{
-   position: relative;
-    .order{
+
+  .header {
+    position: relative;
+
+    .order {
       font-size: 12pt;
       color: #000;
       line-height: 23pt;
     }
-    .sub-title{
+
+    .sub-title {
       position: absolute;
       left: 50%;
       transform: translateX(-50%);
@@ -4466,22 +4593,29 @@
 
   table {
     width: 100%;
-    border-collapse: collapse; /* 鍚堝苟杈规 */
+    border-collapse: collapse;
+    /* 鍚堝苟杈规 */
     font-size: 12px;
-    table-layout: fixed; /* 鍏抽敭鐐� */
+    table-layout: fixed;
+    /* 鍏抽敭鐐� */
   }
-  table, td {
+
+  table,
+  td {
     border: 1px solid #000;
 
   }
+
   td {
     padding: 4px;
     vertical-align: middle;
-    width: 50%;          /* 寮哄埗绛夊 */
+    width: 50%;
+    /* 寮哄埗绛夊 */
     word-break: break-all;
   }
 }
-.dispatchNos{
+
+.dispatchNos {
   //border: 1px solid #ebeef5;
   border-radius: 4px;
   min-height: 73px;

--
Gitblit v1.8.0