From 310633feef20e9b77d44fd25e0b41778e033b33b Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期二, 11 十一月 2025 21:48:46 +0800
Subject: [PATCH] feat: 车辆GPS统计,并修改了一些变更任务状态的逻辑

---
 sql/车辆里程统计实现总结.md                                                                            |    0 
 app/api/task.js                                                                              |    8 ++
 sql/vehicle_mileage_stats_job.sql                                                            |    0 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/SysTaskController.java               |   10 +++
 ruoyi-system/src/main/resources/mapper/system/VehicleMileageStatsMapper.xml                  |    0 
 sql/vehicle_mileage_stats.sql                                                                |    0 
 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/VehicleMileageStatsTask.java                |    0 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/VehicleMileageStatsServiceImpl.java |    0 
 ruoyi-system/src/main/java/com/ruoyi/system/service/IVehicleMileageStatsService.java         |    0 
 sql/车辆里程统计使用说明.md                                                                            |    0 
 app/pages/task/create-emergency.vue                                                          |    1 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java             |   12 ++++
 sql/vehicle_mileage_stats_menu.sql                                                           |    0 
 app/api/mileageStats.js                                                                      |    0 
 ruoyi-system/src/main/resources/mapper/system/SysTaskMapper.xml                              |   13 ++++
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTaskMapper.java                        |    9 +++
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/VehicleMileageStatsMapper.java            |    0 
 ruoyi-common/src/main/java/com/ruoyi/common/config/TiandituMapConfig.java                    |    0 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/TaskTimeInterval.java                     |    0 
 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysTaskService.java                     |    9 +++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleMileageStatsController.java |    0 
 app/pages/task/detail.vue                                                                    |   83 ++++++++++++++++++++++++++-
 ruoyi-system/src/main/java/com/ruoyi/system/domain/VehicleMileageStats.java                  |    0 
 23 files changed, 141 insertions(+), 4 deletions(-)

diff --git a/app/api/mileageStats.js b/app/api/mileageStats.js
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app/api/mileageStats.js
diff --git a/app/api/task.js b/app/api/task.js
index f43e912..3121d97 100644
--- a/app/api/task.js
+++ b/app/api/task.js
@@ -141,3 +141,11 @@
     method: 'get'
   })
 }
+
+// 妫�鏌ヨ溅杈嗘槸鍚︽湁姝e湪杩涜涓殑浠诲姟
+export function checkVehicleActiveTasks(vehicleId) {
+  return request({
+    url: '/task/vehicle/' + vehicleId + '/active',
+    method: 'get'
+  })
+}
diff --git a/app/pages/task/create-emergency.vue b/app/pages/task/create-emergency.vue
index a5876c9..8154fcb 100644
--- a/app/pages/task/create-emergency.vue
+++ b/app/pages/task/create-emergency.vue
@@ -511,6 +511,7 @@
 import { listBranchUsers } from "@/api/system/user"
 import { searchIcd10 } from "@/api/icd10"
 import { calculateTransferPrice } from "@/api/price"
+import { checkVehicleActiveTasks } from "@/api/task"
 
 import { getDicts } from "@/api/dict"
 import { getServiceOrdAreaTypes, getServiceOrderTypes, getHospitalDepartments } from "@/api/dictionary"
diff --git a/app/pages/task/detail.vue b/app/pages/task/detail.vue
index fa10be3..e28d9e9 100644
--- a/app/pages/task/detail.vue
+++ b/app/pages/task/detail.vue
@@ -328,6 +328,7 @@
 
 <script>
   import { getTask, changeTaskStatus } from '@/api/task'
+  import { checkVehicleActiveTasks } from '@/api/task'
   import { formatDateTime } from '@/utils/common'
   import AttachmentUpload from '@/components/AttachmentUpload.vue'
   
@@ -504,10 +505,8 @@
       handleTaskAction(action) {
         switch (action) {
           case 'depart':
-            // 鍑哄彂 -> 鐘舵�佸彉涓哄嚭鍙戜腑
-            this.$modal.confirm('纭畾瑕佸嚭鍙戝悧锛�').then(() => {
-              this.updateTaskStatus('DEPARTING', '浠诲姟宸插嚭鍙�')
-            }).catch(() => {});
+            // 鍑哄彂 -> 妫�鏌ヨ溅杈嗘槸鍚︽湁鍏朵粬姝e湪杩涜涓殑浠诲姟
+            this.checkVehicleAndDepart();
             break;
             
           case 'cancel':
@@ -547,6 +546,82 @@
         }
       },
       
+      // 妫�鏌ヨ溅杈嗙姸鎬佸苟鍑哄彂
+      checkVehicleAndDepart() {
+        // 鑾峰彇浠诲姟杞﹁締ID
+        const vehicleId = this.getVehicleId();
+        if (!vehicleId) {
+          this.$modal.showToast('鏈壘鍒颁换鍔¤溅杈嗕俊鎭�');
+          return;
+        }
+        
+        // 鏄剧ず鍔犺浇鎻愮ず
+        uni.showLoading({
+          title: '妫�鏌ヨ溅杈嗙姸鎬�...'
+        });
+        
+        checkVehicleActiveTasks(vehicleId).then(response => {
+          uni.hideLoading();
+          
+          const activeTasks = response.data || [];
+          
+          // 杩囨护鎺夊綋鍓嶄换鍔℃湰韬�
+          const otherActiveTasks = activeTasks.filter(task => task.taskId !== this.taskId);
+          
+          if (otherActiveTasks.length > 0) {
+            // 杞﹁締鏈夊叾浠栨鍦ㄨ繘琛屼腑鐨勪换鍔�
+            const task = otherActiveTasks[0];
+            const taskStatus = this.getStatusText(task.taskStatus);
+            const message = `璇ヨ溅杈嗗凡鏈夋鍦ㄨ浆杩愪腑鐨勪换鍔★紒
+
+浠诲姟鍗曞彿锛�${task.taskCode}
+浠诲姟鐘舵�侊細${taskStatus}
+
+璇峰厛瀹屾垚褰撳墠浠诲姟鍚庡啀鍑哄彂鏂颁换鍔°�俙;
+            
+            uni.showModal({
+              title: '鎻愮ず',
+              content: message,
+              showCancel: false,
+              confirmText: '鎴戠煡閬撲簡'
+            });
+            return;
+          }
+          
+          // 杞﹁締娌℃湁鍏朵粬姝e湪杩涜涓殑浠诲姟锛屽彲浠ュ嚭鍙�
+          this.$modal.confirm('纭畾瑕佸嚭鍙戝悧锛�').then(() => {
+            this.updateTaskStatus('DEPARTING', '浠诲姟宸插嚭鍙�')
+          }).catch(() => {});
+          
+        }).catch(error => {
+          uni.hideLoading();
+          console.error('妫�鏌ヨ溅杈嗙姸鎬佸け璐�:', error);
+          // 妫�鏌ュけ璐ユ椂锛屼粛鐒跺厑璁稿嚭鍙�
+          this.$modal.confirm('妫�鏌ヨ溅杈嗙姸鎬佸け璐ワ紝鏄惁缁х画鍑哄彂锛�').then(() => {
+            this.updateTaskStatus('DEPARTING', '浠诲姟宸插嚭鍙�')
+          }).catch(() => {});
+        });
+      },
+      
+      // 鑾峰彇浠诲姟杞﹁締ID
+      getVehicleId() {
+        if (!this.taskDetail) {
+          return null;
+        }
+        
+        // 浠庤溅杈嗗垪琛ㄤ腑鑾峰彇绗竴涓溅杈嗙殑ID
+        if (this.taskDetail.vehicleList && this.taskDetail.vehicleList.length > 0) {
+          return this.taskDetail.vehicleList[0].vehicleId;
+        }
+        
+        // 鎴栬�呬粠鍗曚釜杞﹁締瀵硅薄鑾峰彇
+        if (this.taskDetail.vehicleId) {
+          return this.taskDetail.vehicleId;
+        }
+        
+        return null;
+      },
+      
       // 鏇存柊浠诲姟鐘舵��
       updateTaskStatus(status, remark) {
         // 鑾峰彇GPS浣嶇疆淇℃伅
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleMileageStatsController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleMileageStatsController.java
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleMileageStatsController.java
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/SysTaskController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/SysTaskController.java
index e9b439b..e1d9527 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/SysTaskController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/SysTaskController.java
@@ -280,6 +280,16 @@
     }
 
     /**
+     * 妫�鏌ヨ溅杈嗘槸鍚︽湁姝e湪杩涜涓殑浠诲姟锛圓PP绔級
+     * 姝e湪杩涜涓殑浠诲姟鏄寚鐘舵�佷笉涓猴細PENDING锛堝緟澶勭悊锛夈�丆OMPLETED锛堝凡瀹屾垚锛夈�丆ANCELLED锛堝凡鍙栨秷锛夌殑浠诲姟
+     */
+    @GetMapping("/vehicle/{vehicleId}/active")
+    public AjaxResult checkVehicleActiveTasks(@PathVariable Long vehicleId) {
+        List<SysTask> activeTasks = sysTaskService.checkVehicleActiveTasks(vehicleId);
+        return success(activeTasks);
+    }
+
+    /**
      * 鍒嗛厤浠诲姟璇锋眰瀵硅薄
      */
     public static class AssignTaskRequest {
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/config/TiandituMapConfig.java b/ruoyi-common/src/main/java/com/ruoyi/common/config/TiandituMapConfig.java
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/config/TiandituMapConfig.java
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/VehicleMileageStatsTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/VehicleMileageStatsTask.java
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/VehicleMileageStatsTask.java
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/TaskTimeInterval.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/TaskTimeInterval.java
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/TaskTimeInterval.java
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/VehicleMileageStats.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/VehicleMileageStats.java
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/VehicleMileageStats.java
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTaskMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTaskMapper.java
index 4c703c0..a356c6a 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTaskMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTaskMapper.java
@@ -114,4 +114,13 @@
      * @return 缁撴灉
      */
     public int assignTask(SysTask sysTask);
+
+    /**
+     * 鏌ヨ杞﹁締姝e湪杩涜涓殑浠诲姟
+     * 姝e湪杩涜涓殑浠诲姟鏄寚鐘舵�佷笉涓猴細PENDING锛堝緟澶勭悊锛夈�丆OMPLETED锛堝凡瀹屾垚锛夈�丆ANCELLED锛堝凡鍙栨秷锛夌殑浠诲姟
+     * 
+     * @param vehicleId 杞﹁締ID
+     * @return 姝e湪杩涜涓殑浠诲姟鍒楄〃
+     */
+    public List<SysTask> selectActiveTasksByVehicleId(Long vehicleId);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/VehicleMileageStatsMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/VehicleMileageStatsMapper.java
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/VehicleMileageStatsMapper.java
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysTaskService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysTaskService.java
index 7de29d3..a5cdf19 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysTaskService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysTaskService.java
@@ -205,4 +205,13 @@
      * @return 浠诲姟璇︽儏
      */
     public SysTask getTaskDetail(Long taskId);
+
+    /**
+     * 妫�鏌ヨ溅杈嗘槸鍚︽湁姝e湪杩涜涓殑浠诲姟
+     * 姝e湪杩涜涓殑浠诲姟鏄寚鐘舵�佷笉涓猴細PENDING锛堝緟澶勭悊锛夈�丆OMPLETED锛堝凡瀹屾垚锛夈�丆ANCELLED锛堝凡鍙栨秷锛夌殑浠诲姟
+     * 
+     * @param vehicleId 杞﹁締ID
+     * @return 姝e湪杩涜涓殑浠诲姟鍒楄〃
+     */
+    public List<SysTask> checkVehicleActiveTasks(Long vehicleId);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/IVehicleMileageStatsService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/IVehicleMileageStatsService.java
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/IVehicleMileageStatsService.java
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java
index 508eb71..796b509 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java
@@ -961,6 +961,18 @@
         return task;
     }
 
+    /**
+     * 妫�鏌ヨ溅杈嗘槸鍚︽湁姝e湪杩涜涓殑浠诲姟
+     * 姝e湪杩涜涓殑浠诲姟鏄寚鐘舵�佷笉涓猴細PENDING锛堝緟澶勭悊锛夈�丆OMPLETED锛堝凡瀹屾垚锛夈�丆ANCELLED锛堝凡鍙栨秷锛夌殑浠诲姟
+     * 
+     * @param vehicleId 杞﹁締ID
+     * @return 姝e湪杩涜涓殑浠诲姟鍒楄〃
+     */
+    @Override
+    public List<SysTask> checkVehicleActiveTasks(Long vehicleId) {
+        return sysTaskMapper.selectActiveTasksByVehicleId(vehicleId);
+    }
+
     @Autowired
     private TaskCodeGenerator taskCodeGenerator;
     
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/VehicleMileageStatsServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/VehicleMileageStatsServiceImpl.java
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/VehicleMileageStatsServiceImpl.java
diff --git a/ruoyi-system/src/main/resources/mapper/system/SysTaskMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysTaskMapper.xml
index 9a21d7b..338d8e2 100644
--- a/ruoyi-system/src/main/resources/mapper/system/SysTaskMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/SysTaskMapper.xml
@@ -268,6 +268,19 @@
         where task_id = #{taskId}
     </update>
 
+    <select id="selectActiveTasksByVehicleId" parameterType="Long" resultMap="SysTaskResult">
+        select t.task_id, t.task_code, t.task_type, t.task_status, t.task_description,
+               t.departure_address, t.destination_address,
+               t.planned_start_time, t.actual_start_time,
+               t.create_time, t.update_time
+        from sys_task t
+        inner join sys_task_vehicle tv on t.task_id = tv.task_id
+        where tv.vehicle_id = #{vehicleId}
+          and t.del_flag = '0'
+          and t.task_status not in ('PENDING', 'COMPLETED', 'CANCELLED')
+        order by t.create_time desc
+    </select>
+
     <delete id="deleteSysTaskByTaskId" parameterType="Long">
         update sys_task set del_flag = '2', update_time = now() where task_id = #{taskId}
     </delete>
diff --git a/ruoyi-system/src/main/resources/mapper/system/VehicleMileageStatsMapper.xml b/ruoyi-system/src/main/resources/mapper/system/VehicleMileageStatsMapper.xml
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/ruoyi-system/src/main/resources/mapper/system/VehicleMileageStatsMapper.xml
diff --git a/sql/vehicle_mileage_stats.sql b/sql/vehicle_mileage_stats.sql
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/sql/vehicle_mileage_stats.sql
diff --git a/sql/vehicle_mileage_stats_job.sql b/sql/vehicle_mileage_stats_job.sql
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/sql/vehicle_mileage_stats_job.sql
diff --git a/sql/vehicle_mileage_stats_menu.sql b/sql/vehicle_mileage_stats_menu.sql
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/sql/vehicle_mileage_stats_menu.sql
diff --git "a/sql/\350\275\246\350\276\206\351\207\214\347\250\213\347\273\237\350\256\241\344\275\277\347\224\250\350\257\264\346\230\216.md" "b/sql/\350\275\246\350\276\206\351\207\214\347\250\213\347\273\237\350\256\241\344\275\277\347\224\250\350\257\264\346\230\216.md"
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ "b/sql/\350\275\246\350\276\206\351\207\214\347\250\213\347\273\237\350\256\241\344\275\277\347\224\250\350\257\264\346\230\216.md"
diff --git "a/sql/\350\275\246\350\276\206\351\207\214\347\250\213\347\273\237\350\256\241\345\256\236\347\216\260\346\200\273\347\273\223.md" "b/sql/\350\275\246\350\276\206\351\207\214\347\250\213\347\273\237\350\256\241\345\256\236\347\216\260\346\200\273\347\273\223.md"
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ "b/sql/\350\275\246\350\276\206\351\207\214\347\250\213\347\273\237\350\256\241\345\256\236\347\216\260\346\200\273\347\273\223.md"

--
Gitblit v1.9.1