|
|
@@ -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>
|