weaver-e10-builder 1.5.1 → 1.5.3

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 (217) hide show
  1. package/dist/commands/form-add-detail-table.js +3 -3
  2. package/dist/commands/form-add-detail-table.js.map +1 -1
  3. package/dist/commands/form-add-physical-field.d.ts +3 -0
  4. package/dist/commands/form-add-physical-field.d.ts.map +1 -0
  5. package/dist/commands/form-add-physical-field.js +126 -0
  6. package/dist/commands/form-add-physical-field.js.map +1 -0
  7. package/dist/commands/form-data.d.ts.map +1 -1
  8. package/dist/commands/form-data.js +125 -0
  9. package/dist/commands/form-data.js.map +1 -1
  10. package/dist/commands/form-ebuilder-columns.d.ts.map +1 -1
  11. package/dist/commands/form-ebuilder-columns.js +3 -3
  12. package/dist/commands/form-ebuilder-columns.js.map +1 -1
  13. package/dist/commands/form-ebuilder-scope.d.ts.map +1 -1
  14. package/dist/commands/form-ebuilder-scope.js +3 -4
  15. package/dist/commands/form-ebuilder-scope.js.map +1 -1
  16. package/dist/commands/form-field-lang.d.ts.map +1 -1
  17. package/dist/commands/form-field-lang.js +3 -4
  18. package/dist/commands/form-field-lang.js.map +1 -1
  19. package/dist/commands/form-field-linkage.d.ts.map +1 -1
  20. package/dist/commands/form-field-linkage.js +4 -3
  21. package/dist/commands/form-field-linkage.js.map +1 -1
  22. package/dist/commands/form-formula-linkage.d.ts.map +1 -1
  23. package/dist/commands/form-formula-linkage.js +4 -2
  24. package/dist/commands/form-formula-linkage.js.map +1 -1
  25. package/dist/commands/form-formula.d.ts.map +1 -1
  26. package/dist/commands/form-formula.js +5 -5
  27. package/dist/commands/form-formula.js.map +1 -1
  28. package/dist/commands/form-layout.d.ts.map +1 -1
  29. package/dist/commands/form-layout.js +6 -0
  30. package/dist/commands/form-layout.js.map +1 -1
  31. package/dist/commands/form-list-click.d.ts.map +1 -1
  32. package/dist/commands/form-list-click.js +3 -2
  33. package/dist/commands/form-list-click.js.map +1 -1
  34. package/dist/commands/form-list-permission.js +1 -1
  35. package/dist/commands/form-list-permission.js.map +1 -1
  36. package/dist/commands/form-physical-table.d.ts +3 -0
  37. package/dist/commands/form-physical-table.d.ts.map +1 -0
  38. package/dist/commands/form-physical-table.js +195 -0
  39. package/dist/commands/form-physical-table.js.map +1 -0
  40. package/dist/commands/form-relate.d.ts.map +1 -1
  41. package/dist/commands/form-relate.js +3 -2
  42. package/dist/commands/form-relate.js.map +1 -1
  43. package/dist/commands/form-validate.d.ts.map +1 -1
  44. package/dist/commands/form-validate.js +3 -3
  45. package/dist/commands/form-validate.js.map +1 -1
  46. package/dist/commands/form-view.d.ts.map +1 -1
  47. package/dist/commands/form-view.js +2 -0
  48. package/dist/commands/form-view.js.map +1 -1
  49. package/dist/commands/form.d.ts +9 -3
  50. package/dist/commands/form.d.ts.map +1 -1
  51. package/dist/commands/form.js +150 -571
  52. package/dist/commands/form.js.map +1 -1
  53. package/dist/commands/org.d.ts.map +1 -1
  54. package/dist/commands/org.js +131 -7
  55. package/dist/commands/org.js.map +1 -1
  56. package/dist/commands/special.d.ts +24 -0
  57. package/dist/commands/special.d.ts.map +1 -0
  58. package/dist/commands/special.js +487 -0
  59. package/dist/commands/special.js.map +1 -0
  60. package/dist/commands/wf-form.d.ts.map +1 -1
  61. package/dist/commands/wf-form.js +4 -4
  62. package/dist/commands/wf-form.js.map +1 -1
  63. package/dist/commands/workflow-message.d.ts.map +1 -1
  64. package/dist/commands/workflow-message.js +1 -2
  65. package/dist/commands/workflow-message.js.map +1 -1
  66. package/dist/commands/workflow-operator-sign.js +1 -1
  67. package/dist/commands/workflow-operator-sign.js.map +1 -1
  68. package/dist/index.js +28 -0
  69. package/dist/index.js.map +1 -1
  70. package/dist/services/actionflow/components/action_eb_update_compiler.d.ts.map +1 -1
  71. package/dist/services/actionflow/components/action_eb_update_compiler.js +54 -12
  72. package/dist/services/actionflow/components/action_eb_update_compiler.js.map +1 -1
  73. package/dist/services/actionflow/components/index.d.ts.map +1 -1
  74. package/dist/services/actionflow/components/index.js +6 -0
  75. package/dist/services/actionflow/components/index.js.map +1 -1
  76. package/dist/services/actionflow/components/multiple_execution.d.ts.map +1 -1
  77. package/dist/services/actionflow/components/multiple_execution.js +73 -13
  78. package/dist/services/actionflow/components/multiple_execution.js.map +1 -1
  79. package/dist/services/actionflow/components/output.d.ts.map +1 -1
  80. package/dist/services/actionflow/components/output.js +144 -5
  81. package/dist/services/actionflow/components/output.js.map +1 -1
  82. package/dist/services/actionflow/components/send_message.d.ts.map +1 -1
  83. package/dist/services/actionflow/components/send_message.js +60 -32
  84. package/dist/services/actionflow/components/send_message.js.map +1 -1
  85. package/dist/services/actionflow/components/serverless_action.d.ts +5 -0
  86. package/dist/services/actionflow/components/serverless_action.d.ts.map +1 -0
  87. package/dist/services/actionflow/components/serverless_action.js +134 -0
  88. package/dist/services/actionflow/components/serverless_action.js.map +1 -0
  89. package/dist/services/actionflow/components/webhook_trigger.d.ts +5 -0
  90. package/dist/services/actionflow/components/webhook_trigger.d.ts.map +1 -0
  91. package/dist/services/actionflow/components/webhook_trigger.js +85 -0
  92. package/dist/services/actionflow/components/webhook_trigger.js.map +1 -0
  93. package/dist/services/actionflow/context_preflight.d.ts +6 -0
  94. package/dist/services/actionflow/context_preflight.d.ts.map +1 -1
  95. package/dist/services/actionflow/context_preflight.js +247 -7
  96. package/dist/services/actionflow/context_preflight.js.map +1 -1
  97. package/dist/services/actionflow/context_provider.d.ts.map +1 -1
  98. package/dist/services/actionflow/context_provider.js +67 -3
  99. package/dist/services/actionflow/context_provider.js.map +1 -1
  100. package/dist/services/actionflow/custom_trigger_context.d.ts.map +1 -1
  101. package/dist/services/actionflow/custom_trigger_context.js +9 -2
  102. package/dist/services/actionflow/custom_trigger_context.js.map +1 -1
  103. package/dist/services/actionflow/formula_service.d.ts +2 -0
  104. package/dist/services/actionflow/formula_service.d.ts.map +1 -1
  105. package/dist/services/actionflow/formula_service.js +381 -63
  106. package/dist/services/actionflow/formula_service.js.map +1 -1
  107. package/dist/services/actionflow/generation_service.d.ts.map +1 -1
  108. package/dist/services/actionflow/generation_service.js +9 -0
  109. package/dist/services/actionflow/generation_service.js.map +1 -1
  110. package/dist/services/actionflow/param_group_dto.d.ts +5 -0
  111. package/dist/services/actionflow/param_group_dto.d.ts.map +1 -0
  112. package/dist/services/actionflow/param_group_dto.js +181 -0
  113. package/dist/services/actionflow/param_group_dto.js.map +1 -0
  114. package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
  115. package/dist/services/actionflow/preflight_service.js +53 -11
  116. package/dist/services/actionflow/preflight_service.js.map +1 -1
  117. package/dist/services/actionflow/readback_verifier.d.ts.map +1 -1
  118. package/dist/services/actionflow/readback_verifier.js +14 -1
  119. package/dist/services/actionflow/readback_verifier.js.map +1 -1
  120. package/dist/services/actionflow/update_service.d.ts.map +1 -1
  121. package/dist/services/actionflow/update_service.js +14 -8
  122. package/dist/services/actionflow/update_service.js.map +1 -1
  123. package/dist/services/actionflow/webhook_source.d.ts +4 -0
  124. package/dist/services/actionflow/webhook_source.d.ts.map +1 -0
  125. package/dist/services/actionflow/webhook_source.js +99 -0
  126. package/dist/services/actionflow/webhook_source.js.map +1 -0
  127. package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
  128. package/dist/services/actionflow/workflow_compiler.js +1 -0
  129. package/dist/services/actionflow/workflow_compiler.js.map +1 -1
  130. package/dist/services/form-create.d.ts +45 -2
  131. package/dist/services/form-create.d.ts.map +1 -1
  132. package/dist/services/form-create.js +78 -8
  133. package/dist/services/form-create.js.map +1 -1
  134. package/dist/services/form-data-openapi.d.ts +142 -0
  135. package/dist/services/form-data-openapi.d.ts.map +1 -0
  136. package/dist/services/form-data-openapi.js +363 -0
  137. package/dist/services/form-data-openapi.js.map +1 -0
  138. package/dist/services/form-field-build.d.ts +71 -0
  139. package/dist/services/form-field-build.d.ts.map +1 -0
  140. package/dist/services/form-field-build.js +436 -0
  141. package/dist/services/form-field-build.js.map +1 -0
  142. package/dist/services/form-field-template.d.ts +71 -0
  143. package/dist/services/form-field-template.d.ts.map +1 -0
  144. package/dist/services/form-field-template.js +103 -0
  145. package/dist/services/form-field-template.js.map +1 -0
  146. package/dist/services/form-field-validate.d.ts +26 -0
  147. package/dist/services/form-field-validate.d.ts.map +1 -0
  148. package/dist/services/form-field-validate.js +121 -0
  149. package/dist/services/form-field-validate.js.map +1 -0
  150. package/dist/services/form-id.d.ts +50 -0
  151. package/dist/services/form-id.d.ts.map +1 -0
  152. package/dist/services/form-id.js +110 -0
  153. package/dist/services/form-id.js.map +1 -0
  154. package/dist/services/form-layout-grid.d.ts +123 -0
  155. package/dist/services/form-layout-grid.d.ts.map +1 -0
  156. package/dist/services/form-layout-grid.js +177 -0
  157. package/dist/services/form-layout-grid.js.map +1 -0
  158. package/dist/services/form-layout-insert.d.ts +24 -1
  159. package/dist/services/form-layout-insert.d.ts.map +1 -1
  160. package/dist/services/form-layout-insert.js +192 -27
  161. package/dist/services/form-layout-insert.js.map +1 -1
  162. package/dist/services/form-physical-table.d.ts +115 -0
  163. package/dist/services/form-physical-table.d.ts.map +1 -0
  164. package/dist/services/form-physical-table.js +153 -0
  165. package/dist/services/form-physical-table.js.map +1 -0
  166. package/dist/services/form-table-view.d.ts.map +1 -1
  167. package/dist/services/form-table-view.js +2 -11
  168. package/dist/services/form-table-view.js.map +1 -1
  169. package/dist/services/form-view.d.ts +2 -0
  170. package/dist/services/form-view.d.ts.map +1 -1
  171. package/dist/services/form-view.js +57 -7
  172. package/dist/services/form-view.js.map +1 -1
  173. package/dist/services/form-virtual.d.ts.map +1 -1
  174. package/dist/services/form-virtual.js +6 -1
  175. package/dist/services/form-virtual.js.map +1 -1
  176. package/dist/services/org-employee.d.ts +105 -1
  177. package/dist/services/org-employee.d.ts.map +1 -1
  178. package/dist/services/org-employee.js +186 -5
  179. package/dist/services/org-employee.js.map +1 -1
  180. package/dist/services/special-page.d.ts +85 -0
  181. package/dist/services/special-page.d.ts.map +1 -0
  182. package/dist/services/special-page.js +129 -0
  183. package/dist/services/special-page.js.map +1 -0
  184. package/dist/services/special-route.d.ts +92 -0
  185. package/dist/services/special-route.d.ts.map +1 -0
  186. package/dist/services/special-route.js +93 -0
  187. package/dist/services/special-route.js.map +1 -0
  188. package/dist/services/workflow-node-layout.d.ts +13 -1
  189. package/dist/services/workflow-node-layout.d.ts.map +1 -1
  190. package/dist/services/workflow-node-layout.js +11 -3
  191. package/dist/services/workflow-node-layout.js.map +1 -1
  192. package/package.json +1 -1
  193. package/skill-docs/SKILL.md +5 -5
  194. package/skill-docs/_catalog.md +1 -0
  195. package/skill-docs/actionflows/SKILL.md +5 -4
  196. package/skill-docs/actionflows/references/components/logic/MultipleExecution.md +38 -38
  197. package/skill-docs/actionflows/references/components/logic/Output.md +9 -2
  198. package/skill-docs/actionflows/references/components/message/SendMessage.md +3 -3
  199. package/skill-docs/actionflows/references/components/serverless/ServerlessAction.md +42 -0
  200. package/skill-docs/actionflows/references/components/trigger/WebHookTrigger.md +89 -0
  201. package/skill-docs/actionflows/references/dynamic_capability_matrix.md +2 -2
  202. package/skill-docs/references/common/ref-cli-commands.md +11 -3
  203. package/skill-docs/references/form/guide-form-association.md +1 -1
  204. package/skill-docs/references/form/guide-form-data.md +30 -0
  205. package/skill-docs/references/form/guide-form-layout-incremental.md +18 -3
  206. package/skill-docs/references/form/guide-form-linkage.md +2 -2
  207. package/skill-docs/references/form/guide-form-physical-table.md +146 -0
  208. package/skill-docs/references/form/ref-form-fields.md +1 -1
  209. package/skill-docs/references/hrm/guide-org-employee.md +71 -3
  210. package/skill-docs/references/report/cell-config-echo-guide.md +1 -1
  211. package/skill-docs/references/report/dataset-query-filter-guide.md +3 -3
  212. package/skill-docs/references/report/date-range-query-reference.md +2 -2
  213. package/skill-docs/references/report/query-condition-api-guide.md +11 -11
  214. package/skill-docs/references/report/report-designer-feature-map.md +1 -1
  215. package/skill-docs/references/report/report-permission-guide.md +2 -2
  216. package/skill-docs/references/workflow/guide-workflow-odoc-setting.md +6 -6
  217. package/skill-docs/references/workflow/guide-workflow.md +1 -1
@@ -0,0 +1,363 @@
1
+ /**
2
+ * 表单数据 OpenAPI —— 批量增改、按 ID 读(可带明细)、分页。
3
+ *
4
+ * ## 与 `form/core/saveFormData` 的关系
5
+ *
6
+ * 那一条(`commands/form-data.ts` 的 `data add` 在用)是**设计器保存**时打的:
7
+ * **一次一条、且只写主表**。这一族是独立的**表单数据 OpenAPI**,`datas` 是数组、
8
+ * 每条可带 `detail1/detail2…`,并且能按 ID 读回**含明细**的数据。
9
+ *
10
+ * | 用途 | 端点 |
11
+ * |---|---|
12
+ * | 批量新增 | `POST /api/ebuilder/form/dataset/v2/saveFormData` |
13
+ * | 修改 | `POST /api/ebuilder/form/dataset/v2/updateFormData` |
14
+ * | 详情(可带明细) | `POST /api/ebuilder/form/dataset/v2/getDataById` |
15
+ * | 分页(可带明细) | `POST /api/ebuilder/form/dataset/v2/getAllData` |
16
+ * | 主表/明细 ↔ 请求节点 | `GET /api/ebuilder/form/dataset/v1/getTableMapping` |
17
+ * | 字段定义 | `POST /api/ebuilder/common/ds/fields`(multipart) |
18
+ * | 选择类字段选项 | `GET /api/ebuilder/common/ds/options` |
19
+ *
20
+ * ## 四个静默坑(全部实测踩出来的)
21
+ *
22
+ * 1. **自定义字段的请求键必须用 `config.dataKey`,不能用 `name`。**
23
+ * 实测自定义字段的 `name` **就等于它的字段 id**,真实数据键在 `dataKey`。
24
+ * 用 `name` 平台**照样回成功、但值静默丢失** —— 最难发现的一种失败。
25
+ * 系统字段(`name`/`creator`/`data_status`…)反过来:`name` 即数据键、`dataKey` 为空。
26
+ * 2. **主表字段要包一层 `mainTable`**(不是平铺在 `datas[]` 那层),
27
+ * 否则平台回 `DataError:mainTable不能为空`。
28
+ * 3. **多值选择字段要发逗号串 `"1,3"`,不能发数组** ——
29
+ * 发数组会被按字符串逗号硬切,落库成 `"[1"` 和 `" 3]"` 两个垃圾选项。
30
+ * 4. **明细表的显示名要另外取一次**:`sourceType=FORM` 给的嵌套条目 `name` 是平台占位名
31
+ * (实测 `明细子表1`),只有 `sourceType=LOGIC` 才给真名(`物料明细`)。
32
+ *
33
+ * 另外:响应的外层 `code` 可能是 `undefined`,**判成功要看 `data.datajson.status` 与 `dataIds`**。
34
+ */
35
+ const TABLE_MAPPING_PATH = '/api/ebuilder/form/dataset/v1/getTableMapping';
36
+ const SAVE_DATA_PATH = '/api/ebuilder/form/dataset/v2/saveFormData';
37
+ const UPDATE_DATA_PATH = '/api/ebuilder/form/dataset/v2/updateFormData';
38
+ const GET_BY_ID_PATH = '/api/ebuilder/form/dataset/v2/getDataById';
39
+ const GET_ALL_DATA_PATH = '/api/ebuilder/form/dataset/v2/getAllData';
40
+ const DS_FIELDS_PATH = '/api/ebuilder/common/ds/fields';
41
+ const DS_OPTIONS_PATH = '/api/ebuilder/common/ds/options';
42
+ /** 选择类组件 —— 值要转成选项 id。 */
43
+ const OPTION_COMP_TYPES = new Set(['Select', 'RadioBox', 'CheckBox']);
44
+ function toFieldMeta(raw) {
45
+ return {
46
+ id: String(raw?.id ?? ''),
47
+ text: String(raw?.text ?? ''),
48
+ name: String(raw?.name ?? ''),
49
+ dataKey: String(raw?.config?.dataKey ?? ''),
50
+ compType: String(raw?.compType ?? raw?.type ?? ''),
51
+ type: String(raw?.type ?? ''),
52
+ multiSelect: raw?.multiSelect === true || String(raw?.multiSelect) === 'true',
53
+ };
54
+ }
55
+ /**
56
+ * 组装请求体里该用的字段键。
57
+ *
58
+ * ⚠ 这就是那个「静默丢值」的坑:自定义字段 `name === id`,必须改用 `dataKey`。
59
+ */
60
+ export function requestKeyOf(field) {
61
+ if (field.name === field.id && field.dataKey)
62
+ return field.dataKey;
63
+ return field.name || field.dataKey || field.id;
64
+ }
65
+ /** 调一次 `ds/fields`,摊平成一个分组里的全部字段(含嵌套的明细条目)。 */
66
+ async function callDsFields(client, baseUrl, appId, objId, sourceType) {
67
+ const form = new FormData();
68
+ for (const [k, v] of Object.entries({
69
+ groupId: sourceType === 'LOGIC' ? 'weaver-ebuilder-form-service' : String(appId),
70
+ sourceId: String(objId),
71
+ sourceType,
72
+ detailFieldsGroup: 'true',
73
+ enableMerge: 'true',
74
+ ...(sourceType === 'LOGIC' ? { needTableName: 'true' } : { customParam: '{"terminal":""}' }),
75
+ params: '[]',
76
+ }))
77
+ form.append(k, v);
78
+ const res = await client.postMultipart(`${baseUrl}${DS_FIELDS_PATH}`, form, { ebbusinessid: appId });
79
+ const groups = Array.isArray(res?.data) ? res.data : [];
80
+ return groups.flatMap((g) => (Array.isArray(g?.fields) ? g.fields : []));
81
+ }
82
+ /**
83
+ * 拉表单字段定义。明细表嵌套在主组的 `fields[]` 里(`isDetailtable:true`),明细字段在它的内层。
84
+ *
85
+ * ⚠ **明细表的显示名要另外取一次**:`sourceType=FORM` 返回的嵌套条目 `name` 是平台占位名
86
+ * (实测是 `明细子表1`),只有 `sourceType=LOGIC` 才给真名(`物料明细`)。
87
+ * 用户写数据时用的是真名,所以这里补一次 LOGIC 调用做 `subFormId → 显示名` 的映射;
88
+ * 补不上就退回 FORM 那个名字,不阻断。
89
+ */
90
+ export async function fetchFormSchema(client, baseUrl, appId, objId) {
91
+ const all = await callDsFields(client, baseUrl, appId, objId, 'FORM');
92
+ const nameBySubForm = new Map();
93
+ try {
94
+ for (const f of await callDsFields(client, baseUrl, appId, objId, 'LOGIC')) {
95
+ if (f?.isDetailtable && f?.name)
96
+ nameBySubForm.set(String(f.id ?? ''), String(f.name));
97
+ }
98
+ }
99
+ catch { /* 补名失败不阻断 —— 退回 FORM 的名字,用户仍可用 subFormId 指定 */ }
100
+ const main = [];
101
+ const details = [];
102
+ for (const f of all) {
103
+ if (f?.isDetailtable) {
104
+ const subFormId = String(f.id ?? '');
105
+ details.push({
106
+ subFormId,
107
+ name: nameBySubForm.get(subFormId) || String(f.name ?? ''),
108
+ fields: (Array.isArray(f.fields) ? f.fields : []).map(toFieldMeta),
109
+ });
110
+ }
111
+ else {
112
+ main.push(toFieldMeta(f));
113
+ }
114
+ }
115
+ return { main, details };
116
+ }
117
+ /** `mainTable` / `detailN` → subFormId(或主表标识)。 */
118
+ export async function fetchTableMapping(client, baseUrl, appId, objId) {
119
+ const res = await client.get(`${baseUrl}${TABLE_MAPPING_PATH}?objId=${encodeURIComponent(objId)}&reverse=false`, { ebbusinessid: appId });
120
+ const data = res?.data;
121
+ return data && typeof data === 'object' ? data : {};
122
+ }
123
+ /** `subFormId → detailN`(从 mapping 反推)。 */
124
+ export function detailNodeMap(mapping) {
125
+ const out = new Map();
126
+ for (const [node, subFormId] of Object.entries(mapping)) {
127
+ if (node !== 'mainTable')
128
+ out.set(String(subFormId), node);
129
+ }
130
+ return out;
131
+ }
132
+ export function makeOptionFetcher(client, baseUrl, appId, objId) {
133
+ const cache = new Map();
134
+ return async (field) => {
135
+ const hit = cache.get(field.id);
136
+ if (hit)
137
+ return hit;
138
+ const res = await client.get(`${baseUrl}${DS_OPTIONS_PATH}?fieldName=${encodeURIComponent(field.id)}&objId=${encodeURIComponent(objId)}`
139
+ + `&sourceType=FORM&groupId=${encodeURIComponent(appId)}&optionLevel=1`, { ebbusinessid: appId });
140
+ const rows = Array.isArray(res?.data) ? res.data : [];
141
+ const opts = rows.map((o) => ({ id: String(o?.id ?? ''), name: String(o?.name ?? '') }));
142
+ cache.set(field.id, opts);
143
+ return opts;
144
+ };
145
+ }
146
+ /** 在字段清单里按「显示名 → dataKey → name → id」找一个字段;重名/找不到都报错。 */
147
+ export function pickField(fields, key, where) {
148
+ const k = String(key);
149
+ for (const probe of [
150
+ (f) => f.text === k,
151
+ (f) => f.dataKey === k,
152
+ (f) => f.name === k,
153
+ (f) => f.id === k,
154
+ ]) {
155
+ const hits = fields.filter(probe);
156
+ if (hits.length > 1) {
157
+ throw new Error(`${where}里「${key}」匹配到 ${hits.length} 个字段,请改用更精确的名称`);
158
+ }
159
+ if (hits.length === 1)
160
+ return hits[0];
161
+ }
162
+ throw new Error(`${where}里没有字段「${key}」。可选:${fields.filter((f) => f.text).map((f) => f.text).join('、')}`);
163
+ }
164
+ /**
165
+ * 把一条用户数据(键用显示名)转成 `mainTable` / `detailN` 的请求体。
166
+ *
167
+ * 纯函数 —— 选项转换由 `fetchOptions` 注入,便于单测。
168
+ */
169
+ export async function buildOneData(row, schema, mapping, fetchOptions) {
170
+ const detailNodeOf = detailNodeMap(mapping);
171
+ // ⚠ 主表字段**要包一层 `mainTable`**(不是平铺在 datas[] 那层)——
172
+ // 平铺会被平台回 `DataError:mainTable不能为空`。
173
+ const mainObj = {};
174
+ const detailRows = new Map();
175
+ for (const [key, value] of Object.entries(row)) {
176
+ // 先看是不是「某张明细表」
177
+ const detail = schema.details.find((d) => d.name === key || d.subFormId === key);
178
+ if (detail) {
179
+ if (!Array.isArray(value))
180
+ throw new Error(`「${key}」是明细表,值必须是数组`);
181
+ const node = detailNodeOf.get(detail.subFormId);
182
+ if (!node) {
183
+ throw new Error(`明细表「${detail.name}」(${detail.subFormId}) 在 getTableMapping 里没有对应的请求节点`);
184
+ }
185
+ const built = [];
186
+ for (const [i, line] of value.entries()) {
187
+ built.push(await buildFields(line, detail.fields, fetchOptions, `明细「${detail.name}」第 ${i + 1} 行`));
188
+ }
189
+ detailRows.set(node, built);
190
+ continue;
191
+ }
192
+ // 其余按主表字段
193
+ const field = pickField(schema.main, key, '主表');
194
+ mainObj[requestKeyOf(field)] = await convertValue(field, value, fetchOptions);
195
+ }
196
+ const out = { mainTable: mainObj };
197
+ for (const [node, lines] of detailRows)
198
+ out[node] = lines;
199
+ return out;
200
+ }
201
+ /** 一组 字段-值 → 请求键值对(主表一行 / 明细一行共用)。 */
202
+ async function buildFields(row, fields, fetchOptions, where) {
203
+ const out = {};
204
+ for (const [key, value] of Object.entries(row)) {
205
+ const field = pickField(fields, key, where);
206
+ out[requestKeyOf(field)] = await convertValue(field, value, fetchOptions);
207
+ }
208
+ return out;
209
+ }
210
+ /** 选择类字段把「选项名或 id」换成选项 id;其余原样。 */
211
+ async function convertValue(field, value, fetchOptions) {
212
+ if (!OPTION_COMP_TYPES.has(field.compType))
213
+ return value;
214
+ const opts = await fetchOptions(field);
215
+ const toId = (v) => {
216
+ const s = String(v);
217
+ const hit = opts.find((o) => o.name === s || o.id === s);
218
+ if (!hit) {
219
+ throw new Error(`字段「${field.text}」没有选项「${v}」。可选:${opts.map((o) => o.name).join('、')}`);
220
+ }
221
+ return hit.id;
222
+ };
223
+ // ⚠ 多值**不能用数组**发:平台会把它当字符串按逗号硬切,
224
+ // 实测发 `["1","3"]` 落库成 `"[1"` 和 `" 3]"` 两个垃圾选项。
225
+ // 必须是逗号串 `"1,3"`。
226
+ return Array.isArray(value) ? value.map(toId).join(',') : toId(value);
227
+ }
228
+ function toWriteResult(res) {
229
+ const inner = res?.data?.datajson || {};
230
+ return {
231
+ dataIds: Array.isArray(inner.dataIds)
232
+ ? inner.dataIds.map((x) => String(x))
233
+ : String(inner.dataIds ?? '').split(',').filter(Boolean),
234
+ status: inner.status === true,
235
+ message: String(inner.message || res?.message?.msg || res?.msg || ''),
236
+ };
237
+ }
238
+ /**
239
+ * 批量新增。**一次请求带上全部行**(这正是 `dataset/v2` 的意义)。
240
+ *
241
+ * ⚠ 平台对单次条数有上限,超了可能只落一部分 —— 所以调用方必须拿 `dataIds.length`
242
+ * 跟预期条数比对,不能只看 HTTP 200。
243
+ */
244
+ export async function saveDataBatch(client, baseUrl, appId, objId, datas) {
245
+ const res = await client.post(`${baseUrl}${SAVE_DATA_PATH}`, {
246
+ datajson: {
247
+ header: { objId: String(objId) },
248
+ datas,
249
+ // 字段找不到时静默忽略(默认行为,显式写出来),且不触发数据动作 ——
250
+ // 初始化业务数据不该顺带把流程/动作跑起来。
251
+ operationinfo: { fieldNoFindIgnore: 'true', doAction: 'false' },
252
+ },
253
+ }, { ebbusinessid: appId });
254
+ return toWriteResult(res);
255
+ }
256
+ /**
257
+ * 按数据 ID 修改。`datas[].mainTable.id` 必填(走 `updateType=ids`)。
258
+ *
259
+ * @param detailMode `cover` = 覆盖对应明细表的全部行(`operateType:{detailN:'cover'}`);
260
+ * 不传 = 平台默认行为(追加式),**明细行只增不删**。
261
+ */
262
+ export async function updateDataBatch(client, baseUrl, appId, objId, datas, detailMode) {
263
+ const operateType = {};
264
+ if (detailMode === 'cover') {
265
+ for (const d of datas) {
266
+ for (const k of Object.keys(d))
267
+ if (k.startsWith('detail'))
268
+ operateType[k] = 'cover';
269
+ }
270
+ }
271
+ const res = await client.post(`${baseUrl}${UPDATE_DATA_PATH}`, {
272
+ datajson: {
273
+ header: { objId: String(objId) },
274
+ datas,
275
+ operationinfo: {
276
+ updateType: 'ids',
277
+ needAdd: 'false',
278
+ doAction: 'false',
279
+ fieldNoFindIgnore: 'false',
280
+ ...(detailMode === 'cover' ? { operateType } : {}),
281
+ },
282
+ },
283
+ }, { ebbusinessid: appId });
284
+ return toWriteResult(res);
285
+ }
286
+ function toRecord(row) {
287
+ const details = {};
288
+ for (const [k, v] of Object.entries(row || {})) {
289
+ if (k.startsWith('detail') && Array.isArray(v))
290
+ details[k] = v;
291
+ }
292
+ const mainTable = row?.mainTable || {};
293
+ return { id: String(mainTable?.id?.fieldValue ?? mainTable?.id ?? ''), mainTable, details };
294
+ }
295
+ /** 按数据 ID 读一条,可选带明细(`isReturnDetail`)。 */
296
+ export async function fetchDataById(client, baseUrl, appId, objId, dataId, opts = {}) {
297
+ const res = await client.post(`${baseUrl}${GET_BY_ID_PATH}`, {
298
+ datajson: {
299
+ header: { objId: String(objId) },
300
+ mainTable: { id: String(dataId) },
301
+ operationinfo: {
302
+ ...(opts.withDetail ? { isReturnDetail: 'y' } : {}),
303
+ fieldNoFindIgnore: 'false',
304
+ },
305
+ },
306
+ }, { ebbusinessid: appId });
307
+ const rows = res?.data?.datajson?.datas || [];
308
+ return rows.length ? toRecord(rows[0]) : null;
309
+ }
310
+ /** 按条件分页读(`mainTable` 里的多个条件之间是 AND)。 */
311
+ export async function fetchDataPage(client, baseUrl, appId, objId, opts = {}) {
312
+ const res = await client.post(`${baseUrl}${GET_ALL_DATA_PATH}`, {
313
+ datajson: {
314
+ header: { objId: String(objId) },
315
+ ...(opts.filter && Object.keys(opts.filter).length ? { mainTable: opts.filter } : {}),
316
+ pageInfo: { pageNo: opts.pageNo ?? 1, pageSize: opts.pageSize ?? 100 },
317
+ operationinfo: {
318
+ ...(opts.withDetail ? { isReturnDetail: 'y' } : {}),
319
+ fieldNoFindIgnore: 'false',
320
+ },
321
+ },
322
+ }, { ebbusinessid: appId });
323
+ const inner = res?.data?.datajson || {};
324
+ const rows = Array.isArray(inner.datas) ? inner.datas : [];
325
+ return {
326
+ records: rows.map(toRecord),
327
+ status: inner.status === true,
328
+ message: String(inner.message || res?.message?.msg || res?.msg || ''),
329
+ };
330
+ }
331
+ /**
332
+ * 把一条读回的记录摊平成「显示名 → 值」和「明细表名 → 行」。
333
+ *
334
+ * 读回的字段值是**带类型信息的对象**(`{fieldId, fieldType, fieldValue, fieldTextValue,
335
+ * fieldOptionId, fieldOptionName}`),单值字段是对象、多值/选择类字段是数组。
336
+ * 展示要挑真正带内容的那个键,不能直接当字符串用。
337
+ */
338
+ export function fieldValueOf(cell) {
339
+ if (cell === null || cell === undefined)
340
+ return '';
341
+ if (Array.isArray(cell))
342
+ return cell.map(fieldValueOf).filter(Boolean).join(',');
343
+ if (typeof cell !== 'object')
344
+ return String(cell);
345
+ for (const k of ['fieldValue', 'fieldTextValue', 'fieldOptionName', 'fieldOptionId']) {
346
+ const v = cell[k];
347
+ if (v !== undefined && v !== null && v !== '')
348
+ return String(v);
349
+ }
350
+ return '';
351
+ }
352
+ /** 记录 → `{ 显示名: 值 }`(主表)。 */
353
+ export function flattenMain(record, schema) {
354
+ const byKey = new Map();
355
+ for (const f of schema.main)
356
+ byKey.set(requestKeyOf(f), f);
357
+ const out = {};
358
+ for (const [k, v] of Object.entries(record.mainTable)) {
359
+ out[byKey.get(k)?.text || k] = fieldValueOf(v);
360
+ }
361
+ return out;
362
+ }
363
+ //# sourceMappingURL=form-data-openapi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-data-openapi.js","sourceRoot":"","sources":["../../src/services/form-data-openapi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import type { ApiClient } from '../core/client.js';
2
+ /**
3
+ * 「字段定义 → 平台 jsonObj」的构造器。
4
+ *
5
+ * **这是唯一一份**。`form add-field` 与按物理表加字段的命令(`form add-physical-field`)都走它 ——
6
+ * 此前这段逻辑内联在 `commands/form.ts` 的 add-field action 里(约 340 行),
7
+ * 一旦要出第二个入口就会变成两处真相,所以原样搬到这里,行为一字未改。
8
+ *
9
+ * 搬动时只做了三处**等价**改写:
10
+ * 1. `client/baseUrl/...` 改为从入参取(原来是闭包变量)
11
+ * 2. `auth.userId` / `auth.tenantKey` → 入参 `userId` / `tenantKey`
12
+ * 3. `console.error(...) + process.exit(1)` → `throw new Error(...)`,
13
+ * 由调用方接住后打印并 `process.exit(1)`。**库函数不该直接退进程。**
14
+ *
15
+ * 字段落点由 `formTableId` 决定:主表的 id = 主表;某张附属物理表的 id = 落到「字段管理 → 其他」
16
+ * 里那张表上。
17
+ */
18
+ /** 平台系统字段 id(非业务字段)。`defaultEBuilderDataTitle` 用来筛业务字段。 */
19
+ export declare const SYSTEM_FIELD_IDS: Set<string>;
20
+ export declare function defaultEBuilderDataTitle(fields: any[]): string;
21
+ /** add-field 的选项袋(与命令行的 `cmdOpts` 同形)。 */
22
+ export interface FieldBuildOptions {
23
+ sformId?: string;
24
+ dataTitle?: string;
25
+ formName?: string;
26
+ format?: string;
27
+ precision?: string;
28
+ browserType?: string;
29
+ browserFormSource?: string;
30
+ percent?: boolean;
31
+ default?: string;
32
+ subFormId?: string;
33
+ multiple?: boolean;
34
+ singleRow?: boolean;
35
+ minField?: string;
36
+ maxField?: string;
37
+ delimiter?: boolean;
38
+ capital?: boolean;
39
+ maxLen?: string;
40
+ optionTemplate?: string;
41
+ dataKey?: string;
42
+ columnName?: string;
43
+ desc?: string;
44
+ reinit?: boolean;
45
+ required?: boolean;
46
+ }
47
+ export interface FieldBuildContext {
48
+ client: ApiClient;
49
+ baseUrl: string;
50
+ appId: string;
51
+ objId: string;
52
+ userId: string;
53
+ tenantKey: string;
54
+ /** 已归一化的字段类型(调用方用 canonComponentKey 处理过)。 */
55
+ fieldType: string;
56
+ fieldName: string;
57
+ title?: string;
58
+ formId: string;
59
+ /** 字段落点:主表 id,或某张附属物理表的 formTableId。 */
60
+ formTableId: string;
61
+ fieldId: string;
62
+ /** DateRange / DateInterval 的起止字段 id。 */
63
+ startId: string;
64
+ endId: string;
65
+ dataKey: string;
66
+ columnName: string;
67
+ opts: FieldBuildOptions;
68
+ }
69
+ /** 构造字段的 jsonObj。致命错误一律抛出(不退出进程)。 */
70
+ export declare function buildFieldJsonObject(ctx: FieldBuildContext): Promise<Record<string, unknown>>;
71
+ //# sourceMappingURL=form-field-build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-field-build.d.ts","sourceRoot":"","sources":["../../src/services/form-field-build.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AASnD;;;;;;;;;;;;;;;GAeG;AAEH,2DAA2D;AAC3D,eAAO,MAAM,gBAAgB,aAK3B,CAAC;AAIH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,CAK9D;AAED,0CAA0C;AAC1C,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC7F,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACjD,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IACjG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAC9F,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAC9E,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtC;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,iBAAiB,CAAC;CACzB;AAED,qCAAqC;AACrC,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA6VnG"}