@lambo-design/workflow-approve 1.0.0-beta.8 → 1.0.0-beta.81

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