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

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.
@@ -1,197 +1,188 @@
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-04 13:43: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
90
  }
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
91
  });
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
- }
172
- });
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
+ 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
+ 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({});
195
186
  } catch (error) {
196
187
  console.error(error);
197
188
  res.status(200).send({
@@ -136,6 +136,8 @@
136
136
  {
137
137
  record:forms__findOne(id: "${id}"){
138
138
  _id,
139
+ name,
140
+ description,
139
141
  amis_schema,
140
142
  current
141
143
  }
@@ -534,7 +534,7 @@ module.exports = {
534
534
 
535
535
  // 数据库更新操作:将forms表current的fields字段更新为最终数组
536
536
  form.current.fields = getFinalFormFields(inputFields);
537
- form.current.amis_schema = amis_schema;
537
+ form.current.amis_schema = this.doc.amis_schema;
538
538
  form.current.style = formSchema.style;
539
539
  form.current.mode = formSchema.mode;
540
540
  form.current.wizard_mode = formSchema.wizard_mode;
@@ -224,6 +224,7 @@ async function updateForm(formId, form, forms, flows, currentUserId) {
224
224
  current.style = form["current"]["style"];
225
225
  current.mode = form["current"]["mode"];
226
226
  current.wizard_mode = form["current"]["wizard_mode"];
227
+ current.amis_schema = form["current"]["amis_schema"]
227
228
 
228
229
  formUpdateObj.$set = {
229
230
  'current': current,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@steedos-labs/plugin-workflow",
3
- "version": "3.0.0-beta.29",
3
+ "version": "3.0.0-beta.30",
4
4
  "main": "package.service.js",
5
5
  "license": "MIT",
6
6
  "scripts": {