weaver-e10-builder 1.7.1 → 1.7.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 (68) hide show
  1. package/assets/icon-names.txt +7438 -0
  2. package/dist/commands/form-association-manage.d.ts.map +1 -1
  3. package/dist/commands/form-association-manage.js +57 -4
  4. package/dist/commands/form-association-manage.js.map +1 -1
  5. package/dist/commands/form-association.d.ts.map +1 -1
  6. package/dist/commands/form-association.js +4 -2
  7. package/dist/commands/form-association.js.map +1 -1
  8. package/dist/commands/form-button-actions-cmd.d.ts.map +1 -1
  9. package/dist/commands/form-button-actions-cmd.js +180 -18
  10. package/dist/commands/form-button-actions-cmd.js.map +1 -1
  11. package/dist/commands/form-button-props-cmd.d.ts.map +1 -1
  12. package/dist/commands/form-button-props-cmd.js +4 -0
  13. package/dist/commands/form-button-props-cmd.js.map +1 -1
  14. package/dist/commands/form-button.d.ts.map +1 -1
  15. package/dist/commands/form-button.js +11 -0
  16. package/dist/commands/form-button.js.map +1 -1
  17. package/dist/commands/form-permission.d.ts.map +1 -1
  18. package/dist/commands/form-permission.js +306 -84
  19. package/dist/commands/form-permission.js.map +1 -1
  20. package/dist/commands/icon.d.ts.map +1 -1
  21. package/dist/commands/icon.js +63 -1
  22. package/dist/commands/icon.js.map +1 -1
  23. package/dist/services/actionflow/components/enquiry_form.js +4 -4
  24. package/dist/services/actionflow/components/enquiry_form.js.map +1 -1
  25. package/dist/services/actionflow/context_preflight.d.ts.map +1 -1
  26. package/dist/services/actionflow/context_preflight.js +0 -10
  27. package/dist/services/actionflow/context_preflight.js.map +1 -1
  28. package/dist/services/form-association.d.ts +28 -1
  29. package/dist/services/form-association.d.ts.map +1 -1
  30. package/dist/services/form-association.js +232 -2
  31. package/dist/services/form-association.js.map +1 -1
  32. package/dist/services/form-button-action.d.ts +48 -2
  33. package/dist/services/form-button-action.d.ts.map +1 -1
  34. package/dist/services/form-button-action.js +68 -2
  35. package/dist/services/form-button-action.js.map +1 -1
  36. package/dist/services/form-field-options.d.ts +45 -0
  37. package/dist/services/form-field-options.d.ts.map +1 -0
  38. package/dist/services/form-field-options.js +179 -0
  39. package/dist/services/form-field-options.js.map +1 -0
  40. package/dist/services/form-permission-archive.d.ts +1 -0
  41. package/dist/services/form-permission-archive.d.ts.map +1 -1
  42. package/dist/services/form-permission-archive.js +3 -3
  43. package/dist/services/form-permission-archive.js.map +1 -1
  44. package/dist/services/form-permission-edit.d.ts +25 -0
  45. package/dist/services/form-permission-edit.d.ts.map +1 -1
  46. package/dist/services/form-permission-edit.js +49 -1
  47. package/dist/services/form-permission-edit.js.map +1 -1
  48. package/dist/services/icon-catalog.d.ts +60 -0
  49. package/dist/services/icon-catalog.d.ts.map +1 -0
  50. package/dist/services/icon-catalog.js +175 -0
  51. package/dist/services/icon-catalog.js.map +1 -0
  52. package/dist/services/icon-path.d.ts +2 -0
  53. package/dist/services/icon-path.d.ts.map +1 -1
  54. package/dist/services/icon-path.js +4 -0
  55. package/dist/services/icon-path.js.map +1 -1
  56. package/package.json +1 -1
  57. package/skill-docs/SKILL.md +6 -5
  58. package/skill-docs/_catalog.md +1 -1
  59. package/skill-docs/actionflows/SKILL.md +195 -195
  60. package/skill-docs/actionflows/references/components/ebuilder/ActionEbDelete.md +80 -80
  61. package/skill-docs/actionflows/references/components/ebuilder/ActionEbUpdate.md +75 -75
  62. package/skill-docs/actionflows/references/components/ebuilder/EnquiryForm.md +113 -111
  63. package/skill-docs/actionflows/references/condition_rules.md +100 -100
  64. package/skill-docs/references/common/guide-install.md +2 -0
  65. package/skill-docs/references/common/ref-cli-commands.md +11 -7
  66. package/skill-docs/references/form/guide-form-association.md +36 -0
  67. package/skill-docs/references/form/guide-form-button.md +22 -1
  68. package/skill-docs/references/form/guide-form-permission.md +14 -4
@@ -1,80 +1,80 @@
1
- # 删除表单数据(`ActionEbDelete`)
2
-
3
- ## 何时使用
4
-
5
- 按筛选条件删除 e-builder 表单数据;还原已删除数据使用 `ActionEbRecover`。
6
- 删除组件只允许“按条件删除”,CLI 不生成无条件删除节点。
7
-
8
- ## 先查询
9
-
10
- 查询目标表单、目标表的数据源字段和操作人。前端 `ActionEbDelete` 使用
11
- `dataSource + ConditionSet`,后端保存字段为 `filterInput`;CLI 计划层使用
12
- `filterCondition`,由编译器转换为 `filterInput`。
13
-
14
- ## 不可猜测
15
-
16
- 筛选条件必须引用目标表真实字段;不能把名称或非本次上下文的字段键写入条件。
17
-
18
- ## 最小计划
19
-
20
- `targetForm`、`person`、`filterCondition`。`nullOpflag` 可选,默认 `false`,对应前端“传空值时执行”开关。
21
-
22
- ## filterCondition 格式
23
-
24
- **以 `references/condition_rules.md` 为准**:`{"field":{"id":"<目标字段id>","label":"<字段名>"},"operator":"eq","right":{...}}`。`field` 是 `{id,label}` 对象、`operator` 用英文操作符(`eq/neq/gt/lt/gte/lte/contains/uncontains/empty/nempty`)、右值键用 `right`。**勿用**废弃的 `value` 别名 / `=` / 裸字符串 `field`,也不能省略或传空 `filterCondition`。
25
-
26
- 条件左值必须来自目标表的 `/api/ebuilder/common/ds/fields` 实时字段接口,不能凭名称、旧缓存或 `getEbField` 结果拼接。右值支持固定值、系统值、上下文、变量和函数等条件规则中定义的类型。
27
-
28
- ## 计划示例
29
-
30
- ```json
31
- {
32
- "type": "ActionEbDelete",
33
- "params": {
34
- "targetForm": {
35
- "groupId": "<业务应用ID>",
36
- "id": "<表单ID>",
37
- "name": "<表单名称>"
38
- },
39
- "person": { "type": "role" },
40
- "filterCondition": {
41
- "field": { "id": "<实时字段ID>", "label": "状态" },
42
- "operator": "eq",
43
- "right": { "type": "fixed", "value": "D02", "label": "闲置" }
44
- },
45
- "nullOpflag": false
46
- }
47
- }
48
- ```
49
-
50
- ## 与前端/后端 DTO 的对应关系
51
-
52
- 前端 `ActionEbDelete` 提交的关键字段如下,CLI 不要求计划直接写这些平台字段:
53
-
54
- ```json
55
- {
56
- "type": "ActionEbDelete",
57
- "targetForm": {
58
- "groupId": "<业务应用ID>",
59
- "id": "<表单ID>",
60
- "text": "<表单名称>",
61
- "type": "FORM"
62
- },
63
- "tableType": [{ "id": "<表单ID>", "name": "<表单名称>" }],
64
- "appType": [{ "id": "<业务应用ID>", "name": "<应用名称>" }],
65
- "person": "<操作人公式>",
66
- "filterInput": {
67
- "isNewFilter": true,
68
- "isParent": true,
69
- "relationship": "1",
70
- "datas": ["<由 filterCondition 编译的条件项>"],
71
- "parentNode": "",
72
- "key": "<编译时生成>"
73
- },
74
- "nullOpflag": false
75
- }
76
- ```
77
-
78
- `filterInput.datas[].conditions.esbAssign.wId` 必须指向当前删除组件节点,不能指向触发器节点。
79
-
80
- 当条件左字段是「关联流程」Workflow 时,必须由 Skill 根据实时字段元数据和 `workflowPath.formIds` 反查真实流程表单对象;编译后的左值使用原始数字 `fieldName`、`fieldType:"String"`、顶层 `sformId` 和 `formInfo.formId/layoutId`,不得套用普通业务字段的 `field_` 前缀或把目标表单版本 ID写成 `sformId`。
1
+ # 删除表单数据(`ActionEbDelete`)
2
+
3
+ ## 何时使用
4
+
5
+ 按筛选条件删除 e-builder 表单数据;还原已删除数据使用 `ActionEbRecover`。
6
+ 删除组件只允许“按条件删除”,CLI 不生成无条件删除节点。
7
+
8
+ ## 先查询
9
+
10
+ 查询目标表单、目标表的数据源字段和操作人。前端 `ActionEbDelete` 使用
11
+ `dataSource + ConditionSet`,后端保存字段为 `filterInput`;CLI 计划层使用
12
+ `filterCondition`,由编译器转换为 `filterInput`。
13
+
14
+ ## 不可猜测
15
+
16
+ 筛选条件必须引用目标表真实字段;不能把名称或非本次上下文的字段键写入条件。
17
+
18
+ ## 最小计划
19
+
20
+ `targetForm`、`person`、`filterCondition`。`nullOpflag` 可选,默认 `false`,对应前端“传空值时执行”开关。
21
+
22
+ ## filterCondition 格式
23
+
24
+ **以 `references/condition_rules.md` 为准**:`{"field":{"id":"<目标字段id>","label":"<字段名>"},"operator":"eq","right":{...}}`。`field` 是 `{id,label}` 对象、`operator` 用英文操作符(`eq/neq/gt/lt/gte/lte/contains/uncontains/empty/nempty`)、右值键用 `right`。**勿用**废弃的 `value` 别名 / `=` / 裸字符串 `field`,也不能省略或传空 `filterCondition`。
25
+
26
+ 条件左值必须来自目标表的 `/api/ebuilder/common/ds/fields` 实时字段接口,不能凭名称、旧缓存或 `getEbField` 结果拼接。右值支持固定值、系统值、上下文、变量和函数等条件规则中定义的类型。
27
+
28
+ ## 计划示例
29
+
30
+ ```json
31
+ {
32
+ "type": "ActionEbDelete",
33
+ "params": {
34
+ "targetForm": {
35
+ "groupId": "<业务应用ID>",
36
+ "id": "<表单ID>",
37
+ "name": "<表单名称>"
38
+ },
39
+ "person": { "type": "role" },
40
+ "filterCondition": {
41
+ "field": { "id": "<实时字段ID>", "label": "状态" },
42
+ "operator": "eq",
43
+ "right": { "type": "fixed", "value": "D02", "label": "闲置" }
44
+ },
45
+ "nullOpflag": false
46
+ }
47
+ }
48
+ ```
49
+
50
+ ## 与前端/后端 DTO 的对应关系
51
+
52
+ 前端 `ActionEbDelete` 提交的关键字段如下,CLI 不要求计划直接写这些平台字段:
53
+
54
+ ```json
55
+ {
56
+ "type": "ActionEbDelete",
57
+ "targetForm": {
58
+ "groupId": "<业务应用ID>",
59
+ "id": "<表单ID>",
60
+ "text": "<表单名称>",
61
+ "type": "FORM"
62
+ },
63
+ "tableType": [{ "id": "<表单ID>", "name": "<表单名称>" }],
64
+ "appType": [{ "id": "<业务应用ID>", "name": "<应用名称>" }],
65
+ "person": "<操作人公式>",
66
+ "filterInput": {
67
+ "isNewFilter": true,
68
+ "isParent": true,
69
+ "relationship": "1",
70
+ "datas": ["<由 filterCondition 编译的条件项>"],
71
+ "parentNode": "",
72
+ "key": "<编译时生成>"
73
+ },
74
+ "nullOpflag": false
75
+ }
76
+ ```
77
+
78
+ `filterInput.datas[].conditions.esbAssign.wId` 必须指向当前删除组件节点,不能指向触发器节点。
79
+
80
+ 当条件左字段是「关联流程」Workflow 时,必须由 Skill 根据实时字段元数据和 `workflowPath.formIds` 反查真实流程表单对象;编译后的左值使用原始数字 `fieldName`、`fieldType:"String"`、顶层 `sformId` 和 `formInfo.formId/layoutId`,不得自行拼接字段前缀或把目标表单版本 ID写成 `sformId`。
@@ -1,75 +1,75 @@
1
- # 更新表单数据(`ActionEbUpdate`)
2
-
3
- ## 何时使用
4
-
5
- 更新 e-builder 数据;若需要在匹配条件不满足时新增数据,可开启 `needAdd`;删除数据使用 `ActionEbDelete`。
6
-
7
- ## 先查询
8
-
9
- 查询目标表单及字段;按条件更新还要确认条件左字段和本次触发器上下文。
10
-
11
- ## 不可猜测
12
-
13
- `id`、`updateData`、`fieldUpdate` 三种定位方式互不替代。`basisValue` 只用于真实上游明细依据值。
14
-
15
- 更新赋值可以使用固定值、上下文、动作流变量、租户常量或函数/公式;变量必须属于当前动作流场景,常量必须是当前租户真实常量 ID。新建资源和名称引用见 `references/dynamic_resources.md`。
16
-
17
- ## 最小计划
18
-
19
- `targetForm`、`person`、更新赋值,以及与 `opType` 对应的定位参数。
20
-
21
- ## 三种更新模式
22
-
23
- - `opType:"updateData"`:必须配置 `filterCondition`,仅按条件更新;不支持 `basisValue`,也不能同时配置 `updateId` 或 `updateFieldCondition`。
24
- - `opType:"id"`:必须配置 `updateId`。不填写 `basisValue` 时按数据 ID 更新单条数据;填写真实上游明细依据值后,按依据值批量更新。
25
- - `opType:"fieldUpdate"`:必须配置 `updateFieldCondition` 和 `updatePolicy`。不填写 `basisValue` 时按字段匹配更新单条数据;填写真实上游明细依据值后,按依据值批量更新。
26
-
27
- `basisValue` 只是 `id` 和 `fieldUpdate` 的批量开关,不能用于条件筛选更新。CLI 会在编译前校验这些组合,避免把一个模式的定位参数静默带入另一个模式。
28
-
29
- ### 条件不满足时插入
30
-
31
- `needAdd` 对应平台参数 `EbuilderActionDTO.needAdd`,默认 `false`。设为 `true` 时启用“条件不满足时插入”:匹配到目标记录时更新,未匹配到时新增。需要“存在则更新、否则新增”时应设置 `needAdd: true`,不需要另行组合新增组件。
32
-
33
- 内置 MQ 监听来源同样可使用 `opType:"fieldUpdate"` 配合 `needAdd:true`;匹配字段不能同时作为主表更新赋值目标。主表 `updates` 和明细 `detail` 可以配置在同一节点。
34
-
35
- 当 `id` 或 `fieldUpdate` 配置了 `basisValue` 时,如果 `updateId` 或 `updateFieldCondition.updateField[].assign` 的来源字段 `paramKey` 明确位于该依据值下级(例如依据值为 `100.12345[]`,来源字段为 `100.12345[].67890`),CLI 会按前端“依据值下级”协议编译为 `type:"10"`、`config.switchType:"sub"`。只有路径明确以该依据值加 `.` 开头时才会转换;不相关的明细字段仍按普通动态上下文编译,不凭路径形状猜测依据关系。`basisValue` 和来源字段都应使用前置上下文接口返回的真实字段元数据。
36
-
37
- ### 明细表策略
38
-
39
- 更新组件的 `ActionEbDlg` 会为每张明细表单独保存策略。`detail` 每项至少包含 `detailTableId`,可使用以下结构:
40
-
41
- ```json
42
- {
43
- "detailTableId": "<目标明细表ID>",
44
- "operateType": "update",
45
- "basisValue": {"paramKey": "<来源明细paramKey>[]", "label": "<来源明细表>"},
46
- "updateType": "fields",
47
- "updateFieldCondition": {
48
- "updateField": [
49
- {"fieldKey": "<匹配字段ID>", "assign": {"kind": "context", "paramKey": "<来源字段>"}}
50
- ]
51
- },
52
- "updatePolicy": "ALL",
53
- "mapping": {"<来源字段>": "<目标明细字段ID>"},
54
- "constants": {"<目标明细字段ID>": "<固定值>"},
55
- "formula": {},
56
- "deleteFields": []
57
- }
58
- ```
59
-
60
- `operateType` 与前端枚举一致:`default`、`add`、`update`、`updateAdd`、`cover`、`delete`。
61
-
62
- - `add`/`cover`:用于按依据值新增或覆盖明细;有字段赋值时需要 `basisValue`。
63
- - `update`/`updateAdd`:必须有 `basisValue` 和至少一个字段赋值;`updateType` 只能是 `fields` 或 `rowId`。`fields` 必须提供 `updateFieldCondition.updateField`,`rowId` 必须提供 `rowId`。
64
- - `delete`:`updateType` 可为 `fields`、`rowId` 或 `deleteAll`。前两者需要 `basisValue` 和对应条件,`deleteAll` 不需要依据值且不配置字段赋值。
65
- - `updatePolicy` 仅用于 `update`/`updateAdd`,可选 `ALL`、`FIRST`、`LAST`、`ZERO`、`EXCEPTION`。
66
-
67
- 当 `operateType` 为 `update` 或 `updateAdd` 且 `updateType` 为 `fields` 时,`updateFieldCondition.updateField[].fieldKey` 是专门用于匹配的条件字段,不能同时出现在 `mapping`、`constants` 或 `formula` 的目标字段中。编译后的 `EsbDetailForm.data` 与 `EsbDetailForm.updateFieldCondition` 对同一字段只能保留一份;主表的 `updateFieldCondition` 与 `setting.main` 也遵循同样规则。按 `rowId` 更新时不能再配置 `updateFieldCondition`。
68
-
69
- `rowId` 使用动态赋值对象,例如 `{"kind":"context","paramKey":"<来源明细ID>","label":"明细数据ID"}`;CLI 会将它包装为后端 `EsbDetailForm.rowId` 的 `FieldValue`。`deleteFields` 仍表示清除字段配置,不表示删除明细行;删除明细行必须使用 `operateType:"delete"`。
70
-
71
- ## filterCondition 格式(opType=updateData 定位条件)
72
-
73
- **以 `references/condition_rules.md` 为准**:`{"field":{"id":"<目标字段id>","label":"<字段名>"},"operator":"eq","right":{...}}`。`field` 是 `{id,label}` 对象、`operator` 用英文操作符(`eq/neq/gt/lt/gte/lte/contains/uncontains/empty/nempty`)、右值键用 `right`。**勿用**废弃的 `value` 别名 / `=` / 裸字符串 `field`,否则编译报「左侧字段 id 不在目标表单实时字段列表中」。
74
-
75
- 当条件左字段是「关联流程」Workflow 时,必须由 Skill 根据实时字段元数据和 `workflowPath.formIds` 反查真实流程表单对象;编译后的左值使用原始数字 `fieldName`、`fieldType:"String"`、顶层 `sformId` 和 `formInfo.formId/layoutId`,不得套用普通业务字段的 `field_` 前缀或把目标表单版本 ID写成 `sformId`。
1
+ # 更新表单数据(`ActionEbUpdate`)
2
+
3
+ ## 何时使用
4
+
5
+ 更新 e-builder 数据;若需要在匹配条件不满足时新增数据,可开启 `needAdd`;删除数据使用 `ActionEbDelete`。
6
+
7
+ ## 先查询
8
+
9
+ 查询目标表单及字段;按条件更新还要确认条件左字段和本次触发器上下文。
10
+
11
+ ## 不可猜测
12
+
13
+ `id`、`updateData`、`fieldUpdate` 三种定位方式互不替代。`basisValue` 只用于真实上游明细依据值。
14
+
15
+ 更新赋值可以使用固定值、上下文、动作流变量、租户常量或函数/公式;变量必须属于当前动作流场景,常量必须是当前租户真实常量 ID。新建资源和名称引用见 `references/dynamic_resources.md`。
16
+
17
+ ## 最小计划
18
+
19
+ `targetForm`、`person`、更新赋值,以及与 `opType` 对应的定位参数。
20
+
21
+ ## 三种更新模式
22
+
23
+ - `opType:"updateData"`:必须配置 `filterCondition`,仅按条件更新;不支持 `basisValue`,也不能同时配置 `updateId` 或 `updateFieldCondition`。
24
+ - `opType:"id"`:必须配置 `updateId`。不填写 `basisValue` 时按数据 ID 更新单条数据;填写真实上游明细依据值后,按依据值批量更新。
25
+ - `opType:"fieldUpdate"`:必须配置 `updateFieldCondition` 和 `updatePolicy`。不填写 `basisValue` 时按字段匹配更新单条数据;填写真实上游明细依据值后,按依据值批量更新。
26
+
27
+ `basisValue` 只是 `id` 和 `fieldUpdate` 的批量开关,不能用于条件筛选更新。CLI 会在编译前校验这些组合,避免把一个模式的定位参数静默带入另一个模式。
28
+
29
+ ### 条件不满足时插入
30
+
31
+ `needAdd` 对应平台参数 `EbuilderActionDTO.needAdd`,默认 `false`。设为 `true` 时启用“条件不满足时插入”:匹配到目标记录时更新,未匹配到时新增。需要“存在则更新、否则新增”时应设置 `needAdd: true`,不需要另行组合新增组件。
32
+
33
+ 内置 MQ 监听来源同样可使用 `opType:"fieldUpdate"` 配合 `needAdd:true`;匹配字段不能同时作为主表更新赋值目标。主表 `updates` 和明细 `detail` 可以配置在同一节点。
34
+
35
+ 当 `id` 或 `fieldUpdate` 配置了 `basisValue` 时,如果 `updateId` 或 `updateFieldCondition.updateField[].assign` 的来源字段 `paramKey` 明确位于该依据值下级(例如依据值为 `100.12345[]`,来源字段为 `100.12345[].67890`),CLI 会按前端“依据值下级”协议编译为 `type:"10"`、`config.switchType:"sub"`。只有路径明确以该依据值加 `.` 开头时才会转换;不相关的明细字段仍按普通动态上下文编译,不凭路径形状猜测依据关系。`basisValue` 和来源字段都应使用前置上下文接口返回的真实字段元数据。
36
+
37
+ ### 明细表策略
38
+
39
+ 更新组件的 `ActionEbDlg` 会为每张明细表单独保存策略。`detail` 每项至少包含 `detailTableId`,可使用以下结构:
40
+
41
+ ```json
42
+ {
43
+ "detailTableId": "<目标明细表ID>",
44
+ "operateType": "update",
45
+ "basisValue": {"paramKey": "<来源明细paramKey>[]", "label": "<来源明细表>"},
46
+ "updateType": "fields",
47
+ "updateFieldCondition": {
48
+ "updateField": [
49
+ {"fieldKey": "<匹配字段ID>", "assign": {"kind": "context", "paramKey": "<来源字段>"}}
50
+ ]
51
+ },
52
+ "updatePolicy": "ALL",
53
+ "mapping": {"<来源字段>": "<目标明细字段ID>"},
54
+ "constants": {"<目标明细字段ID>": "<固定值>"},
55
+ "formula": {},
56
+ "deleteFields": []
57
+ }
58
+ ```
59
+
60
+ `operateType` 与前端枚举一致:`default`、`add`、`update`、`updateAdd`、`cover`、`delete`。
61
+
62
+ - `add`/`cover`:用于按依据值新增或覆盖明细;有字段赋值时需要 `basisValue`。
63
+ - `update`/`updateAdd`:必须有 `basisValue` 和至少一个字段赋值;`updateType` 只能是 `fields` 或 `rowId`。`fields` 必须提供 `updateFieldCondition.updateField`,`rowId` 必须提供 `rowId`。
64
+ - `delete`:`updateType` 可为 `fields`、`rowId` 或 `deleteAll`。前两者需要 `basisValue` 和对应条件,`deleteAll` 不需要依据值且不配置字段赋值。
65
+ - `updatePolicy` 仅用于 `update`/`updateAdd`,可选 `ALL`、`FIRST`、`LAST`、`ZERO`、`EXCEPTION`。
66
+
67
+ 当 `operateType` 为 `update` 或 `updateAdd` 且 `updateType` 为 `fields` 时,`updateFieldCondition.updateField[].fieldKey` 是专门用于匹配的条件字段,不能同时出现在 `mapping`、`constants` 或 `formula` 的目标字段中。编译后的 `EsbDetailForm.data` 与 `EsbDetailForm.updateFieldCondition` 对同一字段只能保留一份;主表的 `updateFieldCondition` 与 `setting.main` 也遵循同样规则。按 `rowId` 更新时不能再配置 `updateFieldCondition`。
68
+
69
+ `rowId` 使用动态赋值对象,例如 `{"kind":"context","paramKey":"<来源明细ID>","label":"明细数据ID"}`;CLI 会将它包装为后端 `EsbDetailForm.rowId` 的 `FieldValue`。`deleteFields` 仍表示清除字段配置,不表示删除明细行;删除明细行必须使用 `operateType:"delete"`。
70
+
71
+ ## filterCondition 格式(opType=updateData 定位条件)
72
+
73
+ **以 `references/condition_rules.md` 为准**:`{"field":{"id":"<目标字段id>","label":"<字段名>"},"operator":"eq","right":{...}}`。`field` 是 `{id,label}` 对象、`operator` 用英文操作符(`eq/neq/gt/lt/gte/lte/contains/uncontains/empty/nempty`)、右值键用 `right`。**勿用**废弃的 `value` 别名 / `=` / 裸字符串 `field`,否则编译报「左侧字段 id 不在目标表单实时字段列表中」。
74
+
75
+ 当条件左字段是「关联流程」Workflow 时,必须由 Skill 根据实时字段元数据和 `workflowPath.formIds` 反查真实流程表单对象;编译后的左值使用原始数字 `fieldName`、`fieldType:"String"`、顶层 `sformId` 和 `formInfo.formId/layoutId`,不得自行拼接字段前缀或把目标表单版本 ID写成 `sformId`。
@@ -1,111 +1,113 @@
1
- # 查询表单数据(`EnquiryForm`)
2
-
3
- ## 何时使用
4
-
5
- 查询 e-builder 表单列表或分组统计;按单条 ID 读取使用 `EbGetDataById`。
6
-
7
- ## 先查询
8
-
9
- 查询数据源、全部字段、筛选字段、输出字段和查询操作人。
10
-
11
- `actionflow data-source-condition-fields '{"dataSource":{...}}'` 查询条件左值;`filter.field.id` 使用其中的 `id`。`name` 唯一时可兼容输入,重名必须使用 id。`queryFields` 的 id 来自 `showDataSourceFields`,下游引用使用 `component-context-fields` 的 paramKey;不要把临时上下文 id 当条件字段 id。CLI 输出的条件 `fieldName` 取真实字段 `name`。
12
-
13
- ## 不可猜测
14
-
15
- 筛选、排序、分组和输出字段都必须来自当前数据源;统计结果应作为后续节点上下文使用。
16
-
17
- ## 最小计划
18
-
19
- `dataSource`、`person`;按 `opType` 补充查询字段,必须提供 `filter` 或 `conditionFormula`。未给出条件时应向用户确认具体筛选条件;即使需要查询全部数据,也不能臆造中性条件,应先确认并使用 `ds/fields` 返回的真实字段及支持的运算符。未明确限制 `queryFields` 时不要传它(或传空数组),CLI 会默认全选实时可选字段。
20
-
21
- 业务模块数据源使用 `dataSourceKind:"business_module"`,可用平台实时分类名 `groupName` 或分类 ID `groupId` 缩小范围(例如 HRM);未指定时逐分类查找,存在多个候选时须明确选择。字段查询沿用选中数据源返回的服务组。
22
-
23
- ## 动态分页和条件
24
-
25
- - `formPageNo`、`formPageSize` 支持固定值、上下文、系统变量、变量、常量和函数/公式。
26
- - 需要由上游计算整段查询条件时使用 `conditionFormula`;它会写为 `conditionType:"assign"`,此时不得同时传 `filter`。
27
- - 普通业务筛选继续使用 `filter`,两种条件模式不能混用。
28
-
29
- ## 分组/汇总查询
30
-
31
- `opType:"groupFields"` 是原生“分组/汇总”能力,不需要规则集或外部计算组件:
32
-
33
- - `groupFields` 是分组维度:`[{"field":"<真实字段id>"}]`;没有分组维度时传空数组。
34
- - `groupMessage` 是汇总值:`[{"field":"<真实字段id>","aggregator":"SUM"}]`。
35
- - 可用聚合方式:`SUM`、`MIN`、`AVG`、`MAX`、`COUNT`、`DISTINCTCOUNT`。其中 `SUM`/`AVG` 只用于数值字段。
36
- - 汇总输出字段名由平台固定为 `s_sum_<字段id>`、`s_min_<字段id>`、`s_avg_<字段id>`、`s_max_<字段id>`、`s_count_<字段id>`、`s_distinctcount_<字段id>`;后续节点引用它时使用 `kind:"query_result"`、`fieldId:"s_sum_<字段id>"`、`source:"<查询动作ref>"`、`index:0`。
37
-
38
- 示例:汇总“收款金额”并让后续节点取第一条汇总结果:
39
-
40
- ```json
41
- {
42
- "type": "EnquiryForm",
43
- "ref": "收款汇总",
44
- "params": {
45
- "dataSource": {"groupId":"<应用id>","id":"<合同收款表id>","text":"合同收款表"},
46
- "person": {"type":"role"},
47
- "opType": "groupFields",
48
- "filter": {"field":{"id":"<关联项目字段id>","label":"关联项目"},"operator":"eq","right":{"kind":"context","paramKey":"<当前表单>.关联项目"}},
49
- "groupFields": [],
50
- "groupMessage": [{"field":"<收款金额字段id>","aggregator":"SUM"}]
51
- }
52
- }
53
- ```
54
-
55
- ## 批量新增主表字段引用查询结果(2026-08-27 真机钉死)
56
-
57
- **结论:当需求确实需要反查时,EnquiryForm 查询结果可以赋给 `batchInsert` 主表字段(标量),但只限"单值反查"场景**。它不是任何表单新增动作的默认前置节点。手动创建成功样本:`references/examples/enquiry-form-batch-insert-scene2.json`(ApproveTrigger → EnquiryForm → ActionEbAdd(batchInsert) → Output)。样例中的 `opText` 是历史平台序列化快照,不是生成模板;生成时只依据语义 plan 和实时字段元数据,尤其不要复制其中 Workflow 左值的旧 `field_`/`Workflow` 组合。
58
-
59
- 关键结构(与旧结论不同,已修正):
60
-
61
- 1. **EnquiryForm 节点(首动作)**:
62
- - 此历史样本的 `dataSource.type` 是 `LOGIC`;生成时必须使用当前 Browser 返回的真实 `type/sourceType`,不能据样本推断。查询服务组是 `weaver-ebuilder-form-service`。
63
- - `queryFields[].id = "id"`(简写,不是 `{表id}[].id`);`fieldGroup = { name: 表名, id: 表id }`
64
- - 筛选:`filterInput.datas[].conditions.value` 用流程上下文 type=3(`ApprovalData.{wfId}.requestId`)
65
- - 首动作 **不需要 sources**(undefined),ActionEbAdd 的 sources 指向 EnquiryForm 节点 wId
66
-
67
- 2. **主表字段引用查询结果(项目名称 5453)**:
68
- - assign:`type=3`,`value = "FormData.{查询表id}[{positionId}].id"`(**数组下标用 positionId 而非 `[]`**)
69
- - `config.comType = "EnquiryForm"`、`config.comId = EnquiryForm 节点 id`、`config.paramKey = "{查询表id}[].id"`(paramKey 保持 `[]` 数组标记)
70
- - **childs 必须带固定值取下标**:`[{ type: "1", value: "0", position: "{positionId}" }]`(value=0 取第一条)
71
- - `frontId` = 查询结果字段的真实 `fieldId`(不能使用公式对象临时 id);前端用它定位查询节点输出字段,否则会回显为“数据源查询(已删除)”并标红。
72
-
73
- 3. 其余明细字段仍用依据值下级 type=10 直连(paramKey `{wfId}.{明细表id}[].{子字段id}`,source=event 节点 id)。
74
-
75
- 4. 挂接注意:EnquiryForm 作为**流程首动作**保存成功,首动作不要补 sources。数据源类型以当前接口实际返回为准。
76
-
77
- 计划中引用该结果时,必须显式写 `kind:"query_result"`,不能把它写成普通流程字段。例如:
78
-
79
- ```json
80
- {
81
- "mapping": {
82
- "<查询表单id>[].id": {
83
- "target": "<目标字段id>",
84
- "kind": "query_result",
85
- "source": "<EnquiryForm动作ref>",
86
- "formId": "<查询表单id>",
87
- "fieldId": "id",
88
- "label": "数据ID",
89
- "index": 0
90
- }
91
- }
92
- }
93
- ```
94
-
95
- 其中查询动作需显式声明例如 `{"type":"EnquiryForm","ref":"项目查询","params":{...}}`,后续写 `source:"项目查询"`。编译器会将该语义 `ref` 替换为实际节点 ID,并生成保存所需的 `childs` 下标公式;禁止使用或猜测平台节点 ID。
96
-
97
- ## 关键边界:只支持"单值反查",不支持"逐行明细反查"(2026-08-27 用户确认)
98
-
99
- **适用条件(场景2 成立的唯一前提)**:EnquiryForm 的筛选条件用的是**流程级唯一值**(如 `关联流程 eq requestId`),业务上一个流程只对应一条查询结果 → 取第一条(childs value=0)就是唯一那条,赋值主表字段正确。
100
-
101
- **禁止场景(多条结果)**:如果筛选条件用的是**明细行 id/明细字段**(如"按任务编号反查"),查询结果会有多条,且**数据源返回结果的顺序与流程明细表的行顺序不保证一致**(第 1 行明细对应的结果可能排在返回结果第 5 行)。此时:
102
- - 无法用"取第一条"对应到正确的明细行;
103
- - 无法把查询结果作为依据值(basisValue)传给下方组件——明细字段值仍需以**流程明细表本身作为依据值**(type=10 直连);
104
- - **转化规则必须逐行做明细字段转化,多条结果做不到 → 该场景明确拒绝,不硬凑 EnquiryForm**。
105
-
106
- 一句话决策:**EnquiryForm 反查只能给"与明细行无关的全局单值"(主表字段,按流程级唯一条件查);凡需"按每行明细反查对应值"的,直接拒绝并告知用户**。
107
-
108
- ## 曾经的错误结论(已推翻,勿沿用)
109
-
110
- - ~~EnquiryForm 输出是列表数组不能赋主表标量~~ → 实际通过 childs 固定值取下标(value=0 第一条)实现(仅限单值反查)。
111
- - ~~批量新增场景不要用 EnquiryForm 反查~~ → 单值反查是标准做法,见上;逐行反查仍不可行。
1
+ # 查询表单数据(`EnquiryForm`)
2
+
3
+ ## 何时使用
4
+
5
+ 查询 e-builder 表单列表或分组统计;按单条 ID 读取使用 `EbGetDataById`。
6
+
7
+ ## 先查询
8
+
9
+ 查询数据源、全部字段、筛选字段、输出字段和查询操作人。
10
+
11
+ `actionflow data-source-condition-fields '{"dataSource":{...}}'` 查询条件左值;`filter.field.id` 使用其中的 `id`。`name` 唯一时可兼容输入,重名必须使用 id。`queryFields` 的 id 来自 `showDataSourceFields`,下游引用使用 `component-context-fields` 的 paramKey;不要把临时上下文 id 当条件字段 id。CLI 输出的条件 `fieldName` 取真实字段 `name`。
12
+
13
+ ## 不可猜测
14
+
15
+ 筛选、排序、分组和输出字段都必须来自当前数据源;统计结果应作为后续节点上下文使用。
16
+
17
+ ## 最小计划
18
+
19
+ `dataSource`、`person`;按 `opType` 补充查询字段,必须提供 `filter` 或 `conditionFormula`。未给出条件时应向用户确认具体筛选条件;即使需要查询全部数据,也不能臆造中性条件,应先确认并使用 `ds/fields` 返回的真实字段及支持的运算符。未明确限制 `queryFields` 时不要传它(或传空数组),CLI 会默认全选实时可选字段。
20
+
21
+ 业务模块数据源使用 `dataSourceKind:"business_module"`,可用平台实时分类名 `groupName` 或分类 ID `groupId` 缩小范围(例如 HRM);未指定时逐分类查找,存在多个候选时须明确选择。字段查询沿用选中数据源返回的服务组。
22
+
23
+ `countFlag`(返回总数)和 `parseMark`(返回关联字段的显示名称)默认开启;需求明确关闭时可分别传 `false`。下游引用总数时,应在该配置下查询 `getComponentContext` 并使用接口返回的真实字段;CLI 不补造 `response.count`。
24
+
25
+ ## 动态分页和条件
26
+
27
+ - `formPageNo`、`formPageSize` 支持固定值、上下文、系统变量、变量、常量和函数/公式。
28
+ - 需要由上游计算整段查询条件时使用 `conditionFormula`;它会写为 `conditionType:"assign"`,此时不得同时传 `filter`。
29
+ - 普通业务筛选继续使用 `filter`,两种条件模式不能混用。
30
+
31
+ ## 分组/汇总查询
32
+
33
+ `opType:"groupFields"` 是原生“分组/汇总”能力,不需要规则集或外部计算组件:
34
+
35
+ - `groupFields` 是分组维度:`[{"field":"<真实字段id>"}]`;没有分组维度时传空数组。
36
+ - `groupMessage` 是汇总值:`[{"field":"<真实字段id>","aggregator":"SUM"}]`。
37
+ - 可用聚合方式:`SUM`、`MIN`、`AVG`、`MAX`、`COUNT`、`DISTINCTCOUNT`。其中 `SUM`/`AVG` 只用于数值字段。
38
+ - 汇总输出字段名由平台固定为 `s_sum_<字段id>`、`s_min_<字段id>`、`s_avg_<字段id>`、`s_max_<字段id>`、`s_count_<字段id>`、`s_distinctcount_<字段id>`;后续节点引用它时使用 `kind:"query_result"`、`fieldId:"s_sum_<字段id>"`、`source:"<查询动作ref>"`、`index:0`。
39
+
40
+ 示例:汇总“收款金额”并让后续节点取第一条汇总结果:
41
+
42
+ ```json
43
+ {
44
+ "type": "EnquiryForm",
45
+ "ref": "收款汇总",
46
+ "params": {
47
+ "dataSource": {"groupId":"<应用id>","id":"<合同收款表id>","text":"合同收款表"},
48
+ "person": {"type":"role"},
49
+ "opType": "groupFields",
50
+ "filter": {"field":{"id":"<关联项目字段id>","label":"关联项目"},"operator":"eq","right":{"kind":"context","paramKey":"<当前表单>.关联项目"}},
51
+ "groupFields": [],
52
+ "groupMessage": [{"field":"<收款金额字段id>","aggregator":"SUM"}]
53
+ }
54
+ }
55
+ ```
56
+
57
+ ## 批量新增主表字段引用查询结果(2026-08-27 真机钉死)
58
+
59
+ **结论:当需求确实需要反查时,EnquiryForm 查询结果可以赋给 `batchInsert` 主表字段(标量),但只限"单值反查"场景**。它不是任何表单新增动作的默认前置节点。手动创建成功样本:`references/examples/enquiry-form-batch-insert-scene2.json`(ApproveTrigger → EnquiryForm → ActionEbAdd(batchInsert) → Output)。样例中的 `opText` 是历史平台序列化快照,不是生成模板;生成时只依据语义 plan 和实时字段元数据,尤其不要复制其中 Workflow 左值的旧 `field_`/`Workflow` 组合。
60
+
61
+ 关键结构(与旧结论不同,已修正):
62
+
63
+ 1. **EnquiryForm 节点(首动作)**:
64
+ - 此历史样本的 `dataSource.type` 是 `LOGIC`;生成时必须使用当前 Browser 返回的真实 `type/sourceType`,不能据样本推断。查询服务组是 `weaver-ebuilder-form-service`。
65
+ - `queryFields[].id = "id"`(简写,不是 `{表id}[].id`);`fieldGroup = { name: 表名, id: 表id }`
66
+ - 筛选:`filterInput.datas[].conditions.value` 用流程上下文 type=3(`ApprovalData.{wfId}.requestId`)
67
+ - 首动作 **不需要 sources**(undefined),ActionEbAdd 的 sources 指向 EnquiryForm 节点 wId
68
+
69
+ 2. **主表字段引用查询结果(项目名称 5453)**:
70
+ - assign:`type=3`,`value = "FormData.{查询表id}[{positionId}].id"`(**数组下标用 positionId 而非 `[]`**)
71
+ - `config.comType = "EnquiryForm"`、`config.comId = EnquiryForm 节点 id`、`config.paramKey = "{查询表id}[].id"`(paramKey 保持 `[]` 数组标记)
72
+ - **childs 必须带固定值取下标**:`[{ type: "1", value: "0", position: "{positionId}" }]`(value=0 取第一条)
73
+ - `frontId` = 查询结果字段的真实 `fieldId`(不能使用公式对象临时 id);前端用它定位查询节点输出字段,否则会回显为“数据源查询(已删除)”并标红。
74
+
75
+ 3. 其余明细字段仍用依据值下级 type=10 直连(paramKey `{wfId}.{明细表id}[].{子字段id}`,source=event 节点 id)。
76
+
77
+ 4. 挂接注意:EnquiryForm 作为**流程首动作**保存成功,首动作不要补 sources。数据源类型以当前接口实际返回为准。
78
+
79
+ 计划中引用该结果时,必须显式写 `kind:"query_result"`,不能把它写成普通流程字段。例如:
80
+
81
+ ```json
82
+ {
83
+ "mapping": {
84
+ "<查询表单id>[].id": {
85
+ "target": "<目标字段id>",
86
+ "kind": "query_result",
87
+ "source": "<EnquiryForm动作ref>",
88
+ "formId": "<查询表单id>",
89
+ "fieldId": "id",
90
+ "label": "数据ID",
91
+ "index": 0
92
+ }
93
+ }
94
+ }
95
+ ```
96
+
97
+ 其中查询动作需显式声明例如 `{"type":"EnquiryForm","ref":"项目查询","params":{...}}`,后续写 `source:"项目查询"`。编译器会将该语义 `ref` 替换为实际节点 ID,并生成保存所需的 `childs` 下标公式;禁止使用或猜测平台节点 ID。
98
+
99
+ ## 关键边界:只支持"单值反查",不支持"逐行明细反查"(2026-08-27 用户确认)
100
+
101
+ **适用条件(场景2 成立的唯一前提)**:EnquiryForm 的筛选条件用的是**流程级唯一值**(如 `关联流程 eq requestId`),业务上一个流程只对应一条查询结果 → 取第一条(childs value=0)就是唯一那条,赋值主表字段正确。
102
+
103
+ **禁止场景(多条结果)**:如果筛选条件用的是**明细行 id/明细字段**(如"按任务编号反查"),查询结果会有多条,且**数据源返回结果的顺序与流程明细表的行顺序不保证一致**(第 1 行明细对应的结果可能排在返回结果第 5 行)。此时:
104
+ - 无法用"取第一条"对应到正确的明细行;
105
+ - 无法把查询结果作为依据值(basisValue)传给下方组件——明细字段值仍需以**流程明细表本身作为依据值**(type=10 直连);
106
+ - **转化规则必须逐行做明细字段转化,多条结果做不到 → 该场景明确拒绝,不硬凑 EnquiryForm**。
107
+
108
+ 一句话决策:**EnquiryForm 反查只能给"与明细行无关的全局单值"(主表字段,按流程级唯一条件查);凡需"按每行明细反查对应值"的,直接拒绝并告知用户**。
109
+
110
+ ## 曾经的错误结论(已推翻,勿沿用)
111
+
112
+ - ~~EnquiryForm 输出是列表数组不能赋主表标量~~ → 实际通过 childs 固定值取下标(value=0 第一条)实现(仅限单值反查)。
113
+ - ~~批量新增场景不要用 EnquiryForm 反查~~ → 单值反查是标准做法,见上;逐行反查仍不可行。