@microi.net/cli 5.8.5 → 5.8.6

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 (211) 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/.mcp.json +1 -1
  5. package/.workbuddy-plugin/marketplace.json +2 -2
  6. package/.workbuddy-plugin/plugin.json +1 -1
  7. package/LICENSE +21 -21
  8. package/README.md +71 -71
  9. package/assets/build-meta.json +6 -6
  10. package/assets/feature-matrix.json +138 -138
  11. package/assets/logo.svg +4 -4
  12. package/cordis.patch.yml +1 -1
  13. package/package.json +1 -1
  14. package/scripts/codex-marketplace.json +20 -20
  15. package/scripts/mcp-codex-stdio-adapter.js +189 -189
  16. package/scripts/mcp-trae-windows-launcher.cmd +21 -21
  17. package/scripts/microi-cli-mcp.js +7 -7
  18. package/scripts/microi-cli.js +66 -65
  19. package/scripts/microi-codex-broker.js +450 -450
  20. package/scripts/microi-codex-router.js +618 -618
  21. package/scripts/microi-skills.meta.json +384 -384
  22. package/skills/.microi-skills-version.json +2 -2
  23. package/skills/.progressive-disclosure-manifest.json +3566 -3566
  24. package/skills/README.md +287 -287
  25. package/skills/ai-engine/SKILL.md +269 -265
  26. package/skills/ai-engine/agents/openai.yaml +4 -4
  27. package/skills/ai-engine/references/ai-employees.md +48 -48
  28. package/skills/ai-engine/references/self-hosted-digital-human.md +59 -59
  29. package/skills/ai-platform-governance/SKILL.md +177 -177
  30. package/skills/ai-platform-governance/references/progressive-01-/345/212/237/350/203/275/345/274/200/345/205/263.md +190 -190
  31. package/skills/app-store/SKILL.md +525 -525
  32. package/skills/app-store/agents/openai.yaml +4 -4
  33. package/skills/business-blueprint/SKILL.md +193 -193
  34. package/skills/datasource-engine/SKILL.md +93 -93
  35. package/skills/datasource-engine/agents/openai.yaml +4 -4
  36. package/skills/dos-orm/SKILL.md +97 -97
  37. package/skills/dos-orm/references/api-reference.md +229 -229
  38. package/skills/email-engine/SKILL.md +81 -81
  39. package/skills/email-engine/references/v8-email.md +34 -34
  40. package/skills/job-engine/SKILL.md +176 -176
  41. package/skills/job-engine/agents/openai.yaml +4 -4
  42. package/skills/message-notification/SKILL.md +156 -156
  43. package/skills/message-notification/agents/openai.yaml +5 -5
  44. package/skills/message-notification/references/contracts.md +102 -102
  45. package/skills/microi/SKILL.md +14 -14
  46. package/skills/microi-ai-app-auth.js +652 -652
  47. package/skills/microi-ai-application/SKILL.md +115 -115
  48. package/skills/microi-ai-application/agents/openai.yaml +4 -4
  49. package/skills/microi-ai-application/references/frontend-baseline.md +164 -164
  50. package/skills/microi-client-frontend/SKILL.md +244 -244
  51. 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 +144 -144
  52. 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 +196 -196
  53. 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 +167 -167
  54. package/skills/microi-codex/SKILL.md +102 -102
  55. package/skills/microi-codex-installer/SKILL.md +231 -231
  56. package/skills/microi-codex-installer/agents/openai.yaml +7 -7
  57. package/skills/microi-datasource-mapping/SKILL.md +122 -122
  58. package/skills/microi-db-schema/SKILL.md +175 -175
  59. package/skills/microi-db-schema/agents/openai.yaml +4 -4
  60. package/skills/microi-db-schema/references/core-tables.md +695 -695
  61. package/skills/microi-db-schema/references/form-component-options.md +256 -256
  62. package/skills/microi-db-schema/references/schema-overview.md +202 -202
  63. package/skills/microi-db-schema/references/schema.md +646 -646
  64. package/skills/microi-db-schema/references/table-catalog.md +1599 -1599
  65. package/skills/microi-deployment/SKILL.md +221 -221
  66. package/skills/microi-deployment/references/deployment-matrix.md +109 -109
  67. package/skills/microi-docs-coverage/SKILL.md +133 -133
  68. package/skills/microi-docs-coverage/references/capability-map.md +91 -91
  69. package/skills/microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs +894 -894
  70. package/skills/microi-form-engine/SKILL.md +333 -333
  71. package/skills/microi-form-engine/references/component-catalog.md +218 -218
  72. package/skills/microi-form-engine/references/data-source-events.md +124 -124
  73. package/skills/microi-form-layout/SKILL.md +205 -205
  74. 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
  75. package/skills/microi-frontend-sdk/SKILL.md +194 -194
  76. 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 +176 -176
  77. package/skills/microi-left-right-layout/SKILL.md +141 -141
  78. package/skills/microi-microservice/SKILL.md +326 -324
  79. package/skills/microi-microservice/references/runtime-delivery.md +278 -278
  80. package/skills/microi-mobile-app-quality/SKILL.md +185 -185
  81. 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
  82. package/skills/microi-mobile-app-quality/references/progressive-02-9-/344/270/273/351/242/230/345/210/207/346/215/242/345/277/205/351/241/273/347/234/237/345/256/236/344/270/224/345/205/250/345/261/200/347/224/237/346/225/210.md +128 -128
  83. package/skills/microi-solution-quotation/SKILL.md +78 -78
  84. package/skills/microi-solution-quotation/agents/openai.yaml +4 -4
  85. package/skills/microi-solution-quotation/scripts/build_solution_quote.py +296 -296
  86. package/skills/microi-sso/SKILL.md +92 -92
  87. package/skills/microi-sso/references/acceptance.md +49 -49
  88. package/skills/microi-sso/references/configuration-and-security.md +53 -53
  89. package/skills/microi-sso/references/inbound.md +53 -53
  90. package/skills/microi-sso/references/outbound.md +39 -39
  91. package/skills/microi-system-delivery/SKILL.md +137 -137
  92. package/skills/microi-system-delivery/references/progressive-01-/346/240/207/345/207/206/345/267/245/344/275/234/346/265/201.md +193 -193
  93. 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 +217 -217
  94. package/skills/microi-ui/SKILL.md +192 -192
  95. package/skills/microi-ui/references/progressive-01-/347/247/273/345/212/250/347/253/257/345/234/272/346/231/257/350/223/235/345/233/276.md +183 -183
  96. package/skills/microi-uniapp-frontend/SKILL.md +193 -193
  97. 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 +225 -225
  98. 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 +154 -154
  99. package/skills/microi.v8.js +1921 -1921
  100. package/skills/module-engine/SKILL.md +255 -255
  101. package/skills/module-engine/references/module-config.md +204 -204
  102. package/skills/ocr-engine/SKILL.md +113 -113
  103. package/skills/ocr-engine/agents/openai.yaml +4 -4
  104. package/skills/page-engine/SKILL.md +206 -206
  105. package/skills/page-engine/examples/compact-dashboard.json +1444 -1444
  106. 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 +234 -234
  107. 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 +60 -60
  108. package/skills/performance-testing/SKILL.md +221 -221
  109. package/skills/playwright-e2e/SKILL.md +196 -196
  110. 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 +173 -173
  111. 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 +183 -183
  112. package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +221 -221
  113. package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +115 -115
  114. package/skills/print-engine/SKILL.md +259 -259
  115. package/skills/production-readonly-audit/SKILL.md +41 -41
  116. package/skills/report-engine/SKILL.md +71 -71
  117. package/skills/report-engine/agents/openai.yaml +4 -4
  118. package/skills/scripts/optimize-progressive-disclosure.mjs +204 -204
  119. package/skills/scripts/refresh-progressive-disclosure.mjs +64 -64
  120. package/skills/scripts/sync-embedded-skills.mjs +46 -46
  121. package/skills/scripts/validate-progressive-disclosure.mjs +57 -57
  122. package/skills/search-engine/SKILL.md +75 -75
  123. package/skills/search-engine/agents/openai.yaml +4 -4
  124. package/skills/spider-engine/SKILL.md +190 -190
  125. package/skills/system-observability/SKILL.md +248 -248
  126. package/skills/system-observability/references/memory-incident-triage.md +77 -77
  127. package/skills/translate-engine/SKILL.md +140 -140
  128. package/skills/translate-engine/agents/openai.yaml +4 -4
  129. package/skills/ui-design/SKILL.md +223 -223
  130. package/skills/ui-design/assets/pattern-showcase/app.js +54 -54
  131. package/skills/ui-design/assets/pattern-showcase/index.html +163 -163
  132. package/skills/ui-design/assets/pattern-showcase/styles.css +311 -311
  133. package/skills/ui-design/assets/templates/MCI-DESIGN.md +206 -206
  134. package/skills/ui-design/references/design-pattern-library.md +184 -184
  135. package/skills/ui-design/references/mci-design-contract.md +163 -163
  136. package/skills/ui-design/references/motion-and-media.md +78 -78
  137. package/skills/ui-design/references/product-flow-recipes.md +94 -94
  138. package/skills/ui-design/references/progressive-01-/351/242/234/350/211/262/344/275/223/347/263/273-css-variables-/346/224/257/346/214/201/344/270/273/351/242/230/345/210/207/346/215/242.md +218 -218
  139. package/skills/ui-design/references/progressive-02-/345/255/227/344/275/223.md +164 -164
  140. package/skills/ui-design/references/progressive-03-/345/212/250/346/225/210/350/247/204/350/214/203-/344/270/260/345/257/214/344/275/206/344/270/215/345/215/241.md +235 -235
  141. package/skills/ui-design/references/progressive-04-/347/273/204/344/273/266/351/243/216/346/240/274/351/200/237/346/237/245.md +152 -152
  142. package/skills/ui-design/references/progressive-05-/347/247/273/345/212/250/347/253/257/344/270/223/347/224/250/350/247/204/350/214/203.md +238 -238
  143. package/skills/ui-design/references/progressive-06-/344/270/273/351/242/230/345/210/207/346/215/242/345/256/236/347/216/260.md +194 -194
  144. package/skills/ui-design/references/progressive-07-/351/200/237/346/237/245-/344/273/216/345/244/264/346/220/255/345/273/272/344/270/200/344/270/252/347/247/273/345/212/250/347/253/257/351/241/265/351/235/242.md +207 -207
  145. package/skills/ui-design/references/progressive-08-/350/241/250/345/215/225/345/210/206/347/273/204/350/247/204/350/214/203-tabs-vs-collapsegroup-/345/274/272/345/210/266.md +142 -142
  146. package/skills/uniapp-mall-assets/SKILL.md +176 -176
  147. package/skills/unity-integration/SKILL.md +171 -171
  148. package/skills/unity-integration/agents/openai.yaml +4 -4
  149. package/skills/unity-integration/references/ai-app-delivery.md +119 -119
  150. package/skills/unity-integration/references/sdk-api.md +82 -82
  151. package/skills/unity-integration/references/toolbox-migration.md +66 -66
  152. package/skills/unity-integration/references/webgl-hosting.md +57 -57
  153. package/skills/v8-api-config/SKILL.md +388 -388
  154. package/skills/v8-cache-pattern/SKILL.md +312 -312
  155. package/skills/v8-crud-api/SKILL.md +178 -178
  156. 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 +226 -226
  157. package/skills/v8-crud-api/references/progressive-02-where-/346/235/241/344/273/266/350/257/255/346/263/225/351/200/237/346/237/245.md +49 -49
  158. package/skills/v8-debugging/SKILL.md +284 -284
  159. package/skills/v8-explorer-tree/SKILL.md +228 -228
  160. package/skills/v8-export-import/SKILL.md +219 -219
  161. 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 +211 -211
  162. package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md +202 -202
  163. 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 +42 -42
  164. package/skills/v8-file-upload/SKILL.md +284 -284
  165. 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 +263 -263
  166. 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 +161 -161
  167. package/skills/v8-formengine-http/SKILL.md +238 -238
  168. package/skills/v8-frontend-events/SKILL.md +180 -180
  169. package/skills/v8-frontend-events/references/bluetooth-print-api.md +135 -135
  170. package/skills/v8-frontend-events/references/bluetooth-print.md +258 -258
  171. package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +219 -219
  172. package/skills/v8-http-integration/SKILL.md +182 -182
  173. package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md +220 -220
  174. 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 +44 -44
  175. package/skills/v8-image-processing/SKILL.md +190 -190
  176. package/skills/v8-image-processing/agents/openai.yaml +4 -4
  177. package/skills/v8-image-processing/references/api-reference.md +623 -623
  178. package/skills/v8-menu-buttons/SKILL.md +186 -186
  179. package/skills/v8-menu-buttons/references/progressive-01-2-/346/214/211/351/222/256/345/257/271/350/261/241-schema.md +222 -222
  180. 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
  181. 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 +104 -104
  182. package/skills/v8-mongodb/SKILL.md +200 -200
  183. package/skills/v8-mq-mqtt/SKILL.md +176 -176
  184. package/skills/v8-mq-mqtt/references/mqtt-production.md +342 -342
  185. package/skills/v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-/347/211/251/350/201/224/347/275/221.md +181 -181
  186. package/skills/v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs +203 -203
  187. package/skills/v8-saas-multi-tenant/SKILL.md +305 -305
  188. package/skills/v8-security/SKILL.md +210 -210
  189. package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +200 -200
  190. package/skills/v8-security/references/progressive-02-7-/346/227/245/345/277/227/350/256/260/345/275/225.md +160 -160
  191. package/skills/v8-sql-query/SKILL.md +302 -302
  192. package/skills/v8-table-event/SKILL.md +176 -176
  193. 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 +216 -216
  194. 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 +46 -46
  195. package/skills/v8-tcp-integration/SKILL.md +147 -147
  196. package/skills/v8-tcp-integration/agents/openai.yaml +4 -4
  197. package/skills/v8-template-engine/SKILL.md +167 -167
  198. package/skills/v8-utilities/SKILL.md +104 -104
  199. package/skills/v8-utilities/references/client-api-index.md +143 -143
  200. package/skills/v8-utilities/references/platform-http-routes.md +83 -83
  201. package/skills/v8-utilities/references/server-api-index.md +188 -188
  202. package/skills/v8-workflow/SKILL.md +252 -252
  203. package/skills/v8-workflow/references/progressive-01-/350/212/202/347/202/271/345/274/200/345/247/213-v8-/344/272/213/344/273/266.md +180 -180
  204. package/skills/v8-workflow/references/workflow-configuration.md +49 -49
  205. package/skills/vision-engine/SKILL.md +160 -160
  206. package/skills/vision-engine/agents/openai.yaml +4 -4
  207. package/skills/vision-engine/references/architecture-and-acceptance.md +194 -194
  208. package/skills/workspace-conventions/SKILL.md +273 -273
  209. 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 +209 -209
  210. 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 +217 -217
  211. 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 +27 -27
@@ -1,252 +1,252 @@
1
- ---
2
- name: v8-workflow
3
- description: Microi V8 工作流事件指南。用于编写审批流条件、节点 V8 代码、wf_flowdesign/wf_node/wf_line 逻辑、V8.WF 变量和工作流路由。
4
- ---
5
-
6
- > **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
7
-
8
- # Microi V8 工作流事件开发
9
-
10
- ## AI / MCP 生成流程的必检契约
11
-
12
- 这里的流程是 `wf_flowdesign + wf_node + wf_line` 审批引擎,不是 `ai-workflow`。
13
- 先用 `microi_get_db_schema` 查询 `wf_flowdesign`、`wf_node`、`wf_line`、
14
- `sys_menu` 与目标业务表,再用 `microi_list_roles` 或管理员只读表查询确认当前租户的
15
- 真实用户、角色、部门、岗位 Id。人工节点 `Approve/Countersign/End` 必须配置
16
- `Users/Roles/Depts/BindJobs` 至少一种真实 `[{"Id":"...","Name":"..."}]`
17
- 绑定,或明确采用上游节点 `AllowSelectUsers=1` 手动选人。
18
- 应用安装母版可显式设置 `FlowDesign.IsEnable=0`(也接受字符串 `"0"`),
19
- 此时人工节点允许空绑定并保持禁用;`false/null/空字符串/省略` 不属于该例外。
20
- 禁用模板仍检查所有节点、连线、坐标及绑定格式,任何非空人员、角色、部门或岗位
21
- 仍必须通过当前租户真实 Id 回读。不得填入 `UNBOUND_*` 等不存在的占位 Id。
22
- 目标租户配置真实审批人后,应先重新检查再显式启用,并验收真实业务流转;
23
- 禁用模板保存成功只证明安装结构完整,不能当作审批已可用或商业交付完成。
24
- `SameDeptApprove=1` 只筛选候选人,不能单独产生审批人。
25
- 不能把 `Roles:"Manager"`、字符串 Id 数组或另一个租户的 Id 当作绑定。
26
-
27
- 节点类型只使用 `Start/Auto/Business/Approve/Countersign/End/AutoEnd`;
28
- `End` 是人工节点,自动结束用 `AutoEnd`。每个节点应有稳定 Id;
29
- `PositionLeft/PositionTop` 使用像素(如 `"320px"`)。新版 MCP 对缺失坐标按
30
- 拓扑层级布局并补 `px`,明确重叠、非法类型、断线、不可达、无人审批会在写入前失败。
31
- 节点人员绑定在写入时仅保留 `Id/Name`,不能把完整 `sys_user` 记录及密码字段嵌入流程。
32
- MCP 写入前会回读当前租户的用户、角色、部门和岗位 Id;回读失败或 Id 不存在时停止保存。
33
-
34
- 模块入口使用 `sys_menu.OpenType="WorkFlow"`、`FlowDesignId=<已启用流程真实 Id>`,
35
- `DiyTableId` 与 `wf_flowdesign.TableId` 相同。完整 Manifest 内可用模块
36
- `flowName` 指向同一份 `workflows[].FlowDesign.FlowName`,生成器保存流程后补写并回读
37
- `FlowDesignId`;引用既有流程时传 `flowDesignId`。上线前从模块打开并发起一条真实
38
- 业务记录,确认流程图节点、人员待办、审批、历史与模块入口均正确。
39
-
40
- 全部配置字段、节点类型和运行操作见
41
- [流程配置清单](references/workflow-configuration.md)。
42
-
43
- 你正在开发 Microi 吾码平台的工作流(审批流程)V8 事件。流程引擎基于表单引擎,通过 V8 事件控制审批逻辑。
44
-
45
- ## 后端类库与接口边界
46
-
47
- - 工作流运行时固定属于独立 `Microi.WorkFlow` 类库;`Microi.net.Api` 只注册 `AddMicroiWorkFlow()`,不得恢复 `WorkFlowController` 或把流程业务写回 `Program.cs`。
48
- - 对外与旧移动端路由统一由官方 Managed `platform-workflow` 接口引擎承载,历史 `/api/WorkFlow/*` 地址写入同一记录的 `ApiRoutes`。租户个性化逻辑写在 CreateIfMissing `platform-workflow-custom-hook`,默认只返回 `{ Code: 1 }`。
49
- - `Microi.Core` 只保留避免循环引用所需的 `IWFEngine`、模型和最小运行时合同;发起、审批、撤回、移交、退回及审批人计算实现在 `Microi.WorkFlow`,并按职责拆分 partial 文件。
50
- - 新业务规则仍优先写工作流 V8/接口引擎。只有事务、流程状态机、可信当前用户和运行时内核缺少不可伪造的底层原子时,才扩展 `Microi.WorkFlow`。
51
- - 官方发布时 `Microi.WorkFlow` 必须生成 NuGet 包,并与 `Microi.AI` 使用同一 Obfuscar 配置加密后替换包内 DLL;不得推送未加密的 WorkFlow 包。开源安装只消费 NuGet,不要求存在私有源码。
52
-
53
- <!-- microi-progressive:begin -->
54
- <!-- microi-progressive:chunk id=v8-workflow-000 sha256=bd13a63ee55b2a01041fc2e080ca06ab2fbfd3146fa130811061c9f9e8b4cf84 -->
55
- ## 本地优先与版本头(必做)
56
-
57
- 工作流节点、连线条件、开始/结束节点等 V8 代码如果有本地文件,必须优先修改 `microi-v8-engine/<租户>/<项目>/...` 下的本地文件,再同步到数据库。插件提示本地/远端不一致时,先比对并合并,不得直接覆盖。
58
-
59
- 每次修改、上传、推送工作流 V8 事件代码,都要维护顶部版本区域。版本号从 `v1.0.0` 开始;每次上传/推送/修改递增 1;补丁位和次版本位最大为 9 并向前进位(`v1.0.9 -> v1.1.0`、`v1.9.9 -> v2.0.0`、`v9.9.9 -> v10.0.0`)。代码头只写完整功能说明,不写修改历史、时间戳或 ChangeLog。
60
-
61
- ```javascript
62
- /*
63
- * V8 工作流
64
- * WorkflowKey: 示例流程Key
65
- * EventType: WFNodeLine/WFNodeStart/WFNodeEnd
66
- * Version: v1.0.0
67
- * 功能说明:
68
- * - 完整说明该工作流 V8 控制的节点动作、路线条件、审批变量和副作用。
69
- */
70
- ```
71
-
72
- 保存工作流包前要先跑拓扑/条件检查;保存后用样例表单数据测试至少一条会经过该 V8 的路线。
73
-
74
- 生成工作流 V8 代码时,代码内容本身(文件头、普通注释、`console.log`、返回 `Msg` 等)不要包含 `Microi`、`吾码` 等平台品牌文字,除非业务数据或字段值本身必须如此。生成代码要有可维护注释:每个 `function` 前写清用途、关键参数和返回值;路线选择、审批人计算、状态回写、撤回/驳回处理、跨表联动等复杂代码段前写短注释说明业务原因;避免“给变量赋值”这类无信息量注释。若工作流存储表支持 `Version`/`ChangeHistory`,历史说明也必须最新在前并保留旧记录。
75
-
76
- <!-- /microi-progressive:chunk -->
77
- <!-- microi-progressive:chunk id=v8-workflow-001 sha256=935b29e9f3afde02aa78a77468b48afd204facb3b1dafaf9d23dc3bd69832717 -->
78
- ## 工作流物理表
79
-
80
- | 表名 | 说明 |
81
- |------|------|
82
- | `wf_flowdesign` | 流程设计(流程定义) |
83
- | `wf_node` | 流程节点 |
84
- | `wf_line` | 节点间连线/条件 |
85
- | `wf_flow` | 流程实例(一次发起对应一行) |
86
- | `wf_work` | 待办/已办工作 |
87
- | `wf_history` | 审批历史(每次同意/拒绝/撤回的记录) |
88
-
89
- ### 原生人员、自动结束与取消快照契约
90
-
91
- - `wf_node.Users` 是 JSON 序列化的 `IdName` 对象数组,例如 `[{"Id":"<user-id>","Name":"审核人"}]`;不能保存为字符串 Id 数组。`Name` 仅供显示,业务授权仍须按当前主库用户、角色和实际待办接收人判断。前端 `V8.WF.ForceSelectUsers` 的字符串数组是另一份 API 契约,不能混用。
92
- - 自动结束节点的 `NodeType` 使用 `AutoEnd`。它可能继承上一人工节点的 `ApprovalType=Agree`,并生成一条结束历史;核对独立审批人数时只计入明确配置的人工节点,不能把结束节点当成额外审核人。
93
- - 原生 `CancelFlow` 可将请求中的 `FormData` 写回 `wf_flow.FormData`;未传时可能保存 `{}`。应用不能把取消后的实例 `FormData` 当成不可变的原始提交快照。需要恢复冻结业务单时,优先核对业务表保存的服务端快照摘要;若使用原生历史,必须限定同一实例、同一业务表/行、唯一原始开始节点及发起人、自动提交历史,并检查版本、金额、配置摘要和零待办。此分支只能恢复草稿或驳回状态,不能据此批准或过账。
94
- - 当前 `CancelFlow(WFParam)` 使用独立事务,没有 `StartWork/SendWork` 的共享 `DbTrans` 重载。应用不得在持有实例、工作或业务行锁的接口事务内调用取消,也不能假设给它多传一个参数便会共享事务。微服务可顺序执行“服务端核验并返回真实待办坐标 → 原生取消 → 业务终态复核”,每个请求完成后释放其事务;网络结果未知时先复核终态,不能盲目重发取消或提前恢复业务状态。
95
- - 业务接口与原生节点共同读取配置、公共引用和业务行时,先画出宿主与脚本合并的锁图。原生审批进入节点前可能已持有流程实例锁;既存流程的业务复核应先通过当前主库有界只读发现真实实例,再在同一共享事务锁定该实例,随后获取固定配置/引用锁及业务行锁,重读验证归属未变。待办发现扫描只读不能提前锁工作行后再等流程;公共引用围栏只协调锁序,不能读取配置值来继承授权。必须逐入口审查包括定义、身份与配置的相反锁序,不以一条 SQL 或单次模拟成功宣称全系统无死锁。
96
- - 已由可信原生历史证明取消或驳回的终态恢复只校验原提交归属、当前授权和可恢复状态,不应要求审批期间未发生正常库存、成本或其他业务余额变化;此恢复不产生过账副作用。批准与过账仍必须严格比较冻结快照、当前期间及业务版本,并覆盖撤权、并发和响应未知时使用原请求键恢复。
97
- - 真实原生多接收人流程中的 `OtherDone` 只表示同阶段并列待办被 `CloseOtherWork` 关闭,不是该接收人已经审批。仅在同实体/实例/定义/审批节点/来源节点与唯一真实 `Agree` + `Done` 工作精确绑定,接收人不同于实际办理人,且没有该并列工作办理历史时,才能作为终态旁证;不能把它计作独立审核人。开始提交、实际人工审批仍必须 `Done`,未知节点、待办、撤回、取消、重复历史或模糊绑定失败关闭。覆盖真实五工作(3 `Done`、2 `OtherDone`)原生来源及新稿/原键恢复,不能靠把状态统一映射为 `Done` 通过。
98
- - 验收至少覆盖真实取消时不传 `FormData`、伪造取消载荷、退回后直接重提被拒绝、取消后新实例重提、自动结束继承 `Agree`,以及普通角色不能修改取证用的流程历史。模拟正确 JSON 不替代原生 HTTP 验收。
99
-
100
- 直接 SQL 查询常用场景:
101
-
102
- ```javascript
103
- // 我的待办
104
- var todo = V8.Db.FromSql(
105
- 'SELECT Id, FlowId, NodeId, FlowTitle, WorkState, ReceiverId, TableRowId FROM wf_work WHERE ReceiverId = @p0 AND WorkState = @p1 ORDER BY CreateTime DESC'
106
- ).AddInParameter("@p0", V8.CurrentUser.Id)
107
- .AddInParameter("@p1", 'Todo')
108
- .ToArray();
109
-
110
- // 我发起的
111
- var mine = V8.Db.FromSql(
112
- 'SELECT Id, FlowTitle, FlowState, SenderId, TableRowId FROM wf_flow WHERE SenderId = @p0 ORDER BY CreateTime DESC'
113
- ).AddInParameter("@p0", V8.CurrentUser.Id)
114
- .ToArray();
115
-
116
- // 流程历史
117
- var history = V8.Db.FromSql(
118
- 'SELECT * FROM wf_history WHERE FlowId = @p0 ORDER BY CreateTime ASC'
119
- ).AddInParameter("@p0", V8.Param.flowId)
120
- .ToArray();
121
- ```
122
-
123
- <!-- /microi-progressive:chunk -->
124
- <!-- microi-progressive:chunk id=v8-workflow-002 sha256=38a77bbee9ea30f036a9d9ef7150e2a738f4533dc9f05c23a3d00ff86aefc60d -->
125
- ## 流程 V8 事件执行顺序
126
-
127
- 工作流合并提交请求的 `_FormSubmitAction` 可使用 `Add/Edit`;表单后端事件中的
128
- `V8.FormSubmitAction` 实际为 `Insert/Update/Delete`,两者不能混淆。删除事件把服务端
129
- 读取的待删除行放在 `V8.Form`,`V8.OldForm` 为空;校验删除归属、状态或引用时应以
130
- `V8.Form.Id` 在共享事务中重新读取并锁定原行,不应假定 `OldForm` 与修改事件相同。
131
-
132
- 节点开始事件成功继续流转时保持 `V8.Result` 为空或设为布尔 `true`;不要用
133
- `V8.Result={Code:1}`,非布尔结果会提前结束当前流转。节点校验失败应抛出异常,
134
- 尤其节点结束事件不可依赖 `return {Code:0}` 阻止事务提交。
135
-
136
- 1. 用户点击发起流程或处理工作
137
- 2. **表单进入 V8 事件(前端 FormIn)**
138
- 3. 用户点击【提交】按钮
139
- 4. **节点开始 V8 事件(前端 WFNodeStart)**
140
- 5. 表单提交前 V8 事件(前端 FormSubmitBefore)
141
- 6. 表单提交前 V8 事件(后端 FormSubmitBefore)
142
- 7. 表单提交后 V8 事件(后端 FormSubmitAfter)
143
- 8. 表单提交后 V8 事件(前端)
144
- 9. 调用后端处理工作接口
145
- 10. **条件判断 V8 事件(后端 WFNodeLine)**
146
- 11. **节点开始 V8 事件(后端 WFNodeStart)**
147
- 12. **节点结束 V8 事件(后端 WFNodeEnd)**
148
- 13. **节点结束 V8 事件(前端 WFNodeEnd)**
149
-
150
- <!-- /microi-progressive:chunk -->
151
- <!-- microi-progressive:chunk id=v8-workflow-003 sha256=2cef523c79040139ffdfba070930ce94db18d5b3486fa35a2a694dafa2c8a186 -->
152
- ## V8.WF 上下文属性
153
-
154
- ### 所有流程事件可访问
155
-
156
- | 属性 | 类型 | 说明 |
157
- |------|------|------|
158
- | `V8.WF.ApprovalType` | string | 审批类型:`Agree`(同意)/`Disagree`(拒绝)/`Recall`(撤回)/`Auto`(自动) |
159
- | `V8.WF.ApprovalIdea` | string | 用户填写的审批意见 |
160
- | `V8.WF.AddUsers` | array | 用户添加的审批人 |
161
- | `V8.WF.SelectUsers` | array | 用户选择的审批人 |
162
- | `V8.WF.CurrentFlowDesign` | object | 当前流程设计图实体 |
163
- | `V8.WF.CurrentNode` | object | 当前节点实体 |
164
- | `V8.WF.BackNodeId` | string | 拒绝时选择退回的节点 Id |
165
-
166
- ### 节点开始事件(前端)额外属性
167
-
168
- | 属性 | 说明 |
169
- |------|------|
170
- | `V8.WF.ForceSelectUsers` | 强制指定下一节点审批人(可写),赋值 `['userid1', 'userid2']` |
171
-
172
- ### 节点结束事件(后端)额外属性
173
-
174
- | 属性 | 说明 |
175
- |------|------|
176
- | `V8.WF.NextNode` | 下一节点实体 |
177
- | `V8.WF.NextTodoUsers` | 接收人,格式:`[{ Id: '', Name: '' }]` |
178
-
179
- ### 节点结束事件(前端)额外属性
180
-
181
- | 属性 | 说明 |
182
- |------|------|
183
- | `V8.WF.WorkResult` | 流程执行结果(发送到了哪个节点、哪些审批人) |
184
-
185
- <!-- /microi-progressive:chunk -->
186
- <!-- microi-progressive:chunk id=v8-workflow-004 sha256=99db9f8361d90ce1659922ee2497b7d2f235da009219b8b6a8f22d603b818eff -->
187
- ## ApprovalType 审批类型
188
-
189
- | 值 | 说明 |
190
- |---|---|
191
- | `Agree` | 同意 |
192
- | `Disagree` | 拒绝 |
193
- | `Recall` | 撤回 |
194
- | `Auto` | 发起流程(开始节点) / 业务节点 / 自动结束节点 |
195
-
196
- <!-- /microi-progressive:chunk -->
197
- <!-- microi-progressive:chunk id=v8-workflow-005 sha256=28ada7e06b18590b20935fcaaa2006c868532db89838dfe3799ce2ca0f97c918 -->
198
- ## 条件判断 V8 事件(后端 WFNodeLine)
199
-
200
- 根据业务规则决定流程走向。优先推荐设置 `V8.NextNodeId` 直接指定下一节点;如仍使用条件线的条件值,也可以设置 `V8.LineValue`。
201
-
202
- ```javascript
203
- // V8.EventName === 'WFNodeLine'
204
- // V8.Form 是当前表单数据
205
-
206
- if (V8.Form.Money <= 100) {
207
- V8.NextNodeId = 'node_id_1'; // 直接走指定下一节点(推荐)
208
- } else if (V8.Form.Money <= 10000) {
209
- V8.LineValue = 2; // 也可走条件值为 2 的线(兼容旧配置)
210
- } else {
211
- V8.NextNodeId = 'node_id_3';
212
- }
213
- ```
214
-
215
- <!-- /microi-progressive:chunk -->
216
- <!-- microi-progressive:chunk id=v8-workflow-006 sha256=d3a984b0e45aed19da942e0fa6c4183751d6057b7360e6eb11068e538d598cf9 -->
217
- ## 前端发起流程
218
-
219
- ```javascript
220
- // 在 V8 按钮或自定义逻辑中发起流程
221
- V8.WF.StartWork({
222
- FlowDesignId: 'flow-design-id', // 必传:流程设计 Id
223
- TableRowId: V8.Form.Id, // 必传:关联数据 Id
224
- FormData: JSON.stringify(V8.Form), // 可选:表单数据
225
- NoticeFields: JSON.stringify([ // 可选:通知字段
226
- { Id: 'field1', Name: 'Name', Label: '姓名', Value: V8.Form.Name }
227
- ])
228
- }, function(result) {
229
- if (result.Code === 1) {
230
- V8.Tips('流程发起成功', true);
231
- V8.RefreshTable({ _PageIndex: 1 });
232
- } else {
233
- V8.Tips(result.Msg, false);
234
- }
235
- });
236
- ```
237
-
238
- <!-- /microi-progressive:chunk -->
239
- ## “我的工作”与审核界面交付规则
240
-
241
- - 模块使用“流程引擎”打开方式时,关联流程只能选择已启用的 `wf_flowdesign`;交付前同时验证流程已启用、模块 `OpenType=WorkFlow`、`FlowDesignId` 正确,且开始节点不存在测试阻断 V8。
242
- - `StartWork` / `DoWork` 必须通过工作流与表单合并提交能力保存。审核态只保留“处理工作”、流转记录/流程图和关闭;不得同时显示普通保存、取消编辑、草稿箱、删除、显示隐藏字段或普通表单更多按钮。
243
- - “我的工作”菜单角标使用“未处理待办 + 未读抄送”。待办 Tab 显示未处理数,抄送 Tab 显示未读数;我发起的、我处理的、我相关的按各自列表查询口径统计,不能用 `wf_work` 的近似口径代替 `wf_flow` 列表口径。
244
- - 新抄送项应显式保存 `IsRead=false`,用户打开后由可信后端按当前身份标记已读。历史 `CopyUsers` 项没有 `IsRead` 时按已读兼容,避免升级后把全部历史抄送误报为未读。
245
- - “查看流程图”验收必须从真实流转记录入口打开,确认流程定义、当前节点高亮、连线和弹窗尺寸正常,并检查浏览器无脚本错误;只验证流程 JSON 拓扑不等于完成 UI 验收。
246
-
247
- ## 详细参考路由(渐进披露)
248
-
249
- 仅在当前任务涉及对应主题时读取;下列文件合计保留了原 SKILL.md 的全部详细知识。
250
-
251
- - [references/progressive-01-节点开始-v8-事件.md](references/progressive-01-节点开始-v8-事件.md):节点开始 V8 事件;节点结束 V8 事件;前端打开流程表单;MCP 创建/检查/测试工作流;发起流程与表单保存;流程相关表;注意事项
252
- <!-- microi-progressive:end -->
1
+ ---
2
+ name: v8-workflow
3
+ description: Microi V8 工作流事件指南。用于编写审批流条件、节点 V8 代码、wf_flowdesign/wf_node/wf_line 逻辑、V8.WF 变量和工作流路由。
4
+ ---
5
+
6
+ > **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
7
+
8
+ # Microi V8 工作流事件开发
9
+
10
+ ## AI / MCP 生成流程的必检契约
11
+
12
+ 这里的流程是 `wf_flowdesign + wf_node + wf_line` 审批引擎,不是 `ai-workflow`。
13
+ 先用 `microi_get_db_schema` 查询 `wf_flowdesign`、`wf_node`、`wf_line`、
14
+ `sys_menu` 与目标业务表,再用 `microi_list_roles` 或管理员只读表查询确认当前租户的
15
+ 真实用户、角色、部门、岗位 Id。人工节点 `Approve/Countersign/End` 必须配置
16
+ `Users/Roles/Depts/BindJobs` 至少一种真实 `[{"Id":"...","Name":"..."}]`
17
+ 绑定,或明确采用上游节点 `AllowSelectUsers=1` 手动选人。
18
+ 应用安装母版可显式设置 `FlowDesign.IsEnable=0`(也接受字符串 `"0"`),
19
+ 此时人工节点允许空绑定并保持禁用;`false/null/空字符串/省略` 不属于该例外。
20
+ 禁用模板仍检查所有节点、连线、坐标及绑定格式,任何非空人员、角色、部门或岗位
21
+ 仍必须通过当前租户真实 Id 回读。不得填入 `UNBOUND_*` 等不存在的占位 Id。
22
+ 目标租户配置真实审批人后,应先重新检查再显式启用,并验收真实业务流转;
23
+ 禁用模板保存成功只证明安装结构完整,不能当作审批已可用或商业交付完成。
24
+ `SameDeptApprove=1` 只筛选候选人,不能单独产生审批人。
25
+ 不能把 `Roles:"Manager"`、字符串 Id 数组或另一个租户的 Id 当作绑定。
26
+
27
+ 节点类型只使用 `Start/Auto/Business/Approve/Countersign/End/AutoEnd`;
28
+ `End` 是人工节点,自动结束用 `AutoEnd`。每个节点应有稳定 Id;
29
+ `PositionLeft/PositionTop` 使用像素(如 `"320px"`)。新版 MCP 对缺失坐标按
30
+ 拓扑层级布局并补 `px`,明确重叠、非法类型、断线、不可达、无人审批会在写入前失败。
31
+ 节点人员绑定在写入时仅保留 `Id/Name`,不能把完整 `sys_user` 记录及密码字段嵌入流程。
32
+ MCP 写入前会回读当前租户的用户、角色、部门和岗位 Id;回读失败或 Id 不存在时停止保存。
33
+
34
+ 模块入口使用 `sys_menu.OpenType="WorkFlow"`、`FlowDesignId=<已启用流程真实 Id>`,
35
+ `DiyTableId` 与 `wf_flowdesign.TableId` 相同。完整 Manifest 内可用模块
36
+ `flowName` 指向同一份 `workflows[].FlowDesign.FlowName`,生成器保存流程后补写并回读
37
+ `FlowDesignId`;引用既有流程时传 `flowDesignId`。上线前从模块打开并发起一条真实
38
+ 业务记录,确认流程图节点、人员待办、审批、历史与模块入口均正确。
39
+
40
+ 全部配置字段、节点类型和运行操作见
41
+ [流程配置清单](references/workflow-configuration.md)。
42
+
43
+ 你正在开发 Microi 吾码平台的工作流(审批流程)V8 事件。流程引擎基于表单引擎,通过 V8 事件控制审批逻辑。
44
+
45
+ ## 后端类库与接口边界
46
+
47
+ - 工作流运行时固定属于独立 `Microi.WorkFlow` 类库;`Microi.net.Api` 只注册 `AddMicroiWorkFlow()`,不得恢复 `WorkFlowController` 或把流程业务写回 `Program.cs`。
48
+ - 对外与旧移动端路由统一由官方 Managed `platform-workflow` 接口引擎承载,历史 `/api/WorkFlow/*` 地址写入同一记录的 `ApiRoutes`。租户个性化逻辑写在 CreateIfMissing `platform-workflow-custom-hook`,默认只返回 `{ Code: 1 }`。
49
+ - `Microi.Core` 只保留避免循环引用所需的 `IWFEngine`、模型和最小运行时合同;发起、审批、撤回、移交、退回及审批人计算实现在 `Microi.WorkFlow`,并按职责拆分 partial 文件。
50
+ - 新业务规则仍优先写工作流 V8/接口引擎。只有事务、流程状态机、可信当前用户和运行时内核缺少不可伪造的底层原子时,才扩展 `Microi.WorkFlow`。
51
+ - 官方发布时 `Microi.WorkFlow` 必须生成 NuGet 包,并与 `Microi.AI` 使用同一 Obfuscar 配置加密后替换包内 DLL;不得推送未加密的 WorkFlow 包。开源安装只消费 NuGet,不要求存在私有源码。
52
+
53
+ <!-- microi-progressive:begin -->
54
+ <!-- microi-progressive:chunk id=v8-workflow-000 sha256=bd13a63ee55b2a01041fc2e080ca06ab2fbfd3146fa130811061c9f9e8b4cf84 -->
55
+ ## 本地优先与版本头(必做)
56
+
57
+ 工作流节点、连线条件、开始/结束节点等 V8 代码如果有本地文件,必须优先修改 `microi-v8-engine/<租户>/<项目>/...` 下的本地文件,再同步到数据库。插件提示本地/远端不一致时,先比对并合并,不得直接覆盖。
58
+
59
+ 每次修改、上传、推送工作流 V8 事件代码,都要维护顶部版本区域。版本号从 `v1.0.0` 开始;每次上传/推送/修改递增 1;补丁位和次版本位最大为 9 并向前进位(`v1.0.9 -> v1.1.0`、`v1.9.9 -> v2.0.0`、`v9.9.9 -> v10.0.0`)。代码头只写完整功能说明,不写修改历史、时间戳或 ChangeLog。
60
+
61
+ ```javascript
62
+ /*
63
+ * V8 工作流
64
+ * WorkflowKey: 示例流程Key
65
+ * EventType: WFNodeLine/WFNodeStart/WFNodeEnd
66
+ * Version: v1.0.0
67
+ * 功能说明:
68
+ * - 完整说明该工作流 V8 控制的节点动作、路线条件、审批变量和副作用。
69
+ */
70
+ ```
71
+
72
+ 保存工作流包前要先跑拓扑/条件检查;保存后用样例表单数据测试至少一条会经过该 V8 的路线。
73
+
74
+ 生成工作流 V8 代码时,代码内容本身(文件头、普通注释、`console.log`、返回 `Msg` 等)不要包含 `Microi`、`吾码` 等平台品牌文字,除非业务数据或字段值本身必须如此。生成代码要有可维护注释:每个 `function` 前写清用途、关键参数和返回值;路线选择、审批人计算、状态回写、撤回/驳回处理、跨表联动等复杂代码段前写短注释说明业务原因;避免“给变量赋值”这类无信息量注释。若工作流存储表支持 `Version`/`ChangeHistory`,历史说明也必须最新在前并保留旧记录。
75
+
76
+ <!-- /microi-progressive:chunk -->
77
+ <!-- microi-progressive:chunk id=v8-workflow-001 sha256=935b29e9f3afde02aa78a77468b48afd204facb3b1dafaf9d23dc3bd69832717 -->
78
+ ## 工作流物理表
79
+
80
+ | 表名 | 说明 |
81
+ |------|------|
82
+ | `wf_flowdesign` | 流程设计(流程定义) |
83
+ | `wf_node` | 流程节点 |
84
+ | `wf_line` | 节点间连线/条件 |
85
+ | `wf_flow` | 流程实例(一次发起对应一行) |
86
+ | `wf_work` | 待办/已办工作 |
87
+ | `wf_history` | 审批历史(每次同意/拒绝/撤回的记录) |
88
+
89
+ ### 原生人员、自动结束与取消快照契约
90
+
91
+ - `wf_node.Users` 是 JSON 序列化的 `IdName` 对象数组,例如 `[{"Id":"<user-id>","Name":"审核人"}]`;不能保存为字符串 Id 数组。`Name` 仅供显示,业务授权仍须按当前主库用户、角色和实际待办接收人判断。前端 `V8.WF.ForceSelectUsers` 的字符串数组是另一份 API 契约,不能混用。
92
+ - 自动结束节点的 `NodeType` 使用 `AutoEnd`。它可能继承上一人工节点的 `ApprovalType=Agree`,并生成一条结束历史;核对独立审批人数时只计入明确配置的人工节点,不能把结束节点当成额外审核人。
93
+ - 原生 `CancelFlow` 可将请求中的 `FormData` 写回 `wf_flow.FormData`;未传时可能保存 `{}`。应用不能把取消后的实例 `FormData` 当成不可变的原始提交快照。需要恢复冻结业务单时,优先核对业务表保存的服务端快照摘要;若使用原生历史,必须限定同一实例、同一业务表/行、唯一原始开始节点及发起人、自动提交历史,并检查版本、金额、配置摘要和零待办。此分支只能恢复草稿或驳回状态,不能据此批准或过账。
94
+ - 当前 `CancelFlow(WFParam)` 使用独立事务,没有 `StartWork/SendWork` 的共享 `DbTrans` 重载。应用不得在持有实例、工作或业务行锁的接口事务内调用取消,也不能假设给它多传一个参数便会共享事务。微服务可顺序执行“服务端核验并返回真实待办坐标 → 原生取消 → 业务终态复核”,每个请求完成后释放其事务;网络结果未知时先复核终态,不能盲目重发取消或提前恢复业务状态。
95
+ - 业务接口与原生节点共同读取配置、公共引用和业务行时,先画出宿主与脚本合并的锁图。原生审批进入节点前可能已持有流程实例锁;既存流程的业务复核应先通过当前主库有界只读发现真实实例,再在同一共享事务锁定该实例,随后获取固定配置/引用锁及业务行锁,重读验证归属未变。待办发现扫描只读不能提前锁工作行后再等流程;公共引用围栏只协调锁序,不能读取配置值来继承授权。必须逐入口审查包括定义、身份与配置的相反锁序,不以一条 SQL 或单次模拟成功宣称全系统无死锁。
96
+ - 已由可信原生历史证明取消或驳回的终态恢复只校验原提交归属、当前授权和可恢复状态,不应要求审批期间未发生正常库存、成本或其他业务余额变化;此恢复不产生过账副作用。批准与过账仍必须严格比较冻结快照、当前期间及业务版本,并覆盖撤权、并发和响应未知时使用原请求键恢复。
97
+ - 真实原生多接收人流程中的 `OtherDone` 只表示同阶段并列待办被 `CloseOtherWork` 关闭,不是该接收人已经审批。仅在同实体/实例/定义/审批节点/来源节点与唯一真实 `Agree` + `Done` 工作精确绑定,接收人不同于实际办理人,且没有该并列工作办理历史时,才能作为终态旁证;不能把它计作独立审核人。开始提交、实际人工审批仍必须 `Done`,未知节点、待办、撤回、取消、重复历史或模糊绑定失败关闭。覆盖真实五工作(3 `Done`、2 `OtherDone`)原生来源及新稿/原键恢复,不能靠把状态统一映射为 `Done` 通过。
98
+ - 验收至少覆盖真实取消时不传 `FormData`、伪造取消载荷、退回后直接重提被拒绝、取消后新实例重提、自动结束继承 `Agree`,以及普通角色不能修改取证用的流程历史。模拟正确 JSON 不替代原生 HTTP 验收。
99
+
100
+ 直接 SQL 查询常用场景:
101
+
102
+ ```javascript
103
+ // 我的待办
104
+ var todo = V8.Db.FromSql(
105
+ 'SELECT Id, FlowId, NodeId, FlowTitle, WorkState, ReceiverId, TableRowId FROM wf_work WHERE ReceiverId = @p0 AND WorkState = @p1 ORDER BY CreateTime DESC'
106
+ ).AddInParameter("@p0", V8.CurrentUser.Id)
107
+ .AddInParameter("@p1", 'Todo')
108
+ .ToArray();
109
+
110
+ // 我发起的
111
+ var mine = V8.Db.FromSql(
112
+ 'SELECT Id, FlowTitle, FlowState, SenderId, TableRowId FROM wf_flow WHERE SenderId = @p0 ORDER BY CreateTime DESC'
113
+ ).AddInParameter("@p0", V8.CurrentUser.Id)
114
+ .ToArray();
115
+
116
+ // 流程历史
117
+ var history = V8.Db.FromSql(
118
+ 'SELECT * FROM wf_history WHERE FlowId = @p0 ORDER BY CreateTime ASC'
119
+ ).AddInParameter("@p0", V8.Param.flowId)
120
+ .ToArray();
121
+ ```
122
+
123
+ <!-- /microi-progressive:chunk -->
124
+ <!-- microi-progressive:chunk id=v8-workflow-002 sha256=38a77bbee9ea30f036a9d9ef7150e2a738f4533dc9f05c23a3d00ff86aefc60d -->
125
+ ## 流程 V8 事件执行顺序
126
+
127
+ 工作流合并提交请求的 `_FormSubmitAction` 可使用 `Add/Edit`;表单后端事件中的
128
+ `V8.FormSubmitAction` 实际为 `Insert/Update/Delete`,两者不能混淆。删除事件把服务端
129
+ 读取的待删除行放在 `V8.Form`,`V8.OldForm` 为空;校验删除归属、状态或引用时应以
130
+ `V8.Form.Id` 在共享事务中重新读取并锁定原行,不应假定 `OldForm` 与修改事件相同。
131
+
132
+ 节点开始事件成功继续流转时保持 `V8.Result` 为空或设为布尔 `true`;不要用
133
+ `V8.Result={Code:1}`,非布尔结果会提前结束当前流转。节点校验失败应抛出异常,
134
+ 尤其节点结束事件不可依赖 `return {Code:0}` 阻止事务提交。
135
+
136
+ 1. 用户点击发起流程或处理工作
137
+ 2. **表单进入 V8 事件(前端 FormIn)**
138
+ 3. 用户点击【提交】按钮
139
+ 4. **节点开始 V8 事件(前端 WFNodeStart)**
140
+ 5. 表单提交前 V8 事件(前端 FormSubmitBefore)
141
+ 6. 表单提交前 V8 事件(后端 FormSubmitBefore)
142
+ 7. 表单提交后 V8 事件(后端 FormSubmitAfter)
143
+ 8. 表单提交后 V8 事件(前端)
144
+ 9. 调用后端处理工作接口
145
+ 10. **条件判断 V8 事件(后端 WFNodeLine)**
146
+ 11. **节点开始 V8 事件(后端 WFNodeStart)**
147
+ 12. **节点结束 V8 事件(后端 WFNodeEnd)**
148
+ 13. **节点结束 V8 事件(前端 WFNodeEnd)**
149
+
150
+ <!-- /microi-progressive:chunk -->
151
+ <!-- microi-progressive:chunk id=v8-workflow-003 sha256=2cef523c79040139ffdfba070930ce94db18d5b3486fa35a2a694dafa2c8a186 -->
152
+ ## V8.WF 上下文属性
153
+
154
+ ### 所有流程事件可访问
155
+
156
+ | 属性 | 类型 | 说明 |
157
+ |------|------|------|
158
+ | `V8.WF.ApprovalType` | string | 审批类型:`Agree`(同意)/`Disagree`(拒绝)/`Recall`(撤回)/`Auto`(自动) |
159
+ | `V8.WF.ApprovalIdea` | string | 用户填写的审批意见 |
160
+ | `V8.WF.AddUsers` | array | 用户添加的审批人 |
161
+ | `V8.WF.SelectUsers` | array | 用户选择的审批人 |
162
+ | `V8.WF.CurrentFlowDesign` | object | 当前流程设计图实体 |
163
+ | `V8.WF.CurrentNode` | object | 当前节点实体 |
164
+ | `V8.WF.BackNodeId` | string | 拒绝时选择退回的节点 Id |
165
+
166
+ ### 节点开始事件(前端)额外属性
167
+
168
+ | 属性 | 说明 |
169
+ |------|------|
170
+ | `V8.WF.ForceSelectUsers` | 强制指定下一节点审批人(可写),赋值 `['userid1', 'userid2']` |
171
+
172
+ ### 节点结束事件(后端)额外属性
173
+
174
+ | 属性 | 说明 |
175
+ |------|------|
176
+ | `V8.WF.NextNode` | 下一节点实体 |
177
+ | `V8.WF.NextTodoUsers` | 接收人,格式:`[{ Id: '', Name: '' }]` |
178
+
179
+ ### 节点结束事件(前端)额外属性
180
+
181
+ | 属性 | 说明 |
182
+ |------|------|
183
+ | `V8.WF.WorkResult` | 流程执行结果(发送到了哪个节点、哪些审批人) |
184
+
185
+ <!-- /microi-progressive:chunk -->
186
+ <!-- microi-progressive:chunk id=v8-workflow-004 sha256=99db9f8361d90ce1659922ee2497b7d2f235da009219b8b6a8f22d603b818eff -->
187
+ ## ApprovalType 审批类型
188
+
189
+ | 值 | 说明 |
190
+ |---|---|
191
+ | `Agree` | 同意 |
192
+ | `Disagree` | 拒绝 |
193
+ | `Recall` | 撤回 |
194
+ | `Auto` | 发起流程(开始节点) / 业务节点 / 自动结束节点 |
195
+
196
+ <!-- /microi-progressive:chunk -->
197
+ <!-- microi-progressive:chunk id=v8-workflow-005 sha256=28ada7e06b18590b20935fcaaa2006c868532db89838dfe3799ce2ca0f97c918 -->
198
+ ## 条件判断 V8 事件(后端 WFNodeLine)
199
+
200
+ 根据业务规则决定流程走向。优先推荐设置 `V8.NextNodeId` 直接指定下一节点;如仍使用条件线的条件值,也可以设置 `V8.LineValue`。
201
+
202
+ ```javascript
203
+ // V8.EventName === 'WFNodeLine'
204
+ // V8.Form 是当前表单数据
205
+
206
+ if (V8.Form.Money <= 100) {
207
+ V8.NextNodeId = 'node_id_1'; // 直接走指定下一节点(推荐)
208
+ } else if (V8.Form.Money <= 10000) {
209
+ V8.LineValue = 2; // 也可走条件值为 2 的线(兼容旧配置)
210
+ } else {
211
+ V8.NextNodeId = 'node_id_3';
212
+ }
213
+ ```
214
+
215
+ <!-- /microi-progressive:chunk -->
216
+ <!-- microi-progressive:chunk id=v8-workflow-006 sha256=d3a984b0e45aed19da942e0fa6c4183751d6057b7360e6eb11068e538d598cf9 -->
217
+ ## 前端发起流程
218
+
219
+ ```javascript
220
+ // 在 V8 按钮或自定义逻辑中发起流程
221
+ V8.WF.StartWork({
222
+ FlowDesignId: 'flow-design-id', // 必传:流程设计 Id
223
+ TableRowId: V8.Form.Id, // 必传:关联数据 Id
224
+ FormData: JSON.stringify(V8.Form), // 可选:表单数据
225
+ NoticeFields: JSON.stringify([ // 可选:通知字段
226
+ { Id: 'field1', Name: 'Name', Label: '姓名', Value: V8.Form.Name }
227
+ ])
228
+ }, function(result) {
229
+ if (result.Code === 1) {
230
+ V8.Tips('流程发起成功', true);
231
+ V8.RefreshTable({ _PageIndex: 1 });
232
+ } else {
233
+ V8.Tips(result.Msg, false);
234
+ }
235
+ });
236
+ ```
237
+
238
+ <!-- /microi-progressive:chunk -->
239
+ ## “我的工作”与审核界面交付规则
240
+
241
+ - 模块使用“流程引擎”打开方式时,关联流程只能选择已启用的 `wf_flowdesign`;交付前同时验证流程已启用、模块 `OpenType=WorkFlow`、`FlowDesignId` 正确,且开始节点不存在测试阻断 V8。
242
+ - `StartWork` / `DoWork` 必须通过工作流与表单合并提交能力保存。审核态只保留“处理工作”、流转记录/流程图和关闭;不得同时显示普通保存、取消编辑、草稿箱、删除、显示隐藏字段或普通表单更多按钮。
243
+ - “我的工作”菜单角标使用“未处理待办 + 未读抄送”。待办 Tab 显示未处理数,抄送 Tab 显示未读数;我发起的、我处理的、我相关的按各自列表查询口径统计,不能用 `wf_work` 的近似口径代替 `wf_flow` 列表口径。
244
+ - 新抄送项应显式保存 `IsRead=false`,用户打开后由可信后端按当前身份标记已读。历史 `CopyUsers` 项没有 `IsRead` 时按已读兼容,避免升级后把全部历史抄送误报为未读。
245
+ - “查看流程图”验收必须从真实流转记录入口打开,确认流程定义、当前节点高亮、连线和弹窗尺寸正常,并检查浏览器无脚本错误;只验证流程 JSON 拓扑不等于完成 UI 验收。
246
+
247
+ ## 详细参考路由(渐进披露)
248
+
249
+ 仅在当前任务涉及对应主题时读取;下列文件合计保留了原 SKILL.md 的全部详细知识。
250
+
251
+ - [references/progressive-01-节点开始-v8-事件.md](references/progressive-01-节点开始-v8-事件.md):节点开始 V8 事件;节点结束 V8 事件;前端打开流程表单;MCP 创建/检查/测试工作流;发起流程与表单保存;流程相关表;注意事项
252
+ <!-- microi-progressive:end -->