Blame view

pages-sub/problem/regional-order-manage/add-order.vue 20.2 KB
f0ec74d6   刘淇   大区经理派单
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
  <template>
    <view class="page-container">
      <view class="work-order-form-content commonPageLRpadding">
        <up-form
            label-position="left"
            :model="workOrderForm"
            ref="workOrderFormRef"
            labelWidth="200rpx"
        >
          <!-- 1. 工单位置(地图选择) -->
          <up-form-item
              label="工单位置"
              prop="workLocation"
              border-bottom
              required
              @click="chooseWorkLocation(); hideKeyboard()"
          >
            <up-input
                v-model="workOrderForm.workLocation"
                border="none"
                readonly
                suffix-icon="map-fill"
                placeholder="点击选择工单位置"
            ></up-input>
          </up-form-item>
  
c64da17b   刘淇   新的业务线
27
          <!-- 2. 问题类型(下拉框) -->
f0ec74d6   刘淇   大区经理派单
28
          <up-form-item
c64da17b   刘淇   新的业务线
29
              label="问题类型"
f0ec74d6   刘淇   大区经理派单
30
31
32
33
34
35
36
37
38
              prop="orderName"
              border-bottom
              required
              @click="handleActionSheetOpen('orderName'); hideKeyboard()"
          >
            <up-input
                v-model="workOrderForm.orderName"
                disabled
                disabled-color="#ffffff"
c64da17b   刘淇   新的业务线
39
                placeholder="请选择问题类型"
f0ec74d6   刘淇   大区经理派单
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
                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="problemDesc"
              required
          >
            <up-textarea
                placeholder="请输入情况描述(最多200字)"
                v-model.trim="workOrderForm.problemDesc"
                count
                maxlength="200"
                rows="4"
                @blur="() => workOrderFormRef.validateField('problemDesc')"
            ></up-textarea>
          </up-form-item>
  
          <!-- 4. 问题照片 -->
          <up-form-item label="问题照片" prop="problemImgs" required>
            <up-upload
8ddc6f6e   刘淇   登录 修改样式
66
                :file-list="problemImgs.imgList.value || []"
f0ec74d6   刘淇   大区经理派单
67
68
69
70
71
72
73
74
75
76
77
                @after-read="problemImgs.uploadImgs"
                @delete="problemImgs.deleteImg"
                multiple
                :width="70"
                :height="70"
                :max-count="problemImgs.uploadConfig.maxCount"
                :upload-text="problemImgs.uploadConfig.uploadText"
                :size-type="problemImgs.uploadConfig.sizeType"
            ></up-upload>
          </up-form-item>
  
8ddc6f6e   刘淇   登录 修改样式
78
          <!-- 派单情况分组 -->
f0ec74d6   刘淇   大区经理派单
79
80
          <view class="dispatch-group">
            <view class="dispatch-title">派单情况</view>
f0ec74d6   刘淇   大区经理派单
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
            <!-- 业务线单选框 -->
            <up-form-item
                label="业务线"
                prop="busiLineCn"
                border-bottom
                required
            >
              <up-radio-group
                  v-model="workOrderForm.busiLineCn"
                  placement="row"
                  @change="handleBusiLineChange"
              >
                <up-radio
                    v-for="item in busiLineOptions"
                    :key="item.name"
                    :label="item.name"
                    :name="item.name"
                ></up-radio>
              </up-radio-group>
            </up-form-item>
  
            <!-- 道路名称(下拉框) -->
            <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>
8ddc6f6e   刘淇   登录 修改样式
118
                <up-icon name="arrow-right" size="16"></up-icon>
f0ec74d6   刘淇   大区经理派单
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
              </template>
            </up-form-item>
  
            <!-- 紧急程度选择 -->
            <up-form-item
                label="紧急程度"
                prop="pressingTypeName"
                border-bottom
                required
                @click="handleActionSheetOpen('pressingType'); hideKeyboard()"
            >
              <up-input
                  v-model="workOrderForm.pressingTypeName"
                  disabled
                  disabled-color="#ffffff"
                  placeholder="请选择紧急程度"
                  border="none"
              ></up-input>
              <template #right>
                <up-icon name="arrow-right" size="16"></up-icon>
              </template>
            </up-form-item>
          </view>
  
          <!-- 5. 完成时间 -->
          <up-form-item
              label="希望完成时间"
              prop="expectedFinishDate"
              @click="show=true;hideKeyboard()"
          >
            <up-input
                v-model="workOrderForm.expectedFinishDate"
                border="none"
                readonly
                placeholder="点击选择时间"
            ></up-input>
            <template #right>
              <view v-if="workOrderForm.expectedFinishDate" @click.stop>
8ddc6f6e   刘淇   登录 修改样式
157
                <up-icon name="close" size="16" @click.stop="clearExpectedFinishDate"></up-icon>
f0ec74d6   刘淇   大区经理派单
158
159
160
161
162
163
164
165
166
              </view>
              <up-icon name="arrow-right" size="16" v-else></up-icon>
            </template>
          </up-form-item>
        </up-form>
      </view>
  
      <!-- 底部提交按钮 -->
      <view class="fixed-bottom-btn-wrap">
8ddc6f6e   刘淇   登录 修改样式
167
        <up-button type="primary" text="提交工单" @click="submitWorkOrder"></up-button>
f0ec74d6   刘淇   大区经理派单
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
      </view>
  
      <!-- 合并后的通用下拉弹窗 -->
      <up-action-sheet
          :show="showActionSheet"
          :actions="currentActionSheetData.list"
          :title="currentActionSheetData.title"
          @close="handleActionSheetClose"
          @select="handleActionSheetSelect"
      ></up-action-sheet>
  
      <!-- 完成时间选择器 -->
      <up-datetime-picker
          :show="show"
          v-model="expectedFinishDate"
          mode="datetime"
          :min-date="new Date()"
          @cancel="show = false"
          @confirm="expectedFinishDateConfirm"
      ></up-datetime-picker>
    </view>
  </template>
  
  <script setup>
8ddc6f6e   刘淇   登录 修改样式
192
193
  import { ref, reactive, nextTick } from 'vue'
  import { onReady, onShow, onLoad, onBackPress } from '@dcloudio/uni-app';
f0ec74d6   刘淇   大区经理派单
194
195
  import { useUploadImgs } from '@/common/utils/useUploadImgs'
  import { getRoadListByLatLng } from '@/api/common'
8ddc6f6e   刘淇   登录 修改样式
196
197
198
199
  import {
    daquUniversalApproval, qyUniversalApproval, qyWorkorderCreate,
    dcyUniversalApproval, daquWorkorderCreate, dcyWorkorderCreate
  } from '@/api/regional-order-manage/regional-order-manage'
f0ec74d6   刘淇   大区经理派单
200
201
202
  import { timeFormat } from '@/uni_modules/uview-plus'
  import { nextStepMap } from '@/common/utils/common'
  import { useUserStore } from '@/pinia/user';
f0ec74d6   刘淇   大区经理派单
203
  
8ddc6f6e   刘淇   登录 修改样式
204
205
206
207
208
209
210
211
212
213
  // ========== 【常量配置区】- 硬编码集中管理,便于维护 ==========
  const CONST = {
    // 字典编码
    DICT_ORDER_NAME: 'work_name',
    DICT_PRESSING_TYPE: 'workorder_pressing_type',
    // 上传配置
    UPLOAD_CONFIG: { maxCount: 3, uploadText: '选择问题照片', sizeType: ['compressed'] },
    // 路由地址
    PAGE_ORDER_LIST: '/pages-sub/problem/regional-order-manage/index',
    // 业务线映射
c64da17b   刘淇   新的业务线
214
215
216
    BUSI_LINE_MAP: { yl: '园林', sz: '市政', wy: '物业', '园林': 'yl', '市政': 'sz', '物业': 'wy', 'zx': '秩序管理',
          'hj': '环境卫生', '秩序管理': 'zx',
          '环境卫生': 'hj', },
8ddc6f6e   刘淇   登录 修改样式
217
218
219
    // 角色标识
    ROLE: { MANAGER: 'regional_manager', INSPECTOR: 'Inspector_global', PATROL: 'patrol_global' }
  }
f0ec74d6   刘淇   大区经理派单
220
  
8ddc6f6e   刘淇   登录 修改样式
221
222
223
224
225
226
227
228
229
  // ========== 【全局实例 & 基础状态】 ==========
  const userStore = useUserStore();
  const USER_ROLES = userStore.userInfo?.roles || [];
  const workOrderFormRef = ref(null);
  const showActionSheet = ref(false);
  const show = ref(false);
  const expectedFinishDate = ref(Date.now());
  const isRenew = ref(false);
  const renewOrderData = ref(null);
f0ec74d6   刘淇   大区经理派单
230
  
8ddc6f6e   刘淇   登录 修改样式
231
232
233
234
235
  // ========== 【下拉弹窗数据】 ==========
  const currentActionSheetData = reactive({ type: '', list: [], title: '' });
  const roadNameList = ref([]);
  const orderNameList = ref([]);
  const pressingTypeList = ref([]);
f0ec74d6   刘淇   大区经理派单
236
  const busiLineOptions = ref([]);
f0ec74d6   刘淇   大区经理派单
237
  
8ddc6f6e   刘淇   登录 修改样式
238
  // ========== 【上传逻辑复用】 ==========
f0ec74d6   刘淇   大区经理派单
239
  const problemImgs = useUploadImgs({
8ddc6f6e   刘淇   登录 修改样式
240
    ...CONST.UPLOAD_CONFIG,
f0ec74d6   刘淇   大区经理派单
241
242
243
    formRef: workOrderFormRef,
    fieldName: 'problemImgs'
  })
8ddc6f6e   刘淇   登录 修改样式
244
245
  // 图片数组兜底,防止非数组报错
  if (!Array.isArray(problemImgs.rawImgList.value)) problemImgs.rawImgList.value = [];
f0ec74d6   刘淇   大区经理派单
246
  
8ddc6f6e   刘淇   登录 修改样式
247
  // ========== 【工单表单数据】 ==========
f0ec74d6   刘淇   大区经理派单
248
  const workOrderForm = reactive({
8ddc6f6e   刘淇   登录 修改样式
249
250
251
    busiLineCn: '', roadId: 0, roadName: '', workLocation: '',
    orderName: '', pressingType: '', pressingTypeName: '',
    problemDesc: '', lat: 0, lon: 0, expectedFinishDate: ''
4c54ad5d   刘淇   转工单 选择是 传紧急程度和...
252
  })
f0ec74d6   刘淇   大区经理派单
253
  
8ddc6f6e   刘淇   登录 修改样式
254
  // ========== 【表单校验规则】 ==========
f0ec74d6   刘淇   大区经理派单
255
  const workOrderFormRules = reactive({
8ddc6f6e   刘淇   登录 修改样式
256
257
258
259
260
    busiLineCn: [{ type: 'string', required: true, message: '请选择业务线', trigger: ['change', 'blur'] }],
    workLocation: [{ type: 'string', required: true, message: '请选择工单位置', trigger: ['change', 'blur'] }],
    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'] }],
f0ec74d6   刘淇   大区经理派单
261
262
263
264
265
266
267
    problemDesc: [
      { type: 'string', required: true, message: '请输入情况描述', trigger: ['change', 'blur'] },
      { type: 'string', min: 3, max: 200, message: '情况描述需3-200字', trigger: ['change', 'blur'] }
    ],
    problemImgs: [problemImgs.imgValidateRule]
  })
  
8ddc6f6e   刘淇   登录 修改样式
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
  // ========== 【工具方法封装】- 抽离通用逻辑,消灭重复代码 ==========
  /**
   * 业务线中文转英文
   */
  const busiLineCnToEn = (cn) => CONST.BUSI_LINE_MAP[cn] || '';
  /**
   * 业务线英文转中文
   */
  const busiLineEnToCn = (en) => CONST.BUSI_LINE_MAP[en] || '';
  /**
   * 统一跳转返回工单列表页
   */
  const toOrderListPage = () => uni.reLaunch({ url: CONST.PAGE_ORDER_LIST });
  /**
   * 格式化时间戳 - 增加空值兜底
   */
  const formatDate = (dateVal, fmt = 'yyyy-mm-dd hh:MM:ss') => dateVal ? timeFormat(dateVal, fmt) : '';
  /**
   * 时间转时间戳 - 增加空值兜底
   */
  const dateToTimestamp = (dateStr) => dateStr ? new Date(dateStr).getTime() : '';
  
  // ========== 【生命周期】 ==========
f0ec74d6   刘淇   大区经理派单
291
  onLoad((options) => {
8ddc6f6e   刘淇   登录 修改样式
292
293
    // 初始化工单线选项
    initBusiLineOptions();
f0ec74d6   刘淇   大区经理派单
294
    // 默认选中第一个业务线
8ddc6f6e   刘淇   登录 修改样式
295
296
297
    workOrderForm.busiLineCn = busiLineOptions.value[0]?.name || '';
    // 处理重新提交逻辑
    if (options.isRenew == 1 && options.tempKey) handleRenewOptions(options.tempKey);
f0ec74d6   刘淇   大区经理派单
298
299
300
  });
  
  onReady(() => {
8ddc6f6e   刘淇   登录 修改样式
301
302
303
304
305
    // 修复bug:nextTick确保表单ref一定挂载完成,再设置规则
    nextTick(() => {
      workOrderFormRef.value?.setRules(workOrderFormRules);
    });
  });
f0ec74d6   刘淇   大区经理派单
306
307
  
  onShow(() => {
8ddc6f6e   刘淇   登录 修改样式
308
309
310
311
    // 初始化下拉字典数据
    orderNameList.value = uni.$dict.transformLabelValueToNameValue(uni.$dict.getDictSimpleList(CONST.DICT_ORDER_NAME));
    pressingTypeList.value = uni.$dict.transformLabelValueToNameValue(uni.$dict.getDictSimpleList(CONST.DICT_PRESSING_TYPE));
  });
f0ec74d6   刘淇   大区经理派单
312
  
8ddc6f6e   刘淇   登录 修改样式
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
  // ========== 【核心业务方法】 ==========
  /**
   * 初始化工单线选项
   */
  const initBusiLineOptions = () => {
    const rawBusiLines = userStore.userInfo?.user?.busiLine?.split(',') || [];
    busiLineOptions.value = rawBusiLines.map(item => ({ name: busiLineEnToCn(item.trim()) }));
  };
  
  /**
   * 处理重新提交的参数和数据回显
   */
  const handleRenewOptions = async (tempKey) => {
    isRenew.value = true;
    try {
      const orderData = uni.getStorageSync(tempKey);
      if (orderData && typeof orderData === 'object') {
        renewOrderData.value = orderData;
        echoOrderData(orderData);
      } else {
        uni.showToast({ title: '工单数据不存在,无法重新提交', icon: 'none' });
        setTimeout(toOrderListPage, 1000);
      }
    } catch (error) {
      console.error('读取工单数据失败:', error);
      uni.showToast({ title: '数据读取异常,无法重新提交', icon: 'none' });
      setTimeout(toOrderListPage, 1000);
    } finally {
      uni.removeStorageSync(tempKey);
f0ec74d6   刘淇   大区经理派单
342
    }
8ddc6f6e   刘淇   登录 修改样式
343
  };
f0ec74d6   刘淇   大区经理派单
344
  
8ddc6f6e   刘淇   登录 修改样式
345
346
347
348
349
350
351
352
  /**
   * 工单数据回显
   */
  const echoOrderData = (orderItem) => {
    // 基础字段回显
    console.log(orderItem)
    console.log('123')
    workOrderForm.busiLineCn = busiLineEnToCn(orderItem.busiLine);
f0ec74d6   刘淇   大区经理派单
353
354
355
356
357
    workOrderForm.roadId = orderItem.roadId || 0;
    workOrderForm.roadName = orderItem.roadName || '';
    workOrderForm.workLocation = orderItem.lonLatAddress || orderItem.roadName || '';
    workOrderForm.orderName = orderItem.orderName || '';
    workOrderForm.pressingType = orderItem.pressingType || '';
8ddc6f6e   刘淇   登录 修改样式
358
    workOrderForm.pressingTypeName = uni.$dict.getDictLabel(CONST.DICT_PRESSING_TYPE, orderItem.pressingType) || '';
f0ec74d6   刘淇   大区经理派单
359
360
361
    workOrderForm.problemDesc = orderItem.remark || '';
    workOrderForm.lat = orderItem.lat || 0;
    workOrderForm.lon = orderItem.lon || 0;
8ddc6f6e   刘淇   登录 修改样式
362
363
364
365
366
    workOrderForm.expectedFinishDate = orderItem.expectedFinishDate?"":formatDate(orderItem.expectedFinishDate);
  
    // 图片回显 - 兼容异常格式
    if (Array.isArray(orderItem.problemsImgs) && orderItem.problemsImgs.length) {
      const imgList = orderItem.problemsImgs.map((url, idx) => ({ url, name: `renew_img_${idx}`, status: 'success' }));
f0ec74d6   刘淇   大区经理派单
367
368
369
370
371
      problemImgs.imgList.value = imgList;
      problemImgs.rawImgList.value = imgList;
    }
  
    // 自动获取道路列表
8ddc6f6e   刘淇   登录 修改样式
372
    if (orderItem.lat && orderItem.lon) getRoadListByBusiLine();
f0ec74d6   刘淇   大区经理派单
373
374
  };
  
8ddc6f6e   刘淇   登录 修改样式
375
376
377
  /**
   * 业务线切换事件
   */
f0ec74d6   刘淇   大区经理派单
378
379
380
381
  const handleBusiLineChange = () => {
    workOrderForm.roadName = '';
    workOrderForm.roadId = 0;
    roadNameList.value = [];
8ddc6f6e   刘淇   登录 修改样式
382
    workOrderForm.workLocation && getRoadListByBusiLine();
f0ec74d6   刘淇   大区经理派单
383
384
  };
  
8ddc6f6e   刘淇   登录 修改样式
385
386
387
  /**
   * 根据坐标+业务线获取道路列表
   */
f0ec74d6   刘淇   大区经理派单
388
  const getRoadListByBusiLine = async () => {
8ddc6f6e   刘淇   登录 修改样式
389
390
391
    if (!workOrderForm.lat || !workOrderForm.lon) return;
    const busiLineEn = busiLineCnToEn(workOrderForm.busiLineCn);
    if (!busiLineEn) return uni.showToast({ title: '业务线选择异常', icon: 'none' });
f0ec74d6   刘淇   大区经理派单
392
393
394
  
    try {
      uni.showLoading({ title: '获取道路名称中...' });
8ddc6f6e   刘淇   登录 修改样式
395
396
397
398
399
400
401
      const roadRes = await getRoadListByLatLng({ busiLine: busiLineEn, latitude: workOrderForm.lat, longitude: workOrderForm.lon });
      console.log(roadRes)
      roadNameList.value = Array.isArray(roadRes)
          ? roadRes.map(item => ({ name: item.roadName || '', code: item.roadCode || '', id: item.roadId || 0 }))
          : [{ name: '未查询到道路名称', code: '', id: 0 }];
      console.log(roadNameList)
      !Array.isArray(roadRes) && uni.showToast({ title: '未查询到该位置的道路信息', icon: 'none' });
f0ec74d6   刘淇   大区经理派单
402
    } catch (err) {
f0ec74d6   刘淇   大区经理派单
403
      console.error('获取道路名称失败:', err);
f0ec74d6   刘淇   大区经理派单
404
      roadNameList.value = [{ name: '获取失败,请重新选择位置', code: '', id: 0 }];
8ddc6f6e   刘淇   登录 修改样式
405
406
407
      uni.showToast({ title: '获取道路名称失败,请重试', icon: 'none' });
    } finally {
      uni.hideLoading();
f0ec74d6   刘淇   大区经理派单
408
409
410
    }
  };
  
8ddc6f6e   刘淇   登录 修改样式
411
  // ========== 【通用下拉弹窗方法】 ==========
f0ec74d6   刘淇   大区经理派单
412
413
  const handleActionSheetOpen = (type) => {
    if (type === 'roadName' && !workOrderForm.workLocation) {
8ddc6f6e   刘淇   登录 修改样式
414
      return uni.showToast({ title: '请先选择工单位置', icon: 'none' });
f0ec74d6   刘淇   大区经理派单
415
    }
f0ec74d6   刘淇   大区经理派单
416
    const configMap = {
8ddc6f6e   刘淇   登录 修改样式
417
418
419
420
421
422
423
      roadName: { title: '请选择道路名称', list: roadNameList.value },
      orderName: { title: '请选择工单名称', list: orderNameList.value },
      pressingType: { title: '请选择紧急程度', list: pressingTypeList.value }
    };
    Object.assign(currentActionSheetData, configMap[type], { type });
    showActionSheet.value = true;
  };
f0ec74d6   刘淇   大区经理派单
424
425
  
  const handleActionSheetClose = () => {
8ddc6f6e   刘淇   登录 修改样式
426
427
428
    showActionSheet.value = false;
    Object.assign(currentActionSheetData, { type: '', list: [], title: '' });
  };
f0ec74d6   刘淇   大区经理派单
429
430
  
  const handleActionSheetSelect = (e) => {
8ddc6f6e   刘淇   登录 修改样式
431
    const { type } = currentActionSheetData;
f0ec74d6   刘淇   大区经理派单
432
433
    switch (type) {
      case 'roadName':
8ddc6f6e   刘淇   登录 修改样式
434
435
436
        workOrderForm.roadName = e.name;
        workOrderForm.roadId = e.code;
        break;
f0ec74d6   刘淇   大区经理派单
437
      case 'orderName':
8ddc6f6e   刘淇   登录 修改样式
438
439
        workOrderForm.orderName = e.name;
        break;
f0ec74d6   刘淇   大区经理派单
440
      case 'pressingType':
8ddc6f6e   刘淇   登录 修改样式
441
442
443
        workOrderForm.pressingType = e.value;
        workOrderForm.pressingTypeName = e.name;
        break;
f0ec74d6   刘淇   大区经理派单
444
    }
8ddc6f6e   刘淇   登录 修改样式
445
446
447
    workOrderFormRef.value?.validateField(type === 'roadName' ? 'roadName' : type === 'orderName' ? 'orderName' : 'pressingTypeName');
    handleActionSheetClose();
  };
f0ec74d6   刘淇   大区经理派单
448
  
8ddc6f6e   刘淇   登录 修改样式
449
450
451
452
453
454
455
456
457
458
  // ========== 【页面交互方法】 ==========
  /** 清除希望完成时间 */
  const clearExpectedFinishDate = () => workOrderForm.expectedFinishDate = '';
  /** 隐藏软键盘 */
  const hideKeyboard = () => uni.hideKeyboard();
  /** 时间选择确认 */
  const expectedFinishDateConfirm = (e) => {
    workOrderForm.expectedFinishDate = formatDate(e.value);
    show.value = false;
  };
f0ec74d6   刘淇   大区经理派单
459
  
8ddc6f6e   刘淇   登录 修改样式
460
  /** 选择工单位置 */
f0ec74d6   刘淇   大区经理派单
461
462
463
  const chooseWorkLocation = () => {
    uni.chooseLocation({
      success: async (res) => {
8ddc6f6e   刘淇   登录 修改样式
464
465
466
467
468
469
470
        workOrderForm.roadName = '';
        workOrderForm.roadId = 0;
        roadNameList.value = [];
        workOrderForm.workLocation = res.name;
        workOrderForm.lat = res.latitude;
        workOrderForm.lon = res.longitude;
        workOrderFormRef.value?.validateField(['workLocation', 'roadName']);
f0ec74d6   刘淇   大区经理派单
471
472
473
        await getRoadListByBusiLine();
      },
      fail: (err) => {
8ddc6f6e   刘淇   登录 修改样式
474
475
476
        console.error('选择位置失败:', err);
        const errMsg = err.errMsg.includes('auth deny') ? '请开启位置权限后重试' : '选择位置失败,请重试';
        uni.showToast({ title: errMsg, icon: 'none' });
f0ec74d6   刘淇   大区经理派单
477
478
      }
    })
8ddc6f6e   刘淇   登录 修改样式
479
480
481
482
483
484
485
486
  };
  // 新增页返回直接回列表页
  onBackPress(() => {
    uni.redirectTo({
      url: '/pages-sub/problem/regional-order-manage/index'
    })
    return true;
  })
f0ec74d6   刘淇   大区经理派单
487
  
8ddc6f6e   刘淇   登录 修改样式
488
489
490
491
492
493
494
495
496
497
498
499
  // ========== 【封装:统一接口调用方法】 ==========
  const callApiByRole = async (params, isRenewFlag) => {
    if (isRenewFlag) {
      if (USER_ROLES.includes(CONST.ROLE.MANAGER)) return await daquUniversalApproval(params);
      if (USER_ROLES.includes(CONST.ROLE.INSPECTOR)) return await dcyUniversalApproval(params);
      if (USER_ROLES.includes(CONST.ROLE.PATROL)) return await qyUniversalApproval(params);
    } else {
      if (USER_ROLES.includes(CONST.ROLE.MANAGER)) return await daquWorkorderCreate(params);
      if (USER_ROLES.includes(CONST.ROLE.INSPECTOR)) return await dcyWorkorderCreate(params);
      if (USER_ROLES.includes(CONST.ROLE.PATROL)) return await qyWorkorderCreate(params);
    }
  };
f0ec74d6   刘淇   大区经理派单
500
  
8ddc6f6e   刘淇   登录 修改样式
501
  // ========== 【核心:提交工单】 ==========
f0ec74d6   刘淇   大区经理派单
502
503
  const submitWorkOrder = async () => {
    try {
8ddc6f6e   刘淇   登录 修改样式
504
505
506
507
508
509
510
511
512
      // 表单校验
      await workOrderFormRef.value.validate();
      const busiLineEn = busiLineCnToEn(workOrderForm.busiLineCn);
      if (!busiLineEn) return uni.showToast({ title: '业务线选择异常,请重新选择', icon: 'none' });
  
      // 组装公共提交参数
      const baseParams = {
        roadId: workOrderForm.roadId,
        roadName: workOrderForm.roadName,
f0ec74d6   刘淇   大区经理派单
513
514
515
516
517
518
519
520
        problemsImgs: problemImgs.getSuccessImgUrls(),
        remark: workOrderForm.problemDesc.trim(),
        latLonType: 2,
        lat: workOrderForm.lat,
        lon: workOrderForm.lon,
        lonLatAddress: workOrderForm.workLocation,
        pressingType: workOrderForm.pressingType,
        orderName: workOrderForm.orderName,
8ddc6f6e   刘淇   登录 修改样式
521
        expectedFinishDate: dateToTimestamp(workOrderForm.expectedFinishDate),
f0ec74d6   刘淇   大区经理派单
522
523
524
        sourceId: 1,
        sourceName: workOrderForm.busiLineCn,
        busiLine: busiLineEn
8ddc6f6e   刘淇   登录 修改样式
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
      };
  
      uni.showLoading({ title: '提交中...', mask: true });
      // 区分:重新提交 / 新增工单
      const submitParams = isRenew.value
          ? {
            workerDataId: renewOrderData.value.id,
            taskKey: renewOrderData.value.taskKey,
            taskId: renewOrderData.value.taskId,
            operateType: nextStepMap[renewOrderData.value.taskKey]?.operateTypeRenew || '',
            agree: 0,
            reason: workOrderForm.problemDesc.trim(),
            ...baseParams
          }
          : baseParams;
  
      // 统一调用接口
      await callApiByRole(submitParams, isRenew.value);
  
      // 提交成功处理
      uni.showToast({ title: isRenew.value ? '重新提交成功' : '工单提交成功', icon: 'success', duration: 1000 });
      setTimeout(toOrderListPage, 1000);
f0ec74d6   刘淇   大区经理派单
547
    } catch (error) {
8ddc6f6e   刘淇   登录 修改样式
548
      uni.hideLoading();
f0ec74d6   刘淇   大区经理派单
549
      if (!Array.isArray(error)) {
8ddc6f6e   刘淇   登录 修改样式
550
551
        console.error(isRenew.value ? '工单重新提交失败:' : '工单提交失败:', error);
        uni.showToast({ title: error.msg || '提交失败,请重试', icon: 'none', duration: 2000 });
f0ec74d6   刘淇   大区经理派单
552
553
554
      }
    }
  }
4c54ad5d   刘淇   转工单 选择是 传紧急程度和...
555
556
  </script>
  
f0ec74d6   刘淇   大区经理派单
557
558
559
560
561
  <style lang="scss" scoped>
  // 全局页面样式
  .page-container {
    min-height: 100vh;
    padding-bottom: 100rpx; // 给底部按钮留空间
8ddc6f6e   刘淇   登录 修改样式
562
    background: #fafafa;
f0ec74d6   刘淇   大区经理派单
563
  }
4c54ad5d   刘淇   转工单 选择是 传紧急程度和...
564
  
f0ec74d6   刘淇   大区经理派单
565
566
567
568
569
  // 工单表单内容容器
  .work-order-form-content {
    background: #fff;
  }
  
8ddc6f6e   刘淇   登录 修改样式
570
  // 派单情况分组样式
f0ec74d6   刘淇   大区经理派单
571
  .dispatch-group {
8ddc6f6e   刘淇   登录 修改样式
572
573
574
575
576
577
578
579
580
581
582
    padding-top: 24rpx;
    margin-top: 8rpx;
    border-top: 1px solid #f5f5f5;
  
    .dispatch-title {
      font-size: 32rpx;
      font-weight: 600;
      color: $u-primary;
      margin-bottom: 20rpx;
      padding-left: 10rpx;
    }
f0ec74d6   刘淇   大区经理派单
583
  }
4c54ad5d   刘淇   转工单 选择是 传紧急程度和...
584
  </style>