@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
@@ -45,7 +45,7 @@ window.SteedosWorkflow.InstanceTask = {
45
45
  "showHeader": true,
46
46
  "id": "u:d29cef0d1007",
47
47
  "showDisplayAs": true,
48
- "className": "h-full w-full bg-white instance-tasks-list",
48
+ "className": "h-full w-full instance-tasks-list",
49
49
  "hiddenColumnOperation": true,
50
50
  "formFactor": "LARGE",
51
51
  "headerToolbarItems": [
@@ -113,7 +113,7 @@ window.SteedosWorkflow.Instance = {
113
113
  "showHeader": true,
114
114
  "id": "u:d29cef0d1007",
115
115
  "showDisplayAs": true,
116
- "className": "h-full w-full bg-white",
116
+ "className": "h-full w-full",
117
117
  "hiddenColumnOperation": true,
118
118
  "formFactor": "LARGE",
119
119
  "headerToolbarItems": [
@@ -295,6 +295,19 @@ async function objectWorkflow(spaceId, flowId, objectName, doc) {
295
295
  }
296
296
  }
297
297
 
298
+ // 如果没有name字段,则给name赋值code
299
+ function addFieldName(fields) {
300
+ return _.map(fields, function (f) {
301
+ if (!f.name && f.code) {
302
+ f.name = f.code;
303
+ }
304
+ if (f.type === 'section' || f.type === 'table') {
305
+ f.fields = addFieldName(f.fields);
306
+ }
307
+ return f;
308
+ });
309
+ }
310
+
298
311
  async function workflow(uid, spaceId, form, enabled, company_id, options = {}) {
299
312
  const { upgrade = false, formId: upgradeFormId, flowId: upgradeFlowId } = options;
300
313
  const new_form_ids = [];
@@ -395,6 +408,8 @@ async function workflow(uid, spaceId, form, enabled, company_id, options = {}) {
395
408
  form.modified = form.created;
396
409
  form.modified_by = uid;
397
410
  form.historys = [];
411
+
412
+ const fields = addFieldName(form.current?.fields || []);
398
413
 
399
414
  form.current = {
400
415
  _id: _makeNewID(),
@@ -404,7 +419,7 @@ async function workflow(uid, spaceId, form, enabled, company_id, options = {}) {
404
419
  created_by: uid,
405
420
  modified: new Date(),
406
421
  modified_by: uid,
407
- fields: form.current?.fields || [],
422
+ fields: fields,
408
423
  form_script: form.current?.form_script || '',
409
424
  name_forumla: form.current?.name_forumla || ''
410
425
  };
@@ -5,6 +5,8 @@ const { getObject } = objectql;
5
5
  const { t } = require('@steedos/i18n');
6
6
  const { map } = require('lodash');
7
7
 
8
+ const WebhookQueue = require('../../../src/webhook_queue')
9
+
8
10
  const uuflowManager = {
9
11
  getFlow: async function (flow_id, options = {}) {
10
12
  if (process.env.STEEDOS_DEBUG) {
@@ -613,6 +615,12 @@ pushManager.send_message_by_raix_push = async function (data, lang) {
613
615
  from: from,
614
616
  to: toUsers
615
617
  })
618
+
619
+ await objectql.getSteedosSchema().broker.emit('push.send', {
620
+ message: notificationDoc,
621
+ from: from,
622
+ to: toUsers
623
+ })
616
624
 
617
625
 
618
626
  // data["toUsers"].forEach(userId => {
@@ -854,7 +862,7 @@ pushManager.triggerWebhook = async function (flowId, instance, currentApprove, a
854
862
  cfsInstances: await getCollection('cfs.instances.filerecord')
855
863
  };
856
864
 
857
- instance.attachments = (await cfsInstances.find({ 'metadata.instance': instance._id }).toArray()) || [];
865
+ instance.attachments = (await db.cfsInstances.find({ 'metadata.instance': instance._id }).toArray()) || [];
858
866
 
859
867
  const fromUser = await db.users.findOne({ "_id": fromUserId }, { fields: { _id: 1, username: 1 } }) || {};
860
868
  const fromSpaceUser = await db.space_users.findOne({ "user": fromUserId }, { fields: { mobile: 1, email: 1 } }) || {};
@@ -880,12 +888,12 @@ pushManager.triggerWebhook = async function (flowId, instance, currentApprove, a
880
888
  for (const w of webhooks) {
881
889
  WebhookQueue.send({
882
890
  instance,
883
- currentApprove,
884
- payloadUrl: w.payload_url,
885
- contentType: w.content_type,
891
+ current_approve: currentApprove,
892
+ payload_url: w.payload_url,
893
+ content_type: w.content_type,
886
894
  action,
887
- fromUser,
888
- toUsers: toUsers || []
895
+ from_user: fromUser,
896
+ to_users: toUsers || []
889
897
  });
890
898
  }
891
899
  };
@@ -0,0 +1,568 @@
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
+ /**
145
+ cc_read: function (approve) {
146
+ var setObj = {};
147
+ var ins_id = approve.instance;
148
+ var trace_id = approve.trace;
149
+ var approve_id = approve._id;
150
+ var instance = db.instances.findOne(ins_id, {
151
+ fields: {
152
+ traces: 1
153
+ }
154
+ });
155
+ var current_user_id = this.userId;
156
+ var current_trace = _.find(instance.traces, function (t) {
157
+ return t._id == trace_id;
158
+ })
159
+
160
+ var index = 0;
161
+
162
+ current_trace.approves.forEach(function (a, idx) {
163
+ if (approve_id == a._id && a.type == 'cc' && a.handler == current_user_id && !a.is_read) {
164
+ index = idx;
165
+ }
166
+ });
167
+
168
+ // setObj['traces.$.approves.' + index + '.is_read'] = true;
169
+ // setObj['traces.$.approves.' + index + '.read_date'] = new Date();
170
+ const key_str = 'traces.$.approves.' + index + '.';
171
+ const approveDoc = {
172
+ is_read: true,
173
+ read_date: new Date()
174
+ }
175
+ for (const key in approveDoc) {
176
+ if (Object.hasOwnProperty.call(approveDoc, key)) {
177
+ setObj[key_str + key] = approveDoc[key]
178
+ }
179
+ }
180
+
181
+
182
+ db.instances.update({
183
+ _id: ins_id,
184
+ 'traces._id': trace_id
185
+ }, {
186
+ $set: setObj
187
+ });
188
+ update_instance_tasks(ins_id, trace_id, current_trace.approves[index]._id, approveDoc)
189
+ return true;
190
+ },
191
+
192
+ cc_submit: function (ins_id, description, myApprove, ccHasEditPermission) {
193
+ var setObj = {};
194
+
195
+ var instance = db.instances.findOne(ins_id);
196
+ var traces = instance.traces;
197
+ var current_user_id = this.userId;
198
+
199
+ var flow = uuflowManager.getFlow(instance.flow);
200
+ var values = myApprove.values || {};
201
+
202
+ var approve_id = myApprove._id;
203
+
204
+ var myTrace;
205
+
206
+ var is_finished; // 传阅正真结束的标记
207
+
208
+ for (let tidx = 0; tidx < traces.length; tidx++) {
209
+ const t = traces[tidx];
210
+ if (t.approves) {
211
+ for (let aidx = 0; aidx < t.approves.length; aidx++) {
212
+ const a = t.approves[aidx];
213
+ if (approve_id == a._id && a.type == 'cc' && a.handler == current_user_id && a.is_finished == false) {
214
+ var upobj = {};
215
+ var key_str = 'traces.$.approves.' + aidx + '.';
216
+ const approveDoc = {
217
+ 'is_finished': true,
218
+ 'is_read': true,
219
+ 'finish_date': new Date(),
220
+ 'judge': "submitted",
221
+ 'cost_time': new Date() - a.start_date,
222
+ }
223
+ // upobj[key_str + 'is_finished'] = true;
224
+ // upobj[key_str + 'is_read'] = true;
225
+ // upobj[key_str + 'finish_date'] = new Date();
226
+ // upobj[key_str + 'judge'] = "submitted";
227
+ // upobj[key_str + 'cost_time'] = new Date() - a.start_date;
228
+ if (approve_id == a._id && !t.is_finished && ccHasEditPermission) {
229
+ myTrace = t;
230
+ var step = uuflowManager.getStep(instance, flow, t.step);
231
+ // upobj[key_str + "values"] = uuflowManager.getApproveValues(values, step["permissions"], instance.form, instance.form_version)
232
+ approveDoc['values'] = uuflowManager.getApproveValues(values, step["permissions"], instance.form, instance.form_version)
233
+ }
234
+ //设置意见,意见只添加到最后一条approve中
235
+ if (approve_id == a._id) {
236
+ // upobj[key_str + 'description'] = description;
237
+ approveDoc['description'] = description
238
+ }
239
+ for (const key in approveDoc) {
240
+ if (Object.hasOwnProperty.call(approveDoc, key)) {
241
+ upobj[key_str + key] = approveDoc[key]
242
+ }
243
+ }
244
+ db.instances.update({
245
+ _id: ins_id,
246
+ 'traces._id': t._id
247
+ }, {
248
+ $set: upobj
249
+ })
250
+ // 更新
251
+ update_instance_tasks(ins_id, a.trace, a._id, approveDoc)
252
+ is_finished = true;
253
+ }
254
+ }
255
+ }
256
+
257
+ }
258
+
259
+ if (myApprove && is_finished) {
260
+
261
+ setObj.modified = new Date();
262
+ setObj.modified_by = this.userId;
263
+
264
+ if (ccHasEditPermission && myApprove && !myTrace.is_finished) {
265
+ var ins = uuflowManager.getInstance(ins_id);
266
+ var updated_values = uuflowManager.getUpdatedValues(ins, approve_id);
267
+ setObj.values = updated_values;
268
+ setObj.name = uuflowManager.getInstanceName(instance);
269
+ // 计算extras
270
+ var form = db.forms.findOne(instance.form);
271
+ setObj.extras = uuflowManager.caculateExtras(setObj.values, form, instance.form_version);
272
+ }
273
+
274
+ db.instances.update({
275
+ _id: ins_id,
276
+ cc_users: current_user_id
277
+ }, {
278
+ $set: setObj,
279
+ $unset: {
280
+ 'cc_users.$': true
281
+ },
282
+ $addToSet: {
283
+ outbox_users: {
284
+ $each: [current_user_id, myApprove.user]
285
+ }
286
+ }
287
+ });
288
+
289
+ db.instances.update({
290
+ _id: ins_id,
291
+ }, {
292
+ $pull: {
293
+ cc_users: null
294
+ }
295
+ });
296
+
297
+ uuflowManager.updateCCcount(ins_id)
298
+
299
+ instance = db.instances.findOne(ins_id);
300
+
301
+ current_user_info = db.users.findOne(current_user_id);
302
+ //传阅提交不通知传阅者
303
+ if (false && description && myApprove && myApprove.from_user) {
304
+ pushManager.send_instance_notification("trace_approve_cc_submit", instance, "", current_user_info, [myApprove.from_user]);
305
+ }
306
+
307
+ pushManager.send_message_to_specifyUser("current_user", current_user_id);
308
+
309
+ flow_id = instance.flow;
310
+ // 如果已经配置webhook并已激活则触发
311
+ pushManager.triggerWebhook(flow_id, instance, myApprove, 'cc_submit', current_user_id, []);
312
+ }
313
+
314
+ return true;
315
+ },
316
+
317
+ cc_remove: function (instanceId, approveId) {
318
+ var setObj = {};
319
+
320
+ var instance = db.instances.findOne(instanceId, {
321
+ fields: {
322
+ traces: 1,
323
+ cc_users: 1
324
+ }
325
+ });
326
+ var traces = instance.traces;
327
+ var trace_id, remove_user_id, multi = false;
328
+
329
+ traces.forEach(function (t) {
330
+ if (t.approves) {
331
+ t.approves.forEach(function (a, idx) {
332
+ if (a._id == approveId) {
333
+ trace_id = a.trace;
334
+ remove_user_id = a.handler;
335
+ setObj['traces.$.approves.' + idx + '.judge'] = 'terminated';
336
+ setObj['traces.$.approves.' + idx + '.is_finished'] = true;
337
+ setObj['traces.$.approves.' + idx + '.finish_date'] = new Date();
338
+ setObj['traces.$.approves.' + idx + '.is_read'] = true;
339
+ setObj['traces.$.approves.' + idx + '.read_date'] = new Date();
340
+ }
341
+ });
342
+ }
343
+ })
344
+
345
+ if (!trace_id || !remove_user_id)
346
+ return;
347
+
348
+ var multi = 0;
349
+ traces.forEach(function (t) {
350
+ if (t.approves) {
351
+ t.approves.forEach(function (a) {
352
+ if (a.handler == remove_user_id && a.type == 'cc' && a.is_finished == false) {
353
+ multi++;
354
+ }
355
+ });
356
+ }
357
+ })
358
+
359
+ setObj.modified = new Date();
360
+ setObj.modified_by = this.userId;
361
+
362
+ if (multi > 1) {
363
+ db.instances.update({
364
+ _id: instanceId,
365
+ 'traces._id': trace_id
366
+ }, {
367
+ $set: setObj
368
+ });
369
+ } else {
370
+ db.instances.update({
371
+ _id: instanceId,
372
+ 'traces._id': trace_id
373
+ }, {
374
+ $set: setObj,
375
+ $pull: {
376
+ cc_users: remove_user_id
377
+ }
378
+ });
379
+ }
380
+
381
+ uuflowManager.updateCCcount(instanceId)
382
+
383
+ remove_instance_tasks(approveId)
384
+
385
+
386
+ pushManager.send_message_to_specifyUser("current_user", remove_user_id);
387
+ return true;
388
+ },
389
+
390
+ batch_cancel_cc: function (instance_id, approve_ids) {
391
+ check(instance_id, String)
392
+ check(approve_ids, Array)
393
+
394
+ var setObj = {};
395
+
396
+ var instance = db.instances.findOne(instance_id, {
397
+ fields: {
398
+ traces: 1,
399
+ cc_users: 1
400
+ }
401
+ });
402
+ var traces = instance.traces;
403
+ var remove_user_ids = [];
404
+ var removeApproveIds = []
405
+
406
+ traces.forEach(function (t, tIdx) {
407
+ if (t.approves) {
408
+ t.approves.forEach(function (a, idx) {
409
+ if (approve_ids.includes(a._id)) {
410
+ removeApproveIds.push(a._id)
411
+ remove_user_ids.push(a.user);
412
+ setObj['traces.' + tIdx + '.approves.' + idx + '.judge'] = 'terminated';
413
+ setObj['traces.' + tIdx + '.approves.' + idx + '.is_finished'] = true;
414
+ setObj['traces.' + tIdx + '.approves.' + idx + '.finish_date'] = new Date();
415
+ setObj['traces.' + tIdx + '.approves.' + idx + '.is_read'] = true;
416
+ setObj['traces.' + tIdx + '.approves.' + idx + '.read_date'] = new Date();
417
+ }
418
+ });
419
+ }
420
+ })
421
+
422
+ if (_.isEmpty(remove_user_ids))
423
+ return;
424
+
425
+ setObj.modified = new Date();
426
+ setObj.modified_by = this.userId;
427
+
428
+ db.instances.update({
429
+ _id: instance_id
430
+ }, {
431
+ $set: setObj,
432
+ });
433
+ for (const ruId of remove_user_ids) {
434
+ db.instances.update({
435
+ _id: instance_id,
436
+ cc_users: ruId
437
+ }, {
438
+ $unset: {
439
+ 'cc_users.$': true
440
+ }
441
+ });
442
+ }
443
+ db.instances.update({
444
+ _id: instance_id,
445
+ }, {
446
+ $pull: {
447
+ cc_users: null
448
+ }
449
+ });
450
+
451
+ uuflowManager.updateCCcount(instance_id)
452
+
453
+ direct_remove_many_instance_tasks(removeApproveIds)
454
+
455
+ remove_user_ids.forEach(function (u_id) {
456
+ pushManager.send_message_to_specifyUser("current_user", u_id);
457
+ })
458
+ return true;
459
+ },
460
+
461
+ cc_save: function (ins_id, description, myApprove, ccHasEditPermission) {
462
+ var setObj = {};
463
+ const approveDoc = {}
464
+
465
+ var instance = db.instances.findOne(ins_id);
466
+ var traces = instance.traces;
467
+ var current_user_id = this.userId;
468
+
469
+ var trace_id = myApprove.trace;
470
+ var approve_id = myApprove._id;
471
+
472
+ var current_trace = _.find(traces, function (t) {
473
+ return t._id == trace_id;
474
+ });
475
+ var current_approve = _.find(current_trace.approves, function (a) {
476
+ return a._id == approve_id;
477
+ });
478
+
479
+ var myTrace;
480
+
481
+ traces.forEach(function (t) {
482
+ if (t.approves) {
483
+ t.approves.forEach(function (a, idx) {
484
+ if (a.handler == current_user_id && a.type == 'cc' && a.is_finished == false) {
485
+ var upobj = {};
486
+ upobj['traces.$.approves.' + idx + '.judge'] = "submitted";
487
+ upobj['traces.$.approves.' + idx + '.read_date'] = new Date();
488
+ db.instances.update({
489
+ _id: ins_id,
490
+ 'traces._id': t._id
491
+ }, {
492
+ $set: upobj
493
+ })
494
+
495
+ }
496
+ });
497
+ }
498
+ })
499
+
500
+ var index = 0;
501
+ var currentStepId;
502
+
503
+ //设置意见,意见只添加到最后一条approve中
504
+ traces.forEach(function (t) {
505
+ if (myApprove && t._id === myApprove.trace) {
506
+ currentStepId = t.step;
507
+ myTrace = t;
508
+ if (t.approves) {
509
+ t.approves.forEach(function (a, idx) {
510
+ if (a._id === myApprove._id) {
511
+ index = idx;
512
+ }
513
+ });
514
+ }
515
+ }
516
+ });
517
+
518
+ setObj['traces.$.approves.' + index + '.description'] = description;
519
+ approveDoc['description'] = description
520
+
521
+ var updateObj = {};
522
+
523
+ if (ccHasEditPermission && myApprove && !myTrace.is_finished) {
524
+
525
+ var key_str = 'traces.$.approves.' + index + '.';
526
+
527
+ var flow = uuflowManager.getFlow(instance.flow);
528
+
529
+ var step = uuflowManager.getStep(instance, flow, currentStepId);
530
+
531
+ var permissions_values = uuflowManager.getApproveValues(myApprove.values, step.permissions, instance.form, instance.form_version);
532
+
533
+ var change_values = approveManager.getChangeValues(instance.values, permissions_values);
534
+
535
+ setObj.values = _.extend((instance.values || {}), permissions_values);
536
+ // 计算extras
537
+ var form = db.forms.findOne(instance.form);
538
+ setObj.extras = uuflowManager.caculateExtras(setObj.values, form, instance.form_version);
539
+ approveDoc['extras'] = setObj.extras
540
+
541
+ if (!_.isEmpty(change_values)) {
542
+ var pushObj = {};
543
+ pushObj[key_str + 'values_history'] = {
544
+ values: change_values,
545
+ create: new Date()
546
+ }
547
+ updateObj.$push = pushObj;
548
+
549
+ const values_history = current_approve.values_history || []
550
+ values_history.push(pushObj[key_str + 'values_history'])
551
+ approveDoc['values_history'] = values_history
552
+ }
553
+
554
+ setObj.name = uuflowManager.getInstanceName(instance)
555
+ approveDoc['instance_name'] = setObj.name
556
+ }
557
+
558
+ updateObj.$set = setObj;
559
+
560
+ db.instances.update({
561
+ _id: ins_id,
562
+ 'traces._id': myApprove.trace
563
+ }, updateObj);
564
+ update_instance_tasks(ins_id, myApprove.trace, myApprove._id, approveDoc)
565
+ return true;
566
+ }
567
+ */
568
+ }