@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.
- package/main/default/client/instance.client.js +6 -6
- package/main/default/client/object_workflows.client.js +8 -7
- package/main/default/client/socket.client.js +46 -3
- package/main/default/manager/import.js +17 -1
- package/main/default/manager/instance_manager.js +20 -6
- package/main/default/manager/push_manager.js +20 -12
- package/main/default/manager/uuflowManagerForInitApproval.js +794 -0
- package/main/default/manager/uuflow_manager.js +53 -4
- package/main/default/manager/workflow_manager.js +1 -1
- package/main/default/methods/instance_approve.js +258 -0
- package/main/default/methods/trace_approve_cc.js +571 -0
- package/main/default/objectTranslations/flows.en/flows.en.objectTranslation.yml +19 -0
- package/main/default/objectTranslations/flows.zh-CN/flows.zh-CN.objectTranslation.yml +19 -0
- package/main/default/objectTranslations/forms.en/forms.en.objectTranslation.yml +191 -0
- package/main/default/objectTranslations/forms.zh-CN/forms.zh-CN.objectTranslation.yml +246 -0
- package/main/default/objectTranslations/instance_tasks.en/instance_tasks.en.objectTranslation.yml +213 -0
- package/main/default/objectTranslations/instance_tasks.zh-CN/instance_tasks.zh-CN.objectTranslation.yml +213 -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/categories.object.yml +1 -0
- package/main/default/objects/flows/buttons/del.button.yml +7 -10
- package/main/default/objects/flows/buttons/design_form_layout.button.js +5 -2
- package/main/default/objects/flows/buttons/distributeAdmin.button.yml +5 -5
- package/main/default/objects/flows/buttons/newexport.button.yml +1 -1
- package/main/default/objects/flows/buttons/newimport.button.yml +2 -1
- package/main/default/objects/flows/flows.object.yml +12 -4
- package/main/default/objects/forms/forms.object.yml +85 -0
- package/main/default/objects/instance_tasks/buttons/instance_new.button.yml +3 -5
- package/main/default/objects/instances/buttons/instance_cc.button.yml +7 -7
- package/main/default/objects/instances/buttons/instance_delete.button.yml +2 -2
- package/main/default/objects/instances/buttons/instance_delete_many.button.yml +6 -6
- package/main/default/objects/instances/buttons/instance_distribute.button.yml +14 -13
- package/main/default/objects/instances/buttons/instance_flow_chart.button.yml +1 -1
- package/main/default/objects/instances/buttons/instance_forward.button.yml +8 -8
- package/main/default/objects/instances/buttons/instance_new.button.yml +3 -5
- package/main/default/objects/instances/buttons/instance_reassign.button.yml +1 -16
- package/main/default/objects/instances/buttons/instance_related.button.yml +4 -4
- package/main/default/objects/instances/buttons/instance_relocate.button.yml +9 -12
- package/main/default/objects/instances/buttons/instance_retrieve.button.yml +106 -2
- package/main/default/objects/instances/buttons/instance_save.button.yml +3 -9
- package/main/default/objects/instances/buttons/instance_submit.button.yml +1 -1
- package/main/default/objects/instances/buttons/instance_terminate.button.yml +7 -10
- package/main/default/objects/instances/listviews/monitor.listview.yml +0 -1
- package/main/default/pages/flowdetail.page.amis.json +11 -11
- package/main/default/pages/instance_detail.page.amis.json +25 -37
- package/main/default/pages/instance_tasks_detail.page.amis.json +21 -5
- package/main/default/pages/instance_tasks_list.page.amis.json +147 -110
- package/main/default/pages/instances_list.page.amis.json +146 -110
- package/main/default/routes/afterHook.js +34 -0
- package/main/default/routes/am.router.js +49 -2
- package/main/default/routes/api_cc.router.js +5 -12
- package/main/default/routes/api_flow_permission.router.js +7 -2
- package/main/default/routes/api_get_object_workflows.router.js +79 -22
- package/main/default/routes/api_have_read.router.js +73 -0
- package/main/default/routes/api_object_workflow_drafts.router.js +18 -19
- package/main/default/routes/api_workflow_approve_save.router.js +2 -1
- package/main/default/routes/api_workflow_chart.router.js +682 -0
- package/main/default/routes/api_workflow_engine.router.js +4 -4
- package/main/default/routes/api_workflow_flow_version.router.js +61 -0
- package/main/default/routes/api_workflow_form_version.router.js +61 -0
- package/main/default/routes/api_workflow_instance_return.router.js +164 -167
- package/main/default/routes/api_workflow_next_step_users.router.js +13 -8
- package/main/default/routes/api_workflow_reassign.router.js +200 -196
- package/main/default/routes/api_workflow_relocate.router.js +4 -3
- package/main/default/routes/api_workflow_retrieve.router.js +246 -237
- package/main/default/routes/export.router.js +5 -4
- package/main/default/routes/flow_form_design.ejs +33 -8
- package/main/default/routes/flow_form_design.router.js +4 -3
- package/main/default/routes/import.router.js +6 -7
- package/main/default/services/flows.service.js +1 -1
- package/main/default/translations/en.translation.yml +5 -0
- package/main/default/translations/zh-CN.translation.yml +2 -1
- package/main/default/triggers/amis_form_design.trigger.js +27 -5
- package/main/default/triggers/instances.trigger.js +9 -7
- package/main/default/utils/designerManager.js +12 -5
- package/package.json +4 -4
- package/package.service.js +21 -7
- package/public/workflow/index.css +4 -0
- package/src/instance_record_queue.js +1 -3
- package/src/rests/api_workflow_instance_batch_remove.js +4 -3
- package/src/webhook_queue.js +283 -0
- package/main/default/manager/index.js +0 -23
|
@@ -0,0 +1,571 @@
|
|
|
1
|
+
|
|
2
|
+
const { getCollection, _makeNewID } = require('../utils/collection');
|
|
3
|
+
const UUFlowManager = require('../manager/uuflow_manager.js');
|
|
4
|
+
const pushManager = require('../manager/push_manager.js');
|
|
5
|
+
const {
|
|
6
|
+
update_instance_tasks,
|
|
7
|
+
insert_instance_tasks,
|
|
8
|
+
remove_instance_tasks,
|
|
9
|
+
direct_remove_many_instance_tasks
|
|
10
|
+
} = require('../manager/instance_tasks_manager')
|
|
11
|
+
|
|
12
|
+
module.exports = {
|
|
13
|
+
cc_do: async function (approve, cc_user_ids, description, ctx = {}) {
|
|
14
|
+
var setObj = {};
|
|
15
|
+
var ins_id = approve.instance;
|
|
16
|
+
var trace_id = approve.trace;
|
|
17
|
+
var approve_id = approve._id;
|
|
18
|
+
|
|
19
|
+
const instancesCollection = await getCollection('instances');
|
|
20
|
+
const usersCollection = await getCollection('users');
|
|
21
|
+
const spaceUsersCollection = await getCollection('space_users');
|
|
22
|
+
const organizationsCollection = await getCollection('organizations');
|
|
23
|
+
|
|
24
|
+
const instance = await instancesCollection.findOne({ _id: ins_id }, {
|
|
25
|
+
projection: {
|
|
26
|
+
space: 1,
|
|
27
|
+
traces: 1,
|
|
28
|
+
cc_users: 1,
|
|
29
|
+
values: 1
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
var current_user_id = ctx.userId || this.userId;
|
|
33
|
+
var space_id = instance.space;
|
|
34
|
+
var new_approves = [];
|
|
35
|
+
|
|
36
|
+
const from_user = await usersCollection.findOne({ _id: current_user_id })
|
|
37
|
+
const from_user_name = from_user.name;
|
|
38
|
+
|
|
39
|
+
for (const [idx, userId] of cc_user_ids.entries()) {
|
|
40
|
+
|
|
41
|
+
const user = await usersCollection.findOne({ _id: userId }, {
|
|
42
|
+
projection: {
|
|
43
|
+
name: 1
|
|
44
|
+
}
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
const space_user = await spaceUsersCollection.findOne({ user: userId, space: space_id }, {
|
|
48
|
+
projection: {
|
|
49
|
+
organization: 1
|
|
50
|
+
}
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
var org_id = space_user.organization;
|
|
54
|
+
|
|
55
|
+
const organization = await organizationsCollection.findOne({ _id: org_id }, {
|
|
56
|
+
projection: {
|
|
57
|
+
name: 1,
|
|
58
|
+
fullname: 1
|
|
59
|
+
}
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
var agent = await UUFlowManager.getAgent(space_id, userId);
|
|
63
|
+
var handler_id = userId;
|
|
64
|
+
var handler_info = user;
|
|
65
|
+
var handler_space_user = space_user;
|
|
66
|
+
var handler_org_info = organization;
|
|
67
|
+
if (agent) {
|
|
68
|
+
handler_id = agent;
|
|
69
|
+
handler_info = await usersCollection.findOne({ _id: agent }, {
|
|
70
|
+
projection: {
|
|
71
|
+
name: 1
|
|
72
|
+
}
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
handler_space_user = await UUFlowManager.getSpaceUser(space_id, agent);
|
|
76
|
+
handler_org_info = await UUFlowManager.getSpaceUserOrgInfo(handler_space_user);
|
|
77
|
+
cc_user_ids[idx] = agent;
|
|
78
|
+
}
|
|
79
|
+
var appr = {
|
|
80
|
+
'_id': _makeNewID(),
|
|
81
|
+
'instance': ins_id,
|
|
82
|
+
'trace': trace_id,
|
|
83
|
+
'is_finished': false,
|
|
84
|
+
'user': userId,
|
|
85
|
+
'user_name': user.name,
|
|
86
|
+
'handler': handler_id,
|
|
87
|
+
'handler_name': handler_info.name,
|
|
88
|
+
'handler_organization': handler_space_user.organization,
|
|
89
|
+
'handler_organization_name': handler_org_info.name,
|
|
90
|
+
'handler_organization_fullname': handler_org_info.fullname,
|
|
91
|
+
'type': 'cc',
|
|
92
|
+
'start_date': new Date(),
|
|
93
|
+
'is_read': false,
|
|
94
|
+
'from_user': current_user_id,
|
|
95
|
+
'from_user_name': from_user_name,
|
|
96
|
+
'opinion_fields_code': approve.opinion_fields_code,
|
|
97
|
+
'sign_field_code': (approve.opinion_fields_code && approve.opinion_fields_code.length == 1) ? approve.opinion_fields_code[0] : "",
|
|
98
|
+
'from_approve_id': approve_id,
|
|
99
|
+
'cc_description': description
|
|
100
|
+
};
|
|
101
|
+
if (agent) {
|
|
102
|
+
appr.agent = agent;
|
|
103
|
+
}
|
|
104
|
+
await UUFlowManager.setRemindInfo(instance.values, appr)
|
|
105
|
+
new_approves.push(appr);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
setObj.modified = new Date();
|
|
109
|
+
setObj.modified_by = this.userId;
|
|
110
|
+
|
|
111
|
+
await instancesCollection.updateOne({
|
|
112
|
+
_id: ins_id,
|
|
113
|
+
'traces._id': trace_id
|
|
114
|
+
}, {
|
|
115
|
+
$set: setObj,
|
|
116
|
+
$push: {
|
|
117
|
+
'traces.$.approves': {
|
|
118
|
+
$each: new_approves
|
|
119
|
+
},
|
|
120
|
+
cc_users: {
|
|
121
|
+
$each: cc_user_ids
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
$inc: {
|
|
125
|
+
cc_count: cc_user_ids.length
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
// 新增记录
|
|
129
|
+
for (const a of new_approves) {
|
|
130
|
+
await insert_instance_tasks(ins_id, trace_id, a._id)
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const updatedInstance = await instancesCollection.findOne({ _id: ins_id });
|
|
134
|
+
|
|
135
|
+
await pushManager.send_instance_notification("trace_approve_cc", updatedInstance, "", from_user, cc_user_ids);
|
|
136
|
+
|
|
137
|
+
flow_id = instance.flow;
|
|
138
|
+
approve.cc_user_ids = cc_user_ids; // 记录下本次传阅的人员ID作为hook接口中的参数
|
|
139
|
+
// 如果已经配置webhook并已激活则触发
|
|
140
|
+
await pushManager.triggerWebhook(flow_id, instance, approve, 'cc_do', current_user_id, cc_user_ids)
|
|
141
|
+
return true;
|
|
142
|
+
},
|
|
143
|
+
|
|
144
|
+
cc_read: async function (instance, approve, ctx = {}) {
|
|
145
|
+
const db = {
|
|
146
|
+
instances: await getCollection('instances')
|
|
147
|
+
};
|
|
148
|
+
var setObj = {};
|
|
149
|
+
var ins_id = approve.instance;
|
|
150
|
+
var trace_id = approve.trace;
|
|
151
|
+
var approve_id = approve._id;
|
|
152
|
+
// var instance = await db.instances.findOne({ _id: ins_id }, {
|
|
153
|
+
// fields: {
|
|
154
|
+
// traces: 1
|
|
155
|
+
// }
|
|
156
|
+
// });
|
|
157
|
+
var current_user_id = ctx.userId || this.userId;
|
|
158
|
+
var current_trace = _.find(instance.traces, function (t) {
|
|
159
|
+
return t._id == trace_id;
|
|
160
|
+
})
|
|
161
|
+
|
|
162
|
+
var index = 0;
|
|
163
|
+
|
|
164
|
+
current_trace.approves.forEach(function (a, idx) {
|
|
165
|
+
if (approve_id == a._id && a.type == 'cc' && a.handler == current_user_id && !a.is_read) {
|
|
166
|
+
index = idx;
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
// setObj['traces.$.approves.' + index + '.is_read'] = true;
|
|
171
|
+
// setObj['traces.$.approves.' + index + '.read_date'] = new Date();
|
|
172
|
+
const key_str = 'traces.$.approves.' + index + '.';
|
|
173
|
+
const approveDoc = {
|
|
174
|
+
is_read: true,
|
|
175
|
+
read_date: new Date()
|
|
176
|
+
}
|
|
177
|
+
for (const key in approveDoc) {
|
|
178
|
+
if (Object.hasOwnProperty.call(approveDoc, key)) {
|
|
179
|
+
setObj[key_str + key] = approveDoc[key]
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
await db.instances.update({
|
|
185
|
+
_id: ins_id,
|
|
186
|
+
'traces._id': trace_id
|
|
187
|
+
}, {
|
|
188
|
+
$set: setObj
|
|
189
|
+
});
|
|
190
|
+
await update_instance_tasks(ins_id, trace_id, current_trace.approves[index]._id, approveDoc)
|
|
191
|
+
return true;
|
|
192
|
+
},
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
cc_submit: function (ins_id, description, myApprove, ccHasEditPermission) {
|
|
196
|
+
var setObj = {};
|
|
197
|
+
|
|
198
|
+
var instance = db.instances.findOne(ins_id);
|
|
199
|
+
var traces = instance.traces;
|
|
200
|
+
var current_user_id = this.userId;
|
|
201
|
+
|
|
202
|
+
var flow = uuflowManager.getFlow(instance.flow);
|
|
203
|
+
var values = myApprove.values || {};
|
|
204
|
+
|
|
205
|
+
var approve_id = myApprove._id;
|
|
206
|
+
|
|
207
|
+
var myTrace;
|
|
208
|
+
|
|
209
|
+
var is_finished; // 传阅正真结束的标记
|
|
210
|
+
|
|
211
|
+
for (let tidx = 0; tidx < traces.length; tidx++) {
|
|
212
|
+
const t = traces[tidx];
|
|
213
|
+
if (t.approves) {
|
|
214
|
+
for (let aidx = 0; aidx < t.approves.length; aidx++) {
|
|
215
|
+
const a = t.approves[aidx];
|
|
216
|
+
if (approve_id == a._id && a.type == 'cc' && a.handler == current_user_id && a.is_finished == false) {
|
|
217
|
+
var upobj = {};
|
|
218
|
+
var key_str = 'traces.$.approves.' + aidx + '.';
|
|
219
|
+
const approveDoc = {
|
|
220
|
+
'is_finished': true,
|
|
221
|
+
'is_read': true,
|
|
222
|
+
'finish_date': new Date(),
|
|
223
|
+
'judge': "submitted",
|
|
224
|
+
'cost_time': new Date() - a.start_date,
|
|
225
|
+
}
|
|
226
|
+
// upobj[key_str + 'is_finished'] = true;
|
|
227
|
+
// upobj[key_str + 'is_read'] = true;
|
|
228
|
+
// upobj[key_str + 'finish_date'] = new Date();
|
|
229
|
+
// upobj[key_str + 'judge'] = "submitted";
|
|
230
|
+
// upobj[key_str + 'cost_time'] = new Date() - a.start_date;
|
|
231
|
+
if (approve_id == a._id && !t.is_finished && ccHasEditPermission) {
|
|
232
|
+
myTrace = t;
|
|
233
|
+
var step = uuflowManager.getStep(instance, flow, t.step);
|
|
234
|
+
// upobj[key_str + "values"] = uuflowManager.getApproveValues(values, step["permissions"], instance.form, instance.form_version)
|
|
235
|
+
approveDoc['values'] = uuflowManager.getApproveValues(values, step["permissions"], instance.form, instance.form_version)
|
|
236
|
+
}
|
|
237
|
+
//设置意见,意见只添加到最后一条approve中
|
|
238
|
+
if (approve_id == a._id) {
|
|
239
|
+
// upobj[key_str + 'description'] = description;
|
|
240
|
+
approveDoc['description'] = description
|
|
241
|
+
}
|
|
242
|
+
for (const key in approveDoc) {
|
|
243
|
+
if (Object.hasOwnProperty.call(approveDoc, key)) {
|
|
244
|
+
upobj[key_str + key] = approveDoc[key]
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
db.instances.update({
|
|
248
|
+
_id: ins_id,
|
|
249
|
+
'traces._id': t._id
|
|
250
|
+
}, {
|
|
251
|
+
$set: upobj
|
|
252
|
+
})
|
|
253
|
+
// 更新
|
|
254
|
+
update_instance_tasks(ins_id, a.trace, a._id, approveDoc)
|
|
255
|
+
is_finished = true;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
if (myApprove && is_finished) {
|
|
263
|
+
|
|
264
|
+
setObj.modified = new Date();
|
|
265
|
+
setObj.modified_by = this.userId;
|
|
266
|
+
|
|
267
|
+
if (ccHasEditPermission && myApprove && !myTrace.is_finished) {
|
|
268
|
+
var ins = uuflowManager.getInstance(ins_id);
|
|
269
|
+
var updated_values = uuflowManager.getUpdatedValues(ins, approve_id);
|
|
270
|
+
setObj.values = updated_values;
|
|
271
|
+
setObj.name = uuflowManager.getInstanceName(instance);
|
|
272
|
+
// 计算extras
|
|
273
|
+
var form = db.forms.findOne(instance.form);
|
|
274
|
+
setObj.extras = uuflowManager.caculateExtras(setObj.values, form, instance.form_version);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
db.instances.update({
|
|
278
|
+
_id: ins_id,
|
|
279
|
+
cc_users: current_user_id
|
|
280
|
+
}, {
|
|
281
|
+
$set: setObj,
|
|
282
|
+
$unset: {
|
|
283
|
+
'cc_users.$': true
|
|
284
|
+
},
|
|
285
|
+
$addToSet: {
|
|
286
|
+
outbox_users: {
|
|
287
|
+
$each: [current_user_id, myApprove.user]
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
db.instances.update({
|
|
293
|
+
_id: ins_id,
|
|
294
|
+
}, {
|
|
295
|
+
$pull: {
|
|
296
|
+
cc_users: null
|
|
297
|
+
}
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
uuflowManager.updateCCcount(ins_id)
|
|
301
|
+
|
|
302
|
+
instance = db.instances.findOne(ins_id);
|
|
303
|
+
|
|
304
|
+
current_user_info = db.users.findOne(current_user_id);
|
|
305
|
+
//传阅提交不通知传阅者
|
|
306
|
+
if (false && description && myApprove && myApprove.from_user) {
|
|
307
|
+
pushManager.send_instance_notification("trace_approve_cc_submit", instance, "", current_user_info, [myApprove.from_user]);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
pushManager.send_message_to_specifyUser("current_user", current_user_id);
|
|
311
|
+
|
|
312
|
+
flow_id = instance.flow;
|
|
313
|
+
// 如果已经配置webhook并已激活则触发
|
|
314
|
+
pushManager.triggerWebhook(flow_id, instance, myApprove, 'cc_submit', current_user_id, []);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
return true;
|
|
318
|
+
},
|
|
319
|
+
|
|
320
|
+
cc_remove: function (instanceId, approveId) {
|
|
321
|
+
var setObj = {};
|
|
322
|
+
|
|
323
|
+
var instance = db.instances.findOne(instanceId, {
|
|
324
|
+
fields: {
|
|
325
|
+
traces: 1,
|
|
326
|
+
cc_users: 1
|
|
327
|
+
}
|
|
328
|
+
});
|
|
329
|
+
var traces = instance.traces;
|
|
330
|
+
var trace_id, remove_user_id, multi = false;
|
|
331
|
+
|
|
332
|
+
traces.forEach(function (t) {
|
|
333
|
+
if (t.approves) {
|
|
334
|
+
t.approves.forEach(function (a, idx) {
|
|
335
|
+
if (a._id == approveId) {
|
|
336
|
+
trace_id = a.trace;
|
|
337
|
+
remove_user_id = a.handler;
|
|
338
|
+
setObj['traces.$.approves.' + idx + '.judge'] = 'terminated';
|
|
339
|
+
setObj['traces.$.approves.' + idx + '.is_finished'] = true;
|
|
340
|
+
setObj['traces.$.approves.' + idx + '.finish_date'] = new Date();
|
|
341
|
+
setObj['traces.$.approves.' + idx + '.is_read'] = true;
|
|
342
|
+
setObj['traces.$.approves.' + idx + '.read_date'] = new Date();
|
|
343
|
+
}
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
})
|
|
347
|
+
|
|
348
|
+
if (!trace_id || !remove_user_id)
|
|
349
|
+
return;
|
|
350
|
+
|
|
351
|
+
var multi = 0;
|
|
352
|
+
traces.forEach(function (t) {
|
|
353
|
+
if (t.approves) {
|
|
354
|
+
t.approves.forEach(function (a) {
|
|
355
|
+
if (a.handler == remove_user_id && a.type == 'cc' && a.is_finished == false) {
|
|
356
|
+
multi++;
|
|
357
|
+
}
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
})
|
|
361
|
+
|
|
362
|
+
setObj.modified = new Date();
|
|
363
|
+
setObj.modified_by = this.userId;
|
|
364
|
+
|
|
365
|
+
if (multi > 1) {
|
|
366
|
+
db.instances.update({
|
|
367
|
+
_id: instanceId,
|
|
368
|
+
'traces._id': trace_id
|
|
369
|
+
}, {
|
|
370
|
+
$set: setObj
|
|
371
|
+
});
|
|
372
|
+
} else {
|
|
373
|
+
db.instances.update({
|
|
374
|
+
_id: instanceId,
|
|
375
|
+
'traces._id': trace_id
|
|
376
|
+
}, {
|
|
377
|
+
$set: setObj,
|
|
378
|
+
$pull: {
|
|
379
|
+
cc_users: remove_user_id
|
|
380
|
+
}
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
uuflowManager.updateCCcount(instanceId)
|
|
385
|
+
|
|
386
|
+
remove_instance_tasks(approveId)
|
|
387
|
+
|
|
388
|
+
|
|
389
|
+
pushManager.send_message_to_specifyUser("current_user", remove_user_id);
|
|
390
|
+
return true;
|
|
391
|
+
},
|
|
392
|
+
|
|
393
|
+
batch_cancel_cc: function (instance_id, approve_ids) {
|
|
394
|
+
check(instance_id, String)
|
|
395
|
+
check(approve_ids, Array)
|
|
396
|
+
|
|
397
|
+
var setObj = {};
|
|
398
|
+
|
|
399
|
+
var instance = db.instances.findOne(instance_id, {
|
|
400
|
+
fields: {
|
|
401
|
+
traces: 1,
|
|
402
|
+
cc_users: 1
|
|
403
|
+
}
|
|
404
|
+
});
|
|
405
|
+
var traces = instance.traces;
|
|
406
|
+
var remove_user_ids = [];
|
|
407
|
+
var removeApproveIds = []
|
|
408
|
+
|
|
409
|
+
traces.forEach(function (t, tIdx) {
|
|
410
|
+
if (t.approves) {
|
|
411
|
+
t.approves.forEach(function (a, idx) {
|
|
412
|
+
if (approve_ids.includes(a._id)) {
|
|
413
|
+
removeApproveIds.push(a._id)
|
|
414
|
+
remove_user_ids.push(a.user);
|
|
415
|
+
setObj['traces.' + tIdx + '.approves.' + idx + '.judge'] = 'terminated';
|
|
416
|
+
setObj['traces.' + tIdx + '.approves.' + idx + '.is_finished'] = true;
|
|
417
|
+
setObj['traces.' + tIdx + '.approves.' + idx + '.finish_date'] = new Date();
|
|
418
|
+
setObj['traces.' + tIdx + '.approves.' + idx + '.is_read'] = true;
|
|
419
|
+
setObj['traces.' + tIdx + '.approves.' + idx + '.read_date'] = new Date();
|
|
420
|
+
}
|
|
421
|
+
});
|
|
422
|
+
}
|
|
423
|
+
})
|
|
424
|
+
|
|
425
|
+
if (_.isEmpty(remove_user_ids))
|
|
426
|
+
return;
|
|
427
|
+
|
|
428
|
+
setObj.modified = new Date();
|
|
429
|
+
setObj.modified_by = this.userId;
|
|
430
|
+
|
|
431
|
+
db.instances.update({
|
|
432
|
+
_id: instance_id
|
|
433
|
+
}, {
|
|
434
|
+
$set: setObj,
|
|
435
|
+
});
|
|
436
|
+
for (const ruId of remove_user_ids) {
|
|
437
|
+
db.instances.update({
|
|
438
|
+
_id: instance_id,
|
|
439
|
+
cc_users: ruId
|
|
440
|
+
}, {
|
|
441
|
+
$unset: {
|
|
442
|
+
'cc_users.$': true
|
|
443
|
+
}
|
|
444
|
+
});
|
|
445
|
+
}
|
|
446
|
+
db.instances.update({
|
|
447
|
+
_id: instance_id,
|
|
448
|
+
}, {
|
|
449
|
+
$pull: {
|
|
450
|
+
cc_users: null
|
|
451
|
+
}
|
|
452
|
+
});
|
|
453
|
+
|
|
454
|
+
uuflowManager.updateCCcount(instance_id)
|
|
455
|
+
|
|
456
|
+
direct_remove_many_instance_tasks(removeApproveIds)
|
|
457
|
+
|
|
458
|
+
remove_user_ids.forEach(function (u_id) {
|
|
459
|
+
pushManager.send_message_to_specifyUser("current_user", u_id);
|
|
460
|
+
})
|
|
461
|
+
return true;
|
|
462
|
+
},
|
|
463
|
+
|
|
464
|
+
cc_save: function (ins_id, description, myApprove, ccHasEditPermission) {
|
|
465
|
+
var setObj = {};
|
|
466
|
+
const approveDoc = {}
|
|
467
|
+
|
|
468
|
+
var instance = db.instances.findOne(ins_id);
|
|
469
|
+
var traces = instance.traces;
|
|
470
|
+
var current_user_id = this.userId;
|
|
471
|
+
|
|
472
|
+
var trace_id = myApprove.trace;
|
|
473
|
+
var approve_id = myApprove._id;
|
|
474
|
+
|
|
475
|
+
var current_trace = _.find(traces, function (t) {
|
|
476
|
+
return t._id == trace_id;
|
|
477
|
+
});
|
|
478
|
+
var current_approve = _.find(current_trace.approves, function (a) {
|
|
479
|
+
return a._id == approve_id;
|
|
480
|
+
});
|
|
481
|
+
|
|
482
|
+
var myTrace;
|
|
483
|
+
|
|
484
|
+
traces.forEach(function (t) {
|
|
485
|
+
if (t.approves) {
|
|
486
|
+
t.approves.forEach(function (a, idx) {
|
|
487
|
+
if (a.handler == current_user_id && a.type == 'cc' && a.is_finished == false) {
|
|
488
|
+
var upobj = {};
|
|
489
|
+
upobj['traces.$.approves.' + idx + '.judge'] = "submitted";
|
|
490
|
+
upobj['traces.$.approves.' + idx + '.read_date'] = new Date();
|
|
491
|
+
db.instances.update({
|
|
492
|
+
_id: ins_id,
|
|
493
|
+
'traces._id': t._id
|
|
494
|
+
}, {
|
|
495
|
+
$set: upobj
|
|
496
|
+
})
|
|
497
|
+
|
|
498
|
+
}
|
|
499
|
+
});
|
|
500
|
+
}
|
|
501
|
+
})
|
|
502
|
+
|
|
503
|
+
var index = 0;
|
|
504
|
+
var currentStepId;
|
|
505
|
+
|
|
506
|
+
//设置意见,意见只添加到最后一条approve中
|
|
507
|
+
traces.forEach(function (t) {
|
|
508
|
+
if (myApprove && t._id === myApprove.trace) {
|
|
509
|
+
currentStepId = t.step;
|
|
510
|
+
myTrace = t;
|
|
511
|
+
if (t.approves) {
|
|
512
|
+
t.approves.forEach(function (a, idx) {
|
|
513
|
+
if (a._id === myApprove._id) {
|
|
514
|
+
index = idx;
|
|
515
|
+
}
|
|
516
|
+
});
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
});
|
|
520
|
+
|
|
521
|
+
setObj['traces.$.approves.' + index + '.description'] = description;
|
|
522
|
+
approveDoc['description'] = description
|
|
523
|
+
|
|
524
|
+
var updateObj = {};
|
|
525
|
+
|
|
526
|
+
if (ccHasEditPermission && myApprove && !myTrace.is_finished) {
|
|
527
|
+
|
|
528
|
+
var key_str = 'traces.$.approves.' + index + '.';
|
|
529
|
+
|
|
530
|
+
var flow = uuflowManager.getFlow(instance.flow);
|
|
531
|
+
|
|
532
|
+
var step = uuflowManager.getStep(instance, flow, currentStepId);
|
|
533
|
+
|
|
534
|
+
var permissions_values = uuflowManager.getApproveValues(myApprove.values, step.permissions, instance.form, instance.form_version);
|
|
535
|
+
|
|
536
|
+
var change_values = approveManager.getChangeValues(instance.values, permissions_values);
|
|
537
|
+
|
|
538
|
+
setObj.values = _.extend((instance.values || {}), permissions_values);
|
|
539
|
+
// 计算extras
|
|
540
|
+
var form = db.forms.findOne(instance.form);
|
|
541
|
+
setObj.extras = uuflowManager.caculateExtras(setObj.values, form, instance.form_version);
|
|
542
|
+
approveDoc['extras'] = setObj.extras
|
|
543
|
+
|
|
544
|
+
if (!_.isEmpty(change_values)) {
|
|
545
|
+
var pushObj = {};
|
|
546
|
+
pushObj[key_str + 'values_history'] = {
|
|
547
|
+
values: change_values,
|
|
548
|
+
create: new Date()
|
|
549
|
+
}
|
|
550
|
+
updateObj.$push = pushObj;
|
|
551
|
+
|
|
552
|
+
const values_history = current_approve.values_history || []
|
|
553
|
+
values_history.push(pushObj[key_str + 'values_history'])
|
|
554
|
+
approveDoc['values_history'] = values_history
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
setObj.name = uuflowManager.getInstanceName(instance)
|
|
558
|
+
approveDoc['instance_name'] = setObj.name
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
updateObj.$set = setObj;
|
|
562
|
+
|
|
563
|
+
db.instances.update({
|
|
564
|
+
_id: ins_id,
|
|
565
|
+
'traces._id': myApprove.trace
|
|
566
|
+
}, updateObj);
|
|
567
|
+
update_instance_tasks(ins_id, myApprove.trace, myApprove._id, approveDoc)
|
|
568
|
+
return true;
|
|
569
|
+
}
|
|
570
|
+
*/
|
|
571
|
+
}
|
|
@@ -288,6 +288,8 @@ actions:
|
|
|
288
288
|
label: Flow Designer
|
|
289
289
|
designForm:
|
|
290
290
|
label: Form Designer
|
|
291
|
+
design_form_layout:
|
|
292
|
+
label: Form Designer(New)
|
|
291
293
|
enableFlow:
|
|
292
294
|
label: Enable Flow
|
|
293
295
|
disableFlow:
|
|
@@ -310,8 +312,25 @@ actions:
|
|
|
310
312
|
label: Delete
|
|
311
313
|
addFormFields:
|
|
312
314
|
label: Add Fields
|
|
315
|
+
del:
|
|
316
|
+
label: Delete
|
|
313
317
|
CustomLabels:
|
|
314
318
|
import_flows_error_title: Import Error
|
|
315
319
|
import_flows_error_not_find_object: 'Not find object [ %s ]'
|
|
316
320
|
import_flows_error_not_allow_enable_workflow: 'object [ %s ] not enable workflow'
|
|
317
321
|
import_flows_error_not_find_fields: 'Missing field [ %s ]'
|
|
322
|
+
flows_action_del_dialog_title: Delete Flow
|
|
323
|
+
flows_action_del_dialog_field_flowName: For security reasons, please enter the name of the flow you want to delete (the relevant application form will also be deleted at the same time).
|
|
324
|
+
flows_action_del_dialog_error_not_same: Please confirm that the entered name is inconsistent with the flow name
|
|
325
|
+
flows_action_del_dialog_message_success: Operation successful
|
|
326
|
+
flows_action_del_dialog_message_failed: Operation failed
|
|
327
|
+
flows_action_distributeAdmin_dialog_error_not_find_step: Please first set the steps that allow distribution in the flow designer's steps
|
|
328
|
+
flows_action_distributeAdmin_dialog_field_distribute_optional_users_id: The selection range of distribution objects when the flow is distributed
|
|
329
|
+
flows_action_distributeAdmin_dialog_field_distribute_to_self: When distributing, you can give it to yourself
|
|
330
|
+
flows_action_distributeAdmin_dialog_field_distribute_end_notification: Remind the initiator after the distribution is completed
|
|
331
|
+
flows_action_distributeAdmin_dialog_field_upload_after_being_distributed: Is it allowed to upload attachments after being distributed
|
|
332
|
+
flows_page_record_field_form_name: Form Name
|
|
333
|
+
flows_page_record_field_form_description: Form Description
|
|
334
|
+
flows_page_record_field_form_name_forumla: Title Formula
|
|
335
|
+
flows_page_record_field_form_script: Form Script
|
|
336
|
+
flows_page_record_action_edit_dialog_title: Edit Form
|
|
@@ -285,6 +285,8 @@ actions:
|
|
|
285
285
|
label: 流程设计器
|
|
286
286
|
designForm:
|
|
287
287
|
label: 表单设计器
|
|
288
|
+
design_form_layout:
|
|
289
|
+
label: 表单设计器(New)
|
|
288
290
|
enableFlow:
|
|
289
291
|
label: 启用
|
|
290
292
|
disableFlow:
|
|
@@ -307,8 +309,25 @@ actions:
|
|
|
307
309
|
label: 删除
|
|
308
310
|
addFormFields:
|
|
309
311
|
label: 添加字段
|
|
312
|
+
del:
|
|
313
|
+
label: 删除
|
|
310
314
|
CustomLabels:
|
|
311
315
|
import_flows_error_title: 导入失败
|
|
312
316
|
import_flows_error_not_find_object: '未找到对象[ %s ]'
|
|
313
317
|
import_flows_error_not_allow_enable_workflow: '对象[ %s ]未启用配置对象流程'
|
|
314
318
|
import_flows_error_not_find_fields: '缺少字段[ %s ]'
|
|
319
|
+
flows_action_del_dialog_title: 删除流程
|
|
320
|
+
flows_action_del_dialog_field_flowName: 为了确保安全,请输入您要删除的流程名(同时会删除相关的申请单)
|
|
321
|
+
flows_action_del_dialog_error_not_same: 请确认, 输入的名称与流程名称不一致
|
|
322
|
+
flows_action_del_dialog_message_success: 操作成功
|
|
323
|
+
flows_action_del_dialog_message_failed: 操作失败
|
|
324
|
+
flows_action_distributeAdmin_dialog_error_not_find_step: 请先在流程设计器的步骤中, 设置允许分发的步骤
|
|
325
|
+
flows_action_distributeAdmin_dialog_field_distribute_optional_users_id: 流程被分发时分发对象选择范围
|
|
326
|
+
flows_action_distributeAdmin_dialog_field_distribute_to_self: 分发时可分发给自己
|
|
327
|
+
flows_action_distributeAdmin_dialog_field_distribute_end_notification: 分发结束后提醒发起人
|
|
328
|
+
flows_action_distributeAdmin_dialog_field_upload_after_being_distributed: 被分发后是否允许上传附件
|
|
329
|
+
flows_page_record_field_form_name: 表单名称
|
|
330
|
+
flows_page_record_field_form_description: 表单描述
|
|
331
|
+
flows_page_record_field_form_name_forumla: 标题公式
|
|
332
|
+
flows_page_record_field_form_script: 表单脚本
|
|
333
|
+
flows_page_record_action_edit_dialog_title: 编辑表单
|