From 3974fad5d836431e417e99220cc07bb5b0aba331 Mon Sep 17 00:00:00 2001
From: zhangback <zhangback@163.com>
Date: 星期一, 08 十二月 2025 14:16:16 +0800
Subject: [PATCH] 提交

---
 admin/config/test/application-custom.yml                                       |    7 
 framework/pom.xml                                                              |    5 
 admin/src/main/resources/application-custom.yml                                |    7 
 admin/src/main/resources/application.yml                                       |    8 
 tms/src/main/java/com/ruoyi/tms/mapper/TmsCarKeyDispatchMapper.java            |   87 +++++
 tms/src/main/resources/mapper/tms/TmsCarKeyDispatchMapper.xml                  |  169 +++++++++
 admin/config/prod/application-custom.yml                                       |    7 
 tms/src/main/java/com/ruoyi/tms/domain/TmsCarKeyDispatch.java                  |  140 ++++++++
 tms/src/main/java/com/ruoyi/tms/consumer/CarKeyExpireConsumer.java             |   31 +
 tms/src/main/java/com/ruoyi/tms/service/impl/TmsCarKeyDispatchServiceImpl.java |  182 ++++++++++
 tms/pom.xml                                                                    |    8 
 framework/src/main/java/com/ruoyi/framework/config/RabbitMqConfig.java         |   15 
 tms/src/main/java/com/ruoyi/tms/service/ITmsCarKeyDispatchService.java         |  102 ++++++
 tms/src/main/java/com/ruoyi/tms/config/TmsRabbitConfig.java                    |   50 ++
 tms/src/main/java/com/ruoyi/tms/controller/TmsCarKeyDispatchController.java    |  108 ++++++
 tms/src/main/java/com/ruoyi/tms/service/impl/TmsTripServiceImpl.java           |   67 +++
 16 files changed, 983 insertions(+), 10 deletions(-)

diff --git a/admin/config/prod/application-custom.yml b/admin/config/prod/application-custom.yml
index ddd44e6..4577e5e 100644
--- a/admin/config/prod/application-custom.yml
+++ b/admin/config/prod/application-custom.yml
@@ -1,4 +1,11 @@
 custom:
+  rabbitmq:
+    # 闆嗙兢鍦板潃锛岀敤閫楀彿鍒嗛殧
+    host: 172.16.24.14
+    port: 5672
+    virtual-host: GF_HOST
+    username: admin
+    password:
   serialNumber:
     cache:
       enabled: true
diff --git a/admin/config/test/application-custom.yml b/admin/config/test/application-custom.yml
index 6fb34e1..afd76e0 100644
--- a/admin/config/test/application-custom.yml
+++ b/admin/config/test/application-custom.yml
@@ -1,4 +1,11 @@
 custom:
+  rabbitmq:
+    # 闆嗙兢鍦板潃锛岀敤閫楀彿鍒嗛殧
+    host: 61.143.42.70
+    port: 7008
+    virtual-host: GF_HOST_TEST
+    username: user_test
+    password: testuser_&
   serialNumber:
     cache:
       enabled: true
diff --git a/admin/src/main/resources/application-custom.yml b/admin/src/main/resources/application-custom.yml
index 5e9f5bb..88d6ad6 100644
--- a/admin/src/main/resources/application-custom.yml
+++ b/admin/src/main/resources/application-custom.yml
@@ -57,6 +57,13 @@
         login-password: admin123
     filter:
       log-slow-sql: true  # 鎱QL璁板綍
+  rabbitmq:
+    # 闆嗙兢鍦板潃锛岀敤閫楀彿鍒嗛殧
+    host: 192.168.1.100
+    port: 5672
+    virtual-host: ccyf_dev
+    username: admin
+    password: admin@123
   #redis 鐩稿叧閰嶇疆
   redis:
     host: localhost #璁块棶鍦板潃
diff --git a/admin/src/main/resources/application.yml b/admin/src/main/resources/application.yml
index cc57247..a25f6d8 100644
--- a/admin/src/main/resources/application.yml
+++ b/admin/src/main/resources/application.yml
@@ -50,6 +50,14 @@
 
 # Spring閰嶇疆
 spring:
+  rabbitmq:
+    # 闆嗙兢鍦板潃锛岀敤閫楀彿鍒嗛殧
+    host: ${custom.rabbitmq.host}
+    port: ${custom.rabbitmq.port}
+    virtual-host: ${custom.rabbitmq.virtual-host}
+    username: ${custom.rabbitmq.username}
+    password: ${custom.rabbitmq.password}
+    connection-timeout: 15000
   # 璧勬簮淇℃伅
   messages:
     # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
diff --git a/framework/pom.xml b/framework/pom.xml
index c0a0941..afe137b 100644
--- a/framework/pom.xml
+++ b/framework/pom.xml
@@ -46,7 +46,10 @@
                 </exclusion>
             </exclusions>
         </dependency>
-
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-amqp</artifactId>
+        </dependency>
         <!-- 鑾峰彇绯荤粺淇℃伅 -->
         <dependency>
             <groupId>com.github.oshi</groupId>
diff --git a/framework/src/main/java/com/ruoyi/framework/config/RabbitMqConfig.java b/framework/src/main/java/com/ruoyi/framework/config/RabbitMqConfig.java
new file mode 100644
index 0000000..765bdf0
--- /dev/null
+++ b/framework/src/main/java/com/ruoyi/framework/config/RabbitMqConfig.java
@@ -0,0 +1,15 @@
+package com.ruoyi.framework.config;
+
+import org.springframework.amqp.rabbit.connection.ConnectionFactory;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class RabbitMqConfig {
+    @Bean
+    public RabbitTemplate rabbitTemplate( ConnectionFactory connectionFactory){
+        return new RabbitTemplate(connectionFactory);
+    }
+
+}
diff --git a/tms/pom.xml b/tms/pom.xml
index 1f8cd95..10c58a9 100644
--- a/tms/pom.xml
+++ b/tms/pom.xml
@@ -25,6 +25,14 @@
             <groupId>com.ruoyi</groupId>
             <artifactId>system</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.amqp</groupId>
+            <artifactId>spring-amqp</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.amqp</groupId>
+            <artifactId>spring-rabbit</artifactId>
+        </dependency>
 
     </dependencies>
 </project>
\ No newline at end of file
diff --git a/tms/src/main/java/com/ruoyi/tms/config/TmsRabbitConfig.java b/tms/src/main/java/com/ruoyi/tms/config/TmsRabbitConfig.java
new file mode 100644
index 0000000..ad667b7
--- /dev/null
+++ b/tms/src/main/java/com/ruoyi/tms/config/TmsRabbitConfig.java
@@ -0,0 +1,50 @@
+package com.ruoyi.tms.config;
+
+import org.springframework.amqp.core.*;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+
+@Configuration
+public class TmsRabbitConfig {
+
+    // 寤惰繜闃熷垪浜ゆ崲鏈�
+    @Bean
+    public DirectExchange delayExchange() {
+        return new DirectExchange("car_key_delay_exchange");
+    }
+
+    // 姝讳俊闃熷垪浜ゆ崲鏈�
+    @Bean
+    public DirectExchange deadExchange() {
+        return new DirectExchange("car_key_dead_exchange");
+    }
+
+    // 寤惰繜闃熷垪
+    @Bean
+    public Queue delayQueue() {
+        return QueueBuilder.durable("car_key_delay_queue")
+                .withArgument("x-dead-letter-exchange", "car_key_dead_exchange")
+                .withArgument("x-dead-letter-routing-key", "car_key_dead_routing_key")
+                .build();
+    }
+
+    // 姝讳俊闃熷垪锛堝疄闄呮秷璐归槦鍒楋級
+    @Bean
+    public Queue deadQueue() {
+        return QueueBuilder.durable("car_key_dead_queue").build();
+    }
+
+    // 寤惰繜闃熷垪缁戝畾
+    @Bean
+    public Binding delayBinding() {
+        return BindingBuilder.bind(delayQueue()).to(delayExchange()).with("car_key_delay");
+    }
+
+    // 姝讳俊闃熷垪缁戝畾
+    @Bean
+    public Binding deadBinding() {
+        return BindingBuilder.bind(deadQueue()).to(deadExchange()).with("car_key_dead_routing_key");
+    }
+
+}
diff --git a/tms/src/main/java/com/ruoyi/tms/consumer/CarKeyExpireConsumer.java b/tms/src/main/java/com/ruoyi/tms/consumer/CarKeyExpireConsumer.java
new file mode 100644
index 0000000..caac680
--- /dev/null
+++ b/tms/src/main/java/com/ruoyi/tms/consumer/CarKeyExpireConsumer.java
@@ -0,0 +1,31 @@
+package com.ruoyi.tms.consumer;
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.ruoyi.tms.domain.TmsCarKeyDispatch;
+import com.ruoyi.tms.mapper.TmsCarKeyDispatchMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+@Slf4j
+@Component
+public class CarKeyExpireConsumer {
+
+    @Resource
+    private TmsCarKeyDispatchMapper tmsCarKeyDispatchMapper;
+
+    @RabbitListener(queues = "car_key_dead_queue")
+    public void handle(Integer carKeyId) {
+
+        TmsCarKeyDispatch tmsCarKeyDispatch = tmsCarKeyDispatchMapper.selectTmsCarKeyDispatchById(carKeyId);
+        if (tmsCarKeyDispatch != null && tmsCarKeyDispatch.getStatus() == 0){
+            log.info("瓒呮椂棰嗗彇閽ュ寵锛歿}", carKeyId);
+            tmsCarKeyDispatchMapper.update(new LambdaUpdateWrapper<TmsCarKeyDispatch>()
+                    .eq(TmsCarKeyDispatch::getId, carKeyId)
+                    .set(TmsCarKeyDispatch::getStatus, 2)
+            );
+        }
+    }
+}
diff --git a/tms/src/main/java/com/ruoyi/tms/controller/TmsCarKeyDispatchController.java b/tms/src/main/java/com/ruoyi/tms/controller/TmsCarKeyDispatchController.java
new file mode 100644
index 0000000..8234470
--- /dev/null
+++ b/tms/src/main/java/com/ruoyi/tms/controller/TmsCarKeyDispatchController.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.TmsCarKeyDispatch;
+import com.ruoyi.tms.service.ITmsCarKeyDispatchService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 杞﹂挜鍖欏垎鍙戣褰旵ontroller
+ *
+ * @author ruoyi
+ * @date 2025-12-08
+ */
+@RestController
+@RequestMapping("/tms/tmsCarKeyDispatch")
+public class TmsCarKeyDispatchController extends BaseController
+{
+    @Autowired
+    private ITmsCarKeyDispatchService tmsCarKeyDispatchService;
+
+
+
+    /**
+     * 鏌ヨ杞﹂挜鍖欏垎鍙戣褰曞垪琛�
+     */
+    @PreAuthorize("@ss.hasPermi('tms:tmsCarKeyDispatch:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(TmsCarKeyDispatch tmsCarKeyDispatch)
+    {
+        startPage();
+        List<TmsCarKeyDispatch> list = tmsCarKeyDispatchService.selectTmsCarKeyDispatchList(tmsCarKeyDispatch);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭杞﹂挜鍖欏垎鍙戣褰曞垪琛�
+     * @param tmsCarKeyDispatch 鏌ヨ鏉′欢瀵硅薄
+     */
+    @PreAuthorize("@ss.hasPermi('tms:tmsCarKeyDispatch:export')")
+    @Log(title = "杞﹂挜鍖欏垎鍙戣褰�", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(TmsCarKeyDispatch tmsCarKeyDispatch,String exportKey)
+    {
+        tmsCarKeyDispatchService.export(tmsCarKeyDispatch,exportKey);
+        return AjaxResult.success("瀵煎嚭璇锋眰鎴愬姛锛岃绋嶅悗鐐瑰嚮涓嬭浇...!");
+    }
+
+
+
+    /**
+     * 鑾峰彇杞﹂挜鍖欏垎鍙戣褰曡缁嗕俊鎭�
+     */
+    @PreAuthorize("@ss.hasPermi('tms:tmsCarKeyDispatch:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Integer id)
+    {
+        return AjaxResult.success(tmsCarKeyDispatchService.selectTmsCarKeyDispatchById(id));
+    }
+
+    /**
+     * 鏂板杞﹂挜鍖欏垎鍙戣褰�
+     */
+    @PreAuthorize("@ss.hasPermi('tms:tmsCarKeyDispatch:add')")
+    @Log(title = "杞﹂挜鍖欏垎鍙戣褰�", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody TmsCarKeyDispatch tmsCarKeyDispatch)
+    {
+        return toAjax(tmsCarKeyDispatchService.insertTmsCarKeyDispatch(tmsCarKeyDispatch));
+    }
+
+    /**
+     * 淇敼杞﹂挜鍖欏垎鍙戣褰�
+     */
+    @PreAuthorize("@ss.hasPermi('tms:tmsCarKeyDispatch:edit')")
+    @Log(title = "杞﹂挜鍖欏垎鍙戣褰�", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody TmsCarKeyDispatch tmsCarKeyDispatch)
+    {
+        return toAjax(tmsCarKeyDispatchService.updateTmsCarKeyDispatch(tmsCarKeyDispatch));
+    }
+
+    /**
+     * 鍒犻櫎杞﹂挜鍖欏垎鍙戣褰�
+     */
+    @PreAuthorize("@ss.hasPermi('tms:tmsCarKeyDispatch:remove')")
+    @Log(title = "杞﹂挜鍖欏垎鍙戣褰�", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Integer[] ids)
+    {
+        return toAjax(tmsCarKeyDispatchService.deleteTmsCarKeyDispatchByIds(ids));
+    }
+}
diff --git a/tms/src/main/java/com/ruoyi/tms/domain/TmsCarKeyDispatch.java b/tms/src/main/java/com/ruoyi/tms/domain/TmsCarKeyDispatch.java
new file mode 100644
index 0000000..bb463bc
--- /dev/null
+++ b/tms/src/main/java/com/ruoyi/tms/domain/TmsCarKeyDispatch.java
@@ -0,0 +1,140 @@
+package com.ruoyi.tms.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.annotation.Excel;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+
+import java.util.Date;
+
+import lombok.Data;
+
+/**
+ * 杞﹂挜鍖欏垎鍙戣褰曞璞� tms_car_key_dispatch
+ *
+ * @author ruoyi
+ * @date 2025-12-08
+ */
+@Data
+public class TmsCarKeyDispatch {
+
+
+    /**
+     * id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+
+    /**
+     * 璋冨害鍗旾D
+     */
+    @Excel(name = "璋冨害鍗旾D")
+    @TableField("dispatch_order_id")
+    private Integer dispatchOrderId;
+
+
+    /**
+     * 璋冨害鍗曞彿
+     */
+    @Excel(name = "璋冨害鍗曞彿")
+    @TableField("dispatch_order_no")
+    private String dispatchOrderNo;
+
+
+    /**
+     * 鍙告満id
+     */
+    @Excel(name = "鍙告満id")
+    @TableField("driver_id")
+    private Integer driverId;
+
+
+    /**
+     * 鍙告満鎵嬫満鍙�
+     */
+    @Excel(name = "鍙告満鎵嬫満鍙�")
+    @TableField("driver_mobile")
+    private String driverMobile;
+
+
+    /**
+     * 鍙告満鍚嶇О
+     */
+    @Excel(name = "鍙告満鍚嶇О")
+    @TableField("driver_name")
+    private String driverName;
+
+
+    /**
+     * 杞﹁締id
+     */
+    @Excel(name = "杞﹁締id")
+    @TableField("vehicle_id")
+    private Integer vehicleId;
+
+
+    /**
+     * 杞︾墝鍙�
+     */
+    @Excel(name = "杞︾墝鍙�")
+    @TableField("vehicle_license_plate")
+    private String vehicleLicensePlate;
+
+
+    /**
+     * 杞﹂挜鍖欐煖鍙�
+     */
+    @Excel(name = "杞﹂挜鍖欐煖鍙�")
+    @TableField("vehicle_car_key_no")
+    private String vehicleCarKeyNo;
+
+
+    /**
+     * 棰嗛挜鍖欐埅姝㈡椂闂�
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "棰嗛挜鍖欐埅姝㈡椂闂�", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    @TableField("car_key_expiration_time")
+    private Date carKeyExpirationTime;
+
+
+    /**
+     * 閽ュ寵棰嗗彇鏃堕棿
+     */
+    @Excel(name = "閽ュ寵棰嗗彇鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField("car_key_collection _time")
+    private Date carKeyCollectionTime;
+
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField("create_time")
+    private Date createTime;
+
+
+    /**
+     * 鏇存柊鏃堕棿
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField("update_time")
+    private Date updateTime;
+
+
+    /**
+     * 鐘舵��(0:寰呴鍙�;1:宸查鍙�;2:宸查�炬湡;)
+     */
+    @Excel(name = "鐘舵��(0:寰呴鍙�;1:宸查鍙�;2:宸查�炬湡;)")
+    @TableField("status")
+    private Integer status;
+
+
+}
diff --git a/tms/src/main/java/com/ruoyi/tms/mapper/TmsCarKeyDispatchMapper.java b/tms/src/main/java/com/ruoyi/tms/mapper/TmsCarKeyDispatchMapper.java
new file mode 100644
index 0000000..e18cff4
--- /dev/null
+++ b/tms/src/main/java/com/ruoyi/tms/mapper/TmsCarKeyDispatchMapper.java
@@ -0,0 +1,87 @@
+package com.ruoyi.tms.mapper;
+
+import java.util.List;
+import com.ruoyi.tms.domain.TmsCarKeyDispatch;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+
+/**
+ * 杞﹂挜鍖欏垎鍙戣褰昅apper鎺ュ彛
+ * 
+ * @author ruoyi
+ * @date 2025-12-08
+ */
+public interface TmsCarKeyDispatchMapper  extends BaseMapper<TmsCarKeyDispatch>
+{
+    /**
+     * 鏌ヨ杞﹂挜鍖欏垎鍙戣褰�
+     * 
+     * @param id 杞﹂挜鍖欏垎鍙戣褰旾D
+     * @return 杞﹂挜鍖欏垎鍙戣褰�
+     */
+    public TmsCarKeyDispatch selectTmsCarKeyDispatchById(Integer id);
+
+    /**
+     * 鏌ヨ杞﹂挜鍖欏垎鍙戣褰� 璁板綍鏁�
+     *
+     * @param tmsCarKeyDispatch 杞﹂挜鍖欏垎鍙戣褰�
+     * @return 杞﹂挜鍖欏垎鍙戣褰曢泦鍚�
+     */
+    public int selectTmsCarKeyDispatchCount(TmsCarKeyDispatch tmsCarKeyDispatch);
+
+    /**
+     * 鏌ヨ杞﹂挜鍖欏垎鍙戣褰曞垪琛�
+     * 
+     * @param tmsCarKeyDispatch 杞﹂挜鍖欏垎鍙戣褰�
+     * @return 杞﹂挜鍖欏垎鍙戣褰曢泦鍚�
+     */
+    public List<TmsCarKeyDispatch> selectTmsCarKeyDispatchList(TmsCarKeyDispatch tmsCarKeyDispatch);
+
+    /**
+     * 鏂板杞﹂挜鍖欏垎鍙戣褰�
+     * 
+     * @param tmsCarKeyDispatch 杞﹂挜鍖欏垎鍙戣褰�
+     * @return 缁撴灉
+     */
+    public int insertTmsCarKeyDispatch(TmsCarKeyDispatch tmsCarKeyDispatch);
+
+    /**
+     * 鏂板杞﹂挜鍖欏垎鍙戣褰昜鎵归噺]
+     *
+     * @param tmsCarKeyDispatchs 杞﹂挜鍖欏垎鍙戣褰�
+     * @return 缁撴灉
+     */
+    public int insertTmsCarKeyDispatchBatch(List<TmsCarKeyDispatch> tmsCarKeyDispatchs);
+
+    /**
+     * 淇敼杞﹂挜鍖欏垎鍙戣褰�
+     * 
+     * @param tmsCarKeyDispatch 杞﹂挜鍖欏垎鍙戣褰�
+     * @return 缁撴灉
+     */
+    public int updateTmsCarKeyDispatch(TmsCarKeyDispatch tmsCarKeyDispatch);
+
+    /**
+     * 淇敼杞﹂挜鍖欏垎鍙戣褰昜鎵归噺]
+     *
+     * @param tmsCarKeyDispatchs 杞﹂挜鍖欏垎鍙戣褰�
+     * @return 缁撴灉
+     */
+    public int updateTmsCarKeyDispatchBatch(List<TmsCarKeyDispatch> tmsCarKeyDispatchs);
+
+    /**
+     * 鍒犻櫎杞﹂挜鍖欏垎鍙戣褰�
+     * 
+     * @param id 杞﹂挜鍖欏垎鍙戣褰旾D
+     * @return 缁撴灉
+     */
+    public int deleteTmsCarKeyDispatchById(Integer id);
+
+    /**
+     * 鎵归噺鍒犻櫎杞﹂挜鍖欏垎鍙戣褰�
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteTmsCarKeyDispatchByIds(Integer[] ids);
+}
diff --git a/tms/src/main/java/com/ruoyi/tms/service/ITmsCarKeyDispatchService.java b/tms/src/main/java/com/ruoyi/tms/service/ITmsCarKeyDispatchService.java
new file mode 100644
index 0000000..09be893
--- /dev/null
+++ b/tms/src/main/java/com/ruoyi/tms/service/ITmsCarKeyDispatchService.java
@@ -0,0 +1,102 @@
+package com.ruoyi.tms.service;
+
+import java.util.List;
+import com.ruoyi.tms.domain.TmsCarKeyDispatch;
+import com.baomidou.mybatisplus.extension.service.IService;
+/**
+ * 杞﹂挜鍖欏垎鍙戣褰昐ervice鎺ュ彛
+ * 
+ * @author ruoyi
+ * @date 2025-12-08
+ */
+public interface ITmsCarKeyDispatchService extends IService<TmsCarKeyDispatch>
+{
+    /**
+     * 鏌ヨ杞﹂挜鍖欏垎鍙戣褰�
+     * 
+     * @param id 杞﹂挜鍖欏垎鍙戣褰旾D
+     * @return 杞﹂挜鍖欏垎鍙戣褰�
+     */
+    public TmsCarKeyDispatch selectTmsCarKeyDispatchById(Integer id);
+
+    /**
+     * 鏌ヨ杞﹂挜鍖欏垎鍙戣褰� 璁板綍鏁�
+     *
+     * @param tmsCarKeyDispatch 杞﹂挜鍖欏垎鍙戣褰�
+     * @return 杞﹂挜鍖欏垎鍙戣褰曢泦鍚�
+     */
+    public int selectTmsCarKeyDispatchCount(TmsCarKeyDispatch tmsCarKeyDispatch);
+
+    /**
+     * 鏌ヨ杞﹂挜鍖欏垎鍙戣褰曞垪琛�
+     * 
+     * @param tmsCarKeyDispatch 杞﹂挜鍖欏垎鍙戣褰�
+     * @return 杞﹂挜鍖欏垎鍙戣褰曢泦鍚�
+     */
+    public List<TmsCarKeyDispatch> selectTmsCarKeyDispatchList(TmsCarKeyDispatch tmsCarKeyDispatch);
+
+    /**
+     * 鏌ヨ杞﹂挜鍖欏垎鍙戣褰曞垪琛� 寮傛 瀵煎嚭
+     *
+     * @param tmsCarKeyDispatch 杞﹂挜鍖欏垎鍙戣褰�
+     * @param exportKey 瀵煎嚭鍔熻兘鐨勫敮涓�鏍囪瘑
+     * @return 杞﹂挜鍖欏垎鍙戣褰曢泦鍚�
+     */
+    public void export(TmsCarKeyDispatch tmsCarKeyDispatch, String exportKey) ;
+
+
+    /**
+     * 鏂板杞﹂挜鍖欏垎鍙戣褰�
+     * 
+     * @param tmsCarKeyDispatch 杞﹂挜鍖欏垎鍙戣褰�
+     * @return 缁撴灉
+     */
+    public int insertTmsCarKeyDispatch(TmsCarKeyDispatch tmsCarKeyDispatch);
+
+    /**
+     * 鏂板杞﹂挜鍖欏垎鍙戣褰昜鎵归噺]
+     *
+     * @param tmsCarKeyDispatchs 杞﹂挜鍖欏垎鍙戣褰�
+     * @return 缁撴灉
+     */
+    public int insertTmsCarKeyDispatchBatch(List<TmsCarKeyDispatch> tmsCarKeyDispatchs);
+
+    /**
+     * 淇敼杞﹂挜鍖欏垎鍙戣褰�
+     * 
+     * @param tmsCarKeyDispatch 杞﹂挜鍖欏垎鍙戣褰�
+     * @return 缁撴灉
+     */
+    public int updateTmsCarKeyDispatch(TmsCarKeyDispatch tmsCarKeyDispatch);
+
+    /**
+     * 淇敼杞﹂挜鍖欏垎鍙戣褰昜鎵归噺]
+     *
+     * @param tmsCarKeyDispatchs 杞﹂挜鍖欏垎鍙戣褰�
+     * @return 缁撴灉
+     */
+    public int updateTmsCarKeyDispatchBatch(List<TmsCarKeyDispatch> tmsCarKeyDispatchs);
+    /**
+     * 鎵归噺鍒犻櫎杞﹂挜鍖欏垎鍙戣褰�
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteTmsCarKeyDispatchByIds(String ids);
+
+    /**
+     * 鎵归噺鍒犻櫎杞﹂挜鍖欏垎鍙戣褰�
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteTmsCarKeyDispatchByIds(Integer[] ids);
+
+    /**
+     * 鍒犻櫎杞﹂挜鍖欏垎鍙戣褰曚俊鎭�
+     * 
+     * @param id 杞﹂挜鍖欏垎鍙戣褰旾D
+     * @return 缁撴灉
+     */
+    public int deleteTmsCarKeyDispatchById(Integer id);
+}
diff --git a/tms/src/main/java/com/ruoyi/tms/service/impl/TmsCarKeyDispatchServiceImpl.java b/tms/src/main/java/com/ruoyi/tms/service/impl/TmsCarKeyDispatchServiceImpl.java
new file mode 100644
index 0000000..480386e
--- /dev/null
+++ b/tms/src/main/java/com/ruoyi/tms/service/impl/TmsCarKeyDispatchServiceImpl.java
@@ -0,0 +1,182 @@
+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.TmsCarKeyDispatchMapper;
+import com.ruoyi.tms.domain.TmsCarKeyDispatch;
+import com.ruoyi.tms.service.ITmsCarKeyDispatchService;
+import com.ruoyi.common.core.text.Convert;
+
+/**
+ * 杞﹂挜鍖欏垎鍙戣褰昐ervice涓氬姟灞傚鐞�
+ *
+ * @author ruoyi
+ * @date 2025-12-08
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class TmsCarKeyDispatchServiceImpl  extends BaseService<TmsCarKeyDispatchMapper, TmsCarKeyDispatch> implements ITmsCarKeyDispatchService
+{
+    protected final Logger logger = LoggerFactory.getLogger(getClass());
+    @Resource
+    private TmsCarKeyDispatchMapper tmsCarKeyDispatchMapper;
+
+
+    /**
+     * 鏌ヨ杞﹂挜鍖欏垎鍙戣褰�
+     *
+     * @param id 杞﹂挜鍖欏垎鍙戣褰旾D
+     * @return 杞﹂挜鍖欏垎鍙戣褰�
+     */
+    @DataSource(DataSourceType.SLAVE)
+    @Override
+    public TmsCarKeyDispatch selectTmsCarKeyDispatchById(Integer id)
+    {
+        return tmsCarKeyDispatchMapper.selectTmsCarKeyDispatchById(id);
+    }
+
+    /**
+     * 鏌ヨ杞﹂挜鍖欏垎鍙戣褰� 璁板綍鏁�
+     *
+     * @param tmsCarKeyDispatch 杞﹂挜鍖欏垎鍙戣褰�
+     * @return 杞﹂挜鍖欏垎鍙戣褰曢泦鍚�
+     */
+    @DataSource(DataSourceType.SLAVE)
+    @Override
+    public int selectTmsCarKeyDispatchCount(TmsCarKeyDispatch tmsCarKeyDispatch)
+    {
+        return tmsCarKeyDispatchMapper.selectTmsCarKeyDispatchCount(tmsCarKeyDispatch);
+    }
+
+    /**
+     * 鏌ヨ杞﹂挜鍖欏垎鍙戣褰曞垪琛�
+     *
+     * @param tmsCarKeyDispatch 杞﹂挜鍖欏垎鍙戣褰�
+     * @return 杞﹂挜鍖欏垎鍙戣褰�
+     */
+    @DataSource(DataSourceType.SLAVE)
+    @Override
+    public List<TmsCarKeyDispatch> selectTmsCarKeyDispatchList(TmsCarKeyDispatch tmsCarKeyDispatch)
+    {
+        return tmsCarKeyDispatchMapper.selectTmsCarKeyDispatchList(tmsCarKeyDispatch);
+    }
+
+    /**
+     * 鏌ヨ杞﹂挜鍖欏垎鍙戣褰曞垪琛� 寮傛 瀵煎嚭
+     *
+     * @param tmsCarKeyDispatch 杞﹂挜鍖欏垎鍙戣褰�
+     * @param exportKey 瀵煎嚭鍔熻兘鐨勫敮涓�鏍囪瘑
+     * @return 杞﹂挜鍖欏垎鍙戣褰曢泦鍚�
+     */
+    @DataSource(DataSourceType.SLAVE)
+    @Async
+    @Override
+    public void export(TmsCarKeyDispatch tmsCarKeyDispatch,String exportKey) {
+
+        super.export(TmsCarKeyDispatch.class,exportKey,"tmsCarKeyDispatchData",(pageNum)->{
+            PageUtils.startPage(pageNum, Constants.EXPORT_PATE_SIZE);
+            return selectTmsCarKeyDispatchList(tmsCarKeyDispatch);
+        });
+    }
+
+
+    /**
+     * 鏂板杞﹂挜鍖欏垎鍙戣褰�
+     *
+     * @param tmsCarKeyDispatch 杞﹂挜鍖欏垎鍙戣褰�
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertTmsCarKeyDispatch(TmsCarKeyDispatch tmsCarKeyDispatch)
+    {
+        tmsCarKeyDispatch.setCreateTime(DateUtils.getNowDate());
+        return tmsCarKeyDispatchMapper.insertTmsCarKeyDispatch(tmsCarKeyDispatch);
+    }
+
+    /**
+     * 鏂板杞﹂挜鍖欏垎鍙戣褰昜鎵归噺]
+     *
+     * @param tmsCarKeyDispatchs 杞﹂挜鍖欏垎鍙戣褰�
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertTmsCarKeyDispatchBatch(List<TmsCarKeyDispatch> tmsCarKeyDispatchs)
+    {
+        int rows = tmsCarKeyDispatchMapper.insertTmsCarKeyDispatchBatch(tmsCarKeyDispatchs);
+        return rows;
+    }
+
+    /**
+     * 淇敼杞﹂挜鍖欏垎鍙戣褰�
+     *
+     * @param tmsCarKeyDispatch 杞﹂挜鍖欏垎鍙戣褰�
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateTmsCarKeyDispatch(TmsCarKeyDispatch tmsCarKeyDispatch)
+    {
+        tmsCarKeyDispatch.setUpdateTime(DateUtils.getNowDate());
+        return tmsCarKeyDispatchMapper.updateTmsCarKeyDispatch(tmsCarKeyDispatch);
+    }
+
+    /**
+     * 淇敼杞﹂挜鍖欏垎鍙戣褰昜鎵归噺]
+     *
+     * @param tmsCarKeyDispatchs 杞﹂挜鍖欏垎鍙戣褰�
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateTmsCarKeyDispatchBatch(List<TmsCarKeyDispatch> tmsCarKeyDispatchs){
+        return tmsCarKeyDispatchMapper.updateTmsCarKeyDispatchBatch(tmsCarKeyDispatchs);
+    }
+
+    /**
+     * 鍒犻櫎杞﹂挜鍖欏垎鍙戣褰曞璞�
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteTmsCarKeyDispatchByIds(String ids)
+    {
+        return deleteTmsCarKeyDispatchByIds(Convert.toIntArray(ids));
+    }
+
+    /**
+     * 鍒犻櫎杞﹂挜鍖欏垎鍙戣褰曞璞�
+     *
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteTmsCarKeyDispatchByIds(Integer[] ids)
+    {
+        return tmsCarKeyDispatchMapper.deleteTmsCarKeyDispatchByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎杞﹂挜鍖欏垎鍙戣褰曚俊鎭�
+     *
+     * @param id 杞﹂挜鍖欏垎鍙戣褰旾D
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteTmsCarKeyDispatchById(Integer id)
+    {
+        return tmsCarKeyDispatchMapper.deleteTmsCarKeyDispatchById(id);
+    }
+}
diff --git a/tms/src/main/java/com/ruoyi/tms/service/impl/TmsTripServiceImpl.java b/tms/src/main/java/com/ruoyi/tms/service/impl/TmsTripServiceImpl.java
index b38d4d5..aaef49c 100644
--- a/tms/src/main/java/com/ruoyi/tms/service/impl/TmsTripServiceImpl.java
+++ b/tms/src/main/java/com/ruoyi/tms/service/impl/TmsTripServiceImpl.java
@@ -1,10 +1,9 @@
 package com.ruoyi.tms.service.impl;
 
 import java.io.File;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.*;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -18,11 +17,10 @@
 import com.ruoyi.common.utils.uuid.Seq;
 import com.ruoyi.system.service.ISysUserService;
 import com.ruoyi.tms.domain.*;
-import com.ruoyi.tms.mapper.TmsDispatchOrderMapper;
-import com.ruoyi.tms.mapper.TmsDriverDispatchMapper;
-import com.ruoyi.tms.mapper.TmsDriverMapper;
+import com.ruoyi.tms.mapper.*;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.FilenameUtils;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.transaction.annotation.Transactional;
@@ -35,7 +33,6 @@
 import com.ruoyi.common.enums.DataSourceType;
 import com.ruoyi.common.core.service.BaseService;
 
-import com.ruoyi.tms.mapper.TmsTripMapper;
 import com.ruoyi.tms.service.ITmsTripService;
 import com.ruoyi.common.core.text.Convert;
 
@@ -65,6 +62,10 @@
     private TmsDriverMapper tmsDriverMapper;
     @Autowired
     private TmsVehicleServiceImpl tmsVehicleServiceImpl;
+    @Resource
+    private TmsCarKeyDispatchMapper tmsCarKeyDispatchMapper;
+    @Autowired
+    private RabbitTemplate rabbitTemplate;
 
     @Autowired
     private AsyncPdfService asyncPdfService;
@@ -160,6 +161,7 @@
             throw new RuntimeException("鏈壘鍒板徃鏈烘暟鎹�");
         }
 
+
         tmsDispatchOrder.setStatus(2);
         tmsDispatchOrderMapper.updateTmsDispatchOrder(tmsDispatchOrder);
         tmsTrip.setDriverName(tmsDispatchOrder.getMainDriverName());
@@ -171,8 +173,55 @@
         if (StringUtils.isNotEmpty(tmsTrip.getSignImg())){
             asyncPdfService.generateTripPdfAsync(tmsTrip,tmsDispatchOrder,tmsDriver);
         }
+        // 瀹屾垚韬綋妫�鏌�
+        if (tmsTrip.getTripType() == 1){
+            // 娣诲姞 棰嗛挜鍖� 鎸囦护璁板綍
+            TmsVehicle tmsVehicle = tmsVehicleServiceImpl.selectTmsVehicleById(tmsDispatchOrder.getVehicleId());
+
+            TmsCarKeyDispatch tmsCarKeyDispatch = new TmsCarKeyDispatch();
+            tmsCarKeyDispatch.setDispatchOrderId(dispatchOrderId);
+            tmsCarKeyDispatch.setDispatchOrderNo(tmsDispatchOrder.getDispatchNo());
+            tmsCarKeyDispatch.setDriverId(tmsDriver.getId());
+            tmsCarKeyDispatch.setDriverMobile(tmsDriver.getMobile());
+            tmsCarKeyDispatch.setDriverName(tmsDriver.getDriverName());
+
+            tmsCarKeyDispatch.setVehicleId(tmsDispatchOrder.getVehicleId());
+            tmsCarKeyDispatch.setVehicleLicensePlate(tmsDispatchOrder.getLicensePlate());
+            tmsCarKeyDispatch.setVehicleCarKeyNo(tmsVehicle.getCarKeyNo());
+
+            LocalDateTime plus2Hours = LocalDateTime.now().plusHours(2);
+            Date date = Date.from(plus2Hours.atZone(ZoneId.systemDefault()).toInstant());
+
+            tmsCarKeyDispatch.setCarKeyExpirationTime(date);
+            tmsCarKeyDispatch.setStatus(0);
+            tmsCarKeyDispatchMapper.insertTmsCarKeyDispatch(tmsCarKeyDispatch);
+
+            sendCarKeyDelayMessage(tmsCarKeyDispatch.getId(),  2 * 60 * 60 * 1000L);
+
+        }
+
+
         return 1;
     }
+
+    /**
+     * 鍙戦�佸欢杩熸秷鎭�
+     * @param carKeyId car_key id
+     * @param delayMillis 寤惰繜姣鏁�
+     */
+    public void sendCarKeyDelayMessage(Integer carKeyId, long delayMillis) {
+        rabbitTemplate.convertAndSend(
+                "car_key_delay_exchange",
+                "car_key_delay",
+                carKeyId,
+                message -> {
+                    message.getMessageProperties().setExpiration(String.valueOf(delayMillis));
+                    return message;
+                }
+        );
+    }
+
+
     @Override
     public AjaxResult submitDropHook(TmsTrip tmsTrip){
         Integer dispatchOrderId = tmsTrip.getDispatchOrderId();
@@ -229,7 +278,7 @@
         }
 
 
-        TmsVehicle tmsVehicle = tmsVehicleServiceImpl.selectTmsVehicleById(driverDispatch.getDriverId());
+        TmsVehicle tmsVehicle = tmsVehicleServiceImpl.selectTmsVehicleById(driverDispatch.getVehicleId());
 
         tmsDispatchOrderMapper.update(
                 new LambdaUpdateWrapper<TmsDispatchOrder>()
diff --git a/tms/src/main/resources/mapper/tms/TmsCarKeyDispatchMapper.xml b/tms/src/main/resources/mapper/tms/TmsCarKeyDispatchMapper.xml
new file mode 100644
index 0000000..2d3ae1d
--- /dev/null
+++ b/tms/src/main/resources/mapper/tms/TmsCarKeyDispatchMapper.xml
@@ -0,0 +1,169 @@
+<?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.TmsCarKeyDispatchMapper">
+
+    <resultMap type="com.ruoyi.tms.domain.TmsCarKeyDispatch" id="TmsCarKeyDispatchResult">
+        <result property="id"    column="id"    />
+        <result property="dispatchOrderId"    column="dispatch_order_id"    />
+        <result property="dispatchOrderNo"    column="dispatch_order_no"    />
+        <result property="driverId"    column="driver_id"    />
+        <result property="driverMobile"    column="driver_mobile"    />
+        <result property="driverName"    column="driver_name"    />
+        <result property="vehicleId"    column="vehicle_id"    />
+        <result property="vehicleLicensePlate"    column="vehicle_license_plate"    />
+        <result property="vehicleCarKeyNo"    column="vehicle_car_key_no"    />
+        <result property="carKeyExpirationTime"    column="car_key_expiration_time"    />
+        <result property="carKeyCollectionTime"    column="car_key_collection_time"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="status"    column="status"    />
+    </resultMap>
+
+    <sql id="selectTmsCarKeyDispatchVo">
+        select thisTab.id, thisTab.dispatch_order_id, thisTab.dispatch_order_no, thisTab.driver_id, thisTab.driver_mobile, thisTab.driver_name, thisTab.vehicle_id, thisTab.vehicle_license_plate, thisTab.vehicle_car_key_no, thisTab.car_key_expiration_time, thisTab.car_key_collection_time, thisTab.create_time, thisTab.update_time, thisTab.status from tms_car_key_dispatch AS thisTab
+    </sql>
+    <sql id="selectTmsCarKeyDispatchVoCount">
+        select count(0) from tms_car_key_dispatch as thisTab
+    </sql>
+
+    <sql id="whereCondition">
+        <if test="dispatchOrderId != null "> and thisTab.dispatch_order_id = #{dispatchOrderId}</if>
+        <if test="dispatchOrderNo != null  and dispatchOrderNo != ''"> and thisTab.dispatch_order_no = #{dispatchOrderNo}</if>
+        <if test="driverId != null "> and thisTab.driver_id = #{driverId}</if>
+        <if test="driverMobile != null  and driverMobile != ''"> and thisTab.driver_mobile = #{driverMobile}</if>
+        <if test="driverName != null  and driverName != ''"> and  thisTab.driver_name like concat('%', #{driverName}, '%')</if>
+        <if test="vehicleId != null "> and thisTab.vehicle_id = #{vehicleId}</if>
+        <if test="vehicleLicensePlate != null  and vehicleLicensePlate != ''"> and thisTab.vehicle_license_plate = #{vehicleLicensePlate}</if>
+        <if test="vehicleCarKeyNo != null "> and thisTab.vehicle_car_key_no = #{vehicleCarKeyNo}</if>
+        <if test="carKeyExpirationTime != null "> and thisTab.car_key_expiration_time = #{carKeyExpirationTime}</if>
+        <if test="carKeyCollectionTime != null "> and thisTab.car_key_collection_time = #{carKeyCollectionTime}</if>
+        <if test="status != null "> and thisTab.status = #{status}</if>
+    </sql>
+
+    <!--鏌ヨ-->
+    <select id="selectTmsCarKeyDispatchById" parameterType="Integer" resultMap="TmsCarKeyDispatchResult">
+        <include refid="selectTmsCarKeyDispatchVo"/>
+        where id = #{id}
+    </select>
+
+    <select id="selectTmsCarKeyDispatchCount" parameterType="com.ruoyi.tms.domain.TmsCarKeyDispatch" resultType="int">
+        <include refid="selectTmsCarKeyDispatchVoCount"/>
+        <where>
+            <include refid="whereCondition"/>
+        </where>
+    </select>
+
+    <select id="selectTmsCarKeyDispatchList" parameterType="com.ruoyi.tms.domain.TmsCarKeyDispatch" resultMap="TmsCarKeyDispatchResult">
+        <include refid="selectTmsCarKeyDispatchVo"/>
+        <where>
+            <include refid="whereCondition"/>
+        </where>
+        order by thisTab.id desc
+    </select>
+
+    <!-- 鏂板 -->
+    <insert id="insertTmsCarKeyDispatch" parameterType="com.ruoyi.tms.domain.TmsCarKeyDispatch" useGeneratedKeys="true" keyProperty="id">
+        insert into tms_car_key_dispatch
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">id,</if>
+            <if test="dispatchOrderId != null">dispatch_order_id,</if>
+            <if test="dispatchOrderNo != null">dispatch_order_no,</if>
+            <if test="driverId != null">driver_id,</if>
+            <if test="driverMobile != null and driverMobile != ''">driver_mobile,</if>
+            <if test="driverName != null">driver_name,</if>
+            <if test="vehicleId != null">vehicle_id,</if>
+            <if test="vehicleLicensePlate != null">vehicle_license_plate,</if>
+            <if test="vehicleCarKeyNo != null">vehicle_car_key_no,</if>
+            <if test="carKeyExpirationTime != null">car_key_expiration_time,</if>
+            <if test="carKeyCollectionTime != null">car_key_collection_time,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="status != null">status,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null">#{id},</if>
+            <if test="dispatchOrderId != null">#{dispatchOrderId},</if>
+            <if test="dispatchOrderNo != null">#{dispatchOrderNo},</if>
+            <if test="driverId != null">#{driverId},</if>
+            <if test="driverMobile != null and driverMobile != ''">#{driverMobile},</if>
+            <if test="driverName != null">#{driverName},</if>
+            <if test="vehicleId != null">#{vehicleId},</if>
+            <if test="vehicleLicensePlate != null">#{vehicleLicensePlate},</if>
+            <if test="vehicleCarKeyNo != null">#{vehicleCarKeyNo},</if>
+            <if test="carKeyExpirationTime != null">#{carKeyExpirationTime},</if>
+            <if test="carKeyCollectionTime != null">#{carKeyCollectionTime},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="status != null">#{status},</if>
+         </trim>
+    </insert>
+
+    <insert id="insertTmsCarKeyDispatchBatch" parameterType="java.util.List" >
+        insert into tms_car_key_dispatch
+        <trim prefix="(" suffix=") values" suffixOverrides=",">
+            id,dispatch_order_id,dispatch_order_no,driver_id,driver_mobile,driver_name,vehicle_id,vehicle_license_plate,vehicle_car_key_no,car_key_expiration_time,car_key_collection_time,create_time,update_time,status,
+        </trim>
+        <foreach item="item" index="index" collection="list" separator=",">
+            <trim prefix="(" suffix=") " suffixOverrides=",">
+                #{item.id},#{item.dispatchOrderId},#{item.dispatchOrderNo},#{item.driverId},#{item.driverMobile},#{item.driverName},#{item.vehicleId},#{item.vehicleLicensePlate},#{item.vehicleCarKeyNo},#{item.carKeyExpirationTime},#{item.carKeyCollectionTime},#{item.createTime},#{item.updateTime},#{item.status},
+            </trim>
+        </foreach>
+    </insert>
+
+    <!-- 淇敼 -->
+    <update id="updateTmsCarKeyDispatch" parameterType="com.ruoyi.tms.domain.TmsCarKeyDispatch">
+        update tms_car_key_dispatch
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="dispatchOrderId != null">dispatch_order_id = #{dispatchOrderId},</if>
+            <if test="dispatchOrderNo != null">dispatch_order_no = #{dispatchOrderNo},</if>
+            <if test="driverId != null">driver_id = #{driverId},</if>
+            <if test="driverMobile != null and driverMobile != ''">driver_mobile = #{driverMobile},</if>
+            <if test="driverName != null">driver_name = #{driverName},</if>
+            <if test="vehicleId != null">vehicle_id = #{vehicleId},</if>
+            <if test="vehicleLicensePlate != null">vehicle_license_plate = #{vehicleLicensePlate},</if>
+            <if test="vehicleCarKeyNo != null">vehicle_car_key_no = #{vehicleCarKeyNo},</if>
+            <if test="carKeyExpirationTime != null">car_key_expiration_time = #{carKeyExpirationTime},</if>
+            <if test="carKeyCollectionTime != null">car_key_collection_time = #{carKeyCollectionTime},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="status != null">status = #{status},</if>
+        </trim>
+        where id = #{id}
+    </update>
+    <!-- 淇敼 -->
+    <update id="updateTmsCarKeyDispatchBatch" parameterType="java.util.List">
+        <foreach collection="list" item="item" index="index" separator=";">
+            update tms_car_key_dispatch
+            <trim prefix="SET" suffixOverrides=",">
+                <if test="item.dispatchOrderId != null">dispatch_order_id = #{item.dispatchOrderId},</if>
+                <if test="item.dispatchOrderNo != null">dispatch_order_no = #{item.dispatchOrderNo},</if>
+                <if test="item.driverId != null">driver_id = #{item.driverId},</if>
+                <if test="item.driverMobile != null and item.driverMobile != ''">driver_mobile = #{item.driverMobile},</if>
+                <if test="item.driverName != null">driver_name = #{item.driverName},</if>
+                <if test="item.vehicleId != null">vehicle_id = #{item.vehicleId},</if>
+                <if test="item.vehicleLicensePlate != null">vehicle_license_plate = #{item.vehicleLicensePlate},</if>
+                <if test="item.vehicleCarKeyNo != null">vehicle_car_key_no = #{item.vehicleCarKeyNo},</if>
+                <if test="item.carKeyExpirationTime != null">car_key_expiration_time = #{item.carKeyExpirationTime},</if>
+                <if test="item.carKeyCollectionTime != null">car_key_collection_time = #{item.carKeyCollectionTime},</if>
+                <if test="item.createTime != null">create_time = #{item.createTime},</if>
+                <if test="item.updateTime != null">update_time = #{item.updateTime},</if>
+                <if test="item.status != null">status = #{item.status},</if>
+            </trim>
+        where id = #{item.id}
+        </foreach>
+    </update>
+
+    <!--鍒犻櫎-->
+    <delete id="deleteTmsCarKeyDispatchById" parameterType="Integer">
+        delete from tms_car_key_dispatch where id = #{id}
+    </delete>
+    <delete id="deleteTmsCarKeyDispatchByIds" parameterType="Integer">
+        delete from tms_car_key_dispatch where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+</mapper>
\ No newline at end of file

--
Gitblit v1.8.0