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,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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"}
@@ -34,26 +34,69 @@
34
34
  *
35
35
  * 明细引用的参数对象需带 `sFormId`(明细表 id) + `sFormName`(明细表名)。
36
36
  * 字段结构统一从 getEbField 取(主表 main + 明细 detail)。
37
+ *
38
+ * ## 模块字段(系统字段)
39
+ *
40
+ * `{主表.主表数据id}`、`{主表.当前日期}` 这类引用**不在** getEbField 的 main/detail 里,
41
+ * 得由调用方通过可选参数 `moduleColumns` 传进来(目前只有函数联动会传,来源是
42
+ * `linkage/findFormDrivingColumns` 的模块字段桶)。
43
+ *
44
+ * 下发时**一律写成裸标签**(`{主表.主表数据id}`)—— 语义键写法 `[formDataId]` 也会被归一到标签形态,
45
+ * 与平台落库的 `expressSql` 一致。不传 `moduleColumns` 时,模块字段仍按「未找到字段」报错(原有行为不变)。
46
+ *
47
+ * ## 选项引用(三段式)`{主表.性别.男}`
48
+ *
49
+ * 第三段是**选项名** —— 指「性别」字段里那个叫「男」的选项。
50
+ *
51
+ * 平台比的是**选项对象**,不是选项名的字符串:参数里带的是选项的 **`valueKey`**
52
+ * (`fieldType:"option"` + `id`=valueKey + `middleFieldIds`=[字段id],没有 `fieldId`/`title`)。
53
+ *
54
+ * 因此 `{主表.性别}=='男'` 这种写法**恒不成立** —— 它拿字段的 valueKey 去比字符串「男」。
55
+ * 要命的是平台**照收、不报错、回 200**,写完看着全绿、结果永远不对,所以解析时专门对
56
+ * 「选项型字段 vs 字符串字面量」出声警告。
57
+ *
58
+ * ⚠ 三段式**不能按第一个点切**:那样字段会变成 `性别.男`,然后报「未找到字段 性别.男」——
59
+ * 这正是「CLI 写不出选项比较」的老毛病(读得出来、写不回去)。必须整段切开数段数。
37
60
  */
38
61
  import type { ApiClient } from '../core/client.js';
39
62
  export interface FormulaParam {
40
63
  dataTemplateId: string;
41
- fieldId: string;
42
- formId: string;
64
+ /** 业务字段有;**选项参数没有这个键** —— 平台靠 `middleFieldIds` 定位它属于哪个字段。 */
65
+ fieldId?: string;
66
+ formId?: string;
43
67
  module: string;
44
68
  properKey: string;
45
69
  sFormId?: string;
46
70
  sFormName?: string;
47
- title: string;
71
+ title?: string;
48
72
  name: string;
49
- appId: string;
50
- id: null;
73
+ /** eb 表那条路由必给;流程表单的函数联动报文里没有这个键,就留空。 */
74
+ appId?: string;
75
+ /** 业务字段是 `null`;**选项参数是选项的 `valueKey`**。 */
76
+ id: string | null;
77
+ fieldType?: string;
78
+ direct?: boolean;
79
+ del?: boolean;
80
+ middleFieldIds?: string[];
81
+ directFormId?: string;
82
+ parent?: string;
83
+ formulaParentVarList?: unknown[];
84
+ dataSourceField?: boolean;
85
+ repeat?: boolean;
86
+ groupData?: boolean;
51
87
  }
52
88
  /** 一处字段引用。 */
53
89
  export interface FormulaRef {
54
90
  /** 表名。`{主表.x}` → `'主表'`;`[x]` 这种不带表名的写法 → `null`(待按字段名反查)。 */
55
91
  table: string | null;
56
92
  field: string;
93
+ /**
94
+ * 选项引用 `{主表.性别.男}` 的**第三段**:选项名。普通字段引用没有这一段。
95
+ *
96
+ * ⚠ 必须写**完整三段**才有这段:`[性别.男]` 只有两段,仍按「明细表.字段名」读 ——
97
+ * 方括号的两段式是既有写法,二者无法区分,不给它开后门。
98
+ */
99
+ option?: string;
57
100
  /** 原文,报错回显用。 */
58
101
  raw: string;
59
102
  /** 在表达式中的起止位置,供归一化改写。 */
@@ -77,6 +120,10 @@ export interface FormulaParseResult {
77
120
  * - `{主表.字段名}` / `{明细表名.字段名}` —— 平台存储格式
78
121
  * - `[字段名]` / `[表名.字段名]` —— 设计器编辑器的写法
79
122
  *
123
+ * **三段式是「选项引用」**:`{主表.性别.男}` 指「性别」字段里那个叫「男」的**选项**,
124
+ * 不是某个叫「性别.男」的字段。按第一个点切分会把字段读成 `性别.男`,然后报「未找到字段」——
125
+ * 那正是「用 CLI 表达不了选项比较」的老毛病(参数要的是选项的 valueKey,平台比的是选项对象)。
126
+ *
80
127
  * 重复出现**不去重** —— 每个出现位置都要单独一个参数(见文件头说明)。
81
128
  * 不做字符串字面量剔除:公式里写 `"["` 这种极端情况不在支持范围,误判会在解析阶段
82
129
  * 报「未找到字段」,比静默错绑安全。
@@ -90,5 +137,50 @@ export declare function parseFormulaRefs(expression: string): FormulaRef[];
90
137
  * 报错说的是真话:我们替用户要了个数字。
91
138
  */
92
139
  export declare function defaultReturnType(fieldKey: string | undefined): string;
93
- export declare function buildFormulaParameters(client: ApiClient, baseUrl: string, objId: string, appId: string, formId: string, expression: string): Promise<FormulaParseResult>;
140
+ /**
141
+ * 模块字段(系统字段)。只有函数联动那条链路会用到 —— 普通公式的字段来源是 `getEbField`,
142
+ * 里面没有这些字段。
143
+ *
144
+ * 三种键的约定(来自 `linkage/findFormDrivingColumns` 的模块字段桶):
145
+ * - `id`:**语义键**(`formDataId` / `current_date` / `system_operator_department_id`),不是雪花 id
146
+ * - `name`:裸中文标签(`主表数据id`),表达式里写的就是它
147
+ * - `descType`:**全大写**(`TEXT` / `DATE` / `OBJECT`),可直接当 `properKey` 用
148
+ *
149
+ * 业务字段恰好相反:`id` 是雪花、`descType` 是驼峰(`Text` / `Money`)。
150
+ */
151
+ export interface FormulaModuleColumn {
152
+ id: string;
153
+ name: string;
154
+ descType: string;
155
+ }
156
+ /** 业务字段与模块字段的字段来源。两条路由(eb 表的 `getEbField`、流程表单的 `getConfig`)
157
+ * 各自映射成这个形状,解析核只认它。 */
158
+ export interface FormulaRefContext {
159
+ /** 主表字段。元素形状沿用 `getEbField` 的 `{ id, showName, dataKey, componentKey }`,明细则用 `name`。 */
160
+ mainFields: any[];
161
+ /** 明细表:`{ detailTableId, tableName, fields: [] }`。 */
162
+ detailTables: any[];
163
+ moduleColumns?: FormulaModuleColumn[];
164
+ formId: string;
165
+ /** 公式参数的 `module`。eb 表 = `ebuilderform`;流程表单的函数联动 = `ebuildercard`。 */
166
+ module: string;
167
+ /** 给了才写 `appId` 键;`undefined` = 整个键不出现(流程表单那条路由就是这样)。 */
168
+ appId?: string;
169
+ /** 报错里指路的命令名,形如 `wf-form formula-linkage columns`。 */
170
+ hint?: string;
171
+ }
172
+ /**
173
+ * 引用解析与参数构建的**纯核** —— 不碰网络,字段来源由调用方注入。
174
+ *
175
+ * 两条路由共用它(eb 表的字段来源是 `getEbField`,流程表单是 `getConfig`),所以这里只放
176
+ * **与路由无关**的规则:方括号归一化成花括号、逐出现位置各给一份参数、明细引用带
177
+ * `sFormId`/`sFormName`、模块字段一律写裸标签、业务字段与模块字段撞名时业务字段胜出。
178
+ */
179
+ export declare function resolveFormulaRefs(expression: string, ctx: FormulaRefContext): FormulaParseResult;
180
+ /**
181
+ * eb 表那条路由:先取字段来源(`getEbField`)再调解析核。
182
+ *
183
+ * @param moduleColumns 模块字段(系统字段)候选。只有函数联动会传;**不传时行为与加这个参数之前完全一致**。
184
+ */
185
+ export declare function buildFormulaParameters(client: ApiClient, baseUrl: string, objId: string, appId: string, formId: string, expression: string, moduleColumns?: FormulaModuleColumn[]): Promise<FormulaParseResult>;
94
186
  //# sourceMappingURL=formula-detail.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"formula-detail.d.ts","sourceRoot":"","sources":["../../src/services/formula-detail.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,IAAI,CAAC;CACV;AAED,cAAc;AACd,MAAM,WAAW,UAAU;IACzB,8DAA8D;IAC9D,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,kCAAkC;IAClC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB;;;OAGG;IACH,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,EAAE,CAkBjE;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAKtE;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAClC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAC5C,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,kBAAkB,CAAC,CAgG7B"}
1
+ {"version":3,"file":"formula-detail.d.ts","sourceRoot":"","sources":["../../src/services/formula-detail.ts"],"names":[],"mappings":"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"}