@lambo-design/workflow-approve 1.0.0-beta.56 → 1.0.0-beta.58

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,696 +1,696 @@
1
- <template>
2
- <div>
3
- <Modal v-model="modalBoxShow" width="1217" title="选择办理人" @on-ok="onOk" @on-cancel="onCancel" loading>
4
- <div class="org-info">
5
- <div class="org-tree">
6
- <div class="tree-content">
7
- <div v-if="treeData.length === 0">暂无数据</div>
8
- <Tree v-else v-for="(item,index) in treeData" :key="index" :data="item" ref="treeBM"
9
- :load-data="loadData" @on-select-change="selectChange"></Tree>
10
- <!-- <Tree :data="treeData" :load-data="loadData" @on-select-change="selectChange"></Tree>-->
11
- </div>
12
- </div>
13
- <div class="org-detil">
14
- <LamboPagingTable ref="selection" :dataUrl="dataUrl" :columns="tableColumn" :searchParams="tableSearchParams"
15
- @on-selection-change="onSelectionChange">
16
- <div slot="search">
17
- <Form :label-width="80">
18
- <FormItem label="账号">
19
- <Input v-model="form.userId" placeholder="按账号搜索" />
20
- </FormItem>
21
- <FormItem label="姓名">
22
- <Input v-model="form.userName" placeholder="按姓名搜索" />
23
- </FormItem>
24
- <FormItem label="是否管理员" prop="isAdmin" :labelWidth="100">
25
- <RadioGroup v-model="form.isAdmin">
26
- <Radio label="">全部</Radio>
27
- <Radio label="1">是</Radio>
28
- <Radio label="0">否</Radio>
29
- </RadioGroup>
30
- </FormItem>
31
- <FormItem>
32
- <Button type="primary" icon="ios-search" @click="doSearch">查询</Button>
33
- </FormItem>
34
- </Form>
35
- </div>
36
- </LamboPagingTable>
37
-
38
- </div>
39
- </div>
40
-
41
-
42
- </Modal>
43
- </div>
44
- </template>
45
-
46
- <script>
47
- import ajax from "@lambo-design/shared/utils/ajax";
48
- import LamboPagingTable from '@lambo-design/paging-table'
49
-
50
- export default {
51
- name: "UserHelpBox",
52
- components: {
53
- LamboPagingTable
54
- },
55
- props: {
56
- data: {
57
- type: Object,
58
- default: () => {
59
- return {}
60
- }
61
- },
62
- //按钮执行完毕回调方法
63
- executionCompleted: {
64
- type: Function,
65
- required: false,
66
- },
67
- smartFlowServerContext: {
68
- type: String,
69
- default: '/api/smart-flow-server',
70
- },
71
- upmsServerContext: {
72
- type: String,
73
- default: '/api/upms-server',
74
- },
75
- },
76
- data() {
77
- return {
78
- id: '',
79
- helpBoxType: 'transferCurTask',
80
- ucAdapterType: 'x1',
81
- loading: false,
82
- organTreeType: '00',
83
- permScope: 'all',
84
- modalBoxShow: false,
85
- dataUrl:'',
86
- helpBoxColumns: [
87
- {
88
- title: "用户ID",
89
- key: "userId",
90
- sortable: "custom",
91
- },
92
- {
93
- title: "用户姓名",
94
- key: "userName",
95
- },
96
- {
97
- title: "部门名称",
98
- key: "organName",
99
- },
100
- ],
101
- helpBoxTitle: "用户选择框",
102
- targetDomId:"",
103
- treeData: [],
104
- idSelectedArr: [],
105
- currentNode: {},
106
- form: {
107
- userId: '',
108
- userName: '',
109
- organId: '',
110
- organTitle: '',
111
- directChild: false,
112
- isAdmin: ''
113
- },
114
- tableSearchParams: {},
115
- };
116
- },
117
- created () {
118
- this.getSystemConfig()
119
- },
120
- computed: {
121
-
122
- tableColumn () {
123
- let columns = []
124
- let self = this
125
- columns.push({
126
- title: '#',
127
- key: 'selectId',
128
- type: 'selection',
129
- align: 'center',
130
- width: 55
131
- })
132
- columns.push({
133
- title: '账号',
134
- key: 'userId',
135
- sortField: 'user_id',
136
- sortable: 'custom'
137
- })
138
- columns.push({
139
- title: '姓名',
140
- key: 'userName',
141
- sortField: 'user_name',
142
- sortable: 'custom'
143
- })
144
- columns.push({
145
- title: '部门名称',
146
- key: 'organName',
147
- sortField: 'organ_name',
148
- sortable: 'custom'
149
- })
150
- columns.push({
151
- title: '状态',
152
- key: 'status',
153
- sortable: 'custom',
154
- align: 'center',
155
- width: 100,
156
- render: function (h, param) {
157
- let state = param.row.status
158
- if (state === '00') {
159
- state = '正常'
160
- } else {
161
- state = '锁定'
162
- }
163
- return h('span', state)
164
- }
165
- })
166
-
167
- return columns
168
- }
169
- },
170
- inject: ['toBeDoneListDoSearch'],
171
- methods: {
172
- init (organTreeType) {
173
- let self = this
174
- self.organTreeType = organTreeType
175
- self.getRootData(organTreeType)
176
- },
177
- clearData(){
178
- this.idSelectedArr = []
179
- //清除表格数据
180
- this.doSearch()
181
- },
182
- toggleShowHelpBox(organTreeType, permScope, helpBoxType, id) {
183
- this.clearData()
184
- this.id = id
185
- this.helpBoxType = helpBoxType
186
- this.organTreeType = organTreeType
187
- this.permScope = permScope
188
- if (permScope && permScope !== 'all'){
189
- this.getOrgTreeByProType(this.permScope, this.organTreeType)
190
- } else {
191
- this.permScopeList = 'all'
192
- this.getRootData(organTreeType)
193
- }
194
- this.modalBoxShow = !this.modalBoxShow;
195
- this.$forceUpdate()
196
- },
197
-
198
- onOk(){
199
- let self = this
200
- let idSelectedArr = self.idSelectedArr
201
- self.loading = true
202
- if (self.helpBoxType ==='addMultitaskInstance'){
203
- idSelectedArr = [...new Set(idSelectedArr)]
204
- const assingeeList = idSelectedArr.map(item => item.split(',')[0])
205
- self.$emit('add-multitask-instance', assingeeList);
206
- } else {
207
- if (idSelectedArr.length > 1) {
208
- self.loading = false
209
- self.$Message.info('办理人只能选择一条记录!')
210
- this.$emit('update-selected', ''); // 触发事件并传递 userId
211
- } else {
212
- let idSelectedArr = self.idSelectedArr[0].split(',')
213
- if (self.helpBoxType === 'transferCurTask'){
214
- let auditResult = {
215
- code: self.data.auditResult,
216
- name: self.data.auditResultName,
217
- }
218
- self.data.selectedUserId=idSelectedArr[0];
219
- let url = this.smartFlowServerContext + '/manage/processTodo/audit'
220
- ajax.post(url, self.data).then(function (resp) {
221
- let result = resp.data
222
- if (result.code == '200') {
223
- self.loading = false
224
- self.$Message.success(result.message);
225
- if (self.executionCompleted) {
226
- self.executionCompleted(true, self.data.instanceId, self.data.taskId, auditResult, self.data.taskId);
227
- }
228
- self.toBeDoneListDoSearch();
229
- } else {
230
- self.loading = false
231
- self.$Message.error(result.message)
232
- if (self.executionCompleted) {
233
- self.executionCompleted(false, null, null, auditResult, self.data.taskId);
234
- }
235
- }
236
- })
237
- } else if (self.helpBoxType === 'delegateTask'){
238
- self.$emit('delegate-task-assignee', idSelectedArr[0]);
239
- } else {
240
- self.$emit('update-next-node-assignee', idSelectedArr[0], idSelectedArr[1], self.id);
241
- }
242
- }
243
- }
244
- this.modalBoxShow = false;
245
- },
246
-
247
- doSearch: function () {
248
- this.tableSearchParams = Object.assign({}, this.form)
249
- },
250
- onSelectionChange: function (selection) {
251
- let self = this
252
- // self.idSelectedArr = []
253
- if (self.helpBoxType !== 'addMultitaskInstance' && selection.length > 1) {
254
- self.$Message.info('只能选择一条记录!')
255
- this.$refs.selection.selectAll(false);
256
- }
257
- for (let item of selection) {
258
- self.idSelectedArr.push(item.userId + ',' + item.userName)
259
- }
260
- },
261
- loadData (node, callback) {
262
- this.getData(node, function (data) {
263
- if (data.length > 0) {
264
- callback(data)
265
- }
266
- })
267
- },
268
- getRootData (organTreeType) {
269
- let self = this
270
- let hostChilds = []
271
- if (self.ucAdapterType === 'x1'){
272
- let parentId = organTreeType == '00' ? 'rootId' : '0'
273
- ajax.get(self.smartFlowServerContext + '/manage/organ/getOrgSubNodes', {
274
- params: {
275
- code: parentId,
276
- orgTreeType: organTreeType
277
- }
278
- }).then(resp => {
279
- if (resp.data.code === 200) {
280
- let data = resp.data.data
281
- if (data.length > 0) {
282
- data.forEach(item => {
283
- let obj = {}
284
- obj.type = item.organType
285
- obj.id = item.id
286
- obj.organId = item.organId
287
- obj.orders = item.orders
288
- obj.title = item.organName
289
- obj.name = item.organName
290
- obj.com = item.com
291
- obj.code = item.organCode
292
- obj.loading = false
293
- obj.children = []
294
- obj.hasChild = true
295
- hostChilds.push(obj)
296
- })
297
- self.treeData.push(hostChilds)
298
- const codesSeen = new Map();
299
- self.treeData = self.treeData.reduce((acc, item, index) => {
300
- if (!codesSeen.has(item.code)) {
301
- codesSeen.set(item.code, index);
302
- acc.push(item);
303
- }
304
- return acc;
305
- }, []);
306
- self.selectChange(self.treeData[0])
307
- }
308
- }
309
- }).catch(err => {
310
- console.log(err);
311
- })
312
- } else {
313
- ajax.get(self.smartFlowServerContext + '/manage/bizorgan/getOrgRootTree?bizOrganTreeType=' + organTreeType).then(resp => {
314
- if (resp.data.code === 200) {
315
- let data = resp.data.data
316
- if (data.length > 0) {
317
- for (let i = 0; i < data.length; i++) {
318
- {
319
- let obj = {}
320
- obj.type = data[i].bizOrganType
321
- obj.id = data[i].id
322
- obj.organId = data[i].bizOrganId
323
- obj.orders = data[i].orders
324
- obj.title = data[i].bizOrganName
325
- obj.name = data[i].bizOrganName
326
- obj.com = data[i].bizOrganId
327
- obj.code = data[i].bizOrganCode
328
- obj.loading = false
329
- obj.children = []
330
- obj.hasChild = true
331
- hostChilds.push(obj)
332
- self.treeData.push(hostChilds);
333
- const codesSeen = new Map();
334
- self.treeData = self.treeData.reduce((acc, item, index) => {
335
- if (!codesSeen.has(item.code)) {
336
- codesSeen.set(item.code, index);
337
- acc.push(item);
338
- }
339
- return acc;
340
- }, []);
341
- }
342
- }
343
- self.selectChange(self.treeData[0])
344
- }
345
- }
346
- }).catch(err => {
347
- console.log(err);
348
- })
349
- }
350
- },
351
- async getOrgTreeByProType(permScope, organTreeType){
352
- let self = this
353
- let userPermScope = permScope.substring(permScope.indexOf("U:"))
354
- userPermScope = userPermScope.substring(2, userPermScope.indexOf(","))
355
- let permScopeTwo = userPermScope.split(';')
356
- if (permScopeTwo.length > 0 && permScopeTwo[0]){
357
- self.permScopeList = 'U:' + userPermScope + ','
358
- let promises = []
359
- for (let i = 0; i < permScopeTwo.length; i++) {
360
- let promise = ajax.get(self.smartFlowServerContext + "/manage/user/get/" + permScopeTwo[i] + '?treeType=' + organTreeType)
361
- .then(resp => {
362
- if (resp.data.code === 200) {
363
- return resp.data.data.organCode
364
- }
365
- })
366
- promises.push(promise)
367
- }
368
- Promise.all(promises).then(async (result) => {
369
- const uniqueResults = [...new Set(result.filter(Boolean))];
370
- permScope = uniqueResults.join(';');
371
- self.treeData = await this.getOrganTreeByProType(permScope, permScope, organTreeType);
372
- self.selectChange(self.treeData[0])
373
- })
374
- } else {
375
- //对于流程类型中没有规定人员范围但规定组织范围的情况
376
- self.treeData = await this.getOrganTreeByProType(permScope, permScope.substring(2, permScope.indexOf(",")), organTreeType);
377
- self.selectChange(self.treeData[0])
378
- }
379
- },
380
- getOrganTreeByProType(row, permScope, organTreeType) {
381
- const self = this
382
- return new Promise((resolve, reject) => {
383
- let organTree = [];
384
- let childsTree = [];
385
- if (permScope && permScope.length > 0) {
386
- let params = {
387
- orgTreeType: organTreeType,
388
- };
389
- permScope = permScope.split(';');
390
-
391
- const requests = permScope.map(perm => {
392
- return ajax.get(self.smartFlowServerContext + '/manage/organ/get/' + perm, { params: params })
393
- .then(resp => {
394
- if (resp.data.code === 200) {
395
- return resp.data.data;
396
- } else {
397
- return [];
398
- }
399
- })
400
- .catch(err => {
401
- console.error(err);
402
- return [];
403
- });
404
- });
405
-
406
- Promise.all(requests)
407
- .then(results => {
408
- let tree
409
- if (self.ucAdapterType === 'x1'){
410
- tree = self.x1OrganTree(results)
411
- } else {
412
- tree = self.scOrganTree(results)
413
- }
414
- for (let value of tree) {
415
- self.formatOrganTree(value, childsTree, organTreeType)
416
- }
417
-
418
- organTree.push(childsTree);
419
- const codesSeen = new Map();
420
- organTree = organTree.reduce((acc, item, index) => {
421
- if (!codesSeen.has(item.code)) {
422
- codesSeen.set(item.code, index);
423
- acc.push(item);
424
- }
425
- return acc;
426
- }, []);
427
- resolve(organTree);
428
- })
429
- .catch(err => {
430
- reject(err);
431
- });
432
- } else {
433
- resolve([]);
434
- }
435
- });
436
- },
437
- x1OrganTree(results){
438
- const nodeMap = new Map();
439
- results.forEach(item => {
440
- const organCode = item.organCode
441
- const organStruPath = item.organStruPath
442
- const parts = organStruPath.split('#').filter(p => p);
443
- let currentNode = nodeMap.get(organCode) || { organCode, organStruPath, item, children: []};
444
- currentNode.parts = parts;
445
- nodeMap.set(organCode, currentNode);
446
- });
447
- nodeMap.forEach(node => {
448
- const { organCode, parts } = node;
449
- let parentCode = null;
450
- for (let i = 0; i < parts.length - 1; i++) {
451
- parentCode = parts[i];
452
- const parentNode = nodeMap.get(parentCode);
453
-
454
- if (parentNode) {
455
- if (parentNode.organId === node.item.parentId && !parentNode.children.some(child => child.organCode === organCode)) {
456
- parentNode.children.push(node);
457
- } else {
458
- // 如果直接父节点不在流程类型范围内但祖宗节点在
459
- let children = parentNode.children;
460
- for (let j = i + 1; j < parts.length - 1; j++) {
461
- const partCode = parts[j];
462
- let existingChild = children.find(child => child.organCode === partCode);
463
-
464
- if (!existingChild) {
465
- existingChild = { organCode: partCode, children: [] };
466
- children.push(existingChild);
467
- }
468
- children = existingChild.children;
469
- }
470
- // 将当前节点添加到最后一个子节点的 children 中
471
- children.push(node);
472
- }
473
- nodeMap.delete(organCode);
474
- break;
475
- }
476
- }
477
-
478
- });
479
- return nodeMap.values()
480
- },
481
- scOrganTree(results){
482
- const nodeMap = new Map();
483
- results.forEach(item => {
484
- const organId = item.organId
485
- const parentId = item.parentId
486
- let currentNode = nodeMap.get(organId) || { organId, parentId, item, children: []};
487
- nodeMap.set(organId, currentNode);
488
- });
489
- const tree = [];
490
- nodeMap.forEach((node, organId) => {
491
- const parentId = node.parentId;
492
-
493
- // 如果有父节点,则将当前节点添加到父节点的 children 数组中
494
- if (parentId && nodeMap.has(parentId)) {
495
- const parentNode = nodeMap.get(parentId);
496
- parentNode.children.push(node);
497
- } else {
498
- tree.push(node);
499
- }
500
- });
501
- return tree
502
- },
503
- formatOrganTree(nodeMap, childsTree, organTreeType){
504
- const self = this
505
- let obj = {}
506
- if (nodeMap.item){
507
- obj = {
508
- type: nodeMap.item.organType,
509
- id: nodeMap.item.id,
510
- organId: nodeMap.item.organId,
511
- orders: nodeMap.item.orders,
512
- title: nodeMap.item.organName,
513
- name: nodeMap.item.organName,
514
- com: nodeMap.item.organId,
515
- code: nodeMap.item.organCode,
516
- loading: false,
517
- checked: false,
518
- hasChild: true,
519
- children: [],
520
- };
521
- if (nodeMap.children && nodeMap.children.length > 0){
522
- for (let child of nodeMap.children){
523
- self.formatOrganTree(child, obj.children, organTreeType)
524
- }
525
- }
526
- childsTree.push(obj);
527
- } else {
528
- let params = {
529
- orgTreeType: organTreeType,
530
- }
531
- ajax.get(self.smartFlowServerContext + '/manage/organ/get/' + nodeMap.organCode, { params: params })
532
- .then(resp => {
533
- if (resp.data.code === 200) {
534
- let data = resp.data.data
535
- obj = {
536
- type: data.organType,
537
- id: data.id,
538
- organId: data.organId,
539
- orders: data.orders,
540
- title: data.organName,
541
- name: data.organName,
542
- com: data.organId,
543
- code: data.organCode,
544
- loading: false,
545
- disabled: true,
546
- checked: false,
547
- hasChild: true,
548
- children: [],
549
- render: (h, { root, node, data }) => {
550
- return h('span', {
551
- style: {
552
- display: 'inline-block',
553
- color: '#b9bbc0',
554
- width: '100%'
555
- }
556
- }, [
557
- h('span', [
558
- h('span', data.title)
559
- ])
560
- ]);
561
- },
562
- }
563
- if (nodeMap.children && nodeMap.children.length > 0){
564
- for (let child of nodeMap.children){
565
- self.formatOrganTree(child, obj.children, organTreeType)
566
- }
567
- }
568
- childsTree.push(obj);
569
- }
570
- })
571
- .catch(err => {
572
- console.error(err);
573
- return [];
574
- })
575
- }
576
- },
577
- getData (node, callback) {
578
- let self = this
579
- ajax.get(this.upmsServerContext + '/manage/ucOrgan/getOrgSubNodes', {
580
- params: {
581
- organCode: node.code,
582
- orgTreeType: self.organTreeType
583
- }
584
- }).then(function (resp) {
585
- const childs = []
586
- if (resp.data.code === 1) {
587
- let nodeDatas = resp.data.data
588
- if (nodeDatas && nodeDatas.length > 0) {
589
- nodeDatas.forEach(item => {
590
- let obj = {}
591
- obj.type = item.organType
592
- obj.id = item.id
593
- obj.organId = item.organId
594
- obj.orders = item.orders
595
- obj.title = item.organName
596
- obj.name = item.organName
597
- obj.com = item.com
598
- obj.parent = node
599
- obj.code = item.organCode
600
- obj.loading = false
601
- obj.children = []
602
- obj.hasChild = true
603
- childs.push(obj)
604
- })
605
- } else {
606
- self.$set(node, 'hasChild', false)
607
- self.$delete(node, 'loading')
608
- }
609
- if (callback) {
610
- callback(childs)
611
- }
612
- } else {
613
- self.$set(node, 'hasChild', false)
614
- self.$delete(node, 'loading')
615
- if (callback) {
616
- callback()
617
- }
618
- }
619
- })
620
- },
621
- selectChange (node) {
622
- let self = this
623
- if (node && node.length > 0) {
624
- if (self.currentNode !== node[0]) {
625
- self.currentNode = node[0]
626
-
627
- self.form.organId = self.currentNode.organId
628
- self.form.organTitle = self.currentNode.title
629
-
630
- let permScopeList = self.permScopeList
631
- if (permScopeList !== 'all'){
632
- permScopeList += 'O:' + self.currentNode.code
633
- }
634
- self.dataUrl =self.smartFlowServerContext+ '/manage/user/getAssigneeList?orgTreeType=' + self.organTreeType + "&permScopeList=" + permScopeList
635
- self.doSearch()
636
-
637
- if (node[0].children.length <= 0) {
638
- self.getData(node[0], function (data) {
639
- self.$set(node[0], 'children', data)
640
- })
641
- }
642
- self.$set(node[0], 'expand', true)
643
- }
644
- } else {
645
- self.$set(self.currentNode, 'expand', !self.currentNode.expand)
646
- self.currentNode.selected = true
647
- }
648
- },
649
-
650
- onCancel () {
651
- if (this.helpBoxType === 'transferCurTask'){
652
- this.$emit('update-selected', ''); // 触发事件并传递 userId
653
- }
654
- this.modalBoxShow = false;
655
-
656
- },
657
-
658
- getSystemConfig(){
659
- const self = this
660
- ajax.get(self.smartFlowServerContext + '/anon/systemConfig/getSystemConfig').then(function (resp) {
661
- const result = resp.data;
662
- if (result && result.code === '200') {
663
- self.ucAdapterType = result.data.ucAdapterType
664
- }
665
- }).catch(err => {
666
- console.log(err);
667
- })
668
- },
669
-
670
- },
671
- };
672
- </script>
673
-
674
- <style lang="less" scope>
675
- .org-info{
676
- display: flex;
677
- max-height: 700px;
678
- .org-tree {
679
- width: 265px;
680
- min-height: 450px;
681
- border-right: 1px solid #dcdee2;
682
- .tree-content {
683
- height: 100%;
684
- overflow-y: auto;
685
- }
686
- }
687
-
688
- .org-detil {
689
- flex:1;
690
- min-height: 400px;
691
- min-width: 800px;
692
- padding: 0 10px 10px;
693
- margin-left: 10px;
694
- }
695
- }
696
- </style>
1
+ <template>
2
+ <div>
3
+ <Modal v-model="modalBoxShow" width="1217" title="选择办理人" @on-ok="onOk" @on-cancel="onCancel" loading>
4
+ <div class="org-info">
5
+ <div class="org-tree">
6
+ <div class="tree-content">
7
+ <div v-if="treeData.length === 0">暂无数据</div>
8
+ <Tree v-else v-for="(item,index) in treeData" :key="index" :data="item" ref="treeBM"
9
+ :load-data="loadData" @on-select-change="selectChange"></Tree>
10
+ <!-- <Tree :data="treeData" :load-data="loadData" @on-select-change="selectChange"></Tree>-->
11
+ </div>
12
+ </div>
13
+ <div class="org-detil">
14
+ <LamboPagingTable ref="selection" :dataUrl="dataUrl" :columns="tableColumn" :searchParams="tableSearchParams"
15
+ @on-selection-change="onSelectionChange">
16
+ <div slot="search">
17
+ <Form :label-width="80">
18
+ <FormItem label="账号">
19
+ <Input v-model="form.userId" placeholder="按账号搜索" />
20
+ </FormItem>
21
+ <FormItem label="姓名">
22
+ <Input v-model="form.userName" placeholder="按姓名搜索" />
23
+ </FormItem>
24
+ <FormItem label="是否管理员" prop="isAdmin" :labelWidth="100">
25
+ <RadioGroup v-model="form.isAdmin">
26
+ <Radio label="">全部</Radio>
27
+ <Radio label="1">是</Radio>
28
+ <Radio label="0">否</Radio>
29
+ </RadioGroup>
30
+ </FormItem>
31
+ <FormItem>
32
+ <Button type="primary" icon="ios-search" @click="doSearch">查询</Button>
33
+ </FormItem>
34
+ </Form>
35
+ </div>
36
+ </LamboPagingTable>
37
+
38
+ </div>
39
+ </div>
40
+
41
+
42
+ </Modal>
43
+ </div>
44
+ </template>
45
+
46
+ <script>
47
+ import ajax from "@lambo-design/shared/utils/ajax";
48
+ import LamboPagingTable from '@lambo-design/paging-table'
49
+
50
+ export default {
51
+ name: "UserHelpBox",
52
+ components: {
53
+ LamboPagingTable
54
+ },
55
+ props: {
56
+ data: {
57
+ type: Object,
58
+ default: () => {
59
+ return {}
60
+ }
61
+ },
62
+ //按钮执行完毕回调方法
63
+ executionCompleted: {
64
+ type: Function,
65
+ required: false,
66
+ },
67
+ smartFlowServerContext: {
68
+ type: String,
69
+ default: '/api/smart-flow-server',
70
+ },
71
+ upmsServerContext: {
72
+ type: String,
73
+ default: '/api/upms-server',
74
+ },
75
+ },
76
+ data() {
77
+ return {
78
+ id: '',
79
+ helpBoxType: 'transferCurTask',
80
+ ucAdapterType: 'x1',
81
+ loading: false,
82
+ organTreeType: '00',
83
+ permScope: 'all',
84
+ modalBoxShow: false,
85
+ dataUrl:'',
86
+ helpBoxColumns: [
87
+ {
88
+ title: "用户ID",
89
+ key: "userId",
90
+ sortable: "custom",
91
+ },
92
+ {
93
+ title: "用户姓名",
94
+ key: "userName",
95
+ },
96
+ {
97
+ title: "部门名称",
98
+ key: "organName",
99
+ },
100
+ ],
101
+ helpBoxTitle: "用户选择框",
102
+ targetDomId:"",
103
+ treeData: [],
104
+ idSelectedArr: [],
105
+ currentNode: {},
106
+ form: {
107
+ userId: '',
108
+ userName: '',
109
+ organId: '',
110
+ organTitle: '',
111
+ directChild: false,
112
+ isAdmin: ''
113
+ },
114
+ tableSearchParams: {},
115
+ };
116
+ },
117
+ created () {
118
+ this.getSystemConfig()
119
+ },
120
+ computed: {
121
+
122
+ tableColumn () {
123
+ let columns = []
124
+ let self = this
125
+ columns.push({
126
+ title: '#',
127
+ key: 'selectId',
128
+ type: 'selection',
129
+ align: 'center',
130
+ width: 55
131
+ })
132
+ columns.push({
133
+ title: '账号',
134
+ key: 'userId',
135
+ sortField: 'user_id',
136
+ sortable: 'custom'
137
+ })
138
+ columns.push({
139
+ title: '姓名',
140
+ key: 'userName',
141
+ sortField: 'user_name',
142
+ sortable: 'custom'
143
+ })
144
+ columns.push({
145
+ title: '部门名称',
146
+ key: 'organName',
147
+ sortField: 'organ_name',
148
+ sortable: 'custom'
149
+ })
150
+ columns.push({
151
+ title: '状态',
152
+ key: 'status',
153
+ sortable: 'custom',
154
+ align: 'center',
155
+ width: 100,
156
+ render: function (h, param) {
157
+ let state = param.row.status
158
+ if (state === '00') {
159
+ state = '正常'
160
+ } else {
161
+ state = '锁定'
162
+ }
163
+ return h('span', state)
164
+ }
165
+ })
166
+
167
+ return columns
168
+ }
169
+ },
170
+ inject: ['toBeDoneListDoSearch'],
171
+ methods: {
172
+ init (organTreeType) {
173
+ let self = this
174
+ self.organTreeType = organTreeType
175
+ self.getRootData(organTreeType)
176
+ },
177
+ clearData(){
178
+ this.idSelectedArr = []
179
+ //清除表格数据
180
+ this.doSearch()
181
+ },
182
+ toggleShowHelpBox(organTreeType, permScope, helpBoxType, id) {
183
+ this.clearData()
184
+ this.id = id
185
+ this.helpBoxType = helpBoxType
186
+ this.organTreeType = organTreeType
187
+ this.permScope = permScope
188
+ if (permScope && permScope !== 'all'){
189
+ this.getOrgTreeByProType(this.permScope, this.organTreeType)
190
+ } else {
191
+ this.permScopeList = 'all'
192
+ this.getRootData(organTreeType)
193
+ }
194
+ this.modalBoxShow = !this.modalBoxShow;
195
+ this.$forceUpdate()
196
+ },
197
+
198
+ onOk(){
199
+ let self = this
200
+ let idSelectedArr = self.idSelectedArr
201
+ self.loading = true
202
+ if (self.helpBoxType ==='addMultitaskInstance'){
203
+ idSelectedArr = [...new Set(idSelectedArr)]
204
+ const assingeeList = idSelectedArr.map(item => item.split(',')[0])
205
+ self.$emit('add-multitask-instance', assingeeList);
206
+ } else {
207
+ if (idSelectedArr.length > 1) {
208
+ self.loading = false
209
+ self.$Message.info('办理人只能选择一条记录!')
210
+ this.$emit('update-selected', ''); // 触发事件并传递 userId
211
+ } else {
212
+ let idSelectedArr = self.idSelectedArr[0].split(',')
213
+ if (self.helpBoxType === 'transferCurTask'){
214
+ let auditResult = {
215
+ code: self.data.auditResult,
216
+ name: self.data.auditResultName,
217
+ }
218
+ self.data.selectedUserId=idSelectedArr[0];
219
+ let url = this.smartFlowServerContext + '/manage/processTodo/audit'
220
+ ajax.post(url, self.data).then(function (resp) {
221
+ let result = resp.data
222
+ if (result.code == '200') {
223
+ self.loading = false
224
+ self.$Message.success(result.message);
225
+ if (self.executionCompleted) {
226
+ self.executionCompleted(true, self.data.instanceId, self.data.taskId, auditResult, self.data.taskId);
227
+ }
228
+ self.toBeDoneListDoSearch();
229
+ } else {
230
+ self.loading = false
231
+ self.$Message.error(result.message)
232
+ if (self.executionCompleted) {
233
+ self.executionCompleted(false, null, null, auditResult, self.data.taskId);
234
+ }
235
+ }
236
+ })
237
+ } else if (self.helpBoxType === 'delegateTask'){
238
+ self.$emit('delegate-task-assignee', idSelectedArr[0]);
239
+ } else {
240
+ self.$emit('update-next-node-assignee', idSelectedArr[0], idSelectedArr[1], self.id);
241
+ }
242
+ }
243
+ }
244
+ this.modalBoxShow = false;
245
+ },
246
+
247
+ doSearch: function () {
248
+ this.tableSearchParams = Object.assign({}, this.form)
249
+ },
250
+ onSelectionChange: function (selection) {
251
+ let self = this
252
+ // self.idSelectedArr = []
253
+ if (self.helpBoxType !== 'addMultitaskInstance' && selection.length > 1) {
254
+ self.$Message.info('只能选择一条记录!')
255
+ this.$refs.selection.selectAll(false);
256
+ }
257
+ for (let item of selection) {
258
+ self.idSelectedArr.push(item.userId + ',' + item.userName)
259
+ }
260
+ },
261
+ loadData (node, callback) {
262
+ this.getData(node, function (data) {
263
+ if (data.length > 0) {
264
+ callback(data)
265
+ }
266
+ })
267
+ },
268
+ getRootData (organTreeType) {
269
+ let self = this
270
+ let hostChilds = []
271
+ if (self.ucAdapterType === 'x1'){
272
+ let parentId = organTreeType == '00' ? 'rootId' : '0'
273
+ ajax.get(self.smartFlowServerContext + '/manage/organ/getOrgSubNodes', {
274
+ params: {
275
+ code: parentId,
276
+ orgTreeType: organTreeType
277
+ }
278
+ }).then(resp => {
279
+ if (resp.data.code === 200) {
280
+ let data = resp.data.data
281
+ if (data.length > 0) {
282
+ data.forEach(item => {
283
+ let obj = {}
284
+ obj.type = item.organType
285
+ obj.id = item.id
286
+ obj.organId = item.organId
287
+ obj.orders = item.orders
288
+ obj.title = item.organName
289
+ obj.name = item.organName
290
+ obj.com = item.com
291
+ obj.code = item.organCode
292
+ obj.loading = false
293
+ obj.children = []
294
+ obj.hasChild = true
295
+ hostChilds.push(obj)
296
+ })
297
+ self.treeData.push(hostChilds)
298
+ const codesSeen = new Map();
299
+ self.treeData = self.treeData.reduce((acc, item, index) => {
300
+ if (!codesSeen.has(item.code)) {
301
+ codesSeen.set(item.code, index);
302
+ acc.push(item);
303
+ }
304
+ return acc;
305
+ }, []);
306
+ self.selectChange(self.treeData[0])
307
+ }
308
+ }
309
+ }).catch(err => {
310
+ console.log(err);
311
+ })
312
+ } else {
313
+ ajax.get(self.smartFlowServerContext + '/manage/bizorgan/getOrgRootTree?bizOrganTreeType=' + organTreeType).then(resp => {
314
+ if (resp.data.code === 200) {
315
+ let data = resp.data.data
316
+ if (data.length > 0) {
317
+ for (let i = 0; i < data.length; i++) {
318
+ {
319
+ let obj = {}
320
+ obj.type = data[i].bizOrganType
321
+ obj.id = data[i].id
322
+ obj.organId = data[i].bizOrganId
323
+ obj.orders = data[i].orders
324
+ obj.title = data[i].bizOrganName
325
+ obj.name = data[i].bizOrganName
326
+ obj.com = data[i].bizOrganId
327
+ obj.code = data[i].bizOrganCode
328
+ obj.loading = false
329
+ obj.children = []
330
+ obj.hasChild = true
331
+ hostChilds.push(obj)
332
+ self.treeData.push(hostChilds);
333
+ const codesSeen = new Map();
334
+ self.treeData = self.treeData.reduce((acc, item, index) => {
335
+ if (!codesSeen.has(item.code)) {
336
+ codesSeen.set(item.code, index);
337
+ acc.push(item);
338
+ }
339
+ return acc;
340
+ }, []);
341
+ }
342
+ }
343
+ self.selectChange(self.treeData[0])
344
+ }
345
+ }
346
+ }).catch(err => {
347
+ console.log(err);
348
+ })
349
+ }
350
+ },
351
+ async getOrgTreeByProType(permScope, organTreeType){
352
+ let self = this
353
+ let userPermScope = permScope.substring(permScope.indexOf("U:"))
354
+ userPermScope = userPermScope.substring(2, userPermScope.indexOf(","))
355
+ let permScopeTwo = userPermScope.split(';')
356
+ if (permScopeTwo.length > 0 && permScopeTwo[0]){
357
+ self.permScopeList = 'U:' + userPermScope + ','
358
+ let promises = []
359
+ for (let i = 0; i < permScopeTwo.length; i++) {
360
+ let promise = ajax.get(self.smartFlowServerContext + "/manage/user/get/" + permScopeTwo[i] + '?treeType=' + organTreeType)
361
+ .then(resp => {
362
+ if (resp.data.code === 200) {
363
+ return resp.data.data.organCode
364
+ }
365
+ })
366
+ promises.push(promise)
367
+ }
368
+ Promise.all(promises).then(async (result) => {
369
+ const uniqueResults = [...new Set(result.filter(Boolean))];
370
+ permScope = uniqueResults.join(';');
371
+ self.treeData = await this.getOrganTreeByProType(permScope, permScope, organTreeType);
372
+ self.selectChange(self.treeData[0])
373
+ })
374
+ } else {
375
+ //对于流程类型中没有规定人员范围但规定组织范围的情况
376
+ self.treeData = await this.getOrganTreeByProType(permScope, permScope.substring(2, permScope.indexOf(",")), organTreeType);
377
+ self.selectChange(self.treeData[0])
378
+ }
379
+ },
380
+ getOrganTreeByProType(row, permScope, organTreeType) {
381
+ const self = this
382
+ return new Promise((resolve, reject) => {
383
+ let organTree = [];
384
+ let childsTree = [];
385
+ if (permScope && permScope.length > 0) {
386
+ let params = {
387
+ orgTreeType: organTreeType,
388
+ };
389
+ permScope = permScope.split(';');
390
+
391
+ const requests = permScope.map(perm => {
392
+ return ajax.get(self.smartFlowServerContext + '/manage/organ/get/' + perm, { params: params })
393
+ .then(resp => {
394
+ if (resp.data.code === 200) {
395
+ return resp.data.data;
396
+ } else {
397
+ return [];
398
+ }
399
+ })
400
+ .catch(err => {
401
+ console.error(err);
402
+ return [];
403
+ });
404
+ });
405
+
406
+ Promise.all(requests)
407
+ .then(results => {
408
+ let tree
409
+ if (self.ucAdapterType === 'x1'){
410
+ tree = self.x1OrganTree(results)
411
+ } else {
412
+ tree = self.scOrganTree(results)
413
+ }
414
+ for (let value of tree) {
415
+ self.formatOrganTree(value, childsTree, organTreeType)
416
+ }
417
+
418
+ organTree.push(childsTree);
419
+ const codesSeen = new Map();
420
+ organTree = organTree.reduce((acc, item, index) => {
421
+ if (!codesSeen.has(item.code)) {
422
+ codesSeen.set(item.code, index);
423
+ acc.push(item);
424
+ }
425
+ return acc;
426
+ }, []);
427
+ resolve(organTree);
428
+ })
429
+ .catch(err => {
430
+ reject(err);
431
+ });
432
+ } else {
433
+ resolve([]);
434
+ }
435
+ });
436
+ },
437
+ x1OrganTree(results){
438
+ const nodeMap = new Map();
439
+ results.forEach(item => {
440
+ const organCode = item.organCode
441
+ const organStruPath = item.organStruPath
442
+ const parts = organStruPath.split('#').filter(p => p);
443
+ let currentNode = nodeMap.get(organCode) || { organCode, organStruPath, item, children: []};
444
+ currentNode.parts = parts;
445
+ nodeMap.set(organCode, currentNode);
446
+ });
447
+ nodeMap.forEach(node => {
448
+ const { organCode, parts } = node;
449
+ let parentCode = null;
450
+ for (let i = 0; i < parts.length - 1; i++) {
451
+ parentCode = parts[i];
452
+ const parentNode = nodeMap.get(parentCode);
453
+
454
+ if (parentNode) {
455
+ if (parentNode.organId === node.item.parentId && !parentNode.children.some(child => child.organCode === organCode)) {
456
+ parentNode.children.push(node);
457
+ } else {
458
+ // 如果直接父节点不在流程类型范围内但祖宗节点在
459
+ let children = parentNode.children;
460
+ for (let j = i + 1; j < parts.length - 1; j++) {
461
+ const partCode = parts[j];
462
+ let existingChild = children.find(child => child.organCode === partCode);
463
+
464
+ if (!existingChild) {
465
+ existingChild = { organCode: partCode, children: [] };
466
+ children.push(existingChild);
467
+ }
468
+ children = existingChild.children;
469
+ }
470
+ // 将当前节点添加到最后一个子节点的 children 中
471
+ children.push(node);
472
+ }
473
+ nodeMap.delete(organCode);
474
+ break;
475
+ }
476
+ }
477
+
478
+ });
479
+ return nodeMap.values()
480
+ },
481
+ scOrganTree(results){
482
+ const nodeMap = new Map();
483
+ results.forEach(item => {
484
+ const organId = item.organId
485
+ const parentId = item.parentId
486
+ let currentNode = nodeMap.get(organId) || { organId, parentId, item, children: []};
487
+ nodeMap.set(organId, currentNode);
488
+ });
489
+ const tree = [];
490
+ nodeMap.forEach((node, organId) => {
491
+ const parentId = node.parentId;
492
+
493
+ // 如果有父节点,则将当前节点添加到父节点的 children 数组中
494
+ if (parentId && nodeMap.has(parentId)) {
495
+ const parentNode = nodeMap.get(parentId);
496
+ parentNode.children.push(node);
497
+ } else {
498
+ tree.push(node);
499
+ }
500
+ });
501
+ return tree
502
+ },
503
+ formatOrganTree(nodeMap, childsTree, organTreeType){
504
+ const self = this
505
+ let obj = {}
506
+ if (nodeMap.item){
507
+ obj = {
508
+ type: nodeMap.item.organType,
509
+ id: nodeMap.item.id,
510
+ organId: nodeMap.item.organId,
511
+ orders: nodeMap.item.orders,
512
+ title: nodeMap.item.organName,
513
+ name: nodeMap.item.organName,
514
+ com: nodeMap.item.organId,
515
+ code: nodeMap.item.organCode,
516
+ loading: false,
517
+ checked: false,
518
+ hasChild: true,
519
+ children: [],
520
+ };
521
+ if (nodeMap.children && nodeMap.children.length > 0){
522
+ for (let child of nodeMap.children){
523
+ self.formatOrganTree(child, obj.children, organTreeType)
524
+ }
525
+ }
526
+ childsTree.push(obj);
527
+ } else {
528
+ let params = {
529
+ orgTreeType: organTreeType,
530
+ }
531
+ ajax.get(self.smartFlowServerContext + '/manage/organ/get/' + nodeMap.organCode, { params: params })
532
+ .then(resp => {
533
+ if (resp.data.code === 200) {
534
+ let data = resp.data.data
535
+ obj = {
536
+ type: data.organType,
537
+ id: data.id,
538
+ organId: data.organId,
539
+ orders: data.orders,
540
+ title: data.organName,
541
+ name: data.organName,
542
+ com: data.organId,
543
+ code: data.organCode,
544
+ loading: false,
545
+ disabled: true,
546
+ checked: false,
547
+ hasChild: true,
548
+ children: [],
549
+ render: (h, { root, node, data }) => {
550
+ return h('span', {
551
+ style: {
552
+ display: 'inline-block',
553
+ color: '#b9bbc0',
554
+ width: '100%'
555
+ }
556
+ }, [
557
+ h('span', [
558
+ h('span', data.title)
559
+ ])
560
+ ]);
561
+ },
562
+ }
563
+ if (nodeMap.children && nodeMap.children.length > 0){
564
+ for (let child of nodeMap.children){
565
+ self.formatOrganTree(child, obj.children, organTreeType)
566
+ }
567
+ }
568
+ childsTree.push(obj);
569
+ }
570
+ })
571
+ .catch(err => {
572
+ console.error(err);
573
+ return [];
574
+ })
575
+ }
576
+ },
577
+ getData (node, callback) {
578
+ let self = this
579
+ ajax.get(this.upmsServerContext + '/manage/ucOrgan/getOrgSubNodes', {
580
+ params: {
581
+ organCode: node.code,
582
+ orgTreeType: self.organTreeType
583
+ }
584
+ }).then(function (resp) {
585
+ const childs = []
586
+ if (resp.data.code === 1) {
587
+ let nodeDatas = resp.data.data
588
+ if (nodeDatas && nodeDatas.length > 0) {
589
+ nodeDatas.forEach(item => {
590
+ let obj = {}
591
+ obj.type = item.organType
592
+ obj.id = item.id
593
+ obj.organId = item.organId
594
+ obj.orders = item.orders
595
+ obj.title = item.organName
596
+ obj.name = item.organName
597
+ obj.com = item.com
598
+ obj.parent = node
599
+ obj.code = item.organCode
600
+ obj.loading = false
601
+ obj.children = []
602
+ obj.hasChild = true
603
+ childs.push(obj)
604
+ })
605
+ } else {
606
+ self.$set(node, 'hasChild', false)
607
+ self.$delete(node, 'loading')
608
+ }
609
+ if (callback) {
610
+ callback(childs)
611
+ }
612
+ } else {
613
+ self.$set(node, 'hasChild', false)
614
+ self.$delete(node, 'loading')
615
+ if (callback) {
616
+ callback()
617
+ }
618
+ }
619
+ })
620
+ },
621
+ selectChange (node) {
622
+ let self = this
623
+ if (node && node.length > 0) {
624
+ if (self.currentNode !== node[0]) {
625
+ self.currentNode = node[0]
626
+
627
+ self.form.organId = self.currentNode.organId
628
+ self.form.organTitle = self.currentNode.title
629
+
630
+ let permScopeList = self.permScopeList
631
+ if (permScopeList !== 'all'){
632
+ permScopeList += 'O:' + self.currentNode.code
633
+ }
634
+ self.dataUrl =self.smartFlowServerContext+ '/manage/user/getAssigneeList?orgTreeType=' + self.organTreeType + "&permScopeList=" + permScopeList
635
+ self.doSearch()
636
+
637
+ if (node[0].children.length <= 0) {
638
+ self.getData(node[0], function (data) {
639
+ self.$set(node[0], 'children', data)
640
+ })
641
+ }
642
+ self.$set(node[0], 'expand', true)
643
+ }
644
+ } else {
645
+ self.$set(self.currentNode, 'expand', !self.currentNode.expand)
646
+ self.currentNode.selected = true
647
+ }
648
+ },
649
+
650
+ onCancel () {
651
+ if (this.helpBoxType === 'transferCurTask'){
652
+ this.$emit('update-selected', ''); // 触发事件并传递 userId
653
+ }
654
+ this.modalBoxShow = false;
655
+
656
+ },
657
+
658
+ getSystemConfig(){
659
+ const self = this
660
+ ajax.get(self.smartFlowServerContext + '/anon/systemConfig/getSystemConfig').then(function (resp) {
661
+ const result = resp.data;
662
+ if (result && result.code === '200') {
663
+ self.ucAdapterType = result.data.ucAdapterType
664
+ }
665
+ }).catch(err => {
666
+ console.log(err);
667
+ })
668
+ },
669
+
670
+ },
671
+ };
672
+ </script>
673
+
674
+ <style lang="less" scope>
675
+ .org-info{
676
+ display: flex;
677
+ max-height: 700px;
678
+ .org-tree {
679
+ width: 265px;
680
+ min-height: 450px;
681
+ border-right: 1px solid #dcdee2;
682
+ .tree-content {
683
+ height: 100%;
684
+ overflow-y: auto;
685
+ }
686
+ }
687
+
688
+ .org-detil {
689
+ flex:1;
690
+ min-height: 400px;
691
+ min-width: 800px;
692
+ padding: 0 10px 10px;
693
+ margin-left: 10px;
694
+ }
695
+ }
696
+ </style>