weaver-e10-builder 1.0.10-beta → 1.0.12-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.
Files changed (254) hide show
  1. package/dist/commands/actionflow.d.ts.map +1 -1
  2. package/dist/commands/actionflow.js +10 -6
  3. package/dist/commands/actionflow.js.map +1 -1
  4. package/dist/commands/auth.d.ts.map +1 -1
  5. package/dist/commands/auth.js +13 -0
  6. package/dist/commands/auth.js.map +1 -1
  7. package/dist/commands/form-layout-init.d.ts.map +1 -1
  8. package/dist/commands/form-layout-init.js +7 -1
  9. package/dist/commands/form-layout-init.js.map +1 -1
  10. package/dist/commands/form-list-permission.d.ts.map +1 -1
  11. package/dist/commands/form-list-permission.js +130 -15
  12. package/dist/commands/form-list-permission.js.map +1 -1
  13. package/dist/commands/form-nlist.d.ts +22 -0
  14. package/dist/commands/form-nlist.d.ts.map +1 -0
  15. package/dist/commands/form-nlist.js +179 -0
  16. package/dist/commands/form-nlist.js.map +1 -0
  17. package/dist/commands/form-serial-mark.d.ts +0 -15
  18. package/dist/commands/form-serial-mark.d.ts.map +1 -1
  19. package/dist/commands/form-serial-mark.js +604 -137
  20. package/dist/commands/form-serial-mark.js.map +1 -1
  21. package/dist/commands/form.d.ts.map +1 -1
  22. package/dist/commands/form.js +145 -16
  23. package/dist/commands/form.js.map +1 -1
  24. package/dist/commands/skill.d.ts +3 -0
  25. package/dist/commands/skill.d.ts.map +1 -0
  26. package/dist/commands/skill.js +112 -0
  27. package/dist/commands/skill.js.map +1 -0
  28. package/dist/commands/wf-form.d.ts +18 -0
  29. package/dist/commands/wf-form.d.ts.map +1 -1
  30. package/dist/commands/wf-form.js +156 -181
  31. package/dist/commands/wf-form.js.map +1 -1
  32. package/dist/commands/workflow-condition.d.ts.map +1 -1
  33. package/dist/commands/workflow-condition.js +3 -1
  34. package/dist/commands/workflow-condition.js.map +1 -1
  35. package/dist/commands/workflow-create-workflow.d.ts.map +1 -1
  36. package/dist/commands/workflow-create-workflow.js +14 -0
  37. package/dist/commands/workflow-create-workflow.js.map +1 -1
  38. package/dist/commands/workflow-node-validate.d.ts.map +1 -1
  39. package/dist/commands/workflow-node-validate.js +16 -2
  40. package/dist/commands/workflow-node-validate.js.map +1 -1
  41. package/dist/commands/workflow-numbering.d.ts.map +1 -1
  42. package/dist/commands/workflow-numbering.js +18 -2
  43. package/dist/commands/workflow-numbering.js.map +1 -1
  44. package/dist/commands/workflow.d.ts.map +1 -1
  45. package/dist/commands/workflow.js +58 -42
  46. package/dist/commands/workflow.js.map +1 -1
  47. package/dist/index.js +4 -0
  48. package/dist/index.js.map +1 -1
  49. package/dist/services/actionflow/build_workflow_draft.d.ts.map +1 -1
  50. package/dist/services/actionflow/build_workflow_draft.js +23 -2
  51. package/dist/services/actionflow/build_workflow_draft.js.map +1 -1
  52. package/dist/services/actionflow/command_output.d.ts +6 -0
  53. package/dist/services/actionflow/command_output.d.ts.map +1 -0
  54. package/dist/services/actionflow/command_output.js +91 -0
  55. package/dist/services/actionflow/command_output.js.map +1 -0
  56. package/dist/services/actionflow/components/action_eb_add.d.ts.map +1 -1
  57. package/dist/services/actionflow/components/action_eb_add.js +5 -4
  58. package/dist/services/actionflow/components/action_eb_add.js.map +1 -1
  59. package/dist/services/actionflow/components/action_eb_delete.js +1 -1
  60. package/dist/services/actionflow/components/action_eb_delete.js.map +1 -1
  61. package/dist/services/actionflow/components/action_eb_update.js +4 -4
  62. package/dist/services/actionflow/components/action_eb_update.js.map +1 -1
  63. package/dist/services/actionflow/components/action_eb_update_compiler.d.ts.map +1 -1
  64. package/dist/services/actionflow/components/action_eb_update_compiler.js +4 -1
  65. package/dist/services/actionflow/components/action_eb_update_compiler.js.map +1 -1
  66. package/dist/services/actionflow/components/approve_create.js +1 -1
  67. package/dist/services/actionflow/components/approve_create.js.map +1 -1
  68. package/dist/services/actionflow/components/approve_trigger.d.ts.map +1 -1
  69. package/dist/services/actionflow/components/approve_trigger.js +48 -16
  70. package/dist/services/actionflow/components/approve_trigger.js.map +1 -1
  71. package/dist/services/actionflow/components/date_trigger.js +3 -3
  72. package/dist/services/actionflow/components/date_trigger.js.map +1 -1
  73. package/dist/services/actionflow/components/enquiry_form.d.ts.map +1 -1
  74. package/dist/services/actionflow/components/enquiry_form.js +15 -8
  75. package/dist/services/actionflow/components/enquiry_form.js.map +1 -1
  76. package/dist/services/actionflow/enrich_approve_trigger.d.ts.map +1 -1
  77. package/dist/services/actionflow/enrich_approve_trigger.js +47 -17
  78. package/dist/services/actionflow/enrich_approve_trigger.js.map +1 -1
  79. package/dist/services/actionflow/formula_service.d.ts.map +1 -1
  80. package/dist/services/actionflow/formula_service.js +71 -3
  81. package/dist/services/actionflow/formula_service.js.map +1 -1
  82. package/dist/services/actionflow/functions_catalog.d.ts +26 -0
  83. package/dist/services/actionflow/functions_catalog.d.ts.map +1 -0
  84. package/dist/services/actionflow/functions_catalog.js +8986 -0
  85. package/dist/services/actionflow/functions_catalog.js.map +1 -0
  86. package/dist/services/actionflow/functions_source.d.ts +7 -0
  87. package/dist/services/actionflow/functions_source.d.ts.map +1 -0
  88. package/dist/services/actionflow/functions_source.js +50 -0
  89. package/dist/services/actionflow/functions_source.js.map +1 -0
  90. package/dist/services/actionflow/generation_service.d.ts +8 -0
  91. package/dist/services/actionflow/generation_service.d.ts.map +1 -1
  92. package/dist/services/actionflow/generation_service.js +60 -2
  93. package/dist/services/actionflow/generation_service.js.map +1 -1
  94. package/dist/services/actionflow/preflight_service.d.ts +6 -0
  95. package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
  96. package/dist/services/actionflow/preflight_service.js +69 -0
  97. package/dist/services/actionflow/preflight_service.js.map +1 -1
  98. package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
  99. package/dist/services/actionflow/workflow_compiler.js +102 -85
  100. package/dist/services/actionflow/workflow_compiler.js.map +1 -1
  101. package/dist/services/actionflow/workflow_source.d.ts +2 -0
  102. package/dist/services/actionflow/workflow_source.d.ts.map +1 -1
  103. package/dist/services/actionflow/workflow_source.js +8 -0
  104. package/dist/services/actionflow/workflow_source.js.map +1 -1
  105. package/dist/services/condition-rules.d.ts.map +1 -1
  106. package/dist/services/condition-rules.js +3 -1
  107. package/dist/services/condition-rules.js.map +1 -1
  108. package/dist/services/form-create.d.ts.map +1 -1
  109. package/dist/services/form-create.js +4 -1
  110. package/dist/services/form-create.js.map +1 -1
  111. package/dist/services/form-nlist.d.ts +42 -0
  112. package/dist/services/form-nlist.d.ts.map +1 -0
  113. package/dist/services/form-nlist.js +332 -0
  114. package/dist/services/form-nlist.js.map +1 -0
  115. package/dist/services/skill-provision.d.ts +18 -0
  116. package/dist/services/skill-provision.d.ts.map +1 -0
  117. package/dist/services/skill-provision.js +86 -0
  118. package/dist/services/skill-provision.js.map +1 -0
  119. package/dist/services/workflow-initiator.js +3 -3
  120. package/dist/services/workflow-initiator.js.map +1 -1
  121. package/dist/services/workflow-operator.d.ts +3 -1
  122. package/dist/services/workflow-operator.d.ts.map +1 -1
  123. package/dist/services/workflow-operator.js +5 -4
  124. package/dist/services/workflow-operator.js.map +1 -1
  125. package/package.json +4 -2
  126. package/skill-docs/SKILL.md +348 -0
  127. package/skill-docs/actionflows/references/components/calendar/MeetingCreate.md +17 -0
  128. package/skill-docs/actionflows/references/components/calendar/ScheduleCreate.md +17 -0
  129. package/skill-docs/actionflows/references/components/document/AttachmentCopy.md +17 -0
  130. package/skill-docs/actionflows/references/components/document/AttachmentMove.md +17 -0
  131. package/skill-docs/actionflows/references/components/document/DocumentCopy.md +17 -0
  132. package/skill-docs/actionflows/references/components/document/DocumentDelete.md +17 -0
  133. package/skill-docs/actionflows/references/components/document/DocumentEdit.md +17 -0
  134. package/skill-docs/actionflows/references/components/document/DocumentMove.md +17 -0
  135. package/skill-docs/actionflows/references/components/document/DocumentPermissionChange.md +17 -0
  136. package/skill-docs/actionflows/references/components/document/DocumentRenewal.md +17 -0
  137. package/skill-docs/actionflows/references/components/document/DocumentRevert.md +17 -0
  138. package/skill-docs/actionflows/references/components/document/DocumentSave.md +17 -0
  139. package/skill-docs/actionflows/references/components/document/DocumentSubscription.md +17 -0
  140. package/skill-docs/actionflows/references/components/document/DocumentSubscriptionApprove.md +17 -0
  141. package/skill-docs/actionflows/references/components/document/DocumentSubscriptionSendBack.md +17 -0
  142. package/skill-docs/actionflows/references/components/document/DocumentSubscriptionWithdraw.md +17 -0
  143. package/skill-docs/actionflows/references/components/document/FileFolderSave.md +17 -0
  144. package/skill-docs/actionflows/references/components/document/GetAttachmentInfo.md +17 -0
  145. package/skill-docs/actionflows/references/components/document/GetDocumentInfo.md +17 -0
  146. package/skill-docs/actionflows/references/components/document/ModifyDocumentStatus.md +17 -0
  147. package/skill-docs/actionflows/references/components/document/ReplaceAttachment.md +17 -0
  148. package/skill-docs/actionflows/references/components/document/UpdatePrintNum.md +17 -0
  149. package/skill-docs/actionflows/references/components/ebuilder/ActionEbAdd.md +39 -0
  150. package/skill-docs/actionflows/references/components/ebuilder/ActionEbDelete.md +21 -0
  151. package/skill-docs/actionflows/references/components/ebuilder/ActionEbRecover.md +17 -0
  152. package/skill-docs/actionflows/references/components/ebuilder/ActionEbSaveVersion.md +17 -0
  153. package/skill-docs/actionflows/references/components/ebuilder/ActionEbUpdate.md +21 -0
  154. package/skill-docs/actionflows/references/components/ebuilder/DateTrigger.md +17 -0
  155. package/skill-docs/actionflows/references/components/ebuilder/EbGetDataById.md +17 -0
  156. package/skill-docs/actionflows/references/components/ebuilder/EnquiryForm.md +75 -0
  157. package/skill-docs/actionflows/references/components/ebuilder/EventFormData.md +17 -0
  158. package/skill-docs/actionflows/references/components/ebuilder/TimeBatchTrigger.md +17 -0
  159. package/skill-docs/actionflows/references/components/logic/Condition.md +23 -0
  160. package/skill-docs/actionflows/references/components/logic/LogicFlowSet.md +17 -0
  161. package/skill-docs/actionflows/references/components/logic/MultipleExecution.md +38 -0
  162. package/skill-docs/actionflows/references/components/logic/Output.md +17 -0
  163. package/skill-docs/actionflows/references/components/message/SendMessage.md +17 -0
  164. package/skill-docs/actionflows/references/components/personnel/AlterPersonStatus.md +30 -0
  165. package/skill-docs/actionflows/references/components/personnel/HrmEmployeeUpdate.md +32 -0
  166. package/skill-docs/actionflows/references/components/personnel/PersonnelOnboarding.md +34 -0
  167. package/skill-docs/actionflows/references/components/trigger/SimpleScheduler.md +17 -0
  168. package/skill-docs/actionflows/references/components/workflow/ApproveAddSign.md +17 -0
  169. package/skill-docs/actionflows/references/components/workflow/ApproveAgreeRejectApply.md +17 -0
  170. package/skill-docs/actionflows/references/components/workflow/ApproveCommit.md +17 -0
  171. package/skill-docs/actionflows/references/components/workflow/ApproveCompletelyDelete.md +17 -0
  172. package/skill-docs/actionflows/references/components/workflow/ApproveConsulTurnTodo.md +17 -0
  173. package/skill-docs/actionflows/references/components/workflow/ApproveCreate.md +17 -0
  174. package/skill-docs/actionflows/references/components/workflow/ApproveDelete.md +17 -0
  175. package/skill-docs/actionflows/references/components/workflow/ApproveDoCirculate.md +17 -0
  176. package/skill-docs/actionflows/references/components/workflow/ApproveDoForward.md +17 -0
  177. package/skill-docs/actionflows/references/components/workflow/ApproveDoTurnTodo.md +17 -0
  178. package/skill-docs/actionflows/references/components/workflow/ApproveEntrust.md +17 -0
  179. package/skill-docs/actionflows/references/components/workflow/ApproveIntervention.md +17 -0
  180. package/skill-docs/actionflows/references/components/workflow/ApproveMandatoryArchiving.md +17 -0
  181. package/skill-docs/actionflows/references/components/workflow/ApproveManualCC.md +17 -0
  182. package/skill-docs/actionflows/references/components/workflow/ApproveRefuseRejectApply.md +17 -0
  183. package/skill-docs/actionflows/references/components/workflow/ApproveRejectApply.md +17 -0
  184. package/skill-docs/actionflows/references/components/workflow/ApproveSave.md +17 -0
  185. package/skill-docs/actionflows/references/components/workflow/ApproveSendBack.md +17 -0
  186. package/skill-docs/actionflows/references/components/workflow/ApproveShareEntry.md +17 -0
  187. package/skill-docs/actionflows/references/components/workflow/ApproveTrigger.md +49 -0
  188. package/skill-docs/actionflows/references/components/workflow/ApproveWithdraw.md +17 -0
  189. package/skill-docs/actionflows/references/components/workflow/WorkFlowDocEmpowerment.md +17 -0
  190. package/skill-docs/actionflows/references/components/workflow/WorkflowToDoc.md +17 -0
  191. package/skill-docs/actionflows/references/condition_rules.md +97 -0
  192. package/skill-docs/actionflows/references/examples/enquiry-form-batch-insert-scene2.json +1046 -0
  193. package/skill-docs/actionflows/references/function_rules.md +13 -0
  194. package/skill-docs/actionflows/references/trigger_runtime_notes.md +51 -0
  195. package/skill-docs/assets/sample/.claude/settings.local.json +8 -0
  196. package/skill-docs/assets/sample/api/formApi.js +510 -0
  197. package/skill-docs/assets/sample/config/config.js +0 -0
  198. package/skill-docs/assets/sample/config/configLoad.js +0 -0
  199. package/skill-docs/assets/sample/config/configLoad_default.js +0 -0
  200. package/skill-docs/assets/sample/config/config_default.js +0 -0
  201. package/skill-docs/assets/sample/entry.js +22 -0
  202. package/skill-docs/assets/sample/eslint.config.cjs +48 -0
  203. package/skill-docs/assets/sample/memo.md +0 -0
  204. package/skill-docs/assets/sample/readme.js +8 -0
  205. package/skill-docs/references/auth/guide-auth.md +88 -0
  206. package/skill-docs/references/coding/guide-edit-backfill.md +189 -0
  207. package/skill-docs/references/coding/guide-form-crud.md +262 -0
  208. package/skill-docs/references/coding/guide-page-code.md +224 -0
  209. package/skill-docs/references/coding/guide-page-export.md +119 -0
  210. package/skill-docs/references/coding/ref-compile-rules.md +106 -0
  211. package/skill-docs/references/common/ref-cli-commands.md +286 -0
  212. package/skill-docs/references/components/@weapp-Button.md +104 -0
  213. package/skill-docs/references/components/base-Badge.md +100 -0
  214. package/skill-docs/references/components/base-Dialog.md +358 -0
  215. package/skill-docs/references/components/base-Empty.md +58 -0
  216. package/skill-docs/references/components/base-Tag.md +112 -0
  217. package/skill-docs/references/components/display-Alert.md +64 -0
  218. package/skill-docs/references/components/display-Avatar.md +150 -0
  219. package/skill-docs/references/components/display-Calendar.md +263 -0
  220. package/skill-docs/references/components/display-Carousel.md +115 -0
  221. package/skill-docs/references/components/display-Collapse.md +299 -0
  222. package/skill-docs/references/components/display-FilePreview.md +49 -0
  223. package/skill-docs/references/components/display-Icon.md +66 -0
  224. package/skill-docs/references/components/display-List.md +320 -0
  225. package/skill-docs/references/components/display-Pagination.md +41 -0
  226. package/skill-docs/references/components/display-Spin.md +34 -0
  227. package/skill-docs/references/components/display-Steps.md +89 -0
  228. package/skill-docs/references/components/display-Table.md +160 -0
  229. package/skill-docs/references/components/display-Title.md +117 -0
  230. package/skill-docs/references/components/form-Checkbox.md +161 -0
  231. package/skill-docs/references/components/form-DepartmentBrowser-api.md +52 -0
  232. package/skill-docs/references/components/form-EmployeeBrowser-api.md +51 -0
  233. package/skill-docs/references/components/form-EmployeeBrowser.md +51 -0
  234. package/skill-docs/references/components/form-Input.md +123 -0
  235. package/skill-docs/references/components/form-Radio.md +145 -0
  236. package/skill-docs/references/components/form-Select.md +191 -0
  237. package/skill-docs/references/components/form-Switch.md +46 -0
  238. package/skill-docs/references/components/form-Upload.md +53 -0
  239. package/skill-docs/references/components/generic-Echarts.md +102 -0
  240. package/skill-docs/references/form/guide-create-form.md +407 -0
  241. package/skill-docs/references/form/guide-ebuilder-filter.md +73 -0
  242. package/skill-docs/references/form/guide-ebuilder-scope.md +82 -0
  243. package/skill-docs/references/form/guide-form-data.md +48 -0
  244. package/skill-docs/references/form/guide-form-formula-functions.md +297 -0
  245. package/skill-docs/references/form/guide-form-linkage.md +185 -0
  246. package/skill-docs/references/form/guide-form-view-permission.md +38 -0
  247. package/skill-docs/references/form/guide-form-view.md +267 -0
  248. package/skill-docs/references/form/style-templates.md +44 -0
  249. package/skill-docs/references/hrm/guide-matrix.md +103 -0
  250. package/skill-docs/references/menu/system-menus.md +63 -0
  251. package/skill-docs/references/workflow/guide-workflow-action.md +168 -0
  252. package/skill-docs/references/workflow/guide-workflow-condition.md +405 -0
  253. package/skill-docs/references/workflow/guide-workflow.md +388 -0
  254. package/skill-docs/references/workflow/operator-matrix.md +74 -0
@@ -0,0 +1,112 @@
1
+ import { cpSync, existsSync, readdirSync, readFileSync } from 'node:fs';
2
+ import { fileURLToPath } from 'node:url';
3
+ import { resolve } from 'node:path';
4
+ import { provisionInstalledSkills } from '../services/skill-provision.js';
5
+ /**
6
+ * skill 文档/模板取用命令组。
7
+ *
8
+ * 背景:skill 包(Tencent 市场)只允许两级目录,深目录文档树(references/、
9
+ * actionflows/references/、assets/)随 npm 包发布(skill-docs/)。
10
+ * - `skill copy [目录]`:全量拷到工作区(模板/工作副本用),直接放出 references/ 等,无 skill-docs 壳。
11
+ * - `skill sync`:探测本机已装 skill(~/.claude/skills、~/.workbuddy/skills、~/.codex/skills),
12
+ * 把文档树自动拷进对应 skill 目录——AI 直接读 skill 自带文档,无需手动拷贝。
13
+ *
14
+ * skill-docs 与编译产物 dist/ 同级:packages/cli/skill-docs(安装后同样在
15
+ * node_modules/weaver-e10-builder/ 下),因此相对 dist/ 向上两级解析即可。
16
+ */
17
+ const SKILL_DOCS_DIR = fileURLToPath(new URL('../../skill-docs/', import.meta.url));
18
+ const PKG_JSON_URL = new URL('../../package.json', import.meta.url);
19
+ function pkgVersion() {
20
+ try {
21
+ return JSON.parse(readFileSync(PKG_JSON_URL, 'utf-8')).version;
22
+ }
23
+ catch {
24
+ return 'unknown';
25
+ }
26
+ }
27
+ function countFiles(dir) {
28
+ let n = 0;
29
+ for (const e of readdirSync(dir, { withFileTypes: true })) {
30
+ n += e.isDirectory() ? countFiles(resolve(dir, e.name)) : 1;
31
+ }
32
+ return n;
33
+ }
34
+ export function registerSkillCommands(program) {
35
+ const skill = program
36
+ .command('skill')
37
+ .description('skill 文档/模板取用:查文档根 / 拷到工作区 / 同步到已装 skill');
38
+ skill
39
+ .command('root')
40
+ .description('打印 skill-docs 文档根目录绝对路径(文档版本 = CLI 版本)')
41
+ .action(() => {
42
+ if (!existsSync(SKILL_DOCS_DIR)) {
43
+ console.error(`[ERROR] skill-docs 不存在: ${SKILL_DOCS_DIR}`);
44
+ console.error(' 请确认安装的 weaver-e10-builder 版本包含 skill-docs(≥ 1.0.12-beta)。');
45
+ process.exit(1);
46
+ }
47
+ console.log(SKILL_DOCS_DIR.replace(/[\\/]+$/, ''));
48
+ console.log(`版本: ${pkgVersion()}`);
49
+ });
50
+ skill
51
+ .command('copy')
52
+ .description('全量拷贝文档+模板到本地 <目标>(默认当前目录),直接放出 references/ actionflows/ assets/ SKILL.md')
53
+ .argument('[target]', '目标目录(默认当前目录)')
54
+ .action((target) => {
55
+ if (!existsSync(SKILL_DOCS_DIR)) {
56
+ console.error(`[ERROR] skill-docs 不存在: ${SKILL_DOCS_DIR}`);
57
+ console.error(' 请确认安装的 weaver-e10-builder 版本包含 skill-docs(≥ 1.0.12-beta)。');
58
+ process.exit(1);
59
+ }
60
+ const dest = resolve(target || process.cwd());
61
+ const srcRoot = SKILL_DOCS_DIR.replace(/[\\/]+$/, '');
62
+ // 防呆:目标 = 源本身或其内部(在 CLI 包/仓库目录内运行且未指定目标)会递归自拷贝。
63
+ if (dest === srcRoot || dest.startsWith(srcRoot + '/') || dest.startsWith(srcRoot + '\\')) {
64
+ console.error(`[ERROR] 目标目录 ${dest} 就是文档源目录本身。`);
65
+ console.error(' 你在 CLI 包目录内运行且未指定目标。请换一个目录:e10-cli skill copy <目标目录>');
66
+ process.exit(1);
67
+ }
68
+ // 把源内所有条目摊到目标根,不带 skill-docs/ 壳——AI 读到的路径就是干净的 references/... 等
69
+ let n = 0;
70
+ for (const entry of readdirSync(SKILL_DOCS_DIR, { withFileTypes: true })) {
71
+ const s = resolve(SKILL_DOCS_DIR, entry.name);
72
+ cpSync(s, resolve(dest, entry.name), { recursive: true, force: true });
73
+ n += entry.isDirectory() ? countFiles(resolve(dest, entry.name)) : 1;
74
+ }
75
+ console.log(`✅ 已拷贝 ${n} 个文件 → ${dest}`);
76
+ console.log(` 文档根: ${dest}(references/、actionflows/、assets/、SKILL.md)`);
77
+ console.log(` 文档版本 = CLI 版本 ${pkgVersion()};若 skill 标注版本与 e10-cli --version 不符,先升级 CLI 再拷。`);
78
+ });
79
+ skill
80
+ .command('sync')
81
+ .description('探测已安装的 skill(~/.claude/skills、~/.workbuddy/skills、~/.codex/skills 等),把文档树自动拷进对应 skill 目录')
82
+ .option('--target <dir>', '额外指定的 skill 安装根目录,可重复', collect, [])
83
+ .action((cmdOpts) => {
84
+ const results = provisionInstalledSkills(SKILL_DOCS_DIR, pkgVersion(), cmdOpts.target || []);
85
+ if (!results.length) {
86
+ console.log('未检测到已安装的 weaver-e10-builder skill。');
87
+ console.log(' 已检查: ~/.claude/skills、~/.workbuddy/skills、~/.codex/skills');
88
+ console.log(' 装好 skill 后再跑一次,或 --target <安装根目录> 手动指定。');
89
+ return;
90
+ }
91
+ let copied = 0;
92
+ for (const r of results) {
93
+ if (r.action === 'copied') {
94
+ console.log(`✅ 已把文档同步到 ${r.skillDir}(版本 ${pkgVersion()})`);
95
+ copied++;
96
+ }
97
+ else if (r.action === 'current')
98
+ console.log(`已是最新,跳过 ${r.skillDir}`);
99
+ else
100
+ console.log(`⚠️ 同步失败 ${r.skillDir}`);
101
+ }
102
+ if (copied) {
103
+ console.log(' 装好后 AI 直接读 skill 目录内的 references/,无需手动拷贝。');
104
+ }
105
+ });
106
+ return skill;
107
+ }
108
+ /** commander 重复 --target 收集为数组 */
109
+ function collect(value, prev) {
110
+ return [...prev, value];
111
+ }
112
+ //# sourceMappingURL=skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,21 @@
1
1
  import { Command } from 'commander';
2
+ import { ApiClient } from '../core/client.js';
3
+ /** 初始化/重建流程表单布局(initLayout):getConfig 读 → 强制业务字段 readOnly=false(防 FLOW 模板默认锁死)
4
+ * → 合并运行时 singleRow → applyLoneSingleRows(落单/孤字段独占整行)→ initLayout 落库运行时布局。
5
+ * 供 `wf-form layout init` 与 `workflow create-workflow` 建后自动解锁、`wf-form add-field/add-fields/add-detail-table` 末尾重排复用。
6
+ * hooks.preLayout: 在合并运行时 singleRow 之后、applyLoneSingleRows 之前介入(add-field --single-row 用此给新字段单标 singleRow)。 */
7
+ export declare function initWorkflowFormLayout(client: ApiClient, baseUrl: string, formId: string, o?: {
8
+ styleTemplate?: string;
9
+ readOnly?: boolean;
10
+ required?: boolean;
11
+ singleRow?: boolean;
12
+ generateCollapse?: boolean;
13
+ }, hooks?: {
14
+ preLayout?: (configs: any[]) => void;
15
+ }): Promise<{
16
+ layoutType: string;
17
+ styleTemplateId: string;
18
+ comps: number;
19
+ }>;
2
20
  export declare function registerWorkflowFormCommands(program: Command): Command;
3
21
  //# sourceMappingURL=wf-form.d.ts.map
@@ -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;AA8GpC,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CA2+CtE"}
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;AAEpC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AA0J9C;;;gHAGgH;AAChH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAClD,CAAC,GAAE;IAAE,aAAa,CAAC,EAAE,MAAM,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,EAC3H,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,CAkDzE;AAOD,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CA42CtE"}
@@ -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
- // 含 fetchRuntimeSingleRows 合并,防 init 冲掉已设的独占一行(singleRow)。
446
+ // 走 initWorkflowFormLayout:强制业务字段可编辑(防 FLOW 锁死)+ 合并运行时 singleRow + applyLoneSingleRows(落单独占整行)。
333
447
  if (o.init !== false) {
334
448
  try {
335
- const initMeta = await getLayoutMeta(client, baseUrl, formId);
336
- const initCfg = await client.post(`${baseUrl}${ROUTE}/view/relate/getConfig`, {
337
- formId, module: MODULE, apiModule: 'workflow/form', layoutId: initMeta.layoutId,
338
- customParam: { terminal: '', objId: formId }, initMode: 5, groupFieldIds: [],
339
- designerParam: { sourceModule: MODULE },
340
- }, ebb);
341
- const initConfigs = normalizeDetailTableChildren((initCfg?.data?.configs || []).map((c) => ({ ...c, display: c.system ? c.display : true, show: c.system ? c.show : true })));
342
- const srSet = await fetchRuntimeSingleRows(client, baseUrl, formId);
343
- mergeRuntimeSingleRow(initConfigs, srSet);
344
- // --single-row:field jsonObj 的 singleRow 平台不落到 layout comp(getConfig 不带),
345
- // 显式给新加字段 config.singleRow=true(递归找 fieldId,含明细 children)。
346
- if (o.singleRow) {
347
- const walkSet = (arr) => { for (const c of arr) {
348
- if (String(c.id) === String(fieldId)) {
349
- c.singleRow = true;
350
- c.columnRatio = '12';
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
- const meta = await getLayoutMeta(client, baseUrl, formId);
962
- const cfg = await client.post(`${baseUrl}${ROUTE}/view/relate/getConfig`, {
963
- formId, module: MODULE, apiModule: 'workflow/form', layoutId: meta.layoutId,
964
- customParam: { terminal: '', objId: formId }, initMode: 5, groupFieldIds: [],
965
- designerParam: { sourceModule: MODULE },
966
- }, ebb);
967
- const configs = normalizeDetailTableChildren((cfg?.data?.configs || []).map((c) => ({ ...c, display: c.system ? c.display : true, show: c.system ? c.show : true })));
968
- const styleTemplateId = meta.layoutType === 'FLOW' ? '820000000000000001' : '700000000000000008';
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
- const meta = await getLayoutMeta(client, baseUrl, formId);
1345
- const cfg = await client.post(`${baseUrl}${ROUTE}/view/relate/getConfig`, {
1346
- formId, module: MODULE, apiModule: 'workflow/form', layoutId: meta.layoutId,
1347
- customParam: { terminal: '', objId: formId }, initMode: 5, groupFieldIds: [],
1348
- designerParam: { sourceModule: MODULE },
1349
- }, ebb);
1350
- const configs = normalizeDetailTableChildren((cfg?.data?.configs || []).map((c) => {
1351
- const isBusiness = !c.system && c.componentKey !== 'DataTable' && c.type !== 'DetailTable';
1352
- const out = { ...c, display: c.system ? c.display : true, show: c.system ? c.show : true };
1353
- if (isBusiness) {
1354
- out.readOnly = false;
1355
- out.disableEdit = false;
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 ebb = { ebbusinessid: formId };
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: meta.layoutType, styleTemplateId, comps: comps.length }, null, 2)
1748
- : `布局已初始化: 类型=${meta.layoutType} 模板=${styleTemplateId} 组件=${comps.length}`);
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}`);