weaver-e10-builder 1.2.5 → 1.5.1

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 (201) hide show
  1. package/assets/org-employee-template.xlsx +0 -0
  2. package/dist/commands/form-button.d.ts.map +1 -1
  3. package/dist/commands/form-button.js +28 -5
  4. package/dist/commands/form-button.js.map +1 -1
  5. package/dist/commands/form-field-linkage.d.ts.map +1 -1
  6. package/dist/commands/form-field-linkage.js +27 -6
  7. package/dist/commands/form-field-linkage.js.map +1 -1
  8. package/dist/commands/form-formula-linkage.d.ts +3 -0
  9. package/dist/commands/form-formula-linkage.d.ts.map +1 -0
  10. package/dist/commands/form-formula-linkage.js +434 -0
  11. package/dist/commands/form-formula-linkage.js.map +1 -0
  12. package/dist/commands/form-formula.d.ts.map +1 -1
  13. package/dist/commands/form-formula.js +22 -3
  14. package/dist/commands/form-formula.js.map +1 -1
  15. package/dist/commands/form-list-click.d.ts.map +1 -1
  16. package/dist/commands/form-list-click.js +2 -1
  17. package/dist/commands/form-list-click.js.map +1 -1
  18. package/dist/commands/form-native.d.ts.map +1 -1
  19. package/dist/commands/form-native.js +11 -3
  20. package/dist/commands/form-native.js.map +1 -1
  21. package/dist/commands/form.d.ts.map +1 -1
  22. package/dist/commands/form.js +247 -173
  23. package/dist/commands/form.js.map +1 -1
  24. package/dist/commands/matrix.d.ts.map +1 -1
  25. package/dist/commands/matrix.js +175 -36
  26. package/dist/commands/matrix.js.map +1 -1
  27. package/dist/commands/org.d.ts +10 -0
  28. package/dist/commands/org.d.ts.map +1 -0
  29. package/dist/commands/org.js +278 -0
  30. package/dist/commands/org.js.map +1 -0
  31. package/dist/commands/role.d.ts.map +1 -1
  32. package/dist/commands/role.js +106 -62
  33. package/dist/commands/role.js.map +1 -1
  34. package/dist/commands/wf-form.d.ts.map +1 -1
  35. package/dist/commands/wf-form.js +501 -26
  36. package/dist/commands/wf-form.js.map +1 -1
  37. package/dist/commands/workflow-auth-resp.d.ts.map +1 -1
  38. package/dist/commands/workflow-auth-resp.js +53 -5
  39. package/dist/commands/workflow-auth-resp.js.map +1 -1
  40. package/dist/commands/workflow-create-auth-resp.d.ts.map +1 -1
  41. package/dist/commands/workflow-create-auth-resp.js +5 -1
  42. package/dist/commands/workflow-create-auth-resp.js.map +1 -1
  43. package/dist/commands/workflow.d.ts.map +1 -1
  44. package/dist/commands/workflow.js +78 -9
  45. package/dist/commands/workflow.js.map +1 -1
  46. package/dist/index.js +4 -0
  47. package/dist/index.js.map +1 -1
  48. package/dist/services/action-detail.d.ts.map +1 -1
  49. package/dist/services/action-detail.js +5 -4
  50. package/dist/services/action-detail.js.map +1 -1
  51. package/dist/services/actionflow/components/action_eb_update_compiler.d.ts.map +1 -1
  52. package/dist/services/actionflow/components/action_eb_update_compiler.js +22 -7
  53. package/dist/services/actionflow/components/action_eb_update_compiler.js.map +1 -1
  54. package/dist/services/actionflow/components/approve_create.d.ts.map +1 -1
  55. package/dist/services/actionflow/components/approve_create.js +6 -3
  56. package/dist/services/actionflow/components/approve_create.js.map +1 -1
  57. package/dist/services/actionflow/components/custom_set_form.d.ts.map +1 -1
  58. package/dist/services/actionflow/components/custom_set_form.js +35 -1
  59. package/dist/services/actionflow/components/custom_set_form.js.map +1 -1
  60. package/dist/services/actionflow/components/custom_trigger.d.ts.map +1 -1
  61. package/dist/services/actionflow/components/custom_trigger.js +4 -1
  62. package/dist/services/actionflow/components/custom_trigger.js.map +1 -1
  63. package/dist/services/actionflow/components/dml_execute.d.ts.map +1 -1
  64. package/dist/services/actionflow/components/dml_execute.js +7 -3
  65. package/dist/services/actionflow/components/dml_execute.js.map +1 -1
  66. package/dist/services/actionflow/components/document_actions.d.ts.map +1 -1
  67. package/dist/services/actionflow/components/document_actions.js +7 -3
  68. package/dist/services/actionflow/components/document_actions.js.map +1 -1
  69. package/dist/services/actionflow/components/hrm_actions.d.ts.map +1 -1
  70. package/dist/services/actionflow/components/hrm_actions.js +7 -3
  71. package/dist/services/actionflow/components/hrm_actions.js.map +1 -1
  72. package/dist/services/actionflow/components/multiple_execution.d.ts.map +1 -1
  73. package/dist/services/actionflow/components/multiple_execution.js +14 -5
  74. package/dist/services/actionflow/components/multiple_execution.js.map +1 -1
  75. package/dist/services/actionflow/components/output.js +1 -1
  76. package/dist/services/actionflow/components/output.js.map +1 -1
  77. package/dist/services/actionflow/components/send_message.js +2 -2
  78. package/dist/services/actionflow/components/send_message.js.map +1 -1
  79. package/dist/services/actionflow/components/workflow_actions.d.ts.map +1 -1
  80. package/dist/services/actionflow/components/workflow_actions.js +7 -3
  81. package/dist/services/actionflow/components/workflow_actions.js.map +1 -1
  82. package/dist/services/actionflow/context_preflight.d.ts.map +1 -1
  83. package/dist/services/actionflow/context_preflight.js +12 -2
  84. package/dist/services/actionflow/context_preflight.js.map +1 -1
  85. package/dist/services/actionflow/context_provider.d.ts.map +1 -1
  86. package/dist/services/actionflow/context_provider.js +21 -2
  87. package/dist/services/actionflow/context_provider.js.map +1 -1
  88. package/dist/services/actionflow/custom_trigger_context.d.ts +10 -0
  89. package/dist/services/actionflow/custom_trigger_context.d.ts.map +1 -0
  90. package/dist/services/actionflow/custom_trigger_context.js +46 -0
  91. package/dist/services/actionflow/custom_trigger_context.js.map +1 -0
  92. package/dist/services/actionflow/filter_rules.js +2 -2
  93. package/dist/services/actionflow/filter_rules.js.map +1 -1
  94. package/dist/services/actionflow/formula_service.d.ts +9 -1
  95. package/dist/services/actionflow/formula_service.d.ts.map +1 -1
  96. package/dist/services/actionflow/formula_service.js +59 -21
  97. package/dist/services/actionflow/formula_service.js.map +1 -1
  98. package/dist/services/actionflow/id_generator.d.ts +2 -0
  99. package/dist/services/actionflow/id_generator.d.ts.map +1 -1
  100. package/dist/services/actionflow/id_generator.js +13 -0
  101. package/dist/services/actionflow/id_generator.js.map +1 -1
  102. package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
  103. package/dist/services/actionflow/preflight_service.js +6 -1
  104. package/dist/services/actionflow/preflight_service.js.map +1 -1
  105. package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
  106. package/dist/services/actionflow/workflow_compiler.js +89 -35
  107. package/dist/services/actionflow/workflow_compiler.js.map +1 -1
  108. package/dist/services/auth-resp-condition.d.ts +35 -0
  109. package/dist/services/auth-resp-condition.d.ts.map +1 -0
  110. package/dist/services/auth-resp-condition.js +111 -0
  111. package/dist/services/auth-resp-condition.js.map +1 -0
  112. package/dist/services/condition-rules.d.ts.map +1 -1
  113. package/dist/services/condition-rules.js +4 -1
  114. package/dist/services/condition-rules.js.map +1 -1
  115. package/dist/services/esb-interface/document-parser.d.ts.map +1 -1
  116. package/dist/services/esb-interface/document-parser.js +62 -5
  117. package/dist/services/esb-interface/document-parser.js.map +1 -1
  118. package/dist/services/form-association.d.ts +19 -0
  119. package/dist/services/form-association.d.ts.map +1 -1
  120. package/dist/services/form-association.js +64 -0
  121. package/dist/services/form-association.js.map +1 -1
  122. package/dist/services/form-button-action.d.ts +7 -0
  123. package/dist/services/form-button-action.d.ts.map +1 -1
  124. package/dist/services/form-button-action.js +11 -1
  125. package/dist/services/form-button-action.js.map +1 -1
  126. package/dist/services/form-create.d.ts +4 -0
  127. package/dist/services/form-create.d.ts.map +1 -1
  128. package/dist/services/form-create.js +18 -12
  129. package/dist/services/form-create.js.map +1 -1
  130. package/dist/services/form-field-patch.d.ts +3 -1
  131. package/dist/services/form-field-patch.d.ts.map +1 -1
  132. package/dist/services/form-field-patch.js +23 -9
  133. package/dist/services/form-field-patch.js.map +1 -1
  134. package/dist/services/form-formula-linkage.d.ts +349 -0
  135. package/dist/services/form-formula-linkage.d.ts.map +1 -0
  136. package/dist/services/form-formula-linkage.js +546 -0
  137. package/dist/services/form-formula-linkage.js.map +1 -0
  138. package/dist/services/form-layout-insert.d.ts +84 -0
  139. package/dist/services/form-layout-insert.d.ts.map +1 -0
  140. package/dist/services/form-layout-insert.js +244 -0
  141. package/dist/services/form-layout-insert.js.map +1 -0
  142. package/dist/services/form-linkage-condition.d.ts +159 -0
  143. package/dist/services/form-linkage-condition.d.ts.map +1 -0
  144. package/dist/services/form-linkage-condition.js +307 -0
  145. package/dist/services/form-linkage-condition.js.map +1 -0
  146. package/dist/services/formula-detail.d.ts +98 -6
  147. package/dist/services/formula-detail.d.ts.map +1 -1
  148. package/dist/services/formula-detail.js +208 -26
  149. package/dist/services/formula-detail.js.map +1 -1
  150. package/dist/services/matrix-rows.d.ts +43 -0
  151. package/dist/services/matrix-rows.d.ts.map +1 -0
  152. package/dist/services/matrix-rows.js +104 -0
  153. package/dist/services/matrix-rows.js.map +1 -0
  154. package/dist/services/org-department.d.ts +114 -0
  155. package/dist/services/org-department.d.ts.map +1 -0
  156. package/dist/services/org-department.js +209 -0
  157. package/dist/services/org-department.js.map +1 -0
  158. package/dist/services/org-employee.d.ts +87 -0
  159. package/dist/services/org-employee.d.ts.map +1 -0
  160. package/dist/services/org-employee.js +219 -0
  161. package/dist/services/org-employee.js.map +1 -0
  162. package/dist/services/role-member.d.ts +99 -0
  163. package/dist/services/role-member.d.ts.map +1 -0
  164. package/dist/services/role-member.js +206 -0
  165. package/dist/services/role-member.js.map +1 -0
  166. package/dist/services/workflow-info.d.ts +83 -0
  167. package/dist/services/workflow-info.d.ts.map +1 -0
  168. package/dist/services/workflow-info.js +97 -0
  169. package/dist/services/workflow-info.js.map +1 -0
  170. package/dist/services/workflow-odoc-setting.d.ts +1 -1
  171. package/dist/services/workflow-odoc-setting.d.ts.map +1 -1
  172. package/dist/services/workflow-odoc-setting.js +15 -6
  173. package/dist/services/workflow-odoc-setting.js.map +1 -1
  174. package/dist/utils/column-name.d.ts +24 -0
  175. package/dist/utils/column-name.d.ts.map +1 -1
  176. package/dist/utils/column-name.js +16 -0
  177. package/dist/utils/column-name.js.map +1 -1
  178. package/ecodecmd/package.json +1 -2
  179. package/ecodecmd/src/loaddep.js +19 -9
  180. package/package.json +4 -4
  181. package/skill-docs/SKILL.md +13 -9
  182. package/skill-docs/_catalog.md +85 -81
  183. package/skill-docs/actionflows/SKILL.md +173 -170
  184. package/skill-docs/actionflows/references/components/logic/Output.md +1 -1
  185. package/skill-docs/actionflows/references/components/trigger/CustomTrigger.md +32 -0
  186. package/skill-docs/actionflows/references/components/workflow/ApproveCreate.md +1 -1
  187. package/skill-docs/references/common/guide-plan-template.md +9 -3
  188. package/skill-docs/references/common/ref-cli-commands.md +47 -22
  189. package/skill-docs/references/esb-interface/guide-import.md +4 -1
  190. package/skill-docs/references/form/guide-create-form.md +13 -0
  191. package/skill-docs/references/form/guide-field-linkage.md +2 -0
  192. package/skill-docs/references/form/guide-form-formula-functions.md +36 -0
  193. package/skill-docs/references/form/guide-form-layout-incremental.md +75 -0
  194. package/skill-docs/references/form/guide-form-linkage.md +61 -3
  195. package/skill-docs/references/form/guide-formula-linkage.md +250 -0
  196. package/skill-docs/references/form/ref-form-fields.md +6 -0
  197. package/skill-docs/references/hrm/guide-matrix.md +79 -16
  198. package/skill-docs/references/hrm/guide-org-employee.md +56 -0
  199. package/skill-docs/references/workflow/guide-workflow-auth-resp.md +48 -22
  200. package/skill-docs/references/workflow/guide-workflow-odoc-setting.md +248 -0
  201. package/skill-docs/references/workflow/guide-workflow-odoc.md +23 -51
@@ -0,0 +1,546 @@
1
+ /**
2
+ * 函数联动(`linkageType='excel'`)—— 表单字段之间的公式赋值式联动。
3
+ *
4
+ * ## 它是什么
5
+ *
6
+ * 设计器里「函数联动」面板配出来的规则:**在哪儿生效 + 什么时候触发 + 谁触发 + 赋值给谁**。
7
+ * 落库是一条 **FormDataLinkage**,`linkageType: 'excel'` —— 与 `form field-linkage`
8
+ * (`linkageType: 'template'`,ESB 跨表带出)**共用同一个保存端点** `saveFormDataLinkage`,
9
+ * 区别只在这几个键:
10
+ *
11
+ * | | field-linkage(跨表带出) | 函数联动(本模块) |
12
+ * |---|---|---|
13
+ * | `linkageType` | `template` | `excel` |
14
+ * | 数据源 | `dataSources[].sourceEsb` + `dataSourceId` | `dataSources[].sourceExcel.{excelId, excelName}` |
15
+ * | `linkageExt.subFormAddType` | `override` | `append` |
16
+ * | 取值靠 | ESB 应用(application/save + saveDesign) | 一张公式(`/api/excel/formula/save`) |
17
+ *
18
+ * 因为取值靠公式,所以建联动前要**先建公式**,`sourceExcel.excelId` 就是那个公式的 id。
19
+ *
20
+ * ## 两条容易踩的
21
+ *
22
+ * 1. **赋值式**:公式的 `expressSql` 不是纯函数体,是 `{主表.目标}=<函数体>`,且
23
+ * `returnType` / `validateType` 都是 `EqualAssign`(普通字段公式是 `Number|String|Date` / `normal`)。
24
+ * 用户给的通常只有右侧函数体,由 `buildAssignExpression` 拼出左侧。
25
+ * 2. **模块字段不能作赋值目标**:平台在 `extendParam.unSupportTargets` 里列了 21 个语义键,
26
+ * 实测**正好等于** `findFormDrivingColumns` 的模块字段桶。那些字段可以出现在公式右侧、
27
+ * 也可以当触发字段,但**不能**出现在 `=` 左边。判据见 `MODULE_FIELD_KEYS`。
28
+ */
29
+ export const LINKAGE_API = '/api/ebuilder/form/form/linkage';
30
+ /**
31
+ * 模块字段(系统字段)语义键 —— 平台在 `extendParam.unSupportTargets` 里原样给出的 21 项。
32
+ *
33
+ * 它同时是两条判据:① 哪些列是模块字段(`id` 落在这个集合里);
34
+ * ② 哪些字段**不能**作为赋值目标(就是这 21 个)。
35
+ */
36
+ export const MODULE_FIELD_KEYS = [
37
+ 'name', 'creator', 'createTime', 'updateTime', 'id', 'updater', 'dataStatus', 'formDataId',
38
+ 'addBatchId', 'updateBatchId', 'objId',
39
+ 'system_operator_manage_all_id', 'system_operator_name', 'system_operator_id',
40
+ 'system_operator_sub_company_id', 'system_operator_department_id', 'system_operator_manage_id',
41
+ 'current_date', 'current_date_time', 'form_id', 'form_data_id',
42
+ ];
43
+ /** 流程表单那条路由的端点前缀。eb 表是 `LINKAGE_API`。 */
44
+ export const FLOW_LINKAGE_API = '/api/ebuilder/flow/form/linkage';
45
+ /**
46
+ * 流程表单驱动列里的模块字段(32 个)。
47
+ * ⚠ 它与下面的「不可作赋值目标」清单**不相等** —— 别拿这一份当判据,见 `FLOW_ASSIGNABLE_SYSTEM_KEYS`。
48
+ */
49
+ export const FLOW_MODULE_FIELD_KEYS = [
50
+ 'REQUEST_ID', 'WORKFLOW_ID', 'WORKFLOW_NAME', 'WORKFLOW_TYPE', 'WORKFLOW_DESC',
51
+ 'REQ_REQUEST_NAME', 'REQUEST_NO', 'REQUEST_LEVEL', 'PRINT_COUNT',
52
+ 'CREATE_USER', 'CREATE_SUB', 'CREATE_DEPT', 'CREATE_JOB', 'CREATE_RANK',
53
+ 'CREATE_DATE', 'CREATE_TIME', 'FINISH_DATE', 'FINISH_TIME', 'FINISH_DATETIME_FORMULA',
54
+ 'CURRENT_NODE', 'browserCurrentOperator', 'browserCurrentOperatorPartTime',
55
+ 'system_operator_manage_all_id', 'system_operator_name', 'system_operator_id',
56
+ 'system_operator_sub_company_id', 'system_operator_department_id', 'system_operator_manage_id',
57
+ 'current_date', 'current_date_time', 'form_id', 'form_data_id',
58
+ ];
59
+ /** 流程表单里**不可作赋值目标**的系统字段(30 个)—— 就是平台的 `unSupportTargets`。 */
60
+ export const FLOW_UNSUPPORTED_TARGET_KEYS = FLOW_MODULE_FIELD_KEYS
61
+ .filter((k) => !['REQ_REQUEST_NAME', 'REQUEST_LEVEL'].includes(k));
62
+ /**
63
+ * **是模块字段、却可以作赋值目标**的两个例外:`流程标题` 与 `紧急程度`。
64
+ *
65
+ * 这两条是从 `FLOW_MODULE_FIELD_KEYS` 与 `FLOW_UNSUPPORTED_TARGET_KEYS` 的差集里来的 ——
66
+ * eb 表那边两份清单恰好都是 21、完全一致,所以「是模块字段就不能当目标」这个粗判据当时看不出问题;
67
+ * 到了流程表单会**误拒**这两个能用的字段。`columns` 命令的漂移告警要豁免它们。
68
+ */
69
+ export const FLOW_ASSIGNABLE_SYSTEM_KEYS = ['REQ_REQUEST_NAME', 'REQUEST_LEVEL'];
70
+ /** eb 表那条路由。`unsupportedTargets` 与 `moduleFieldKeys` 恰好同为 21 项。 */
71
+ export const EB_ROUTE = {
72
+ apiBase: LINKAGE_API,
73
+ module: 'ebuilderform',
74
+ useApid: true,
75
+ customParam: (ctx) => ({ appId: ctx.appId, objId: ctx.objId }),
76
+ requiresRefId: false,
77
+ unsupportedTargets: MODULE_FIELD_KEYS,
78
+ moduleFieldKeys: MODULE_FIELD_KEYS,
79
+ assignableSystemKeys: [],
80
+ columnsHint: 'form formula-linkage columns',
81
+ };
82
+ /** 流程表单那条路由。`refId` 是 workflowId,`customParam` 是 `{scene:'workflow'}`。 */
83
+ export const FLOW_ROUTE = {
84
+ apiBase: FLOW_LINKAGE_API,
85
+ module: 'ebuildercard',
86
+ useApid: false,
87
+ customParam: () => ({ scene: 'workflow' }),
88
+ requiresRefId: true,
89
+ unsupportedTargets: FLOW_UNSUPPORTED_TARGET_KEYS,
90
+ moduleFieldKeys: FLOW_MODULE_FIELD_KEYS,
91
+ assignableSystemKeys: FLOW_ASSIGNABLE_SYSTEM_KEYS,
92
+ columnsHint: 'wf-form formula-linkage columns',
93
+ };
94
+ /**
95
+ * 拼联动接口的 URL。两条路由的差别就在「带不带 `?apid=`」这一处,
96
+ * 集中在这里而不是散在命令文件里拼字符串。
97
+ */
98
+ export function buildLinkageApiUrl(route, op, ctx = {}) {
99
+ const url = `${route.apiBase}/${op}`;
100
+ if (!route.useApid)
101
+ return url;
102
+ return `${url}?apid=${ctx.appId ?? ''}`;
103
+ }
104
+ /** 两条路由的公共定位键:`refId`(流程表单要)与 `customParam`。 */
105
+ function routeLocator(route, ctx) {
106
+ return {
107
+ ...(route.requiresRefId ? { refId: String(ctx.refId ?? '') } : {}),
108
+ customParam: route.customParam({ appId: ctx.appId, objId: ctx.objId }),
109
+ };
110
+ }
111
+ export function buildLinkageListBody(route, ctx) {
112
+ return {
113
+ formId: ctx.formId,
114
+ ...routeLocator(route, ctx),
115
+ module: route.module,
116
+ linkageTypeList: ['excel'],
117
+ keyword: ctx.keyword ?? '',
118
+ pageNo: ctx.pageNo ?? 1,
119
+ pageSize: ctx.pageSize ?? 200,
120
+ orderData: '',
121
+ };
122
+ }
123
+ export function buildLinkageQueryBody(route, ctx) {
124
+ return { id: ctx.id, formId: ctx.formId, ...routeLocator(route, ctx), module: route.module };
125
+ }
126
+ export function buildLinkageDeleteBody(route, ctx) {
127
+ return { idList: ctx.ids, formId: ctx.formId, ...routeLocator(route, ctx), module: route.module, linkageTypeList: ['excel'] };
128
+ }
129
+ export function buildPreCheckBody(route, ctx) {
130
+ return { module: route.module, formId: ctx.formId, linkageIds: ctx.linkageIds, customParam: route.customParam({ appId: ctx.appId, objId: ctx.objId }) };
131
+ }
132
+ export function buildDrivingEventsBody(route, ctx) {
133
+ return { formId: ctx.formId, module: route.module, customParam: route.customParam({ appId: ctx.appId, objId: ctx.objId }) };
134
+ }
135
+ /**
136
+ * 驱动列的请求体。**故意不带** `notComponentKeyList` —— 平台上那个列表是一大串组件名,
137
+ * 内容未知、硬编风险更大。判据:返回的列与设计器里能看到的源字段对得上,就说明它不影响我们。
138
+ */
139
+ export function buildDrivingColumnsBody(route, ctx) {
140
+ return {
141
+ formId: ctx.formId,
142
+ module: route.module,
143
+ subFormId: 0,
144
+ scenarioType: 'DATA_LINKAGE_SOURCE',
145
+ needEncryptionFilter: true,
146
+ needJoinTitle: true,
147
+ needI18n: true,
148
+ customParam: route.customParam({ appId: ctx.appId, objId: ctx.objId }),
149
+ };
150
+ }
151
+ /**
152
+ * 一个列是不是模块字段(系统字段)。
153
+ *
154
+ * ⚠ **只回答「它是不是系统字段」,不回答「能不能作赋值目标」** —— 那两个概念在流程表单上**不重合**
155
+ * (见 `FLOW_ASSIGNABLE_SYSTEM_KEYS`)。本函数用于公式引用识别与展示分桶,别拿它当拒绝判据。
156
+ */
157
+ export function isModuleColumn(col, route = EB_ROUTE) {
158
+ return route.moduleFieldKeys.includes(String(col?.id)) || String(col?.groupId) === 'moduleField';
159
+ }
160
+ /**
161
+ * 形状自检:模块字段的 `descType` 是全大写、业务字段是驼峰。
162
+ * 用来发现「平台新增了模块字段但 `MODULE_FIELD_KEYS` 没跟上」——
163
+ * 只看 `id` 会漏掉它们,`columns` 命令会把这类列标出来。
164
+ */
165
+ export function looksLikeModuleColumn(col) {
166
+ return /^[A-Z][A-Z_0-9]*$/.test(String(col?.descType || ''));
167
+ }
168
+ /** 列的裸标签:`主表.订单编号` → `订单编号`;模块字段本来就是裸标签(`主表数据id`),原样返回。 */
169
+ export function toBareLabel(col) {
170
+ const name = String(col?.name || '');
171
+ const prefix = col?.address ? `${col.address}.` : '';
172
+ if (prefix && name.startsWith(prefix))
173
+ return name.slice(prefix.length);
174
+ const dot = name.indexOf('.');
175
+ return dot > 0 ? name.slice(dot + 1) : name;
176
+ }
177
+ /**
178
+ * 打印一行列,`columns` 命令与歧义报错共用。
179
+ *
180
+ * 标注按「能不能作目标」走,不是按「是不是系统字段」—— 流程表单有两个系统字段是能作目标的。
181
+ */
182
+ export function describeColumn(col, route = EB_ROUTE) {
183
+ if (!isModuleColumn(col, route))
184
+ return ` [${col.id}] ${col.name} ${col.descType || ''}${col.dataKey ? ` ${col.dataKey}` : ''}`;
185
+ const mark = isAssignableTarget(col, route)
186
+ ? ' ← 系统模块字段(可作赋值目标)'
187
+ : ' ← 系统模块字段,不可作赋值目标';
188
+ return ` [${col.id}] ${col.name} ${col.descType || ''}${mark}`;
189
+ }
190
+ /**
191
+ * 按用户输入找事件:先认 `type`,再认中文名。都不中就把可选项全列出来。
192
+ */
193
+ export function resolveDrivingEvent(events, input) {
194
+ const q = String(input || '').trim();
195
+ const byType = events.filter((e) => e.type === q);
196
+ if (byType.length === 1)
197
+ return byType[0];
198
+ const byName = events.filter((e) => e.name === q);
199
+ if (byName.length === 1)
200
+ return byName[0];
201
+ const avail = events.map((e) => `${e.name}(${e.type})`).join('、');
202
+ throw new Error(`未知事件「${q}」,可用: ${avail}`);
203
+ }
204
+ /**
205
+ * 按用户输入找列。分级匹配:字段 id → 完整列名(`主表.订单编号`)→ 裸标签(`订单编号`)→ dataKey。
206
+ *
207
+ * **同一级命中多条一律报错并列出候选**,不取首条 —— 两张明细表里各有一个「金额」是常态,
208
+ * 猜错等于把公式接到别的字段上,而且回读时看不出问题。
209
+ */
210
+ export function resolveDrivingColumn(columns, input, route = EB_ROUTE) {
211
+ const q = String(input || '').trim();
212
+ if (!q)
213
+ throw new Error('字段名为空');
214
+ const levels = [
215
+ ['字段 id', columns.filter((c) => String(c.id) === q)],
216
+ ['完整列名', columns.filter((c) => String(c.name) === q)],
217
+ ['裸标签', columns.filter((c) => toBareLabel(c) === q)],
218
+ ['dataKey', columns.filter((c) => c.dataKey && String(c.dataKey) === q)],
219
+ ];
220
+ // **跨级合并候选,不是命中一级就返回**:模块字段的 `name` 本身就是裸标签(`标题` 没有 `主表.` 前缀),
221
+ // 于是「标题」会在「完整列名」这级撞上模块字段、又在「裸标签」这级撞上同名的业务字段。
222
+ // 只看首个命中的级别 = 静默挑中模块字段 —— 这正是本函数要防的事。
223
+ const seen = new Map();
224
+ const hitLevels = [];
225
+ for (const [label, hits] of levels) {
226
+ if (!hits.length)
227
+ continue;
228
+ hitLevels.push(label);
229
+ for (const h of hits)
230
+ seen.set(String(h.id), h);
231
+ }
232
+ const candidates = [...seen.values()];
233
+ if (candidates.length === 1)
234
+ return candidates[0];
235
+ if (candidates.length > 1) {
236
+ throw new Error(`「${q}」在${hitLevels.join('、')}上匹配到 ${candidates.length} 个字段,请改成唯一写法(字段 id 最稳):\n${candidates.map((c) => describeColumn(c, route)).join('\n')}`);
237
+ }
238
+ throw new Error(`未找到字段「${q}」。可用字段见 e10-cli ${route.columnsHint}`);
239
+ }
240
+ /** 按 id 找列,找不到返回 undefined(update 时读回的触发字段可能已经被删了)。 */
241
+ export function findColumnById(columns, id) {
242
+ return columns.find((c) => String(c.id) === String(id));
243
+ }
244
+ /**
245
+ * 能不能作赋值目标。**唯一判据 = 该路由的 `unsupportedTargets`**(这份清单同时就是要发给平台的
246
+ * `extendParam.unSupportTargets`,读写同一份,不会出现「CLI 放行、报文里却写着不可赋值」的自相矛盾)。
247
+ *
248
+ * ⚠ **别用「是不是模块字段」判**:流程表单的模块字段桶 32 项、不可作目标的 30 项,
249
+ * 「流程标题」「紧急程度」这两个系统字段是**可以**赋值的。
250
+ */
251
+ export function isAssignableTarget(col, route = EB_ROUTE) {
252
+ return !route.unsupportedTargets.includes(String(col?.id));
253
+ }
254
+ /** 目标字段不能落在该路由的不可赋值清单里。 */
255
+ export function assertAssignableTarget(col, route = EB_ROUTE) {
256
+ if (isAssignableTarget(col, route))
257
+ return;
258
+ throw new Error(`系统模块字段「${toBareLabel(col)}」不能作为赋值目标(平台不允许);它可以出现在公式右边或当触发字段。可赋值字段见 ${route.columnsHint}`);
259
+ }
260
+ /**
261
+ * 非阻断诊断:是系统字段、但既不在不可赋值清单里、也不在已知例外里 —— 说明平台的模块字段桶变了。
262
+ *
263
+ * **只提示、不拦**。理由是失败的时机很安全:公式保存发生在联动保存**之前**,放行后若平台真拒,
264
+ * 是在 `/api/excel/formula/save` 处中止,**此时还没有创建任何联动**,不会留下半条规则。
265
+ * 而硬拦的代价是无解的 —— 「流程标题」这类字段就是反例,用户没有任何绕法。
266
+ */
267
+ export function targetDriftWarning(col, route = EB_ROUTE) {
268
+ if (!isModuleColumn(col, route) && !looksLikeModuleColumn(col))
269
+ return undefined;
270
+ if (!isAssignableTarget(col, route))
271
+ return undefined;
272
+ if (route.assignableSystemKeys.includes(String(col.id)))
273
+ return undefined;
274
+ return `「${toBareLabel(col)}」是系统字段(${col.descType}),但它的 id「${col.id}」不在本路由的不可赋值清单里,已按**可赋值**提交。`
275
+ + '若平台在保存公式时拒绝,说明清单需要更新(见 form-formula-linkage.ts 的 unsupportedTargets)。';
276
+ }
277
+ /**
278
+ * 从驱动列里挑出模块字段,喂给 `resolveFormulaRefs` 的 `moduleColumns`。
279
+ * 判据同时看语义键与形状,这样平台新增模块字段时公式引用也不会报「未找到字段」。
280
+ */
281
+ export function moduleColumnsOf(columns, route = EB_ROUTE) {
282
+ return columns
283
+ .filter((c) => isModuleColumn(c, route) || looksLikeModuleColumn(c))
284
+ .map((c) => ({ id: String(c.id), name: String(c.name), descType: String(c.descType || 'TEXT') }));
285
+ }
286
+ /** 按「可作目标 / 不可作目标 / 漂移」把驱动列分桶,`columns` 命令用。 */
287
+ export function partitionDrivingColumns(columns, route = EB_ROUTE) {
288
+ return {
289
+ assignable: columns.filter((c) => isAssignableTarget(c, route)),
290
+ unassignable: columns.filter((c) => !isAssignableTarget(c, route)),
291
+ drifted: columns.filter((c) => targetDriftWarning(c, route) !== undefined),
292
+ };
293
+ }
294
+ /**
295
+ * 找表达式里**顶层**的赋值等号,返回下标;-1 表示这压根不是赋值式(用户给的是纯函数体)。
296
+ *
297
+ * 要排除比较运算符:`>=` `<=` `!=` `==` `<>`。它们的 `=` 要么前面是 `>` `<` `!`,
298
+ * 要么紧跟着另一个 `=`,都不算赋值。
299
+ */
300
+ export function findAssignEquals(expression) {
301
+ const s = String(expression || '');
302
+ for (let i = 0; i < s.length; i++) {
303
+ if (s[i] !== '=')
304
+ continue;
305
+ const prev = s[i - 1];
306
+ const next = s[i + 1];
307
+ if (prev === '>' || prev === '<' || prev === '!' || prev === '=')
308
+ continue;
309
+ if (next === '=')
310
+ continue;
311
+ return i;
312
+ }
313
+ return -1;
314
+ }
315
+ /**
316
+ * 拼出下发给平台的赋值式 `{主表.目标}=<右侧>`。
317
+ *
318
+ * 用户给的通常只有右侧函数体;但**从设计器里整段复制**的话会带上左侧,所以两种都收:
319
+ * - 没带左侧 → 拼上 `--target` 指定的目标;
320
+ * - 带了左侧且与 `--target` 指向同一字段 → 沿用右侧,不重复拼;
321
+ * - 带了左侧但指向**别的**字段 → 报错。**不静默改目标** —— 用户可能根本不知道自己在改哪条规则。
322
+ *
323
+ * @returns `stripped` 为真表示输入本身已是赋值式、左侧被剥掉了。
324
+ */
325
+ export function buildAssignExpression(targetCol, body) {
326
+ const raw = String(body || '').trim();
327
+ if (!raw)
328
+ throw new Error('表达式为空');
329
+ const targetRef = `{主表.${toBareLabel(targetCol)}}`;
330
+ const eq = findAssignEquals(raw);
331
+ if (eq < 0)
332
+ return { expression: `${targetRef}=${raw}`, stripped: false };
333
+ const lhs = raw.slice(0, eq).trim();
334
+ const rhs = raw.slice(eq + 1).trim();
335
+ const label = toBareLabel(targetCol);
336
+ // 左侧只允许是**单个**字段引用;用 refs 反查而不是字符串比对,`{主表.x}` 与 `[x]` 都认
337
+ const inner = lhs.startsWith('{') || lhs.startsWith('[') ? lhs.slice(1, -1).trim() : lhs;
338
+ const bare = inner.includes('.') ? inner.slice(inner.indexOf('.') + 1).trim() : inner;
339
+ if (bare !== label && bare !== String(targetCol.id)) {
340
+ throw new Error(`表达式里写的是一个赋值式,它的左侧是「${bare}」,与 --target「${label}」不一致。`
341
+ + '要么把 --target 改成一致,要么只给右侧函数体(不带左侧的赋值式写法)');
342
+ }
343
+ return { expression: `${targetRef}=${rhs}`, stripped: true };
344
+ }
345
+ /**
346
+ * 触发动作。形状是**一个触发字段一条 action**,不是一条 action 里塞多个 `monitorFields`
347
+ * —— 这是实测的平台形状,多个字段时浏览器就是发多条。
348
+ *
349
+ * 表单级事件(`selectColumn: false`,如「载入时」)不需要触发字段,返回空数组。
350
+ */
351
+ export function buildMonitorActions(event, triggerCols) {
352
+ if (!event.selectColumn)
353
+ return [];
354
+ if (!triggerCols.length) {
355
+ throw new Error(`事件「${event.name}」需要指定触发字段,请加 --trigger <字段名>(可用字段见 form formula-linkage columns)`);
356
+ }
357
+ return triggerCols.map((col) => ({
358
+ actionType: event.type,
359
+ actionName: event.name,
360
+ monitorFields: [{ targetField: String(col.id), targetName: toBareLabel(col) }],
361
+ }));
362
+ }
363
+ /**
364
+ * 生效范围。缺省「当前表单」(在所有布局、所有关联了该表单的工作流上都生效);
365
+ * 也可以给「表单布局」(只对某个布局生效)。
366
+ *
367
+ * 维度的取值由 `resolveEffect`(`services/form-linkage-condition.ts`)解析 —— 显隐联动那条链路
368
+ * 用的同一套,**别在这里另写一份**:布局维度要的是 `multipleLayoutId` 而不是 `formLayout.id`,
369
+ * 这两个值在同一张表上相邻但不同,发错不报错、只是指向另一个布局。
370
+ */
371
+ export function buildFdEffect(formId, effect, effectModule = EB_ROUTE.module) {
372
+ const e = effect || { effectType: 'form', effectName: '当前表单', effectValue: formId };
373
+ return {
374
+ formId,
375
+ effectModule,
376
+ effectType: e.effectType,
377
+ effectName: e.effectName,
378
+ optionList: [{ effectValue: e.effectValue, effectName: e.optionName || e.effectName }],
379
+ };
380
+ }
381
+ /**
382
+ * 从读回的记录里还原当前的生效维度 —— `update` 没给 `--effect` 时用它原样续用。
383
+ * 读回的 `fdEffect` 是服务端形状(带 `id`/`refId`/`tenantKey`/嵌套 id),这里只挑出那 4 个语义值。
384
+ */
385
+ export function extractEffect(record) {
386
+ const e = record?.fdEffect;
387
+ const opt = (e?.optionList || [])[0];
388
+ if (!e?.effectType || !opt?.effectValue)
389
+ return undefined;
390
+ return {
391
+ effectType: String(e.effectType),
392
+ effectName: String(e.effectName || e.effectType),
393
+ effectValue: String(opt.effectValue),
394
+ optionName: opt.effectName ? String(opt.effectName) : undefined,
395
+ };
396
+ }
397
+ /** 明细表的写入方式。函数联动用 `append`(跨表带出那条链路用的是 `override`)。 */
398
+ export function buildLinkageExt(overrides = {}) {
399
+ return {
400
+ subFormLikeType: 'addSubForm',
401
+ subFormAddType: 'append',
402
+ effectContent: '',
403
+ fissionState: 1,
404
+ ...overrides,
405
+ };
406
+ }
407
+ /**
408
+ * 建公式的报文。与 `form formula set` 的差别就是 `returnType`/`validateType`(`EqualAssign`)
409
+ * 与 `extendParam`(`isFdLinkage`)这两处 —— 别把这里当成字段公式发出去。
410
+ *
411
+ * `formulaId` 传已有 id 就是**原地更新**那张公式(实测:传了不新建,excelId 不变)。
412
+ */
413
+ export function buildFormulaSavePayload(p) {
414
+ const route = p.route || EB_ROUTE;
415
+ return {
416
+ expressSql: p.expression,
417
+ name: p.name,
418
+ parameters: p.parameters,
419
+ returnType: 'EqualAssign',
420
+ validateType: 'EqualAssign',
421
+ referenceType: 'assign',
422
+ extendParam: JSON.stringify({ isFdLinkage: true, unSupportTargets: [...route.unsupportedTargets], isSaveAs: false }),
423
+ formulaId: p.formulaId || null,
424
+ dataSources: [],
425
+ formulaType: 'normal',
426
+ mainDataSource: [null],
427
+ tempVariableList: [],
428
+ nameAuto: false,
429
+ module: route.module,
430
+ multiFuncSepType: 1,
431
+ };
432
+ }
433
+ /** 建联动的报文(新建走 `saveFormDataLinkage`)。 */
434
+ export function buildLinkageSavePayload(p) {
435
+ const route = p.route || EB_ROUTE;
436
+ return {
437
+ // 流程表单的报文里 refId 在最前;JSON 键顺序无语义,但这样便于和报文逐字对照
438
+ ...(route.requiresRefId && p.refId ? { refId: p.refId } : {}),
439
+ formId: p.formId,
440
+ fdEffect: buildFdEffect(p.formId, p.effect, route.module),
441
+ linkageModule: route.module,
442
+ linkageName: p.linkageName,
443
+ linkageState: p.linkageState !== false,
444
+ linkageType: 'excel',
445
+ linkageExt: p.linkageExt || buildLinkageExt(),
446
+ monitorActions: p.monitorActions,
447
+ dataSources: [{
448
+ menuKey: '1',
449
+ sourceName: '公式配置1',
450
+ linkageType: 'excel',
451
+ dataMappings: [],
452
+ sourceExcel: { excelId: p.excelId, excelName: p.excelName },
453
+ }],
454
+ needSqlCompress: 1,
455
+ customParam: route.customParam({ appId: p.appId, objId: p.objId }),
456
+ };
457
+ }
458
+ /** 从读回的记录里还原当前的「事件 + 触发字段」,给 `update` 当默认值用。 */
459
+ export function extractTriggerState(record) {
460
+ const actions = record?.monitorActions || [];
461
+ return {
462
+ eventType: String(actions[0]?.actionType || ''),
463
+ triggerIds: actions
464
+ .flatMap((a) => (a.monitorFields || []).map((m) => String(m.targetField || '')))
465
+ .filter(Boolean),
466
+ };
467
+ }
468
+ /**
469
+ * 改联动的报文(走 `updateFormDataLinkage`)—— 形状 = 新建报文 + `id`,
470
+ * 但 `dataSources` 要换成**读回的那份**(带上 `id`/`entityId`/`inFields`/`outFields`),
471
+ * 否则平台会当成新建一个数据源。
472
+ *
473
+ * 两处**不能照抄读回值**,得重建:
474
+ * - `fdEffect`:读回的是服务端形状(一堆嵌套 id、`refId`、`tenantKey`),下发要的是干净的 5 个键
475
+ * - `linkageExt`:同理,只要那 4 个业务键
476
+ * - `customParam`:读回里压根没有,得从调用方参数补
477
+ */
478
+ export function buildLinkageUpdatePayload(record, p) {
479
+ const linkExt = record?.linkageExt || {};
480
+ // 读回的 dataSources 原样回传,只剥掉 sourceExcel.data(那是公式全文,读侧派生的)
481
+ const dataSources = (record?.dataSources || []).map((ds) => {
482
+ const { sourceExcel, ...dsRest } = ds;
483
+ if (!sourceExcel)
484
+ return dsRest;
485
+ const { data, ...excelRest } = sourceExcel;
486
+ return { ...dsRest, sourceExcel: excelRest };
487
+ });
488
+ return {
489
+ id: String(record?.id ?? ''),
490
+ ...buildLinkageSavePayload({
491
+ formId: String(record?.formId ?? ''),
492
+ appId: p.appId,
493
+ objId: p.objId,
494
+ linkageName: p.linkageName,
495
+ excelId: '',
496
+ excelName: '',
497
+ monitorActions: p.monitorActions,
498
+ linkageState: p.linkageState,
499
+ effect: p.effect,
500
+ route: p.route,
501
+ refId: String(p.refId ?? record?.refId ?? ''),
502
+ linkageExt: buildLinkageExt({
503
+ subFormLikeType: linkExt.subFormLikeType,
504
+ subFormAddType: linkExt.subFormAddType,
505
+ effectContent: linkExt.effectContent,
506
+ fissionState: linkExt.fissionState,
507
+ }),
508
+ }),
509
+ dataSources,
510
+ };
511
+ }
512
+ /** 本地时间 `yyyy-MM-dd HH:mm:ss`。平台的联动名用的是这个格式,不是 ISO。 */
513
+ export function formatLocalTimestamp(d) {
514
+ const p = (n) => String(n).padStart(2, '0');
515
+ return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())} ${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())}`;
516
+ }
517
+ /** 联动的默认名,与设计器里生成的一致:`<公式名> - 公式_<时间戳>`。 */
518
+ export function buildFormulaLinkageName(excelName, at) {
519
+ return `${excelName} - 公式_${formatLocalTimestamp(at)}`;
520
+ }
521
+ /**
522
+ * 把列表/详情记录压成一份统一形状 —— 列表与详情**都能用**:
523
+ * `fullPageQueryByFormId` 的 `sourceExcel` 不带 `data`(没有公式正文),
524
+ * 所以那边的 `expression` 会是空串,这是正常的。
525
+ */
526
+ export function summarizeLinkage(record) {
527
+ const ds = (record?.dataSources || [])[0] || {};
528
+ const src = ds.sourceExcel || {};
529
+ const formula = src.data || {};
530
+ const actions = record?.monitorActions || [];
531
+ return {
532
+ id: String(record?.id ?? ''),
533
+ name: String(record?.linkageName ?? ''),
534
+ state: record?.linkageState !== false,
535
+ type: String(record?.linkageType ?? ''),
536
+ effect: extractEffect(record),
537
+ eventNames: [...new Set(actions.map((a) => String(a.actionName || a.actionType || '')))],
538
+ triggerIds: actions.flatMap((a) => (a.monitorFields || []).map((m) => String(m.targetField || ''))),
539
+ triggerNames: actions.map((a) => (a.monitorFields || []).map((m) => String(m.targetName || m.targetField || '')).join(',')).filter(Boolean),
540
+ excelId: String(src.excelId ?? ''),
541
+ excelName: String(src.excelName ?? ''),
542
+ expression: String(formula.formula || ''),
543
+ parameters: formula.parameters || [],
544
+ };
545
+ }
546
+ //# sourceMappingURL=form-formula-linkage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-formula-linkage.js","sourceRoot":"","sources":["../../src/services/form-formula-linkage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ import type { ApiClient } from '../core/client.js';
2
+ export interface CompPair {
3
+ label: any;
4
+ value: any;
5
+ }
6
+ export interface BuildCompPairInput {
7
+ /** 现有布局的平铺 comp 数组(`pageLayouts[].comps`)。 */
8
+ comps: any[];
9
+ /** 新字段的 fieldId(= 值组件的 `config.fieldId` 与 `associatedId`)。 */
10
+ fieldId: string;
11
+ /** 新字段标签组件的 `config.fieldId`(平台分配,与字段定义无关,只需布局内唯一)。 */
12
+ labelFieldId: string;
13
+ /** 字段标题,写进两个 comp 的 `config.title`。 */
14
+ title: string;
15
+ /** 字段定义(`getFormFieldPage` 的记录),用来覆盖抄来的字段定义那一半。 */
16
+ fieldDef: Record<string, any>;
17
+ /** 明细字段:明细表的 subFormId。不给就是主表字段。 */
18
+ subFormId?: string;
19
+ }
20
+ export type BuildOutcome = ({
21
+ ok: true;
22
+ } & CompPair) | {
23
+ ok: false;
24
+ error: string;
25
+ };
26
+ /**
27
+ * 把新字段的 comp 对构造出来(纯函数,不碰网络)。
28
+ *
29
+ * 位置按「同作用域里最大行 + 1」追加 —— 与设计器里手工拖到末尾的落点一致。
30
+ * 列沿用模板自己的列,这样单选/两列/多列布局都不用另外判断。
31
+ * 明细表容器**不参与行号计算**:它在顶层作用域里,但行号是自己的(常被摆在字段下面老远),
32
+ * 算进去会让新字段凭空多跳几行。
33
+ */
34
+ export declare function buildCompPair(input: BuildCompPairInput): BuildOutcome;
35
+ export interface InsertFieldInput extends Omit<BuildCompPairInput, 'comps'> {
36
+ /** 顺带改这些布局层属性(`form add-field` 的 --single-row 等)。 */
37
+ overrides?: Record<string, any>;
38
+ }
39
+ /**
40
+ * 读快照 → 存回,中间交给 `mutate` 改。**不碰 initLayout**。
41
+ *
42
+ * 抽出来是因为读存之间有几个不看代码想不到的约束,只该有一份实现:
43
+ * - 读和存之间**不能插别的写操作**:平台按 `updateTimeStamp` 做乐观锁,中途被改过就回
44
+ * 「当前页面不是最新数据,请刷新页面后编辑保存」。所以整段必须一口气跑完。
45
+ * - `formLayout` 里必须带 `formId`,否则平台在 `Form.getTenantKey()` 上直接 NPE,
46
+ * 报的是一句和表单八竿子打不着的 `"form" is null`。
47
+ * - `pageLayoutEncodes` / `formStyleEncodes` 是读侧的派生字段,回写前要删掉。
48
+ *
49
+ * `mutate` 拿到 pageLayouts 就地改;返回它想报告的任意信息。
50
+ */
51
+ export declare function mutateLayout<T>(client: ApiClient, baseUrl: string, formId: string, mutate: (pageLayouts: any[], snapshot: any) => T): Promise<T>;
52
+ /**
53
+ * 在布局里找某字段的值组件(跳过标签组件)。
54
+ *
55
+ * 认 **`config.associatedId`**,不是 `config.fieldId` —— 标签的 `config.fieldId` 是布局
56
+ * 自己另生成的,与字段定义没有对应关系(详见 `form-layout-comp-mapping` 那份结论)。
57
+ */
58
+ export declare function findValueComp(comps: any[], fieldId: string): any | null;
59
+ /**
60
+ * 给某字段的布局层属性打补丁(读 → 改 → 存一次完成)。
61
+ *
62
+ * `required` / `readOnly` / `display` / `singleRow` 这些**只存在于布局 comp 里**,
63
+ * 字段记录里没有对应的键(`getFormFieldPage` 的 53 个字段记录里都没有 `required`)。
64
+ * 所以「改字段属性」时只写字段记录等于什么都没做 —— 接口回 200、命令报成功、行为不变。
65
+ */
66
+ export declare function patchFieldLayout(client: ApiClient, baseUrl: string, formId: string, fieldId: string, patch: Record<string, any>): Promise<{
67
+ updated: number;
68
+ }>;
69
+ export interface InsertFieldResult {
70
+ row: number;
71
+ col: number;
72
+ labelCompId: string;
73
+ valueCompId: string;
74
+ /** 兜底提示(不阻断)。 */
75
+ warnings: string[];
76
+ }
77
+ /**
78
+ * 造 comp 对 → 插进去 → 存回。**不碰 initLayout**。
79
+ *
80
+ * 读快照与存回的约束见 `mutateLayout`(乐观锁、`formLayout.formId`、派生字段)。
81
+ * comp 对必须在回调里当场构造 —— 位置依赖刚刚读到的 comps,不能拿旧快照算。
82
+ */
83
+ export declare function insertFieldIntoLayout(client: ApiClient, baseUrl: string, formId: string, input: InsertFieldInput): Promise<InsertFieldResult>;
84
+ //# sourceMappingURL=form-layout-insert.d.ts.map