Blame view

pages-sub/problem/work-order-manage/add-order.vue 14 KB
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>