@agile-team/wl-skills-kit 2.3.0 → 2.3.2

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 (93) hide show
  1. package/CHANGELOG.md +42 -57
  2. package/README.md +23 -148
  3. package/bin/wl-skills.js +2 -100
  4. package/files/.github/guides/README.md +13 -13
  5. package/files/.github/guides/architecture.md +555 -576
  6. package/files/.github/guides/usage.md +176 -176
  7. package/files/.github/reports/README.md +65 -65
  8. package/files/.github/reports/SYS_DICT_INFO.md +50 -50
  9. package/files/.github/reports/SYS_MENU_INFO.md +247 -247
  10. package/files/.github/reports/SYS_PERMISSION_INFO.md +20 -20
  11. package/files/.github/reports//347/273/204/344/273/266/346/217/220/345/217/226/345/273/272/350/256/256.md +33 -33
  12. package/files/.github/reports//350/247/204/350/214/203/345/256/241/346/237/245/346/212/245/345/221/212.md +44 -44
  13. package/files/.github/skills/_compat/README.md +108 -108
  14. package/files/.github/skills/_compat/headers/agents.txt +8 -8
  15. package/files/.github/skills/_compat/headers/claude-code.txt +7 -7
  16. package/files/.github/skills/_compat/headers/cline.txt +7 -7
  17. package/files/.github/skills/_compat/headers/cursor-mdc.txt +16 -16
  18. package/files/.github/skills/_compat/headers/cursor-rules.txt +7 -7
  19. package/files/.github/skills/_compat/headers/github-copilot.txt +1 -1
  20. package/files/.github/skills/_compat/headers/kiro.txt +10 -10
  21. package/files/.github/skills/_compat/headers/trae.txt +11 -11
  22. package/files/.github/skills/_compat/headers/windsurf.txt +7 -7
  23. package/files/.github/skills/_registry.md +81 -81
  24. package/files/.github/skills/core/api-contract/SKILL.md +344 -344
  25. package/files/.github/skills/core/api-contract/USAGE.md +110 -110
  26. package/files/.github/skills/core/convention-audit/SKILL.md +189 -189
  27. package/files/.github/skills/core/convention-audit/USAGE.md +99 -99
  28. package/files/.github/skills/core/page-codegen/SKILL.md +973 -973
  29. package/files/.github/skills/core/page-codegen/USAGE.md +102 -102
  30. package/files/.github/skills/core/page-codegen/templates/_index.md +46 -46
  31. package/files/.github/skills/core/page-codegen/templates/domains/_CONTRIBUTING.md +107 -107
  32. package/files/.github/skills/core/page-codegen/templates/domains/produce/TPL-OPERATION-STATION.md +442 -442
  33. package/files/.github/skills/core/page-codegen/templates/domains/sale/README.md +26 -26
  34. package/files/.github/skills/core/page-codegen/templates/universal/TPL-CHANGE-HISTORY.md +276 -276
  35. package/files/.github/skills/core/page-codegen/templates/universal/TPL-DETAIL-TABS.md +1145 -1145
  36. package/files/.github/skills/core/page-codegen/templates/universal/TPL-DRIVEN.md +309 -124
  37. package/files/.github/skills/core/page-codegen/templates/universal/TPL-FORM-ROUTE.md +436 -436
  38. package/files/.github/skills/core/page-codegen/templates/universal/TPL-LIST.md +191 -191
  39. package/files/.github/skills/core/page-codegen/templates/universal/TPL-MASTER-DETAIL.md +148 -148
  40. package/files/.github/skills/core/page-codegen/templates/universal/TPL-RECORD-FORM.md +376 -376
  41. package/files/.github/skills/core/page-codegen/templates/universal/TPL-TREE-LIST.md +186 -186
  42. package/files/.github/skills/core/prototype-scan/SKILL.md +498 -498
  43. package/files/.github/skills/core/prototype-scan/USAGE.md +95 -95
  44. package/files/.github/skills/core/template-extract/SKILL.md +139 -139
  45. package/files/.github/skills/core/template-extract/USAGE.md +93 -93
  46. package/files/.github/skills/domain/README.md +51 -51
  47. package/files/.github/skills/sync/menu-sync/SKILL.md +263 -263
  48. package/files/.github/skills/sync/menu-sync/USAGE.md +104 -104
  49. package/files/.github/skills/sync/menu-sync/env/env.local.json +7 -7
  50. package/files/.github/skills/sync/menu-sync/env/guide.md +99 -99
  51. package/files/.github/skills/sync/permission-sync/SKILL.draft.md +91 -91
  52. package/files/.github/standards/01-toolchain.md +57 -57
  53. package/files/.github/standards/02-code-structure.md +111 -111
  54. package/files/.github/standards/03-comments.md +53 -53
  55. package/files/.github/standards/04-coding-basics.md +33 -33
  56. package/files/.github/standards/05-logging.md +38 -38
  57. package/files/.github/standards/06-security.md +44 -44
  58. package/files/.github/standards/07-config.md +52 -52
  59. package/files/.github/standards/08-git.md +60 -60
  60. package/files/.github/standards/09-typescript.md +71 -71
  61. package/files/.github/standards/10-pinia.md +57 -57
  62. package/files/.github/standards/11-form-validation.md +81 -81
  63. package/files/.github/standards/12-base-table.md +153 -153
  64. package/files/.github/standards/13-platform-components.md +123 -123
  65. package/files/.github/standards/index.md +89 -89
  66. package/files/demo/produce/aiflow/mmwr-customer-apply-add/api.md +1 -1
  67. package/files/demo/produce/aiflow/mmwr-customer-apply-change-history/data.ts +196 -196
  68. package/files/demo/produce/aiflow/mmwr-customer-apply-change-history/index.scss +150 -150
  69. package/files/demo/produce/aiflow/mmwr-customer-apply-change-history/index.vue +79 -79
  70. package/files/docs/jh-date-range.md +257 -257
  71. package/files/docs/jh-date.md +222 -222
  72. package/files/docs/jh-dept-picker.md +190 -190
  73. package/files/docs/jh-drag-row.md +590 -590
  74. package/files/docs/jh-file-upload.md +216 -216
  75. package/files/docs/jh-picker.md +218 -218
  76. package/files/docs/jh-select.md +148 -148
  77. package/files/docs/jh-text.md +248 -248
  78. package/files/docs/jh-user-picker.md +197 -197
  79. package/files/docs/request.md +24 -9
  80. package/files/src/components/global/C_RightToolbar/data.ts +228 -0
  81. package/files/src/components/global/C_RightToolbar/index.scss +44 -0
  82. package/files/src/components/global/C_RightToolbar/index.vue +34 -336
  83. package/files/src/components/global/C_Splitter/index.scss +61 -0
  84. package/files/src/components/global/C_Splitter/index.vue +2 -64
  85. package/files/src/components/global/C_SvgIcon/index.scss +15 -0
  86. package/files/src/components/global/C_SvgIcon/index.vue +20 -50
  87. package/files/src/components/global/C_TagStatus/index.scss +20 -0
  88. package/files/src/components/global/C_TagStatus/index.vue +1 -22
  89. package/files/src/components/global/C_Tree/data.ts +61 -0
  90. package/files/src/components/global/C_Tree/index.vue +12 -53
  91. package/files/src/components/local/c_listModal/index.scss +4 -0
  92. package/files/src/components/local/c_listModal/index.vue +1 -1
  93. package/package.json +5 -9
@@ -1,81 +1,81 @@
1
- # 11 — 表单与校验规范
2
-
3
- > **强制度**:🔴 必遵。
4
-
5
- ---
6
-
7
- ## c_formModal / c_formSections 场景
8
-
9
- 平台已封装组件,**内置完整生命周期**:
10
-
11
- ```
12
- open → 数据回填 → validate → submit → close / resetFields
13
- ```
14
-
15
- ✅ AI 直接按组件文档使用即可,**不需要重复写 validate / resetFields 逻辑**。
16
-
17
- 参考:`src/components/local/c_formModal/README.md`
18
-
19
- ---
20
-
21
- ## FORM_ROUTE 独立路由表单页(c_formModal 不适用时)
22
-
23
- 无 c_formModal 托管的复杂表单(多 Tab、多子表、向导式),**必须遵守**:
24
-
25
- ### 1. 提交前调用 validate
26
-
27
- ```typescript
28
- async function handleSubmit() {
29
- const valid = await formRef.value?.validate();
30
- if (!valid) return;
31
- await postAction(API_CONFIG.save, formData.value);
32
- }
33
- ```
34
-
35
- ### 2. 取消/离开调用 resetFields
36
-
37
- ```typescript
38
- function handleCancel() {
39
- formRef.value?.resetFields();
40
- router.back();
41
- }
42
-
43
- onBeforeRouteLeave(() => {
44
- formRef.value?.resetFields();
45
- });
46
- ```
47
-
48
- ### 3. rules 在 data.ts 中独立导出
49
-
50
- ```typescript
51
- // data.ts
52
- export const formRules = {
53
- fieldName: [
54
- { required: true, message: "请输入字段名", trigger: "blur" },
55
- { max: 50, message: "不超过 50 字符", trigger: "blur" },
56
- ],
57
- status: [{ required: true, message: "请选择状态", trigger: "change" }],
58
- };
59
- ```
60
-
61
- ❌ **禁止**:把 rules 写在 `<template>` 字面量里。
62
-
63
- ---
64
-
65
- ## 校验时机
66
-
67
- | 时机 | 触发 |
68
- | ----------------- | -------------------------------- |
69
- | `blur` 失焦 | 字符串类、必填字段 |
70
- | `change` 变更 | 选择类(select / date / picker) |
71
- | 手动 `validate()` | 提交时全量校验 |
72
- | 字段间联动 | `watch` + 手动 `validateField()` |
73
-
74
- ## AI 检查清单
75
-
76
- 生成 FORM_ROUTE 模板代码时确认:
77
-
78
- - [ ] 提交按钮 click 处理函数中调用了 `formRef.value?.validate()`
79
- - [ ] 取消按钮 / 路由离开钩子中调用了 `resetFields()`
80
- - [ ] rules 定义在 `data.ts` 而非 `<template>`
81
- - [ ] 必填字段都加了 `required: true` 校验规则
1
+ # 11 — 表单与校验规范
2
+
3
+ > **强制度**:🔴 必遵。
4
+
5
+ ---
6
+
7
+ ## c_formModal / c_formSections 场景
8
+
9
+ 平台已封装组件,**内置完整生命周期**:
10
+
11
+ ```
12
+ open → 数据回填 → validate → submit → close / resetFields
13
+ ```
14
+
15
+ ✅ AI 直接按组件文档使用即可,**不需要重复写 validate / resetFields 逻辑**。
16
+
17
+ 参考:`src/components/local/c_formModal/README.md`
18
+
19
+ ---
20
+
21
+ ## FORM_ROUTE 独立路由表单页(c_formModal 不适用时)
22
+
23
+ 无 c_formModal 托管的复杂表单(多 Tab、多子表、向导式),**必须遵守**:
24
+
25
+ ### 1. 提交前调用 validate
26
+
27
+ ```typescript
28
+ async function handleSubmit() {
29
+ const valid = await formRef.value?.validate();
30
+ if (!valid) return;
31
+ await postAction(API_CONFIG.save, formData.value);
32
+ }
33
+ ```
34
+
35
+ ### 2. 取消/离开调用 resetFields
36
+
37
+ ```typescript
38
+ function handleCancel() {
39
+ formRef.value?.resetFields();
40
+ router.back();
41
+ }
42
+
43
+ onBeforeRouteLeave(() => {
44
+ formRef.value?.resetFields();
45
+ });
46
+ ```
47
+
48
+ ### 3. rules 在 data.ts 中独立导出
49
+
50
+ ```typescript
51
+ // data.ts
52
+ export const formRules = {
53
+ fieldName: [
54
+ { required: true, message: "请输入字段名", trigger: "blur" },
55
+ { max: 50, message: "不超过 50 字符", trigger: "blur" },
56
+ ],
57
+ status: [{ required: true, message: "请选择状态", trigger: "change" }],
58
+ };
59
+ ```
60
+
61
+ ❌ **禁止**:把 rules 写在 `<template>` 字面量里。
62
+
63
+ ---
64
+
65
+ ## 校验时机
66
+
67
+ | 时机 | 触发 |
68
+ | ----------------- | -------------------------------- |
69
+ | `blur` 失焦 | 字符串类、必填字段 |
70
+ | `change` 变更 | 选择类(select / date / picker) |
71
+ | 手动 `validate()` | 提交时全量校验 |
72
+ | 字段间联动 | `watch` + 手动 `validateField()` |
73
+
74
+ ## AI 检查清单
75
+
76
+ 生成 FORM_ROUTE 模板代码时确认:
77
+
78
+ - [ ] 提交按钮 click 处理函数中调用了 `formRef.value?.validate()`
79
+ - [ ] 取消按钮 / 路由离开钩子中调用了 `resetFields()`
80
+ - [ ] rules 定义在 `data.ts` 而非 `<template>`
81
+ - [ ] 必填字段都加了 `required: true` 校验规则
@@ -1,153 +1,153 @@
1
- # 12 — BaseTable 渲染与 AGGrid cid 唯一性规范
2
-
3
- > **强制度**:🔴 必遵。
4
-
5
- ---
6
-
7
- ## 渲染模式(强制)
8
-
9
- 所有 `BaseTable` 必须默认使用 **AGGrid** 渲染:
10
-
11
- ```vue
12
- <BaseTable
13
- ref="tableRef"
14
- render-type="agGrid"
15
- cid="mca-lhfge5hc"
16
- :data="list"
17
- :columns="columns"
18
- showToolbar
19
- />
20
- ```
21
-
22
- > 全局配置:`envConfig().componentConfig.table = { renderType: 'agGrid' }`
23
- > 设置后所有未显式指定 `render-type` 的 BaseTable 默认 AGGrid。
24
-
25
- ---
26
-
27
- ## cid 命名规则(核心)
28
-
29
- AGGrid 通过 `cid` 持久化列配置(列宽、顺序、显示),**cid 必须跨全部系统全局唯一**。
30
-
31
- > ⚠️ 本项目包含 21 个 Module Federation 子应用,共享同一浏览器 origin(localStorage 共用)。
32
- > 采用简短十进制后缀存在两个致命问题:①后 6 位每 ~11.5 天循环一次;②不同页面的首字母缩写高概率碰撞(如 `mca`、`dto`)。
33
- > 因此后缀必须使用 **完整 base-36 时间戳**,保证毫秒级全局唯一且永不重复。
34
-
35
- ### 表格级 cid
36
-
37
- ```
38
- 格式:{页面目录首字母缩写}-{Date.now().toString(36)}
39
- ```
40
-
41
- **生成规则(AI 执行)**:
42
-
43
- 1. 取页面 kebab-case 目录名,每个单词取首字母拼接为缩写
44
- 2. 执行 `Date.now().toString(36)`,将结果完整追加(当前约 9 位 base-36,只增不减)
45
- 3. 用 `-` 连接
46
-
47
- **示例**:
48
-
49
- | 页面目录 | 缩写 | cid(base-36后缀) |
50
- | ------------------------ | ---- | ----------------------- |
51
- | `mmwr-customer-archive` | mca | `mca-lhfge5hc` |
52
- | `domestic-trade-order` | dto | `dto-lhfge5hi` |
53
- | 同页面第二个表格(子表) | mca | `mca-lhfge5hc-sub1` |
54
- | 同页面第三个表格 | mca | `mca-lhfge5hc-sub2` |
55
-
56
- > **为什么不截断**:截断后缀(如后 6 位)会引入循环碰撞。完整 base-36 值为单调递增,毫秒级唯一,9 位 base-36 ≈ 2199 亿组合,同一毫秒只生成一次。
57
-
58
- > ⚠️ **AI 批量生成多个 cid 时的碰撞风险**:AI 在同一上下文中连续生成多个 `Date.now().toString(36)` 时,
59
- > 返回值可能相同(AI 不会真实调用系统时钟,而是推断一个"合理值")。
60
- > **正确做法**:AI 批量生成时,在基准时间戳上依次 +1ms 递增,确保每个 cid 的数字部分唯一:
61
- >
62
- > ```typescript
63
- > // 批量生成模板(AI 执行 code-fix / page-codegen 时使用)
64
- > const base = Date.now()
65
- > const cids = {
66
- > table: `mca-${base.toString(36)}`, // mca-lhfge5hc
67
- > sub1: `mca-${(base+1).toString(36)}-sub1`, // mca-lhfge5hd-sub1
68
- > sub2: `mca-${(base+2).toString(36)}-sub2`, // mca-lhfge5he-sub2
69
- > }
70
- > ```
71
- >
72
- > 人工在编辑器里每次手写一个 cid 时,直接用 `Date.now().toString(36)` 即可(不同时刻天然不同)。
73
-
74
- ### 列级 cid
75
-
76
- ```
77
- 格式:{完整表格 cid}-{fieldName}
78
- ```
79
-
80
- > ✅ 用完整表格 cid(而非仅缩写部分)作前缀,是防碌撞的关键。
81
- > 同一页面两张表都有 `steelCode` 列时:
82
- > - 主表(cid=`mca-lhfge5hc`):`mca-lhfge5hc-steelCode` ✅
83
- > - 子表(cid=`mca-lhfge5hc-sub1`):`mca-lhfge5hc-sub1-steelCode` ✅
84
- > - 如果用缩写作前缀:两张表同名列都会得到 `mca-steelCode` → 碰撞 ❌
85
-
86
- ```typescript
87
- // 主表 cid="mca-lhfge5hc"
88
- columnsDef(): TableColumnDesc<any>[] {
89
- return [
90
- { type: 'selection' },
91
- { type: 'index' },
92
- { label: '取样', name: 'sampling', cid: 'mca-lhfge5hc-sampling', width: 70 },
93
- { label: '线上公告', name: 'onlineAnnouncement', cid: 'mca-lhfge5hc-onlineAnnouncement', width: 70 },
94
- ]
95
- }
96
-
97
- // 子表 cid="mca-lhfge5hc-sub1"
98
- subColumnsDef(): TableColumnDesc<any>[] {
99
- return [
100
- { type: 'index' },
101
- { label: '钢种编码', name: 'steelCode', cid: 'mca-lhfge5hc-sub1-steelCode', width: 100 },
102
- { label: '规格', name: 'spec', cid: 'mca-lhfge5hc-sub1-spec', width: 80 },
103
- ]
104
- }
105
-
106
- ---
107
-
108
- ## 禁止事项
109
-
110
- - ❌ 随机短字符串 `cid="ipiCfsb"`(AI 重新生成时极易碰撞)
111
- - ❌ 纴字段名 `cid: "sampling"`(不同页面/不同表格同名字段必碰撞)
112
- - ❌ 列级 cid 只用缩写 `cid: 'mca-steelCode'`(同页面两张表都有 steelCode 时碰撞)
113
- - ❌ 省略 cid(列配置持久化完全失效)
114
- - ❌ 跨页面复用同一 cid
115
-
116
- ---
117
-
118
- ## Pre-flight 声明示例
119
-
120
- ```
121
- ✅ cid 已生成:mca-lhfge5hc(mmwr-customer-archive)
122
- ✅ 列级 cid 前缀:mca-lhfge5hc-(完整表格 cid 加连接符)
123
- ```
124
-
125
- ---
126
-
127
- ## 完整代码示例
128
-
129
- ```vue
130
- <!-- index.vue -->
131
- <template>
132
- <BaseTable
133
- ref="tableRef"
134
- render-type="agGrid"
135
- cid="mca-lhfge5hc"
136
- :data="list"
137
- :columns="columns"
138
- showToolbar
139
- />
140
- </template>
141
- ```
142
-
143
- ```typescript
144
- // data.ts
145
- columnsDef(): TableColumnDesc<any>[] {
146
- return [
147
- { type: 'selection' },
148
- { type: 'index' },
149
- { label: '客户名称', name: 'customerName', cid: 'mca-lhfge5hc-customerName', minWidth: 120 },
150
- { label: '状态', name: 'status', cid: 'mca-lhfge5hc-status', minWidth: 80 },
151
- ]
152
- }
153
- ```
1
+ # 12 — BaseTable 渲染与 AGGrid cid 唯一性规范
2
+
3
+ > **强制度**:🔴 必遵。
4
+
5
+ ---
6
+
7
+ ## 渲染模式(强制)
8
+
9
+ 所有 `BaseTable` 必须默认使用 **AGGrid** 渲染:
10
+
11
+ ```vue
12
+ <BaseTable
13
+ ref="tableRef"
14
+ render-type="agGrid"
15
+ cid="mca-lhfge5hc"
16
+ :data="list"
17
+ :columns="columns"
18
+ showToolbar
19
+ />
20
+ ```
21
+
22
+ > 全局配置:`envConfig().componentConfig.table = { renderType: 'agGrid' }`
23
+ > 设置后所有未显式指定 `render-type` 的 BaseTable 默认 AGGrid。
24
+
25
+ ---
26
+
27
+ ## cid 命名规则(核心)
28
+
29
+ AGGrid 通过 `cid` 持久化列配置(列宽、顺序、显示),**cid 必须跨全部系统全局唯一**。
30
+
31
+ > ⚠️ 本项目包含 21 个 Module Federation 子应用,共享同一浏览器 origin(localStorage 共用)。
32
+ > 采用简短十进制后缀存在两个致命问题:①后 6 位每 ~11.5 天循环一次;②不同页面的首字母缩写高概率碰撞(如 `mca`、`dto`)。
33
+ > 因此后缀必须使用 **完整 base-36 时间戳**,保证毫秒级全局唯一且永不重复。
34
+
35
+ ### 表格级 cid
36
+
37
+ ```
38
+ 格式:{页面目录首字母缩写}-{Date.now().toString(36)}
39
+ ```
40
+
41
+ **生成规则(AI 执行)**:
42
+
43
+ 1. 取页面 kebab-case 目录名,每个单词取首字母拼接为缩写
44
+ 2. 执行 `Date.now().toString(36)`,将结果完整追加(当前约 9 位 base-36,只增不减)
45
+ 3. 用 `-` 连接
46
+
47
+ **示例**:
48
+
49
+ | 页面目录 | 缩写 | cid(base-36后缀) |
50
+ | ------------------------ | ---- | ----------------------- |
51
+ | `mmwr-customer-archive` | mca | `mca-lhfge5hc` |
52
+ | `domestic-trade-order` | dto | `dto-lhfge5hi` |
53
+ | 同页面第二个表格(子表) | mca | `mca-lhfge5hc-sub1` |
54
+ | 同页面第三个表格 | mca | `mca-lhfge5hc-sub2` |
55
+
56
+ > **为什么不截断**:截断后缀(如后 6 位)会引入循环碰撞。完整 base-36 值为单调递增,毫秒级唯一,9 位 base-36 ≈ 2199 亿组合,同一毫秒只生成一次。
57
+
58
+ > ⚠️ **AI 批量生成多个 cid 时的碰撞风险**:AI 在同一上下文中连续生成多个 `Date.now().toString(36)` 时,
59
+ > 返回值可能相同(AI 不会真实调用系统时钟,而是推断一个"合理值")。
60
+ > **正确做法**:AI 批量生成时,在基准时间戳上依次 +1ms 递增,确保每个 cid 的数字部分唯一:
61
+ >
62
+ > ```typescript
63
+ > // 批量生成模板(AI 执行 code-fix / page-codegen 时使用)
64
+ > const base = Date.now()
65
+ > const cids = {
66
+ > table: `mca-${base.toString(36)}`, // mca-lhfge5hc
67
+ > sub1: `mca-${(base+1).toString(36)}-sub1`, // mca-lhfge5hd-sub1
68
+ > sub2: `mca-${(base+2).toString(36)}-sub2`, // mca-lhfge5he-sub2
69
+ > }
70
+ > ```
71
+ >
72
+ > 人工在编辑器里每次手写一个 cid 时,直接用 `Date.now().toString(36)` 即可(不同时刻天然不同)。
73
+
74
+ ### 列级 cid
75
+
76
+ ```
77
+ 格式:{完整表格 cid}-{fieldName}
78
+ ```
79
+
80
+ > ✅ 用完整表格 cid(而非仅缩写部分)作前缀,是防碌撞的关键。
81
+ > 同一页面两张表都有 `steelCode` 列时:
82
+ > - 主表(cid=`mca-lhfge5hc`):`mca-lhfge5hc-steelCode` ✅
83
+ > - 子表(cid=`mca-lhfge5hc-sub1`):`mca-lhfge5hc-sub1-steelCode` ✅
84
+ > - 如果用缩写作前缀:两张表同名列都会得到 `mca-steelCode` → 碰撞 ❌
85
+
86
+ ```typescript
87
+ // 主表 cid="mca-lhfge5hc"
88
+ columnsDef(): TableColumnDesc<any>[] {
89
+ return [
90
+ { type: 'selection' },
91
+ { type: 'index' },
92
+ { label: '取样', name: 'sampling', cid: 'mca-lhfge5hc-sampling', width: 70 },
93
+ { label: '线上公告', name: 'onlineAnnouncement', cid: 'mca-lhfge5hc-onlineAnnouncement', width: 70 },
94
+ ]
95
+ }
96
+
97
+ // 子表 cid="mca-lhfge5hc-sub1"
98
+ subColumnsDef(): TableColumnDesc<any>[] {
99
+ return [
100
+ { type: 'index' },
101
+ { label: '钢种编码', name: 'steelCode', cid: 'mca-lhfge5hc-sub1-steelCode', width: 100 },
102
+ { label: '规格', name: 'spec', cid: 'mca-lhfge5hc-sub1-spec', width: 80 },
103
+ ]
104
+ }
105
+
106
+ ---
107
+
108
+ ## 禁止事项
109
+
110
+ - ❌ 随机短字符串 `cid="ipiCfsb"`(AI 重新生成时极易碰撞)
111
+ - ❌ 纴字段名 `cid: "sampling"`(不同页面/不同表格同名字段必碰撞)
112
+ - ❌ 列级 cid 只用缩写 `cid: 'mca-steelCode'`(同页面两张表都有 steelCode 时碰撞)
113
+ - ❌ 省略 cid(列配置持久化完全失效)
114
+ - ❌ 跨页面复用同一 cid
115
+
116
+ ---
117
+
118
+ ## Pre-flight 声明示例
119
+
120
+ ```
121
+ ✅ cid 已生成:mca-lhfge5hc(mmwr-customer-archive)
122
+ ✅ 列级 cid 前缀:mca-lhfge5hc-(完整表格 cid 加连接符)
123
+ ```
124
+
125
+ ---
126
+
127
+ ## 完整代码示例
128
+
129
+ ```vue
130
+ <!-- index.vue -->
131
+ <template>
132
+ <BaseTable
133
+ ref="tableRef"
134
+ render-type="agGrid"
135
+ cid="mca-lhfge5hc"
136
+ :data="list"
137
+ :columns="columns"
138
+ showToolbar
139
+ />
140
+ </template>
141
+ ```
142
+
143
+ ```typescript
144
+ // data.ts
145
+ columnsDef(): TableColumnDesc<any>[] {
146
+ return [
147
+ { type: 'selection' },
148
+ { type: 'index' },
149
+ { label: '客户名称', name: 'customerName', cid: 'mca-lhfge5hc-customerName', minWidth: 120 },
150
+ { label: '状态', name: 'status', cid: 'mca-lhfge5hc-status', minWidth: 80 },
151
+ ]
152
+ }
153
+ ```