@lambo-design/workflow-approve 1.0.0-beta.2

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