@microi.net/cli 5.7.8 → 5.8.0

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