@steedos-labs/plugin-workflow 3.0.46 → 3.0.47

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 (30) 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-CH5Rzd1r.css +1 -0
  4. package/designer/dist/assets/index-Z3wTJs2h.js +952 -0
  5. package/designer/dist/index.html +2 -2
  6. package/main/default/manager/import.js +20 -2
  7. package/main/default/objects/instances/buttons/instance_delete.button.yml +1 -1
  8. package/main/default/objects/instances/buttons/instance_related.button.yml +4 -1
  9. package/main/default/routes/api_workflow_ai_form_design.router.js +5 -2
  10. package/main/default/routes/api_workflow_ai_form_design_stream.router.js +5 -2
  11. package/main/default/routes/flow_form_design.ejs +8 -0
  12. package/main/default/routes/flow_form_design.router.js +1 -1
  13. package/main/default/test/FORMULA_SCAN_GUIDE.md +258 -0
  14. package/main/default/test/prompt-formula-analyze.md +59 -0
  15. package/main/default/test/prompt-formula-fix.md +75 -0
  16. package/main/default/test/reports/formula-scan/.gitkeep +0 -0
  17. package/main/default/test/reports/formula-scan/SCAN_HISTORY.md +165 -0
  18. package/main/default/test/reports/formula-scan/scan-result-v6-20260324.json +31846 -0
  19. package/main/default/test/reports/formula-scan/scan-result-v7-20260324.json +31543 -0
  20. package/main/default/test/run_approval_comments_upgrade.js +135 -0
  21. package/main/default/test/scan_production_formulas.js +573 -0
  22. package/main/default/test/test_formula_compat.js +38 -0
  23. package/main/default/utils/designerManager.js +1 -0
  24. package/main/default/utils/formula-compat.js +8 -0
  25. package/package.json +1 -1
  26. package/public/amis-renderer/amis-renderer.css +1 -1
  27. package/public/amis-renderer/amis-renderer.js +1 -1
  28. package/public/workflow/index.css +4 -0
  29. package/designer/dist/assets/index-BNKlgpz1.js +0 -943
  30. package/designer/dist/assets/index-D7JdeS9f.css +0 -1
@@ -0,0 +1,165 @@
1
+ # 公式扫描处理历史 (SCAN_HISTORY)
2
+
3
+ 本文档记录每次生产公式扫描发现的 errors 及其修正过程。
4
+
5
+ > 约定:每次扫描周期产生两个 JSON 文件 —— 修正前(含 `processedResult` 注解)和修正后(干净的 `errors: []`)。
6
+
7
+ ---
8
+
9
+ ## v6 → v7:Bug 8 — 聚合函数全角括号和缺失括号预处理
10
+
11
+ - **扫描日期**: 2026-03-24
12
+ - **修正前报告**: `scan-result-v6-20260324.json`(12 ERROR, 206 WARN)
13
+ - **修正后报告**: `scan-result-v7-20260324.json`(0 ERROR, 4 KNOWN_ISSUE, 206 WARN)
14
+ - **修正提交**: `3abea58` (fix: Bug 8 — 同步聚合函数全角括号和缺失括号预处理 #507)
15
+ - **修改文件**: `formula-compat.js`, `formula-utils.js`, `flow_form_design.ejs`
16
+
17
+ ### Bug 8 修正内容
18
+
19
+ 在 `mapFormula` 转换前新增预处理步骤:
20
+ 1. 将聚合函数的全角括号 `()` 转换为半角 `()`
21
+ 2. 将 `sum{...}` / `average{...}` 等缺失括号的写法补全为 `sum({...})`
22
+
23
+ ### 修复了 8 个 ERROR(均为 E1 规则)
24
+
25
+ | # | 表单名称 | formId | 字段 | 原始公式 | 问题原因 | 版本 |
26
+ |---|---------|--------|------|---------|---------|------|
27
+ | 1 | 抚顺石化公司物资编码替换申请表 | `8f4a6ce7e2dfdf423a28e306` | 合计(替换) | `sum({金额(替换)})` | 全角括号 | history |
28
+ | 2 | 单一来源采购方式报审表 | `dcbqgp5ZCKLdexwpD` | 概算或预估算金额(含税,万元) | `sum{含税金额}` | 缺少括号 | history |
29
+ | 3 | 物资临时领用票 | `gT7bSNfgG9dAd89jk` | 合计金额 | `sum{(金额)}` | 缺少外层括号 | **current** |
30
+ | 4 | 科研项目费用指标控制审批单 | `sS9suXA63oqfot3J2` | 累计支出金额合计 | `sum{累计支出金额}` | 缺少括号 | history |
31
+ | 5 | 质量检验中心应急物资计划审批表 | `RiHrEAqNMKBEwCmXH` | 合计 | `sum{概算总价}` | 缺少括号 | history |
32
+ | 6 | 科研项目费用指标控制审批单 | `Q8WtCbxYb3aAX5KLv` | 项目预算金额合计 | `sum{项目预算金额}` | 缺少括号 | history |
33
+ | 7 | 科研项目费用指标控制审批单 | `Q8WtCbxYb3aAX5KLv` | 本次支出金额合计 | `sum{项目预算金额}` | 缺少括号 | history |
34
+ | 8 | 科研项目费用指标控制审批单 | `Q8WtCbxYb3aAX5KLv` | 累计支出金额合计 | `sum{累计支出金额}` | 缺少括号 | history |
35
+
36
+ > **影响面**: 7 个 history + 1 个 **current**(物资临时领用票),current 版本的修复直接改善了在用表单的公式转换。
37
+
38
+ ### 归类为 knownIssues 的 4 个 ERROR
39
+
40
+ 以下 4 个 ERROR 经分析不需要代码修正,已在 v7 报告中归类到 `knownIssues`。**全部为 history 版本**,不影响新建审批单。
41
+
42
+ | # | 表单名称 | formId | 版本 | 字段 | 原始公式 | 分类 | 原因 |
43
+ |---|---------|--------|------|------|---------|------|------|
44
+ | 1 | 办公桌面问题 | `451766252f8838253eab81f8` | history | 所属信息站 | `judgeIndex({所属部门})` | KNOWN_LIMITATION | 自定义函数,amis 无等价物 |
45
+ | 2 | 工作循环分析计划表 | `9THeSusZyo9E3pe5p` | history | 表名 | `{填报单位}车间{YYYY}年度` | KNOWN_LIMITATION | 文本模板 pattern,无转换路径 |
46
+ | 3 | 员工通勤补贴统计表 | `6d9fe8a132c96a664ca23808` | history | 发放补贴金额(元) | `{发放补贴数量}*{}` | BAD_SOURCE_DATA | 空引用 `{}`,作者漏填 |
47
+ | 4 | 招标结果报审表 | `b9e7465f159b6640bbe49caa` | history | 概算、估算金额(元、大写) | `numToRMB(概算、估算金额{})` | BAD_SOURCE_DATA | 花括号位置写错 |
48
+
49
+ > **生产排查结论**(2026-03-24):4 项均无需处理。第 2、3 项无审批单引用;第 1 项仅 2021 年已完成审批单;第 4 项仅 1 条 draft 草稿。详见 [#511 评论](https://github.com/steedos/steedos-plugins/issues/511#issuecomment-4116293785)。
50
+
51
+ #### 生产数据库排查查询
52
+
53
+ 以下 `mongosh` 命令可直接在终端执行,精确查找**使用了包含问题公式的那些表单版本**创建的审批单。
54
+
55
+ > **查询思路**:
56
+ > 1. 从 `forms` 的 `historys` 数组中,递归查找哪些版本的 `fields` 包含目标公式字段
57
+ > 2. 收集这些版本的 `_id` 列表
58
+ > 3. 用 `form_version: {$in: vids}` 精确匹配 `instances`
59
+ >
60
+ > 这比 `form_version != currentVersionId` 更精确 —— 只命中真正包含问题公式的版本,排除了无关的历史版本。
61
+
62
+ **Issue #1 — 办公桌面问题** (`451766252f8838253eab81f8`,字段 `所属信息站`,公式 `judgeIndex({所属部门})`)
63
+ ```bash
64
+ mongosh "mongodb://127.0.0.1:27017/<dbname>" --eval '
65
+ function find(fields, code, formula) {
66
+ if (!fields) return false;
67
+ for (var f of fields) {
68
+ if (f.code === code && f.formula === formula) return true;
69
+ if (f.fields && find(f.fields, code, formula)) return true;
70
+ }
71
+ return false;
72
+ }
73
+ var form = db.forms.findOne({_id: "451766252f8838253eab81f8"});
74
+ var vids = (form.historys || []).filter(h => find(h.fields, "所属信息站", "judgeIndex({所属部门})")).map(h => h._id);
75
+ print("匹配版本数:", vids.length, "IDs:", JSON.stringify(vids));
76
+ if (vids.length > 0) db.instances.find(
77
+ {form: "451766252f8838253eab81f8", form_version: {$in: vids}},
78
+ {name: 1, form_version: 1, submit_date: 1, state: 1}
79
+ ).sort({submit_date: -1}).limit(10).toArray()
80
+ '
81
+ ```
82
+
83
+ **Issue #2 — 工作循环分析计划表** (`9THeSusZyo9E3pe5p`,字段 `表名`,公式 `{填报单位}车间{YYYY}年度`)
84
+ ```bash
85
+ mongosh "mongodb://127.0.0.1:27017/<dbname>" --eval '
86
+ function find(fields, code, formula) {
87
+ if (!fields) return false;
88
+ for (var f of fields) {
89
+ if (f.code === code && f.formula === formula) return true;
90
+ if (f.fields && find(f.fields, code, formula)) return true;
91
+ }
92
+ return false;
93
+ }
94
+ var form = db.forms.findOne({_id: "9THeSusZyo9E3pe5p"});
95
+ var vids = (form.historys || []).filter(h => find(h.fields, "表名", "{填报单位}车间{YYYY}年度")).map(h => h._id);
96
+ print("匹配版本数:", vids.length, "IDs:", JSON.stringify(vids));
97
+ if (vids.length > 0) db.instances.find(
98
+ {form: "9THeSusZyo9E3pe5p", form_version: {$in: vids}},
99
+ {name: 1, form_version: 1, submit_date: 1, state: 1}
100
+ ).sort({submit_date: -1}).limit(10).toArray()
101
+ '
102
+ ```
103
+
104
+ **Issue #3 — 员工通勤补贴统计表** (`6d9fe8a132c96a664ca23808`,字段 `发放补贴金额(元)`,公式 `{发放补贴数量}*{}`)
105
+ ```bash
106
+ mongosh "mongodb://127.0.0.1:27017/<dbname>" --eval '
107
+ function find(fields, code, formula) {
108
+ if (!fields) return false;
109
+ for (var f of fields) {
110
+ if (f.code === code && f.formula === formula) return true;
111
+ if (f.fields && find(f.fields, code, formula)) return true;
112
+ }
113
+ return false;
114
+ }
115
+ var form = db.forms.findOne({_id: "6d9fe8a132c96a664ca23808"});
116
+ var vids = (form.historys || []).filter(h => find(h.fields, "发放补贴金额(元)", "{发放补贴数量}*{}")).map(h => h._id);
117
+ print("匹配版本数:", vids.length, "IDs:", JSON.stringify(vids));
118
+ if (vids.length > 0) db.instances.find(
119
+ {form: "6d9fe8a132c96a664ca23808", form_version: {$in: vids}},
120
+ {name: 1, form_version: 1, submit_date: 1, state: 1}
121
+ ).sort({submit_date: -1}).limit(10).toArray()
122
+ '
123
+ ```
124
+
125
+ **Issue #4 — 招标结果报审表** (`b9e7465f159b6640bbe49caa`,字段 `概算、估算金额(元、大写)`,公式 `numToRMB(概算、估算金额{})`)
126
+ ```bash
127
+ mongosh "mongodb://127.0.0.1:27017/<dbname>" --eval '
128
+ function find(fields, code, formula) {
129
+ if (!fields) return false;
130
+ for (var f of fields) {
131
+ if (f.code === code && f.formula === formula) return true;
132
+ if (f.fields && find(f.fields, code, formula)) return true;
133
+ }
134
+ return false;
135
+ }
136
+ var form = db.forms.findOne({_id: "b9e7465f159b6640bbe49caa"});
137
+ var vids = (form.historys || []).filter(h => find(h.fields, "概算、估算金额(元、大写)", "numToRMB(概算、估算金额{})")).map(h => h._id);
138
+ print("匹配版本数:", vids.length, "IDs:", JSON.stringify(vids));
139
+ if (vids.length > 0) db.instances.find(
140
+ {form: "b9e7465f159b6640bbe49caa", form_version: {$in: vids}},
141
+ {name: 1, form_version: 1, submit_date: 1, state: 1}
142
+ ).sort({submit_date: -1}).limit(10).toArray()
143
+ '
144
+ ```
145
+
146
+ > **如果是 current 版本的 issue**(本次无此情况,但影响面大 — 所有新建审批单都走此版本):
147
+ > ```bash
148
+ > mongosh "mongodb://127.0.0.1:27017/<dbname>" --eval '
149
+ > var cvid = db.forms.findOne({_id: "<formId>"}).current._id;
150
+ > db.instances.find(
151
+ > {form: "<formId>", form_version: cvid},
152
+ > {name: 1, submit_date: 1, state: 1}
153
+ > ).sort({submit_date: -1}).limit(10).toArray()
154
+ > '
155
+ > ```
156
+
157
+ ### 扫描统计变化
158
+
159
+ | 指标 | v6(修正前) | v7(修正后) |
160
+ |------|------------|------------|
161
+ | ERROR | 12 | 0 |
162
+ | KNOWN_ISSUE | — | 4 |
163
+ | WARN | 206 | 206 |
164
+ | PASS | 1941 | 1949 |
165
+ | current ERROR | 1 | 0 |