@steedos-labs/plugin-workflow 3.0.0 → 3.0.1-beta.2

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 (24) hide show
  1. package/main/default/client/socket.client.js +46 -3
  2. package/main/default/manager/instance_manager.js +20 -6
  3. package/main/default/manager/uuflow_manager.js +3 -1
  4. package/main/default/methods/instance_approve.js +258 -0
  5. package/main/default/methods/trace_approve_cc.js +13 -10
  6. package/main/default/objectTranslations/forms.en/forms.en.objectTranslation.yml +191 -0
  7. package/main/default/objectTranslations/forms.zh-CN/forms.zh-CN.objectTranslation.yml +246 -0
  8. package/main/default/objectTranslations/instance_tasks.en/instance_tasks.en.objectTranslation.yml +2 -0
  9. package/main/default/objectTranslations/instance_tasks.zh-CN/instance_tasks.zh-CN.objectTranslation.yml +2 -0
  10. package/main/default/objects/forms/forms.object.yml +46 -0
  11. package/main/default/pages/flowdetail.page.amis.json +2 -2
  12. package/main/default/pages/instance_detail.page.amis.json +22 -34
  13. package/main/default/pages/instance_tasks_detail.page.amis.json +18 -2
  14. package/main/default/routes/afterHook.js +34 -0
  15. package/main/default/routes/amis_form_design.ejs +67 -26
  16. package/main/default/routes/api_have_read.router.js +73 -0
  17. package/main/default/routes/api_workflow_approve_save.router.js +2 -1
  18. package/main/default/routes/api_workflow_engine.router.js +3 -3
  19. package/main/default/routes/api_workflow_flow_version.router.js +61 -0
  20. package/main/default/routes/api_workflow_form_version.router.js +61 -0
  21. package/main/default/routes/api_workflow_next_step_users.router.js +1 -1
  22. package/main/default/routes/api_workflow_relocate.router.js +2 -1
  23. package/main/default/routes/flow_form_design.ejs +57 -18
  24. package/package.json +1 -1
@@ -15,7 +15,7 @@ const Fiber = function(fun){console.log('TODO Fiber...')}
15
15
  const { excuteTriggers } = require('../utils/trigger');
16
16
  const { getStep } = require('../uuflowManager');
17
17
  const UUFlowManager = require('../manager/uuflow_manager');
18
-
18
+ const afterHook = require('./afterHook');
19
19
  /**
20
20
  * 审批中提交申请单
21
21
  * body {
@@ -53,7 +53,7 @@ const UUFlowManager = require('../manager/uuflow_manager');
53
53
  ]
54
54
  * }
55
55
  */
56
- router.post('/api/workflow/engine', requireAuthentication, async function (req, res) {
56
+ router.post('/api/workflow/engine', requireAuthentication, afterHook, async function (req, res) {
57
57
  try {
58
58
  let userSession = req.user;
59
59
  const spaceId = userSession.spaceId;
@@ -80,7 +80,7 @@ router.post('/api/workflow/engine', requireAuthentication, async function (req,
80
80
  }
81
81
 
82
82
  try {
83
- const instance = UUFlowManager.workflow_engine(approve_from_client, userSession, userId);
83
+ const instance = await UUFlowManager.workflow_engine(approve_from_client, userSession, userId);
84
84
  // afterStepSubmit
85
85
  await excuteTriggers({ when: 'afterStepSubmit', userId, flowId, insId });
86
86
  // afterEnd
@@ -0,0 +1,61 @@
1
+ const express = require("express");
2
+ const router = express.Router();
3
+ const { requireAuthentication } = require("@steedos/auth");
4
+ const _ = require('lodash');
5
+ const { getCollection } = require('../utils/collection');
6
+ router.get('/api/workflow/flow/:flowId/version/:versionId', requireAuthentication, async function (req, res) {
7
+ try {
8
+ const { flowId, versionId } = req.params;
9
+ const flowsColl = await getCollection('flows');
10
+
11
+ const flow = await flowsColl.aggregate([
12
+ {
13
+ $match: {
14
+ "_id": flowId
15
+ }
16
+ },
17
+ {
18
+ $project: {
19
+ name: 1,
20
+ current_no: 1,
21
+ versionData: {
22
+ $cond: {
23
+ if: { $eq: ["$current._id", versionId] },
24
+ then: "$current",
25
+ else: {
26
+ $arrayElemAt: [
27
+ {
28
+ $filter: {
29
+ input: "$historys",
30
+ as: "history",
31
+ cond: { $eq: ["$$history._id", versionId] }
32
+ }
33
+ },
34
+ 0
35
+ ]
36
+ }
37
+ }
38
+ }
39
+ }
40
+ },
41
+ {
42
+ $match: {
43
+ "versionData": { $ne: null }
44
+ }
45
+ },
46
+ { $limit: 1 } // 限制只返回一个文档
47
+ ]).next();
48
+
49
+ if (flow) {
50
+ res.status(200).send(flow.versionData);
51
+ } else {
52
+ res.status(404).send({ message: "流程版本未找到" });
53
+ }
54
+ } catch (error) {
55
+ console.error('Unexpected error:', error);
56
+ res.status(500).send({
57
+ error: error.message
58
+ });
59
+ }
60
+ });
61
+ exports.default = router;
@@ -0,0 +1,61 @@
1
+ const express = require("express");
2
+ const router = express.Router();
3
+ const { requireAuthentication } = require("@steedos/auth");
4
+ const _ = require('lodash');
5
+ const { getCollection } = require('../utils/collection');
6
+ router.get('/api/workflow/form/:formId/version/:versionId', requireAuthentication, async function (req, res) {
7
+ try {
8
+ const { formId, versionId } = req.params;
9
+ const formsColl = await getCollection('forms');
10
+
11
+ const form = await formsColl.aggregate([
12
+ {
13
+ $match: {
14
+ "_id": formId
15
+ }
16
+ },
17
+ {
18
+ $project: {
19
+ name: 1,
20
+ current_no: 1,
21
+ versionData: {
22
+ $cond: {
23
+ if: { $eq: ["$current._id", versionId] },
24
+ then: "$current",
25
+ else: {
26
+ $arrayElemAt: [
27
+ {
28
+ $filter: {
29
+ input: "$historys",
30
+ as: "history",
31
+ cond: { $eq: ["$$history._id", versionId] }
32
+ }
33
+ },
34
+ 0
35
+ ]
36
+ }
37
+ }
38
+ }
39
+ }
40
+ },
41
+ {
42
+ $match: {
43
+ "versionData": { $ne: null }
44
+ }
45
+ },
46
+ { $limit: 1 } // 限制只返回一个文档
47
+ ]).next();
48
+
49
+ if (form) {
50
+ res.status(200).send(form.versionData);
51
+ } else {
52
+ res.status(404).send({ message: "流程版本未找到" });
53
+ }
54
+ } catch (error) {
55
+ console.error('Unexpected error:', error);
56
+ res.status(500).send({
57
+ error: error.message
58
+ });
59
+ }
60
+ });
61
+ exports.default = router;
@@ -194,7 +194,7 @@ router.post('/api/workflow/v2/nextStepUsers', requireAuthentication, async funct
194
194
 
195
195
  let nextUserIds = _.map(finalNextStepUsers, 'id');
196
196
  await excuteTriggers({ when: 'cacluateNextStepUsers', userId: userId, flowId: instance.flow, insId: insId, nextStep: nextStep, nextUserIds });
197
- let nextUsersDocs = await objectql.getObject('space_users').find({ filters: [ ['user', 'in', nextUserIds] ], fields: ['name','user'] });
197
+ let nextUsersDocs = await objectql.getObject('space_users').find({ filters: [ ['space', '=', spaceId], ['user', 'in', nextUserIds] ], fields: ['name','user'] });
198
198
  let newNextUsers = [];
199
199
  for(const doc of nextUsersDocs) {
200
200
  newNextUsers.push({
@@ -12,6 +12,7 @@ const objectql = require('@steedos/objectql');
12
12
  const { excuteTriggers } = require('../utils/trigger');
13
13
  const { getStep } = require('../uuflowManager');
14
14
  const UUFlowManager = require('../manager/uuflow_manager');
15
+ const afterHook = require('./afterHook');
15
16
  /**
16
17
  * 重定位申请单
17
18
  * body {
@@ -22,7 +23,7 @@ const UUFlowManager = require('../manager/uuflow_manager');
22
23
  * ]
23
24
  * }
24
25
  */
25
- router.post('/api/workflow/relocate', requireAuthentication, async function (req, res) {
26
+ router.post('/api/workflow/relocate', requireAuthentication, afterHook, async function (req, res) {
26
27
  try {
27
28
  let userSession = req.user;
28
29
  const spaceId = userSession.spaceId;
@@ -72,6 +72,22 @@
72
72
  deployText: "<%=locale%>" === 'zh-CN' ? '发布': 'Deploy',
73
73
  };
74
74
 
75
+ const getArgumentsList = (func)=>{
76
+ let funcString;
77
+ if (typeof func === 'function') {
78
+ funcString = func.toString();
79
+ } else {
80
+ funcString = func;
81
+ }
82
+ const regExp = /function\s*\w*\(([\s\S]*?)\)/;
83
+ if (regExp.test(funcString)) {
84
+ const argList = RegExp.$1.split(',');
85
+ return argList.map(arg => arg.replace(/\s/g, ''));
86
+ } else {
87
+ return [];
88
+ }
89
+ }
90
+
75
91
  let comp = document.querySelector("builder-fiddle");
76
92
 
77
93
  // set the modal menu element
@@ -283,6 +299,7 @@
283
299
  break;
284
300
  case "number":
285
301
  tpl.type = "input-number";
302
+ tpl.precision=2
286
303
  break;
287
304
  case "date":
288
305
  tpl.type = "input-date";
@@ -380,7 +397,7 @@
380
397
  tpl.options = getSelectOptions(field);
381
398
  break;
382
399
  case "odata":
383
- console.log('field', field);
400
+ const argsName = getArgumentsList(field.filters);
384
401
  var labelField = field.formula.substr(1, field.formula.length - 2);
385
402
  labelField = labelField.substr(labelField.indexOf(".") + 1);
386
403
  // 加入odata标签以示区别 把field-老表单设计器的元素加入
@@ -400,30 +417,52 @@
400
417
  // tpl.valueField = "_value";
401
418
  tpl.source = {
402
419
  //判断该field.url是否为http开头
403
- url: startsWith(field.url, "http")
404
- ? field.url
405
- : `\${context.rootUrl}${field.url}`,
420
+ url: field.url,
406
421
  method: "get",
407
422
  dataType: "json",
408
423
  headers: {
409
424
  Authorization: "Bearer ${context.tenantId},${context.authToken}",
410
425
  },
411
426
  adaptor: `
412
- payload.data = {
413
- options: _.map(payload.value, (item)=>{
414
- const value = item;
415
- item["@label"] = item["${labelField}"]
416
- delete item['@odata.editLink'];
417
- delete item['@odata.etag'];
418
- delete item['@odata.id'];
419
- return {
420
- label: item["@label"],
421
- value: value
427
+ payload.data = {
428
+ options: _.map(payload.value, (item)=>{
429
+ const value = item;
430
+ item["@label"] = item["${labelField}"]
431
+ delete item['@odata.editLink'];
432
+ delete item['@odata.etag'];
433
+ delete item['@odata.id'];
434
+ return {
435
+ label: item["@label"],
436
+ value: value
437
+ }
438
+ })
439
+ }
440
+ return payload;
441
+ `,
442
+ requestAdaptor: `
443
+ const filters = ${_.replace(field.filters, /_.pluck/g, '_.map')};
444
+ const url = ${field.url}
445
+ if(filters){
446
+ console.log('filters', filters);
447
+ const joinKey = field.url.indexOf('?') > 0 ? '&' : '?';
448
+ if(filters.startsWith('function(') || filters.startsWith('function (')){
449
+ const argsName = ${JSON.stringify(argsName)};
450
+ const fun = eval('_fun='+filters);
451
+ const funArgs = [];
452
+ for(const item of argsName){
453
+ funArgs.push(context[item])
454
+ }
455
+ api.url = url + joinKey + "$filter=" + fun.apply({}, funArgs)
456
+ }else{
457
+ api.url = url + joinKey + "$filter=" + filters
422
458
  }
423
- })
424
- }
425
- return payload;
426
- `
459
+ }else{
460
+ api.url = url
461
+ }
462
+ api.query = {};
463
+ return api;
464
+ `,
465
+ trackExpression: _.join(_.map(argsName, (item)=>{return `\${${item}|json}`}), '-')
427
466
  };
428
467
  break;
429
468
  case "html":
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@steedos-labs/plugin-workflow",
3
- "version": "3.0.0",
3
+ "version": "3.0.1-beta.2",
4
4
  "main": "package.service.js",
5
5
  "license": "MIT",
6
6
  "scripts": {