@steedos-labs/plugin-workflow 3.0.66 → 3.0.68

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 (33) hide show
  1. package/designer/dist/amis-renderer/amis-renderer.css +1 -1
  2. package/designer/dist/amis-renderer/amis-renderer.js +1 -1
  3. package/designer/dist/assets/index-BocXPX7W.css +1 -0
  4. package/designer/dist/assets/index-CRxbSR2M.js +990 -0
  5. package/designer/dist/index.html +2 -2
  6. package/main/default/client/navigation_guard.client.js +2 -0
  7. package/main/default/manager/uuflow_manager.js +37 -2
  8. package/main/default/methods/trace_approve_cc.js +16 -2
  9. package/main/default/objectTranslations/instances.en/instances.en.objectTranslation.yml +10 -0
  10. package/main/default/objectTranslations/instances.zh-CN/instances.zh-CN.objectTranslation.yml +10 -0
  11. package/main/default/objects/instance_tasks/buttons/instance_new.button.yml +18 -4
  12. package/main/default/objects/instances/buttons/instance_hide.button.yml +65 -2
  13. package/main/default/objects/instances/buttons/instance_reopen.button.yml +65 -3
  14. package/main/default/objects/instances/buttons/instance_save.button.yml +2 -2
  15. package/main/default/objects/instances/buttons/view_instance.button.yml +2 -6
  16. package/main/default/objects/instances/fields/is_hidden.field.yml +5 -0
  17. package/main/default/pages/page_instance_print.page.amis.json +33 -5
  18. package/main/default/routes/api_workflow_ai_form_design.router.js +7 -416
  19. package/main/default/routes/api_workflow_ai_form_design_stream.router.js +7 -435
  20. package/main/default/routes/api_workflow_approve_save.router.js +22 -6
  21. package/main/default/routes/api_workflow_instance_hide.router.js +93 -0
  22. package/main/default/routes/api_workflow_next_step_users.router.js +17 -2
  23. package/main/default/routes/buildFormDesignSystemPrompt.js +522 -0
  24. package/main/default/routes/flow_form_design.ejs +1 -1
  25. package/main/default/services/instance.service.js +4 -0
  26. package/main/default/utils/designerManager.js +2 -1
  27. package/main/default/utils/formula-compat.js +10 -1
  28. package/package.json +1 -1
  29. package/public/amis-renderer/amis-renderer.css +1 -1
  30. package/public/amis-renderer/amis-renderer.js +1 -1
  31. package/src/schema/steedos_form_schema.amis.js +1 -1
  32. package/designer/dist/assets/index-DX2PUSq4.js +0 -994
  33. package/designer/dist/assets/index-YXPc2HMf.css +0 -1
@@ -0,0 +1,93 @@
1
+ /*
2
+ * @Description: 隐藏/显示审批单
3
+ */
4
+ 'use strict';
5
+ const express = require('express');
6
+ const router = express.Router();
7
+ const { requireAuthentication } = require("@steedos/auth");
8
+ const PermissionManager = require('../manager/permission_manager');
9
+ const { getCollection } = require('../utils/collection');
10
+
11
+ /**
12
+ * 隐藏或显示审批单
13
+ * body {
14
+ * instance_id: string,
15
+ * is_hidden: boolean
16
+ * }
17
+ */
18
+ router.post('/api/workflow/instance/hide', requireAuthentication, async function (req, res) {
19
+ try {
20
+ const userSession = req.user;
21
+ const userId = userSession.userId;
22
+ const spaceId = userSession.spaceId;
23
+ const { instance_id, is_hidden } = req.body;
24
+
25
+ if (!instance_id) {
26
+ throw new Error("instance_id is required");
27
+ }
28
+
29
+ const instancesColl = await getCollection('instances');
30
+ const instance = await instancesColl.findOne(
31
+ { _id: instance_id },
32
+ { projection: { state: 1, space: 1, flow: 1, is_hidden: 1 } }
33
+ );
34
+
35
+ if (!instance) {
36
+ throw new Error("未找到申请单");
37
+ }
38
+
39
+ if (instance.state !== 'completed') {
40
+ throw new Error("只能对已完成的申请单执行此操作");
41
+ }
42
+
43
+ // 检查权限:space admin 或 flow admin
44
+ const spacesColl = await getCollection('spaces');
45
+ const space = await spacesColl.findOne(
46
+ { _id: instance.space },
47
+ { projection: { admins: 1 } }
48
+ );
49
+
50
+ const isSpaceAdmin = space && space.admins && space.admins.includes(userId);
51
+
52
+ let hasFlowAdmin = false;
53
+ if (!isSpaceAdmin) {
54
+ const permissions = await PermissionManager.getFlowPermissions(instance.flow, userId);
55
+ hasFlowAdmin = permissions.includes('admin');
56
+ }
57
+
58
+ if (!isSpaceAdmin && !hasFlowAdmin) {
59
+ throw new Error("无权执行此操作");
60
+ }
61
+
62
+ const now = new Date();
63
+ const setObj = {
64
+ is_hidden: !!is_hidden,
65
+ modified: now,
66
+ modified_by: userId
67
+ };
68
+
69
+ await instancesColl.updateOne(
70
+ { _id: instance_id },
71
+ { $set: setObj }
72
+ );
73
+
74
+ // 同步更新 instance_tasks 的 is_hidden
75
+ const instanceTasksColl = await getCollection('instance_tasks');
76
+ await instanceTasksColl.updateMany(
77
+ { instance: instance_id },
78
+ { $set: { is_hidden: !!is_hidden, modified: now, modified_by: userId } }
79
+ );
80
+
81
+ res.status(200).json({
82
+ success: true,
83
+ message: is_hidden ? "隐藏审批单成功" : "显示审批单成功"
84
+ });
85
+ } catch (e) {
86
+ console.error('api_workflow_instance_hide error:', e);
87
+ res.status(200).json({
88
+ errors: [{ errorMessage: e.message }]
89
+ });
90
+ }
91
+ });
92
+
93
+ exports.default = router;
@@ -300,9 +300,24 @@ router.post('/api/workflow/v2/nextStepUsersValue', requireAuthentication, async
300
300
  newNextUsers = step_approve[nextStepId] || [];
301
301
  }
302
302
 
303
+ // 校验 newNextUsers 中的用户是否存在于 space_users 中
304
+ let uniqueNextUsers = _.isArray(newNextUsers) ? _.uniq(newNextUsers) : [newNextUsers];
305
+ if (uniqueNextUsers.length > 0) {
306
+ const existingUsers = await objectql.getObject('space_users').find({
307
+ filters: [['space', '=', spaceId], ['user', 'in', uniqueNextUsers]],
308
+ fields: ['user']
309
+ });
310
+ const existingUserIds = _.map(existingUsers, 'user');
311
+ const missingUserIds = _.difference(uniqueNextUsers, existingUserIds);
312
+ if (missingUserIds.length > 0) {
313
+ error = `下一步处理人不存在或已离职: ${missingUserIds.join(', ')}`;
314
+ }
315
+ }
316
+
303
317
  res.status(200).send({
304
- 'value': _.isArray(newNextUsers) ? _.uniq(newNextUsers) : newNextUsers,
305
- 'error': error
318
+ 'value': uniqueNextUsers,
319
+ '_error': error,
320
+ status: 0
306
321
  });
307
322
  } catch (error) {
308
323
  console.error(error);