d433e7f6
刘淇
工单
|
1
|
<template>
|
c7df828a
刘淇
快速工单 样式优化
|
2
|
<view class="page-container">
|
5822009a
刘淇
工单管理--新增工单
|
3
4
5
6
7
|
<view class="work-order-form-content commonPageLRpadding">
<up-form
label-position="left"
:model="workOrderForm"
ref="workOrderFormRef"
|
ff65dc6c
刘淇
快速工单 样式优化
|
8
|
labelWidth="190rpx"
|
5822009a
刘淇
工单管理--新增工单
|
9
|
>
|
fa775c6b
刘淇
养护计划调整
|
10
|
<!-- 1. 工单位置(地图选择) -->
|
5822009a
刘淇
工单管理--新增工单
|
11
|
<up-form-item
|
fa775c6b
刘淇
养护计划调整
|
12
13
|
label="工单位置"
prop="workLocation"
|
5822009a
刘淇
工单管理--新增工单
|
14
|
border-bottom
|
fa775c6b
刘淇
养护计划调整
|
15
16
|
required
@click="chooseWorkLocation(); hideKeyboard()"
|
d433e7f6
刘淇
工单
|
17
|
>
|
5822009a
刘淇
工单管理--新增工单
|
18
|
<up-input
|
fa775c6b
刘淇
养护计划调整
|
19
|
v-model="workOrderForm.workLocation"
|
5822009a
刘淇
工单管理--新增工单
|
20
21
|
border="none"
readonly
|
fa775c6b
刘淇
养护计划调整
|
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
|
suffix-icon="map-fill"
placeholder="点击选择工单位置"
></up-input>
</up-form-item>
<!-- 2. 道路名称(下拉框) -->
<up-form-item
label="道路名称"
prop="roadName"
border-bottom
required
@click="handleActionSheetOpen('roadName'); hideKeyboard()"
>
<up-input
v-model="workOrderForm.roadName"
readonly
disabled-color="#ffffff"
placeholder="请先选择工单位置"
border="none"
></up-input>
<template #right>
<up-icon name="arrow-right" size="16" ></up-icon>
</template>
</up-form-item>
<!-- 3. 工单名称(下拉框) -->
<up-form-item
label="工单名称"
prop="orderName"
border-bottom
required
@click="handleActionSheetOpen('orderName'); hideKeyboard()"
>
<up-input
v-model="workOrderForm.orderName"
disabled
disabled-color="#ffffff"
placeholder="请选择工单名称"
border="none"
|
5822009a
刘淇
工单管理--新增工单
|
62
|
></up-input>
|
fa775c6b
刘淇
养护计划调整
|
63
64
65
|
<template #right>
<up-icon name="arrow-right" size="16"></up-icon>
</template>
|
5822009a
刘淇
工单管理--新增工单
|
66
67
|
</up-form-item>
|
fa775c6b
刘淇
养护计划调整
|
68
|
<!-- 新增:紧急程度选择 -->
|
5822009a
刘淇
工单管理--新增工单
|
69
|
<up-form-item
|
fa775c6b
刘淇
养护计划调整
|
70
71
|
label="紧急程度"
prop="pressingTypeName"
|
5822009a
刘淇
工单管理--新增工单
|
72
73
|
border-bottom
required
|
fa775c6b
刘淇
养护计划调整
|
74
|
@click="handleActionSheetOpen('pressingType'); hideKeyboard()"
|
5822009a
刘淇
工单管理--新增工单
|
75
76
|
>
<up-input
|
fa775c6b
刘淇
养护计划调整
|
77
|
v-model="workOrderForm.pressingTypeName"
|
5822009a
刘淇
工单管理--新增工单
|
78
79
|
disabled
disabled-color="#ffffff"
|
fa775c6b
刘淇
养护计划调整
|
80
|
placeholder="请选择紧急程度"
|
5822009a
刘淇
工单管理--新增工单
|
81
82
83
84
85
86
|
border="none"
></up-input>
<template #right>
<up-icon name="arrow-right" size="16"></up-icon>
</template>
</up-form-item>
|
d433e7f6
刘淇
工单
|
87
|
|
fa775c6b
刘淇
养护计划调整
|
88
|
<!-- 4. 情况描述(文本域) -->
|
5822009a
刘淇
工单管理--新增工单
|
89
|
<up-form-item
|
fa775c6b
刘淇
养护计划调整
|
90
91
92
|
label="情况描述"
prop="problemDesc"
required
|
5822009a
刘淇
工单管理--新增工单
|
93
94
|
>
<up-textarea
|
fa775c6b
刘淇
养护计划调整
|
95
96
|
placeholder="请输入情况描述(最多200字)"
v-model.trim="workOrderForm.problemDesc"
|
5822009a
刘淇
工单管理--新增工单
|
97
98
99
|
count
maxlength="200"
rows="4"
|
fa775c6b
刘淇
养护计划调整
|
100
|
@blur="() => workOrderFormRef.validateField('problemDesc')"
|
5822009a
刘淇
工单管理--新增工单
|
101
102
|
></up-textarea>
</up-form-item>
|
fa775c6b
刘淇
养护计划调整
|
103
104
105
106
107
108
109
110
|
<!-- 问题照片(核心修复:绑定纯数组) -->
<up-form-item label="问题照片" prop="problemImgs" required>
<up-upload
:file-list="problemImgs.imgList"
@after-read="problemImgs.uploadImgs"
@delete="problemImgs.deleteImg"
multiple
|
5059c4dd
刘淇
养护员提交养护工单
|
111
112
|
:width="70"
:height="70"
|
fa775c6b
刘淇
养护计划调整
|
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
:max-count="problemImgs.uploadConfig.maxCount"
:upload-text="problemImgs.uploadConfig.uploadText"
:size-type="problemImgs.uploadConfig.sizeType"
></up-upload>
</up-form-item>
<!-- 完成时间 -->
<up-form-item
label="希望完成时间"
prop="finishDate"
@click="show=true;hideKeyboard()"
>
<up-input
v-model="workOrderForm.finishDate"
border="none"
readonly
placeholder="点击选择时间"
></up-input>
<template #right>
<up-icon name="arrow-right" size="16"></up-icon>
</template>
</up-form-item>
|
5822009a
刘淇
工单管理--新增工单
|
135
136
|
</up-form>
</view>
|
d433e7f6
刘淇
工单
|
137
|
|
5822009a
刘淇
工单管理--新增工单
|
138
139
140
141
|
<!-- 底部提交按钮 -->
<view class="fixed-bottom-btn-wrap">
<up-button
type="primary"
|
fa775c6b
刘淇
养护计划调整
|
142
|
text="提交工单"
|
5822009a
刘淇
工单管理--新增工单
|
143
144
145
|
@click="submitWorkOrder"
></up-button>
</view>
|
d433e7f6
刘淇
工单
|
146
|
|
fa775c6b
刘淇
养护计划调整
|
147
|
<!-- 合并后的通用下拉弹窗 -->
|
5822009a
刘淇
工单管理--新增工单
|
148
|
<up-action-sheet
|
8d0834be
刘淇
工单管理--新增工单 优化
|
149
150
151
152
153
|
:show="showActionSheet"
:actions="currentActionSheetData.list"
:title="currentActionSheetData.title"
@close="handleActionSheetClose"
@select="handleActionSheetSelect"
|
5822009a
刘淇
工单管理--新增工单
|
154
|
></up-action-sheet>
|
fa775c6b
刘淇
养护计划调整
|
155
156
157
158
159
160
161
162
163
164
|
<!-- 完成时间选择器 -->
<up-datetime-picker
:show="show"
v-model="finishDate"
mode="datetime"
:min-date="new Date()"
@cancel="show = false"
@confirm="finishDateConfirm"
></up-datetime-picker>
|
5822009a
刘淇
工单管理--新增工单
|
165
166
|
</view>
</template>
|
d433e7f6
刘淇
工单
|
167
|
|
c7df828a
刘淇
快速工单 样式优化
|
168
|
<script setup>
|
fa775c6b
刘淇
养护计划调整
|
169
170
171
172
|
import { ref, reactive, watch } from 'vue'
import { onReady, onShow } from '@dcloudio/uni-app';
import { useUploadImgs } from '@/common/utils/useUploadImgs' // 引入改造后的上传逻辑
import { getRoadListByLatLng } from '@/api/common'
|
5059c4dd
刘淇
养护员提交养护工单
|
173
|
import { universalApproval } from '@/api/work-order-manage/work-order-manage'
|
fa775c6b
刘淇
养护计划调整
|
174
|
import { timeFormat } from '@/uni_modules/uview-plus'
|
5059c4dd
刘淇
养护员提交养护工单
|
175
|
import { nextStepMap } from '@/common/utils/common'
|
c7df828a
刘淇
快速工单 样式优化
|
176
177
|
// ========== 表单Ref ==========
const workOrderFormRef = ref(null)
|
fa775c6b
刘淇
养护计划调整
|
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
|
// ========== 公共上传逻辑复用 ==========
const problemImgs = useUploadImgs({
maxCount: 3,
uploadText: '选择问题照片',
sizeType: ['compressed'],
formRef: workOrderFormRef,
fieldName: 'problemImgs'
})
// 核心修复:监听响应式数组变化,同步更新纯数组(解决u-upload不刷新问题)
watch(() => problemImgs.rawImgList.value, (newVal) => {
problemImgs.imgList = newVal
}, { deep: true })
|
c7df828a
刘淇
快速工单 样式优化
|
193
|
// ========== 页面状态 ==========
|
fa775c6b
刘淇
养护计划调整
|
194
|
// 通用弹窗控制
|
c7df828a
刘淇
快速工单 样式优化
|
195
|
const showActionSheet = ref(false)
|
fa775c6b
刘淇
养护计划调整
|
196
|
// 当前弹窗配置
|
c7df828a
刘淇
快速工单 样式优化
|
197
198
199
200
201
|
const currentActionSheetData = reactive({
type: '',
list: [],
title: ''
})
|
fa775c6b
刘淇
养护计划调整
|
202
203
204
205
|
// 完成时间选择器控制
const show = ref(false)
const finishDate = ref(Date.now())
|
c7df828a
刘淇
快速工单 样式优化
|
206
|
// ========== 下拉列表数据 ==========
|
fa775c6b
刘淇
养护计划调整
|
207
208
209
210
211
|
const roadNameList = ref([])
const orderNameList = ref([])
const pressingTypeList = ref([])
// ========== 工单表单数据 ==========
|
c7df828a
刘淇
快速工单 样式优化
|
212
|
const workOrderForm = reactive({
|
fa775c6b
刘淇
养护计划调整
|
213
214
215
216
217
218
219
220
221
222
|
roadId: 0, // 道路ID
roadName: '', // 道路名称
workLocation: '', // 工单位置
orderName: '', // 工单名称
pressingType: '', // 紧急程度值(提交接口用)
pressingTypeName: '', // 紧急程度名称(显示用)
problemDesc: '', // 情况描述
lat: 0, // 纬度
lon: 0, // 经度
finishDate: '', // 完成时间
|
c7df828a
刘淇
快速工单 样式优化
|
223
|
})
|
fa775c6b
刘淇
养护计划调整
|
224
225
|
// ========== 表单校验规则 ==========
|
c7df828a
刘淇
快速工单 样式优化
|
226
|
const workOrderFormRules = reactive({
|
fa775c6b
刘淇
养护计划调整
|
227
228
|
workLocation: [
{ type: 'string', required: true, message: '请选择工单位置', trigger: ['change', 'blur'] }
|
c7df828a
刘淇
快速工单 样式优化
|
229
|
],
|
fa775c6b
刘淇
养护计划调整
|
230
231
232
233
234
235
236
237
238
239
240
241
242
243
|
roadName: [
{ type: 'string', required: true, message: '请选择道路名称', trigger: ['change', 'blur'] }
],
orderName: [
{ type: 'string', required: true, message: '请选择工单名称', trigger: ['change', 'blur'] }
],
pressingTypeName: [
{ type: 'string', required: true, message: '请选择紧急程度', trigger: ['change'] }
],
problemDesc: [
{ type: 'string', required: true, message: '请输入情况描述', trigger: ['change', 'blur'] },
{ type: 'string', min: 3, max: 200, message: '情况描述需3-200字', trigger: ['change', 'blur'] }
],
problemImgs: [problemImgs.imgValidateRule] // 复用上传校验规则
|
c7df828a
刘淇
快速工单 样式优化
|
244
|
})
|
2764b83e
刘淇
分配养护员
|
245
|
|
fa775c6b
刘淇
养护计划调整
|
246
|
// ========== 生命周期 ==========
|
c7df828a
刘淇
快速工单 样式优化
|
247
248
249
250
251
|
onReady(() => {
// 设置表单校验规则
if (workOrderFormRef.value) {
workOrderFormRef.value.setRules(workOrderFormRules)
}
|
fa775c6b
刘淇
养护计划调整
|
252
|
console.log('工单表单规则初始化完成')
|
c7df828a
刘淇
快速工单 样式优化
|
253
|
})
|
fa775c6b
刘淇
养护计划调整
|
254
|
|
c7df828a
刘淇
快速工单 样式优化
|
255
|
onShow(() => {
|
fa775c6b
刘淇
养护计划调整
|
256
257
258
259
260
261
262
263
264
265
|
console.log(uni.$dict.getDictLabel('ai_image_status', 20))
console.log(uni.$dict.getDictSimpleList('work_name'))
// 初始化工单名称列表
orderNameList.value = uni.$dict.transformLabelValueToNameValue(uni.$dict.getDictSimpleList('work_name'))
console.log('工单名称列表:', orderNameList.value)
// 初始化紧急程度列表
pressingTypeList.value = uni.$dict.transformLabelValueToNameValue(uni.$dict.getDictSimpleList('workorder_pressing_type'))
console.log('紧急程度列表:', pressingTypeList.value)
|
c7df828a
刘淇
快速工单 样式优化
|
266
|
})
|
fa775c6b
刘淇
养护计划调整
|
267
|
|
c7df828a
刘淇
快速工单 样式优化
|
268
269
|
// ========== 方法定义 ==========
/**
|
fa775c6b
刘淇
养护计划调整
|
270
|
* 打开通用下拉弹窗
|
c7df828a
刘淇
快速工单 样式优化
|
271
272
|
*/
const handleActionSheetOpen = (type) => {
|
fa775c6b
刘淇
养护计划调整
|
273
274
275
|
// 道路名称需先校验工单位置是否选择
if (type === 'roadName' && !workOrderForm.workLocation) {
uni.showToast({ title: '请先选择工单位置', icon: 'none' })
|
c7df828a
刘淇
快速工单 样式优化
|
276
277
|
return
}
|
fa775c6b
刘淇
养护计划调整
|
278
279
|
// 配置当前弹窗参数
|
c7df828a
刘淇
快速工单 样式优化
|
280
|
const configMap = {
|
fa775c6b
刘淇
养护计划调整
|
281
282
283
284
285
286
287
288
289
290
291
|
roadName: {
title: '请选择道路名称',
list: roadNameList.value
},
orderName: {
title: '请选择工单名称',
list: orderNameList.value
},
pressingType: {
title: '请选择紧急程度',
list: pressingTypeList.value
|
d433e7f6
刘淇
工单
|
292
|
}
|
c7df828a
刘淇
快速工单 样式优化
|
293
|
}
|
fa775c6b
刘淇
养护计划调整
|
294
|
|
c7df828a
刘淇
快速工单 样式优化
|
295
296
297
298
299
|
currentActionSheetData.type = type
currentActionSheetData.title = configMap[type].title
currentActionSheetData.list = configMap[type].list
showActionSheet.value = true
}
|
fa775c6b
刘淇
养护计划调整
|
300
|
|
c7df828a
刘淇
快速工单 样式优化
|
301
|
/**
|
fa775c6b
刘淇
养护计划调整
|
302
|
* 关闭通用下拉弹窗
|
c7df828a
刘淇
快速工单 样式优化
|
303
304
305
|
*/
const handleActionSheetClose = () => {
showActionSheet.value = false
|
fa775c6b
刘淇
养护计划调整
|
306
|
// 重置当前弹窗配置
|
c7df828a
刘淇
快速工单 样式优化
|
307
308
309
310
|
currentActionSheetData.type = ''
currentActionSheetData.list = []
currentActionSheetData.title = ''
}
|
fa775c6b
刘淇
养护计划调整
|
311
|
|
c7df828a
刘淇
快速工单 样式优化
|
312
|
/**
|
fa775c6b
刘淇
养护计划调整
|
313
|
* 通用下拉弹窗选择事件
|
c7df828a
刘淇
快速工单 样式优化
|
314
315
|
*/
const handleActionSheetSelect = (e) => {
|
fa775c6b
刘淇
养护计划调整
|
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
|
const { type } = currentActionSheetData
// 根据类型处理不同的选择逻辑
switch (type) {
case 'roadName':
workOrderForm.roadName = e.name
workOrderForm.roadId = e.code
workOrderFormRef.value?.validateField('roadName')
break
case 'orderName':
workOrderForm.orderName = e.name
workOrderFormRef.value?.validateField('orderName')
break
case 'pressingType':
console.log(e)
workOrderForm.pressingType =e.value
workOrderForm.pressingTypeName = e.name
workOrderFormRef.value?.validateField('pressingType')
break
|
c7df828a
刘淇
快速工单 样式优化
|
334
|
}
|
fa775c6b
刘淇
养护计划调整
|
335
|
// 关闭弹窗
|
c7df828a
刘淇
快速工单 样式优化
|
336
337
|
showActionSheet.value = false
}
|
fa775c6b
刘淇
养护计划调整
|
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
|
/**
* 返回上一页
*/
const navigateBack = () => {
uni.navigateBack()
}
/**
* 选择工单位置
*/
const chooseWorkLocation = () => {
uni.chooseLocation({
success: async (res) => {
workOrderForm.roadName = ''
workOrderForm.roadId = 0
roadNameList.value = []
workOrderForm.workLocation = res.name
workOrderForm.lat = res.latitude
workOrderForm.lon = res.longitude
workOrderFormRef.value?.validateField('workLocation')
workOrderFormRef.value?.validateField('roadName')
try {
uni.showLoading({ title: '获取道路名称中...' })
const roadRes = await getRoadListByLatLng({
companyCode: 'sls',
latitude: res.latitude,
longitude: res.longitude
})
uni.hideLoading()
if (Array.isArray(roadRes)) {
roadNameList.value = roadRes.map((item) => ({
name: item.roadName || '',
code: item.roadCode || '',
id: item.roadId || 0
}))
} else {
roadNameList.value = [{ name: '未查询到道路名称', code: '', id: 0 }]
uni.showToast({ title: '未查询到该位置的道路信息', icon: 'none' })
}
} catch (err) {
uni.hideLoading()
console.error('获取道路名称失败:', err)
uni.showToast({ title: '获取道路名称失败,请重试', icon: 'none' })
roadNameList.value = [{ name: '获取失败,请重新选择位置', code: '', id: 0 }]
}
},
fail: (err) => {
console.error('选择位置失败:', err)
uni.showToast({ title: '选择位置失败:' + err.errMsg, icon: 'none' })
}
})
}
/**
* 完成时间确认
*/
const finishDateConfirm = (e) => {
console.log('选择的完成时间:', e)
workOrderForm.finishDate = timeFormat(e.value, 'yyyy-mm-dd hh:MM:ss')
show.value = false
}
|
c7df828a
刘淇
快速工单 样式优化
|
405
406
407
408
409
410
|
/**
* 隐藏键盘
*/
const hideKeyboard = () => {
uni.hideKeyboard()
}
|
fa775c6b
刘淇
养护计划调整
|
411
|
|
c7df828a
刘淇
快速工单 样式优化
|
412
|
/**
|
fa775c6b
刘淇
养护计划调整
|
413
|
* 提交工单
|
c7df828a
刘淇
快速工单 样式优化
|
414
415
416
|
*/
const submitWorkOrder = async () => {
try {
|
fa775c6b
刘淇
养护计划调整
|
417
|
// 先执行表单校验
|
c7df828a
刘淇
快速工单 样式优化
|
418
|
await workOrderFormRef.value.validate()
|
fa775c6b
刘淇
养护计划调整
|
419
|
|
c7df828a
刘淇
快速工单 样式优化
|
420
|
const submitData = {
|
fa775c6b
刘淇
养护计划调整
|
421
422
423
424
425
426
427
428
429
430
431
432
433
434
|
roadId: workOrderForm.roadId,
roadName: workOrderForm.roadName,
imgs: problemImgs.getSuccessImgUrls(), // 复用上传逻辑的URL获取方法
remark: workOrderForm.problemDesc.trim(),
latLonType: 2,
lat: workOrderForm.lat,
lon: workOrderForm.lon,
lonLatAddress: workOrderForm.workLocation,
pressingType: workOrderForm.pressingType,
orderName: workOrderForm.orderName,
finishDate: workOrderForm.finishDate,
sourceId: 1,
sourceName: '园林',
busiLine: 'yl'
|
c7df828a
刘淇
快速工单 样式优化
|
435
|
}
|
fa775c6b
刘淇
养护计划调整
|
436
437
438
439
440
|
// 显示加载中
uni.showLoading({ title: '提交中...' })
// 调用提交接口
|
5059c4dd
刘淇
养护员提交养护工单
|
441
|
const res = await universalApproval(submitData)
|
fa775c6b
刘淇
养护计划调整
|
442
|
|
c7df828a
刘淇
快速工单 样式优化
|
443
444
|
uni.hideLoading()
uni.showToast({
|
fa775c6b
刘淇
养护计划调整
|
445
|
title: '工单提交成功',
|
c7df828a
刘淇
快速工单 样式优化
|
446
447
448
|
icon: 'success',
duration: 1000
})
|
fa775c6b
刘淇
养护计划调整
|
449
450
|
// 延迟跳转
|
c7df828a
刘淇
快速工单 样式优化
|
451
|
setTimeout(() => {
|
fa775c6b
刘淇
养护计划调整
|
452
453
|
uni.redirectTo({
url: '/pages-sub/problem/work-order-manage/index'
|
c7df828a
刘淇
快速工单 样式优化
|
454
455
456
|
})
}, 1000)
} catch (error) {
|
fa775c6b
刘淇
养护计划调整
|
457
|
// 隐藏加载框
|
c7df828a
刘淇
快速工单 样式优化
|
458
|
uni.hideLoading()
|
fa775c6b
刘淇
养护计划调整
|
459
460
|
// 区分是表单校验失败还是接口调用失败
|
c7df828a
刘淇
快速工单 样式优化
|
461
|
if (!Array.isArray(error)) {
|
fa775c6b
刘淇
养护计划调整
|
462
463
|
// 接口调用失败
console.error('工单提交失败:', error)
|
c7df828a
刘淇
快速工单 样式优化
|
464
465
466
467
468
|
uni.showToast({
title: '提交失败,请重试',
icon: 'none',
duration: 2000
})
|
d433e7f6
刘淇
工单
|
469
470
|
}
}
|
d433e7f6
刘淇
工单
|
471
|
}
|
5822009a
刘淇
工单管理--新增工单
|
472
|
</script>
|
d433e7f6
刘淇
工单
|
473
|
|
5822009a
刘淇
工单管理--新增工单
|
474
475
|
<style lang="scss" scoped>
// 全局页面样式
|
c7df828a
刘淇
快速工单 样式优化
|
476
|
.page-container {
|
fa775c6b
刘淇
养护计划调整
|
477
478
|
min-height: 100vh;
padding-bottom: 100rpx; // 给底部按钮留空间
|
d433e7f6
刘淇
工单
|
479
480
|
}
|
fa775c6b
刘淇
养护计划调整
|
481
|
// 工单表单内容容器
|
5822009a
刘淇
工单管理--新增工单
|
482
483
|
.work-order-form-content {
background: #fff;
|
d433e7f6
刘淇
工单
|
484
485
|
}
|
d433e7f6
刘淇
工单
|
486
|
</style>
|