Blame view

pages-sub/problem/work-order-manage/add-order.vue 19.8 KB
d433e7f6   刘淇   工单
1
  <template>
c7df828a   刘淇   快速工单 样式优化
2
    <view class="page-container">
5822009a   刘淇   工单管理--新增工单
3
      <view class="work-order-form-content commonPageLRpadding">
6cc0ab0e   刘淇   养护任务
4
        <up-form label-position="left" :model="workOrderForm" ref="workOrderFormRef" labelWidth="200rpx">
e6a04285   刘淇   单图情况 宽高70*70
5
          <!-- 业务线单选框:移入form内,作为第一个表单项(核心调整) -->
3cbb8754   刘淇   动态字典
6
7
8
9
          <up-form-item label="业务线" prop="busiLine" border-bottom required>
            <up-radio-group v-model="busiLineDisplay" placement="row" @change="handleBusiLineChange">
              <up-radio v-for="item in busiLineOptions" :key="item.value" :label="item.label"
                :name="item.label"></up-radio>
6cc0ab0e   刘淇   养护任务
10
            </up-radio-group>
e6a04285   刘淇   单图情况 宽高70*70
11
          </up-form-item>
fa775c6b   刘淇   养护计划调整
12
          <!-- 1. 工单位置(地图选择) -->
6cc0ab0e   刘淇   养护任务
13
14
15
16
          <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>
fa775c6b   刘淇   养护计划调整
17
          </up-form-item>
fa775c6b   刘淇   养护计划调整
18
          <!-- 2. 道路名称(下拉框) -->
6cc0ab0e   刘淇   养护任务
19
20
21
22
          <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>
fa775c6b   刘淇   养护计划调整
23
            <template #right>
6cc0ab0e   刘淇   养护任务
24
              <up-icon name="arrow-right" size="16"></up-icon>
fa775c6b   刘淇   养护计划调整
25
26
            </template>
          </up-form-item>
c64da17b   刘淇   新的业务线
27
          <!-- 3. 问题类型(下拉框) -->
6cc0ab0e   刘淇   养护任务
28
29
30
31
          <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"></up-input>
fa775c6b   刘淇   养护计划调整
32
33
34
            <template #right>
              <up-icon name="arrow-right" size="16"></up-icon>
            </template>
5822009a   刘淇   工单管理--新增工单
35
          </up-form-item>
fa775c6b   刘淇   养护计划调整
36
          <!-- 新增:紧急程度选择 -->
6cc0ab0e   刘淇   养护任务
37
38
39
40
          <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>
5822009a   刘淇   工单管理--新增工单
41
42
43
44
            <template #right>
              <up-icon name="arrow-right" size="16"></up-icon>
            </template>
          </up-form-item>
fa775c6b   刘淇   养护计划调整
45
          <!-- 4. 情况描述(文本域) -->
6cc0ab0e   刘淇   养护任务
46
47
48
          <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>
5822009a   刘淇   工单管理--新增工单
49
          </up-form-item>
fa775c6b   刘淇   养护计划调整
50
          <!-- 问题照片(核心修复:绑定纯数组) -->
e6a04285   刘淇   单图情况 宽高70*70
51
          <up-form-item label="问题照片" prop="problemImgs" border-bottom required>
6cc0ab0e   刘淇   养护任务
52
53
54
55
            <up-upload :file-list="problemImgs.imgList.value || []" @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>
fa775c6b   刘淇   养护计划调整
56
          </up-form-item>
fa775c6b   刘淇   养护计划调整
57
          <!-- 完成时间 -->
6cc0ab0e   刘淇   养护任务
58
59
          <up-form-item label="希望完成时间" prop="expectedFinishDate" @click="show = true; hideKeyboard()">
            <up-input v-model="workOrderForm.expectedFinishDate" border="none" readonly placeholder="点击选择时间"></up-input>
fa775c6b   刘淇   养护计划调整
60
            <template #right>
e6a04285   刘淇   单图情况 宽高70*70
61
62
              <!-- 核心修复:用view包裹图标,添加双重@click.stop -->
              <view v-if="workOrderForm.expectedFinishDate" @click.stop>
6cc0ab0e   刘淇   养护任务
63
                <up-icon name="close" size="20" @click.stop="clearExpectedFinishDate"></up-icon>
e6a04285   刘淇   单图情况 宽高70*70
64
65
              </view>
              <up-icon name="arrow-right" size="16" v-else></up-icon>
fa775c6b   刘淇   养护计划调整
66
67
            </template>
          </up-form-item>
5822009a   刘淇   工单管理--新增工单
68
69
        </up-form>
      </view>
5822009a   刘淇   工单管理--新增工单
70
71
      <!-- 底部提交按钮 -->
      <view class="fixed-bottom-btn-wrap">
6cc0ab0e   刘淇   养护任务
72
        <up-button type="primary" text="提交工单" @click="submitWorkOrder"></up-button>
5822009a   刘淇   工单管理--新增工单
73
      </view>
fa775c6b   刘淇   养护计划调整
74
      <!-- 合并后的通用下拉弹窗 -->
6cc0ab0e   刘淇   养护任务
75
76
77
      <up-action-sheet :show="showActionSheet" :actions="currentActionSheetData.list"
        :title="currentActionSheetData.title" @close="handleActionSheetClose"
        @select="handleActionSheetSelect"></up-action-sheet>
fa775c6b   刘淇   养护计划调整
78
      <!-- 完成时间选择器 -->
6cc0ab0e   刘淇   养护任务
79
80
      <up-datetime-picker :show="show" v-model="expectedFinishDate" mode="datetime" :min-date="new Date()"
        @cancel="show = false" @confirm="expectedFinishDateConfirm"></up-datetime-picker>
5822009a   刘淇   工单管理--新增工单
81
82
    </view>
  </template>
c7df828a   刘淇   快速工单 样式优化
83
  <script setup>
3cbb8754   刘淇   动态字典
84
  import { ref, reactive, computed } from 'vue'
7a96cf50   刘淇   重新提交
85
  import { onReady, onShow, onLoad } from '@dcloudio/uni-app';
e6a04285   刘淇   单图情况 宽高70*70
86
  import { useUploadImgs } from '@/common/utils/useUploadImgs'
fa775c6b   刘淇   养护计划调整
87
  import { getRoadListByLatLng } from '@/api/common'
7a96cf50   刘淇   重新提交
88
  import { universalApproval, workorderCreate } from '@/api/work-order-manage/work-order-manage'
fa775c6b   刘淇   养护计划调整
89
  import { timeFormat } from '@/uni_modules/uview-plus'
5059c4dd   刘淇   养护员提交养护工单
90
  import { nextStepMap } from '@/common/utils/common'
e6a04285   刘淇   单图情况 宽高70*70
91
  import { useUserStore } from '@/pinia/user';
e6a04285   刘淇   单图情况 宽高70*70
92
93
  // ========== 状态管理 ==========
  const userStore = useUserStore();
3cbb8754   刘淇   动态字典
94
95
96
97
  // 业务线选项,直接从pinia dictList拿
  const busiLineOptions = computed(() => {
    return userStore.dictList || []
  })
c7df828a   刘淇   快速工单 样式优化
98
99
  // ========== 表单Ref ==========
  const workOrderFormRef = ref(null)
3cbb8754   刘淇   动态字典
100
101
  // 业务线单选框展示用(存中文label)
  const busiLineDisplay = ref('')
fa775c6b   刘淇   养护计划调整
102
103
104
105
106
107
108
109
  // ========== 公共上传逻辑复用 ==========
  const problemImgs = useUploadImgs({
    maxCount: 3,
    uploadText: '选择问题照片',
    sizeType: ['compressed'],
    formRef: workOrderFormRef,
    fieldName: 'problemImgs'
  })
4c54ad5d   刘淇   转工单 选择是 传紧急程度和...
110
111
112
113
  // 无需再手动初始化普通数组,直接使用 ref 响应式数据
  if (!Array.isArray(problemImgs.rawImgList.value)) {
    problemImgs.rawImgList.value = [];
  }
c7df828a   刘淇   快速工单 样式优化
114
  // ========== 页面状态 ==========
fa775c6b   刘淇   养护计划调整
115
  // 通用弹窗控制
c7df828a   刘淇   快速工单 样式优化
116
  const showActionSheet = ref(false)
fa775c6b   刘淇   养护计划调整
117
  // 当前弹窗配置
c7df828a   刘淇   快速工单 样式优化
118
119
120
121
122
  const currentActionSheetData = reactive({
    type: '',
    list: [],
    title: ''
  })
fa775c6b   刘淇   养护计划调整
123
124
  // 完成时间选择器控制
  const show = ref(false)
2f1e3176   刘淇   图片参数处理
125
  const expectedFinishDate = ref(Date.now())
7a96cf50   刘淇   重新提交
126
127
128
  // ========== 重新提交相关状态(核心:本地存储读取) ==========
  const isRenew = ref(false); // 是否为重新提交状态
  const renewOrderData = ref(null); // 重新提交的原有工单数据
c7df828a   刘淇   快速工单 样式优化
129
  // ========== 下拉列表数据 ==========
fa775c6b   刘淇   养护计划调整
130
131
132
  const roadNameList = ref([])
  const orderNameList = ref([])
  const pressingTypeList = ref([])
3cbb8754   刘淇   动态字典
133
  // ========== 工单表单数据 ==========
c7df828a   刘淇   快速工单 样式优化
134
  const workOrderForm = reactive({
3cbb8754   刘淇   动态字典
135
    busiLine: '', // 业务线value,yl / sz / wy
e6a04285   刘淇   单图情况 宽高70*70
136
137
138
139
140
141
142
143
144
145
    roadId: 0,                     // 原有字段
    roadName: '',                  // 原有字段
    workLocation: '',              // 原有字段
    orderName: '',                 // 原有字段
    pressingType: '',              // 原有字段
    pressingTypeName: '',          // 原有字段
    problemDesc: '',               // 原有字段
    lat: 0,                        // 原有字段
    lon: 0,                        // 原有字段
    expectedFinishDate: '',        // 原有字段
c7df828a   刘淇   快速工单 样式优化
146
  })
3cbb8754   刘淇   动态字典
147
  // ========== 表单校验规则 ==========
c7df828a   刘淇   快速工单 样式优化
148
  const workOrderFormRules = reactive({
3cbb8754   刘淇   动态字典
149
    busiLine: [
e6a04285   刘淇   单图情况 宽高70*70
150
151
      { type: 'string', required: true, message: '请选择业务线', trigger: ['change', 'blur'] }
    ],
fa775c6b   刘淇   养护计划调整
152
153
    workLocation: [
      { type: 'string', required: true, message: '请选择工单位置', trigger: ['change', 'blur'] }
c7df828a   刘淇   快速工单 样式优化
154
    ],
fa775c6b   刘淇   养护计划调整
155
156
157
158
    roadName: [
      { type: 'string', required: true, message: '请选择道路名称', trigger: ['change', 'blur'] }
    ],
    orderName: [
c64da17b   刘淇   新的业务线
159
      { type: 'string', required: true, message: '请选择问题类型', trigger: ['change', 'blur'] }
fa775c6b   刘淇   养护计划调整
160
161
162
163
164
165
166
167
168
    ],
    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   刘淇   快速工单 样式优化
169
  })
fa775c6b   刘淇   养护计划调整
170
  // ========== 生命周期 ==========
3cbb8754   刘淇   动态字典
171
  // 页面加载
7a96cf50   刘淇   重新提交
172
  onLoad((options) => {
3cbb8754   刘淇   动态字典
173
    // 默认选中第一个业务线
e6a04285   刘淇   单图情况 宽高70*70
174
    if (busiLineOptions.value.length > 0) {
3cbb8754   刘淇   动态字典
175
176
177
      // ✅ 业务线:表单存value,单选展示中文label
      workOrderForm.busiLine = busiLineOptions.value[0].value
      busiLineDisplay.value = busiLineOptions.value[0].label
e6a04285   刘淇   单图情况 宽高70*70
178
    }
7a96cf50   刘淇   重新提交
179
    // 判断是否为重新提交状态
7a96cf50   刘淇   重新提交
180
    console.log(options)
e6a04285   刘淇   单图情况 宽高70*70
181
    if (options.isRenew == 1 && options.tempKey) {
7a96cf50   刘淇   重新提交
182
183
      isRenew.value = true;
      const tempKey = options.tempKey;
7a96cf50   刘淇   重新提交
184
185
186
187
188
      // 1. 从本地同步存储中读取完整工单数据
      try {
        const orderData = uni.getStorageSync(tempKey);
        if (orderData && typeof orderData === 'object') {
          renewOrderData.value = orderData;
7a96cf50   刘淇   重新提交
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
          console.log(orderData)
          // 2. 回显工单数据到表单
          echoOrderData(renewOrderData.value);
        } else {
          uni.showToast({ title: '工单数据不存在,无法重新提交', icon: 'none' });
          // 跳转回列表页
          setTimeout(() => uni.navigateBack(), 1000);
          return;
        }
      } catch (error) {
        console.error('读取工单数据失败:', error);
        uni.showToast({ title: '数据读取异常,无法重新提交', icon: 'none' });
        setTimeout(() => uni.navigateBack(), 1000);
        return;
      } finally {
        // 3. 关键:用完即删,避免本地冗余存储和数据泄露
        uni.removeStorageSync(tempKey);
      }
    }
  });
c7df828a   刘淇   快速工单 样式优化
209
210
211
212
213
  onReady(() => {
    // 设置表单校验规则
    if (workOrderFormRef.value) {
      workOrderFormRef.value.setRules(workOrderFormRules)
    }
fa775c6b   刘淇   养护计划调整
214
    console.log('工单表单规则初始化完成')
c7df828a   刘淇   快速工单 样式优化
215
  })
c7df828a   刘淇   快速工单 样式优化
216
  onShow(() => {
fa775c6b   刘淇   养护计划调整
217
218
    console.log(uni.$dict.getDictLabel('ai_image_status', 20))
    console.log(uni.$dict.getDictSimpleList('work_name'))
c64da17b   刘淇   新的业务线
219
    // 初始化问题类型列表
fa775c6b   刘淇   养护计划调整
220
    orderNameList.value = uni.$dict.transformLabelValueToNameValue(uni.$dict.getDictSimpleList('work_name'))
c64da17b   刘淇   新的业务线
221
    console.log('问题类型列表:', orderNameList.value)
fa775c6b   刘淇   养护计划调整
222
223
224
    // 初始化紧急程度列表
    pressingTypeList.value = uni.$dict.transformLabelValueToNameValue(uni.$dict.getDictSimpleList('workorder_pressing_type'))
    console.log('紧急程度列表:', pressingTypeList.value)
c7df828a   刘淇   快速工单 样式优化
225
  })
3cbb8754   刘淇   动态字典
226
  // ========== 核心方法:工单数据回显 ==========
7a96cf50   刘淇   重新提交
227
  const echoOrderData = (orderItem) => {
3cbb8754   刘淇   动态字典
228
    // 业务线回显,后端给的是value,需要自动找到中文赋值给单选框
e6a04285   刘淇   单图情况 宽高70*70
229
    if (orderItem.busiLine) {
3cbb8754   刘淇   动态字典
230
231
232
233
234
      workOrderForm.busiLine = orderItem.busiLine;
      const findItem = busiLineOptions.value.find(item => item.value === orderItem.busiLine)
      if (findItem) {
        busiLineDisplay.value = findItem.label
      }
e6a04285   刘淇   单图情况 宽高70*70
235
    }
e6a04285   刘淇   单图情况 宽高70*70
236
    // 2. 原有基础表单字段回显
7a96cf50   刘淇   重新提交
237
238
239
240
241
242
243
244
245
    workOrderForm.roadId = orderItem.roadId || 0;
    workOrderForm.roadName = orderItem.roadName || '';
    workOrderForm.workLocation = orderItem.lonLatAddress || orderItem.roadName || '';
    workOrderForm.orderName = orderItem.orderName || '';
    workOrderForm.pressingType = orderItem.pressingType || '';
    workOrderForm.pressingTypeName = uni.$dict.getDictLabel('workorder_pressing_type', orderItem.pressingType) || '';
    workOrderForm.problemDesc = orderItem.remark || '';
    workOrderForm.lat = orderItem.lat || 0;
    workOrderForm.lon = orderItem.lon || 0;
6cc0ab0e   刘淇   养护任务
246
    workOrderForm.expectedFinishDate = orderItem.expectedFinishDate ? timeFormat(orderItem.expectedFinishDate, 'yyyy-mm-dd hh:MM:ss') : '';
e6a04285   刘淇   单图情况 宽高70*70
247
    // 3. 上传图片回显(兼容useUploadImgs格式)
7a96cf50   刘淇   重新提交
248
249
250
251
252
253
    if (orderItem.problemsImgs && Array.isArray(orderItem.problemsImgs) && orderItem.problemsImgs.length > 0) {
      const imgList = orderItem.problemsImgs.map((imgUrl, index) => ({
        url: imgUrl,
        name: `renew_img_${index}`,
        status: 'success' // 标记为已上传状态
      }));
4c54ad5d   刘淇   转工单 选择是 传紧急程度和...
254
      problemImgs.imgList.value = imgList;
7a96cf50   刘淇   重新提交
255
256
      problemImgs.rawImgList.value = imgList;
    }
3cbb8754   刘淇   动态字典
257
    // 4. 自动获取道路列表
7a96cf50   刘淇   重新提交
258
    if (orderItem.lat && orderItem.lon) {
3cbb8754   刘淇   动态字典
259
      getRoadListByBusiLine();
7a96cf50   刘淇   重新提交
260
261
    }
  };
3cbb8754   刘淇   动态字典
262
  // ========== 业务线相关方法 ==========
e6a04285   刘淇   单图情况 宽高70*70
263
264
  /**
   * 业务线切换事件:清空道路信息 + 重新请求道路列表
3cbb8754   刘淇   动态字典
265
   * selectedLabel 是选中的中文label
e6a04285   刘淇   单图情况 宽高70*70
266
   */
3cbb8754   刘淇   动态字典
267
268
269
270
271
272
  const handleBusiLineChange = (selectedLabel) => {
    // 根据中文label反向找到对应的value存入表单
    const selectedItem = busiLineOptions.value.find(item => item.label === selectedLabel)
    if (selectedItem) {
      workOrderForm.busiLine = selectedItem.value
    }
e6a04285   刘淇   单图情况 宽高70*70
273
274
275
276
277
278
279
280
281
282
    // 1. 清空已渲染的道路名称和表单字段
    workOrderForm.roadName = '';
    workOrderForm.roadId = 0;
    // 2. 清空道路名称列表数据
    roadNameList.value = [];
    // 3. 若已选择工单位置,重新请求对应业务线的道路列表
    if (workOrderForm.workLocation) {
      getRoadListByBusiLine();
    }
  };
e6a04285   刘淇   单图情况 宽高70*70
283
  /**
3cbb8754   刘淇   动态字典
284
   * 封装:根据当前选中业务线,请求道路列表
e6a04285   刘淇   单图情况 宽高70*70
285
286
   */
  const getRoadListByBusiLine = async () => {
3cbb8754   刘淇   动态字典
287
    if (!workOrderForm.lat || !workOrderForm.lon || !workOrderForm.busiLine) {
e6a04285   刘淇   单图情况 宽高70*70
288
289
      return;
    }
e6a04285   刘淇   单图情况 宽高70*70
290
291
292
    try {
      uni.showLoading({ title: '获取道路名称中...' });
      const roadRes = await getRoadListByLatLng({
3cbb8754   刘淇   动态字典
293
        busiLine: workOrderForm.busiLine,
e6a04285   刘淇   单图情况 宽高70*70
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
        latitude: workOrderForm.lat,
        longitude: workOrderForm.lon
      });
      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 }];
    }
  };
e6a04285   刘淇   单图情况 宽高70*70
315
  // ========== 通用弹窗方法 ==========
c7df828a   刘淇   快速工单 样式优化
316
  /**
fa775c6b   刘淇   养护计划调整
317
   * 打开通用下拉弹窗
c7df828a   刘淇   快速工单 样式优化
318
319
   */
  const handleActionSheetOpen = (type) => {
fa775c6b   刘淇   养护计划调整
320
321
322
    // 道路名称需先校验工单位置是否选择
    if (type === 'roadName' && !workOrderForm.workLocation) {
      uni.showToast({ title: '请先选择工单位置', icon: 'none' })
c7df828a   刘淇   快速工单 样式优化
323
324
      return
    }
fa775c6b   刘淇   养护计划调整
325
    // 配置当前弹窗参数
c7df828a   刘淇   快速工单 样式优化
326
    const configMap = {
fa775c6b   刘淇   养护计划调整
327
328
329
330
331
      roadName: {
        title: '请选择道路名称',
        list: roadNameList.value
      },
      orderName: {
c64da17b   刘淇   新的业务线
332
        title: '请选择问题类型',
fa775c6b   刘淇   养护计划调整
333
334
335
336
337
        list: orderNameList.value
      },
      pressingType: {
        title: '请选择紧急程度',
        list: pressingTypeList.value
d433e7f6   刘淇   工单
338
      }
c7df828a   刘淇   快速工单 样式优化
339
    }
c7df828a   刘淇   快速工单 样式优化
340
341
342
343
344
    currentActionSheetData.type = type
    currentActionSheetData.title = configMap[type].title
    currentActionSheetData.list = configMap[type].list
    showActionSheet.value = true
  }
c7df828a   刘淇   快速工单 样式优化
345
  /**
fa775c6b   刘淇   养护计划调整
346
   * 关闭通用下拉弹窗
c7df828a   刘淇   快速工单 样式优化
347
348
349
   */
  const handleActionSheetClose = () => {
    showActionSheet.value = false
fa775c6b   刘淇   养护计划调整
350
    // 重置当前弹窗配置
c7df828a   刘淇   快速工单 样式优化
351
352
353
354
    currentActionSheetData.type = ''
    currentActionSheetData.list = []
    currentActionSheetData.title = ''
  }
c7df828a   刘淇   快速工单 样式优化
355
  /**
fa775c6b   刘淇   养护计划调整
356
   * 通用下拉弹窗选择事件
c7df828a   刘淇   快速工单 样式优化
357
358
   */
  const handleActionSheetSelect = (e) => {
fa775c6b   刘淇   养护计划调整
359
360
361
362
363
364
365
366
367
368
369
370
371
372
    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)
7a96cf50   刘淇   重新提交
373
        workOrderForm.pressingType = e.value
fa775c6b   刘淇   养护计划调整
374
        workOrderForm.pressingTypeName = e.name
7a96cf50   刘淇   重新提交
375
        workOrderFormRef.value?.validateField('pressingTypeName')
fa775c6b   刘淇   养护计划调整
376
        break
c7df828a   刘淇   快速工单 样式优化
377
    }
fa775c6b   刘淇   养护计划调整
378
    // 关闭弹窗
c7df828a   刘淇   快速工单 样式优化
379
380
    showActionSheet.value = false
  }
fa775c6b   刘淇   养护计划调整
381
382
383
384
  /**
   * 返回上一页
   */
  const navigateBack = () => {
e6a04285   刘淇   单图情况 宽高70*70
385
386
387
388
389
390
391
392
    uni.reLaunch({
      url: '/pages-sub/problem/work-order-manage/index', // 列表页路径
      fail: () => {
        // 兜底:若 reLaunch 失败,返回2层(跳过提交页)
        uni.navigateBack({ delta: 2 });
      }
    });
  }
3cbb8754   刘淇   动态字典
393
394
395
  /**
   * 清除希望完成时间的方法
   */
6cc0ab0e   刘淇   养护任务
396
  const clearExpectedFinishDate = () => {
e6a04285   刘淇   单图情况 宽高70*70
397
    workOrderForm.expectedFinishDate = ''
fa775c6b   刘淇   养护计划调整
398
  }
fa775c6b   刘淇   养护计划调整
399
400
401
402
403
404
405
406
407
  /**
   * 选择工单位置
   */
  const chooseWorkLocation = () => {
    uni.chooseLocation({
      success: async (res) => {
        workOrderForm.roadName = ''
        workOrderForm.roadId = 0
        roadNameList.value = []
fa775c6b   刘淇   养护计划调整
408
409
410
        workOrderForm.workLocation = res.name
        workOrderForm.lat = res.latitude
        workOrderForm.lon = res.longitude
fa775c6b   刘淇   养护计划调整
411
412
        workOrderFormRef.value?.validateField('workLocation')
        workOrderFormRef.value?.validateField('roadName')
e6a04285   刘淇   单图情况 宽高70*70
413
        await getRoadListByBusiLine();
fa775c6b   刘淇   养护计划调整
414
415
416
417
418
419
420
      },
      fail: (err) => {
        console.error('选择位置失败:', err)
        uni.showToast({ title: '选择位置失败:' + err.errMsg, icon: 'none' })
      }
    })
  }
fa775c6b   刘淇   养护计划调整
421
422
423
  /**
   * 完成时间确认
   */
2f1e3176   刘淇   图片参数处理
424
  const expectedFinishDateConfirm = (e) => {
fa775c6b   刘淇   养护计划调整
425
    console.log('选择的完成时间:', e)
2f1e3176   刘淇   图片参数处理
426
    workOrderForm.expectedFinishDate = timeFormat(e.value, 'yyyy-mm-dd hh:MM:ss')
fa775c6b   刘淇   养护计划调整
427
428
    show.value = false
  }
c7df828a   刘淇   快速工单 样式优化
429
430
431
432
433
434
  /**
   * 隐藏键盘
   */
  const hideKeyboard = () => {
    uni.hideKeyboard()
  }
c7df828a   刘淇   快速工单 样式优化
435
  /**
3cbb8754   刘淇   动态字典
436
   * 提交工单
c7df828a   刘淇   快速工单 样式优化
437
438
439
   */
  const submitWorkOrder = async () => {
    try {
3cbb8754   刘淇   动态字典
440
      // 先执行表单校验
c7df828a   刘淇   快速工单 样式优化
441
      await workOrderFormRef.value.validate()
3cbb8754   刘淇   动态字典
442
      if (!workOrderForm.busiLine) {
e6a04285   刘淇   单图情况 宽高70*70
443
444
445
        uni.showToast({ title: '业务线选择异常,请重新选择', icon: 'none' });
        return;
      }
6cc0ab0e   刘淇   养护任务
446
      console.log('完成时间:' + workOrderForm.expectedFinishDate)
7a96cf50   刘淇   重新提交
447
448
      // 构建公共提交数据
      const commonSubmitData = {
fa775c6b   刘淇   养护计划调整
449
450
        roadId: workOrderForm.roadId,
        roadName: workOrderForm.roadName,
3cbb8754   刘淇   动态字典
451
        problemsImgs: problemImgs.getSuccessImgUrls(),
fa775c6b   刘淇   养护计划调整
452
453
454
455
456
457
458
        remark: workOrderForm.problemDesc.trim(),
        latLonType: 2,
        lat: workOrderForm.lat,
        lon: workOrderForm.lon,
        lonLatAddress: workOrderForm.workLocation,
        pressingType: workOrderForm.pressingType,
        orderName: workOrderForm.orderName,
6cc0ab0e   刘淇   养护任务
459
        expectedFinishDate: workOrderForm.expectedFinishDate == "" ? "" : new Date(workOrderForm.expectedFinishDate).getTime(),
fa775c6b   刘淇   养护计划调整
460
        sourceId: 1,
3cbb8754   刘淇   动态字典
461
462
        sourceName: busiLineOptions.value.find(item => item.value === workOrderForm.busiLine)?.label || '',
        busiLine: workOrderForm.busiLine
c7df828a   刘淇   快速工单 样式优化
463
      }
34d239d6   刘淇   全域巡查员
464
      console.log('工单数据')
6cc0ab0e   刘淇   养护任务
465
      console.log('完成时间:' + workOrderForm.expectedFinishDate)
34d239d6   刘淇   全域巡查员
466
      console.log(commonSubmitData)
fa775c6b   刘淇   养护计划调整
467
468
      // 显示加载中
      uni.showLoading({ title: '提交中...' })
7a96cf50   刘淇   重新提交
469
      let res
7a96cf50   刘淇   重新提交
470
471
472
      if (isRenew.value) {
        // 重新提交:调用 universalApproval 接口
        const renewSubmitData = {
7a96cf50   刘淇   重新提交
473
474
475
476
477
          workerDataId: renewOrderData.value.id,
          taskKey: renewOrderData.value.taskKey,
          taskId: renewOrderData.value.taskId,
          operateType: nextStepMap[renewOrderData.value.taskKey]?.operateTypeRenew || '',
          agree: 0,
34d239d6   刘淇   全域巡查员
478
          reason: workOrderForm.problemDesc.trim(),
7a96cf50   刘淇   重新提交
479
480
481
482
          ...commonSubmitData
        }
        res = await universalApproval(renewSubmitData)
      } else {
3cbb8754   刘淇   动态字典
483
        // 新增工单:调用原有 workorderCreate 接口
7a96cf50   刘淇   重新提交
484
485
        res = await workorderCreate(commonSubmitData)
      }
c7df828a   刘淇   快速工单 样式优化
486
487
      uni.hideLoading()
      uni.showToast({
7a96cf50   刘淇   重新提交
488
        title: isRenew.value ? '重新提交成功' : '工单提交成功',
c7df828a   刘淇   快速工单 样式优化
489
490
491
        icon: 'success',
        duration: 1000
      })
7a96cf50   刘淇   重新提交
492
      // 延迟跳转回列表页
c7df828a   刘淇   快速工单 样式优化
493
      setTimeout(() => {
4fa8cf12   刘淇   巡查员结束工单
494
        uni.reLaunch({
fa775c6b   刘淇   养护计划调整
495
          url: '/pages-sub/problem/work-order-manage/index'
c7df828a   刘淇   快速工单 样式优化
496
497
498
        })
      }, 1000)
    } catch (error) {
fa775c6b   刘淇   养护计划调整
499
      // 隐藏加载框
c7df828a   刘淇   快速工单 样式优化
500
      uni.hideLoading()
fa775c6b   刘淇   养护计划调整
501
      // 区分是表单校验失败还是接口调用失败
c7df828a   刘淇   快速工单 样式优化
502
      if (!Array.isArray(error)) {
fa775c6b   刘淇   养护计划调整
503
        // 接口调用失败
7a96cf50   刘淇   重新提交
504
        console.error(isRenew.value ? '工单重新提交失败:' : '工单提交失败:', error)
c7df828a   刘淇   快速工单 样式优化
505
        uni.showToast({
3cbb8754   刘淇   动态字典
506
          title: error.msg || '提交失败',
c7df828a   刘淇   快速工单 样式优化
507
508
509
          icon: 'none',
          duration: 2000
        })
d433e7f6   刘淇   工单
510
511
      }
    }
d433e7f6   刘淇   工单
512
  }
5822009a   刘淇   工单管理--新增工单
513
  </script>
5822009a   刘淇   工单管理--新增工单
514
515
  <style lang="scss" scoped>
  // 全局页面样式
c7df828a   刘淇   快速工单 样式优化
516
  .page-container {
fa775c6b   刘淇   养护计划调整
517
518
    min-height: 100vh;
    padding-bottom: 100rpx; // 给底部按钮留空间
d433e7f6   刘淇   工单
519
520
  }
  
fa775c6b   刘淇   养护计划调整
521
  // 工单表单内容容器
5822009a   刘淇   工单管理--新增工单
522
523
  .work-order-form-content {
    background: #fff;
d433e7f6   刘淇   工单
524
  }
3cbb8754   刘淇   动态字典
525
  </style>