From 4f7d8924b8c5f4f019b16a8563e30c48abef441e Mon Sep 17 00:00:00 2001
From: sen <sen@qq.com>
Date: 星期一, 01 九月 2025 13:30:50 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/yagwly_fa_master' into yagwly_fa_master

---
 service/src/main/resources/mapper/cwgl/RequestLogMapper.xml                           |  137 +++
 service/src/main/java/com/ruoyi/cwgl/domain/KeyCollectionInfo.java                    |  176 ++++
 service/src/main/java/com/ruoyi/cwgl/domain/RequestLog.java                           |   77 +
 admin/src/main/resources/application-custom.yml                                       |    1 
 service/src/main/java/com/ruoyi/cwgl/service/impl/EstimatedReceivableServiceImpl.java |   27 
 service/src/main/resources/mapper/cwgl/PendingSettlementBusinessMapper.xml            |    6 
 pom.xml                                                                               |    1 
 service/src/main/resources/mapper/cwgl/KeyCollectionInfoMapper.xml                    |  264 ++++++
 ui/admin-ui3/src/api/cwgl/keyCollectionInfo.ts                                        |   67 +
 ui/admin-ui3/src/views/cwgl/keyCollectionInfo/index.vue                               |  181 ++++
 quartz/src/main/java/com/ruoyi/quartz/task/SettlementTask.java                        |    3 
 service/src/main/java/com/ruoyi/cwgl/service/impl/KeyCollectionInfoServiceImpl.java   |  217 +++++
 service/src/main/java/com/ruoyi/cwgl/service/IKeyCollectionInfoService.java           |  116 ++
 service/src/main/java/com/ruoyi/cwgl/controller/KeyCollectionInfoController.java      |  108 ++
 service/src/main/java/com/ruoyi/cwgl/domain/dto/TakeReviewDto.java                    |   24 
 api/pom.xml                                                                           |   29 
 ui/admin-ui3/src/api/cwgl/requestLog.ts                                               |   67 +
 service/src/main/java/com/ruoyi/cwgl/controller/RequestLogController.java             |  108 ++
 api/src/main/java/com/ruoyi/api/controller/LockerApiController.java                   |   73 +
 service/src/main/java/com/ruoyi/cwgl/mapper/KeyCollectionInfoMapper.java              |   90 ++
 service/src/main/java/com/ruoyi/cwgl/mapper/RequestLogMapper.java                     |   87 ++
 service/src/main/java/com/ruoyi/cwgl/domain/dto/ReturnReportDto.java                  |   24 
 service/src/main/java/com/ruoyi/cwgl/service/impl/RequestLogServiceImpl.java          |  181 ++++
 service/src/main/java/com/ruoyi/cwgl/service/IRequestLogService.java                  |  102 ++
 ui/admin-ui3/src/views/cwgl/requestLog/index.vue                                      |  139 +++
 25 files changed, 2,300 insertions(+), 5 deletions(-)

diff --git a/admin/src/main/resources/application-custom.yml b/admin/src/main/resources/application-custom.yml
index 51db08d..2d1f2bf 100644
--- a/admin/src/main/resources/application-custom.yml
+++ b/admin/src/main/resources/application-custom.yml
@@ -83,6 +83,7 @@
       /captchaImage
       /actuator/**
       /*/api-docs
+      /api/**
       /druid/**
       /webjars/**
       /swagger-resources/**
diff --git a/api/pom.xml b/api/pom.xml
new file mode 100644
index 0000000..cd72684
--- /dev/null
+++ b/api/pom.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>manage</artifactId>
+        <groupId>com.ruoyi</groupId>
+        <version>master</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>api</artifactId>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>api-remote</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>service</artifactId>
+            <version>master</version>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file
diff --git a/api/src/main/java/com/ruoyi/api/controller/LockerApiController.java b/api/src/main/java/com/ruoyi/api/controller/LockerApiController.java
new file mode 100644
index 0000000..ad837e0
--- /dev/null
+++ b/api/src/main/java/com/ruoyi/api/controller/LockerApiController.java
@@ -0,0 +1,73 @@
+package com.ruoyi.api.controller;
+
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.cwgl.domain.KeyCollectionInfo;
+import com.ruoyi.cwgl.domain.RequestLog;
+import com.ruoyi.cwgl.domain.dto.ReturnReportDto;
+import com.ruoyi.cwgl.domain.dto.TakeReviewDto;
+import com.ruoyi.cwgl.service.IKeyCollectionInfoService;
+import com.ruoyi.cwgl.service.IRequestLogService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+/**
+ * 鍌ㄧ墿鏌滄帴鍙�
+ * @author wjw
+ */
+@RestController
+@RequestMapping("/api/third/locker/")
+public class LockerApiController {
+
+    @Autowired
+    private IKeyCollectionInfoService keyCollectionInfoService;
+    @Autowired
+    private IRequestLogService logService;
+
+    /**
+     * 涓婃姤鍙栧嚭瀹℃牳
+     */
+
+    @PostMapping("takeReview")
+    public AjaxResult takeReview(@RequestBody TakeReviewDto takeReviewDto){
+
+        KeyCollectionInfo keyCollectionInfo = keyCollectionInfoService.selectCwData(takeReviewDto);
+        //娣诲姞璇锋眰鏃ュ織
+        RequestLog requestLog = new RequestLog();
+        requestLog.setDriverCode(takeReviewDto.getDriverCode());
+        requestLog.setDriverName(takeReviewDto.getDriverName());
+        requestLog.setReqTime(DateUtils.parseDate(takeReviewDto.getHandleTime()));
+        requestLog.setType(0);
+        logService.insertRequestLog(requestLog);
+
+        return keyCollectionInfoService.takeReview(keyCollectionInfo);
+
+
+    }
+
+    /**
+     * 褰掕繕涓婃姤
+     */
+
+    @PostMapping("returnReport")
+    public AjaxResult returnReport(@RequestBody ReturnReportDto returnReportDto){
+
+        //娣诲姞璇锋眰鏃ュ織
+        RequestLog requestLog = new RequestLog();
+        requestLog.setDriverCode(returnReportDto.getDriverCode());
+        requestLog.setBoxNum(returnReportDto.getBoxNum());
+        requestLog.setReqTime(DateUtils.parseDate(returnReportDto.getSaveTime()));
+        requestLog.setType(1);
+        logService.insertRequestLog(requestLog);
+
+        return AjaxResult.success();
+
+
+    }
+
+
+}
diff --git a/pom.xml b/pom.xml
index d02d130..92d3541 100644
--- a/pom.xml
+++ b/pom.xml
@@ -18,6 +18,7 @@
         <module>quartz</module>
         <module>common</module>
         <module>service</module>
+        <module>api</module>
     </modules>
     <packaging>pom</packaging>
 
diff --git a/quartz/src/main/java/com/ruoyi/quartz/task/SettlementTask.java b/quartz/src/main/java/com/ruoyi/quartz/task/SettlementTask.java
index 2ad1316..a32967c 100644
--- a/quartz/src/main/java/com/ruoyi/quartz/task/SettlementTask.java
+++ b/quartz/src/main/java/com/ruoyi/quartz/task/SettlementTask.java
@@ -49,6 +49,9 @@
         List<EstimatedReceivable> estimatedReceivables = new ArrayList<>();
         for (PendingSettlementBusiness pendingSettlementBusiness : pendingSettlementBusinesses) {
             pendingSettlementBusiness.setIsCreate(0);
+            pendingSettlementBusiness.setEstimatedTotalCost(BigDecimal.ZERO);
+
+            pendingSettlementBusiness.setEstimatedTotalIncome(BigDecimal.ZERO);
             ReceivableLineTruckPriceRule exactMatchingRule = ExactPricingRuleMatcher.findExactMatchingRule(receivableLineTruckPriceRules, pendingSettlementBusiness.getCustomerName(), pendingSettlementBusiness.getDepartureLocation(), pendingSettlementBusiness.getArrivalLocation(), pendingSettlementBusiness.getVehicleType());
             if (exactMatchingRule!=null) {
                 //搴旀敹鏁版嵁
diff --git a/service/src/main/java/com/ruoyi/cwgl/controller/KeyCollectionInfoController.java b/service/src/main/java/com/ruoyi/cwgl/controller/KeyCollectionInfoController.java
new file mode 100644
index 0000000..613940b
--- /dev/null
+++ b/service/src/main/java/com/ruoyi/cwgl/controller/KeyCollectionInfoController.java
@@ -0,0 +1,108 @@
+package com.ruoyi.cwgl.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.cwgl.domain.KeyCollectionInfo;
+import com.ruoyi.cwgl.service.IKeyCollectionInfoService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 閽ュ寵棰嗗彇淇℃伅Controller
+ *
+ * @author ruoyi
+ * @date 2025-08-27
+ */
+@RestController
+@RequestMapping("/cwgl/keyCollectionInfo")
+public class KeyCollectionInfoController extends BaseController
+{
+    @Autowired
+    private IKeyCollectionInfoService keyCollectionInfoService;
+
+
+
+    /**
+     * 鏌ヨ閽ュ寵棰嗗彇淇℃伅鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('cwgl:keyCollectionInfo:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(KeyCollectionInfo keyCollectionInfo)
+    {
+        startPage();
+        List<KeyCollectionInfo> list = keyCollectionInfoService.selectKeyCollectionInfoList(keyCollectionInfo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭閽ュ寵棰嗗彇淇℃伅鍒楄〃
+     * @param keyCollectionInfo 鏌ヨ鏉′欢瀵硅薄
+     */
+    @PreAuthorize("@ss.hasPermi('cwgl:keyCollectionInfo:export')")
+    @Log(title = "閽ュ寵棰嗗彇淇℃伅", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(KeyCollectionInfo keyCollectionInfo,String exportKey)
+    {
+        keyCollectionInfoService.export(keyCollectionInfo,exportKey);
+        return AjaxResult.success("瀵煎嚭璇锋眰鎴愬姛锛岃绋嶅悗鐐瑰嚮涓嬭浇...!");
+    }
+
+
+
+    /**
+     * 鑾峰彇閽ュ寵棰嗗彇淇℃伅璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('cwgl:keyCollectionInfo:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Integer id)
+    {
+        return AjaxResult.success(keyCollectionInfoService.selectKeyCollectionInfoById(id));
+    }
+
+    /**
+     * 鏂板閽ュ寵棰嗗彇淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('cwgl:keyCollectionInfo:add')")
+    @Log(title = "閽ュ寵棰嗗彇淇℃伅", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody KeyCollectionInfo keyCollectionInfo)
+    {
+        return toAjax(keyCollectionInfoService.insertKeyCollectionInfo(keyCollectionInfo));
+    }
+
+    /**
+     * 淇敼閽ュ寵棰嗗彇淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('cwgl:keyCollectionInfo:edit')")
+    @Log(title = "閽ュ寵棰嗗彇淇℃伅", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody KeyCollectionInfo keyCollectionInfo)
+    {
+        return toAjax(keyCollectionInfoService.updateKeyCollectionInfo(keyCollectionInfo));
+    }
+
+    /**
+     * 鍒犻櫎閽ュ寵棰嗗彇淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('cwgl:keyCollectionInfo:remove')")
+    @Log(title = "閽ュ寵棰嗗彇淇℃伅", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Integer[] ids)
+    {
+        return toAjax(keyCollectionInfoService.deleteKeyCollectionInfoByIds(ids));
+    }
+}
diff --git a/service/src/main/java/com/ruoyi/cwgl/controller/RequestLogController.java b/service/src/main/java/com/ruoyi/cwgl/controller/RequestLogController.java
new file mode 100644
index 0000000..3a213d7
--- /dev/null
+++ b/service/src/main/java/com/ruoyi/cwgl/controller/RequestLogController.java
@@ -0,0 +1,108 @@
+package com.ruoyi.cwgl.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.cwgl.domain.RequestLog;
+import com.ruoyi.cwgl.service.IRequestLogService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 璇锋眰鏃ュ織Controller
+ *
+ * @author ruoyi
+ * @date 2025-08-27
+ */
+@RestController
+@RequestMapping("/cwgl/requestLog")
+public class RequestLogController extends BaseController
+{
+    @Autowired
+    private IRequestLogService requestLogService;
+
+
+
+    /**
+     * 鏌ヨ璇锋眰鏃ュ織鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('cwgl:requestLog:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(RequestLog requestLog)
+    {
+        startPage();
+        List<RequestLog> list = requestLogService.selectRequestLogList(requestLog);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭璇锋眰鏃ュ織鍒楄〃
+     * @param requestLog 鏌ヨ鏉′欢瀵硅薄
+     */
+    @PreAuthorize("@ss.hasPermi('cwgl:requestLog:export')")
+    @Log(title = "璇锋眰鏃ュ織", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(RequestLog requestLog,String exportKey)
+    {
+        requestLogService.export(requestLog,exportKey);
+        return AjaxResult.success("瀵煎嚭璇锋眰鎴愬姛锛岃绋嶅悗鐐瑰嚮涓嬭浇...!");
+    }
+
+
+
+    /**
+     * 鑾峰彇璇锋眰鏃ュ織璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('cwgl:requestLog:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Integer id)
+    {
+        return AjaxResult.success(requestLogService.selectRequestLogById(id));
+    }
+
+    /**
+     * 鏂板璇锋眰鏃ュ織
+     */
+    @PreAuthorize("@ss.hasPermi('cwgl:requestLog:add')")
+    @Log(title = "璇锋眰鏃ュ織", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody RequestLog requestLog)
+    {
+        return toAjax(requestLogService.insertRequestLog(requestLog));
+    }
+
+    /**
+     * 淇敼璇锋眰鏃ュ織
+     */
+    @PreAuthorize("@ss.hasPermi('cwgl:requestLog:edit')")
+    @Log(title = "璇锋眰鏃ュ織", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody RequestLog requestLog)
+    {
+        return toAjax(requestLogService.updateRequestLog(requestLog));
+    }
+
+    /**
+     * 鍒犻櫎璇锋眰鏃ュ織
+     */
+    @PreAuthorize("@ss.hasPermi('cwgl:requestLog:remove')")
+    @Log(title = "璇锋眰鏃ュ織", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Integer[] ids)
+    {
+        return toAjax(requestLogService.deleteRequestLogByIds(ids));
+    }
+}
diff --git a/service/src/main/java/com/ruoyi/cwgl/domain/KeyCollectionInfo.java b/service/src/main/java/com/ruoyi/cwgl/domain/KeyCollectionInfo.java
new file mode 100644
index 0000000..93e947e
--- /dev/null
+++ b/service/src/main/java/com/ruoyi/cwgl/domain/KeyCollectionInfo.java
@@ -0,0 +1,176 @@
+package com.ruoyi.cwgl.domain;
+
+import java.util.Date;
+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;
+/**
+ * 閽ュ寵棰嗗彇淇℃伅瀵硅薄 key_collection_info
+ *
+ * @author ruoyi
+ * @date 2025-08-27
+ */
+@Data
+public class KeyCollectionInfo{
+
+
+    /** ID */
+        @TableField("id")
+    private Integer id;
+
+
+    /** 瀹㈡埛鍚嶇О */
+    @Excel(name = "瀹㈡埛鍚嶇О")
+
+        @TableField("customer_name")
+    private String customerName;
+
+
+    /** 鎵胯繍鍟� */
+    @Excel(name = "鎵胯繍鍟�")
+
+        @TableField("carrier")
+    private String carrier;
+
+
+    /** 璋冨害鍗曞彿 */
+    @Excel(name = "璋冨害鍗曞彿")
+
+        @TableField("dispatch_no")
+    private String dispatchNo;
+
+
+    /** 鍙告満鍚嶇О */
+    @Excel(name = "鍙告満鍚嶇О")
+
+        @TableField("driver_name")
+    private String driverName;
+
+
+    /** 鍙告満鎵嬫満鍙� */
+    @Excel(name = "鍙告満鎵嬫満鍙�")
+    @TableField("driver_mobile")
+    private String driverMobile;
+
+
+    /** 杞︾墝鍙� */
+    @Excel(name = "杞︾墝鍙�")
+    @TableField("license_plate_number")
+    private String licensePlateNumber;
+
+
+    /** 璁㈠崟涓嬪崟鏃堕棿 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "璁㈠崟涓嬪崟鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    @TableField("order_time")
+    private Date orderTime;
+
+
+    /** 璁㈠崟鍒涘缓鏃堕棿 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "璁㈠崟鍒涘缓鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    @TableField("order_created_time")
+    private Date orderCreatedTime;
+
+
+    /** 璋冨害鍗曞垱寤烘椂闂� */
+    @Excel(name = "璋冨害鍗曞垱寤烘椂闂�", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField("dispatch_created_time")
+    private Date dispatchCreatedTime;
+
+
+    /** 閽ュ寵棰嗗彇鏃堕棿锛堣姹傛煡璇㈡椂闂达級 */
+    @Excel(name = "閽ュ寵棰嗗彇鏃堕棿", readConverterExp = "璇�=姹傛煡璇㈡椂闂�")
+
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+        @TableField("key_collection_time")
+    private Date keyCollectionTime;
+
+
+    /** 棰勮鍑哄彂鏃堕棿 */
+    @Excel(name = "棰勮鍑哄彂鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField("estimated_departure_time")
+    private Date estimatedDepartureTime;
+
+
+    /** 瑕佹眰鍒拌揪鏃堕棿 */
+    @Excel(name = "瑕佹眰鍒拌揪鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField("required_arrival_time")
+    private Date requiredArrivalTime;
+
+
+    /** 鍑哄彂鍦板湴鍧� */
+    @Excel(name = "鍑哄彂鍦板湴鍧�")
+
+        @TableField("consignor_address")
+    private String consignorAddress;
+
+
+    /** 鐩殑鍦板湴鍧� */
+    @Excel(name = "鐩殑鍦板湴鍧�")
+
+        @TableField("consignee_address")
+    private String consigneeAddress;
+
+
+    /** 涓婚┚椹跺憳 */
+    @Excel(name = "涓婚┚椹跺憳")
+
+        @TableField("main_driver")
+    private String mainDriver;
+
+
+    /** 鎻愰�佽揣鐐规暟 */
+    @Excel(name = "鎻愰�佽揣鐐规暟")
+
+        @TableField("point_num")
+    private Integer pointNum;
+
+
+    /** 杩愯緭鏂瑰紡 */
+    @Excel(name = "杩愯緭鏂瑰紡")
+    @TableField("transport_mode")
+    private String transportMode;
+
+
+    /** 鍓┚椹跺憳 */
+    @Excel(name = "鍓┚椹跺憳")
+    @TableField("assistant_driver")
+    private String assistantDriver;
+
+
+    /** 浠舵暟 */
+    @Excel(name = "浠舵暟")
+    @TableField("quantity")
+    private Integer quantity;
+
+
+    /** 瀹炲彂浠舵暟 */
+    @Excel(name = "瀹炲彂浠舵暟")
+    @TableField("dispatch_quantity")
+    private Integer dispatchQuantity;
+
+
+    /** 澶囨敞 */
+    @Excel(name = "澶囨敞")
+    @TableField("remark")
+    private String remark;
+
+    /**
+     * 璋冨害瓒呮椂涓嬪崟锛岃秴鏃�?涓皬鏃�
+     */
+    @TableField(exist = false)
+    private Integer schedulingTimeout;
+
+    /**
+     * '棰勮鍑哄彂鏃堕棿 & ord.ESTIMATED_DEPARTURE_TIME 锛岄鍙栭挜鍖欒秴鏃禢涓皬鏃�'
+     */
+    @TableField(exist = false)
+    private Integer keyTimeout;
+
+}
diff --git a/service/src/main/java/com/ruoyi/cwgl/domain/RequestLog.java b/service/src/main/java/com/ruoyi/cwgl/domain/RequestLog.java
new file mode 100644
index 0000000..3900da7
--- /dev/null
+++ b/service/src/main/java/com/ruoyi/cwgl/domain/RequestLog.java
@@ -0,0 +1,77 @@
+package com.ruoyi.cwgl.domain;
+
+import java.util.Date;
+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;
+/**
+ * 璇锋眰鏃ュ織瀵硅薄 request_log
+ *
+ * @author ruoyi
+ * @date 2025-08-27
+ */
+@Data
+public class RequestLog{
+
+
+    /** 涓婚敭 */
+        @TableField("id")
+    private Integer id;
+
+
+    /** 鍙告満鍞竴缂栧彿 */
+    @Excel(name = "鍙告満鍞竴缂栧彿")
+
+        @TableField("driver_code")
+    private String driverCode;
+
+
+    /** 鍙告満濮撳悕 */
+    @Excel(name = "鍙告満濮撳悕")
+
+        @TableField("driver_name")
+    private String driverName;
+
+
+    /** 鏌滈棬缂栧彿 */
+    @Excel(name = "鏌滈棬缂栧彿")
+
+        @TableField("box_num")
+    private String boxNum;
+
+
+    /** 鍒涘缓鑰� */
+        @TableField("create_by")
+    private String createBy;
+
+
+    /** 鍒涘缓鏃堕棿 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField("create_time")
+    private Date createTime;
+
+
+    /** 璇锋眰鏃堕棿 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "璇锋眰鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    @TableField("req_time")
+    private Date reqTime;
+
+
+    /** 0涓婃姤鍙栧嚭1褰掕繕涓婃姤 */
+    @Excel(name = "0涓婃姤鍙栧嚭1褰掕繕涓婃姤")
+
+        @TableField("type")
+    private Integer type;
+
+
+    /** 鎿嶄綔璇存槑 */
+    @Excel(name = "鎿嶄綔璇存槑")
+
+        @TableField("operation")
+    private String operation;
+
+
+}
diff --git a/service/src/main/java/com/ruoyi/cwgl/domain/dto/ReturnReportDto.java b/service/src/main/java/com/ruoyi/cwgl/domain/dto/ReturnReportDto.java
new file mode 100644
index 0000000..e36affa
--- /dev/null
+++ b/service/src/main/java/com/ruoyi/cwgl/domain/dto/ReturnReportDto.java
@@ -0,0 +1,24 @@
+package com.ruoyi.cwgl.domain.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 涓婃姤鍙栧嚭瀹℃牳dto
+ */
+@Data
+public class ReturnReportDto {
+
+
+    /**鏌滈棬缂栧彿*/
+    @NotBlank(message = "鏌滈棬缂栧彿涓嶈兘涓虹┖")
+    private  String boxNum ;
+    /**鍙告満鍞竴缂栧彿*/
+    @NotBlank(message = "鍙告満鍞竴缂栧彿涓嶈兘涓虹┖")
+    private  String driverCode ;
+    /**鍙告満鍞竴缂栧彿*/
+    @NotBlank(message = "瀛樺叆鏃堕棿涓嶈兘涓虹┖")
+    private  String saveTime ;
+
+}
diff --git a/service/src/main/java/com/ruoyi/cwgl/domain/dto/TakeReviewDto.java b/service/src/main/java/com/ruoyi/cwgl/domain/dto/TakeReviewDto.java
new file mode 100644
index 0000000..2edad47
--- /dev/null
+++ b/service/src/main/java/com/ruoyi/cwgl/domain/dto/TakeReviewDto.java
@@ -0,0 +1,24 @@
+package com.ruoyi.cwgl.domain.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 涓婃姤鍙栧嚭瀹℃牳dto
+ */
+@Data
+public class TakeReviewDto {
+
+
+    /**鍙告満鍞竴缂栧彿*/
+    @NotBlank(message = "鍙告満鍞竴缂栧彿涓嶈兘涓虹┖")
+    private  String driverCode ;
+    /**鍙告満濮撳悕*/
+    @NotBlank(message = "鍙告満濮撳悕涓嶈兘涓虹┖")
+    private  String driverName ;
+    /**鍙告満鍞竴缂栧彿*/
+    @NotBlank(message = "璇锋眰寮�闂ㄦ椂闂翠笉鑳戒负绌�")
+    private  String handleTime ;
+
+}
diff --git a/service/src/main/java/com/ruoyi/cwgl/mapper/KeyCollectionInfoMapper.java b/service/src/main/java/com/ruoyi/cwgl/mapper/KeyCollectionInfoMapper.java
new file mode 100644
index 0000000..3aedc58
--- /dev/null
+++ b/service/src/main/java/com/ruoyi/cwgl/mapper/KeyCollectionInfoMapper.java
@@ -0,0 +1,90 @@
+package com.ruoyi.cwgl.mapper;
+
+import java.util.List;
+import com.ruoyi.cwgl.domain.KeyCollectionInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.cwgl.domain.dto.TakeReviewDto;
+
+
+/**
+ * 閽ュ寵棰嗗彇淇℃伅Mapper鎺ュ彛
+ * 
+ * @author ruoyi
+ * @date 2025-08-27
+ */
+public interface KeyCollectionInfoMapper  extends BaseMapper<KeyCollectionInfo>
+{
+    /**
+     * 鏌ヨ閽ュ寵棰嗗彇淇℃伅
+     * 
+     * @param id 閽ュ寵棰嗗彇淇℃伅ID
+     * @return 閽ュ寵棰嗗彇淇℃伅
+     */
+    public KeyCollectionInfo selectKeyCollectionInfoById(Integer id);
+
+    /**
+     * 鏌ヨ閽ュ寵棰嗗彇淇℃伅 璁板綍鏁�
+     *
+     * @param keyCollectionInfo 閽ュ寵棰嗗彇淇℃伅
+     * @return 閽ュ寵棰嗗彇淇℃伅闆嗗悎
+     */
+    public int selectKeyCollectionInfoCount(KeyCollectionInfo keyCollectionInfo);
+
+    /**
+     * 鏌ヨ閽ュ寵棰嗗彇淇℃伅鍒楄〃
+     * 
+     * @param keyCollectionInfo 閽ュ寵棰嗗彇淇℃伅
+     * @return 閽ュ寵棰嗗彇淇℃伅闆嗗悎
+     */
+    public List<KeyCollectionInfo> selectKeyCollectionInfoList(KeyCollectionInfo keyCollectionInfo);
+
+    /**
+     * 鏂板閽ュ寵棰嗗彇淇℃伅
+     * 
+     * @param keyCollectionInfo 閽ュ寵棰嗗彇淇℃伅
+     * @return 缁撴灉
+     */
+    public int insertKeyCollectionInfo(KeyCollectionInfo keyCollectionInfo);
+
+    /**
+     * 鏂板閽ュ寵棰嗗彇淇℃伅[鎵归噺]
+     *
+     * @param keyCollectionInfos 閽ュ寵棰嗗彇淇℃伅
+     * @return 缁撴灉
+     */
+    public int insertKeyCollectionInfoBatch(List<KeyCollectionInfo> keyCollectionInfos);
+
+    /**
+     * 淇敼閽ュ寵棰嗗彇淇℃伅
+     * 
+     * @param keyCollectionInfo 閽ュ寵棰嗗彇淇℃伅
+     * @return 缁撴灉
+     */
+    public int updateKeyCollectionInfo(KeyCollectionInfo keyCollectionInfo);
+
+    /**
+     * 淇敼閽ュ寵棰嗗彇淇℃伅[鎵归噺]
+     *
+     * @param keyCollectionInfos 閽ュ寵棰嗗彇淇℃伅
+     * @return 缁撴灉
+     */
+    public int updateKeyCollectionInfoBatch(List<KeyCollectionInfo> keyCollectionInfos);
+
+    /**
+     * 鍒犻櫎閽ュ寵棰嗗彇淇℃伅
+     * 
+     * @param id 閽ュ寵棰嗗彇淇℃伅ID
+     * @return 缁撴灉
+     */
+    public int deleteKeyCollectionInfoById(Integer id);
+
+    /**
+     * 鎵归噺鍒犻櫎閽ュ寵棰嗗彇淇℃伅
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteKeyCollectionInfoByIds(Integer[] ids);
+
+    KeyCollectionInfo selectCwData(TakeReviewDto takeReviewDto);
+}
diff --git a/service/src/main/java/com/ruoyi/cwgl/mapper/RequestLogMapper.java b/service/src/main/java/com/ruoyi/cwgl/mapper/RequestLogMapper.java
new file mode 100644
index 0000000..dd76967
--- /dev/null
+++ b/service/src/main/java/com/ruoyi/cwgl/mapper/RequestLogMapper.java
@@ -0,0 +1,87 @@
+package com.ruoyi.cwgl.mapper;
+
+import java.util.List;
+import com.ruoyi.cwgl.domain.RequestLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+
+/**
+ * 璇锋眰鏃ュ織Mapper鎺ュ彛
+ * 
+ * @author ruoyi
+ * @date 2025-08-27
+ */
+public interface RequestLogMapper  extends BaseMapper<RequestLog>
+{
+    /**
+     * 鏌ヨ璇锋眰鏃ュ織
+     * 
+     * @param id 璇锋眰鏃ュ織ID
+     * @return 璇锋眰鏃ュ織
+     */
+    public RequestLog selectRequestLogById(Integer id);
+
+    /**
+     * 鏌ヨ璇锋眰鏃ュ織 璁板綍鏁�
+     *
+     * @param requestLog 璇锋眰鏃ュ織
+     * @return 璇锋眰鏃ュ織闆嗗悎
+     */
+    public int selectRequestLogCount(RequestLog requestLog);
+
+    /**
+     * 鏌ヨ璇锋眰鏃ュ織鍒楄〃
+     * 
+     * @param requestLog 璇锋眰鏃ュ織
+     * @return 璇锋眰鏃ュ織闆嗗悎
+     */
+    public List<RequestLog> selectRequestLogList(RequestLog requestLog);
+
+    /**
+     * 鏂板璇锋眰鏃ュ織
+     * 
+     * @param requestLog 璇锋眰鏃ュ織
+     * @return 缁撴灉
+     */
+    public int insertRequestLog(RequestLog requestLog);
+
+    /**
+     * 鏂板璇锋眰鏃ュ織[鎵归噺]
+     *
+     * @param requestLogs 璇锋眰鏃ュ織
+     * @return 缁撴灉
+     */
+    public int insertRequestLogBatch(List<RequestLog> requestLogs);
+
+    /**
+     * 淇敼璇锋眰鏃ュ織
+     * 
+     * @param requestLog 璇锋眰鏃ュ織
+     * @return 缁撴灉
+     */
+    public int updateRequestLog(RequestLog requestLog);
+
+    /**
+     * 淇敼璇锋眰鏃ュ織[鎵归噺]
+     *
+     * @param requestLogs 璇锋眰鏃ュ織
+     * @return 缁撴灉
+     */
+    public int updateRequestLogBatch(List<RequestLog> requestLogs);
+
+    /**
+     * 鍒犻櫎璇锋眰鏃ュ織
+     * 
+     * @param id 璇锋眰鏃ュ織ID
+     * @return 缁撴灉
+     */
+    public int deleteRequestLogById(Integer id);
+
+    /**
+     * 鎵归噺鍒犻櫎璇锋眰鏃ュ織
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteRequestLogByIds(Integer[] ids);
+}
diff --git a/service/src/main/java/com/ruoyi/cwgl/service/IKeyCollectionInfoService.java b/service/src/main/java/com/ruoyi/cwgl/service/IKeyCollectionInfoService.java
new file mode 100644
index 0000000..88cf9e7
--- /dev/null
+++ b/service/src/main/java/com/ruoyi/cwgl/service/IKeyCollectionInfoService.java
@@ -0,0 +1,116 @@
+package com.ruoyi.cwgl.service;
+
+import java.util.List;
+
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.cwgl.domain.KeyCollectionInfo;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.cwgl.domain.dto.TakeReviewDto;
+
+/**
+ * 閽ュ寵棰嗗彇淇℃伅Service鎺ュ彛
+ * 
+ * @author ruoyi
+ * @date 2025-08-27
+ */
+public interface IKeyCollectionInfoService extends IService<KeyCollectionInfo>
+{
+    /**
+     * 鏌ヨ閽ュ寵棰嗗彇淇℃伅
+     * 
+     * @param id 閽ュ寵棰嗗彇淇℃伅ID
+     * @return 閽ュ寵棰嗗彇淇℃伅
+     */
+    public KeyCollectionInfo selectKeyCollectionInfoById(Integer id);
+
+    /**
+     * 鏌ヨ閽ュ寵棰嗗彇淇℃伅 璁板綍鏁�
+     *
+     * @param keyCollectionInfo 閽ュ寵棰嗗彇淇℃伅
+     * @return 閽ュ寵棰嗗彇淇℃伅闆嗗悎
+     */
+    public int selectKeyCollectionInfoCount(KeyCollectionInfo keyCollectionInfo);
+
+    /**
+     * 鏌ヨ閽ュ寵棰嗗彇淇℃伅鍒楄〃
+     * 
+     * @param keyCollectionInfo 閽ュ寵棰嗗彇淇℃伅
+     * @return 閽ュ寵棰嗗彇淇℃伅闆嗗悎
+     */
+    public List<KeyCollectionInfo> selectKeyCollectionInfoList(KeyCollectionInfo keyCollectionInfo);
+
+    /**
+     * 鏌ヨ閽ュ寵棰嗗彇淇℃伅鍒楄〃 寮傛 瀵煎嚭
+     *
+     * @param keyCollectionInfo 閽ュ寵棰嗗彇淇℃伅
+     * @param exportKey 瀵煎嚭鍔熻兘鐨勫敮涓�鏍囪瘑
+     * @return 閽ュ寵棰嗗彇淇℃伅闆嗗悎
+     */
+    public void export(KeyCollectionInfo keyCollectionInfo, String exportKey) ;
+
+
+    /**
+     * 鏂板閽ュ寵棰嗗彇淇℃伅
+     * 
+     * @param keyCollectionInfo 閽ュ寵棰嗗彇淇℃伅
+     * @return 缁撴灉
+     */
+    public int insertKeyCollectionInfo(KeyCollectionInfo keyCollectionInfo);
+
+    /**
+     * 鏂板閽ュ寵棰嗗彇淇℃伅[鎵归噺]
+     *
+     * @param keyCollectionInfos 閽ュ寵棰嗗彇淇℃伅
+     * @return 缁撴灉
+     */
+    public int insertKeyCollectionInfoBatch(List<KeyCollectionInfo> keyCollectionInfos);
+
+    /**
+     * 淇敼閽ュ寵棰嗗彇淇℃伅
+     * 
+     * @param keyCollectionInfo 閽ュ寵棰嗗彇淇℃伅
+     * @return 缁撴灉
+     */
+    public int updateKeyCollectionInfo(KeyCollectionInfo keyCollectionInfo);
+
+    /**
+     * 淇敼閽ュ寵棰嗗彇淇℃伅[鎵归噺]
+     *
+     * @param keyCollectionInfos 閽ュ寵棰嗗彇淇℃伅
+     * @return 缁撴灉
+     */
+    public int updateKeyCollectionInfoBatch(List<KeyCollectionInfo> keyCollectionInfos);
+    /**
+     * 鎵归噺鍒犻櫎閽ュ寵棰嗗彇淇℃伅
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteKeyCollectionInfoByIds(String ids);
+
+    /**
+     * 鎵归噺鍒犻櫎閽ュ寵棰嗗彇淇℃伅
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteKeyCollectionInfoByIds(Integer[] ids);
+
+    /**
+     * 鍒犻櫎閽ュ寵棰嗗彇淇℃伅淇℃伅
+     * 
+     * @param id 閽ュ寵棰嗗彇淇℃伅ID
+     * @return 缁撴灉
+     */
+    public int deleteKeyCollectionInfoById(Integer id);
+
+    public KeyCollectionInfo selectCwData(TakeReviewDto takeReviewDto);
+
+    /**
+     *  涓婃姤鍙栧嚭瀹℃牳
+     * @param keyCollectionInfo
+     * @return
+     */
+    AjaxResult takeReview(KeyCollectionInfo keyCollectionInfo);
+
+}
diff --git a/service/src/main/java/com/ruoyi/cwgl/service/IRequestLogService.java b/service/src/main/java/com/ruoyi/cwgl/service/IRequestLogService.java
new file mode 100644
index 0000000..3e60661
--- /dev/null
+++ b/service/src/main/java/com/ruoyi/cwgl/service/IRequestLogService.java
@@ -0,0 +1,102 @@
+package com.ruoyi.cwgl.service;
+
+import java.util.List;
+import com.ruoyi.cwgl.domain.RequestLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+/**
+ * 璇锋眰鏃ュ織Service鎺ュ彛
+ * 
+ * @author ruoyi
+ * @date 2025-08-27
+ */
+public interface IRequestLogService extends IService<RequestLog>
+{
+    /**
+     * 鏌ヨ璇锋眰鏃ュ織
+     * 
+     * @param id 璇锋眰鏃ュ織ID
+     * @return 璇锋眰鏃ュ織
+     */
+    public RequestLog selectRequestLogById(Integer id);
+
+    /**
+     * 鏌ヨ璇锋眰鏃ュ織 璁板綍鏁�
+     *
+     * @param requestLog 璇锋眰鏃ュ織
+     * @return 璇锋眰鏃ュ織闆嗗悎
+     */
+    public int selectRequestLogCount(RequestLog requestLog);
+
+    /**
+     * 鏌ヨ璇锋眰鏃ュ織鍒楄〃
+     * 
+     * @param requestLog 璇锋眰鏃ュ織
+     * @return 璇锋眰鏃ュ織闆嗗悎
+     */
+    public List<RequestLog> selectRequestLogList(RequestLog requestLog);
+
+    /**
+     * 鏌ヨ璇锋眰鏃ュ織鍒楄〃 寮傛 瀵煎嚭
+     *
+     * @param requestLog 璇锋眰鏃ュ織
+     * @param exportKey 瀵煎嚭鍔熻兘鐨勫敮涓�鏍囪瘑
+     * @return 璇锋眰鏃ュ織闆嗗悎
+     */
+    public void export(RequestLog requestLog, String exportKey) ;
+
+
+    /**
+     * 鏂板璇锋眰鏃ュ織
+     * 
+     * @param requestLog 璇锋眰鏃ュ織
+     * @return 缁撴灉
+     */
+    public int insertRequestLog(RequestLog requestLog);
+
+    /**
+     * 鏂板璇锋眰鏃ュ織[鎵归噺]
+     *
+     * @param requestLogs 璇锋眰鏃ュ織
+     * @return 缁撴灉
+     */
+    public int insertRequestLogBatch(List<RequestLog> requestLogs);
+
+    /**
+     * 淇敼璇锋眰鏃ュ織
+     * 
+     * @param requestLog 璇锋眰鏃ュ織
+     * @return 缁撴灉
+     */
+    public int updateRequestLog(RequestLog requestLog);
+
+    /**
+     * 淇敼璇锋眰鏃ュ織[鎵归噺]
+     *
+     * @param requestLogs 璇锋眰鏃ュ織
+     * @return 缁撴灉
+     */
+    public int updateRequestLogBatch(List<RequestLog> requestLogs);
+    /**
+     * 鎵归噺鍒犻櫎璇锋眰鏃ュ織
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteRequestLogByIds(String ids);
+
+    /**
+     * 鎵归噺鍒犻櫎璇锋眰鏃ュ織
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteRequestLogByIds(Integer[] ids);
+
+    /**
+     * 鍒犻櫎璇锋眰鏃ュ織淇℃伅
+     * 
+     * @param id 璇锋眰鏃ュ織ID
+     * @return 缁撴灉
+     */
+    public int deleteRequestLogById(Integer id);
+}
diff --git a/service/src/main/java/com/ruoyi/cwgl/service/impl/EstimatedReceivableServiceImpl.java b/service/src/main/java/com/ruoyi/cwgl/service/impl/EstimatedReceivableServiceImpl.java
index 564fa6a..2940f2f 100644
--- a/service/src/main/java/com/ruoyi/cwgl/service/impl/EstimatedReceivableServiceImpl.java
+++ b/service/src/main/java/com/ruoyi/cwgl/service/impl/EstimatedReceivableServiceImpl.java
@@ -267,6 +267,9 @@
             BigDecimal totalAmount = estimatedReceivableBill.getTotalAmount();
             estimatedReceivableBill.setTotalAmount(totalAmount.add(estimatedReceivable.getEstimatedAmount()));
             estimatedReceivableBillMapper.updateEstimatedReceivableBill(estimatedReceivableBill);
+            pendingSettlementBusiness.setEstimatedTotalIncome(pendingSettlementBusiness.getEstimatedTotalIncome().add(estimatedReceivable.getEstimatedAmount()));
+            pendingSettlementBusinessMapper.updatePendingSettlementBusiness(pendingSettlementBusiness);
+            estimatedReceivable.setRelatedBillStatus(1);
         }
         String username = SecurityUtils.getUsername();
 
@@ -305,6 +308,9 @@
             BigDecimal totalAmount = estimatedReceivableBill.getTotalAmount();
             estimatedReceivableBill.setTotalAmount(totalAmount.subtract(estimatedReceivable.getEstimatedAmount()));
             estimatedReceivableBillMapper.updateEstimatedReceivableBill(estimatedReceivableBill);
+            pendingSettlementBusiness.setEstimatedTotalIncome(pendingSettlementBusiness.getConfirmedTotalIncome().subtract(estimatedReceivable.getEstimatedAmount()));
+            pendingSettlementBusinessMapper.updatePendingSettlementBusiness(pendingSettlementBusiness);
+            estimatedReceivable.setRelatedBillStatus(0);
         }
         String username = SecurityUtils.getUsername();
 
@@ -324,6 +330,27 @@
             throw new ServiceException("鏃犻渶閲嶅浣滃簾");
 
         }
+        PendingSettlementBusiness pendingSettlementBusiness = pendingSettlementBusinessMapper.selectPendingSettlementBusinessByNo(estimatedReceivable.getDispatchNo());
+        if (pendingSettlementBusiness == null){
+            throw new ServiceException("璋冨害鍗曚笉瀛樺湪");
+
+        }
+        Integer relatedBillStatus = pendingSettlementBusiness.getRelatedBillStatus();
+        if (relatedBillStatus.equals(2)||relatedBillStatus.equals(3)){
+            throw new ServiceException("褰撳墠璋冨害鍗曞凡缁撶畻鎴栭儴鍒嗙粨绠楁棤娉曚綔搴�");
+        }
+        //纭鐘舵�佷笅浣滃簾鎵嶆墽琛�
+        if (estimatedReceivable.getIsConfirmed().equals(1)) {
+        if (pendingSettlementBusiness.getBillId()!=null){
+            EstimatedReceivableBill estimatedReceivableBill = estimatedReceivableBillMapper.selectEstimatedReceivableBillById(pendingSettlementBusiness.getBillId());
+            BigDecimal totalAmount = estimatedReceivableBill.getTotalAmount();
+            estimatedReceivableBill.setTotalAmount(totalAmount.subtract(estimatedReceivable.getEstimatedAmount()));
+            estimatedReceivableBillMapper.updateEstimatedReceivableBill(estimatedReceivableBill);
+            pendingSettlementBusiness.setEstimatedTotalIncome(pendingSettlementBusiness.getConfirmedTotalIncome().subtract(estimatedReceivable.getEstimatedAmount()));
+            pendingSettlementBusinessMapper.updatePendingSettlementBusiness(pendingSettlementBusiness);
+            estimatedReceivable.setRelatedBillStatus(0);
+        }
+        }
         String username = SecurityUtils.getUsername();
 
         logService.insertEstimatedReceivableLog("浣滃簾搴旀敹",id,username);
diff --git a/service/src/main/java/com/ruoyi/cwgl/service/impl/KeyCollectionInfoServiceImpl.java b/service/src/main/java/com/ruoyi/cwgl/service/impl/KeyCollectionInfoServiceImpl.java
new file mode 100644
index 0000000..e95a2d8
--- /dev/null
+++ b/service/src/main/java/com/ruoyi/cwgl/service/impl/KeyCollectionInfoServiceImpl.java
@@ -0,0 +1,217 @@
+package com.ruoyi.cwgl.service.impl;
+
+import java.util.Date;
+import java.util.List;
+
+import javax.annotation.Resource;
+
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.cwgl.domain.RequestLog;
+import com.ruoyi.cwgl.domain.dto.TakeReviewDto;
+import com.ruoyi.cwgl.service.IRequestLogService;
+import org.springframework.beans.factory.annotation.Autowired;
+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.cwgl.mapper.KeyCollectionInfoMapper;
+import com.ruoyi.cwgl.domain.KeyCollectionInfo;
+import com.ruoyi.cwgl.service.IKeyCollectionInfoService;
+import com.ruoyi.common.core.text.Convert;
+
+/**
+ * 閽ュ寵棰嗗彇淇℃伅Service涓氬姟灞傚鐞�
+ *
+ * @author ruoyi
+ * @date 2025-08-27
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class KeyCollectionInfoServiceImpl  extends BaseService<KeyCollectionInfoMapper, KeyCollectionInfo> implements IKeyCollectionInfoService
+{
+    protected final Logger logger = LoggerFactory.getLogger(getClass());
+    @Resource
+    private KeyCollectionInfoMapper keyCollectionInfoMapper;
+
+
+
+    /**
+     * 鏌ヨ閽ュ寵棰嗗彇淇℃伅
+     *
+     * @param id 閽ュ寵棰嗗彇淇℃伅ID
+     * @return 閽ュ寵棰嗗彇淇℃伅
+     */
+    @DataSource(DataSourceType.SLAVE)
+    @Override
+    public KeyCollectionInfo selectKeyCollectionInfoById(Integer id)
+    {
+        return keyCollectionInfoMapper.selectKeyCollectionInfoById(id);
+    }
+
+    /**
+     * 鏌ヨ閽ュ寵棰嗗彇淇℃伅 璁板綍鏁�
+     *
+     * @param keyCollectionInfo 閽ュ寵棰嗗彇淇℃伅
+     * @return 閽ュ寵棰嗗彇淇℃伅闆嗗悎
+     */
+    @DataSource(DataSourceType.SLAVE)
+    @Override
+    public int selectKeyCollectionInfoCount(KeyCollectionInfo keyCollectionInfo)
+    {
+        return keyCollectionInfoMapper.selectKeyCollectionInfoCount(keyCollectionInfo);
+    }
+
+    /**
+     * 鏌ヨ閽ュ寵棰嗗彇淇℃伅鍒楄〃
+     *
+     * @param keyCollectionInfo 閽ュ寵棰嗗彇淇℃伅
+     * @return 閽ュ寵棰嗗彇淇℃伅
+     */
+    @DataSource(DataSourceType.SLAVE)
+    @Override
+    public List<KeyCollectionInfo> selectKeyCollectionInfoList(KeyCollectionInfo keyCollectionInfo)
+    {
+        return keyCollectionInfoMapper.selectKeyCollectionInfoList(keyCollectionInfo);
+    }
+
+    /**
+     * 鏌ヨ閽ュ寵棰嗗彇淇℃伅鍒楄〃 寮傛 瀵煎嚭
+     *
+     * @param keyCollectionInfo 閽ュ寵棰嗗彇淇℃伅
+     * @param exportKey 瀵煎嚭鍔熻兘鐨勫敮涓�鏍囪瘑
+     * @return 閽ュ寵棰嗗彇淇℃伅闆嗗悎
+     */
+    @DataSource(DataSourceType.SLAVE)
+    @Async
+    @Override
+    public void export(KeyCollectionInfo keyCollectionInfo,String exportKey) {
+
+        super.export(KeyCollectionInfo.class,exportKey,"keyCollectionInfoData",(pageNum)->{
+            PageUtils.startPage(pageNum, Constants.EXPORT_PATE_SIZE);
+            return selectKeyCollectionInfoList(keyCollectionInfo);
+        });
+    }
+
+
+    /**
+     * 鏂板閽ュ寵棰嗗彇淇℃伅
+     *
+     * @param keyCollectionInfo 閽ュ寵棰嗗彇淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertKeyCollectionInfo(KeyCollectionInfo keyCollectionInfo)
+    {
+        return keyCollectionInfoMapper.insertKeyCollectionInfo(keyCollectionInfo);
+    }
+
+    /**
+     * 鏂板閽ュ寵棰嗗彇淇℃伅[鎵归噺]
+     *
+     * @param keyCollectionInfos 閽ュ寵棰嗗彇淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertKeyCollectionInfoBatch(List<KeyCollectionInfo> keyCollectionInfos)
+    {
+        int rows = keyCollectionInfoMapper.insertKeyCollectionInfoBatch(keyCollectionInfos);
+        return rows;
+    }
+
+    /**
+     * 淇敼閽ュ寵棰嗗彇淇℃伅
+     *
+     * @param keyCollectionInfo 閽ュ寵棰嗗彇淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateKeyCollectionInfo(KeyCollectionInfo keyCollectionInfo)
+    {
+        return keyCollectionInfoMapper.updateKeyCollectionInfo(keyCollectionInfo);
+    }
+
+    /**
+     * 淇敼閽ュ寵棰嗗彇淇℃伅[鎵归噺]
+     *
+     * @param keyCollectionInfos 閽ュ寵棰嗗彇淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateKeyCollectionInfoBatch(List<KeyCollectionInfo> keyCollectionInfos){
+        return keyCollectionInfoMapper.updateKeyCollectionInfoBatch(keyCollectionInfos);
+    }
+
+    /**
+     * 鍒犻櫎閽ュ寵棰嗗彇淇℃伅瀵硅薄
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteKeyCollectionInfoByIds(String ids)
+    {
+        return deleteKeyCollectionInfoByIds(Convert.toIntArray(ids));
+    }
+
+    /**
+     * 鍒犻櫎閽ュ寵棰嗗彇淇℃伅瀵硅薄
+     *
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteKeyCollectionInfoByIds(Integer[] ids)
+    {
+        return keyCollectionInfoMapper.deleteKeyCollectionInfoByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎閽ュ寵棰嗗彇淇℃伅淇℃伅
+     *
+     * @param id 閽ュ寵棰嗗彇淇℃伅ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteKeyCollectionInfoById(Integer id)
+    {
+        return keyCollectionInfoMapper.deleteKeyCollectionInfoById(id);
+    }
+
+    @DataSource(DataSourceType.CWSJ)
+    @Override
+    public KeyCollectionInfo selectCwData(TakeReviewDto takeReviewDto) {
+        return keyCollectionInfoMapper.selectCwData(takeReviewDto);
+    }
+
+    @Override
+    public AjaxResult takeReview(KeyCollectionInfo keyCollectionInfo) {
+        if (keyCollectionInfo == null) {
+            return AjaxResult.error("鏌ユ棤绗﹀悎瑕佹眰鐨勮皟搴﹀崟锛岃鑱旂郴璋冨害浜哄憳",3);
+        }
+        keyCollectionInfoMapper.insertKeyCollectionInfo(keyCollectionInfo);
+
+
+        //璋冨害瓒呮椂
+        Integer schedulingTimeout = keyCollectionInfo.getSchedulingTimeout();
+        if(schedulingTimeout>5){
+            return AjaxResult.error("璋冨害瓒呮椂涓嬪崟锛岃秴鏃�"+schedulingTimeout+"涓皬鏃�",3);
+
+        }
+        Integer keyTimeout = keyCollectionInfo.getKeyTimeout();
+        if (keyTimeout!=null && keyTimeout>24){
+            Date estimatedDepartureTime = keyCollectionInfo.getEstimatedDepartureTime();
+            String dateToStr = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, estimatedDepartureTime);
+            return AjaxResult.error("棰勮鍑哄彂鏃堕棿"+ dateToStr+"锛岄鍙栭挜鍖欒秴鏃�"+keyTimeout+"涓皬鏃�");
+        }
+        return AjaxResult.success("鎴愬姛",2);
+    }
+}
diff --git a/service/src/main/java/com/ruoyi/cwgl/service/impl/RequestLogServiceImpl.java b/service/src/main/java/com/ruoyi/cwgl/service/impl/RequestLogServiceImpl.java
new file mode 100644
index 0000000..0f53480
--- /dev/null
+++ b/service/src/main/java/com/ruoyi/cwgl/service/impl/RequestLogServiceImpl.java
@@ -0,0 +1,181 @@
+package com.ruoyi.cwgl.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.cwgl.mapper.RequestLogMapper;
+import com.ruoyi.cwgl.domain.RequestLog;
+import com.ruoyi.cwgl.service.IRequestLogService;
+import com.ruoyi.common.core.text.Convert;
+
+/**
+ * 璇锋眰鏃ュ織Service涓氬姟灞傚鐞�
+ *
+ * @author ruoyi
+ * @date 2025-08-27
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class RequestLogServiceImpl  extends BaseService<RequestLogMapper, RequestLog> implements IRequestLogService
+{
+    protected final Logger logger = LoggerFactory.getLogger(getClass());
+    @Resource
+    private RequestLogMapper requestLogMapper;
+
+
+    /**
+     * 鏌ヨ璇锋眰鏃ュ織
+     *
+     * @param id 璇锋眰鏃ュ織ID
+     * @return 璇锋眰鏃ュ織
+     */
+    @DataSource(DataSourceType.SLAVE)
+    @Override
+    public RequestLog selectRequestLogById(Integer id)
+    {
+        return requestLogMapper.selectRequestLogById(id);
+    }
+
+    /**
+     * 鏌ヨ璇锋眰鏃ュ織 璁板綍鏁�
+     *
+     * @param requestLog 璇锋眰鏃ュ織
+     * @return 璇锋眰鏃ュ織闆嗗悎
+     */
+    @DataSource(DataSourceType.SLAVE)
+    @Override
+    public int selectRequestLogCount(RequestLog requestLog)
+    {
+        return requestLogMapper.selectRequestLogCount(requestLog);
+    }
+
+    /**
+     * 鏌ヨ璇锋眰鏃ュ織鍒楄〃
+     *
+     * @param requestLog 璇锋眰鏃ュ織
+     * @return 璇锋眰鏃ュ織
+     */
+    @DataSource(DataSourceType.SLAVE)
+    @Override
+    public List<RequestLog> selectRequestLogList(RequestLog requestLog)
+    {
+        return requestLogMapper.selectRequestLogList(requestLog);
+    }
+
+    /**
+     * 鏌ヨ璇锋眰鏃ュ織鍒楄〃 寮傛 瀵煎嚭
+     *
+     * @param requestLog 璇锋眰鏃ュ織
+     * @param exportKey 瀵煎嚭鍔熻兘鐨勫敮涓�鏍囪瘑
+     * @return 璇锋眰鏃ュ織闆嗗悎
+     */
+    @DataSource(DataSourceType.SLAVE)
+    @Async
+    @Override
+    public void export(RequestLog requestLog,String exportKey) {
+
+        super.export(RequestLog.class,exportKey,"requestLogData",(pageNum)->{
+            PageUtils.startPage(pageNum, Constants.EXPORT_PATE_SIZE);
+            return selectRequestLogList(requestLog);
+        });
+    }
+
+
+    /**
+     * 鏂板璇锋眰鏃ュ織
+     *
+     * @param requestLog 璇锋眰鏃ュ織
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertRequestLog(RequestLog requestLog)
+    {
+        requestLog.setCreateTime(DateUtils.getNowDate());
+        return requestLogMapper.insertRequestLog(requestLog);
+    }
+
+    /**
+     * 鏂板璇锋眰鏃ュ織[鎵归噺]
+     *
+     * @param requestLogs 璇锋眰鏃ュ織
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertRequestLogBatch(List<RequestLog> requestLogs)
+    {
+        int rows = requestLogMapper.insertRequestLogBatch(requestLogs);
+        return rows;
+    }
+
+    /**
+     * 淇敼璇锋眰鏃ュ織
+     *
+     * @param requestLog 璇锋眰鏃ュ織
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateRequestLog(RequestLog requestLog)
+    {
+        return requestLogMapper.updateRequestLog(requestLog);
+    }
+
+    /**
+     * 淇敼璇锋眰鏃ュ織[鎵归噺]
+     *
+     * @param requestLogs 璇锋眰鏃ュ織
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateRequestLogBatch(List<RequestLog> requestLogs){
+        return requestLogMapper.updateRequestLogBatch(requestLogs);
+    }
+
+    /**
+     * 鍒犻櫎璇锋眰鏃ュ織瀵硅薄
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteRequestLogByIds(String ids)
+    {
+        return deleteRequestLogByIds(Convert.toIntArray(ids));
+    }
+
+    /**
+     * 鍒犻櫎璇锋眰鏃ュ織瀵硅薄
+     *
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteRequestLogByIds(Integer[] ids)
+    {
+        return requestLogMapper.deleteRequestLogByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎璇锋眰鏃ュ織淇℃伅
+     *
+     * @param id 璇锋眰鏃ュ織ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteRequestLogById(Integer id)
+    {
+        return requestLogMapper.deleteRequestLogById(id);
+    }
+}
diff --git a/service/src/main/resources/mapper/cwgl/KeyCollectionInfoMapper.xml b/service/src/main/resources/mapper/cwgl/KeyCollectionInfoMapper.xml
new file mode 100644
index 0000000..85a9bd2
--- /dev/null
+++ b/service/src/main/resources/mapper/cwgl/KeyCollectionInfoMapper.xml
@@ -0,0 +1,264 @@
+<?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.cwgl.mapper.KeyCollectionInfoMapper">
+
+    <resultMap type="com.ruoyi.cwgl.domain.KeyCollectionInfo" id="KeyCollectionInfoResult">
+        <result property="id"    column="id"    />
+        <result property="customerName"    column="customer_name"    />
+        <result property="carrier"    column="carrier"    />
+        <result property="dispatchNo"    column="dispatch_no"    />
+        <result property="driverName"    column="driver_name"    />
+        <result property="driverMobile"    column="driver_mobile"    />
+        <result property="licensePlateNumber"    column="license_plate_number"    />
+        <result property="orderTime"    column="order_time"    />
+        <result property="orderCreatedTime"    column="order_created_time"    />
+        <result property="dispatchCreatedTime"    column="dispatch_created_time"    />
+        <result property="keyCollectionTime"    column="key_collection_time"    />
+        <result property="estimatedDepartureTime"    column="estimated_departure_time"    />
+        <result property="requiredArrivalTime"    column="required_arrival_time"    />
+        <result property="consignorAddress"    column="consignor_address"    />
+        <result property="consigneeAddress"    column="consignee_address"    />
+        <result property="mainDriver"    column="main_driver"    />
+        <result property="pointNum"    column="point_num"    />
+        <result property="transportMode"    column="transport_mode"    />
+        <result property="assistantDriver"    column="assistant_driver"    />
+        <result property="quantity"    column="quantity"    />
+        <result property="dispatchQuantity"    column="dispatch_quantity"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectKeyCollectionInfoVo">
+        select thisTab.id, thisTab.customer_name, thisTab.carrier, thisTab.dispatch_no, thisTab.driver_name, thisTab.driver_mobile, thisTab.license_plate_number, thisTab.order_time, thisTab.order_created_time, thisTab.dispatch_created_time, thisTab.key_collection_time, thisTab.estimated_departure_time, thisTab.required_arrival_time, thisTab.consignor_address, thisTab.consignee_address, thisTab.main_driver, thisTab.point_num, thisTab.transport_mode, thisTab.assistant_driver, thisTab.quantity, thisTab.dispatch_quantity, thisTab.remark from key_collection_info AS thisTab
+    </sql>
+    <sql id="selectKeyCollectionInfoVoCount">
+        select count(0) from key_collection_info as thisTab
+    </sql>
+
+    <sql id="whereCondition">
+        <if test="customerName != null  and customerName != ''"> and  thisTab.customer_name like concat('%', #{customerName}, '%')</if>
+        <if test="carrier != null  and carrier != ''"> and thisTab.carrier = #{carrier}</if>
+        <if test="dispatchNo != null  and dispatchNo != ''"> and thisTab.dispatch_no = #{dispatchNo}</if>
+        <if test="driverName != null  and driverName != ''"> and  thisTab.driver_name like concat('%', #{driverName}, '%')</if>
+        <if test="driverMobile != null  and driverMobile != ''"> and thisTab.driver_mobile = #{driverMobile}</if>
+        <if test="licensePlateNumber != null  and licensePlateNumber != ''"> and thisTab.license_plate_number = #{licensePlateNumber}</if>
+        <if test="orderTime != null "> and thisTab.order_time = #{orderTime}</if>
+        <if test="orderCreatedTime != null "> and thisTab.order_created_time = #{orderCreatedTime}</if>
+        <if test="dispatchCreatedTime != null "> and thisTab.dispatch_created_time = #{dispatchCreatedTime}</if>
+        <if test="keyCollectionTime != null "> and thisTab.key_collection_time = #{keyCollectionTime}</if>
+        <if test="estimatedDepartureTime != null "> and thisTab.estimated_departure_time = #{estimatedDepartureTime}</if>
+        <if test="requiredArrivalTime != null "> and thisTab.required_arrival_time = #{requiredArrivalTime}</if>
+        <if test="consignorAddress != null  and consignorAddress != ''"> and thisTab.consignor_address = #{consignorAddress}</if>
+        <if test="consigneeAddress != null  and consigneeAddress != ''"> and thisTab.consignee_address = #{consigneeAddress}</if>
+        <if test="mainDriver != null  and mainDriver != ''"> and thisTab.main_driver = #{mainDriver}</if>
+        <if test="pointNum != null "> and thisTab.point_num = #{pointNum}</if>
+        <if test="transportMode != null  and transportMode != ''"> and thisTab.transport_mode = #{transportMode}</if>
+        <if test="assistantDriver != null  and assistantDriver != ''"> and thisTab.assistant_driver = #{assistantDriver}</if>
+        <if test="quantity != null "> and thisTab.quantity = #{quantity}</if>
+        <if test="dispatchQuantity != null "> and thisTab.dispatch_quantity = #{dispatchQuantity}</if>
+    </sql>
+
+    <!--鏌ヨ-->
+    <select id="selectKeyCollectionInfoById" parameterType="Integer" resultMap="KeyCollectionInfoResult">
+        <include refid="selectKeyCollectionInfoVo"/>
+        where id = #{id}
+    </select>
+
+    <select id="selectKeyCollectionInfoCount" parameterType="com.ruoyi.cwgl.domain.KeyCollectionInfo" resultType="int">
+        <include refid="selectKeyCollectionInfoVoCount"/>
+        <where>
+            <include refid="whereCondition"/>
+        </where>
+    </select>
+
+    <select id="selectKeyCollectionInfoList" parameterType="com.ruoyi.cwgl.domain.KeyCollectionInfo" resultMap="KeyCollectionInfoResult">
+        <include refid="selectKeyCollectionInfoVo"/>
+        <where>
+            <include refid="whereCondition"/>
+        </where>
+        order by thisTab.id desc
+    </select>
+    <select id="selectCwData" resultType="com.ruoyi.cwgl.domain.KeyCollectionInfo">
+SELECT
+	customer.`NAME` as customerName,
+	bp.`NAME` as carrier,
+	ts.DISPATCH_NO as dispatchNo,
+	driver_m.`NAME` as driverName,
+	driver_m.MOBILE as driverMobile,
+	vhc.LICENSE_PLATE_NUMBER as licensePlateNumber,
+	ord.ORDER_TIME as orderTime,
+	ord.CREATED_TIME as orderCreatedTime,
+	ts.CREATED_TIME as dispatchCreatedTime,
+	now() as keyCollectionTime, -- 鏀捐姹傛煡璇㈠埌鐨勬椂闂�
+	ord.ESTIMATED_DEPARTURE_TIME as estimatedDepartureTime,
+	ord.CONSIGNOR_ADDRESS_ADDR_INFO as consignorAddress,
+	ord.CONSIGNEE_ADDRESS_ADDR_INFO as consigneeAddress,
+	driver_m.`NAME` as mainDriver,
+	ts.POINT_NUM as pointNum,
+	ts.TRANSPORT_MODE as transportMode,
+	driver_a.`NAME` as assistantDriver,
+	ts.QUANTITY as quantity,
+	ts.REQUIRED_ARRIVAL_TIME as ,
+	ts.DISPATCH_QUANTITY as dispatchQuantity,
+	ts.REMARK as remark,
+	TIMESTAMPDIFF(HOUR, ord.ORDER_TIME, ord.CREATED_TIME) as schedulingTimeout,
+	TIMESTAMPDIFF(HOUR, ord.ESTIMATED_DEPARTURE_TIME, NOW()) as keyTimeout
+
+FROM
+  tms_shipment ts
+  left JOIN oms_order ord ON ts.DISPATCH_NO = ord.DISPATCH_CODE
+  LEFT JOIN base_customer customer ON customer.ID = ord.CUSTOMER_ID
+  LEFT JOIN tms_vehicle vhc ON ts.VEHICLE_ID = vhc.id
+  LEFT JOIN base_provider bp ON bp.ID = ts.CARRIER_ID
+  LEFT JOIN tms_driver driver_m ON driver_m.ID = ts.MAIN_DRIVER_ID
+  LEFT JOIN tms_driver driver_a ON driver_a.ID = ts.ASSISTANT_DRIVER_ID
+WHERE
+  ts.`STATUS` = 'A'
+  <if test="driverCode != null and driverCode != '' ">
+      and driver_m.MOBILE = #{driverCode}
+  </if>
+  <if test="driverName != null and driverName != ''">
+      and driver_m.NAME = #{driverName}
+  </if>
+ORDER BY ord.ESTIMATED_DEPARTURE_TIME asc
+LIMIT 1
+
+
+
+    </select>
+
+    <!-- 鏂板 -->
+    <insert id="insertKeyCollectionInfo" parameterType="com.ruoyi.cwgl.domain.KeyCollectionInfo"  useGeneratedKeys="true" keyProperty="id">
+        insert into key_collection_info
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="customerName != null">customer_name,</if>
+            <if test="carrier != null">carrier,</if>
+            <if test="dispatchNo != null">dispatch_no,</if>
+            <if test="driverName != null">driver_name,</if>
+            <if test="driverMobile != null">driver_mobile,</if>
+            <if test="licensePlateNumber != null">license_plate_number,</if>
+            <if test="orderTime != null">order_time,</if>
+            <if test="orderCreatedTime != null">order_created_time,</if>
+            <if test="dispatchCreatedTime != null">dispatch_created_time,</if>
+            <if test="keyCollectionTime != null">key_collection_time,</if>
+            <if test="estimatedDepartureTime != null">estimated_departure_time,</if>
+            <if test="requiredArrivalTime != null">required_arrival_time,</if>
+            <if test="consignorAddress != null">consignor_address,</if>
+            <if test="consigneeAddress != null">consignee_address,</if>
+            <if test="mainDriver != null">main_driver,</if>
+            <if test="pointNum != null">point_num,</if>
+            <if test="transportMode != null">transport_mode,</if>
+            <if test="assistantDriver != null">assistant_driver,</if>
+            <if test="quantity != null">quantity,</if>
+            <if test="dispatchQuantity != null">dispatch_quantity,</if>
+            <if test="remark != null">remark,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="customerName != null">#{customerName},</if>
+            <if test="carrier != null">#{carrier},</if>
+            <if test="dispatchNo != null">#{dispatchNo},</if>
+            <if test="driverName != null">#{driverName},</if>
+            <if test="driverMobile != null">#{driverMobile},</if>
+            <if test="licensePlateNumber != null">#{licensePlateNumber},</if>
+            <if test="orderTime != null">#{orderTime},</if>
+            <if test="orderCreatedTime != null">#{orderCreatedTime},</if>
+            <if test="dispatchCreatedTime != null">#{dispatchCreatedTime},</if>
+            <if test="keyCollectionTime != null">#{keyCollectionTime},</if>
+            <if test="estimatedDepartureTime != null">#{estimatedDepartureTime},</if>
+            <if test="requiredArrivalTime != null">#{requiredArrivalTime},</if>
+            <if test="consignorAddress != null">#{consignorAddress},</if>
+            <if test="consigneeAddress != null">#{consigneeAddress},</if>
+            <if test="mainDriver != null">#{mainDriver},</if>
+            <if test="pointNum != null">#{pointNum},</if>
+            <if test="transportMode != null">#{transportMode},</if>
+            <if test="assistantDriver != null">#{assistantDriver},</if>
+            <if test="quantity != null">#{quantity},</if>
+            <if test="dispatchQuantity != null">#{dispatchQuantity},</if>
+            <if test="remark != null">#{remark},</if>
+         </trim>
+    </insert>
+
+    <insert id="insertKeyCollectionInfoBatch" parameterType="java.util.List"  useGeneratedKeys="true" keyProperty="id">
+        insert into key_collection_info
+        <trim prefix="(" suffix=") values" suffixOverrides=",">
+            id,customer_name,carrier,dispatch_no,driver_name,driver_mobile,license_plate_number,order_time,order_created_time,dispatch_created_time,key_collection_time,estimated_departure_time,required_arrival_time,consignor_address,consignee_address,main_driver,point_num,transport_mode,assistant_driver,quantity,dispatch_quantity,remark,
+        </trim>
+        <foreach item="item" index="index" collection="list" separator=",">
+            <trim prefix="(" suffix=") " suffixOverrides=",">
+                #{item.id},#{item.customerName},#{item.carrier},#{item.dispatchNo},#{item.driverName},#{item.driverMobile},#{item.licensePlateNumber},#{item.orderTime},#{item.orderCreatedTime},#{item.dispatchCreatedTime},#{item.keyCollectionTime},#{item.estimatedDepartureTime},#{item.requiredArrivalTime},#{item.consignorAddress},#{item.consigneeAddress},#{item.mainDriver},#{item.pointNum},#{item.transportMode},#{item.assistantDriver},#{item.quantity},#{item.dispatchQuantity},#{item.remark},
+            </trim>
+        </foreach>
+    </insert>
+
+    <!-- 淇敼 -->
+    <update id="updateKeyCollectionInfo" parameterType="com.ruoyi.cwgl.domain.KeyCollectionInfo">
+        update key_collection_info
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="customerName != null">customer_name = #{customerName},</if>
+            <if test="carrier != null">carrier = #{carrier},</if>
+            <if test="dispatchNo != null">dispatch_no = #{dispatchNo},</if>
+            <if test="driverName != null">driver_name = #{driverName},</if>
+            <if test="driverMobile != null">driver_mobile = #{driverMobile},</if>
+            <if test="licensePlateNumber != null">license_plate_number = #{licensePlateNumber},</if>
+            <if test="orderTime != null">order_time = #{orderTime},</if>
+            <if test="orderCreatedTime != null">order_created_time = #{orderCreatedTime},</if>
+            <if test="dispatchCreatedTime != null">dispatch_created_time = #{dispatchCreatedTime},</if>
+            <if test="keyCollectionTime != null">key_collection_time = #{keyCollectionTime},</if>
+            <if test="estimatedDepartureTime != null">estimated_departure_time = #{estimatedDepartureTime},</if>
+            <if test="requiredArrivalTime != null">required_arrival_time = #{requiredArrivalTime},</if>
+            <if test="consignorAddress != null">consignor_address = #{consignorAddress},</if>
+            <if test="consigneeAddress != null">consignee_address = #{consigneeAddress},</if>
+            <if test="mainDriver != null">main_driver = #{mainDriver},</if>
+            <if test="pointNum != null">point_num = #{pointNum},</if>
+            <if test="transportMode != null">transport_mode = #{transportMode},</if>
+            <if test="assistantDriver != null">assistant_driver = #{assistantDriver},</if>
+            <if test="quantity != null">quantity = #{quantity},</if>
+            <if test="dispatchQuantity != null">dispatch_quantity = #{dispatchQuantity},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where id = #{id}
+    </update>
+    <!-- 淇敼 -->
+    <update id="updateKeyCollectionInfoBatch" parameterType="java.util.List">
+        <foreach collection="list" item="item" index="index" separator=";">
+            update key_collection_info
+            <trim prefix="SET" suffixOverrides=",">
+                <if test="item.customerName != null">customer_name = #{item.customerName},</if>
+                <if test="item.carrier != null">carrier = #{item.carrier},</if>
+                <if test="item.dispatchNo != null">dispatch_no = #{item.dispatchNo},</if>
+                <if test="item.driverName != null">driver_name = #{item.driverName},</if>
+                <if test="item.driverMobile != null">driver_mobile = #{item.driverMobile},</if>
+                <if test="item.licensePlateNumber != null">license_plate_number = #{item.licensePlateNumber},</if>
+                <if test="item.orderTime != null">order_time = #{item.orderTime},</if>
+                <if test="item.orderCreatedTime != null">order_created_time = #{item.orderCreatedTime},</if>
+                <if test="item.dispatchCreatedTime != null">dispatch_created_time = #{item.dispatchCreatedTime},</if>
+                <if test="item.keyCollectionTime != null">key_collection_time = #{item.keyCollectionTime},</if>
+                <if test="item.estimatedDepartureTime != null">estimated_departure_time = #{item.estimatedDepartureTime},</if>
+                <if test="item.requiredArrivalTime != null">required_arrival_time = #{item.requiredArrivalTime},</if>
+                <if test="item.consignorAddress != null">consignor_address = #{item.consignorAddress},</if>
+                <if test="item.consigneeAddress != null">consignee_address = #{item.consigneeAddress},</if>
+                <if test="item.mainDriver != null">main_driver = #{item.mainDriver},</if>
+                <if test="item.pointNum != null">point_num = #{item.pointNum},</if>
+                <if test="item.transportMode != null">transport_mode = #{item.transportMode},</if>
+                <if test="item.assistantDriver != null">assistant_driver = #{item.assistantDriver},</if>
+                <if test="item.quantity != null">quantity = #{item.quantity},</if>
+                <if test="item.dispatchQuantity != null">dispatch_quantity = #{item.dispatchQuantity},</if>
+                <if test="item.remark != null">remark = #{item.remark},</if>
+            </trim>
+        where id = #{item.id}
+        </foreach>
+    </update>
+
+    <!--鍒犻櫎-->
+    <delete id="deleteKeyCollectionInfoById" parameterType="Integer">
+        delete from key_collection_info where id = #{id}
+    </delete>
+    <delete id="deleteKeyCollectionInfoByIds" parameterType="Integer">
+        delete from key_collection_info where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+</mapper>
\ No newline at end of file
diff --git a/service/src/main/resources/mapper/cwgl/PendingSettlementBusinessMapper.xml b/service/src/main/resources/mapper/cwgl/PendingSettlementBusinessMapper.xml
index 4864194..5015b18 100644
--- a/service/src/main/resources/mapper/cwgl/PendingSettlementBusinessMapper.xml
+++ b/service/src/main/resources/mapper/cwgl/PendingSettlementBusinessMapper.xml
@@ -561,11 +561,7 @@
     </update>
     <update id="updateEstimatedReceivableBillStatus">
         UPDATE pending_settlement_business
-        SET
-        is_create = 1,
-        bill_id = #{id},
-        bill_name = #{billName},
-        related_bill_status = 1,
+        SET related_bill_status = #{status}
         WHERE dispatch_no IN
         <foreach item="item" collection="list" open="(" separator="," close=")">
             #{item}
diff --git a/service/src/main/resources/mapper/cwgl/RequestLogMapper.xml b/service/src/main/resources/mapper/cwgl/RequestLogMapper.xml
new file mode 100644
index 0000000..83062d9
--- /dev/null
+++ b/service/src/main/resources/mapper/cwgl/RequestLogMapper.xml
@@ -0,0 +1,137 @@
+<?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.cwgl.mapper.RequestLogMapper">
+
+    <resultMap type="com.ruoyi.cwgl.domain.RequestLog" id="RequestLogResult">
+        <result property="id"    column="id"    />
+        <result property="driverCode"    column="driver_code"    />
+        <result property="driverName"    column="driver_name"    />
+        <result property="boxNum"    column="box_num"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="reqTime"    column="req_time"    />
+        <result property="type"    column="type"    />
+        <result property="operation"    column="operation"    />
+    </resultMap>
+
+    <sql id="selectRequestLogVo">
+        select thisTab.id, thisTab.driver_code, thisTab.driver_name, thisTab.box_num, thisTab.create_by, thisTab.create_time, thisTab.req_time, thisTab.type, thisTab.operation from request_log AS thisTab
+    </sql>
+    <sql id="selectRequestLogVoCount">
+        select count(0) from request_log as thisTab
+    </sql>
+
+    <sql id="whereCondition">
+        <if test="driverCode != null  and driverCode != ''"> and thisTab.driver_code = #{driverCode}</if>
+        <if test="driverName != null  and driverName != ''"> and  thisTab.driver_name like concat('%', #{driverName}, '%')</if>
+        <if test="boxNum != null  and boxNum != ''"> and thisTab.box_num = #{boxNum}</if>
+        <if test="reqTime != null "> and thisTab.req_time = #{reqTime}</if>
+        <if test="type != null "> and thisTab.type = #{type}</if>
+        <if test="operation != null  and operation != ''"> and thisTab.operation = #{operation}</if>
+    </sql>
+
+    <!--鏌ヨ-->
+    <select id="selectRequestLogById" parameterType="Integer" resultMap="RequestLogResult">
+        <include refid="selectRequestLogVo"/>
+        where id = #{id}
+    </select>
+
+    <select id="selectRequestLogCount" parameterType="com.ruoyi.cwgl.domain.RequestLog" resultType="int">
+        <include refid="selectRequestLogVoCount"/>
+        <where>
+            <include refid="whereCondition"/>
+        </where>
+    </select>
+
+    <select id="selectRequestLogList" parameterType="com.ruoyi.cwgl.domain.RequestLog" resultMap="RequestLogResult">
+        <include refid="selectRequestLogVo"/>
+        <where>
+            <include refid="whereCondition"/>
+        </where>
+        order by thisTab.id desc
+    </select>
+
+    <!-- 鏂板 -->
+    <insert id="insertRequestLog" parameterType="com.ruoyi.cwgl.domain.RequestLog"  useGeneratedKeys="true" keyProperty="id">
+        insert into request_log
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="driverCode != null">driver_code,</if>
+            <if test="driverName != null">driver_name,</if>
+            <if test="boxNum != null">box_num,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="reqTime != null">req_time,</if>
+            <if test="type != null">type,</if>
+            <if test="operation != null">operation,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="driverCode != null">#{driverCode},</if>
+            <if test="driverName != null">#{driverName},</if>
+            <if test="boxNum != null">#{boxNum},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="reqTime != null">#{reqTime},</if>
+            <if test="type != null">#{type},</if>
+            <if test="operation != null">#{operation},</if>
+         </trim>
+    </insert>
+
+    <insert id="insertRequestLogBatch" parameterType="java.util.List"  useGeneratedKeys="true" keyProperty="id">
+        insert into request_log
+        <trim prefix="(" suffix=") values" suffixOverrides=",">
+            id,driver_code,driver_name,box_num,create_by,create_time,req_time,type,operation,
+        </trim>
+        <foreach item="item" index="index" collection="list" separator=",">
+            <trim prefix="(" suffix=") " suffixOverrides=",">
+                #{item.id},#{item.driverCode},#{item.driverName},#{item.boxNum},#{item.createBy},#{item.createTime},#{item.reqTime},#{item.type},#{item.operation},
+            </trim>
+        </foreach>
+    </insert>
+
+    <!-- 淇敼 -->
+    <update id="updateRequestLog" parameterType="com.ruoyi.cwgl.domain.RequestLog">
+        update request_log
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="driverCode != null">driver_code = #{driverCode},</if>
+            <if test="driverName != null">driver_name = #{driverName},</if>
+            <if test="boxNum != null">box_num = #{boxNum},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="reqTime != null">req_time = #{reqTime},</if>
+            <if test="type != null">type = #{type},</if>
+            <if test="operation != null">operation = #{operation},</if>
+        </trim>
+        where id = #{id}
+    </update>
+    <!-- 淇敼 -->
+    <update id="updateRequestLogBatch" parameterType="java.util.List">
+        <foreach collection="list" item="item" index="index" separator=";">
+            update request_log
+            <trim prefix="SET" suffixOverrides=",">
+                <if test="item.driverCode != null">driver_code = #{item.driverCode},</if>
+                <if test="item.driverName != null">driver_name = #{item.driverName},</if>
+                <if test="item.boxNum != null">box_num = #{item.boxNum},</if>
+                <if test="item.createBy != null">create_by = #{item.createBy},</if>
+                <if test="item.createTime != null">create_time = #{item.createTime},</if>
+                <if test="item.reqTime != null">req_time = #{item.reqTime},</if>
+                <if test="item.type != null">type = #{item.type},</if>
+                <if test="item.operation != null">operation = #{item.operation},</if>
+            </trim>
+        where id = #{item.id}
+        </foreach>
+    </update>
+
+    <!--鍒犻櫎-->
+    <delete id="deleteRequestLogById" parameterType="Integer">
+        delete from request_log where id = #{id}
+    </delete>
+    <delete id="deleteRequestLogByIds" parameterType="Integer">
+        delete from request_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/ui/admin-ui3/src/api/cwgl/keyCollectionInfo.ts b/ui/admin-ui3/src/api/cwgl/keyCollectionInfo.ts
new file mode 100644
index 0000000..7e61e6e
--- /dev/null
+++ b/ui/admin-ui3/src/api/cwgl/keyCollectionInfo.ts
@@ -0,0 +1,67 @@
+import request,{download,requestType} from "@/utils/request";
+import {BaseEntityInterface} from "@/utils/globalInterface";
+export interface KeyCollectionInfoI extends BaseEntityInterface{
+            id ?:  number   ,            customerName ?:  string   ,            carrier ?:  string   ,            dispatchNo ?:  string   ,            driverName ?:  string   ,            driverMobile ?:  string   ,            licensePlateNumber ?:  string   ,            orderTime ?:  string   ,            orderCreatedTime ?:  string   ,            dispatchCreatedTime ?:  string   ,            keyCollectionTime ?:  string   ,            estimatedDepartureTime ?:  string   ,            requiredArrivalTime ?:  string   ,            consignorAddress ?:  string   ,            consigneeAddress ?:  string   ,            mainDriver ?:  string   ,            pointNum ?:  number   ,            transportMode ?:  string   ,            assistantDriver ?:  string   ,            quantity ?:  number   ,            dispatchQuantity ?:  number   ,            remark ?:  string       }
+
+
+/**
+ * 鏌ヨ閽ュ寵棰嗗彇淇℃伅鍒楄〃
+ */
+export const listKeyCollectionInfo:requestType = (query) => {
+    return request({
+        url: '/cwgl/keyCollectionInfo/list',
+        method:'get',
+        params:query
+    })
+}
+/**
+ * 鏌ヨ閽ュ寵棰嗗彇淇℃伅璇︾粏
+ */
+export const getKeyCollectionInfo:requestType = (id) => {
+    return request({
+        url: '/cwgl/keyCollectionInfo/' + id,
+        method:'get'
+    })
+}
+
+/**
+ * 鏂板閽ュ寵棰嗗彇淇℃伅
+ */
+export const addKeyCollectionInfo:requestType = (data) => {
+    return request({
+        url: '/cwgl/keyCollectionInfo',
+        method: 'post',
+        data
+    })
+}
+
+/**
+ * 淇敼閽ュ寵棰嗗彇淇℃伅
+ */
+export const updateKeyCollectionInfo:requestType = (data) => {
+    return request({
+        url: '/cwgl/keyCollectionInfo',
+        method: 'put',
+        data
+    })
+}
+
+/**
+ * 鍒犻櫎閽ュ寵棰嗗彇淇℃伅
+ */
+export const delKeyCollectionInfo:requestType = (id) => {
+    return request({
+        url: '/cwgl/keyCollectionInfo/' + id,
+        method: 'delete'
+    })
+}
+
+
+/**
+ * 瀵煎嚭閽ュ寵棰嗗彇淇℃伅
+ */
+export const exportKeyCollectionInfo:requestType = (query) => {
+    return new Promise<any>(()=>{
+        download('/cwgl/keyCollectionInfo/export',query);
+    })
+}
diff --git a/ui/admin-ui3/src/api/cwgl/requestLog.ts b/ui/admin-ui3/src/api/cwgl/requestLog.ts
new file mode 100644
index 0000000..5dcbbcd
--- /dev/null
+++ b/ui/admin-ui3/src/api/cwgl/requestLog.ts
@@ -0,0 +1,67 @@
+import request,{download,requestType} from "@/utils/request";
+import {BaseEntityInterface} from "@/utils/globalInterface";
+export interface RequestLogI extends BaseEntityInterface{
+            id ?:  number   ,            driverCode ?:  string   ,            driverName ?:  string   ,            boxNum ?:  string   ,            createBy ?:  string   ,            createTime ?:  string   ,            reqTime ?:  string   ,            type ?:  number   ,            operation ?:  string       }
+
+
+/**
+ * 鏌ヨ璇锋眰鏃ュ織鍒楄〃
+ */
+export const listRequestLog:requestType = (query) => {
+    return request({
+        url: '/cwgl/requestLog/list',
+        method:'get',
+        params:query
+    })
+}
+/**
+ * 鏌ヨ璇锋眰鏃ュ織璇︾粏
+ */
+export const getRequestLog:requestType = (id) => {
+    return request({
+        url: '/cwgl/requestLog/' + id,
+        method:'get'
+    })
+}
+
+/**
+ * 鏂板璇锋眰鏃ュ織
+ */
+export const addRequestLog:requestType = (data) => {
+    return request({
+        url: '/cwgl/requestLog',
+        method: 'post',
+        data
+    })
+}
+
+/**
+ * 淇敼璇锋眰鏃ュ織
+ */
+export const updateRequestLog:requestType = (data) => {
+    return request({
+        url: '/cwgl/requestLog',
+        method: 'put',
+        data
+    })
+}
+
+/**
+ * 鍒犻櫎璇锋眰鏃ュ織
+ */
+export const delRequestLog:requestType = (id) => {
+    return request({
+        url: '/cwgl/requestLog/' + id,
+        method: 'delete'
+    })
+}
+
+
+/**
+ * 瀵煎嚭璇锋眰鏃ュ織
+ */
+export const exportRequestLog:requestType = (query) => {
+    return new Promise<any>(()=>{
+        download('/cwgl/requestLog/export',query);
+    })
+}
diff --git a/ui/admin-ui3/src/views/cwgl/keyCollectionInfo/index.vue b/ui/admin-ui3/src/views/cwgl/keyCollectionInfo/index.vue
new file mode 100644
index 0000000..aca7e9f
--- /dev/null
+++ b/ui/admin-ui3/src/views/cwgl/keyCollectionInfo/index.vue
@@ -0,0 +1,181 @@
+<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="['cwgl:keyCollectionInfo:edit']"
+            @click="handleUpdate">淇敼
+        </el-button>
+        <el-button
+            type="danger"
+            icon="Delete"
+            :disabled="pageF.multiple"
+            @click="handleDelete"
+            v-hasPermi="['cwgl:keyCollectionInfo:remove']"
+        >鍒犻櫎
+        </el-button>
+        <el-button
+            type="warning"
+            plain
+            icon="Download"
+            @click="handleExport"
+            v-hasPermi="['cwgl:keyCollectionInfo:export']"
+        >瀵煎嚭
+        </el-button>
+      </template>
+    </avue-crud>
+  </basicContainer>
+</template>
+
+<script setup name="keyCollectionInfo" lang="ts">
+  import {KeyCollectionInfoI,addKeyCollectionInfo, delKeyCollectionInfo, exportKeyCollectionInfo, getKeyCollectionInfo, listKeyCollectionInfo, updateKeyCollectionInfo} from "@/api/cwgl/keyCollectionInfo";
+  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(["cwgl:keyCollectionInfo:add"]),
+      delBtn: hasPermission(["cwgl:keyCollectionInfo:remove"]),
+      editBtn: hasPermission(["cwgl:keyCollectionInfo:edit"]),
+      viewBtn: hasPermission(["cwgl:keyCollectionInfo:query"]),
+    }
+  })
+
+  const data = reactive({
+    form:<KeyCollectionInfoI>{},
+    queryParams:<KeyCollectionInfoI&PageQueryInterface>{},
+    page: <PagesInterface>{
+      pageSize: 10,
+      total: 0,
+      currentPage: 1,
+    },
+    selectionList:[],
+  })
+  const {queryParams,form,page,selectionList} = toRefs(data);
+  const option = ref({
+    pageKey: 'KeyCollectionInfo',
+    rowKey: 'id',
+    column: {
+                                id: {
+          label: 'ID',
+                            },
+                                customerName: {
+          label: '瀹㈡埛鍚嶇О',
+                            },
+                                carrier: {
+          label: '鎵胯繍鍟�',
+                            },
+                                dispatchNo: {
+          label: '璋冨害鍗曞彿',
+                            },
+                                driverName: {
+          label: '鍙告満鍚嶇О',
+                            },
+                                driverMobile: {
+          label: '鍙告満鎵嬫満鍙�',
+                            },
+                                licensePlateNumber: {
+          label: '杞︾墝鍙�',
+                            },
+                                orderTime: {
+          label: '璁㈠崟涓嬪崟鏃堕棿',
+                            },
+                                orderCreatedTime: {
+          label: '璁㈠崟鍒涘缓鏃堕棿',
+                            },
+                                dispatchCreatedTime: {
+          label: '璋冨害鍗曞垱寤烘椂闂�',
+                            },
+                                keyCollectionTime: {
+          label: '閽ュ寵棰嗗彇鏃堕棿',
+                            },
+                                estimatedDepartureTime: {
+          label: '棰勮鍑哄彂鏃堕棿',
+                            },
+                                requiredArrivalTime: {
+          label: '瑕佹眰鍒拌揪鏃堕棿',
+                            },
+                                consignorAddress: {
+          label: '鍑哄彂鍦板湴鍧�',
+                      type: 'textarea', minRows: 3, maxRows: 5,
+                            },
+                                consigneeAddress: {
+          label: '鐩殑鍦板湴鍧�',
+                      type: 'textarea', minRows: 3, maxRows: 5,
+                            },
+                                mainDriver: {
+          label: '涓婚┚椹跺憳',
+                            },
+                                pointNum: {
+          label: '鎻愰�佽揣鐐规暟',
+                            },
+                                transportMode: {
+          label: '杩愯緭鏂瑰紡',
+                            },
+                                assistantDriver: {
+          label: '鍓┚椹跺憳',
+                            },
+                                quantity: {
+          label: '浠舵暟',
+                            },
+                                dispatchQuantity: {
+          label: '瀹炲彂浠舵暟',
+                            },
+                                remark: {
+          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:listKeyCollectionInfo,
+    getDetailApi:getKeyCollectionInfo,
+    exportApi:exportKeyCollectionInfo,
+    deleteApi:delKeyCollectionInfo,
+    addApi:addKeyCollectionInfo,
+    updateApi:updateKeyCollectionInfo,
+    handleUpdateFunc:()=>{
+      crudRef.value.rowEdit(selectionList.value[0]);
+    },
+    handleSelectionChangeFunc:(selection:any)=>{
+      selectionList.value = selection;
+    }
+  })
+
+
+</script>
diff --git a/ui/admin-ui3/src/views/cwgl/requestLog/index.vue b/ui/admin-ui3/src/views/cwgl/requestLog/index.vue
new file mode 100644
index 0000000..26942fe
--- /dev/null
+++ b/ui/admin-ui3/src/views/cwgl/requestLog/index.vue
@@ -0,0 +1,139 @@
+<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="['cwgl:requestLog:edit']"
+            @click="handleUpdate">淇敼
+        </el-button>
+        <el-button
+            type="danger"
+            icon="Delete"
+            :disabled="pageF.multiple"
+            @click="handleDelete"
+            v-hasPermi="['cwgl:requestLog:remove']"
+        >鍒犻櫎
+        </el-button>
+        <el-button
+            type="warning"
+            plain
+            icon="Download"
+            @click="handleExport"
+            v-hasPermi="['cwgl:requestLog:export']"
+        >瀵煎嚭
+        </el-button>
+      </template>
+    </avue-crud>
+  </basicContainer>
+</template>
+
+<script setup name="requestLog" lang="ts">
+  import {RequestLogI,addRequestLog, delRequestLog, exportRequestLog, getRequestLog, listRequestLog, updateRequestLog} from "@/api/cwgl/requestLog";
+  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(["cwgl:requestLog:add"]),
+      delBtn: hasPermission(["cwgl:requestLog:remove"]),
+      editBtn: hasPermission(["cwgl:requestLog:edit"]),
+      viewBtn: hasPermission(["cwgl:requestLog:query"]),
+    }
+  })
+
+  const data = reactive({
+    form:<RequestLogI>{},
+    queryParams:<RequestLogI&PageQueryInterface>{},
+    page: <PagesInterface>{
+      pageSize: 10,
+      total: 0,
+      currentPage: 1,
+    },
+    selectionList:[],
+  })
+  const {queryParams,form,page,selectionList} = toRefs(data);
+  const option = ref({
+    pageKey: 'RequestLog',
+    rowKey: 'id',
+    column: {
+                                id: {
+          label: '涓婚敭',
+                            },
+                                driverCode: {
+          label: '鍙告満鍞竴缂栧彿',
+                            },
+                                driverName: {
+          label: '鍙告満濮撳悕',
+                            },
+                                boxNum: {
+          label: '鏌滈棬缂栧彿',
+                            },
+                                createBy: {
+          label: '鍒涘缓鑰�',
+                            },
+                                createTime: {
+          label: '鍒涘缓鏃堕棿',
+                            },
+                                reqTime: {
+          label: '璇锋眰鏃堕棿',
+                            },
+                                type: {
+          label: '0涓婃姤鍙栧嚭1褰掕繕涓婃姤',
+                            },
+                                operation: {
+          label: '鎿嶄綔璇存槑',
+                            },
+          }
+  })
+
+  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:listRequestLog,
+    getDetailApi:getRequestLog,
+    exportApi:exportRequestLog,
+    deleteApi:delRequestLog,
+    addApi:addRequestLog,
+    updateApi:updateRequestLog,
+    handleUpdateFunc:()=>{
+      crudRef.value.rowEdit(selectionList.value[0]);
+    },
+    handleSelectionChangeFunc:(selection:any)=>{
+      selectionList.value = selection;
+    }
+  })
+
+
+</script>

--
Gitblit v1.8.0