weaver-e10-builder 1.0.10-beta → 1.0.11-beta
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.
- package/dist/commands/actionflow.d.ts.map +1 -1
- package/dist/commands/actionflow.js +10 -6
- package/dist/commands/actionflow.js.map +1 -1
- package/dist/commands/form-layout-init.d.ts.map +1 -1
- package/dist/commands/form-layout-init.js +7 -1
- package/dist/commands/form-layout-init.js.map +1 -1
- package/dist/commands/form.d.ts.map +1 -1
- package/dist/commands/form.js +54 -16
- package/dist/commands/form.js.map +1 -1
- package/dist/commands/wf-form.d.ts +18 -0
- package/dist/commands/wf-form.d.ts.map +1 -1
- package/dist/commands/wf-form.js +156 -181
- package/dist/commands/wf-form.js.map +1 -1
- package/dist/commands/workflow-create-workflow.d.ts.map +1 -1
- package/dist/commands/workflow-create-workflow.js +14 -0
- package/dist/commands/workflow-create-workflow.js.map +1 -1
- package/dist/commands/workflow-node-validate.d.ts.map +1 -1
- package/dist/commands/workflow-node-validate.js +16 -2
- package/dist/commands/workflow-node-validate.js.map +1 -1
- package/dist/commands/workflow-numbering.d.ts.map +1 -1
- package/dist/commands/workflow-numbering.js +18 -2
- package/dist/commands/workflow-numbering.js.map +1 -1
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +47 -35
- package/dist/commands/workflow.js.map +1 -1
- package/dist/services/actionflow/build_workflow_draft.d.ts.map +1 -1
- package/dist/services/actionflow/build_workflow_draft.js +23 -2
- package/dist/services/actionflow/build_workflow_draft.js.map +1 -1
- package/dist/services/actionflow/command_output.d.ts +6 -0
- package/dist/services/actionflow/command_output.d.ts.map +1 -0
- package/dist/services/actionflow/command_output.js +91 -0
- package/dist/services/actionflow/command_output.js.map +1 -0
- package/dist/services/actionflow/components/action_eb_add.d.ts.map +1 -1
- package/dist/services/actionflow/components/action_eb_add.js +5 -4
- package/dist/services/actionflow/components/action_eb_add.js.map +1 -1
- package/dist/services/actionflow/components/action_eb_delete.js +1 -1
- package/dist/services/actionflow/components/action_eb_delete.js.map +1 -1
- package/dist/services/actionflow/components/action_eb_update.js +4 -4
- package/dist/services/actionflow/components/action_eb_update.js.map +1 -1
- package/dist/services/actionflow/components/action_eb_update_compiler.d.ts.map +1 -1
- package/dist/services/actionflow/components/action_eb_update_compiler.js +4 -1
- package/dist/services/actionflow/components/action_eb_update_compiler.js.map +1 -1
- package/dist/services/actionflow/components/approve_create.js +1 -1
- package/dist/services/actionflow/components/approve_create.js.map +1 -1
- package/dist/services/actionflow/components/approve_trigger.d.ts.map +1 -1
- package/dist/services/actionflow/components/approve_trigger.js +48 -16
- package/dist/services/actionflow/components/approve_trigger.js.map +1 -1
- package/dist/services/actionflow/components/date_trigger.js +3 -3
- package/dist/services/actionflow/components/date_trigger.js.map +1 -1
- package/dist/services/actionflow/components/enquiry_form.d.ts.map +1 -1
- package/dist/services/actionflow/components/enquiry_form.js +15 -8
- package/dist/services/actionflow/components/enquiry_form.js.map +1 -1
- package/dist/services/actionflow/enrich_approve_trigger.d.ts.map +1 -1
- package/dist/services/actionflow/enrich_approve_trigger.js +47 -17
- package/dist/services/actionflow/enrich_approve_trigger.js.map +1 -1
- package/dist/services/actionflow/formula_service.d.ts.map +1 -1
- package/dist/services/actionflow/formula_service.js +71 -3
- package/dist/services/actionflow/formula_service.js.map +1 -1
- package/dist/services/actionflow/functions_catalog.d.ts +26 -0
- package/dist/services/actionflow/functions_catalog.d.ts.map +1 -0
- package/dist/services/actionflow/functions_catalog.js +8986 -0
- package/dist/services/actionflow/functions_catalog.js.map +1 -0
- package/dist/services/actionflow/functions_source.d.ts +7 -0
- package/dist/services/actionflow/functions_source.d.ts.map +1 -0
- package/dist/services/actionflow/functions_source.js +50 -0
- package/dist/services/actionflow/functions_source.js.map +1 -0
- package/dist/services/actionflow/generation_service.d.ts +8 -0
- package/dist/services/actionflow/generation_service.d.ts.map +1 -1
- package/dist/services/actionflow/generation_service.js +60 -2
- package/dist/services/actionflow/generation_service.js.map +1 -1
- package/dist/services/actionflow/preflight_service.d.ts +6 -0
- package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
- package/dist/services/actionflow/preflight_service.js +69 -0
- package/dist/services/actionflow/preflight_service.js.map +1 -1
- package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
- package/dist/services/actionflow/workflow_compiler.js +102 -85
- package/dist/services/actionflow/workflow_compiler.js.map +1 -1
- package/dist/services/actionflow/workflow_source.d.ts +2 -0
- package/dist/services/actionflow/workflow_source.d.ts.map +1 -1
- package/dist/services/actionflow/workflow_source.js +8 -0
- package/dist/services/actionflow/workflow_source.js.map +1 -1
- package/dist/services/workflow-operator.d.ts +3 -1
- package/dist/services/workflow-operator.d.ts.map +1 -1
- package/dist/services/workflow-operator.js +5 -4
- package/dist/services/workflow-operator.js.map +1 -1
- package/package.json +1 -1
package/dist/commands/wf-form.js
CHANGED
|
@@ -103,6 +103,120 @@ function mergeRuntimeSingleRow(configs, srSet) {
|
|
|
103
103
|
};
|
|
104
104
|
walk(configs);
|
|
105
105
|
}
|
|
106
|
+
// 落单/孤字段占满行(对齐 eb 表 form-create.ts:两列排布时「奇数个的最后一个」+「被 singleRow
|
|
107
|
+
// 挤落单的前一字段」自动 singleRow 独占整行,避免右列留白)。明细表恒 singleRow。
|
|
108
|
+
// 排布对象仅业务主字段;系统字段与 Fold/Collapse 分组容器原样保留(分组内字段由平台容器排布)。
|
|
109
|
+
function applyLoneSingleRows(configs) {
|
|
110
|
+
const isGroup = (c) => c.componentKey === 'Fold' || c.type === 'Collapse';
|
|
111
|
+
const isDetail = (c) => c.type === 'DetailTable' || c.componentKey === 'DataTable';
|
|
112
|
+
const isBusiness = (c) => !c.system && !isGroup(c) && !isDetail(c);
|
|
113
|
+
const mainFields = configs.filter(isBusiness);
|
|
114
|
+
const details = configs.filter(isDetail);
|
|
115
|
+
const others = configs.filter((c) => !isBusiness(c) && !isDetail(c));
|
|
116
|
+
const mainIds = mainFields.map((c) => String(c.id));
|
|
117
|
+
const detailIds = new Set(details.map((c) => String(c.id)));
|
|
118
|
+
// 奇数个最后一个落单 → 独占一行
|
|
119
|
+
const loneRowId = mainIds.length % 2 === 1 ? mainIds[mainIds.length - 1] : null;
|
|
120
|
+
// 落单兜底:模拟两列流,singleRow 字段位于 col=1 时其前一字段(col0 未配对)也标 singleRow
|
|
121
|
+
const orphanIds = new Set();
|
|
122
|
+
let col = 0;
|
|
123
|
+
let prevId = '';
|
|
124
|
+
for (const id of [...mainIds, ...details.map((c) => String(c.id))]) {
|
|
125
|
+
const c = mainFields.find((x) => String(x.id) === id) || details.find((x) => String(x.id) === id);
|
|
126
|
+
const isSingle = c?.singleRow === true || id === loneRowId || detailIds.has(id);
|
|
127
|
+
if (isSingle) {
|
|
128
|
+
if (col === 1 && prevId)
|
|
129
|
+
orphanIds.add(prevId);
|
|
130
|
+
col = 0;
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
col = col === 0 ? 1 : 0;
|
|
134
|
+
}
|
|
135
|
+
prevId = id;
|
|
136
|
+
}
|
|
137
|
+
const biz = mainFields.map((c) => ({
|
|
138
|
+
...c,
|
|
139
|
+
singleRow: String(c.id) === loneRowId || c.singleRow === true || orphanIds.has(String(c.id)),
|
|
140
|
+
}));
|
|
141
|
+
const det = details.map((d) => ({ ...d, singleRow: true }));
|
|
142
|
+
return [...others, ...biz, ...det];
|
|
143
|
+
}
|
|
144
|
+
// 读表单现有字段分组 → refFieldIds(initLayout/getConfig 的 groupFieldIds)。
|
|
145
|
+
// getFieldGroupPage 返回全部主表字段,字段 formField.group 带 groupId+groupName;
|
|
146
|
+
// refFieldId = groupId - 1(平台先分配 layout config 再分配 formFieldGroup,顺序相连)。
|
|
147
|
+
// 用于 field-prop / layout init 重跑 initLayout 时保留 Collapse 折叠分组。
|
|
148
|
+
async function fetchFormGroups(client, baseUrl, formId) {
|
|
149
|
+
try {
|
|
150
|
+
const r = await client.post(`${baseUrl}${ROUTE}/field/manage/getFieldGroupPage`, { pageNo: 1, pageSize: 100, module: MODULE, formFieldSearchEntity: { formId }, customParam: {} }, { ebbusinessid: formId });
|
|
151
|
+
const list = r?.data?.pageDatas?.result || [];
|
|
152
|
+
const seen = new Set();
|
|
153
|
+
for (const f of list) {
|
|
154
|
+
const g = f?.formField?.group;
|
|
155
|
+
if (g?.id)
|
|
156
|
+
seen.add(String(g.id));
|
|
157
|
+
}
|
|
158
|
+
return [...seen].map((id) => String(BigInt(id) - 1n));
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
return [];
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/** 初始化/重建流程表单布局(initLayout):getConfig 读 → 强制业务字段 readOnly=false(防 FLOW 模板默认锁死)
|
|
165
|
+
* → 合并运行时 singleRow → applyLoneSingleRows(落单/孤字段独占整行)→ initLayout 落库运行时布局。
|
|
166
|
+
* 供 `wf-form layout init` 与 `workflow create-workflow` 建后自动解锁、`wf-form add-field/add-fields/add-detail-table` 末尾重排复用。
|
|
167
|
+
* hooks.preLayout: 在合并运行时 singleRow 之后、applyLoneSingleRows 之前介入(add-field --single-row 用此给新字段单标 singleRow)。 */
|
|
168
|
+
export async function initWorkflowFormLayout(client, baseUrl, formId, o = {}, hooks = {}) {
|
|
169
|
+
const ebb = { ebbusinessid: formId };
|
|
170
|
+
const meta = await getLayoutMeta(client, baseUrl, formId);
|
|
171
|
+
if (!meta.layoutId)
|
|
172
|
+
throw new Error('无法获取 layoutId');
|
|
173
|
+
// 保留字段分组:getConfig/initLayout 带 groupFieldIds,否则 Collapse 折叠被冲掉
|
|
174
|
+
const groupIds = await fetchFormGroups(client, baseUrl, formId);
|
|
175
|
+
const cfgRes = await client.post(`${baseUrl}${ROUTE}/view/relate/getConfig`, {
|
|
176
|
+
formId, module: MODULE, apiModule: 'workflow/form', layoutId: meta.layoutId,
|
|
177
|
+
customParam: { terminal: '', objId: formId }, initMode: 5, groupFieldIds: groupIds,
|
|
178
|
+
designerParam: { sourceModule: MODULE },
|
|
179
|
+
}, ebb);
|
|
180
|
+
// 流程表单 FLOW 布局 getConfig 默认把业务字段 readOnly=true(锁死),init 时强制可编辑:
|
|
181
|
+
// 业务字段 readOnly=false / disableEdit=false(除非 --read-only 显式锁);明细/系统字段/Collapse 分组容器保留。
|
|
182
|
+
const configs = normalizeDetailTableChildren((cfgRes?.data?.configs || []).map((c) => {
|
|
183
|
+
const isBusiness = !c.system && c.componentKey !== 'DataTable' && c.type !== 'DetailTable' && c.type !== 'Collapse' && c.componentKey !== 'Fold';
|
|
184
|
+
const out = { ...c, display: c.system ? c.display : true, show: c.system ? c.show : true };
|
|
185
|
+
if (isBusiness) {
|
|
186
|
+
out.readOnly = o.readOnly === true;
|
|
187
|
+
out.disableEdit = false;
|
|
188
|
+
if (o.required !== undefined)
|
|
189
|
+
out.required = o.required;
|
|
190
|
+
if (o.singleRow !== undefined)
|
|
191
|
+
out.singleRow = o.singleRow;
|
|
192
|
+
}
|
|
193
|
+
return out;
|
|
194
|
+
}));
|
|
195
|
+
// 合并运行时已保存的 singleRow(getConfig 不带,防 initLayout 冲掉独占一行)
|
|
196
|
+
const initSrSet = await fetchRuntimeSingleRows(client, baseUrl, formId);
|
|
197
|
+
mergeRuntimeSingleRow(configs, initSrSet);
|
|
198
|
+
// 介入点:add-field --single-row 在此给新加字段单标 singleRow(早于 applyLoneSingleRows,让其 orphan 逻辑接得住)
|
|
199
|
+
if (hooks.preLayout)
|
|
200
|
+
hooks.preLayout(configs);
|
|
201
|
+
// 落单/孤字段占满行(对齐 eb 表):奇数个最后一个 + 被 singleRow 挤落单的前一字段自动 singleRow
|
|
202
|
+
const finalConfigs = applyLoneSingleRows(configs);
|
|
203
|
+
const styleTemplateId = o.styleTemplate
|
|
204
|
+
|| (meta.layoutType === 'FLOW' ? '820000000000000001' : '700000000000000008');
|
|
205
|
+
const initRes = await client.post(`${baseUrl}${ROUTE}/view/relate/initLayout`, {
|
|
206
|
+
formId, module: MODULE, apiModule: 'workflow/form', layoutId: meta.layoutId,
|
|
207
|
+
generateCollapse: o.generateCollapse !== false,
|
|
208
|
+
styleTemplateId: /^\d+$/.test(styleTemplateId) ? styleTemplateId : styleTemplateId, styleTemplateType: 1,
|
|
209
|
+
configs: finalConfigs, addLayout: false, ecodeType: ['js', 'css'], initMode: '1',
|
|
210
|
+
groupFieldIds: groupIds,
|
|
211
|
+
customParam: { terminal: '', objId: formId },
|
|
212
|
+
formLayoutMultiple: { isSys: true, id: meta.layoutMultiId, name: meta.layoutName, terminalType: 'PC', layoutType: meta.layoutType },
|
|
213
|
+
designerParam: { onlyLayout: false },
|
|
214
|
+
}, ebb);
|
|
215
|
+
if (initRes?.code !== 200 || !initRes?.status)
|
|
216
|
+
throw new Error(`initLayout 失败: ${initRes?.msg}`);
|
|
217
|
+
const comps = initRes?.data?.pageLayouts?.[0]?.comps || initRes?.data?.formLayout?.pageLayouts?.[0]?.comps || [];
|
|
218
|
+
return { layoutType: meta.layoutType, styleTemplateId, comps: comps.length };
|
|
219
|
+
}
|
|
106
220
|
async function genIds(client, baseUrl, n) {
|
|
107
221
|
const r = await client.post(`${baseUrl}/api/form/local/generatorIds?size=${n}`, {});
|
|
108
222
|
return (r?.data?.generatorIds || []).map(String);
|
|
@@ -329,39 +443,26 @@ export function registerWorkflowFormCommands(program) {
|
|
|
329
443
|
? JSON.stringify({ success: true, formId, fieldId, fieldName, componentKey: jsonObj.componentKey, subFormId: o.subFormId || undefined }, null, 2)
|
|
330
444
|
: `字段已加: ${fieldName} (${jsonObj.componentKey}) fieldId=${fieldId}${o.subFormId ? ` (明细 ${o.subFormId})` : ''}${ck === 'Select' ? ' 注:选项需单独配' : ''}`);
|
|
331
445
|
// 末尾自动 layout init(解决 add-field 不自动重新布局的缺口,对齐 add-fields 批量)。
|
|
332
|
-
//
|
|
446
|
+
// 走 initWorkflowFormLayout:强制业务字段可编辑(防 FLOW 锁死)+ 合并运行时 singleRow + applyLoneSingleRows(落单独占整行)。
|
|
333
447
|
if (o.init !== false) {
|
|
334
448
|
try {
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
if (c.children?.length)
|
|
353
|
-
walkSet(c.children);
|
|
354
|
-
} };
|
|
355
|
-
walkSet(initConfigs);
|
|
356
|
-
}
|
|
357
|
-
const styleTemplateId = initMeta.layoutType === 'FLOW' ? '820000000000000001' : '700000000000000008';
|
|
358
|
-
await client.post(`${baseUrl}${ROUTE}/view/relate/initLayout`, {
|
|
359
|
-
formId, module: MODULE, apiModule: 'workflow/form', layoutId: initMeta.layoutId, generateCollapse: true,
|
|
360
|
-
styleTemplateId, styleTemplateType: 1, configs: initConfigs, addLayout: false, ecodeType: ['js', 'css'],
|
|
361
|
-
initMode: '1', customParam: { terminal: '', objId: formId },
|
|
362
|
-
formLayoutMultiple: { isSys: true, id: initMeta.layoutMultiId, name: initMeta.layoutName, terminalType: 'PC', layoutType: initMeta.layoutType },
|
|
363
|
-
designerParam: { onlyLayout: false },
|
|
364
|
-
}, ebb);
|
|
449
|
+
await initWorkflowFormLayout(client, baseUrl, formId, {}, o.singleRow ? {
|
|
450
|
+
preLayout: (cfgs) => {
|
|
451
|
+
// --single-row:field jsonObj 的 singleRow 平台不落到 layout comp(getConfig 不带),
|
|
452
|
+
// 显式给新加字段 config.singleRow=true(递归找 fieldId,含明细 children)。
|
|
453
|
+
const walkSet = (arr) => {
|
|
454
|
+
for (const c of arr) {
|
|
455
|
+
if (String(c.id) === String(fieldId)) {
|
|
456
|
+
c.singleRow = true;
|
|
457
|
+
c.columnRatio = '12';
|
|
458
|
+
}
|
|
459
|
+
if (c.children?.length)
|
|
460
|
+
walkSet(c.children);
|
|
461
|
+
}
|
|
462
|
+
};
|
|
463
|
+
walkSet(cfgs);
|
|
464
|
+
},
|
|
465
|
+
} : undefined);
|
|
365
466
|
console.error(` 布局已 init`);
|
|
366
467
|
}
|
|
367
468
|
catch (e) {
|
|
@@ -956,25 +1057,17 @@ export function registerWorkflowFormCommands(program) {
|
|
|
956
1057
|
}
|
|
957
1058
|
console.error(`已加 ${added}/${defs.length} 个字段`);
|
|
958
1059
|
// 末尾自动 layout init(解决 add-field 不自动重新布局的缺口)
|
|
1060
|
+
// 走 initWorkflowFormLayout:强制业务字段可编辑(防 FLOW 锁死)+ 合并运行时 singleRow + applyLoneSingleRows(落单独占整行)。
|
|
959
1061
|
let compCount = 0;
|
|
960
1062
|
if (cmdOpts.init !== false && added > 0) {
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
const initRes = await client.post(`${baseUrl}${ROUTE}/view/relate/initLayout`, {
|
|
970
|
-
formId, module: MODULE, apiModule: 'workflow/form', layoutId: meta.layoutId, generateCollapse: true,
|
|
971
|
-
styleTemplateId, styleTemplateType: 1, configs, addLayout: false, ecodeType: ['js', 'css'],
|
|
972
|
-
initMode: '1', customParam: { terminal: '', objId: formId },
|
|
973
|
-
formLayoutMultiple: { isSys: true, id: meta.layoutMultiId, name: meta.layoutName, terminalType: 'PC', layoutType: meta.layoutType },
|
|
974
|
-
designerParam: { onlyLayout: false },
|
|
975
|
-
}, ebb);
|
|
976
|
-
compCount = initRes?.data?.pageLayouts?.[0]?.comps?.length || initRes?.data?.formLayout?.pageLayouts?.[0]?.comps?.length || 0;
|
|
977
|
-
console.error(` 布局已 init: 组件 ${compCount} 个`);
|
|
1063
|
+
try {
|
|
1064
|
+
const r = await initWorkflowFormLayout(client, baseUrl, formId);
|
|
1065
|
+
compCount = r.comps;
|
|
1066
|
+
console.error(` 布局已 init: 组件 ${compCount} 个`);
|
|
1067
|
+
}
|
|
1068
|
+
catch (e) {
|
|
1069
|
+
console.error(` 布局 init 失败: ${e?.message || e}(字段已加,手动跑 wf-form layout init)`);
|
|
1070
|
+
}
|
|
978
1071
|
}
|
|
979
1072
|
console.log(opts.json
|
|
980
1073
|
? JSON.stringify({ success: true, formId, added, total: defs.length, initComps: compCount || undefined }, null, 2)
|
|
@@ -1341,33 +1434,18 @@ export function registerWorkflowFormCommands(program) {
|
|
|
1341
1434
|
if (o.init) {
|
|
1342
1435
|
if (!firstFieldName)
|
|
1343
1436
|
throw new Error('--init 需配合首字段名(空子表放不了 DetailTable)');
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
} // FLOW 默认锁,强制可编辑
|
|
1357
|
-
return out;
|
|
1358
|
-
}));
|
|
1359
|
-
const styleTemplateId = meta.layoutType === 'FLOW' ? '820000000000000001' : '700000000000000008';
|
|
1360
|
-
const initRes = await client.post(`${baseUrl}${ROUTE}/view/relate/initLayout`, {
|
|
1361
|
-
formId, module: MODULE, apiModule: 'workflow/form', layoutId: meta.layoutId, generateCollapse: true,
|
|
1362
|
-
styleTemplateId, styleTemplateType: 1, configs, addLayout: false, ecodeType: ['js', 'css'],
|
|
1363
|
-
initMode: '1', customParam: { terminal: '', objId: formId },
|
|
1364
|
-
formLayoutMultiple: { isSys: true, id: meta.layoutMultiId, name: meta.layoutName, terminalType: 'PC', layoutType: meta.layoutType },
|
|
1365
|
-
designerParam: { onlyLayout: false },
|
|
1366
|
-
}, ebb);
|
|
1367
|
-
if (initRes?.code !== 200 || !initRes?.status)
|
|
1368
|
-
throw new Error(`initLayout 失败: ${initRes?.msg}`);
|
|
1369
|
-
compCount = initRes?.data?.pageLayouts?.[0]?.comps?.length || initRes?.data?.formLayout?.pageLayouts?.[0]?.comps?.length || 0;
|
|
1370
|
-
console.error(` 布局已 init: 组件 ${compCount} 个(含 DetailTable)`);
|
|
1437
|
+
// 走 initWorkflowFormLayout:强制业务字段可编辑 + applyLoneSingleRows(落单独占整行)+ 保留分组;
|
|
1438
|
+
// DetailTable 由 normalizeDetailTableChildren 保留在 configs,applyLoneSingleRows 对明细恒 singleRow。
|
|
1439
|
+
try {
|
|
1440
|
+
const r = await initWorkflowFormLayout(client, baseUrl, formId);
|
|
1441
|
+
compCount = r.comps;
|
|
1442
|
+
console.error(` 布局已 init: 组件 ${compCount} 个(含 DetailTable)`);
|
|
1443
|
+
}
|
|
1444
|
+
catch (e) {
|
|
1445
|
+
if (e?.message?.includes('initLayout'))
|
|
1446
|
+
throw e;
|
|
1447
|
+
throw new Error(`initLayout 失败: ${e?.message || e}`);
|
|
1448
|
+
}
|
|
1371
1449
|
}
|
|
1372
1450
|
console.log(opts.json
|
|
1373
1451
|
? JSON.stringify({ success: true, formId, subFormId, name, dataKey, firstFieldId, initComps: compCount || undefined }, null, 2)
|
|
@@ -1381,64 +1459,6 @@ export function registerWorkflowFormCommands(program) {
|
|
|
1381
1459
|
process.exitCode = 1;
|
|
1382
1460
|
}
|
|
1383
1461
|
});
|
|
1384
|
-
// 落单/孤字段占满行(对齐 eb 表 form-create.ts:两列排布时「奇数个的最后一个」+「被 singleRow
|
|
1385
|
-
// 挤落单的前一字段」自动 singleRow 独占整行,避免右列留白)。明细表恒 singleRow。
|
|
1386
|
-
// 排布对象仅业务主字段;系统字段与 Fold/Collapse 分组容器原样保留(分组内字段由平台容器排布)。
|
|
1387
|
-
function applyLoneSingleRows(configs) {
|
|
1388
|
-
const isGroup = (c) => c.componentKey === 'Fold' || c.type === 'Collapse';
|
|
1389
|
-
const isDetail = (c) => c.type === 'DetailTable' || c.componentKey === 'DataTable';
|
|
1390
|
-
const isBusiness = (c) => !c.system && !isGroup(c) && !isDetail(c);
|
|
1391
|
-
const mainFields = configs.filter(isBusiness);
|
|
1392
|
-
const details = configs.filter(isDetail);
|
|
1393
|
-
const others = configs.filter((c) => !isBusiness(c) && !isDetail(c));
|
|
1394
|
-
const mainIds = mainFields.map((c) => String(c.id));
|
|
1395
|
-
const detailIds = new Set(details.map((c) => String(c.id)));
|
|
1396
|
-
// 奇数个最后一个落单 → 独占一行
|
|
1397
|
-
const loneRowId = mainIds.length % 2 === 1 ? mainIds[mainIds.length - 1] : null;
|
|
1398
|
-
// 落单兜底:模拟两列流,singleRow 字段位于 col=1 时其前一字段(col0 未配对)也标 singleRow
|
|
1399
|
-
const orphanIds = new Set();
|
|
1400
|
-
let col = 0;
|
|
1401
|
-
let prevId = '';
|
|
1402
|
-
for (const id of [...mainIds, ...details.map((c) => String(c.id))]) {
|
|
1403
|
-
const c = mainFields.find((x) => String(x.id) === id) || details.find((x) => String(x.id) === id);
|
|
1404
|
-
const isSingle = c?.singleRow === true || id === loneRowId || detailIds.has(id);
|
|
1405
|
-
if (isSingle) {
|
|
1406
|
-
if (col === 1 && prevId)
|
|
1407
|
-
orphanIds.add(prevId);
|
|
1408
|
-
col = 0;
|
|
1409
|
-
}
|
|
1410
|
-
else {
|
|
1411
|
-
col = col === 0 ? 1 : 0;
|
|
1412
|
-
}
|
|
1413
|
-
prevId = id;
|
|
1414
|
-
}
|
|
1415
|
-
const biz = mainFields.map((c) => ({
|
|
1416
|
-
...c,
|
|
1417
|
-
singleRow: String(c.id) === loneRowId || c.singleRow === true || orphanIds.has(String(c.id)),
|
|
1418
|
-
}));
|
|
1419
|
-
const det = details.map((d) => ({ ...d, singleRow: true }));
|
|
1420
|
-
return [...others, ...biz, ...det];
|
|
1421
|
-
}
|
|
1422
|
-
// 读表单现有字段分组 → refFieldIds(initLayout/getConfig 的 groupFieldIds)。
|
|
1423
|
-
// getFieldGroupPage 返回全部主表字段,字段 formField.group 带 groupId+groupName;
|
|
1424
|
-
// refFieldId = groupId - 1(平台先分配 layout config 再分配 formFieldGroup,顺序相连)。
|
|
1425
|
-
// 用于 field-prop / layout init 重跑 initLayout 时保留 Collapse 折叠分组。
|
|
1426
|
-
async function fetchFormGroups(client, baseUrl, formId) {
|
|
1427
|
-
try {
|
|
1428
|
-
const r = await client.post(`${baseUrl}${ROUTE}/field/manage/getFieldGroupPage`, { pageNo: 1, pageSize: 100, module: MODULE, formFieldSearchEntity: { formId }, customParam: {} }, { ebbusinessid: formId });
|
|
1429
|
-
const list = r?.data?.pageDatas?.result || [];
|
|
1430
|
-
const seen = new Set();
|
|
1431
|
-
for (const f of list) {
|
|
1432
|
-
const g = f?.formField?.group;
|
|
1433
|
-
if (g?.id)
|
|
1434
|
-
seen.add(String(g.id));
|
|
1435
|
-
}
|
|
1436
|
-
return [...seen].map((id) => String(BigInt(id) - 1n));
|
|
1437
|
-
}
|
|
1438
|
-
catch {
|
|
1439
|
-
return [];
|
|
1440
|
-
}
|
|
1441
|
-
}
|
|
1442
1462
|
// ---------- wf-form group(字段分组,对齐 eb 表)----------
|
|
1443
1463
|
// 流程表单字段分组(基本信息/系统设置等折叠容器)。三步接口(module=workflow,实测可用):
|
|
1444
1464
|
// ① saveFieldGroup 建分组 → data.group.id(formFieldGroup记录id) + refFieldId(layout Collapse id)
|
|
@@ -1697,55 +1717,10 @@ export function registerWorkflowFormCommands(program) {
|
|
|
1697
1717
|
throw new Error('无法加载认证');
|
|
1698
1718
|
const client = new ApiClient(auth);
|
|
1699
1719
|
const baseUrl = auth.getBaseUrl();
|
|
1700
|
-
const
|
|
1701
|
-
const meta = await getLayoutMeta(client, baseUrl, formId);
|
|
1702
|
-
if (!meta.layoutId)
|
|
1703
|
-
throw new Error('无法获取 layoutId');
|
|
1704
|
-
// 保留字段分组:getConfig/initLayout 带 groupFieldIds,否则 Collapse 折叠被冲掉
|
|
1705
|
-
const groupIds = await fetchFormGroups(client, baseUrl, formId);
|
|
1706
|
-
const cfgRes = await client.post(`${baseUrl}${ROUTE}/view/relate/getConfig`, {
|
|
1707
|
-
formId, module: MODULE, apiModule: 'workflow/form', layoutId: meta.layoutId,
|
|
1708
|
-
customParam: { terminal: '', objId: formId }, initMode: 5, groupFieldIds: groupIds,
|
|
1709
|
-
designerParam: { sourceModule: MODULE },
|
|
1710
|
-
}, ebb);
|
|
1711
|
-
// 流程表单 FLOW 布局 getConfig 默认把业务字段 readOnly=true(锁死),init 时强制可编辑:
|
|
1712
|
-
// 业务字段 readOnly=false / disableEdit=false(除非 --read-only 显式锁);明细/系统字段/Collapse 分组容器保留。
|
|
1713
|
-
const configs = normalizeDetailTableChildren((cfgRes?.data?.configs || []).map((c) => {
|
|
1714
|
-
const isBusiness = !c.system && c.componentKey !== 'DataTable' && c.type !== 'DetailTable' && c.type !== 'Collapse' && c.componentKey !== 'Fold';
|
|
1715
|
-
const out = { ...c, display: c.system ? c.display : true, show: c.system ? c.show : true };
|
|
1716
|
-
if (isBusiness) {
|
|
1717
|
-
out.readOnly = o.readOnly === true;
|
|
1718
|
-
out.disableEdit = false;
|
|
1719
|
-
if (o.required !== undefined)
|
|
1720
|
-
out.required = o.required;
|
|
1721
|
-
if (o.singleRow !== undefined)
|
|
1722
|
-
out.singleRow = o.singleRow;
|
|
1723
|
-
}
|
|
1724
|
-
return out;
|
|
1725
|
-
}));
|
|
1726
|
-
// 合并运行时已保存的 singleRow(getConfig 不带,防 initLayout 冲掉独占一行)
|
|
1727
|
-
const initSrSet = await fetchRuntimeSingleRows(client, baseUrl, formId);
|
|
1728
|
-
mergeRuntimeSingleRow(configs, initSrSet);
|
|
1729
|
-
// 落单/孤字段占满行(对齐 eb 表):奇数个最后一个 + 被 singleRow 挤落单的前一字段自动 singleRow
|
|
1730
|
-
const finalConfigs = applyLoneSingleRows(configs);
|
|
1731
|
-
const styleTemplateId = o.styleTemplate
|
|
1732
|
-
|| (meta.layoutType === 'FLOW' ? '820000000000000001' : '700000000000000008');
|
|
1733
|
-
const initRes = await client.post(`${baseUrl}${ROUTE}/view/relate/initLayout`, {
|
|
1734
|
-
formId, module: MODULE, apiModule: 'workflow/form', layoutId: meta.layoutId,
|
|
1735
|
-
generateCollapse: o.generateCollapse !== false,
|
|
1736
|
-
styleTemplateId: /^\d+$/.test(styleTemplateId) ? styleTemplateId : styleTemplateId, styleTemplateType: 1,
|
|
1737
|
-
configs: finalConfigs, addLayout: false, ecodeType: ['js', 'css'], initMode: '1',
|
|
1738
|
-
groupFieldIds: groupIds,
|
|
1739
|
-
customParam: { terminal: '', objId: formId },
|
|
1740
|
-
formLayoutMultiple: { isSys: true, id: meta.layoutMultiId, name: meta.layoutName, terminalType: 'PC', layoutType: meta.layoutType },
|
|
1741
|
-
designerParam: { onlyLayout: false },
|
|
1742
|
-
}, ebb);
|
|
1743
|
-
if (initRes?.code !== 200 || !initRes?.status)
|
|
1744
|
-
throw new Error(`initLayout 失败: ${initRes?.msg}`);
|
|
1745
|
-
const comps = initRes?.data?.pageLayouts?.[0]?.comps || initRes?.data?.formLayout?.pageLayouts?.[0]?.comps || [];
|
|
1720
|
+
const r = await initWorkflowFormLayout(client, baseUrl, formId, o);
|
|
1746
1721
|
console.log(opts.json
|
|
1747
|
-
? JSON.stringify({ success: true, formId, layoutType:
|
|
1748
|
-
: `布局已初始化: 类型=${
|
|
1722
|
+
? JSON.stringify({ success: true, formId, layoutType: r.layoutType, styleTemplateId: r.styleTemplateId, comps: r.comps }, null, 2)
|
|
1723
|
+
: `布局已初始化: 类型=${r.layoutType} 模板=${r.styleTemplateId} 组件=${r.comps}`);
|
|
1749
1724
|
}
|
|
1750
1725
|
catch (e) {
|
|
1751
1726
|
console.error(`初始化布局失败: ${e.message}`);
|