@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,6 +1,6 @@
1
1
  ---
2
2
  name: v8-explorer-tree
3
- description: Microi.VSCode 插件 V8 资源管理器目录规范(表单引擎 / 字段V8事件 / 模块引擎按钮)。覆盖 diy_table V8 事件、diy_field V8 事件、sys_menu 按钮 JSON 拆分回写,含 7 条安全不变量。用于实现 VSCode V8 事件树、重构目录布局或处理 sys_menu 按钮 JSON 序列化。
3
+ description: Microi.VSCode 插件 V8 资源管理器目录规范(表单引擎 / 字段V8事件 / 模块引擎按钮)。覆盖 diy_table V8 事件、diy_field V8 事件、sys_menu 按钮 JSON 拆分回写,含 7 条安全不变量。用于实现 VSCode V8 事件树、重构目录布局或处理 sys_menu 按钮 JSON 序列化。
4
4
  ---
5
5
 
6
6
  > **Codex 非阻塞自动更新:** 当前宿主为 Codex 时,吾码 CLI、Codex 插件与工作区 AI/MCP 由后台自动更新;需要诊断时读取 `../microi-codex-installer/SKILL.md`。更新失败、等待空闲或尚未重载均不得阻断当前、正在进行或新建任务。非 Codex 宿主跳过此项。
@@ -26,16 +26,16 @@ description: Microi.VSCode 插件 V8 资源管理器目录规范(表单引擎
26
26
  | 按钮显隐 | `<按钮Name>_显隐判断(<按钮Id>)` | `指派_显隐判断(01K3X...).js` |
27
27
  | 按钮分类目录 | `<按钮类型中文>(<EnglishField>)` | `[行]更多按钮(MoreBtns)/` |
28
28
 
29
- ### 0.1 7 类表单 V8 事件中文名(以 `diy_table` 对应 `diy_field.Label` 为准)
29
+ ### 0.1 7 类表单 V8 事件中文名(以 `diy_table` 对应 `diy_field.Label` 为准)
30
30
 
31
31
  | EventType | 中文名 |
32
32
  |-----------|--------|
33
33
  | InFormV8 | 前端表单进入V8事件 |
34
- | SubmitFormV8 | 前端表单提交前V8事件 |
35
- | SubmitBeforeServerV8 | 后端表单提交前V8事件 |
36
- | SubmitAfterServerV8 | 后端表单提交后V8事件 |
37
- | ServerDataV8 | 后端数据处理V8事件 |
38
- | OutFormV8 | 前端表单提交后V8事件 |
34
+ | SubmitFormV8 | 前端表单提交前V8事件 |
35
+ | SubmitBeforeServerV8 | 后端表单提交前V8事件 |
36
+ | SubmitAfterServerV8 | 后端表单提交后V8事件 |
37
+ | ServerDataV8 | 后端数据处理V8事件 |
38
+ | OutFormV8 | 前端表单提交后V8事件 |
39
39
  | DataFilterV8 | 后端数据过滤V8事件 |
40
40
 
41
41
  > 统一用“后端”,不要再生成“服务端”或“服务器端”可见目录/文件名。
@@ -83,27 +83,27 @@ description: Microi.VSCode 插件 V8 资源管理器目录规范(表单引擎
83
83
  ├── 表单引擎/
84
84
  │ └── <表Label>(<表Name>)/
85
85
  │ ├── 表单V8事件/
86
- │ │ ├── 前端表单进入V8事件(InFormV8).js // 仅远端非空代码生成文件
87
- │ │ ├── 前端表单提交前V8事件(SubmitFormV8).js
88
- │ │ ├── 后端表单提交前V8事件(SubmitBeforeServerV8).js
89
- │ │ ├── 后端表单提交后V8事件(SubmitAfterServerV8).js
90
- │ │ ├── 后端数据处理V8事件(ServerDataV8).js
91
- │ │ ├── 前端表单提交后V8事件(OutFormV8).js
86
+ │ │ ├── 前端表单进入V8事件(InFormV8).js // 仅远端非空代码生成文件
87
+ │ │ ├── 前端表单提交前V8事件(SubmitFormV8).js
88
+ │ │ ├── 后端表单提交前V8事件(SubmitBeforeServerV8).js
89
+ │ │ ├── 后端表单提交后V8事件(SubmitAfterServerV8).js
90
+ │ │ ├── 后端数据处理V8事件(ServerDataV8).js
91
+ │ │ ├── 前端表单提交后V8事件(OutFormV8).js
92
92
  │ │ └── 后端数据过滤V8事件(DataFilterV8).js
93
93
  │ └── 字段V8事件/
94
94
  │ └── <字段Label>(<字段Name>)/
95
- │ ├── 值变更V8事件(V8Code).js // 右键单表拉取后生成,仅远端非空代码生成文件
95
+ │ ├── 值变更V8事件(V8Code).js // 右键单表拉取后生成,仅远端非空代码生成文件
96
96
  │ ├── 键盘V8事件(KeyupV8Code).js
97
97
  │ ├── 模板V8引擎(表格)(V8TmpEngineTable).js
98
98
  │ └── 模板V8引擎(表单)(V8TmpEngineForm).js
99
99
  │
100
100
  └── 模块引擎/
101
101
  └── <父菜单Name>(<ParentMenuId>)/ // 非叶子模块只显示子模块,不生成按钮目录
102
- └── <叶子菜单Name>(<LeafMenuId>)/
103
- ├── Join关联(SqlJoin).js // 始终生成,直接映射 sys_menu.SqlJoin
104
- ├── Where条件(SqlWhere).js // 始终生成,直接映射 sys_menu.SqlWhere
105
- ├── 页面多Tab(PageTabs)/ // 叶子模块固定生成全部 6 个按钮目录,即使为空
106
- │ ├── <按钮Name>(<按钮Id>).js // V8Code,仅远端非空代码生成文件
102
+ └── <叶子菜单Name>(<LeafMenuId>)/
103
+ ├── Join关联(SqlJoin).js // 始终生成,直接映射 sys_menu.SqlJoin
104
+ ├── Where条件(SqlWhere).js // 始终生成,直接映射 sys_menu.SqlWhere
105
+ ├── 页面多Tab(PageTabs)/ // 叶子模块固定生成全部 6 个按钮目录,即使为空
106
+ │ ├── <按钮Name>(<按钮Id>).js // V8Code,仅远端非空代码生成文件
107
107
  │ └── <按钮Name>_显隐判断(<按钮Id>).js // V8CodeShow,仅在非空时生成
108
108
  ├── [页面]更多按钮(PageBtns)/
109
109
  ├── [行]更多按钮(MoreBtns)/
@@ -112,15 +112,15 @@ description: Microi.VSCode 插件 V8 资源管理器目录规范(表单引擎
112
112
  └── [导出]更多按钮(ExportMoreBtns)/
113
113
  ```
114
114
 
115
- ### 2.1 ⚠️ 空代码不落文件规则(关键约束)
115
+ ### 2.1 ⚠️ 空代码不落文件规则(关键约束)
116
116
 
117
117
  > **前端 V8 引擎**只要事件 / 按钮代码字符串非空(哪怕只有注释、空格),就会调用 Jint 解析并执行——产生不必要的 CPU 开销。
118
118
  >
119
- > 因此:拉取远端资源时,空 V8 代码**不要生成本地 `.js` 文件**。若历史同步留下空 `.js` 文件,且远端代码同样为空,应删除本地空文件,避免被“查看同步状态”误判为本地未推送。
120
- >
121
- > 用户需要清空远端代码时,可以把已有非空文件清空并推送;推送成功后插件应删除该本地空文件或对齐为“无本地文件”状态。
122
- >
123
- > 例外:`SqlJoin`、`SqlWhere` 是模块查询配置,不是按钮 V8 事件。叶子模块必须始终生成两个平级文件,空文件表示远端字段为空,并允许通过推送空文件清空对应字段。
119
+ > 因此:拉取远端资源时,空 V8 代码**不要生成本地 `.js` 文件**。若历史同步留下空 `.js` 文件,且远端代码同样为空,应删除本地空文件,避免被“查看同步状态”误判为本地未推送。
120
+ >
121
+ > 用户需要清空远端代码时,可以把已有非空文件清空并推送;推送成功后插件应删除该本地空文件或对齐为“无本地文件”状态。
122
+ >
123
+ > 例外:`SqlJoin`、`SqlWhere` 是模块查询配置,不是按钮 V8 事件。叶子模块必须始终生成两个平级文件,空文件表示远端字段为空,并允许通过推送空文件清空对应字段。
124
124
 
125
125
  ---
126
126
 
@@ -129,10 +129,10 @@ description: Microi.VSCode 插件 V8 资源管理器目录规范(表单引擎
129
129
  ### 3.1 表单 V8 事件(✅ 已实现 2026-05)
130
130
 
131
131
  - **拉取**:复用 `GetV8EventList`。对每个返回项:
132
- 1. 每张表固定生成表单 V8 事件目录
133
- 2. 仅远端非空代码生成 `.js`;空代码不生成文件,历史空文件应删除
132
+ 1. 每张表固定生成表单 V8 事件目录
133
+ 2. 仅远端非空代码生成 `.js`;空代码不生成文件,历史空文件应删除
134
134
  - **保存**:`parseEventFilePath` 解析新旧两种结构,调 `UpdateV8EventCode`
135
- - **删除**:用户删除本地文件默认只删除本地文件,不自动清空远端;清空远端必须通过清空已有文件内容并执行推送,或使用明确的“清空远端代码”命令
135
+ - **删除**:用户删除本地文件默认只删除本地文件,不自动清空远端;清空远端必须通过清空已有文件内容并执行推送,或使用明确的“清空远端代码”命令
136
136
 
137
137
  ### 3.2 字段 V8 事件(✅ 已实现 2026-05)
138
138
 
@@ -147,16 +147,16 @@ description: Microi.VSCode 插件 V8 资源管理器目录规范(表单引擎
147
147
 
148
148
  ### 3.3 sys_menu 按钮 JSON 拆分(✅ 已实现 2026-05)
149
149
 
150
- **接口**:
151
- - `GET /api/V8Debug/GetModule?osClient&moduleId` — 返回菜单详情,包含 6 类按钮 JSON 以及 `SqlJoin/SqlWhere`
152
- - `POST /api/V8Debug/UpdateModule` — Body 含 `OsClient/ModuleId` 以及目标按钮字段或 `SqlJoin/SqlWhere`
150
+ **接口**:
151
+ - `GET /api/V8Debug/GetModule?osClient&moduleId` — 返回菜单详情,包含 6 类按钮 JSON 以及 `SqlJoin/SqlWhere`
152
+ - `POST /api/V8Debug/UpdateModule` — Body 含 `OsClient/ModuleId` 以及目标按钮字段或 `SqlJoin/SqlWhere`
153
153
 
154
154
  **拉取**:
155
155
  1. 解析 `PageTabs/PageBtns/MoreBtns/FormBtns/BatchSelectMoreBtns/ExportMoreBtns` 6 个 JSON 数组(非法 JSON 记录错误并跳过该字段)
156
156
  2. 按 `ParentId` 生成与 `sys_menu/GetSysMenuStep` 一致的模块树;非叶子模块只生成子模块目录,不生成按钮目录
157
- 3. 叶子模块固定生成全部 6 个按钮分类目录,并直接生成 `Join关联(SqlJoin).js`、`Where条件(SqlWhere).js`;两个配置文件即使远端为空也必须生成
158
- 4. 对每个按钮:
159
- - 仅在 `V8Code` 非空时生成 `<按钮Name>(<按钮Id>).js`
157
+ 3. 叶子模块固定生成全部 6 个按钮分类目录,并直接生成 `Join关联(SqlJoin).js`、`Where条件(SqlWhere).js`;两个配置文件即使远端为空也必须生成
158
+ 4. 对每个按钮:
159
+ - 仅在 `V8Code` 非空时生成 `<按钮Name>(<按钮Id>).js`
160
160
  - 若 `V8CodeShow` 非空 → 生成 `<按钮Name>_显隐判断(<按钮Id>).js`
161
161
  - 在空按钮目录中新建 `<按钮Name>(<按钮Id>).js` 并推送时,可按文件名创建远端新按钮
162
162
  5. `.microi-meta.json` 写入按钮 JSON hash;回写前写 `.backups/<moduleId>/<ButtonField>-<timestamp>.json`
@@ -167,11 +167,11 @@ description: Microi.VSCode 插件 V8 资源管理器目录规范(表单引擎
167
167
  3. JSON 解析失败立即中止
168
168
  4. **Id-Diff 合并**:只修改目标按钮的 `V8Code` 或 `V8CodeShow`,远端其它按钮全部原样保留
169
169
  5. 写一份 `.backups/<moduleId>/<ButtonField>-<timestamp>.json`(变更前的远端 JSON)
170
- 6. 调 `UpdateModule` 整段写回;任何一步失败不写库
171
-
172
- **SqlJoin/SqlWhere 保存**:从文件路径解析 `ModuleId / SqlJoin|SqlWhere`,推送前重新 `GetModule`,备份远端原字段,`UpdateModule` 只提交目标字段;成功后必须再次 `GetModule` 回读正文完全一致,才更新 meta/mtime。空正文正常保留为空文件。
173
-
174
- **修改状态**:接口引擎、表单V8事件、字段V8事件、模块按钮、模块 SqlJoin/SqlWhere 文件都必须写入 `.microi-meta.json` 的 `updateTime/filePath`;本地 `mtime > updateTime + 1s` 时树节点显示 `已修改`,推送成功后同步更新 meta 并将文件 mtime 设置为远端更新时间以清除标记。
170
+ 6. 调 `UpdateModule` 整段写回;任何一步失败不写库
171
+
172
+ **SqlJoin/SqlWhere 保存**:从文件路径解析 `ModuleId / SqlJoin|SqlWhere`,推送前重新 `GetModule`,备份远端原字段,`UpdateModule` 只提交目标字段;成功后必须再次 `GetModule` 回读正文完全一致,才更新 meta/mtime。空正文正常保留为空文件。
173
+
174
+ **修改状态**:接口引擎、表单V8事件、字段V8事件、模块按钮、模块 SqlJoin/SqlWhere 文件都必须写入 `.microi-meta.json` 的 `updateTime/filePath`;本地 `mtime > updateTime + 1s` 时树节点显示 `已修改`,推送成功后同步更新 meta 并将文件 mtime 设置为远端更新时间以清除标记。
175
175
 
176
176
  **Controller OsClient 规则**:`CheckPermission()` 返回的 `token` 是 `dynamic`。调用 `V8McpLogic.ResolveOsClient` 时必须传 `(object)token`,并让 `ResolveOsClient(string osClient, object currentToken)` 返回真正的 `string`;Controller 中 OsClient 空判断用 `string.IsNullOrWhiteSpace(osClient)`,不要对 `osClient` 调 `DosIsNullOrWhiteSpace()`。
177
177
 
@@ -193,34 +193,34 @@ description: Microi.VSCode 插件 V8 资源管理器目录规范(表单引擎
193
193
 
194
194
  ## 5. 实施状态(2026-05-22)
195
195
 
196
- - ✅ **Stage 1 表单V8事件分层 + 中文命名 + 空代码跳过文件生成** —— 已实现
197
- - ✅ **Stage 2 字段V8事件** —— 已实现:右键单表拉取字段 V8 事件;空代码不生成文件;推送仅更新目标字段的目标 V8 字段
198
- - ✅ **Stage 3 sys_menu 按钮拆分** —— 已实现:主拉取同步模块引擎;按钮 V8Code 仅在非空时生成 `.js`;推送前重拉远端 JSON、按 ButtonId 只改目标按钮并保留其它按钮,写入前自动备份
199
- - ✅ **Stage 4 树形模块引擎 + 全类型修改状态** —— 已实现:模块按 ParentId 树形拉取;非叶子只显示子模块;叶子固定生成 6 个按钮目录;字段/按钮文件也显示并清除 `已修改`
200
- - ✅ **Stage 5 sys_menu 查询脚本本地化** —— 已实现:叶子模块固定生成 `SqlJoin/SqlWhere` 两个平级 `.js` 文件,支持备份、预检、推送、远端回读和修改状态
196
+ - ✅ **Stage 1 表单V8事件分层 + 中文命名 + 空代码跳过文件生成** —— 已实现
197
+ - ✅ **Stage 2 字段V8事件** —— 已实现:右键单表拉取字段 V8 事件;空代码不生成文件;推送仅更新目标字段的目标 V8 字段
198
+ - ✅ **Stage 3 sys_menu 按钮拆分** —— 已实现:主拉取同步模块引擎;按钮 V8Code 仅在非空时生成 `.js`;推送前重拉远端 JSON、按 ButtonId 只改目标按钮并保留其它按钮,写入前自动备份
199
+ - ✅ **Stage 4 树形模块引擎 + 全类型修改状态** —— 已实现:模块按 ParentId 树形拉取;非叶子只显示子模块;叶子固定生成 6 个按钮目录;字段/按钮文件也显示并清除 `已修改`
200
+ - ✅ **Stage 5 sys_menu 查询脚本本地化** —— 已实现:叶子模块固定生成 `SqlJoin/SqlWhere` 两个平级 `.js` 文件,支持备份、预检、推送、远端回读和修改状态
201
201
 
202
202
  ---
203
203
 
204
204
  ## 6. 实施约束总结
205
205
 
206
206
  - **不要**在没看过 §4 全部 7 条不变量就动手实现 Stage 3
207
- - **不要**为远端空 V8 事件/按钮代码生成 `.js` 文件;`SqlJoin/SqlWhere` 属于查询配置,必须保留空文件
208
- - **不要**用半角括号;统一用全角 `()`
209
- - **不要**清空 V8事件/ 旧目录;保留兼容直到用户主动删除
210
- - 文件名中 `<英文Key>` 段必须 ASCII,避免 Windows 不可见字符
211
- - 远端 Key 若含 `\`、`/`、括号或 Windows 非法字符,文件名中的 Key 段必须使用可逆百分号编码;解析和推送时必须解码回原始 Key,禁止用 `_` 不可逆替换后误更新另一条远端记录。文件名还要处理控制字符、结尾空格/点和 `CON/PRN/AUX/NUL/COM1/LPT1` 等 Windows 保留名。
212
- - “拉取此服务器代码”必须按接口引擎、表单引擎、模块引擎、流程引擎、数据库结构分阶段执行。某一类型失败时要记录明细并继续后续类型;同一类型内单个文件写入失败也要继续下一项,禁止首个 `ENOENT` 让整个服务器只留下半套源码。
213
-
214
- ## 7. AI 远端修改后的同步约束
215
-
216
- AI 使用 MCP、接口引擎、数据库脚本或平台 API 修改远端 V8 代码后,必须在任务收尾时同步本地 V8 资源树,并用“查看同步状态”或等价 dry-run 复核。
217
-
218
- - 远端写入后以远端当前生效代码为准,回写本地文件并更新/对齐 meta 与文件 mtime。
219
- - 覆盖范围至少包含本次 touched 的接口引擎、表单 V8 事件、字段 V8 事件、模块按钮 V8、工作流节点 V8、数据源 V8。
220
- - 若没有插件 API 可调用,可在 `.tmp/` 编写一次性同步脚本;脚本必须先 dry-run 输出差异数量,再 apply。
221
- - 收尾复核应确认 touched 范围没有 `changed/created/local-only` 差异;若存在差异,必须在最终回复中说明原因。
222
- - 空 V8 代码不生成本地 `.js` 文件;同步收尾时应清理历史空文件。
223
- - 插件“查看同步状态”不能只显示数量。若本地未推送数量大于 0,必须能列出具体资源类型、Key、名称、同步基准时间、本地修改时间和文件路径,并支持直接打开该文件。
224
- - 接口引擎、表单引擎、模块引擎、流程引擎四个顶层分类必须分别提供行内“查看同步状态”,分类检测只请求该类型的远端数据,禁止每次强制扫描全部引擎。表单引擎范围必须同时覆盖表单 V8 事件与字段 V8 事件,模块引擎范围必须覆盖按钮 V8 与 `SqlJoin/SqlWhere`。
225
- - 一次同步检测的结果必须持久保留在侧边“同步结果”树中,按双方冲突、服务器较新、本地未推送分组;用户应能连续点击不同文件查看远端/本地差异,只有主动刷新时才重新请求服务器,禁止每查看一个文件都重新执行整次检测。
226
- - 表单事件、字段事件、按钮事件等远端 Key 比对要做大小写兼容;当本地代码与远端代码相同但 mtime 晚于 meta 时,应自动刷新 meta/mtime,避免误报“本地未推送”。
207
+ - **不要**为远端空 V8 事件/按钮代码生成 `.js` 文件;`SqlJoin/SqlWhere` 属于查询配置,必须保留空文件
208
+ - **不要**用半角括号;统一用全角 `()`
209
+ - **不要**清空 V8事件/ 旧目录;保留兼容直到用户主动删除
210
+ - 文件名中 `<英文Key>` 段必须 ASCII,避免 Windows 不可见字符
211
+ - 远端 Key 若含 `\`、`/`、括号或 Windows 非法字符,文件名中的 Key 段必须使用可逆百分号编码;解析和推送时必须解码回原始 Key,禁止用 `_` 不可逆替换后误更新另一条远端记录。文件名还要处理控制字符、结尾空格/点和 `CON/PRN/AUX/NUL/COM1/LPT1` 等 Windows 保留名。
212
+ - “拉取此服务器代码”必须按接口引擎、表单引擎、模块引擎、流程引擎、数据库结构分阶段执行。某一类型失败时要记录明细并继续后续类型;同一类型内单个文件写入失败也要继续下一项,禁止首个 `ENOENT` 让整个服务器只留下半套源码。
213
+
214
+ ## 7. AI 远端修改后的同步约束
215
+
216
+ AI 使用 MCP、接口引擎、数据库脚本或平台 API 修改远端 V8 代码后,必须在任务收尾时同步本地 V8 资源树,并用“查看同步状态”或等价 dry-run 复核。
217
+
218
+ - 远端写入后以远端当前生效代码为准,回写本地文件并更新/对齐 meta 与文件 mtime。
219
+ - 覆盖范围至少包含本次 touched 的接口引擎、表单 V8 事件、字段 V8 事件、模块按钮 V8、工作流节点 V8、数据源 V8。
220
+ - 若没有插件 API 可调用,可在 `.tmp/` 编写一次性同步脚本;脚本必须先 dry-run 输出差异数量,再 apply。
221
+ - 收尾复核应确认 touched 范围没有 `changed/created/local-only` 差异;若存在差异,必须在最终回复中说明原因。
222
+ - 空 V8 代码不生成本地 `.js` 文件;同步收尾时应清理历史空文件。
223
+ - 插件“查看同步状态”不能只显示数量。若本地未推送数量大于 0,必须能列出具体资源类型、Key、名称、同步基准时间、本地修改时间和文件路径,并支持直接打开该文件。
224
+ - 接口引擎、表单引擎、模块引擎、流程引擎四个顶层分类必须分别提供行内“查看同步状态”,分类检测只请求该类型的远端数据,禁止每次强制扫描全部引擎。表单引擎范围必须同时覆盖表单 V8 事件与字段 V8 事件,模块引擎范围必须覆盖按钮 V8 与 `SqlJoin/SqlWhere`。
225
+ - 一次同步检测的结果必须持久保留在侧边“同步结果”树中,按双方冲突、服务器较新、本地未推送分组;用户应能连续点击不同文件查看远端/本地差异,只有主动刷新时才重新请求服务器,禁止每查看一个文件都重新执行整次检测。
226
+ - 表单事件、字段事件、按钮事件等远端 Key 比对要做大小写兼容;当本地代码与远端代码相同但 mtime 晚于 meta 时,应自动刷新 meta/mtime,避免误报“本地未推送”。
@@ -3,209 +3,209 @@
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
5
  <!-- microi-progressive:chunk id=v8-export-import-004 sha256=828669707ddc19320767ac4b787383136ec820deb6ad1dc861b42b5d39097677 -->
6
- ## `ExcelLayout` 高级自由布局
7
-
8
- 审批单、套打表、主子表、多级表头和复杂合并单元格不要硬塞入 `ExcelData + ExcelHeader`。改用 `ExcelLayout`:
9
-
10
- ```javascript
11
- var excelResult = V8.Office.ExportExcel({
12
- OsClient: V8.OsClient,
13
- ExcelSheets: [{
14
- SheetName: '审批单',
15
- ExcelLayout: {
16
- Cells: [
17
- // 先给整块区域统一画细网格
18
- { Range: 'A1:H10', Style: {
19
- FontName: 'Microsoft YaHei', BorderStyle: 'Thin', BorderColor: '7F8C9A',
20
- VerticalAlignment: 'Center', WrapText: true
21
- }},
22
- // 后写入的非空样式属性叠加/覆盖,可以再加标题和外框
23
- { Range: 'A1:H1', Value: '盘盈亏及报废申请表', Merge: true, Style: {
24
- Bold: true, FontSize: 18, HorizontalAlignment: 'Center',
25
- BorderTopStyle: 'Medium', BorderTopColor: '34495E'
26
- }},
27
- { Range: 'A2', Value: '序号', Style: { Bold: true }},
28
- { Range: 'G2', Value: '数量', Style: { Bold: true }},
29
- { Range: 'H2', Value: '金额', Style: { Bold: true }},
30
- { Range: 'A3', Value: 1 },
31
- { Range: 'G3', Value: 2, DataType: 'Number' },
32
- { Range: 'H3', Formula: 'G3*1200', Style: { NumberFormat: '#,##0.00' }},
33
- { Range: 'A8:G8', Value: '合计', Merge: true, Style: { Bold: true, HorizontalAlignment: 'Right' }},
34
- { Range: 'H8', Formula: 'SUM(H3:H7)', Style: { Bold: true, NumberFormat: '#,##0.00' }},
35
- { Range: 'A9:D9', Value: '(1) 申请人:张三(已电子签)', Merge: true },
36
- { Range: 'E9:H9', Value: '(2) 主管意见:同意(已电子签)', Merge: true }
37
- ],
38
- MergedRanges: [],
39
- Columns: [{ Column: 'A', Width: 9 }, { Column: 'H', Width: 16 }],
40
- Rows: [{ Row: 1, Height: 42 }, { Row: 2, Height: 32 }],
41
- RowGroups: [{ StartRow: 3, EndRow: 7, Collapsed: false }]
42
- },
43
- ExcelOptions: {
44
- ShowGridLines: false,
45
- FreezeRows: 2,
46
- FreezeColumns: 1,
47
- AutoFilterRange: 'A2:H8',
48
- PrintOrientation: 'Landscape',
49
- PaperSize: 'A4',
50
- FitToWidth: 1,
51
- PrintArea: 'A1:H10',
52
- ShowPageNumber: true
53
- }
54
- }]
55
- });
56
- ```
57
-
58
- 规则:
59
-
60
- - `Range` 使用 `A1` / `A1:K15`,不允许跨 Sheet 的 `Sheet1!A1`;`Value/Formula` 写入左上角,样式作用于全部单元格。
61
- - `Merge:true` 合并当前 `Range`;也可集中传 `MergedRanges`。不完全相同的合并区域不得重叠。
62
- - `DataType` 可传 `String/Number/Boolean/DateTime/Blank`,不传时按值推断;公式可带或不带 `=`。
63
- - `Columns` 用列字母或从 1 开始的 `Index`,支持 `Width/Hidden/AutoSize/MinWidth/MaxWidth`;`Rows.Row`、`RowGroups.StartRow/EndRow` 均从 1 开始。
64
- - 主表/子表使用 `RowGroups` 生成 Excel 原生展开/折叠行,不要只靠缩进文本模拟层级。
65
- - 先给实际数据块统一网格样式,再用小范围样式叠加标题、表头、合计和外框,可以显著减少 V8 代码重复。
66
- - 官方完整接口引擎 `export-excel-advanced-demo` 一次导出 5 Sheet,覆盖截图同款申请单、主子表、复杂合并表头、标准表格和边框样式库。
67
- - 高级布局会为覆盖区域创建真实单元格。不要对整列或百万行套样式;只配置实际使用区域,避免不必要的内存和 CPU。
68
-
69
- ### 匿名下载与 OnlyOffice 在线预览配套模式
70
-
71
- 响应文件接口本身可以同时作为浏览器下载地址和 OnlyOffice 文件源:
72
-
73
- - `export-excel-advanced-demo` 开启【响应文件】,返回 `FileName/ContentType/FileByteBase64`,可配置 `AllowAnonymous=1` 供客户直接下载。
74
- - `export-excel-advanced-demo-preview` 也开启【响应文件】和【允许匿名】,直接响应同一 `.xlsx`;它的完整 HTTP 地址可以传给 `/online-office?fileUrl=...`。V8 接口不需要先上传 HDFS,也不返回 `FileUrl/OnlineOfficePath` JSON;在线页面会调用后端安全中转,透明缓存到当前租户公有 HDFS 后再交给 OnlyOffice。
75
- - `fileUrl` 必须整体 URL 编码,同时传 `fileName`(或 `fileType`)让 OnlyOffice 确定类型。
76
- - 匿名 `fileUrl` 只能是当前平台正式 `ApiBase`,或同端口本地后端可读取的 loopback `/apiengine/...`;路径或 query 必须显式携带当前 `OsClient`,禁止接受任意外部 URL,避免 SSRF。
77
- - 开发环境传入 `localhost/127.0.0.1` 时,只允许当前同端口后端读取源接口。后端按 URL 与文件名的 SHA-256 使用确定性 `/{OsClient}/office-preview/...` 路径写入公有对象存储,Redis 共享缓存 10 分钟;OnlyOffice 使用公网 `FileServer` 地址。中转限制 50MB、不跟随重定向并校验 Office/PDF 文件头,禁止实现成任意 URL 代理。
78
- - 匿名链接只能用于可公开数据。敏感数据必须关闭匿名调用、上传私有桶,并要求登录后由 `/api/HDFS/OpenPrivateFile` 审计代理提供临时地址。
79
-
80
- 配套预览接口核心写法:
81
-
82
- ```javascript
83
- var exportResult = V8.ApiEngine.Run('export-excel-advanced-demo', {});
84
- if (!exportResult || exportResult.Code != 1 || !exportResult.Data || !exportResult.Data.FileByteBase64) {
85
- V8.Result = exportResult && exportResult.Code != 1
86
- ? exportResult
87
- : { Code: 0, Msg: 'Excel 生成失败' };
88
- return;
89
- }
90
- // 当前接口配置:AllowAnonymous=1、ResponseFile=1、StopHttp=0。
91
- V8.Result = exportResult;
92
- ```
93
-
94
- 预览 URL 形式:`/?OsClient=tenant_demo#/online-office?fileUrl=<URL编码后的接口地址>&fileName=示例.xlsx&fileType=xlsx&canEdit=0`。`canEdit` 只是编辑申请,不是授权依据;未登录时即使传 `canEdit=1` 也必须强制只读,并隐藏左侧菜单、顶部导航和页签。公网匿名文件接口应配置频率限制或让导出逻辑足够轻量,不能依赖进程内变量控制并发。
95
-
6
+ ## `ExcelLayout` 高级自由布局
7
+
8
+ 审批单、套打表、主子表、多级表头和复杂合并单元格不要硬塞入 `ExcelData + ExcelHeader`。改用 `ExcelLayout`:
9
+
10
+ ```javascript
11
+ var excelResult = V8.Office.ExportExcel({
12
+ OsClient: V8.OsClient,
13
+ ExcelSheets: [{
14
+ SheetName: '审批单',
15
+ ExcelLayout: {
16
+ Cells: [
17
+ // 先给整块区域统一画细网格
18
+ { Range: 'A1:H10', Style: {
19
+ FontName: 'Microsoft YaHei', BorderStyle: 'Thin', BorderColor: '7F8C9A',
20
+ VerticalAlignment: 'Center', WrapText: true
21
+ }},
22
+ // 后写入的非空样式属性叠加/覆盖,可以再加标题和外框
23
+ { Range: 'A1:H1', Value: '盘盈亏及报废申请表', Merge: true, Style: {
24
+ Bold: true, FontSize: 18, HorizontalAlignment: 'Center',
25
+ BorderTopStyle: 'Medium', BorderTopColor: '34495E'
26
+ }},
27
+ { Range: 'A2', Value: '序号', Style: { Bold: true }},
28
+ { Range: 'G2', Value: '数量', Style: { Bold: true }},
29
+ { Range: 'H2', Value: '金额', Style: { Bold: true }},
30
+ { Range: 'A3', Value: 1 },
31
+ { Range: 'G3', Value: 2, DataType: 'Number' },
32
+ { Range: 'H3', Formula: 'G3*1200', Style: { NumberFormat: '#,##0.00' }},
33
+ { Range: 'A8:G8', Value: '合计', Merge: true, Style: { Bold: true, HorizontalAlignment: 'Right' }},
34
+ { Range: 'H8', Formula: 'SUM(H3:H7)', Style: { Bold: true, NumberFormat: '#,##0.00' }},
35
+ { Range: 'A9:D9', Value: '(1) 申请人:张三(已电子签)', Merge: true },
36
+ { Range: 'E9:H9', Value: '(2) 主管意见:同意(已电子签)', Merge: true }
37
+ ],
38
+ MergedRanges: [],
39
+ Columns: [{ Column: 'A', Width: 9 }, { Column: 'H', Width: 16 }],
40
+ Rows: [{ Row: 1, Height: 42 }, { Row: 2, Height: 32 }],
41
+ RowGroups: [{ StartRow: 3, EndRow: 7, Collapsed: false }]
42
+ },
43
+ ExcelOptions: {
44
+ ShowGridLines: false,
45
+ FreezeRows: 2,
46
+ FreezeColumns: 1,
47
+ AutoFilterRange: 'A2:H8',
48
+ PrintOrientation: 'Landscape',
49
+ PaperSize: 'A4',
50
+ FitToWidth: 1,
51
+ PrintArea: 'A1:H10',
52
+ ShowPageNumber: true
53
+ }
54
+ }]
55
+ });
56
+ ```
57
+
58
+ 规则:
59
+
60
+ - `Range` 使用 `A1` / `A1:K15`,不允许跨 Sheet 的 `Sheet1!A1`;`Value/Formula` 写入左上角,样式作用于全部单元格。
61
+ - `Merge:true` 合并当前 `Range`;也可集中传 `MergedRanges`。不完全相同的合并区域不得重叠。
62
+ - `DataType` 可传 `String/Number/Boolean/DateTime/Blank`,不传时按值推断;公式可带或不带 `=`。
63
+ - `Columns` 用列字母或从 1 开始的 `Index`,支持 `Width/Hidden/AutoSize/MinWidth/MaxWidth`;`Rows.Row`、`RowGroups.StartRow/EndRow` 均从 1 开始。
64
+ - 主表/子表使用 `RowGroups` 生成 Excel 原生展开/折叠行,不要只靠缩进文本模拟层级。
65
+ - 先给实际数据块统一网格样式,再用小范围样式叠加标题、表头、合计和外框,可以显著减少 V8 代码重复。
66
+ - 官方完整接口引擎 `export-excel-advanced-demo` 一次导出 5 Sheet,覆盖截图同款申请单、主子表、复杂合并表头、标准表格和边框样式库。
67
+ - 高级布局会为覆盖区域创建真实单元格。不要对整列或百万行套样式;只配置实际使用区域,避免不必要的内存和 CPU。
68
+
69
+ ### 匿名下载与 OnlyOffice 在线预览配套模式
70
+
71
+ 响应文件接口本身可以同时作为浏览器下载地址和 OnlyOffice 文件源:
72
+
73
+ - `export-excel-advanced-demo` 开启【响应文件】,返回 `FileName/ContentType/FileByteBase64`,可配置 `AllowAnonymous=1` 供客户直接下载。
74
+ - `export-excel-advanced-demo-preview` 也开启【响应文件】和【允许匿名】,直接响应同一 `.xlsx`;它的完整 HTTP 地址可以传给 `/online-office?fileUrl=...`。V8 接口不需要先上传 HDFS,也不返回 `FileUrl/OnlineOfficePath` JSON;在线页面会调用后端安全中转,透明缓存到当前租户公有 HDFS 后再交给 OnlyOffice。
75
+ - `fileUrl` 必须整体 URL 编码,同时传 `fileName`(或 `fileType`)让 OnlyOffice 确定类型。
76
+ - 匿名 `fileUrl` 只能是当前平台正式 `ApiBase`,或同端口本地后端可读取的 loopback `/apiengine/...`;路径或 query 必须显式携带当前 `OsClient`,禁止接受任意外部 URL,避免 SSRF。
77
+ - 开发环境传入 `localhost/127.0.0.1` 时,只允许当前同端口后端读取源接口。后端按 URL 与文件名的 SHA-256 使用确定性 `/{OsClient}/office-preview/...` 路径写入公有对象存储,Redis 共享缓存 10 分钟;OnlyOffice 使用公网 `FileServer` 地址。中转限制 50MB、不跟随重定向并校验 Office/PDF 文件头,禁止实现成任意 URL 代理。
78
+ - 匿名链接只能用于可公开数据。敏感数据必须关闭匿名调用、上传私有桶,并要求登录后由 `/api/HDFS/OpenPrivateFile` 审计代理提供临时地址。
79
+
80
+ 配套预览接口核心写法:
81
+
82
+ ```javascript
83
+ var exportResult = V8.ApiEngine.Run('export-excel-advanced-demo', {});
84
+ if (!exportResult || exportResult.Code != 1 || !exportResult.Data || !exportResult.Data.FileByteBase64) {
85
+ V8.Result = exportResult && exportResult.Code != 1
86
+ ? exportResult
87
+ : { Code: 0, Msg: 'Excel 生成失败' };
88
+ return;
89
+ }
90
+ // 当前接口配置:AllowAnonymous=1、ResponseFile=1、StopHttp=0。
91
+ V8.Result = exportResult;
92
+ ```
93
+
94
+ 预览 URL 形式:`/?OsClient=tenant_demo#/online-office?fileUrl=<URL编码后的接口地址>&fileName=示例.xlsx&fileType=xlsx&canEdit=0`。`canEdit` 只是编辑申请,不是授权依据;未登录时即使传 `canEdit=1` 也必须强制只读,并隐藏左侧菜单、顶部导航和页签。公网匿名文件接口应配置频率限制或让导出逻辑足够轻量,不能依赖进程内变量控制并发。
95
+
96
96
  <!-- /microi-progressive:chunk -->
97
97
  <!-- microi-progressive:chunk id=v8-export-import-005 sha256=401c2cd0a4b9ea45b1709d14277cf71d74ab29dcda72d404f452a0e67b56eddc -->
98
- ## 多 Sheet Excel 导出
99
-
100
- `ExcelSheets` 中每项是一张独立工作表,可以使用 `ExcelLayout` 高级布局,也可以传 `ExcelData + ExcelHeader` 标准表格;标准表格还可传 `FormEngineKey`、查询条件等让后端自行查询。两种模式可以在同一工作簿混用。`Sheets` 是兼容别名;新代码统一使用 `ExcelSheets`。
101
-
102
- ```javascript
103
- var excelResult = V8.Office.ExportExcel({
104
- OsClient: V8.OsClient,
105
- ExcelOptions: {
106
- DefaultColumnWidth: 14,
107
- HeaderRowHeight: 28,
108
- HeaderStyle: { Bold: true, BackgroundColor: 'D9EAF7' }
109
- },
110
- ExcelSheets: [
111
- {
112
- SheetName: '订单',
113
- ExcelData: orderList,
114
- ExcelHeader: [
115
- { Name: 'OrderNo', Label: '订单号', Component: 'Text', Width: 22 },
116
- { Name: 'Amount', Label: '金额', Component: 'NumberText', Type: 'decimal', Width: 16, NumberFormat: '#,##0.00' }
117
- ],
118
- ExcelOptions: { FreezeHeader: true, AutoFilter: true }
119
- },
120
- {
121
- SheetName: '客户',
122
- ExcelData: customerList,
123
- ExcelHeader: [
124
- { Name: 'Name', Label: '客户名称', Component: 'Text', Width: 24 },
125
- { Name: 'Phone', Label: '联系电话', Component: 'Text', Width: 18 }
126
- ],
127
- ExcelOptions: { DataRowHeight: 22 }
128
- }
129
- ]
130
- });
131
- if (excelResult.Code !== 1) return excelResult;
132
-
133
- return {
134
- Code: 1,
135
- Data: {
136
- FileName: '业务数据.xlsx',
137
- ContentType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
138
- FileByteBase64: System.Convert.ToBase64String(excelResult.Data)
139
- }
140
- };
141
- ```
142
-
143
- `SheetName` 会自动处理 Excel 非法字符、31 字符上限和重名。未传 `ExcelHeader` 时,可以在每个 Sheet 中传 `TableId`、`FormEngineKey`、`_Where`、`_OrderBy`、`_PageSize` 等查询参数,并继承外层的 `OsClient`、`TableId`、`_SysMenuId` 等默认值。外层 `ExcelOptions` 也是所有 Sheet 的默认值;Sheet 内的 `ExcelOptions` 只覆盖已传属性。
144
-
145
- 图片列:`ImgUpload.Multiple=1` 会按最大图片数展开为多列并合并表头;列上的 `Width` 会应用到每个展开列,`DataRowHeight/RowHeight` 控制图片行高。自动列宽会遍历单元格,大批量导出不要对所有列盲目开启。
146
-
98
+ ## 多 Sheet Excel 导出
99
+
100
+ `ExcelSheets` 中每项是一张独立工作表,可以使用 `ExcelLayout` 高级布局,也可以传 `ExcelData + ExcelHeader` 标准表格;标准表格还可传 `FormEngineKey`、查询条件等让后端自行查询。两种模式可以在同一工作簿混用。`Sheets` 是兼容别名;新代码统一使用 `ExcelSheets`。
101
+
102
+ ```javascript
103
+ var excelResult = V8.Office.ExportExcel({
104
+ OsClient: V8.OsClient,
105
+ ExcelOptions: {
106
+ DefaultColumnWidth: 14,
107
+ HeaderRowHeight: 28,
108
+ HeaderStyle: { Bold: true, BackgroundColor: 'D9EAF7' }
109
+ },
110
+ ExcelSheets: [
111
+ {
112
+ SheetName: '订单',
113
+ ExcelData: orderList,
114
+ ExcelHeader: [
115
+ { Name: 'OrderNo', Label: '订单号', Component: 'Text', Width: 22 },
116
+ { Name: 'Amount', Label: '金额', Component: 'NumberText', Type: 'decimal', Width: 16, NumberFormat: '#,##0.00' }
117
+ ],
118
+ ExcelOptions: { FreezeHeader: true, AutoFilter: true }
119
+ },
120
+ {
121
+ SheetName: '客户',
122
+ ExcelData: customerList,
123
+ ExcelHeader: [
124
+ { Name: 'Name', Label: '客户名称', Component: 'Text', Width: 24 },
125
+ { Name: 'Phone', Label: '联系电话', Component: 'Text', Width: 18 }
126
+ ],
127
+ ExcelOptions: { DataRowHeight: 22 }
128
+ }
129
+ ]
130
+ });
131
+ if (excelResult.Code !== 1) return excelResult;
132
+
133
+ return {
134
+ Code: 1,
135
+ Data: {
136
+ FileName: '业务数据.xlsx',
137
+ ContentType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
138
+ FileByteBase64: System.Convert.ToBase64String(excelResult.Data)
139
+ }
140
+ };
141
+ ```
142
+
143
+ `SheetName` 会自动处理 Excel 非法字符、31 字符上限和重名。未传 `ExcelHeader` 时,可以在每个 Sheet 中传 `TableId`、`FormEngineKey`、`_Where`、`_OrderBy`、`_PageSize` 等查询参数,并继承外层的 `OsClient`、`TableId`、`_SysMenuId` 等默认值。外层 `ExcelOptions` 也是所有 Sheet 的默认值;Sheet 内的 `ExcelOptions` 只覆盖已传属性。
144
+
145
+ 图片列:`ImgUpload.Multiple=1` 会按最大图片数展开为多列并合并表头;列上的 `Width` 会应用到每个展开列,`DataRowHeight/RowHeight` 控制图片行高。自动列宽会遍历单元格,大批量导出不要对所有列盲目开启。
146
+
147
147
  <!-- /microi-progressive:chunk -->
148
148
  <!-- microi-progressive:chunk id=v8-export-import-006 sha256=1a74f8359e67ca4b270de414000f8416a7564c1595189c091281d0fea6dd4a45 -->
149
- ## Word 导出
150
-
151
- 新代码使用对象参数的 `ExportWord`;`ExportWordText` 继续保留,只用于兼容旧版纯文本场景。Word 的页面边距、图片宽高单位为厘米,字体大小单位为磅。
152
-
153
- ```javascript
154
- var wordResult = V8.Office.ExportWord({
155
- Title: '月度经营报告',
156
- Subtitle: DateNow('yyyy年MM月'),
157
- Author: V8.CurrentUser.Name,
158
- Subject: '经营分析',
159
- Keywords: '经营,月报',
160
- PageSize: 'A4', // A4 | Letter
161
- Orientation: 'Portrait', // Portrait | Landscape
162
- MarginTop: 2.2,
163
- MarginRight: 2.0,
164
- MarginBottom: 2.2,
165
- MarginLeft: 2.0,
166
- FontFamily: 'Microsoft YaHei',
167
- FontSize: 10.5,
168
- TitleFontSize: 20,
169
- HeaderText: '吾码经营中心',
170
- FooterText: '内部资料',
171
- ShowPageNumber: true,
172
- Paragraphs: [
173
- { Text: '本月经营情况总体稳定。', FirstLineIndent: 0.74 },
174
- { Text: '以下数据未经授权不得外传。', Bold: true, FontColor: 'C00000' }
175
- ],
176
- Sections: [{
177
- Heading: '一、核心指标',
178
- HeadingLevel: 1,
179
- Content: '本节展示主要经营指标。',
180
- Tables: [{
181
- Title: '指标明细',
182
- Headers: ['指标', '本月', '同比'],
183
- Rows: [['销售额', 1280000, '12.5%'], ['订单数', 860, '8.1%']],
184
- ColumnWidths: [4, 4, 4],
185
- HeaderBackgroundColor: 'D9EAF7'
186
- }]
187
- }],
188
- Images: [{
189
- FileByteBase64: chartBase64, // 支持纯 Base64 或 data URI
190
- FileName: 'chart.png',
191
- ContentType: 'image/png',
192
- Width: 15,
193
- Height: 8,
194
- Alignment: 'Center',
195
- Caption: '图 1:趋势分析'
196
- }]
197
- });
198
- if (wordResult.Code !== 1) return wordResult;
199
- return {
200
- Code: 1,
201
- Data: {
202
- FileName: '月度经营报告.docx',
203
- ContentType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
204
- FileByteBase64: System.Convert.ToBase64String(wordResult.Data)
205
- }
206
- };
207
- ```
208
-
209
- 段落支持 `Text/Alignment/Bold/Italic/Underline/FontFamily/FontSize/FontColor/SpacingBefore/SpacingAfter/LineSpacing/FirstLineIndent/PageBreakBefore`。章节支持 `Heading/HeadingLevel/Content/Paragraphs/Tables/Images/PageBreakBefore`;表格支持 `Headers/Rows/ColumnWidths/Alignment/HeaderBold/HeaderBackgroundColor/HeaderFontColor/BorderColor/FontSize`。
210
-
149
+ ## Word 导出
150
+
151
+ 新代码使用对象参数的 `ExportWord`;`ExportWordText` 继续保留,只用于兼容旧版纯文本场景。Word 的页面边距、图片宽高单位为厘米,字体大小单位为磅。
152
+
153
+ ```javascript
154
+ var wordResult = V8.Office.ExportWord({
155
+ Title: '月度经营报告',
156
+ Subtitle: DateNow('yyyy年MM月'),
157
+ Author: V8.CurrentUser.Name,
158
+ Subject: '经营分析',
159
+ Keywords: '经营,月报',
160
+ PageSize: 'A4', // A4 | Letter
161
+ Orientation: 'Portrait', // Portrait | Landscape
162
+ MarginTop: 2.2,
163
+ MarginRight: 2.0,
164
+ MarginBottom: 2.2,
165
+ MarginLeft: 2.0,
166
+ FontFamily: 'Microsoft YaHei',
167
+ FontSize: 10.5,
168
+ TitleFontSize: 20,
169
+ HeaderText: '吾码经营中心',
170
+ FooterText: '内部资料',
171
+ ShowPageNumber: true,
172
+ Paragraphs: [
173
+ { Text: '本月经营情况总体稳定。', FirstLineIndent: 0.74 },
174
+ { Text: '以下数据未经授权不得外传。', Bold: true, FontColor: 'C00000' }
175
+ ],
176
+ Sections: [{
177
+ Heading: '一、核心指标',
178
+ HeadingLevel: 1,
179
+ Content: '本节展示主要经营指标。',
180
+ Tables: [{
181
+ Title: '指标明细',
182
+ Headers: ['指标', '本月', '同比'],
183
+ Rows: [['销售额', 1280000, '12.5%'], ['订单数', 860, '8.1%']],
184
+ ColumnWidths: [4, 4, 4],
185
+ HeaderBackgroundColor: 'D9EAF7'
186
+ }]
187
+ }],
188
+ Images: [{
189
+ FileByteBase64: chartBase64, // 支持纯 Base64 或 data URI
190
+ FileName: 'chart.png',
191
+ ContentType: 'image/png',
192
+ Width: 15,
193
+ Height: 8,
194
+ Alignment: 'Center',
195
+ Caption: '图 1:趋势分析'
196
+ }]
197
+ });
198
+ if (wordResult.Code !== 1) return wordResult;
199
+ return {
200
+ Code: 1,
201
+ Data: {
202
+ FileName: '月度经营报告.docx',
203
+ ContentType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
204
+ FileByteBase64: System.Convert.ToBase64String(wordResult.Data)
205
+ }
206
+ };
207
+ ```
208
+
209
+ 段落支持 `Text/Alignment/Bold/Italic/Underline/FontFamily/FontSize/FontColor/SpacingBefore/SpacingAfter/LineSpacing/FirstLineIndent/PageBreakBefore`。章节支持 `Heading/HeadingLevel/Content/Paragraphs/Tables/Images/PageBreakBefore`;表格支持 `Headers/Rows/ColumnWidths/Alignment/HeaderBold/HeaderBackgroundColor/HeaderFontColor/BorderColor/FontSize`。
210
+
211
211
  <!-- /microi-progressive:chunk -->