Bläddra i källkod

sgh5安全检查下发时自定义选择接收人

liuzhuo 1 vecka sedan
förälder
incheckning
9c26eb4876
1 ändrade filer med 250 tillägg och 7 borttagningar
  1. 250
    7
      src/view/safeCheck/safeCheck_item/index.vue

+ 250
- 7
src/view/safeCheck/safeCheck_item/index.vue Visa fil

@@ -89,6 +89,17 @@
89 89
           @click="showDateTimePicker = true"
90 90
           :rules="[{ required: true, message: '请选择整改时限' }]"
91 91
         />
92
+        <van-field
93
+          readonly
94
+          :model-value="xfRepairDisplaySummary"
95
+          label="整改责任人"
96
+          placeholder=""
97
+          is-link
98
+          @click="openXfRepairPicker"
99
+        />
100
+        <div style="padding: 0 16px 12px;">
101
+          <van-button size="small" type="primary" plain block @click="resetXfRepairToDefault">恢复系统默认</van-button>
102
+        </div>
92 103
       </van-form>
93 104
     </van-dialog>
94 105
 
@@ -127,12 +138,21 @@
127 138
       </van-time-picker>
128 139
     </van-popup>
129 140
 
141
+    <OrganizationalWithLeafUser
142
+        :key="xfRepairSessionKey"
143
+        ref="PopupDepartmentLeaderNameRefXfRepair"
144
+        :main-key="xfRepairSessionKey"
145
+        @receive-from-child="handleTableDataUpdateXfRepair"
146
+    />
147
+
130 148
   </div>
131 149
 </template>
132 150
 
133 151
 <script setup>
134
-import { ref, reactive, onMounted, getCurrentInstance, nextTick, toRaw } from 'vue';
135
-import { Dialog, showDialog, showSuccessToast, showToast, Toast } from 'vant';
152
+import { ref, computed, onMounted, getCurrentInstance, toRaw } from 'vue';
153
+import { showConfirmDialog, showSuccessToast, showToast } from 'vant';
154
+import OrganizationalWithLeafUser from '@/components/OrganizationalWithLeafUser.vue';
155
+import { workflowSubmit } from '@/tools/workflow.js';
136 156
 
137 157
 const { proxy } = getCurrentInstance();
138 158
 
@@ -370,9 +390,96 @@ const submitXFForm = ref({
370 390
   repairDdlText: ''
371 391
 });
372 392
 
393
+const guid = () => {
394
+  function S4() {
395
+    return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
396
+  }
397
+  return S4() + S4() + S4() + S4() + S4() + S4() + S4() + S4();
398
+};
399
+
400
+/** 下发隐患:整改责任人(默认岗位匹配,可选手工) */
401
+const PopupDepartmentLeaderNameRefXfRepair = ref(null);
402
+const xfRepairSessionKey = ref(guid());
403
+const xfRepairUseCustom = ref(false);
404
+const xfRepairUserCodes = ref('');
405
+const xfRepairUserNames = ref('');
406
+const defaultRepairL = ref('');
407
+
408
+const xfRepairDisplaySummary = computed(() => {
409
+  if (xfRepairUseCustom.value && xfRepairUserNames.value) {
410
+    return xfRepairUserNames.value;
411
+  }
412
+  const s = defaultRepairL.value || '';
413
+  const n = s ? s.split(';').filter(Boolean).length : 0;
414
+  if (n > 0) {
415
+    return `系统默认(已匹配 ${n} 人)`;
416
+  }
417
+  return '系统默认(未匹配到岗位人员时可点本行选择)';
418
+});
419
+
420
+const buildXfRepairSessionUsers = () => {
421
+  if (!xfRepairUseCustom.value || !xfRepairUserCodes.value) {
422
+    return [];
423
+  }
424
+  const codes = xfRepairUserCodes.value.split(',').map((c) => c.trim()).filter(Boolean);
425
+  const descs = xfRepairUserNames.value.split('、');
426
+  return codes.map((userCode, i) => ({
427
+    userCode,
428
+    userDesc: descs[i] != null ? descs[i] : ''
429
+  }));
430
+};
431
+
432
+const openXfRepairPicker = () => {
433
+  sessionStorage.setItem(xfRepairSessionKey.value, JSON.stringify(buildXfRepairSessionUsers()));
434
+  PopupDepartmentLeaderNameRefXfRepair.value?.open();
435
+};
436
+
437
+const handleTableDataUpdateXfRepair = (users) => {
438
+  if (!users || !users.length) {
439
+    resetXfRepairToDefault();
440
+    return;
441
+  }
442
+  const codes = [];
443
+  const descs = [];
444
+  for (const u of users) {
445
+    if (u && u.userCode) {
446
+      codes.push(u.userCode);
447
+      descs.push(u.userDesc || '');
448
+    }
449
+  }
450
+  if (!codes.length) {
451
+    showToast({ type: 'fail', message: '未解析到有效的整改人员' });
452
+    return;
453
+  }
454
+  xfRepairUserCodes.value = codes.join(',');
455
+  xfRepairUserNames.value = descs.join('、');
456
+  xfRepairUseCustom.value = true;
457
+};
458
+
459
+const resetXfRepairToDefault = () => {
460
+  xfRepairUseCustom.value = false;
461
+  xfRepairUserCodes.value = '';
462
+  xfRepairUserNames.value = '';
463
+};
464
+
373 465
 // 打开下发弹窗
374 466
 const handleSubmitXF = (row) => {
375 467
   currentSubmitRow.value = row;
468
+  xfRepairSessionKey.value = guid();
469
+  resetXfRepairToDefault();
470
+  defaultRepairL.value = '';
471
+  const repairDeptCode =
472
+    row.checkedDeptCode || query2.value?.checkedDeptCode || '';
473
+  if (repairDeptCode) {
474
+    proxy.$axios
475
+      .get('/sgsafe/Hiddendanger/queryUserIdByPostWithDeptCode', { deptCode: repairDeptCode })
476
+      .then((r) => {
477
+        if (r.data.code === 0 && r.data.data) {
478
+          defaultRepairL.value = r.data.data;
479
+        }
480
+      })
481
+      .catch(() => {});
482
+  }
376 483
   // 重置表单
377 484
   submitXFForm.value = {
378 485
     repairSuggest: '',
@@ -457,23 +564,157 @@ const confirmSubmitXF = async () => {
457 564
     const param = {
458 565
       json: JSON.stringify(submitData)
459 566
     };
460
-    
567
+
461 568
     const response = await proxy.$axios.post(url, param);
462
-    if (response.data.code === 0) {
569
+    if (response.data.code !== 0) {
570
+      showToast({
571
+        type: 'fail',
572
+        message: '操作失败!' + response.data.msg
573
+      });
574
+      return;
575
+    }
576
+
577
+    const data = response.data.data || {};
578
+    const hiddendangerId = data.hiddendangerId;
579
+    if (!hiddendangerId) {
463 580
       showToast({
464 581
         type: 'success',
465
-        message: '下发成功'
582
+        message: '保存成功'
466 583
       });
467 584
       submitXFDialogVisible.value = false;
468
-      // 刷新列表
585
+      resetXfRepairToDefault();
586
+      defaultRepairL.value = '';
469 587
       basicReset();
470 588
       onLoad();
589
+      return;
590
+    }
591
+
592
+    const row = currentSubmitRow.value;
593
+    const repairDeptCode =
594
+      row.checkedDeptCode || query2.value?.checkedDeptCode || '';
595
+
596
+    let repairL = '';
597
+    if (xfRepairUseCustom.value && xfRepairUserCodes.value) {
598
+      try {
599
+        const r = await proxy.$axios.post('sgsafe/Hiddendanger/qqId', {
600
+          params: xfRepairUserCodes.value
601
+        });
602
+        if (r.data.code === 0 && r.data.data) {
603
+          repairL = String(r.data.data)
604
+            .split(',')
605
+            .map((id) => 'U_' + id.trim())
606
+            .filter((x) => x.length > 2)
607
+            .join(';');
608
+        }
609
+      } catch (e) {
610
+        console.error('自定义整改人解析失败:', e);
611
+      }
612
+    }
613
+    if (!repairL && repairDeptCode) {
614
+      try {
615
+        const r = await proxy.$axios.get('/sgsafe/Hiddendanger/queryUserIdByPostWithDeptCode', {
616
+          deptCode: repairDeptCode
617
+        });
618
+        if (r.data.code === 0 && r.data.data) {
619
+          repairL = r.data.data;
620
+        }
621
+      } catch (e) {
622
+        console.error('获取整改人失败:', e);
623
+      }
624
+    }
625
+    if (!repairL) {
626
+      if (!repairDeptCode && !xfRepairUseCustom.value) {
627
+        showToast({
628
+          type: 'fail',
629
+          message: '受检部门代码为空,无法确定整改人,请点「选择」指定整改责任人'
630
+        });
631
+      } else if (xfRepairUseCustom.value) {
632
+        showToast({
633
+          type: 'fail',
634
+          message: '未能根据所选人员解析整改人,请重新选择或恢复系统默认'
635
+        });
636
+      } else {
637
+        showToast({
638
+          type: 'fail',
639
+          message: '未获取到整改人,请配置岗位人员或点「选择」手动指定'
640
+        });
641
+      }
642
+      submitXFDialogVisible.value = false;
643
+      resetXfRepairToDefault();
644
+      defaultRepairL.value = '';
645
+      basicReset();
646
+      onLoad();
647
+      return;
648
+    }
649
+
650
+    let acceptL = '';
651
+    if (row.checkPerson) {
652
+      try {
653
+        const r = await proxy.$axios.post('sgsafe/Hiddendanger/qqId', { params: row.checkPerson });
654
+        if (r.data.code === 0 && r.data.data) {
655
+          acceptL = String(r.data.data)
656
+            .split(',')
657
+            .map((id) => 'U_' + id.trim())
658
+            .join(';');
659
+        }
660
+      } catch (e) {
661
+        console.error('获取验收人失败:', e);
662
+      }
663
+    }
664
+    if (!acceptL) {
665
+      showToast({ type: 'fail', message: '验收人信息为空,无法提交审批' });
666
+      submitXFDialogVisible.value = false;
667
+      resetXfRepairToDefault();
668
+      defaultRepairL.value = '';
669
+      basicReset();
670
+      onLoad();
671
+      return;
672
+    }
673
+
674
+    try {
675
+      await showConfirmDialog({
676
+        title: '提示',
677
+        message: '确定提交审批?'
678
+      });
679
+    } catch {
680
+      showToast({ type: 'info', message: '已取消提交审批' });
681
+      submitXFDialogVisible.value = false;
682
+      resetXfRepairToDefault();
683
+      defaultRepairL.value = '';
684
+      basicReset();
685
+      onLoad();
686
+      return;
687
+    }
688
+
689
+    const variables = { id: hiddendangerId, repairL, acceptL };
690
+    const result = await workflowSubmit(
691
+      'hazardImmediatelyCM',
692
+      '隐患排查治理',
693
+      '初始化提交',
694
+      JSON.stringify(toRaw(variables)),
695
+      undefined,
696
+      undefined
697
+    );
698
+    if (result.status === 'success') {
699
+      await proxy.$axios.post('sgsafe/Hiddendanger/saveProcessInfo', {
700
+        json: JSON.stringify({
701
+          id: hiddendangerId,
702
+          workId: result.workId,
703
+          trackId: result.trackId
704
+        })
705
+      });
706
+      showSuccessToast('下发并提交审批成功');
471 707
     } else {
472 708
       showToast({
473 709
         type: 'fail',
474
-        message: '操作失败!' + response.data.msg
710
+        message: '提交审批失败,' + (result.msg || '')
475 711
       });
476 712
     }
713
+    submitXFDialogVisible.value = false;
714
+    resetXfRepairToDefault();
715
+    defaultRepairL.value = '';
716
+    basicReset();
717
+    onLoad();
477 718
   } catch (error) {
478 719
     console.error('下发失败:', error);
479 720
     showToast({
@@ -492,6 +733,8 @@ const cancelSubmitXF = () => {
492 733
     repairDdlText: ''
493 734
   };
494 735
   dateOrTime.value = false;
736
+  resetXfRepairToDefault();
737
+  defaultRepairL.value = '';
495 738
 };
496 739
 
497 740
 </script>

Loading…
Avbryt
Spara