cloud-web-corejs 1.0.54-dev.781 → 1.0.54-dev.783

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.
Files changed (33) hide show
  1. package/package.json +1 -1
  2. package/src/components/VabUpload/index.vue +242 -242
  3. package/src/components/VabUpload/mixins.js +1971 -1971
  4. package/src/components/VabUpload/privateProfileDialog.vue +2 -2
  5. package/src/components/hiprint/view/design/index.vue +7 -2
  6. package/src/components/obsUpload/index.vue +234 -234
  7. package/src/components/obsUpload/mixins.js +1542 -1542
  8. package/src/components/vb-tabs/x-tabs.vue +7 -3
  9. package/src/components/xform/docs//346/240/221/350/241/250rowField/346/224/266/346/225/233-/350/220/275/345/234/260/346/226/207/346/241/243.md +1427 -0
  10. package/src/components/xform/form-designer/form-widget/dialog/formDialog.vue +2 -2
  11. package/src/components/xform/form-designer/form-widget/dialog/formDrawer.vue +2 -2
  12. package/src/components/xform/form-designer/form-widget/dialog/searchFormDialog.vue +2 -2
  13. package/src/components/xform/form-designer/form-widget/field-widget/copy_button-widget.vue +11 -2
  14. package/src/components/xform/form-designer/form-widget/field-widget/vabUpload-widget.vue +369 -369
  15. package/src/components/xform/form-designer/setting-panel/property-editor/fileTypesSelect.vue +69 -23
  16. package/src/components/xform/form-render/container-item/data-table-item.vue +1 -1
  17. package/src/components/xform/form-render/container-item/data-table-mixin.js +1469 -428
  18. package/src/components/xform/form-render/indexMixin.js +379 -263
  19. package/src/components/xform/mixins/defaultHandle.js +234 -28
  20. package/src/components/xform/mixins/scriptHttp.js +4 -4
  21. package/src/components/xform/utils/treeTableUtil.js +1265 -0
  22. package/src/components/xform/utils/util.js +29 -14
  23. package/src/microRouter/index.js +3 -0
  24. package/src/mixins/tableTree/index.js +77 -14
  25. package/src/store/config/index.js +28 -28
  26. package/src/utils/menuAdapter.js +277 -277
  27. package/src/utils/resolveViewComponent.js +203 -203
  28. package/src/utils/vab.js +6 -3
  29. package/src/views/bd/setting/formVersion/ftHistoryDialog.vue +9 -2
  30. package/src/views/user/common_attribute/list.vue +1 -1
  31. package/src/views/user/form/vform/render.vue +17 -2
  32. package/src/views/user/form/view/list.vue +11 -10
  33. package/src/views/user/wf/wfReport/index.vue +625 -625
@@ -1,625 +1,625 @@
1
- <template>
2
- <div id="containt">
3
- <div class="filter-btns">
4
- <el-select
5
- class="f-btn"
6
- v-model="formData.dateRange"
7
- @change="handleSelectChange"
8
- clearable
9
- style="width: 128px !important"
10
- >
11
- <el-option :label="$t1('本日')" :value="1"></el-option>
12
- <el-option :label="$t1('本周')" :value="2"></el-option>
13
- <el-option :label="$t1('本月')" :value="3"></el-option>
14
- <el-option :label="$t1('本年')" :value="4"></el-option>
15
- </el-select>
16
- <el-select
17
- class="f-btn"
18
- v-model="formData.stat"
19
- :placeholder="$t1('全部状态')"
20
- clearable
21
- @clear="formData.stat = null"
22
- @change="handleSelectChange"
23
- style="width: 128px !important"
24
- >
25
- <el-option :label="$t1('审核中')" :value="1"></el-option>
26
- <el-option :label="$t1('已完成')" :value="2"></el-option>
27
- <el-option :label="$t1('已驳回')" :value="3"></el-option>
28
- </el-select>
29
- <el-select
30
- class="f-btn"
31
- v-model="formData.objTypeCode"
32
- :placeholder="$t1('流程类型')"
33
- clearable
34
- @change="handleSelectChange"
35
- style="width: 128px !important"
36
- >
37
- <el-option
38
- v-for="(item, index) in objTypeList"
39
- :key="index"
40
- :label="item.objTypeName"
41
- :value="item.objTypeCode"
42
- ></el-option>
43
- </el-select>
44
- <el-input
45
- v-model="formData.name"
46
- :placeholder="$t1('流程主题')"
47
- style="width: 128px !important"
48
- ></el-input>
49
- <span class="button-sty">
50
- <el-date-picker
51
- v-model="formData.startStartTime"
52
- type="date"
53
- :placeholder="$t1('启动时间(开始)')"
54
- size="small"
55
- clearable
56
- value-format="yyyy-MM-dd"
57
- :picker-options="$baseStartPickerOptions(formData.endStartTime)"
58
- style="width: 128px !important"
59
- ></el-date-picker>
60
- <span>-</span>
61
- <el-date-picker
62
- v-model="formData.endStartTime"
63
- type="date"
64
- :placeholder="$t1('启动时间(结束)')"
65
- size="small"
66
- clearable
67
- value-format="yyyy-MM-dd"
68
- :picker-options="$baseEndPickerOptions(formData.startStartTime)"
69
- style="width: 128px !important"
70
- ></el-date-picker>
71
- </span>
72
- <span class="button-sty">
73
- <el-date-picker
74
- v-model="formData.startEndTime"
75
- type="date"
76
- :placeholder="$t1('结束时间(开始)')"
77
- size="small"
78
- clearable
79
- value-format="yyyy-MM-dd"
80
- :picker-options="$baseStartPickerOptions(formData.endEndTime)"
81
- style="width: 128px !important"
82
- ></el-date-picker>
83
- <span>-</span>
84
- <el-date-picker
85
- v-model="formData.endEndTime"
86
- type="date"
87
- :placeholder="$t1('结束时间(结束)')"
88
- size="small"
89
- clearable
90
- value-format="yyyy-MM-dd"
91
- :picker-options="$baseEndPickerOptions(formData.startEndTime)"
92
- style="width: 128px !important"
93
- ></el-date-picker>
94
- </span>
95
- <el-button
96
- type="primary"
97
- plain
98
- class="button-sty"
99
- @click="resetEvent"
100
- icon="el-icon-brush"
101
- >
102
- {{ $t1("重置") }}
103
- </el-button>
104
- <el-button
105
- type="warning"
106
- size="small"
107
- class="button-sty"
108
- icon="el-icon-search"
109
- @click="handleSelectChange"
110
- >{{ $t1("搜索") }}
111
- </el-button>
112
- </div>
113
- <div class="sum-statistics">
114
- <div class="item">
115
- <p>总流程数</p>
116
- <b>{{ countData.total || 0 }}</b>
117
- <!-- <p class="f-gray">较上月增长 12%</p> -->
118
- <i class="ico iconfont icon-liuchengshu"></i>
119
- </div>
120
- <div class="item">
121
- <p>快速处理</p>
122
- <b>{{ countData.count_1 || 0 }}</b>
123
- <p class="f-gray"><1天完成</p>
124
- <i class="ico iconfont icon-kuaisuchuli"></i>
125
- </div>
126
- <div class="item">
127
- <p>正常处理</p>
128
- <b>{{ countData.count_1_3 || 0 }}</b>
129
- <p class="f-gray">1-3天完成</p>
130
- <i class="ico iconfont icon-zhengchangchuli"></i>
131
- </div>
132
- <div class="item">
133
- <p>缓慢处理</p>
134
- <b>{{ countData.count_3_7 || 0 }}</b>
135
- <p class="f-gray">3-7天完成</p>
136
- <i class="ico iconfont icon-huanmanchuli"></i>
137
- </div>
138
- <div class="item">
139
- <p>超时处理</p>
140
- <b>{{ countData.count_7 || 0 }}</b>
141
- <p class="f-gray">>7天完成</p>
142
- <i class="ico iconfont icon-chaoshichuli"></i>
143
- </div>
144
- </div>
145
- <el-row style="margin: 0 -5px">
146
- <el-col :span="16">
147
- <el-card class="box-style1">
148
- <div slot="header" class="clearfix">
149
- <span>流程详情列表</span>
150
- </div>
151
- <div style="height: 100%">
152
- <vxe-grid ref="table-m1" v-bind="vxeOption" :data="tableData">
153
- <template #form>
154
- <div class="clearfix screen-btns">
155
- <div class="fl">
156
- <base-table-export
157
- :option="{
158
- title: $t1('流程处理耗用时间查询'),
159
- targetRef: 'table-m1',
160
- }"
161
- :parent-target="_self"
162
- />
163
- </div>
164
- <div class="fr">
165
- <!-- <vxe-button icon="el-icon-brush" class="button-sty" @click="resetEvent" type="text" status="primary"
166
- plain>{{ $t1('重置') }}
167
- </vxe-button>
168
- <vxe-button status="warning" icon="el-icon-search" class="button-sty" @click="searchEvent">
169
- {{ $t1('搜索') }}
170
- </vxe-button> -->
171
- </div>
172
- </div>
173
- </template>
174
- </vxe-grid>
175
- </div>
176
- </el-card>
177
- </el-col>
178
- <el-col :span="8">
179
- <el-card class="box-style1">
180
- <div slot="header" class="clearfix">
181
- <span>节点详情</span>
182
- </div>
183
- <div class="node-box">
184
- <div class="info" v-if="currentRow.name">
185
- <p class="tit">{{ currentRow.name }}</p>
186
- <p>总耗时: {{ currentRow.duration }}</p>
187
- <el-tag type="warning" v-if="currentRow.stat === 1">{{
188
- $t2("审核中", "components.wf.wfStatus1")
189
- }}</el-tag>
190
- <el-tag type="success" v-if="currentRow.stat === 2">{{
191
- $t2("已完成", "components.wf.wfStatus3")
192
- }}</el-tag>
193
- <el-tag type="danger" v-if="currentRow.stat === 3">{{
194
- $t2("已驳回", "components.wf.wfStatus2")
195
- }}</el-tag>
196
- </div>
197
- <el-steps direction="vertical" :active="1" class="step-box3">
198
- <el-step v-for="(row, index) in nodeList" :key="index">
199
- <div slot="title">
200
- <div class="name">{{ row.task_name }}</div>
201
- <div class="a-time">耗时: {{ row.duration }}</div>
202
- </div>
203
- <div slot="description">
204
- <p>
205
- <span class="use">{{ row.candidate_names }}</span>
206
- <span class="time">{{ row.approve_time }}</span>
207
- </p>
208
- <p v-if="taskStatuses[row.type]" :class="taskStatuses[row.type].class">
209
- {{ taskStatuses[row.type].value }}
210
- </p>
211
- <p v-if="row.opinion">审批意见:{{ row.opinion }}</p>
212
- </div>
213
- </el-step>
214
- </el-steps>
215
- </div>
216
- </el-card>
217
- </el-col>
218
- </el-row>
219
- <wfContentDialog
220
- v-if="showWfDialog"
221
- :visible.sync="showWfDialog"
222
- :option.sync="wfContentOption"
223
- ></wfContentDialog>
224
- </div>
225
- </template>
226
-
227
- <script>
228
- import scriptHttpMixin from "@base/components/xform/mixins/scriptHttp";
229
- import wfContentDialog from "@base/views/user/wf/wf_manage/wfContentDialog";
230
- export default {
231
- name: "wf_report:index",
232
- mixins: [scriptHttpMixin],
233
- components: {
234
- wfContentDialog,
235
- },
236
- data() {
237
- return {
238
- vxeOption: {},
239
- serviceName: "sf-cloud-user",
240
- tableData: [],
241
- countData: {},
242
- currentRow: {},
243
- nodeList: [],
244
-
245
- taskStatuses: {
246
- start: {
247
- class: "f-blue",
248
- value: this.$t2("开始", "components.wf.startStatus"),
249
- },
250
- approve: {
251
- class: "f-orgn",
252
- value: this.$t2("待审批", "components.wf.approveStatus"),
253
- },
254
- submit: {
255
- class: "f-green",
256
- value: this.$t2("同意", "components.wf.submitStatus"),
257
- },
258
- reject: {
259
- class: "f-red",
260
- value: this.$t2("驳回", "components.wf.rejectStatus"),
261
- },
262
- transfer: {
263
- class: "f-green",
264
- value: this.$t2("转办", "components.wf.transferStatus"),
265
- },
266
- addIncreaseSign: {
267
- class: "f-green",
268
- value: this.$t2("加签", "components.wf.addIncreaseSignStatus"),
269
- },
270
- revoke: {
271
- class: "f-red",
272
- value: this.$t2("撤回", "components.wf.revokeStatus"),
273
- },
274
- end: {
275
- class: "f-gray",
276
- value: this.$t2("结束", "components.wf.endStatus"),
277
- },
278
- },
279
- formData: {
280
- dateRange: 3,
281
- stat: null,
282
- },
283
- objTypeList: [],
284
-
285
- showWfDialog: false,
286
- wfContentOption: {},
287
- };
288
- },
289
- mounted() {
290
- this.initObjTypeList();
291
- this.initTableList();
292
- this.loadWfSummaryCount();
293
- },
294
- methods: {
295
- openWfDialog(row) {
296
- this.wfContentOption = {
297
- objId: row.obj_id,
298
- url: row.url,
299
- objTypeCode: row.obj_type_code,
300
- formCode: row.formCode,
301
- };
302
- this.showWfDialog = true;
303
- },
304
- searchEvent() {
305
- this.$refs["table-m1"].commitProxy("reload");
306
- },
307
- resetEvent() {
308
- this.formData = {};
309
- this.$refs["table-m1"].commitProxy("reload");
310
- },
311
- initTableList() {
312
- let that = this;
313
- let formCode = this.$route.query.formCode;
314
- let tableOption = {
315
- vue: this,
316
- tableRef: "table-m1",
317
- tableName: "user-wf-report-index-m1",
318
- path: `/${this.serviceName}/bd_api/intf/wfSummaryList`,
319
- param: () => {
320
- return {
321
- ...this.formData,
322
- };
323
- },
324
- columns: [
325
- { type: "checkbox", width: 48, resizable: false, fixed: "left" },
326
- {
327
- field: "obj_type_name",
328
- title: this.$t1("流程类型"),
329
- width: 150,
330
- fixed: "left",
331
- },
332
- { field: "name", title: this.$t1("流程主题"), width: 180 },
333
- {
334
- field: "stat",
335
- title: "状态",
336
- width: 150,
337
- slots: {
338
- default: ({ row }) => {
339
- if (row.stat === 1) {
340
- return [
341
- <el-tag type="warning">
342
- {this.$t2("审核中", "components.wf.wfStatus1")}
343
- </el-tag>,
344
- ];
345
- } else if (row.stat === 2) {
346
- return [
347
- <el-tag type="success">
348
- {this.$t2("已完成", "components.wf.wfStatus2")}
349
- </el-tag>,
350
- ];
351
- } else if (row.stat === 3) {
352
- return [
353
- <el-tag type="info">
354
- {this.$t2("已驳回", "components.wf.wfStatus3")}
355
- </el-tag>,
356
- ];
357
- }
358
- },
359
- },
360
- },
361
- { field: "task_name", title: this.$t1("当前节点"), width: 180 },
362
- {
363
- field: "candidate_names",
364
- title: this.$t1("当前处理人"),
365
- width: 180,
366
- slots: {
367
- default: ({ row }) => {
368
- return [
369
- <div class="txt-mid">
370
- <i class="iconfont icon-dangqianchuliren"></i>
371
- <sapn>{row.candidate_names}</sapn>
372
- </div>,
373
- ];
374
- },
375
- },
376
- },
377
- { field: "start_time", title: this.$t1("启动时间"), width: 150 },
378
- { field: "end_time", title: this.$t1("结束时间"), width: 150 },
379
- {
380
- field: "duration",
381
- title: this.$t1("总耗时"),
382
- width: 180,
383
- slots: {
384
- default: ({ row }) => {
385
- return [
386
- <div class="txt-mid">
387
- <i class="iconfont icon-shijian"></i>
388
- <sapn> {row.duration}</sapn>
389
- </div>,
390
- ];
391
- },
392
- },
393
- },
394
- {
395
- field: "task_duration",
396
- title: this.$t1("当前节点耗时"),
397
- width: 180,
398
- slots: {
399
- default: ({ row }) => {
400
- return [
401
- <div class="txt-mid">
402
- <i class="iconfont icon-shijian"></i>
403
- <sapn> {row.task_duration}</sapn>
404
- </div>,
405
- ];
406
- },
407
- },
408
- },
409
- { field: "approver_num", title: this.$t1("审批总人数"), width: 180 },
410
- { field: "node_num", title: this.$t1("审批节点数量"), width: 180 },
411
- {
412
- width: 90,
413
- fixed: "right",
414
- title: "",
415
- sortable: false,
416
- slots: {
417
- default: ({ row }) => {
418
- return [
419
- <a
420
- href="javascript:void(0);"
421
- class="a-link"
422
- onclick={() => {
423
- this.loadWfSummaryNode(row);
424
- }}
425
- >
426
- <el-tooltip
427
- enterable={false}
428
- effect="dark"
429
- content={this.$t1("查看详情")}
430
- placement="top"
431
- popper-class="tooltip-skin"
432
- >
433
- <i class="iconfont icon-dianji" />
434
- </el-tooltip>
435
- </a>,
436
- <a
437
- href="javascript:void(0);"
438
- class="a-link"
439
- onclick={() => {
440
- this.openWfDialog(row);
441
- }}
442
- >
443
- <el-tooltip
444
- enterable={false}
445
- effect="dark"
446
- content={this.$t1("查看单据")}
447
- placement="top"
448
- popper-class="tooltip-skin"
449
- >
450
- <i class="el-icon-edit" />
451
- </el-tooltip>
452
- </a>,
453
- ];
454
- },
455
- },
456
- },
457
- ],
458
- };
459
- this.$vxeTableUtil.initVxeTable(tableOption).then((opts) => {
460
- this.vxeOption = opts;
461
- });
462
- },
463
- loadWfSummaryCount() {
464
- this.$http({
465
- url: `/${this.serviceName}/bd_api/intf/wfSummaryCount`,
466
- method: "post",
467
- data: {
468
- ...this.formData,
469
- },
470
- success: (res) => {
471
- this.countData = res.objx || {};
472
- },
473
- });
474
- },
475
- loadWfSummaryNode(row) {
476
- this.$http({
477
- url: `/${this.serviceName}/bd_api/intf/wfSummaryNode`,
478
- method: "post",
479
- data: {
480
- proc_inst_id: row.proc_inst_id,
481
- },
482
- success: (res) => {
483
- this.currentRow = row;
484
- this.nodeList = res.objx || [];
485
- },
486
- });
487
- },
488
- clearWfSummaryNode() {
489
- this.currentRow = {};
490
- this.nodeList = [];
491
- },
492
- handleSelectChange() {
493
- if (this.formData.dateRange === "") {
494
- this.formData.dateRange = null;
495
- }
496
- if (this.formData.stat === "") {
497
- this.formData.stat = null;
498
- }
499
- this.loadWfSummaryCount();
500
- this.searchEvent();
501
- this.clearWfSummaryNode();
502
- },
503
- initObjTypeList() {
504
- this.$http({
505
- url: `/${this.serviceName}/wf_info/listGroupPage`,
506
- method: "post",
507
- data: {
508
- type: 99,
509
- },
510
- success: (res) => {
511
- this.objTypeList = res?.objx?.records || [];
512
- },
513
- });
514
- },
515
- },
516
- };
517
- </script>
518
- <style scoped lang="scss">
519
- #containt {
520
- background: none;
521
- padding: 10px 0 0;
522
- box-shadow: none;
523
- display:flex;flex-direction: column;
524
- > .el-row{flex:1;
525
- > .el-col{height:100%;}
526
- }
527
- }
528
- .filter-btns {
529
- .f-btn {
530
- margin-right: 25px;
531
- }
532
- }
533
- .sum-statistics {
534
- display: flex;
535
- margin: 10px -5px 0;
536
- .item {
537
- flex: 1;
538
- background: #fff;
539
- border: solid 1px #e9e9e9;
540
- border-radius: 6px;
541
- margin: 0 5px;
542
- padding: 10px 14px 8px;
543
- font-size: 12px;
544
- position: relative;
545
- .ico {
546
- position: absolute;
547
- top: 50%;
548
- right: 18px;
549
- width: 34px;
550
- height: 34px;
551
- margin-top: -17px;
552
- border-radius: 6px;
553
- text-align: center;
554
- line-height: 35px;
555
- font-size: 16;
556
- background: #eff6ff;
557
- color: #2f6ffc;
558
- }
559
- p {
560
- margin-bottom: 0;
561
- }
562
- > b {
563
- font-size: 26px;
564
- margin: 8px 0 3px;
565
- display: inline-block;
566
- font-weight: 400;
567
- }
568
- &:nth-child(2) .ico {
569
- background: #faf5ff;
570
- color: #ab3dfa;
571
- }
572
- &:nth-child(3) .ico {
573
- background: #f0fdf4;
574
- color: #0aa945;
575
- }
576
- &:nth-child(4) .ico {
577
- background: #fff7ed;
578
- color: #f5520b;
579
- }
580
- &:nth-child(5) .ico {
581
- background: #fef2f2;
582
- color: #e70a15;
583
- }
584
- }
585
- }
586
- ::v-deep .box-style1 {
587
- margin: 10px 5px 0;height:calc(100% - 10px);display:flex;flex-direction:column;
588
- .el-card__body {
589
- flex:1;
590
- }
591
- }
592
- .node-box {
593
- height:100%;overflow:auto;display:flex;flex-direction: column;
594
- .info {
595
- border: solid 1px #e6ebf5;
596
- background: #f6faff;
597
- border-radius: 4px;
598
- padding: 10px 14px;
599
- position: relative;
600
- font-size: 12px;
601
- color: #666666;
602
- margin-bottom: 8px;
603
- p {
604
- margin-bottom: 0;
605
- }
606
- .el-tag {
607
- position: absolute;
608
- right: 12px;
609
- top: 50%;
610
- margin-top: -14px !important;
611
- }
612
- .tit {
613
- font-size: 13px;
614
- color: #212121;
615
- margin-bottom: 5px;
616
- margin-top:0;
617
- }
618
- }
619
- .el-steps {
620
- overflow: auto;
621
- padding-right: 10px;
622
- flex:1;
623
- }
624
- }
625
- </style>
1
+ <template>
2
+ <div id="containt">
3
+ <div class="filter-btns">
4
+ <el-select
5
+ class="f-btn"
6
+ v-model="formData.dateRange"
7
+ @change="handleSelectChange"
8
+ clearable
9
+ style="width: 128px !important"
10
+ >
11
+ <el-option :label="$t1('本日')" :value="1"></el-option>
12
+ <el-option :label="$t1('本周')" :value="2"></el-option>
13
+ <el-option :label="$t1('本月')" :value="3"></el-option>
14
+ <el-option :label="$t1('本年')" :value="4"></el-option>
15
+ </el-select>
16
+ <el-select
17
+ class="f-btn"
18
+ v-model="formData.stat"
19
+ :placeholder="$t1('全部状态')"
20
+ clearable
21
+ @clear="formData.stat = null"
22
+ @change="handleSelectChange"
23
+ style="width: 128px !important"
24
+ >
25
+ <el-option :label="$t1('审核中')" :value="1"></el-option>
26
+ <el-option :label="$t1('已完成')" :value="2"></el-option>
27
+ <el-option :label="$t1('已驳回')" :value="3"></el-option>
28
+ </el-select>
29
+ <el-select
30
+ class="f-btn"
31
+ v-model="formData.objTypeCode"
32
+ :placeholder="$t1('流程类型')"
33
+ clearable
34
+ @change="handleSelectChange"
35
+ style="width: 128px !important"
36
+ >
37
+ <el-option
38
+ v-for="(item, index) in objTypeList"
39
+ :key="index"
40
+ :label="item.objTypeName"
41
+ :value="item.objTypeCode"
42
+ ></el-option>
43
+ </el-select>
44
+ <el-input
45
+ v-model="formData.name"
46
+ :placeholder="$t1('流程主题')"
47
+ style="width: 128px !important"
48
+ ></el-input>
49
+ <span class="button-sty">
50
+ <el-date-picker
51
+ v-model="formData.startStartTime"
52
+ type="date"
53
+ :placeholder="$t1('启动时间(开始)')"
54
+ size="small"
55
+ clearable
56
+ value-format="yyyy-MM-dd"
57
+ :picker-options="$baseStartPickerOptions(formData.endStartTime)"
58
+ style="width: 128px !important"
59
+ ></el-date-picker>
60
+ <span>-</span>
61
+ <el-date-picker
62
+ v-model="formData.endStartTime"
63
+ type="date"
64
+ :placeholder="$t1('启动时间(结束)')"
65
+ size="small"
66
+ clearable
67
+ value-format="yyyy-MM-dd"
68
+ :picker-options="$baseEndPickerOptions(formData.startStartTime)"
69
+ style="width: 128px !important"
70
+ ></el-date-picker>
71
+ </span>
72
+ <span class="button-sty">
73
+ <el-date-picker
74
+ v-model="formData.startEndTime"
75
+ type="date"
76
+ :placeholder="$t1('结束时间(开始)')"
77
+ size="small"
78
+ clearable
79
+ value-format="yyyy-MM-dd"
80
+ :picker-options="$baseStartPickerOptions(formData.endEndTime)"
81
+ style="width: 128px !important"
82
+ ></el-date-picker>
83
+ <span>-</span>
84
+ <el-date-picker
85
+ v-model="formData.endEndTime"
86
+ type="date"
87
+ :placeholder="$t1('结束时间(结束)')"
88
+ size="small"
89
+ clearable
90
+ value-format="yyyy-MM-dd"
91
+ :picker-options="$baseEndPickerOptions(formData.startEndTime)"
92
+ style="width: 128px !important"
93
+ ></el-date-picker>
94
+ </span>
95
+ <el-button
96
+ type="primary"
97
+ plain
98
+ class="button-sty"
99
+ @click="resetEvent"
100
+ icon="el-icon-brush"
101
+ >
102
+ {{ $t1("重置") }}
103
+ </el-button>
104
+ <el-button
105
+ type="warning"
106
+ size="small"
107
+ class="button-sty"
108
+ icon="el-icon-search"
109
+ @click="handleSelectChange"
110
+ >{{ $t1("搜索") }}
111
+ </el-button>
112
+ </div>
113
+ <div class="sum-statistics">
114
+ <div class="item">
115
+ <p>总流程数</p>
116
+ <b>{{ countData.total || 0 }}</b>
117
+ <!-- <p class="f-gray">较上月增长 12%</p> -->
118
+ <i class="ico iconfont icon-liuchengshu"></i>
119
+ </div>
120
+ <div class="item">
121
+ <p>快速处理</p>
122
+ <b>{{ countData.count_1 || 0 }}</b>
123
+ <p class="f-gray"><1天完成</p>
124
+ <i class="ico iconfont icon-kuaisuchuli"></i>
125
+ </div>
126
+ <div class="item">
127
+ <p>正常处理</p>
128
+ <b>{{ countData.count_1_3 || 0 }}</b>
129
+ <p class="f-gray">1-3天完成</p>
130
+ <i class="ico iconfont icon-zhengchangchuli"></i>
131
+ </div>
132
+ <div class="item">
133
+ <p>缓慢处理</p>
134
+ <b>{{ countData.count_3_7 || 0 }}</b>
135
+ <p class="f-gray">3-7天完成</p>
136
+ <i class="ico iconfont icon-huanmanchuli"></i>
137
+ </div>
138
+ <div class="item">
139
+ <p>超时处理</p>
140
+ <b>{{ countData.count_7 || 0 }}</b>
141
+ <p class="f-gray">>7天完成</p>
142
+ <i class="ico iconfont icon-chaoshichuli"></i>
143
+ </div>
144
+ </div>
145
+ <el-row style="margin: 0 -5px">
146
+ <el-col :span="16">
147
+ <el-card class="box-style1">
148
+ <div slot="header" class="clearfix">
149
+ <span>流程详情列表</span>
150
+ </div>
151
+ <div style="height: 100%">
152
+ <vxe-grid ref="table-m1" v-bind="vxeOption" :data="tableData">
153
+ <template #form>
154
+ <div class="clearfix screen-btns">
155
+ <div class="fl">
156
+ <base-table-export
157
+ :option="{
158
+ title: $t1('流程处理耗用时间查询'),
159
+ targetRef: 'table-m1',
160
+ }"
161
+ :parent-target="_self"
162
+ />
163
+ </div>
164
+ <div class="fr">
165
+ <!-- <vxe-button icon="el-icon-brush" class="button-sty" @click="resetEvent" type="text" status="primary"
166
+ plain>{{ $t1('重置') }}
167
+ </vxe-button>
168
+ <vxe-button status="warning" icon="el-icon-search" class="button-sty" @click="searchEvent">
169
+ {{ $t1('搜索') }}
170
+ </vxe-button> -->
171
+ </div>
172
+ </div>
173
+ </template>
174
+ </vxe-grid>
175
+ </div>
176
+ </el-card>
177
+ </el-col>
178
+ <el-col :span="8">
179
+ <el-card class="box-style1">
180
+ <div slot="header" class="clearfix">
181
+ <span>节点详情</span>
182
+ </div>
183
+ <div class="node-box">
184
+ <div class="info" v-if="currentRow.name">
185
+ <p class="tit">{{ currentRow.name }}</p>
186
+ <p>总耗时: {{ currentRow.duration }}</p>
187
+ <el-tag type="warning" v-if="currentRow.stat === 1">{{
188
+ $t2("审核中", "components.wf.wfStatus1")
189
+ }}</el-tag>
190
+ <el-tag type="success" v-if="currentRow.stat === 2">{{
191
+ $t2("已完成", "components.wf.wfStatus3")
192
+ }}</el-tag>
193
+ <el-tag type="danger" v-if="currentRow.stat === 3">{{
194
+ $t2("已驳回", "components.wf.wfStatus2")
195
+ }}</el-tag>
196
+ </div>
197
+ <el-steps direction="vertical" :active="1" class="step-box3">
198
+ <el-step v-for="(row, index) in nodeList" :key="index">
199
+ <div slot="title">
200
+ <div class="name">{{ row.task_name }}</div>
201
+ <div class="a-time">耗时: {{ row.duration }}</div>
202
+ </div>
203
+ <div slot="description">
204
+ <p>
205
+ <span class="use">{{ row.candidate_names }}</span>
206
+ <span class="time">{{ row.approve_time }}</span>
207
+ </p>
208
+ <p v-if="taskStatuses[row.type]" :class="taskStatuses[row.type].class">
209
+ {{ taskStatuses[row.type].value }}
210
+ </p>
211
+ <p v-if="row.opinion">审批意见:{{ row.opinion }}</p>
212
+ </div>
213
+ </el-step>
214
+ </el-steps>
215
+ </div>
216
+ </el-card>
217
+ </el-col>
218
+ </el-row>
219
+ <wfContentDialog
220
+ v-if="showWfDialog"
221
+ :visible.sync="showWfDialog"
222
+ :option.sync="wfContentOption"
223
+ ></wfContentDialog>
224
+ </div>
225
+ </template>
226
+
227
+ <script>
228
+ import scriptHttpMixin from "@base/components/xform/mixins/scriptHttp";
229
+ import wfContentDialog from "@base/views/user/wf/wf_manage/wfContentDialog";
230
+ export default {
231
+ name: "wf_report:index",
232
+ mixins: [scriptHttpMixin],
233
+ components: {
234
+ wfContentDialog,
235
+ },
236
+ data() {
237
+ return {
238
+ vxeOption: {},
239
+ serviceName: "sf-cloud-user",
240
+ tableData: [],
241
+ countData: {},
242
+ currentRow: {},
243
+ nodeList: [],
244
+
245
+ taskStatuses: {
246
+ start: {
247
+ class: "f-blue",
248
+ value: this.$t2("开始", "components.wf.startStatus"),
249
+ },
250
+ approve: {
251
+ class: "f-orgn",
252
+ value: this.$t2("待审批", "components.wf.approveStatus"),
253
+ },
254
+ submit: {
255
+ class: "f-green",
256
+ value: this.$t2("同意", "components.wf.submitStatus"),
257
+ },
258
+ reject: {
259
+ class: "f-red",
260
+ value: this.$t2("驳回", "components.wf.rejectStatus"),
261
+ },
262
+ transfer: {
263
+ class: "f-green",
264
+ value: this.$t2("转办", "components.wf.transferStatus"),
265
+ },
266
+ addIncreaseSign: {
267
+ class: "f-green",
268
+ value: this.$t2("加签", "components.wf.addIncreaseSignStatus"),
269
+ },
270
+ revoke: {
271
+ class: "f-red",
272
+ value: this.$t2("撤回", "components.wf.revokeStatus"),
273
+ },
274
+ end: {
275
+ class: "f-gray",
276
+ value: this.$t2("结束", "components.wf.endStatus"),
277
+ },
278
+ },
279
+ formData: {
280
+ dateRange: 3,
281
+ stat: null,
282
+ },
283
+ objTypeList: [],
284
+
285
+ showWfDialog: false,
286
+ wfContentOption: {},
287
+ };
288
+ },
289
+ mounted() {
290
+ this.initObjTypeList();
291
+ this.initTableList();
292
+ this.loadWfSummaryCount();
293
+ },
294
+ methods: {
295
+ openWfDialog(row) {
296
+ this.wfContentOption = {
297
+ objId: row.obj_id,
298
+ url: row.url,
299
+ objTypeCode: row.obj_type_code,
300
+ formCode: row.formCode,
301
+ };
302
+ this.showWfDialog = true;
303
+ },
304
+ searchEvent() {
305
+ this.$refs["table-m1"].commitProxy("reload");
306
+ },
307
+ resetEvent() {
308
+ this.formData = {};
309
+ this.$refs["table-m1"].commitProxy("reload");
310
+ },
311
+ initTableList() {
312
+ let that = this;
313
+ let formCode = this.$route.query.formCode;
314
+ let tableOption = {
315
+ vue: this,
316
+ tableRef: "table-m1",
317
+ tableName: "user-wf-report-index-m1",
318
+ path: `/${this.serviceName}/bd_api/intf/wfSummaryList`,
319
+ param: () => {
320
+ return {
321
+ ...this.formData,
322
+ };
323
+ },
324
+ columns: [
325
+ { type: "checkbox", width: 48, resizable: false, fixed: "left" },
326
+ {
327
+ field: "obj_type_name",
328
+ title: this.$t1("流程类型"),
329
+ width: 150,
330
+ fixed: "left",
331
+ },
332
+ { field: "name", title: this.$t1("流程主题"), width: 180 },
333
+ {
334
+ field: "stat",
335
+ title: "状态",
336
+ width: 150,
337
+ slots: {
338
+ default: ({ row }) => {
339
+ if (row.stat === 1) {
340
+ return [
341
+ <el-tag type="warning">
342
+ {this.$t2("审核中", "components.wf.wfStatus1")}
343
+ </el-tag>,
344
+ ];
345
+ } else if (row.stat === 2) {
346
+ return [
347
+ <el-tag type="success">
348
+ {this.$t2("已完成", "components.wf.wfStatus2")}
349
+ </el-tag>,
350
+ ];
351
+ } else if (row.stat === 3) {
352
+ return [
353
+ <el-tag type="info">
354
+ {this.$t2("已驳回", "components.wf.wfStatus3")}
355
+ </el-tag>,
356
+ ];
357
+ }
358
+ },
359
+ },
360
+ },
361
+ { field: "task_name", title: this.$t1("当前节点"), width: 180 },
362
+ {
363
+ field: "candidate_names",
364
+ title: this.$t1("当前处理人"),
365
+ width: 180,
366
+ slots: {
367
+ default: ({ row }) => {
368
+ return [
369
+ <div class="txt-mid">
370
+ <i class="iconfont icon-dangqianchuliren"></i>
371
+ <sapn>{row.candidate_names}</sapn>
372
+ </div>,
373
+ ];
374
+ },
375
+ },
376
+ },
377
+ { field: "start_time", title: this.$t1("启动时间"), width: 150 },
378
+ { field: "end_time", title: this.$t1("结束时间"), width: 150 },
379
+ {
380
+ field: "duration",
381
+ title: this.$t1("总耗时"),
382
+ width: 180,
383
+ slots: {
384
+ default: ({ row }) => {
385
+ return [
386
+ <div class="txt-mid">
387
+ <i class="iconfont icon-shijian"></i>
388
+ <sapn> {row.duration}</sapn>
389
+ </div>,
390
+ ];
391
+ },
392
+ },
393
+ },
394
+ {
395
+ field: "task_duration",
396
+ title: this.$t1("当前节点耗时"),
397
+ width: 180,
398
+ slots: {
399
+ default: ({ row }) => {
400
+ return [
401
+ <div class="txt-mid">
402
+ <i class="iconfont icon-shijian"></i>
403
+ <sapn> {row.task_duration}</sapn>
404
+ </div>,
405
+ ];
406
+ },
407
+ },
408
+ },
409
+ { field: "approver_num", title: this.$t1("审批总人数"), width: 180 },
410
+ { field: "node_num", title: this.$t1("审批节点数量"), width: 180 },
411
+ {
412
+ width: 90,
413
+ fixed: "right",
414
+ title: "",
415
+ sortable: false,
416
+ slots: {
417
+ default: ({ row }) => {
418
+ return [
419
+ <a
420
+ href="javascript:void(0);"
421
+ class="a-link"
422
+ onclick={() => {
423
+ this.loadWfSummaryNode(row);
424
+ }}
425
+ >
426
+ <el-tooltip
427
+ enterable={false}
428
+ effect="dark"
429
+ content={this.$t1("查看详情")}
430
+ placement="top"
431
+ popper-class="tooltip-skin"
432
+ >
433
+ <i class="iconfont icon-dianji" />
434
+ </el-tooltip>
435
+ </a>,
436
+ <a
437
+ href="javascript:void(0);"
438
+ class="a-link"
439
+ onclick={() => {
440
+ this.openWfDialog(row);
441
+ }}
442
+ >
443
+ <el-tooltip
444
+ enterable={false}
445
+ effect="dark"
446
+ content={this.$t1("查看单据")}
447
+ placement="top"
448
+ popper-class="tooltip-skin"
449
+ >
450
+ <i class="el-icon-edit" />
451
+ </el-tooltip>
452
+ </a>,
453
+ ];
454
+ },
455
+ },
456
+ },
457
+ ],
458
+ };
459
+ this.$vxeTableUtil.initVxeTable(tableOption).then((opts) => {
460
+ this.vxeOption = opts;
461
+ });
462
+ },
463
+ loadWfSummaryCount() {
464
+ this.$http({
465
+ url: `/${this.serviceName}/bd_api/intf/wfSummaryCount`,
466
+ method: "post",
467
+ data: {
468
+ ...this.formData,
469
+ },
470
+ success: (res) => {
471
+ this.countData = res.objx || {};
472
+ },
473
+ });
474
+ },
475
+ loadWfSummaryNode(row) {
476
+ this.$http({
477
+ url: `/${this.serviceName}/bd_api/intf/wfSummaryNode`,
478
+ method: "post",
479
+ data: {
480
+ proc_inst_id: row.proc_inst_id,
481
+ },
482
+ success: (res) => {
483
+ this.currentRow = row;
484
+ this.nodeList = res.objx || [];
485
+ },
486
+ });
487
+ },
488
+ clearWfSummaryNode() {
489
+ this.currentRow = {};
490
+ this.nodeList = [];
491
+ },
492
+ handleSelectChange() {
493
+ if (this.formData.dateRange === "") {
494
+ this.formData.dateRange = null;
495
+ }
496
+ if (this.formData.stat === "") {
497
+ this.formData.stat = null;
498
+ }
499
+ this.loadWfSummaryCount();
500
+ this.searchEvent();
501
+ this.clearWfSummaryNode();
502
+ },
503
+ initObjTypeList() {
504
+ this.$http({
505
+ url: `/${this.serviceName}/wf_info/listGroupPage`,
506
+ method: "post",
507
+ data: {
508
+ type: 99,
509
+ },
510
+ success: (res) => {
511
+ this.objTypeList = res?.objx?.records || [];
512
+ },
513
+ });
514
+ },
515
+ },
516
+ };
517
+ </script>
518
+ <style scoped lang="scss">
519
+ #containt {
520
+ background: none;
521
+ padding: 10px 0 0;
522
+ box-shadow: none;
523
+ display:flex;flex-direction: column;
524
+ > .el-row{flex:1;
525
+ > .el-col{height:100%;}
526
+ }
527
+ }
528
+ .filter-btns {
529
+ .f-btn {
530
+ margin-right: 25px;
531
+ }
532
+ }
533
+ .sum-statistics {
534
+ display: flex;
535
+ margin: 10px -5px 0;
536
+ .item {
537
+ flex: 1;
538
+ background: #fff;
539
+ border: solid 1px #e9e9e9;
540
+ border-radius: 6px;
541
+ margin: 0 5px;
542
+ padding: 10px 14px 8px;
543
+ font-size: 12px;
544
+ position: relative;
545
+ .ico {
546
+ position: absolute;
547
+ top: 50%;
548
+ right: 18px;
549
+ width: 34px;
550
+ height: 34px;
551
+ margin-top: -17px;
552
+ border-radius: 6px;
553
+ text-align: center;
554
+ line-height: 35px;
555
+ font-size: 16;
556
+ background: #eff6ff;
557
+ color: #2f6ffc;
558
+ }
559
+ p {
560
+ margin-bottom: 0;
561
+ }
562
+ > b {
563
+ font-size: 26px;
564
+ margin: 8px 0 3px;
565
+ display: inline-block;
566
+ font-weight: 400;
567
+ }
568
+ &:nth-child(2) .ico {
569
+ background: #faf5ff;
570
+ color: #ab3dfa;
571
+ }
572
+ &:nth-child(3) .ico {
573
+ background: #f0fdf4;
574
+ color: #0aa945;
575
+ }
576
+ &:nth-child(4) .ico {
577
+ background: #fff7ed;
578
+ color: #f5520b;
579
+ }
580
+ &:nth-child(5) .ico {
581
+ background: #fef2f2;
582
+ color: #e70a15;
583
+ }
584
+ }
585
+ }
586
+ ::v-deep .box-style1 {
587
+ margin: 10px 5px 0;height:calc(100% - 10px);display:flex;flex-direction:column;
588
+ .el-card__body {
589
+ flex:1;min-height:0;
590
+ }
591
+ }
592
+ .node-box {
593
+ height:100%;overflow:auto;display:flex;flex-direction: column;
594
+ .info {
595
+ border: solid 1px #e6ebf5;
596
+ background: #f6faff;
597
+ border-radius: 4px;
598
+ padding: 10px 14px;
599
+ position: relative;
600
+ font-size: 12px;
601
+ color: #666666;
602
+ margin-bottom: 8px;
603
+ p {
604
+ margin-bottom: 0;
605
+ }
606
+ .el-tag {
607
+ position: absolute;
608
+ right: 12px;
609
+ top: 50%;
610
+ margin-top: -14px !important;
611
+ }
612
+ .tit {
613
+ font-size: 13px;
614
+ color: #212121;
615
+ margin-bottom: 5px;
616
+ margin-top:0;
617
+ }
618
+ }
619
+ .el-steps {
620
+ overflow: auto;
621
+ padding-right: 10px;
622
+ flex:1;
623
+ }
624
+ }
625
+ </style>