@microi.net/cli 5.5.9 → 5.6.1

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 (161) hide show
  1. package/.codebuddy-plugin/marketplace.json +2 -2
  2. package/.codebuddy-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +1 -1
  4. package/.workbuddy-plugin/marketplace.json +2 -2
  5. package/.workbuddy-plugin/plugin.json +1 -1
  6. package/assets/build-meta.json +5 -5
  7. package/cordis.patch.yml +1 -1
  8. package/package.json +1 -1
  9. package/scripts/mcp-server.js +99 -99
  10. package/scripts/microi-cli.js +39 -36
  11. package/scripts/microi-skills.meta.json +341 -338
  12. package/skills/.microi-skills-version.json +2 -2
  13. package/skills/.progressive-disclosure-manifest.json +3566 -3566
  14. package/skills/README.md +4 -4
  15. package/skills/ai-engine/SKILL.md +45 -45
  16. package/skills/ai-platform-governance/SKILL.md +177 -177
  17. package/skills/ai-platform-governance/references/progressive-01-/345/212/237/350/203/275/345/274/200/345/205/263.md +190 -190
  18. package/skills/app-store/SKILL.md +21 -4
  19. package/skills/business-blueprint/SKILL.md +85 -85
  20. package/skills/datasource-engine/SKILL.md +91 -91
  21. package/skills/dos-orm/SKILL.md +15 -0
  22. package/skills/dos-orm/references/api-reference.md +229 -229
  23. package/skills/email-engine/SKILL.md +80 -80
  24. package/skills/email-engine/references/v8-email.md +34 -34
  25. package/skills/job-engine/SKILL.md +154 -154
  26. package/skills/message-notification/SKILL.md +27 -1
  27. package/skills/message-notification/agents/openai.yaml +5 -5
  28. package/skills/message-notification/references/contracts.md +102 -102
  29. package/skills/microi-ai-app-auth.js +652 -652
  30. package/skills/microi-ai-application/SKILL.md +102 -102
  31. package/skills/microi-ai-application/agents/openai.yaml +4 -4
  32. package/skills/microi-ai-application/references/frontend-baseline.md +164 -164
  33. package/skills/microi-client-frontend/SKILL.md +47 -41
  34. package/skills/microi-client-frontend/references/progressive-01-3-/345/212/250/346/200/201/346/214/211/351/222/256/347/263/273/347/273/237.md +4 -4
  35. package/skills/microi-client-frontend/references/progressive-02-8-/350/277/220/350/241/214/346/227/266/351/253/230/351/242/221/345/235/221/345/244/215/347/233/230.md +30 -30
  36. package/skills/microi-client-frontend/references/progressive-03-vue3-/345/211/215/347/253/257/345/276/256/346/234/215/345/212/241/345/256/277/344/270/273/350/247/204/345/210/231.md +58 -58
  37. package/skills/microi-codex/SKILL.md +2 -0
  38. package/skills/microi-codex-installer/SKILL.md +216 -216
  39. package/skills/microi-codex-installer/agents/openai.yaml +7 -7
  40. package/skills/microi-datasource-mapping/SKILL.md +67 -67
  41. package/skills/microi-db-schema/SKILL.md +6 -6
  42. package/skills/microi-db-schema/references/core-tables.md +18 -18
  43. package/skills/microi-db-schema/references/form-component-options.md +256 -256
  44. package/skills/microi-db-schema/references/schema-overview.md +11 -11
  45. package/skills/microi-db-schema/references/schema.md +46 -46
  46. package/skills/microi-db-schema/references/table-catalog.md +57 -57
  47. package/skills/microi-deployment/SKILL.md +18 -1
  48. package/skills/microi-deployment/references/deployment-matrix.md +101 -101
  49. package/skills/microi-docs-coverage/SKILL.md +10 -0
  50. package/skills/microi-docs-coverage/references/capability-map.md +3 -2
  51. package/skills/microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs +894 -894
  52. package/skills/microi-form-engine/SKILL.md +27 -3
  53. package/skills/microi-form-engine/references/component-catalog.md +218 -218
  54. package/skills/microi-form-engine/references/data-source-events.md +124 -124
  55. package/skills/microi-form-layout/SKILL.md +13 -13
  56. package/skills/microi-form-layout/references/progressive-01-3-/344/270/211/347/247/215/345/210/206/347/273/204/347/232/204/345/255/230/345/202/250/344/270/216/351/205/215/347/275/256.md +235 -235
  57. package/skills/microi-frontend-sdk/SKILL.md +4 -4
  58. package/skills/microi-frontend-sdk/references/progressive-01-token-/345/275/223/345/211/215/347/231/273/345/275/225/347/224/250/346/210/267/344/270/216/345/275/223/345/211/215/347/273/210/347/253/257/347/231/273/345/275/225/345/215/217/350/256/256.md +175 -175
  59. package/skills/microi-left-right-layout/SKILL.md +141 -141
  60. package/skills/microi-microservice/SKILL.md +2 -1
  61. package/skills/microi-microservice/references/runtime-delivery.md +278 -278
  62. package/skills/microi-mobile-app-quality/references/progressive-01-4-/351/207/215/350/246/201/346/214/211/351/222/256/345/277/205/351/241/273/345/270/246/345/233/276/346/240/207.md +213 -213
  63. package/skills/microi-solution-quotation/SKILL.md +78 -78
  64. package/skills/microi-solution-quotation/agents/openai.yaml +4 -4
  65. package/skills/microi-solution-quotation/scripts/build_solution_quote.py +296 -296
  66. package/skills/microi-sso/SKILL.md +6 -0
  67. package/skills/microi-sso/references/acceptance.md +49 -49
  68. package/skills/microi-sso/references/configuration-and-security.md +53 -53
  69. package/skills/microi-sso/references/inbound.md +53 -53
  70. package/skills/microi-sso/references/outbound.md +39 -39
  71. package/skills/microi-system-delivery/SKILL.md +5 -4
  72. package/skills/microi-system-delivery/references/progressive-02-/350/207/252/345/212/250/345/214/226/346/265/213/350/257/225/345/277/205/351/241/273/350/246/206/347/233/226/347/232/204/345/235/221.md +7 -2
  73. package/skills/microi-ui/SKILL.md +7 -2
  74. package/skills/microi-uniapp-frontend/SKILL.md +134 -134
  75. package/skills/microi-uniapp-frontend/references/progressive-01-/347/247/273/345/212/250/347/253/257/345/210/206/347/261/273-/345/217/214/346/240/217/345/210/227/350/241/250/347/213/254/347/253/213/346/273/232/345/212/250.md +136 -136
  76. package/skills/microi-uniapp-frontend/references/progressive-02-/345/205/263/351/224/256/344/270/232/345/212/241/350/265/204/344/272/247/344/270/215/345/276/227/351/273/230/350/256/244/351/200/211/344/270/255.md +124 -124
  77. package/skills/module-engine/SKILL.md +30 -14
  78. package/skills/ocr-engine/SKILL.md +2 -2
  79. package/skills/ocr-engine/agents/openai.yaml +1 -1
  80. package/skills/page-engine/SKILL.md +28 -28
  81. package/skills/page-engine/references/progressive-01-/346/211/200/346/234/211/347/273/204/344/273/266/347/261/273/345/236/213.md +126 -126
  82. package/skills/page-engine/references/progressive-02-/347/211/210/346/234/254/345/216/206/345/217/262-/345/271/266/345/217/221/344/277/235/345/255/230/344/270/216/345/233/236/346/273/232.md +42 -42
  83. package/skills/performance-testing/SKILL.md +120 -120
  84. package/skills/playwright-e2e/SKILL.md +84 -84
  85. package/skills/playwright-e2e/references/progressive-01-/345/205/250/350/207/252/345/212/250/347/231/273/345/275/225-/345/205/215/351/252/214/350/257/201/347/240/201-/344/275/206/344/270/215/345/205/215/345/257/206/347/240/201-/345/277/205/350/257/273.md +68 -68
  86. package/skills/playwright-e2e/references/progressive-02-/346/226/207/345/255/227/345/257/271/346/257/224/345/272/246/344/270/216/345/217/257/350/257/273/346/200/247/350/207/252/345/212/250/345/214/226/346/243/200/346/237/245-/345/277/205/345/201/232.md +64 -64
  87. package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +20 -20
  88. package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +69 -69
  89. package/skills/print-engine/SKILL.md +11 -3
  90. package/skills/production-readonly-audit/SKILL.md +41 -41
  91. package/skills/report-engine/SKILL.md +71 -71
  92. package/skills/scripts/optimize-progressive-disclosure.mjs +204 -204
  93. package/skills/scripts/refresh-progressive-disclosure.mjs +64 -64
  94. package/skills/scripts/sync-embedded-skills.mjs +46 -0
  95. package/skills/scripts/validate-progressive-disclosure.mjs +8 -3
  96. package/skills/search-engine/SKILL.md +75 -75
  97. package/skills/spider-engine/SKILL.md +190 -190
  98. package/skills/system-observability/SKILL.md +169 -157
  99. package/skills/system-observability/references/memory-incident-triage.md +73 -73
  100. package/skills/translate-engine/SKILL.md +1 -1
  101. package/skills/ui-design/SKILL.md +3 -1
  102. package/skills/uniapp-mall-assets/SKILL.md +170 -170
  103. package/skills/unity-integration/SKILL.md +155 -155
  104. package/skills/unity-integration/agents/openai.yaml +4 -4
  105. package/skills/unity-integration/references/ai-app-delivery.md +103 -103
  106. package/skills/unity-integration/references/sdk-api.md +82 -82
  107. package/skills/unity-integration/references/toolbox-migration.md +66 -66
  108. package/skills/unity-integration/references/webgl-hosting.md +57 -57
  109. package/skills/v8-api-config/SKILL.md +4 -0
  110. package/skills/v8-cache-pattern/SKILL.md +306 -306
  111. package/skills/v8-crud-api/SKILL.md +29 -29
  112. package/skills/v8-crud-api/references/progressive-01-/346/237/245/350/257/242/345/210/227/350/241/250-/345/210/206/351/241/265.md +56 -56
  113. package/skills/v8-debugging/SKILL.md +143 -143
  114. package/skills/v8-explorer-tree/SKILL.md +64 -64
  115. package/skills/v8-export-import/references/progressive-01-excellayout-/351/253/230/347/272/247/350/207/252/347/224/261/345/270/203/345/261/200.md +201 -201
  116. package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md +118 -118
  117. package/skills/v8-export-import/references/progressive-03-/345/256/211/345/205/250-/346/200/247/350/203/275/346/263/250/346/204/217.md +32 -32
  118. package/skills/v8-file-upload/SKILL.md +5 -2
  119. package/skills/v8-file-upload/references/progressive-01-/345/205/254/346/234/211/346/241/266-vs-/347/247/201/346/234/211/346/241/266.md +2 -2
  120. package/skills/v8-file-upload/references/progressive-02-office-/346/226/207/344/273/266/345/234/250/347/272/277/347/274/226/350/276/221/347/211/210/346/234/254/345/217/267/350/247/204/345/210/231.md +138 -138
  121. package/skills/v8-formengine-http/SKILL.md +126 -108
  122. package/skills/v8-frontend-events/SKILL.md +22 -22
  123. package/skills/v8-frontend-events/references/bluetooth-print-api.md +135 -135
  124. package/skills/v8-frontend-events/references/bluetooth-print.md +247 -247
  125. package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +50 -50
  126. package/skills/v8-http-integration/SKILL.md +106 -106
  127. package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md +31 -31
  128. package/skills/v8-http-integration/references/progressive-02-/351/224/231/350/257/257/345/244/204/347/220/206/346/250/241/345/274/217.md +5 -5
  129. package/skills/v8-image-processing/SKILL.md +190 -190
  130. package/skills/v8-image-processing/agents/openai.yaml +4 -4
  131. package/skills/v8-image-processing/references/api-reference.md +623 -623
  132. package/skills/v8-menu-buttons/SKILL.md +103 -103
  133. package/skills/v8-menu-buttons/references/progressive-01-2-/346/214/211/351/222/256/345/257/271/350/261/241-schema.md +145 -145
  134. package/skills/v8-menu-buttons/references/progressive-02-8-/346/250/241/345/274/217-f-/345/220/216/345/217/260/344/273/273/345/212/241/346/214/211/351/222/256-/351/225/277/344/273/273/345/212/241.md +228 -228
  135. package/skills/v8-menu-buttons/references/progressive-03-10-/345/217/215/346/250/241/345/274/217-/351/201/277/345/205/215.md +43 -43
  136. package/skills/v8-mongodb/SKILL.md +65 -65
  137. package/skills/v8-mq-mqtt/SKILL.md +175 -175
  138. package/skills/v8-mq-mqtt/references/mqtt-production.md +342 -342
  139. package/skills/v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-/347/211/251/350/201/224/347/275/221.md +137 -137
  140. package/skills/v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs +203 -203
  141. package/skills/v8-saas-multi-tenant/SKILL.md +223 -223
  142. package/skills/v8-security/SKILL.md +1 -1
  143. package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +122 -122
  144. package/skills/v8-sql-query/SKILL.md +7 -5
  145. package/skills/v8-table-event/SKILL.md +9 -2
  146. package/skills/v8-table-event/references/progressive-01-informv8-js-/350/241/250/345/215/225/346/211/223/345/274/200/344/272/213/344/273/266.md +1 -1
  147. package/skills/v8-table-event/references/progressive-02-/345/211/215/347/253/257/344/272/213/344/273/266/345/220/215-v8-eventname-/345/217/257/350/203/275/347/232/204/345/200/274.md +15 -15
  148. package/skills/v8-tcp-integration/SKILL.md +1 -1
  149. package/skills/v8-tcp-integration/agents/openai.yaml +4 -4
  150. package/skills/v8-template-engine/SKILL.md +59 -59
  151. package/skills/v8-utilities/SKILL.md +92 -92
  152. package/skills/v8-utilities/references/client-api-index.md +143 -143
  153. package/skills/v8-utilities/references/platform-http-routes.md +83 -83
  154. package/skills/v8-utilities/references/server-api-index.md +74 -74
  155. package/skills/v8-workflow/SKILL.md +13 -4
  156. package/skills/vision-engine/SKILL.md +19 -19
  157. package/skills/vision-engine/references/architecture-and-acceptance.md +34 -34
  158. package/skills/workspace-conventions/SKILL.md +35 -12
  159. package/skills/workspace-conventions/references/progressive-01-/347/211/210/346/234/254/346/233/264/346/226/260/346/227/245/345/277/227/344/277/235/346/212/244/350/247/204/345/210/231-/345/274/272/345/210/266.md +2 -2
  160. package/skills/workspace-conventions/references/progressive-02-microi-net-api-/346/234/254/345/234/260/345/220/257/345/212/250/347/272/246/345/256/232.md +179 -179
  161. package/skills/workspace-conventions/references/progressive-03-cli-/344/270/216-ide-/346/217/222/344/273/266/351/224/231/347/211/210/345/205/261/345/255/230/347/272/246/345/256/232.md +21 -21
@@ -1,235 +1,235 @@
1
- # microi-form-layout 详细参考 1
2
-
3
- > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
-
5
- <!-- microi-progressive:chunk id=microi-form-layout-006 sha256=a78b000a9fee46d8394b0b6cb186702e520ab513f7eff098f2226f1158e46970 -->
6
- ## 3. 三种分组的存储与配置
7
-
8
- ### 3.1 diy_table.Tabs(表级 Tab)
9
-
10
- 存储:`diy_table.Tabs`(JSON 字符串)+ 每个字段的 `diy_field.Tab`(归属 Tab 名)。
11
-
12
- ```jsonc
13
- // diy_table.Tabs JSON 格式
14
- [
15
- { "Id": "basic", "Name": "基础信息", "Sort": 10 },
16
- { "Id": "business","Name": "业务明细", "Sort": 20 },
17
- { "Id": "attach", "Name": "附件备注", "Sort": 30 }
18
- ]
19
- ```
20
-
21
- 字段归属:在 `diy_field.Tab` 写 `Id`(不是 `Name`)。`Tab` 留空的字段属于"非 Tab 字段"(即 `diy_table.Tabs` 之外的字段),会作为隐藏的剩余字段自动归到最后 Tab。
22
-
23
- - 字段 `Tab="basic"` → 归属"基础信息"Tab
24
- - 字段 `Tab=""` 且 `diy_table.Tabs` 存在 → 自动归到最后一个 Tab 的剩余字段
25
- - 字段 `Tab=""` 且 `diy_table.Tabs` 不存在 → 全部在第一屏平铺
26
-
27
- **不推荐用法**:把 `diy_table.Tabs` 拆出 3 个 Tab、每个 Tab 内只有 2~3 个字段。这会让用户必须点击 3 次 Tab 才能看完一张表,且首屏只看到 2~3 个字段。
28
-
29
- ### 3.2 字段级 Tabs 控件(`diy_field.Component='Tabs'`)
30
-
31
- 存储:`diy_field` 行 + `Config.FieldTabs`(JSON)。
32
-
33
- ```jsonc
34
- // diy_field 必要字段
35
- {
36
- "Id": "TabsField_Main",
37
- "Name": "TabsMain",
38
- "Label": "主分组",
39
- "Component": "Tabs",
40
- "Type": "varchar(50)",
41
- "Sort": 50,
42
- "Visible": 0, // 通常设为 0,因为 Tabs 本身是布局控件
43
- "AppVisible": 0,
44
- "Config": "{\"FieldTabs\":{...}}"
45
- }
46
-
47
- // Config.FieldTabs
48
- {
49
- "ScopeMode": "FieldCount", // 或 "Manual"
50
- "TotalFieldCount": 0, // 0 表示直到下一个 Tabs
51
- "DefaultActiveKey": "tab1",
52
- "Type": "card", // "" | "card" | "border-card"
53
- "Position": "top", // top | bottom | left | right
54
- "Stretch": false,
55
- "ShowFieldCount": true,
56
- "CaptureRest": true,
57
- "Description": "",
58
- "Theme": "default",
59
- "Tabs": [
60
- { "Key": "tab1", "Title": "页签一", "Icon": "fas fa-info-circle", "FieldCount": 6, "Disabled": false }
61
- ]
62
- }
63
- ```
64
-
65
- **作用范围**:从该 Tabs 字段开始,到下一个 `Component in (Tabs, CollapseGroup, Divider)` 字段为止。
66
-
67
- ### 3.3 字段级 CollapseGroup 折叠分组(`diy_field.Component='CollapseGroup'`)
68
-
69
- 存储:`diy_field` 行 + `Config.CollapseGroup`(JSON)。
70
-
71
- ```jsonc
72
- // diy_field 必要字段
73
- {
74
- "Id": "CollapseGroup_MRP",
75
- "Name": "MrpGroup",
76
- "Label": "MRP 运算",
77
- "Component": "CollapseGroup",
78
- "Type": "",
79
- "Sort": 120,
80
- "Visible": 1,
81
- "AppVisible": 1,
82
- "FormWidth": 24,
83
- "Config": "{\"CollapseGroup\":{...}}"
84
- }
85
-
86
- // Config.CollapseGroup
87
- {
88
- "DefaultCollapsed": false, // 默认展开;高频访问分组可设 false
89
- "ScopeMode": "UntilNextGroup", // 直到下一个折叠/Tab/Divider
90
- "FieldCount": 5, // ScopeMode=FieldCount 时生效
91
- "Description": "MRP 运算结果与时间",
92
- "Icon": "fas fa-calculator",
93
- "Theme": "primary", // default | primary | success | warning | danger
94
- "ShowFieldCount": true
95
- }
96
- ```
97
-
98
- **作用范围**:从该 CollapseGroup 字段开始,到下一个 `Component in (Tabs, CollapseGroup, Divider)` 字段为止。
99
-
100
- **默认值硬规则**:`CollapseGroup` 必须保存 `FormWidth=24`(PC 表单 100% 宽度);
101
- `Config.CollapseGroup.ShowFieldCount` 省略时必须补为 `true`。只有用户明确要求隐藏数量时
102
- 才允许写 `ShowFieldCount=false`,只有用户明确要求非整行实验布局时才允许覆盖宽度。
103
-
104
- **与 Tab 的关键区别**:所有 CollapseGroup 标题**始终可见**,分组内字段**默认展开**或**默认收起**,但所有分组的字段**都在同一页面**,可同时展开多个。
105
-
106
- ### 3.4 控件视觉对比
107
-
108
- | 视觉表现 | Tabs | CollapseGroup |
109
- |---------|------|---------------|
110
- | 首屏可见字段数 | 仅一个 Tab 的字段 | **所有分组的标题 + 展开分组的字段** |
111
- | 用户切换分组方式 | 必须点击 Tab 头 | 可直接滚动或逐个点击展开 |
112
- | 同时看到多组 | ❌ | ✅ |
113
- | 适合"展开后阅读" | ❌(频繁切换会烦) | ✅ |
114
- | 适合"互斥分组" | ✅ | ❌ |
115
-
116
- <!-- /microi-progressive:chunk -->
117
- <!-- microi-progressive:chunk id=microi-form-layout-007 sha256=5944a965b1ac9a5c87a0e066af7f6489d2b5cd09e55fff7dc4e43d8d3a029fd6 -->
118
- ## 7. 反例参考(必须避免)
119
-
120
- ### 反例 1:MRP 运算 3 字段单独建 Tab
121
-
122
- ```
123
- ❌ 错误:
124
- diy_table.Tabs = [
125
- { Id: 'basic', Name: '基础信息' }, // 5 字段
126
- { Id: 'mrp', Name: 'MRP 运算' }, // 3 字段
127
- { Id: 'remark', Name: '备注' } // 1 字段
128
- ]
129
- // 用户打开表单,第一屏只看到 5 个"基础信息"字段,"MRP 运算"和"备注"被藏在 Tab 里
130
-
131
- ✅ 正确:
132
- // 不创建 diy_table.Tabs,把"MRP 运算" 3 字段用 CollapseGroup 收在表单末尾(默认展开)
133
- // 把"备注"也用 CollapseGroup 或 Divider 收
134
- // 第一屏用户能看到所有基础信息 + MRP 运算
135
- ```
136
-
137
- ### 反例 1.1:项目收款记录拆成 2/9/2 三个 Tab
138
-
139
- ```
140
- ❌ 错误:
141
- 项目(2 个短字段) + 收款(9 个短字段) + 附件备注(2 个整行字段)分别建 Tab。
142
- 结果是每页只有 1~5 行内容,桌面抽屉出现大面积空白,用户要切换三次才能看完整记录。
143
-
144
- ✅ 正确:
145
- 取消表级 Tab,按原顺序建立“项目信息 / 收款信息 / 附件备注”三个 CollapseGroup。
146
- 核心组默认展开,低频附件备注可默认收起;保留原字段、数据源、必填规则和 V8 代码。
147
- ```
148
-
149
- ### 反例 2:13 字段表全平铺
150
-
151
- ```
152
- ❌ 错误:
153
- // 13 字段全部 Tab 留空
154
- // 用户必须向下滚动 3 屏才能看到所有字段
155
-
156
- ✅ 正确:
157
- // 13 字段按业务分两组:8 字段"基础信息" + 5 字段"业务明细"
158
- // 用 1 个 diy_table.Tabs(基础信息 + 业务明细)
159
- // 或用 1 个 CollapseGroup 把"业务明细"5 字段收起
160
- ```
161
-
162
- ### 反例 3:42 字段表用 6 个 Tab
163
-
164
- ```
165
- ❌ 错误:
166
- // 6 个 Tab:基础(14) + 项目业主(2) + 发货通知(13) + 生产需求(3) + 审核(4) + ERP出库(4) + 其他(2)
167
- // 用户要点 6 次才能看完,且"项目业主"和"生产需求"这种 2~3 字段的 Tab 完全没必要
168
-
169
- ✅ 正确:
170
- // 4 个 Tab:基础(14) + 发货通知+生产需求(16) + 审核+ERP出库(8) + 其他(4)
171
- // 或 3 个 Tab + 内部嵌套 CollapseGroup
172
- ```
173
-
174
- <!-- /microi-progressive:chunk -->
175
- <!-- microi-progressive:chunk id=microi-form-layout-008 sha256=1d93c83d865ef941f62c4e8e0dd6238489645bf53367b61e6e397543447dcdbd -->
176
- ## 8. 快速参考代码片段
177
-
178
- ### 8.1 MCP 创建表级 Tab
179
-
180
- ```js
181
- // 假设已创建 diy_table,通过 microi_update_table 设置 Tabs
182
- // 注意:microi_create_table 不直接接收 Tabs JSON,需创建后 microi_update_table 补全
183
- microi_update_table({
184
- name: "yutaoliaojieguo",
185
- // 暂未直接传 Tabs,需要通过 microi_update_table 文档化的方式补全
186
- })
187
- ```
188
-
189
- > 实际写入 `diy_table.Tabs` 优先用 `microi_update_field` 之外的元数据写入方式或 `microi_upsert_engine` 委托接口引擎;后续 MCP 工具可补强 `Tabs` 参数。
190
-
191
- ### 8.2 MCP 创建字段级 CollapseGroup
192
-
193
- ```js
194
- // 1. 创建一个 CollapseGroup 字段
195
- microi_add_layout_field({
196
- tableId: "01KTASHWEBE514R1XTB0WVJJRX",
197
- name: "MrpGroup",
198
- label: "MRP 运算",
199
- component: "CollapseGroup",
200
- sort: 150,
201
- visible: 1,
202
- appVisible: 1,
203
- config: JSON.stringify({
204
- CollapseGroup: {
205
- DefaultCollapsed: false,
206
- ScopeMode: "UntilNextGroup",
207
- Description: "MRP 运算状态、批次号与时间",
208
- Icon: "fas fa-calculator",
209
- Theme: "primary",
210
- ShowFieldCount: true
211
- }
212
- }),
213
- confirmExecution: "MrpGroup"
214
- })
215
-
216
- // 工具默认写入 FormWidth=24;回读必须确认宽度为 24 且 ShowFieldCount=true。
217
-
218
- // 2. 让"MRP 运算"相关字段归属到该 CollapseGroup
219
- // 范围方式:把 CalcStatus、CalcBatchNo、MrpTime 三个字段的 Sort 排在 150~300 之间,
220
- // 下一个 CollapseGroup/Tabs/Divider 字段之前的所有字段都属于该分组
221
- ```
222
-
223
- ### 8.3 MCP 把字段 Tab 归属到 diy_table.Tabs
224
-
225
- ```js
226
- // 创建表级 Tab
227
- // 1. microi_update_table 设置 diy_table.Tabs 字段(待 MCP 工具补全)
228
- // 2. 给字段写 Tab 归属
229
- microi_update_field({
230
- id: "01KVTWDJ7WXB3Z60HGJ5BPTBJ0",
231
- tab: "basic" // 归属到 diy_table.Tabs.Id='basic' 的 Tab
232
- })
233
- ```
234
-
235
- <!-- /microi-progressive:chunk -->
1
+ # microi-form-layout 详细参考 1
2
+
3
+ > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
+
5
+ <!-- microi-progressive:chunk id=microi-form-layout-006 sha256=a78b000a9fee46d8394b0b6cb186702e520ab513f7eff098f2226f1158e46970 -->
6
+ ## 3. 三种分组的存储与配置
7
+
8
+ ### 3.1 diy_table.Tabs(表级 Tab)
9
+
10
+ 存储:`diy_table.Tabs`(JSON 字符串)+ 每个字段的 `diy_field.Tab`(归属 Tab 名)。
11
+
12
+ ```jsonc
13
+ // diy_table.Tabs JSON 格式
14
+ [
15
+ { "Id": "basic", "Name": "基础信息", "Sort": 10 },
16
+ { "Id": "business","Name": "业务明细", "Sort": 20 },
17
+ { "Id": "attach", "Name": "附件备注", "Sort": 30 }
18
+ ]
19
+ ```
20
+
21
+ 字段归属:在 `diy_field.Tab` 写 `Id`(不是 `Name`)。`Tab` 留空的字段属于"非 Tab 字段"(即 `diy_table.Tabs` 之外的字段),会作为隐藏的剩余字段自动归到最后 Tab。
22
+
23
+ - 字段 `Tab="basic"` → 归属"基础信息"Tab
24
+ - 字段 `Tab=""` 且 `diy_table.Tabs` 存在 → 自动归到最后一个 Tab 的剩余字段
25
+ - 字段 `Tab=""` 且 `diy_table.Tabs` 不存在 → 全部在第一屏平铺
26
+
27
+ **不推荐用法**:把 `diy_table.Tabs` 拆出 3 个 Tab、每个 Tab 内只有 2~3 个字段。这会让用户必须点击 3 次 Tab 才能看完一张表,且首屏只看到 2~3 个字段。
28
+
29
+ ### 3.2 字段级 Tabs 控件(`diy_field.Component='Tabs'`)
30
+
31
+ 存储:`diy_field` 行 + `Config.FieldTabs`(JSON)。
32
+
33
+ ```jsonc
34
+ // diy_field 必要字段
35
+ {
36
+ "Id": "TabsField_Main",
37
+ "Name": "TabsMain",
38
+ "Label": "主分组",
39
+ "Component": "Tabs",
40
+ "Type": "varchar(50)",
41
+ "Sort": 50,
42
+ "Visible": 0, // 通常设为 0,因为 Tabs 本身是布局控件
43
+ "AppVisible": 0,
44
+ "Config": "{\"FieldTabs\":{...}}"
45
+ }
46
+
47
+ // Config.FieldTabs
48
+ {
49
+ "ScopeMode": "FieldCount", // 或 "Manual"
50
+ "TotalFieldCount": 0, // 0 表示直到下一个 Tabs
51
+ "DefaultActiveKey": "tab1",
52
+ "Type": "card", // "" | "card" | "border-card"
53
+ "Position": "top", // top | bottom | left | right
54
+ "Stretch": false,
55
+ "ShowFieldCount": true,
56
+ "CaptureRest": true,
57
+ "Description": "",
58
+ "Theme": "default",
59
+ "Tabs": [
60
+ { "Key": "tab1", "Title": "页签一", "Icon": "fas fa-info-circle", "FieldCount": 6, "Disabled": false }
61
+ ]
62
+ }
63
+ ```
64
+
65
+ **作用范围**:从该 Tabs 字段开始,到下一个 `Component in (Tabs, CollapseGroup, Divider)` 字段为止。
66
+
67
+ ### 3.3 字段级 CollapseGroup 折叠分组(`diy_field.Component='CollapseGroup'`)
68
+
69
+ 存储:`diy_field` 行 + `Config.CollapseGroup`(JSON)。
70
+
71
+ ```jsonc
72
+ // diy_field 必要字段
73
+ {
74
+ "Id": "CollapseGroup_MRP",
75
+ "Name": "MrpGroup",
76
+ "Label": "MRP 运算",
77
+ "Component": "CollapseGroup",
78
+ "Type": "",
79
+ "Sort": 120,
80
+ "Visible": 1,
81
+ "AppVisible": 1,
82
+ "FormWidth": 24,
83
+ "Config": "{\"CollapseGroup\":{...}}"
84
+ }
85
+
86
+ // Config.CollapseGroup
87
+ {
88
+ "DefaultCollapsed": false, // 默认展开;高频访问分组可设 false
89
+ "ScopeMode": "UntilNextGroup", // 直到下一个折叠/Tab/Divider
90
+ "FieldCount": 5, // ScopeMode=FieldCount 时生效
91
+ "Description": "MRP 运算结果与时间",
92
+ "Icon": "fas fa-calculator",
93
+ "Theme": "primary", // default | primary | success | warning | danger
94
+ "ShowFieldCount": true
95
+ }
96
+ ```
97
+
98
+ **作用范围**:从该 CollapseGroup 字段开始,到下一个 `Component in (Tabs, CollapseGroup, Divider)` 字段为止。
99
+
100
+ **默认值硬规则**:`CollapseGroup` 必须保存 `FormWidth=24`(PC 表单 100% 宽度);
101
+ `Config.CollapseGroup.ShowFieldCount` 省略时必须补为 `true`。只有用户明确要求隐藏数量时
102
+ 才允许写 `ShowFieldCount=false`,只有用户明确要求非整行实验布局时才允许覆盖宽度。
103
+
104
+ **与 Tab 的关键区别**:所有 CollapseGroup 标题**始终可见**,分组内字段**默认展开**或**默认收起**,但所有分组的字段**都在同一页面**,可同时展开多个。
105
+
106
+ ### 3.4 控件视觉对比
107
+
108
+ | 视觉表现 | Tabs | CollapseGroup |
109
+ |---------|------|---------------|
110
+ | 首屏可见字段数 | 仅一个 Tab 的字段 | **所有分组的标题 + 展开分组的字段** |
111
+ | 用户切换分组方式 | 必须点击 Tab 头 | 可直接滚动或逐个点击展开 |
112
+ | 同时看到多组 | ❌ | ✅ |
113
+ | 适合"展开后阅读" | ❌(频繁切换会烦) | ✅ |
114
+ | 适合"互斥分组" | ✅ | ❌ |
115
+
116
+ <!-- /microi-progressive:chunk -->
117
+ <!-- microi-progressive:chunk id=microi-form-layout-007 sha256=5944a965b1ac9a5c87a0e066af7f6489d2b5cd09e55fff7dc4e43d8d3a029fd6 -->
118
+ ## 7. 反例参考(必须避免)
119
+
120
+ ### 反例 1:MRP 运算 3 字段单独建 Tab
121
+
122
+ ```
123
+ ❌ 错误:
124
+ diy_table.Tabs = [
125
+ { Id: 'basic', Name: '基础信息' }, // 5 字段
126
+ { Id: 'mrp', Name: 'MRP 运算' }, // 3 字段
127
+ { Id: 'remark', Name: '备注' } // 1 字段
128
+ ]
129
+ // 用户打开表单,第一屏只看到 5 个"基础信息"字段,"MRP 运算"和"备注"被藏在 Tab 里
130
+
131
+ ✅ 正确:
132
+ // 不创建 diy_table.Tabs,把"MRP 运算" 3 字段用 CollapseGroup 收在表单末尾(默认展开)
133
+ // 把"备注"也用 CollapseGroup 或 Divider 收
134
+ // 第一屏用户能看到所有基础信息 + MRP 运算
135
+ ```
136
+
137
+ ### 反例 1.1:项目收款记录拆成 2/9/2 三个 Tab
138
+
139
+ ```
140
+ ❌ 错误:
141
+ 项目(2 个短字段) + 收款(9 个短字段) + 附件备注(2 个整行字段)分别建 Tab。
142
+ 结果是每页只有 1~5 行内容,桌面抽屉出现大面积空白,用户要切换三次才能看完整记录。
143
+
144
+ ✅ 正确:
145
+ 取消表级 Tab,按原顺序建立“项目信息 / 收款信息 / 附件备注”三个 CollapseGroup。
146
+ 核心组默认展开,低频附件备注可默认收起;保留原字段、数据源、必填规则和 V8 代码。
147
+ ```
148
+
149
+ ### 反例 2:13 字段表全平铺
150
+
151
+ ```
152
+ ❌ 错误:
153
+ // 13 字段全部 Tab 留空
154
+ // 用户必须向下滚动 3 屏才能看到所有字段
155
+
156
+ ✅ 正确:
157
+ // 13 字段按业务分两组:8 字段"基础信息" + 5 字段"业务明细"
158
+ // 用 1 个 diy_table.Tabs(基础信息 + 业务明细)
159
+ // 或用 1 个 CollapseGroup 把"业务明细"5 字段收起
160
+ ```
161
+
162
+ ### 反例 3:42 字段表用 6 个 Tab
163
+
164
+ ```
165
+ ❌ 错误:
166
+ // 6 个 Tab:基础(14) + 项目业主(2) + 发货通知(13) + 生产需求(3) + 审核(4) + ERP出库(4) + 其他(2)
167
+ // 用户要点 6 次才能看完,且"项目业主"和"生产需求"这种 2~3 字段的 Tab 完全没必要
168
+
169
+ ✅ 正确:
170
+ // 4 个 Tab:基础(14) + 发货通知+生产需求(16) + 审核+ERP出库(8) + 其他(4)
171
+ // 或 3 个 Tab + 内部嵌套 CollapseGroup
172
+ ```
173
+
174
+ <!-- /microi-progressive:chunk -->
175
+ <!-- microi-progressive:chunk id=microi-form-layout-008 sha256=1d93c83d865ef941f62c4e8e0dd6238489645bf53367b61e6e397543447dcdbd -->
176
+ ## 8. 快速参考代码片段
177
+
178
+ ### 8.1 MCP 创建表级 Tab
179
+
180
+ ```js
181
+ // 假设已创建 diy_table,通过 microi_update_table 设置 Tabs
182
+ // 注意:microi_create_table 不直接接收 Tabs JSON,需创建后 microi_update_table 补全
183
+ microi_update_table({
184
+ name: "yutaoliaojieguo",
185
+ // 暂未直接传 Tabs,需要通过 microi_update_table 文档化的方式补全
186
+ })
187
+ ```
188
+
189
+ > 实际写入 `diy_table.Tabs` 优先用 `microi_update_field` 之外的元数据写入方式或 `microi_upsert_engine` 委托接口引擎;后续 MCP 工具可补强 `Tabs` 参数。
190
+
191
+ ### 8.2 MCP 创建字段级 CollapseGroup
192
+
193
+ ```js
194
+ // 1. 创建一个 CollapseGroup 字段
195
+ microi_add_layout_field({
196
+ tableId: "01KTASHWEBE514R1XTB0WVJJRX",
197
+ name: "MrpGroup",
198
+ label: "MRP 运算",
199
+ component: "CollapseGroup",
200
+ sort: 150,
201
+ visible: 1,
202
+ appVisible: 1,
203
+ config: JSON.stringify({
204
+ CollapseGroup: {
205
+ DefaultCollapsed: false,
206
+ ScopeMode: "UntilNextGroup",
207
+ Description: "MRP 运算状态、批次号与时间",
208
+ Icon: "fas fa-calculator",
209
+ Theme: "primary",
210
+ ShowFieldCount: true
211
+ }
212
+ }),
213
+ confirmExecution: "MrpGroup"
214
+ })
215
+
216
+ // 工具默认写入 FormWidth=24;回读必须确认宽度为 24 且 ShowFieldCount=true。
217
+
218
+ // 2. 让"MRP 运算"相关字段归属到该 CollapseGroup
219
+ // 范围方式:把 CalcStatus、CalcBatchNo、MrpTime 三个字段的 Sort 排在 150~300 之间,
220
+ // 下一个 CollapseGroup/Tabs/Divider 字段之前的所有字段都属于该分组
221
+ ```
222
+
223
+ ### 8.3 MCP 把字段 Tab 归属到 diy_table.Tabs
224
+
225
+ ```js
226
+ // 创建表级 Tab
227
+ // 1. microi_update_table 设置 diy_table.Tabs 字段(待 MCP 工具补全)
228
+ // 2. 给字段写 Tab 归属
229
+ microi_update_field({
230
+ id: "01KVTWDJ7WXB3Z60HGJ5BPTBJ0",
231
+ tab: "basic" // 归属到 diy_table.Tabs.Id='basic' 的 Tab
232
+ })
233
+ ```
234
+
235
+ <!-- /microi-progressive:chunk -->
@@ -78,7 +78,7 @@ SDK 或项目请求模块必须提供登录所需的系统配置和验证码薄
78
78
 
79
79
  要求:
80
80
  - 提供 `isEnabledFlag(value)` 或等价工具,统一判断 `Sys_Config.EnableCaptcha`。它必须把 `true`、`1`、`'true'`、`'1'` 识别为开启,把 `false`、`0`、`'false'`、`'0'`、空值识别为关闭。
81
- - 提供 `getSysConfig()`,内部调用 `V8.GetSysConfig(true)` 或 `/apiengine/platform-sys-config`,并保持 Query、Header、Body 中的当前租户 `OsClient` 一致。
81
+ - 提供 `getSysConfig()`,内部调用 `V8.GetSysConfig(true)` 或 `/apiengine/platform-sys-config`,并保持 Query、Header、Body 中的当前租户 `OsClient` 一致。
82
82
  - 提供 `getCaptcha()`,内部调用 `GET /api/Captcha/GetCaptcha`,`responseType:'arraybuffer'`,从响应头读取 `captchaid`,返回 `{ CaptchaId, ImageSrc }`。
83
83
  - 提供账号登录封装时,只有在页面传入验证码时才追加 `_CaptchaId/_CaptchaValue`;不要在未开启验证码时提交空字段。
84
84
  - PC Vue、UniApp H5、微信小程序和 App 的账号密码登录都必须使用同一套验证码判断和登录参数契约。
@@ -139,9 +139,9 @@ SDK 的 `buildHeaders` 必须集中处理所有请求头,不能让页面、业
139
139
 
140
140
  - 使用 multipart 上传头。`uni.uploadFile` 或 `fetch(FormData)` 不得发送 `Content-Type: application/json`。
141
141
  - 租户请求头只发送一个键:`osclient`。添加配置租户前,先移除传入的 `osclient` / `OsClient` 重复键。
142
- - `formData` 中发送 `OsClient`;开启 `appendOsClientQuery` 时保留接口查询参数 `?OsClient=tenant`。
143
- - 标准表单的 `ImgUpload`、`FileUpload`、`RichText` 必须通过 `formFieldContext`(或等价 `formData`)发送 `FormEngineKey + FieldId + SysMenuId`;编辑已有记录再传 `FormDataId`,TableChild 再传 JSON 化的 `_TableChildAuth`。服务端以当前租户字段配置和 FormEngine 动作授权决定实际 `Limit/Path`,SDK 不能按帐号等级强制私有,也不能信任页面传入的 `Limit=false`。
144
- - 上传 `Path` 统一从 `options.path`、`formData.Path` 或 `formData.path` 归一化。
142
+ - `formData` 中发送 `OsClient`;开启 `appendOsClientQuery` 时保留接口查询参数 `?OsClient=tenant`。
143
+ - 标准表单的 `ImgUpload`、`FileUpload`、`RichText` 必须通过 `formFieldContext`(或等价 `formData`)发送 `FormEngineKey + FieldId + SysMenuId`;编辑已有记录再传 `FormDataId`,TableChild 再传 JSON 化的 `_TableChildAuth`。服务端以当前租户字段配置和 FormEngine 动作授权决定实际 `Limit/Path`,SDK 不能按帐号等级强制私有,也不能信任页面传入的 `Limit=false`。
144
+ - 上传 `Path` 统一从 `options.path`、`formData.Path` 或 `formData.path` 归一化。
145
145
  - 移动端上传路径必须是安全相对路径,例如 `mall/pay-proof` 或 `mall/member/avatar`。不要使用 `/mall/pay-proof`、完整 URL、磁盘路径、`..`、`:`、`//` 或 `~`。
146
146
  - 项目薄封装要通过 `{ ...options, path: options.path || defaultPath }` 透传全部选项,避免丢失页面级 `headers`、`action`、`anonymous`、`file`、`formData` 和 `silentError`。
147
147
  - H5 页面要保留 `uni.chooseImage` 返回的真实 `File` 对象(可用时为 `tempFiles[0].file`)。如果 H5 只返回 `tempFiles[0]` 或 `blob:` / `data:` 临时路径,也要继续传入,不要丢弃。调用 `V8.uploadFile(..., { file, preferFetch:true })`。SDK 必须识别 `File` / `Blob`、`file` / `raw` / `blob` / `originFileObj` 等常见嵌套字段,以及 `blob:` / `data:` 路径,然后优先使用 `fetch + FormData`,必要时在 `uni.uploadFile` 与 fetch 之间回退。