@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.
Files changed (82) hide show
  1. package/main/default/client/instance.client.js +6 -6
  2. package/main/default/client/object_workflows.client.js +8 -7
  3. package/main/default/client/socket.client.js +46 -3
  4. package/main/default/manager/import.js +17 -1
  5. package/main/default/manager/instance_manager.js +20 -6
  6. package/main/default/manager/push_manager.js +20 -12
  7. package/main/default/manager/uuflowManagerForInitApproval.js +794 -0
  8. package/main/default/manager/uuflow_manager.js +53 -4
  9. package/main/default/manager/workflow_manager.js +1 -1
  10. package/main/default/methods/instance_approve.js +258 -0
  11. package/main/default/methods/trace_approve_cc.js +571 -0
  12. package/main/default/objectTranslations/flows.en/flows.en.objectTranslation.yml +19 -0
  13. package/main/default/objectTranslations/flows.zh-CN/flows.zh-CN.objectTranslation.yml +19 -0
  14. package/main/default/objectTranslations/forms.en/forms.en.objectTranslation.yml +191 -0
  15. package/main/default/objectTranslations/forms.zh-CN/forms.zh-CN.objectTranslation.yml +246 -0
  16. package/main/default/objectTranslations/instance_tasks.en/instance_tasks.en.objectTranslation.yml +213 -0
  17. package/main/default/objectTranslations/instance_tasks.zh-CN/instance_tasks.zh-CN.objectTranslation.yml +213 -0
  18. package/main/default/objectTranslations/instances.en/instances.en.objectTranslation.yml +212 -0
  19. package/main/default/objectTranslations/instances.zh-CN/instances.zh-CN.objectTranslation.yml +209 -0
  20. package/main/default/objects/categories.object.yml +1 -0
  21. package/main/default/objects/flows/buttons/del.button.yml +7 -10
  22. package/main/default/objects/flows/buttons/design_form_layout.button.js +5 -2
  23. package/main/default/objects/flows/buttons/distributeAdmin.button.yml +5 -5
  24. package/main/default/objects/flows/buttons/newexport.button.yml +1 -1
  25. package/main/default/objects/flows/buttons/newimport.button.yml +2 -1
  26. package/main/default/objects/flows/flows.object.yml +12 -4
  27. package/main/default/objects/forms/forms.object.yml +85 -0
  28. package/main/default/objects/instance_tasks/buttons/instance_new.button.yml +3 -5
  29. package/main/default/objects/instances/buttons/instance_cc.button.yml +7 -7
  30. package/main/default/objects/instances/buttons/instance_delete.button.yml +2 -2
  31. package/main/default/objects/instances/buttons/instance_delete_many.button.yml +6 -6
  32. package/main/default/objects/instances/buttons/instance_distribute.button.yml +14 -13
  33. package/main/default/objects/instances/buttons/instance_flow_chart.button.yml +1 -1
  34. package/main/default/objects/instances/buttons/instance_forward.button.yml +8 -8
  35. package/main/default/objects/instances/buttons/instance_new.button.yml +3 -5
  36. package/main/default/objects/instances/buttons/instance_reassign.button.yml +1 -16
  37. package/main/default/objects/instances/buttons/instance_related.button.yml +4 -4
  38. package/main/default/objects/instances/buttons/instance_relocate.button.yml +9 -12
  39. package/main/default/objects/instances/buttons/instance_retrieve.button.yml +106 -2
  40. package/main/default/objects/instances/buttons/instance_save.button.yml +3 -9
  41. package/main/default/objects/instances/buttons/instance_submit.button.yml +1 -1
  42. package/main/default/objects/instances/buttons/instance_terminate.button.yml +7 -10
  43. package/main/default/objects/instances/listviews/monitor.listview.yml +0 -1
  44. package/main/default/pages/flowdetail.page.amis.json +11 -11
  45. package/main/default/pages/instance_detail.page.amis.json +25 -37
  46. package/main/default/pages/instance_tasks_detail.page.amis.json +21 -5
  47. package/main/default/pages/instance_tasks_list.page.amis.json +147 -110
  48. package/main/default/pages/instances_list.page.amis.json +146 -110
  49. package/main/default/routes/afterHook.js +34 -0
  50. package/main/default/routes/am.router.js +49 -2
  51. package/main/default/routes/api_cc.router.js +5 -12
  52. package/main/default/routes/api_flow_permission.router.js +7 -2
  53. package/main/default/routes/api_get_object_workflows.router.js +79 -22
  54. package/main/default/routes/api_have_read.router.js +73 -0
  55. package/main/default/routes/api_object_workflow_drafts.router.js +18 -19
  56. package/main/default/routes/api_workflow_approve_save.router.js +2 -1
  57. package/main/default/routes/api_workflow_chart.router.js +682 -0
  58. package/main/default/routes/api_workflow_engine.router.js +4 -4
  59. package/main/default/routes/api_workflow_flow_version.router.js +61 -0
  60. package/main/default/routes/api_workflow_form_version.router.js +61 -0
  61. package/main/default/routes/api_workflow_instance_return.router.js +164 -167
  62. package/main/default/routes/api_workflow_next_step_users.router.js +13 -8
  63. package/main/default/routes/api_workflow_reassign.router.js +200 -196
  64. package/main/default/routes/api_workflow_relocate.router.js +4 -3
  65. package/main/default/routes/api_workflow_retrieve.router.js +246 -237
  66. package/main/default/routes/export.router.js +5 -4
  67. package/main/default/routes/flow_form_design.ejs +33 -8
  68. package/main/default/routes/flow_form_design.router.js +4 -3
  69. package/main/default/routes/import.router.js +6 -7
  70. package/main/default/services/flows.service.js +1 -1
  71. package/main/default/translations/en.translation.yml +5 -0
  72. package/main/default/translations/zh-CN.translation.yml +2 -1
  73. package/main/default/triggers/amis_form_design.trigger.js +27 -5
  74. package/main/default/triggers/instances.trigger.js +9 -7
  75. package/main/default/utils/designerManager.js +12 -5
  76. package/package.json +4 -4
  77. package/package.service.js +21 -7
  78. package/public/workflow/index.css +4 -0
  79. package/src/instance_record_queue.js +1 -3
  80. package/src/rests/api_workflow_instance_batch_remove.js +4 -3
  81. package/src/webhook_queue.js +283 -0
  82. package/main/default/manager/index.js +0 -23
@@ -8,34 +8,91 @@
8
8
  const express = require("express");
9
9
  const router = express.Router();
10
10
  const { requireAuthentication } = require("@steedos/auth");
11
- const objectql = require('@steedos/objectql')
11
+ const { getCollection } = require('../utils/collection');
12
12
  const _ = require('lodash');
13
- const Fiber = function(fun){console.log('TODO Fiber...')}
14
13
 
15
- router.get('/api/workflow/v2/get_object_workflows', requireAuthentication, async function (req, res) {
16
- try {
17
- let userSession = req.user;
18
- const { spaceId, userId } = userSession;
19
- Fiber(async function () {
20
- try {
21
- Meteor.call('object_workflows.get', spaceId, userId, (error, result)=>{
22
- if(error){
23
- res.status(200).send({
24
- error: error.message
14
+ async function getObjectWorkflows(spaceId, userId) {
15
+ // 参数检查
16
+ if (typeof spaceId !== 'string') {
17
+ throw new Error('spaceId must be a string');
18
+ }
19
+ if (typeof userId !== 'string') {
20
+ throw new Error('userId must be a string');
21
+ }
22
+
23
+ // 获取space_users集合
24
+ const spaceUsersCollection = await getCollection('space_users');
25
+ const curSpaceUser = await spaceUsersCollection.findOne(
26
+ { space: spaceId, user: userId },
27
+ { projection: { organizations: 1 } }
28
+ );
29
+
30
+ if (!curSpaceUser) {
31
+ throw new Error('not-authorized');
32
+ }
33
+
34
+ // 获取organizations集合
35
+ const organizationsCollection = await getCollection('organizations');
36
+ const organizations = await organizationsCollection.find({
37
+ _id: {
38
+ $in: curSpaceUser.organizations
39
+ }
40
+ }, { projection: { parents: 1 } }).toArray();
41
+
42
+ // 获取object_workflows集合
43
+ const objectWorkflowsCollection = await getCollection('object_workflows');
44
+ let ows = await objectWorkflowsCollection.find(
45
+ { space: spaceId },
46
+ { projection: { object_name: 1, flow_id: 1, space: 1, sync_direction: 1 } }
47
+ ).toArray();
48
+
49
+ // 获取flows集合
50
+ const flowsCollection = await getCollection('flows');
51
+
52
+ // 使用Promise.all并行处理每个工作流
53
+ ows = await Promise.all(ows.map(async (o) => {
54
+ const fl = await flowsCollection.findOne(
55
+ { _id: o.flow_id, state: 'enabled' },
56
+ { projection: { name: 1, perms: 1, forbid_initiate_instance: 1 } }
57
+ );
58
+
59
+ if (fl) {
60
+ o.flow_name = fl.name;
61
+ o.can_add = false;
62
+ o.forbid_initiate_instance = fl.forbid_initiate_instance;
63
+
64
+ const perms = fl.perms;
65
+ if (perms) {
66
+ if (perms.users_can_add && perms.users_can_add.includes(userId)) {
67
+ o.can_add = true;
68
+ } else if (perms.orgs_can_add && perms.orgs_can_add.length > 0) {
69
+ if (curSpaceUser && curSpaceUser.organizations &&
70
+ _.intersection(curSpaceUser.organizations, perms.orgs_can_add).length > 0) {
71
+ o.can_add = true;
72
+ } else if (organizations) {
73
+ o.can_add = _.some(organizations, (org) => {
74
+ return org.parents && _.intersection(org.parents, perms.orgs_can_add).length > 0;
25
75
  });
26
- }else{
27
- res.status(200).send(result);
28
76
  }
29
- })
30
- } catch (error) {
31
- console.error(error);
32
- res.status(200).send({
33
- error: error.message
34
- });
77
+ }
35
78
  }
79
+ }
80
+ return o;
81
+ }));
36
82
 
37
- }).run()
38
-
83
+ // 过滤掉没有flow_name的工作流
84
+ ows = ows.filter(n => n.flow_name);
85
+
86
+ return ows;
87
+ }
88
+
89
+
90
+ router.get('/api/workflow/v2/get_object_workflows', requireAuthentication, async function (req, res) {
91
+ try {
92
+ let userSession = req.user;
93
+ const { spaceId, userId } = userSession;
94
+ const result = await getObjectWorkflows(spaceId, userId);
95
+ return res.status(200).send(result);
39
96
  } catch (error) {
40
97
  console.error(error);
41
98
  res.status(200).send({
@@ -0,0 +1,73 @@
1
+ /*
2
+ * @Author: 殷亮辉 yinlianghui@hotoa.com
3
+ * @Date: 2025-10-09 10:12:49
4
+ * @LastEditors: 殷亮辉 yinlianghui@hotoa.com
5
+ * @LastEditTime: 2025-10-29 09:38:43
6
+ */
7
+ const express = require("express");
8
+ const router = express.Router();
9
+ const { requireAuthentication } = require("@steedos/auth");
10
+ const objectql = require('@steedos/objectql')
11
+ // const { cc_do } = require('../methods/trace_approve_cc');
12
+ const { getCollection } = require('../utils/collection');
13
+ const { set_approve_have_read } = require('../methods/instance_approve');
14
+ const { cc_read } = require('../methods/trace_approve_cc');
15
+ // const InstanceManager = global.InstanceManager;
16
+ const InstanceManager = require('../manager/instance_manager');
17
+
18
+ router.post('/api/workflow/v2/set_have_read', requireAuthentication, async function (req, res) {
19
+ try {
20
+ let userSession = req.user;
21
+ if (!userSession) {
22
+ return res.status(200).send({
23
+ error: "unauthorized"
24
+ });
25
+ }
26
+ const userId = userSession.userId;
27
+ const { instanceTaskId, isRead } = req.body;
28
+ if (isRead){
29
+ return res.status(200).send({
30
+ success: true
31
+ });
32
+ }
33
+ const db = {
34
+ instances: await getCollection('instances'),
35
+ instance_tasks: await getCollection('instance_tasks')
36
+ };
37
+ const instance_task = await db.instance_tasks.findOne({
38
+ _id: instanceTaskId
39
+ }, {
40
+ fields: {
41
+ "instance": 1,
42
+ "is_read": 1,
43
+ "type": 1
44
+ }
45
+ });
46
+ if (instance_task.is_read){
47
+ return res.status(200).send({
48
+ success: true
49
+ });
50
+ }
51
+
52
+ const instanceId = instance_task.instance;
53
+ const ins = await db.instances.findOne({_id: instanceId});
54
+ var myApprove = InstanceManager.getCurrentApprove(ins, userId, instance_task.type);
55
+ if (instance_task.type == "cc") {
56
+ // 传阅
57
+ await cc_read(ins, myApprove, { userId });
58
+ }
59
+ else{
60
+ await set_approve_have_read(ins._id, myApprove.trace, myApprove._id, { userId });
61
+ }
62
+ return res.status(200).send({
63
+ success: true
64
+ });
65
+
66
+ } catch (error) {
67
+ console.error(error);
68
+ return res.status(200).send({
69
+ error: error.message
70
+ });
71
+ }
72
+ });
73
+ exports.default = router;
@@ -9,34 +9,33 @@ 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 uuflowManagerForInitApproval = require('../manager/uuflowManagerForInitApproval');
13
+ const { getCollection } = require('../utils/collection');
14
14
  router.post('/api/object/workflow/drafts', requireAuthentication, async function (req, res) {
15
15
  try {
16
16
  let userSession = req.user;
17
17
  const { Instances } = req.body;
18
18
  const userId = userSession.userId;
19
19
  const inserted_instances = [];
20
- Fiber(function () {
21
- try {
22
- _.each(Instances, (instance_from_client)=>{
23
- const new_ins_id = uuflowManagerForInitApproval.create_instance(instance_from_client, Object.assign({}, userSession, {_id: userSession.userId}))
20
+ const coll = await getCollection('instances');
21
+ try {
22
+ for (const instance_from_client of Instances) {
23
+ const new_ins_id = await uuflowManagerForInitApproval.create_instance(instance_from_client, Object.assign({}, userSession, {_id: userSession.userId}))
24
24
 
25
- new_ins = Creator.Collections.instances.findOne({ _id: new_ins_id }, { fields: { space: 1, flow: 1, flow_version: 1, form: 1, form_version: 1 } })
25
+ new_ins = await coll.findOne({ _id: new_ins_id }, { fields: { space: 1, flow: 1, flow_version: 1, form: 1, form_version: 1 } })
26
26
 
27
- inserted_instances.push(new_ins)
28
- })
29
- res.status(200).send({
30
- inserts: inserted_instances
31
- });
32
- } catch (error) {
33
- console.error(error);
34
- res.status(200).send({
35
- error: error.message
36
- });
27
+ inserted_instances.push(new_ins)
37
28
  }
38
-
39
- }).run()
29
+
30
+ res.status(200).send({
31
+ inserts: inserted_instances
32
+ });
33
+ } catch (error) {
34
+ console.error(error);
35
+ res.status(200).send({
36
+ error: error.message
37
+ });
38
+ }
40
39
 
41
40
  } catch (error) {
42
41
  console.error(error);
@@ -8,8 +8,9 @@ const {
8
8
  const UUFlowManager = require('../manager/uuflow_manager');
9
9
  const { getCollection } = require('../utils/collection');
10
10
  const approveManager = require('../manager/approve_manager');
11
+ const afterHook = require('./afterHook');
11
12
 
12
- router.post('/api/workflow/v2/approve/save', requireAuthentication, async function (req, res) {
13
+ router.post('/api/workflow/v2/approve/save', requireAuthentication, afterHook, async function (req, res) {
13
14
  try {
14
15
  const userSession = req.user;
15
16
  const { approve } = req.body;