@steedos-labs/plugin-workflow 3.0.0-beta.29 → 3.0.0-beta.31

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 (34) hide show
  1. package/main/default/client/instance.client.js +2 -2
  2. package/main/default/manager/import.js +16 -1
  3. package/main/default/manager/push_manager.js +14 -6
  4. package/main/default/methods/trace_approve_cc.js +568 -0
  5. package/main/default/objectTranslations/instances.en/instances.en.objectTranslation.yml +212 -0
  6. package/main/default/objectTranslations/instances.zh-CN/instances.zh-CN.objectTranslation.yml +209 -0
  7. package/main/default/objects/flows/buttons/newexport.button.yml +1 -1
  8. package/main/default/objects/flows/buttons/newimport.button.yml +2 -1
  9. package/main/default/objects/flows/flows.object.yml +1 -0
  10. package/main/default/objects/instances/buttons/instance_cc.button.yml +1 -1
  11. package/main/default/objects/instances/buttons/instance_distribute.button.yml +3 -2
  12. package/main/default/objects/instances/buttons/instance_forward.button.yml +1 -1
  13. package/main/default/objects/instances/buttons/instance_reassign.button.yml +1 -16
  14. package/main/default/objects/instances/buttons/instance_relocate.button.yml +1 -1
  15. package/main/default/objects/instances/buttons/instance_retrieve.button.yml +106 -2
  16. package/main/default/objects/instances/buttons/instance_save.button.yml +1 -1
  17. package/main/default/objects/instances/listviews/monitor.listview.yml +0 -1
  18. package/main/default/pages/instance_tasks_list.page.amis.json +6 -99
  19. package/main/default/pages/instances_list.page.amis.json +6 -100
  20. package/main/default/routes/api_cc.router.js +5 -12
  21. package/main/default/routes/api_flow_permission.router.js +7 -2
  22. package/main/default/routes/api_workflow_instance_return.router.js +164 -167
  23. package/main/default/routes/api_workflow_reassign.router.js +200 -196
  24. package/main/default/routes/api_workflow_relocate.router.js +1 -1
  25. package/main/default/routes/api_workflow_retrieve.router.js +246 -237
  26. package/main/default/routes/export.router.js +5 -4
  27. package/main/default/routes/flow_form_design.ejs +2 -0
  28. package/main/default/routes/import.router.js +6 -7
  29. package/main/default/triggers/amis_form_design.trigger.js +1 -1
  30. package/main/default/utils/designerManager.js +1 -0
  31. package/package.json +3 -2
  32. package/package.service.js +20 -6
  33. package/src/webhook_queue.js +283 -0
  34. package/main/default/manager/index.js +0 -23
@@ -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
  });