@steedos-labs/plugin-workflow 3.0.0-beta.9 → 3.0.1-beta.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 (82) hide show
  1. package/main/default/client/instance.client.js +6 -6
  2. package/main/default/client/object_workflows.client.js +8 -7
  3. package/main/default/client/socket.client.js +46 -3
  4. package/main/default/manager/import.js +17 -1
  5. package/main/default/manager/instance_manager.js +20 -6
  6. package/main/default/manager/push_manager.js +20 -12
  7. package/main/default/manager/uuflowManagerForInitApproval.js +794 -0
  8. package/main/default/manager/uuflow_manager.js +53 -4
  9. package/main/default/manager/workflow_manager.js +1 -1
  10. package/main/default/methods/instance_approve.js +258 -0
  11. package/main/default/methods/trace_approve_cc.js +571 -0
  12. package/main/default/objectTranslations/flows.en/flows.en.objectTranslation.yml +19 -0
  13. package/main/default/objectTranslations/flows.zh-CN/flows.zh-CN.objectTranslation.yml +19 -0
  14. package/main/default/objectTranslations/forms.en/forms.en.objectTranslation.yml +191 -0
  15. package/main/default/objectTranslations/forms.zh-CN/forms.zh-CN.objectTranslation.yml +246 -0
  16. package/main/default/objectTranslations/instance_tasks.en/instance_tasks.en.objectTranslation.yml +213 -0
  17. package/main/default/objectTranslations/instance_tasks.zh-CN/instance_tasks.zh-CN.objectTranslation.yml +213 -0
  18. package/main/default/objectTranslations/instances.en/instances.en.objectTranslation.yml +212 -0
  19. package/main/default/objectTranslations/instances.zh-CN/instances.zh-CN.objectTranslation.yml +209 -0
  20. package/main/default/objects/categories.object.yml +1 -0
  21. package/main/default/objects/flows/buttons/del.button.yml +7 -10
  22. package/main/default/objects/flows/buttons/design_form_layout.button.js +5 -2
  23. package/main/default/objects/flows/buttons/distributeAdmin.button.yml +5 -5
  24. package/main/default/objects/flows/buttons/newexport.button.yml +1 -1
  25. package/main/default/objects/flows/buttons/newimport.button.yml +2 -1
  26. package/main/default/objects/flows/flows.object.yml +12 -4
  27. package/main/default/objects/forms/forms.object.yml +85 -0
  28. package/main/default/objects/instance_tasks/buttons/instance_new.button.yml +3 -5
  29. package/main/default/objects/instances/buttons/instance_cc.button.yml +7 -7
  30. package/main/default/objects/instances/buttons/instance_delete.button.yml +2 -2
  31. package/main/default/objects/instances/buttons/instance_delete_many.button.yml +6 -6
  32. package/main/default/objects/instances/buttons/instance_distribute.button.yml +14 -13
  33. package/main/default/objects/instances/buttons/instance_flow_chart.button.yml +1 -1
  34. package/main/default/objects/instances/buttons/instance_forward.button.yml +8 -8
  35. package/main/default/objects/instances/buttons/instance_new.button.yml +3 -5
  36. package/main/default/objects/instances/buttons/instance_reassign.button.yml +1 -16
  37. package/main/default/objects/instances/buttons/instance_related.button.yml +4 -4
  38. package/main/default/objects/instances/buttons/instance_relocate.button.yml +9 -12
  39. package/main/default/objects/instances/buttons/instance_retrieve.button.yml +106 -2
  40. package/main/default/objects/instances/buttons/instance_save.button.yml +3 -9
  41. package/main/default/objects/instances/buttons/instance_submit.button.yml +1 -1
  42. package/main/default/objects/instances/buttons/instance_terminate.button.yml +7 -10
  43. package/main/default/objects/instances/listviews/monitor.listview.yml +0 -1
  44. package/main/default/pages/flowdetail.page.amis.json +11 -11
  45. package/main/default/pages/instance_detail.page.amis.json +25 -37
  46. package/main/default/pages/instance_tasks_detail.page.amis.json +21 -5
  47. package/main/default/pages/instance_tasks_list.page.amis.json +147 -110
  48. package/main/default/pages/instances_list.page.amis.json +146 -110
  49. package/main/default/routes/afterHook.js +34 -0
  50. package/main/default/routes/am.router.js +49 -2
  51. package/main/default/routes/api_cc.router.js +5 -12
  52. package/main/default/routes/api_flow_permission.router.js +7 -2
  53. package/main/default/routes/api_get_object_workflows.router.js +79 -22
  54. package/main/default/routes/api_have_read.router.js +73 -0
  55. package/main/default/routes/api_object_workflow_drafts.router.js +18 -19
  56. package/main/default/routes/api_workflow_approve_save.router.js +2 -1
  57. package/main/default/routes/api_workflow_chart.router.js +682 -0
  58. package/main/default/routes/api_workflow_engine.router.js +4 -4
  59. package/main/default/routes/api_workflow_flow_version.router.js +61 -0
  60. package/main/default/routes/api_workflow_form_version.router.js +61 -0
  61. package/main/default/routes/api_workflow_instance_return.router.js +164 -167
  62. package/main/default/routes/api_workflow_next_step_users.router.js +13 -8
  63. package/main/default/routes/api_workflow_reassign.router.js +200 -196
  64. package/main/default/routes/api_workflow_relocate.router.js +4 -3
  65. package/main/default/routes/api_workflow_retrieve.router.js +246 -237
  66. package/main/default/routes/export.router.js +5 -4
  67. package/main/default/routes/flow_form_design.ejs +33 -8
  68. package/main/default/routes/flow_form_design.router.js +4 -3
  69. package/main/default/routes/import.router.js +6 -7
  70. package/main/default/services/flows.service.js +1 -1
  71. package/main/default/translations/en.translation.yml +5 -0
  72. package/main/default/translations/zh-CN.translation.yml +2 -1
  73. package/main/default/triggers/amis_form_design.trigger.js +27 -5
  74. package/main/default/triggers/instances.trigger.js +9 -7
  75. package/main/default/utils/designerManager.js +12 -5
  76. package/package.json +4 -4
  77. package/package.service.js +21 -7
  78. package/public/workflow/index.css +4 -0
  79. package/src/instance_record_queue.js +1 -3
  80. package/src/rests/api_workflow_instance_batch_remove.js +4 -3
  81. package/src/webhook_queue.js +283 -0
  82. package/main/default/manager/index.js +0 -23
@@ -45,7 +45,7 @@ window.SteedosWorkflow.InstanceTask = {
45
45
  "showHeader": true,
46
46
  "id": "u:d29cef0d1007",
47
47
  "showDisplayAs": true,
48
- "className": "h-full w-full bg-white instance-tasks-list",
48
+ "className": "h-full w-full instance-tasks-list",
49
49
  "hiddenColumnOperation": true,
50
50
  "formFactor": "LARGE",
51
51
  "headerToolbarItems": [
@@ -54,13 +54,13 @@ window.SteedosWorkflow.InstanceTask = {
54
54
  "label": "",
55
55
  "icon": "fa fa-bars",
56
56
  "className": "bg-white p-2 rounded border-gray-300 text-gray-500",
57
- "align": "right",
57
+ "align": "left",
58
58
  "onEvent": {
59
59
  "click": {
60
60
  "actions": [
61
61
  {
62
62
  "actionType": "custom",
63
- "script": "document.querySelector('.instances-customPage').classList.toggle('instances-sidebar-open');if(window.innerWidth < 768){document.querySelector('.isInset').classList.toggle('inset-0')}"
63
+ "script": "document.querySelector('.instances-customPage').classList.toggle('instances-sidebar-open');"
64
64
  }
65
65
  ]
66
66
  }
@@ -113,7 +113,7 @@ window.SteedosWorkflow.Instance = {
113
113
  "showHeader": true,
114
114
  "id": "u:d29cef0d1007",
115
115
  "showDisplayAs": true,
116
- "className": "h-full w-full bg-white",
116
+ "className": "h-full w-full",
117
117
  "hiddenColumnOperation": true,
118
118
  "formFactor": "LARGE",
119
119
  "headerToolbarItems": [
@@ -122,13 +122,13 @@ window.SteedosWorkflow.Instance = {
122
122
  "label": "",
123
123
  "icon": "fa fa-bars",
124
124
  "className": "bg-white p-2 rounded border-gray-300 text-gray-500",
125
- "align": "right",
125
+ "align": "left",
126
126
  "onEvent": {
127
127
  "click": {
128
128
  "actions": [
129
129
  {
130
130
  "actionType": "custom",
131
- "script": "document.querySelector('.instances-customPage').classList.toggle('instances-sidebar-open');if(window.innerWidth < 768){document.querySelector('.isInset').classList.toggle('inset-0')}"
131
+ "script": "document.querySelector('.instances-customPage').classList.toggle('instances-sidebar-open');"
132
132
  }
133
133
  ]
134
134
  }
@@ -1,7 +1,8 @@
1
- Steedos.authRequest("/api/workflow/v2/get_object_workflows", {
2
- type: 'get',
3
- success: (data)=>{
4
- window.Creator.object_workflows = data;
5
- Creator.dataInit.set(true);
6
- }
7
- });
1
+ waitForThing(Builder, 'settings.context.user.authToken').then(function(){
2
+ Steedos.authRequest("/api/workflow/v2/get_object_workflows", {
3
+ type: 'get',
4
+ success: (data)=>{
5
+ window.Steedos.object_workflows = data;
6
+ }
7
+ });
8
+ })
@@ -6,11 +6,13 @@ window.waitForThing(window, 'socket').then(()=>{
6
6
  }
7
7
 
8
8
  const SocketEvents = {
9
- badgeChange: 's:workflow:badge:change'
9
+ badgeChange: 's:workflow:badge:change',
10
+ instanceRecordChange: 's:record:instances:change'
10
11
  }
11
12
 
12
13
  const SocketRoomParts = {
13
- badgeChange: 'workflow:badge:change'
14
+ badgeChange: 'workflow:badge:change',
15
+ instanceRecordChange: 'record:instances:change'
14
16
  }
15
17
 
16
18
  if(socket.connected){
@@ -18,12 +20,20 @@ window.waitForThing(window, 'socket').then(()=>{
18
20
  roomParts: SocketRoomParts.badgeChange,
19
21
  individual: true
20
22
  });
23
+
24
+ socket.emit(SocketCommands.subscribe, {
25
+ roomParts: SocketRoomParts.instanceRecordChange,
26
+ individual: true
27
+ });
21
28
  }else{
22
29
  socket.on("connection-init", ()=>{
23
30
  socket.emit(SocketCommands.subscribe, {
24
31
  roomParts: SocketRoomParts.badgeChange,
25
32
  individual: true
26
33
  });
34
+ socket.emit(SocketCommands.subscribe, {
35
+ roomParts: SocketRoomParts.instanceRecordChange
36
+ });
27
37
  })
28
38
  }
29
39
 
@@ -36,5 +46,38 @@ window.waitForThing(window, 'socket').then(()=>{
36
46
  if (shouldReloadView()) {
37
47
  window.$(".list-view-btn-reload").click()
38
48
  }
39
- })
49
+ });
50
+
51
+ socket.on(SocketEvents.instanceRecordChange, (data)=>{
52
+ console.log(`socket 「${SocketEvents.instanceRecordChange}」`, data)
53
+ const shouldReloadView = () => {
54
+ const pathname = window.location.pathname;
55
+ return pathname.endsWith(`/instances`) || pathname.includes(`/instances/view`) || pathname.includes(`/instances/grid`) || pathname.endsWith(`/instance_tasks`) || pathname.includes(`/instance_tasks/view`) || pathname.includes(`/instance_tasks/grid`);
56
+ };
57
+ if (shouldReloadView()) {
58
+ window.$(".list-view-btn-reload").click()
59
+ }
60
+ });
61
+
62
+
63
+ window.addEventListener('message', (event)=>{
64
+ const data = event.data;
65
+ // 判断是不是我们发的路由变化消息
66
+ if (data && data.type === 'ROUTE_CHANGE') {
67
+ console.log('📬 收到路由变化消息:', data);
68
+ if(data.path.startsWith('/app/approve_workflow/instances/view/')){
69
+ const recordId = _.last(_.split(data.path, '/'));
70
+ socket.emit(SocketCommands.subscribe, {
71
+ roomParts: `${SocketRoomParts.instanceRecordChange}-${recordId}`
72
+ });
73
+ socket.on(`${SocketEvents.instanceRecordChange}-${recordId}`, (eventData)=>{
74
+ if(window.location.pathname.startsWith('/app/approve_workflow/instances/view/'+eventData._id)){
75
+ if(window.location.search.indexOf("side_listview_id=monitor") > 0){
76
+ $(".steedos-workflow-reload-btn").trigger('click')
77
+ }
78
+ }
79
+ })
80
+ }
81
+ }
82
+ });
40
83
  })
@@ -290,10 +290,24 @@ async function objectWorkflow(spaceId, flowId, objectName, doc) {
290
290
  if (oldDoc) {
291
291
  return objectWorkflowsCollection.updateOne({ _id: oldDoc._id }, { $set: docData });
292
292
  } else {
293
+ docData._id = _makeNewID();
293
294
  return objectWorkflowsCollection.insertOne(docData);
294
295
  }
295
296
  }
296
297
 
298
+ // 如果没有name字段,则给name赋值code
299
+ function addFieldName(fields) {
300
+ return _.map(fields, function (f) {
301
+ if (!f.name && f.code) {
302
+ f.name = f.code;
303
+ }
304
+ if (f.type === 'section' || f.type === 'table') {
305
+ f.fields = addFieldName(f.fields);
306
+ }
307
+ return f;
308
+ });
309
+ }
310
+
297
311
  async function workflow(uid, spaceId, form, enabled, company_id, options = {}) {
298
312
  const { upgrade = false, formId: upgradeFormId, flowId: upgradeFlowId } = options;
299
313
  const new_form_ids = [];
@@ -394,6 +408,8 @@ async function workflow(uid, spaceId, form, enabled, company_id, options = {}) {
394
408
  form.modified = form.created;
395
409
  form.modified_by = uid;
396
410
  form.historys = [];
411
+
412
+ const fields = addFieldName(form.current?.fields || []);
397
413
 
398
414
  form.current = {
399
415
  _id: _makeNewID(),
@@ -403,7 +419,7 @@ async function workflow(uid, spaceId, form, enabled, company_id, options = {}) {
403
419
  created_by: uid,
404
420
  modified: new Date(),
405
421
  modified_by: uid,
406
- fields: form.current?.fields || [],
422
+ fields: fields,
407
423
  form_script: form.current?.form_script || '',
408
424
  name_forumla: form.current?.name_forumla || ''
409
425
  };
@@ -2,9 +2,11 @@ var _eval, logger;
2
2
 
3
3
  _eval = require('eval');
4
4
 
5
+ const _ = require('lodash');
6
+
5
7
  global.InstanceManager = {};
6
8
 
7
- logger = new Logger('Workflow -> InstanceManager');
9
+ // logger = new Logger('Workflow -> InstanceManager');
8
10
 
9
11
  InstanceManager.handlerInstanceByFieldMap = function (ins, field_map) {
10
12
  var context, e, flow, res, script;
@@ -33,24 +35,33 @@ InstanceManager.handlerInstanceByFieldMap = function (ins, field_map) {
33
35
  res = {
34
36
  _error: e
35
37
  };
36
- logger.error(e);
38
+ // logger.error(e);
39
+ console.error(e);
37
40
  }
38
41
  }
39
42
  }
40
43
  return res;
41
44
  };
42
45
 
43
- InstanceManager.getCurrentApprove = function (instance, handler) {
46
+ InstanceManager.getCurrentApprove = function (instance, handler, type) {
44
47
  var currentApprove, currentApproves, currentTraces;
45
48
  if (!instance || !instance.traces || instance.traces.length < 1) {
46
49
  return;
47
50
  }
48
- currentTraces = instance.traces.filterProperty('is_finished', false);
51
+
52
+ currentTraces = _.filter(instance.traces, { is_finished: false });
53
+
49
54
  if (currentTraces.length) {
50
- currentApproves = currentTraces[0].approves.filterProperty('is_finished', false).filterProperty('handler', handler);
55
+ if (type){
56
+ currentApproves = _.filter(currentTraces[0].approves, { is_finished: false, handler: handler, type: type});
57
+ }
58
+ else {
59
+ currentApproves = _.filter(currentTraces[0].approves, { is_finished: false, handler: handler });
60
+ }
51
61
  currentApprove = currentApproves.length > 0 ? currentApproves[0] : null;
52
62
  }
53
- if (!currentApprove || currentApprove.type === 'cc') {
63
+
64
+ if (!currentApprove) {
54
65
  // 当前是传阅
55
66
  _.each(instance.traces, function (t) {
56
67
  _.each(t.approves, function (a) {
@@ -180,3 +191,6 @@ InstanceManager.getBatchInstances = function (space, categoryId, flowIds, inbox_
180
191
  // console.log("批量审批-异常数据", ins._id)
181
192
  return _batch_instances;
182
193
  };
194
+
195
+
196
+ module.exports = InstanceManager;
@@ -5,6 +5,8 @@ const { getObject } = objectql;
5
5
  const { t } = require('@steedos/i18n');
6
6
  const { map } = require('lodash');
7
7
 
8
+ const WebhookQueue = require('../../../src/webhook_queue')
9
+
8
10
  const uuflowManager = {
9
11
  getFlow: async function (flow_id, options = {}) {
10
12
  if (process.env.STEEDOS_DEBUG) {
@@ -437,7 +439,7 @@ pushManager.get_badge = async function (send_from, user_id) {
437
439
  if (((ref4 = appKeyValue.value) != null ? ref4[appName] : void 0) !== categoryBadge) {
438
440
  _set = {};
439
441
  _set['value.' + appName] = categoryBadge;
440
- await getObject('steedos_keyvalues').update(appKeyValue._id, set)
442
+ await getObject('steedos_keyvalues').update(appKeyValue._id, _set)
441
443
  continue;
442
444
  }
443
445
  } else {
@@ -553,7 +555,7 @@ pushManager.checkMailFromNameLength = function (name) {
553
555
  };
554
556
 
555
557
  // TODO 手机推送
556
- pushManager.send_message_by_raix_push = async function (data) {
558
+ pushManager.send_message_by_raix_push = async function (data, lang) {
557
559
  if (process.env.STEEDOS_DEBUG_DISABLE_PUSHMANAGER || !data["data"]) {
558
560
  return;
559
561
  }
@@ -590,7 +592,7 @@ pushManager.send_message_by_raix_push = async function (data) {
590
592
  }
591
593
  let notificationDoc = {
592
594
  name: notification.text,
593
- body: '审批',
595
+ body: t('CustomLabels.approval_workflow', {}, lang),
594
596
  related_to: {
595
597
  o: "instances",
596
598
  ids: [notification.payload?.instance]
@@ -613,6 +615,12 @@ pushManager.send_message_by_raix_push = async function (data) {
613
615
  from: from,
614
616
  to: toUsers
615
617
  })
618
+
619
+ await objectql.getSteedosSchema().broker.emit('push.send', {
620
+ message: notificationDoc,
621
+ from: from,
622
+ to: toUsers
623
+ })
616
624
 
617
625
 
618
626
  // data["toUsers"].forEach(userId => {
@@ -631,7 +639,7 @@ pushManager.send_message_by_raix_push = async function (data) {
631
639
  };
632
640
 
633
641
  //steedos_ids 必须为数组 ; body 如果有,则必须为Hash
634
- pushManager.send_message = function (steedos_ids, body) {
642
+ pushManager.send_message = function (steedos_ids, body, current_user_info, lang) {
635
643
  if (process.env.STEEDOS_DEBUG_DISABLE_PUSHMANAGER) {
636
644
  return;
637
645
  }
@@ -651,7 +659,7 @@ pushManager.send_message = function (steedos_ids, body) {
651
659
  data.data = body;
652
660
  }
653
661
 
654
- pushManager.send_message_by_raix_push(data);
662
+ pushManager.send_message_by_raix_push(data, lang);
655
663
  };
656
664
 
657
665
  // TODO处理发送手机短信
@@ -780,7 +788,7 @@ pushManager.send_instance_notification = async function (send_from, instance, de
780
788
  await pushManager.send_email_to_SMTP(title.email, content, to_user, from_user);
781
789
 
782
790
  // Send Push Notification
783
- await pushManager.send_message([to_user.steedos_id], push_body, current_user_info);
791
+ await pushManager.send_message([to_user.steedos_id], push_body, current_user_info, lang);
784
792
 
785
793
  // Send SMS
786
794
  if (['reassign_new_inbox_users', 'submit_pending_rejected_applicant_inbox', 'submit_pending_rejected_inbox', 'submit_pending_inbox', 'first_submit_inbox', 'return_pending_inbox'].includes(send_from)) {
@@ -854,7 +862,7 @@ pushManager.triggerWebhook = async function (flowId, instance, currentApprove, a
854
862
  cfsInstances: await getCollection('cfs.instances.filerecord')
855
863
  };
856
864
 
857
- instance.attachments = (await cfsInstances.find({ 'metadata.instance': instance._id }).toArray()) || [];
865
+ instance.attachments = (await db.cfsInstances.find({ 'metadata.instance': instance._id }).toArray()) || [];
858
866
 
859
867
  const fromUser = await db.users.findOne({ "_id": fromUserId }, { fields: { _id: 1, username: 1 } }) || {};
860
868
  const fromSpaceUser = await db.space_users.findOne({ "user": fromUserId }, { fields: { mobile: 1, email: 1 } }) || {};
@@ -880,12 +888,12 @@ pushManager.triggerWebhook = async function (flowId, instance, currentApprove, a
880
888
  for (const w of webhooks) {
881
889
  WebhookQueue.send({
882
890
  instance,
883
- currentApprove,
884
- payloadUrl: w.payload_url,
885
- contentType: w.content_type,
891
+ current_approve: currentApprove,
892
+ payload_url: w.payload_url,
893
+ content_type: w.content_type,
886
894
  action,
887
- fromUser,
888
- toUsers: toUsers || []
895
+ from_user: fromUser,
896
+ to_users: toUsers || []
889
897
  });
890
898
  }
891
899
  };