@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
|
@@ -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
|
|
11
|
+
const { getCollection } = require('../utils/collection');
|
|
12
12
|
const _ = require('lodash');
|
|
13
|
-
const Fiber = function(fun){console.log('TODO Fiber...')}
|
|
14
13
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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;
|