weaver-e10-builder 1.0.2-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 (301) hide show
  1. package/README.md +200 -0
  2. package/dist/commands/app.d.ts +3 -0
  3. package/dist/commands/app.d.ts.map +1 -0
  4. package/dist/commands/app.js +305 -0
  5. package/dist/commands/app.js.map +1 -0
  6. package/dist/commands/auth.d.ts +3 -0
  7. package/dist/commands/auth.d.ts.map +1 -0
  8. package/dist/commands/auth.js +386 -0
  9. package/dist/commands/auth.js.map +1 -0
  10. package/dist/commands/check.d.ts +3 -0
  11. package/dist/commands/check.d.ts.map +1 -0
  12. package/dist/commands/check.js +106 -0
  13. package/dist/commands/check.js.map +1 -0
  14. package/dist/commands/compile.d.ts +3 -0
  15. package/dist/commands/compile.d.ts.map +1 -0
  16. package/dist/commands/compile.js +134 -0
  17. package/dist/commands/compile.js.map +1 -0
  18. package/dist/commands/docx.d.ts +3 -0
  19. package/dist/commands/docx.d.ts.map +1 -0
  20. package/dist/commands/docx.js +54 -0
  21. package/dist/commands/docx.js.map +1 -0
  22. package/dist/commands/form-button.d.ts +3 -0
  23. package/dist/commands/form-button.d.ts.map +1 -0
  24. package/dist/commands/form-button.js +441 -0
  25. package/dist/commands/form-button.js.map +1 -0
  26. package/dist/commands/form-data.d.ts +3 -0
  27. package/dist/commands/form-data.d.ts.map +1 -0
  28. package/dist/commands/form-data.js +197 -0
  29. package/dist/commands/form-data.js.map +1 -0
  30. package/dist/commands/form-ebuilder-columns.d.ts +3 -0
  31. package/dist/commands/form-ebuilder-columns.d.ts.map +1 -0
  32. package/dist/commands/form-ebuilder-columns.js +118 -0
  33. package/dist/commands/form-ebuilder-columns.js.map +1 -0
  34. package/dist/commands/form-ebuilder-filter.d.ts +3 -0
  35. package/dist/commands/form-ebuilder-filter.d.ts.map +1 -0
  36. package/dist/commands/form-ebuilder-filter.js +135 -0
  37. package/dist/commands/form-ebuilder-filter.js.map +1 -0
  38. package/dist/commands/form-ebuilder-scope.d.ts +3 -0
  39. package/dist/commands/form-ebuilder-scope.d.ts.map +1 -0
  40. package/dist/commands/form-ebuilder-scope.js +321 -0
  41. package/dist/commands/form-ebuilder-scope.js.map +1 -0
  42. package/dist/commands/form-ebuilder-search.d.ts +3 -0
  43. package/dist/commands/form-ebuilder-search.d.ts.map +1 -0
  44. package/dist/commands/form-ebuilder-search.js +252 -0
  45. package/dist/commands/form-ebuilder-search.js.map +1 -0
  46. package/dist/commands/form-formula.d.ts +12 -0
  47. package/dist/commands/form-formula.d.ts.map +1 -0
  48. package/dist/commands/form-formula.js +252 -0
  49. package/dist/commands/form-formula.js.map +1 -0
  50. package/dist/commands/form-layout-init.d.ts +15 -0
  51. package/dist/commands/form-layout-init.d.ts.map +1 -0
  52. package/dist/commands/form-layout-init.js +162 -0
  53. package/dist/commands/form-layout-init.js.map +1 -0
  54. package/dist/commands/form-layout.d.ts +3 -0
  55. package/dist/commands/form-layout.d.ts.map +1 -0
  56. package/dist/commands/form-layout.js +236 -0
  57. package/dist/commands/form-layout.js.map +1 -0
  58. package/dist/commands/form-list-click.d.ts +3 -0
  59. package/dist/commands/form-list-click.d.ts.map +1 -0
  60. package/dist/commands/form-list-click.js +154 -0
  61. package/dist/commands/form-list-click.js.map +1 -0
  62. package/dist/commands/form-list-event.d.ts +3 -0
  63. package/dist/commands/form-list-event.d.ts.map +1 -0
  64. package/dist/commands/form-list-event.js +203 -0
  65. package/dist/commands/form-list-event.js.map +1 -0
  66. package/dist/commands/form-list-filter.d.ts +9 -0
  67. package/dist/commands/form-list-filter.d.ts.map +1 -0
  68. package/dist/commands/form-list-filter.js +107 -0
  69. package/dist/commands/form-list-filter.js.map +1 -0
  70. package/dist/commands/form-list-group.d.ts +11 -0
  71. package/dist/commands/form-list-group.d.ts.map +1 -0
  72. package/dist/commands/form-list-group.js +100 -0
  73. package/dist/commands/form-list-group.js.map +1 -0
  74. package/dist/commands/form-list-permission.d.ts +3 -0
  75. package/dist/commands/form-list-permission.d.ts.map +1 -0
  76. package/dist/commands/form-list-permission.js +127 -0
  77. package/dist/commands/form-list-permission.js.map +1 -0
  78. package/dist/commands/form-list-search-group.d.ts +3 -0
  79. package/dist/commands/form-list-search-group.d.ts.map +1 -0
  80. package/dist/commands/form-list-search-group.js +132 -0
  81. package/dist/commands/form-list-search-group.js.map +1 -0
  82. package/dist/commands/form-list-stats.d.ts +11 -0
  83. package/dist/commands/form-list-stats.d.ts.map +1 -0
  84. package/dist/commands/form-list-stats.js +139 -0
  85. package/dist/commands/form-list-stats.js.map +1 -0
  86. package/dist/commands/form-list-unit.d.ts +3 -0
  87. package/dist/commands/form-list-unit.d.ts.map +1 -0
  88. package/dist/commands/form-list-unit.js +95 -0
  89. package/dist/commands/form-list-unit.js.map +1 -0
  90. package/dist/commands/form-list-utils.d.ts +32 -0
  91. package/dist/commands/form-list-utils.d.ts.map +1 -0
  92. package/dist/commands/form-list-utils.js +76 -0
  93. package/dist/commands/form-list-utils.js.map +1 -0
  94. package/dist/commands/form-list.d.ts +3 -0
  95. package/dist/commands/form-list.d.ts.map +1 -0
  96. package/dist/commands/form-list.js +624 -0
  97. package/dist/commands/form-list.js.map +1 -0
  98. package/dist/commands/form-permission.d.ts +3 -0
  99. package/dist/commands/form-permission.d.ts.map +1 -0
  100. package/dist/commands/form-permission.js +193 -0
  101. package/dist/commands/form-permission.js.map +1 -0
  102. package/dist/commands/form-relate.d.ts +14 -0
  103. package/dist/commands/form-relate.d.ts.map +1 -0
  104. package/dist/commands/form-relate.js +140 -0
  105. package/dist/commands/form-relate.js.map +1 -0
  106. package/dist/commands/form-serial-mark.d.ts +18 -0
  107. package/dist/commands/form-serial-mark.d.ts.map +1 -0
  108. package/dist/commands/form-serial-mark.js +167 -0
  109. package/dist/commands/form-serial-mark.js.map +1 -0
  110. package/dist/commands/form-table-view.d.ts +3 -0
  111. package/dist/commands/form-table-view.d.ts.map +1 -0
  112. package/dist/commands/form-table-view.js +217 -0
  113. package/dist/commands/form-table-view.js.map +1 -0
  114. package/dist/commands/form-validate.d.ts +3 -0
  115. package/dist/commands/form-validate.d.ts.map +1 -0
  116. package/dist/commands/form-validate.js +122 -0
  117. package/dist/commands/form-validate.js.map +1 -0
  118. package/dist/commands/form-view-permission.d.ts +3 -0
  119. package/dist/commands/form-view-permission.d.ts.map +1 -0
  120. package/dist/commands/form-view-permission.js +86 -0
  121. package/dist/commands/form-view-permission.js.map +1 -0
  122. package/dist/commands/form-view.d.ts +3 -0
  123. package/dist/commands/form-view.d.ts.map +1 -0
  124. package/dist/commands/form-view.js +145 -0
  125. package/dist/commands/form-view.js.map +1 -0
  126. package/dist/commands/form.d.ts +3 -0
  127. package/dist/commands/form.d.ts.map +1 -0
  128. package/dist/commands/form.js +2467 -0
  129. package/dist/commands/form.js.map +1 -0
  130. package/dist/commands/icon.d.ts +3 -0
  131. package/dist/commands/icon.d.ts.map +1 -0
  132. package/dist/commands/icon.js +82 -0
  133. package/dist/commands/icon.js.map +1 -0
  134. package/dist/commands/matrix.d.ts +3 -0
  135. package/dist/commands/matrix.d.ts.map +1 -0
  136. package/dist/commands/matrix.js +587 -0
  137. package/dist/commands/matrix.js.map +1 -0
  138. package/dist/commands/menu-permission.d.ts +3 -0
  139. package/dist/commands/menu-permission.d.ts.map +1 -0
  140. package/dist/commands/menu-permission.js +188 -0
  141. package/dist/commands/menu-permission.js.map +1 -0
  142. package/dist/commands/menu.d.ts +16 -0
  143. package/dist/commands/menu.d.ts.map +1 -0
  144. package/dist/commands/menu.js +269 -0
  145. package/dist/commands/menu.js.map +1 -0
  146. package/dist/commands/project.d.ts +3 -0
  147. package/dist/commands/project.d.ts.map +1 -0
  148. package/dist/commands/project.js +345 -0
  149. package/dist/commands/project.js.map +1 -0
  150. package/dist/commands/role.d.ts +3 -0
  151. package/dist/commands/role.d.ts.map +1 -0
  152. package/dist/commands/role.js +224 -0
  153. package/dist/commands/role.js.map +1 -0
  154. package/dist/commands/user.d.ts +3 -0
  155. package/dist/commands/user.d.ts.map +1 -0
  156. package/dist/commands/user.js +49 -0
  157. package/dist/commands/user.js.map +1 -0
  158. package/dist/commands/workflow-action.d.ts +3 -0
  159. package/dist/commands/workflow-action.d.ts.map +1 -0
  160. package/dist/commands/workflow-action.js +1821 -0
  161. package/dist/commands/workflow-action.js.map +1 -0
  162. package/dist/commands/workflow-advanced.d.ts +3 -0
  163. package/dist/commands/workflow-advanced.d.ts.map +1 -0
  164. package/dist/commands/workflow-advanced.js +290 -0
  165. package/dist/commands/workflow-advanced.js.map +1 -0
  166. package/dist/commands/workflow-condition.d.ts +7 -0
  167. package/dist/commands/workflow-condition.d.ts.map +1 -0
  168. package/dist/commands/workflow-condition.js +562 -0
  169. package/dist/commands/workflow-condition.js.map +1 -0
  170. package/dist/commands/workflow-message.d.ts +3 -0
  171. package/dist/commands/workflow-message.d.ts.map +1 -0
  172. package/dist/commands/workflow-message.js +399 -0
  173. package/dist/commands/workflow-message.js.map +1 -0
  174. package/dist/commands/workflow-node-overtime.d.ts +3 -0
  175. package/dist/commands/workflow-node-overtime.d.ts.map +1 -0
  176. package/dist/commands/workflow-node-overtime.js +150 -0
  177. package/dist/commands/workflow-node-overtime.js.map +1 -0
  178. package/dist/commands/workflow-node-reject.d.ts +3 -0
  179. package/dist/commands/workflow-node-reject.d.ts.map +1 -0
  180. package/dist/commands/workflow-node-reject.js +115 -0
  181. package/dist/commands/workflow-node-reject.js.map +1 -0
  182. package/dist/commands/workflow-node-sign.d.ts +15 -0
  183. package/dist/commands/workflow-node-sign.d.ts.map +1 -0
  184. package/dist/commands/workflow-node-sign.js +100 -0
  185. package/dist/commands/workflow-node-sign.js.map +1 -0
  186. package/dist/commands/workflow-node-validate.d.ts +16 -0
  187. package/dist/commands/workflow-node-validate.d.ts.map +1 -0
  188. package/dist/commands/workflow-node-validate.js +169 -0
  189. package/dist/commands/workflow-node-validate.js.map +1 -0
  190. package/dist/commands/workflow-node.d.ts +3 -0
  191. package/dist/commands/workflow-node.d.ts.map +1 -0
  192. package/dist/commands/workflow-node.js +347 -0
  193. package/dist/commands/workflow-node.js.map +1 -0
  194. package/dist/commands/workflow-numbering.d.ts +17 -0
  195. package/dist/commands/workflow-numbering.d.ts.map +1 -0
  196. package/dist/commands/workflow-numbering.js +191 -0
  197. package/dist/commands/workflow-numbering.js.map +1 -0
  198. package/dist/commands/workflow-plan-range.d.ts +3 -0
  199. package/dist/commands/workflow-plan-range.d.ts.map +1 -0
  200. package/dist/commands/workflow-plan-range.js +116 -0
  201. package/dist/commands/workflow-plan-range.js.map +1 -0
  202. package/dist/commands/workflow-setting.d.ts +3 -0
  203. package/dist/commands/workflow-setting.d.ts.map +1 -0
  204. package/dist/commands/workflow-setting.js +440 -0
  205. package/dist/commands/workflow-setting.js.map +1 -0
  206. package/dist/commands/workflow-title.d.ts +14 -0
  207. package/dist/commands/workflow-title.d.ts.map +1 -0
  208. package/dist/commands/workflow-title.js +106 -0
  209. package/dist/commands/workflow-title.js.map +1 -0
  210. package/dist/commands/workflow.d.ts +26 -0
  211. package/dist/commands/workflow.d.ts.map +1 -0
  212. package/dist/commands/workflow.js +2359 -0
  213. package/dist/commands/workflow.js.map +1 -0
  214. package/dist/core/auth.d.ts +36 -0
  215. package/dist/core/auth.d.ts.map +1 -0
  216. package/dist/core/auth.js +351 -0
  217. package/dist/core/auth.js.map +1 -0
  218. package/dist/core/client.d.ts +27 -0
  219. package/dist/core/client.d.ts.map +1 -0
  220. package/dist/core/client.js +100 -0
  221. package/dist/core/client.js.map +1 -0
  222. package/dist/core/crypto.d.ts +11 -0
  223. package/dist/core/crypto.d.ts.map +1 -0
  224. package/dist/core/crypto.js +102 -0
  225. package/dist/core/crypto.js.map +1 -0
  226. package/dist/core/edition.d.ts +4 -0
  227. package/dist/core/edition.d.ts.map +1 -0
  228. package/dist/core/edition.js +19 -0
  229. package/dist/core/edition.js.map +1 -0
  230. package/dist/index.d.ts +3 -0
  231. package/dist/index.d.ts.map +1 -0
  232. package/dist/index.js +118 -0
  233. package/dist/index.js.map +1 -0
  234. package/dist/services/action-detail.d.ts +112 -0
  235. package/dist/services/action-detail.d.ts.map +1 -0
  236. package/dist/services/action-detail.js +443 -0
  237. package/dist/services/action-detail.js.map +1 -0
  238. package/dist/services/condition-rules.d.ts +45 -0
  239. package/dist/services/condition-rules.d.ts.map +1 -0
  240. package/dist/services/condition-rules.js +207 -0
  241. package/dist/services/condition-rules.js.map +1 -0
  242. package/dist/services/form-create.d.ts +102 -0
  243. package/dist/services/form-create.d.ts.map +1 -0
  244. package/dist/services/form-create.js +835 -0
  245. package/dist/services/form-create.js.map +1 -0
  246. package/dist/services/form-ebuilder-filter.d.ts +60 -0
  247. package/dist/services/form-ebuilder-filter.d.ts.map +1 -0
  248. package/dist/services/form-ebuilder-filter.js +562 -0
  249. package/dist/services/form-ebuilder-filter.js.map +1 -0
  250. package/dist/services/form-table-view.d.ts +117 -0
  251. package/dist/services/form-table-view.d.ts.map +1 -0
  252. package/dist/services/form-table-view.js +882 -0
  253. package/dist/services/form-table-view.js.map +1 -0
  254. package/dist/services/form-view-permission.d.ts +30 -0
  255. package/dist/services/form-view-permission.d.ts.map +1 -0
  256. package/dist/services/form-view-permission.js +208 -0
  257. package/dist/services/form-view-permission.js.map +1 -0
  258. package/dist/services/form-view.d.ts +41 -0
  259. package/dist/services/form-view.d.ts.map +1 -0
  260. package/dist/services/form-view.js +334 -0
  261. package/dist/services/form-view.js.map +1 -0
  262. package/dist/services/formula-detail.d.ts +31 -0
  263. package/dist/services/formula-detail.d.ts.map +1 -0
  264. package/dist/services/formula-detail.js +66 -0
  265. package/dist/services/formula-detail.js.map +1 -0
  266. package/dist/services/rich-types.d.ts +35 -0
  267. package/dist/services/rich-types.d.ts.map +1 -0
  268. package/dist/services/rich-types.js +105 -0
  269. package/dist/services/rich-types.js.map +1 -0
  270. package/dist/services/workflow-layout.d.ts +118 -0
  271. package/dist/services/workflow-layout.d.ts.map +1 -0
  272. package/dist/services/workflow-layout.js +279 -0
  273. package/dist/services/workflow-layout.js.map +1 -0
  274. package/dist/services/workflow-operator.d.ts +36 -0
  275. package/dist/services/workflow-operator.d.ts.map +1 -0
  276. package/dist/services/workflow-operator.js +65 -0
  277. package/dist/services/workflow-operator.js.map +1 -0
  278. package/dist/types.d.ts +53 -0
  279. package/dist/types.d.ts.map +1 -0
  280. package/dist/types.js +2 -0
  281. package/dist/types.js.map +1 -0
  282. package/dist/utils/column-name.d.ts +13 -0
  283. package/dist/utils/column-name.d.ts.map +1 -0
  284. package/dist/utils/column-name.js +45 -0
  285. package/dist/utils/column-name.js.map +1 -0
  286. package/ecodecmd/package.json +27 -0
  287. package/ecodecmd/src/build.js +709 -0
  288. package/ecodecmd/src/compile.js +81 -0
  289. package/ecodecmd/src/index.js +48 -0
  290. package/ecodecmd/src/init.js +73 -0
  291. package/ecodecmd/src/lib/@babel/plugin-proposal-object-rest-spread@7.5.5/index.js +1795 -0
  292. package/ecodecmd/src/lib/@babel/plugin-proposal-optional-chaining@7.6.0/index.js +135 -0
  293. package/ecodecmd/src/lib/@babel/preset-env-standalone@7.5.5/babel-preset-env.js +76043 -0
  294. package/ecodecmd/src/lib/@babel/standalone@7.5.5/babel.js +90802 -0
  295. package/ecodecmd/src/lib/exec.js +77 -0
  296. package/ecodecmd/src/loaddep.js +154 -0
  297. package/ecodecmd/src/util/compress.js +58 -0
  298. package/ecodecmd/src/util/crypto-util.js +19 -0
  299. package/ecodecmd/src/util/index.js +153 -0
  300. package/ecodecmd/src/util/snowflake.js +144 -0
  301. package/package.json +43 -0
@@ -0,0 +1,118 @@
1
+ /**
2
+ * 流程节点自动排版(分层布局)
3
+ *
4
+ * 读 getXml 的 mxGraph XML → 按连线关系分层(忽略退回线)→ 重排所有节点
5
+ * mxGeometry 坐标 → saveLayout 回写 → 回读验证。
6
+ *
7
+ * 只改节点坐标,连线 cell 保持 relative="1" 自动正交路由,无需改 edge。
8
+ */
9
+ import type { ApiClient } from '../core/client.js';
10
+ export type WorkflowLayoutClient = Pick<ApiClient, 'get' | 'postForm' | 'post'>;
11
+ export interface AutoLayoutOptions {
12
+ /** 布局方向: ltr=左右(层=列), ttb=上下(层=行) */
13
+ direction?: 'ltr' | 'ttb';
14
+ /** 相邻层间距(列间距 ltr / 行间距 ttb) */
15
+ gapX?: number;
16
+ /** 同层节点间距(行间距 ltr / 列间距 ttb) */
17
+ gapY?: number;
18
+ marginX?: number;
19
+ marginY?: number;
20
+ /** 只计算坐标并返回新 XML,不回写 */
21
+ dryRun?: boolean;
22
+ }
23
+ export interface AutoLayoutNode {
24
+ nodeId: string;
25
+ name: string;
26
+ nodeType: string;
27
+ nodeAttr: string;
28
+ layer: number;
29
+ x: number;
30
+ y: number;
31
+ }
32
+ export interface AutoLayoutResult {
33
+ workflowId: string;
34
+ direction: 'ltr' | 'ttb';
35
+ nodes: AutoLayoutNode[];
36
+ /** 参与分层的节点数 */
37
+ nodeCount: number;
38
+ /** 连线数(含退回线) */
39
+ linkCount: number;
40
+ /** 层数 */
41
+ layerCount: number;
42
+ saved: boolean;
43
+ /** 回读验证是否全部命中 */
44
+ verified: boolean;
45
+ xml?: string;
46
+ error?: string;
47
+ }
48
+ /** 解析 getXml 输出的 mxGraph XML,得到节点 + 连线结构 */
49
+ export declare function parseWorkflowXml(xml: string): {
50
+ nodeCells: {
51
+ ref: string;
52
+ nodeId: string;
53
+ name: string;
54
+ nodeType: string;
55
+ nodeAttr: string;
56
+ x: number;
57
+ y: number;
58
+ w: number;
59
+ h: number;
60
+ cell: string;
61
+ }[];
62
+ links: {
63
+ linkId: string;
64
+ source: string;
65
+ target: string;
66
+ reject: boolean;
67
+ }[];
68
+ };
69
+ /** 分层:忽略退回线,最长路径分层。发起(nodeType=0)强制层0,结束(nodeType=3)提升到最深层。 */
70
+ export declare function computeLayers(nodeCells: Array<{
71
+ nodeId: string;
72
+ nodeType: string;
73
+ }>, links: Array<{
74
+ source: string;
75
+ target: string;
76
+ reject: boolean;
77
+ }>): Map<string, number>;
78
+ /** 计算每个节点的坐标,返回 { nodeId → {x,y,layer} } */
79
+ export declare function computePositions(nodeCells: Array<{
80
+ nodeId: string;
81
+ }>, layers: Map<string, number>, opts: Required<Pick<AutoLayoutOptions, 'direction' | 'gapX' | 'gapY' | 'marginX' | 'marginY'>>): Map<string, {
82
+ x: number;
83
+ y: number;
84
+ layer: number;
85
+ }>;
86
+ /** 按布局方向计算 edge 的连接点(style + defaultPos 里的 exit/entry)。
87
+ * ltr:右侧出、左侧进(水平流)。ttb:底部出、顶部进(纵向流,平台默认)。 */
88
+ export declare function edgeExitEntry(direction: 'ltr' | 'ttb'): string;
89
+ /** 把 getXml 服务器格式转成浏览器格式并应用新坐标。
90
+ *
91
+ * 服务器 saveLayout 只认浏览器 mxGraph 格式:node/edge cell 用纯数字 id,
92
+ * edge 的 source/target 引用 node 的数字 id。getXml 输出的 node_xxx/link_xxx
93
+ * 直接回传会解析失败(节点被判定为 null/已删除)。 */
94
+ export declare function buildBrowserXml(xml: string, positions: Map<string, {
95
+ x: number;
96
+ y: number;
97
+ }>, direction?: 'ltr' | 'ttb'): string;
98
+ /** 回读 getXml 验证坐标 */
99
+ export declare function verifyPositions(client: WorkflowLayoutClient, baseUrl: string, workflowId: string, expected: Map<string, {
100
+ x: number;
101
+ y: number;
102
+ }>): Promise<{
103
+ ok: boolean;
104
+ mismatch: Array<{
105
+ nodeId: string;
106
+ expected: string;
107
+ actual: string;
108
+ }>;
109
+ }>;
110
+ export interface AutoLayoutInput {
111
+ client: WorkflowLayoutClient;
112
+ baseUrl: string;
113
+ workflowId: string;
114
+ options?: AutoLayoutOptions;
115
+ }
116
+ /** 主入口:读图 → 分层 → 排布 → (可选)回写 → 验证 */
117
+ export declare function autoLayoutWorkflow(input: AutoLayoutInput): Promise<AutoLayoutResult>;
118
+ //# sourceMappingURL=workflow-layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-layout.d.ts","sourceRoot":"","sources":["../../src/services/workflow-layout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,279 @@
1
+ const NODE_W = 170;
2
+ const NODE_H = 64;
3
+ /** 解析 getXml 输出的 mxGraph XML,得到节点 + 连线结构 */
4
+ export function parseWorkflowXml(xml) {
5
+ // 节点 cell: node_xxx id + nodeId + mxGeometry
6
+ const nodeCells = [];
7
+ const nodeRe = /<mxCell\b[^>]*nodeId="(\d+)"[^>]*>.*?<\/mxCell>/g;
8
+ for (const m of xml.matchAll(nodeRe)) {
9
+ const cell = m[0];
10
+ const nodeId = m[1];
11
+ const ref = cell.match(/id="(node_\d+)"/)?.[1] || '';
12
+ const name = cell.match(/value="([^"]*)"/)?.[1] || '';
13
+ const nodeType = cell.match(/nodeType="([^"]*)"/)?.[1] || '';
14
+ const nodeAttr = cell.match(/nodeAttriBute="([^"]*)"/)?.[1] || cell.match(/nodeAttr="([^"]*)"/)?.[1] || '0';
15
+ const geo = cell.match(/<mxGeometry\s+x="([\d.]+)"\s+y="([\d.]+)"\s+width="([\d.]+)"\s+height="([\d.]+)"/);
16
+ nodeCells.push({
17
+ ref,
18
+ nodeId,
19
+ name,
20
+ nodeType,
21
+ nodeAttr,
22
+ x: geo ? parseFloat(geo[1]) : 0,
23
+ y: geo ? parseFloat(geo[2]) : 0,
24
+ w: geo ? parseFloat(geo[3]) : NODE_W,
25
+ h: geo ? parseFloat(geo[4]) : NODE_H,
26
+ cell,
27
+ });
28
+ }
29
+ // 连线 cell: link_xxx id + source/target(node ref) + isReject
30
+ const links = [];
31
+ const edgeRe = /<mxCell\b[^>]*edge="1"[^>]*>.*?<\/mxCell>/g;
32
+ for (const m of xml.matchAll(edgeRe)) {
33
+ const cell = m[0];
34
+ const linkId = cell.match(/linkId="(\d+)"/)?.[1] || '';
35
+ const source = cell.match(/source="(node_\d+)"/)?.[1] || '';
36
+ const target = cell.match(/target="(node_\d+)"/)?.[1] || '';
37
+ const reject = (cell.match(/isReject="(\d)"/)?.[1] || '0') === '1';
38
+ if (!linkId || !source || !target)
39
+ continue;
40
+ links.push({ linkId, source, target, reject });
41
+ }
42
+ return { nodeCells, links };
43
+ }
44
+ /** 分层:忽略退回线,最长路径分层。发起(nodeType=0)强制层0,结束(nodeType=3)提升到最深层。 */
45
+ export function computeLayers(nodeCells, links) {
46
+ const nodeIds = nodeCells.map(n => n.nodeId);
47
+ const idSet = new Set(nodeIds);
48
+ const edges = [];
49
+ for (const l of links) {
50
+ if (l.reject)
51
+ continue;
52
+ // source/target 是 node_xxx ref,解析回 nodeId
53
+ const from = l.source.replace('node_', '');
54
+ const to = l.target.replace('node_', '');
55
+ if (idSet.has(from) && idSet.has(to))
56
+ edges.push({ from, to });
57
+ }
58
+ // memo DFS 最长路径:depth(n) = 从 n 到最深叶子的边数
59
+ const memo = new Map();
60
+ const depthOf = (id) => {
61
+ if (memo.has(id))
62
+ return memo.get(id);
63
+ memo.set(id, 0); // 防环
64
+ let d = 0;
65
+ for (const e of edges) {
66
+ if (e.from === id)
67
+ d = Math.max(d, 1 + depthOf(e.to));
68
+ }
69
+ memo.set(id, d);
70
+ return d;
71
+ };
72
+ const depth = new Map();
73
+ let maxDepth = 0;
74
+ for (const id of nodeIds) {
75
+ const d = depthOf(id);
76
+ depth.set(id, d);
77
+ if (d > maxDepth)
78
+ maxDepth = d;
79
+ }
80
+ const layers = new Map();
81
+ let maxLayer = 0;
82
+ for (const id of nodeIds) {
83
+ layers.set(id, maxDepth - depth.get(id));
84
+ maxLayer = Math.max(maxLayer, maxDepth - depth.get(id));
85
+ }
86
+ // 发起节点强制层 0
87
+ for (const n of nodeCells) {
88
+ if (n.nodeType === '0')
89
+ layers.set(n.nodeId, 0);
90
+ }
91
+ // 结束节点提升到最深层
92
+ for (const n of nodeCells) {
93
+ if (n.nodeType === '3') {
94
+ const cur = layers.get(n.nodeId) ?? 0;
95
+ if (cur < maxLayer)
96
+ layers.set(n.nodeId, maxLayer);
97
+ }
98
+ }
99
+ return layers;
100
+ }
101
+ /** 计算每个节点的坐标,返回 { nodeId → {x,y,layer} } */
102
+ export function computePositions(nodeCells, layers, opts) {
103
+ // 层 → 该层节点(按 nodeId 数值序,保持稳定)
104
+ const byLayer = new Map();
105
+ for (const n of nodeCells) {
106
+ const layer = layers.get(n.nodeId) ?? 0;
107
+ if (!byLayer.has(layer))
108
+ byLayer.set(layer, []);
109
+ byLayer.get(layer).push(n.nodeId);
110
+ }
111
+ for (const arr of byLayer.values()) {
112
+ arr.sort((a, b) => Number(a) - Number(b));
113
+ }
114
+ const result = new Map();
115
+ const { direction, gapX, gapY, marginX, marginY } = opts;
116
+ for (const [layer, ids] of byLayer) {
117
+ ids.forEach((id, idx) => {
118
+ let x, y;
119
+ if (direction === 'ttb') {
120
+ x = marginX + idx * (NODE_W + gapX);
121
+ y = marginY + layer * (NODE_H + gapY);
122
+ }
123
+ else {
124
+ x = marginX + layer * (NODE_W + gapX);
125
+ y = marginY + idx * (NODE_H + gapY);
126
+ }
127
+ result.set(id, { x, y, layer });
128
+ });
129
+ }
130
+ return result;
131
+ }
132
+ /** 按布局方向计算 edge 的连接点(style + defaultPos 里的 exit/entry)。
133
+ * ltr:右侧出、左侧进(水平流)。ttb:底部出、顶部进(纵向流,平台默认)。 */
134
+ export function edgeExitEntry(direction) {
135
+ return direction === 'ttb'
136
+ ? 'exitX=0.5;exitY=1.0;entryX=0.5;entryY=0.0'
137
+ : 'exitX=1.0;exitY=0.5;entryX=0.0;entryY=0.5';
138
+ }
139
+ /** 把 getXml 服务器格式转成浏览器格式并应用新坐标。
140
+ *
141
+ * 服务器 saveLayout 只认浏览器 mxGraph 格式:node/edge cell 用纯数字 id,
142
+ * edge 的 source/target 引用 node 的数字 id。getXml 输出的 node_xxx/link_xxx
143
+ * 直接回传会解析失败(节点被判定为 null/已删除)。 */
144
+ export function buildBrowserXml(xml, positions, direction = 'ltr') {
145
+ // 1. 分配数字 id:node 从 2 开始,edge 从 node 末尾接续(永不冲突)
146
+ const nodeNum = new Map();
147
+ const edgeNum = new Map();
148
+ let next = 2;
149
+ for (const m of xml.matchAll(/<mxCell\b[^>]*id="(node_\d+)"[^>]*>/g)) {
150
+ if (!nodeNum.has(m[1]))
151
+ nodeNum.set(m[1], next++);
152
+ }
153
+ for (const m of xml.matchAll(/<mxCell\b[^>]*id="(link_\d+)"[^>]*>/g)) {
154
+ if (!edgeNum.has(m[1]))
155
+ edgeNum.set(m[1], next++);
156
+ }
157
+ // 2. 先替换 source/target(node_xxx 引用),再替换 id,避免 source 里被误判
158
+ let out = xml;
159
+ for (const [ref, num] of nodeNum) {
160
+ out = out.replace(new RegExp(`source="${ref}"`, 'g'), `source="${num}"`);
161
+ out = out.replace(new RegExp(`target="${ref}"`, 'g'), `target="${num}"`);
162
+ }
163
+ // 3. 替换 cell id,并同步把坐标写进对应 node cell 的 mxGeometry
164
+ for (const [ref, num] of nodeNum) {
165
+ const oldIdRe = new RegExp(`(id=")${ref}(")`, 'g');
166
+ out = out.replace(oldIdRe, `$1${num}$2`);
167
+ }
168
+ for (const [ref, num] of edgeNum) {
169
+ out = out.replace(new RegExp(`(id=")${ref}(")`, 'g'), `$1${num}$2`);
170
+ }
171
+ // 4. 应用坐标:在浏览器格式(数字 id)的 node cell 上替换 geometry
172
+ for (const [ref, num] of nodeNum) {
173
+ const pos = positions.get(ref.replace('node_', ''));
174
+ if (!pos)
175
+ continue;
176
+ const { x, y } = pos;
177
+ const cellRe = new RegExp(`<mxCell\\b[^>]*id="${num}"[^>]*>.*?<mxGeometry\\s+x="[\\d.]+"\\s+y="[\\d.]+"`);
178
+ out = out.replace(cellRe, match => match.replace(/(<mxGeometry\s+x=")[\d.]+("\s+y=")[\d.]+(")/, `$1${x}$2${y}$3`));
179
+ }
180
+ // 5. 根 cell 规范化(浏览器格式:id=0 无 vertex,id=1 parent=0)
181
+ out = out.replace(/<mxCell id="0" vertex="1"\/><mxCell id="1" vertex="1" parent="0"\/>/, '<mxCell id="0"/><mxCell id="1" parent="0"/>');
182
+ // 6. 按方向重写 edge 连接点(style + defaultPos),否则 ltr 下线仍从节点底部出/顶部进
183
+ out = out.replace(/exitX=[\d.]+;exitY=[\d.]+;entryX=[\d.]+;entryY=[\d.]+/g, edgeExitEntry(direction));
184
+ return out;
185
+ }
186
+ /** 回读 getXml 验证坐标 */
187
+ export async function verifyPositions(client, baseUrl, workflowId, expected) {
188
+ const data = await client.postForm(`${baseUrl}/api/bs/workflow/pathdef/chart/getXml`, `workflowId=${workflowId}&keepTitle=undefined&showType=0`);
189
+ const xml = data?.data?.xml || '';
190
+ const { nodeCells } = parseWorkflowXml(xml);
191
+ const mismatch = [];
192
+ for (const n of nodeCells) {
193
+ const exp = expected.get(n.nodeId);
194
+ if (!exp)
195
+ continue;
196
+ if (Math.abs(n.x - exp.x) > 0.5 || Math.abs(n.y - exp.y) > 0.5) {
197
+ mismatch.push({ nodeId: n.nodeId, expected: `(${exp.x},${exp.y})`, actual: `(${n.x},${n.y})` });
198
+ }
199
+ }
200
+ return { ok: mismatch.length === 0, mismatch };
201
+ }
202
+ /** 主入口:读图 → 分层 → 排布 → (可选)回写 → 验证 */
203
+ export async function autoLayoutWorkflow(input) {
204
+ const { client, baseUrl, workflowId } = input;
205
+ const opts = input.options ?? {};
206
+ const direction = opts.direction ?? 'ltr';
207
+ const gapX = opts.gapX ?? 90;
208
+ const gapY = opts.gapY ?? 40;
209
+ const marginX = opts.marginX ?? 60;
210
+ const marginY = opts.marginY ?? 60;
211
+ const dryRun = opts.dryRun ?? false;
212
+ // 1. 读图
213
+ const data = await client.postForm(`${baseUrl}/api/bs/workflow/pathdef/chart/getXml`, `workflowId=${workflowId}&keepTitle=undefined&showType=0`);
214
+ if (data?.code !== 200 || !data?.data?.xml) {
215
+ return { workflowId, direction, nodes: [], nodeCount: 0, linkCount: 0, layerCount: 0, saved: false, verified: false, error: data?.msg || '读取流程图 XML 失败' };
216
+ }
217
+ const xml = data.data.xml;
218
+ const { nodeCells, links } = parseWorkflowXml(xml);
219
+ if (nodeCells.length === 0) {
220
+ return { workflowId, direction, nodes: [], nodeCount: 0, linkCount: 0, layerCount: 0, saved: false, verified: false, error: '未解析到节点(可能该流程没有流程图数据)' };
221
+ }
222
+ // 2. 分层 + 3. 排布
223
+ const layers = computeLayers(nodeCells, links);
224
+ const positions = computePositions(nodeCells, layers, {
225
+ direction,
226
+ gapX,
227
+ gapY,
228
+ marginX,
229
+ marginY,
230
+ });
231
+ const nodeList = nodeCells.map(n => {
232
+ const p = positions.get(n.nodeId);
233
+ return { nodeId: n.nodeId, name: n.name, nodeType: n.nodeType, nodeAttr: n.nodeAttr, layer: p.layer, x: p.x, y: p.y };
234
+ });
235
+ const layerCount = new Set([...layers.values()]).size;
236
+ // 构造浏览器格式 XML(保存实际用的格式)
237
+ const newXml = buildBrowserXml(xml, positions, direction);
238
+ // dry-run:只返回结果和新 XML
239
+ if (dryRun) {
240
+ return { workflowId, direction, nodes: nodeList, nodeCount: nodeCells.length, linkCount: links.length, layerCount, saved: false, verified: false, xml: newXml };
241
+ }
242
+ // 4. 回写
243
+ let saveOk = false;
244
+ try {
245
+ // 锁定图表(浏览器保存前也这么做)
246
+ await client.postForm(`${baseUrl}/api/bs/workflow/pathdef/chart/checkoutHeart`, `workflowId=${workflowId}&chartSrc=0`);
247
+ }
248
+ catch { /* best effort */ }
249
+ const saveXml = newXml.replace(/^<\?xml[^>]*\?>\s*/, '').replace(/grid="1"/, 'grid="0"');
250
+ const xmlB64 = Buffer.from(saveXml).toString('base64').replace(/\+/g, '$');
251
+ const body = `workflowId=${workflowId}&deleteLinks=&deleteNodes=&groups={"col":[],"row":[]}&deleteGroups=&templateKey=0&chartSrc=0&showConditionName=false&showLinkName=false&isSaveBySkipLinkValidate=false&xml=${xmlB64}`;
252
+ try {
253
+ const saveRes = await client.postForm(`${baseUrl}/api/bs/workflow/pathdef/chart/saveLayout`, body);
254
+ saveOk = saveRes?.code === 200 && !!saveRes?.status;
255
+ }
256
+ catch {
257
+ saveOk = false;
258
+ }
259
+ // 5. 回读验证
260
+ let verified = false;
261
+ try {
262
+ const v = await verifyPositions(client, baseUrl, workflowId, positions);
263
+ verified = v.ok;
264
+ }
265
+ catch {
266
+ verified = false;
267
+ }
268
+ return {
269
+ workflowId,
270
+ direction,
271
+ nodes: nodeList,
272
+ nodeCount: nodeCells.length,
273
+ linkCount: links.length,
274
+ layerCount,
275
+ saved: saveOk,
276
+ verified,
277
+ };
278
+ }
279
+ //# sourceMappingURL=workflow-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-layout.js","sourceRoot":"","sources":["../../src/services/workflow-layout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * 流程节点操作者组管理
3
+ *
4
+ * 节点操作者按「组」存储。一个节点可有多组(条件组),set-operator 走
5
+ * 「先清空旧组、再新建一组」的全量重建,避免重复设置时旧组堆积。
6
+ *
7
+ * 接口链(实测):
8
+ * 读已有组列表: getNodeSetForm → data.operator [{name,id}]
9
+ * 读组内条目: getOperatorGroupList?paramGroupId=<组id>&sourceType=1&nodeId=<nodeId>
10
+ * 删组: deleteOperatorGroupItemList {groupId, sourceType, oldItemDatas:[组内条目]}
11
+ * 保存: saveOperatorGroup
12
+ */
13
+ import type { ApiClient } from '../core/client.js';
14
+ export type OperatorClient = Pick<ApiClient, 'get' | 'post'>;
15
+ export interface OperatorGroupRef {
16
+ name: string;
17
+ id: string;
18
+ }
19
+ /** 读节点当前所有操作者组(getNodeSetForm → data.operator) */
20
+ export declare function getNodeOperatorGroups(client: OperatorClient, baseUrl: string, workflowId: string, nodeId: string): Promise<OperatorGroupRef[]>;
21
+ /** 读组内操作者条目(getOperatorGroupList,需确切 groupId)。
22
+ * 响应结构:gl.data 直接是条目数组(不是 gl.data.data)。 */
23
+ export declare function getNodeOperatorItems(client: OperatorClient, baseUrl: string, groupId: string, nodeId: string): Promise<any[]>;
24
+ /** 删除一个操作者组(deleteOperatorGroupItemList) */
25
+ export declare function deleteNodeOperatorGroup(client: OperatorClient, baseUrl: string, groupId: string, oldItemDatas: any[]): Promise<void>;
26
+ /** 清空节点所有操作者组,返回清理的组数 */
27
+ export declare function clearNodeOperatorGroups(client: OperatorClient, baseUrl: string, workflowId: string, nodeId: string): Promise<number>;
28
+ /**
29
+ * 按逗号分隔的关键词查找多个角色(组内多操作者,如竞签多候选)。
30
+ * 返回 { found: 命中角色数组, missing: 第一个未命中的关键词(空=全部命中) }
31
+ */
32
+ export declare function findRolesByKeywords(roles: any[], keyword: string): {
33
+ found: any[];
34
+ missing: string;
35
+ };
36
+ //# sourceMappingURL=workflow-operator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-operator.d.ts","sourceRoot":"","sources":["../../src/services/workflow-operator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;AAE7D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,kDAAkD;AAClD,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAM7B;AAED;6CAC6C;AAC7C,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,GAAG,EAAE,CAAC,CAOhB;AAED,4CAA4C;AAC5C,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,GAAG,EAAE,GAClB,OAAO,CAAC,IAAI,CAAC,CAMf;AAED,yBAAyB;AACzB,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAWjB;AAcD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CASpG"}
@@ -0,0 +1,65 @@
1
+ /** 读节点当前所有操作者组(getNodeSetForm → data.operator) */
2
+ export async function getNodeOperatorGroups(client, baseUrl, workflowId, nodeId) {
3
+ const nsf = await client.get(`${baseUrl}/api/bs/workflow/pathdef/nodeBase/getNodeSetForm?workflowId=${workflowId}&nodeId=${nodeId}`);
4
+ const groups = nsf?.data?.data?.operator || [];
5
+ return Array.isArray(groups) ? groups : [];
6
+ }
7
+ /** 读组内操作者条目(getOperatorGroupList,需确切 groupId)。
8
+ * 响应结构:gl.data 直接是条目数组(不是 gl.data.data)。 */
9
+ export async function getNodeOperatorItems(client, baseUrl, groupId, nodeId) {
10
+ const gl = await client.get(`${baseUrl}/api/bs/workflow/pathdef/nodeOperator/getOperatorGroupList?paramGroupId=${groupId}&sourceType=1&nodeId=${nodeId}&refWorkflowId=`);
11
+ const d = gl?.data;
12
+ const items = Array.isArray(d?.data) ? d.data : (Array.isArray(d) ? d : []);
13
+ return items;
14
+ }
15
+ /** 删除一个操作者组(deleteOperatorGroupItemList) */
16
+ export async function deleteNodeOperatorGroup(client, baseUrl, groupId, oldItemDatas) {
17
+ await client.post(`${baseUrl}/api/bs/workflow/pathdef/nodeOperator/deleteOperatorGroupItemList`, {
18
+ groupId,
19
+ sourceType: '1',
20
+ oldItemDatas,
21
+ });
22
+ }
23
+ /** 清空节点所有操作者组,返回清理的组数 */
24
+ export async function clearNodeOperatorGroups(client, baseUrl, workflowId, nodeId) {
25
+ const groups = await getNodeOperatorGroups(client, baseUrl, workflowId, nodeId);
26
+ for (const g of groups) {
27
+ try {
28
+ const items = await getNodeOperatorItems(client, baseUrl, g.id, nodeId);
29
+ if (Array.isArray(items) && items.length > 0) {
30
+ await deleteNodeOperatorGroup(client, baseUrl, g.id, items);
31
+ }
32
+ }
33
+ catch { /* 单个组清理失败不影响后续 */ }
34
+ }
35
+ return groups.length;
36
+ }
37
+ /** 在角色树中按关键词查找角色 */
38
+ function findRoleInTree(nodes, keyword) {
39
+ for (const node of nodes) {
40
+ if (node.content && node.content.includes(keyword))
41
+ return node;
42
+ if (node.children && node.children.length > 0) {
43
+ const found = findRoleInTree(node.children, keyword);
44
+ if (found)
45
+ return found;
46
+ }
47
+ }
48
+ return null;
49
+ }
50
+ /**
51
+ * 按逗号分隔的关键词查找多个角色(组内多操作者,如竞签多候选)。
52
+ * 返回 { found: 命中角色数组, missing: 第一个未命中的关键词(空=全部命中) }
53
+ */
54
+ export function findRolesByKeywords(roles, keyword) {
55
+ const keywords = keyword.split(',').map(s => s.trim()).filter(Boolean);
56
+ const found = [];
57
+ for (const kw of keywords) {
58
+ const f = findRoleInTree(roles, kw);
59
+ if (!f)
60
+ return { found, missing: kw };
61
+ found.push(f);
62
+ }
63
+ return { found, missing: '' };
64
+ }
65
+ //# sourceMappingURL=workflow-operator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-operator.js","sourceRoot":"","sources":["../../src/services/workflow-operator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /** Auth file data (decrypted) */
2
+ export interface AuthData {
3
+ cookies: Record<string, string>;
4
+ userId: string;
5
+ tenantKey: string;
6
+ baseUrl: string;
7
+ passportUrl?: string;
8
+ stTicket?: string;
9
+ redirectUrl?: string;
10
+ cookieSavedAt?: number;
11
+ mainUrl?: string;
12
+ }
13
+ /** Employee search result */
14
+ export interface Employee {
15
+ id: string;
16
+ name: string;
17
+ department: string;
18
+ mobile: string;
19
+ }
20
+ /** Menu item */
21
+ export interface MenuItem {
22
+ id: string;
23
+ name: string;
24
+ pageType: string;
25
+ url: string;
26
+ }
27
+ /** Ecode file/directory entry */
28
+ export interface EcodeEntry {
29
+ id: string;
30
+ name: string;
31
+ type: 'folder' | 'file';
32
+ sourceId?: string;
33
+ }
34
+ /** Form field definition */
35
+ export interface FormField {
36
+ fieldId: string;
37
+ fieldName: string;
38
+ fieldKey: string;
39
+ id: string;
40
+ fieldOptions?: Array<{
41
+ name: string;
42
+ valueKey: string;
43
+ }>;
44
+ }
45
+ /** Global CLI options */
46
+ export interface GlobalOptions {
47
+ auth?: string;
48
+ profile?: string;
49
+ json?: boolean;
50
+ baseUrl?: string;
51
+ passportUrl?: string;
52
+ }
53
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,6BAA6B;AAC7B,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,gBAAgB;AAChB,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,iCAAiC;AACjC,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,4BAA4B;AAC5B,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1D;AAED,yBAAyB;AACzB,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ /** Extract pinyin initials from a mixed Chinese/English name */
2
+ export declare function pinyinInitials(name: string): string;
3
+ /** Generate a field column name: pinyin initials, plus a dup index when the
4
+ * same initials recur in the same table (0 → bare initials, 1 → initials+'1', …).
5
+ * Caller tracks recurrence via pinyinInitials() and passes the dupIndex. */
6
+ export declare function toColumnName(fieldName: string, dupIndex?: number): string;
7
+ /** Generate a table name suffix: pinyin initials + 4 random digits */
8
+ export declare function toTableName(formName: string): string;
9
+ /** 明细表子表物理表名:pinyin initials + 随机后缀。
10
+ * 主表名带随机后缀(uf_xxx_1234)但子表名原来只有 uf_{dataKey},重复用同一明细表名建表会
11
+ * 与残留物理表冲突。布局通过 subFormId/associatedId 引用子表,物理表名加后缀不影响引用。 */
12
+ export declare function toSubTableName(detailFieldName: string, dupIndex?: number): string;
13
+ //# sourceMappingURL=column-name.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-name.d.ts","sourceRoot":"","sources":["../../src/utils/column-name.ts"],"names":[],"mappings":"AASA,gEAAgE;AAChE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAanD;AAED;;6EAE6E;AAC7E,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,SAAI,GAAG,MAAM,CAGpE;AAED,sEAAsE;AACtE,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGpD;AAED;;8DAE8D;AAC9D,wBAAgB,cAAc,CAAC,eAAe,EAAE,MAAM,EAAE,QAAQ,SAAI,GAAG,MAAM,CAG5E"}