From 5d75fcaea0a3774052b7484a4ffe755258502363 Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期六, 06 十二月 2025 20:49:11 +0800
Subject: [PATCH] fix:开始执行人员就绪按钮

---
 app/utils/taskValidator.js |  226 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 226 insertions(+), 0 deletions(-)

diff --git a/app/utils/taskValidator.js b/app/utils/taskValidator.js
new file mode 100644
index 0000000..c52bc0c
--- /dev/null
+++ b/app/utils/taskValidator.js
@@ -0,0 +1,226 @@
+/**
+ * 浠诲姟鏍¢獙宸ュ叿绫�
+ * 鐢ㄤ簬缁熶竴绠$悊浠诲姟鐩稿叧鐨勫墠缃牎楠岄�昏緫
+ */
+
+import request from '@/utils/request'
+
+/**
+ * 鏍¢獙浠诲姟鏄惁鍙互鎵ц鎿嶄綔锛堝嚭鍙戙�佺粨绠楃瓑锛�
+ * @param {Object} task - 浠诲姟瀵硅薄
+ * @param {Object} options - 鏍¢獙閫夐」
+ * @param {Boolean} options.checkAssignees - 鏄惁妫�鏌ユ墽琛屼汉鍛橈紝榛樿true
+ * @param {Boolean} options.checkVehicles - 鏄惁妫�鏌ヨ溅杈嗭紝榛樿true
+ * @param {Boolean} options.checkPlannedTime - 鏄惁妫�鏌ラ绾︽椂闂达紝榛樿true
+ * @returns {Object} { valid: Boolean, message: String, field: String }
+ */
+export function validateTaskForAction(task, options = {}) {
+  const {
+    checkAssignees = true,
+    checkVehicles = true,
+    checkPlannedTime = true
+  } = options
+
+  // 1. 妫�鏌ユ墽琛屼汉鍛�
+  if (checkAssignees) {
+    const assigneeResult = validateAssignees(task)
+    if (!assigneeResult.valid) {
+      return assigneeResult
+    }
+  }
+
+  // 2. 妫�鏌ヨ溅杈�
+  if (checkVehicles) {
+    const vehicleResult = validateVehicles(task)
+    if (!vehicleResult.valid) {
+      return vehicleResult
+    }
+  }
+
+  // 3. 妫�鏌ラ绾︽椂闂�
+  if (checkPlannedTime) {
+    const timeResult = validatePlannedTime(task)
+    if (!timeResult.valid) {
+      return timeResult
+    }
+  }
+
+  return { valid: true, message: '', field: '' }
+}
+
+/**
+ * 妫�鏌ヤ换鍔℃槸鍚﹀凡鍒嗛厤鎵ц浜哄憳
+ * @param {Object} task - 浠诲姟瀵硅薄
+ * @returns {Object} { valid: Boolean, message: String, field: String }
+ */
+export function validateAssignees(task) {
+  if (!task.assignees || task.assignees.length === 0) {
+    return {
+      valid: false,
+      message: '浠诲姟鏈垎閰嶆墽琛屼汉鍛�',
+      field: 'assignees'
+    }
+  }
+  return { valid: true, message: '', field: '' }
+}
+
+/**
+ * 妫�鏌ヤ换鍔℃槸鍚﹀凡鍒嗛厤杞﹁締
+ * @param {Object} task - 浠诲姟瀵硅薄
+ * @returns {Object} { valid: Boolean, message: String, field: String }
+ */
+export function validateVehicles(task) {
+  // 鏀寔涓ょ瀛楁鍚嶏細vehicleList 鍜� assignedVehicles
+  const vehicles = task.vehicleList || task.assignedVehicles
+  
+  if (!vehicles || vehicles.length === 0) {
+    return {
+      valid: false,
+      message: '浠诲姟鏈垎閰嶈溅杈�',
+      field: 'vehicles'
+    }
+  }
+  return { valid: true, message: '', field: '' }
+}
+
+/**
+ * 妫�鏌ヤ换鍔¢绾︽椂闂存槸鍚︽湁鏁�
+ * @param {Object} task - 浠诲姟瀵硅薄
+ * @returns {Object} { valid: Boolean, message: String, field: String }
+ */
+export function validatePlannedTime(task) {
+  if (!task.plannedStartTime) {
+    return {
+      valid: false,
+      message: '浠诲姟鐨勮浆杩愭椂闂存湭璁剧疆',
+      field: 'plannedStartTime'
+    }
+  }
+
+  // 妫�鏌ユ槸鍚︿负鏃犳晥鏃堕棿锛�1900骞达級
+  if (task.plannedStartTime.startsWith('1900')) {
+    return {
+      valid: false,
+      message: '浠诲姟鐨勮浆杩愭椂闂存棤鏁�',
+      field: 'plannedStartTime'
+    }
+  }
+
+  return { valid: true, message: '', field: '' }
+}
+
+/**
+ * 鑾峰彇浠诲姟鐨勮溅杈咺D
+ * @param {Object} task - 浠诲姟瀵硅薄
+ * @returns {Number|null} 杞﹁締ID锛屾湭鎵惧埌杩斿洖null
+ */
+export function getTaskVehicleId(task) {
+  if (!task) {
+    return null
+  }
+
+  // 浠庤溅杈嗗垪琛ㄤ腑鑾峰彇绗竴涓溅杈嗙殑ID
+  const vehicles = task.assignedVehicles || task.vehicleList
+  if (vehicles && vehicles.length > 0) {
+    return vehicles[0].vehicleId
+  }
+
+  // 鎴栬�呬粠鍗曚釜杞﹁締瀵硅薄鑾峰彇
+  if (task.vehicleId) {
+    return task.vehicleId
+  }
+
+  return null
+}
+
+/**
+ * 鏍¢獙浠诲姟鏄惁鍙互鍑哄彂
+ * @param {Object} task - 浠诲姟瀵硅薄
+ * @returns {Object} { valid: Boolean, message: String, field: String }
+ */
+export function validateTaskForDepart(task) {
+  return validateTaskForAction(task, {
+    checkAssignees: true,
+    checkVehicles: true,
+    checkPlannedTime: true
+  })
+}
+
+/**
+ * 鏍¢獙浠诲姟鏄惁鍙互缁撶畻
+ * @param {Object} task - 浠诲姟瀵硅薄
+ * @returns {Object} { valid: Boolean, message: String, field: String }
+ */
+export function validateTaskForSettlement(task) {
+  return validateTaskForAction(task, {
+    checkAssignees: true,
+    checkVehicles: true,
+    checkPlannedTime: true
+  })
+}
+
+/**
+ * 妫�鏌ヤ换鍔℃槸鍚﹀彲浠ュ嚭鍙戯紙璋冪敤鍚庣鎺ュ彛锛�
+ * 妫�鏌ワ細
+ * 1. 鍩烘湰鏍¢獙锛氳溅杈嗐�佹墽琛屼汉鍛樸�侀绾︽椂闂�
+ * 2. 杞﹁締鍐茬獊妫�鏌ワ細鏄惁鏈夋湭瀹屾垚鐨勪换鍔�
+ * 3. 浜哄憳鍐茬獊妫�鏌ワ細鎵ц浜烘槸鍚︽湁鏈畬鎴愮殑浠诲姟
+ * 
+ * @param {Object} task - 浠诲姟瀵硅薄
+ * @returns {Promise<Object>} { valid: Boolean, message: String, conflicts: Array }
+ */
+export async function checkTaskCanDepart(task) {
+  // 1. 鍏堣繘琛屽熀鏈牎楠�
+  const basicValidation = validateTaskForDepart(task)
+  if (!basicValidation.valid) {
+    return {
+      ...basicValidation,
+      conflicts: [] // 纭繚杩斿洖鐨勫璞″寘鍚玞onflicts瀛楁
+    }
+  }
+  
+  // 2. 璋冪敤鍚庣鎺ュ彛妫�鏌ヨ溅杈嗗拰浜哄憳鍐茬獊
+  try {
+    const response = await request({
+      url: `/task/${task.taskId}/check-depart`,
+      method: 'get'
+    })
+    
+    console.log('鍚庣杩斿洖鐨勫師濮嬫暟鎹�:', response)
+    
+    if (response.code === 200 && response.data) {
+      const { valid, conflicts } = response.data
+      
+      console.log('valid:', valid)
+      console.log('conflicts:', conflicts)
+      
+      if (!valid && conflicts && conflicts.length > 0) {
+        // 鏈夊啿绐侊紝杩斿洖绗竴涓啿绐佷俊鎭�
+        return {
+          valid: false,
+          message: conflicts[0].message,
+          conflicts: conflicts
+        }
+      }
+      
+      return { valid: true, message: '', conflicts: [] }
+    }
+    
+    return { valid: false, message: '妫�鏌ュけ璐ワ紝璇烽噸璇�', conflicts: [] }
+  } catch (error) {
+    console.error('妫�鏌ヤ换鍔℃槸鍚﹀彲浠ュ嚭鍙戝け璐�:', error)
+    // 鎺ュ彛澶辫触鏃讹紝鍙繘琛屽熀鏈牎楠岋紝鍏佽鍑哄彂
+    return { valid: true, message: '', conflicts: [] }
+  }
+}
+
+export default {
+  validateTaskForAction,
+  validateAssignees,
+  validateVehicles,
+  validatePlannedTime,
+  getTaskVehicleId,
+  validateTaskForDepart,
+  validateTaskForSettlement,
+  checkTaskCanDepart
+}

--
Gitblit v1.9.1