weaver-e10-builder 1.6.6 → 1.6.8

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 (64) hide show
  1. package/dist/commands/form-browser-definition.d.ts.map +1 -1
  2. package/dist/commands/form-browser-definition.js +8 -0
  3. package/dist/commands/form-browser-definition.js.map +1 -1
  4. package/dist/commands/form-ebuilder-scope.d.ts.map +1 -1
  5. package/dist/commands/form-ebuilder-scope.js +8 -3
  6. package/dist/commands/form-ebuilder-scope.js.map +1 -1
  7. package/dist/commands/form.d.ts.map +1 -1
  8. package/dist/commands/form.js +20 -0
  9. package/dist/commands/form.js.map +1 -1
  10. package/dist/commands/wf-form.d.ts.map +1 -1
  11. package/dist/commands/wf-form.js +134 -2
  12. package/dist/commands/wf-form.js.map +1 -1
  13. package/dist/commands/workflow.d.ts.map +1 -1
  14. package/dist/commands/workflow.js +18 -2
  15. package/dist/commands/workflow.js.map +1 -1
  16. package/dist/services/action-detail.d.ts +4 -0
  17. package/dist/services/action-detail.d.ts.map +1 -1
  18. package/dist/services/action-detail.js +49 -9
  19. package/dist/services/action-detail.js.map +1 -1
  20. package/dist/services/actionflow/components/enquiry_form.d.ts.map +1 -1
  21. package/dist/services/actionflow/components/enquiry_form.js +9 -2
  22. package/dist/services/actionflow/components/enquiry_form.js.map +1 -1
  23. package/dist/services/actionflow/components/send_message.d.ts.map +1 -1
  24. package/dist/services/actionflow/components/send_message.js +5 -2
  25. package/dist/services/actionflow/components/send_message.js.map +1 -1
  26. package/dist/services/actionflow/components/time_batch_trigger.js +3 -3
  27. package/dist/services/actionflow/components/time_batch_trigger.js.map +1 -1
  28. package/dist/services/actionflow/form_source.d.ts.map +1 -1
  29. package/dist/services/actionflow/form_source.js +53 -26
  30. package/dist/services/actionflow/form_source.js.map +1 -1
  31. package/dist/services/actionflow/formula_service.d.ts.map +1 -1
  32. package/dist/services/actionflow/formula_service.js +49 -9
  33. package/dist/services/actionflow/formula_service.js.map +1 -1
  34. package/dist/services/actionflow/generation_service.d.ts.map +1 -1
  35. package/dist/services/actionflow/generation_service.js +32 -0
  36. package/dist/services/actionflow/generation_service.js.map +1 -1
  37. package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
  38. package/dist/services/actionflow/preflight_service.js +51 -1
  39. package/dist/services/actionflow/preflight_service.js.map +1 -1
  40. package/dist/services/actionflow/readback_verifier.d.ts.map +1 -1
  41. package/dist/services/actionflow/readback_verifier.js +6 -2
  42. package/dist/services/actionflow/readback_verifier.js.map +1 -1
  43. package/dist/services/actionflow/trigger_common.d.ts.map +1 -1
  44. package/dist/services/actionflow/trigger_common.js +5 -1
  45. package/dist/services/actionflow/trigger_common.js.map +1 -1
  46. package/dist/services/form-linkage-condition.d.ts +23 -2
  47. package/dist/services/form-linkage-condition.d.ts.map +1 -1
  48. package/dist/services/form-linkage-condition.js +54 -11
  49. package/dist/services/form-linkage-condition.js.map +1 -1
  50. package/dist/services/workflow-info.d.ts +3 -1
  51. package/dist/services/workflow-info.d.ts.map +1 -1
  52. package/dist/services/workflow-info.js.map +1 -1
  53. package/dist/services/workflow-node-layout.d.ts +133 -15
  54. package/dist/services/workflow-node-layout.d.ts.map +1 -1
  55. package/dist/services/workflow-node-layout.js +394 -0
  56. package/dist/services/workflow-node-layout.js.map +1 -1
  57. package/package.json +1 -1
  58. package/skill-docs/SKILL.md +162 -162
  59. package/skill-docs/_catalog.md +1 -1
  60. package/skill-docs/references/common/ref-cli-commands.md +8 -5
  61. package/skill-docs/references/form/guide-browser-definition.md +62 -4
  62. package/skill-docs/references/form/guide-form-linkage.md +16 -8
  63. package/skill-docs/references/form/layout/workflow-layout.md +45 -0
  64. package/skill-docs/references/workflow/guide-workflow-node-layout.md +3 -2
@@ -1 +1 @@
1
- {"version":3,"file":"wf-form.d.ts","sourceRoot":"","sources":["../../src/commands/wf-form.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAyP9C;;;gHAGgH;AAChH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAClD,CAAC,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAO,EACzK,KAAK,GAAE;IAAE,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;CAAO,GACnD,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAiEzE;AAWD,yCAAyC;AACzC,UAAU,SAAS;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAChG,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxE,yEAAyE;IACzE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C,uDAAuD;IACvD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,eAAO,MAAM,eAAe,aAG1B,CAAC;AAEH;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,SAAS,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EACtF,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GACvE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAiIlC;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAg/DtE"}
1
+ {"version":3,"file":"wf-form.d.ts","sourceRoot":"","sources":["../../src/commands/wf-form.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AA2P9C;;;gHAGgH;AAChH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAClD,CAAC,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAO,EACzK,KAAK,GAAE;IAAE,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;CAAO,GACnD,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAiEzE;AAWD,yCAAyC;AACzC,UAAU,SAAS;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAChG,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxE,yEAAyE;IACzE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C,uDAAuD;IACvD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,eAAO,MAAM,eAAe,aAG1B,CAAC;AAEH;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,SAAS,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EACtF,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GACvE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAiIlC;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAsmEtE"}
@@ -10,7 +10,9 @@ import { resolveBrowserByName } from '../services/browser.js';
10
10
  import { randomUUID } from 'node:crypto';
11
11
  import { readFileSync } from 'node:fs';
12
12
  import { buildConditionDetail, resolveWorkflowEffect, readLinkageConfig } from '../services/form-linkage-condition.js';
13
+ import { resolveSourceForm } from '../services/action-detail.js';
13
14
  import { resolveFormulaRefs } from '../services/formula-detail.js';
15
+ import { addSystemFieldsToLayout, setDefaultLayout, updateFormLayout } from '../services/workflow-node-layout.js';
14
16
  import { FLOW_ROUTE, assertAssignableTarget, buildAssignExpression, buildDrivingColumnsBody, buildDrivingEventsBody, buildFdEffect, buildFormulaLinkageName, buildFormulaSavePayload, buildLinkageApiUrl, buildLinkageExt, buildLinkageDeleteBody, buildLinkageListBody, buildLinkageQueryBody, buildLinkageSavePayload, buildLinkageUpdatePayload, buildMonitorActions, buildPreCheckBody, buildTriggerSpecs, describeColumn, extractEffect, findAssignEquals, formatSpecsLine, isAssignableTarget, isWorkflowDimension, mergeMonitorActions, moduleColumnsOf, partitionDrivingColumns, resolveDrivingColumn, specsFromStoredTriggers, storedTriggers, summarizeLinkage, formatTriggerLine, targetDriftWarning, toBareLabel, } from '../services/form-formula-linkage.js';
15
17
  /** 流程表单选项配色(对齐浏览器抓包 styleConfig.OptionBackground,循环取用)。 */
16
18
  const OPTION_COLORS = ['#FFBD4F', '#FF716E', '#3BD8C3', '#5B8FF9', '#5AD8A6', '#F6BD16', '#E86452', '#6DC8EC', '#945FB9', '#FF99C3'];
@@ -1038,8 +1040,8 @@ export function registerWorkflowFormCommands(program) {
1038
1040
  .argument('<formId>', '流程表单 formId')
1039
1041
  .argument('<name>', '联动名称')
1040
1042
  .requiredOption('--config <json>', '联动配置 JSON:{"conditions":[{"field":"请假天数","operator":"EQUAL","value":"3"}],"actions":[{"prop":"hide","fields":["请假事由"]}]}。prop: hide/show/edit/readonly/required/hideLine;'
1041
- + 'operator: EQUAL/NOT_EQUAL/CONTAIN/NOT_CONTAIN/GREATER/LESS/GREATER_EQUAL/LESS_EQUAL,'
1042
- + '**为空写 NULL(或 EMPTY,会归一)、不为空写 NOT_NULL**(默认 EQUAL);'
1043
+ + 'operator: EQUAL/GREATER/LESS/GREATER_EQUAL/LESS_EQUAL,**为空写 NULL(或 EMPTY,会归一)、不为空写 NOT_NULL**(默认 EQUAL);'
1044
+ + '不等于/包含/不包含改写在 config 的 formula 里(Boolean 公式);'
1043
1045
  + '顶层可选 "detailType":"AND|OR"(界面上「所有」/「任一」);'
1044
1046
  + '"effect" 指定生效维度:不写=当前表单,"workFlow"=当前工作流,"includeNode"=选择节点(后者另需 "nodeId")')
1045
1047
  .option('--workflow-id <id>', '流程 ID。生效维度选「当前工作流」或「选择节点」时必给(该联动挂在流程上,refId 也是它)')
@@ -1052,6 +1054,18 @@ export function registerWorkflowFormCommands(program) {
1052
1054
  const client = new ApiClient(auth);
1053
1055
  const baseUrl = auth.getBaseUrl();
1054
1056
  const ebb = { ebbusinessid: formId };
1057
+ // 流程绑的是 EB 卡片表单时,这条路由的 getConfig 只回系统字段,业务字段一个都读不到。
1058
+ // 显示属性联动该走 EB 表单路由(module=ebuilderform),这里直接把 appId/objId 解出来。
1059
+ if (cmdOpts.workflowId) {
1060
+ const ebRef = await resolveSourceForm(client, baseUrl, cmdOpts.workflowId);
1061
+ if (ebRef && ebRef.sourceFormId === formId) {
1062
+ throw new Error(`该流程绑定的是 EB 卡片表单(appId=${ebRef.sourceAppId},objId=${ebRef.sourceObjId}),`
1063
+ + '显示属性联动要走 EB 表单路由:\n'
1064
+ + ` e10-cli form linkage add ${ebRef.sourceAppId} ${ebRef.sourceObjId} "<联动名称>" --config @rule.json\n`
1065
+ + `字段 ID 用 e10-cli form read ${ebRef.sourceObjId} --app-id ${ebRef.sourceAppId} 查。`
1066
+ + 'wf-form linkage 只适用于原生流程表单。');
1067
+ }
1068
+ }
1055
1069
  const cfg = readLinkageConfig(cmdOpts.config);
1056
1070
  if (!Array.isArray(cfg.conditions) || !Array.isArray(cfg.actions) || !cfg.actions.length) {
1057
1071
  throw new Error('config 需含 conditions[] 和非空 actions[]');
@@ -1062,6 +1076,11 @@ export function registerWorkflowFormCommands(program) {
1062
1076
  throw new Error(`action prop 不支持(仅 ${SUPPORTED.join(',')})`);
1063
1077
  // getConfig 解析字段名 → fieldId/dataKey/componentKey(主表 + 明细 children)
1064
1078
  const { configs } = await readConfigs(client, baseUrl, formId);
1079
+ if (!configs.some((c) => !c.system)) {
1080
+ throw new Error('表单调取不到业务字段(getConfig 只回了系统字段)。流程绑定 EB 卡片表单时,'
1081
+ + 'wf-form linkage 这条原生路由读不到它的字段:先用 `workflow info <workflowId>` 取 objId/appId,'
1082
+ + '改用 `form linkage <appId> <objId>`;传 --workflow-id 可让命令直接判定并给出该命令。');
1083
+ }
1065
1084
  const allFields = [];
1066
1085
  for (const c of configs) {
1067
1086
  if (c.system)
@@ -2084,6 +2103,119 @@ export function registerWorkflowFormCommands(program) {
2084
2103
  process.exitCode = 1;
2085
2104
  }
2086
2105
  });
2106
+ // ---------- wf-form layout rename(改布局名称/描述)----------
2107
+ // 抓包(mulinquan 2026-10-29):POST /api/workflow/core/form/layout/update
2108
+ // body: { module, customParam:{workflowId,isNodeLayout:true},
2109
+ // formLayoutMultiple:<layout/list 那一行,只换 name/describe>, local, copyConfig }
2110
+ // ⚠ 不是 layout/save:带 formLayoutMultiple.id 调 save 会走插入分支,直接主键冲突 500。
2111
+ layoutCmd.command('rename')
2112
+ .description('修改布局名称或描述;布局内容、引用节点与默认设置保持不变')
2113
+ .argument('<formId>', '流程表单 formId')
2114
+ .argument('<layout>', '布局 ID 或布局名称(同名多套会报歧义并列出 ID)')
2115
+ .option('--name <name>', '新的布局名称(不传 = 保持原名)')
2116
+ .option('--describe <text>', '新的布局描述(不传 = 保持原描述)')
2117
+ .option('--workflow-id <id>', '工作流 ID(不传时用 formId 兜底,与 layout add 一致)')
2118
+ .action(async (formId, layout, o) => {
2119
+ try {
2120
+ if (o.name === undefined && o.describe === undefined)
2121
+ throw new Error('至少提供 --name 或 --describe');
2122
+ const opts = program.opts();
2123
+ const auth = await AuthSession.fromOptions(opts);
2124
+ if (!auth)
2125
+ throw new Error('无法加载认证');
2126
+ const client = new ApiClient(auth);
2127
+ const r = await updateFormLayout(client, {
2128
+ formId, layout, name: o.name, describe: o.describe, workflowId: o.workflowId,
2129
+ });
2130
+ console.log(opts.json
2131
+ ? JSON.stringify({ success: true, formId, ...r }, null, 2)
2132
+ : (r.changed
2133
+ ? `布局已修改: 「${r.oldName}」→「${r.name}」${r.describe !== r.oldDescribe ? ` 描述「${r.describe}」` : ''}(layoutId=${r.layoutId},${r.terminalType}/${r.layoutType}${r.isDefault ? ',默认布局' : ''})`
2134
+ : `布局「${r.name}」的名称与描述本来就是这样,未改动(layoutId=${r.layoutId})`));
2135
+ }
2136
+ catch (e) {
2137
+ console.error(`修改布局失败: ${e.message}`);
2138
+ process.exitCode = 1;
2139
+ }
2140
+ });
2141
+ // ---------- wf-form layout set-default(设为默认布局)----------
2142
+ // 抓包(mulinquan 2026-10-29):POST /api/workflow/core/form/layout/updateDefault
2143
+ // body: { module, formLayoutMultiple:{ id, form:{id:formId}, default:true, terminalType }, local:true }
2144
+ // 默认布局是**表单维度、PC/移动端各一套** —— 终端取自目标布局自身,不让调用方另传。
2145
+ layoutCmd.command('set-default')
2146
+ .description('把某套布局设为该终端的默认布局(PC 与移动端各自一套,互不影响)')
2147
+ .argument('<formId>', '流程表单 formId')
2148
+ .argument('<layout>', '布局 ID 或布局名称(同名多套会报歧义并列出 ID)')
2149
+ .option('--workflow-id <id>', '工作流 ID(不传时用 formId 兜底,与 layout add 一致)')
2150
+ .action(async (formId, layout, o) => {
2151
+ try {
2152
+ const opts = program.opts();
2153
+ const auth = await AuthSession.fromOptions(opts);
2154
+ if (!auth)
2155
+ throw new Error('无法加载认证');
2156
+ const client = new ApiClient(auth);
2157
+ const r = await setDefaultLayout(client, { formId, layout, workflowId: o.workflowId });
2158
+ console.log(opts.json
2159
+ ? JSON.stringify({ success: true, formId, ...r }, null, 2)
2160
+ : (r.changed
2161
+ ? `已设为默认布局: 「${r.name}」(${r.terminalType},layoutId=${r.layoutId})`
2162
+ + `${r.previousDefaultId ? `,原默认 ${r.previousDefaultId}` : ''}`
2163
+ : `「${r.name}」本来就是 ${r.terminalType} 端默认布局,未改动(layoutId=${r.layoutId})`));
2164
+ }
2165
+ catch (e) {
2166
+ console.error(`设置默认布局失败: ${e.message}`);
2167
+ process.exitCode = 1;
2168
+ }
2169
+ });
2170
+ // ---------- wf-form layout add-system-field(摆流程系统字段)----------
2171
+ // 走设计器保存那条:读 getFormLayout → 往 comps 末尾追加 → builder/saveFormAndLayout
2172
+ // (抓包 2026-10-29:pageLayouts 原始 JSON 可直接落库,必须带 formLayout.multipleLayoutId)。
2173
+ layoutCmd.command('add-system-field')
2174
+ .description('把流程系统字段(提交人 / 流程编号 / 流程状态…)摆进布局;已存在的自动跳过')
2175
+ .argument('<formId>', '流程表单 formId')
2176
+ .argument('[fields...]', '系统字段名称或 key(如 提交人、REQUEST_NO);加 --all 表示全部')
2177
+ .option('--layout-id <id>', '目标布局(布局 ID 或名称);不传 = PC 端默认布局')
2178
+ .option('--all', '添加目录里的全部系统字段')
2179
+ .option('--single-row', '新增的系统字段各占一行')
2180
+ .option('--workflow-id <id>', '工作流 ID(不传时用 formId 兜底)')
2181
+ .action(async (formId, fields, o) => {
2182
+ try {
2183
+ const opts = program.opts();
2184
+ const auth = await AuthSession.fromOptions(opts);
2185
+ if (!auth)
2186
+ throw new Error('无法加载认证');
2187
+ const client = new ApiClient(auth);
2188
+ const r = await addSystemFieldsToLayout(client, {
2189
+ formId,
2190
+ layoutId: o.layoutId,
2191
+ fields,
2192
+ all: o.all === true,
2193
+ singleRow: o.singleRow === true,
2194
+ workflowId: o.workflowId,
2195
+ tenantKey: auth.tenantKey,
2196
+ });
2197
+ if (opts.json) {
2198
+ console.log(JSON.stringify({ success: true, formId, ...r }, null, 2));
2199
+ return;
2200
+ }
2201
+ const where = `布局「${r.layoutName}」(${r.terminalType},layoutId=${r.layoutId})`;
2202
+ if (!r.added.length) {
2203
+ console.log(`${where} 已经包含所选系统字段,未改动`);
2204
+ }
2205
+ else {
2206
+ console.log(`已添加 ${r.added.length} 个系统字段到${where}:`);
2207
+ for (const a of r.added)
2208
+ console.log(` + ${a.title}(${a.key})`);
2209
+ }
2210
+ if (r.skipped.length) {
2211
+ console.log(`已存在跳过 ${r.skipped.length} 个:${r.skipped.map((s) => s.title).join('、')}`);
2212
+ }
2213
+ }
2214
+ catch (e) {
2215
+ console.error(`添加系统字段失败: ${e.message}`);
2216
+ process.exitCode = 1;
2217
+ }
2218
+ });
2087
2219
  // ---------- wf-form layout delete(删除布局)----------
2088
2220
  // 抓包(mulinquan 2026-08-25):POST /api/bs/workflow/pathdef/form/layout/emptyNodeLayout
2089
2221
  // body: { layoutId, workflowId, terminal:'PC' } → data=true,**效果=从布局列表删除该布局**