@steedos-labs/plugin-workflow 3.0.0-beta.28 → 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.
- package/main/default/client/object_workflows.client.js +8 -7
- package/main/default/manager/import.js +16 -1
- package/main/default/manager/index.js +2 -14
- package/main/default/manager/uuflowManagerForInitApproval.js +794 -0
- package/main/default/methods/trace_approve_cc.js +568 -0
- package/main/default/objectTranslations/instances.en/instances.en.objectTranslation.yml +212 -0
- package/main/default/objectTranslations/instances.zh-CN/instances.zh-CN.objectTranslation.yml +209 -0
- package/main/default/objects/flows/buttons/newimport.button.yml +2 -1
- package/main/default/objects/instances/buttons/instance_cc.button.yml +1 -1
- package/main/default/objects/instances/buttons/instance_save.button.yml +1 -1
- package/main/default/objects/instances/listviews/monitor.listview.yml +0 -1
- package/main/default/routes/api_cc.router.js +5 -12
- package/main/default/routes/api_get_object_workflows.router.js +79 -22
- package/main/default/routes/api_object_workflow_drafts.router.js +18 -19
- package/main/default/routes/api_workflow_instance_return.router.js +157 -166
- package/main/default/routes/flow_form_design.ejs +2 -0
- package/main/default/triggers/amis_form_design.trigger.js +1 -1
- package/main/default/utils/designerManager.js +1 -0
- package/package.json +2 -3
|
@@ -1,197 +1,188 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* @Author: baozhoutao@steedos.com
|
|
3
3
|
* @Date: 2022-09-15 13:09:51
|
|
4
|
-
* @LastEditors: sunhaolin@
|
|
5
|
-
* @LastEditTime:
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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
|
|
151
|
-
setObj
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
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
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
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
|
-
|
|
194
|
-
|
|
185
|
+
res.status(200).send({});
|
|
195
186
|
} catch (error) {
|
|
196
187
|
console.error(error);
|
|
197
188
|
res.status(200).send({
|
|
@@ -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,12 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@steedos-labs/plugin-workflow",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.30",
|
|
4
4
|
"main": "package.service.js",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"scripts": {
|
|
7
|
-
"build": "tsc && webpack --config webpack.config.js",
|
|
8
7
|
"build:watch": "tsc --watch",
|
|
9
|
-
"release": "
|
|
8
|
+
"release": "npm publish --registry https://registry.npmjs.org && open https://npmmirror.com/sync/@steedos-labs/plugin-workflow && cnpm sync @steedos-labs/plugin-workflow"
|
|
10
9
|
},
|
|
11
10
|
"dependencies": {
|
|
12
11
|
"graphql-parse-resolve-info": "^4.12.3",
|