@lambo-design/workflow-approve 1.0.0-beta.4 → 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,934 +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="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 @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" :model="form"
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="form.auditOpinion" :attachmentFile="handleButtons.includes('attachmentFile')" :attachmentdata="fileList"
38
- :smart-flow-server-context="smartFlowServerContext"></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="process-history" dis-hover :bordered="false"
55
- v-if="!handleButtons || handleButtons.includes('auditHistory')">
56
- <processHistory :portrait-width="portraitWidth" :list="processHistory"
57
- :smart-flow-server-context="smartFlowServerContext"></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="attach-card">
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="attach-avatar" style="background-color: #005aff" :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="attach-avatar" style="background-color: #005aff" :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="attach-avatar" style="background-color: #19be6b" :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="attach-avatar" style="background-color: #ed4014" :style="portraitWidth >= 600 ? 'margin-left: 10px' : ''"
88
- :size="portraitWidth >= 600 ? 'middle' : 'small'"></avatar>
89
- <avatar v-else icon="ios-document-outline" class="attach-avatar" :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="attach-name-style"> {{ 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 title="查看附件" v-model="modalVisible" fullscreen scrollable :mask="false">
125
- <img :src="imageUrl" v-if="modalVisible" alt="" style="width: 100%">
126
- <div slot="footer">
127
- <Button type="primary" @click="modalVisible = false">关闭</Button>
128
- </div>
129
- </Modal>
130
- <Modal title="查看附件" v-model="modalDocx" fullscreen scrollable :mask="false">
131
- <div ref="file" ></div>
132
- </Modal>
133
- <Modal v-model="modal1" title="选择节点"
134
- @on-cancel="cancel"
135
- @on-ok="ok">
136
- <Table border
137
- :data="allNode"
138
- :columns="nodeColumn"
139
- highlight-row
140
- @on-current-change="selectNode">
141
- </Table>
142
- </Modal>
143
- <assigneeBox ref="assigneeHelpBox" :executionCompleted="executionCompleted" @update-selected="handleSelectedUser"
144
- :data="assigneeBoxData" :smart-flow-server-context="smartFlowServerContext" :upms-server-context="upmsServerContext"/>
145
- <Modal v-model="modalBoxShow" width="1000" title="流程跟踪图">
146
- <Workflow_Diagram ref="processTrace" :instanceId="process.instanceId" :applyId="process.applyId"
147
- :procId="process.procId"
148
- :tableData="process.tableData" :hisAudit="hisAudit"
149
- :smart-flow-server-context="smartFlowServerContext">
150
- </Workflow_Diagram>
151
- </Modal>
152
- </lamboIndicatorCard>
153
- </transition>
154
- <template slot="page-footer">
155
- <div>
156
- <slot name="footer-button"></slot>
157
- <Button style="margin-left: 10px;" v-if="!handleButtons || handleButtons.includes('auditTo70')"
158
- :disabled="disable" :loading="loading" @click="audit('70')">驳回到原点
159
- </Button>
160
- <Button style="margin-left: 10px;" v-if="!handleButtons || handleButtons.includes('auditTo40')"
161
- :disabled="disable" :loading="loading" @click="audit('40')">驳回到上一级
162
- </Button>
163
- <Button style="margin-left: 10px;" v-if="!handleButtons || handleButtons.includes('auditTo90')"
164
- :disabled="disable" :loading="loading" @click="audit('90')">驳回指定节点
165
- </Button>
166
- <Button style="margin-left: 10px;" v-if="!handleButtons || handleButtons.includes('auditTo80')"
167
- :disabled="disable" :loading="loading" @click="audit('80')">跳转指定节点
168
- </Button>
169
- <Button style="margin-left: 10px;" v-if="!handleButtons || handleButtons.includes('auditTo82')"
170
- :disabled="disable" :loading="loading" @click="audit('82')">指定他人处理
171
- </Button>
172
- <Button style="margin-left: 10px;" v-if="!handleButtons || handleButtons.includes('auditTo50')"
173
- :disabled="disable" :loading="loading" @click="audit('50')">直接结束流程
174
- </Button>
175
- <Button style="margin-left: 10px;" v-if="!handleButtons || handleButtons.includes('processTrace')"
176
- @click="processPrint" >流程跟踪图</Button>
177
- <Button style="margin-left: 10px;" v-if="!handleButtons || handleButtons.includes('auditTo30')"
178
- :disabled="disable" :loading="loading" type="primary" @click="audit('30')">通过
179
- </Button>
180
- </div>
181
- </template>
182
- </LamboPageContainer>
183
- </template>
184
-
185
-
186
- <script>
187
- import LamboPageContainer from '@lambo-design/page-container'
188
- import LamboIndicatorCard from '@lambo-design/indicator-card'
189
- import Workflow_Diagram from './workflow-diagram'
190
- import ajax from "@lambo-design/shared/utils/ajax";
191
- import { operateBtn } from '@lambo-design/shared/utils/assist';
192
- import bus from '@lambo-design/shared/utils/bus';
193
- import Title from "./components/title";
194
- import processHistory from "./components/history";
195
- import assigneeBox from "./components/assignee-box";
196
- import LamboPagingTable from "@lambo-design/paging-table";
197
- import AuditOpinion from "./components/opinion";
198
- import axios from "axios";
199
-
200
- // 引入docx-preview插件
201
- let docx = require('docx-preview');
202
-
203
-
204
- export default {
205
- props: {
206
- width: {
207
- type: Number,
208
- required: false,
209
- default: 400
210
- },
211
- procId: {
212
- type: String,
213
- required: true,
214
- },
215
- taskNode: {
216
- type: String,
217
- required: true,
218
- },
219
- applyId: {
220
- type: String,
221
- required: true,
222
- },
223
- //业务表单保存方法
224
- businessFormSave: {
225
- type: Function,
226
- required: false
227
- },
228
- //按钮执行完毕回调方法
229
- executionCompleted: {
230
- type: Function,
231
- required: false,
232
- },
233
- title:{
234
- type: String,
235
- default: "流程办理"
236
- },
237
- smartFlowServerContext: {
238
- type: String,
239
- default: '/api/smart-flow-server',
240
- },
241
- upmsServerContext: {
242
- type: String,
243
- default: '/api/upms-server',
244
- },
245
- },
246
- components: {
247
- Title,
248
- LamboPageContainer,
249
- Workflow_Diagram,
250
- processHistory,
251
- assigneeBox,
252
- LamboPagingTable,
253
- AuditOpinion,
254
- LamboIndicatorCard
255
- },
256
- data() {
257
- return {
258
- isExpanded: true,
259
- portraitWidth: 0,
260
- requestSuccessCodes: [200, "200"],
261
- auditShow: true,
262
- historyShow: true,
263
- attachListShow: true,
264
- attachmentList: [],
265
- modalVisible: false,
266
- modalDocx: false,
267
- imageUrl: '',
268
- assigneeBoxData: {},
269
- selectedUserId: '',
270
- targetTaskNode: '',
271
- allNode: [],
272
- auditParams: {},
273
- modal1: false,
274
- modalBoxShow: false,
275
- hisNode: [],
276
- processHistory: [],
277
- ruleValidate: {
278
- auditOpinion: [{required: true, trigger: "blur", message: "审批意见不能为空"}]
279
- },
280
- form: {
281
- auditOpinion: '',
282
- },
283
- loading: false,
284
- disable: false,
285
- instanceId: '',
286
- taskId: '',
287
- handleButtons: [],
288
- auditResult: '',
289
- custChange: 'auditInfo',
290
- auditInfo: "auditInfo",
291
- auditProcess: "auditProcess",
292
- fileList: [],
293
- hisAudit: [],
294
- datas: {
295
- orgName: "",
296
- orgId: ""
297
- },
298
- editForm: {
299
- approvalCost: '',
300
- cost: '',
301
- activityDate: []
302
- },
303
- process: {
304
- tableData: [],
305
- instanceId: '',
306
- applyId: '',
307
- procId: ''
308
- },
309
- handleButtonsNames: {
310
- '30': '同意',
311
- '70': '驳回原点',
312
- '40': '驳回上一节点',
313
- '90': '驳回指定节点',
314
- '80': '跳转指定节点',
315
- '82': '转办',
316
- '50': '人工终止'
317
- },
318
- }
319
-
320
- },
321
-
322
- mounted() {
323
- this.getWidth()
324
- if (this.procId){
325
- this.initData()
326
- }
327
-
328
- },
329
- computed: {
330
- nodeColumn: function () {
331
- let column = []
332
- column.push({title: '序号', type: 'index', width: 70, align: 'center', fixed: 'left'});
333
- column.push({title: '节点名称', key: 'taskName', minWidth: 150, align: 'center', fixed: 'left'})
334
-
335
- column.push({
336
- title: '节点状态', key: 'auditResult', minWidth: 150, align: 'center', fixed: 'left',
337
- render: (h, params) => {
338
- if (params.row.taskNode == this.taskNode) {
339
- return h('div', [
340
- h('tag', {
341
- props: {
342
- color: '#ff9900'
343
- }
344
- }, '当前节点')
345
- ])
346
- } else if (!params.row.auditResult) {
347
- return h('div', [
348
- h('tag', {
349
- props: {
350
- color: '#ff9900'
351
- }
352
- }, '未审批')
353
- ])
354
- } else {
355
- if (params.row.auditResult == '30' && params.row.taskNode != this.taskNode) {
356
- return h('div', [
357
- h('tag', {
358
- props: {
359
- color: '#19be6b'
360
- }
361
- }, '已审批通过')
362
- ])
363
- } else if (params.row.auditResult == '40' && params.row.taskNode != this.taskNode) {
364
- return h('div', [
365
- h('tag', {
366
- props: {
367
- color: '#ed4014'
368
- }
369
- }, '已驳回到上一节点')
370
- ])
371
- } else if (params.row.auditResult == '60' && params.row.taskNode != this.taskNode) {
372
- return h('div', [
373
- h('tag', {
374
- props: {
375
- color: '#ed4014'
376
- }
377
- }, '已撤回')
378
- ])
379
- } else if (params.row.auditResult == '80' && params.row.taskNode != this.taskNode) {
380
- return h('div', [
381
- h('tag', {
382
- props: {
383
- color: '#19be6b'
384
- }
385
- }, '已跳转到指定节点')
386
- ])
387
- } else if (params.row.auditResult == '80' && params.row.taskNode != this.taskNode) {
388
- return h('div', [
389
- h('tag', {
390
- props: {
391
- color: '#19be6b'
392
- }
393
- }, '已驳回到指定节点')
394
- ])
395
- }
396
- }
397
- }
398
- })
399
- column.push({
400
- title: "操作", width: 100, align: 'center',
401
- render: (h, params) => {
402
- return h('div', [
403
- h('Button', {
404
- props: {
405
- type: 'primary',
406
- size: 'small'
407
- },
408
- style: {
409
- marginRight: '5px'
410
- },
411
- on: {
412
- click: () => {
413
- this.selectNode(params.row)
414
- }
415
- }
416
- }, '选择')
417
- ])
418
- },
419
- })
420
- return column
421
- },
422
-
423
- },
424
- provide() {
425
- return {
426
- toBeDoneListDoSearch: this.doSearch
427
- };
428
- },
429
- methods: {
430
- getWidth() {
431
- if (this.width && this.width < 400) {
432
- this.portraitWidth = 400
433
- }
434
- this.portraitWidth = this.width
435
- },
436
- initData(){
437
- this.getAttachList()
438
- this.getTaskId()
439
- this.getHandleButtons()
440
- this.getHisAudit();
441
- this.getProcessHistory();
442
- },
443
- saveBusinessForm() {
444
- this.businessFormSave(() => {
445
- })
446
- },
447
- getAttachList() {
448
- const self = this
449
- const param = {
450
- procId: this.procId,
451
- applyId: this.applyId
452
- }
453
- ajax.get(self.smartFlowServerContext + '/manage/processDone/getAttachmentList', {params: param}).then(function (resp) {
454
- self.attachmentList = resp.data.data.rows
455
- self.attachmentList.forEach(item => {
456
- const index = item.fileName.lastIndexOf(".")
457
- const fileType = item.fileName.substr(index + 1).toLowerCase()
458
- const imageList = ['jpg', 'gif', 'png', 'svg']
459
- const docList = ['doc', 'docx']
460
- const zipList = ['rar', 'zip']
461
- const typeList = ['jpg', 'gif', 'png', 'docx']
462
- item.fileType = imageList.indexOf(fileType) !== -1 ? 'image' : docList.indexOf(fileType) !== -1 ? 'doc' : zipList.indexOf(fileType) !== -1 ? 'zip' : fileType
463
- item.showPreview = typeList.indexOf(fileType) !== -1
464
- })
465
- }).catch(err => {
466
- console.log(err);
467
- })
468
- },
469
- getTaskId() {
470
- const self = this
471
- let param = {
472
- procId: this.procId,
473
- applyId: this.applyId,
474
- taskNode:this.taskNode
475
- }
476
- ajax.get(self.smartFlowServerContext + "/manage/processTodo/list", {params: param}).then(function (resp) {
477
- if (resp.data.code === '200') {
478
- self.taskId = resp.data.data.rows[0].taskId
479
- self.instanceId = resp.data.data.rows[0].procInstanceId
480
- } else {
481
- self.$Message.error(resp.data.message)
482
- }
483
- }).catch((err) => {
484
- console.log(err)
485
- })
486
- },
487
- getHandleButtons() {
488
- const self = this
489
- let param = {
490
- procId: this.procId,
491
- taskNode: this.taskNode
492
- }
493
- ajax.post(self.smartFlowServerContext + '/manage/approvalCenter/getNodeData', param).then(function (resp) {
494
- if (resp.data.code === '200') {
495
- self.handleButtons = resp.data.data[0].handleButtons
496
- } else {
497
- self.$Message.error(resp.data.message)
498
- }
499
- }).catch((err) => {
500
- console.log(err)
501
- })
502
- },
503
- handleSaveResult(saveResult) {
504
- if (saveResult) {
505
- this.executeButtonAction((execResult, instanceId, taskId) => {
506
- if (this.executionCompleted) {
507
- this.executionCompleted(execResult, instanceId, taskId);
508
- }
509
- });
510
- } else {
511
- console.error('保存失败');
512
- }
513
- },
514
- executeButtonAction(callback) {
515
- const self = this;
516
- if (self.auditResult == '82') {
517
- self.assigneeBoxData = self.auditParams
518
- self.$refs.assigneeHelpBox.toggleShowHelpBox();
519
- } else if (self.auditResult == '80') {
520
- self.getNodesBehind()
521
- } else if (self.auditResult == '90') {
522
- self.getAllPreNodes()
523
- } else if (self.auditResult == '40') {
524
- self.loading = true
525
- self.disable = true
526
- let url = self.smartFlowServerContext + '/manage/processTodo/getPreNode'
527
- ajax.post(url, self.auditParams).then(function (resp) {
528
- let result = resp.data
529
- if (result.code == '30010') {
530
- self.$Modal.confirm({
531
- title: "提示",
532
- content: result.message,
533
- onOk: () => {
534
- self.auditParams.auditResult = '70'
535
- let url = self.smartFlowServerContext + '/manage/processTodo/audit'
536
- ajax.post(url, self.auditParams).then(function (resp) {
537
- let result = resp.data
538
- if (result.code == '200') {
539
- self.loading = false
540
- self.disable = false
541
- self.$Message.success(result.message);
542
- //后端没有返回数据
543
- callback(true, null, null);
544
- bus.$emit('triggerTimer')
545
- } else {
546
- self.loading = false
547
- self.disable = false
548
- self.$Message.error(result.message)
549
- callback(false, null, null);
550
- }
551
- bus.$emit('triggerTimer')
552
- })
553
- },
554
- onCancel: () => {
555
- self.loading = false
556
- self.disable = false
557
- }
558
- })
559
- } else {
560
- self.loading = true
561
- self.disable = true
562
- let url = self.smartFlowServerContext + '/manage/processTodo/audit'
563
- ajax.post(url, self.auditParams).then(function (resp) {
564
- let result = resp.data
565
- if (result.code == '200') {
566
- self.loading = false
567
- self.disable = false
568
- self.$Message.success(result.message);
569
- if (result.data){
570
- callback(true, result.data.processInstanceId, result.data.id)
571
- }else {
572
- callback(true, null, null)
573
- }
574
- } else {
575
- self.loading = false
576
- self.disable = false
577
- self.$Message.error(result.message)
578
- callback(false, null, null);
579
- }
580
- bus.$emit('triggerTimer')
581
- })
582
- }
583
- })
584
- } else {
585
- self.loading = true
586
- self.disable = true
587
- let url = self.smartFlowServerContext + '/manage/processTodo/audit'
588
- ajax.post(url, self.auditParams).then(function (resp) {
589
- let result = resp.data
590
- if (result.code == '200') {
591
- self.loading = false
592
- self.disable = false
593
- if (result.data){
594
- callback(true, result.data.processInstanceId, result.data.id)
595
- }else {
596
- callback(true, null, null)
597
- }
598
- self.$Message.success(result.message);
599
- } else if (result.code == '20002') {
600
- // 流程结束
601
- self.loading = false
602
- self.disable = false
603
- callback(true, null, null)
604
- self.$Message.success(result.message)
605
- } else {
606
- self.loading = false
607
- self.disable = false
608
- callback(false, null, null)
609
- self.$Message.error(result.message)
610
- }
611
- bus.$emit('triggerTimer')
612
- })
613
-
614
- }
615
- },
616
-
617
- doSearch() {
618
- //不需要实现,是子组件assigneeBox要求使用父组件的这个方法
619
- },
620
- tabsChange(tab) {
621
- console.log(tab)
622
- },
623
- audit: function (auditResult) {
624
- let self = this
625
- self.auditResult = auditResult
626
- self.submit()
627
- },
628
- getAttach(row) {
629
- window.open(this.smartFlowServerContext + "/manage/oss/file/get/" + row.fileId, "_blank");
630
- },
631
- preViewAttach(row) {
632
- let reg = /\.(gif|jpg|jpeg|bmp|png|PNG)$/
633
- let regs = /\.(pdf)$/
634
- if (reg.test(row.fileName)) {
635
- let url = this.smartFlowServerContext + "/manage/oss/file/get/" + row.fileId;
636
- this.imgPreview(url);
637
- } else if (regs.test(row.fileName)) {
638
- window.open(this.smartFlowServerContext + "/manage/oss/file/getFileStream?fileId=" + row.fileId, "_blank");
639
- } else {
640
- this.modalDocx = true
641
- axios({
642
- method: 'get',
643
- responseType: 'blob', // 因为是流文件,所以要指定blob类型
644
- url: this.smartFlowServerContext + "/manage/oss/file/get/" + row.fileId// 一个word下载文件的接口
645
- }).then(({data}) => {
646
- docx.renderAsync(data, this.$refs.file, null, {
647
- className: "docx", //默认和文档样式类的类名/前缀
648
- inWrapper: true, //启用围绕文档内容呈现包装器
649
- ignoreWidth: false, //禁用页面的渲染宽度
650
- ignoreHeight: false, //禁用页面的渲染高度
651
- ignoreFonts: false, //禁用字体渲染
652
- breakPages: true, //在分页符上启用分页
653
- ignoreLastRenderedPageBreak: true, //在lastRenderedPageBreak元素上禁用分页
654
- experimental: false, //启用实验功能(制表符停止计算)
655
- trimXmlDeclaration: true, //如果为true,则在解析之前将从xml文档中删除xml声明
656
- useBase64URL: false, //如果为true,图像、字体等将转换为base 64 URL,否则使用URL.createObjectURL
657
- useMathMLPolyfill: false, //包括用于铬、边等的MathML多填充。
658
- showChanges: false, //启用文档更改的实验渲染(插入/删除)
659
- debug: false, //启用额外的日志记录
660
- })
661
- }
662
- )
663
- }
664
- },
665
- imgPreview(url) {
666
- this.imageUrl = url;
667
- this.modalVisible = true;
668
- },
669
- submit() {
670
- let self = this;
671
-
672
- self.auditParams = {
673
- procId: self.procId,
674
- applyId: self.applyId,
675
- taskId: self.taskId,
676
- auditOpinion: self.form.auditOpinion,
677
- fileListStr: JSON.stringify(self.fileList),
678
- auditResult: self.auditResult,
679
- params: JSON.stringify(self.datas),
680
- targetTaskNode: self.targetTaskNode,
681
- selectedUserId: self.selectedUserId,
682
- }
683
- if (self.auditResult == '' || self.auditResult == null) {
684
- self.$Message.error("请选择审批结果!");
685
- return;
686
- }
687
- if (self.form.auditOpinion == '' || self.form.auditOpinion == null) {
688
- if (!self.handleButtons || self.handleButtons.includes('auditOpinion')) {
689
- self.$Message.error("请输入审批意见!")
690
- return;
691
- } else {
692
- self.auditParams.auditOpinion = self.handleButtonsNames[self.auditResult];
693
- }
694
- }
695
-
696
- self.businessFormSave ? self.businessFormSave(self.handleSaveResult) : self.handleSaveResult(true)
697
- },
698
-
699
- //打印流程图信息
700
- processPrint() {
701
- let self = this
702
- let params = {
703
- applyId: self.applyId,
704
- instanceId: self.instanceId,
705
- procId: self.procId,
706
- taskId: self.taskId,
707
- }
708
- ajax.get(self.smartFlowServerContext + '/manage/processTodo/getPrintData', {params: params}).then(function (resp) {
709
- let result = resp.data.data
710
- if (resp.data.code === '200') {
711
- let tableData = result
712
- self.process.tableData = tableData
713
- self.process.applyId = self.applyId
714
- self.process.instanceId = self.instanceId
715
- self.process.procId = self.procId
716
- self.datas.orgId = tableData[0].orgId
717
- self.datas.orgName = tableData[0].orgName
718
- self.modalBoxShow = true
719
- }
720
- })
721
- },
722
-
723
- pageGoBack() {
724
- bus.$emit('triggerTimer')
725
- window.history.back()
726
- },
727
-
728
- getHisAudit() {
729
- let self = this
730
- let params = {
731
- applyId: self.applyId,
732
- instanceId: self.instanceId,
733
- procId: self.procId,
734
- taskId: self.taskId
735
- }
736
- ajax.get(self.smartFlowServerContext + '/manage/processTodo/getHisAudit', {params: params}).then(function (resp) {
737
- if (resp.data.code === '200') {
738
- self.hisAudit = resp.data.data
739
- let uniqueDataMap = {};
740
- self.hisAudit.forEach((item) => {
741
- uniqueDataMap[item["taskNode"]] = item;
742
- })
743
- self.hisNode = Object.values(uniqueDataMap);
744
-
745
- }
746
- })
747
- },
748
- showTaskNode(taskId) {
749
- if (this.processHistory.length > 0) {
750
- let task = null
751
- this.processHistory.some(itemList => {
752
- task = itemList.find(item => item.taskId === taskId);
753
- return task !== undefined;
754
- });
755
- return task ? task.taskName : ''
756
- }
757
- return ''
758
- },
759
- getProcessHistory() {
760
- let self = this
761
- let params = {
762
- applyId: self.applyId,
763
- instanceId: self.instanceId,
764
- procId: self.procId,
765
- taskId: self.taskId
766
- }
767
- ajax.get(self.smartFlowServerContext + '/manage/processTodo/getProcessHis', {params: params}).then(function (resp) {
768
- if (resp.data.code === '200') {
769
- self.processHistory = resp.data.data
770
- }
771
- })
772
- },
773
- cancel() {
774
- this.modal = false
775
- this.auditResult = '';
776
- },
777
- ok() {
778
- this.modal = false
779
- if (this.targetTaskNode == '' || this.targetTaskNode == null) {
780
- this.auditResult = '';
781
- this.$Message.error("请选择审批节点!");
782
- } else {
783
- let self = this;
784
-
785
- self.auditParams = {
786
- procId: self.procId,
787
- applyId: self.applyId,
788
- taskId: self.taskId,
789
- auditOpinion: self.form.auditOpinion,
790
- fileListStr: JSON.stringify(self.fileList),
791
- auditResult: self.auditResult,
792
- params: JSON.stringify(self.datas),
793
- targetTaskNode: self.targetTaskNode,
794
- selectedUserId: self.selectedUserId,
795
- }
796
- self.loading = true
797
- self.disable = true
798
-
799
- let url = self.smartFlowServerContext + '/manage/processTodo/audit'
800
- ajax.post(url, self.auditParams).then(function (resp) {
801
- let result = resp.data
802
- if (result.code === '200') {
803
- setTimeout(() => {
804
- self.loading = false
805
- self.disable = false
806
- self.$Message.success("审批成功");
807
- if (self.executionCompleted) {
808
- self.executionCompleted(true, result.data.processInstanceId, result.data.id);
809
- }
810
- bus.$emit('triggerTimer')
811
- }, 500)
812
- } else {
813
- self.loading = false
814
- self.disable = false
815
- self.$Message.error(result.message)
816
- if (self.executionCompleted) {
817
- self.executionCompleted(false, null, null);
818
- }
819
- }
820
- })
821
- }
822
- },
823
- selectNode(currentRow, oldCurrentRow) {
824
- let self = this
825
- self.targetTaskNode = currentRow.taskNode
826
- },
827
- getAllPreNodes() {
828
- let self = this
829
- let params = {
830
- processDefId: self.procId,
831
- taskId: self.taskId,
832
- }
833
- ajax.get(self.smartFlowServerContext + '/manage/processTodo/getAllPreNodes', {params: params}).then(function (resp) {
834
- if (resp.data.code === '200') {
835
- if (resp.data.data.length > 0){
836
- self.allNode = resp.data.data
837
- self.modal1 = true
838
- }else {
839
- self.$Message.warning('当前流程无前序节点')
840
- }
841
- } else {
842
- self.$Message.error(resp.data.message)
843
- }
844
- })
845
- },
846
- getNodesBehind() {
847
- let self = this
848
- let params = {
849
- processDefId: self.procId,
850
- taskId: self.taskId,
851
- }
852
- ajax.get(self.smartFlowServerContext + '/manage/processTodo/getNodesBehind', {params: params}).then(function (resp) {
853
- if (resp.data.code === '200') {
854
- if (resp.data.data.length > 0){
855
- self.allNode = resp.data.data
856
- self.modal1 = true
857
- }else {
858
- self.$Message.warning('当前流程无后续节点')
859
- }
860
- } else {
861
- self.$Message.error(resp.data.message)
862
- }
863
- })
864
- },
865
- handleSelectedUser(userId) {
866
- this.selectedUserId = userId;
867
- },
868
-
869
- //折叠动画效果
870
- beforeEnter(el) {
871
- el.style.height = '0';
872
- },
873
- enter(el, done) {
874
- setTimeout(() => {
875
- el.style.height = el.scrollHeight + 'px';
876
- }, 0);
877
-
878
- el.addEventListener('transitionend', done);
879
- },
880
- beforeLeave(el) {
881
- el.style.height = el.scrollHeight + 'px';
882
- },
883
- leave(el, done) {
884
- setTimeout(() => {
885
- el.style.height = '0';
886
- }, 0);
887
-
888
- el.addEventListener('transitionend', done);
889
- },
890
-
891
- beforeFlowInfoEnter(el) {
892
- el.style.transform = 'translateX(100%)';
893
- },
894
- flowInfoEnter(el, done) {
895
- const transitionDuration = 0.5;
896
- el.style.transition = `transform ${transitionDuration}s`;
897
- el.style.transform = 'translateX(0)';
898
- el.addEventListener('transitionend', done);
899
- },
900
- beforeFlowInfoLeave(el) {
901
- el.style.transform = 'translateX(0)';
902
- },
903
- flowInfoLeave(el, done) {
904
- const transitionDuration = 0.5;
905
- el.style.transition = `transform ${transitionDuration}s`;
906
- el.style.transform = 'translateX(100%)';
907
- el.addEventListener('transitionend', done);
908
- },
909
- },
910
- watch: {
911
- auditOpinionText(label) {
912
- this.form.auditOpinion = label;
913
- },
914
- procId(val) {
915
- this.procId = val;
916
- this.initData()
917
- },
918
- }
919
- }
920
- </script>
921
-
922
- <style lang="less" scoped>
923
- @import "./styles/css/index.less";
924
- /deep/ .ivu-table-row-highlight td {
925
- background-color: #50c1ff !important;
926
- color: #fff !important;
927
- }
928
- /deep/ .ivu-card-body{
929
- padding: 10px;
930
- }
931
- .page-info /deep/ .page-body{
932
- overflow-y: hidden;
933
- }
934
- </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>