Explorar el Código

移动端-通知公告模块-安全发布-新增文件编号自动拼接生成功能

liuzhuo hace 1 semana
padre
commit
ab57a86226

+ 245
- 34
src/view/announ/annexList.vue Ver fichero

24
   deptInformation.value = jsonArray ? JSON.parse(jsonArray) : [];
24
   deptInformation.value = jsonArray ? JSON.parse(jsonArray) : [];
25
 } catch (error) {
25
 } catch (error) {
26
   deptInformation.value = [];
26
   deptInformation.value = [];
27
+  console.error('解析部门信息失败:', error)
27
 }
28
 }
28
-const deptName = deptInformation.value[0].deptName
29
-const deptCode = deptInformation.value[0].deptCode
30
 
29
 
31
-const guid = () =>  {
32
-  function S4() {
33
-    return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
34
-  }
35
-  return (S4()+S4()+S4()+S4()+S4()+S4()+S4()+S4())
30
+
31
+const deptName = deptInformation.value[0]?.deptName || ''
32
+const deptCode = deptInformation.value[0]?.deptCode || ''
33
+
34
+//  如果部门信息为空,给出提示
35
+if (!deptCode) {
36
+  console.warn('部门编码为空,可能影响数据保存')
36
 }
37
 }
38
+
39
+
40
+
41
+// 添加:与Web端一致的 generateCode 函数
42
+const generateCode = () => {
43
+  // 获取当前日期并格式化为 YYYYMMDD
44
+  const now = new Date();
45
+  const year = now.getFullYear();
46
+  const month = String(now.getMonth() + 1).padStart(2, '0'); // 月份从0开始,需加1
47
+  const day = String(now.getDate()).padStart(2, '0');
48
+  const formattedDate = `${year}${month}${day}`;
49
+  
50
+  // 时间部分:HHmmss
51
+  const hours = String(now.getHours()).padStart(2, '0');
52
+  const minutes = String(now.getMinutes()).padStart(2, '0');
53
+  const seconds = String(now.getSeconds()).padStart(2, '0');
54
+  const formattedTime = `${hours}${minutes}${seconds}`;
55
+  
56
+  // 模拟生成三位流水号(可以根据需要替换为递增逻辑)
57
+  const sequenceNumber = Math.floor(Math.random() * 1000); // 随机生成 0-999
58
+  const paddedSequence = String(sequenceNumber).padStart(3, '0'); // 补零到三位
59
+  
60
+  // 拼接编号
61
+  return `LZFJ${formattedDate}${formattedTime}${paddedSequence}`;
62
+};
63
+
64
+// 使用 ref 存储生成的编号
65
+const generatedCode = ref(generateCode());
66
+
67
+// 定义重新生成编号的方法
68
+const regenerateCode = () => {
69
+  generatedCode.value = generateCode();
70
+};
71
+
37
 const formJieguo = ref({
72
 const formJieguo = ref({
38
   resultWhether:'',
73
   resultWhether:'',
39
   resultDetail:'',
74
   resultDetail:'',
49
 
84
 
50
 const result=ref('')
85
 const result=ref('')
51
 const fromVue=ref({})
86
 const fromVue=ref({})
87
+
88
+// 修复:新增时初始化基础字段(与Web端保持一致)
52
 if (route.query.mark) {
89
 if (route.query.mark) {
53
   planInfo = JSON.parse(route.query.mark)
90
   planInfo = JSON.parse(route.query.mark)
54
 }
91
 }
92
+
55
 console.log(planInfo);
93
 console.log(planInfo);
56
 if (planInfo==-1){
94
 if (planInfo==-1){
57
-  result.value=guid()
58
-  console.log( result.value);
95
+  // 新增模式:初始化基础字段(与Web端handAdd函数保持一致)
96
+  regenerateCode() // 重新生成编号
97
+  result.value = generatedCode.value // 使用 generateCode 生成的编号
98
+  fromVue.value = {
99
+    id: '',  // 新增时 id 为空字符串
100
+    fileName: '',
101
+    fileType: '',
102
+    fileContent: '',
103
+    fileTime: '',  // 添加:Web端有此字段
104
+    filePeoples: '',  // 添加:Web端有此字段
105
+    fileSubmit: '',
106
+    remarks: '',
107
+    enable: '',
108
+    fileNumber: '',
109
+    yearValue: '',  // H5端特有
110
+    fileId: result.value
111
+  }
112
+  console.log('生成的 fileId:', result.value);
59
 }
113
 }
60
 
114
 
61
 const resDetail=ref('')
115
 const resDetail=ref('')
80
   console.log(planInfo);
134
   console.log(planInfo);
81
   title = '修改安全文件'
135
   title = '修改安全文件'
82
   fromVue.value= JSON.parse(route.query.data)
136
   fromVue.value= JSON.parse(route.query.data)
83
-
84
   result.value=fromVue.value.fileId
137
   result.value=fromVue.value.fileId
85
   console.log(result.value);
138
   console.log(result.value);
86
 }
139
 }
100
 const isdisabled=ref(true)
153
 const isdisabled=ref(true)
101
 const isdisabled2=ref(true)
154
 const isdisabled2=ref(true)
102
 const onSelect = (item) => {
155
 const onSelect = (item) => {
103
-fromVue.value.fileContent = item.name
104
-
156
+  fromVue.value.fileContent = item.name
105
   showActionSheet.value=false
157
   showActionSheet.value=false
158
+  // 性质改变时也触发文件编号生成
159
+  generateFileSumbmit()
106
 }
160
 }
107
 
161
 
108
 const onSelect2 = (item) => {
162
 const onSelect2 = (item) => {
109
   fromVue.value.fileType=item.name
163
   fromVue.value.fileType=item.name
110
   showActionSheet2.value=false
164
   showActionSheet2.value=false
111
-  }
165
+  // 文件类别改变时触发文件编号生成
166
+  generateFileSumbmit()
167
+}
112
 
168
 
113
 const displayFileName = ref('')
169
 const displayFileName = ref('')
114
 const onSelect1 = (item) => {
170
 const onSelect1 = (item) => {
119
   console.log(result.value);
175
   console.log(result.value);
120
   showActionSheet1.value = false
176
   showActionSheet1.value = false
121
 }
177
 }
178
+
179
+const yearOptions = Array.from({ length: 10 }, (_, i) => {
180
+  const year = currentYear.value - 5 + i;  // 修复:使用 currentYear.value
181
+  return {
182
+    text: String(year),
183
+    value: String(year)
184
+  };
185
+}).reverse();
186
+const showYearPicker = ref(false);
187
+
188
+const formData = ref({
189
+  year: String(currentYear.value),  // 修复:使用 currentYear.value
190
+  quarter: null
191
+})
192
+
193
+// 年份选择确认
194
+const onConfirmYear = (value) => {
195
+  let selectedYear = '';
196
+  if (value && value.selectedOptions && value.selectedOptions.length > 0) {
197
+    const selectedOption = value.selectedOptions[0];
198
+    selectedYear = typeof selectedOption === 'string' ? selectedOption : selectedOption.value || selectedOption.text;
199
+  } else if (typeof value === 'string') {
200
+    selectedYear = value;
201
+  }
202
+
203
+  formData.value.year = selectedYear;
204
+  fromVue.value.yearValue = selectedYear; // 修复:同步到 fromVue
205
+  showYearPicker.value = false;
206
+  // 触发文件编号生成,而不是调用不存在的 search()
207
+  generateFileSumbmit();
208
+}
209
+
210
+
122
 const questionIds = ref([])
211
 const questionIds = ref([])
123
 const actions=ref([])
212
 const actions=ref([])
124
 /*const getQuestionId = () => {
213
 /*const getQuestionId = () => {
129
       questionIds.value = response.data.data; // 先赋值给 questionIds.value
218
       questionIds.value = response.data.data; // 先赋值给 questionIds.value
130
 
219
 
131
 
220
 
132
-      // 关键:使用 questionIds.value.map
221
+      // 关键:使用 questionIds.value.map
133
       actions.value = questionIds.value.map(item => ({
222
       actions.value = questionIds.value.map(item => ({
134
         name: item.ruleName,
223
         name: item.ruleName,
135
         value: item.id
224
         value: item.id
181
 }
270
 }
182
 
271
 
183
 const addEmergencyDrillPlan = async () => {
272
 const addEmergencyDrillPlan = async () => {
273
+  // 参数验证
274
+  if (!deptCode) {
275
+    showFailToast('获取部门信息失败,请重新登录')
276
+    return
277
+  }
278
+  
279
+  if (!result.value) {
280
+    showFailToast('文件ID生成失败,请重试')
281
+    return
282
+  }
283
+  
284
+  // 表单验证
285
+  if (!fromVue.value.fileName) {
286
+    showFailToast('请输入文件名称')
287
+    return
288
+  }
289
+  
290
+  if (!fromVue.value.fileType) {
291
+    showFailToast('请选择文件类别')
292
+    return
293
+  }
294
+  
184
   const loadingToast = showLoadingToast({
295
   const loadingToast = showLoadingToast({
185
     duration: 0,
296
     duration: 0,
186
     message: '加载中',
297
     message: '加载中',
187
     forbidClick: true
298
     forbidClick: true
188
   })
299
   })
189
-  var url = '/sgsafe/ResponFile/save1';
190
-  const params = {
191
-    json: JSON.stringify(fromVue.value)
192
-  }
193
-  proxy.$axios.post(url,params).then(res=>{
300
+  
301
+  try {
302
+    // 与Web端保持一致:只设置 addDeptCode,其他字段已经在 fromVue.value 中
303
+    fromVue.value.addDeptCode = deptCode
304
+    
305
+    // 确保 fileId 正确设置
306
+    if (!fromVue.value.fileId) {
307
+      fromVue.value.fileId = result.value
308
+    }
309
+    
310
+    // 确保文件编号已生成
311
+    if (!fromVue.value.fileSubmit && fromVue.value.fileType && fromVue.value.yearValue) {
312
+      generateFileSumbmit()
313
+    }
314
+    
315
+    // 调试:打印完整数据(与Web端保持一致)
316
+    console.log('保存的数据:', JSON.stringify(fromVue.value))
317
+    
318
+    var url = '/sgsafe/ResponFile/save1';
319
+    const params = {
320
+      json: JSON.stringify(fromVue.value)
321
+    }
322
+    
323
+    const res = await proxy.$axios.post(url, params)
324
+    
194
     if (res.data.code === 0) {
325
     if (res.data.code === 0) {
195
       loadingToast.close()
326
       loadingToast.close()
196
       showSuccessToast('保存成功')
327
       showSuccessToast('保存成功')
197
       onClickLeft()
328
       onClickLeft()
198
-
199
     } else {
329
     } else {
200
       loadingToast.close()
330
       loadingToast.close()
201
-      showFailToast('操作失败!' + res.data.msg)
331
+      showFailToast('操作失败!' + (res.data.msg || '未知错误'))
202
     }
332
     }
203
-  })
333
+  } catch (error) {
334
+    loadingToast.close()
335
+    console.error('保存失败:', error)
336
+    // 打印详细错误信息
337
+    console.error('错误详情:', error.response?.data || error)
338
+    showFailToast('保存失败:' + (error.message || '网络错误,请稍后重试'))
339
+  }
204
 }
340
 }
205
 const showDatePicker = ref(false)
341
 const showDatePicker = ref(false)
206
 const onDatePicker = (value) => {
342
 const onDatePicker = (value) => {
214
 //获取字典集合
350
 //获取字典集合
215
 import tools from '@/tools'
351
 import tools from '@/tools'
216
 const getDicList = () => {
352
 const getDicList = () => {
217
-  tools.dic.getDicList(['systemTypes']).then((response => {
218
-
219
-   const rawData = response.data.data
220
-    dicList.value = rawData.systemTypes.map(item => ({
221
-      name: item.dicName,      // 必须有 name 字段!
222
-      code: item.dicCode       // 可选,保留原始 code 供后续使用
353
+  // 修复:使用 'fileTypes' 而不是 'systemTypes'
354
+  tools.dic.getDicList(['fileTypes']).then((response => {
355
+    const rawData = response.data.data
356
+    // 修复:使用 fileTypes 而不是 systemTypes,value 使用 dicName
357
+    dicList.value = rawData.fileTypes.map(item => ({
358
+      name: item.dicName,      // 使用 dicName
359
+      value: item.dicName       // value 也使用 dicName,与 web 端保持一致
223
     }));
360
     }));
224
     console.log(JSON.stringify(dicList.value))
361
     console.log(JSON.stringify(dicList.value))
225
   }))
362
   }))
226
 }
363
 }
364
+
365
+// 新增:文件编号自动生成函数
366
+const generateFileSumbmit = () => {
367
+  let fileSubmit = ''
368
+  
369
+  // 1. 根据文件类别拼接前缀
370
+  if (fromVue.value.fileType && fromVue.value.fileType !== '其他') {
371
+    const prefixMap = {
372
+      '安全正式发文': '山信安管便字',
373
+      '安全管理便文': '山信软件安字',
374
+      '环保正式发文': '山信软件环字',
375
+      '安委会纪要': '山信软件纪要安委字'
376
+    }
377
+    const prefix = prefixMap[fromVue.value.fileType]
378
+    if (prefix) {
379
+      fileSubmit += prefix
380
+    }
381
+  }
382
+  
383
+  // 2. 拼接年份
384
+  if (fromVue.value.yearValue) {
385
+    fileSubmit += `〔${fromVue.value.yearValue}〕`
386
+  }
387
+  
388
+  // 3. 拼接编号
389
+  if (fromVue.value.fileNumber) {
390
+    fileSubmit += `${fromVue.value.fileNumber}号`
391
+  }
392
+  
393
+  // 更新文件编号
394
+  fromVue.value.fileSubmit = fileSubmit
395
+}
396
+
227
 onMounted(() => {
397
 onMounted(() => {
228
   const today = new Date()
398
   const today = new Date()
229
   const year = today.getFullYear()
399
   const year = today.getFullYear()
230
-  const month = today.getMonth() + 1 // 月份从 0 开始
400
+  const month = today.getMonth() + 1
231
   const day = today.getDate()
401
   const day = today.getDate()
232
   currentDate.value = [year, month, day]
402
   currentDate.value = [year, month, day]
233
-  //selectedDateText.value = `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}`
403
+  
404
+  // 新增:初始化年份值
405
+  if (!fromVue.value.yearValue) {
406
+    fromVue.value.yearValue = String(year)
407
+    formData.value.year = String(year)
408
+  }
409
+  
234
   getDicList()
410
   getDicList()
411
+  
412
+  // 新增:如果是编辑模式,初始化文件编号生成
413
+  if (planInfo == 1) {
414
+    generateFileSumbmit()
415
+  }
235
 })
416
 })
236
 const showActionSheet2=ref(false)
417
 const showActionSheet2=ref(false)
237
 /* 文件上传 */
418
 /* 文件上传 */
240
 const onSubmit = (values) => {
421
 const onSubmit = (values) => {
241
   addEmergencyDrillPlan()
422
   addEmergencyDrillPlan()
242
 }
423
 }
243
-const leaderKeyysr = guid();
424
+const leaderKeyysr = generateCode(); // 或者保留 guid 用于其他用途
244
 const PopupDepartmentLeaderNameRefysr = ref();
425
 const PopupDepartmentLeaderNameRefysr = ref();
245
 const handleDepartmentLeaderNameysr = () => {
426
 const handleDepartmentLeaderNameysr = () => {
246
   PopupDepartmentLeaderNameRefysr.value.open();
427
   PopupDepartmentLeaderNameRefysr.value.open();
266
     </van-sticky>
447
     </van-sticky>
267
     <div class="scroll-container">
448
     <div class="scroll-container">
268
       <van-form @submit="onSubmit">
449
       <van-form @submit="onSubmit">
450
+        <!-- 修复:文件编号改为只读,提示自动生成 -->
269
         <van-field
451
         <van-field
270
           v-model="fromVue.fileSubmit"
452
           v-model="fromVue.fileSubmit"
271
           label="文件编号"
453
           label="文件编号"
272
           name="fileSubmit"
454
           name="fileSubmit"
273
           required
455
           required
274
-          placeholder="请输入文件编号"
456
+          placeholder="选择文件类别、年份、编号后自动生成"
457
+          readonly
275
           :rules="[{required: true, message: '请输入文件编号'}]"
458
           :rules="[{required: true, message: '请输入文件编号'}]"
276
         />
459
         />
277
 
460
 
280
           label="名称"
463
           label="名称"
281
           name="fileName"
464
           name="fileName"
282
           required
465
           required
283
-          placeholder="请输入文件编号"
466
+          placeholder="请输入文件名称"
284
           :rules="[{required: true, message: '请输入文件名称'}]"
467
           :rules="[{required: true, message: '请输入文件名称'}]"
285
         />
468
         />
286
 
469
 
292
           required
475
           required
293
           @click="showActionSheet2 = true"
476
           @click="showActionSheet2 = true"
294
         />
477
         />
478
+        
479
+        <van-field
480
+          :model-value="fromVue.yearValue"
481
+          is-link
482
+          readonly
483
+          name="yearValue"
484
+          label="年份"
485
+          placeholder="点击选择年份"
486
+          @click="showYearPicker = true"
487
+        />
488
+        <van-popup v-model:show="showYearPicker" position="bottom">
489
+          <van-picker
490
+            :columns="yearOptions"
491
+            @confirm="onConfirmYear"
492
+            @cancel="showYearPicker = false"
493
+          />
494
+        </van-popup>
495
+        
496
+        <!-- 新增:编号输入框 -->
497
+        <van-field
498
+          v-model="fromVue.fileNumber"
499
+          label="编号"
500
+          name="fileNumber"
501
+          placeholder="请输入编号"
502
+          @input="generateFileSumbmit"
503
+        />
504
+        
295
         <van-field
505
         <van-field
296
           readonly
506
           readonly
297
           v-model="fromVue.fileContent"
507
           v-model="fromVue.fileContent"
304
           v-model="fromVue.remarks"
514
           v-model="fromVue.remarks"
305
           label="备注"
515
           label="备注"
306
           name="remarks"
516
           name="remarks"
307
-
308
         />
517
         />
518
+        
309
         <van-field label="附件上传" >
519
         <van-field label="附件上传" >
310
           <template #input>
520
           <template #input>
311
             <AttachmentS3 :f-id="result" />
521
             <AttachmentS3 :f-id="result" />
312
           </template>
522
           </template>
313
         </van-field>
523
         </van-field>
524
+        
314
         <div style="margin: 16px;">
525
         <div style="margin: 16px;">
315
           <van-button round block type="primary" native-type="submit">
526
           <van-button round block type="primary" native-type="submit">
316
             提交
527
             提交

+ 1
- 1
src/view/knowledge/accidentList.vue Ver fichero

303
       questionIds.value = response.data.data; // 先赋值给 questionIds.value
303
       questionIds.value = response.data.data; // 先赋值给 questionIds.value
304
 
304
 
305
 
305
 
306
-      // ✅ 关键:使用 questionIds.value.map
306
+
307
       actions.value = questionIds.value.map(item => ({
307
       actions.value = questionIds.value.map(item => ({
308
         name: item.ruleName,
308
         name: item.ruleName,
309
         value: item.id
309
         value: item.id

+ 0
- 1
src/view/knowledge/managerList.vue Ver fichero

216
       questionIds.value = response.data.data; // 先赋值给 questionIds.value
216
       questionIds.value = response.data.data; // 先赋值给 questionIds.value
217
 
217
 
218
 
218
 
219
-      // ✅ 关键:使用 questionIds.value.map
220
       actions.value = questionIds.value.map(item => ({
219
       actions.value = questionIds.value.map(item => ({
221
         name: item.ruleName,
220
         name: item.ruleName,
222
         value: item.id
221
         value: item.id

+ 0
- 1
src/view/moneySafe/safeMoneyManagementList.vue Ver fichero

288
       questionIds.value = response.data.data; // 先赋值给 questionIds.value
288
       questionIds.value = response.data.data; // 先赋值给 questionIds.value
289
 
289
 
290
 
290
 
291
-      // ✅ 关键:使用 questionIds.value.map
292
       actions.value = questionIds.value.map(item => ({
291
       actions.value = questionIds.value.map(item => ({
293
         name: item.ruleName,
292
         name: item.ruleName,
294
         value: item.id
293
         value: item.id

Loading…
Cancelar
Guardar