@steedos-labs/plugin-workflow 3.0.65 → 3.0.66
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/designer/dist/amis-renderer/amis-renderer.css +1 -1
- package/designer/dist/amis-renderer/amis-renderer.js +1 -1
- package/designer/dist/assets/{index-CdtiiXeP.js → index-DX2PUSq4.js} +136 -136
- package/designer/dist/assets/index-YXPc2HMf.css +1 -0
- package/designer/dist/index.html +2 -2
- package/main/default/client/socket.client.js +43 -13
- package/main/default/objects/flows/flows.object.yml +4 -9
- package/main/default/pages/flow_selector.page.amis.json +2 -2
- package/main/default/pages/flow_selector_mobile.page.amis.json +2 -2
- package/main/default/pages/page_instance_print.page.amis.json +103 -34
- package/main/default/routes/api_workflow_approve_save.router.js +7 -0
- package/main/default/routes/api_workflow_forward.router.js +4 -4
- package/main/default/routes/api_workflow_forward_refill.router.js +1 -1
- package/main/default/routes/api_workflow_instance_forward.router.js +4 -4
- package/main/default/services/instance.service.js +1 -0
- package/main/default/test/test_socket_reconnect.js +105 -0
- package/main/default/utils/designerManager.js +12 -0
- package/package.json +1 -1
- package/public/amis-renderer/amis-renderer.css +1 -1
- package/public/amis-renderer/amis-renderer.js +1 -1
- package/src/instance_record_queue.js +326 -207
- package/designer/dist/assets/index-CFR_MNwA.css +0 -1
|
@@ -89,16 +89,16 @@
|
|
|
89
89
|
"name": "radios",
|
|
90
90
|
"type": "radios",
|
|
91
91
|
"label": false,
|
|
92
|
-
"value": "
|
|
92
|
+
"value": "210",
|
|
93
93
|
"className": "mr-0",
|
|
94
94
|
"options": [
|
|
95
95
|
{
|
|
96
96
|
"label": "A4纵向",
|
|
97
|
-
"value": "
|
|
97
|
+
"value": "210"
|
|
98
98
|
},
|
|
99
99
|
{
|
|
100
100
|
"label": "A4横向",
|
|
101
|
-
"value": "
|
|
101
|
+
"value": "297"
|
|
102
102
|
}
|
|
103
103
|
],
|
|
104
104
|
"mode": "inline",
|
|
@@ -107,7 +107,7 @@
|
|
|
107
107
|
"actions": [
|
|
108
108
|
{
|
|
109
109
|
"actionType": "custom",
|
|
110
|
-
"script": "doAction({actionType: 'setValue', componentId: 'u:print-width', args: {value: Number(event.data.value)}}); $('.steedos-instance-related-view-wrapper
|
|
110
|
+
"script": "doAction({actionType: 'setValue', componentId: 'u:print-width', args: {value: Number(event.data.value)}}); $('.steedos-instance-related-view-wrapper').css('width', event.data.value + 'mm'); var orientation = event.data.value === '297' ? 'landscape' : 'portrait'; var styleEl = document.getElementById('print-page-orientation'); if (!styleEl) { styleEl = document.createElement('style'); styleEl.id = 'print-page-orientation'; document.head.appendChild(styleEl); } styleEl.textContent = '@page { size: A4 ' + orientation + '; }';"
|
|
111
111
|
}
|
|
112
112
|
]
|
|
113
113
|
}
|
|
@@ -117,7 +117,7 @@
|
|
|
117
117
|
"name": "width",
|
|
118
118
|
"type": "input-number",
|
|
119
119
|
"id": "u:print-width",
|
|
120
|
-
"value": "
|
|
120
|
+
"value": "210",
|
|
121
121
|
"mode": "inline",
|
|
122
122
|
"className": "w-20 mr-0",
|
|
123
123
|
"min": "100",
|
|
@@ -126,7 +126,7 @@
|
|
|
126
126
|
"actions": [
|
|
127
127
|
{
|
|
128
128
|
"actionType": "custom",
|
|
129
|
-
"script": "$('.steedos-instance-related-view-wrapper
|
|
129
|
+
"script": "$('.steedos-instance-related-view-wrapper').css('width', event.data.value + 'mm');"
|
|
130
130
|
}
|
|
131
131
|
]
|
|
132
132
|
}
|
|
@@ -233,28 +233,45 @@
|
|
|
233
233
|
},
|
|
234
234
|
"editorState": "default",
|
|
235
235
|
"css": {
|
|
236
|
+
"body": {
|
|
237
|
+
"background-color": "#C0C0C0"
|
|
238
|
+
},
|
|
239
|
+
"body > .bg-slate-50": {
|
|
240
|
+
"background-color": "transparent !important"
|
|
241
|
+
},
|
|
242
|
+
".steedos-instance-related-view-wrapper": {
|
|
243
|
+
"width": "210mm",
|
|
244
|
+
"margin": "0 auto",
|
|
245
|
+
"background-color": "#fff"
|
|
246
|
+
},
|
|
236
247
|
".steedos-instance-related-view-wrapper > .antd-Page-content": {
|
|
237
|
-
"
|
|
238
|
-
"transition": "width 0.5s ease-in-out",
|
|
239
|
-
"width": "unset"
|
|
248
|
+
"transition": "width 0.5s ease-in-out"
|
|
240
249
|
},
|
|
241
250
|
".steedos-instance-related-view-wrapper .instance-form": {
|
|
242
|
-
"width": "
|
|
251
|
+
"width": "100%",
|
|
252
|
+
"margin": "0 auto",
|
|
253
|
+
"padding": "0 15px",
|
|
243
254
|
"transition": "width 0.5s ease-in-out"
|
|
244
255
|
},
|
|
245
256
|
".steedos-instance-related-view-wrapper .instance-approve-history": {
|
|
246
|
-
"width": "
|
|
257
|
+
"width": "100%",
|
|
258
|
+
"margin": "0 auto",
|
|
259
|
+
"padding": "0 15px",
|
|
247
260
|
"transition": "width 0.5s ease-in-out"
|
|
248
261
|
},
|
|
249
|
-
".steedos-instance-related-view-wrapper .
|
|
250
|
-
"
|
|
262
|
+
".steedos-instance-related-view-wrapper .instance-name": {
|
|
263
|
+
"margin": "10px 0 5px 0"
|
|
264
|
+
},
|
|
265
|
+
".steedos-instance-related-view-wrapper .table-page-title": {
|
|
266
|
+
"display": "none !important"
|
|
267
|
+
},
|
|
268
|
+
".steedos-instance-related-view-wrapper .table-page-body.form-table > tbody > tr:first-child": {
|
|
269
|
+
"visibility": "collapse"
|
|
251
270
|
},
|
|
252
271
|
".steedos-amis-instance-view-body": {
|
|
253
|
-
"padding": "
|
|
254
|
-
"margin": "
|
|
255
|
-
"
|
|
256
|
-
"flex-direction": "column",
|
|
257
|
-
"align-items": "center"
|
|
272
|
+
"padding": "0",
|
|
273
|
+
"margin": "0",
|
|
274
|
+
"align-items": "stretch"
|
|
258
275
|
},
|
|
259
276
|
".steedos-global-header-root": {
|
|
260
277
|
"display": "none"
|
|
@@ -353,23 +370,39 @@
|
|
|
353
370
|
"height": "auto !important",
|
|
354
371
|
"overflow": "visible !important",
|
|
355
372
|
"display": "block !important",
|
|
356
|
-
"position": "static !important"
|
|
373
|
+
"position": "static !important",
|
|
374
|
+
"background-color": "#fff !important"
|
|
357
375
|
},
|
|
358
376
|
".resize-sensor, .no-print, .antd-Page-toolbar, .steedos-global-header-root": {
|
|
359
377
|
"display": "none !important"
|
|
360
378
|
},
|
|
361
|
-
".steedos-instance-related-view-wrapper
|
|
379
|
+
".steedos-instance-related-view-wrapper": {
|
|
362
380
|
"display": "block !important",
|
|
363
381
|
"height": "auto !important",
|
|
364
|
-
"
|
|
382
|
+
"margin": "0 auto !important",
|
|
365
383
|
"overflow": "visible !important",
|
|
366
384
|
"flex": "none !important",
|
|
367
385
|
"position": "static !important"
|
|
368
386
|
},
|
|
387
|
+
".steedos-instance-related-view-wrapper .antd-Page-content, .steedos-instance-related-view-wrapper .antd-Page-main, .steedos-instance-related-view-wrapper .antd-Page-body, .steedos-instance-related-view-wrapper .steedos-instance-detail-wrapper, .steedos-instance-related-view-wrapper .antd-Service, .steedos-instance-related-view-wrapper .antd-Wrapper, .steedos-instance-related-view-wrapper .steedos-amis-instance-view, .steedos-instance-related-view-wrapper .steedos-amis-instance-view-body, .steedos-instance-related-view-wrapper .steedos-amis-instance-view-content, .steedos-instance-related-view-wrapper .liquid-amis-container": {
|
|
388
|
+
"display": "block !important",
|
|
389
|
+
"height": "auto !important",
|
|
390
|
+
"width": "100% !important",
|
|
391
|
+
"overflow": "visible !important",
|
|
392
|
+
"flex": "none !important",
|
|
393
|
+
"position": "static !important",
|
|
394
|
+
"padding": "0 !important",
|
|
395
|
+
"margin": "0 !important"
|
|
396
|
+
},
|
|
369
397
|
".steedos-instance-related-view-wrapper .instance-form": {
|
|
370
398
|
"margin": "0 auto",
|
|
371
|
-
"
|
|
372
|
-
"
|
|
399
|
+
"padding": "0 15px !important",
|
|
400
|
+
"width": "100% !important"
|
|
401
|
+
},
|
|
402
|
+
".steedos-instance-related-view-wrapper .instance-approve-history": {
|
|
403
|
+
"margin": "0 auto",
|
|
404
|
+
"padding": "0 15px !important",
|
|
405
|
+
"width": "100% !important"
|
|
373
406
|
},
|
|
374
407
|
".steedos-instance-related-view-wrapper .instance-form-view": {
|
|
375
408
|
"table-layout": "fixed !important",
|
|
@@ -380,39 +413,75 @@
|
|
|
380
413
|
"display": "block !important"
|
|
381
414
|
},
|
|
382
415
|
".steedos-instance-related-view-wrapper .antd-Table-contentWrap": {
|
|
383
|
-
"overflow-y": "visible !important",
|
|
384
416
|
"overflow-x": "auto !important",
|
|
385
417
|
"display": "block !important",
|
|
386
418
|
"width": "100% !important",
|
|
387
419
|
"height": "auto !important"
|
|
388
420
|
},
|
|
421
|
+
".steedos-instance-related-view-wrapper .instance-form .td-childfield": {
|
|
422
|
+
"overflow-x": "auto !important",
|
|
423
|
+
"overflow-y": "visible !important"
|
|
424
|
+
},
|
|
389
425
|
".steedos-instance-related-view-wrapper .instance-form-view td": {
|
|
390
426
|
"border-width": "1px !important"
|
|
391
427
|
},
|
|
392
428
|
".steedos-instance-related-view-wrapper .steedos-input-table .antd-Table-table": {
|
|
393
429
|
"-webkit-print-color-adjust": "exact !important",
|
|
394
430
|
"print-color-adjust": "exact !important",
|
|
395
|
-
"table-layout": "auto !important"
|
|
431
|
+
"table-layout": "auto !important",
|
|
432
|
+
"width": "100% !important",
|
|
433
|
+
"border-collapse": "collapse !important"
|
|
434
|
+
},
|
|
435
|
+
".steedos-instance-related-view-wrapper .steedos-input-table .antd-Table-table thead": {
|
|
436
|
+
"display": "table-row-group !important"
|
|
396
437
|
},
|
|
397
438
|
".steedos-instance-related-view-wrapper .steedos-input-table .antd-Table-table th": {
|
|
398
439
|
"border-left": "1px solid #000 !important",
|
|
440
|
+
"border-right": "1px solid #000 !important",
|
|
399
441
|
"border-bottom": "1px solid #000 !important",
|
|
442
|
+
"border-top": "none !important",
|
|
400
443
|
"white-space": "normal !important"
|
|
401
444
|
},
|
|
445
|
+
".steedos-instance-related-view-wrapper .steedos-input-table .antd-Table-table th:first-child, .steedos-instance-related-view-wrapper .steedos-input-table .antd-Table-table td:first-child": {
|
|
446
|
+
"border-left": "none !important"
|
|
447
|
+
},
|
|
448
|
+
".steedos-instance-related-view-wrapper .steedos-input-table .antd-Table-table th:last-child, .steedos-instance-related-view-wrapper .steedos-input-table .antd-Table-table td:last-child": {
|
|
449
|
+
"border-right": "none !important"
|
|
450
|
+
},
|
|
402
451
|
".steedos-instance-related-view-wrapper .steedos-input-table .antd-Table-table td": {
|
|
403
|
-
"border
|
|
404
|
-
|
|
452
|
+
"border": "1px solid #000 !important"
|
|
453
|
+
},
|
|
454
|
+
".steedos-instance-related-view-wrapper .steedos-input-table .antd-Table-table th.antd-Table-operationCell, .steedos-instance-related-view-wrapper .steedos-input-table .antd-Table-table td.antd-Table-operationCell, .steedos-instance-related-view-wrapper .steedos-input-table .antd-Table-table td.steedos-input-table-column-operation": {
|
|
455
|
+
"display": "none !important"
|
|
405
456
|
},
|
|
406
|
-
".steedos-instance-related-view-wrapper .steedos-input-table .antd-Table-table
|
|
407
|
-
"
|
|
408
|
-
"
|
|
409
|
-
"
|
|
457
|
+
".steedos-instance-related-view-wrapper .steedos-input-table .antd-Table-table tbody td .antd-Form-static": {
|
|
458
|
+
"word-break": "normal !important",
|
|
459
|
+
"white-space": "normal !important",
|
|
460
|
+
"overflow": "visible !important",
|
|
461
|
+
"text-overflow": "clip !important",
|
|
462
|
+
"max-width": "none !important"
|
|
410
463
|
},
|
|
411
|
-
".steedos-instance-related-view-wrapper .steedos-input-table .antd-
|
|
412
|
-
"
|
|
464
|
+
".steedos-instance-related-view-wrapper .steedos-input-table .antd-Table-table tbody td .antd-PlainField, .steedos-instance-related-view-wrapper .steedos-input-table .antd-Table-table tbody td .antd-TplField, .steedos-instance-related-view-wrapper .steedos-input-table .antd-Table-table tbody td .antd-Words-field": {
|
|
465
|
+
"white-space": "normal !important",
|
|
466
|
+
"overflow": "visible !important",
|
|
467
|
+
"text-overflow": "clip !important",
|
|
468
|
+
"max-width": "none !important",
|
|
469
|
+
"display": "inline !important"
|
|
413
470
|
},
|
|
414
471
|
".steedos-instance-related-view-wrapper .instance-approve-history .antd-Table-table tr td": {
|
|
415
472
|
"border-bottom": "1px solid #e8e8e8 !important"
|
|
473
|
+
},
|
|
474
|
+
".antd-Table-content.scroll-end": {
|
|
475
|
+
"direction": "rtl !important"
|
|
476
|
+
},
|
|
477
|
+
".antd-Table-content.scroll-end table": {
|
|
478
|
+
"direction": "ltr !important"
|
|
479
|
+
},
|
|
480
|
+
".steedos-instance-related-view-wrapper .table-page-body.form-table > tbody > tr:first-child": {
|
|
481
|
+
"display": "none !important"
|
|
482
|
+
},
|
|
483
|
+
".steedos-instance-related-view-wrapper .table-page-body.form-table > tbody > tr:nth-child(2) td": {
|
|
484
|
+
"border-top": "none !important"
|
|
416
485
|
}
|
|
417
486
|
}
|
|
418
487
|
},
|
|
@@ -422,7 +491,7 @@
|
|
|
422
491
|
"actions": [
|
|
423
492
|
{
|
|
424
493
|
"actionType": "custom",
|
|
425
|
-
"script": "document.querySelectorAll('link[rel=\"stylesheet\"]').forEach(link => { if (link.href.includes('salesforce-lightning-design-system.min.css')) { link.remove(); } }); var
|
|
494
|
+
"script": "document.querySelectorAll('link[rel=\"stylesheet\"]').forEach(link => { if (link.href.includes('salesforce-lightning-design-system.min.css')) { link.remove(); } }); for(var si=0;si<document.styleSheets.length;si++){try{var sh=document.styleSheets[si];if(!sh.href||!sh.href.match(/index-[A-Za-z0-9]+\\.css/))continue;for(var ri=sh.cssRules.length-1;ri>=0;ri--){var sel=sh.cssRules[ri].selectorText||'';if(sel.match(/^::?-webkit-scrollbar/))sh.deleteRule(ri);}}catch(e){}} var styleEl=document.createElement('style'); styleEl.id='print-page-orientation'; styleEl.textContent='@page { size: A4 portrait; }'; document.head.appendChild(styleEl); document.addEventListener('scroll',function(e){var t=e.target;if(t&&t.classList&&t.classList.contains('antd-Table-content')){if(window._isPrinting)return;var sl=t.scrollLeft;var max=t.scrollWidth-t.clientWidth;if(sl>0&&sl>=max-1){t.classList.add('scroll-end');}else{t.classList.remove('scroll-end');}}},true); window.addEventListener('beforeprint',function(){window._isPrinting=true;}); window.addEventListener('afterprint',function(){window._isPrinting=false;});"
|
|
426
495
|
},
|
|
427
496
|
{
|
|
428
497
|
"actionType": "custom",
|
|
@@ -52,6 +52,13 @@ router.post('/api/workflow/v2/approve/save', requireAuthentication, afterHook, a
|
|
|
52
52
|
});
|
|
53
53
|
const lang = current_user.locale == 'zh-cn' ? 'zh-CN' : 'en';
|
|
54
54
|
|
|
55
|
+
// 传阅(cc)类型:已结束的流程直接返回成功,不做任何操作
|
|
56
|
+
if (current_approve.type === 'cc' && instance.state !== 'pending') {
|
|
57
|
+
return res.status(200).send({
|
|
58
|
+
'instance': instance
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
55
62
|
try {
|
|
56
63
|
await UUFlowManager.isInstancePending(instance, lang);
|
|
57
64
|
await UUFlowManager.isTraceNotFinished(current_trace);
|
|
@@ -185,7 +185,7 @@ router.post('/api/workflow/forward', requireAuthentication, async function (req,
|
|
|
185
185
|
})
|
|
186
186
|
|
|
187
187
|
select_to_input_fields.forEach(function (field) {
|
|
188
|
-
if (old_values[field.code]) {
|
|
188
|
+
if (old_values[field.code] != null) {
|
|
189
189
|
new_values[field.code] = old_values[field.code];
|
|
190
190
|
}
|
|
191
191
|
})
|
|
@@ -200,7 +200,7 @@ router.post('/api/workflow/forward', requireAuthentication, async function (req,
|
|
|
200
200
|
}
|
|
201
201
|
var key = f.code;
|
|
202
202
|
var old_v = old_values[key];
|
|
203
|
-
if (old_v) {
|
|
203
|
+
if (old_v != null) {
|
|
204
204
|
var fieldOptions = f.options && f.options.split && f.options.split("\n").map(function (n) {
|
|
205
205
|
var itemSplits = n.split(":");
|
|
206
206
|
return {
|
|
@@ -242,7 +242,7 @@ router.post('/api/workflow/forward', requireAuthentication, async function (req,
|
|
|
242
242
|
}
|
|
243
243
|
var key = f.code;
|
|
244
244
|
var old_v = old_table_row_values[key];
|
|
245
|
-
if (old_v) {
|
|
245
|
+
if (old_v != null) {
|
|
246
246
|
var fieldOptions = f.options && f.options.split && f.options.split("\n").map(function (n) {
|
|
247
247
|
var itemSplits = n.split(":");
|
|
248
248
|
return {
|
|
@@ -287,7 +287,7 @@ router.post('/api/workflow/forward', requireAuthentication, async function (req,
|
|
|
287
287
|
}
|
|
288
288
|
var key = field.code;
|
|
289
289
|
var old_v = old_values[key];
|
|
290
|
-
if (old_v) {
|
|
290
|
+
if (old_v != null) {
|
|
291
291
|
// 校验 单选,多选,下拉框 字段值是否在新表单对应字段的可选值范围内
|
|
292
292
|
var fieldOptions = field.options && field.options.split && field.options.split("\n").map(function (n) {
|
|
293
293
|
var itemSplits = n.split(":");
|
|
@@ -89,7 +89,7 @@ router.post('/api/workflow/forward_refill', requireAuthentication, async functio
|
|
|
89
89
|
table_data = (approve != null ? approve.values[subTable] : void 0) || [];
|
|
90
90
|
row_data = {};
|
|
91
91
|
columns.forEach(function (column) {
|
|
92
|
-
return row_data[column] = forward_ins_values[column]
|
|
92
|
+
return row_data[column] = forward_ins_values[column] ?? "";
|
|
93
93
|
});
|
|
94
94
|
if (row_data && row_data !== {}) {
|
|
95
95
|
table_data.push(row_data);
|
|
@@ -203,7 +203,7 @@ router.post("/api/workflow/v2/instance/forward", requireAuthentication, async fu
|
|
|
203
203
|
|
|
204
204
|
// Process select to input fields
|
|
205
205
|
for (const field of select_to_input_fields) {
|
|
206
|
-
if (old_values[field.code]) {
|
|
206
|
+
if (old_values[field.code] != null) {
|
|
207
207
|
new_values[field.code] = old_values[field.code];
|
|
208
208
|
}
|
|
209
209
|
}
|
|
@@ -218,7 +218,7 @@ router.post("/api/workflow/v2/instance/forward", requireAuthentication, async fu
|
|
|
218
218
|
}
|
|
219
219
|
const key = f.code;
|
|
220
220
|
let old_v = old_values[key];
|
|
221
|
-
if (old_v) {
|
|
221
|
+
if (old_v != null) {
|
|
222
222
|
const fieldOptions = _.isArray(f.options) ? f.options : f.options?.split("\n").map(n => {
|
|
223
223
|
const itemSplits = n.split(":");
|
|
224
224
|
return {
|
|
@@ -258,7 +258,7 @@ router.post("/api/workflow/v2/instance/forward", requireAuthentication, async fu
|
|
|
258
258
|
}
|
|
259
259
|
const key = f.code;
|
|
260
260
|
let old_v = old_table_row_values[key];
|
|
261
|
-
if (old_v) {
|
|
261
|
+
if (old_v != null) {
|
|
262
262
|
const fieldOptions = f.options?.split("\n").map(n => {
|
|
263
263
|
const itemSplits = n.split(":");
|
|
264
264
|
return {
|
|
@@ -301,7 +301,7 @@ router.post("/api/workflow/v2/instance/forward", requireAuthentication, async fu
|
|
|
301
301
|
}
|
|
302
302
|
const key = field.code;
|
|
303
303
|
let old_v = old_values[key];
|
|
304
|
-
if (old_v) {
|
|
304
|
+
if (old_v != null) {
|
|
305
305
|
const fieldOptions = _.isArray(field.options) ? field.options : field.options?.split("\n").map(n => {
|
|
306
306
|
const itemSplits = n.split(":");
|
|
307
307
|
return {
|
|
@@ -145,6 +145,7 @@ module.exports = {
|
|
|
145
145
|
filter.push(['handler', '=', userId]);
|
|
146
146
|
filter.push(['is_finished', '=', true]);
|
|
147
147
|
filter.push(['is_latest_approve', '=', true]);
|
|
148
|
+
filter.push(['type', '!=', 'draft']);
|
|
148
149
|
break;
|
|
149
150
|
case 'draft':
|
|
150
151
|
filter.push(['submitter', '=', userId]);
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Socket 重连相关 Bug 测试脚本
|
|
3
|
+
*
|
|
4
|
+
* 测试两个问题:
|
|
5
|
+
* Bug 1: Socket 重连后,badge 数据没变化时仍触发左侧菜单重载(显示 loading)
|
|
6
|
+
* Bug 2: 初始加载时若 socket 已连接,connection-init listener 未注册,
|
|
7
|
+
* 导致重连后不会重新 subscribe,badge 推送完全收不到
|
|
8
|
+
*
|
|
9
|
+
* 使用方式:
|
|
10
|
+
* 1. 在审批中心页面(如 /app/approve_workflow/instance_tasks/...)打开浏览器控制台
|
|
11
|
+
* 2. 粘贴本脚本执行,或通过 MCP Chrome evaluate_script 注入
|
|
12
|
+
* 3. 返回 { bug1, bug2 } 测试结果
|
|
13
|
+
*
|
|
14
|
+
* 预期(修复前):bug1.passed = false, bug2.passed = false
|
|
15
|
+
* 预期(修复后):bug1.passed = true, bug2.passed = true
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
async function testSocketReconnectBugs() {
|
|
19
|
+
const results = {
|
|
20
|
+
bug1: { name: 'Badge 未变化时不应触发菜单重载', passed: false, detail: '' },
|
|
21
|
+
bug2: { name: '重连后应能收到 badge 推送', passed: false, detail: '' },
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const socket = window.socket;
|
|
25
|
+
if (!socket) {
|
|
26
|
+
results.bug1.detail = results.bug2.detail = 'window.socket 不存在';
|
|
27
|
+
return results;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// ======== Bug 1 测试 ========
|
|
31
|
+
// 断开 → 重连 → 等待 badge 事件 → 检查是否触发了 approval-tree-menu:reload
|
|
32
|
+
{
|
|
33
|
+
let menuReloadFired = false;
|
|
34
|
+
let badgeReceived = false;
|
|
35
|
+
|
|
36
|
+
const onMessage = (event) => {
|
|
37
|
+
const msg = event.data;
|
|
38
|
+
if (msg && msg.type === 'approval-tree-menu:reload') {
|
|
39
|
+
menuReloadFired = true;
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
window.addEventListener('message', onMessage);
|
|
43
|
+
|
|
44
|
+
const onBadge = () => { badgeReceived = true; };
|
|
45
|
+
socket.on('s:workflow:badge:change', onBadge);
|
|
46
|
+
|
|
47
|
+
// 断开并重连
|
|
48
|
+
socket.disconnect();
|
|
49
|
+
await sleep(500);
|
|
50
|
+
socket.connect();
|
|
51
|
+
|
|
52
|
+
// 等待重连 + 服务端3秒延迟推送 badge + 1秒余量
|
|
53
|
+
await sleep(5000);
|
|
54
|
+
|
|
55
|
+
socket.off('s:workflow:badge:change', onBadge);
|
|
56
|
+
window.removeEventListener('message', onMessage);
|
|
57
|
+
|
|
58
|
+
if (!badgeReceived) {
|
|
59
|
+
// 如果连 badge 事件都没收到,说明 Bug 2 存在,Bug 1 无法独立判断
|
|
60
|
+
results.bug1.detail = '未收到 badge 事件(可能因 Bug 2),无法独立判断 Bug 1';
|
|
61
|
+
results.bug1.passed = null; // 未知
|
|
62
|
+
} else if (menuReloadFired) {
|
|
63
|
+
results.bug1.detail = '重连后 badge 数据未变化,但 approval-tree-menu:reload 被触发了(Bug 存在)';
|
|
64
|
+
results.bug1.passed = false;
|
|
65
|
+
} else {
|
|
66
|
+
results.bug1.detail = '重连后 badge 数据未变化,approval-tree-menu:reload 未触发(正常)';
|
|
67
|
+
results.bug1.passed = true;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// ======== Bug 2 测试 ========
|
|
72
|
+
// 再次断开 → 重连 → 检查是否重新 subscribe 并收到 badge 事件
|
|
73
|
+
{
|
|
74
|
+
let badgeReceived = false;
|
|
75
|
+
|
|
76
|
+
const onBadge = () => { badgeReceived = true; };
|
|
77
|
+
socket.on('s:workflow:badge:change', onBadge);
|
|
78
|
+
|
|
79
|
+
socket.disconnect();
|
|
80
|
+
await sleep(500);
|
|
81
|
+
socket.connect();
|
|
82
|
+
|
|
83
|
+
// 等待重连 + 服务端3秒延迟推送 + 1秒余量
|
|
84
|
+
await sleep(5000);
|
|
85
|
+
|
|
86
|
+
socket.off('s:workflow:badge:change', onBadge);
|
|
87
|
+
|
|
88
|
+
if (badgeReceived) {
|
|
89
|
+
results.bug2.detail = '重连后成功收到 badge 推送(正常)';
|
|
90
|
+
results.bug2.passed = true;
|
|
91
|
+
} else {
|
|
92
|
+
results.bug2.detail = '重连后未收到 badge 推送,subscribe 可能丢失(Bug 存在)';
|
|
93
|
+
results.bug2.passed = false;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return results;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function sleep(ms) {
|
|
101
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// 导出给 MCP 调用
|
|
105
|
+
window._testSocketReconnectBugs = testSocketReconnectBugs;
|
|
@@ -247,6 +247,18 @@ async function updateForm(formId, form, forms, flows, currentUserId) {
|
|
|
247
247
|
}
|
|
248
248
|
} else {
|
|
249
249
|
current = ff.current;
|
|
250
|
+
// 即使表单不升级,也要更新关联流程的修改时间和修改人
|
|
251
|
+
let flowCursor = await flowCollection.find({form: formId});
|
|
252
|
+
let flowList = await flowCursor.toArray();
|
|
253
|
+
for (let flow of flowList) {
|
|
254
|
+
await flowCollection.updateOne({_id: flow._id}, {
|
|
255
|
+
$set: {
|
|
256
|
+
'modified': now,
|
|
257
|
+
'modified_by': currentUserId
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
flows.push(await flowCollection.findOne({_id: flow._id}));
|
|
261
|
+
}
|
|
250
262
|
}
|
|
251
263
|
|
|
252
264
|
current.modified = now;
|