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

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.
package/src/portrait.vue CHANGED
@@ -26,9 +26,9 @@
26
26
  <Title
27
27
  v-if="handleButtons && (handleButtons.includes('auditOpinion') || handleButtons.includes('attachmentFile'))">
28
28
  <a style="color: #989898">
29
- <Icon v-if="auditShow" type="ios-arrow-down"/>
30
- <Icon v-if="!auditShow" type="ios-arrow-up"/>
31
- {{ handleName }}信息
29
+ <Icon v-if="auditShow" type="ios-arrow-down"/>
30
+ <Icon v-if="!auditShow" type="ios-arrow-up"/>
31
+ {{ handleName }}信息
32
32
  </a>
33
33
  </Title>
34
34
  </a>
@@ -64,13 +64,14 @@
64
64
  <Title
65
65
  v-if="handleButtons && (handleButtons.includes('auditOpinion') || handleButtons.includes('attachmentFile'))">
66
66
  <a style="color: #989898">
67
- <Icon v-if="auditShow" type="ios-arrow-down"/>
68
- <Icon v-if="!auditShow" type="ios-arrow-up"/>
69
- {{ handleName }}信息
67
+ <Icon v-if="auditShow" type="ios-arrow-down"/>
68
+ <Icon v-if="!auditShow" type="ios-arrow-up"/>
69
+ {{ handleName }}信息
70
70
  </a>
71
71
  </Title>
72
72
  </a>
73
- <transition v-if="taskNode && isDetail && hisAuditOpinion[0].auditOpinion" name="draw" @before-enter="beforeEnter"
73
+ <transition v-if="taskNode && isDetail && hisAuditOpinion[0].auditOpinion" name="draw"
74
+ @before-enter="beforeEnter"
74
75
  @enter="enter" @before-leave="beforeLeave" @leave="leave">
75
76
  <div class="box" v-show="auditShow">
76
77
  <Form ref="auditOpinion" justify="center" :model="form"
@@ -91,9 +92,9 @@
91
92
  <a @click="historyShow = !historyShow">
92
93
  <Title v-if="handleButtons && handleButtons.includes('auditHistory')">
93
94
  <a style="color: #989898">
94
- <Icon v-if="historyShow" type="ios-arrow-down"/>
95
- <Icon v-if="!historyShow" type="ios-arrow-up"/>
96
- {{ handleName }}记录
95
+ <Icon v-if="historyShow" type="ios-arrow-down"/>
96
+ <Icon v-if="!historyShow" type="ios-arrow-up"/>
97
+ {{ handleName }}记录
97
98
  </a>
98
99
  </Title>
99
100
  </a>
@@ -101,7 +102,8 @@
101
102
  <div class="box" v-show="historyShow">
102
103
  <Card class="process-history" :style="processHistoryHeight" dis-hover :bordered="false"
103
104
  v-if="handleButtons && handleButtons.includes('auditHistory')">
104
- <processHistory :portrait-width="portraitWidth" :list="processHistory" :done-page="isDetail" :push-button="pushButton"
105
+ <processHistory :portrait-width="portraitWidth" :list="processHistory" :done-page="isDetail"
106
+ :push-button="pushButton"
105
107
  :smart-flow-server-context="smartFlowServerContext"></processHistory>
106
108
  </Card>
107
109
  </div>
@@ -110,9 +112,9 @@
110
112
  <a @click="attachListShow = !attachListShow">
111
113
  <Title v-if="handleButtons && handleButtons.includes('attachmentFile') && attachmentList.length > 0">
112
114
  <a style="color: #989898">
113
- <Icon v-if="attachListShow" type="ios-arrow-down"/>
114
- <Icon v-if="!attachListShow" type="ios-arrow-up"/>
115
- 查看附件
115
+ <Icon v-if="attachListShow" type="ios-arrow-down"/>
116
+ <Icon v-if="!attachListShow" type="ios-arrow-up"/>
117
+ 查看附件
116
118
  </a>
117
119
  </Title>
118
120
  </a>
@@ -202,13 +204,15 @@
202
204
  </Table>
203
205
  </Modal>
204
206
  <assigneeBox ref="assigneeHelpBox" :execution-completed="executionCompleted"
205
- @update-selected="handleSelectedUser" @update-next-node-assignee="updateNextNodeAssignee" @add-multitask-instance="addMultitaskInstance"
207
+ @update-selected="handleSelectedUser" @update-next-node-assignee="updateNextNodeAssignee"
208
+ @add-multitask-instance="addMultitaskInstance" @delegate-task-assignee="delegateTask"
206
209
  :data="assigneeBoxData" :smart-flow-server-context="smartFlowServerContext"
207
210
  :upms-server-context="upmsServerContext"/>
208
211
  <Modal v-model="modalBoxShow" width="1000" title="流程跟踪图">
209
212
  <Workflow_Diagram ref="processTrace" :instanceId="process.instanceId" :applyId="process.applyId"
210
213
  :procId="process.procId" :table-columns="diagramTableColumns"
211
- :tableData="process.tableData" :hisAudit="hisAudit" :approve-detail-show-way="approveDetailShowWay"
214
+ :tableData="process.tableData" :hisAudit="hisAudit"
215
+ :approve-detail-show-way="approveDetailShowWay"
212
216
  :smart-flow-server-context="smartFlowServerContext">
213
217
  </Workflow_Diagram>
214
218
  </Modal>
@@ -246,7 +250,8 @@
246
250
  @on-focus="readingRangeClick(item)"
247
251
  @on-click="readingRangeClick(item)"/>
248
252
  </FormItem>
249
- <FormItem label="候选人员:" prop="candidateGroups" v-if="!item.isMultiInstance && item.actionType === 'CAND'">
253
+ <FormItem label="候选人员:" prop="candidateGroups"
254
+ v-if="!item.isMultiInstance && item.actionType === 'CAND'">
250
255
  <Input v-model="item.candidateNames"
251
256
  placeholder="请选择候选人"
252
257
  style="width: 68%"
@@ -254,11 +259,15 @@
254
259
  @on-focus="candidateGroupsReadingRangeClick(item)"
255
260
  @on-click="candidateGroupsReadingRangeClick(item)"/>
256
261
  </FormItem>
257
- <FormItem label="候选人员:" prop="candidateGroups" v-if="item.isMultiInstance && item.actionType === 'CAND'">
262
+ <FormItem label="候选人员:" prop="candidateGroups"
263
+ v-if="item.isMultiInstance && item.actionType === 'CAND'">
258
264
  </FormItem>
259
265
 
260
- <countersingersBox style="margin-bottom: 10px" v-model="item.candidateNames" v-if="item.isMultiInstance && item.actionType === 'CAND'"
261
- :item="item" :permScope="permScope" @update-cand-groups="updateCandGroups" :upms-server-context="upmsServerContext" :smart-flow-server-context="smartFlowServerContext"/>
266
+ <countersingersBox style="margin-bottom: 10px" v-model="item.candidateNames"
267
+ v-if="item.isMultiInstance && item.actionType === 'CAND'"
268
+ :item="item" :permScope="permScope" @update-cand-groups="updateCandGroups"
269
+ :upms-server-context="upmsServerContext"
270
+ :smart-flow-server-context="smartFlowServerContext"/>
262
271
  </div>
263
272
  <div v-if="handleButtons && handleButtons.includes('appointTimeoutTime')">
264
273
  <Row>
@@ -302,41 +311,53 @@
302
311
  </Form>
303
312
  </Card>
304
313
  </Modal>
305
- <candidateGroupsHelpBox ref="candidateGroupsHelpBox" :show="candidateGroupsHelpBoxShow" @update-cand-groups="updateCandGroups"
306
- :upms-server-context="upmsServerContext" :smart-flow-server-context="smartFlowServerContext"/>
314
+ <candidateGroupsHelpBox ref="candidateGroupsHelpBox" :show="candidateGroupsHelpBoxShow"
315
+ @update-cand-groups="updateCandGroups"
316
+ :upms-server-context="upmsServerContext"
317
+ :smart-flow-server-context="smartFlowServerContext"/>
307
318
  <template slot="page-footer">
308
319
  <div>
309
320
  <slot name="footer-button"></slot>
310
- <Button style="margin-left: 10px;" v-if="handleButtons && handleButtons.includes('auditTo70') && !isDetail"
321
+ <Button style="margin-left: 10px;" v-if="handleButtons && handleButtons.includes('auditTo70') && !isDetail && !appointTask"
311
322
  :disabled="disable" :loading="loading" @click="audit('70')">驳回到原点
312
323
  </Button>
313
- <Button style="margin-left: 10px;" v-if="handleButtons && handleButtons.includes('auditTo40') && !isDetail"
324
+ <Button style="margin-left: 10px;" v-if="handleButtons && handleButtons.includes('auditTo40') && !isDetail && !appointTask"
314
325
  :disabled="disable" :loading="loading" @click="audit('40')">驳回上一节点
315
326
  </Button>
316
- <Button style="margin-left: 10px;" v-if="handleButtons && handleButtons.includes('auditTo90') && !isDetail"
327
+ <Button style="margin-left: 10px;" v-if="handleButtons && handleButtons.includes('auditTo90') && !isDetail && !appointTask"
317
328
  :disabled="disable" :loading="loading" @click="audit('90')">驳回指定节点
318
329
  </Button>
319
- <Button style="margin-left: 10px;" v-if="handleButtons && handleButtons.includes('auditTo80') && !isDetail"
330
+ <Button style="margin-left: 10px;" v-if="handleButtons && handleButtons.includes('auditTo80') && !isDetail && !appointTask"
320
331
  :disabled="disable" :loading="loading" @click="audit('80')">跳转指定节点
321
332
  </Button>
322
- <Button style="margin-left: 10px;" v-if="handleButtons && handleButtons.includes('auditTo82') && !isDetail"
333
+ <Button style="margin-left: 10px;" v-if="handleButtons && handleButtons.includes('auditTo82') && !isDetail && !appointTask"
323
334
  :disabled="disable" :loading="loading" @click="audit('82')">指定他人处理
324
335
  </Button>
325
- <Button style="margin-left: 10px;" v-if="isParallelCountersignature && handleButtons && handleButtons.includes('addMultitaskInstance') && !isDetail"
336
+ <Button style="margin-left: 10px;"
337
+ v-if="curNodeType === 'userTask' && handleButtons && handleButtons.includes('delegateTask') && !isDetail && !appointTask"
338
+ :disabled="disable" :loading="loading" @click="audit('84')">委派
339
+ </Button>
340
+ <Button style="margin-left: 10px;"
341
+ v-if="curNodeType === 'multiNode' && handleButtons && handleButtons.includes('addMultitaskInstance') && !isDetail && !appointTask"
326
342
  :disabled="disable" :loading="loading" @click="showUpdateMultitaskInstanceModal('81')">加签
327
343
  </Button>
328
- <Button style="margin-left: 10px;" v-if="isParallelCountersignature && handleButtons && handleButtons.includes('reductionMultitaskInstance') && !isDetail"
344
+ <Button style="margin-left: 10px;"
345
+ v-if="curNodeType === 'multiNode' && handleButtons && handleButtons.includes('reductionMultitaskInstance') && !isDetail && !appointTask"
329
346
  :disabled="disable" :loading="loading" @click="showUpdateMultitaskInstanceModal('83')">减签
330
347
  </Button>
331
- <Button style="margin-left: 10px;" v-if="handleButtons && handleButtons.includes('auditTo50') && !isDetail"
348
+ <Button style="margin-left: 10px;" v-if="handleButtons && handleButtons.includes('auditTo50') && !isDetail && !appointTask"
332
349
  :disabled="disable" :loading="loading" @click="audit('50')">直接结束流程
333
350
  </Button>
334
351
  <Button style="margin-left: 10px;" v-if="handleButtons && handleButtons.includes('processTrace')"
335
352
  @click="processPrint">流程跟踪图
336
353
  </Button>
337
- <Button style="margin-left: 10px;" v-if="handleButtons && handleButtons.includes('auditTo30') && !isDetail"
354
+ <Button style="margin-left: 10px;" v-if="handleButtons && handleButtons.includes('auditTo30') && !isDetail && !appointTask"
338
355
  :disabled="disable" :loading="loading" type="primary" @click="audit('30')">通过
339
356
  </Button>
357
+ <Button style="margin-left: 10px;" v-if="revokeDelegateTask"
358
+ :disabled="!revokeDelegateTask && disable" :loading="loading" @click="audit('62')">撤回委派
359
+ </Button>
360
+ <Button style="margin-left: 10px;" v-if="appointTask" :disabled="disable" :loading="loading" type="primary" @click="audit('61')">交回</Button>
340
361
  </div>
341
362
  </template>
342
363
  </LamboPageContainer>
@@ -347,22 +368,21 @@
347
368
  import LamboPageContainer from '@lambo-design/page-container'
348
369
  import LamboIndicatorCard from '@lambo-design/indicator-card'
349
370
  import Workflow_Diagram from './workflow-diagram'
350
- import ajax from "@lambo-design/shared/utils/ajax";
351
- import bus from '@lambo-design/shared/utils/bus';
352
- import Title from "./components/title";
353
- import processHistory from "./components/history";
354
- import assigneeBox from "./components/assignee-box";
355
- import CandidateGroupsHelpBox from "./components/candidate-groups-box";
356
- import CountersingersBox from "./components/countersigners-box"
357
- import LamboPagingTable from "@lambo-design/paging-table";
358
- import AuditOpinion from "./components/opinion";
359
- import axios from "axios";
360
- import UploadFile from "@lambo-design/upload-file";
361
- import {timestampToTime} from "@lambo-design/shared/utils/date";
371
+ import ajax from '@lambo-design/shared/utils/ajax'
372
+ import bus from '@lambo-design/shared/utils/bus'
373
+ import Title from './components/title'
374
+ import processHistory from './components/history'
375
+ import assigneeBox from './components/assignee-box'
376
+ import CandidateGroupsHelpBox from './components/candidate-groups-box'
377
+ import CountersingersBox from './components/countersigners-box'
378
+ import LamboPagingTable from '@lambo-design/paging-table'
379
+ import AuditOpinion from './components/opinion'
380
+ import axios from 'axios'
381
+ import UploadFile from '@lambo-design/upload-file'
382
+ import { timestampToTime } from '@lambo-design/shared/utils/date'
362
383
 
363
384
  // 引入docx-preview插件
364
- let docx = require('docx-preview');
365
-
385
+ let docx = require('docx-preview')
366
386
 
367
387
  export default {
368
388
  props: {
@@ -430,11 +450,12 @@ export default {
430
450
  executionCompleted: {
431
451
  type: Function,
432
452
  required: false,
433
- default: () => {}
453
+ default: () => {
454
+ }
434
455
  },
435
456
  title: {
436
457
  type: String,
437
- default: "流程办理"
458
+ default: '流程办理'
438
459
  },
439
460
  smartFlowServerContext: {
440
461
  type: String,
@@ -463,7 +484,7 @@ export default {
463
484
  isExpanded: true,
464
485
  showProcessInfo: true,
465
486
  portraitWidth: 0,
466
- requestSuccessCodes: [200, "200"],
487
+ requestSuccessCodes: [200, '200'],
467
488
  auditShow: true,
468
489
  historyShow: true,
469
490
  attachListShow: true,
@@ -492,26 +513,28 @@ export default {
492
513
  organTreeType: '00',
493
514
  defaultOrganTreeType: '00',
494
515
  ruleValidate: {
495
- auditOpinion: [{required: true, trigger: "blur", message: '意见不能为空'}],
496
- assignee: [{required: true, trigger: "blur", message: "办理人不能为空"}],
497
- candidateGroups: [{required: true, trigger: "blur", message: "候选人不能为空"}],
516
+ auditOpinion: [{ required: true, trigger: 'blur', message: '意见不能为空' }],
517
+ assignee: [{ required: true, trigger: 'blur', message: '办理人不能为空' }],
518
+ candidateGroups: [{ required: true, trigger: 'blur', message: '候选人不能为空' }],
498
519
  },
499
520
  form: {
500
521
  auditOpinion: '',
501
522
  },
502
523
  loading: false,
503
524
  disable: false,
525
+ revokeDelegateTask: false,
526
+ appointTask: false,
504
527
  instanceId: '',
505
528
  curTaskId: '',
506
- isParallelCountersignature: false,
529
+ curNodeType: 'userTask',
507
530
  handleButtons: [],
508
531
  handleName: '',
509
532
  auditOpinionTitle: '',
510
533
  auditResult: '',
511
534
  curAuditGroup: '',
512
535
  custChange: 'auditInfo',
513
- auditInfo: "auditInfo",
514
- auditProcess: "auditProcess",
536
+ auditInfo: 'auditInfo',
537
+ auditProcess: 'auditProcess',
515
538
  fileList: [],
516
539
  ossFilePutUrl: '/manage/oss/file/put',
517
540
  hisAudit: [],
@@ -520,8 +543,8 @@ export default {
520
543
  auditTime: '',
521
544
  }],
522
545
  datas: {
523
- orgName: "",
524
- orgId: ""
546
+ orgName: '',
547
+ orgId: ''
525
548
  },
526
549
  editForm: {
527
550
  approvalCost: '',
@@ -541,7 +564,10 @@ export default {
541
564
  '90': '驳回指定节点',
542
565
  '80': '跳转指定节点',
543
566
  '82': '指定他人处理',
544
- '50': '直接结束流程'
567
+ '50': '直接结束流程',
568
+ '84': '委派任务',
569
+ '61': '交回委派任务',
570
+ '62': '撤回委派任务',
545
571
  },
546
572
  handleTypeList: [
547
573
  {
@@ -574,23 +600,23 @@ export default {
574
600
  },
575
601
  computed: {
576
602
  processHistoryHeight() {
577
- let str = '';
603
+ let str = ''
578
604
  const hasAuditOpinion = this.taskNode && this.handleButtons && this.handleButtons.includes('auditOpinion')
579
605
  const hasAttachmentFile = this.handleButtons && this.handleButtons.includes('auditHistory') && this.attachmentList.length > 0
580
606
  const isDetail = this.isDetail && !this.hisAuditOpinion[0].auditOpinion.length > 0
581
607
  if (hasAuditOpinion && !hasAttachmentFile && !isDetail) {
582
- str += "height: 43vh"
608
+ str += 'height: 43vh'
583
609
  } else if (hasAuditOpinion && hasAttachmentFile && !isDetail) {
584
- str += "height: 40vh"
610
+ str += 'height: 40vh'
585
611
  } else {
586
- str += "height: 67vh"
612
+ str += 'height: 67vh'
587
613
  }
588
- return str;
614
+ return str
589
615
  },
590
616
  nodeColumn: function () {
591
617
  let column = []
592
- column.push({title: '序号', type: 'index', width: 70, align: 'center', fixed: 'left'});
593
- column.push({title: '节点名称', key: 'taskName', minWidth: 150, align: 'center', fixed: 'left'})
618
+ column.push({ title: '序号', type: 'index', width: 70, align: 'center', fixed: 'left' })
619
+ column.push({ title: '节点名称', key: 'taskName', minWidth: 150, align: 'center', fixed: 'left' })
594
620
 
595
621
  column.push({
596
622
  title: '节点状态', key: 'auditResult', minWidth: 150, align: 'center', fixed: 'left',
@@ -636,6 +662,22 @@ export default {
636
662
  }
637
663
  }, '已撤回')
638
664
  ])
665
+ } else if (params.row.auditResult == '61' && params.row.taskNode != this.taskNode) {
666
+ return h('div', [
667
+ h('tag', {
668
+ props: {
669
+ color: '#19be6b'
670
+ }
671
+ }, '已交回委派任务')
672
+ ])
673
+ } else if (params.row.auditResult == '62' && params.row.taskNode != this.taskNode) {
674
+ return h('div', [
675
+ h('tag', {
676
+ props: {
677
+ color: '#ed4014'
678
+ }
679
+ }, '委派任务已撤回')
680
+ ])
639
681
  } else if (params.row.auditResult == '80' && params.row.taskNode != this.taskNode) {
640
682
  return h('div', [
641
683
  h('tag', {
@@ -657,7 +699,7 @@ export default {
657
699
  }
658
700
  })
659
701
  column.push({
660
- title: "操作", width: 100, align: 'center',
702
+ title: '操作', width: 100, align: 'center',
661
703
  render: (h, params) => {
662
704
  return h('div', [
663
705
  h('Button', {
@@ -681,86 +723,85 @@ export default {
681
723
  },
682
724
  reductionColumn: function () {
683
725
  let column = []
684
- column.push({title: '#', key: 'selectId', type: 'selection', align: 'center', width: 55})
685
- column.push({title: '账号', key: 'auditId', align: 'center'})
686
- column.push({title: '姓名', key: 'auditName', align: 'center'})
726
+ column.push({ title: '#', key: 'selectId', type: 'selection', align: 'center', width: 55 })
727
+ column.push({ title: '账号', key: 'auditId', align: 'center' })
728
+ column.push({ title: '姓名', key: 'auditName', align: 'center' })
687
729
  return column
688
730
  },
689
731
  diagramTableColumns: function () {
690
732
  let column = []
691
- column.push({title: '序号', type: 'index', width: 60});
692
- column.push({title: `${this.handleName}节点`, key: 'taskName', minWidth: 130})
693
- column.push({title: `${this.handleName}人`, key: 'auditName', minWidth: 150, tooltip: true})
733
+ column.push({ title: '序号', type: 'index', width: 60 })
734
+ column.push({ title: `${this.handleName}节点`, key: 'taskName', minWidth: 130 })
735
+ column.push({ title: `${this.handleName}人`, key: 'auditName', minWidth: 150, tooltip: true })
694
736
  column.push({
695
737
  title: `${this.handleName}结果`, key: 'auditResult', minWidth: 150, align: 'center',
696
- render: (h, {row, column, index}) => {
697
- let label = "";
698
- let tagColor = "";
699
- if (row.auditResult == '00'){
700
- label = '流程发起';
701
- tagColor = 'green'; // 绿色
702
- }
703
- else if (row.auditResult == '10'){
704
- label = '自动跳过';
705
- tagColor = 'green'; // 绿色
706
- }
707
- else if (row.auditResult == '30'){
708
- label = '通过';
709
- tagColor = 'green'; // 绿色
710
- }
711
- else if (row.auditResult == '40'){
712
- label = '驳回到上一级';
713
- tagColor = 'volcano'; // 火红色
714
- }
715
- else if (row.auditResult == '50'){
716
- label = '驳回到原点';
717
- tagColor = 'red'; // 红色
718
- }
719
- else if (row.auditResult == '51'){
720
- label = '流程终止';
721
- tagColor = 'purple'; // 紫色
722
- }
723
- else if (row.auditResult == '60'){
724
- label = '撤回';
725
- tagColor = 'blue'; // 蓝色
726
- }
727
- else if (row.auditResult == '80'){
728
- label = '跳转到指定节点';
729
- tagColor = 'cyan'; // 青色
730
- }
731
- else if (row.auditResult == '83'){
732
- label = '会签减签';
733
- tagColor = 'red'; // 青色
734
- }
735
- else if (row.auditResult == '90'){
736
- label = '驳回到指定节点';
737
- tagColor = 'magenta'; // 品红色
738
- }
739
- else{
740
- label = '待审核';
741
- tagColor = 'orange'; // 默认橙色
738
+ render: (h, { row, column, index }) => {
739
+ let label = ''
740
+ let tagColor = ''
741
+ if (row.auditResult == '00') {
742
+ label = '流程发起'
743
+ tagColor = 'green' // 绿色
744
+ } else if (row.auditResult == '10') {
745
+ label = '自动跳过'
746
+ tagColor = 'green' // 绿色
747
+ } else if (row.auditResult == '30') {
748
+ label = '通过'
749
+ tagColor = 'green' // 绿色
750
+ } else if (row.auditResult == '40') {
751
+ label = '驳回到上一级'
752
+ tagColor = 'volcano' // 火红色
753
+ } else if (row.auditResult == '50') {
754
+ label = '驳回到原点'
755
+ tagColor = 'red' // 红色
756
+ } else if (row.auditResult == '51') {
757
+ label = '流程终止'
758
+ tagColor = 'purple' // 紫色
759
+ } else if (row.auditResult == '60') {
760
+ label = '撤回'
761
+ tagColor = 'blue' // 蓝色
762
+ } else if (row.auditResult == '61') {
763
+ label = '交回委派任务'
764
+ tagColor = 'green' // 绿色
765
+ } else if (row.auditResult == '62') {
766
+ label = '委派任务被撤回'
767
+ tagColor = 'blue' // 蓝色
768
+ } else if (row.auditResult == '80') {
769
+ label = '跳转到指定节点'
770
+ tagColor = 'cyan' // 青色
771
+ } else if (row.auditResult == '83') {
772
+ label = '会签减签'
773
+ tagColor = 'red' // 青色
774
+ } else if (row.auditResult == '90') {
775
+ label = '驳回到指定节点'
776
+ tagColor = 'magenta' // 品红色
777
+ } else {
778
+ label = '待审核'
779
+ tagColor = 'orange' // 默认橙色
742
780
  }
743
781
  return h('Tag', {
744
782
  props: {
745
783
  color: tagColor,
746
784
  value: row.auditResult
747
785
  }
748
- }, label);
786
+ }, label)
749
787
  }
750
788
  })
751
789
  column.push({
752
790
  title: `${this.handleName}时间`, key: 'auditTime', minWidth: 150,
753
- render: (h, {row}) => {
754
- const displayDate = row.startDate || row.auditDate;
755
- return h('span', displayDate);
791
+ render: (h, { row }) => {
792
+ const displayDate = row.startDate || row.auditDate
793
+ return h('span', displayDate)
756
794
  }
757
795
  })
758
796
  column.push({
759
797
  title: `${this.handleName}意见`, key: 'auditComment', minWidth: 180, tooltip: true,
760
- render: (h, {row, column, index}) => {
761
- let label = "";
762
- if (row.auditComment == '' || row.auditComment == null) label = '无';
763
- else label = row.auditComment;
798
+ render: (h, { row, column, index }) => {
799
+ let label = ''
800
+ if (row.auditComment == '' || row.auditComment == null) {
801
+ label = '无'
802
+ } else {
803
+ label = row.auditComment
804
+ }
764
805
  return h('Label', {
765
806
  props: {
766
807
  value: row.auditComment
@@ -768,12 +809,12 @@ export default {
768
809
  }, label)
769
810
  }
770
811
  })
771
- if (this.showAttachmentFile){
812
+ if (this.showAttachmentFile) {
772
813
  column.push({
773
814
  title: `附件`, key: 'fileList', minWidth: 200,
774
815
  render: (h, { row }) => {
775
816
  if (!row.fileList || row.fileList.length === 0) {
776
- return h('span', '无'); // 如果没有附件,显示“无”
817
+ return h('span', '无') // 如果没有附件,显示“无”
777
818
  }
778
819
 
779
820
  //显示所有附件
@@ -782,7 +823,7 @@ export default {
782
823
  style: {
783
824
  display: 'block',
784
825
  marginTop: '5px',
785
- marginRight:'5px',
826
+ marginRight: '5px',
786
827
  whiteSpace: 'nowrap',
787
828
  overflow: 'hidden',
788
829
  textOverflow: 'ellipsis',
@@ -793,11 +834,11 @@ export default {
793
834
  },
794
835
  on: {
795
836
  click: () => {
796
- this.getAttach(file);
837
+ this.getAttach(file)
797
838
  }
798
839
  },
799
- }, file.attachName);
800
- }));
840
+ }, file.attachName)
841
+ }))
801
842
  }
802
843
  })
803
844
  }
@@ -808,7 +849,7 @@ export default {
808
849
  provide() {
809
850
  return {
810
851
  toBeDoneListDoSearch: this.doSearch
811
- };
852
+ }
812
853
  },
813
854
  methods: {
814
855
  getWidth() {
@@ -834,24 +875,28 @@ export default {
834
875
  taskId: this.taskId,
835
876
  auditGroup: this.auditGroup
836
877
  }
837
- ajax.get(self.smartFlowServerContext + "/manage/processTodo/list", {params: param}).then(function (resp) {
878
+ ajax.get(self.smartFlowServerContext + '/manage/processTodo/list', { params: param }).then(function (resp) {
838
879
  if (resp.data.code === '200') {
839
- self.curTaskId = resp.data.data.rows[0].taskId
840
- self.instanceId = resp.data.data.rows[0].procInstanceId
841
- self.curAuditGroup = resp.data.data.rows[0].auditGroup
842
- let procType = resp.data.data.rows[0].procType
843
- ajax.get(self.smartFlowServerContext + "/manage/processType/lists?proType=" + procType)
880
+ let todoData = resp.data.data.rows[0]
881
+ self.curTaskId = todoData.taskId
882
+ self.instanceId = todoData.procInstanceId
883
+ self.curAuditGroup = todoData.auditGroup
884
+ self.revokeDelegateTask = todoData.delegateStatus ? todoData.delegateStatus === '10' : false
885
+ self.appointTask = todoData.delegateStatus ? todoData.delegateStatus === '20' : false
886
+ if (self.revokeDelegateTask) self.disable = true
887
+ let procType = todoData.procType
888
+ ajax.get(self.smartFlowServerContext + '/manage/processType/lists?proType=' + procType)
844
889
  .then(resp => {
845
890
  let data = resp.data.data.rows
846
891
  self.permScope = data[0].permScope
847
892
  self.defaultOrganTreeType = data[0].organTreeType ? data[0].organTreeType : '00'
848
893
  self.getNodeOrganTreeType(procType)
849
894
  }).catch(err => {
850
- console.log(err);
895
+ console.log(err)
851
896
  })
852
897
  self.getAttachList(self.curTaskId)
853
- self.getHisAudit(self.curTaskId);
854
- self.getProcessHistory(self.curTaskId);
898
+ self.getHisAudit(self.curTaskId)
899
+ self.getProcessHistory(self.curTaskId)
855
900
  } else {
856
901
  self.$Message.error(resp.data.message)
857
902
  }
@@ -859,14 +904,14 @@ export default {
859
904
  console.log(err)
860
905
  })
861
906
  },
862
- getNodeOrganTreeType(procType){
907
+ getNodeOrganTreeType(procType) {
863
908
  const self = this
864
909
  let param = {
865
910
  procType: procType,
866
911
  procId: this.procId,
867
912
  taskNode: this.taskNode
868
913
  }
869
- ajax.get(self.smartFlowServerContext + "/manage/processTodo/getNodeOrganTreeType", {params: param}).then(function (resp) {
914
+ ajax.get(self.smartFlowServerContext + '/manage/processTodo/getNodeOrganTreeType', { params: param }).then(function (resp) {
870
915
  if (resp.data.code === '200') {
871
916
  self.organTreeType = resp.data.data ? resp.data.data : self.defaultOrganTreeType
872
917
  } else {
@@ -885,7 +930,7 @@ export default {
885
930
  taskId: this.taskId,
886
931
  auditGroup: this.auditGroup
887
932
  }
888
- ajax.get(self.smartFlowServerContext + "/manage/processDone/getDoneDetail", {params: param}).then(function (resp) {
933
+ ajax.get(self.smartFlowServerContext + '/manage/processDone/getDoneDetail', { params: param }).then(function (resp) {
889
934
  if (resp.data.code === '200') {
890
935
  let rows = resp.data.data.rows
891
936
  if (rows.length > 0) {
@@ -901,7 +946,7 @@ export default {
901
946
  self.curTaskId = taskList[0].taskId
902
947
  self.instanceId = taskList[0].procInstanceId
903
948
  } else {
904
- ajax.get(self.smartFlowServerContext + "/manage/processTodo/list", {params: param}).then(function (todoResp) {
949
+ ajax.get(self.smartFlowServerContext + '/manage/processTodo/list', { params: param }).then(function (todoResp) {
905
950
  if (todoResp.data.code === '200') {
906
951
  self.curTaskId = todoResp.data.data.rows[0].taskId
907
952
  self.instanceId = todoResp.data.data.rows[0].procInstanceId
@@ -914,8 +959,8 @@ export default {
914
959
  })
915
960
  }
916
961
  self.getAttachList(self.curTaskId)
917
- self.getHisAudit(self.curTaskId);
918
- self.getProcessHistory(self.curTaskId);
962
+ self.getHisAudit(self.curTaskId)
963
+ self.getProcessHistory(self.curTaskId)
919
964
  } else {
920
965
  self.$Message.error(resp.data.message)
921
966
  }
@@ -932,12 +977,12 @@ export default {
932
977
  ajax.post(self.smartFlowServerContext + '/manage/approvalCenter/getNodeData', param).then(function (resp) {
933
978
  if (resp.data.code === '200') {
934
979
  self.handleButtons = resp.data.data[0].handleButtons
935
- if (resp.data.data[0].hasOwnProperty('isSequential')){
936
- self.isParallelCountersignature = !resp.data.data[0].isSequential
980
+ if (resp.data.data[0].hasOwnProperty('isSequential')) {
981
+ self.curNodeType = resp.data.data[0].isSequential ? 'sequentialMultiNode' : 'multiNode'
937
982
  }
938
983
  self.handleName = resp.data.data[0].handleName ? resp.data.data[0].handleName : '审批'
939
984
  self.auditOpinionTitle = resp.data.data[0].handleName ? resp.data.data[0].handleName + '意见' : '审批意见'
940
- if (!self.handleButtons || (!self.handleButtons.includes('auditOpinion') && !self.handleButtons.includes('attachmentFile') && !self.handleButtons.includes('auditHistory'))){
985
+ if (!self.handleButtons || (!self.handleButtons.includes('auditOpinion') && !self.handleButtons.includes('attachmentFile') && !self.handleButtons.includes('auditHistory'))) {
941
986
  self.showProcessInfo = false
942
987
  }
943
988
  } else {
@@ -947,7 +992,7 @@ export default {
947
992
  console.log(err)
948
993
  })
949
994
  },
950
- getNextNodes(){
995
+ getNextNodes() {
951
996
  const self = this
952
997
  self.nextNodesFormList = []
953
998
  self.nextNodesOldSettings = []
@@ -975,38 +1020,38 @@ export default {
975
1020
  candidateGroups: '',
976
1021
  isMultiInstance: data[i].isMultiInstance,
977
1022
  actionType: 'ASSIGNEE',
978
- remainDay : 0,
979
- remainTime : 0,
980
- inAdvanceDay : 0,
981
- inAdvanceTime : 0,
982
- processing : '00'
1023
+ remainDay: 0,
1024
+ remainTime: 0,
1025
+ inAdvanceDay: 0,
1026
+ inAdvanceTime: 0,
1027
+ processing: '00'
983
1028
  }
984
1029
  //显示具体候选人信息
985
- if (data[i].candidateGroups){
1030
+ if (data[i].candidateGroups) {
986
1031
  nextNodeForm.actionType = 'CAND'
987
- let names = [];
988
- let candidates = {};
1032
+ let names = []
1033
+ let candidates = {}
989
1034
  for (let groupName in data[i].candidateGroups) {
990
1035
  if (data[i].candidateGroups.hasOwnProperty(groupName)) {
991
- let group = data[i].candidateGroups[groupName];
1036
+ let group = data[i].candidateGroups[groupName]
992
1037
  group.forEach(item => {
993
- names.push(item.name);
994
- });
995
- candidates[groupName] = group.map(item => item.id + ':' + item.name).join(',');
1038
+ names.push(item.name)
1039
+ })
1040
+ candidates[groupName] = group.map(item => item.id + ':' + item.name).join(',')
996
1041
  }
997
1042
  }
998
- nextNodeForm.candidateNames = names.join(',');
999
- nextNodeForm.candidates = candidates;
1000
- nextNodeOldForm.candidates = candidates;
1043
+ nextNodeForm.candidateNames = names.join(',')
1044
+ nextNodeForm.candidates = candidates
1045
+ nextNodeOldForm.candidates = candidates
1001
1046
  }
1002
1047
  if (data[i].timeLimit) {
1003
- let expireTime = data[i].timeLimit.split(";")[0].split(":")[1]
1004
- let warningTime = data[i].timeLimit.split(";")[1].split(":")[1]
1005
- let handleType = data[i].timeLimit.split(";")[2].split(":")[1]
1006
- let days = expireTime.slice(0, expireTime.indexOf("D")) //过期天
1007
- let hourOfDay = expireTime.slice(expireTime.indexOf("D") + 1, expireTime.indexOf("H")) //过期小时
1008
- let daysWarn = warningTime.slice(0, warningTime.indexOf("D")) //警告天
1009
- let hourOfDayWarn = warningTime.slice(warningTime.indexOf("D") + 1, warningTime.indexOf("H")) //警告小时
1048
+ let expireTime = data[i].timeLimit.split(';')[0].split(':')[1]
1049
+ let warningTime = data[i].timeLimit.split(';')[1].split(':')[1]
1050
+ let handleType = data[i].timeLimit.split(';')[2].split(':')[1]
1051
+ let days = expireTime.slice(0, expireTime.indexOf('D')) //过期天
1052
+ let hourOfDay = expireTime.slice(expireTime.indexOf('D') + 1, expireTime.indexOf('H')) //过期小时
1053
+ let daysWarn = warningTime.slice(0, warningTime.indexOf('D')) //警告天
1054
+ let hourOfDayWarn = warningTime.slice(warningTime.indexOf('D') + 1, warningTime.indexOf('H')) //警告小时
1010
1055
  nextNodeForm.remainDay = parseInt(days)
1011
1056
  nextNodeForm.remainTime = parseInt(hourOfDay)
1012
1057
  nextNodeForm.inAdvanceDay = parseInt(daysWarn)
@@ -1030,10 +1075,10 @@ export default {
1030
1075
  procId: this.procId,
1031
1076
  applyId: this.applyId
1032
1077
  }
1033
- ajax.get(self.smartFlowServerContext + '/manage/processDone/getAttachmentList', {params: param}).then(function (resp) {
1078
+ ajax.get(self.smartFlowServerContext + '/manage/processDone/getAttachmentList', { params: param }).then(function (resp) {
1034
1079
  self.attachmentList = resp.data.data.rows
1035
1080
  self.attachmentList.forEach(item => {
1036
- const index = item.fileName.lastIndexOf(".")
1081
+ const index = item.fileName.lastIndexOf('.')
1037
1082
  const fileType = item.fileName.substr(index + 1).toLowerCase()
1038
1083
  const imageList = ['jpg', 'gif', 'png', 'svg']
1039
1084
  const docList = ['doc', 'docx']
@@ -1043,7 +1088,7 @@ export default {
1043
1088
  item.showPreview = typeList.indexOf(fileType) !== -1
1044
1089
  })
1045
1090
  }).catch(err => {
1046
- console.log(err);
1091
+ console.log(err)
1047
1092
  })
1048
1093
  },
1049
1094
  getHisAudit(taskId) {
@@ -1054,14 +1099,14 @@ export default {
1054
1099
  procId: self.procId,
1055
1100
  taskId: taskId
1056
1101
  }
1057
- ajax.get(self.smartFlowServerContext + '/manage/processTodo/getHisAudit', {params: params}).then(function (resp) {
1102
+ ajax.get(self.smartFlowServerContext + '/manage/processTodo/getHisAudit', { params: params }).then(function (resp) {
1058
1103
  if (resp.data.code === '200') {
1059
1104
  self.hisAudit = resp.data.data
1060
- let uniqueDataMap = {};
1105
+ let uniqueDataMap = {}
1061
1106
  self.hisAudit.forEach((item) => {
1062
- uniqueDataMap[item["taskNode"]] = item;
1107
+ uniqueDataMap[item['taskNode']] = item
1063
1108
  })
1064
- self.hisNode = Object.values(uniqueDataMap);
1109
+ self.hisNode = Object.values(uniqueDataMap)
1065
1110
 
1066
1111
  }
1067
1112
  })
@@ -1074,7 +1119,7 @@ export default {
1074
1119
  procId: self.procId,
1075
1120
  taskId: taskId
1076
1121
  }
1077
- ajax.get(self.smartFlowServerContext + '/manage/processTodo/getProcessHis', {params: params}).then(function (resp) {
1122
+ ajax.get(self.smartFlowServerContext + '/manage/processTodo/getProcessHis', { params: params }).then(function (resp) {
1078
1123
  if (resp.data.code === '200') {
1079
1124
  self.processHistory = resp.data.data
1080
1125
  }
@@ -1087,7 +1132,7 @@ export default {
1087
1132
  self.submit()
1088
1133
  },
1089
1134
  submit() {
1090
- let self = this;
1135
+ let self = this
1091
1136
  self.auditParams = {
1092
1137
  procId: self.procId,
1093
1138
  applyId: self.applyId,
@@ -1100,33 +1145,33 @@ export default {
1100
1145
  selectedUserId: self.selectedUserId,
1101
1146
  }
1102
1147
  if (self.auditResult == '' || self.auditResult == null) {
1103
- self.$Message.error(`请选择${self.handleName}结果!`);
1104
- return;
1148
+ self.$Message.error(`请选择${self.handleName}结果!`)
1149
+ return
1105
1150
  }
1106
1151
  if (self.form.auditOpinion == '' || self.form.auditOpinion == null) {
1107
- if (self.auditResult === '30'){
1152
+ if (self.auditResult === '30') {
1108
1153
  self.auditParams.auditOpinion = '通过'
1109
1154
  self.businessFormSave ? self.businessFormSave(self.handleSaveResult) : self.handleSaveResult(true)
1110
- return;
1155
+ return
1111
1156
  }
1112
- if (!self.handleButtons || self.handleButtons.includes('auditOpinion')) {
1157
+ if ((!self.handleButtons || self.handleButtons.includes('auditOpinion')) && self.auditResult !== '84') {
1113
1158
  self.$Message.error(`请输入${self.handleName}意见!`)
1114
- return;
1159
+ return
1115
1160
  } else {
1116
- self.auditParams.auditOpinion = self.handleButtonsNames[self.auditResult];
1161
+ self.auditParams.auditOpinion = self.handleButtonsNames[self.auditResult]
1117
1162
  }
1118
1163
  }
1119
1164
  self.businessFormSave ? self.businessFormSave(self.handleSaveResult) : self.handleSaveResult(true)
1120
1165
  },
1121
1166
  handleSaveResult(saveResult, businessParams) {
1122
1167
  if (saveResult) {
1123
- this.executeButtonAction(businessParams);
1168
+ this.executeButtonAction(businessParams)
1124
1169
  } else {
1125
- console.error('保存失败');
1170
+ console.error('保存失败')
1126
1171
  }
1127
1172
  },
1128
1173
  executeButtonAction(businessParams) {
1129
- const self = this;
1174
+ const self = this
1130
1175
  if (businessParams) {
1131
1176
  Object.assign(self.datas, businessParams)
1132
1177
  self.auditParams.params = JSON.stringify(self.datas)
@@ -1136,15 +1181,57 @@ export default {
1136
1181
  name: self.handleButtonsNames[self.auditResult]
1137
1182
  }
1138
1183
  if (self.auditResult === '82') {
1184
+ //指定他人处理
1139
1185
  self.assigneeBoxData = self.auditParams
1140
1186
  self.assigneeBoxData.auditResultName = self.handleButtonsNames[self.auditResult]
1141
1187
  self.assigneeBoxData.instanceId = self.instanceId
1142
1188
  self.$refs.assigneeHelpBox.toggleShowHelpBox(self.organTreeType, '', 'transferCurTask')
1189
+ } else if (self.auditResult === '84') {
1190
+ //委派任务
1191
+ self.$refs.assigneeHelpBox.toggleShowHelpBox(self.organTreeType, '', 'delegateTask')
1192
+ } else if (self.auditResult === '62') {
1193
+ //撤回委派任务
1194
+ ajax.post(self.smartFlowServerContext + '/manage/processTodo/audit', self.auditParams).then(resp => {
1195
+ let result = resp.data
1196
+ if (result.code == '200') {
1197
+ self.loading = false
1198
+ self.disable = false
1199
+ self.revokeDelegateTask = false
1200
+ self.$Message.success('撤回委派成功')
1201
+ } else {
1202
+ self.loading = false
1203
+ self.disable = false
1204
+ self.$Message.error(result.message)
1205
+ }
1206
+ })
1207
+ } else if (self.auditResult === '61') {
1208
+ //交回委派任务
1209
+ ajax.post(self.smartFlowServerContext + '/manage/processTodo/audit', self.auditParams).then(resp => {
1210
+ let result = resp.data
1211
+ if (result.code == '200') {
1212
+ self.loading = false
1213
+ self.disable = false
1214
+ self.$Message.success('交回委派任务成功')
1215
+ if (result.data) {
1216
+ let taskIds = result.data.id ? result.data.id : result.data.map(item => item.id).join(',')
1217
+ setTimeout(() => {
1218
+ self.executionCompleted(true, result.data.id ? result.data.processInstanceId : result.data[0].processInstanceId, taskIds, auditResult, self.curTaskId)
1219
+ }, 1000)
1220
+ }
1221
+ } else {
1222
+ self.loading = false
1223
+ self.disable = false
1224
+ self.$Message.error(result.message)
1225
+ }
1226
+ })
1143
1227
  } else if (self.auditResult === '80') {
1228
+ //跳转到后序指定节点
1144
1229
  self.getNodesBehind()
1145
1230
  } else if (self.auditResult === '90') {
1231
+ //驳回到前序指定节点
1146
1232
  self.getAllPreNodes()
1147
1233
  } else if (self.auditResult === '40') {
1234
+ //驳回到上一级
1148
1235
  self.loading = true
1149
1236
  self.disable = true
1150
1237
  let url = self.smartFlowServerContext + '/manage/processTodo/getPreNode'
@@ -1155,11 +1242,11 @@ export default {
1155
1242
  self.$Message.warning(result.message)
1156
1243
  //避免未提示消息直接回调
1157
1244
  setTimeout(() => {
1158
- self.executionCompleted(false, null, null, auditResult, self.curTaskId);
1245
+ self.executionCompleted(false, null, null, auditResult, self.curTaskId)
1159
1246
  }, 1000)
1160
1247
  } else if (result.code == '30010') {
1161
1248
  self.$Modal.confirm({
1162
- title: "提示",
1249
+ title: '提示',
1163
1250
  content: result.message,
1164
1251
  onOk: () => {
1165
1252
  self.auditParams.auditResult = '70'
@@ -1169,10 +1256,10 @@ export default {
1169
1256
  if (result.code == '200') {
1170
1257
  self.loading = false
1171
1258
  self.disable = false
1172
- self.$Message.success(result.message);
1259
+ self.$Message.success(result.message)
1173
1260
  //后端没有返回数据
1174
1261
  setTimeout(() => {
1175
- self.executionCompleted(true, null, null, auditResult, self.curTaskId);
1262
+ self.executionCompleted(true, null, null, auditResult, self.curTaskId)
1176
1263
  }, 1000)
1177
1264
  bus.$emit('triggerTimer')
1178
1265
  } else {
@@ -1180,7 +1267,7 @@ export default {
1180
1267
  self.disable = false
1181
1268
  self.$Message.error(result.message)
1182
1269
  setTimeout(() => {
1183
- self.executionCompleted(false, null, null, auditResult, self.curTaskId);
1270
+ self.executionCompleted(false, null, null, auditResult, self.curTaskId)
1184
1271
  }, 1000)
1185
1272
  }
1186
1273
  bus.$emit('triggerTimer')
@@ -1208,10 +1295,10 @@ export default {
1208
1295
  if (result.code == '200') {
1209
1296
  self.loading = false
1210
1297
  self.disable = false
1211
- self.$Message.success(result.message);
1298
+ self.$Message.success(result.message)
1212
1299
  setTimeout(() => {
1213
1300
  if (result.data) {
1214
- let taskIds = result.data.map(item => item.id).join(',');
1301
+ let taskIds = result.data.map(item => item.id).join(',')
1215
1302
  self.executionCompleted(true, result.data[0].processInstanceId, taskIds, auditResult, self.curTaskId)
1216
1303
  } else {
1217
1304
  self.executionCompleted(true, null, null, auditResult, self.curTaskId)
@@ -1222,7 +1309,7 @@ export default {
1222
1309
  self.disable = false
1223
1310
  self.$Message.error(result.message)
1224
1311
  setTimeout(() => {
1225
- self.executionCompleted(false, null, null, auditResult, self.curTaskId);
1312
+ self.executionCompleted(false, null, null, auditResult, self.curTaskId)
1226
1313
  }, 1000)
1227
1314
  }
1228
1315
  bus.$emit('triggerTimer')
@@ -1230,7 +1317,7 @@ export default {
1230
1317
  }
1231
1318
  })
1232
1319
  } else {
1233
- if (self.auditResult === '30' && (!self.handleButtons || self.handleButtons.includes('appointHandler') || self.handleButtons.includes('appointTimeoutTime'))){
1320
+ if (self.auditResult === '30' && (!self.handleButtons || self.handleButtons.includes('appointHandler') || self.handleButtons.includes('appointTimeoutTime'))) {
1234
1321
  self.getNextNodes()
1235
1322
  self.appointBoxShow = true
1236
1323
  } else {
@@ -1238,16 +1325,16 @@ export default {
1238
1325
  }
1239
1326
  }
1240
1327
  },
1241
- doPass(){
1242
- let self = this;
1328
+ doPass() {
1329
+ let self = this
1243
1330
  this.modal = false
1244
1331
  let auditResult = {
1245
1332
  code: self.auditResult,
1246
1333
  name: self.handleButtonsNames[self.auditResult]
1247
1334
  }
1248
1335
  if (self.auditResult === '82' && (self.targetTaskNode == '' || self.targetTaskNode == null)) {
1249
- self.auditResult = '';
1250
- self.$Message.error(`请选择${self.handleName}节点!`);
1336
+ self.auditResult = ''
1337
+ self.$Message.error(`请选择${self.handleName}节点!`)
1251
1338
  } else {
1252
1339
  self.loading = true
1253
1340
  self.disable = true
@@ -1258,9 +1345,9 @@ export default {
1258
1345
  if (result.code == '200') {
1259
1346
  self.loading = false
1260
1347
  self.disable = false
1261
- self.$Message.success(result.message ? result.message : `${self.handleName}成功`);
1262
- if (result.data){
1263
- let taskIds = result.data.id ? result.data.id : result.data.map(item => item.id).join(',');
1348
+ self.$Message.success(result.message ? result.message : `${self.handleName}成功`)
1349
+ if (result.data) {
1350
+ let taskIds = result.data.id ? result.data.id : result.data.map(item => item.id).join(',')
1264
1351
  setTimeout(() => {
1265
1352
  self.executionCompleted(true, result.data.id ? result.data.processInstanceId : result.data[0].processInstanceId, taskIds, auditResult, self.curTaskId)
1266
1353
  }, 1000)
@@ -1297,9 +1384,9 @@ export default {
1297
1384
  })
1298
1385
  }
1299
1386
  },
1300
- showUpdateMultitaskInstanceModal(updateType){
1387
+ showUpdateMultitaskInstanceModal(updateType) {
1301
1388
  const self = this
1302
- if (updateType === '81'){
1389
+ if (updateType === '81') {
1303
1390
  this.$refs.assigneeHelpBox.toggleShowHelpBox(this.organTreeType, '', 'addMultitaskInstance')
1304
1391
  } else if (updateType === '83') {
1305
1392
  ajax.get(self.smartFlowServerContext + '/manage/processTodo/getUnapprovedListOfMultiNode?taskId=' + self.curTaskId).then(function (resp) {
@@ -1310,11 +1397,11 @@ export default {
1310
1397
  self.$Message.error(resp.data.message)
1311
1398
  }
1312
1399
  }).catch(err => {
1313
- console.log(err);
1400
+ console.log(err)
1314
1401
  })
1315
1402
  }
1316
1403
  },
1317
- updateMultitaskInstance(updateType, assignees){
1404
+ updateMultitaskInstance(updateType, assignees) {
1318
1405
  const self = this
1319
1406
  self.loading = true
1320
1407
  self.disable = true
@@ -1329,24 +1416,57 @@ export default {
1329
1416
  if (result.code == '200') {
1330
1417
  self.loading = false
1331
1418
  self.disable = false
1332
- self.$Message.success(result.message);
1419
+ self.$Message.success(result.message)
1333
1420
  } else {
1334
1421
  self.loading = false
1335
1422
  self.disable = false
1336
1423
  self.$Message.error(result.message)
1337
1424
  }
1338
1425
  }).catch(err => {
1339
- console.log(err);
1426
+ console.log(err)
1427
+ })
1428
+ },
1429
+ //委派
1430
+ delegateTask(assignee) {
1431
+ const self = this
1432
+ if (!assignee){
1433
+ self.$Message.error('请选择加签人员')
1434
+ return
1435
+ }
1436
+ let auditResult = {
1437
+ code: self.auditResult,
1438
+ name: self.handleButtonsNames[self.auditResult]
1439
+ }
1440
+ self.auditParams.selectedUserId = assignee
1441
+ ajax.post(self.smartFlowServerContext + '/manage/processTodo/audit', self.auditParams).then(resp => {
1442
+ let result = resp.data
1443
+ if (result.code == '200') {
1444
+ self.loading = false
1445
+ self.disable = false
1446
+ self.$Message.success('委派成功')
1447
+ if (result.data) {
1448
+ let taskIds = result.data.id ? result.data.id : result.data.map(item => item.id).join(',')
1449
+ setTimeout(() => {
1450
+ self.executionCompleted(true, result.data.id ? result.data.processInstanceId : result.data[0].processInstanceId, taskIds, auditResult, self.curTaskId)
1451
+ }, 1000)
1452
+ }
1453
+ } else {
1454
+ self.loading = false
1455
+ self.disable = false
1456
+ self.$Message.error(result.message)
1457
+ }
1458
+ }).catch(err => {
1459
+ console.log(err)
1340
1460
  })
1341
1461
  },
1342
1462
  //加签
1343
- addMultitaskInstance(assingeeList){
1463
+ addMultitaskInstance(assingeeList) {
1344
1464
  const assingees = assingeeList.join(',')
1345
1465
  this.updateMultitaskInstance('81', assingees)
1346
1466
  },
1347
1467
  //减签
1348
- reductionMultitaskInstance(){
1349
- if (this.reductionAssigneeList.length === 0){
1468
+ reductionMultitaskInstance() {
1469
+ if (this.reductionAssigneeList.length === 0) {
1350
1470
  this.$Message.error('请选择减签人员')
1351
1471
  return
1352
1472
  }
@@ -1361,25 +1481,25 @@ export default {
1361
1481
  console.log(tab)
1362
1482
  },
1363
1483
  getAttach(row) {
1364
- window.open(this.smartFlowServerContext + "/manage/oss/file/get/" + row.fileId, "_blank");
1484
+ window.open(this.smartFlowServerContext + '/manage/oss/file/get/' + row.fileId, '_blank')
1365
1485
  },
1366
1486
  preViewAttach(row) {
1367
1487
  let reg = /\.(gif|jpg|jpeg|bmp|png|PNG)$/
1368
1488
  let regs = /\.(pdf)$/
1369
1489
  if (reg.test(row.fileName)) {
1370
- let url = this.smartFlowServerContext + "/manage/oss/file/get/" + row.fileId;
1371
- this.imgPreview(url);
1490
+ let url = this.smartFlowServerContext + '/manage/oss/file/get/' + row.fileId
1491
+ this.imgPreview(url)
1372
1492
  } else if (regs.test(row.fileName)) {
1373
- window.open(this.smartFlowServerContext + "/manage/oss/file/getFileStream?fileId=" + row.fileId, "_blank");
1493
+ window.open(this.smartFlowServerContext + '/manage/oss/file/getFileStream?fileId=' + row.fileId, '_blank')
1374
1494
  } else {
1375
1495
  this.modalDocx = true
1376
1496
  axios({
1377
1497
  method: 'get',
1378
1498
  responseType: 'blob', // 因为是流文件,所以要指定blob类型
1379
- url: this.smartFlowServerContext + "/manage/oss/file/get/" + row.fileId// 一个word下载文件的接口
1380
- }).then(({data}) => {
1499
+ url: this.smartFlowServerContext + '/manage/oss/file/get/' + row.fileId// 一个word下载文件的接口
1500
+ }).then(({ data }) => {
1381
1501
  docx.renderAsync(data, this.$refs.file, null, {
1382
- className: "docx", //默认和文档样式类的类名/前缀
1502
+ className: 'docx', //默认和文档样式类的类名/前缀
1383
1503
  inWrapper: true, //启用围绕文档内容呈现包装器
1384
1504
  ignoreWidth: false, //禁用页面的渲染宽度
1385
1505
  ignoreHeight: false, //禁用页面的渲染高度
@@ -1398,8 +1518,8 @@ export default {
1398
1518
  }
1399
1519
  },
1400
1520
  imgPreview(url) {
1401
- this.imageUrl = url;
1402
- this.modalVisible = true;
1521
+ this.imageUrl = url
1522
+ this.modalVisible = true
1403
1523
  },
1404
1524
 
1405
1525
  //打印流程图信息
@@ -1411,7 +1531,7 @@ export default {
1411
1531
  procId: self.procId,
1412
1532
  taskId: self.curTaskId,
1413
1533
  }
1414
- ajax.get(self.smartFlowServerContext + '/manage/processTodo/getPrintData', {params: params}).then(function (resp) {
1534
+ ajax.get(self.smartFlowServerContext + '/manage/processTodo/getPrintData', { params: params }).then(function (resp) {
1415
1535
  let result = resp.data.data
1416
1536
  if (resp.data.code === '200') {
1417
1537
  let tableData = result
@@ -1430,16 +1550,16 @@ export default {
1430
1550
  if (this.processHistory.length > 0) {
1431
1551
  let task = null
1432
1552
  this.processHistory.some(itemList => {
1433
- task = itemList.find(item => item.taskId === taskId);
1434
- return task !== undefined;
1435
- });
1553
+ task = itemList.find(item => item.taskId === taskId)
1554
+ return task !== undefined
1555
+ })
1436
1556
  return task ? task.taskName : ''
1437
1557
  }
1438
1558
  return ''
1439
1559
  },
1440
1560
  cancel() {
1441
1561
  this.modal = false
1442
- this.auditResult = '';
1562
+ this.auditResult = ''
1443
1563
  },
1444
1564
  reductionModalCancel() {
1445
1565
  this.reductionMultitaskInstanceModal = false
@@ -1458,7 +1578,7 @@ export default {
1458
1578
  processDefId: self.procId,
1459
1579
  taskId: self.curTaskId,
1460
1580
  }
1461
- ajax.get(self.smartFlowServerContext + '/manage/processTodo/getAllPreNodes', {params: params}).then(function (resp) {
1581
+ ajax.get(self.smartFlowServerContext + '/manage/processTodo/getAllPreNodes', { params: params }).then(function (resp) {
1462
1582
  if (resp.data.code === '200') {
1463
1583
  if (resp.data.data.length > 0) {
1464
1584
  self.allNode = resp.data.data
@@ -1477,7 +1597,7 @@ export default {
1477
1597
  processDefId: self.procId,
1478
1598
  taskId: self.curTaskId,
1479
1599
  }
1480
- ajax.get(self.smartFlowServerContext + '/manage/processTodo/getNodesBehind', {params: params}).then(function (resp) {
1600
+ ajax.get(self.smartFlowServerContext + '/manage/processTodo/getNodesBehind', { params: params }).then(function (resp) {
1481
1601
  if (resp.data.code === '200') {
1482
1602
  if (resp.data.data.length > 0) {
1483
1603
  self.allNode = resp.data.data
@@ -1491,57 +1611,57 @@ export default {
1491
1611
  })
1492
1612
  },
1493
1613
  handleSelectedUser(userId) {
1494
- this.selectedUserId = userId;
1614
+ this.selectedUserId = userId
1495
1615
  },
1496
1616
 
1497
1617
  //折叠动画效果
1498
1618
  beforeEnter(el) {
1499
- el.style.height = '0';
1619
+ el.style.height = '0'
1500
1620
  },
1501
1621
  enter(el, done) {
1502
1622
  setTimeout(() => {
1503
- el.style.height = el.scrollHeight + 'px';
1504
- }, 0);
1623
+ el.style.height = el.scrollHeight + 'px'
1624
+ }, 0)
1505
1625
 
1506
- el.addEventListener('transitionend', done);
1626
+ el.addEventListener('transitionend', done)
1507
1627
  },
1508
1628
  beforeLeave(el) {
1509
- el.style.height = el.scrollHeight + 'px';
1629
+ el.style.height = el.scrollHeight + 'px'
1510
1630
  },
1511
1631
  leave(el, done) {
1512
1632
  setTimeout(() => {
1513
- el.style.height = '0';
1514
- }, 0);
1633
+ el.style.height = '0'
1634
+ }, 0)
1515
1635
 
1516
- el.addEventListener('transitionend', done);
1636
+ el.addEventListener('transitionend', done)
1517
1637
  },
1518
1638
 
1519
1639
  beforeFlowInfoEnter(el) {
1520
- el.style.transform = 'translateX(100%)';
1640
+ el.style.transform = 'translateX(100%)'
1521
1641
  },
1522
1642
  flowInfoEnter(el, done) {
1523
- const transitionDuration = 0.5;
1524
- el.style.transition = `transform ${transitionDuration}s`;
1525
- el.style.transform = 'translateX(0)';
1526
- el.addEventListener('transitionend', done);
1643
+ const transitionDuration = 0.5
1644
+ el.style.transition = `transform ${transitionDuration}s`
1645
+ el.style.transform = 'translateX(0)'
1646
+ el.addEventListener('transitionend', done)
1527
1647
  },
1528
1648
  beforeFlowInfoLeave(el) {
1529
- el.style.transform = 'translateX(0)';
1649
+ el.style.transform = 'translateX(0)'
1530
1650
  },
1531
1651
  flowInfoLeave(el, done) {
1532
- const transitionDuration = 0.5;
1533
- el.style.transition = `transform ${transitionDuration}s`;
1534
- el.style.transform = 'translateX(100%)';
1535
- el.addEventListener('transitionend', done);
1652
+ const transitionDuration = 0.5
1653
+ el.style.transition = `transform ${transitionDuration}s`
1654
+ el.style.transform = 'translateX(100%)'
1655
+ el.addEventListener('transitionend', done)
1536
1656
  },
1537
1657
  uploadFile(file) {
1538
- const self = this;
1658
+ const self = this
1539
1659
  self.fileList = []
1540
1660
  file.forEach(item => {
1541
1661
  self.fileList.push({
1542
1662
  fileName: item.fileName,
1543
1663
  fileId: item.fileCode,
1544
- });
1664
+ })
1545
1665
  })
1546
1666
  },
1547
1667
 
@@ -1555,55 +1675,64 @@ export default {
1555
1675
  item.assignee ? acc[item.id].assignee = item.assignee : ''
1556
1676
  item.candidateGroups ? acc[item.id].candidateGroup = item.candidateGroups : ''
1557
1677
  let timeLimit = 'expireTime:0D0H;warningTime:0D0H;handleType:00'
1558
- if(!(item.remainDay === 0 && item.remainTime === 0 && item.inAdvanceDay === 0 && item.inAdvanceTime === 0)) {
1559
- timeLimit = 'expireTime:' + parseInt(item.remainDay) + "D" + parseInt(item.remainTime) + "H" + ";warningTime:" + parseInt(item.inAdvanceDay) + "D" + parseInt(item.inAdvanceTime) + "H;" + "handleType:" + item.processing;
1678
+ if (!(item.remainDay === 0 && item.remainTime === 0 && item.inAdvanceDay === 0 && item.inAdvanceTime === 0)) {
1679
+ timeLimit = 'expireTime:' + parseInt(item.remainDay) + 'D' + parseInt(item.remainTime) + 'H' + ';warningTime:' + parseInt(item.inAdvanceDay) + 'D' + parseInt(item.inAdvanceTime) + 'H;' + 'handleType:' + item.processing
1560
1680
  acc[item.id].timeLimit = timeLimit
1561
1681
  } else {
1562
1682
  acc[item.id].timeLimit = ''
1563
1683
  }
1564
1684
  oldSettings = self.nextNodesOldSettings.filter(oldSetting => oldSetting.id === item.id)[0]
1565
- if (oldSettings.assignee !== item.assignee || self.checkGroupsUpdate(oldSettings.candidates, item.candidateGroups) || self.checkTimeLimitUpdate(oldSettings.timeLimit, timeLimit)) {
1685
+ if (oldSettings.assignee !== item.assignee || self.checkGroupsUpdate(oldSettings.candidates, item.candidateGroups, item.isMultiInstance) || self.checkTimeLimitUpdate(oldSettings.timeLimit, timeLimit)) {
1566
1686
  acc[item.id].needUpdate = 'true'
1567
1687
  }
1568
- return acc;
1569
- }, {});
1688
+ return acc
1689
+ }, {})
1570
1690
  self.auditParams.nodeConfigMaps = JSON.stringify(params)
1571
1691
  self.doPass((execResult, instanceId, taskIds, auditResult, curTaskId) => {
1572
1692
  if (this.executionCompleted) {
1573
- this.executionCompleted(execResult, instanceId, taskIds, auditResult, curTaskId);
1693
+ this.executionCompleted(execResult, instanceId, taskIds, auditResult, curTaskId)
1574
1694
  }
1575
1695
  })
1576
1696
  },
1577
- checkGroupsUpdate(oldSetting, newSetting) {
1697
+ checkGroupsUpdate(oldSetting, newSetting, isMultiInstance) {
1578
1698
  if (oldSetting && newSetting) {
1579
1699
  let oldIdList = []
1580
1700
  for (let [key, value] of Object.entries(oldSetting)) {
1581
1701
  if (value) {
1582
1702
  value.split(',').forEach(part => {
1583
- const [id] = part.split(':');
1703
+ const [id] = part.split(':')
1584
1704
  if (id) {
1585
- oldIdList.push(id);
1705
+ oldIdList.push(id)
1586
1706
  }
1587
1707
  })
1588
1708
  }
1589
1709
  }
1590
- const regex = /(?:O:|U:|P:|R:|T:)([^,]+)/g;
1591
- let match;
1592
- const newIds = [];
1710
+ const regex = /(?:O:|U:|P:|R:|T:)([^,]+)/g
1711
+ let match
1712
+ const newIds = []
1593
1713
  while ((match = regex.exec(newSetting)) !== null) {
1594
1714
  newIds.push(...match[1].split(';'))
1595
1715
  }
1596
- const allInString = oldIdList.every(item => newIds.includes(item));
1597
- const hasExtra = newIds.some(item => !oldIdList.includes(item));
1598
- return !allInString || hasExtra
1716
+
1717
+ if (isMultiInstance) {
1718
+ //串签的情况下可能只有顺序发生了变化
1719
+ const oldStr = oldIdList.join(',')
1720
+ const newStr = newIds.join(',')
1721
+ return oldStr !== newStr
1722
+ }else {
1723
+ const allInString = oldIdList.every(item => newIds.includes(item));
1724
+ const hasExtra = newIds.some(item => !oldIdList.includes(item));
1725
+ return !allInString || hasExtra
1726
+ }
1727
+
1599
1728
  }
1600
1729
  return false
1601
1730
  },
1602
- checkTimeLimitUpdate(oldSetting, newSetting){
1603
- if (oldSetting && newSetting){
1731
+ checkTimeLimitUpdate(oldSetting, newSetting) {
1732
+ if (oldSetting && newSetting) {
1604
1733
  return oldSetting !== newSetting
1605
1734
  }
1606
- if (!oldSetting){
1735
+ if (!oldSetting) {
1607
1736
  return newSetting !== 'expireTime:0D0H;warningTime:0D0H;handleType:00'
1608
1737
  }
1609
1738
  return false
@@ -1616,9 +1745,9 @@ export default {
1616
1745
  candidateGroupsReadingRangeClick(item) {
1617
1746
  let permScope = item.orgTreeType === this.defaultOrganTreeType ? this.permScope : 'all'
1618
1747
  let orgTreeType = item.orgTreeType ? item.orgTreeType : this.defaultOrganTreeType
1619
- this.$refs.candidateGroupsHelpBox.toggleShowHelpBox(permScope, item.candidates, orgTreeType, item.id);
1748
+ this.$refs.candidateGroupsHelpBox.toggleShowHelpBox(permScope, item.candidates, orgTreeType, item.id)
1620
1749
  },
1621
- updateCandGroups(newCandGroups, nameStr, detail, nodeId){
1750
+ updateCandGroups(newCandGroups, nameStr, detail, nodeId) {
1622
1751
  let oldSettings = this.nextNodesOldSettings.filter(item => item.id === nodeId)[0]
1623
1752
  if (JSON.stringify(oldSettings.candidates) != JSON.stringify(detail)) {
1624
1753
  let node = this.nextNodesFormList.filter(item => item.id === nodeId)[0]
@@ -1626,26 +1755,26 @@ export default {
1626
1755
  node.candidateNames = nameStr
1627
1756
  node.candidates = detail
1628
1757
  node.needUpdate = true
1629
- this.$forceUpdate();
1758
+ this.$forceUpdate()
1630
1759
  }
1631
1760
  },
1632
- updateNextNodeAssignee(selectedAssigneeId, selectedAssigneeName, nodeId){
1761
+ updateNextNodeAssignee(selectedAssigneeId, selectedAssigneeName, nodeId) {
1633
1762
  let oldSettings = this.nextNodesOldSettings.filter(item => item.id === nodeId)[0]
1634
1763
  if (oldSettings.assignee != selectedAssigneeId) {
1635
1764
  let node = this.nextNodesFormList.filter(item => item.id === nodeId)[0]
1636
1765
  node.assignee = selectedAssigneeId
1637
1766
  node.assigneeName = selectedAssigneeName
1638
1767
  node.needUpdate = true
1639
- this.$forceUpdate();
1768
+ this.$forceUpdate()
1640
1769
  }
1641
1770
  }
1642
1771
  },
1643
1772
  watch: {
1644
1773
  auditOpinionText(label) {
1645
- this.form.auditOpinion = label;
1774
+ this.form.auditOpinion = label
1646
1775
  },
1647
1776
  procId(val) {
1648
- this.procId = val;
1777
+ this.procId = val
1649
1778
  this.initData()
1650
1779
  },
1651
1780
  }