From c5ac97682e3b4ca748541ace97cb37a2295bd81e Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期四, 19 三月 2026 22:46:29 +0800
Subject: [PATCH] feat: 增加GPS清理后台任务

---
 app/pages/task/index.vue |  142 +++++++++++++++++++++++++++++++++++------------
 1 files changed, 105 insertions(+), 37 deletions(-)

diff --git a/app/pages/task/index.vue b/app/pages/task/index.vue
index 3b0a399..244207b 100644
--- a/app/pages/task/index.vue
+++ b/app/pages/task/index.vue
@@ -158,7 +158,7 @@
                       ? 'status-cancelled'
                       : task.taskStatus === 'IN_PROGRESS'
                       ? 'status-in-progress'
-                      : 'status-default'
+                      : 'status-pending'
                   "
                 >
                   {{ getStatusText(task.taskStatus) }}
@@ -188,7 +188,7 @@
                 <view class="info-row">
                   <view class="info-item">
                     <view class="label">鎵ц浜哄憳:</view>
-                    <view class="value">{{ task.assignee }}</view>
+                    <view class="value">{{ getAssigneesDisplay(task) }}</view>
                   </view>
                 </view>
               </view>
@@ -197,7 +197,10 @@
             <!-- 鎿嶄綔鎸夐挳 -->
             <view class="task-actions">
               <!-- 寰呭鐞嗙姸鎬�: 鏄剧ず鍑哄彂銆佸彇娑� -->
-              <template v-if="task.taskStatus === 'PENDING'">
+              <template v-if="task.taskStatus === 'PENDING' 
+              || task.taskStatus === 'NOT_DEPARTED' 
+              || task.taskStatus === 'NOT_CONFIRMED' 
+              || task.taskStatus === 'PARTIALLY_CONFIRMED'">
                 <button
                   class="action-btn primary"
                   @click="handleTaskAction(task, 'depart')"
@@ -300,6 +303,35 @@
 import { mapState } from "vuex";
 import { formatDateTime } from "@/utils/common";
 import { checkTaskCanDepart } from "@/utils/taskValidator";
+import { getStatusText as getTaskStatusText, getTaskStatusOptions, getTaskTypeText as getTaskTypeTextUtil } from "@/utils/TaskUtil";
+
+// 浠诲姟绫诲瀷鏄犲皠锛堜复鏃跺畾涔夛紝閬垮厤瀵煎叆闂锛�
+const TASK_TYPE_MAP = {
+  MAINTENANCE: "缁翠慨淇濆吇",
+  FUEL: "鍔犳补",
+  OTHER: "鍏朵粬",
+  EMERGENCY_TRANSFER: "杞繍浠诲姟",
+  WELFARE: "绂忕杞�",
+  maintenance: "缁翠慨淇濆吇",
+  refuel: "鍔犳补",
+  inspection: "宸℃",
+  emergency: "杞繍浠诲姟",
+  welfare: "绂忕杞�"
+};
+
+// 浠诲姟鐘舵�佹槧灏勶紙涓存椂瀹氫箟锛岄伩鍏嶅鍏ラ棶棰橈級
+const TASK_STATUS_MAP = {
+  PENDING: "寰呭鐞�",
+  NOT_CONFIRMED: "瀹屽叏鏈‘璁�",
+  NOT_DEPARTED: "寰呭嚭鍙�",
+  PARTIALLY_CONFIRMED: "閮ㄥ垎纭",
+  DEPARTING: "鍑哄彂涓�",
+  ARRIVED: "宸插埌杈�",
+  RETURNING: "杩旂▼涓�",
+  COMPLETED: "宸插畬鎴�",
+  CANCELLED: "宸插彇娑�",
+  IN_PROGRESS: "浠诲姟涓�"
+};
 
 export default {
   components: {
@@ -315,8 +347,8 @@
         vehicle: "",
         taskNo: "",
       },
-      statusOptions: ["鍏ㄩ儴鐘舵��", "寰呭鐞�", "澶勭悊涓�", "宸插畬鎴�", "宸插彇娑�"],
-      statusValues: ["", "pending", "processing", "completed", "cancelled"],
+      statusOptions: ["鍏ㄩ儴鐘舵��", ...getTaskStatusOptions().map(opt => opt.label)],
+      statusValues: ["", ...getTaskStatusOptions().map(opt => opt.value)],
       selectedStatus: "",
       selectedStatusText: "",
       startDate: "",
@@ -415,6 +447,9 @@
         queryParams.taskStatus = "PENDING";
       } else if (this.currentFilter === "processing") {
         queryParams.taskStatusList = [
+          "NOT_CONFIRMED",
+          "NOT_DEPARTED",
+          "PARTIALLY_CONFIRMED",
           "DEPARTING",
           "ARRIVED",
           "RETURNING",
@@ -429,6 +464,9 @@
           const statusMap = {
             pending: "PENDING",
             processing: [
+              "NOT_CONFIRMED",
+              "NOT_DEPARTED",
+              "PARTIALLY_CONFIRMED",
               "DEPARTING",
               "ARRIVED",
               "RETURNING",
@@ -533,6 +571,9 @@
         queryParams.taskStatus = "PENDING";
       } else if (this.currentFilter === "processing") {
         queryParams.taskStatusList = [
+          "NOT_CONFIRMED",
+          "NOT_DEPARTED",
+          "PARTIALLY_CONFIRMED",
           "DEPARTING",
           "ARRIVED",
           "RETURNING",
@@ -663,13 +704,36 @@
         // 浼樺厛鏄剧ず杞叆鍖婚櫌鍚嶇О
         if (task.emergencyInfo.hospitalInName) {
           if(task.emergencyInfo.hospitalInName.includes("瀹朵腑")){
-            return task.emergencyInfo.destinationAddress;
+            return task.emergencyInfo.hospitalInAddress;
           }
           return task.emergencyInfo.hospitalInName;
-        }       
+        }
+        // 濡傛灉娌℃湁杞叆鍖婚櫌鍚嶇О锛屼絾鏈夎浆鍏ュ尰闄㈠湴鍧�锛屽垯鏄剧ず鍦板潃
+        if (task.emergencyInfo.hospitalInAddress) {
+          return task.emergencyInfo.hospitalInAddress;
+        }
       }
       // 鍏朵粬鎯呭喌浣跨敤鍘熸潵鐨別ndLocation
       return this.formatAddress(task.endLocation || "鏈缃�");
+    },
+    
+    // 鑾峰彇鎵ц浜哄憳鏄剧ず锛堜粠 assignees 鏁扮粍涓彁鍙� userName锛�
+    getAssigneesDisplay(task) {
+      // 濡傛灉鏈� assignees 鏁扮粍涓斾笉涓虹┖
+      if (task.assignees && task.assignees.length > 0) {
+        // 鎻愬彇鎵�鏈� userName锛岃繃婊ゆ帀绌哄��
+        const userNames = task.assignees
+          .map(assignee => assignee.userName)
+          .filter(name => name); // 杩囨护鎺� null/undefined/绌哄瓧绗︿覆
+        
+        // 濡傛灉鏈夋湁鏁堢殑鐢ㄦ埛鍚嶏紝鐢ㄩ�楀彿杩炴帴
+        if (userNames.length > 0) {
+          return userNames.join('銆�');
+        }
+      }
+      
+      // 濡傛灉娌℃湁 assignees 鏁扮粍锛屼娇鐢ㄦ棫鐨� assigneeName 鎴� assignee 瀛楁
+      return task.assigneeName || task.assignee || '鏈垎閰�';
     },
 
     // 鍒囨崲鏌ヨ鐣岄潰鏄剧ず/闅愯棌
@@ -940,12 +1004,19 @@
           title: '妫�鏌ラ檮浠�...'
         });
         
-        const response = await checkTaskConsentAttachment(taskId);
+        // 娉ㄦ剰锛氳繖閲屼細琚姹傛嫤鎴櫒澶勭悊锛宑ode !== 200 鏃朵細 reject
+        const response = await checkTaskConsentAttachment(taskId).catch(err => {
+          // 鎷︽埅鍣� reject 鐨勬儏鍐碉紝杩斿洖涓�涓粯璁ゅ璞�
+          console.log('璇锋眰琚嫤鎴櫒 reject锛宔rr:', err);
+          return { code: -1, msg: '鏈笂浼犵煡鎯呭悓鎰忎功' };
+        });
         
         uni.hideLoading();
+        console.log('妫�鏌ラ檮浠剁粨鏋�:', response);
         
-        if (response.code === 200) {
+        if (response && response.code === 200) {
           // 宸蹭笂浼犵煡鎯呭悓鎰忎功锛岀户缁洿鏂扮姸鎬�
+          console.log('宸蹭笂浼犵煡鎯呭悓鎰忎功锛岀户缁畬鎴愪换鍔�');
           this.$modal
             .confirm("纭浠诲姟宸插畬鎴愶紵")
             .then(() => {
@@ -953,8 +1024,11 @@
             })
             .catch(() => {});
         } else {
-          // 鏈笂浼犵煡鎯呭悓鎰忎功锛屾樉绀烘彁绀�
-          this.$modal.confirm('浠诲姟鏈笂浼犵煡鎯呭悓鎰忎功锛屾棤娉曞畬鎴愪换鍔°�傛槸鍚︾幇鍦ㄥ幓涓婁紶锛�').then(() => {
+          // 鏈笂浼犵煡鎯呭悓鎰忎功鎴栧叾浠栭敊璇紝闃绘瀹屾垚
+          const message = (response && response.msg) || '浠诲姟鏈笂浼犵煡鎯呭悓鎰忎功锛屾棤娉曞畬鎴愪换鍔�';
+          console.log('鏈笂浼犵煡鎯呭悓鎰忎功锛岄樆姝㈠畬鎴�');
+          
+          this.$modal.confirm(message + '銆傛槸鍚︾幇鍦ㄥ幓涓婁紶锛�').then(() => {
             // 璺宠浆鍒颁换鍔¤鎯呴〉涓婁紶闄勪欢
             uni.navigateTo({
               url: `/pagesTask/detail?id=${taskId}`
@@ -963,12 +1037,10 @@
         }
       } catch (error) {
         uni.hideLoading();
-        console.error('妫�鏌ラ檮浠跺け璐�:', error);
+        console.error('妫�鏌ラ檮浠跺紓甯�:', error);
         
-        // 濡傛灉妫�鏌ュけ璐ワ紝璇㈤棶鐢ㄦ埛鏄惁缁х画
-        this.$modal.confirm('妫�鏌ラ檮浠剁姸鎬佸け璐ワ紝鏄惁缁х画瀹屾垚浠诲姟锛�').then(() => {
-          this.updateTaskStatus(taskId, status, remark);
-        }).catch(() => {});
+        // 濡傛灉妫�鏌ュけ璐ワ紙缃戠粶寮傚父绛夛級锛屼笉鍏佽瀹屾垚浠诲姟
+        this.$modal.showToast('妫�鏌ラ檮浠剁姸鎬佸け璐ワ紝鏃犳硶瀹屾垚浠诲姟');
       }
     },
 
@@ -1049,19 +1121,9 @@
       });
     },
 
-    getStatusText(status) {
-      const statusMap = {
-        PENDING: "寰呭鐞�",
-        DEPARTING: "鍑哄彂涓�",
-        ARRIVED: "宸插埌杈�",
-        RETURNING: "杩旂▼涓�",
-        COMPLETED: "宸插畬鎴�",
-        CANCELLED: "宸插彇娑�",
-        IN_PROGRESS: "澶勭悊涓�", // 鍏煎鏃ф暟鎹�
-      };
-      return statusMap[status] || "鏈煡";
-    },
-
+    // 浣跨敤 TaskUtil 涓殑 getStatusText 鏂规硶
+    // getStatusText 宸插湪 utils/TaskUtil.js 涓畾涔�
+    
     // 鑾峰彇鐘舵�佹牱寮忕被
     getStatusClass(status) {
       const statusClassMap = {
@@ -1075,16 +1137,18 @@
       };
       return statusClassMap[status] || "status-default";
     },
+    
+    // 浣跨敤 TaskUtil 涓殑 getTaskTypeText 鏂规硶
+    // getTaskTypeText 宸插湪 utils/TaskUtil.js 涓畾涔�
 
+    // 鑾峰彇浠诲姟绫诲瀷鏂囨湰
     getTaskTypeText(type) {
-      const typeMap = {
-        MAINTENANCE: "缁翠慨淇濆吇",
-        FUEL: "鍔犳补",
-        OTHER: "鍏朵粬",
-        EMERGENCY_TRANSFER: "杞繍浠诲姟",
-        WELFARE: "绂忕杞�",
-      };
-      return typeMap[type] || "鏈煡绫诲瀷";
+      return TASK_TYPE_MAP[type] || "鏈煡绫诲瀷";
+    },
+
+    // 鑾峰彇浠诲姟鐘舵�佹枃鏈�
+    getStatusText(status) {
+      return TASK_STATUS_MAP[status] || "鏈煡";
     },
   },
 };
@@ -1426,6 +1490,10 @@
               font-size: 26rpx;
               flex: 1;
               word-break: break-all;
+              overflow-wrap: break-word;
+              line-height: 1.5;
+              max-height: none;
+              overflow: visible;
             }
           }
         }

--
Gitblit v1.9.1