sasp-flow-render 1.0.1

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 (68) hide show
  1. package/index.js +108 -0
  2. package/package.json +21 -0
  3. package/router.js +13 -0
  4. package/src/assets/font/iconfont.css +1158 -0
  5. package/src/assets/font/iconfont.eot +0 -0
  6. package/src/assets/font/iconfont.js +1 -0
  7. package/src/assets/font/iconfont.svg +827 -0
  8. package/src/assets/font/iconfont.ttf +0 -0
  9. package/src/assets/font/iconfont.woff +0 -0
  10. package/src/assets/images/card_zwsj.png +0 -0
  11. package/src/assets/images/dataStore.png +0 -0
  12. package/src/assets/images/dataStore_icon.png +0 -0
  13. package/src/assets/images/draft.png +0 -0
  14. package/src/assets/images/edit_icon.png +0 -0
  15. package/src/assets/images/end.png +0 -0
  16. package/src/assets/images/end_icon.png +0 -0
  17. package/src/assets/images/gateway.png +0 -0
  18. package/src/assets/images/gateway_icon.png +0 -0
  19. package/src/assets/images/globalConnect_icon.png +0 -0
  20. package/src/assets/images/group_icon.png +0 -0
  21. package/src/assets/images/hander_icon.png +0 -0
  22. package/src/assets/images/icon_ quality.png +0 -0
  23. package/src/assets/images/lasso_icon.png +0 -0
  24. package/src/assets/images/mobile_preview.png +0 -0
  25. package/src/assets/images/participant_icon.png +0 -0
  26. package/src/assets/images/publicProcess_icon.png +0 -0
  27. package/src/assets/images/remind_example.png +0 -0
  28. package/src/assets/images/space_icon.png +0 -0
  29. package/src/assets/images/start.png +0 -0
  30. package/src/assets/images/start_icon.png +0 -0
  31. package/src/assets/images/subprocess_icon.png +0 -0
  32. package/src/assets/images/tab_set_example.png +0 -0
  33. package/src/assets/images/timer.png +0 -0
  34. package/src/assets/images/timer_icon.png +0 -0
  35. package/src/assets/images/userTask_icon.png +0 -0
  36. package/src/assets/images/user_task.png +0 -0
  37. package/src/assets/js/api/apiFlow.js +219 -0
  38. package/src/assets/js/flowInstall.js +25 -0
  39. package/src/assets/js/global/cacheGlobal.js +110 -0
  40. package/src/assets/js/global/flowGlobal.js +61 -0
  41. package/src/assets/js/global/flowUserGlobal.js +35 -0
  42. package/src/assets/js/global/interfaceCache.js +31 -0
  43. package/src/assets/js/storageIO.js +106 -0
  44. package/src/components/flowChart.vue +463 -0
  45. package/src/components/flowInst/css/flowInstList.scss +193 -0
  46. package/src/components/flowInst/flowInstList.vue +818 -0
  47. package/src/components/flowInst/flowInstTab.vue +2858 -0
  48. package/src/components/flowInst/popup/flowInstForm.vue +54 -0
  49. package/src/components/flowRoamRecords.vue +768 -0
  50. package/src/components/messageMould/messageMould.vue +547 -0
  51. package/src/components/roamRecord.vue +567 -0
  52. package/src/components/userSelect.vue +537 -0
  53. package/src/views/flowInstView.vue +178 -0
  54. package/src/views/menuRouter/flowMenuRouter.vue +260 -0
  55. package/src/views/menuRouter/flowResRouter.vue +223 -0
  56. package/src/views/popup/css/flowMain.scss +156 -0
  57. package/src/views/popup/event/compoment/diy/info.txt +1 -0
  58. package/src/views/popup/event/compoment/eventParentConfig.vue +45 -0
  59. package/src/views/popup/event/js/loadFlowEventPlugin.js +279 -0
  60. package/src/views/popup/js/controls/CustomContextPad.js +310 -0
  61. package/src/views/popup/js/controls/CustomPalette.js +303 -0
  62. package/src/views/popup/js/controls/CustomRenderer.js +219 -0
  63. package/src/views/popup/js/controls/index.js +11 -0
  64. package/src/views/popup/js/customModeler/CustomModeler.js +22 -0
  65. package/src/views/popup/js/translations/customTranslate.js +14 -0
  66. package/src/views/popup/js/translations/translations.js +234 -0
  67. package/src/views/popup/js/utils/utils.js +53 -0
  68. package/src/views/test.vue +79 -0
@@ -0,0 +1,567 @@
1
+ <template>
2
+ <div id="roamRecordContainer" class="pos-abs-full flow-record-content"
3
+ v-loading="loading"
4
+ element-loading-text="正在加载,请稍后..."
5
+ element-loading-spinner="el-icon-loading"
6
+ element-loading-background="rgba(0, 0, 0, 0.6)" style="padding: 10px 20px;overflow-y: scroll;">
7
+ <div class="flow-summary">
8
+ <span style="font-weight: bold;">事项概述:</span>
9
+ {{flowInstNodeArr.length>0?flowInstNodeArr[0].flowSummary:''}}
10
+ </div>
11
+ <div class="flow-color">
12
+ <span style="font-weight: bold;">节点颜色:</span>
13
+ <span class="flow-color-content">
14
+ <span class="flow-color-item" v-for="node in flowStatusName" :key="node.code">
15
+ <span class="flow-color-item-radius"
16
+ :style="{backgroundColor:flowStatusColor[node.code]}"></span>
17
+ <span class="flow-color-item-text" style="">{{node.name}}</span>
18
+ </span>
19
+ </span>
20
+ </div>
21
+
22
+ <div style="padding-top:10px;text-align: center;">
23
+ <el-radio-group v-model="showStyle">
24
+ <el-radio-button label="图形展现"></el-radio-button>
25
+ <el-radio-button label="表格展现"></el-radio-button>
26
+ </el-radio-group>
27
+ </div>
28
+
29
+ <div class="flow-roam-record-content">
30
+ <el-timeline v-show="showStyle=='图形展现'">
31
+ <el-timeline-item
32
+ v-for="(item, index) in flowInstNodeArr"
33
+ :key="index"
34
+ placement="top"
35
+ :class="{'appendsign-item':item.isAppendsign=='1'}"
36
+ :icon="nodeInstIcon(item)"
37
+ :color="flowStatusColor[flowStatusCode[item.nodeInstStatus]]"
38
+ :timestamp="COMMON_FUNC.dateToString(new Date(item.startTime)) + ' 至 ' + (item.endTime?COMMON_FUNC.dateToString(new Date(item.endTime)):'')">
39
+
40
+ <el-popover v-if="item.isAppendsign=='1'"
41
+ placement="top"
42
+ popper-class="append-sign-popup"
43
+ width="400"
44
+ trigger="click">
45
+ <div class="flow-roam-record-content">
46
+ <el-timeline>
47
+ <el-timeline-item
48
+ v-for="(item, index) in appendSignNodeArr"
49
+ :key="index"
50
+ placement="top"
51
+ icon="el-icon-user-solid"
52
+ :color="flowStatusColor[flowStatusCode[item.nodeInstStatus]]"
53
+ :timestamp="COMMON_FUNC.dateToString(new Date(item.startTime)) + ' 至 ' + (item.endTime?COMMON_FUNC.dateToString(new Date(item.endTime)):'')">
54
+ <el-card>
55
+ <div slot="header" class="clearfix">
56
+ <h4>{{item.nodeName}}
57
+ <span style="padding-left:20px;color:#666;font-weight: normal;"> {{item.actorUserName}}</span>
58
+ </h4>
59
+ </div>
60
+ <p v-html="item.nodeMask"></p>
61
+ </el-card>
62
+ </el-timeline-item>
63
+ </el-timeline>
64
+ </div>
65
+
66
+ <div slot="reference" @click="showCompleteSignInfos(item.ids)"
67
+ title="点击查看加签信息"
68
+ class="appendsign-item-mask">
69
+ <i class="el-icon-postcard appendsign-item-icon"></i>
70
+ </div>
71
+ </el-popover>
72
+
73
+ <el-card>
74
+ <div slot="header" class="clearfix">
75
+ <h4>{{item.nodeName}}
76
+ <span style="padding-left:20px;color:#666;font-weight: normal;"
77
+ v-if="item.nodeType=='0' || item.preNodeInstId == '-1' || (item.nodeType=='1' && item.nodeTypeExtend == '0')"> {{item.actorUserName}}</span>
78
+ </h4>
79
+ </div>
80
+ <p v-html="item.nodeMask"></p>
81
+ </el-card>
82
+ </el-timeline-item>
83
+ </el-timeline>
84
+
85
+ <el-table v-show="showStyle=='表格展现'" :data="flowInstNodeArr" border stripe style="width: 100%">
86
+ <el-table-column prop="nodeName" label="节点名称" width="180">
87
+ </el-table-column>
88
+ <el-table-column prop="nodeInstStatus" label="当前状态" width="130">
89
+ <template slot-scope="scope">
90
+ <span v-if="scope.row.isAppendsign!='1'" class="table-node-inst-status-item"
91
+ :style="{backgroundColor: flowStatusColor[flowStatusCode[scope.row.nodeInstStatus]]}">{{scope.row.nodeInstStatusName}}</span>
92
+
93
+ <el-popover v-if="scope.row.isAppendsign=='1'"
94
+ placement="top"
95
+ popper-class="append-sign-popup"
96
+ width="400"
97
+ trigger="click">
98
+ <div class="flow-roam-record-content">
99
+ <el-timeline>
100
+ <el-timeline-item
101
+ v-for="(item, index) in appendSignNodeArr"
102
+ :key="index"
103
+ placement="top"
104
+ icon="el-icon-user-solid"
105
+ :color="flowStatusColor[flowStatusCode[item.nodeInstStatus]]"
106
+ :timestamp="COMMON_FUNC.dateToString(new Date(item.startTime)) + ' 至 ' + (item.endTime?COMMON_FUNC.dateToString(new Date(item.endTime)):'')">
107
+ <el-card>
108
+ <div slot="header" class="clearfix">
109
+ <h4>{{item.nodeName}}
110
+ <span style="padding-left:20px;color:#666;font-weight: normal;"> {{item.actorUserName}}</span>
111
+ </h4>
112
+ </div>
113
+ <p v-html="item.nodeMask"></p>
114
+ </el-card>
115
+ </el-timeline-item>
116
+ </el-timeline>
117
+ </div>
118
+ <span slot="reference" class="table-node-inst-status-item" style="cursor: pointer"
119
+ :style="{backgroundColor: flowStatusColor[flowStatusCode[scope.row.nodeInstStatus]]}">{{scope.row.nodeInstStatusName}}</span>
120
+ </el-popover>
121
+
122
+ </template>
123
+ </el-table-column>
124
+ <el-table-column prop="actorUserName" label="处理人" width="120">
125
+ </el-table-column>
126
+ <el-table-column label="附加说明">
127
+ <template slot-scope="scope">
128
+ <p v-html="scope.row.nodeMask"></p>
129
+ </template>
130
+ </el-table-column>
131
+ <el-table-column prop="startTime" label="处理时间" width="200">
132
+ <template slot-scope="scope">
133
+ <div>起:{{COMMON_FUNC.dateToString(new Date(scope.row.startTime))}}</div>
134
+ <div>止:{{scope.row.endTime?COMMON_FUNC.dateToString(new Date(scope.row.endTime)):''}}</div>
135
+ </template>
136
+ </el-table-column>
137
+ </el-table>
138
+ </div>
139
+ </div>
140
+ </template>
141
+
142
+ <script>
143
+ export default {
144
+ name: "roamRecord",
145
+ props: {
146
+ flowInstId: {
147
+ type: String,
148
+ default: ""
149
+ }
150
+ },
151
+ watch: {
152
+ flowInstId() {
153
+ this.init();
154
+ }
155
+ },
156
+ data() {
157
+ return {
158
+ loading: true,
159
+ flowInstNodeArr: [],
160
+ showStyle: "图形展现",
161
+ flowStatusCode: {
162
+ "0": "pending", // 待处理
163
+ "1": "finished", // 已处理
164
+ "2": "retrieve", // 已取回
165
+ "3": "return", // 已退回
166
+ "4": "stopped", // 已中止
167
+ "5": "cancel", // 已撤销
168
+ "6": "sign", // 已加签
169
+ "7": "signed", // 已转签
170
+ "8": "knot", // 已强制办结
171
+ "9": "recover" // 已恢复
172
+ },
173
+ flowStatusColor: {
174
+ "pending": "#aaa", // 待处理
175
+ "finished": "#75ce66", // 已处理
176
+ "retrieve": "#c03b44", // 已取回
177
+ "return": "#A349A4", // 已退回
178
+ "stopped": "red", // 已中止
179
+ "cancel": "#333", // 已撤销
180
+ "sign": "#aaa", // 已加签
181
+ "signed": "#75ce66", // 已转签
182
+ "knot": "orange", // 已强制办结
183
+ "recover": "#0D5DAF" // 已恢复
184
+ },
185
+ flowStatusName: [
186
+ {code: "pending", name: "待处理"},
187
+ {code: "finished", name: "已处理"},
188
+ {code: "retrieve", name: "已取回"},
189
+ {code: "return", name: "已退回"},
190
+ {code: "stopped", name: "已中止"},
191
+ {code: "sign", name: "已加签"},
192
+ {code: "signed", name: "已转签"},
193
+ {code: "knot", name: "已强制办结"},
194
+ {code: "recover", name: "已恢复"},
195
+ {code: "cancel", name: "已撤销(被取消)"},
196
+ ],
197
+
198
+ appendSignNodeArr: [],
199
+ flowNodeAppendSignDatas: []
200
+ };
201
+ },
202
+ created() {
203
+ this.init();
204
+ },
205
+ methods: {
206
+ init() {
207
+ this.flowInstNodeArr = [];
208
+ if (!this.flowInstId) {
209
+ return;
210
+ }
211
+ this.loading = true;
212
+ this.axios.post(this.api.plFlowInstNodeResult.listNoPageByResult, {
213
+ "flowInstId": this.flowInstId
214
+ }).then(res => {
215
+ this.flowInstNodeArr = this.sortFlowInstNode(res.data);
216
+ this.loading = false;
217
+ });
218
+ },
219
+
220
+ /**
221
+ * 查看加签信息
222
+ */
223
+ showCompleteSignInfos(flowInstNodeIds) {
224
+ this.flowNodeAppendSignDatas = this.viewAppendSign(flowInstNodeIds);
225
+ },
226
+
227
+ /**
228
+ * 获取流程节点示例对应的图标
229
+ */
230
+ nodeInstIcon(nodeInst) {
231
+ if (nodeInst.preNodeInstId == "-1") {
232
+ return "el-icon-caret-right";
233
+ } else if (nodeInst.nodeTypeExtend == "99") {
234
+ return "el-icon-circle-check";
235
+ } else if (nodeInst.nodeType == "1" && nodeInst.nodeTypeExtend != "0") {
236
+ return "el-icon-setting";
237
+ } else {
238
+ return "el-icon-user-solid";
239
+ }
240
+ },
241
+
242
+ /**
243
+ * 循环排序生成节点信息(之前的方法,暂时不动)
244
+ */
245
+ sortFlowInstNode(flowInstNodeArr) {
246
+
247
+ let flowInstNodePreIdObj = {}; // 用于合并节点
248
+ let resultArr = []; // 用于返回的已排序的节点数组
249
+ let prevNodeInstId = null; // 存储上一个节点
250
+ let appendSignNodeArr = []; // 存储加签节点的数组
251
+ let sAppendSignPreIds = ""; // 拼接加签节点ID的字符串
252
+ // 循环所有节点实例
253
+ for (let i = flowInstNodeArr.length - 1; i >= 0; i--) {
254
+ flowInstNodeArr[i].actorUserName = flowInstNodeArr[i].soloPassUserName || flowInstNodeArr[i].actorUserName;
255
+ if (flowInstNodeArr[i].nodeType == "1" && flowInstNodeArr[i].nodeTypeExtend != "0" && flowInstNodeArr[i].preNodeInstId != "-1") {
256
+ flowInstNodeArr[i].actorUserName = "";
257
+ } else if (flowInstNodeArr[i].nodeInstStatus == '0' && flowInstNodeArr[i].operatorAs) {
258
+ flowInstNodeArr[i].actorUserName = flowInstNodeArr[i].operatorAs;
259
+ }
260
+ // 为加签节点时,进行分离
261
+ if (flowInstNodeArr[i].isAppendsign == 1) {
262
+ // 拼接加签节点ID
263
+ sAppendSignPreIds += "," + flowInstNodeArr[i].preNodeInstId;
264
+ // 将节点存储至加签节点的数组
265
+ appendSignNodeArr.push(flowInstNodeArr[i]);
266
+
267
+ // 从要排序的节点数组中移除该节点
268
+ flowInstNodeArr.splice(i, 1);
269
+ }
270
+ }
271
+
272
+ this.appendSignNodeArr = appendSignNodeArr;
273
+
274
+ let flowInstNodeTemp; // 存储循环到的节点实例
275
+ let preNode; // 存储循环到的节点实例的逻辑节点
276
+
277
+ // 循环要排序的节点数组
278
+ for (let i = 0; i < flowInstNodeArr.length; i++) {
279
+ // 当前循环到的节点
280
+ flowInstNodeTemp = flowInstNodeArr[i];
281
+
282
+ /* 对节点进行合并 start */
283
+ /* 因为 flowInstNodeArr 中存储的是以 "节点处理结束时间" 倒序排列的节点实例,所以节点都是连续的(符合流程流转顺序,只不过是倒序),
284
+ * 由此可对上一节点ID(preNodeInstId)是一致的节点进行合并。(因为同一节点可能有多个人处理,从而会产生多个节点实例,在流转记录展示时,
285
+ * 这些节点实例属于一个逻辑节点,不适合分开展示,所以进行合并。而这些实例的上一节点ID(preNodeInstId)必定是一致的,因此可以根据 preNodeInstId 来进行合并。)*/
286
+
287
+ // 判断有无存储过当前节点类型
288
+ if (flowInstNodePreIdObj[flowInstNodeTemp.preNodeInstId]) { // 存储过时
289
+
290
+ // 获取逻辑节点
291
+ preNode = flowInstNodePreIdObj[flowInstNodeTemp.preNodeInstId];
292
+
293
+ // 拼接循环到的节点实例ID
294
+ preNode.ids += "," + flowInstNodeTemp.id;
295
+
296
+ // 拼接处理节点描述
297
+ if (flowInstNodeTemp.actorUserName && flowInstNodeTemp.nodeMask) {
298
+ preNode.nodeMask += (preNode.nodeMask && "<br/>") + flowInstNodeTemp.actorUserName + ":" + flowInstNodeTemp.nodeMask;
299
+ } else if (flowInstNodeTemp.nodeMask) {
300
+ preNode.nodeMask += (preNode.nodeMask && "<br/>") + flowInstNodeTemp.nodeMask;
301
+ }
302
+
303
+ // 拼接处理人
304
+ if (flowInstNodeTemp.actorUserName && flowInstNodeTemp.nodeInstStatusName) {
305
+ preNode.actorUserName += (preNode.actorUserName && "、") + (flowInstNodeTemp.actorUserName + "(" + flowInstNodeTemp.nodeInstStatusName + ")");
306
+ } else if (flowInstNodeTemp.actorUserName) {
307
+ preNode.actorUserName += (preNode.actorUserName && "、") + flowInstNodeTemp.actorUserName;
308
+ }
309
+
310
+ // 判断多人处理时的处理情况
311
+ if ((flowInstNodeTemp.nodeInstStatus == "0" && preNode.nodeInstStatus == "1") || (flowInstNodeTemp.nodeInstStatus == "1" && preNode.nodeInstStatus == "0")) { // 若有节点未处理,则节点显示待处理
312
+ // 进行一下操作后,流转记录该节点显示为待处理
313
+ preNode.nodeInstStatusName = "待处理";
314
+ preNode.nodeInstStatus = "0";
315
+ } else if ((flowInstNodeTemp.nodeInstStatus == "1" && preNode.nodeInstStatus == "5")) {
316
+ preNode.nodeInstStatusName = "已完成";
317
+ preNode.nodeInstStatus = "1";
318
+ preNode.endTime = flowInstNodeTemp.endTime;
319
+
320
+ if (flowInstNodeTemp.nextNodeId != "") {
321
+ preNode.nextNodeId = flowInstNodeTemp.nextNodeId;
322
+ preNode.id = flowInstNodeTemp.id;
323
+ }
324
+ } else if (flowInstNodeTemp.nodeInstStatus == "1"
325
+ && preNode.nodeInstStatus == "1"
326
+ && flowInstNodeTemp.nextNodeId) {
327
+
328
+ preNode.nextNodeId = flowInstNodeTemp.nextNodeId;
329
+ preNode.id = flowInstNodeTemp.id;
330
+ }
331
+ } else { // 若没有存储过时
332
+
333
+ // 以上一节点ID(preNodeInstId)为键存储当前循环到的节点实例
334
+ flowInstNodePreIdObj[flowInstNodeTemp.preNodeInstId] = flowInstNodeTemp;
335
+
336
+ // 拼接循环到的节点实例ID
337
+ flowInstNodePreIdObj[flowInstNodeTemp.preNodeInstId].ids = flowInstNodePreIdObj[flowInstNodeTemp.preNodeInstId].ids || "";
338
+ flowInstNodePreIdObj[flowInstNodeTemp.preNodeInstId].ids += "," + flowInstNodeTemp.id;
339
+
340
+ // 拼接节点描述
341
+ if (flowInstNodeTemp.passType == "0" && flowInstNodeTemp.processType == "1") {
342
+
343
+ } else if (flowInstNodeTemp.actorUserName && flowInstNodeTemp.nodeMask) {
344
+ flowInstNodeTemp.nodeMask = flowInstNodeTemp.actorUserName + ":" + flowInstNodeTemp.nodeMask;
345
+ } else if (!flowInstNodeTemp.nodeMask) {
346
+ flowInstNodeTemp.nodeMask = "";
347
+ }
348
+
349
+ // 格式化处理人
350
+ if (flowInstNodeTemp.actorUserName && flowInstNodeTemp.nodeInstStatusName) {
351
+ flowInstNodeTemp.actorUserName = flowInstNodeTemp.actorUserName + "(" + flowInstNodeTemp.nodeInstStatusName + ")";
352
+ } else if (!flowInstNodeTemp.actorUserName) {
353
+ flowInstNodeTemp.actorUserName = "";
354
+ }
355
+ }
356
+ /* 对节点进行合并 end */
357
+
358
+ // 为开始节点时,存储该节点信息以做排序
359
+ if (flowInstNodeTemp.preNodeInstId == "-1") {
360
+ resultArr.push(flowInstNodeTemp);
361
+ prevNodeInstId = flowInstNodeTemp.id;
362
+ }
363
+ }
364
+
365
+ let index = 0; // 循环变量
366
+ let bIsAppendSign; // 用于循环中判断是否加签
367
+ let preIdsArr; // 用于循环到的逻辑节点包含的节点实例ID
368
+
369
+ // 节点排序,循环条件可预防出现死循环JS卡住
370
+ while ((index++) < 10000 && prevNodeInstId != null) {
371
+ // 若该逻辑节点为空,则退出循环
372
+ if (!flowInstNodePreIdObj[prevNodeInstId]) {
373
+ break;
374
+ }
375
+
376
+ // 重置值
377
+ bIsAppendSign = false;
378
+ // 获取当前逻辑节点的节点实例ID数组
379
+ preIdsArr = flowInstNodePreIdObj[prevNodeInstId].ids.split(",");
380
+
381
+ // 循环节点实例ID
382
+ for (let i = 0; i < preIdsArr.length; i++) {
383
+ // 若加签节点数组中包含该节点实例ID
384
+ if (preIdsArr[i] && sAppendSignPreIds.indexOf(preIdsArr[i]) > -1) {
385
+ // 判断为加签并结束当前循环
386
+ bIsAppendSign = true;
387
+ break;
388
+ }
389
+ }
390
+
391
+ // 若进行过加签,则给节点加上提示
392
+ if (bIsAppendSign) {
393
+ flowInstNodePreIdObj[prevNodeInstId].isAppendsign = 1;
394
+ flowInstNodePreIdObj[prevNodeInstId].nodeInstStatusName += "(加签)";
395
+ }
396
+
397
+ // 将节点添加至要返回的数组并迭代下个逻辑节点
398
+ resultArr.push(flowInstNodePreIdObj[prevNodeInstId]);
399
+ prevNodeInstId = flowInstNodePreIdObj[prevNodeInstId].id;
400
+ }
401
+
402
+ // 返回已排序的节点数组
403
+ flowInstNodeArr = resultArr;
404
+ return resultArr;
405
+ },
406
+
407
+ viewAppendSign(signNodeId) {
408
+ let appendSignNodeIds = "$," + signNodeId; // 上一节点ID串
409
+ let isExitNextId = true; // 是否存在下一节点
410
+ let index = 0; // 循环变量,预防死循环
411
+ let iAppendSignSize = this.appendSignNodeArr.length; // 加签数组长度
412
+ let arrShowNodes = []; // 存储要展示的加签节点
413
+
414
+ // 根据获取要展示的加签节点
415
+ while ((index++) < iAppendSignSize && isExitNextId) {
416
+ // 置为不存在下一节点
417
+ isExitNextId = false;
418
+
419
+ // 循环加签数组
420
+ for (let i = 0; i < iAppendSignSize; i++) {
421
+ // 若匹配且非已获取过的加签节点
422
+ if (appendSignNodeIds.indexOf(this.appendSignNodeArr[i].preNodeInstId) > -1
423
+ && appendSignNodeIds.indexOf(this.appendSignNodeArr[i].id) == -1
424
+ ) {
425
+ // 置为存在下一节点
426
+ isExitNextId = true;
427
+ // 拼接进上一节点ID串中,待下一次外层循环中重新进行匹配
428
+ appendSignNodeIds += "," + this.appendSignNodeArr[i].id;
429
+ // 添加至要展示的加签节点数组
430
+ arrShowNodes.push(this.appendSignNodeArr[i]);
431
+ }
432
+ }
433
+ }
434
+
435
+ let nodeTmp = null; //用于冒泡排序的临时变量
436
+
437
+ // 对要展示的加签节点数组按处理时间进行冒泡排序
438
+ for (let i = 0; i < arrShowNodes.length; i++) {
439
+ for (let j = i + 1; j < arrShowNodes.length; j++) {
440
+ if (arrShowNodes[j].startTime && arrShowNodes[j].endTime
441
+ && (arrShowNodes[j].startTime <= arrShowNodes[i].startTime)
442
+ && (arrShowNodes[j].endTime <= arrShowNodes[i].endTime)) {
443
+ nodeTmp = arrShowNodes[i];
444
+ arrShowNodes[i] = arrShowNodes[j];
445
+ arrShowNodes[j] = nodeTmp;
446
+ }
447
+ }
448
+ }
449
+
450
+ return arrShowNodes;
451
+ }
452
+ }
453
+ }
454
+ </script>
455
+
456
+ <style lang="scss">
457
+ .append-sign-popup {
458
+ box-shadow: 0 2px 24px 0 rgba(0, 0, 0, 0.5);
459
+ }
460
+ </style>
461
+
462
+ <style scoped lang="scss">
463
+ #roamRecordContainer {
464
+ padding: 10px 20px;
465
+ overflow-y: scroll;
466
+ }
467
+
468
+
469
+ #roamRecordContainer::-webkit-scrollbar {
470
+ width: 4px;
471
+ }
472
+
473
+
474
+ /* 滚动槽 */
475
+ #roamRecordContainer::-webkit-scrollbar-track {
476
+ background: #eee;
477
+ }
478
+
479
+ /* 滚动条滑块 */
480
+ #roamRecordContainer::-webkit-scrollbar-thumb {
481
+ background: #999;
482
+ }
483
+
484
+ .flow-summary {
485
+ line-height: 26px;
486
+ }
487
+
488
+ .flow-color {
489
+ .flow-color-content {
490
+ line-height: 26px;
491
+
492
+ .flow-color-item {
493
+ padding-right: 10px;
494
+
495
+ .flow-color-item-radius {
496
+ width: 16px;
497
+ height: 16px;
498
+ border-radius: 8px;
499
+ display: inline-block;
500
+ vertical-align: middle;
501
+ margin-right: 3px;
502
+ }
503
+
504
+ .flow-color-item-text {
505
+ height: 26px;
506
+
507
+ display: inline-block;
508
+ vertical-align: middle;
509
+ }
510
+ }
511
+ }
512
+ }
513
+
514
+ .flow-roam-record-content {
515
+ padding: 20px 20px 0 20px;
516
+
517
+ /deep/ {
518
+
519
+
520
+ .appendsign-item {
521
+ .appendsign-item-mask {
522
+ position: absolute;
523
+ left: -20px;
524
+ width: 52px;
525
+ height: 55px;
526
+ top: 0;
527
+ cursor: pointer;
528
+
529
+ .appendsign-item-icon {
530
+ position: absolute;
531
+ right: -10px;
532
+ top: -15px;
533
+ font-size: 20px;
534
+ color: #666;
535
+ }
536
+ }
537
+
538
+ }
539
+
540
+ .table-node-inst-status-item {
541
+ display: inline-block;
542
+ line-height: 26px;
543
+ border-radius: 3px;
544
+ padding: 0 10px;
545
+ color: white;
546
+ }
547
+
548
+ .el-timeline-item__wrapper {
549
+ padding-left: 45px;
550
+ }
551
+
552
+ .el-timeline-item__node--normal {
553
+ width: 50px;
554
+ height: 50px;
555
+ left: -20px;
556
+
557
+ .el-timeline-item__icon {
558
+ font-size: 35px;
559
+ }
560
+ }
561
+
562
+ .el-card__header {
563
+ padding: 12px 20px;
564
+ }
565
+ }
566
+ }
567
+ </style>