@lambo-design/workflow-approve 1.0.0-beta.7 → 1.0.0-beta.71

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,1974 @@
1
- <template>
2
- <LamboPageContainer>
3
- <template slot="page-title">
4
- {{ title }}
5
- </template>
6
- <template slot="page-extend">
7
- <Button type="primary" ghost @click="pageGoBack">返回</Button>
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 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')">通过
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
+ requestSuccessCodes: [200, '200'],
504
+ auditShow: true,
505
+ historyShow: true,
506
+ attachListShow: true,
507
+ attachmentList: [],
508
+ modalVisible: false,
509
+ modalDocx: false,
510
+ imageUrl: '',
511
+ assigneeBoxData: {},
512
+ selectedUserId: '',
513
+ targetTaskNode: '',
514
+ targetTaskNodeProcessControl: '',
515
+ allNode: [],
516
+ auditParams: {},
517
+ scrollElement: null,
518
+ modal1: false,
519
+ modalBoxShow: false,
520
+ reductionMultitaskInstanceModal: false,
521
+ candidateGroupsHelpBoxShow: false,
522
+ appointBoxShow: false,
523
+ rejectAttributesBoxShow: false,
524
+ rejectAttributes: {},
525
+ showProcessControl: false,
526
+ autoOpenNode: '0',
527
+ unapprovedAssigneeList: [],
528
+ rejectAttribute: 'inSequence',
529
+ rejectAttributeList: [],
530
+ reductionAssigneeList: [],
531
+ nextNodesOldSettings: [],
532
+ nextNodesFormList: [],
533
+ hisNode: [],
534
+ processHistory: [],
535
+ permScope: '',
536
+ organTreeType: '00',
537
+ defaultOrganTreeType: '00',
538
+ ruleValidate: {
539
+ auditOpinion: [{ required: true, trigger: 'blur', message: '意见不能为空' }],
540
+ assignee: [{ required: true, trigger: 'blur', message: '办理人不能为空' }],
541
+ candidateGroups: [{ required: true, trigger: 'blur', message: '候选人不能为空' }],
542
+ },
543
+ form: {
544
+ auditOpinion: '',
545
+ },
546
+ loading: false,
547
+ disable: false,
548
+ rejectedTask: false,
549
+ revokeDelegateTask: false,
550
+ appointTask: false,
551
+ instanceId: '',
552
+ curTaskId: '',
553
+ curNodeType: 'userTask',
554
+ handleButtons: [],
555
+ handleName: '',
556
+ rejectName: '',
557
+ auditOpinionTitle: '',
558
+ auditResult: '',
559
+ curAuditGroup: '',
560
+ custChange: 'auditInfo',
561
+ auditInfo: 'auditInfo',
562
+ auditProcess: 'auditProcess',
563
+ fileList: [],
564
+ ossFilePutUrl: '/manage/oss/file/put',
565
+ hisAudit: [],
566
+ hisAuditOpinion: [{
567
+ auditOpinion: '',
568
+ auditTime: '',
569
+ }],
570
+ datas: {
571
+ orgName: '',
572
+ orgId: ''
573
+ },
574
+ editForm: {
575
+ approvalCost: '',
576
+ cost: '',
577
+ activityDate: []
578
+ },
579
+ process: {
580
+ tableData: [],
581
+ instanceId: '',
582
+ applyId: '',
583
+ procId: ''
584
+ },
585
+ handleButtonsNames: {
586
+ '30': '通过',
587
+ '70': `${this.rejectName}到原点`,
588
+ '40': `${this.rejectName}上一节点`,
589
+ '90': `${this.rejectName}指定节点`,
590
+ '80': '跳转指定节点',
591
+ '82': '指定他人处理',
592
+ '50': '直接结束流程',
593
+ '84': '委派任务',
594
+ '61': '交回委派任务',
595
+ '62': '撤回委派任务',
596
+ },
597
+ handleTypeList: [
598
+ {
599
+ value: '00',
600
+ label: '只预警不处理'
601
+ },
602
+ {
603
+ value: '10',
604
+ label: '自动同意'
605
+ },
606
+ {
607
+ value: '20',
608
+ label: '直接终止流程'
609
+ },
610
+ {
611
+ value: '90',
612
+ label: '自动驳回'
613
+ }
614
+ ],
615
+ }
616
+
617
+ },
618
+
619
+ mounted() {
620
+ this.getWidth()
621
+ if (this.procId) {
622
+ this.initData()
623
+ }
624
+ let modalElement = this.$refs.processTraceModal.$el
625
+ for (let i = 0; i < modalElement.children.length; i++) {
626
+ //找到滚动的目标element
627
+ let targetElement = modalElement.children[i]
628
+ if (targetElement.classList.toString().includes('-wrap')){
629
+ this.scrollElement = targetElement
630
+ break
631
+ }
632
+ }
633
+ },
634
+ computed: {
635
+ processHistoryHeight() {
636
+ let str = ''
637
+ const hasAuditOpinion = this.taskNode && this.handleButtons && this.handleButtons.includes('auditOpinion')
638
+ const hasAttachmentFile = this.handleButtons && this.handleButtons.includes('auditHistory') && this.attachmentList.length > 0
639
+ const isDetail = this.isDetail && !this.hisAuditOpinion[0].auditOpinion.length > 0
640
+ if (hasAuditOpinion && !hasAttachmentFile && !isDetail) {
641
+ str += 'height: 43vh'
642
+ } else if (hasAuditOpinion && hasAttachmentFile && !isDetail) {
643
+ str += 'height: 40vh'
644
+ } else {
645
+ str += 'height: 67vh'
646
+ }
647
+ return str
648
+ },
649
+ nodeColumn: function () {
650
+ let column = []
651
+ column.push({ title: '序号', type: 'index', width: 70, align: 'center', fixed: 'left' })
652
+ column.push({ title: '节点名称', key: 'taskName', minWidth: 150, align: 'center', fixed: 'left' })
653
+
654
+ column.push({
655
+ title: '节点状态', key: 'auditResult', minWidth: 150, align: 'center', fixed: 'left',
656
+ render: (h, params) => {
657
+ if (params.row.taskNode == this.taskNode) {
658
+ return h('div', [
659
+ h('tag', {
660
+ props: {
661
+ color: '#ff9900'
662
+ }
663
+ }, '当前节点')
664
+ ])
665
+ } else if (!params.row.auditResult) {
666
+ return h('div', [
667
+ h('tag', {
668
+ props: {
669
+ color: '#ff9900'
670
+ }
671
+ }, `未${params.row.handleName ? params.row.handleName : '审批'}`)
672
+ ])
673
+ } else {
674
+ if (params.row.auditResult == '30' && params.row.taskNode != this.taskNode) {
675
+ return h('div', [
676
+ h('tag', {
677
+ props: {
678
+ color: '#19be6b'
679
+ }
680
+ }, `已${params.row.handleName ? params.row.handleName : '审批'}通过`)
681
+ ])
682
+ } else if (params.row.auditResult == '10' && params.row.taskNode != this.taskNode) {
683
+ return h('div', [
684
+ h('tag', {
685
+ props: {
686
+ color: '#19be6b'
687
+ }
688
+ }, '已自动跳过')
689
+ ])
690
+ } else if (params.row.auditResult == '11' && params.row.taskNode != this.taskNode) {
691
+ return h('div', [
692
+ h('tag', {
693
+ props: {
694
+ color: '#19be6b'
695
+ }
696
+ }, '与上一环节办理人相同自动跳过')
697
+ ])
698
+ } else if (params.row.auditResult == '12' && params.row.taskNode != this.taskNode) {
699
+ return h('div', [
700
+ h('tag', {
701
+ props: {
702
+ color: '#19be6b'
703
+ }
704
+ }, '与发起人相同自动跳过')
705
+ ])
706
+ } else if (params.row.auditResult == '13' && params.row.taskNode != this.taskNode) {
707
+ return h('div', [
708
+ h('tag', {
709
+ props: {
710
+ color: '#19be6b'
711
+ }
712
+ }, '办理人为空自动跳过')
713
+ ])
714
+ } else if (params.row.auditResult == '14' && params.row.taskNode != this.taskNode) {
715
+ return h('div', [
716
+ h('tag', {
717
+ props: {
718
+ color: '#19be6b'
719
+ }
720
+ }, '符合流程变量条件自动跳过')
721
+ ])
722
+ } else if (params.row.auditResult == '40' && params.row.taskNode != this.taskNode) {
723
+ return h('div', [
724
+ h('tag', {
725
+ props: {
726
+ color: '#ed4014'
727
+ }
728
+ }, `已${params.row.rejectName ? params.row.rejectName : '驳回'}到上一节点`)
729
+ ])
730
+ } else if (params.row.auditResult == '60' && params.row.taskNode != this.taskNode) {
731
+ return h('div', [
732
+ h('tag', {
733
+ props: {
734
+ color: '#ed4014'
735
+ }
736
+ }, '已撤回')
737
+ ])
738
+ } else if (params.row.auditResult == '61' && params.row.taskNode != this.taskNode) {
739
+ return h('div', [
740
+ h('tag', {
741
+ props: {
742
+ color: '#19be6b'
743
+ }
744
+ }, '已交回委派任务')
745
+ ])
746
+ } else if (params.row.auditResult == '62' && params.row.taskNode != this.taskNode) {
747
+ return h('div', [
748
+ h('tag', {
749
+ props: {
750
+ color: '#ed4014'
751
+ }
752
+ }, '委派任务已撤回')
753
+ ])
754
+ } else if (params.row.auditResult == '80' && params.row.taskNode != this.taskNode) {
755
+ return h('div', [
756
+ h('tag', {
757
+ props: {
758
+ color: '#19be6b'
759
+ }
760
+ }, '已跳转到指定节点')
761
+ ])
762
+ } else if (params.row.auditResult == '90' && params.row.taskNode != this.taskNode) {
763
+ return h('div', [
764
+ h('tag', {
765
+ props: {
766
+ color: '#19be6b'
767
+ }
768
+ }, `已${params.row.rejectName ? params.row.rejectName : '驳回'}到指定节点`)
769
+ ])
770
+ }
771
+ }
772
+ }
773
+ })
774
+ column.push({
775
+ title: '操作', width: 100, align: 'center',
776
+ render: (h, params) => {
777
+ return h('div', [
778
+ h('Button', {
779
+ props: {
780
+ type: 'primary',
781
+ size: 'small'
782
+ },
783
+ style: {
784
+ marginRight: '5px'
785
+ },
786
+ on: {
787
+ click: () => {
788
+ this.selectNode(params.row)
789
+ }
790
+ }
791
+ }, '选择')
792
+ ])
793
+ },
794
+ })
795
+ return column
796
+ },
797
+ reductionColumn: function () {
798
+ let column = []
799
+ column.push({ title: '#', key: 'selectId', type: 'selection', align: 'center', width: 55 })
800
+ column.push({ title: '账号', key: 'auditId', align: 'center' })
801
+ column.push({ title: '姓名', key: 'auditName', align: 'center' })
802
+ return column
803
+ },
804
+ diagramTableColumns: function () {
805
+ let column = []
806
+ column.push({ title: '序号', type: 'index', width: 60 })
807
+ column.push({ title: `${this.handleName}节点`, key: 'taskName', minWidth: 130 })
808
+ column.push({ title: `${this.handleName}人`, key: 'auditName', minWidth: 150, tooltip: true })
809
+ column.push({
810
+ title: `${this.handleName}结果`, key: 'auditResult', minWidth: 150, align: 'center',
811
+ render: (h, { row, column, index }) => {
812
+ let label = ''
813
+ let tagColor = ''
814
+ if (row.auditResult == '00') {
815
+ label = '流程发起'
816
+ tagColor = 'green' // 绿色
817
+ } else if (row.auditResult == '10') {
818
+ label = '自动跳过'
819
+ tagColor = 'green' // 绿色
820
+ } else if (row.auditResult == '11') {
821
+ label = '与上一环节办理人相同自动跳过'
822
+ tagColor = 'green' // 绿色
823
+ } else if (row.auditResult == '12') {
824
+ label = '与发起人相同自动跳过'
825
+ tagColor = 'green' // 绿色
826
+ } else if (row.auditResult == '13') {
827
+ label = '办理人为空自动跳过'
828
+ tagColor = 'green' // 绿色
829
+ } else if (row.auditResult == '14') {
830
+ label = '符合流程变量条件自动跳过'
831
+ tagColor = 'green' // 绿色
832
+ } else if (row.auditResult == '30') {
833
+ label = '通过'
834
+ tagColor = 'green' // 绿色
835
+ } else if (row.auditResult == '40') {
836
+ label = `${row.rejectName ? row.rejectName : '驳回'}到上一级`
837
+ tagColor = 'volcano' // 火红色
838
+ } else if (row.auditResult == '50') {
839
+ label = `${row.rejectName ? row.rejectName : '驳回'}到原点`
840
+ tagColor = 'red' // 红色
841
+ } else if (row.auditResult == '51') {
842
+ label = '流程终止'
843
+ tagColor = 'purple' // 紫色
844
+ } else if (row.auditResult == '60') {
845
+ label = '撤回'
846
+ tagColor = 'blue' // 蓝色
847
+ } else if (row.auditResult == '61') {
848
+ label = '交回委派任务'
849
+ tagColor = 'green' // 绿色
850
+ } else if (row.auditResult == '62') {
851
+ label = '委派任务被撤回'
852
+ tagColor = 'blue' // 蓝色
853
+ } else if (row.auditResult == '80') {
854
+ label = '跳转到指定节点'
855
+ tagColor = 'cyan' // 青色
856
+ } else if (row.auditResult == '82') {
857
+ label = '指定他人处理'
858
+ tagColor = 'cyan' // 青色
859
+ } else if (row.auditResult == '83') {
860
+ label = '会签减签'
861
+ tagColor = 'red' // 红色
862
+ } else if (row.auditResult == '90') {
863
+ label = `${row.rejectName ? row.rejectName : '驳回'}到指定节点`
864
+ tagColor = 'magenta' // 品红色
865
+ } else {
866
+ label = '待审核'
867
+ tagColor = 'orange' // 默认橙色
868
+ }
869
+ return h('Tag', {
870
+ props: {
871
+ color: tagColor,
872
+ value: row.auditResult
873
+ }
874
+ }, label)
875
+ }
876
+ })
877
+ column.push({
878
+ title: `${this.handleName}时间`, key: 'auditTime', minWidth: 150,
879
+ render: (h, { row }) => {
880
+ const displayDate = row.auditDate
881
+ return h('span', displayDate)
882
+ }
883
+ })
884
+ column.push({
885
+ title: `${this.handleName}意见`, key: 'auditComment', minWidth: 180, tooltip: true,
886
+ render: (h, { row, column, index }) => {
887
+ let label = ''
888
+ if (row.auditComment == '' || row.auditComment == null) {
889
+ label = '无'
890
+ } else {
891
+ label = row.auditComment
892
+ }
893
+ return h('Label', {
894
+ props: {
895
+ value: row.auditComment
896
+ }
897
+ }, label)
898
+ }
899
+ })
900
+ if (this.showAttachmentFile) {
901
+ column.push({
902
+ title: `附件`, key: 'fileList', minWidth: 200,
903
+ render: (h, { row }) => {
904
+ if (!row.fileList || row.fileList.length === 0) {
905
+ return h('span', '无') // 如果没有附件,显示“无”
906
+ }
907
+
908
+ //显示所有附件
909
+ return h('div', row.fileList.map(file => {
910
+ return h('a', {
911
+ style: {
912
+ display: 'block',
913
+ marginTop: '5px',
914
+ marginRight: '5px',
915
+ whiteSpace: 'nowrap',
916
+ overflow: 'hidden',
917
+ textOverflow: 'ellipsis',
918
+ maxWidth: '100px',
919
+ },
920
+ attrs: {
921
+ title: file.attachName // 鼠标悬停时显示完整名称
922
+ },
923
+ on: {
924
+ click: () => {
925
+ this.getAttach(file)
926
+ }
927
+ },
928
+ }, file.attachName)
929
+ }))
930
+ }
931
+ })
932
+ }
933
+
934
+ return column
935
+ },
936
+ },
937
+ provide() {
938
+ return {
939
+ toBeDoneListDoSearch: this.doSearch
940
+ }
941
+ },
942
+ methods: {
943
+ getWidth() {
944
+ if (this.width && this.width < 400) {
945
+ this.portraitWidth = 400
946
+ }
947
+ this.portraitWidth = this.width
948
+ },
949
+ initData() {
950
+ if (!this.isDetail) {
951
+ this.getTodoTask()
952
+ } else {
953
+ this.getDoneTask()
954
+ }
955
+ this.getHandleButtons()
956
+ },
957
+ getTodoTask() {
958
+ const self = this
959
+ let param = {
960
+ procId: this.procId,
961
+ applyId: this.applyId,
962
+ taskNode: this.taskNode,
963
+ taskId: this.taskId,
964
+ auditGroup: this.auditGroup
965
+ }
966
+ ajax.get(self.smartFlowServerContext + '/manage/processTodo/list', { params: param }).then(function (resp) {
967
+ if (resp.data.code === '200') {
968
+ let todoData = resp.data.data.rows[0]
969
+ self.curTaskId = todoData.taskId
970
+ self.instanceId = todoData.procInstanceId
971
+ self.curAuditGroup = todoData.auditGroup
972
+ self.revokeDelegateTask = todoData.delegateStatus ? todoData.delegateStatus === '10' : false
973
+ const taskExtensionAttributes = todoData.taskExtensionAttributes ? JSON.parse(todoData.taskExtensionAttributes) : ''
974
+ if (taskExtensionAttributes && taskExtensionAttributes.rejectAttributes) {
975
+ const rejectAttributes = taskExtensionAttributes.rejectAttributes
976
+ if (rejectAttributes && rejectAttributes.type && rejectAttributes.type != 'inSequence') self.rejectedTask = true
977
+ }
978
+ self.appointTask = todoData.delegateStatus ? todoData.delegateStatus === '20' : false
979
+ if (self.revokeDelegateTask) self.disable = true
980
+ let procType = todoData.procType
981
+ ajax.get(self.smartFlowServerContext + '/manage/processType/lists?proType=' + procType)
982
+ .then(resp => {
983
+ let data = resp.data.data.rows
984
+ self.permScope = data[0].permScope
985
+ self.defaultOrganTreeType = data[0].organTreeType ? data[0].organTreeType : '00'
986
+ self.getNodeOrganTreeType(procType)
987
+ }).catch(err => {
988
+ console.log(err)
989
+ })
990
+ self.getAttachList(self.curTaskId)
991
+ self.getHisAudit(self.curTaskId)
992
+ self.getProcessHistory(self.curTaskId)
993
+ } else {
994
+ self.$Message.error(resp.data.message)
995
+ }
996
+ }).catch((err) => {
997
+ console.log(err)
998
+ })
999
+ },
1000
+ getNodeOrganTreeType(procType) {
1001
+ const self = this
1002
+ let param = {
1003
+ procType: procType,
1004
+ procId: this.procId,
1005
+ taskNode: this.taskNode
1006
+ }
1007
+ ajax.get(self.smartFlowServerContext + '/manage/processTodo/getNodeOrganTreeType', { params: param }).then(function (resp) {
1008
+ if (resp.data.code === '200') {
1009
+ self.organTreeType = resp.data.data ? resp.data.data : self.defaultOrganTreeType
1010
+ } else {
1011
+ self.$Message.error(resp.data.message)
1012
+ }
1013
+ }).catch((err) => {
1014
+ console.log(err)
1015
+ })
1016
+ },
1017
+ getDoneTask() {
1018
+ const self = this
1019
+ let param = {
1020
+ procId: this.procId,
1021
+ applyId: this.applyId,
1022
+ taskNode: this.taskNode,
1023
+ taskId: this.taskId,
1024
+ auditGroup: this.auditGroup
1025
+ }
1026
+ ajax.get(self.smartFlowServerContext + '/manage/processDone/getDoneDetail', { params: param }).then(function (resp) {
1027
+ if (resp.data.code === '200') {
1028
+ let rows = resp.data.data.rows
1029
+ if (rows.length > 0) {
1030
+ self.curAuditGroup = rows[0].auditGroup
1031
+ self.hisAuditOpinion = []
1032
+ let taskList = resp.data.data.rows
1033
+ taskList.forEach(item => {
1034
+ self.hisAuditOpinion.push({
1035
+ auditOpinion: item.auditComment,
1036
+ auditTime: timestampToTime(item.auditDate)
1037
+ })
1038
+ })
1039
+ self.curTaskId = taskList[0].taskId
1040
+ self.instanceId = taskList[0].procInstanceId
1041
+ } else {
1042
+ ajax.get(self.smartFlowServerContext + '/manage/processTodo/list', { params: param }).then(function (todoResp) {
1043
+ if (todoResp.data.code === '200') {
1044
+ self.curTaskId = todoResp.data.data.rows[0].taskId
1045
+ self.instanceId = todoResp.data.data.rows[0].procInstanceId
1046
+ self.curAuditGroup = todoResp.data.data.rows[0].auditGroup
1047
+ } else {
1048
+ self.$Message.error(todoResp.data.message)
1049
+ }
1050
+ }).catch((err) => {
1051
+ console.log(err)
1052
+ })
1053
+ }
1054
+ self.getAttachList(self.curTaskId)
1055
+ self.getHisAudit(self.curTaskId)
1056
+ self.getProcessHistory(self.curTaskId)
1057
+ } else {
1058
+ self.$Message.error(resp.data.message)
1059
+ }
1060
+ }).catch((err) => {
1061
+ console.log(err)
1062
+ })
1063
+ },
1064
+ getHandleButtons() {
1065
+ const self = this
1066
+ let param = {
1067
+ procId: this.procId,
1068
+ taskNode: this.taskNode
1069
+ }
1070
+ ajax.post(self.smartFlowServerContext + '/manage/approvalCenter/getNodeData', param).then(function (resp) {
1071
+ if (resp.data.code === '200') {
1072
+ self.handleButtons = resp.data.data[0].handleButtons
1073
+ if (resp.data.data[0].hasOwnProperty('isSequential')) {
1074
+ self.curNodeType = resp.data.data[0].isSequential ? 'sequentialMultiNode' : 'multiNode'
1075
+ }
1076
+ self.handleName = resp.data.data[0].handleName ? resp.data.data[0].handleName : '审批'
1077
+ self.rejectName = resp.data.data[0].rejectName ? resp.data.data[0].rejectName : '驳回'
1078
+ self.auditOpinionTitle = resp.data.data[0].handleName ? resp.data.data[0].handleName + '意见' : '审批意见'
1079
+ if (!self.handleButtons || (!self.handleButtons.includes('auditOpinion') && !self.handleButtons.includes('attachmentFile') && !self.handleButtons.includes('auditHistory'))) {
1080
+ self.showProcessInfo = false
1081
+ }
1082
+ } else {
1083
+ self.$Message.error(resp.data.message)
1084
+ }
1085
+ }).catch((err) => {
1086
+ console.log(err)
1087
+ })
1088
+ },
1089
+ getNextNodes() {
1090
+ const self = this
1091
+ self.nextNodesFormList = []
1092
+ self.nextNodesOldSettings = []
1093
+ let param = {
1094
+ procId: this.procId,
1095
+ taskNode: this.taskNode
1096
+ }
1097
+ ajax.post(self.smartFlowServerContext + '/manage/processTodo/getNextNodes', param).then(function (resp) {
1098
+ if (resp.data.code === '200') {
1099
+ let nextNodeForm = {}
1100
+ let nextNodeOldForm = {}
1101
+ let data = resp.data.data
1102
+ for (let i = 0; i < data.length; i++) {
1103
+ nextNodeOldForm = {
1104
+ id: data[i].id,
1105
+ assignee: data[i].assignee ? data[i].assignee.id : '',
1106
+ timeLimit: data[i].timeLimit,
1107
+ }
1108
+ nextNodeForm = {
1109
+ id: data[i].id,
1110
+ name: data[i].name,
1111
+ orgTreeType: data[i].orgTreeType,
1112
+ assignee: data[i].assignee ? data[i].assignee.id : '',
1113
+ assigneeName: data[i].assignee ? data[i].assignee.name : '',
1114
+ candidateGroups: '',
1115
+ isMultiInstance: data[i].isMultiInstance,
1116
+ actionType: 'ASSIGNEE',
1117
+ remainDay: 0,
1118
+ remainTime: 0,
1119
+ inAdvanceDay: 0,
1120
+ inAdvanceTime: 0,
1121
+ processing: '00'
1122
+ }
1123
+ //显示具体候选人信息
1124
+ if (data[i].candidateGroups) {
1125
+ nextNodeForm.actionType = 'CAND'
1126
+ let names = []
1127
+ let candidates = {}
1128
+ for (let groupName in data[i].candidateGroups) {
1129
+ if (data[i].candidateGroups.hasOwnProperty(groupName)) {
1130
+ let group = data[i].candidateGroups[groupName]
1131
+ group.forEach(item => {
1132
+ names.push(item.name)
1133
+ })
1134
+ candidates[groupName] = group.map(item => item.id + ':' + item.name).join(',')
1135
+ }
1136
+ }
1137
+ nextNodeForm.candidateNames = names.join(',')
1138
+ nextNodeForm.candidates = candidates
1139
+ nextNodeOldForm.candidates = candidates
1140
+ }
1141
+ if (data[i].timeLimit) {
1142
+ let expireTime = data[i].timeLimit.split(';')[0].split(':')[1]
1143
+ let warningTime = data[i].timeLimit.split(';')[1].split(':')[1]
1144
+ let handleType = data[i].timeLimit.split(';')[2].split(':')[1]
1145
+ let days = expireTime.slice(0, expireTime.indexOf('D')) //过期天
1146
+ let hourOfDay = expireTime.slice(expireTime.indexOf('D') + 1, expireTime.indexOf('H')) //过期小时
1147
+ let daysWarn = warningTime.slice(0, warningTime.indexOf('D')) //警告天
1148
+ let hourOfDayWarn = warningTime.slice(warningTime.indexOf('D') + 1, warningTime.indexOf('H')) //警告小时
1149
+ nextNodeForm.remainDay = parseInt(days)
1150
+ nextNodeForm.remainTime = parseInt(hourOfDay)
1151
+ nextNodeForm.inAdvanceDay = parseInt(daysWarn)
1152
+ nextNodeForm.inAdvanceTime = parseInt(hourOfDayWarn)
1153
+ nextNodeForm.processing = handleType
1154
+ }
1155
+ self.nextNodesFormList.push(nextNodeForm)
1156
+ self.nextNodesOldSettings.push(nextNodeOldForm)
1157
+ }
1158
+ } else {
1159
+ self.$Message.error(resp.data.message)
1160
+ }
1161
+ }).catch((err) => {
1162
+ console.log(err)
1163
+ })
1164
+ },
1165
+ getAttachList(taskId) {
1166
+ const self = this
1167
+ const param = {
1168
+ taskId: taskId,
1169
+ procId: this.procId,
1170
+ applyId: this.applyId
1171
+ }
1172
+ ajax.get(self.smartFlowServerContext + '/manage/processDone/getAttachmentList', { params: param }).then(function (resp) {
1173
+ self.attachmentList = resp.data.data.rows
1174
+ self.attachmentList.forEach(item => {
1175
+ const index = item.fileName.lastIndexOf('.')
1176
+ const fileType = item.fileName.substr(index + 1).toLowerCase()
1177
+ const imageList = ['jpg', 'gif', 'png', 'svg']
1178
+ const docList = ['doc', 'docx']
1179
+ const zipList = ['rar', 'zip']
1180
+ const typeList = ['jpg', 'gif', 'png', 'docx']
1181
+ item.fileType = imageList.indexOf(fileType) !== -1 ? 'image' : docList.indexOf(fileType) !== -1 ? 'doc' : zipList.indexOf(fileType) !== -1 ? 'zip' : fileType
1182
+ item.showPreview = typeList.indexOf(fileType) !== -1
1183
+ })
1184
+ }).catch(err => {
1185
+ console.log(err)
1186
+ })
1187
+ },
1188
+ getHisAudit(taskId) {
1189
+ let self = this
1190
+ let params = {
1191
+ applyId: self.applyId,
1192
+ instanceId: self.instanceId,
1193
+ procId: self.procId,
1194
+ taskId: taskId
1195
+ }
1196
+ ajax.get(self.smartFlowServerContext + '/manage/processTodo/getHisAudit', { params: params }).then(function (resp) {
1197
+ if (resp.data.code === '200') {
1198
+ self.hisAudit = resp.data.data
1199
+ let uniqueDataMap = {}
1200
+ self.hisAudit.forEach((item) => {
1201
+ uniqueDataMap[item['taskNode']] = item
1202
+ })
1203
+ self.hisNode = Object.values(uniqueDataMap)
1204
+
1205
+ }
1206
+ })
1207
+ },
1208
+ getProcessHistory(taskId) {
1209
+ let self = this
1210
+ let params = {
1211
+ applyId: self.applyId,
1212
+ instanceId: self.instanceId,
1213
+ procId: self.procId,
1214
+ taskId: taskId
1215
+ }
1216
+ ajax.get(self.smartFlowServerContext + '/manage/processTodo/getProcessHis', { params: params }).then(function (resp) {
1217
+ if (resp.data.code === '200') {
1218
+ self.processHistory = resp.data.data
1219
+ }
1220
+ })
1221
+ },
1222
+
1223
+ audit: function (auditResult) {
1224
+ let self = this
1225
+ self.auditResult = auditResult
1226
+ self.submit()
1227
+ },
1228
+ submit() {
1229
+ let self = this
1230
+ self.auditParams = {
1231
+ procId: self.procId,
1232
+ applyId: self.applyId,
1233
+ taskId: self.curTaskId,
1234
+ auditOpinion: self.form.auditOpinion,
1235
+ fileListStr: JSON.stringify(self.fileList),
1236
+ auditResult: self.auditResult,
1237
+ params: JSON.stringify(self.datas),
1238
+ targetTaskNode: self.targetTaskNode,
1239
+ selectedUserId: self.selectedUserId,
1240
+ }
1241
+ if (self.auditResult == '' || self.auditResult == null) {
1242
+ self.$Message.error(`请选择${self.handleName}结果!`)
1243
+ return
1244
+ }
1245
+ if (self.form.auditOpinion == '' || self.form.auditOpinion == null) {
1246
+ if (self.auditResult === '30') {
1247
+ self.auditParams.auditOpinion = '通过'
1248
+ self.businessFormSave ? self.businessFormSave(self.handleSaveResult) : self.handleSaveResult(true)
1249
+ return
1250
+ }
1251
+ if ((!self.handleButtons || self.handleButtons.includes('auditOpinion')) && self.auditResult !== '84') {
1252
+ self.$Message.error(`请输入${self.handleName}意见!`)
1253
+ return
1254
+ } else {
1255
+ self.auditParams.auditOpinion = self.handleButtonsNames[self.auditResult]
1256
+ }
1257
+ }
1258
+ self.businessFormSave ? self.businessFormSave(self.handleSaveResult) : self.handleSaveResult(true)
1259
+ },
1260
+ handleSaveResult(saveResult, businessParams) {
1261
+ if (saveResult) {
1262
+ this.executeButtonAction(businessParams)
1263
+ } else {
1264
+ console.error('保存失败')
1265
+ }
1266
+ },
1267
+ executeButtonAction(businessParams) {
1268
+ const self = this
1269
+ if (businessParams) {
1270
+ Object.assign(self.datas, businessParams)
1271
+ self.auditParams.params = JSON.stringify(self.datas)
1272
+ }
1273
+ let auditResult = {
1274
+ code: self.auditResult,
1275
+ name: self.handleButtonsNames[self.auditResult]
1276
+ }
1277
+ if (self.auditResult === '82') {
1278
+ //指定他人处理
1279
+ self.assigneeBoxData = self.auditParams
1280
+ self.assigneeBoxData.auditResultName = self.handleButtonsNames[self.auditResult]
1281
+ self.assigneeBoxData.instanceId = self.instanceId
1282
+ self.$refs.assigneeHelpBox.toggleShowHelpBox(self.organTreeType, '', 'transferCurTask')
1283
+ } else if (self.auditResult === '84') {
1284
+ //委派任务
1285
+ self.$refs.assigneeHelpBox.toggleShowHelpBox(self.organTreeType, '', 'delegateTask')
1286
+ } else if (self.auditResult === '62') {
1287
+ //撤回委派任务
1288
+ ajax.post(self.smartFlowServerContext + '/manage/processTodo/audit', self.auditParams).then(resp => {
1289
+ let result = resp.data
1290
+ if (result.code == '200') {
1291
+ self.loading = false
1292
+ self.disable = false
1293
+ self.revokeDelegateTask = false
1294
+ self.$Message.success('撤回委派成功')
1295
+ } else {
1296
+ self.loading = false
1297
+ self.disable = false
1298
+ self.$Message.error(result.message)
1299
+ }
1300
+ })
1301
+ } else if (self.auditResult === '61') {
1302
+ //交回委派任务
1303
+ ajax.post(self.smartFlowServerContext + '/manage/processTodo/audit', self.auditParams).then(resp => {
1304
+ let result = resp.data
1305
+ if (result.code == '200') {
1306
+ self.loading = false
1307
+ self.disable = false
1308
+ self.$Message.success('交回委派任务成功')
1309
+ if (result.data) {
1310
+ let taskIds = result.data.id ? result.data.id : result.data.map(item => item.id).join(',')
1311
+ setTimeout(() => {
1312
+ self.executionCompleted(true, result.data.id ? result.data.processInstanceId : result.data[0].processInstanceId, taskIds, auditResult, self.curTaskId)
1313
+ }, 1000)
1314
+ }
1315
+ } else {
1316
+ self.loading = false
1317
+ self.disable = false
1318
+ self.$Message.error(result.message)
1319
+ }
1320
+ })
1321
+ } else if (self.auditResult === '80') {
1322
+ //跳转到后序指定节点
1323
+ self.getNodesBehind()
1324
+ } else if (self.auditResult === '90') {
1325
+ //驳回到前序指定节点
1326
+ self.getAllPreNodes()
1327
+ } else if (self.auditResult === '40') {
1328
+ //驳回到上一级
1329
+ self.loading = true
1330
+ self.disable = true
1331
+ let url = self.smartFlowServerContext + '/manage/processTodo/getPreNode'
1332
+ ajax.post(url, self.auditParams).then(function (resp) {
1333
+ let result = resp.data
1334
+ if (result.code == '30013' || result.code == '30014') {
1335
+ //前序节点为子流程或当前节点为子流程第一个节点不可驳回上一级节点
1336
+ const message = self.rejectName ? self.replaceName(result.message, '驳回', self.rejectName) : result.message
1337
+ self.$Message.warning(message)
1338
+ //避免未提示消息直接回调
1339
+ setTimeout(() => {
1340
+ self.executionCompleted(false, null, null, auditResult, self.curTaskId)
1341
+ }, 1000)
1342
+ } else if (result.code == '30010') {
1343
+ const message = self.rejectName ? self.replaceName(result.message, '驳回', self.rejectName) : result.message
1344
+ self.$Modal.confirm({
1345
+ title: '提示',
1346
+ content: message,
1347
+ onOk: () => {
1348
+ self.auditParams.auditResult = '70'
1349
+ let url = self.smartFlowServerContext + '/manage/processTodo/audit'
1350
+ ajax.post(url, self.auditParams).then(function (resp) {
1351
+ let result = resp.data
1352
+ const auditMessage = self.rejectName ? self.replaceName(result.message, '驳回', self.rejectName) : result.message
1353
+ if (result.code == '200') {
1354
+ self.loading = false
1355
+ self.disable = false
1356
+ self.$Message.success(auditMessage)
1357
+ //后端没有返回数据
1358
+ setTimeout(() => {
1359
+ self.executionCompleted(true, null, null, auditResult, self.curTaskId)
1360
+ }, 1000)
1361
+ bus.$emit('triggerTimer')
1362
+ } else {
1363
+ self.loading = false
1364
+ self.disable = false
1365
+ self.$Message.error(auditMessage)
1366
+ setTimeout(() => {
1367
+ self.executionCompleted(false, null, null, auditResult, self.curTaskId)
1368
+ }, 1000)
1369
+ }
1370
+ bus.$emit('triggerTimer')
1371
+ })
1372
+ },
1373
+ onCancel: () => {
1374
+ self.loading = false
1375
+ self.disable = false
1376
+ }
1377
+ })
1378
+ } else if (result.code == '10012') {
1379
+ // 数据同步
1380
+ self.loading = false
1381
+ self.disable = false
1382
+ self.$Message.warning(result.message)
1383
+ setTimeout(() => {
1384
+ self.executionCompleted(true, null, null, auditResult, self.curTaskId)
1385
+ }, 1000)
1386
+ } else {
1387
+ self.handleButtons && self.handleButtons.includes('rejectProcessControl') ? self.getProcessAttributes() : self.doPass()
1388
+ }
1389
+ })
1390
+ } else {
1391
+ if (self.auditResult === '30' && !self.rejectedTask && (!self.handleButtons || self.handleButtons.includes('appointHandler') || self.handleButtons.includes('appointTimeoutTime'))) {
1392
+ self.getNextNodes()
1393
+ self.appointBoxShow = true
1394
+ } else if (self.handleButtons && self.handleButtons.includes('rejectProcessControl') && self.auditResult === '70'){
1395
+ self.getProcessAttributes()
1396
+ } else {
1397
+ self.doPass()
1398
+ }
1399
+ }
1400
+ },
1401
+ doPass() {
1402
+ let self = this
1403
+ this.modal = false
1404
+ let auditResult = {
1405
+ code: self.auditResult,
1406
+ name: self.handleButtonsNames[self.auditResult]
1407
+ }
1408
+ if (self.auditResult === '82' && (self.targetTaskNode == '' || self.targetTaskNode == null)) {
1409
+ self.auditResult = ''
1410
+ self.$Message.error(`请选择${self.handleName}节点!`)
1411
+ } else {
1412
+ self.loading = true
1413
+ self.disable = true
1414
+ self.auditParams.targetTaskNode = self.targetTaskNode
1415
+ let url = self.smartFlowServerContext + '/manage/processTodo/audit'
1416
+ ajax.post(url, self.auditParams).then(function (resp) {
1417
+ let result = resp.data
1418
+ if (result.code == '200') {
1419
+ self.loading = false
1420
+ self.disable = false
1421
+ let message = result.message ? result.message : `${self.handleName}成功`
1422
+ if (self.auditResult === '40' || self.auditResult === '70' || self.auditResult === '90'){
1423
+ message = result.message ? self.replaceName(result.message, '驳回', self.rejectName) : `${self.rejectName}成功`
1424
+ }
1425
+ self.$Message.success(message)
1426
+ if (result.data) {
1427
+ let taskIds = result.data.id ? result.data.id : result.data.map(item => item.id).join(',')
1428
+ setTimeout(() => {
1429
+ self.executionCompleted(true, result.data.id ? result.data.processInstanceId : result.data[0].processInstanceId, taskIds, auditResult, self.curTaskId)
1430
+ }, 1000)
1431
+ } else {
1432
+ setTimeout(() => {
1433
+ self.executionCompleted(true, null, null, auditResult, self.curTaskId)
1434
+ }, 1000)
1435
+ }
1436
+ } else if (result.code == '10012') {
1437
+ // 数据同步
1438
+ self.loading = false
1439
+ self.disable = false
1440
+ self.$Message.warning(result.message)
1441
+ setTimeout(() => {
1442
+ self.executionCompleted(true, null, null, auditResult, self.curTaskId)
1443
+ }, 1000)
1444
+ } else if (result.code == '20002') {
1445
+ // 流程结束
1446
+ self.loading = false
1447
+ self.disable = false
1448
+ self.$Message.success(result.message)
1449
+ setTimeout(() => {
1450
+ self.executionCompleted(true, '流程已结束', '流程已结束', auditResult, self.curTaskId)
1451
+ }, 1000)
1452
+ } else {
1453
+ self.loading = false
1454
+ self.disable = false
1455
+ let failedMessage = result.message ? result.message : `${self.handleName}失败`
1456
+ if (self.auditResult === '40' || self.auditResult === '70' || self.auditResult === '90'){
1457
+ failedMessage = result.message ? self.replaceName(result.message, '驳回', self.rejectName) : `${self.rejectName}失败`
1458
+ }
1459
+ self.$Message.error(failedMessage)
1460
+ setTimeout(() => {
1461
+ self.executionCompleted(false, null, null, auditResult, self.curTaskId)
1462
+ }, 1000)
1463
+ }
1464
+ bus.$emit('triggerTimer')
1465
+ })
1466
+ }
1467
+ },
1468
+ doJump(){
1469
+ if (this.auditResult === '90'){
1470
+ this.auditParams.rejectAttribute = this.rejectAttribute ? this.rejectAttribute :'inSequence'
1471
+ }
1472
+ this.doPass()
1473
+ },
1474
+ showUpdateMultitaskInstanceModal(updateType) {
1475
+ const self = this
1476
+ if (updateType === '81') {
1477
+ this.$refs.assigneeHelpBox.toggleShowHelpBox(this.organTreeType, '', 'addMultitaskInstance')
1478
+ } else if (updateType === '83') {
1479
+ ajax.get(self.smartFlowServerContext + '/manage/processTodo/getUnapprovedListOfMultiNode?taskId=' + self.curTaskId).then(function (resp) {
1480
+ if (resp.data.code === '200') {
1481
+ self.unapprovedAssigneeList = resp.data.data
1482
+ self.reductionMultitaskInstanceModal = true
1483
+ } else {
1484
+ self.$Message.error(resp.data.message)
1485
+ }
1486
+ }).catch(err => {
1487
+ console.log(err)
1488
+ })
1489
+ }
1490
+ },
1491
+ updateMultitaskInstance(updateType, assignees) {
1492
+ const self = this
1493
+ self.loading = true
1494
+ self.disable = true
1495
+ let param = {
1496
+ taskId: self.curTaskId,
1497
+ applyId: self.applyId,
1498
+ assignees: assignees,
1499
+ updateType: updateType
1500
+ }
1501
+ ajax.post(self.smartFlowServerContext + '/manage/processTodo/updateMultitaskInstance', param).then(resp => {
1502
+ let result = resp.data
1503
+ if (result.code == '200') {
1504
+ self.loading = false
1505
+ self.disable = false
1506
+ self.$Message.success(result.message)
1507
+ } else {
1508
+ self.loading = false
1509
+ self.disable = false
1510
+ self.$Message.error(result.message)
1511
+ }
1512
+ }).catch(err => {
1513
+ console.log(err)
1514
+ })
1515
+ },
1516
+ //委派
1517
+ delegateTask(assignee) {
1518
+ const self = this
1519
+ if (!assignee){
1520
+ self.$Message.error('请选择加签人员')
1521
+ return
1522
+ }
1523
+ let auditResult = {
1524
+ code: self.auditResult,
1525
+ name: self.handleButtonsNames[self.auditResult]
1526
+ }
1527
+ self.auditParams.selectedUserId = assignee
1528
+ ajax.post(self.smartFlowServerContext + '/manage/processTodo/audit', self.auditParams).then(resp => {
1529
+ let result = resp.data
1530
+ if (result.code == '200') {
1531
+ self.loading = false
1532
+ self.disable = false
1533
+ self.$Message.success('委派成功')
1534
+ if (result.data) {
1535
+ let taskIds = result.data.id ? result.data.id : result.data.map(item => item.id).join(',')
1536
+ setTimeout(() => {
1537
+ self.executionCompleted(true, result.data.id ? result.data.processInstanceId : result.data[0].processInstanceId, taskIds, auditResult, self.curTaskId)
1538
+ }, 1000)
1539
+ }
1540
+ } else {
1541
+ self.loading = false
1542
+ self.disable = false
1543
+ self.$Message.error(result.message)
1544
+ }
1545
+ }).catch(err => {
1546
+ console.log(err)
1547
+ })
1548
+ },
1549
+ //加签
1550
+ addMultitaskInstance(assingeeList) {
1551
+ const assingees = assingeeList.join(',')
1552
+ this.updateMultitaskInstance('81', assingees)
1553
+ },
1554
+ //减签
1555
+ reductionMultitaskInstance() {
1556
+ if (this.reductionAssigneeList.length === 0) {
1557
+ this.$Message.error('请选择减签人员')
1558
+ return
1559
+ }
1560
+ const assingees = this.reductionAssigneeList.map(item => item.auditId).join(',')
1561
+ this.updateMultitaskInstance('83', assingees)
1562
+ },
1563
+ rejectProcessWithRejectAttributes(){
1564
+ this.auditParams.rejectAttribute = this.rejectAttribute ? this.rejectAttribute :'inSequence'
1565
+ this.doPass()
1566
+ },
1567
+
1568
+ doSearch() {
1569
+ //不需要实现,是子组件assigneeBox要求使用父组件的这个方法
1570
+ },
1571
+ tabsChange(tab) {
1572
+ console.log(tab)
1573
+ },
1574
+ getAttach(row) {
1575
+ window.open(this.smartFlowServerContext + '/manage/oss/file/get/' + row.fileId, '_blank')
1576
+ },
1577
+ preViewAttach(row) {
1578
+ let reg = /\.(gif|jpg|jpeg|bmp|png|PNG)$/
1579
+ let regs = /\.(pdf)$/
1580
+ if (reg.test(row.fileName)) {
1581
+ let url = this.smartFlowServerContext + '/manage/oss/file/get/' + row.fileId
1582
+ this.imgPreview(url)
1583
+ } else if (regs.test(row.fileName)) {
1584
+ window.open(this.smartFlowServerContext + '/manage/oss/file/getFileStream?fileId=' + row.fileId, '_blank')
1585
+ } else {
1586
+ this.modalDocx = true
1587
+ axios({
1588
+ method: 'get',
1589
+ responseType: 'blob', // 因为是流文件,所以要指定blob类型
1590
+ url: this.smartFlowServerContext + '/manage/oss/file/get/' + row.fileId// 一个word下载文件的接口
1591
+ }).then(({ data }) => {
1592
+ docx.renderAsync(data, this.$refs.file, null, {
1593
+ className: 'docx', //默认和文档样式类的类名/前缀
1594
+ inWrapper: true, //启用围绕文档内容呈现包装器
1595
+ ignoreWidth: false, //禁用页面的渲染宽度
1596
+ ignoreHeight: false, //禁用页面的渲染高度
1597
+ ignoreFonts: false, //禁用字体渲染
1598
+ breakPages: true, //在分页符上启用分页
1599
+ ignoreLastRenderedPageBreak: true, //在lastRenderedPageBreak元素上禁用分页
1600
+ experimental: false, //启用实验功能(制表符停止计算)
1601
+ trimXmlDeclaration: true, //如果为true,则在解析之前将从xml文档中删除xml声明
1602
+ useBase64URL: false, //如果为true,图像、字体等将转换为base 64 URL,否则使用URL.createObjectURL
1603
+ useMathMLPolyfill: false, //包括用于铬、边等的MathML多填充。
1604
+ showChanges: false, //启用文档更改的实验渲染(插入/删除)
1605
+ debug: false, //启用额外的日志记录
1606
+ })
1607
+ }
1608
+ )
1609
+ }
1610
+ },
1611
+ imgPreview(url) {
1612
+ this.imageUrl = url
1613
+ this.modalVisible = true
1614
+ },
1615
+
1616
+ //打印流程图信息
1617
+ processPrint() {
1618
+ let self = this
1619
+ let params = {
1620
+ applyId: self.applyId,
1621
+ instanceId: self.instanceId,
1622
+ procId: self.procId,
1623
+ taskId: self.curTaskId,
1624
+ }
1625
+ ajax.get(self.smartFlowServerContext + '/manage/processTodo/getPrintData', { params: params }).then(function (resp) {
1626
+ let result = resp.data.data
1627
+ if (resp.data.code === '200') {
1628
+ let tableData = result
1629
+ self.process.tableData = tableData
1630
+ self.process.applyId = self.applyId
1631
+ self.process.instanceId = self.instanceId
1632
+ self.process.procId = self.procId
1633
+ self.datas.orgId = tableData[0].orgId
1634
+ self.datas.orgName = tableData[0].orgName
1635
+ self.modalBoxShow = true
1636
+ }
1637
+ })
1638
+ },
1639
+
1640
+ showTaskNode(taskId) {
1641
+ if (this.processHistory.length > 0) {
1642
+ let task = null
1643
+ this.processHistory.some(itemList => {
1644
+ task = itemList.find(item => item.taskId === taskId)
1645
+ return task !== undefined
1646
+ })
1647
+ return task ? task.taskName : ''
1648
+ }
1649
+ return ''
1650
+ },
1651
+ cancel() {
1652
+ this.modal = false
1653
+ this.auditResult = ''
1654
+ this.rejectAttribute = 'inSequence'
1655
+ this.targetTaskNodeProcessControl = ''
1656
+ },
1657
+ reductionModalCancel() {
1658
+ this.reductionMultitaskInstanceModal = false
1659
+ this.reductionAssigneeList = []
1660
+ },
1661
+ rejectAttributesCancel() {
1662
+ this.rejectAttributesBoxShow = false
1663
+ this.rejectAttribute = 'inSequence'
1664
+ this.loading = false
1665
+ this.disable = false
1666
+ },
1667
+ selectAssignee(selection) {
1668
+ this.reductionAssigneeList = selection
1669
+ },
1670
+ selectNode(currentRow, oldCurrentRow) {
1671
+ let self = this
1672
+ self.targetTaskNode = currentRow.taskNode
1673
+ self.targetTaskNodeProcessControl = currentRow.processControl
1674
+ },
1675
+ getAllPreNodes() {
1676
+ let self = this
1677
+ let params = {
1678
+ processDefId: self.procId,
1679
+ taskId: self.curTaskId,
1680
+ }
1681
+ ajax.get(self.smartFlowServerContext + '/manage/processTodo/getAllPreNodes', { params: params }).then(function (resp) {
1682
+ if (resp.data.code === '200') {
1683
+ if (resp.data.data.length > 0) {
1684
+ self.allNode = resp.data.data
1685
+ self.modal1 = true
1686
+ } else {
1687
+ self.$Message.warning('当前流程无前序节点')
1688
+ }
1689
+ } else {
1690
+ self.$Message.error(resp.data.message)
1691
+ }
1692
+ })
1693
+ },
1694
+ getNodesBehind() {
1695
+ let self = this
1696
+ let params = {
1697
+ processDefId: self.procId,
1698
+ taskId: self.curTaskId,
1699
+ }
1700
+ ajax.get(self.smartFlowServerContext + '/manage/processTodo/getNodesBehind', { params: params }).then(function (resp) {
1701
+ if (resp.data.code === '200') {
1702
+ if (resp.data.data.length > 0) {
1703
+ self.allNode = resp.data.data
1704
+ self.modal1 = true
1705
+ } else {
1706
+ self.$Message.warning('当前流程无后续节点')
1707
+ }
1708
+ } else {
1709
+ self.$Message.error(resp.data.message)
1710
+ }
1711
+ })
1712
+ },
1713
+ handleSelectedUser(userId) {
1714
+ this.selectedUserId = userId
1715
+ },
1716
+
1717
+ //折叠动画效果
1718
+ beforeEnter(el) {
1719
+ el.style.height = '0'
1720
+ },
1721
+ enter(el, done) {
1722
+ setTimeout(() => {
1723
+ el.style.height = el.scrollHeight + 'px'
1724
+ }, 0)
1725
+
1726
+ el.addEventListener('transitionend', done)
1727
+ },
1728
+ beforeLeave(el) {
1729
+ el.style.height = el.scrollHeight + 'px'
1730
+ },
1731
+ leave(el, done) {
1732
+ setTimeout(() => {
1733
+ el.style.height = '0'
1734
+ }, 0)
1735
+
1736
+ el.addEventListener('transitionend', done)
1737
+ },
1738
+
1739
+ beforeFlowInfoEnter(el) {
1740
+ el.style.transform = 'translateX(100%)'
1741
+ },
1742
+ flowInfoEnter(el, done) {
1743
+ const transitionDuration = 0.5
1744
+ el.style.transition = `transform ${transitionDuration}s`
1745
+ el.style.transform = 'translateX(0)'
1746
+ el.addEventListener('transitionend', done)
1747
+ },
1748
+ beforeFlowInfoLeave(el) {
1749
+ el.style.transform = 'translateX(0)'
1750
+ },
1751
+ flowInfoLeave(el, done) {
1752
+ const transitionDuration = 0.5
1753
+ el.style.transition = `transform ${transitionDuration}s`
1754
+ el.style.transform = 'translateX(100%)'
1755
+ el.addEventListener('transitionend', done)
1756
+ },
1757
+ uploadFile(file) {
1758
+ const self = this
1759
+ self.fileList = []
1760
+ file.forEach(item => {
1761
+ self.fileList.push({
1762
+ fileName: item.fileName,
1763
+ fileId: item.fileCode,
1764
+ })
1765
+ })
1766
+ },
1767
+
1768
+ appointOk() {
1769
+ const self = this
1770
+ let oldSettings
1771
+ let params = this.nextNodesFormList.reduce((acc, item) => {
1772
+ acc[item.id] = {
1773
+ needUpdate: 'false',
1774
+ }
1775
+ item.assignee ? acc[item.id].assignee = item.assignee : ''
1776
+ item.candidateGroups ? acc[item.id].candidateGroup = item.candidateGroups : ''
1777
+ let timeLimit = 'expireTime:0D0H;warningTime:0D0H;handleType:00'
1778
+ if (!(item.remainDay === 0 && item.remainTime === 0 && item.inAdvanceDay === 0 && item.inAdvanceTime === 0)) {
1779
+ timeLimit = 'expireTime:' + parseInt(item.remainDay) + 'D' + parseInt(item.remainTime) + 'H' + ';warningTime:' + parseInt(item.inAdvanceDay) + 'D' + parseInt(item.inAdvanceTime) + 'H;' + 'handleType:' + item.processing
1780
+ acc[item.id].timeLimit = timeLimit
1781
+ } else {
1782
+ acc[item.id].timeLimit = ''
1783
+ }
1784
+ oldSettings = self.nextNodesOldSettings.filter(oldSetting => oldSetting.id === item.id)[0]
1785
+ if (oldSettings.assignee !== item.assignee || self.checkGroupsUpdate(oldSettings.candidates, item.candidateGroups, item.isMultiInstance) || self.checkTimeLimitUpdate(oldSettings.timeLimit, timeLimit)) {
1786
+ acc[item.id].needUpdate = 'true'
1787
+ }
1788
+ return acc
1789
+ }, {})
1790
+ self.auditParams.nodeConfigMaps = JSON.stringify(params)
1791
+ self.doPass((execResult, instanceId, taskIds, auditResult, curTaskId) => {
1792
+ if (this.executionCompleted) {
1793
+ this.executionCompleted(execResult, instanceId, taskIds, auditResult, curTaskId)
1794
+ }
1795
+ })
1796
+ },
1797
+ checkGroupsUpdate(oldSetting, newSetting, isMultiInstance) {
1798
+ if (oldSetting && newSetting) {
1799
+ let oldIdList = []
1800
+ for (let [key, value] of Object.entries(oldSetting)) {
1801
+ if (value) {
1802
+ value.split(',').forEach(part => {
1803
+ const [id] = part.split(':')
1804
+ if (id) {
1805
+ oldIdList.push(id)
1806
+ }
1807
+ })
1808
+ }
1809
+ }
1810
+ const regex = /(?:O:|U:|P:|R:|T:)([^,]+)/g
1811
+ let match
1812
+ const newIds = []
1813
+ while ((match = regex.exec(newSetting)) !== null) {
1814
+ newIds.push(...match[1].split(';'))
1815
+ }
1816
+
1817
+ if (isMultiInstance) {
1818
+ //串签的情况下可能只有顺序发生了变化
1819
+ const oldStr = oldIdList.join(',')
1820
+ const newStr = newIds.join(',')
1821
+ return oldStr !== newStr
1822
+ }else {
1823
+ const allInString = oldIdList.every(item => newIds.includes(item));
1824
+ const hasExtra = newIds.some(item => !oldIdList.includes(item));
1825
+ return !allInString || hasExtra
1826
+ }
1827
+
1828
+ }
1829
+ return false
1830
+ },
1831
+ checkTimeLimitUpdate(oldSetting, newSetting) {
1832
+ if (oldSetting && newSetting) {
1833
+ return oldSetting !== newSetting
1834
+ }
1835
+ if (!oldSetting) {
1836
+ return newSetting !== 'expireTime:0D0H;warningTime:0D0H;handleType:00'
1837
+ }
1838
+ return false
1839
+ },
1840
+ readingRangeClick(item) {
1841
+ let permScope = item.orgTreeType === this.defaultOrganTreeType ? this.permScope : 'all'
1842
+ let orgTreeType = item.orgTreeType ? item.orgTreeType : this.defaultOrganTreeType
1843
+ this.$refs.assigneeHelpBox.toggleShowHelpBox(orgTreeType, permScope, 'transferNextTask', item.id)
1844
+ },
1845
+ candidateGroupsReadingRangeClick(item) {
1846
+ let permScope = item.orgTreeType === this.defaultOrganTreeType ? this.permScope : 'all'
1847
+ let orgTreeType = item.orgTreeType ? item.orgTreeType : this.defaultOrganTreeType
1848
+ this.$refs.candidateGroupsHelpBox.toggleShowHelpBox(permScope, item.candidates, orgTreeType, item.id)
1849
+ },
1850
+ updateCandGroups(newCandGroups, nameStr, detail, nodeId) {
1851
+ let oldSettings = this.nextNodesOldSettings.filter(item => item.id === nodeId)[0]
1852
+ if (JSON.stringify(oldSettings.candidates) != JSON.stringify(detail)) {
1853
+ let node = this.nextNodesFormList.filter(item => item.id === nodeId)[0]
1854
+ node.candidateGroups = newCandGroups
1855
+ node.candidateNames = nameStr
1856
+ node.candidates = detail
1857
+ node.needUpdate = true
1858
+ this.$forceUpdate()
1859
+ }
1860
+ },
1861
+ updateNextNodeAssignee(selectedAssigneeId, selectedAssigneeName, nodeId) {
1862
+ let oldSettings = this.nextNodesOldSettings.filter(item => item.id === nodeId)[0]
1863
+ if (oldSettings.assignee != selectedAssigneeId) {
1864
+ let node = this.nextNodesFormList.filter(item => item.id === nodeId)[0]
1865
+ node.assignee = selectedAssigneeId
1866
+ node.assigneeName = selectedAssigneeName
1867
+ node.needUpdate = true
1868
+ this.$forceUpdate()
1869
+ }
1870
+ },
1871
+ getProcessAttributes(targetTaskNodeProcessControl){
1872
+ const self = this
1873
+ let params = {
1874
+ procId: self.procId,
1875
+ taskNode: self.taskNode
1876
+ }
1877
+ self.rejectAttributeList = []
1878
+ if (!targetTaskNodeProcessControl || targetTaskNodeProcessControl != 'jump'){
1879
+ self.rejectAttributeList.push({
1880
+ _checked: true,
1881
+ type: 'inSequence',
1882
+ name: '按顺序流转'
1883
+ })
1884
+ }
1885
+ ajax.get(self.smartFlowServerContext + '/manage/processTodo/getProcessAttributes', { params: params }).then(function (resp) {
1886
+ if (resp.data.code === '200') {
1887
+ if ((self.auditParams.auditResult == '70' && !resp.data.data.jumpFirstNode) || (self.auditParams.auditResult == '40' && (resp.data.data.multiNode || resp.data.data.preNodeGateway))){
1888
+ self.doPass()
1889
+ return
1890
+ } else {
1891
+ if (self.auditParams.auditResult == '40'){
1892
+ self.rejectAttributeList.push(
1893
+ {
1894
+ type: 'returnToCurrentAuditUser',
1895
+ name: '返回我'
1896
+ }
1897
+ )
1898
+ } else {
1899
+ self.rejectAttributeList.push(
1900
+ {
1901
+ type: 'returnToCurrentNode',
1902
+ name: '返回本节点'
1903
+ }
1904
+ )
1905
+ if (!resp.data.data.multiNode){
1906
+ self.rejectAttributeList.push(
1907
+ {
1908
+ type: 'returnToCurrentAuditUser',
1909
+ name: '返回我'
1910
+ }
1911
+ )
1912
+ }
1913
+ }
1914
+ if (self.auditParams.auditResult == '90'){
1915
+ self.showProcessControl = self.rejectAttributeList.length > 0 && self.handleButtons && self.handleButtons.includes('rejectProcessControl')
1916
+ } else {
1917
+ self.rejectAttributesBoxShow = self.handleButtons && self.handleButtons.includes('rejectProcessControl')
1918
+ }
1919
+ }
1920
+ } else {
1921
+ self.$Message.error(resp.data.message)
1922
+ }
1923
+ }).catch((err) => {
1924
+ console.log(err)
1925
+ })
1926
+ },
1927
+ replaceName(originalString, replacedString, replaceString){
1928
+ const index = originalString.indexOf(replacedString)
1929
+ if (index != -1){
1930
+ const regex = new RegExp(replacedString, 'g')
1931
+ // 替换所有匹配的子字符串
1932
+ return originalString.replace(regex, replaceString)
1933
+ }
1934
+ return originalString
1935
+ }
1936
+ },
1937
+ watch: {
1938
+ auditOpinionText(label) {
1939
+ this.form.auditOpinion = label
1940
+ },
1941
+ procId(val) {
1942
+ this.procId = val
1943
+ this.initData()
1944
+ },
1945
+ targetTaskNodeProcessControl(val){
1946
+ const self = this
1947
+ if (self.handleButtons && self.handleButtons.includes('rejectProcessControl')) {
1948
+ if (val == 'inSequence'){
1949
+ self.showProcessControl = false
1950
+ return
1951
+ }
1952
+ self.getProcessAttributes(val)
1953
+ }
1954
+ }
1955
+ }
1956
+ }
1957
+ </script>
1958
+
1959
+ <style lang="less" scoped>
1960
+ @import "./styles/css/index.less";
1961
+
1962
+ /deep/ .ivu-table-row-highlight td {
1963
+ background-color: #50c1ff !important;
1964
+ color: #fff !important;
1965
+ }
1966
+
1967
+ /deep/ .ivu-card-body {
1968
+ padding: 10px;
1969
+ }
1970
+
1971
+ .page-info /deep/ .page-body {
1972
+ overflow-y: hidden;
1973
+ }
1974
+ </style>