@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
@@ -16,6 +16,7 @@ const pushManager = require('./push_manager');
16
16
  const { t } = require('@steedos/i18n')
17
17
  const moment = require('moment')
18
18
  const { getObject } = require('@steedos/objectql');
19
+ const { evaluate } = require('amis-formula');
19
20
 
20
21
  const UUFlowManager = {};
21
22
 
@@ -556,6 +557,47 @@ UUFlowManager.isFlowSpaceMatched = function (flow, space_id) {
556
557
  }
557
558
  };
558
559
 
560
+ const isAmisFormula = (formula) => {
561
+ // 有${}包裹的表达式就识别为amis公式
562
+ return /\$\{.+\}/.test(formula);
563
+ };
564
+
565
+ const runAmisFormula = function (formula, data) {
566
+ try {
567
+ const amisFormulaValue = evaluate(
568
+ formula,
569
+ Object.assign({}, data),
570
+ {},
571
+ );
572
+ if (formula === amisFormulaValue) {
573
+ throw new Error(
574
+ `Workflow Condition Step Amis formula "${formula}" evaluate failed "Function is not defined".`,
575
+ );
576
+ } else {
577
+ return amisFormulaValue;
578
+ }
579
+ } catch (e) {
580
+ throw new Error(
581
+ `Catch an error "${e.message}" while evaluate condition step amis formula "${formula}".`,
582
+ );
583
+ }
584
+ }
585
+
586
+ /**
587
+ * Calculate condition for conditional step
588
+ * @param {Object} values - Form values
589
+ * @param {String} condition_str - Condition string
590
+ * @returns {Boolean} Condition result
591
+ */
592
+ UUFlowManager.calculateConditionWithAmis = function (values, condition_str) {
593
+ try {
594
+ return runAmisFormula(condition_str, values);
595
+ } catch (error) {
596
+ console.error(error.stack);
597
+ return false;
598
+ }
599
+ };
600
+
559
601
  /**
560
602
  * Calculate condition for conditional step
561
603
  * @param {Object} values - Form values
@@ -829,10 +871,17 @@ UUFlowManager.getNextSteps = async function (instance, flow, step, judge, values
829
871
 
830
872
  for (const step_line of step.lines) {
831
873
  if (step_line.state === "submitted") {
832
- const step_line_condition = step_line.condition.replace(reg, (vowel) => {
833
- return prefix + vowel.replace(/\{\s*/, "[\"").replace(/\s*\}/, "\"]").replace(/\s*\.\s*/g, "\"][\"");
834
- });
835
- const allow = UUFlowManager.calculateCondition(__values, step_line_condition);
874
+ let step_line_condition = step_line.condition;
875
+ let allow = false;
876
+ if (isAmisFormula(step_line_condition)) {
877
+ allow = UUFlowManager.calculateConditionWithAmis(__values, step_line_condition);
878
+ }
879
+ else {
880
+ step_line_condition = step_line.condition.replace(reg, (vowel) => {
881
+ return prefix + vowel.replace(/\{\s*/, "[\"").replace(/\s*\}/, "\"]").replace(/\s*\.\s*/g, "\"][\"");
882
+ });
883
+ allow = UUFlowManager.calculateCondition(__values, step_line_condition);
884
+ }
836
885
  if (allow) {
837
886
  nextSteps.push(step_line.to_step);
838
887
  }
@@ -246,7 +246,7 @@ WorkflowManager.getUser = async function (spaceId, userId, notNeedDetails) {
246
246
  }
247
247
 
248
248
  if (typeof userId !== 'string') {
249
- return WorkflowManager.getUsers(spaceId, userId, notNeedDetails);
249
+ return await WorkflowManager.getUsers(spaceId, userId, notNeedDetails);
250
250
  }
251
251
 
252
252
  const spaceUsersCollection = await getCollection('space_users');
@@ -0,0 +1,258 @@
1
+ const { getCollection } = require('../utils/collection');
2
+ const {
3
+ update_instance_tasks,
4
+ update_many_instance_tasks,
5
+ } = require('../manager/instance_tasks_manager')
6
+ module.exports = {
7
+ set_approve_have_read: async function (instanceId, traceId, approveId, ctx = {}) {
8
+ const db = {
9
+ instances: await getCollection('instances')
10
+ };
11
+ var instance, ref, setObj, trace;
12
+ var userId = ctx.userId || this.userId;
13
+ if (!userId) {
14
+ return;
15
+ }
16
+ instance = await db.instances.findOne({
17
+ _id: instanceId,
18
+ "traces._id": traceId
19
+ }, {
20
+ fields: {
21
+ "traces.$": 1
22
+ }
23
+ });
24
+ if ((instance != null ? (ref = instance.traces) != null ? ref.length : void 0 : void 0) > 0) {
25
+ trace = instance.traces[0];
26
+ setObj = {
27
+ modified: new Date,
28
+ modified_by: userId
29
+ };
30
+ let key_str = ''
31
+ const approveDoc = {}
32
+ trace.approves.forEach(function (approve, idx) {
33
+ if (approve._id === approveId && !approve.is_read) {
34
+ key_str = `traces.$.approves.${idx}.`;
35
+ // setObj[`traces.$.approves.${idx}.is_read`] = true;
36
+ // return setObj[`traces.$.approves.${idx}.read_date`] = new Date();
37
+ approveDoc[`is_read`] = true;
38
+ approveDoc[`read_date`] = new Date();
39
+ }
40
+ });
41
+ if (!_.isEmpty(approveDoc) && key_str) {
42
+ for (const key in approveDoc) {
43
+ if (Object.hasOwnProperty.call(approveDoc, key)) {
44
+ setObj[key_str + key] = approveDoc[key]
45
+ }
46
+ }
47
+ await db.instances.update({
48
+ _id: instanceId,
49
+ "traces._id": traceId
50
+ }, {
51
+ $set: setObj
52
+ });
53
+ await update_instance_tasks(instanceId, traceId, approveId, approveDoc)
54
+ }
55
+ return true;
56
+ }
57
+ },
58
+ // change_approve_info: function (instanceId, traceId, approveId, description, finish_date) {
59
+ // var instance, ref, setObj, trace;
60
+ // if (!this.userId) {
61
+ // return;
62
+ // }
63
+ // check(instanceId, String);
64
+ // check(traceId, String);
65
+ // check(approveId, String);
66
+ // check(description, String);
67
+ // check(finish_date, Date);
68
+ // instance = db.instances.findOne({
69
+ // _id: instanceId,
70
+ // "traces._id": traceId
71
+ // }, {
72
+ // fields: {
73
+ // "traces.$": 1
74
+ // }
75
+ // });
76
+ // if ((instance != null ? (ref = instance.traces) != null ? ref.length : void 0 : void 0) > 0) {
77
+ // trace = instance.traces[0];
78
+ // setObj = {};
79
+ // let key_str = ''
80
+ // const approveDoc = {}
81
+ // trace.approves.forEach(function (approve, idx) {
82
+ // if (approve._id === approveId) {
83
+ // setObj['change_time'] = new Date();
84
+ // key_str = `traces.$.approves.${idx}.`
85
+ // // setObj[`traces.$.approves.${idx}.description`] = description;
86
+ // // setObj[`traces.$.approves.${idx}.finish_date`] = finish_date;
87
+ // // setObj[`traces.$.approves.${idx}.cost_time`] = new Date() - approve.start_date;
88
+ // // return setObj[`traces.$.approves.${idx}.read_date`] = new Date();
89
+ // approveDoc[`description`] = description;
90
+ // approveDoc[`finish_date`] = finish_date;
91
+ // approveDoc[`cost_time`] = new Date() - approve.start_date;
92
+ // approveDoc[`read_date`] = new Date();
93
+ // }
94
+ // });
95
+ // if (!_.isEmpty(setObj)) {
96
+ // for (const key in approveDoc) {
97
+ // if (Object.hasOwnProperty.call(approveDoc, key)) {
98
+ // setObj[key_str + key] = approveDoc[key]
99
+ // }
100
+ // }
101
+ // db.instances.update({
102
+ // _id: instanceId,
103
+ // "traces._id": traceId
104
+ // }, {
105
+ // $set: setObj
106
+ // });
107
+ // update_instance_tasks(instanceId, traceId, approveId, approveDoc)
108
+ // }
109
+ // return true;
110
+ // }
111
+ // },
112
+ // update_approve_sign: function (instanceId, traceId, approveId, sign_field_code, description, sign_type, lastSignApprove) {
113
+ // var currentApproveDescription, currentStep, currentTrace, ins, instance, ref, ref1, ref2, ref3, session_userId, showBlankApproveDescription, trace, traces, trimDescription, upObj;
114
+ // check(instanceId, String);
115
+ // check(traceId, String);
116
+ // check(approveId, String);
117
+ // check(sign_field_code, String);
118
+ // check(description, String);
119
+ // if (!this.userId) {
120
+ // return;
121
+ // }
122
+ // trimDescription = description.trim();
123
+ // showBlankApproveDescription = (ref = Meteor.settings.public.workflow) != null ? ref.showBlankApproveDescription : void 0;
124
+ // session_userId = this.userId;
125
+ // if (lastSignApprove) {
126
+ // if (((ref1 = Meteor.settings.public.workflow) != null ? ref1.keepLastSignApproveDescription : void 0) !== false) {
127
+ // if (lastSignApprove.custom_sign_show) {
128
+ // return;
129
+ // }
130
+ // }
131
+ // }
132
+ // instance = db.instances.findOne({
133
+ // _id: instanceId,
134
+ // "traces._id": traceId
135
+ // }, {
136
+ // fields: {
137
+ // "traces.$": 1
138
+ // }
139
+ // });
140
+ // if ((instance != null ? (ref2 = instance.traces) != null ? ref2.length : void 0 : void 0) > 0) {
141
+ // trace = instance.traces[0];
142
+ // upObj = {};
143
+ // currentApproveDescription = '';
144
+ // const approveDoc = {}
145
+ // let key_str = ''
146
+ // trace.approves.forEach(function (approve, idx) {
147
+ // if (approve._id === approveId) {
148
+ // key_str = `traces.$.approves.${idx}.`
149
+ // currentApproveDescription = approve.description;
150
+ // if (sign_field_code) {
151
+ // upObj[`traces.$.approves.${idx}.sign_field_code`] = sign_field_code;
152
+ // }
153
+ // // upObj[`traces.$.approves.${idx}.description`] = description;
154
+ // // upObj[`traces.$.approves.${idx}.sign_show`] = trimDescription || showBlankApproveDescription ? true : false;
155
+ // // upObj[`traces.$.approves.${idx}.modified`] = new Date();
156
+ // // upObj[`traces.$.approves.${idx}.modified_by`] = session_userId;
157
+ // // return upObj[`traces.$.approves.${idx}.read_date`] = new Date();
158
+ // approveDoc[`description`] = description;
159
+ // if (trimDescription || showBlankApproveDescription) {
160
+ // approveDoc[`sign_show`] = true;
161
+ // }
162
+ // approveDoc[`modified`] = new Date();
163
+ // approveDoc[`modified_by`] = session_userId;
164
+ // approveDoc[`read_date`] = new Date();
165
+ // }
166
+ // });
167
+ // if (key_str && !_.isEmpty(approveDoc)) {
168
+ // for (const key in approveDoc) {
169
+ // if (Object.hasOwnProperty.call(approveDoc, key)) {
170
+ // upObj[key_str + key] = approveDoc[key]
171
+ // }
172
+ // }
173
+ // }
174
+
175
+ // const needUpdateApproveIds = []
176
+ // if (((ref3 = Meteor.settings.public.workflow) != null ? ref3.keepLastSignApproveDescription : void 0) === false && (!!currentApproveDescription !== !!trimDescription || showBlankApproveDescription)) {
177
+ // ins = db.instances.findOne({
178
+ // _id: instanceId
179
+ // }, {
180
+ // fields: {
181
+ // "traces": 1
182
+ // }
183
+ // });
184
+ // traces = ins.traces;
185
+ // currentTrace = _.find(traces, function (t) {
186
+ // return t._id === traceId;
187
+ // });
188
+ // currentStep = currentTrace.step;
189
+ // traces.forEach(function (t, tIdx) {
190
+ // if (t.step === currentStep) {
191
+ // return t != null ? t.approves.forEach(function (appr, aIdx) {
192
+ // if (appr.handler === session_userId && appr.is_finished && appr._id !== approveId && !_.has(appr, 'custom_sign_show')) {
193
+ // if ((trimDescription && appr.sign_show === true && (sign_field_code === "" || !appr.sign_field_code || sign_field_code === appr.sign_field_code)) || showBlankApproveDescription) {
194
+ // upObj[`traces.${tIdx}.approves.${aIdx}.sign_show`] = false;
195
+ // return upObj[`traces.${tIdx}.approves.${aIdx}.keepLastSignApproveDescription`] = approveId;
196
+ // } else if (appr.keepLastSignApproveDescription === approveId) {
197
+ // upObj[`traces.${tIdx}.approves.${aIdx}.sign_show`] = true;
198
+ // return upObj[`traces.${tIdx}.approves.${aIdx}.keepLastSignApproveDescription`] = null;
199
+ // }
200
+ // needUpdateApproveIds.push(appr._id)
201
+ // }
202
+ // }) : void 0;
203
+ // }
204
+ // });
205
+ // }
206
+ // if (!_.isEmpty(upObj)) {
207
+ // db.instances.update({
208
+ // _id: instanceId,
209
+ // "traces._id": traceId
210
+ // }, {
211
+ // $set: upObj
212
+ // });
213
+ // update_instance_tasks(instanceId, traceId, approveId, approveDoc)
214
+ // if (needUpdateApproveIds.length > 0) {
215
+ // update_many_instance_tasks(instanceId, traceId, needUpdateApproveIds, ['sign_show', 'keepLastSignApproveDescription'])
216
+ // }
217
+ // }
218
+ // return true;
219
+ // }
220
+ // },
221
+ // update_sign_show: function (objs, myApprove_id) {
222
+ // objs.forEach(function (obj, index) {
223
+ // var instance, ref, setObj, trace;
224
+ // instance = db.instances.findOne({
225
+ // _id: obj.instance,
226
+ // "traces._id": obj.trace
227
+ // }, {
228
+ // fields: {
229
+ // "traces.$": 1
230
+ // }
231
+ // });
232
+ // if ((instance != null ? (ref = instance.traces) != null ? ref.length : void 0 : void 0) > 0) {
233
+ // trace = instance.traces[0];
234
+ // setObj = {};
235
+ // trace.approves.forEach(function (approve, idx) {
236
+ // if (approve._id === obj._id) {
237
+ // setObj[`traces.$.approves.${idx}.sign_show`] = obj.sign_show;
238
+ // setObj[`traces.$.approves.${idx}.custom_sign_show`] = obj.sign_show;
239
+ // setObj[`traces.$.approves.${idx}.read_date`] = new Date();
240
+ // }
241
+ // if (approve._id === myApprove_id) {
242
+ // return setObj[`traces.$.approves.${idx}.read_date`] = new Date();
243
+ // }
244
+ // });
245
+ // if (!_.isEmpty(setObj)) {
246
+ // db.instances.update({
247
+ // _id: obj.instance,
248
+ // "traces._id": obj.trace
249
+ // }, {
250
+ // $set: setObj
251
+ // });
252
+ // update_many_instance_tasks(obj.instance, obj.trace, [obj._id, myApprove_id], ['sign_show', 'custom_sign_show', 'read_date'])
253
+ // }
254
+ // }
255
+ // });
256
+ // return true;
257
+ // }
258
+ };