@lambo-design/workflow-approve 1.0.0-beta.3 → 1.0.0-beta.5

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,1191 +1,1036 @@
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="lamboIndicatorCard" :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="iconClass" v-if="isExpanded" type="ios-arrow-forward"/>
16
- <Icon class="iconClass" 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="lamboIndicatorCard" :style="{width: portraitWidth + 'px', float: 'right'}" :hasExtend="false">
21
- <div slot="content-title">流程信息</div>
22
- <a @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 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"
34
- v-if="!handleButtons || handleButtons.includes('auditOpinion') || handleButtons.includes('attachmentFile')"
35
- style="margin: 10px 0 0 10px;" :rules="ruleValidate">
36
- <FormItem label="审批意见:" prop="auditOpinion" >
37
- <AuditOpinion v-model="auditOpinion" :attachmentFile="handleButtons.includes('attachmentFile')" :attachmentdata="fileList"
38
- :smart-flow-server-context="smartFlowServerContext" :oss-server-context="ossServerContext"></AuditOpinion>
39
- </FormItem>
40
- </Form>
41
- </div>
42
- </transition>
43
- <a @click="historyShow = !historyShow">
44
- <Title v-if="!handleButtons || handleButtons.includes('auditHistory')">
45
- <a style="color: #989898">
46
- <Icon v-if="historyShow" type="ios-arrow-down"/>
47
- <Icon v-if="!historyShow" type="ios-arrow-up"/>
48
- 审批记录
49
- </a>
50
- </Title>
51
- </a>
52
- <transition name="draw" @before-enter="beforeEnter" @enter="enter" @before-leave="beforeLeave" @leave="leave">
53
- <div class="box" v-show="historyShow">
54
- <Card class="processHistory" dis-hover :bordered="false"
55
- v-if="!handleButtons || handleButtons.includes('auditHistory')">
56
- <processHistory :portrait-width="portraitWidth" :list="this.processHistory"
57
- :smart-flow-server-context="smartFlowServerContext" :oss-server-context="ossServerContext"></processHistory>
58
- </Card>
59
- </div>
60
- </transition>
61
-
62
- <a @click="attachListShow = !attachListShow">
63
- <Title v-if="(!handleButtons || handleButtons.includes('attachmentFile')) && attachmentList.length > 0">
64
- <a style="color: #989898">
65
- <Icon v-if="attachListShow" type="ios-arrow-down"/>
66
- <Icon v-if="!attachListShow" type="ios-arrow-up"/>
67
- 查看附件
68
- </a>
69
- </Title>
70
- </a>
71
- <transition name="draw" @before-enter="beforeEnter" @enter="enter" @before-leave="beforeLeave" @leave="leave">
72
- <div class="box" v-show="(!handleButtons || handleButtons.includes('attachmentFile')) && attachmentList.length > 0 && attachListShow">
73
- <div v-for="(item, index) in attachmentList" :key="index">
74
- <Card dis-hover class="attachCard">
75
- <List item-layout="vertical">
76
- <ListItem style="margin-top: -8px">
77
- <Row style="display: flex; align-items: center;">
78
- <!-- 左边:图片 -->
79
- <Col span="4" style="margin-top: -25px">
80
- <avatar v-if="item.fileType === 'image'" icon="ios-image-outline" class="attachAvatar" :style="portraitWidth >= 600 ? 'margin-left: 10px' : ''"
81
- :size="portraitWidth >= 600 ? 'middle' : 'small'"></avatar>
82
- <avatar v-else-if="item.fileType === 'doc'" icon="ios-document-outline" class="attachAvatar" :style="portraitWidth >= 600 ? 'margin-left: 10px' : ''"
83
- :size="portraitWidth >= 600 ? 'middle' : 'small'">
84
- </avatar>
85
- <avatar v-else-if="item.fileType === 'xlsx'" icon="ios-document-outline" class="attachAvatar" :style="portraitWidth >= 600 ? 'margin-left: 10px' : ''"
86
- :size="portraitWidth >= 600 ? 'middle' : 'small'"></avatar>
87
- <avatar v-else-if="item.fileType === 'pdf'" icon="ios-document-outline" class="attachAvatar" :style="portraitWidth >= 600 ? 'margin-left: 10px' : ''"
88
- :size="portraitWidth >= 600 ? 'middle' : 'small'"></avatar>
89
- <avatar v-else icon="ios-document-outline" class="attachAvatar" :style="portraitWidth >= 600 ? 'margin-left: 10px' : ''"
90
- :size="portraitWidth >= 600 ? 'middle' : 'small'"></avatar>
91
- </Col>
92
- <!-- 右边:附件信息 -->
93
- <Col span="20">
94
- <Row>
95
- <tooltip>
96
- <span class="attachNameStyle"> {{ item.attachName }}</span>
97
- <div slot="content" style="white-space: normal"> {{ item.attachName }}</div>
98
- </tooltip>
99
- </Row>
100
- <Row style="margin-top: 3px">
101
- <span style="color: #005aff; font-size: 13px;">{{ item.uploadUserName }}</span>
102
- <Divider style="background-color:#808695;height: 1em;margin: 4px 9px 0 6px;"
103
- type="vertical"/>
104
- <span style="color: #808695;font-size: 13px"
105
- >{{ showTaskNode(item.taskId) }}</span>
106
- </Row>
107
- <Row style="margin-bottom: -10px; margin-top: 10px">
108
- <template>
109
- <Button @click="getAttach(item)" size="small">下载</Button>
110
- <Button v-if="item.showPreview" ghost type="primary" @click="preViewAttach(item)"
111
- style="margin-left: 10px" size="small">预览
112
- </Button>
113
- </template>
114
- </Row>
115
- </Col>
116
- </Row>
117
-
118
- </ListItem>
119
- </List>
120
- </Card>
121
- </div>
122
- </div>
123
- </transition>
124
- <Modal v-model="modal1" title="选择节点"
125
- @on-cancel="cancel"
126
- @on-ok="ok">
127
- <Table border
128
- :data="allNode"
129
- :columns="nodeColumn"
130
- highlight-row
131
- @on-current-change="selectNode">
132
- </Table>
133
- </Modal>
134
- <assigneeBox ref="assigneeHelpBox" :executionCompleted="executionCompleted" @update-selected="handleSelectedUser"
135
- :data="assigneeBoxData" :smart-flow-server-context="smartFlowServerContext" :upms-server-context="upmsServerContext"/>
136
- <Modal v-model="modalBoxShow" width="1000" title="流程跟踪图">
137
- <Workflow_Print ref="processTrace" :instanceId="process.instanceId" :applyId="process.applyId"
138
- :procId="process.procId"
139
- :tableData="process.tableData" :hisAudit="hisAudit"
140
- :smart-flow-server-context="smartFlowServerContext">
141
- </Workflow_Print>
142
- </Modal>
143
- </lamboIndicatorCard>
144
- </transition>
145
- <template slot="page-footer">
146
- <div>
147
- <slot name="footer-button"></slot>
148
- <Button style="margin-left: 10px;" v-if="!handleButtons || handleButtons.includes('auditTo70')"
149
- :disabled="disable" :loading="loading" @click="audit('70')">驳回到原点
150
- </Button>
151
- <Button style="margin-left: 10px;" v-if="!handleButtons || handleButtons.includes('auditTo40')"
152
- :disabled="disable" :loading="loading" @click="audit('40')">驳回到上一级
153
- </Button>
154
- <Button style="margin-left: 10px;" v-if="!handleButtons || handleButtons.includes('auditTo90')"
155
- :disabled="disable" :loading="loading" @click="audit('90')">驳回指定节点
156
- </Button>
157
- <Button style="margin-left: 10px;" v-if="!handleButtons || handleButtons.includes('auditTo80')"
158
- :disabled="disable" :loading="loading" @click="audit('80')">跳转指定节点
159
- </Button>
160
- <Button style="margin-left: 10px;" v-if="!handleButtons || handleButtons.includes('auditTo82')"
161
- :disabled="disable" :loading="loading" @click="audit('82')">指定他人处理
162
- </Button>
163
- <Button style="margin-left: 10px;" v-if="!handleButtons || handleButtons.includes('auditTo50')"
164
- :disabled="disable" :loading="loading" @click="audit('50')">直接结束流程
165
- </Button>
166
- <Button style="margin-left: 10px;" v-if="!handleButtons || handleButtons.includes('processTrace')"
167
- @click="processPrint" >流程跟踪图</Button>
168
- <Button style="margin-left: 10px;" v-if="!handleButtons || handleButtons.includes('auditTo30')"
169
- :disabled="disable" :loading="loading" type="primary" @click="audit('30')">通过
170
- </Button>
171
- </div>
172
- </template>
173
- </LamboPageContainer>
174
- </template>
175
-
176
-
177
- <script>
178
- import LamboPageContainer from '@lambo-design/page-container'
179
- import LamboIndicatorCard from '@lambo-design/indicator-card'
180
- import Workflow_Print from './workflow-diagram'
181
- import ajax from "@lambo-design/shared/utils/ajax";
182
- import { operateBtn } from '@lambo-design/shared/utils/assist';
183
- import bus from '@lambo-design/shared/utils/bus';
184
- import Title from "./components/title";
185
- import processHistory from "./components/history";
186
- import assigneeBox from "./components/assignee-box";
187
- import LamboPagingTable from "@lambo-design/paging-table";
188
- import axios from "axios";
189
- import AuditOpinion from "./components/opinion";
190
-
191
- // 引入docx-preview插件
192
- let docx = require('docx-preview');
193
-
194
-
195
- export default {
196
- props: {
197
- width: {
198
- type: Number,
199
- required: false,
200
- default: 600
201
- },
202
- procId: {
203
- type: String,
204
- required: true,
205
- },
206
- taskNode: {
207
- type: String,
208
- required: true,
209
- },
210
- applyId: {
211
- type: String,
212
- required: true,
213
- },
214
- isShowSave: {
215
- type: Boolean,
216
- required: false,
217
- default: false
218
- },
219
- isShowReturn: {
220
- type: Boolean,
221
- required: false,
222
- default: false
223
- },
224
- //业务表单保存方法
225
- businessFormSave: {
226
- type: Function,
227
- required: false
228
- },
229
- //按钮执行完毕回调方法
230
- executionCompleted: {
231
- type: Function,
232
- required: false,
233
- },
234
- title:{
235
- type: String,
236
- default: "流程办理"
237
- },
238
- smartFlowServerContext: {
239
- type: String,
240
- default: '/api/smart-flow-server',
241
- },
242
- ossServerContext: {
243
- type: String,
244
- default: '/api/oss-server',
245
- },
246
- upmsServerContext: {
247
- type: String,
248
- default: '/api/upms-server',
249
- },
250
- },
251
- components: {
252
- Title,
253
- LamboPageContainer,
254
- Workflow_Print,
255
- processHistory,
256
- assigneeBox,
257
- LamboPagingTable,
258
- AuditOpinion,
259
- LamboIndicatorCard
260
- },
261
- data() {
262
- return {
263
- isExpanded: true,
264
- portraitWidth: 0,
265
- requestSuccessCodes: [200, "200"],
266
- auditShow: true,
267
- historyShow: true,
268
- attachListShow: true,
269
- attachmentList: [],
270
- modalVisible: false,
271
- modalDocx: false,
272
- imageUrl: '',
273
- assigneeBoxData: {},
274
- selectedUserId: '',
275
- targetTaskNode: '',
276
- allNode: [],
277
- auditParams: {},
278
- modal1: false,
279
- modalBoxShow: false,
280
- hisNode: [],
281
- processHistory: [],
282
- ruleValidate: {
283
- auditOpinion: [{required: true, trigger: "blur", message: "审批意见不能为空"}]
284
- },
285
- auditOpinion: '',
286
- loading: false,
287
- disable: false,
288
- instanceId: '',
289
- taskId: '',
290
- handleButtons: [],
291
- auditResult: '',
292
- custChange: 'auditInfo',
293
- auditInfo: "auditInfo",
294
- auditProcess: "auditProcess",
295
- fileList: [],
296
- hisAudit: [],
297
- datas: {
298
- orgName: "",
299
- orgId: ""
300
- },
301
- editForm: {
302
- approvalCost: '',
303
- cost: '',
304
- activityDate: []
305
- },
306
- process: {
307
- tableData: [],
308
- instanceId: '',
309
- applyId: '',
310
- procId: ''
311
- },
312
- handleButtonsNames: {
313
- '30': '同意',
314
- '70': '驳回原点',
315
- '40': '驳回上一节点',
316
- '80': '驳回指定节点',
317
- '82': '转办',
318
- '50': '人工终止'
319
- },
320
- }
321
-
322
- },
323
-
324
- mounted() {
325
- this.getWidth()
326
- if (this.procId){
327
- this.initData()
328
- }
329
-
330
- },
331
- computed: {
332
- nodeColumn: function () {
333
- let column = []
334
- column.push({title: '序号', type: 'index', width: 70, align: 'center', fixed: 'left'});
335
- column.push({title: '节点名称', key: 'taskName', minWidth: 150, align: 'center', fixed: 'left'})
336
-
337
- column.push({
338
- title: '节点状态', key: 'auditResult', minWidth: 150, align: 'center', fixed: 'left',
339
- render: (h, params) => {
340
- if (params.row.taskNode == this.taskNode) {
341
- return h('div', [
342
- h('tag', {
343
- props: {
344
- color: '#ff9900'
345
- }
346
- }, '当前节点')
347
- ])
348
- } else if (!params.row.auditResult) {
349
- return h('div', [
350
- h('tag', {
351
- props: {
352
- color: '#ff9900'
353
- }
354
- }, '未审批')
355
- ])
356
- } else {
357
- if (params.row.auditResult == '30' && params.row.taskNode != this.taskNode) {
358
- return h('div', [
359
- h('tag', {
360
- props: {
361
- color: '#19be6b'
362
- }
363
- }, '已审批通过')
364
- ])
365
- } else if (params.row.auditResult == '40' && params.row.taskNode != this.taskNode) {
366
- return h('div', [
367
- h('tag', {
368
- props: {
369
- color: '#ed4014'
370
- }
371
- }, '已驳回到上一节点')
372
- ])
373
- } else if (params.row.auditResult == '60' && params.row.taskNode != this.taskNode) {
374
- return h('div', [
375
- h('tag', {
376
- props: {
377
- color: '#ed4014'
378
- }
379
- }, '已撤回')
380
- ])
381
- } else if (params.row.auditResult == '80' && params.row.taskNode != this.taskNode) {
382
- return h('div', [
383
- h('tag', {
384
- props: {
385
- color: '#19be6b'
386
- }
387
- }, '已跳转到指定节点')
388
- ])
389
- } else if (params.row.auditResult == '80' && params.row.taskNode != this.taskNode) {
390
- return h('div', [
391
- h('tag', {
392
- props: {
393
- color: '#19be6b'
394
- }
395
- }, '已驳回到指定节点')
396
- ])
397
- }
398
- }
399
- }
400
- })
401
- column.push({
402
- title: "操作", width: 100, align: 'center',
403
- render: (h, params) => {
404
- return h('div', [
405
- h('Button', {
406
- props: {
407
- type: 'primary',
408
- size: 'small'
409
- },
410
- style: {
411
- marginRight: '5px'
412
- },
413
- on: {
414
- click: () => {
415
- this.selectNode(params.row)
416
- }
417
- }
418
- }, '选择')
419
- ])
420
- },
421
- })
422
- return column
423
- },
424
-
425
- tableColumn() {
426
- let column = [];
427
- let self = this;
428
- column.push({
429
- title: '序号',
430
- type: 'index',
431
- width: 70,
432
- align: 'center',
433
- });
434
- column.push({
435
- title: '附件名称', key: 'fileName', minWidth: 150, align: 'center',
436
- render(h, {row}) {
437
- const index = row.fileName.lastIndexOf(".");
438
- const fileName = row.fileName.substr(0, index)
439
- return h("span", fileName)
440
-
441
- }
442
- });
443
- column.push({
444
- title: '附件类型', width: 100, align: 'center',
445
- render: (h, {row}) => {
446
- const index = row.fileName.lastIndexOf(".");
447
- const fileType = row.fileName.substr(index + 1)
448
- return h("span", fileType)
449
- }
450
- });
451
-
452
- column.push({
453
- title: "上传人姓名",
454
- key: "uploadUserName",
455
- width: 170,
456
- align: "center",
457
- });
458
-
459
- column.push({
460
- title: "节点名称",
461
- key: "taskName",
462
- width: 170,
463
- align: "center",
464
- });
465
-
466
- column.push({
467
- title: "上传时间",
468
- key: "updTime",
469
- width: 170,
470
- align: "center",
471
- render: (v, param) => {
472
- if (param.row.updTime) {
473
- let date = new Date(param.row.updTime)
474
- let y = date.getFullYear() // 年
475
- let MM = date.getMonth() + 1 // 月
476
- MM = MM < 10 ? ('0' + MM) : MM
477
- let d = date.getDate() // 日
478
- d = d < 10 ? ('0' + d) : d
479
- let h = date.getHours() // 时
480
- h = h < 10 ? ('0' + h) : h
481
- let m = date.getMinutes()// 分
482
- m = m < 10 ? ('0' + m) : m
483
- let s = date.getSeconds()// 秒
484
- s = s < 10 ? ('0' + s) : s
485
- let state = y + '-' + MM + '-' + d + ' ' + h + ':' + m + ':' + s;
486
- return v("span", state);
487
- }
488
- return v("span", '')
489
- }
490
- });
491
-
492
- column.push({
493
- title: "操作", width: 160, align: 'center', tooltip: true,
494
- render: (h, {row}) => {
495
- const index = row.fileName.lastIndexOf(".");
496
- const fileType = row.fileName.substr(index + 1).toLowerCase()
497
- // const typeList=['jpg','pdf','gif','png','docx']
498
- //由于pdf预览显示乱码 暂时不提供pdf预览功能
499
- const typeList = ['jpg', 'gif', 'png', 'docx']
500
- if (typeList.indexOf(fileType) !== -1) {
501
- return h("div", [
502
- operateBtn(this, h, row, "下载", () => {
503
- this.getAttach(row);
504
- }, "primary"),
505
- operateBtn(this, h, row, "预览", () => {
506
- this.preViewAttach(row);
507
- }, "primary")
508
- ]);
509
- } else {
510
- return h("div", [
511
- operateBtn(this, h, row, "下载", () => {
512
- this.getAttach(row);
513
- }, "primary")
514
- ]);
515
- }
516
-
517
- }
518
-
519
- });
520
-
521
- return column;
522
- },
523
-
524
-
525
- },
526
- provide() {
527
- return {
528
- toBeDoneListDoSearch: this.doSearch
529
- };
530
- },
531
- methods: {
532
- getWidth() {
533
- if (this.width && this.width < 400) {
534
- this.portraitWidth = 400
535
- }
536
- this.portraitWidth = this.width
537
- },
538
- initData(){
539
- this.getAttachList()
540
- this.getTaskId()
541
- this.getHandleButtons()
542
- this.getHisAudit();
543
- this.getProcessHistory();
544
- },
545
- saveBusinessForm() {
546
- this.businessFormSave(() => {
547
- })
548
- },
549
- getAttachList() {
550
- const self = this
551
- const param = {
552
- procId: this.procId,
553
- applyId: this.applyId
554
- }
555
- ajax.get(this.smartFlowServerContext + '/manage/processDone/getAttachmentList', {params: param}).then(function (resp) {
556
- self.attachmentList = resp.data.data.rows
557
- self.attachmentList.forEach(item => {
558
- const index = item.fileName.lastIndexOf(".")
559
- const fileType = item.fileName.substr(index + 1).toLowerCase()
560
- const imageList = ['jpg', 'gif', 'png', 'svg']
561
- const docList = ['doc', 'docx']
562
- const zipList = ['rar', 'zip']
563
- const typeList = ['jpg', 'gif', 'png', 'docx']
564
- item.fileType = imageList.indexOf(fileType) !== -1 ? 'image' : docList.indexOf(fileType) !== -1 ? 'doc' : zipList.indexOf(fileType) !== -1 ? 'zip' : fileType
565
- item.showPreview = typeList.indexOf(fileType) !== -1
566
- })
567
- }).catch(err => {
568
- console.log(err);
569
- })
570
- },
571
- getTaskId() {
572
- const self = this
573
- let param = {
574
- procId: this.procId,
575
- applyId: this.applyId,
576
- taskNode:this.taskNode
577
- }
578
- ajax.get(this.smartFlowServerContext + "/manage/processTodo/list", {params: param}).then(function (resp) {
579
- if (resp.data.code === '200') {
580
- self.taskId = resp.data.data.rows[0].taskId
581
- self.instanceId = resp.data.data.rows[0].procInstanceId
582
- } else {
583
- this.$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(this.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
- this.$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
- this.$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 = this.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 = this.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 = this.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 = this.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.ossServerContext + "/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.ossServerContext + "/file/get/" + row.fileId;
738
- this.imgPreview(url);
739
- } else if (regs.test(row.fileName)) {
740
- window.open(this.ossServerContext + "/file/getFileStream?fileId=" + row.fileId, "_blank");
741
- } else {
742
- this.modalDocx = true
743
- axios({
744
- method: 'get',
745
- responseType: 'blob', // 因为是流文件,所以要指定blob类型
746
- url: this.ossServerContext + "/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.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
- this.$Message.error("请选择审批结果!");
787
- return;
788
- }
789
- if (self.auditOpinion == '' || self.auditOpinion == null) {
790
- if (!self.handleButtons || self.handleButtons.includes('auditOpinion')) {
791
- this.$Message.error("请输入审批意见!")
792
- return;
793
- } else {
794
- self.auditParams.auditOpinion = self.handleButtonsNames[self.auditResult];
795
- }
796
- }
797
-
798
- this.businessFormSave ? this.businessFormSave(this.handleSaveResult) : this.handleSaveResult(true, 'noBusinessFormSave')
799
-
800
- },
801
-
802
- //打印流程图信息
803
- processPrint() {
804
- let self = this
805
- let params = {
806
- applyId: self.applyId,
807
- instanceId: self.instanceId,
808
- procId: self.procId,
809
- taskId: self.taskId,
810
- }
811
- ajax.get(this.smartFlowServerContext + '/manage/processTodo/getPrintData', {params: params}).then(function (resp) {
812
- let result = resp.data.data
813
- if (resp.data.code === '200') {
814
- let tableData = result
815
- self.process.tableData = tableData
816
- self.process.applyId = self.applyId
817
- self.process.instanceId = self.instanceId
818
- self.process.procId = self.procId
819
- self.datas.orgId = tableData[0].orgId
820
- self.datas.orgName = tableData[0].orgName
821
- self.modalBoxShow = true
822
- }
823
- })
824
- },
825
-
826
- pageGoBack() {
827
- bus.$emit('triggerTimer')
828
- window.history.back()
829
- },
830
-
831
- getHisAudit() {
832
- let self = this
833
- let params = {
834
- applyId: self.applyId,
835
- instanceId: self.instanceId,
836
- procId: self.procId,
837
- taskId: self.taskId
838
- }
839
- ajax.get(this.smartFlowServerContext + '/manage/processTodo/getHisAudit', {params: params}).then(function (resp) {
840
- if (resp.data.code === '200') {
841
- self.hisAudit = resp.data.data
842
- let uniqueDataMap = {};
843
- self.hisAudit.forEach((item) => {
844
- uniqueDataMap[item["taskNode"]] = item;
845
- })
846
- self.hisNode = Object.values(uniqueDataMap);
847
-
848
- }
849
- })
850
- },
851
- showTaskNode(taskId) {
852
- if (this.processHistory.length > 0) {
853
- let task = null
854
- this.processHistory.some(itemList => {
855
- task = itemList.find(item => item.taskId === taskId);
856
- return task !== undefined;
857
- });
858
- return task ? task.taskName : ''
859
- }
860
- return ''
861
- },
862
- getProcessHistory() {
863
- let self = this
864
- let params = {
865
- applyId: self.applyId,
866
- instanceId: self.instanceId,
867
- procId: self.procId,
868
- taskId: self.taskId
869
- }
870
- ajax.get(this.smartFlowServerContext + '/manage/processTodo/getProcessHis', {params: params}).then(function (resp) {
871
- if (resp.data.code === '200') {
872
- self.processHistory = resp.data.data
873
- }
874
- })
875
- },
876
- cancel() {
877
- this.modal = false
878
- // this.$refs['radio5'].currentValue = false;
879
- this.auditResult = '';
880
- },
881
- ok() {
882
- this.modal = false
883
- if (this.targetTaskNode == '' || this.targetTaskNode == null) {
884
- // this.$refs['radio5'].currentValue = false;
885
- this.auditResult = '';
886
- this.$Message.error("请选择审批节点!");
887
- } else {
888
- let self = this;
889
-
890
- self.auditParams = {
891
- procId: self.procId,
892
- applyId: self.applyId,
893
- taskId: self.taskId,
894
- auditOpinion: self.auditOpinion,
895
- fileListStr: JSON.stringify(self.fileList),
896
- auditResult: self.auditResult,
897
- params: JSON.stringify(self.datas),
898
- targetTaskNode: self.targetTaskNode,
899
- selectedUserId: self.selectedUserId,
900
- }
901
- self.loading = true
902
- self.disable = true
903
-
904
- let url = this.smartFlowServerContext + '/manage/processTodo/audit'
905
- ajax.post(url, self.auditParams).then(function (resp) {
906
- let result = resp.data
907
- if (result.code === '200') {
908
- setTimeout(() => {
909
- self.loading = false
910
- self.disable = false
911
- self.$Message.success("审批成功");
912
- if (self.executionCompleted) {
913
- self.executionCompleted(true, result.data.processInstanceId, result.data.id);
914
- }
915
- bus.$emit('triggerTimer')
916
- }, 500)
917
- } else {
918
- self.loading = false
919
- self.disable = false
920
- self.$Message.error(result.message)
921
- if (self.executionCompleted) {
922
- self.executionCompleted(false, null, null);
923
- }
924
- }
925
- })
926
- }
927
- },
928
- selectNode(currentRow, oldCurrentRow) {
929
- let self = this
930
- self.targetTaskNode = currentRow.taskNode
931
- },
932
- getAllPreNodes() {
933
- let self = this
934
- let params = {
935
- processDefId: self.procId,
936
- taskId: self.taskId,
937
- }
938
- ajax.get(this.smartFlowServerContext + '/manage/processTodo/getAllPreNodes', {params: params}).then(function (resp) {
939
- if (resp.data.code === '200') {
940
- if (resp.data.data.length > 0){
941
- self.allNode = resp.data.data
942
- self.modal1 = true
943
- }else {
944
- self.$Message.warning('当前流程无前序节点')
945
- }
946
- } else {
947
- self.$Message.error(resp.data.message)
948
- }
949
- })
950
- },
951
- getNodesBehind() {
952
- let self = this
953
- let params = {
954
- processDefId: self.procId,
955
- taskId: self.taskId,
956
- }
957
- ajax.get(this.smartFlowServerContext + '/manage/processTodo/getNodesBehind', {params: params}).then(function (resp) {
958
- if (resp.data.code === '200') {
959
- if (resp.data.data.length > 0){
960
- self.allNode = resp.data.data
961
- self.modal1 = true
962
- }else {
963
- self.$Message.warning('当前流程无后续节点')
964
- }
965
- } else {
966
- self.$Message.error(resp.data.message)
967
- }
968
- })
969
- },
970
- handleSelectedUser(userId) {
971
- // 处理选中的用户ID,比如将其保存到数据中或执行其他逻辑
972
- this.selectedUserId = userId;
973
- // if (userId == null || userId == '') {
974
- // this.$refs['radio6'].currentValue = false;
975
- // }
976
- },
977
-
978
- //折叠动画效果
979
- beforeEnter(el) {
980
- el.style.height = '0';
981
- },
982
- enter(el, done) {
983
- setTimeout(() => {
984
- el.style.height = el.scrollHeight + 'px';
985
- }, 0);
986
-
987
- el.addEventListener('transitionend', done);
988
- },
989
- beforeLeave(el) {
990
- el.style.height = el.scrollHeight + 'px';
991
- },
992
- leave(el, done) {
993
- setTimeout(() => {
994
- el.style.height = '0';
995
- }, 0);
996
-
997
- el.addEventListener('transitionend', done);
998
- },
999
-
1000
- beforeFlowInfoEnter(el) {
1001
- el.style.transform = 'translateX(100%)';
1002
- },
1003
- flowInfoEnter(el, done) {
1004
- const transitionDuration = 0.5;
1005
- el.style.transition = `transform ${transitionDuration}s`;
1006
- el.style.transform = 'translateX(0)';
1007
- el.addEventListener('transitionend', done);
1008
- },
1009
- beforeFlowInfoLeave(el) {
1010
- el.style.transform = 'translateX(0)';
1011
- },
1012
- flowInfoLeave(el, done) {
1013
- const transitionDuration = 0.5;
1014
- el.style.transition = `transform ${transitionDuration}s`;
1015
- el.style.transform = 'translateX(100%)';
1016
- el.addEventListener('transitionend', done);
1017
- },
1018
- },
1019
- watch: {
1020
- auditOpinionText(label) {
1021
- this.auditOpinion = label;
1022
- },
1023
- procId(val) {
1024
- this.procId = val;
1025
- this.initData()
1026
- },
1027
- }
1028
- }
1029
- </script>
1030
-
1031
- <style lang="less" scoped>
1032
- .lamboIndicatorCard{
1033
- height: 100%;
1034
- position: relative;
1035
- overflow-y: auto;
1036
- margin-bottom: -10px;
1037
- }
1038
- .lamboIndicatorCard::-webkit-scrollbar {
1039
- width: 5px;
1040
- height: 5px;
1041
- }
1042
-
1043
- .lamboIndicatorCard::-webkit-scrollbar-thumb {
1044
- background: linear-gradient(to bottom right, #bbbbbb 0%, #bbbbbb 100%);
1045
- border-radius: 5px;
1046
- }
1047
- .header-text {
1048
- display: flex;
1049
- font-size: 18px;
1050
- font-weight: bold;
1051
- color: black;
1052
- }
1053
-
1054
- .cont {
1055
- display: flex;
1056
- width: 100%;
1057
- height: 100%;
1058
- }
1059
-
1060
- .contLeft {
1061
- flex: 0 0 20%;
1062
- margin-right: 5px
1063
- }
1064
-
1065
- .contRight {
1066
- display: flex;
1067
- flex: 0 0 80%;
1068
- height: 100%;
1069
- flex-direction: column;
1070
-
1071
- }
1072
-
1073
- .iframe {
1074
- height: 70vh;
1075
- width: 100%;
1076
- border-style: none;
1077
- }
1078
-
1079
- .fontType {
1080
- font-family: "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "微软雅黑", Arial, sans-serif;
1081
- font-weight: bold;
1082
- color: #657180;
1083
- font-size: 14px
1084
- }
1085
-
1086
- .processHistory {
1087
- height: 40vh;
1088
- width: 100%;
1089
- overflow-y: auto;
1090
- }
1091
-
1092
- .processHistory::-webkit-scrollbar {
1093
- width: 5px;
1094
- height: 5px;
1095
- }
1096
-
1097
- .processHistory::-webkit-scrollbar-thumb {
1098
- background: linear-gradient(to bottom right, #bbbbbb 0%, #bbbbbb 100%);
1099
- border-radius: 5px;
1100
- }
1101
-
1102
- /deep/ .ivu-table-row-highlight td {
1103
- background-color: #50c1ff !important;
1104
- color: #fff !important;
1105
- }
1106
-
1107
- .box {
1108
- overflow: hidden;
1109
- transition: height 0.3s ease;
1110
- height: auto;
1111
- width: auto;
1112
- margin-left: -15px;
1113
- }
1114
-
1115
- .draw-enter-active, .draw-leave-active {
1116
-
1117
- }
1118
-
1119
- .draw-enter, .draw-leave-to {
1120
- height: 0;
1121
- }
1122
-
1123
- .sticky {
1124
- position: sticky;
1125
- top: 0;
1126
- z-index: 100;
1127
- box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
1128
- }
1129
-
1130
- .attachNameStyle {
1131
- margin-bottom: -5px;
1132
- white-space: nowrap;
1133
- display: inline-block;
1134
- width: auto;
1135
- font-size: 14px;
1136
- color: #17233d;
1137
- overflow: hidden;
1138
- text-overflow: ellipsis;
1139
- }
1140
-
1141
- .leftImageLarge{
1142
- height: 10%;
1143
- width: 60px;
1144
- margin-top: -20px;
1145
- margin-left: 10px;
1146
- }
1147
- .leftImageSmall{
1148
- height: 40px;
1149
- width: 40px;
1150
- margin-top: -10px;
1151
- }
1152
- .ivu-divider-horizontal{
1153
- margin: 10px;
1154
- }
1155
- .arrow-button-container {
1156
- position: absolute;
1157
- z-index: 50;
1158
- width: 12px;
1159
- height: 50px;
1160
- border-radius: 4px;
1161
- border: none;
1162
- background-color: #cccccc;
1163
- color: white;
1164
- display: inline-block;
1165
- transition: 0.5s;
1166
- top: 50%;
1167
- transform: translateX(0)
1168
- }
1169
- .iconClass{
1170
- margin-top: 18px;
1171
- }
1172
- .attachCard{
1173
- border:solid;
1174
- border-width: thin;
1175
- border-color: #f1f1f1;
1176
- width: auto;
1177
- border-radius: 10px;
1178
- margin: 10px 0 10px 10px
1179
- }
1180
- .attachAvatar{
1181
- background-color: #ed4014;
1182
- margin-right: 5px;
1183
- zoom: 150%
1184
- }
1185
- /deep/ .ivu-card-body{
1186
- padding: 10px;
1187
- }
1188
- .page-info /deep/ .page-body{
1189
- overflow-y: hidden;
1190
- }
1191
- </style>
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" 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
+ default: false
247
+ },
248
+ width: {
249
+ type: Number,
250
+ required: false,
251
+ default: 400
252
+ },
253
+ procId: {
254
+ type: String,
255
+ required: true,
256
+ },
257
+ taskNode: {
258
+ type: String,
259
+ required: true,
260
+ },
261
+ applyId: {
262
+ type: String,
263
+ required: true,
264
+ },
265
+ //业务表单保存方法
266
+ businessFormSave: {
267
+ type: Function,
268
+ required: false
269
+ },
270
+ //按钮执行完毕回调方法
271
+ executionCompleted: {
272
+ type: Function,
273
+ required: false,
274
+ },
275
+ title:{
276
+ type: String,
277
+ default: "流程办理"
278
+ },
279
+ smartFlowServerContext: {
280
+ type: String,
281
+ default: '/api/smart-flow-server',
282
+ },
283
+ upmsServerContext: {
284
+ type: String,
285
+ default: '/api/upms-server',
286
+ },
287
+ },
288
+ components: {
289
+ Title,
290
+ LamboPageContainer,
291
+ Workflow_Diagram,
292
+ processHistory,
293
+ assigneeBox,
294
+ LamboPagingTable,
295
+ AuditOpinion,
296
+ LamboIndicatorCard,
297
+ UploadFile
298
+ },
299
+ data() {
300
+ return {
301
+ isExpanded: true,
302
+ portraitWidth: 0,
303
+ requestSuccessCodes: [200, "200"],
304
+ auditShow: true,
305
+ historyShow: true,
306
+ attachListShow: true,
307
+ attachmentList: [],
308
+ modalVisible: false,
309
+ modalDocx: false,
310
+ imageUrl: '',
311
+ assigneeBoxData: {},
312
+ selectedUserId: '',
313
+ targetTaskNode: '',
314
+ allNode: [],
315
+ auditParams: {},
316
+ modal1: false,
317
+ modalBoxShow: false,
318
+ hisNode: [],
319
+ processHistory: [],
320
+ ruleValidate: {
321
+ auditOpinion: [{required: true, trigger: "blur", message: "审批意见不能为空"}]
322
+ },
323
+ form: {
324
+ auditOpinion: '',
325
+ },
326
+ loading: false,
327
+ disable: false,
328
+ instanceId: '',
329
+ taskId: '',
330
+ handleButtons: [],
331
+ auditResult: '',
332
+ custChange: 'auditInfo',
333
+ auditInfo: "auditInfo",
334
+ auditProcess: "auditProcess",
335
+ fileList: [],
336
+ ossFilePutUrl: '/manage/oss/file/put',
337
+ hisAudit: [],
338
+ hisAuditOpinion: [{
339
+ auditOpinion: '',
340
+ auditTime: '',
341
+ }],
342
+ datas: {
343
+ orgName: "",
344
+ orgId: ""
345
+ },
346
+ editForm: {
347
+ approvalCost: '',
348
+ cost: '',
349
+ activityDate: []
350
+ },
351
+ process: {
352
+ tableData: [],
353
+ instanceId: '',
354
+ applyId: '',
355
+ procId: ''
356
+ },
357
+ handleButtonsNames: {
358
+ '30': '同意',
359
+ '70': '驳回原点',
360
+ '40': '驳回上一节点',
361
+ '90': '驳回指定节点',
362
+ '80': '跳转指定节点',
363
+ '82': '转办',
364
+ '50': '人工终止'
365
+ },
366
+ }
367
+
368
+ },
369
+
370
+ mounted() {
371
+ this.getWidth()
372
+ if (this.procId){
373
+ this.initData()
374
+ }
375
+
376
+ },
377
+ computed: {
378
+ nodeColumn: function () {
379
+ let column = []
380
+ column.push({title: '序号', type: 'index', width: 70, align: 'center', fixed: 'left'});
381
+ column.push({title: '节点名称', key: 'taskName', minWidth: 150, align: 'center', fixed: 'left'})
382
+
383
+ column.push({
384
+ title: '节点状态', key: 'auditResult', minWidth: 150, align: 'center', fixed: 'left',
385
+ render: (h, params) => {
386
+ if (params.row.taskNode == this.taskNode) {
387
+ return h('div', [
388
+ h('tag', {
389
+ props: {
390
+ color: '#ff9900'
391
+ }
392
+ }, '当前节点')
393
+ ])
394
+ } else if (!params.row.auditResult) {
395
+ return h('div', [
396
+ h('tag', {
397
+ props: {
398
+ color: '#ff9900'
399
+ }
400
+ }, '未审批')
401
+ ])
402
+ } else {
403
+ if (params.row.auditResult == '30' && params.row.taskNode != this.taskNode) {
404
+ return h('div', [
405
+ h('tag', {
406
+ props: {
407
+ color: '#19be6b'
408
+ }
409
+ }, '已审批通过')
410
+ ])
411
+ } else if (params.row.auditResult == '40' && params.row.taskNode != this.taskNode) {
412
+ return h('div', [
413
+ h('tag', {
414
+ props: {
415
+ color: '#ed4014'
416
+ }
417
+ }, '已驳回到上一节点')
418
+ ])
419
+ } else if (params.row.auditResult == '60' && params.row.taskNode != this.taskNode) {
420
+ return h('div', [
421
+ h('tag', {
422
+ props: {
423
+ color: '#ed4014'
424
+ }
425
+ }, '已撤回')
426
+ ])
427
+ } else if (params.row.auditResult == '80' && params.row.taskNode != this.taskNode) {
428
+ return h('div', [
429
+ h('tag', {
430
+ props: {
431
+ color: '#19be6b'
432
+ }
433
+ }, '已跳转到指定节点')
434
+ ])
435
+ } else if (params.row.auditResult == '80' && params.row.taskNode != this.taskNode) {
436
+ return h('div', [
437
+ h('tag', {
438
+ props: {
439
+ color: '#19be6b'
440
+ }
441
+ }, '已驳回到指定节点')
442
+ ])
443
+ }
444
+ }
445
+ }
446
+ })
447
+ column.push({
448
+ title: "操作", width: 100, align: 'center',
449
+ render: (h, params) => {
450
+ return h('div', [
451
+ h('Button', {
452
+ props: {
453
+ type: 'primary',
454
+ size: 'small'
455
+ },
456
+ style: {
457
+ marginRight: '5px'
458
+ },
459
+ on: {
460
+ click: () => {
461
+ this.selectNode(params.row)
462
+ }
463
+ }
464
+ }, '选择')
465
+ ])
466
+ },
467
+ })
468
+ return column
469
+ },
470
+
471
+ },
472
+ provide() {
473
+ return {
474
+ toBeDoneListDoSearch: this.doSearch
475
+ };
476
+ },
477
+ methods: {
478
+ getWidth() {
479
+ if (this.width && this.width < 400) {
480
+ this.portraitWidth = 400
481
+ }
482
+ this.portraitWidth = this.width
483
+ },
484
+ initData(){
485
+ this.getAttachList()
486
+ if (!this.isDetail){
487
+ this.getTodoTaskId()
488
+ } else {
489
+ this.getDoneTaskId()
490
+ }
491
+ this.getHandleButtons()
492
+ this.getHisAudit();
493
+ this.getProcessHistory();
494
+ },
495
+ saveBusinessForm() {
496
+ this.businessFormSave(() => {
497
+ })
498
+ },
499
+ getAttachList() {
500
+ const self = this
501
+ const param = {
502
+ procId: this.procId,
503
+ applyId: this.applyId
504
+ }
505
+ ajax.get(self.smartFlowServerContext + '/manage/processDone/getAttachmentList', {params: param}).then(function (resp) {
506
+ self.attachmentList = resp.data.data.rows
507
+ self.attachmentList.forEach(item => {
508
+ const index = item.fileName.lastIndexOf(".")
509
+ const fileType = item.fileName.substr(index + 1).toLowerCase()
510
+ const imageList = ['jpg', 'gif', 'png', 'svg']
511
+ const docList = ['doc', 'docx']
512
+ const zipList = ['rar', 'zip']
513
+ const typeList = ['jpg', 'gif', 'png', 'docx']
514
+ item.fileType = imageList.indexOf(fileType) !== -1 ? 'image' : docList.indexOf(fileType) !== -1 ? 'doc' : zipList.indexOf(fileType) !== -1 ? 'zip' : fileType
515
+ item.showPreview = typeList.indexOf(fileType) !== -1
516
+ })
517
+ }).catch(err => {
518
+ console.log(err);
519
+ })
520
+ },
521
+ getTodoTaskId() {
522
+ const self = this
523
+ let param = {
524
+ procId: this.procId,
525
+ applyId: this.applyId,
526
+ taskNode:this.taskNode
527
+ }
528
+ ajax.get(self.smartFlowServerContext + "/manage/processTodo/list", {params: param}).then(function (resp) {
529
+ if (resp.data.code === '200') {
530
+ self.taskId = resp.data.data.rows[0].taskId
531
+ self.instanceId = resp.data.data.rows[0].procInstanceId
532
+ } else {
533
+ self.$Message.error(resp.data.message)
534
+ }
535
+ }).catch((err) => {
536
+ console.log(err)
537
+ })
538
+ },
539
+ getDoneTaskId() {
540
+ const self = this
541
+ let param = {
542
+ procId: this.procId,
543
+ applyId: this.applyId,
544
+ taskNode:this.taskNode
545
+ }
546
+ ajax.get(self.smartFlowServerContext + "/manage/processDone/getDoneDetail", {params: param}).then(function (resp) {
547
+ if (resp.data.code === '200') {
548
+ let rows = resp.data.data.rows
549
+ if (rows.length > 0) {
550
+ self.hisAuditOpinion = []
551
+ let taskList = resp.data.data.rows
552
+ taskList.forEach(item => {
553
+ self.hisAuditOpinion.push({
554
+ auditOpinion: item.auditComment,
555
+ auditTime: timestampToTime(item.auditDate)
556
+ })
557
+ })
558
+ self.taskId = taskList[0].taskId
559
+ self.instanceId = taskList[0].procInstanceId
560
+ } else {
561
+ ajax.get(self.smartFlowServerContext + "/manage/processTodo/list", {params: param}).then(function (todoResp) {
562
+ if (todoResp.data.code === '200') {
563
+ self.taskId = todoResp.data.data.rows[0].taskId
564
+ self.instanceId = todoResp.data.data.rows[0].procInstanceId
565
+ } else {
566
+ self.$Message.error(todoResp.data.message)
567
+ }
568
+ }).catch((err) => {
569
+ console.log(err)
570
+ })
571
+ }
572
+ } else {
573
+ self.$Message.error(resp.data.message)
574
+ }
575
+ }).catch((err) => {
576
+ console.log(err)
577
+ })
578
+ },
579
+ getHandleButtons() {
580
+ const self = this
581
+ let param = {
582
+ procId: this.procId,
583
+ taskNode: this.taskNode
584
+ }
585
+ ajax.post(self.smartFlowServerContext + '/manage/approvalCenter/getNodeData', param).then(function (resp) {
586
+ if (resp.data.code === '200') {
587
+ self.handleButtons = resp.data.data[0].handleButtons
588
+ } else {
589
+ self.$Message.error(resp.data.message)
590
+ }
591
+ }).catch((err) => {
592
+ console.log(err)
593
+ })
594
+ },
595
+ handleSaveResult(saveResult) {
596
+ if (saveResult) {
597
+ this.executeButtonAction((execResult, instanceId, taskId) => {
598
+ if (this.executionCompleted) {
599
+ this.executionCompleted(execResult, instanceId, taskId);
600
+ }
601
+ });
602
+ } else {
603
+ console.error('保存失败');
604
+ }
605
+ },
606
+ executeButtonAction(callback) {
607
+ const self = this;
608
+ if (self.auditResult == '82') {
609
+ self.assigneeBoxData = self.auditParams
610
+ self.$refs.assigneeHelpBox.toggleShowHelpBox();
611
+ } else if (self.auditResult == '80') {
612
+ self.getNodesBehind()
613
+ } else if (self.auditResult == '90') {
614
+ self.getAllPreNodes()
615
+ } else if (self.auditResult == '40') {
616
+ self.loading = true
617
+ self.disable = true
618
+ let url = self.smartFlowServerContext + '/manage/processTodo/getPreNode'
619
+ ajax.post(url, self.auditParams).then(function (resp) {
620
+ let result = resp.data
621
+ if (result.code == '30010') {
622
+ self.$Modal.confirm({
623
+ title: "提示",
624
+ content: result.message,
625
+ onOk: () => {
626
+ self.auditParams.auditResult = '70'
627
+ let url = self.smartFlowServerContext + '/manage/processTodo/audit'
628
+ ajax.post(url, self.auditParams).then(function (resp) {
629
+ let result = resp.data
630
+ if (result.code == '200') {
631
+ self.loading = false
632
+ self.disable = false
633
+ self.$Message.success(result.message);
634
+ //后端没有返回数据
635
+ callback(true, null, null);
636
+ bus.$emit('triggerTimer')
637
+ } else {
638
+ self.loading = false
639
+ self.disable = false
640
+ self.$Message.error(result.message)
641
+ callback(false, null, null);
642
+ }
643
+ bus.$emit('triggerTimer')
644
+ })
645
+ },
646
+ onCancel: () => {
647
+ self.loading = false
648
+ self.disable = false
649
+ }
650
+ })
651
+ } else {
652
+ self.loading = true
653
+ self.disable = true
654
+ let url = self.smartFlowServerContext + '/manage/processTodo/audit'
655
+ ajax.post(url, self.auditParams).then(function (resp) {
656
+ let result = resp.data
657
+ if (result.code == '200') {
658
+ self.loading = false
659
+ self.disable = false
660
+ self.$Message.success(result.message);
661
+ if (result.data){
662
+ callback(true, result.data.processInstanceId, result.data.id)
663
+ }else {
664
+ callback(true, null, null)
665
+ }
666
+ } else {
667
+ self.loading = false
668
+ self.disable = false
669
+ self.$Message.error(result.message)
670
+ callback(false, null, null);
671
+ }
672
+ bus.$emit('triggerTimer')
673
+ })
674
+ }
675
+ })
676
+ } else {
677
+ self.loading = true
678
+ self.disable = true
679
+ let url = self.smartFlowServerContext + '/manage/processTodo/audit'
680
+ ajax.post(url, self.auditParams).then(function (resp) {
681
+ let result = resp.data
682
+ if (result.code == '200') {
683
+ self.loading = false
684
+ self.disable = false
685
+ if (result.data){
686
+ callback(true, result.data.processInstanceId, result.data.id)
687
+ }else {
688
+ callback(true, null, null)
689
+ }
690
+ self.$Message.success(result.message);
691
+ } else if (result.code == '20002') {
692
+ // 流程结束
693
+ self.loading = false
694
+ self.disable = false
695
+ callback(true, null, null)
696
+ self.$Message.success(result.message)
697
+ } else {
698
+ self.loading = false
699
+ self.disable = false
700
+ callback(false, null, null)
701
+ self.$Message.error(result.message)
702
+ }
703
+ bus.$emit('triggerTimer')
704
+ })
705
+
706
+ }
707
+ },
708
+
709
+ doSearch() {
710
+ //不需要实现,是子组件assigneeBox要求使用父组件的这个方法
711
+ },
712
+ tabsChange(tab) {
713
+ console.log(tab)
714
+ },
715
+ audit: function (auditResult) {
716
+ let self = this
717
+ self.auditResult = auditResult
718
+ self.submit()
719
+ },
720
+ getAttach(row) {
721
+ window.open(this.smartFlowServerContext + "/manage/oss/file/get/" + row.fileId, "_blank");
722
+ },
723
+ preViewAttach(row) {
724
+ let reg = /\.(gif|jpg|jpeg|bmp|png|PNG)$/
725
+ let regs = /\.(pdf)$/
726
+ if (reg.test(row.fileName)) {
727
+ let url = this.smartFlowServerContext + "/manage/oss/file/get/" + row.fileId;
728
+ this.imgPreview(url);
729
+ } else if (regs.test(row.fileName)) {
730
+ window.open(this.smartFlowServerContext + "/manage/oss/file/getFileStream?fileId=" + row.fileId, "_blank");
731
+ } else {
732
+ this.modalDocx = true
733
+ axios({
734
+ method: 'get',
735
+ responseType: 'blob', // 因为是流文件,所以要指定blob类型
736
+ url: this.smartFlowServerContext + "/manage/oss/file/get/" + row.fileId// 一个word下载文件的接口
737
+ }).then(({data}) => {
738
+ docx.renderAsync(data, this.$refs.file, null, {
739
+ className: "docx", //默认和文档样式类的类名/前缀
740
+ inWrapper: true, //启用围绕文档内容呈现包装器
741
+ ignoreWidth: false, //禁用页面的渲染宽度
742
+ ignoreHeight: false, //禁用页面的渲染高度
743
+ ignoreFonts: false, //禁用字体渲染
744
+ breakPages: true, //在分页符上启用分页
745
+ ignoreLastRenderedPageBreak: true, //在lastRenderedPageBreak元素上禁用分页
746
+ experimental: false, //启用实验功能(制表符停止计算)
747
+ trimXmlDeclaration: true, //如果为true,则在解析之前将从xml文档中删除xml声明
748
+ useBase64URL: false, //如果为true,图像、字体等将转换为base 64 URL,否则使用URL.createObjectURL
749
+ useMathMLPolyfill: false, //包括用于铬、边等的MathML多填充。
750
+ showChanges: false, //启用文档更改的实验渲染(插入/删除)
751
+ debug: false, //启用额外的日志记录
752
+ })
753
+ }
754
+ )
755
+ }
756
+ },
757
+ imgPreview(url) {
758
+ this.imageUrl = url;
759
+ this.modalVisible = true;
760
+ },
761
+ submit() {
762
+ let self = this;
763
+
764
+ self.auditParams = {
765
+ procId: self.procId,
766
+ applyId: self.applyId,
767
+ taskId: self.taskId,
768
+ auditOpinion: self.form.auditOpinion,
769
+ fileListStr: JSON.stringify(self.fileList),
770
+ auditResult: self.auditResult,
771
+ params: JSON.stringify(self.datas),
772
+ targetTaskNode: self.targetTaskNode,
773
+ selectedUserId: self.selectedUserId,
774
+ }
775
+ if (self.auditResult == '' || self.auditResult == null) {
776
+ self.$Message.error("请选择审批结果!");
777
+ return;
778
+ }
779
+ if (self.form.auditOpinion == '' || self.form.auditOpinion == null) {
780
+ if (!self.handleButtons || self.handleButtons.includes('auditOpinion')) {
781
+ self.$Message.error("请输入审批意见!")
782
+ return;
783
+ } else {
784
+ self.auditParams.auditOpinion = self.handleButtonsNames[self.auditResult];
785
+ }
786
+ }
787
+
788
+ self.businessFormSave ? self.businessFormSave(self.handleSaveResult) : self.handleSaveResult(true)
789
+ },
790
+
791
+ //打印流程图信息
792
+ processPrint() {
793
+ let self = this
794
+ let params = {
795
+ applyId: self.applyId,
796
+ instanceId: self.instanceId,
797
+ procId: self.procId,
798
+ taskId: self.taskId,
799
+ }
800
+ ajax.get(self.smartFlowServerContext + '/manage/processTodo/getPrintData', {params: params}).then(function (resp) {
801
+ let result = resp.data.data
802
+ if (resp.data.code === '200') {
803
+ let tableData = result
804
+ self.process.tableData = tableData
805
+ self.process.applyId = self.applyId
806
+ self.process.instanceId = self.instanceId
807
+ self.process.procId = self.procId
808
+ self.datas.orgId = tableData[0].orgId
809
+ self.datas.orgName = tableData[0].orgName
810
+ self.modalBoxShow = true
811
+ }
812
+ })
813
+ },
814
+
815
+ pageGoBack() {
816
+ bus.$emit('triggerTimer')
817
+ window.history.back()
818
+ },
819
+
820
+ getHisAudit() {
821
+ let self = this
822
+ let params = {
823
+ applyId: self.applyId,
824
+ instanceId: self.instanceId,
825
+ procId: self.procId,
826
+ taskId: self.taskId
827
+ }
828
+ ajax.get(self.smartFlowServerContext + '/manage/processTodo/getHisAudit', {params: params}).then(function (resp) {
829
+ if (resp.data.code === '200') {
830
+ self.hisAudit = resp.data.data
831
+ let uniqueDataMap = {};
832
+ self.hisAudit.forEach((item) => {
833
+ uniqueDataMap[item["taskNode"]] = item;
834
+ })
835
+ self.hisNode = Object.values(uniqueDataMap);
836
+
837
+ }
838
+ })
839
+ },
840
+ showTaskNode(taskId) {
841
+ if (this.processHistory.length > 0) {
842
+ let task = null
843
+ this.processHistory.some(itemList => {
844
+ task = itemList.find(item => item.taskId === taskId);
845
+ return task !== undefined;
846
+ });
847
+ return task ? task.taskName : ''
848
+ }
849
+ return ''
850
+ },
851
+ getProcessHistory() {
852
+ let self = this
853
+ let params = {
854
+ applyId: self.applyId,
855
+ instanceId: self.instanceId,
856
+ procId: self.procId,
857
+ taskId: self.taskId
858
+ }
859
+ ajax.get(self.smartFlowServerContext + '/manage/processTodo/getProcessHis', {params: params}).then(function (resp) {
860
+ if (resp.data.code === '200') {
861
+ self.processHistory = resp.data.data
862
+ }
863
+ })
864
+ },
865
+ cancel() {
866
+ this.modal = false
867
+ this.auditResult = '';
868
+ },
869
+ ok() {
870
+ this.modal = false
871
+ if (this.targetTaskNode == '' || this.targetTaskNode == null) {
872
+ this.auditResult = '';
873
+ this.$Message.error("请选择审批节点!");
874
+ } else {
875
+ let self = this;
876
+
877
+ self.auditParams = {
878
+ procId: self.procId,
879
+ applyId: self.applyId,
880
+ taskId: self.taskId,
881
+ auditOpinion: self.form.auditOpinion,
882
+ fileListStr: JSON.stringify(self.fileList),
883
+ auditResult: self.auditResult,
884
+ params: JSON.stringify(self.datas),
885
+ targetTaskNode: self.targetTaskNode,
886
+ selectedUserId: self.selectedUserId,
887
+ }
888
+ self.loading = true
889
+ self.disable = true
890
+
891
+ let url = self.smartFlowServerContext + '/manage/processTodo/audit'
892
+ ajax.post(url, self.auditParams).then(function (resp) {
893
+ let result = resp.data
894
+ if (result.code === '200') {
895
+ setTimeout(() => {
896
+ self.loading = false
897
+ self.disable = false
898
+ self.$Message.success("审批成功");
899
+ if (self.executionCompleted) {
900
+ self.executionCompleted(true, result.data.processInstanceId, result.data.id);
901
+ }
902
+ bus.$emit('triggerTimer')
903
+ }, 500)
904
+ } else {
905
+ self.loading = false
906
+ self.disable = false
907
+ self.$Message.error(result.message)
908
+ if (self.executionCompleted) {
909
+ self.executionCompleted(false, null, null);
910
+ }
911
+ }
912
+ })
913
+ }
914
+ },
915
+ selectNode(currentRow, oldCurrentRow) {
916
+ let self = this
917
+ self.targetTaskNode = currentRow.taskNode
918
+ },
919
+ getAllPreNodes() {
920
+ let self = this
921
+ let params = {
922
+ processDefId: self.procId,
923
+ taskId: self.taskId,
924
+ }
925
+ ajax.get(self.smartFlowServerContext + '/manage/processTodo/getAllPreNodes', {params: params}).then(function (resp) {
926
+ if (resp.data.code === '200') {
927
+ if (resp.data.data.length > 0){
928
+ self.allNode = resp.data.data
929
+ self.modal1 = true
930
+ }else {
931
+ self.$Message.warning('当前流程无前序节点')
932
+ }
933
+ } else {
934
+ self.$Message.error(resp.data.message)
935
+ }
936
+ })
937
+ },
938
+ getNodesBehind() {
939
+ let self = this
940
+ let params = {
941
+ processDefId: self.procId,
942
+ taskId: self.taskId,
943
+ }
944
+ ajax.get(self.smartFlowServerContext + '/manage/processTodo/getNodesBehind', {params: params}).then(function (resp) {
945
+ if (resp.data.code === '200') {
946
+ if (resp.data.data.length > 0){
947
+ self.allNode = resp.data.data
948
+ self.modal1 = true
949
+ }else {
950
+ self.$Message.warning('当前流程无后续节点')
951
+ }
952
+ } else {
953
+ self.$Message.error(resp.data.message)
954
+ }
955
+ })
956
+ },
957
+ handleSelectedUser(userId) {
958
+ this.selectedUserId = userId;
959
+ },
960
+
961
+ //折叠动画效果
962
+ beforeEnter(el) {
963
+ el.style.height = '0';
964
+ },
965
+ enter(el, done) {
966
+ setTimeout(() => {
967
+ el.style.height = el.scrollHeight + 'px';
968
+ }, 0);
969
+
970
+ el.addEventListener('transitionend', done);
971
+ },
972
+ beforeLeave(el) {
973
+ el.style.height = el.scrollHeight + 'px';
974
+ },
975
+ leave(el, done) {
976
+ setTimeout(() => {
977
+ el.style.height = '0';
978
+ }, 0);
979
+
980
+ el.addEventListener('transitionend', done);
981
+ },
982
+
983
+ beforeFlowInfoEnter(el) {
984
+ el.style.transform = 'translateX(100%)';
985
+ },
986
+ flowInfoEnter(el, done) {
987
+ const transitionDuration = 0.5;
988
+ el.style.transition = `transform ${transitionDuration}s`;
989
+ el.style.transform = 'translateX(0)';
990
+ el.addEventListener('transitionend', done);
991
+ },
992
+ beforeFlowInfoLeave(el) {
993
+ el.style.transform = 'translateX(0)';
994
+ },
995
+ flowInfoLeave(el, done) {
996
+ const transitionDuration = 0.5;
997
+ el.style.transition = `transform ${transitionDuration}s`;
998
+ el.style.transform = 'translateX(100%)';
999
+ el.addEventListener('transitionend', done);
1000
+ },
1001
+ uploadFile(file){
1002
+ const self = this;
1003
+ self.fileList = []
1004
+ file.forEach(item => {
1005
+ self.fileList.push({
1006
+ fileName: item.fileName,
1007
+ fileId: item.fileCode,
1008
+ });
1009
+ })
1010
+ },
1011
+ },
1012
+ watch: {
1013
+ auditOpinionText(label) {
1014
+ this.form.auditOpinion = label;
1015
+ },
1016
+ procId(val) {
1017
+ this.procId = val;
1018
+ this.initData()
1019
+ },
1020
+ }
1021
+ }
1022
+ </script>
1023
+
1024
+ <style lang="less" scoped>
1025
+ @import "./styles/css/index.less";
1026
+ /deep/ .ivu-table-row-highlight td {
1027
+ background-color: #50c1ff !important;
1028
+ color: #fff !important;
1029
+ }
1030
+ /deep/ .ivu-card-body{
1031
+ padding: 10px;
1032
+ }
1033
+ .page-info /deep/ .page-body{
1034
+ overflow-y: hidden;
1035
+ }
1036
+ </style>