weaver-e10-builder 1.2.5 → 1.5.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 (230) hide show
  1. package/assets/org-employee-template.xlsx +0 -0
  2. package/dist/commands/form-add-physical-field.d.ts +3 -0
  3. package/dist/commands/form-add-physical-field.d.ts.map +1 -0
  4. package/dist/commands/form-add-physical-field.js +125 -0
  5. package/dist/commands/form-add-physical-field.js.map +1 -0
  6. package/dist/commands/form-button.d.ts.map +1 -1
  7. package/dist/commands/form-button.js +28 -5
  8. package/dist/commands/form-button.js.map +1 -1
  9. package/dist/commands/form-field-linkage.d.ts.map +1 -1
  10. package/dist/commands/form-field-linkage.js +27 -6
  11. package/dist/commands/form-field-linkage.js.map +1 -1
  12. package/dist/commands/form-formula-linkage.d.ts +3 -0
  13. package/dist/commands/form-formula-linkage.d.ts.map +1 -0
  14. package/dist/commands/form-formula-linkage.js +434 -0
  15. package/dist/commands/form-formula-linkage.js.map +1 -0
  16. package/dist/commands/form-formula.d.ts.map +1 -1
  17. package/dist/commands/form-formula.js +22 -3
  18. package/dist/commands/form-formula.js.map +1 -1
  19. package/dist/commands/form-list-click.d.ts.map +1 -1
  20. package/dist/commands/form-list-click.js +2 -1
  21. package/dist/commands/form-list-click.js.map +1 -1
  22. package/dist/commands/form-list-permission.js +1 -1
  23. package/dist/commands/form-list-permission.js.map +1 -1
  24. package/dist/commands/form-native.d.ts.map +1 -1
  25. package/dist/commands/form-native.js +11 -3
  26. package/dist/commands/form-native.js.map +1 -1
  27. package/dist/commands/form-physical-table.d.ts +3 -0
  28. package/dist/commands/form-physical-table.d.ts.map +1 -0
  29. package/dist/commands/form-physical-table.js +195 -0
  30. package/dist/commands/form-physical-table.js.map +1 -0
  31. package/dist/commands/form.d.ts.map +1 -1
  32. package/dist/commands/form.js +246 -549
  33. package/dist/commands/form.js.map +1 -1
  34. package/dist/commands/matrix.d.ts.map +1 -1
  35. package/dist/commands/matrix.js +175 -36
  36. package/dist/commands/matrix.js.map +1 -1
  37. package/dist/commands/org.d.ts +10 -0
  38. package/dist/commands/org.d.ts.map +1 -0
  39. package/dist/commands/org.js +402 -0
  40. package/dist/commands/org.js.map +1 -0
  41. package/dist/commands/role.d.ts.map +1 -1
  42. package/dist/commands/role.js +106 -62
  43. package/dist/commands/role.js.map +1 -1
  44. package/dist/commands/wf-form.d.ts.map +1 -1
  45. package/dist/commands/wf-form.js +501 -26
  46. package/dist/commands/wf-form.js.map +1 -1
  47. package/dist/commands/workflow-auth-resp.d.ts.map +1 -1
  48. package/dist/commands/workflow-auth-resp.js +53 -5
  49. package/dist/commands/workflow-auth-resp.js.map +1 -1
  50. package/dist/commands/workflow-create-auth-resp.d.ts.map +1 -1
  51. package/dist/commands/workflow-create-auth-resp.js +5 -1
  52. package/dist/commands/workflow-create-auth-resp.js.map +1 -1
  53. package/dist/commands/workflow-operator-sign.js +1 -1
  54. package/dist/commands/workflow-operator-sign.js.map +1 -1
  55. package/dist/commands/workflow.d.ts.map +1 -1
  56. package/dist/commands/workflow.js +78 -9
  57. package/dist/commands/workflow.js.map +1 -1
  58. package/dist/index.js +8 -0
  59. package/dist/index.js.map +1 -1
  60. package/dist/services/action-detail.d.ts.map +1 -1
  61. package/dist/services/action-detail.js +5 -4
  62. package/dist/services/action-detail.js.map +1 -1
  63. package/dist/services/actionflow/components/action_eb_update_compiler.d.ts.map +1 -1
  64. package/dist/services/actionflow/components/action_eb_update_compiler.js +22 -7
  65. package/dist/services/actionflow/components/action_eb_update_compiler.js.map +1 -1
  66. package/dist/services/actionflow/components/approve_create.d.ts.map +1 -1
  67. package/dist/services/actionflow/components/approve_create.js +6 -3
  68. package/dist/services/actionflow/components/approve_create.js.map +1 -1
  69. package/dist/services/actionflow/components/custom_set_form.d.ts.map +1 -1
  70. package/dist/services/actionflow/components/custom_set_form.js +35 -1
  71. package/dist/services/actionflow/components/custom_set_form.js.map +1 -1
  72. package/dist/services/actionflow/components/custom_trigger.d.ts.map +1 -1
  73. package/dist/services/actionflow/components/custom_trigger.js +4 -1
  74. package/dist/services/actionflow/components/custom_trigger.js.map +1 -1
  75. package/dist/services/actionflow/components/dml_execute.d.ts.map +1 -1
  76. package/dist/services/actionflow/components/dml_execute.js +7 -3
  77. package/dist/services/actionflow/components/dml_execute.js.map +1 -1
  78. package/dist/services/actionflow/components/document_actions.d.ts.map +1 -1
  79. package/dist/services/actionflow/components/document_actions.js +7 -3
  80. package/dist/services/actionflow/components/document_actions.js.map +1 -1
  81. package/dist/services/actionflow/components/hrm_actions.d.ts.map +1 -1
  82. package/dist/services/actionflow/components/hrm_actions.js +7 -3
  83. package/dist/services/actionflow/components/hrm_actions.js.map +1 -1
  84. package/dist/services/actionflow/components/multiple_execution.d.ts.map +1 -1
  85. package/dist/services/actionflow/components/multiple_execution.js +14 -5
  86. package/dist/services/actionflow/components/multiple_execution.js.map +1 -1
  87. package/dist/services/actionflow/components/output.js +1 -1
  88. package/dist/services/actionflow/components/output.js.map +1 -1
  89. package/dist/services/actionflow/components/send_message.js +2 -2
  90. package/dist/services/actionflow/components/send_message.js.map +1 -1
  91. package/dist/services/actionflow/components/workflow_actions.d.ts.map +1 -1
  92. package/dist/services/actionflow/components/workflow_actions.js +7 -3
  93. package/dist/services/actionflow/components/workflow_actions.js.map +1 -1
  94. package/dist/services/actionflow/context_preflight.d.ts.map +1 -1
  95. package/dist/services/actionflow/context_preflight.js +12 -2
  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 +21 -2
  99. package/dist/services/actionflow/context_provider.js.map +1 -1
  100. package/dist/services/actionflow/custom_trigger_context.d.ts +10 -0
  101. package/dist/services/actionflow/custom_trigger_context.d.ts.map +1 -0
  102. package/dist/services/actionflow/custom_trigger_context.js +46 -0
  103. package/dist/services/actionflow/custom_trigger_context.js.map +1 -0
  104. package/dist/services/actionflow/filter_rules.js +2 -2
  105. package/dist/services/actionflow/filter_rules.js.map +1 -1
  106. package/dist/services/actionflow/formula_service.d.ts +9 -1
  107. package/dist/services/actionflow/formula_service.d.ts.map +1 -1
  108. package/dist/services/actionflow/formula_service.js +59 -21
  109. package/dist/services/actionflow/formula_service.js.map +1 -1
  110. package/dist/services/actionflow/id_generator.d.ts +2 -0
  111. package/dist/services/actionflow/id_generator.d.ts.map +1 -1
  112. package/dist/services/actionflow/id_generator.js +13 -0
  113. package/dist/services/actionflow/id_generator.js.map +1 -1
  114. package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
  115. package/dist/services/actionflow/preflight_service.js +6 -1
  116. package/dist/services/actionflow/preflight_service.js.map +1 -1
  117. package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
  118. package/dist/services/actionflow/workflow_compiler.js +89 -35
  119. package/dist/services/actionflow/workflow_compiler.js.map +1 -1
  120. package/dist/services/auth-resp-condition.d.ts +35 -0
  121. package/dist/services/auth-resp-condition.d.ts.map +1 -0
  122. package/dist/services/auth-resp-condition.js +111 -0
  123. package/dist/services/auth-resp-condition.js.map +1 -0
  124. package/dist/services/condition-rules.d.ts.map +1 -1
  125. package/dist/services/condition-rules.js +4 -1
  126. package/dist/services/condition-rules.js.map +1 -1
  127. package/dist/services/esb-interface/document-parser.d.ts.map +1 -1
  128. package/dist/services/esb-interface/document-parser.js +62 -5
  129. package/dist/services/esb-interface/document-parser.js.map +1 -1
  130. package/dist/services/form-association.d.ts +19 -0
  131. package/dist/services/form-association.d.ts.map +1 -1
  132. package/dist/services/form-association.js +64 -0
  133. package/dist/services/form-association.js.map +1 -1
  134. package/dist/services/form-button-action.d.ts +7 -0
  135. package/dist/services/form-button-action.d.ts.map +1 -1
  136. package/dist/services/form-button-action.js +11 -1
  137. package/dist/services/form-button-action.js.map +1 -1
  138. package/dist/services/form-create.d.ts +4 -0
  139. package/dist/services/form-create.d.ts.map +1 -1
  140. package/dist/services/form-create.js +18 -12
  141. package/dist/services/form-create.js.map +1 -1
  142. package/dist/services/form-field-build.d.ts +71 -0
  143. package/dist/services/form-field-build.d.ts.map +1 -0
  144. package/dist/services/form-field-build.js +436 -0
  145. package/dist/services/form-field-build.js.map +1 -0
  146. package/dist/services/form-field-patch.d.ts +3 -1
  147. package/dist/services/form-field-patch.d.ts.map +1 -1
  148. package/dist/services/form-field-patch.js +23 -9
  149. package/dist/services/form-field-patch.js.map +1 -1
  150. package/dist/services/form-formula-linkage.d.ts +349 -0
  151. package/dist/services/form-formula-linkage.d.ts.map +1 -0
  152. package/dist/services/form-formula-linkage.js +546 -0
  153. package/dist/services/form-formula-linkage.js.map +1 -0
  154. package/dist/services/form-layout-insert.d.ts +84 -0
  155. package/dist/services/form-layout-insert.d.ts.map +1 -0
  156. package/dist/services/form-layout-insert.js +244 -0
  157. package/dist/services/form-layout-insert.js.map +1 -0
  158. package/dist/services/form-linkage-condition.d.ts +159 -0
  159. package/dist/services/form-linkage-condition.d.ts.map +1 -0
  160. package/dist/services/form-linkage-condition.js +307 -0
  161. package/dist/services/form-linkage-condition.js.map +1 -0
  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/formula-detail.d.ts +98 -6
  167. package/dist/services/formula-detail.d.ts.map +1 -1
  168. package/dist/services/formula-detail.js +208 -26
  169. package/dist/services/formula-detail.js.map +1 -1
  170. package/dist/services/matrix-rows.d.ts +43 -0
  171. package/dist/services/matrix-rows.d.ts.map +1 -0
  172. package/dist/services/matrix-rows.js +104 -0
  173. package/dist/services/matrix-rows.js.map +1 -0
  174. package/dist/services/org-department.d.ts +114 -0
  175. package/dist/services/org-department.d.ts.map +1 -0
  176. package/dist/services/org-department.js +209 -0
  177. package/dist/services/org-department.js.map +1 -0
  178. package/dist/services/org-employee.d.ts +191 -0
  179. package/dist/services/org-employee.d.ts.map +1 -0
  180. package/dist/services/org-employee.js +400 -0
  181. package/dist/services/org-employee.js.map +1 -0
  182. package/dist/services/role-member.d.ts +99 -0
  183. package/dist/services/role-member.d.ts.map +1 -0
  184. package/dist/services/role-member.js +206 -0
  185. package/dist/services/role-member.js.map +1 -0
  186. package/dist/services/workflow-info.d.ts +83 -0
  187. package/dist/services/workflow-info.d.ts.map +1 -0
  188. package/dist/services/workflow-info.js +97 -0
  189. package/dist/services/workflow-info.js.map +1 -0
  190. package/dist/services/workflow-odoc-setting.d.ts +1 -1
  191. package/dist/services/workflow-odoc-setting.d.ts.map +1 -1
  192. package/dist/services/workflow-odoc-setting.js +15 -6
  193. package/dist/services/workflow-odoc-setting.js.map +1 -1
  194. package/dist/utils/column-name.d.ts +24 -0
  195. package/dist/utils/column-name.d.ts.map +1 -1
  196. package/dist/utils/column-name.js +16 -0
  197. package/dist/utils/column-name.js.map +1 -1
  198. package/ecodecmd/package.json +1 -2
  199. package/ecodecmd/src/loaddep.js +19 -9
  200. package/package.json +4 -4
  201. package/skill-docs/SKILL.md +13 -9
  202. package/skill-docs/_catalog.md +86 -81
  203. package/skill-docs/actionflows/SKILL.md +173 -170
  204. package/skill-docs/actionflows/references/components/logic/Output.md +1 -1
  205. package/skill-docs/actionflows/references/components/trigger/CustomTrigger.md +32 -0
  206. package/skill-docs/actionflows/references/components/workflow/ApproveCreate.md +1 -1
  207. package/skill-docs/references/common/guide-plan-template.md +9 -3
  208. package/skill-docs/references/common/ref-cli-commands.md +54 -23
  209. package/skill-docs/references/esb-interface/guide-import.md +4 -1
  210. package/skill-docs/references/form/guide-create-form.md +13 -0
  211. package/skill-docs/references/form/guide-field-linkage.md +2 -0
  212. package/skill-docs/references/form/guide-form-association.md +1 -1
  213. package/skill-docs/references/form/guide-form-formula-functions.md +36 -0
  214. package/skill-docs/references/form/guide-form-layout-incremental.md +75 -0
  215. package/skill-docs/references/form/guide-form-linkage.md +62 -4
  216. package/skill-docs/references/form/guide-form-physical-table.md +146 -0
  217. package/skill-docs/references/form/guide-formula-linkage.md +250 -0
  218. package/skill-docs/references/form/ref-form-fields.md +6 -0
  219. package/skill-docs/references/hrm/guide-matrix.md +79 -16
  220. package/skill-docs/references/hrm/guide-org-employee.md +124 -0
  221. package/skill-docs/references/report/cell-config-echo-guide.md +1 -1
  222. package/skill-docs/references/report/dataset-query-filter-guide.md +3 -3
  223. package/skill-docs/references/report/date-range-query-reference.md +2 -2
  224. package/skill-docs/references/report/query-condition-api-guide.md +11 -11
  225. package/skill-docs/references/report/report-designer-feature-map.md +1 -1
  226. package/skill-docs/references/report/report-permission-guide.md +2 -2
  227. package/skill-docs/references/workflow/guide-workflow-auth-resp.md +48 -22
  228. package/skill-docs/references/workflow/guide-workflow-odoc-setting.md +248 -0
  229. package/skill-docs/references/workflow/guide-workflow-odoc.md +23 -51
  230. package/skill-docs/references/workflow/guide-workflow.md +1 -1
@@ -0,0 +1,307 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { findWorkflowRow } from './workflow-info.js';
3
+ const MODULE = 'ebuilderform';
4
+ const ADD_PATH = '/api/ebuilder/form/form/setting/viewlinkage/add';
5
+ /** 平台认的条件算子。`NULL`/`NOT_NULL` 即「为空」/「不为空」。 */
6
+ export const KNOWN_OPERATORS = [
7
+ 'EQUAL', 'NOT_EQUAL', 'CONTAIN', 'NOT_CONTAIN',
8
+ 'GREATER', 'LESS', 'GREATER_EQUAL', 'LESS_EQUAL',
9
+ 'NULL', 'NOT_NULL',
10
+ ];
11
+ /**
12
+ * 常见等价写法 → 平台码。
13
+ *
14
+ * 收的是**别人真的会写**的那些:`EMPTY`/`IS_NULL` 是「为空」最自然的写法(也是我们
15
+ * 文档曾经写的),符号写法是随手写。归一之后才不会因为一个词的差别炸在写库上。
16
+ */
17
+ const OPERATOR_ALIAS = {
18
+ '=': 'EQUAL', '==': 'EQUAL', '!=': 'NOT_EQUAL', '<>': 'NOT_EQUAL',
19
+ EMPTY: 'NULL', IS_NULL: 'NULL', ISNULL: 'NULL', NULL: 'NULL', '为空': 'NULL',
20
+ NOT_EMPTY: 'NOT_NULL', IS_NOT_NULL: 'NOT_NULL', ISNOTNULL: 'NOT_NULL',
21
+ NOT_NULL: 'NOT_NULL', '不为空': 'NOT_NULL', NONEMPTY: 'NOT_NULL',
22
+ };
23
+ /** 不带右值的算子:**不能**带 `sourceContent`。 */
24
+ const NO_VALUE_OPERATORS = new Set(['NULL', 'NOT_NULL']);
25
+ /** 归一算子码;未知的原样返回(交给平台判,但调用方应当据此告警)。 */
26
+ export function normalizeOperator(operator) {
27
+ const raw = String(operator ?? '').trim();
28
+ if (!raw)
29
+ return 'EQUAL';
30
+ return OPERATOR_ALIAS[raw.toUpperCase()] || raw.toUpperCase();
31
+ }
32
+ /** 该算子是否需要比较值。 */
33
+ export function operatorTakesValue(code) {
34
+ return !NO_VALUE_OPERATORS.has(code);
35
+ }
36
+ /**
37
+ * 造一条 `conditionDetails`。**纯函数**。
38
+ *
39
+ * 为空/不为空**不带 `sourceContent`**;其余算子一定带(值缺省写空串而不是省略键 ——
40
+ * 省略键会让平台在写库时缺列)。
41
+ */
42
+ export function buildConditionDetail(cond) {
43
+ const code = normalizeOperator(cond.operator);
44
+ const warnings = [];
45
+ const detail = {
46
+ targetId: String(cond.fieldId), // 平台这里要字符串;数字雪花过 JSON 会丢精度
47
+ detailSymbol: code,
48
+ sourceType: 'CONSTANT',
49
+ };
50
+ if (!KNOWN_OPERATORS.includes(code)) {
51
+ warnings.push(`未知的条件算子 "${cond.operator}",按原值提交;平台支持:${KNOWN_OPERATORS.join(' / ')}`);
52
+ }
53
+ if (!operatorTakesValue(code)) {
54
+ if (cond.value !== undefined || (Array.isArray(cond.options) && cond.options.length)) {
55
+ warnings.push(`算子 ${code}(为空/不为空)不带比较值,已忽略给的 value/options`);
56
+ }
57
+ return { detail, warnings };
58
+ }
59
+ detail.sourceContent = JSON.stringify({
60
+ formField: { id: String(cond.fieldId) },
61
+ ...(cond.options ? { dataOptions: cond.options } : { content: String(cond.value ?? '') }),
62
+ });
63
+ return { detail, warnings };
64
+ }
65
+ /** 多条件之间的关系。界面上的「任一」= `OR`、「全部」= `AND`。 */
66
+ export const DETAIL_TYPES = ['AND', 'OR'];
67
+ /** 拼 `viewlinkage/add` 的报文。**纯函数**,便于对照设计器实际发出的形状。 */
68
+ export function buildLinkageAddPayload(input) {
69
+ const warnings = [];
70
+ const effect = input.effect || {
71
+ effectType: 'form', effectName: '当前表单', effectValue: input.formId,
72
+ };
73
+ if (input.detailType && !DETAIL_TYPES.includes(String(input.detailType).toUpperCase())) {
74
+ warnings.push(`detailType「${input.detailType}」不是平台取值(${DETAIL_TYPES.join(' / ')}),按原值提交`);
75
+ }
76
+ const conditionDetails = input.conditions.map((c) => {
77
+ const { detail, warnings: w } = buildConditionDetail(c);
78
+ warnings.push(...w);
79
+ return detail;
80
+ });
81
+ const payload = {
82
+ fdEffect: {
83
+ formId: input.formId,
84
+ effectModule: MODULE,
85
+ effectType: effect.effectType,
86
+ effectName: effect.effectName,
87
+ optionList: [{
88
+ effectValue: effect.effectValue,
89
+ effectName: effect.optionName || effect.effectName,
90
+ }],
91
+ },
92
+ condition: {
93
+ targetId: input.formId,
94
+ targetName: input.formName || '表单',
95
+ targetModule: MODULE,
96
+ conditionType: 'FIELD',
97
+ ...(input.detailType ? { detailType: input.detailType } : {}),
98
+ conditionDetails,
99
+ formulaId: '',
100
+ formulaName: '',
101
+ },
102
+ linkageDetails: input.actions.map((a) => ({
103
+ formId: input.formId,
104
+ id: '0',
105
+ linkageObj: 'field',
106
+ linkageProp: a.prop,
107
+ linkageShowValue: a.fields.map((f) => ({
108
+ dataKey: f.dataKey || '',
109
+ groupName: '表单字段',
110
+ address: f.isDetail ? '明细表' : '主表',
111
+ addressType: f.isDetail ? 'detail' : 'form',
112
+ groupId: 'formField',
113
+ name: f.name,
114
+ descType: f.fieldType || '',
115
+ id: String(f.fieldId),
116
+ content: f.name,
117
+ desc: f.desc || '',
118
+ })),
119
+ detailOptions: [],
120
+ })),
121
+ module: MODULE,
122
+ formId: input.formId,
123
+ refId: input.formId,
124
+ enableState: '1',
125
+ linkageName: input.name,
126
+ customParam: { appId: input.appId, objId: input.objId },
127
+ };
128
+ return { payload, warnings };
129
+ }
130
+ /**
131
+ * 把 `config.effect` 的写法解析成完整的生效维度。三种写法:
132
+ *
133
+ * - **不给** → 当前表单(最常见)
134
+ * - **`"formLayout"`** → 「表单布局」维度,布局 id 现查;⚠ 取的是 **`multipleLayoutId`**,
135
+ * 不是 `formLayout.id`(同一张表上这两个值相邻但不同,发错不报错、只是指向别的布局)
136
+ * - **对象** → 原样使用,只补缺省
137
+ */
138
+ export async function resolveEffect(client, baseUrl, formId, formName, effect) {
139
+ const currentForm = {
140
+ effectType: 'form', effectName: '当前表单', effectValue: formId,
141
+ };
142
+ if (effect === undefined || effect === null || effect === '')
143
+ return currentForm;
144
+ if (typeof effect === 'string') {
145
+ const key = effect.trim();
146
+ if (key === 'form' || key === '当前表单')
147
+ return currentForm;
148
+ if (key === 'formLayout' || key === '表单布局') {
149
+ const lay = await client.post(`${baseUrl}/api/ebuilder/form/builder/getFormLayout`, {
150
+ formId, module: MODULE, customParam: {}, formTableIdList: [],
151
+ designerParam: { onlyLayout: false, convert: false }, form: { id: formId },
152
+ }, { ebbusinessid: formId });
153
+ // ⚠ 要的是 **multipleLayoutId**,不是 formLayout.id。同一张表上这两个值**相邻但不同**
154
+ // (实测某表 1316387710787854375 / …376),设计器发的是后者。发错不报错,
155
+ // 只是指向另一个布局,而且平台按它解析不出名字 → 回读的生效范围是个空白。
156
+ const layoutId = String(lay?.data?.formLayout?.multipleLayoutId || lay?.data?.formLayoutMultiple?.id || '');
157
+ if (!layoutId) {
158
+ throw new Error('取不到表单的布局 id,无法把生效维度设为「表单布局」'
159
+ + `(${lay?.msg || 'getFormLayout 未返回 multipleLayoutId'})`);
160
+ }
161
+ return {
162
+ effectType: 'formLayout', effectName: '表单布局', effectValue: layoutId,
163
+ };
164
+ }
165
+ throw new Error(`未知的生效维度「${effect}」。可用:form(当前表单)、formLayout(表单布局),`
166
+ + '或直接给一个 {effectType, effectName, effectValue} 对象');
167
+ }
168
+ if (!effect.effectType || !effect.effectValue) {
169
+ throw new Error('effect 对象至少要有 effectType 与 effectValue');
170
+ }
171
+ return {
172
+ effectType: String(effect.effectType),
173
+ effectName: String(effect.effectName || effect.effectType),
174
+ effectValue: String(effect.effectValue),
175
+ optionName: effect.optionName,
176
+ };
177
+ }
178
+ /**
179
+ * 「当前工作流」维度的选项显示名:**流程名 + `【V{活动版本号}】`**。
180
+ *
181
+ * 这不是拼着好看的 —— 设计器发的就是这个形状(流程叫 `11111`、报文里是 `11111【V1】`),
182
+ * 版本号取自流程的活动版本。取不到版本号时退回纯流程名,不编一个版本上去。
183
+ */
184
+ export function workflowEffectName(name, activeVersionId) {
185
+ const base = String(name || '').trim();
186
+ const ver = activeVersionId === undefined || activeVersionId === null || activeVersionId === ''
187
+ ? '' : String(activeVersionId);
188
+ return ver ? `${base}【V${ver}】` : base;
189
+ }
190
+ /** 从 `quickBuild/getAllVersionInfo` 的返回里挑出活动版本的 versionId。 */
191
+ export function activeVersionIdOf(versionRows) {
192
+ const rows = Array.isArray(versionRows) ? versionRows : [];
193
+ const active = rows.find((v) => v?.isActive === true || v?.isActive === 'true');
194
+ return String(active?.versionId ?? '');
195
+ }
196
+ /**
197
+ * **流程表单那条路由**的生效维度(四种)。从 `wf-form linkage` 的 action 里搬出来的 ——
198
+ * 函数联动同样要这四种,别再内联第二份。
199
+ *
200
+ * | 维度 | effectType | 取值 | 选项名 |
201
+ * |---|---|---|---|
202
+ * | 当前表单(缺省) | `form` | formId | `当前表单` |
203
+ * | 表单布局 | `formLayout` | `formLayoutMultiple.id` | 布局名 |
204
+ * | 当前工作流 | `workFlow` | workflowId | `流程名【V活动版本号】` |
205
+ * | 选择节点 | `includeNode` | nodeId | 节点名 |
206
+ *
207
+ * ⚠ 返回的 `refId` 是**这条联动挂在谁身上**,在这条路由上就是**流程 ID**;它**不等于**
208
+ * `optionList[0].effectValue` —— 选「选择节点」时取值是节点 ID,`refId` 仍是流程 ID。别照着取值抄。
209
+ */
210
+ export async function resolveWorkflowEffect(client, baseUrl, ctx) {
211
+ const { formId } = ctx;
212
+ const workflowId = String(ctx.workflowId || '');
213
+ const key = String(ctx.dimension || '').trim();
214
+ const ebb = { ebbusinessid: formId };
215
+ const refId = workflowId || formId;
216
+ if (key === 'includeNode' || key === '选择节点') {
217
+ if (!workflowId) {
218
+ throw new Error('生效维度选「选择节点」时必须给 --workflow-id(要按它列节点,refId 也是它)');
219
+ }
220
+ const nodeKey = String(ctx.nodeKey || '').trim();
221
+ if (!nodeKey)
222
+ throw new Error('生效维度选「选择节点」时要在 config 里给 "nodeId"(或 "node" 写节点名)');
223
+ // 用 getNodeEditTable(与 `workflow nodes --mode list` 同一个),不是 getWorkflowNodesByWorkflowId
224
+ // —— 后者对刚建的流程回空,拿它查节点会全部找不到。
225
+ const meta = await client.get(`${baseUrl}/api/bs/workflow/pathdef/nodeBase/getNodeEditTable?workflowId=${workflowId}`);
226
+ const nodes = meta?.data?.data || [];
227
+ const hit = (Array.isArray(nodes) ? nodes : [])
228
+ .find((n) => String(n.id) === nodeKey || n.nodeName === nodeKey);
229
+ if (!hit) {
230
+ throw new Error(`在该流程里找不到节点「${nodeKey}」。用 \`workflow nodes ${workflowId} --mode list\` 看节点清单`);
231
+ }
232
+ return {
233
+ refId,
234
+ effect: {
235
+ effectType: 'includeNode', effectName: '选择节点',
236
+ effectValue: String(hit.id), optionName: String(hit.nodeName || hit.id),
237
+ },
238
+ };
239
+ }
240
+ if (key === 'formLayout' || key === '表单布局') {
241
+ const wantLayout = String(ctx.layoutId || '');
242
+ const layBody = {
243
+ formId, module: ctx.module, customParam: {}, formTableIdList: [],
244
+ designerParam: { onlyLayout: false, convert: false }, form: { id: formId },
245
+ };
246
+ if (wantLayout)
247
+ layBody.layoutMultiId = wantLayout;
248
+ const lay = await client.post(`${baseUrl}${ctx.route}/builder/getFormLayout`, layBody, ebb);
249
+ const flm = lay?.data?.formLayoutMultiple || {};
250
+ const layoutId = String(flm.id || '');
251
+ if (!layoutId) {
252
+ throw new Error('取不到该流程表单的布局,无法把生效维度设为「表单布局」'
253
+ + `(${lay?.msg || 'getFormLayout 未返回 formLayoutMultiple.id'})`);
254
+ }
255
+ return {
256
+ refId,
257
+ effect: { effectType: 'formLayout', effectName: '表单布局', effectValue: layoutId, optionName: String(flm.name || '') },
258
+ };
259
+ }
260
+ if (key === 'workFlow' || key === '当前工作流') {
261
+ if (!workflowId) {
262
+ throw new Error('生效维度选「当前工作流」时必须给 --workflow-id(该维度的取值和 refId 都是流程 ID)。'
263
+ + '流程 ID 用 `workflow search --name <流程名>` 拿');
264
+ }
265
+ // 选项显示名带活动版本号,照设计器发出去的形状
266
+ const [wfRow, versions] = await Promise.all([
267
+ findWorkflowRow(client, baseUrl, workflowId),
268
+ client.get(`${baseUrl}/api/bs/workflow/pathdef/quickBuild/getAllVersionInfo?workflowId=${workflowId}`),
269
+ ]);
270
+ const optName = workflowEffectName(String(wfRow?.workflowName || ''), activeVersionIdOf(versions?.data));
271
+ return {
272
+ refId,
273
+ effect: { effectType: 'workFlow', effectName: '当前工作流', effectValue: workflowId, optionName: optName },
274
+ };
275
+ }
276
+ return {
277
+ refId,
278
+ effect: { effectType: 'form', effectName: '当前表单', effectValue: formId, optionName: '当前表单' },
279
+ };
280
+ }
281
+ /**
282
+ * 读 `--config`:`@` 开头当文件路径(UTF-8),否则当内联 JSON。
283
+ *
284
+ * 两个联动命令(eb 表 `form linkage add` 与工作流 `wf-form linkage`)共用 ——
285
+ * 前者支持 `@文件` 而后者不支持过,同一个 `--config` 两种行为,用起来会莫名其妙。
286
+ */
287
+ export function readLinkageConfig(input) {
288
+ let raw = String(input ?? '');
289
+ if (raw.startsWith('@')) {
290
+ const filePath = raw.slice(1);
291
+ if (!existsSync(filePath)) {
292
+ throw new Error(`配置文件不存在: ${filePath}`);
293
+ }
294
+ raw = readFileSync(filePath, 'utf-8');
295
+ }
296
+ try {
297
+ return JSON.parse(raw);
298
+ }
299
+ catch (e) {
300
+ throw new Error(`config JSON 解析失败: ${e.message}`);
301
+ }
302
+ }
303
+ /** 提交 `viewlinkage/add`。 */
304
+ export async function addLinkage(client, baseUrl, appId, formId, payload) {
305
+ return client.post(`${baseUrl}${ADD_PATH}?apid=${appId}`, payload, { ebbusinessid: formId });
306
+ }
307
+ //# sourceMappingURL=form-linkage-condition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-linkage-condition.js","sourceRoot":"","sources":["../../src/services/form-linkage-condition.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ import type { ApiClient } from '../core/client.js';
2
+ /**
3
+ * 多物理表 —— 一个表单的字段分散在多张物理表上(字段数过多时的容量兜底)。
4
+ *
5
+ * 设计器里的落点是「字段管理 → **其他**」页签,与「主表」「明细表」并列。
6
+ *
7
+ * ## 与「明细表」是两根轴,别混
8
+ *
9
+ * | | 明细表(`form add-detail-table`) | **物理表(本文件)** |
10
+ * |---|---|---|
11
+ * | 建表端点 | `saveSubForm` | **`saveFormTable`** |
12
+ * | 标志 | `isSubForm: true` | **`isSubForm: false`** |
13
+ * | `tableType` | `MAIN` | **`SUBSIDIARY`** |
14
+ * | 语义 | 一对多业务建模 | 一个表单自己的字段拆到多张表 |
15
+ *
16
+ * ## ⚠ `id` 这个键在 `saveFormTable` 里是**表 id**
17
+ *
18
+ * 改名时传 `formTable.id` = 表记录 id;建档时不传,由平台分配。
19
+ * (对比:`batch/save/formField` 的 `formTableList[].id` 是 **formId**、`.formTableId` 才是表 id ——
20
+ * 那条路本 CLI 不再走,见下。)
21
+ *
22
+ * ## 往表里加字段**不在本文件**
23
+ *
24
+ * 加字段走 `form add-physical-field` → `services/form-field-build.ts`,机制是
25
+ * `saveFormFieldNew` + jsonObj 里的 `formTableId`。
26
+ *
27
+ * 曾经这里还有一条「建表时用 `batch/save/formField` + `formTableList` 连字段一起建、并靠改
28
+ * `formTableId` 搬字段」的路,**两个原因废弃**:
29
+ * 1. 改已有字段的 formTableId 被平台明确拒绝:`此字段不属于当前物理表,不能更改位置`
30
+ * 2. 那条路对形状不全的字段会**回 200 却静默不落库**(实测 DateTime / Attachment 等就中招)
31
+ *
32
+ * ## 抓包来源
33
+ *
34
+ * 2026-10-08,mulinquan app `1320953875231211521` / 表单 objId `1320953905305272320`,
35
+ * 以及自建临时表单上的实机验证(建表/改名/删表/加字段全通)。
36
+ */
37
+ export declare const FIELD_MANAGE = "/api/ebuilder/form/form/field/manage";
38
+ /** 附属物理表的 `tableType`。主物理表是 `MAIN`。 */
39
+ export declare const SUB_TABLE_TYPE = "SUBSIDIARY";
40
+ /** 一张物理表的标识。`formTableId` 是**表记录 id**,不是 formId。 */
41
+ export interface FormTableRef {
42
+ formTableId: string;
43
+ /** 显示名,设计器里那排 chip 上的字(如「物理表1」)。 */
44
+ name: string;
45
+ /** 数据库表名(如 `uf_ryxxb_6_1`)。 */
46
+ tableName: string;
47
+ }
48
+ interface Scope {
49
+ formId: string;
50
+ appId: string;
51
+ objId: string;
52
+ }
53
+ /** 建表 / 改名共用的报文。**带 `formTableId` 就是改名,不带就是新建。** */
54
+ export declare function buildSaveFormTablePayload(scope: Scope, table: {
55
+ name: string;
56
+ tableName: string;
57
+ formTableId?: string;
58
+ }): any;
59
+ /** 删表报文。`ids` 是**表 id** 的数组,不是 formId。 */
60
+ export declare function buildDeleteFormTablePayload(scope: Scope, formTableIds: string[]): any;
61
+ /**
62
+ * 从 `saveFormTable` 的响应里取新建/改名后的表 id。
63
+ *
64
+ * ⚠ **故意不认 `data.id` / `data.formTable.id`** —— 那个 `id` 在这个子系统里另有含义
65
+ * (在 `formTableList` 里它是 **formId**)。猜错不是报错,而是把字段**静默绑到别的表上**,
66
+ * 属于本项目明令避免的失败模式。只认键名明确叫 formTableId 的。
67
+ *
68
+ * 实机验证(2026-10-08,mulinquan 临时表单):建表/改名都返回
69
+ * `{"code":200,"msg":"接口返回成功","status":true,"data":{"formTableId":"..."},"fail":false}`
70
+ * 认不出来就返回空串,由调用方把原始响应打出来给人看。
71
+ */
72
+ export declare function extractFormTableId(response: any): string;
73
+ /** 读全量字段(扁平记录,含 `formTableId`)—— 用来回读确认字段到底落在哪张表上。 */
74
+ export declare function readFieldRecords(client: ApiClient, baseUrl: string, appId: string, scope: Scope): Promise<any[]>;
75
+ /** 一个表单的一张物理表。`formTableId` 是**表记录 id**(不是 formId)。 */
76
+ export interface PhysicalTable {
77
+ formTableId: string;
78
+ /** 显示名 —— 设计器「字段管理」那排 chip 上的字。主表的这幅名字就是表单名。 */
79
+ name: string;
80
+ tableName: string;
81
+ /** `MAIN`(主表)或 `SUBSIDIARY`(附属物理表)。 */
82
+ tableType: string;
83
+ /** 平台内置表(如系统业务表),一般不该动。 */
84
+ systemTable: boolean;
85
+ dataCount: number;
86
+ }
87
+ /**
88
+ * 列出一个表单的**全部物理表**(含主表)—— 就是设计器「字段管理」那排 chip 的数据源。
89
+ *
90
+ * ⚠ 响应里每条记录的 `id` 键是 **formId**、`formTableId` 才是表 id(本子系统里 `id` 反复是这个陷阱,
91
+ * 建表响应也一样)。只读 `formTableId`。
92
+ *
93
+ * 实机验证(2026-10-08,mulinquan 表单 `1323898521989193728`)返回三条:主表(MAIN) + 表1/表2(SUBSIDIARY),
94
+ * 显示名与建表时给的一致 —— 这条接口是「formTableId 建完只能靠记」那个缺口的补法。
95
+ */
96
+ export declare function listFormTables(client: ApiClient, baseUrl: string, appId: string, scope: Scope): Promise<PhysicalTable[]>;
97
+ /**
98
+ * `fieldId → 所在物理表`。`records` 来自 {@link readFieldRecords}(扁平记录,带 `formTableId`)。
99
+ *
100
+ * ⚠ 实测:**主表字段的记录里 `formTableId` 可能整个键都不在**(同一张主表上,走 `form create` 建的
101
+ * 字段没这个键、走 `saveFormFieldNew` 建的有)。附属表的字段则都带自己的表 id。
102
+ * 所以取不到 / 对不上任何一张已知表时**一律归主表** —— 平台不写就是「默认那张」,
103
+ * 比留空或编一个表名诚实。
104
+ */
105
+ export declare function mapFieldsToTables(records: any[], tables: PhysicalTable[]): Record<string, PhysicalTable>;
106
+ /** 建表(不传 formTableId)或改名(传 formTableId)。 */
107
+ export declare function saveFormTable(client: ApiClient, baseUrl: string, appId: string, scope: Scope, table: {
108
+ name: string;
109
+ tableName: string;
110
+ formTableId?: string;
111
+ }): Promise<any>;
112
+ /** 删表。 */
113
+ export declare function deleteFormTables(client: ApiClient, baseUrl: string, appId: string, scope: Scope, formTableIds: string[]): Promise<any>;
114
+ export {};
115
+ //# sourceMappingURL=form-physical-table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-physical-table.d.ts","sourceRoot":"","sources":["../../src/services/form-physical-table.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,eAAO,MAAM,YAAY,yCAAyC,CAAC;AAEnE,uCAAuC;AACvC,eAAO,MAAM,cAAc,eAAe,CAAC;AAE3C,oDAAoD;AACpD,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,KAAK;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,oDAAoD;AACpD,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/D,GAAG,CAcL;AAED,0CAA0C;AAC1C,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,GAAG,CAOrF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,GAAG,GAAG,MAAM,CAUxD;AAED,sDAAsD;AACtD,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAC9D,OAAO,CAAC,GAAG,EAAE,CAAC,CAahB;AAED,uDAAuD;AACvD,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,2BAA2B;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAC9D,OAAO,CAAC,aAAa,EAAE,CAAC,CAiB1B;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,GACtC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAY/B;AAED,4CAA4C;AAC5C,wBAAsB,aAAa,CACjC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAC/D,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/D,OAAO,CAAC,GAAG,CAAC,CAMd;AAED,UAAU;AACV,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,GACtF,OAAO,CAAC,GAAG,CAAC,CAMd"}
@@ -0,0 +1,153 @@
1
+ /**
2
+ * 多物理表 —— 一个表单的字段分散在多张物理表上(字段数过多时的容量兜底)。
3
+ *
4
+ * 设计器里的落点是「字段管理 → **其他**」页签,与「主表」「明细表」并列。
5
+ *
6
+ * ## 与「明细表」是两根轴,别混
7
+ *
8
+ * | | 明细表(`form add-detail-table`) | **物理表(本文件)** |
9
+ * |---|---|---|
10
+ * | 建表端点 | `saveSubForm` | **`saveFormTable`** |
11
+ * | 标志 | `isSubForm: true` | **`isSubForm: false`** |
12
+ * | `tableType` | `MAIN` | **`SUBSIDIARY`** |
13
+ * | 语义 | 一对多业务建模 | 一个表单自己的字段拆到多张表 |
14
+ *
15
+ * ## ⚠ `id` 这个键在 `saveFormTable` 里是**表 id**
16
+ *
17
+ * 改名时传 `formTable.id` = 表记录 id;建档时不传,由平台分配。
18
+ * (对比:`batch/save/formField` 的 `formTableList[].id` 是 **formId**、`.formTableId` 才是表 id ——
19
+ * 那条路本 CLI 不再走,见下。)
20
+ *
21
+ * ## 往表里加字段**不在本文件**
22
+ *
23
+ * 加字段走 `form add-physical-field` → `services/form-field-build.ts`,机制是
24
+ * `saveFormFieldNew` + jsonObj 里的 `formTableId`。
25
+ *
26
+ * 曾经这里还有一条「建表时用 `batch/save/formField` + `formTableList` 连字段一起建、并靠改
27
+ * `formTableId` 搬字段」的路,**两个原因废弃**:
28
+ * 1. 改已有字段的 formTableId 被平台明确拒绝:`此字段不属于当前物理表,不能更改位置`
29
+ * 2. 那条路对形状不全的字段会**回 200 却静默不落库**(实测 DateTime / Attachment 等就中招)
30
+ *
31
+ * ## 抓包来源
32
+ *
33
+ * 2026-10-08,mulinquan app `1320953875231211521` / 表单 objId `1320953905305272320`,
34
+ * 以及自建临时表单上的实机验证(建表/改名/删表/加字段全通)。
35
+ */
36
+ export const FIELD_MANAGE = '/api/ebuilder/form/form/field/manage';
37
+ /** 附属物理表的 `tableType`。主物理表是 `MAIN`。 */
38
+ export const SUB_TABLE_TYPE = 'SUBSIDIARY';
39
+ /** 建表 / 改名共用的报文。**带 `formTableId` 就是改名,不带就是新建。** */
40
+ export function buildSaveFormTablePayload(scope, table) {
41
+ return {
42
+ module: 'ebuilderform',
43
+ formTable: {
44
+ // ⚠ 有 id = 改名(指向已有表),没有 id = 新建。同一个键两种语义。
45
+ ...(table.formTableId ? { id: table.formTableId } : {}),
46
+ name: table.name,
47
+ tableName: table.tableName,
48
+ tableType: SUB_TABLE_TYPE,
49
+ form: { id: scope.formId },
50
+ otherProperties: '{}',
51
+ },
52
+ customParam: { appId: scope.appId, objId: scope.objId },
53
+ };
54
+ }
55
+ /** 删表报文。`ids` 是**表 id** 的数组,不是 formId。 */
56
+ export function buildDeleteFormTablePayload(scope, formTableIds) {
57
+ return {
58
+ module: 'ebuilderform',
59
+ formId: scope.formId,
60
+ ids: formTableIds,
61
+ customParam: { appId: scope.appId, objId: scope.objId },
62
+ };
63
+ }
64
+ /**
65
+ * 从 `saveFormTable` 的响应里取新建/改名后的表 id。
66
+ *
67
+ * ⚠ **故意不认 `data.id` / `data.formTable.id`** —— 那个 `id` 在这个子系统里另有含义
68
+ * (在 `formTableList` 里它是 **formId**)。猜错不是报错,而是把字段**静默绑到别的表上**,
69
+ * 属于本项目明令避免的失败模式。只认键名明确叫 formTableId 的。
70
+ *
71
+ * 实机验证(2026-10-08,mulinquan 临时表单):建表/改名都返回
72
+ * `{"code":200,"msg":"接口返回成功","status":true,"data":{"formTableId":"..."},"fail":false}`
73
+ * 认不出来就返回空串,由调用方把原始响应打出来给人看。
74
+ */
75
+ export function extractFormTableId(response) {
76
+ const candidates = [
77
+ response?.data?.formTableId,
78
+ response?.data?.formTable?.formTableId,
79
+ response?.formTableId,
80
+ ];
81
+ for (const c of candidates) {
82
+ if (c !== undefined && c !== null && String(c).trim())
83
+ return String(c);
84
+ }
85
+ return '';
86
+ }
87
+ /** 读全量字段(扁平记录,含 `formTableId`)—— 用来回读确认字段到底落在哪张表上。 */
88
+ export async function readFieldRecords(client, baseUrl, appId, scope) {
89
+ const r = await client.post(`${baseUrl}${FIELD_MANAGE}/getFormFieldPage?apid=${encodeURIComponent(appId)}`, {
90
+ pageNo: 1,
91
+ pageSize: 500,
92
+ module: 'ebuilderform',
93
+ customParam: { appId: scope.appId, objId: scope.objId },
94
+ formFieldSearchEntity: { isDelete: 0, status: 'enable', formId: scope.formId },
95
+ }, { ebbusinessid: scope.formId });
96
+ return r?.data?.pageDatas?.result || r?.data?.data?.records || r?.data?.data || [];
97
+ }
98
+ /**
99
+ * 列出一个表单的**全部物理表**(含主表)—— 就是设计器「字段管理」那排 chip 的数据源。
100
+ *
101
+ * ⚠ 响应里每条记录的 `id` 键是 **formId**、`formTableId` 才是表 id(本子系统里 `id` 反复是这个陷阱,
102
+ * 建表响应也一样)。只读 `formTableId`。
103
+ *
104
+ * 实机验证(2026-10-08,mulinquan 表单 `1323898521989193728`)返回三条:主表(MAIN) + 表1/表2(SUBSIDIARY),
105
+ * 显示名与建表时给的一致 —— 这条接口是「formTableId 建完只能靠记」那个缺口的补法。
106
+ */
107
+ export async function listFormTables(client, baseUrl, appId, scope) {
108
+ const r = await client.post(`${baseUrl}${FIELD_MANAGE}/getFormAGroupList?apid=${encodeURIComponent(appId)}`, { module: 'ebuilderform', formId: scope.formId, customParam: { appId: scope.appId, objId: scope.objId } }, { ebbusinessid: scope.formId });
109
+ const list = r?.data?.formList || [];
110
+ return list
111
+ .filter((t) => t?.formTableId)
112
+ .map((t) => ({
113
+ formTableId: String(t.formTableId),
114
+ name: String(t.name ?? ''),
115
+ tableName: String(t.tableName ?? ''),
116
+ tableType: String(t.tableType ?? ''),
117
+ systemTable: !!t.systemTable,
118
+ dataCount: Number(t.dataCount ?? 0),
119
+ }));
120
+ }
121
+ /**
122
+ * `fieldId → 所在物理表`。`records` 来自 {@link readFieldRecords}(扁平记录,带 `formTableId`)。
123
+ *
124
+ * ⚠ 实测:**主表字段的记录里 `formTableId` 可能整个键都不在**(同一张主表上,走 `form create` 建的
125
+ * 字段没这个键、走 `saveFormFieldNew` 建的有)。附属表的字段则都带自己的表 id。
126
+ * 所以取不到 / 对不上任何一张已知表时**一律归主表** —— 平台不写就是「默认那张」,
127
+ * 比留空或编一个表名诚实。
128
+ */
129
+ export function mapFieldsToTables(records, tables) {
130
+ const byTableId = new Map(tables.map((t) => [t.formTableId, t]));
131
+ const main = tables.find((t) => t.tableType === 'MAIN');
132
+ const out = {};
133
+ for (const r of records) {
134
+ const fieldId = r?.fieldId;
135
+ if (!fieldId)
136
+ continue;
137
+ const hit = byTableId.get(String(r.formTableId));
138
+ if (hit)
139
+ out[String(fieldId)] = hit;
140
+ else if (main)
141
+ out[String(fieldId)] = main;
142
+ }
143
+ return out;
144
+ }
145
+ /** 建表(不传 formTableId)或改名(传 formTableId)。 */
146
+ export async function saveFormTable(client, baseUrl, appId, scope, table) {
147
+ return client.post(`${baseUrl}${FIELD_MANAGE}/saveFormTable?apid=${encodeURIComponent(appId)}`, buildSaveFormTablePayload(scope, table), { ebbusinessid: scope.formId });
148
+ }
149
+ /** 删表。 */
150
+ export async function deleteFormTables(client, baseUrl, appId, scope, formTableIds) {
151
+ return client.post(`${baseUrl}${FIELD_MANAGE}/deleteFormTable?apid=${encodeURIComponent(appId)}`, buildDeleteFormTablePayload(scope, formTableIds), { ebbusinessid: scope.formId });
152
+ }
153
+ //# sourceMappingURL=form-physical-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-physical-table.js","sourceRoot":"","sources":["../../src/services/form-physical-table.ts"],"names":[],"mappings":"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"}