@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
@@ -13,9 +13,9 @@ const objectql = require('@steedos/objectql');
13
13
  const _ = require('lodash');
14
14
  const Fiber = function(fun){console.log('TODO Fiber...')}
15
15
  const { excuteTriggers } = require('../utils/trigger');
16
- const { getStep } = require('../uuFlowManager');
16
+ const { getStep } = require('../uuflowManager');
17
17
  const UUFlowManager = require('../manager/uuflow_manager');
18
-
18
+ const afterHook = require('./afterHook');
19
19
  /**
20
20
  * 审批中提交申请单
21
21
  * body {
@@ -53,7 +53,7 @@ const UUFlowManager = require('../manager/uuflow_manager');
53
53
  ]
54
54
  * }
55
55
  */
56
- router.post('/api/workflow/engine', requireAuthentication, async function (req, res) {
56
+ router.post('/api/workflow/engine', requireAuthentication, afterHook, async function (req, res) {
57
57
  try {
58
58
  let userSession = req.user;
59
59
  const spaceId = userSession.spaceId;
@@ -80,7 +80,7 @@ router.post('/api/workflow/engine', requireAuthentication, async function (req,
80
80
  }
81
81
 
82
82
  try {
83
- const instance = UUFlowManager.workflow_engine(approve_from_client, userSession, userId);
83
+ const instance = await UUFlowManager.workflow_engine(approve_from_client, userSession, userId);
84
84
  // afterStepSubmit
85
85
  await excuteTriggers({ when: 'afterStepSubmit', userId, flowId, insId });
86
86
  // afterEnd
@@ -0,0 +1,61 @@
1
+ const express = require("express");
2
+ const router = express.Router();
3
+ const { requireAuthentication } = require("@steedos/auth");
4
+ const _ = require('lodash');
5
+ const { getCollection } = require('../utils/collection');
6
+ router.get('/api/workflow/flow/:flowId/version/:versionId', requireAuthentication, async function (req, res) {
7
+ try {
8
+ const { flowId, versionId } = req.params;
9
+ const flowsColl = await getCollection('flows');
10
+
11
+ const flow = await flowsColl.aggregate([
12
+ {
13
+ $match: {
14
+ "_id": flowId
15
+ }
16
+ },
17
+ {
18
+ $project: {
19
+ name: 1,
20
+ current_no: 1,
21
+ versionData: {
22
+ $cond: {
23
+ if: { $eq: ["$current._id", versionId] },
24
+ then: "$current",
25
+ else: {
26
+ $arrayElemAt: [
27
+ {
28
+ $filter: {
29
+ input: "$historys",
30
+ as: "history",
31
+ cond: { $eq: ["$$history._id", versionId] }
32
+ }
33
+ },
34
+ 0
35
+ ]
36
+ }
37
+ }
38
+ }
39
+ }
40
+ },
41
+ {
42
+ $match: {
43
+ "versionData": { $ne: null }
44
+ }
45
+ },
46
+ { $limit: 1 } // 限制只返回一个文档
47
+ ]).next();
48
+
49
+ if (flow) {
50
+ res.status(200).send(flow.versionData);
51
+ } else {
52
+ res.status(404).send({ message: "流程版本未找到" });
53
+ }
54
+ } catch (error) {
55
+ console.error('Unexpected error:', error);
56
+ res.status(500).send({
57
+ error: error.message
58
+ });
59
+ }
60
+ });
61
+ exports.default = router;
@@ -0,0 +1,61 @@
1
+ const express = require("express");
2
+ const router = express.Router();
3
+ const { requireAuthentication } = require("@steedos/auth");
4
+ const _ = require('lodash');
5
+ const { getCollection } = require('../utils/collection');
6
+ router.get('/api/workflow/form/:formId/version/:versionId', requireAuthentication, async function (req, res) {
7
+ try {
8
+ const { formId, versionId } = req.params;
9
+ const formsColl = await getCollection('forms');
10
+
11
+ const form = await formsColl.aggregate([
12
+ {
13
+ $match: {
14
+ "_id": formId
15
+ }
16
+ },
17
+ {
18
+ $project: {
19
+ name: 1,
20
+ current_no: 1,
21
+ versionData: {
22
+ $cond: {
23
+ if: { $eq: ["$current._id", versionId] },
24
+ then: "$current",
25
+ else: {
26
+ $arrayElemAt: [
27
+ {
28
+ $filter: {
29
+ input: "$historys",
30
+ as: "history",
31
+ cond: { $eq: ["$$history._id", versionId] }
32
+ }
33
+ },
34
+ 0
35
+ ]
36
+ }
37
+ }
38
+ }
39
+ }
40
+ },
41
+ {
42
+ $match: {
43
+ "versionData": { $ne: null }
44
+ }
45
+ },
46
+ { $limit: 1 } // 限制只返回一个文档
47
+ ]).next();
48
+
49
+ if (form) {
50
+ res.status(200).send(form.versionData);
51
+ } else {
52
+ res.status(404).send({ message: "流程版本未找到" });
53
+ }
54
+ } catch (error) {
55
+ console.error('Unexpected error:', error);
56
+ res.status(500).send({
57
+ error: error.message
58
+ });
59
+ }
60
+ });
61
+ exports.default = router;
@@ -1,201 +1,198 @@
1
1
  /*
2
2
  * @Author: baozhoutao@steedos.com
3
3
  * @Date: 2022-09-15 13:09:51
4
- * @LastEditors: sunhaolin@hotoa.com
5
- * @LastEditTime: 2023-01-14 11:22:30
4
+ * @LastEditors: 孙浩林 sunhaolin@steedos.com
5
+ * @LastEditTime: 2025-10-05 15:05:13
6
6
  * @Description:
7
7
  */
8
8
  const express = require("express");
9
9
  const router = express.Router();
10
10
  const { requireAuthentication } = require("@steedos/auth");
11
11
  const _ = require('lodash');
12
- const Fiber = function(fun){console.log('TODO Fiber...')}
13
12
  const pushManager = require('../manager/push_manager');
14
- const objectql = require('@steedos/objectql');
15
13
  const {
16
14
  update_instance_tasks,
17
15
  insert_instance_tasks
18
16
  } = require('../manager/instance_tasks_manager')
19
17
  const UUFlowManager = require('../manager/uuflow_manager');
18
+ const { getCollection, _makeNewID } = require('../utils/collection');
19
+
20
20
  router.post('/api/workflow/v2/instance/return', requireAuthentication, async function (req, res) {
21
21
  try {
22
22
  let userSession = req.user;
23
23
  const { approve, reason } = req.body;
24
24
 
25
- Fiber(async function () {
26
- try {
27
- var approve_values, b, current_step, current_user, current_user_info, flow, ins, instance, instance_id, last_trace, newTrace, new_inbox_users, now, pre_step, pre_trace, r, rest_counter_users, setObj, space_id, traces;
28
- current_user = userSession.userId;
29
- instance_id = approve.instance;
30
- ins = UUFlowManager.getInstance(instance_id);
31
- space_id = ins.space;
32
- if (ins.state !== "pending" || !ins.inbox_users.includes(current_user)) {
33
- throw new Error("不符合退回条件");
34
- }
35
- if (approve.type === "cc" && ins.cc_users.includes(current_user)) {
36
- throw new Error("不符合退回条件");
37
- }
38
- if (ins.traces.length < 2) {
39
- throw new Error("不符合退回条件");
40
- }
41
- flow = UUFlowManager.getFlow(ins.flow);
42
- pre_trace = ins.traces[ins.traces.length - 2];
43
- pre_step = UUFlowManager.getStep(ins, flow, pre_trace.step);
44
- if (pre_step.step_type === "counterSign") {
45
- throw new Error("不符合退回条件");
46
- }
47
- last_trace = _.last(ins.traces);
48
- current_step = UUFlowManager.getStep(ins, flow, last_trace.step);
49
- if (current_step.step_type !== "submit" && current_step.step_type !== "sign" && current_step.step_type !== "counterSign") {
50
- throw new Error("不符合退回条件");
51
- }
52
- if (approve.trace !== last_trace._id) {
53
- throw new Error("不符合退回条件");
54
- }
55
- new_inbox_users = new Array;
56
- _.each(pre_trace.approves, function (a) {
57
- if ((!a.type || a.type === "draft" || a.type === "reassign") && (!a.judge || a.judge === "submitted" || a.judge === "approved" || a.judge === "rejected")) {
58
- return new_inbox_users.push(a.user);
59
- }
60
- });
61
- if (_.isEmpty(new_inbox_users)) {
62
- throw new Error("未找到下一步处理人,退回失败");
25
+ const instancesCollection = await getCollection('instances');
26
+ const usersCollection = await getCollection('users');
27
+
28
+ var approve_values, b, current_step, current_user, current_user_info, flow, ins, instance, instance_id, last_trace, newTrace, new_inbox_users, now, pre_step, pre_trace, r, rest_counter_users, setObj, space_id, traces;
29
+ current_user = userSession.userId;
30
+ instance_id = approve.instance;
31
+ ins = await UUFlowManager.getInstance(instance_id);
32
+ space_id = ins.space;
33
+ if (ins.state !== "pending" || !ins.inbox_users.includes(current_user)) {
34
+ throw new Error("不符合退回条件");
35
+ }
36
+ if (approve.type === "cc" && ins.cc_users.includes(current_user)) {
37
+ throw new Error("不符合退回条件");
38
+ }
39
+ if (ins.traces.length < 2) {
40
+ throw new Error("不符合退回条件");
41
+ }
42
+ flow = await UUFlowManager.getFlow(ins.flow);
43
+ pre_trace = ins.traces[ins.traces.length - 2];
44
+ pre_step = await UUFlowManager.getStep(ins, flow, pre_trace.step);
45
+ if (pre_step.step_type === "counterSign") {
46
+ throw new Error("不符合退回条件");
47
+ }
48
+ last_trace = _.last(ins.traces);
49
+ current_step = await UUFlowManager.getStep(ins, flow, last_trace.step);
50
+ if (current_step.step_type !== "submit" && current_step.step_type !== "sign" && current_step.step_type !== "counterSign") {
51
+ throw new Error("不符合退回条件");
52
+ }
53
+ if (approve.trace !== last_trace._id) {
54
+ throw new Error("不符合退回条件");
55
+ }
56
+ new_inbox_users = new Array;
57
+ _.each(pre_trace.approves, function (a) {
58
+ if ((!a.type || a.type === "draft" || a.type === "reassign") && (!a.judge || a.judge === "submitted" || a.judge === "approved" || a.judge === "rejected")) {
59
+ return new_inbox_users.push(a.user);
60
+ }
61
+ });
62
+ if (_.isEmpty(new_inbox_users)) {
63
+ throw new Error("未找到下一步处理人,退回失败");
64
+ }
65
+ traces = ins.traces;
66
+ approve_values = await UUFlowManager.getApproveValues(approve.values || {}, current_step.permissions, ins.form, ins.form_version);
67
+ setObj = new Object;
68
+ now = new Date;
69
+ rest_counter_users = new Array;
70
+ _.each(traces, function (t) {
71
+ if (t._id === last_trace._id) {
72
+ if (!t.approves) {
73
+ t.approves = new Array;
63
74
  }
64
- traces = ins.traces;
65
- approve_values = UUFlowManager.getApproveValues(approve.values || {}, current_step.permissions, ins.form, ins.form_version);
66
- setObj = new Object;
67
- now = new Date;
68
- rest_counter_users = new Array;
69
- _.each(traces, function (t) {
70
- if (t._id === last_trace._id) {
71
- if (!t.approves) {
72
- t.approves = new Array;
73
- }
74
- _.each(t.approves, function (a, idx) {
75
- if ((!a.type || a.type === "reassign") && (!a.judge || a.judge === "submitted" || a.judge === "approved" || a.judge === "rejected" || a.judge === "readed") && a.is_finished !== true) {
76
- setObj['traces.$.approves.' + idx + '.finish_date'] = now;
77
- setObj['traces.$.approves.' + idx + '.read_date'] = now;
78
- setObj['traces.$.approves.' + idx + '.is_error'] = false;
79
- setObj['traces.$.approves.' + idx + '.is_read'] = true;
80
- setObj['traces.$.approves.' + idx + '.is_finished'] = true;
81
- setObj['traces.$.approves.' + idx + '.cost_time'] = now - a.start_date;
82
- setObj['traces.$.approves.' + idx + '.values'] = approve_values;
83
- if (a.handler === current_user) {
84
- setObj['traces.$.approves.' + idx + '.judge'] = "returned";
85
- return setObj['traces.$.approves.' + idx + '.description'] = reason;
86
- } else {
87
- return rest_counter_users.push(a.handler);
88
- }
89
- }
90
- });
91
- setObj['traces.$.is_finished'] = true;
92
- setObj['traces.$.finish_date'] = true;
93
- return setObj['traces.$.judge'] = "returned";
94
- }
95
- });
96
- ins.values = _.extend(ins.values || {}, approve_values);
97
- newTrace = new Object;
98
- newTrace._id = _makeNewID();
99
- newTrace.instance = instance_id;
100
- newTrace.previous_trace_ids = [last_trace._id];
101
- newTrace.is_finished = false;
102
- newTrace.step = pre_trace.step;
103
- newTrace.name = pre_trace.name;
104
- newTrace.start_date = now;
105
- newTrace.due_date = UUFlowManager.getDueDate(pre_step.timeout_hours, space_id);
106
- newTrace.approves = [];
107
- _.each(new_inbox_users, function (next_step_user_id, idx) {
108
- var agent, handler_id, handler_info, newApprove, next_step_space_user, next_step_user_org_info, user_info;
109
- newApprove = new Object;
110
- newApprove._id = _makeNewID();
111
- newApprove.instance = instance_id;
112
- newApprove.trace = newTrace._id;
113
- newApprove.is_finished = false;
114
- newApprove.user = next_step_user_id;
115
- user_info = db.users.findOne(next_step_user_id, {
116
- fields: {
117
- name: 1
75
+ _.each(t.approves, function (a, idx) {
76
+ if ((!a.type || a.type === "reassign") && (!a.judge || a.judge === "submitted" || a.judge === "approved" || a.judge === "rejected" || a.judge === "readed") && a.is_finished !== true) {
77
+ setObj['traces.$.approves.' + idx + '.finish_date'] = now;
78
+ setObj['traces.$.approves.' + idx + '.read_date'] = now;
79
+ setObj['traces.$.approves.' + idx + '.is_error'] = false;
80
+ setObj['traces.$.approves.' + idx + '.is_read'] = true;
81
+ setObj['traces.$.approves.' + idx + '.is_finished'] = true;
82
+ setObj['traces.$.approves.' + idx + '.cost_time'] = now - a.start_date;
83
+ setObj['traces.$.approves.' + idx + '.values'] = approve_values;
84
+ if (a.handler === current_user) {
85
+ setObj['traces.$.approves.' + idx + '.judge'] = "returned";
86
+ return setObj['traces.$.approves.' + idx + '.description'] = reason;
87
+ } else {
88
+ return rest_counter_users.push(a.handler);
118
89
  }
119
- });
120
- newApprove.user_name = user_info.name;
121
- handler_id = next_step_user_id;
122
- handler_info = user_info;
123
- agent = UUFlowManager.getAgent(space_id, next_step_user_id);
124
- if (agent) {
125
- new_inbox_users[idx] = agent;
126
- handler_id = agent;
127
- handler_info = db.users.findOne({
128
- _id: agent
129
- }, {
130
- fields: {
131
- name: 1
132
- }
133
- });
134
- newApprove.agent = agent;
135
- }
136
- newApprove.handler = handler_id;
137
- newApprove.handler_name = handler_info.name;
138
- next_step_space_user = UUFlowManager.getSpaceUser(space_id, handler_id);
139
- next_step_user_org_info = UUFlowManager.getSpaceUserOrgInfo(next_step_space_user);
140
- newApprove.handler_organization = next_step_user_org_info["organization"];
141
- newApprove.handler_organization_name = next_step_user_org_info["organization_name"];
142
- newApprove.handler_organization_fullname = next_step_user_org_info["organization_fullname"];
143
- newApprove.start_date = now;
144
- newApprove.is_read = false;
145
- newApprove.is_error = false;
146
- newApprove.values = new Object;
147
- UUFlowManager.setRemindInfo(ins.values, newApprove);
148
- return newTrace.approves.push(newApprove);
149
- });
150
- setObj.inbox_users = new_inbox_users;
151
- setObj.state = "pending";
152
- ins.outbox_users.push(current_user);
153
- setObj.outbox_users = _.uniq(ins.outbox_users);
154
- setObj.modified = now;
155
- setObj.modified_by = current_user;
156
- setObj.values = ins.values;
157
- setObj.current_step_name = pre_trace.name;
158
- r = db.instances.update({
159
- _id: instance_id,
160
- 'traces._id': last_trace._id
161
- }, {
162
- $set: setObj
163
- });
164
- // 更新当前记录
165
- update_instance_tasks(instance_id, last_trace._id, approve._id)
166
- b = db.instances.update({
167
- _id: instance_id
168
- }, {
169
- $push: {
170
- traces: newTrace
171
90
  }
172
91
  });
173
- // 生成新记录
174
- insert_instance_tasks(instance_id, newTrace._id, newTrace.approves[0]._id)
175
- if (r && b) {
176
- pushManager.send_message_to_specifyUser("current_user", current_user);
177
- instance = UUFlowManager.getInstance(instance_id);
178
- current_user_info = db.users.findOne(current_user);
179
- pushManager.send_instance_notification("return_pending_inbox", instance, reason, current_user_info);
180
- _.each(rest_counter_users, function (user_id) {
181
- return pushManager.send_message_to_specifyUser("current_user", user_id);
182
- });
183
- pushManager.triggerWebhook(instance.flow, instance, {}, 'return', current_user, instance.inbox_users);
92
+ setObj['traces.$.is_finished'] = true;
93
+ setObj['traces.$.finish_date'] = true;
94
+ return setObj['traces.$.judge'] = "returned";
95
+ }
96
+ });
97
+ ins.values = _.extend(ins.values || {}, approve_values);
98
+ newTrace = new Object;
99
+ newTrace._id = _makeNewID();
100
+ newTrace.instance = instance_id;
101
+ newTrace.previous_trace_ids = [last_trace._id];
102
+ newTrace.is_finished = false;
103
+ newTrace.step = pre_trace.step;
104
+ newTrace.name = pre_trace.name;
105
+ newTrace.start_date = now;
106
+ newTrace.due_date = await UUFlowManager.getDueDate(pre_step.timeout_hours, space_id);
107
+ newTrace.approves = [];
108
+ for (const [idx, next_step_user_id] of new_inbox_users.entries()) {
109
+ var agent, handler_id, handler_info, newApprove, next_step_space_user, next_step_user_org_info, user_info;
110
+ newApprove = new Object;
111
+ newApprove._id = _makeNewID();
112
+ newApprove.instance = instance_id;
113
+ newApprove.trace = newTrace._id;
114
+ newApprove.is_finished = false;
115
+ newApprove.user = next_step_user_id;
116
+ user_info = await usersCollection.findOne({ _id: next_step_user_id }, {
117
+ projection: {
118
+ name: 1
184
119
  }
185
- res.status(200).send({});
186
- } catch (error) {
187
- console.error(error);
188
- res.status(200).send({
189
- error: error.message
120
+ });
121
+ newApprove.user_name = user_info.name;
122
+ handler_id = next_step_user_id;
123
+ handler_info = user_info;
124
+ agent = await UUFlowManager.getAgent(space_id, next_step_user_id);
125
+ if (agent) {
126
+ new_inbox_users[idx] = agent;
127
+ handler_id = agent;
128
+ handler_info = await usersCollection.findOne({ _id: agent }, {
129
+ projection: {
130
+ name: 1
131
+ }
190
132
  });
133
+ newApprove.agent = agent;
191
134
  }
135
+ newApprove.handler = handler_id;
136
+ newApprove.handler_name = handler_info.name;
137
+ next_step_space_user = await UUFlowManager.getSpaceUser(space_id, handler_id);
138
+ next_step_user_org_info = await UUFlowManager.getSpaceUserOrgInfo(next_step_space_user);
139
+ newApprove.handler_organization = next_step_user_org_info["organization"];
140
+ newApprove.handler_organization_name = next_step_user_org_info["organization_name"];
141
+ newApprove.handler_organization_fullname = next_step_user_org_info["organization_fullname"];
142
+ newApprove.start_date = now;
143
+ newApprove.is_read = false;
144
+ newApprove.is_error = false;
145
+ newApprove.values = new Object;
146
+ await UUFlowManager.setRemindInfo(ins.values, newApprove);
147
+ newTrace.approves.push(newApprove);
148
+ };
149
+ setObj.inbox_users = new_inbox_users;
150
+ setObj.state = "pending";
151
+ ins.outbox_users.push(current_user);
152
+ setObj.outbox_users = _.uniq(ins.outbox_users);
153
+ setObj.modified = now;
154
+ setObj.modified_by = current_user;
155
+ setObj.values = ins.values;
156
+ setObj.current_step_name = pre_trace.name;
157
+ r = await instancesCollection.updateOne({
158
+ _id: instance_id,
159
+ 'traces._id': last_trace._id
160
+ }, {
161
+ $set: setObj
162
+ });
163
+ // 更新当前记录
164
+ await update_instance_tasks(instance_id, last_trace._id, approve._id)
165
+ b = await instancesCollection.updateOne({
166
+ _id: instance_id,
167
+ }, {
168
+ $push: {
169
+ traces: newTrace
170
+ }
171
+ });
172
+ // 生成新记录
173
+ await insert_instance_tasks(instance_id, newTrace._id, newTrace.approves[0]._id)
174
+ if (r && b) {
175
+ await pushManager.send_message_to_specifyUser("current_user", current_user);
176
+ instance = await UUFlowManager.getInstance(instance_id);
177
+ current_user_info = await usersCollection.findOne({ _id: current_user });
178
+ await pushManager.send_instance_notification("return_pending_inbox", instance, reason, current_user_info);
179
+ for (const user_id of rest_counter_users) {
180
+ await pushManager.send_message_to_specifyUser("current_user", user_id);
181
+ }
182
+ await pushManager.triggerWebhook(instance.flow, instance, {}, 'return', current_user, instance.inbox_users);
183
+ }
192
184
 
193
- }).run()
194
-
185
+ res.status(200).send({
186
+ status: 0,
187
+ msg: '',
188
+ data: {}
189
+ });
195
190
  } catch (error) {
196
191
  console.error(error);
197
192
  res.status(200).send({
198
- error: error.message
193
+ status: 0,
194
+ msg: error.message,
195
+ data: {}
199
196
  });
200
197
  }
201
198
  });
@@ -83,11 +83,16 @@ router.post('/api/workflow/v2/nextStepUsers', requireAuthentication, async funct
83
83
  var
84
84
  userField = nextStep.approver_user_field,
85
85
  userFieldValue = values[userField];
86
- if (userField.is_multiselect) { //如果多选,以userFieldValue值为Array
87
- nextStepUsers = await WorkflowManager.getUsers(spaceId, userFieldValue);
88
- } else {
89
- nextStepUsers.push(await WorkflowManager.getUser(spaceId, userFieldValue));
86
+ if(userFieldValue){
87
+ if (_.isArray(userFieldValue)) { //如果多选,以userFieldValue值为Array
88
+ nextStepUsers = await WorkflowManager.getUsers(spaceId, userFieldValue);
89
+ } else {
90
+ nextStepUsers.push(await WorkflowManager.getUser(spaceId, userFieldValue));
91
+ }
92
+ }else {
93
+ error = "FIELD_VALUE_EMPTY";
90
94
  }
95
+
91
96
  break;
92
97
  case 'orgField':
93
98
  var
@@ -96,7 +101,7 @@ router.post('/api/workflow/v2/nextStepUsers', requireAuthentication, async funct
96
101
  orgField = nextStep.approver_org_field,
97
102
  orgFieldValue = values[orgField];
98
103
  if (orgFieldValue) {
99
- if (orgField.is_multiselect) { //如果多选,以orgFieldValue值为Array
104
+ if (_.isArray(orgFieldValue)) { //如果多选,以orgFieldValue值为Array
100
105
  orgs = await WorkflowManager.getOrganizations(orgFieldValue);
101
106
  orgChildrens = await WorkflowManager.getOrganizationsChildrens(spaceId, orgFieldValue);
102
107
  } else {
@@ -105,7 +110,7 @@ router.post('/api/workflow/v2/nextStepUsers', requireAuthentication, async funct
105
110
  }
106
111
  nextStepUsers = await WorkflowManager.getOrganizationsUsers(spaceId, orgChildrens);
107
112
 
108
- orgFieldUsers = await WorkflowManager.getOrganizationsUsers(spaceId, orgs);
113
+ const orgFieldUsers = await WorkflowManager.getOrganizationsUsers(spaceId, orgs);
109
114
 
110
115
  nextStepUsers = nextStepUsers.concat(orgFieldUsers);
111
116
 
@@ -131,7 +136,7 @@ router.post('/api/workflow/v2/nextStepUsers', requireAuthentication, async funct
131
136
  userFieldValue = values[userField],
132
137
  approverRoleIds = nextStep.approver_roles;
133
138
  if (userFieldValue) {
134
- if (userField.is_multiselect) { //如果多选,以userFieldValue值为Array
139
+ if (_.isArray(userFieldValue)) { //如果多选,以userFieldValue值为Array
135
140
  nextStepUsers = await WorkflowManager.getRoleUsersByUsersAndRoles(spaceId, userFieldValue, approverRoleIds);
136
141
  } else {
137
142
  nextStepUsers = await WorkflowManager.getRoleUsersByUsersAndRoles(spaceId, [userFieldValue], approverRoleIds);
@@ -153,7 +158,7 @@ router.post('/api/workflow/v2/nextStepUsers', requireAuthentication, async funct
153
158
  approverRoleIds = nextStep.approver_roles;
154
159
 
155
160
  if (orgFieldValue) {
156
- if (orgField.is_multiselect) { //如果多选,以orgFieldValue值为Array
161
+ if (_.isArray(orgFieldValue)) { //如果多选,以orgFieldValue值为Array
157
162
  nextStepUsers = await WorkflowManager.getRoleUsersByOrgsAndRoles(spaceId, orgFieldValue, approverRoleIds);
158
163
  } else {
159
164
  nextStepUsers = await WorkflowManager.getRoleUsersByOrgsAndRoles(spaceId, [orgFieldValue], approverRoleIds);