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,624 @@
1
+ import { AuthSession } from '../core/auth.js';
2
+ import { ApiClient } from '../core/client.js';
3
+ import { fetchFields, loadMobileConfig } from './form-list-utils.js';
4
+ import { registerListStatsCommand } from './form-list-stats.js';
5
+ import { registerListFilterCommand } from './form-list-filter.js';
6
+ import { registerListEventCommand } from './form-list-event.js';
7
+ import { registerListGroupCommand } from './form-list-group.js';
8
+ import { registerListPermissionCommand } from './form-list-permission.js';
9
+ import { registerListSearchGroupCommand } from './form-list-search-group.js';
10
+ /** Generate a 32-char hex UUID for tableuid */
11
+ function uuid32() {
12
+ const hex = '0123456789abcdef';
13
+ let s = '';
14
+ for (let i = 0; i < 32; i++)
15
+ s += hex[Math.floor(Math.random() * 16)];
16
+ return s;
17
+ }
18
+ /** LZW-encode a JSON config to comma-separated numbers */
19
+ function encodeCustomConfig(obj) {
20
+ const source = JSON.stringify(obj);
21
+ if (!source)
22
+ return '';
23
+ const dict = {};
24
+ const output = [];
25
+ let nextCode = 1 << 16;
26
+ let current = source[0];
27
+ const codeFor = (token) => {
28
+ if (token in dict)
29
+ return dict[token];
30
+ if (token.length === 1) {
31
+ dict[token] = token.charCodeAt(0);
32
+ return dict[token];
33
+ }
34
+ throw new Error(`Cannot encode: ${token}`);
35
+ };
36
+ for (let i = 1; i < source.length; i++) {
37
+ const combined = current + source[i];
38
+ if (combined in dict) {
39
+ current = combined;
40
+ continue;
41
+ }
42
+ output.push(codeFor(current));
43
+ dict[combined] = nextCode++;
44
+ current = source[i];
45
+ }
46
+ output.push(codeFor(current));
47
+ return output.join(',');
48
+ }
49
+ /** Build a field-id → display-name map from tableField config */
50
+ function buildFieldLabelMap(cfg) {
51
+ const map = {};
52
+ const tf = cfg.tableField || [];
53
+ for (const f of tf) {
54
+ if (f.id && f.text)
55
+ map[String(f.id)] = f.text;
56
+ // Also map the field_xxx form used in API row data
57
+ if (f.name && f.text)
58
+ map[String(f.name)] = f.text;
59
+ }
60
+ return map;
61
+ }
62
+ /** Resolve a row key to a display label using the field map */
63
+ function resolveLabel(key, labelMap) {
64
+ // Direct ID match
65
+ if (labelMap[key])
66
+ return labelMap[key];
67
+ // field_xxx → xxx → text
68
+ const m = key.match(/^field_(\d+)$/);
69
+ if (m && labelMap[m[1]])
70
+ return labelMap[m[1]];
71
+ // Known system keys
72
+ if (key === 'id')
73
+ return '数据ID';
74
+ if (key === 'form_data_id')
75
+ return '表单数据ID';
76
+ if (key === 'unique_key')
77
+ return '唯一键';
78
+ if (key === 'sub_obj_id')
79
+ return '子表ID';
80
+ if (key === 'is_flow')
81
+ return '流程标记';
82
+ return key;
83
+ }
84
+ export function registerFormListCommands(form, program) {
85
+ // ======== list-columns ========
86
+ form.command('list-columns')
87
+ .description('查看/调整台账显示列')
88
+ .argument('<objId>', '表单 objId')
89
+ .argument('<appId>', '应用 ID')
90
+ .argument('<listId>', '台账列表 ID')
91
+ .option('--add <fieldId>', '追加字段到显示列')
92
+ .option('--remove <fieldId>', '移除显示列字段')
93
+ .option('--pc-only', '目标明确只使用 PC;移动端配置不存在时允许继续')
94
+ .option('--json', 'JSON 格式输出当前配置')
95
+ .action(async (objId, appId, listId, cmdOpts) => {
96
+ const opts = program.opts();
97
+ const auth = await AuthSession.fromOptions(opts);
98
+ if (!auth)
99
+ process.exit(1);
100
+ const client = new ApiClient(auth);
101
+ const baseUrl = auth.getBaseUrl();
102
+ const isJson = cmdOpts.json || opts.json;
103
+ const getRes = await client.get(`${baseUrl}/api/bs/ebuilder/form/list/getNListConfig/${listId}?apid=${appId}&tpaid=${listId}&terminalType=PC`);
104
+ if (getRes?.code !== 200 || !getRes?.status) {
105
+ console.error(`查询配置失败: ${getRes?.msg}`);
106
+ process.exit(1);
107
+ }
108
+ const cfg = getRes?.data || {};
109
+ const tableField = cfg.tableField || [];
110
+ if (!cmdOpts.add && !cmdOpts.remove) {
111
+ if (isJson) {
112
+ console.log(JSON.stringify(tableField, null, 2));
113
+ return;
114
+ }
115
+ console.log(`台账 ${listId} 显示列 (${tableField.length}):`);
116
+ for (const f of tableField) {
117
+ const flag = f.hidden ? '[隐藏]' : f.mainPrimaryKey ? '[主键]' : '';
118
+ console.log(` ${f.id} ${f.text || f.name || '(无名称)'} ${f.type || ''} ${flag}`);
119
+ }
120
+ return;
121
+ }
122
+ if (cmdOpts.add) {
123
+ const fields = await fetchFields(client, baseUrl, objId);
124
+ let target = fields.find((f) => String(f.id) === String(cmdOpts.add));
125
+ let isDetail = false;
126
+ if (!target) {
127
+ // 明细子字段在 ds/fields(enableMerge) 里被合并成占位、不展开,按 fieldId 用 getFormField
128
+ // 单独取元数据(实测 sjr:明细数量/明细名称 都能取到 title/type/componentKey/subFormId/dataKey)。
129
+ // 明细列 = 普通 tableField 条目(mainField:false),浏览器抓包确认非"双层明细展开"。
130
+ const info = await client.get(`${baseUrl}/api/bs/ebuilder/form/obj/getInfoById/${objId}?apid=${appId}`, { ebbusinessid: appId });
131
+ const formId = info?.data?.formId || '';
132
+ if (formId) {
133
+ const gf = await client.post(`${baseUrl}/api/ebuilder/form/form/field/manage/getFormField`, { module: 'ebuilderform', formTableField: { formField: { id: cmdOpts.add, form: { id: formId } } } }, { ebbusinessid: formId });
134
+ const d = gf?.data;
135
+ if (d && d.fieldId) {
136
+ target = {
137
+ id: d.fieldId, text: d.title, name: `field_${d.fieldId}`, objId,
138
+ type: d.type, compType: d.componentKey, uid: '',
139
+ subFormId: d.subFormId, dataKey: d.dataKey,
140
+ physicalField: d.physicalField || d.dataKey,
141
+ isDetailtable: d.isDetailtable ?? !!d.subFormId,
142
+ };
143
+ isDetail = !!d.subFormId;
144
+ }
145
+ }
146
+ }
147
+ if (!target) {
148
+ console.error(`字段 ${cmdOpts.add} 在表单 ${objId} 中不存在`);
149
+ process.exit(1);
150
+ }
151
+ const mainField = !isDetail && !target.subFormId; // 明细子字段 mainField:false
152
+ // 完整克隆字段对象(平台要求完整字段对象:physicalField/dataKey/isDetailtable/subFormId 等,
153
+ // 手写 sparse 对象会被平台丢弃/重排 → 显示列时而出来时而没有)。对齐 form-table-view
154
+ // populateListDisplayFields 的 structuredClone 写法,再补平台台账列必备属性。
155
+ const newField = structuredClone(target);
156
+ newField.name = target.name || `field_${target.id}`;
157
+ newField.objId = target.objId || objId;
158
+ newField.mainField = mainField;
159
+ newField.mainPrimaryKey = false;
160
+ newField.uid = target.uid || uuid32();
161
+ newField.width = 150;
162
+ newField.fieldVersion = 1;
163
+ if (!tableField.find((f) => String(f.id) === String(target.id))) {
164
+ tableField.push(newField);
165
+ console.error(` 已加列: ${target.text} (mainField=${mainField}${isDetail ? ' 明细' : ''})`);
166
+ }
167
+ else {
168
+ console.error(`字段 ${target.id} 已在显示列中`);
169
+ }
170
+ }
171
+ if (cmdOpts.remove) {
172
+ const idx = tableField.findIndex((f) => String(f.id) === String(cmdOpts.remove));
173
+ if (idx >= 0)
174
+ tableField.splice(idx, 1);
175
+ else {
176
+ console.error(`字段 ${cmdOpts.remove} 不在当前显示列中`);
177
+ process.exit(1);
178
+ }
179
+ }
180
+ // 保存前读回真实移动端 mConfig 原样回传,避免把移动端台账列清空(抓包确认同接口 config→PC/mConfig→移动端)
181
+ const { mobileConfig, mobilePreserved } = await loadMobileConfig(client, baseUrl, appId, listId, cmdOpts.pcOnly);
182
+ const saveCfg = { ...cfg, tableField };
183
+ const saveRes = await client.post(`${baseUrl}/api/bs/ebuilder/form/list/saveNListConfig?apid=${appId}`, {
184
+ listId, appId, terminalType: 'PC', config: saveCfg, mConfig: mobileConfig,
185
+ });
186
+ if (saveRes?.code === 200 && saveRes?.status) {
187
+ console.log(isJson ? JSON.stringify({ success: true, listId }) : '显示列已保存');
188
+ console.log(` 移动端配置: ${mobilePreserved ? '保持原样' : '目标为 PC-only'}`);
189
+ }
190
+ else {
191
+ console.error(`保存失败: ${saveRes?.msg || '未知错误'}`);
192
+ process.exit(1);
193
+ }
194
+ });
195
+ // ======== list-format ========
196
+ form.command('list-format')
197
+ .description('查看/设置台账列显示格式(千分位/小数位)')
198
+ .argument('<objId>', '表单 objId')
199
+ .argument('<appId>', '应用 ID')
200
+ .argument('<listId>', '台账列表 ID')
201
+ .argument('<fieldId>', '列对应字段 ID')
202
+ .option('--thousandths', '开千分位(format=THOUSANDS)')
203
+ .option('--no-thousandths', '关千分位')
204
+ .option('--decimal <n>', '小数位数(decimalLength)')
205
+ .option('--clear', '清除千分位+小数位(恢复默认)')
206
+ .option('--pc-only', '目标明确只使用 PC;移动端配置不存在时允许继续')
207
+ .option('--json', 'JSON 格式输出当前列格式')
208
+ .action(async (objId, appId, listId, fieldId, cmdOpts) => {
209
+ const opts = program.opts();
210
+ const auth = await AuthSession.fromOptions(opts);
211
+ if (!auth)
212
+ process.exit(1);
213
+ const client = new ApiClient(auth);
214
+ const baseUrl = auth.getBaseUrl();
215
+ const isJson = cmdOpts.json || opts.json;
216
+ const getRes = await client.get(`${baseUrl}/api/bs/ebuilder/form/list/getNListConfig/${listId}?apid=${appId}&tpaid=${listId}&terminalType=PC`);
217
+ if (getRes?.code !== 200 || !getRes?.status) {
218
+ console.error(`查询配置失败: ${getRes?.msg}`);
219
+ process.exit(1);
220
+ }
221
+ const cfg = getRes?.data || {};
222
+ const tableField = cfg.tableField || [];
223
+ const col = tableField.find((f) => String(f.id) === String(fieldId));
224
+ if (!col) {
225
+ console.error(`未找到列 fieldId=${fieldId}。可用列: ${tableField.map((f) => `${f.id}(${f.text || f.name})`).join(', ')}`);
226
+ process.exit(1);
227
+ }
228
+ const hasThousandths = col.format === 'THOUSANDS';
229
+ if (cmdOpts.thousandths === undefined && cmdOpts.decimal === undefined && !cmdOpts.clear) {
230
+ if (isJson) {
231
+ console.log(JSON.stringify({ fieldId, format: col.format || null, decimalLength: col.decimalLength ?? null }, null, 2));
232
+ return;
233
+ }
234
+ console.log(`列 ${fieldId}(${col.text || col.name}):千分位 ${hasThousandths ? '开' : '关'}${col.decimalLength != null ? `、小数位 ${col.decimalLength}` : ''}`);
235
+ return;
236
+ }
237
+ // 列级千分位/小数位直接写列对象:format:"THOUSANDS" 开千分位、decimalLength:N 小数位
238
+ // (非 showTrans.ruleConfig 也非 conversionSet——抓包坐实)。开千分位时补 hiddenColumn:0/widthUnit:"px" 对齐设计器。
239
+ if (cmdOpts.clear) {
240
+ delete col.format;
241
+ delete col.decimalLength;
242
+ }
243
+ else {
244
+ if (cmdOpts.thousandths === true) {
245
+ col.format = 'THOUSANDS';
246
+ col.hiddenColumn = 0;
247
+ col.widthUnit = 'px';
248
+ }
249
+ else if (cmdOpts.thousandths === false) {
250
+ delete col.format;
251
+ }
252
+ if (cmdOpts.decimal != null)
253
+ col.decimalLength = Number(cmdOpts.decimal);
254
+ }
255
+ const { mobileConfig, mobilePreserved } = await loadMobileConfig(client, baseUrl, appId, listId, cmdOpts.pcOnly);
256
+ const saveCfg = { ...cfg };
257
+ const saveRes = await client.post(`${baseUrl}/api/bs/ebuilder/form/list/saveNListConfig?apid=${appId}`, {
258
+ listId, appId, terminalType: 'PC', config: saveCfg, mConfig: mobileConfig,
259
+ });
260
+ if (saveRes?.code === 200 && saveRes?.status) {
261
+ const on = col.format === 'THOUSANDS';
262
+ console.log(isJson ? JSON.stringify({ success: true, listId, fieldId, format: col.format || null, decimalLength: col.decimalLength ?? null }) : `列 ${fieldId} 格式已保存:千分位 ${on ? '开' : '关'}${col.decimalLength != null ? `、小数位 ${col.decimalLength}` : ''}`);
263
+ console.log(` 移动端配置: ${mobilePreserved ? '保持原样' : '目标为 PC-only'}`);
264
+ }
265
+ else {
266
+ console.error(`保存失败: ${saveRes?.msg || '未知错误'}`);
267
+ process.exit(1);
268
+ }
269
+ });
270
+ // ======== list-search ========
271
+ form.command('list-search')
272
+ .description('查看/配置台账搜索条件')
273
+ .argument('<objId>', '表单 objId')
274
+ .argument('<appId>', '应用 ID')
275
+ .argument('<listId>', '台账列表 ID')
276
+ .option('--add <fieldIds...>', '添加搜索字段(进搜索面板,可多个)')
277
+ .option('--quick <fieldIds...>', '添加顶部快捷筛选字段(可多个)')
278
+ .option('--remove <fieldId>', '移除搜索字段')
279
+ .option('--pc-only', '目标明确只使用 PC;移动端配置不存在时允许继续')
280
+ .option('--json', 'JSON 格式输出当前搜索配置')
281
+ .action(async (objId, appId, listId, cmdOpts) => {
282
+ const opts = program.opts();
283
+ const auth = await AuthSession.fromOptions(opts);
284
+ if (!auth)
285
+ process.exit(1);
286
+ const client = new ApiClient(auth);
287
+ const baseUrl = auth.getBaseUrl();
288
+ const isJson = cmdOpts.json || opts.json;
289
+ const getRes = await client.get(`${baseUrl}/api/bs/ebuilder/form/list/getNListConfig/${listId}?apid=${appId}&tpaid=${listId}&terminalType=PC`);
290
+ if (getRes?.code !== 200 || !getRes?.status) {
291
+ console.error(`查询配置失败: ${getRes?.msg}`);
292
+ process.exit(1);
293
+ }
294
+ const cfg = getRes?.data || {};
295
+ const sc = cfg.searchConditions || {};
296
+ const commonFilters = sc.commonFilters || [];
297
+ const quickFilters = sc.quickFilters || [];
298
+ if (!cmdOpts.add && !cmdOpts.quick && !cmdOpts.remove) {
299
+ if (isJson) {
300
+ console.log(JSON.stringify(sc, null, 2));
301
+ return;
302
+ }
303
+ console.log(`搜索模式: ${sc.commonSearchType === '1' ? '高级搜索' : '常用搜索'}`);
304
+ if (quickFilters.length > 0) {
305
+ console.log(`快捷筛选 (${quickFilters.length}):`);
306
+ for (const f of quickFilters)
307
+ console.log(` ${f.fieldId || f.id} ${f.text || f.showName || '(无名称)'}`);
308
+ }
309
+ if (commonFilters.length > 0) {
310
+ console.log(`搜索面板 (${commonFilters.length}):`);
311
+ for (const f of commonFilters)
312
+ console.log(` ${f.fieldId || f.id} ${f.text || f.showName || '(无名称)'} [${f.conditionTypeValue || f.type}]`);
313
+ }
314
+ return;
315
+ }
316
+ const addFilter = (target, dest, isQuick) => {
317
+ if (dest.find((f) => String(f.fieldId || f.id) === String(target.id)))
318
+ return false;
319
+ dest.push({
320
+ id: target.id, fieldId: target.id,
321
+ name: target.name || `field_${target.id}`, fieldName: target.name || `field_${target.id}`,
322
+ conditionTypeValue: 'like', showName: target.text, text: target.text,
323
+ type: target.type, compType: target.compType, objId: target.objId || objId,
324
+ subFormId: target.subFormId || '',
325
+ subTableId: target.subTableId || target.subFormId || '',
326
+ dataKey: target.dataKey || '',
327
+ physicalField: target.physicalField || target.dataKey || '',
328
+ isDetailtable: target.isDetailtable ?? !!target.subFormId,
329
+ isQuick: isQuick ? '1' : '0',
330
+ listFilterDefaultSets: { multiSelect: true },
331
+ });
332
+ return true;
333
+ };
334
+ if (cmdOpts.add || cmdOpts.quick) {
335
+ const fields = await fetchFields(client, baseUrl, objId);
336
+ let formId = '';
337
+ const resolveField = async (fid) => {
338
+ const t = fields.find((f) => String(f.id) === String(fid));
339
+ if (t)
340
+ return t;
341
+ // 明细子字段在 ds/fields(enableMerge) 里被合并成占位、不展开,按 fieldId 用 getFormField
342
+ // 单独取元数据(与 list-columns 同款 fallback)。
343
+ if (!formId) {
344
+ const info = await client.get(`${baseUrl}/api/bs/ebuilder/form/obj/getInfoById/${objId}?apid=${appId}`, { ebbusinessid: appId });
345
+ formId = info?.data?.formId || '';
346
+ }
347
+ if (formId) {
348
+ const gf = await client.post(`${baseUrl}/api/ebuilder/form/form/field/manage/getFormField`, { module: 'ebuilderform', formTableField: { formField: { id: fid, form: { id: formId } } } }, { ebbusinessid: formId });
349
+ const d = gf?.data;
350
+ if (d && d.fieldId) {
351
+ return { id: d.fieldId, text: d.title, name: `field_${d.fieldId}`, objId,
352
+ type: d.type, compType: d.componentKey, uid: '',
353
+ subFormId: d.subFormId, dataKey: d.dataKey,
354
+ physicalField: d.physicalField || d.dataKey,
355
+ isDetailtable: d.isDetailtable ?? !!d.subFormId };
356
+ }
357
+ }
358
+ return null;
359
+ };
360
+ const addIds = Array.isArray(cmdOpts.add) ? cmdOpts.add : (cmdOpts.add ? [cmdOpts.add] : []);
361
+ const quickIds = Array.isArray(cmdOpts.quick) ? cmdOpts.quick : (cmdOpts.quick ? [cmdOpts.quick] : []);
362
+ for (const fid of addIds) {
363
+ const target = await resolveField(fid);
364
+ if (!target) {
365
+ console.error(`字段 ${fid} 在表单 ${objId} 中不存在`);
366
+ process.exit(1);
367
+ }
368
+ if (addFilter(target, commonFilters, false))
369
+ sc.commonSearchType = '0';
370
+ }
371
+ for (const fid of quickIds) {
372
+ const target = await resolveField(fid);
373
+ if (!target) {
374
+ console.error(`字段 ${fid} 在表单 ${objId} 中不存在`);
375
+ process.exit(1);
376
+ }
377
+ addFilter(target, quickFilters, true);
378
+ }
379
+ }
380
+ if (cmdOpts.remove) {
381
+ let idx = commonFilters.findIndex((f) => String(f.fieldId || f.id) === String(cmdOpts.remove));
382
+ if (idx >= 0) {
383
+ commonFilters.splice(idx, 1);
384
+ }
385
+ else {
386
+ idx = quickFilters.findIndex((f) => String(f.fieldId || f.id) === String(cmdOpts.remove));
387
+ if (idx >= 0)
388
+ quickFilters.splice(idx, 1);
389
+ else {
390
+ console.error(`搜索字段 ${cmdOpts.remove} 不在当前配置中`);
391
+ process.exit(1);
392
+ }
393
+ }
394
+ }
395
+ sc.commonFilters = commonFilters;
396
+ sc.quickFilters = quickFilters;
397
+ // 保存前读回真实移动端 mConfig 原样回传,避免把移动端台账搜索配置清空
398
+ const { mobileConfig, mobilePreserved } = await loadMobileConfig(client, baseUrl, appId, listId, cmdOpts.pcOnly);
399
+ const saveCfg = { ...cfg, searchConditions: sc };
400
+ const saveRes = await client.post(`${baseUrl}/api/bs/ebuilder/form/list/saveNListConfig?apid=${appId}`, {
401
+ listId, appId, terminalType: 'PC', config: saveCfg, mConfig: mobileConfig,
402
+ });
403
+ if (saveRes?.code === 200 && saveRes?.status) {
404
+ console.log(isJson ? JSON.stringify({ success: true, listId }) : '搜索条件已保存');
405
+ console.log(` 移动端配置: ${mobilePreserved ? '保持原样' : '目标为 PC-only'}`);
406
+ }
407
+ else {
408
+ console.error(`保存失败: ${saveRes?.msg || '未知错误'}`);
409
+ process.exit(1);
410
+ }
411
+ });
412
+ // ======== list-sort ========
413
+ form.command('list-sort')
414
+ .description('查看/配置台账排序')
415
+ .argument('<objId>', '表单 objId')
416
+ .argument('<appId>', '应用 ID')
417
+ .argument('<listId>', '台账列表 ID')
418
+ .option('--field <fieldIds...>', '排序字段(可多个,按传入顺序多级排序)')
419
+ .option('--order <ASC|DESC>', '排序方向(对所有 --field 生效)', 'ASC')
420
+ .option('--clear', '清除排序规则')
421
+ .option('--pc-only', '目标明确只使用 PC;移动端配置不存在时允许继续')
422
+ .option('--json', 'JSON 格式输出当前排序')
423
+ .action(async (objId, appId, listId, cmdOpts) => {
424
+ const opts = program.opts();
425
+ const auth = await AuthSession.fromOptions(opts);
426
+ if (!auth)
427
+ process.exit(1);
428
+ const client = new ApiClient(auth);
429
+ const baseUrl = auth.getBaseUrl();
430
+ const isJson = cmdOpts.json || opts.json;
431
+ const getRes = await client.get(`${baseUrl}/api/bs/ebuilder/form/list/getNListConfig/${listId}?apid=${appId}&tpaid=${listId}&terminalType=PC`);
432
+ if (getRes?.code !== 200 || !getRes?.status) {
433
+ console.error(`查询配置失败: ${getRes?.msg}`);
434
+ process.exit(1);
435
+ }
436
+ const cfg = getRes?.data || {};
437
+ if (!cmdOpts.field && !cmdOpts.clear) {
438
+ const order = cfg.order || [];
439
+ if (isJson) {
440
+ console.log(JSON.stringify(order, null, 2));
441
+ return;
442
+ }
443
+ if (order.length === 0) {
444
+ console.log('当前无排序规则');
445
+ return;
446
+ }
447
+ console.log('当前排序:');
448
+ for (const o of order)
449
+ console.log(` ${o.id} ${o.text || o.name || o.id} ${o.orderType}`);
450
+ return;
451
+ }
452
+ if (cmdOpts.clear) {
453
+ cfg.order = [];
454
+ }
455
+ else if (cmdOpts.field && cmdOpts.field.length) {
456
+ const fields = await fetchFields(client, baseUrl, objId);
457
+ const fieldIds = Array.isArray(cmdOpts.field) ? cmdOpts.field : [cmdOpts.field];
458
+ const orderType = cmdOpts.order === 'DESC' ? 'DESC' : 'ASC';
459
+ // 多字段排序:cfg.order 是数组,平台支持多级排序。完整克隆字段对象避免被平台丢弃/重排。
460
+ cfg.order = fieldIds.map((fid) => {
461
+ const target = fields.find((f) => String(f.id) === String(fid));
462
+ if (!target) {
463
+ console.error(`字段 ${fid} 在表单 ${objId} 中不存在`);
464
+ process.exit(1);
465
+ }
466
+ const o = structuredClone(target);
467
+ o.name = target.name || `field_${target.id}`;
468
+ o.objId = target.objId || objId;
469
+ o.orderType = orderType;
470
+ o.text = target.text;
471
+ o.mainField = target.isDetailtable ? false : !target.subFormId;
472
+ return o;
473
+ });
474
+ }
475
+ // 保存前读回真实移动端 mConfig 原样回传,避免把移动端台账排序配置清空
476
+ const { mobileConfig, mobilePreserved } = await loadMobileConfig(client, baseUrl, appId, listId, cmdOpts.pcOnly);
477
+ const saveCfg = { ...cfg };
478
+ const saveRes = await client.post(`${baseUrl}/api/bs/ebuilder/form/list/saveNListConfig?apid=${appId}`, {
479
+ listId, appId, terminalType: 'PC', config: saveCfg, mConfig: mobileConfig,
480
+ });
481
+ if (saveRes?.code === 200 && saveRes?.status) {
482
+ console.log(isJson ? JSON.stringify({ success: true, listId }) : '排序规则已保存');
483
+ console.log(` 移动端配置: ${mobilePreserved ? '保持原样' : '目标为 PC-only'}`);
484
+ }
485
+ else {
486
+ console.error(`保存失败: ${saveRes?.msg || '未知错误'}`);
487
+ process.exit(1);
488
+ }
489
+ });
490
+ registerListStatsCommand(form, program);
491
+ registerListFilterCommand(form, program);
492
+ registerListEventCommand(form, program);
493
+ registerListGroupCommand(form, program);
494
+ registerListPermissionCommand(form, program);
495
+ registerListSearchGroupCommand(form, program);
496
+ // ======== list-data ========
497
+ form.command('list-data')
498
+ .description('查询台账数据')
499
+ .argument('<objId>', '表单 objId')
500
+ .argument('<appId>', '应用 ID')
501
+ .argument('<listId>', '台账列表 ID (nListViewId)')
502
+ .option('--page <n>', '页码', '1')
503
+ .option('--size <n>', '每页条数', '20')
504
+ .option('--search <keyword>', '全文搜索关键词')
505
+ .option('--json', 'JSON 格式输出')
506
+ .action(async (objId, appId, listId, cmdOpts) => {
507
+ const opts = program.opts();
508
+ const auth = await AuthSession.fromOptions(opts);
509
+ if (!auth)
510
+ process.exit(1);
511
+ const client = new ApiClient(auth);
512
+ const baseUrl = auth.getBaseUrl();
513
+ const isJson = cmdOpts.json || opts.json;
514
+ // Read tableField config to build field-id → name map for display
515
+ let labelMap = {};
516
+ try {
517
+ const cfgRes = await client.get(`${baseUrl}/api/bs/ebuilder/form/list/getNListConfig/${listId}?apid=${appId}&tpaid=${listId}&terminalType=PC`);
518
+ if (cfgRes?.code === 200 && cfgRes?.data)
519
+ labelMap = buildFieldLabelMap(cfgRes.data);
520
+ }
521
+ catch { /* proceed without labels */ }
522
+ const hostPageId = listId;
523
+ // Get pageAppId
524
+ const pageInfo = await client.get(`${baseUrl}/api/ebuilder/form/viewdesigner/viewPageInfo?pageId=${hostPageId}&terminalType=PC&entranceType=RUN&runType=`);
525
+ const pageAppId = pageInfo?.data?.page?.appId || appId;
526
+ // Get compId from page layout
527
+ let compId = '';
528
+ let refPluginPackageId = '933846626099339271';
529
+ try {
530
+ const layoutRes = await client.get(`${baseUrl}/api/bs/ebuilder/designer/layout/list?pageId=${hostPageId}&returnCusComp=true`);
531
+ const layouts = layoutRes?.data || [];
532
+ const pcLayout = Array.isArray(layouts) ? layouts.find((l) => l.terminalType === 'PC') : null;
533
+ if (pcLayout?.comps) {
534
+ const listComp = pcLayout.comps.find((c) => c.component === 'NList' || c.type === 'NList' || (c.config?.ebListId === listId));
535
+ if (listComp) {
536
+ compId = listComp.id || '';
537
+ refPluginPackageId = listComp.refPluginPackageId || listComp.config?.refPluginPackageId || refPluginPackageId;
538
+ }
539
+ }
540
+ }
541
+ catch { /* use defaults */ }
542
+ if (!compId)
543
+ compId = hostPageId;
544
+ const tableuid = uuid32();
545
+ const pageNo = parseInt(cmdOpts.page || '1', 10);
546
+ const pageSize = parseInt(cmdOpts.size || '20', 10);
547
+ const conditionId = `${compId}_filter_EXCLUDECACHE`;
548
+ const filter = [{
549
+ conditionComId: conditionId, conditionType: 'and',
550
+ dataType: 'classification', id: conditionId, useConfig: true,
551
+ }];
552
+ if (cmdOpts.search) {
553
+ filter[0].dataType = 'field';
554
+ filter[0].filterFields = [{ id: '-1', fieldName: 'search', type: 'text' }];
555
+ filter[0].funcType = 'like';
556
+ filter[0].value = cmdOpts.search;
557
+ }
558
+ const customConfigObj = { superiorField: { enable: false } };
559
+ const formData = {
560
+ pageAppId: String(pageAppId), pageId: String(hostPageId), compId: String(compId),
561
+ pageNo: String(pageNo), pageSize: String(pageSize), tableuid,
562
+ filter: JSON.stringify(filter), fieldFilter: '{}',
563
+ pageFilter: JSON.stringify({ filter: {}, filterIsNull: true, esbFilter: [] }),
564
+ refPluginPackageId: String(refPluginPackageId),
565
+ customConfig: encodeCustomConfig(customConfigObj),
566
+ };
567
+ const urlEncoded = new URLSearchParams(formData).toString();
568
+ const data = await client.postForm(`${baseUrl}/api/ebuilder/form/eblist/getData`, urlEncoded);
569
+ if (data?.code !== 200 || !data?.status) {
570
+ console.error(`查询失败: ${data?.msg || '未知错误'}`);
571
+ process.exit(1);
572
+ }
573
+ const list = data?.data?.list || [];
574
+ let total = list.length;
575
+ try {
576
+ const countForm = new URLSearchParams({
577
+ tableuid, pageId: String(hostPageId), compId: String(compId),
578
+ refPluginPackageId: String(refPluginPackageId),
579
+ }).toString();
580
+ const countRes = await client.postForm(`${baseUrl}/api/ebuilder/form/eblist/getCount?passid=${objId}`, countForm);
581
+ total = countRes?.data?.total || total;
582
+ }
583
+ catch { /* use list length as fallback */ }
584
+ if (isJson) {
585
+ console.log(JSON.stringify({ total, pageNo, pageSize, list }, null, 2));
586
+ return;
587
+ }
588
+ console.log(`共 ${total} 条,第 ${pageNo} 页 / 每页 ${pageSize} 条\n`);
589
+ if (list.length === 0) {
590
+ console.log('(无数据)');
591
+ return;
592
+ }
593
+ // Build display columns: prefer tableField order, then remaining keys
594
+ const firstRow = list[0];
595
+ const rawKeys = Object.keys(firstRow);
596
+ const used = new Set();
597
+ // First pass: keys that match tableField IDs or field_xxx patterns
598
+ const displayCols = [];
599
+ for (const k of rawKeys) {
600
+ if (used.has(k))
601
+ continue;
602
+ const label = resolveLabel(k, labelMap);
603
+ // Skip pure-ID system columns that have no labels
604
+ if (label === k && /^\d+$/.test(k) && k !== 'id')
605
+ continue;
606
+ displayCols.push({ key: k, label });
607
+ used.add(k);
608
+ }
609
+ if (displayCols.length === 0) {
610
+ // Fallback: just show first few keys
611
+ for (const k of rawKeys.slice(0, 6))
612
+ displayCols.push({ key: k, label: resolveLabel(k, labelMap) });
613
+ }
614
+ // Print header
615
+ const header = displayCols.map(c => c.label).join('\t');
616
+ console.log(header);
617
+ console.log('-'.repeat(Math.min(header.length + 20, 120)));
618
+ // Print rows
619
+ for (const row of list) {
620
+ console.log(displayCols.map(c => String(row[c.key] ?? '')).join('\t'));
621
+ }
622
+ });
623
+ }
624
+ //# sourceMappingURL=form-list.js.map