@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.
package/src/portrait.vue CHANGED
@@ -1,1799 +1,1808 @@
1
- <template>
2
- <LamboPageContainer>
3
- <template slot="page-title">
4
- {{ title }}
5
- </template>
6
- <template slot="page-extend">
7
- <slot name="return-button"></slot>
8
- </template>
9
- <div class="portrait-lambo-indicator-card"
10
- :style="{float: 'left', width: isExpanded && showProcessInfo ? `calc(100% - ${portraitWidth+10}px)` : '99%'}">
11
- <slot name="business-content">
12
- </slot>
13
- </div>
14
-
15
- <a v-if="showProcessInfo" @click="isExpanded = !isExpanded" class="arrow-button-container"
16
- :style="{right: isExpanded ? portraitWidth+10 + 'px' : '10px'}">
17
- <Icon class="icon-class" v-if="isExpanded" type="ios-arrow-forward"/>
18
- <Icon class="icon-class" v-if="!isExpanded" type="ios-arrow-back"/>
19
- </a>
20
- <transition v-if="showProcessInfo" name="draw" @before-enter="beforeFlowInfoEnter" @enter="flowInfoEnter"
21
- @before-leave="beforeFlowInfoLeave" @leave="flowInfoLeave">
22
- <lamboIndicatorCard v-show="isExpanded" class="portrait-lambo-indicator-card"
23
- :style="{width: portraitWidth + 'px', float: 'right'}" :hasExtend="false">
24
- <div slot="content-title">流程信息</div>
25
- <a v-if="!isDetail" @click="auditShow = !auditShow">
26
- <Title
27
- v-if="handleButtons && (handleButtons.includes('auditOpinion') || handleButtons.includes('attachmentFile'))">
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 }}信息
32
- </a>
33
- </Title>
34
- </a>
35
- <transition v-if="!isDetail" name="draw" @before-enter="beforeEnter" @enter="enter" @before-leave="beforeLeave"
36
- @leave="leave">
37
- <div class="box" v-show="auditShow">
38
- <Form ref="auditOpinion" justify="center" :label-width="100" :model="form"
39
- v-if="handleButtons && handleButtons.includes('auditOpinion')"
40
- style="margin: 10px 0 0 10px;" :rules="ruleValidate">
41
- <FormItem :label="auditOpinionTitle" prop="auditOpinion">
42
- <AuditOpinion v-model="form.auditOpinion" :attachment-file="handleButtons.includes('attachmentFile')"
43
- :attachmentdata="fileList" :default-audit-opinion="defaultAuditOpinion"
44
- :smart-flow-server-context="smartFlowServerContext"></AuditOpinion>
45
- </FormItem>
46
- </Form>
47
- <Form ref="auditOpinion" justify="center" :label-width="100"
48
- v-if="handleButtons && !handleButtons.includes('auditOpinion') && handleButtons.includes('attachmentFile')"
49
- style="margin: 10px 0 0 10px;">
50
- <FormItem style="min-height: 70px">
51
- <Tooltip placement="bottom" max-width="200">
52
- <div style="font-size: smaller" slot="content">支持扩展名:.pdf .doc .docx .txt .xls .xlsx .jpg .jpeg
53
- .png .gif
54
- </div>
55
- <UploadFile @upload-result="uploadFile" :multiple="true"
56
- :oss-server-context="smartFlowServerContext"
57
- :oss-file-put-url="ossFilePutUrl"></UploadFile>
58
- </Tooltip>
59
- </FormItem>
60
- </Form>
61
- </div>
62
- </transition>
63
- <a v-if="taskNode && isDetail && hisAuditOpinion[0].auditOpinion" @click="auditShow = !auditShow">
64
- <Title
65
- v-if="handleButtons && (handleButtons.includes('auditOpinion') || handleButtons.includes('attachmentFile'))">
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 }}信息
70
- </a>
71
- </Title>
72
- </a>
73
- <transition v-if="taskNode && isDetail && hisAuditOpinion[0].auditOpinion" name="draw"
74
- @before-enter="beforeEnter"
75
- @enter="enter" @before-leave="beforeLeave" @leave="leave">
76
- <div class="box" v-show="auditShow">
77
- <Form ref="auditOpinion" justify="center" :model="form"
78
- v-if="handleButtons && handleButtons.includes('auditOpinion')"
79
- style="margin: 10px 0 0 10px;" :rules="ruleValidate">
80
- <FormItem style="margin-left: -60px">
81
- <Card v-for="(item, index) in hisAuditOpinion" :key="index">
82
- <Row>
83
- <Col span="12" style="word-wrap: break-word">{{ item.auditOpinion }}</Col>
84
- <Col span="2"></Col>
85
- <Col span="10">{{ item.auditTime }}</Col>
86
- </Row>
87
- </Card>
88
- </FormItem>
89
- </Form>
90
- </div>
91
- </transition>
92
- <a @click="historyShow = !historyShow">
93
- <Title v-if="handleButtons && handleButtons.includes('auditHistory')">
94
- <a style="color: #989898">
95
- <Icon v-if="historyShow" type="ios-arrow-down"/>
96
- <Icon v-if="!historyShow" type="ios-arrow-up"/>
97
- {{ handleName }}记录
98
- </a>
99
- </Title>
100
- </a>
101
- <transition name="draw" @before-enter="beforeEnter" @enter="enter" @before-leave="beforeLeave" @leave="leave">
102
- <div class="box" v-show="historyShow">
103
- <Card class="process-history" :style="processHistoryHeight" dis-hover :bordered="false"
104
- v-if="handleButtons && handleButtons.includes('auditHistory')">
105
- <processHistory :portrait-width="portraitWidth" :list="processHistory" :done-page="isDetail"
106
- :push-button="pushButton"
107
- :smart-flow-server-context="smartFlowServerContext"></processHistory>
108
- </Card>
109
- </div>
110
- </transition>
111
-
112
- <a @click="attachListShow = !attachListShow">
113
- <Title v-if="handleButtons && handleButtons.includes('attachmentFile') && attachmentList.length > 0">
114
- <a style="color: #989898">
115
- <Icon v-if="attachListShow" type="ios-arrow-down"/>
116
- <Icon v-if="!attachListShow" type="ios-arrow-up"/>
117
- 查看附件
118
- </a>
119
- </Title>
120
- </a>
121
- <transition name="draw" @before-enter="beforeEnter" @enter="enter" @before-leave="beforeLeave" @leave="leave">
122
- <div class="box"
123
- v-show="handleButtons && handleButtons.includes('auditHistory') && attachmentList.length > 0 && attachListShow">
124
- <div v-for="(item, index) in attachmentList" :key="index">
125
- <Card dis-hover class="attach-card">
126
- <List item-layout="vertical">
127
- <ListItem style="margin-top: -8px">
128
- <Row style="display: flex; align-items: center;">
129
- <!-- 左边:图片 -->
130
- <Col span="4" style="margin-top: -25px">
131
- <avatar v-if="item.fileType === 'image'" icon="ios-image-outline" class="attach-avatar"
132
- style="background-color: #005aff"
133
- :style="portraitWidth >= 600 ? 'margin-left: 10px' : ''"
134
- :size="portraitWidth >= 600 ? 'middle' : 'small'"></avatar>
135
- <avatar v-else-if="item.fileType === 'doc'" icon="ios-document-outline" class="attach-avatar"
136
- style="background-color: #005aff"
137
- :style="portraitWidth >= 600 ? 'margin-left: 10px' : ''"
138
- :size="portraitWidth >= 600 ? 'middle' : 'small'">
139
- </avatar>
140
- <avatar v-else-if="item.fileType === 'xlsx'" icon="ios-document-outline" class="attach-avatar"
141
- style="background-color: #19be6b"
142
- :style="portraitWidth >= 600 ? 'margin-left: 10px' : ''"
143
- :size="portraitWidth >= 600 ? 'middle' : 'small'"></avatar>
144
- <avatar v-else-if="item.fileType === 'pdf'" icon="ios-document-outline" class="attach-avatar"
145
- style="background-color: #ed4014"
146
- :style="portraitWidth >= 600 ? 'margin-left: 10px' : ''"
147
- :size="portraitWidth >= 600 ? 'middle' : 'small'"></avatar>
148
- <avatar v-else icon="ios-document-outline" class="attach-avatar"
149
- :style="portraitWidth >= 600 ? 'margin-left: 10px' : ''"
150
- :size="portraitWidth >= 600 ? 'middle' : 'small'"></avatar>
151
- </Col>
152
- <!-- 右边:附件信息 -->
153
- <Col span="20">
154
- <Row>
155
- <tooltip>
156
- <span class="attach-name-style"> {{ item.attachName }}</span>
157
- <div slot="content" style="white-space: normal"> {{ item.attachName }}</div>
158
- </tooltip>
159
- </Row>
160
- <Row style="margin-top: 3px">
161
- <span style="color: #005aff; font-size: 13px;">{{ item.uploadUserName }}</span>
162
- <Divider style="background-color:#808695;height: 1em;margin: 4px 9px 0 6px;"
163
- type="vertical"/>
164
- <span style="color: #808695;font-size: 13px"
165
- >{{ showTaskNode(item.taskId) }}</span>
166
- </Row>
167
- <Row style="margin-bottom: -10px; margin-top: 10px">
168
- <template>
169
- <Button @click="getAttach(item)" size="small">下载</Button>
170
- <Button v-if="item.showPreview" ghost type="primary" @click="preViewAttach(item)"
171
- style="margin-left: 10px" size="small">预览
172
- </Button>
173
- </template>
174
- </Row>
175
- </Col>
176
- </Row>
177
-
178
- </ListItem>
179
- </List>
180
- </Card>
181
- </div>
182
- </div>
183
- </transition>
184
- <Modal title="查看附件" v-model="modalVisible" fullscreen scrollable :mask="false">
185
- <img :src="imageUrl" v-if="modalVisible" alt="" style="width: 100%">
186
- <div slot="footer">
187
- <Button type="primary" @click="modalVisible = false">关闭</Button>
188
- </div>
189
- </Modal>
190
- <Modal title="查看附件" v-model="modalDocx" fullscreen scrollable :mask="false">
191
- <div ref="file"></div>
192
- </Modal>
193
- </lamboIndicatorCard>
194
- </transition>
195
-
196
- <Modal v-model="modal1" title="选择节点"
197
- @on-cancel="cancel"
198
- @on-ok="doPass">
199
- <Table border
200
- :data="allNode"
201
- :columns="nodeColumn"
202
- highlight-row
203
- @on-current-change="selectNode">
204
- </Table>
205
- </Modal>
206
- <assigneeBox ref="assigneeHelpBox" :execution-completed="executionCompleted"
207
- @update-selected="handleSelectedUser" @update-next-node-assignee="updateNextNodeAssignee"
208
- @add-multitask-instance="addMultitaskInstance" @delegate-task-assignee="delegateTask"
209
- :data="assigneeBoxData" :smart-flow-server-context="smartFlowServerContext"
210
- :upms-server-context="upmsServerContext"/>
211
- <Modal v-model="modalBoxShow" width="1000" title="流程跟踪图">
212
- <Workflow_Diagram ref="processTrace" :instanceId="process.instanceId" :applyId="process.applyId"
213
- :procId="process.procId" :table-columns="diagramTableColumns"
214
- :tableData="process.tableData" :hisAudit="hisAudit"
215
- :approve-detail-show-way="approveDetailShowWay"
216
- :smart-flow-server-context="smartFlowServerContext">
217
- </Workflow_Diagram>
218
- </Modal>
219
- <Modal v-model="reductionMultitaskInstanceModal" title="会签减签"
220
- @on-cancel="reductionModalCancel"
221
- @on-ok="reductionMultitaskInstance">
222
- <Table border
223
- :data="unapprovedAssigneeList"
224
- :columns="reductionColumn"
225
- @on-selection-change="selectAssignee">
226
- </Table>
227
- </Modal>
228
- <Modal v-model="appointBoxShow" title="下一环节设置"
229
- @on-cancel="appointBoxShow = false" width="600"
230
- @on-ok="appointOk">
231
- <Card v-for="(item,index) of nextNodesFormList" :key="index" style="margin-bottom: 10px"
232
- v-if="handleButtons && (handleButtons.includes('appointHandler') || handleButtons.includes('appointTimeoutTime'))">
233
- <Form ref="appointBox" justify="center" :label-width="100" :model="item"
234
- style="margin: 10px 0 0 10px;" :rules="ruleValidate">
235
- <div v-if="handleButtons && handleButtons.includes('appointHandler')">
236
- <FormItem label="下一环节:">
237
- {{ item.name }}
238
- </FormItem>
239
- <FormItem label="人员类型:" v-if="!item.isMultiInstance">
240
- <RadioGroup v-model="item.actionType">
241
- <Radio label="ASSIGNEE">办理人</Radio>
242
- <Radio label="CAND">候选人</Radio>
243
- </RadioGroup>
244
- </FormItem>
245
- <FormItem label="办理人员:" prop="assignee" v-if="!item.isMultiInstance && item.actionType === 'ASSIGNEE'">
246
- <Input v-model="item.assigneeName"
247
- placeholder="请选择办理人"
248
- style="width: 68%"
249
- icon="md-apps"
250
- @on-focus="readingRangeClick(item)"
251
- @on-click="readingRangeClick(item)"/>
252
- </FormItem>
253
- <FormItem label="候选人员:" prop="candidateGroups"
254
- v-if="!item.isMultiInstance && item.actionType === 'CAND'">
255
- <Input v-model="item.candidateNames"
256
- placeholder="请选择候选人"
257
- style="width: 68%"
258
- icon="md-apps"
259
- @on-focus="candidateGroupsReadingRangeClick(item)"
260
- @on-click="candidateGroupsReadingRangeClick(item)"/>
261
- </FormItem>
262
- <FormItem label="候选人员:" prop="candidateGroups"
263
- v-if="item.isMultiInstance && item.actionType === 'CAND'">
264
- </FormItem>
265
-
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"/>
271
- </div>
272
- <div v-if="handleButtons && handleButtons.includes('appointTimeoutTime')">
273
- <Row>
274
- <Col span="12">
275
- <FormItem label="停留时间:">
276
- <Input v-model="item.remainDay" style="width: 100px" type="number" :min="0"></Input>
277
-
278
- </FormItem>
279
- </Col>
280
- <Col span="12">
281
- <FormItem>
282
- <Input v-model="item.remainTime" style="margin-left: -140px; width: 100px" type="number"
283
- :min="0"></Input>
284
- 小时 自动处理
285
- </FormItem>
286
- </Col>
287
- </Row>
288
- <Row>
289
- <Col span="12">
290
- <FormItem label="任务提前:">
291
- <Input v-model="item.inAdvanceDay" style="width: 100px" type="number" :min="0"></Input>
292
-
293
- </FormItem>
294
- </Col>
295
- <Col span="12">
296
- <FormItem>
297
- <Input v-model="item.inAdvanceTime" style="margin-left: -140px;width: 100px" type="number"
298
- :min="0"></Input>
299
- 小时 标红预警
300
- </FormItem>
301
- </Col>
302
- </Row>
303
- <FormItem label="处理方式:">
304
- <Select v-model="item.processing" style="width:200px" placeholder="自动同意">
305
- <Option v-for="item in handleTypeList" :value="item.value" :key="item.value">
306
- {{ item.label }}
307
- </Option>
308
- </Select>
309
- </FormItem>
310
- </div>
311
- </Form>
312
- </Card>
313
- </Modal>
314
- <candidateGroupsHelpBox ref="candidateGroupsHelpBox" :show="candidateGroupsHelpBoxShow"
315
- @update-cand-groups="updateCandGroups"
316
- :upms-server-context="upmsServerContext"
317
- :smart-flow-server-context="smartFlowServerContext"/>
318
- <template slot="page-footer">
319
- <div>
320
- <slot name="footer-button"></slot>
321
- <Button style="margin-left: 10px;" v-if="handleButtons && handleButtons.includes('auditTo70') && !isDetail && !appointTask"
322
- :disabled="disable" :loading="loading" @click="audit('70')">驳回到原点
323
- </Button>
324
- <Button style="margin-left: 10px;" v-if="handleButtons && handleButtons.includes('auditTo40') && !isDetail && !appointTask"
325
- :disabled="disable" :loading="loading" @click="audit('40')">驳回上一节点
326
- </Button>
327
- <Button style="margin-left: 10px;" v-if="handleButtons && handleButtons.includes('auditTo90') && !isDetail && !appointTask"
328
- :disabled="disable" :loading="loading" @click="audit('90')">驳回指定节点
329
- </Button>
330
- <Button style="margin-left: 10px;" v-if="handleButtons && handleButtons.includes('auditTo80') && !isDetail && !appointTask"
331
- :disabled="disable" :loading="loading" @click="audit('80')">跳转指定节点
332
- </Button>
333
- <Button style="margin-left: 10px;" v-if="handleButtons && handleButtons.includes('auditTo82') && !isDetail && !appointTask"
334
- :disabled="disable" :loading="loading" @click="audit('82')">指定他人处理
335
- </Button>
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"
342
- :disabled="disable" :loading="loading" @click="showUpdateMultitaskInstanceModal('81')">加签
343
- </Button>
344
- <Button style="margin-left: 10px;"
345
- v-if="curNodeType === 'multiNode' && handleButtons && handleButtons.includes('reductionMultitaskInstance') && !isDetail && !appointTask"
346
- :disabled="disable" :loading="loading" @click="showUpdateMultitaskInstanceModal('83')">减签
347
- </Button>
348
- <Button style="margin-left: 10px;" v-if="handleButtons && handleButtons.includes('auditTo50') && !isDetail && !appointTask"
349
- :disabled="disable" :loading="loading" @click="audit('50')">直接结束流程
350
- </Button>
351
- <Button style="margin-left: 10px;" v-if="handleButtons && handleButtons.includes('processTrace')"
352
- @click="processPrint">流程跟踪图
353
- </Button>
354
- <Button style="margin-left: 10px;" v-if="handleButtons && handleButtons.includes('auditTo30') && !isDetail && !appointTask"
355
- :disabled="disable" :loading="loading" type="primary" @click="audit('30')">通过
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>
361
- </div>
362
- </template>
363
- </LamboPageContainer>
364
- </template>
365
-
366
-
367
- <script>
368
- import LamboPageContainer from '@lambo-design/page-container'
369
- import LamboIndicatorCard from '@lambo-design/indicator-card'
370
- import Workflow_Diagram from './workflow-diagram'
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'
383
-
384
- // 引入docx-preview插件
385
- let docx = require('docx-preview')
386
-
387
- export default {
388
- props: {
389
- isDetail: {
390
- type: Boolean,
391
- required: false,
392
- default: false
393
- },
394
- width: {
395
- type: Number,
396
- required: false,
397
- default: 400
398
- },
399
- procId: {
400
- type: String,
401
- required: true,
402
- },
403
- taskNode: {
404
- type: String,
405
- required: true,
406
- },
407
- applyId: {
408
- type: String,
409
- required: true,
410
- },
411
- taskId: {
412
- type: String,
413
- required: false,
414
- default: '',
415
- },
416
- auditGroup: {
417
- type: String,
418
- required: false,
419
- default: '',
420
- },
421
- defaultAuditOpinion: {
422
- type: String,
423
- required: false,
424
- default: '',
425
- },
426
- //详情页催办按钮
427
- pushButton: {
428
- type: Boolean,
429
- required: false,
430
- default: true,
431
- },
432
- //流程跟踪图附件列
433
- showAttachmentFile: {
434
- type: Boolean,
435
- required: false,
436
- default: true,
437
- },
438
- //流程跟踪图审批详情触发方式
439
- approveDetailShowWay: {
440
- type: String,
441
- required: false,
442
- default: 'click',
443
- },
444
- //业务表单保存方法
445
- businessFormSave: {
446
- type: Function,
447
- required: false
448
- },
449
- //按钮执行完毕回调方法
450
- executionCompleted: {
451
- type: Function,
452
- required: false,
453
- default: () => {
454
- }
455
- },
456
- title: {
457
- type: String,
458
- default: '流程办理'
459
- },
460
- smartFlowServerContext: {
461
- type: String,
462
- default: '/api/smart-flow-server',
463
- },
464
- upmsServerContext: {
465
- type: String,
466
- default: '/api/upms-server',
467
- },
468
- },
469
- components: {
470
- Title,
471
- LamboPageContainer,
472
- Workflow_Diagram,
473
- processHistory,
474
- assigneeBox,
475
- LamboPagingTable,
476
- AuditOpinion,
477
- LamboIndicatorCard,
478
- UploadFile,
479
- CandidateGroupsHelpBox,
480
- CountersingersBox
481
- },
482
- data() {
483
- return {
484
- isExpanded: true,
485
- showProcessInfo: true,
486
- portraitWidth: 0,
487
- requestSuccessCodes: [200, '200'],
488
- auditShow: true,
489
- historyShow: true,
490
- attachListShow: true,
491
- attachmentList: [],
492
- modalVisible: false,
493
- modalDocx: false,
494
- imageUrl: '',
495
- assigneeBoxData: {},
496
- selectedUserId: '',
497
- targetTaskNode: '',
498
- allNode: [],
499
- auditParams: {},
500
- modal1: false,
501
- modalBoxShow: false,
502
- reductionMultitaskInstanceModal: false,
503
- candidateGroupsHelpBoxShow: false,
504
- appointBoxShow: false,
505
- autoOpenNode: '0',
506
- unapprovedAssigneeList: [],
507
- reductionAssigneeList: [],
508
- nextNodesOldSettings: [],
509
- nextNodesFormList: [],
510
- hisNode: [],
511
- processHistory: [],
512
- permScope: '',
513
- organTreeType: '00',
514
- defaultOrganTreeType: '00',
515
- ruleValidate: {
516
- auditOpinion: [{ required: true, trigger: 'blur', message: '意见不能为空' }],
517
- assignee: [{ required: true, trigger: 'blur', message: '办理人不能为空' }],
518
- candidateGroups: [{ required: true, trigger: 'blur', message: '候选人不能为空' }],
519
- },
520
- form: {
521
- auditOpinion: '',
522
- },
523
- loading: false,
524
- disable: false,
525
- revokeDelegateTask: false,
526
- appointTask: false,
527
- instanceId: '',
528
- curTaskId: '',
529
- curNodeType: 'userTask',
530
- handleButtons: [],
531
- handleName: '',
532
- auditOpinionTitle: '',
533
- auditResult: '',
534
- curAuditGroup: '',
535
- custChange: 'auditInfo',
536
- auditInfo: 'auditInfo',
537
- auditProcess: 'auditProcess',
538
- fileList: [],
539
- ossFilePutUrl: '/manage/oss/file/put',
540
- hisAudit: [],
541
- hisAuditOpinion: [{
542
- auditOpinion: '',
543
- auditTime: '',
544
- }],
545
- datas: {
546
- orgName: '',
547
- orgId: ''
548
- },
549
- editForm: {
550
- approvalCost: '',
551
- cost: '',
552
- activityDate: []
553
- },
554
- process: {
555
- tableData: [],
556
- instanceId: '',
557
- applyId: '',
558
- procId: ''
559
- },
560
- handleButtonsNames: {
561
- '30': '通过',
562
- '70': '驳回到原点',
563
- '40': '驳回上一节点',
564
- '90': '驳回指定节点',
565
- '80': '跳转指定节点',
566
- '82': '指定他人处理',
567
- '50': '直接结束流程',
568
- '84': '委派任务',
569
- '61': '交回委派任务',
570
- '62': '撤回委派任务',
571
- },
572
- handleTypeList: [
573
- {
574
- value: '00',
575
- label: '只预警不处理'
576
- },
577
- {
578
- value: '10',
579
- label: '自动同意'
580
- },
581
- {
582
- value: '20',
583
- label: '直接终止流程'
584
- },
585
- {
586
- value: '90',
587
- label: '自动驳回'
588
- }
589
- ],
590
- }
591
-
592
- },
593
-
594
- mounted() {
595
- this.getWidth()
596
- if (this.procId) {
597
- this.initData()
598
- }
599
-
600
- },
601
- computed: {
602
- processHistoryHeight() {
603
- let str = ''
604
- const hasAuditOpinion = this.taskNode && this.handleButtons && this.handleButtons.includes('auditOpinion')
605
- const hasAttachmentFile = this.handleButtons && this.handleButtons.includes('auditHistory') && this.attachmentList.length > 0
606
- const isDetail = this.isDetail && !this.hisAuditOpinion[0].auditOpinion.length > 0
607
- if (hasAuditOpinion && !hasAttachmentFile && !isDetail) {
608
- str += 'height: 43vh'
609
- } else if (hasAuditOpinion && hasAttachmentFile && !isDetail) {
610
- str += 'height: 40vh'
611
- } else {
612
- str += 'height: 67vh'
613
- }
614
- return str
615
- },
616
- nodeColumn: function () {
617
- let column = []
618
- column.push({ title: '序号', type: 'index', width: 70, align: 'center', fixed: 'left' })
619
- column.push({ title: '节点名称', key: 'taskName', minWidth: 150, align: 'center', fixed: 'left' })
620
-
621
- column.push({
622
- title: '节点状态', key: 'auditResult', minWidth: 150, align: 'center', fixed: 'left',
623
- render: (h, params) => {
624
- if (params.row.taskNode == this.taskNode) {
625
- return h('div', [
626
- h('tag', {
627
- props: {
628
- color: '#ff9900'
629
- }
630
- }, '当前节点')
631
- ])
632
- } else if (!params.row.auditResult) {
633
- return h('div', [
634
- h('tag', {
635
- props: {
636
- color: '#ff9900'
637
- }
638
- }, `未${params.row.handleName ? params.row.handleName : '审批'}`)
639
- ])
640
- } else {
641
- if (params.row.auditResult == '30' && params.row.taskNode != this.taskNode) {
642
- return h('div', [
643
- h('tag', {
644
- props: {
645
- color: '#19be6b'
646
- }
647
- }, `已${params.row.handleName ? params.row.handleName : '审批'}通过`)
648
- ])
649
- } else if (params.row.auditResult == '40' && params.row.taskNode != this.taskNode) {
650
- return h('div', [
651
- h('tag', {
652
- props: {
653
- color: '#ed4014'
654
- }
655
- }, '已驳回到上一节点')
656
- ])
657
- } else if (params.row.auditResult == '60' && params.row.taskNode != this.taskNode) {
658
- return h('div', [
659
- h('tag', {
660
- props: {
661
- color: '#ed4014'
662
- }
663
- }, '已撤回')
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
- ])
681
- } else if (params.row.auditResult == '80' && params.row.taskNode != this.taskNode) {
682
- return h('div', [
683
- h('tag', {
684
- props: {
685
- color: '#19be6b'
686
- }
687
- }, '已跳转到指定节点')
688
- ])
689
- } else if (params.row.auditResult == '90' && params.row.taskNode != this.taskNode) {
690
- return h('div', [
691
- h('tag', {
692
- props: {
693
- color: '#19be6b'
694
- }
695
- }, '已驳回到指定节点')
696
- ])
697
- }
698
- }
699
- }
700
- })
701
- column.push({
702
- title: '操作', width: 100, align: 'center',
703
- render: (h, params) => {
704
- return h('div', [
705
- h('Button', {
706
- props: {
707
- type: 'primary',
708
- size: 'small'
709
- },
710
- style: {
711
- marginRight: '5px'
712
- },
713
- on: {
714
- click: () => {
715
- this.selectNode(params.row)
716
- }
717
- }
718
- }, '选择')
719
- ])
720
- },
721
- })
722
- return column
723
- },
724
- reductionColumn: function () {
725
- let column = []
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' })
729
- return column
730
- },
731
- diagramTableColumns: function () {
732
- let column = []
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 })
736
- column.push({
737
- title: `${this.handleName}结果`, key: 'auditResult', minWidth: 150, align: 'center',
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' // 默认橙色
780
- }
781
- return h('Tag', {
782
- props: {
783
- color: tagColor,
784
- value: row.auditResult
785
- }
786
- }, label)
787
- }
788
- })
789
- column.push({
790
- title: `${this.handleName}时间`, key: 'auditTime', minWidth: 150,
791
- render: (h, { row }) => {
792
- const displayDate = row.startDate || row.auditDate
793
- return h('span', displayDate)
794
- }
795
- })
796
- column.push({
797
- title: `${this.handleName}意见`, key: 'auditComment', minWidth: 180, tooltip: true,
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
- }
805
- return h('Label', {
806
- props: {
807
- value: row.auditComment
808
- }
809
- }, label)
810
- }
811
- })
812
- if (this.showAttachmentFile) {
813
- column.push({
814
- title: `附件`, key: 'fileList', minWidth: 200,
815
- render: (h, { row }) => {
816
- if (!row.fileList || row.fileList.length === 0) {
817
- return h('span', '无') // 如果没有附件,显示“无”
818
- }
819
-
820
- //显示所有附件
821
- return h('div', row.fileList.map(file => {
822
- return h('a', {
823
- style: {
824
- display: 'block',
825
- marginTop: '5px',
826
- marginRight: '5px',
827
- whiteSpace: 'nowrap',
828
- overflow: 'hidden',
829
- textOverflow: 'ellipsis',
830
- maxWidth: '100px',
831
- },
832
- attrs: {
833
- title: file.attachName // 鼠标悬停时显示完整名称
834
- },
835
- on: {
836
- click: () => {
837
- this.getAttach(file)
838
- }
839
- },
840
- }, file.attachName)
841
- }))
842
- }
843
- })
844
- }
845
-
846
- return column
847
- },
848
- },
849
- provide() {
850
- return {
851
- toBeDoneListDoSearch: this.doSearch
852
- }
853
- },
854
- methods: {
855
- getWidth() {
856
- if (this.width && this.width < 400) {
857
- this.portraitWidth = 400
858
- }
859
- this.portraitWidth = this.width
860
- },
861
- initData() {
862
- if (!this.isDetail) {
863
- this.getTodoTask()
864
- } else {
865
- this.getDoneTask()
866
- }
867
- this.getHandleButtons()
868
- },
869
- getTodoTask() {
870
- const self = this
871
- let param = {
872
- procId: this.procId,
873
- applyId: this.applyId,
874
- taskNode: this.taskNode,
875
- taskId: this.taskId,
876
- auditGroup: this.auditGroup
877
- }
878
- ajax.get(self.smartFlowServerContext + '/manage/processTodo/list', { params: param }).then(function (resp) {
879
- if (resp.data.code === '200') {
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)
889
- .then(resp => {
890
- let data = resp.data.data.rows
891
- self.permScope = data[0].permScope
892
- self.defaultOrganTreeType = data[0].organTreeType ? data[0].organTreeType : '00'
893
- self.getNodeOrganTreeType(procType)
894
- }).catch(err => {
895
- console.log(err)
896
- })
897
- self.getAttachList(self.curTaskId)
898
- self.getHisAudit(self.curTaskId)
899
- self.getProcessHistory(self.curTaskId)
900
- } else {
901
- self.$Message.error(resp.data.message)
902
- }
903
- }).catch((err) => {
904
- console.log(err)
905
- })
906
- },
907
- getNodeOrganTreeType(procType) {
908
- const self = this
909
- let param = {
910
- procType: procType,
911
- procId: this.procId,
912
- taskNode: this.taskNode
913
- }
914
- ajax.get(self.smartFlowServerContext + '/manage/processTodo/getNodeOrganTreeType', { params: param }).then(function (resp) {
915
- if (resp.data.code === '200') {
916
- self.organTreeType = resp.data.data ? resp.data.data : self.defaultOrganTreeType
917
- } else {
918
- self.$Message.error(resp.data.message)
919
- }
920
- }).catch((err) => {
921
- console.log(err)
922
- })
923
- },
924
- getDoneTask() {
925
- const self = this
926
- let param = {
927
- procId: this.procId,
928
- applyId: this.applyId,
929
- taskNode: this.taskNode,
930
- taskId: this.taskId,
931
- auditGroup: this.auditGroup
932
- }
933
- ajax.get(self.smartFlowServerContext + '/manage/processDone/getDoneDetail', { params: param }).then(function (resp) {
934
- if (resp.data.code === '200') {
935
- let rows = resp.data.data.rows
936
- if (rows.length > 0) {
937
- self.curAuditGroup = rows[0].auditGroup
938
- self.hisAuditOpinion = []
939
- let taskList = resp.data.data.rows
940
- taskList.forEach(item => {
941
- self.hisAuditOpinion.push({
942
- auditOpinion: item.auditComment,
943
- auditTime: timestampToTime(item.auditDate)
944
- })
945
- })
946
- self.curTaskId = taskList[0].taskId
947
- self.instanceId = taskList[0].procInstanceId
948
- } else {
949
- ajax.get(self.smartFlowServerContext + '/manage/processTodo/list', { params: param }).then(function (todoResp) {
950
- if (todoResp.data.code === '200') {
951
- self.curTaskId = todoResp.data.data.rows[0].taskId
952
- self.instanceId = todoResp.data.data.rows[0].procInstanceId
953
- self.curAuditGroup = todoResp.data.data.rows[0].auditGroup
954
- } else {
955
- self.$Message.error(todoResp.data.message)
956
- }
957
- }).catch((err) => {
958
- console.log(err)
959
- })
960
- }
961
- self.getAttachList(self.curTaskId)
962
- self.getHisAudit(self.curTaskId)
963
- self.getProcessHistory(self.curTaskId)
964
- } else {
965
- self.$Message.error(resp.data.message)
966
- }
967
- }).catch((err) => {
968
- console.log(err)
969
- })
970
- },
971
- getHandleButtons() {
972
- const self = this
973
- let param = {
974
- procId: this.procId,
975
- taskNode: this.taskNode
976
- }
977
- ajax.post(self.smartFlowServerContext + '/manage/approvalCenter/getNodeData', param).then(function (resp) {
978
- if (resp.data.code === '200') {
979
- self.handleButtons = resp.data.data[0].handleButtons
980
- if (resp.data.data[0].hasOwnProperty('isSequential')) {
981
- self.curNodeType = resp.data.data[0].isSequential ? 'sequentialMultiNode' : 'multiNode'
982
- }
983
- self.handleName = resp.data.data[0].handleName ? resp.data.data[0].handleName : '审批'
984
- self.auditOpinionTitle = resp.data.data[0].handleName ? resp.data.data[0].handleName + '意见' : '审批意见'
985
- if (!self.handleButtons || (!self.handleButtons.includes('auditOpinion') && !self.handleButtons.includes('attachmentFile') && !self.handleButtons.includes('auditHistory'))) {
986
- self.showProcessInfo = false
987
- }
988
- } else {
989
- self.$Message.error(resp.data.message)
990
- }
991
- }).catch((err) => {
992
- console.log(err)
993
- })
994
- },
995
- getNextNodes() {
996
- const self = this
997
- self.nextNodesFormList = []
998
- self.nextNodesOldSettings = []
999
- let param = {
1000
- procId: this.procId,
1001
- taskNode: this.taskNode
1002
- }
1003
- ajax.post(self.smartFlowServerContext + '/manage/processTodo/getNextNodes', param).then(function (resp) {
1004
- if (resp.data.code === '200') {
1005
- let nextNodeForm = {}
1006
- let nextNodeOldForm = {}
1007
- let data = resp.data.data
1008
- for (let i = 0; i < data.length; i++) {
1009
- nextNodeOldForm = {
1010
- id: data[i].id,
1011
- assignee: data[i].assignee ? data[i].assignee.id : '',
1012
- timeLimit: data[i].timeLimit,
1013
- }
1014
- nextNodeForm = {
1015
- id: data[i].id,
1016
- name: data[i].name,
1017
- orgTreeType: data[i].orgTreeType,
1018
- assignee: data[i].assignee ? data[i].assignee.id : '',
1019
- assigneeName: data[i].assignee ? data[i].assignee.name : '',
1020
- candidateGroups: '',
1021
- isMultiInstance: data[i].isMultiInstance,
1022
- actionType: 'ASSIGNEE',
1023
- remainDay: 0,
1024
- remainTime: 0,
1025
- inAdvanceDay: 0,
1026
- inAdvanceTime: 0,
1027
- processing: '00'
1028
- }
1029
- //显示具体候选人信息
1030
- if (data[i].candidateGroups) {
1031
- nextNodeForm.actionType = 'CAND'
1032
- let names = []
1033
- let candidates = {}
1034
- for (let groupName in data[i].candidateGroups) {
1035
- if (data[i].candidateGroups.hasOwnProperty(groupName)) {
1036
- let group = data[i].candidateGroups[groupName]
1037
- group.forEach(item => {
1038
- names.push(item.name)
1039
- })
1040
- candidates[groupName] = group.map(item => item.id + ':' + item.name).join(',')
1041
- }
1042
- }
1043
- nextNodeForm.candidateNames = names.join(',')
1044
- nextNodeForm.candidates = candidates
1045
- nextNodeOldForm.candidates = candidates
1046
- }
1047
- if (data[i].timeLimit) {
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')) //警告小时
1055
- nextNodeForm.remainDay = parseInt(days)
1056
- nextNodeForm.remainTime = parseInt(hourOfDay)
1057
- nextNodeForm.inAdvanceDay = parseInt(daysWarn)
1058
- nextNodeForm.inAdvanceTime = parseInt(hourOfDayWarn)
1059
- nextNodeForm.processing = handleType
1060
- }
1061
- self.nextNodesFormList.push(nextNodeForm)
1062
- self.nextNodesOldSettings.push(nextNodeOldForm)
1063
- }
1064
- } else {
1065
- self.$Message.error(resp.data.message)
1066
- }
1067
- }).catch((err) => {
1068
- console.log(err)
1069
- })
1070
- },
1071
- getAttachList(taskId) {
1072
- const self = this
1073
- const param = {
1074
- taskId: taskId,
1075
- procId: this.procId,
1076
- applyId: this.applyId
1077
- }
1078
- ajax.get(self.smartFlowServerContext + '/manage/processDone/getAttachmentList', { params: param }).then(function (resp) {
1079
- self.attachmentList = resp.data.data.rows
1080
- self.attachmentList.forEach(item => {
1081
- const index = item.fileName.lastIndexOf('.')
1082
- const fileType = item.fileName.substr(index + 1).toLowerCase()
1083
- const imageList = ['jpg', 'gif', 'png', 'svg']
1084
- const docList = ['doc', 'docx']
1085
- const zipList = ['rar', 'zip']
1086
- const typeList = ['jpg', 'gif', 'png', 'docx']
1087
- item.fileType = imageList.indexOf(fileType) !== -1 ? 'image' : docList.indexOf(fileType) !== -1 ? 'doc' : zipList.indexOf(fileType) !== -1 ? 'zip' : fileType
1088
- item.showPreview = typeList.indexOf(fileType) !== -1
1089
- })
1090
- }).catch(err => {
1091
- console.log(err)
1092
- })
1093
- },
1094
- getHisAudit(taskId) {
1095
- let self = this
1096
- let params = {
1097
- applyId: self.applyId,
1098
- instanceId: self.instanceId,
1099
- procId: self.procId,
1100
- taskId: taskId
1101
- }
1102
- ajax.get(self.smartFlowServerContext + '/manage/processTodo/getHisAudit', { params: params }).then(function (resp) {
1103
- if (resp.data.code === '200') {
1104
- self.hisAudit = resp.data.data
1105
- let uniqueDataMap = {}
1106
- self.hisAudit.forEach((item) => {
1107
- uniqueDataMap[item['taskNode']] = item
1108
- })
1109
- self.hisNode = Object.values(uniqueDataMap)
1110
-
1111
- }
1112
- })
1113
- },
1114
- getProcessHistory(taskId) {
1115
- let self = this
1116
- let params = {
1117
- applyId: self.applyId,
1118
- instanceId: self.instanceId,
1119
- procId: self.procId,
1120
- taskId: taskId
1121
- }
1122
- ajax.get(self.smartFlowServerContext + '/manage/processTodo/getProcessHis', { params: params }).then(function (resp) {
1123
- if (resp.data.code === '200') {
1124
- self.processHistory = resp.data.data
1125
- }
1126
- })
1127
- },
1128
-
1129
- audit: function (auditResult) {
1130
- let self = this
1131
- self.auditResult = auditResult
1132
- self.submit()
1133
- },
1134
- submit() {
1135
- let self = this
1136
- self.auditParams = {
1137
- procId: self.procId,
1138
- applyId: self.applyId,
1139
- taskId: self.curTaskId,
1140
- auditOpinion: self.form.auditOpinion,
1141
- fileListStr: JSON.stringify(self.fileList),
1142
- auditResult: self.auditResult,
1143
- params: JSON.stringify(self.datas),
1144
- targetTaskNode: self.targetTaskNode,
1145
- selectedUserId: self.selectedUserId,
1146
- }
1147
- if (self.auditResult == '' || self.auditResult == null) {
1148
- self.$Message.error(`请选择${self.handleName}结果!`)
1149
- return
1150
- }
1151
- if (self.form.auditOpinion == '' || self.form.auditOpinion == null) {
1152
- if (self.auditResult === '30') {
1153
- self.auditParams.auditOpinion = '通过'
1154
- self.businessFormSave ? self.businessFormSave(self.handleSaveResult) : self.handleSaveResult(true)
1155
- return
1156
- }
1157
- if ((!self.handleButtons || self.handleButtons.includes('auditOpinion')) && self.auditResult !== '84') {
1158
- self.$Message.error(`请输入${self.handleName}意见!`)
1159
- return
1160
- } else {
1161
- self.auditParams.auditOpinion = self.handleButtonsNames[self.auditResult]
1162
- }
1163
- }
1164
- self.businessFormSave ? self.businessFormSave(self.handleSaveResult) : self.handleSaveResult(true)
1165
- },
1166
- handleSaveResult(saveResult, businessParams) {
1167
- if (saveResult) {
1168
- this.executeButtonAction(businessParams)
1169
- } else {
1170
- console.error('保存失败')
1171
- }
1172
- },
1173
- executeButtonAction(businessParams) {
1174
- const self = this
1175
- if (businessParams) {
1176
- Object.assign(self.datas, businessParams)
1177
- self.auditParams.params = JSON.stringify(self.datas)
1178
- }
1179
- let auditResult = {
1180
- code: self.auditResult,
1181
- name: self.handleButtonsNames[self.auditResult]
1182
- }
1183
- if (self.auditResult === '82') {
1184
- //指定他人处理
1185
- self.assigneeBoxData = self.auditParams
1186
- self.assigneeBoxData.auditResultName = self.handleButtonsNames[self.auditResult]
1187
- self.assigneeBoxData.instanceId = self.instanceId
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
- })
1227
- } else if (self.auditResult === '80') {
1228
- //跳转到后序指定节点
1229
- self.getNodesBehind()
1230
- } else if (self.auditResult === '90') {
1231
- //驳回到前序指定节点
1232
- self.getAllPreNodes()
1233
- } else if (self.auditResult === '40') {
1234
- //驳回到上一级
1235
- self.loading = true
1236
- self.disable = true
1237
- let url = self.smartFlowServerContext + '/manage/processTodo/getPreNode'
1238
- ajax.post(url, self.auditParams).then(function (resp) {
1239
- let result = resp.data
1240
- if (result.code == '30013' || result.code == '30014') {
1241
- //前序节点为子流程或当前节点为子流程第一个节点不可驳回上一级节点
1242
- self.$Message.warning(result.message)
1243
- //避免未提示消息直接回调
1244
- setTimeout(() => {
1245
- self.executionCompleted(false, null, null, auditResult, self.curTaskId)
1246
- }, 1000)
1247
- } else if (result.code == '30010') {
1248
- self.$Modal.confirm({
1249
- title: '提示',
1250
- content: result.message,
1251
- onOk: () => {
1252
- self.auditParams.auditResult = '70'
1253
- let url = self.smartFlowServerContext + '/manage/processTodo/audit'
1254
- ajax.post(url, self.auditParams).then(function (resp) {
1255
- let result = resp.data
1256
- if (result.code == '200') {
1257
- self.loading = false
1258
- self.disable = false
1259
- self.$Message.success(result.message)
1260
- //后端没有返回数据
1261
- setTimeout(() => {
1262
- self.executionCompleted(true, null, null, auditResult, self.curTaskId)
1263
- }, 1000)
1264
- bus.$emit('triggerTimer')
1265
- } else {
1266
- self.loading = false
1267
- self.disable = false
1268
- self.$Message.error(result.message)
1269
- setTimeout(() => {
1270
- self.executionCompleted(false, null, null, auditResult, self.curTaskId)
1271
- }, 1000)
1272
- }
1273
- bus.$emit('triggerTimer')
1274
- })
1275
- },
1276
- onCancel: () => {
1277
- self.loading = false
1278
- self.disable = false
1279
- }
1280
- })
1281
- } else if (result.code == '10012') {
1282
- // 数据同步
1283
- self.loading = false
1284
- self.disable = false
1285
- self.$Message.warning(result.message)
1286
- setTimeout(() => {
1287
- self.executionCompleted(true, null, null, auditResult, self.curTaskId)
1288
- }, 1000)
1289
- } else {
1290
- self.loading = true
1291
- self.disable = true
1292
- let url = self.smartFlowServerContext + '/manage/processTodo/audit'
1293
- ajax.post(url, self.auditParams).then(function (resp) {
1294
- let result = resp.data
1295
- if (result.code == '200') {
1296
- self.loading = false
1297
- self.disable = false
1298
- self.$Message.success(result.message)
1299
- setTimeout(() => {
1300
- if (result.data) {
1301
- let taskIds = result.data.map(item => item.id).join(',')
1302
- self.executionCompleted(true, result.data[0].processInstanceId, taskIds, auditResult, self.curTaskId)
1303
- } else {
1304
- self.executionCompleted(true, null, null, auditResult, self.curTaskId)
1305
- }
1306
- }, 1000)
1307
- } else {
1308
- self.loading = false
1309
- self.disable = false
1310
- self.$Message.error(result.message)
1311
- setTimeout(() => {
1312
- self.executionCompleted(false, null, null, auditResult, self.curTaskId)
1313
- }, 1000)
1314
- }
1315
- bus.$emit('triggerTimer')
1316
- })
1317
- }
1318
- })
1319
- } else {
1320
- if (self.auditResult === '30' && (!self.handleButtons || self.handleButtons.includes('appointHandler') || self.handleButtons.includes('appointTimeoutTime'))) {
1321
- self.getNextNodes()
1322
- self.appointBoxShow = true
1323
- } else {
1324
- self.doPass()
1325
- }
1326
- }
1327
- },
1328
- doPass() {
1329
- let self = this
1330
- this.modal = false
1331
- let auditResult = {
1332
- code: self.auditResult,
1333
- name: self.handleButtonsNames[self.auditResult]
1334
- }
1335
- if (self.auditResult === '82' && (self.targetTaskNode == '' || self.targetTaskNode == null)) {
1336
- self.auditResult = ''
1337
- self.$Message.error(`请选择${self.handleName}节点!`)
1338
- } else {
1339
- self.loading = true
1340
- self.disable = true
1341
- self.auditParams.targetTaskNode = self.targetTaskNode
1342
- let url = self.smartFlowServerContext + '/manage/processTodo/audit'
1343
- ajax.post(url, self.auditParams).then(function (resp) {
1344
- let result = resp.data
1345
- if (result.code == '200') {
1346
- self.loading = false
1347
- self.disable = false
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(',')
1351
- setTimeout(() => {
1352
- self.executionCompleted(true, result.data.id ? result.data.processInstanceId : result.data[0].processInstanceId, taskIds, auditResult, self.curTaskId)
1353
- }, 1000)
1354
- } else {
1355
- setTimeout(() => {
1356
- self.executionCompleted(true, null, null, auditResult, self.curTaskId)
1357
- }, 1000)
1358
- }
1359
- } else if (result.code == '10012') {
1360
- // 数据同步
1361
- self.loading = false
1362
- self.disable = false
1363
- self.$Message.warning(result.message)
1364
- setTimeout(() => {
1365
- self.executionCompleted(true, null, null, auditResult, self.curTaskId)
1366
- }, 1000)
1367
- } else if (result.code == '20002') {
1368
- // 流程结束
1369
- self.loading = false
1370
- self.disable = false
1371
- self.$Message.success(result.message)
1372
- setTimeout(() => {
1373
- self.executionCompleted(true, '流程已结束', '流程已结束', auditResult, self.curTaskId)
1374
- }, 1000)
1375
- } else {
1376
- self.loading = false
1377
- self.disable = false
1378
- self.$Message.error(result.message ? result.message : `${self.handleName}失败`)
1379
- setTimeout(() => {
1380
- self.executionCompleted(false, null, null, auditResult, self.curTaskId)
1381
- }, 1000)
1382
- }
1383
- bus.$emit('triggerTimer')
1384
- })
1385
- }
1386
- },
1387
- showUpdateMultitaskInstanceModal(updateType) {
1388
- const self = this
1389
- if (updateType === '81') {
1390
- this.$refs.assigneeHelpBox.toggleShowHelpBox(this.organTreeType, '', 'addMultitaskInstance')
1391
- } else if (updateType === '83') {
1392
- ajax.get(self.smartFlowServerContext + '/manage/processTodo/getUnapprovedListOfMultiNode?taskId=' + self.curTaskId).then(function (resp) {
1393
- if (resp.data.code === '200') {
1394
- self.unapprovedAssigneeList = resp.data.data
1395
- self.reductionMultitaskInstanceModal = true
1396
- } else {
1397
- self.$Message.error(resp.data.message)
1398
- }
1399
- }).catch(err => {
1400
- console.log(err)
1401
- })
1402
- }
1403
- },
1404
- updateMultitaskInstance(updateType, assignees) {
1405
- const self = this
1406
- self.loading = true
1407
- self.disable = true
1408
- let param = {
1409
- taskId: self.curTaskId,
1410
- applyId: self.applyId,
1411
- assignees: assignees,
1412
- updateType: updateType
1413
- }
1414
- ajax.post(self.smartFlowServerContext + '/manage/processTodo/updateMultitaskInstance', param).then(resp => {
1415
- let result = resp.data
1416
- if (result.code == '200') {
1417
- self.loading = false
1418
- self.disable = false
1419
- self.$Message.success(result.message)
1420
- } else {
1421
- self.loading = false
1422
- self.disable = false
1423
- self.$Message.error(result.message)
1424
- }
1425
- }).catch(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)
1460
- })
1461
- },
1462
- //加签
1463
- addMultitaskInstance(assingeeList) {
1464
- const assingees = assingeeList.join(',')
1465
- this.updateMultitaskInstance('81', assingees)
1466
- },
1467
- //减签
1468
- reductionMultitaskInstance() {
1469
- if (this.reductionAssigneeList.length === 0) {
1470
- this.$Message.error('请选择减签人员')
1471
- return
1472
- }
1473
- const assingees = this.reductionAssigneeList.map(item => item.auditId).join(',')
1474
- this.updateMultitaskInstance('83', assingees)
1475
- },
1476
-
1477
- doSearch() {
1478
- //不需要实现,是子组件assigneeBox要求使用父组件的这个方法
1479
- },
1480
- tabsChange(tab) {
1481
- console.log(tab)
1482
- },
1483
- getAttach(row) {
1484
- window.open(this.smartFlowServerContext + '/manage/oss/file/get/' + row.fileId, '_blank')
1485
- },
1486
- preViewAttach(row) {
1487
- let reg = /\.(gif|jpg|jpeg|bmp|png|PNG)$/
1488
- let regs = /\.(pdf)$/
1489
- if (reg.test(row.fileName)) {
1490
- let url = this.smartFlowServerContext + '/manage/oss/file/get/' + row.fileId
1491
- this.imgPreview(url)
1492
- } else if (regs.test(row.fileName)) {
1493
- window.open(this.smartFlowServerContext + '/manage/oss/file/getFileStream?fileId=' + row.fileId, '_blank')
1494
- } else {
1495
- this.modalDocx = true
1496
- axios({
1497
- method: 'get',
1498
- responseType: 'blob', // 因为是流文件,所以要指定blob类型
1499
- url: this.smartFlowServerContext + '/manage/oss/file/get/' + row.fileId// 一个word下载文件的接口
1500
- }).then(({ data }) => {
1501
- docx.renderAsync(data, this.$refs.file, null, {
1502
- className: 'docx', //默认和文档样式类的类名/前缀
1503
- inWrapper: true, //启用围绕文档内容呈现包装器
1504
- ignoreWidth: false, //禁用页面的渲染宽度
1505
- ignoreHeight: false, //禁用页面的渲染高度
1506
- ignoreFonts: false, //禁用字体渲染
1507
- breakPages: true, //在分页符上启用分页
1508
- ignoreLastRenderedPageBreak: true, //在lastRenderedPageBreak元素上禁用分页
1509
- experimental: false, //启用实验功能(制表符停止计算)
1510
- trimXmlDeclaration: true, //如果为true,则在解析之前将从xml文档中删除xml声明
1511
- useBase64URL: false, //如果为true,图像、字体等将转换为base 64 URL,否则使用URL.createObjectURL
1512
- useMathMLPolyfill: false, //包括用于铬、边等的MathML多填充。
1513
- showChanges: false, //启用文档更改的实验渲染(插入/删除)
1514
- debug: false, //启用额外的日志记录
1515
- })
1516
- }
1517
- )
1518
- }
1519
- },
1520
- imgPreview(url) {
1521
- this.imageUrl = url
1522
- this.modalVisible = true
1523
- },
1524
-
1525
- //打印流程图信息
1526
- processPrint() {
1527
- let self = this
1528
- let params = {
1529
- applyId: self.applyId,
1530
- instanceId: self.instanceId,
1531
- procId: self.procId,
1532
- taskId: self.curTaskId,
1533
- }
1534
- ajax.get(self.smartFlowServerContext + '/manage/processTodo/getPrintData', { params: params }).then(function (resp) {
1535
- let result = resp.data.data
1536
- if (resp.data.code === '200') {
1537
- let tableData = result
1538
- self.process.tableData = tableData
1539
- self.process.applyId = self.applyId
1540
- self.process.instanceId = self.instanceId
1541
- self.process.procId = self.procId
1542
- self.datas.orgId = tableData[0].orgId
1543
- self.datas.orgName = tableData[0].orgName
1544
- self.modalBoxShow = true
1545
- }
1546
- })
1547
- },
1548
-
1549
- showTaskNode(taskId) {
1550
- if (this.processHistory.length > 0) {
1551
- let task = null
1552
- this.processHistory.some(itemList => {
1553
- task = itemList.find(item => item.taskId === taskId)
1554
- return task !== undefined
1555
- })
1556
- return task ? task.taskName : ''
1557
- }
1558
- return ''
1559
- },
1560
- cancel() {
1561
- this.modal = false
1562
- this.auditResult = ''
1563
- },
1564
- reductionModalCancel() {
1565
- this.reductionMultitaskInstanceModal = false
1566
- this.reductionAssigneeList = []
1567
- },
1568
- selectAssignee(selection) {
1569
- this.reductionAssigneeList = selection
1570
- },
1571
- selectNode(currentRow, oldCurrentRow) {
1572
- let self = this
1573
- self.targetTaskNode = currentRow.taskNode
1574
- },
1575
- getAllPreNodes() {
1576
- let self = this
1577
- let params = {
1578
- processDefId: self.procId,
1579
- taskId: self.curTaskId,
1580
- }
1581
- ajax.get(self.smartFlowServerContext + '/manage/processTodo/getAllPreNodes', { params: params }).then(function (resp) {
1582
- if (resp.data.code === '200') {
1583
- if (resp.data.data.length > 0) {
1584
- self.allNode = resp.data.data
1585
- self.modal1 = true
1586
- } else {
1587
- self.$Message.warning('当前流程无前序节点')
1588
- }
1589
- } else {
1590
- self.$Message.error(resp.data.message)
1591
- }
1592
- })
1593
- },
1594
- getNodesBehind() {
1595
- let self = this
1596
- let params = {
1597
- processDefId: self.procId,
1598
- taskId: self.curTaskId,
1599
- }
1600
- ajax.get(self.smartFlowServerContext + '/manage/processTodo/getNodesBehind', { params: params }).then(function (resp) {
1601
- if (resp.data.code === '200') {
1602
- if (resp.data.data.length > 0) {
1603
- self.allNode = resp.data.data
1604
- self.modal1 = true
1605
- } else {
1606
- self.$Message.warning('当前流程无后续节点')
1607
- }
1608
- } else {
1609
- self.$Message.error(resp.data.message)
1610
- }
1611
- })
1612
- },
1613
- handleSelectedUser(userId) {
1614
- this.selectedUserId = userId
1615
- },
1616
-
1617
- //折叠动画效果
1618
- beforeEnter(el) {
1619
- el.style.height = '0'
1620
- },
1621
- enter(el, done) {
1622
- setTimeout(() => {
1623
- el.style.height = el.scrollHeight + 'px'
1624
- }, 0)
1625
-
1626
- el.addEventListener('transitionend', done)
1627
- },
1628
- beforeLeave(el) {
1629
- el.style.height = el.scrollHeight + 'px'
1630
- },
1631
- leave(el, done) {
1632
- setTimeout(() => {
1633
- el.style.height = '0'
1634
- }, 0)
1635
-
1636
- el.addEventListener('transitionend', done)
1637
- },
1638
-
1639
- beforeFlowInfoEnter(el) {
1640
- el.style.transform = 'translateX(100%)'
1641
- },
1642
- flowInfoEnter(el, done) {
1643
- const transitionDuration = 0.5
1644
- el.style.transition = `transform ${transitionDuration}s`
1645
- el.style.transform = 'translateX(0)'
1646
- el.addEventListener('transitionend', done)
1647
- },
1648
- beforeFlowInfoLeave(el) {
1649
- el.style.transform = 'translateX(0)'
1650
- },
1651
- flowInfoLeave(el, done) {
1652
- const transitionDuration = 0.5
1653
- el.style.transition = `transform ${transitionDuration}s`
1654
- el.style.transform = 'translateX(100%)'
1655
- el.addEventListener('transitionend', done)
1656
- },
1657
- uploadFile(file) {
1658
- const self = this
1659
- self.fileList = []
1660
- file.forEach(item => {
1661
- self.fileList.push({
1662
- fileName: item.fileName,
1663
- fileId: item.fileCode,
1664
- })
1665
- })
1666
- },
1667
-
1668
- appointOk() {
1669
- const self = this
1670
- let oldSettings
1671
- let params = this.nextNodesFormList.reduce((acc, item) => {
1672
- acc[item.id] = {
1673
- needUpdate: 'false',
1674
- }
1675
- item.assignee ? acc[item.id].assignee = item.assignee : ''
1676
- item.candidateGroups ? acc[item.id].candidateGroup = item.candidateGroups : ''
1677
- let timeLimit = 'expireTime:0D0H;warningTime:0D0H;handleType:00'
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
1680
- acc[item.id].timeLimit = timeLimit
1681
- } else {
1682
- acc[item.id].timeLimit = ''
1683
- }
1684
- oldSettings = self.nextNodesOldSettings.filter(oldSetting => oldSetting.id === item.id)[0]
1685
- if (oldSettings.assignee !== item.assignee || self.checkGroupsUpdate(oldSettings.candidates, item.candidateGroups, item.isMultiInstance) || self.checkTimeLimitUpdate(oldSettings.timeLimit, timeLimit)) {
1686
- acc[item.id].needUpdate = 'true'
1687
- }
1688
- return acc
1689
- }, {})
1690
- self.auditParams.nodeConfigMaps = JSON.stringify(params)
1691
- self.doPass((execResult, instanceId, taskIds, auditResult, curTaskId) => {
1692
- if (this.executionCompleted) {
1693
- this.executionCompleted(execResult, instanceId, taskIds, auditResult, curTaskId)
1694
- }
1695
- })
1696
- },
1697
- checkGroupsUpdate(oldSetting, newSetting, isMultiInstance) {
1698
- if (oldSetting && newSetting) {
1699
- let oldIdList = []
1700
- for (let [key, value] of Object.entries(oldSetting)) {
1701
- if (value) {
1702
- value.split(',').forEach(part => {
1703
- const [id] = part.split(':')
1704
- if (id) {
1705
- oldIdList.push(id)
1706
- }
1707
- })
1708
- }
1709
- }
1710
- const regex = /(?:O:|U:|P:|R:|T:)([^,]+)/g
1711
- let match
1712
- const newIds = []
1713
- while ((match = regex.exec(newSetting)) !== null) {
1714
- newIds.push(...match[1].split(';'))
1715
- }
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
-
1728
- }
1729
- return false
1730
- },
1731
- checkTimeLimitUpdate(oldSetting, newSetting) {
1732
- if (oldSetting && newSetting) {
1733
- return oldSetting !== newSetting
1734
- }
1735
- if (!oldSetting) {
1736
- return newSetting !== 'expireTime:0D0H;warningTime:0D0H;handleType:00'
1737
- }
1738
- return false
1739
- },
1740
- readingRangeClick(item) {
1741
- let permScope = item.orgTreeType === this.defaultOrganTreeType ? this.permScope : 'all'
1742
- let orgTreeType = item.orgTreeType ? item.orgTreeType : this.defaultOrganTreeType
1743
- this.$refs.assigneeHelpBox.toggleShowHelpBox(orgTreeType, permScope, 'transferNextTask', item.id)
1744
- },
1745
- candidateGroupsReadingRangeClick(item) {
1746
- let permScope = item.orgTreeType === this.defaultOrganTreeType ? this.permScope : 'all'
1747
- let orgTreeType = item.orgTreeType ? item.orgTreeType : this.defaultOrganTreeType
1748
- this.$refs.candidateGroupsHelpBox.toggleShowHelpBox(permScope, item.candidates, orgTreeType, item.id)
1749
- },
1750
- updateCandGroups(newCandGroups, nameStr, detail, nodeId) {
1751
- let oldSettings = this.nextNodesOldSettings.filter(item => item.id === nodeId)[0]
1752
- if (JSON.stringify(oldSettings.candidates) != JSON.stringify(detail)) {
1753
- let node = this.nextNodesFormList.filter(item => item.id === nodeId)[0]
1754
- node.candidateGroups = newCandGroups
1755
- node.candidateNames = nameStr
1756
- node.candidates = detail
1757
- node.needUpdate = true
1758
- this.$forceUpdate()
1759
- }
1760
- },
1761
- updateNextNodeAssignee(selectedAssigneeId, selectedAssigneeName, nodeId) {
1762
- let oldSettings = this.nextNodesOldSettings.filter(item => item.id === nodeId)[0]
1763
- if (oldSettings.assignee != selectedAssigneeId) {
1764
- let node = this.nextNodesFormList.filter(item => item.id === nodeId)[0]
1765
- node.assignee = selectedAssigneeId
1766
- node.assigneeName = selectedAssigneeName
1767
- node.needUpdate = true
1768
- this.$forceUpdate()
1769
- }
1770
- }
1771
- },
1772
- watch: {
1773
- auditOpinionText(label) {
1774
- this.form.auditOpinion = label
1775
- },
1776
- procId(val) {
1777
- this.procId = val
1778
- this.initData()
1779
- },
1780
- }
1781
- }
1782
- </script>
1783
-
1784
- <style lang="less" scoped>
1785
- @import "./styles/css/index.less";
1786
-
1787
- /deep/ .ivu-table-row-highlight td {
1788
- background-color: #50c1ff !important;
1789
- color: #fff !important;
1790
- }
1791
-
1792
- /deep/ .ivu-card-body {
1793
- padding: 10px;
1794
- }
1795
-
1796
- .page-info /deep/ .page-body {
1797
- overflow-y: hidden;
1798
- }
1799
- </style>
1
+ <template>
2
+ <LamboPageContainer>
3
+ <template slot="page-title">
4
+ {{ title }}
5
+ </template>
6
+ <template slot="page-extend">
7
+ <slot name="return-button"></slot>
8
+ </template>
9
+ <div class="portrait-lambo-indicator-card"
10
+ :style="{float: 'left', width: isExpanded && showProcessInfo ? `calc(100% - ${portraitWidth+10}px)` : '99%'}">
11
+ <slot name="business-content">
12
+ </slot>
13
+ </div>
14
+
15
+ <a v-if="showProcessInfo" @click="isExpanded = !isExpanded" class="arrow-button-container"
16
+ :style="{right: isExpanded ? portraitWidth+10 + 'px' : '10px'}">
17
+ <Icon class="icon-class" v-if="isExpanded" type="ios-arrow-forward"/>
18
+ <Icon class="icon-class" v-if="!isExpanded" type="ios-arrow-back"/>
19
+ </a>
20
+ <transition v-if="showProcessInfo" name="draw" @before-enter="beforeFlowInfoEnter" @enter="flowInfoEnter"
21
+ @before-leave="beforeFlowInfoLeave" @leave="flowInfoLeave">
22
+ <lamboIndicatorCard v-show="isExpanded" class="portrait-lambo-indicator-card"
23
+ :style="{width: portraitWidth + 'px', float: 'right'}" :hasExtend="false">
24
+ <div slot="content-title">流程信息</div>
25
+ <a v-if="!isDetail" @click="auditShow = !auditShow">
26
+ <Title
27
+ v-if="handleButtons && (handleButtons.includes('auditOpinion') || handleButtons.includes('attachmentFile'))">
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 }}信息
32
+ </a>
33
+ </Title>
34
+ </a>
35
+ <transition v-if="!isDetail" name="draw" @before-enter="beforeEnter" @enter="enter" @before-leave="beforeLeave"
36
+ @leave="leave">
37
+ <div class="box" v-show="auditShow">
38
+ <Form ref="auditOpinion" justify="center" :label-width="100" :model="form"
39
+ v-if="handleButtons && handleButtons.includes('auditOpinion')"
40
+ style="margin: 10px 0 0 10px;" :rules="ruleValidate">
41
+ <FormItem :label="auditOpinionTitle" prop="auditOpinion">
42
+ <AuditOpinion v-model="form.auditOpinion" :attachment-file="handleButtons.includes('attachmentFile')"
43
+ :attachmentdata="fileList" :default-audit-opinion="defaultAuditOpinion"
44
+ :smart-flow-server-context="smartFlowServerContext"></AuditOpinion>
45
+ </FormItem>
46
+ </Form>
47
+ <Form ref="auditOpinion" justify="center" :label-width="100"
48
+ v-if="handleButtons && !handleButtons.includes('auditOpinion') && handleButtons.includes('attachmentFile')"
49
+ style="margin: 10px 0 0 10px;">
50
+ <FormItem style="min-height: 70px">
51
+ <Tooltip placement="bottom" max-width="200">
52
+ <div style="font-size: smaller" slot="content">支持扩展名:.pdf .doc .docx .txt .xls .xlsx .jpg .jpeg
53
+ .png .gif
54
+ </div>
55
+ <UploadFile @upload-result="uploadFile" :multiple="true"
56
+ :oss-server-context="smartFlowServerContext"
57
+ :oss-file-put-url="ossFilePutUrl"></UploadFile>
58
+ </Tooltip>
59
+ </FormItem>
60
+ </Form>
61
+ </div>
62
+ </transition>
63
+ <a v-if="taskNode && isDetail && hisAuditOpinion[0].auditOpinion" @click="auditShow = !auditShow">
64
+ <Title
65
+ v-if="handleButtons && (handleButtons.includes('auditOpinion') || handleButtons.includes('attachmentFile'))">
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 }}信息
70
+ </a>
71
+ </Title>
72
+ </a>
73
+ <transition v-if="taskNode && isDetail && hisAuditOpinion[0].auditOpinion" name="draw"
74
+ @before-enter="beforeEnter"
75
+ @enter="enter" @before-leave="beforeLeave" @leave="leave">
76
+ <div class="box" v-show="auditShow">
77
+ <Form ref="auditOpinion" justify="center" :model="form"
78
+ v-if="handleButtons && handleButtons.includes('auditOpinion')"
79
+ style="margin: 10px 0 0 10px;" :rules="ruleValidate">
80
+ <FormItem style="margin-left: -60px">
81
+ <Card v-for="(item, index) in hisAuditOpinion" :key="index">
82
+ <Row>
83
+ <Col span="12" style="word-wrap: break-word">{{ item.auditOpinion }}</Col>
84
+ <Col span="2"></Col>
85
+ <Col span="10">{{ item.auditTime }}</Col>
86
+ </Row>
87
+ </Card>
88
+ </FormItem>
89
+ </Form>
90
+ </div>
91
+ </transition>
92
+ <a @click="historyShow = !historyShow">
93
+ <Title v-if="handleButtons && handleButtons.includes('auditHistory')">
94
+ <a style="color: #989898">
95
+ <Icon v-if="historyShow" type="ios-arrow-down"/>
96
+ <Icon v-if="!historyShow" type="ios-arrow-up"/>
97
+ {{ handleName }}记录
98
+ </a>
99
+ </Title>
100
+ </a>
101
+ <transition name="draw" @before-enter="beforeEnter" @enter="enter" @before-leave="beforeLeave" @leave="leave">
102
+ <div class="box" v-show="historyShow">
103
+ <Card class="process-history" :style="processHistoryHeight" dis-hover :bordered="false"
104
+ v-if="handleButtons && handleButtons.includes('auditHistory')">
105
+ <processHistory :portrait-width="portraitWidth" :list="processHistory" :done-page="isDetail"
106
+ :push-button="pushButton"
107
+ :smart-flow-server-context="smartFlowServerContext"></processHistory>
108
+ </Card>
109
+ </div>
110
+ </transition>
111
+
112
+ <a @click="attachListShow = !attachListShow">
113
+ <Title v-if="handleButtons && handleButtons.includes('attachmentFile') && attachmentList.length > 0">
114
+ <a style="color: #989898">
115
+ <Icon v-if="attachListShow" type="ios-arrow-down"/>
116
+ <Icon v-if="!attachListShow" type="ios-arrow-up"/>
117
+ 查看附件
118
+ </a>
119
+ </Title>
120
+ </a>
121
+ <transition name="draw" @before-enter="beforeEnter" @enter="enter" @before-leave="beforeLeave" @leave="leave">
122
+ <div class="box"
123
+ v-show="handleButtons && handleButtons.includes('auditHistory') && attachmentList.length > 0 && attachListShow">
124
+ <div v-for="(item, index) in attachmentList" :key="index">
125
+ <Card dis-hover class="attach-card">
126
+ <List item-layout="vertical">
127
+ <ListItem style="margin-top: -8px">
128
+ <Row style="display: flex; align-items: center;">
129
+ <!-- 左边:图片 -->
130
+ <Col span="4" style="margin-top: -25px">
131
+ <avatar v-if="item.fileType === 'image'" icon="ios-image-outline" class="attach-avatar"
132
+ style="background-color: #005aff"
133
+ :style="portraitWidth >= 600 ? 'margin-left: 10px' : ''"
134
+ :size="portraitWidth >= 600 ? 'middle' : 'small'"></avatar>
135
+ <avatar v-else-if="item.fileType === 'doc'" icon="ios-document-outline" class="attach-avatar"
136
+ style="background-color: #005aff"
137
+ :style="portraitWidth >= 600 ? 'margin-left: 10px' : ''"
138
+ :size="portraitWidth >= 600 ? 'middle' : 'small'">
139
+ </avatar>
140
+ <avatar v-else-if="item.fileType === 'xlsx'" icon="ios-document-outline" class="attach-avatar"
141
+ style="background-color: #19be6b"
142
+ :style="portraitWidth >= 600 ? 'margin-left: 10px' : ''"
143
+ :size="portraitWidth >= 600 ? 'middle' : 'small'"></avatar>
144
+ <avatar v-else-if="item.fileType === 'pdf'" icon="ios-document-outline" class="attach-avatar"
145
+ style="background-color: #ed4014"
146
+ :style="portraitWidth >= 600 ? 'margin-left: 10px' : ''"
147
+ :size="portraitWidth >= 600 ? 'middle' : 'small'"></avatar>
148
+ <avatar v-else icon="ios-document-outline" class="attach-avatar"
149
+ :style="portraitWidth >= 600 ? 'margin-left: 10px' : ''"
150
+ :size="portraitWidth >= 600 ? 'middle' : 'small'"></avatar>
151
+ </Col>
152
+ <!-- 右边:附件信息 -->
153
+ <Col span="20">
154
+ <Row>
155
+ <tooltip>
156
+ <span class="attach-name-style"> {{ item.attachName }}</span>
157
+ <div slot="content" style="white-space: normal"> {{ item.attachName }}</div>
158
+ </tooltip>
159
+ </Row>
160
+ <Row style="margin-top: 3px">
161
+ <span style="color: #005aff; font-size: 13px;">{{ item.uploadUserName }}</span>
162
+ <Divider style="background-color:#808695;height: 1em;margin: 4px 9px 0 6px;"
163
+ type="vertical"/>
164
+ <span style="color: #808695;font-size: 13px"
165
+ >{{ showTaskNode(item.taskId) }}</span>
166
+ </Row>
167
+ <Row style="margin-bottom: -10px; margin-top: 10px">
168
+ <template>
169
+ <Button @click="getAttach(item)" size="small">下载</Button>
170
+ <Button v-if="item.showPreview" ghost type="primary" @click="preViewAttach(item)"
171
+ style="margin-left: 10px" size="small">预览
172
+ </Button>
173
+ </template>
174
+ </Row>
175
+ </Col>
176
+ </Row>
177
+
178
+ </ListItem>
179
+ </List>
180
+ </Card>
181
+ </div>
182
+ </div>
183
+ </transition>
184
+ <Modal title="查看附件" v-model="modalVisible" fullscreen scrollable :mask="false">
185
+ <img :src="imageUrl" v-if="modalVisible" alt="" style="width: 100%">
186
+ <div slot="footer">
187
+ <Button type="primary" @click="modalVisible = false">关闭</Button>
188
+ </div>
189
+ </Modal>
190
+ <Modal title="查看附件" v-model="modalDocx" fullscreen scrollable :mask="false">
191
+ <div ref="file"></div>
192
+ </Modal>
193
+ </lamboIndicatorCard>
194
+ </transition>
195
+
196
+ <Modal v-model="modal1" title="选择节点"
197
+ @on-cancel="cancel"
198
+ @on-ok="doPass">
199
+ <Table border
200
+ :data="allNode"
201
+ :columns="nodeColumn"
202
+ highlight-row
203
+ @on-current-change="selectNode">
204
+ </Table>
205
+ </Modal>
206
+ <assigneeBox ref="assigneeHelpBox" :execution-completed="executionCompleted"
207
+ @update-selected="handleSelectedUser" @update-next-node-assignee="updateNextNodeAssignee"
208
+ @add-multitask-instance="addMultitaskInstance" @delegate-task-assignee="delegateTask"
209
+ :data="assigneeBoxData" :smart-flow-server-context="smartFlowServerContext"
210
+ :upms-server-context="upmsServerContext"/>
211
+ <Modal ref="processTraceModal" v-model="modalBoxShow" width="1000" title="流程跟踪图">
212
+ <Workflow_Diagram ref="processTrace" :instanceId="process.instanceId" :applyId="process.applyId"
213
+ :procId="process.procId" :table-columns="diagramTableColumns" :scroll-element="scrollElement"
214
+ :tableData="process.tableData" :hisAudit="hisAudit"
215
+ :approve-detail-show-way="approveDetailShowWay"
216
+ :smart-flow-server-context="smartFlowServerContext">
217
+ </Workflow_Diagram>
218
+ </Modal>
219
+ <Modal v-model="reductionMultitaskInstanceModal" title="会签减签"
220
+ @on-cancel="reductionModalCancel"
221
+ @on-ok="reductionMultitaskInstance">
222
+ <Table border
223
+ :data="unapprovedAssigneeList"
224
+ :columns="reductionColumn"
225
+ @on-selection-change="selectAssignee">
226
+ </Table>
227
+ </Modal>
228
+ <Modal v-model="appointBoxShow" title="下一环节设置"
229
+ @on-cancel="appointBoxShow = false" width="600"
230
+ @on-ok="appointOk">
231
+ <Card v-for="(item,index) of nextNodesFormList" :key="index" style="margin-bottom: 10px"
232
+ v-if="handleButtons && (handleButtons.includes('appointHandler') || handleButtons.includes('appointTimeoutTime'))">
233
+ <Form ref="appointBox" justify="center" :label-width="100" :model="item"
234
+ style="margin: 10px 0 0 10px;" :rules="ruleValidate">
235
+ <div v-if="handleButtons && handleButtons.includes('appointHandler')">
236
+ <FormItem label="下一环节:">
237
+ {{ item.name }}
238
+ </FormItem>
239
+ <FormItem label="人员类型:" v-if="!item.isMultiInstance">
240
+ <RadioGroup v-model="item.actionType">
241
+ <Radio label="ASSIGNEE">办理人</Radio>
242
+ <Radio label="CAND">候选人</Radio>
243
+ </RadioGroup>
244
+ </FormItem>
245
+ <FormItem label="办理人员:" prop="assignee" v-if="!item.isMultiInstance && item.actionType === 'ASSIGNEE'">
246
+ <Input v-model="item.assigneeName"
247
+ placeholder="请选择办理人"
248
+ style="width: 68%"
249
+ icon="md-apps"
250
+ @on-focus="readingRangeClick(item)"
251
+ @on-click="readingRangeClick(item)"/>
252
+ </FormItem>
253
+ <FormItem label="候选人员:" prop="candidateGroups"
254
+ v-if="!item.isMultiInstance && item.actionType === 'CAND'">
255
+ <Input v-model="item.candidateNames"
256
+ placeholder="请选择候选人"
257
+ style="width: 68%"
258
+ icon="md-apps"
259
+ @on-focus="candidateGroupsReadingRangeClick(item)"
260
+ @on-click="candidateGroupsReadingRangeClick(item)"/>
261
+ </FormItem>
262
+ <FormItem label="候选人员:" prop="candidateGroups"
263
+ v-if="item.isMultiInstance && item.actionType === 'CAND'">
264
+ </FormItem>
265
+
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"/>
271
+ </div>
272
+ <div v-if="handleButtons && handleButtons.includes('appointTimeoutTime')">
273
+ <Row>
274
+ <Col span="12">
275
+ <FormItem label="停留时间:">
276
+ <Input v-model="item.remainDay" style="width: 100px" type="number" :min="0"></Input>
277
+
278
+ </FormItem>
279
+ </Col>
280
+ <Col span="12">
281
+ <FormItem>
282
+ <Input v-model="item.remainTime" style="margin-left: -140px; width: 100px" type="number"
283
+ :min="0"></Input>
284
+ 小时 自动处理
285
+ </FormItem>
286
+ </Col>
287
+ </Row>
288
+ <Row>
289
+ <Col span="12">
290
+ <FormItem label="任务提前:">
291
+ <Input v-model="item.inAdvanceDay" style="width: 100px" type="number" :min="0"></Input>
292
+
293
+ </FormItem>
294
+ </Col>
295
+ <Col span="12">
296
+ <FormItem>
297
+ <Input v-model="item.inAdvanceTime" style="margin-left: -140px;width: 100px" type="number"
298
+ :min="0"></Input>
299
+ 小时 标红预警
300
+ </FormItem>
301
+ </Col>
302
+ </Row>
303
+ <FormItem label="处理方式:">
304
+ <Select v-model="item.processing" style="width:200px" placeholder="自动同意">
305
+ <Option v-for="item in handleTypeList" :value="item.value" :key="item.value">
306
+ {{ item.label }}
307
+ </Option>
308
+ </Select>
309
+ </FormItem>
310
+ </div>
311
+ </Form>
312
+ </Card>
313
+ </Modal>
314
+ <candidateGroupsHelpBox ref="candidateGroupsHelpBox" :show="candidateGroupsHelpBoxShow"
315
+ @update-cand-groups="updateCandGroups"
316
+ :upms-server-context="upmsServerContext"
317
+ :smart-flow-server-context="smartFlowServerContext"/>
318
+ <template slot="page-footer">
319
+ <div>
320
+ <slot name="footer-button"></slot>
321
+ <Button style="margin-left: 10px;" v-if="handleButtons && handleButtons.includes('auditTo70') && !isDetail && !appointTask"
322
+ :disabled="disable" :loading="loading" @click="audit('70')">驳回到原点
323
+ </Button>
324
+ <Button style="margin-left: 10px;" v-if="handleButtons && handleButtons.includes('auditTo40') && !isDetail && !appointTask"
325
+ :disabled="disable" :loading="loading" @click="audit('40')">驳回上一节点
326
+ </Button>
327
+ <Button style="margin-left: 10px;" v-if="handleButtons && handleButtons.includes('auditTo90') && !isDetail && !appointTask"
328
+ :disabled="disable" :loading="loading" @click="audit('90')">驳回指定节点
329
+ </Button>
330
+ <Button style="margin-left: 10px;" v-if="handleButtons && handleButtons.includes('auditTo80') && !isDetail && !appointTask"
331
+ :disabled="disable" :loading="loading" @click="audit('80')">跳转指定节点
332
+ </Button>
333
+ <Button style="margin-left: 10px;" v-if="handleButtons && handleButtons.includes('auditTo82') && !isDetail && !appointTask"
334
+ :disabled="disable" :loading="loading" @click="audit('82')">指定他人处理
335
+ </Button>
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"
342
+ :disabled="disable" :loading="loading" @click="showUpdateMultitaskInstanceModal('81')">加签
343
+ </Button>
344
+ <Button style="margin-left: 10px;"
345
+ v-if="curNodeType === 'multiNode' && handleButtons && handleButtons.includes('reductionMultitaskInstance') && !isDetail && !appointTask"
346
+ :disabled="disable" :loading="loading" @click="showUpdateMultitaskInstanceModal('83')">减签
347
+ </Button>
348
+ <Button style="margin-left: 10px;" v-if="handleButtons && handleButtons.includes('auditTo50') && !isDetail && !appointTask"
349
+ :disabled="disable" :loading="loading" @click="audit('50')">直接结束流程
350
+ </Button>
351
+ <Button style="margin-left: 10px;" v-if="handleButtons && handleButtons.includes('processTrace')"
352
+ @click="processPrint">流程跟踪图
353
+ </Button>
354
+ <Button style="margin-left: 10px;" v-if="handleButtons && handleButtons.includes('auditTo30') && !isDetail && !appointTask"
355
+ :disabled="disable" :loading="loading" type="primary" @click="audit('30')">通过
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>
361
+ </div>
362
+ </template>
363
+ </LamboPageContainer>
364
+ </template>
365
+
366
+
367
+ <script>
368
+ import LamboPageContainer from '@lambo-design/page-container'
369
+ import LamboIndicatorCard from '@lambo-design/indicator-card'
370
+ import Workflow_Diagram from './workflow-diagram'
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'
383
+
384
+ // 引入docx-preview插件
385
+ let docx = require('docx-preview')
386
+
387
+ export default {
388
+ props: {
389
+ isDetail: {
390
+ type: Boolean,
391
+ required: false,
392
+ default: false
393
+ },
394
+ width: {
395
+ type: Number,
396
+ required: false,
397
+ default: 400
398
+ },
399
+ procId: {
400
+ type: String,
401
+ required: true,
402
+ },
403
+ taskNode: {
404
+ type: String,
405
+ required: true,
406
+ },
407
+ applyId: {
408
+ type: String,
409
+ required: true,
410
+ },
411
+ taskId: {
412
+ type: String,
413
+ required: false,
414
+ default: '',
415
+ },
416
+ auditGroup: {
417
+ type: String,
418
+ required: false,
419
+ default: '',
420
+ },
421
+ defaultAuditOpinion: {
422
+ type: String,
423
+ required: false,
424
+ default: '',
425
+ },
426
+ //详情页催办按钮
427
+ pushButton: {
428
+ type: Boolean,
429
+ required: false,
430
+ default: true,
431
+ },
432
+ //流程跟踪图附件列
433
+ showAttachmentFile: {
434
+ type: Boolean,
435
+ required: false,
436
+ default: true,
437
+ },
438
+ //流程跟踪图审批详情触发方式
439
+ approveDetailShowWay: {
440
+ type: String,
441
+ required: false,
442
+ default: 'click',
443
+ },
444
+ //业务表单保存方法
445
+ businessFormSave: {
446
+ type: Function,
447
+ required: false
448
+ },
449
+ //按钮执行完毕回调方法
450
+ executionCompleted: {
451
+ type: Function,
452
+ required: false,
453
+ default: () => {
454
+ }
455
+ },
456
+ title: {
457
+ type: String,
458
+ default: '流程办理'
459
+ },
460
+ smartFlowServerContext: {
461
+ type: String,
462
+ default: '/api/smart-flow-server',
463
+ },
464
+ upmsServerContext: {
465
+ type: String,
466
+ default: '/api/upms-server',
467
+ },
468
+ },
469
+ components: {
470
+ Title,
471
+ LamboPageContainer,
472
+ Workflow_Diagram,
473
+ processHistory,
474
+ assigneeBox,
475
+ LamboPagingTable,
476
+ AuditOpinion,
477
+ LamboIndicatorCard,
478
+ UploadFile,
479
+ CandidateGroupsHelpBox,
480
+ CountersingersBox
481
+ },
482
+ data() {
483
+ return {
484
+ isExpanded: true,
485
+ showProcessInfo: true,
486
+ portraitWidth: 0,
487
+ requestSuccessCodes: [200, '200'],
488
+ auditShow: true,
489
+ historyShow: true,
490
+ attachListShow: true,
491
+ attachmentList: [],
492
+ modalVisible: false,
493
+ modalDocx: false,
494
+ imageUrl: '',
495
+ assigneeBoxData: {},
496
+ selectedUserId: '',
497
+ targetTaskNode: '',
498
+ allNode: [],
499
+ auditParams: {},
500
+ scrollElement: null,
501
+ modal1: false,
502
+ modalBoxShow: false,
503
+ reductionMultitaskInstanceModal: false,
504
+ candidateGroupsHelpBoxShow: false,
505
+ appointBoxShow: false,
506
+ autoOpenNode: '0',
507
+ unapprovedAssigneeList: [],
508
+ reductionAssigneeList: [],
509
+ nextNodesOldSettings: [],
510
+ nextNodesFormList: [],
511
+ hisNode: [],
512
+ processHistory: [],
513
+ permScope: '',
514
+ organTreeType: '00',
515
+ defaultOrganTreeType: '00',
516
+ ruleValidate: {
517
+ auditOpinion: [{ required: true, trigger: 'blur', message: '意见不能为空' }],
518
+ assignee: [{ required: true, trigger: 'blur', message: '办理人不能为空' }],
519
+ candidateGroups: [{ required: true, trigger: 'blur', message: '候选人不能为空' }],
520
+ },
521
+ form: {
522
+ auditOpinion: '',
523
+ },
524
+ loading: false,
525
+ disable: false,
526
+ revokeDelegateTask: false,
527
+ appointTask: false,
528
+ instanceId: '',
529
+ curTaskId: '',
530
+ curNodeType: 'userTask',
531
+ handleButtons: [],
532
+ handleName: '',
533
+ auditOpinionTitle: '',
534
+ auditResult: '',
535
+ curAuditGroup: '',
536
+ custChange: 'auditInfo',
537
+ auditInfo: 'auditInfo',
538
+ auditProcess: 'auditProcess',
539
+ fileList: [],
540
+ ossFilePutUrl: '/manage/oss/file/put',
541
+ hisAudit: [],
542
+ hisAuditOpinion: [{
543
+ auditOpinion: '',
544
+ auditTime: '',
545
+ }],
546
+ datas: {
547
+ orgName: '',
548
+ orgId: ''
549
+ },
550
+ editForm: {
551
+ approvalCost: '',
552
+ cost: '',
553
+ activityDate: []
554
+ },
555
+ process: {
556
+ tableData: [],
557
+ instanceId: '',
558
+ applyId: '',
559
+ procId: ''
560
+ },
561
+ handleButtonsNames: {
562
+ '30': '通过',
563
+ '70': '驳回到原点',
564
+ '40': '驳回上一节点',
565
+ '90': '驳回指定节点',
566
+ '80': '跳转指定节点',
567
+ '82': '指定他人处理',
568
+ '50': '直接结束流程',
569
+ '84': '委派任务',
570
+ '61': '交回委派任务',
571
+ '62': '撤回委派任务',
572
+ },
573
+ handleTypeList: [
574
+ {
575
+ value: '00',
576
+ label: '只预警不处理'
577
+ },
578
+ {
579
+ value: '10',
580
+ label: '自动同意'
581
+ },
582
+ {
583
+ value: '20',
584
+ label: '直接终止流程'
585
+ },
586
+ {
587
+ value: '90',
588
+ label: '自动驳回'
589
+ }
590
+ ],
591
+ }
592
+
593
+ },
594
+
595
+ mounted() {
596
+ this.getWidth()
597
+ if (this.procId) {
598
+ this.initData()
599
+ }
600
+ let modalElement = this.$refs.processTraceModal.$el
601
+ for (let i = 0; i < modalElement.children.length; i++) {
602
+ //找到滚动的目标element
603
+ let targetElement = modalElement.children[i]
604
+ if (targetElement.classList.toString().includes('-wrap')){
605
+ this.scrollElement = targetElement
606
+ break
607
+ }
608
+ }
609
+ },
610
+ computed: {
611
+ processHistoryHeight() {
612
+ let str = ''
613
+ const hasAuditOpinion = this.taskNode && this.handleButtons && this.handleButtons.includes('auditOpinion')
614
+ const hasAttachmentFile = this.handleButtons && this.handleButtons.includes('auditHistory') && this.attachmentList.length > 0
615
+ const isDetail = this.isDetail && !this.hisAuditOpinion[0].auditOpinion.length > 0
616
+ if (hasAuditOpinion && !hasAttachmentFile && !isDetail) {
617
+ str += 'height: 43vh'
618
+ } else if (hasAuditOpinion && hasAttachmentFile && !isDetail) {
619
+ str += 'height: 40vh'
620
+ } else {
621
+ str += 'height: 67vh'
622
+ }
623
+ return str
624
+ },
625
+ nodeColumn: function () {
626
+ let column = []
627
+ column.push({ title: '序号', type: 'index', width: 70, align: 'center', fixed: 'left' })
628
+ column.push({ title: '节点名称', key: 'taskName', minWidth: 150, align: 'center', fixed: 'left' })
629
+
630
+ column.push({
631
+ title: '节点状态', key: 'auditResult', minWidth: 150, align: 'center', fixed: 'left',
632
+ render: (h, params) => {
633
+ if (params.row.taskNode == this.taskNode) {
634
+ return h('div', [
635
+ h('tag', {
636
+ props: {
637
+ color: '#ff9900'
638
+ }
639
+ }, '当前节点')
640
+ ])
641
+ } else if (!params.row.auditResult) {
642
+ return h('div', [
643
+ h('tag', {
644
+ props: {
645
+ color: '#ff9900'
646
+ }
647
+ }, `未${params.row.handleName ? params.row.handleName : '审批'}`)
648
+ ])
649
+ } else {
650
+ if (params.row.auditResult == '30' && params.row.taskNode != this.taskNode) {
651
+ return h('div', [
652
+ h('tag', {
653
+ props: {
654
+ color: '#19be6b'
655
+ }
656
+ }, `已${params.row.handleName ? params.row.handleName : '审批'}通过`)
657
+ ])
658
+ } else if (params.row.auditResult == '40' && params.row.taskNode != this.taskNode) {
659
+ return h('div', [
660
+ h('tag', {
661
+ props: {
662
+ color: '#ed4014'
663
+ }
664
+ }, '已驳回到上一节点')
665
+ ])
666
+ } else if (params.row.auditResult == '60' && params.row.taskNode != this.taskNode) {
667
+ return h('div', [
668
+ h('tag', {
669
+ props: {
670
+ color: '#ed4014'
671
+ }
672
+ }, '已撤回')
673
+ ])
674
+ } else if (params.row.auditResult == '61' && params.row.taskNode != this.taskNode) {
675
+ return h('div', [
676
+ h('tag', {
677
+ props: {
678
+ color: '#19be6b'
679
+ }
680
+ }, '已交回委派任务')
681
+ ])
682
+ } else if (params.row.auditResult == '62' && params.row.taskNode != this.taskNode) {
683
+ return h('div', [
684
+ h('tag', {
685
+ props: {
686
+ color: '#ed4014'
687
+ }
688
+ }, '委派任务已撤回')
689
+ ])
690
+ } else if (params.row.auditResult == '80' && params.row.taskNode != this.taskNode) {
691
+ return h('div', [
692
+ h('tag', {
693
+ props: {
694
+ color: '#19be6b'
695
+ }
696
+ }, '已跳转到指定节点')
697
+ ])
698
+ } else if (params.row.auditResult == '90' && params.row.taskNode != this.taskNode) {
699
+ return h('div', [
700
+ h('tag', {
701
+ props: {
702
+ color: '#19be6b'
703
+ }
704
+ }, '已驳回到指定节点')
705
+ ])
706
+ }
707
+ }
708
+ }
709
+ })
710
+ column.push({
711
+ title: '操作', width: 100, align: 'center',
712
+ render: (h, params) => {
713
+ return h('div', [
714
+ h('Button', {
715
+ props: {
716
+ type: 'primary',
717
+ size: 'small'
718
+ },
719
+ style: {
720
+ marginRight: '5px'
721
+ },
722
+ on: {
723
+ click: () => {
724
+ this.selectNode(params.row)
725
+ }
726
+ }
727
+ }, '选择')
728
+ ])
729
+ },
730
+ })
731
+ return column
732
+ },
733
+ reductionColumn: function () {
734
+ let column = []
735
+ column.push({ title: '#', key: 'selectId', type: 'selection', align: 'center', width: 55 })
736
+ column.push({ title: '账号', key: 'auditId', align: 'center' })
737
+ column.push({ title: '姓名', key: 'auditName', align: 'center' })
738
+ return column
739
+ },
740
+ diagramTableColumns: function () {
741
+ let column = []
742
+ column.push({ title: '序号', type: 'index', width: 60 })
743
+ column.push({ title: `${this.handleName}节点`, key: 'taskName', minWidth: 130 })
744
+ column.push({ title: `${this.handleName}人`, key: 'auditName', minWidth: 150, tooltip: true })
745
+ column.push({
746
+ title: `${this.handleName}结果`, key: 'auditResult', minWidth: 150, align: 'center',
747
+ render: (h, { row, column, index }) => {
748
+ let label = ''
749
+ let tagColor = ''
750
+ if (row.auditResult == '00') {
751
+ label = '流程发起'
752
+ tagColor = 'green' // 绿色
753
+ } else if (row.auditResult == '10') {
754
+ label = '自动跳过'
755
+ tagColor = 'green' // 绿色
756
+ } else if (row.auditResult == '30') {
757
+ label = '通过'
758
+ tagColor = 'green' // 绿色
759
+ } else if (row.auditResult == '40') {
760
+ label = '驳回到上一级'
761
+ tagColor = 'volcano' // 火红色
762
+ } else if (row.auditResult == '50') {
763
+ label = '驳回到原点'
764
+ tagColor = 'red' // 红色
765
+ } else if (row.auditResult == '51') {
766
+ label = '流程终止'
767
+ tagColor = 'purple' // 紫色
768
+ } else if (row.auditResult == '60') {
769
+ label = '撤回'
770
+ tagColor = 'blue' // 蓝色
771
+ } else if (row.auditResult == '61') {
772
+ label = '交回委派任务'
773
+ tagColor = 'green' // 绿色
774
+ } else if (row.auditResult == '62') {
775
+ label = '委派任务被撤回'
776
+ tagColor = 'blue' // 蓝色
777
+ } else if (row.auditResult == '80') {
778
+ label = '跳转到指定节点'
779
+ tagColor = 'cyan' // 青色
780
+ } else if (row.auditResult == '83') {
781
+ label = '会签减签'
782
+ tagColor = 'red' // 青色
783
+ } else if (row.auditResult == '90') {
784
+ label = '驳回到指定节点'
785
+ tagColor = 'magenta' // 品红色
786
+ } else {
787
+ label = '待审核'
788
+ tagColor = 'orange' // 默认橙色
789
+ }
790
+ return h('Tag', {
791
+ props: {
792
+ color: tagColor,
793
+ value: row.auditResult
794
+ }
795
+ }, label)
796
+ }
797
+ })
798
+ column.push({
799
+ title: `${this.handleName}时间`, key: 'auditTime', minWidth: 150,
800
+ render: (h, { row }) => {
801
+ const displayDate = row.startDate || row.auditDate
802
+ return h('span', displayDate)
803
+ }
804
+ })
805
+ column.push({
806
+ title: `${this.handleName}意见`, key: 'auditComment', minWidth: 180, tooltip: true,
807
+ render: (h, { row, column, index }) => {
808
+ let label = ''
809
+ if (row.auditComment == '' || row.auditComment == null) {
810
+ label = '无'
811
+ } else {
812
+ label = row.auditComment
813
+ }
814
+ return h('Label', {
815
+ props: {
816
+ value: row.auditComment
817
+ }
818
+ }, label)
819
+ }
820
+ })
821
+ if (this.showAttachmentFile) {
822
+ column.push({
823
+ title: `附件`, key: 'fileList', minWidth: 200,
824
+ render: (h, { row }) => {
825
+ if (!row.fileList || row.fileList.length === 0) {
826
+ return h('span', '无') // 如果没有附件,显示“无”
827
+ }
828
+
829
+ //显示所有附件
830
+ return h('div', row.fileList.map(file => {
831
+ return h('a', {
832
+ style: {
833
+ display: 'block',
834
+ marginTop: '5px',
835
+ marginRight: '5px',
836
+ whiteSpace: 'nowrap',
837
+ overflow: 'hidden',
838
+ textOverflow: 'ellipsis',
839
+ maxWidth: '100px',
840
+ },
841
+ attrs: {
842
+ title: file.attachName // 鼠标悬停时显示完整名称
843
+ },
844
+ on: {
845
+ click: () => {
846
+ this.getAttach(file)
847
+ }
848
+ },
849
+ }, file.attachName)
850
+ }))
851
+ }
852
+ })
853
+ }
854
+
855
+ return column
856
+ },
857
+ },
858
+ provide() {
859
+ return {
860
+ toBeDoneListDoSearch: this.doSearch
861
+ }
862
+ },
863
+ methods: {
864
+ getWidth() {
865
+ if (this.width && this.width < 400) {
866
+ this.portraitWidth = 400
867
+ }
868
+ this.portraitWidth = this.width
869
+ },
870
+ initData() {
871
+ if (!this.isDetail) {
872
+ this.getTodoTask()
873
+ } else {
874
+ this.getDoneTask()
875
+ }
876
+ this.getHandleButtons()
877
+ },
878
+ getTodoTask() {
879
+ const self = this
880
+ let param = {
881
+ procId: this.procId,
882
+ applyId: this.applyId,
883
+ taskNode: this.taskNode,
884
+ taskId: this.taskId,
885
+ auditGroup: this.auditGroup
886
+ }
887
+ ajax.get(self.smartFlowServerContext + '/manage/processTodo/list', { params: param }).then(function (resp) {
888
+ if (resp.data.code === '200') {
889
+ let todoData = resp.data.data.rows[0]
890
+ self.curTaskId = todoData.taskId
891
+ self.instanceId = todoData.procInstanceId
892
+ self.curAuditGroup = todoData.auditGroup
893
+ self.revokeDelegateTask = todoData.delegateStatus ? todoData.delegateStatus === '10' : false
894
+ self.appointTask = todoData.delegateStatus ? todoData.delegateStatus === '20' : false
895
+ if (self.revokeDelegateTask) self.disable = true
896
+ let procType = todoData.procType
897
+ ajax.get(self.smartFlowServerContext + '/manage/processType/lists?proType=' + procType)
898
+ .then(resp => {
899
+ let data = resp.data.data.rows
900
+ self.permScope = data[0].permScope
901
+ self.defaultOrganTreeType = data[0].organTreeType ? data[0].organTreeType : '00'
902
+ self.getNodeOrganTreeType(procType)
903
+ }).catch(err => {
904
+ console.log(err)
905
+ })
906
+ self.getAttachList(self.curTaskId)
907
+ self.getHisAudit(self.curTaskId)
908
+ self.getProcessHistory(self.curTaskId)
909
+ } else {
910
+ self.$Message.error(resp.data.message)
911
+ }
912
+ }).catch((err) => {
913
+ console.log(err)
914
+ })
915
+ },
916
+ getNodeOrganTreeType(procType) {
917
+ const self = this
918
+ let param = {
919
+ procType: procType,
920
+ procId: this.procId,
921
+ taskNode: this.taskNode
922
+ }
923
+ ajax.get(self.smartFlowServerContext + '/manage/processTodo/getNodeOrganTreeType', { params: param }).then(function (resp) {
924
+ if (resp.data.code === '200') {
925
+ self.organTreeType = resp.data.data ? resp.data.data : self.defaultOrganTreeType
926
+ } else {
927
+ self.$Message.error(resp.data.message)
928
+ }
929
+ }).catch((err) => {
930
+ console.log(err)
931
+ })
932
+ },
933
+ getDoneTask() {
934
+ const self = this
935
+ let param = {
936
+ procId: this.procId,
937
+ applyId: this.applyId,
938
+ taskNode: this.taskNode,
939
+ taskId: this.taskId,
940
+ auditGroup: this.auditGroup
941
+ }
942
+ ajax.get(self.smartFlowServerContext + '/manage/processDone/getDoneDetail', { params: param }).then(function (resp) {
943
+ if (resp.data.code === '200') {
944
+ let rows = resp.data.data.rows
945
+ if (rows.length > 0) {
946
+ self.curAuditGroup = rows[0].auditGroup
947
+ self.hisAuditOpinion = []
948
+ let taskList = resp.data.data.rows
949
+ taskList.forEach(item => {
950
+ self.hisAuditOpinion.push({
951
+ auditOpinion: item.auditComment,
952
+ auditTime: timestampToTime(item.auditDate)
953
+ })
954
+ })
955
+ self.curTaskId = taskList[0].taskId
956
+ self.instanceId = taskList[0].procInstanceId
957
+ } else {
958
+ ajax.get(self.smartFlowServerContext + '/manage/processTodo/list', { params: param }).then(function (todoResp) {
959
+ if (todoResp.data.code === '200') {
960
+ self.curTaskId = todoResp.data.data.rows[0].taskId
961
+ self.instanceId = todoResp.data.data.rows[0].procInstanceId
962
+ self.curAuditGroup = todoResp.data.data.rows[0].auditGroup
963
+ } else {
964
+ self.$Message.error(todoResp.data.message)
965
+ }
966
+ }).catch((err) => {
967
+ console.log(err)
968
+ })
969
+ }
970
+ self.getAttachList(self.curTaskId)
971
+ self.getHisAudit(self.curTaskId)
972
+ self.getProcessHistory(self.curTaskId)
973
+ } else {
974
+ self.$Message.error(resp.data.message)
975
+ }
976
+ }).catch((err) => {
977
+ console.log(err)
978
+ })
979
+ },
980
+ getHandleButtons() {
981
+ const self = this
982
+ let param = {
983
+ procId: this.procId,
984
+ taskNode: this.taskNode
985
+ }
986
+ ajax.post(self.smartFlowServerContext + '/manage/approvalCenter/getNodeData', param).then(function (resp) {
987
+ if (resp.data.code === '200') {
988
+ self.handleButtons = resp.data.data[0].handleButtons
989
+ if (resp.data.data[0].hasOwnProperty('isSequential')) {
990
+ self.curNodeType = resp.data.data[0].isSequential ? 'sequentialMultiNode' : 'multiNode'
991
+ }
992
+ self.handleName = resp.data.data[0].handleName ? resp.data.data[0].handleName : '审批'
993
+ self.auditOpinionTitle = resp.data.data[0].handleName ? resp.data.data[0].handleName + '意见' : '审批意见'
994
+ if (!self.handleButtons || (!self.handleButtons.includes('auditOpinion') && !self.handleButtons.includes('attachmentFile') && !self.handleButtons.includes('auditHistory'))) {
995
+ self.showProcessInfo = false
996
+ }
997
+ } else {
998
+ self.$Message.error(resp.data.message)
999
+ }
1000
+ }).catch((err) => {
1001
+ console.log(err)
1002
+ })
1003
+ },
1004
+ getNextNodes() {
1005
+ const self = this
1006
+ self.nextNodesFormList = []
1007
+ self.nextNodesOldSettings = []
1008
+ let param = {
1009
+ procId: this.procId,
1010
+ taskNode: this.taskNode
1011
+ }
1012
+ ajax.post(self.smartFlowServerContext + '/manage/processTodo/getNextNodes', param).then(function (resp) {
1013
+ if (resp.data.code === '200') {
1014
+ let nextNodeForm = {}
1015
+ let nextNodeOldForm = {}
1016
+ let data = resp.data.data
1017
+ for (let i = 0; i < data.length; i++) {
1018
+ nextNodeOldForm = {
1019
+ id: data[i].id,
1020
+ assignee: data[i].assignee ? data[i].assignee.id : '',
1021
+ timeLimit: data[i].timeLimit,
1022
+ }
1023
+ nextNodeForm = {
1024
+ id: data[i].id,
1025
+ name: data[i].name,
1026
+ orgTreeType: data[i].orgTreeType,
1027
+ assignee: data[i].assignee ? data[i].assignee.id : '',
1028
+ assigneeName: data[i].assignee ? data[i].assignee.name : '',
1029
+ candidateGroups: '',
1030
+ isMultiInstance: data[i].isMultiInstance,
1031
+ actionType: 'ASSIGNEE',
1032
+ remainDay: 0,
1033
+ remainTime: 0,
1034
+ inAdvanceDay: 0,
1035
+ inAdvanceTime: 0,
1036
+ processing: '00'
1037
+ }
1038
+ //显示具体候选人信息
1039
+ if (data[i].candidateGroups) {
1040
+ nextNodeForm.actionType = 'CAND'
1041
+ let names = []
1042
+ let candidates = {}
1043
+ for (let groupName in data[i].candidateGroups) {
1044
+ if (data[i].candidateGroups.hasOwnProperty(groupName)) {
1045
+ let group = data[i].candidateGroups[groupName]
1046
+ group.forEach(item => {
1047
+ names.push(item.name)
1048
+ })
1049
+ candidates[groupName] = group.map(item => item.id + ':' + item.name).join(',')
1050
+ }
1051
+ }
1052
+ nextNodeForm.candidateNames = names.join(',')
1053
+ nextNodeForm.candidates = candidates
1054
+ nextNodeOldForm.candidates = candidates
1055
+ }
1056
+ if (data[i].timeLimit) {
1057
+ let expireTime = data[i].timeLimit.split(';')[0].split(':')[1]
1058
+ let warningTime = data[i].timeLimit.split(';')[1].split(':')[1]
1059
+ let handleType = data[i].timeLimit.split(';')[2].split(':')[1]
1060
+ let days = expireTime.slice(0, expireTime.indexOf('D')) //过期天
1061
+ let hourOfDay = expireTime.slice(expireTime.indexOf('D') + 1, expireTime.indexOf('H')) //过期小时
1062
+ let daysWarn = warningTime.slice(0, warningTime.indexOf('D')) //警告天
1063
+ let hourOfDayWarn = warningTime.slice(warningTime.indexOf('D') + 1, warningTime.indexOf('H')) //警告小时
1064
+ nextNodeForm.remainDay = parseInt(days)
1065
+ nextNodeForm.remainTime = parseInt(hourOfDay)
1066
+ nextNodeForm.inAdvanceDay = parseInt(daysWarn)
1067
+ nextNodeForm.inAdvanceTime = parseInt(hourOfDayWarn)
1068
+ nextNodeForm.processing = handleType
1069
+ }
1070
+ self.nextNodesFormList.push(nextNodeForm)
1071
+ self.nextNodesOldSettings.push(nextNodeOldForm)
1072
+ }
1073
+ } else {
1074
+ self.$Message.error(resp.data.message)
1075
+ }
1076
+ }).catch((err) => {
1077
+ console.log(err)
1078
+ })
1079
+ },
1080
+ getAttachList(taskId) {
1081
+ const self = this
1082
+ const param = {
1083
+ taskId: taskId,
1084
+ procId: this.procId,
1085
+ applyId: this.applyId
1086
+ }
1087
+ ajax.get(self.smartFlowServerContext + '/manage/processDone/getAttachmentList', { params: param }).then(function (resp) {
1088
+ self.attachmentList = resp.data.data.rows
1089
+ self.attachmentList.forEach(item => {
1090
+ const index = item.fileName.lastIndexOf('.')
1091
+ const fileType = item.fileName.substr(index + 1).toLowerCase()
1092
+ const imageList = ['jpg', 'gif', 'png', 'svg']
1093
+ const docList = ['doc', 'docx']
1094
+ const zipList = ['rar', 'zip']
1095
+ const typeList = ['jpg', 'gif', 'png', 'docx']
1096
+ item.fileType = imageList.indexOf(fileType) !== -1 ? 'image' : docList.indexOf(fileType) !== -1 ? 'doc' : zipList.indexOf(fileType) !== -1 ? 'zip' : fileType
1097
+ item.showPreview = typeList.indexOf(fileType) !== -1
1098
+ })
1099
+ }).catch(err => {
1100
+ console.log(err)
1101
+ })
1102
+ },
1103
+ getHisAudit(taskId) {
1104
+ let self = this
1105
+ let params = {
1106
+ applyId: self.applyId,
1107
+ instanceId: self.instanceId,
1108
+ procId: self.procId,
1109
+ taskId: taskId
1110
+ }
1111
+ ajax.get(self.smartFlowServerContext + '/manage/processTodo/getHisAudit', { params: params }).then(function (resp) {
1112
+ if (resp.data.code === '200') {
1113
+ self.hisAudit = resp.data.data
1114
+ let uniqueDataMap = {}
1115
+ self.hisAudit.forEach((item) => {
1116
+ uniqueDataMap[item['taskNode']] = item
1117
+ })
1118
+ self.hisNode = Object.values(uniqueDataMap)
1119
+
1120
+ }
1121
+ })
1122
+ },
1123
+ getProcessHistory(taskId) {
1124
+ let self = this
1125
+ let params = {
1126
+ applyId: self.applyId,
1127
+ instanceId: self.instanceId,
1128
+ procId: self.procId,
1129
+ taskId: taskId
1130
+ }
1131
+ ajax.get(self.smartFlowServerContext + '/manage/processTodo/getProcessHis', { params: params }).then(function (resp) {
1132
+ if (resp.data.code === '200') {
1133
+ self.processHistory = resp.data.data
1134
+ }
1135
+ })
1136
+ },
1137
+
1138
+ audit: function (auditResult) {
1139
+ let self = this
1140
+ self.auditResult = auditResult
1141
+ self.submit()
1142
+ },
1143
+ submit() {
1144
+ let self = this
1145
+ self.auditParams = {
1146
+ procId: self.procId,
1147
+ applyId: self.applyId,
1148
+ taskId: self.curTaskId,
1149
+ auditOpinion: self.form.auditOpinion,
1150
+ fileListStr: JSON.stringify(self.fileList),
1151
+ auditResult: self.auditResult,
1152
+ params: JSON.stringify(self.datas),
1153
+ targetTaskNode: self.targetTaskNode,
1154
+ selectedUserId: self.selectedUserId,
1155
+ }
1156
+ if (self.auditResult == '' || self.auditResult == null) {
1157
+ self.$Message.error(`请选择${self.handleName}结果!`)
1158
+ return
1159
+ }
1160
+ if (self.form.auditOpinion == '' || self.form.auditOpinion == null) {
1161
+ if (self.auditResult === '30') {
1162
+ self.auditParams.auditOpinion = '通过'
1163
+ self.businessFormSave ? self.businessFormSave(self.handleSaveResult) : self.handleSaveResult(true)
1164
+ return
1165
+ }
1166
+ if ((!self.handleButtons || self.handleButtons.includes('auditOpinion')) && self.auditResult !== '84') {
1167
+ self.$Message.error(`请输入${self.handleName}意见!`)
1168
+ return
1169
+ } else {
1170
+ self.auditParams.auditOpinion = self.handleButtonsNames[self.auditResult]
1171
+ }
1172
+ }
1173
+ self.businessFormSave ? self.businessFormSave(self.handleSaveResult) : self.handleSaveResult(true)
1174
+ },
1175
+ handleSaveResult(saveResult, businessParams) {
1176
+ if (saveResult) {
1177
+ this.executeButtonAction(businessParams)
1178
+ } else {
1179
+ console.error('保存失败')
1180
+ }
1181
+ },
1182
+ executeButtonAction(businessParams) {
1183
+ const self = this
1184
+ if (businessParams) {
1185
+ Object.assign(self.datas, businessParams)
1186
+ self.auditParams.params = JSON.stringify(self.datas)
1187
+ }
1188
+ let auditResult = {
1189
+ code: self.auditResult,
1190
+ name: self.handleButtonsNames[self.auditResult]
1191
+ }
1192
+ if (self.auditResult === '82') {
1193
+ //指定他人处理
1194
+ self.assigneeBoxData = self.auditParams
1195
+ self.assigneeBoxData.auditResultName = self.handleButtonsNames[self.auditResult]
1196
+ self.assigneeBoxData.instanceId = self.instanceId
1197
+ self.$refs.assigneeHelpBox.toggleShowHelpBox(self.organTreeType, '', 'transferCurTask')
1198
+ } else if (self.auditResult === '84') {
1199
+ //委派任务
1200
+ self.$refs.assigneeHelpBox.toggleShowHelpBox(self.organTreeType, '', 'delegateTask')
1201
+ } else if (self.auditResult === '62') {
1202
+ //撤回委派任务
1203
+ ajax.post(self.smartFlowServerContext + '/manage/processTodo/audit', self.auditParams).then(resp => {
1204
+ let result = resp.data
1205
+ if (result.code == '200') {
1206
+ self.loading = false
1207
+ self.disable = false
1208
+ self.revokeDelegateTask = false
1209
+ self.$Message.success('撤回委派成功')
1210
+ } else {
1211
+ self.loading = false
1212
+ self.disable = false
1213
+ self.$Message.error(result.message)
1214
+ }
1215
+ })
1216
+ } else if (self.auditResult === '61') {
1217
+ //交回委派任务
1218
+ ajax.post(self.smartFlowServerContext + '/manage/processTodo/audit', self.auditParams).then(resp => {
1219
+ let result = resp.data
1220
+ if (result.code == '200') {
1221
+ self.loading = false
1222
+ self.disable = false
1223
+ self.$Message.success('交回委派任务成功')
1224
+ if (result.data) {
1225
+ let taskIds = result.data.id ? result.data.id : result.data.map(item => item.id).join(',')
1226
+ setTimeout(() => {
1227
+ self.executionCompleted(true, result.data.id ? result.data.processInstanceId : result.data[0].processInstanceId, taskIds, auditResult, self.curTaskId)
1228
+ }, 1000)
1229
+ }
1230
+ } else {
1231
+ self.loading = false
1232
+ self.disable = false
1233
+ self.$Message.error(result.message)
1234
+ }
1235
+ })
1236
+ } else if (self.auditResult === '80') {
1237
+ //跳转到后序指定节点
1238
+ self.getNodesBehind()
1239
+ } else if (self.auditResult === '90') {
1240
+ //驳回到前序指定节点
1241
+ self.getAllPreNodes()
1242
+ } else if (self.auditResult === '40') {
1243
+ //驳回到上一级
1244
+ self.loading = true
1245
+ self.disable = true
1246
+ let url = self.smartFlowServerContext + '/manage/processTodo/getPreNode'
1247
+ ajax.post(url, self.auditParams).then(function (resp) {
1248
+ let result = resp.data
1249
+ if (result.code == '30013' || result.code == '30014') {
1250
+ //前序节点为子流程或当前节点为子流程第一个节点不可驳回上一级节点
1251
+ self.$Message.warning(result.message)
1252
+ //避免未提示消息直接回调
1253
+ setTimeout(() => {
1254
+ self.executionCompleted(false, null, null, auditResult, self.curTaskId)
1255
+ }, 1000)
1256
+ } else if (result.code == '30010') {
1257
+ self.$Modal.confirm({
1258
+ title: '提示',
1259
+ content: result.message,
1260
+ onOk: () => {
1261
+ self.auditParams.auditResult = '70'
1262
+ let url = self.smartFlowServerContext + '/manage/processTodo/audit'
1263
+ ajax.post(url, self.auditParams).then(function (resp) {
1264
+ let result = resp.data
1265
+ if (result.code == '200') {
1266
+ self.loading = false
1267
+ self.disable = false
1268
+ self.$Message.success(result.message)
1269
+ //后端没有返回数据
1270
+ setTimeout(() => {
1271
+ self.executionCompleted(true, null, null, auditResult, self.curTaskId)
1272
+ }, 1000)
1273
+ bus.$emit('triggerTimer')
1274
+ } else {
1275
+ self.loading = false
1276
+ self.disable = false
1277
+ self.$Message.error(result.message)
1278
+ setTimeout(() => {
1279
+ self.executionCompleted(false, null, null, auditResult, self.curTaskId)
1280
+ }, 1000)
1281
+ }
1282
+ bus.$emit('triggerTimer')
1283
+ })
1284
+ },
1285
+ onCancel: () => {
1286
+ self.loading = false
1287
+ self.disable = false
1288
+ }
1289
+ })
1290
+ } else if (result.code == '10012') {
1291
+ // 数据同步
1292
+ self.loading = false
1293
+ self.disable = false
1294
+ self.$Message.warning(result.message)
1295
+ setTimeout(() => {
1296
+ self.executionCompleted(true, null, null, auditResult, self.curTaskId)
1297
+ }, 1000)
1298
+ } else {
1299
+ self.loading = true
1300
+ self.disable = true
1301
+ let url = self.smartFlowServerContext + '/manage/processTodo/audit'
1302
+ ajax.post(url, self.auditParams).then(function (resp) {
1303
+ let result = resp.data
1304
+ if (result.code == '200') {
1305
+ self.loading = false
1306
+ self.disable = false
1307
+ self.$Message.success(result.message)
1308
+ setTimeout(() => {
1309
+ if (result.data) {
1310
+ let taskIds = result.data.map(item => item.id).join(',')
1311
+ self.executionCompleted(true, result.data[0].processInstanceId, taskIds, auditResult, self.curTaskId)
1312
+ } else {
1313
+ self.executionCompleted(true, null, null, auditResult, self.curTaskId)
1314
+ }
1315
+ }, 1000)
1316
+ } else {
1317
+ self.loading = false
1318
+ self.disable = false
1319
+ self.$Message.error(result.message)
1320
+ setTimeout(() => {
1321
+ self.executionCompleted(false, null, null, auditResult, self.curTaskId)
1322
+ }, 1000)
1323
+ }
1324
+ bus.$emit('triggerTimer')
1325
+ })
1326
+ }
1327
+ })
1328
+ } else {
1329
+ if (self.auditResult === '30' && (!self.handleButtons || self.handleButtons.includes('appointHandler') || self.handleButtons.includes('appointTimeoutTime'))) {
1330
+ self.getNextNodes()
1331
+ self.appointBoxShow = true
1332
+ } else {
1333
+ self.doPass()
1334
+ }
1335
+ }
1336
+ },
1337
+ doPass() {
1338
+ let self = this
1339
+ this.modal = false
1340
+ let auditResult = {
1341
+ code: self.auditResult,
1342
+ name: self.handleButtonsNames[self.auditResult]
1343
+ }
1344
+ if (self.auditResult === '82' && (self.targetTaskNode == '' || self.targetTaskNode == null)) {
1345
+ self.auditResult = ''
1346
+ self.$Message.error(`请选择${self.handleName}节点!`)
1347
+ } else {
1348
+ self.loading = true
1349
+ self.disable = true
1350
+ self.auditParams.targetTaskNode = self.targetTaskNode
1351
+ let url = self.smartFlowServerContext + '/manage/processTodo/audit'
1352
+ ajax.post(url, self.auditParams).then(function (resp) {
1353
+ let result = resp.data
1354
+ if (result.code == '200') {
1355
+ self.loading = false
1356
+ self.disable = false
1357
+ self.$Message.success(result.message ? result.message : `${self.handleName}成功`)
1358
+ if (result.data) {
1359
+ let taskIds = result.data.id ? result.data.id : result.data.map(item => item.id).join(',')
1360
+ setTimeout(() => {
1361
+ self.executionCompleted(true, result.data.id ? result.data.processInstanceId : result.data[0].processInstanceId, taskIds, auditResult, self.curTaskId)
1362
+ }, 1000)
1363
+ } else {
1364
+ setTimeout(() => {
1365
+ self.executionCompleted(true, null, null, auditResult, self.curTaskId)
1366
+ }, 1000)
1367
+ }
1368
+ } else if (result.code == '10012') {
1369
+ // 数据同步
1370
+ self.loading = false
1371
+ self.disable = false
1372
+ self.$Message.warning(result.message)
1373
+ setTimeout(() => {
1374
+ self.executionCompleted(true, null, null, auditResult, self.curTaskId)
1375
+ }, 1000)
1376
+ } else if (result.code == '20002') {
1377
+ // 流程结束
1378
+ self.loading = false
1379
+ self.disable = false
1380
+ self.$Message.success(result.message)
1381
+ setTimeout(() => {
1382
+ self.executionCompleted(true, '流程已结束', '流程已结束', auditResult, self.curTaskId)
1383
+ }, 1000)
1384
+ } else {
1385
+ self.loading = false
1386
+ self.disable = false
1387
+ self.$Message.error(result.message ? result.message : `${self.handleName}失败`)
1388
+ setTimeout(() => {
1389
+ self.executionCompleted(false, null, null, auditResult, self.curTaskId)
1390
+ }, 1000)
1391
+ }
1392
+ bus.$emit('triggerTimer')
1393
+ })
1394
+ }
1395
+ },
1396
+ showUpdateMultitaskInstanceModal(updateType) {
1397
+ const self = this
1398
+ if (updateType === '81') {
1399
+ this.$refs.assigneeHelpBox.toggleShowHelpBox(this.organTreeType, '', 'addMultitaskInstance')
1400
+ } else if (updateType === '83') {
1401
+ ajax.get(self.smartFlowServerContext + '/manage/processTodo/getUnapprovedListOfMultiNode?taskId=' + self.curTaskId).then(function (resp) {
1402
+ if (resp.data.code === '200') {
1403
+ self.unapprovedAssigneeList = resp.data.data
1404
+ self.reductionMultitaskInstanceModal = true
1405
+ } else {
1406
+ self.$Message.error(resp.data.message)
1407
+ }
1408
+ }).catch(err => {
1409
+ console.log(err)
1410
+ })
1411
+ }
1412
+ },
1413
+ updateMultitaskInstance(updateType, assignees) {
1414
+ const self = this
1415
+ self.loading = true
1416
+ self.disable = true
1417
+ let param = {
1418
+ taskId: self.curTaskId,
1419
+ applyId: self.applyId,
1420
+ assignees: assignees,
1421
+ updateType: updateType
1422
+ }
1423
+ ajax.post(self.smartFlowServerContext + '/manage/processTodo/updateMultitaskInstance', param).then(resp => {
1424
+ let result = resp.data
1425
+ if (result.code == '200') {
1426
+ self.loading = false
1427
+ self.disable = false
1428
+ self.$Message.success(result.message)
1429
+ } else {
1430
+ self.loading = false
1431
+ self.disable = false
1432
+ self.$Message.error(result.message)
1433
+ }
1434
+ }).catch(err => {
1435
+ console.log(err)
1436
+ })
1437
+ },
1438
+ //委派
1439
+ delegateTask(assignee) {
1440
+ const self = this
1441
+ if (!assignee){
1442
+ self.$Message.error('请选择加签人员')
1443
+ return
1444
+ }
1445
+ let auditResult = {
1446
+ code: self.auditResult,
1447
+ name: self.handleButtonsNames[self.auditResult]
1448
+ }
1449
+ self.auditParams.selectedUserId = assignee
1450
+ ajax.post(self.smartFlowServerContext + '/manage/processTodo/audit', self.auditParams).then(resp => {
1451
+ let result = resp.data
1452
+ if (result.code == '200') {
1453
+ self.loading = false
1454
+ self.disable = false
1455
+ self.$Message.success('委派成功')
1456
+ if (result.data) {
1457
+ let taskIds = result.data.id ? result.data.id : result.data.map(item => item.id).join(',')
1458
+ setTimeout(() => {
1459
+ self.executionCompleted(true, result.data.id ? result.data.processInstanceId : result.data[0].processInstanceId, taskIds, auditResult, self.curTaskId)
1460
+ }, 1000)
1461
+ }
1462
+ } else {
1463
+ self.loading = false
1464
+ self.disable = false
1465
+ self.$Message.error(result.message)
1466
+ }
1467
+ }).catch(err => {
1468
+ console.log(err)
1469
+ })
1470
+ },
1471
+ //加签
1472
+ addMultitaskInstance(assingeeList) {
1473
+ const assingees = assingeeList.join(',')
1474
+ this.updateMultitaskInstance('81', assingees)
1475
+ },
1476
+ //减签
1477
+ reductionMultitaskInstance() {
1478
+ if (this.reductionAssigneeList.length === 0) {
1479
+ this.$Message.error('请选择减签人员')
1480
+ return
1481
+ }
1482
+ const assingees = this.reductionAssigneeList.map(item => item.auditId).join(',')
1483
+ this.updateMultitaskInstance('83', assingees)
1484
+ },
1485
+
1486
+ doSearch() {
1487
+ //不需要实现,是子组件assigneeBox要求使用父组件的这个方法
1488
+ },
1489
+ tabsChange(tab) {
1490
+ console.log(tab)
1491
+ },
1492
+ getAttach(row) {
1493
+ window.open(this.smartFlowServerContext + '/manage/oss/file/get/' + row.fileId, '_blank')
1494
+ },
1495
+ preViewAttach(row) {
1496
+ let reg = /\.(gif|jpg|jpeg|bmp|png|PNG)$/
1497
+ let regs = /\.(pdf)$/
1498
+ if (reg.test(row.fileName)) {
1499
+ let url = this.smartFlowServerContext + '/manage/oss/file/get/' + row.fileId
1500
+ this.imgPreview(url)
1501
+ } else if (regs.test(row.fileName)) {
1502
+ window.open(this.smartFlowServerContext + '/manage/oss/file/getFileStream?fileId=' + row.fileId, '_blank')
1503
+ } else {
1504
+ this.modalDocx = true
1505
+ axios({
1506
+ method: 'get',
1507
+ responseType: 'blob', // 因为是流文件,所以要指定blob类型
1508
+ url: this.smartFlowServerContext + '/manage/oss/file/get/' + row.fileId// 一个word下载文件的接口
1509
+ }).then(({ data }) => {
1510
+ docx.renderAsync(data, this.$refs.file, null, {
1511
+ className: 'docx', //默认和文档样式类的类名/前缀
1512
+ inWrapper: true, //启用围绕文档内容呈现包装器
1513
+ ignoreWidth: false, //禁用页面的渲染宽度
1514
+ ignoreHeight: false, //禁用页面的渲染高度
1515
+ ignoreFonts: false, //禁用字体渲染
1516
+ breakPages: true, //在分页符上启用分页
1517
+ ignoreLastRenderedPageBreak: true, //在lastRenderedPageBreak元素上禁用分页
1518
+ experimental: false, //启用实验功能(制表符停止计算)
1519
+ trimXmlDeclaration: true, //如果为true,则在解析之前将从xml文档中删除xml声明
1520
+ useBase64URL: false, //如果为true,图像、字体等将转换为base 64 URL,否则使用URL.createObjectURL
1521
+ useMathMLPolyfill: false, //包括用于铬、边等的MathML多填充。
1522
+ showChanges: false, //启用文档更改的实验渲染(插入/删除)
1523
+ debug: false, //启用额外的日志记录
1524
+ })
1525
+ }
1526
+ )
1527
+ }
1528
+ },
1529
+ imgPreview(url) {
1530
+ this.imageUrl = url
1531
+ this.modalVisible = true
1532
+ },
1533
+
1534
+ //打印流程图信息
1535
+ processPrint() {
1536
+ let self = this
1537
+ let params = {
1538
+ applyId: self.applyId,
1539
+ instanceId: self.instanceId,
1540
+ procId: self.procId,
1541
+ taskId: self.curTaskId,
1542
+ }
1543
+ ajax.get(self.smartFlowServerContext + '/manage/processTodo/getPrintData', { params: params }).then(function (resp) {
1544
+ let result = resp.data.data
1545
+ if (resp.data.code === '200') {
1546
+ let tableData = result
1547
+ self.process.tableData = tableData
1548
+ self.process.applyId = self.applyId
1549
+ self.process.instanceId = self.instanceId
1550
+ self.process.procId = self.procId
1551
+ self.datas.orgId = tableData[0].orgId
1552
+ self.datas.orgName = tableData[0].orgName
1553
+ self.modalBoxShow = true
1554
+ }
1555
+ })
1556
+ },
1557
+
1558
+ showTaskNode(taskId) {
1559
+ if (this.processHistory.length > 0) {
1560
+ let task = null
1561
+ this.processHistory.some(itemList => {
1562
+ task = itemList.find(item => item.taskId === taskId)
1563
+ return task !== undefined
1564
+ })
1565
+ return task ? task.taskName : ''
1566
+ }
1567
+ return ''
1568
+ },
1569
+ cancel() {
1570
+ this.modal = false
1571
+ this.auditResult = ''
1572
+ },
1573
+ reductionModalCancel() {
1574
+ this.reductionMultitaskInstanceModal = false
1575
+ this.reductionAssigneeList = []
1576
+ },
1577
+ selectAssignee(selection) {
1578
+ this.reductionAssigneeList = selection
1579
+ },
1580
+ selectNode(currentRow, oldCurrentRow) {
1581
+ let self = this
1582
+ self.targetTaskNode = currentRow.taskNode
1583
+ },
1584
+ getAllPreNodes() {
1585
+ let self = this
1586
+ let params = {
1587
+ processDefId: self.procId,
1588
+ taskId: self.curTaskId,
1589
+ }
1590
+ ajax.get(self.smartFlowServerContext + '/manage/processTodo/getAllPreNodes', { params: params }).then(function (resp) {
1591
+ if (resp.data.code === '200') {
1592
+ if (resp.data.data.length > 0) {
1593
+ self.allNode = resp.data.data
1594
+ self.modal1 = true
1595
+ } else {
1596
+ self.$Message.warning('当前流程无前序节点')
1597
+ }
1598
+ } else {
1599
+ self.$Message.error(resp.data.message)
1600
+ }
1601
+ })
1602
+ },
1603
+ getNodesBehind() {
1604
+ let self = this
1605
+ let params = {
1606
+ processDefId: self.procId,
1607
+ taskId: self.curTaskId,
1608
+ }
1609
+ ajax.get(self.smartFlowServerContext + '/manage/processTodo/getNodesBehind', { params: params }).then(function (resp) {
1610
+ if (resp.data.code === '200') {
1611
+ if (resp.data.data.length > 0) {
1612
+ self.allNode = resp.data.data
1613
+ self.modal1 = true
1614
+ } else {
1615
+ self.$Message.warning('当前流程无后续节点')
1616
+ }
1617
+ } else {
1618
+ self.$Message.error(resp.data.message)
1619
+ }
1620
+ })
1621
+ },
1622
+ handleSelectedUser(userId) {
1623
+ this.selectedUserId = userId
1624
+ },
1625
+
1626
+ //折叠动画效果
1627
+ beforeEnter(el) {
1628
+ el.style.height = '0'
1629
+ },
1630
+ enter(el, done) {
1631
+ setTimeout(() => {
1632
+ el.style.height = el.scrollHeight + 'px'
1633
+ }, 0)
1634
+
1635
+ el.addEventListener('transitionend', done)
1636
+ },
1637
+ beforeLeave(el) {
1638
+ el.style.height = el.scrollHeight + 'px'
1639
+ },
1640
+ leave(el, done) {
1641
+ setTimeout(() => {
1642
+ el.style.height = '0'
1643
+ }, 0)
1644
+
1645
+ el.addEventListener('transitionend', done)
1646
+ },
1647
+
1648
+ beforeFlowInfoEnter(el) {
1649
+ el.style.transform = 'translateX(100%)'
1650
+ },
1651
+ flowInfoEnter(el, done) {
1652
+ const transitionDuration = 0.5
1653
+ el.style.transition = `transform ${transitionDuration}s`
1654
+ el.style.transform = 'translateX(0)'
1655
+ el.addEventListener('transitionend', done)
1656
+ },
1657
+ beforeFlowInfoLeave(el) {
1658
+ el.style.transform = 'translateX(0)'
1659
+ },
1660
+ flowInfoLeave(el, done) {
1661
+ const transitionDuration = 0.5
1662
+ el.style.transition = `transform ${transitionDuration}s`
1663
+ el.style.transform = 'translateX(100%)'
1664
+ el.addEventListener('transitionend', done)
1665
+ },
1666
+ uploadFile(file) {
1667
+ const self = this
1668
+ self.fileList = []
1669
+ file.forEach(item => {
1670
+ self.fileList.push({
1671
+ fileName: item.fileName,
1672
+ fileId: item.fileCode,
1673
+ })
1674
+ })
1675
+ },
1676
+
1677
+ appointOk() {
1678
+ const self = this
1679
+ let oldSettings
1680
+ let params = this.nextNodesFormList.reduce((acc, item) => {
1681
+ acc[item.id] = {
1682
+ needUpdate: 'false',
1683
+ }
1684
+ item.assignee ? acc[item.id].assignee = item.assignee : ''
1685
+ item.candidateGroups ? acc[item.id].candidateGroup = item.candidateGroups : ''
1686
+ let timeLimit = 'expireTime:0D0H;warningTime:0D0H;handleType:00'
1687
+ if (!(item.remainDay === 0 && item.remainTime === 0 && item.inAdvanceDay === 0 && item.inAdvanceTime === 0)) {
1688
+ timeLimit = 'expireTime:' + parseInt(item.remainDay) + 'D' + parseInt(item.remainTime) + 'H' + ';warningTime:' + parseInt(item.inAdvanceDay) + 'D' + parseInt(item.inAdvanceTime) + 'H;' + 'handleType:' + item.processing
1689
+ acc[item.id].timeLimit = timeLimit
1690
+ } else {
1691
+ acc[item.id].timeLimit = ''
1692
+ }
1693
+ oldSettings = self.nextNodesOldSettings.filter(oldSetting => oldSetting.id === item.id)[0]
1694
+ if (oldSettings.assignee !== item.assignee || self.checkGroupsUpdate(oldSettings.candidates, item.candidateGroups, item.isMultiInstance) || self.checkTimeLimitUpdate(oldSettings.timeLimit, timeLimit)) {
1695
+ acc[item.id].needUpdate = 'true'
1696
+ }
1697
+ return acc
1698
+ }, {})
1699
+ self.auditParams.nodeConfigMaps = JSON.stringify(params)
1700
+ self.doPass((execResult, instanceId, taskIds, auditResult, curTaskId) => {
1701
+ if (this.executionCompleted) {
1702
+ this.executionCompleted(execResult, instanceId, taskIds, auditResult, curTaskId)
1703
+ }
1704
+ })
1705
+ },
1706
+ checkGroupsUpdate(oldSetting, newSetting, isMultiInstance) {
1707
+ if (oldSetting && newSetting) {
1708
+ let oldIdList = []
1709
+ for (let [key, value] of Object.entries(oldSetting)) {
1710
+ if (value) {
1711
+ value.split(',').forEach(part => {
1712
+ const [id] = part.split(':')
1713
+ if (id) {
1714
+ oldIdList.push(id)
1715
+ }
1716
+ })
1717
+ }
1718
+ }
1719
+ const regex = /(?:O:|U:|P:|R:|T:)([^,]+)/g
1720
+ let match
1721
+ const newIds = []
1722
+ while ((match = regex.exec(newSetting)) !== null) {
1723
+ newIds.push(...match[1].split(';'))
1724
+ }
1725
+
1726
+ if (isMultiInstance) {
1727
+ //串签的情况下可能只有顺序发生了变化
1728
+ const oldStr = oldIdList.join(',')
1729
+ const newStr = newIds.join(',')
1730
+ return oldStr !== newStr
1731
+ }else {
1732
+ const allInString = oldIdList.every(item => newIds.includes(item));
1733
+ const hasExtra = newIds.some(item => !oldIdList.includes(item));
1734
+ return !allInString || hasExtra
1735
+ }
1736
+
1737
+ }
1738
+ return false
1739
+ },
1740
+ checkTimeLimitUpdate(oldSetting, newSetting) {
1741
+ if (oldSetting && newSetting) {
1742
+ return oldSetting !== newSetting
1743
+ }
1744
+ if (!oldSetting) {
1745
+ return newSetting !== 'expireTime:0D0H;warningTime:0D0H;handleType:00'
1746
+ }
1747
+ return false
1748
+ },
1749
+ readingRangeClick(item) {
1750
+ let permScope = item.orgTreeType === this.defaultOrganTreeType ? this.permScope : 'all'
1751
+ let orgTreeType = item.orgTreeType ? item.orgTreeType : this.defaultOrganTreeType
1752
+ this.$refs.assigneeHelpBox.toggleShowHelpBox(orgTreeType, permScope, 'transferNextTask', item.id)
1753
+ },
1754
+ candidateGroupsReadingRangeClick(item) {
1755
+ let permScope = item.orgTreeType === this.defaultOrganTreeType ? this.permScope : 'all'
1756
+ let orgTreeType = item.orgTreeType ? item.orgTreeType : this.defaultOrganTreeType
1757
+ this.$refs.candidateGroupsHelpBox.toggleShowHelpBox(permScope, item.candidates, orgTreeType, item.id)
1758
+ },
1759
+ updateCandGroups(newCandGroups, nameStr, detail, nodeId) {
1760
+ let oldSettings = this.nextNodesOldSettings.filter(item => item.id === nodeId)[0]
1761
+ if (JSON.stringify(oldSettings.candidates) != JSON.stringify(detail)) {
1762
+ let node = this.nextNodesFormList.filter(item => item.id === nodeId)[0]
1763
+ node.candidateGroups = newCandGroups
1764
+ node.candidateNames = nameStr
1765
+ node.candidates = detail
1766
+ node.needUpdate = true
1767
+ this.$forceUpdate()
1768
+ }
1769
+ },
1770
+ updateNextNodeAssignee(selectedAssigneeId, selectedAssigneeName, nodeId) {
1771
+ let oldSettings = this.nextNodesOldSettings.filter(item => item.id === nodeId)[0]
1772
+ if (oldSettings.assignee != selectedAssigneeId) {
1773
+ let node = this.nextNodesFormList.filter(item => item.id === nodeId)[0]
1774
+ node.assignee = selectedAssigneeId
1775
+ node.assigneeName = selectedAssigneeName
1776
+ node.needUpdate = true
1777
+ this.$forceUpdate()
1778
+ }
1779
+ },
1780
+ },
1781
+ watch: {
1782
+ auditOpinionText(label) {
1783
+ this.form.auditOpinion = label
1784
+ },
1785
+ procId(val) {
1786
+ this.procId = val
1787
+ this.initData()
1788
+ },
1789
+ }
1790
+ }
1791
+ </script>
1792
+
1793
+ <style lang="less" scoped>
1794
+ @import "./styles/css/index.less";
1795
+
1796
+ /deep/ .ivu-table-row-highlight td {
1797
+ background-color: #50c1ff !important;
1798
+ color: #fff !important;
1799
+ }
1800
+
1801
+ /deep/ .ivu-card-body {
1802
+ padding: 10px;
1803
+ }
1804
+
1805
+ .page-info /deep/ .page-body {
1806
+ overflow-y: hidden;
1807
+ }
1808
+ </style>