wlzboy
4 天以前 cfe0b79fbea0fb1d7a5a796e71ada7d3b7812046
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
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: '' }
}
 
/**
 * 获取任务的车辆ID
 * @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: [] // 确保返回的对象包含conflicts字段
    }
  }
  
  // 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
}