@microi.net/cli 4.9.6 → 4.9.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/.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 +6 -5
  7. package/package.json +1 -1
  8. package/scripts/mcp-server.js +83 -83
  9. package/scripts/microi-cli.js +55 -85
  10. package/scripts/microi-codex-broker.js +418 -0
  11. package/scripts/microi-codex-router.js +129 -65
  12. package/scripts/microi-skills.meta.json +310 -151
  13. package/skills/.microi-skills-version.json +2 -2
  14. package/skills/.progressive-disclosure-manifest.json +3566 -0
  15. package/skills/ai-platform-governance/SKILL.md +21 -166
  16. package/skills/ai-platform-governance/references/progressive-01-/345/212/237/350/203/275/345/274/200/345/205/263.md +190 -0
  17. package/skills/microi-client-frontend/SKILL.md +17 -434
  18. 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 -0
  19. 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 +178 -0
  20. 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 +144 -0
  21. package/skills/microi-db-schema/SKILL.md +3 -3
  22. package/skills/microi-db-schema/references/schema-overview.md +1 -1
  23. package/skills/microi-db-schema/references/schema.md +1 -1
  24. package/skills/microi-db-schema/references/table-catalog.md +1 -1
  25. package/skills/microi-form-engine/SKILL.md +1 -1
  26. package/skills/microi-form-layout/SKILL.md +19 -225
  27. 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 -0
  28. package/skills/microi-frontend-sdk/SKILL.md +17 -151
  29. 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 +171 -0
  30. package/skills/microi-mobile-app-quality/SKILL.md +22 -288
  31. 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 +209 -0
  32. 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 +117 -0
  33. package/skills/microi-system-delivery/SKILL.md +16 -380
  34. package/skills/microi-system-delivery/references/progressive-01-/346/240/207/345/207/206/345/267/245/344/275/234/346/265/201.md +186 -0
  35. 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 +210 -0
  36. package/skills/microi-ui/SKILL.md +19 -169
  37. 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 -0
  38. package/skills/microi-uniapp-frontend/SKILL.md +26 -335
  39. 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 -0
  40. 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 -0
  41. package/skills/page-engine/SKILL.md +23 -271
  42. 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 -0
  43. 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 -0
  44. package/skills/playwright-e2e/SKILL.md +24 -590
  45. 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 -0
  46. 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 -0
  47. package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +221 -0
  48. package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +69 -0
  49. package/skills/scripts/optimize-progressive-disclosure.mjs +204 -0
  50. package/skills/scripts/refresh-progressive-disclosure.mjs +64 -0
  51. package/skills/scripts/validate-progressive-disclosure.mjs +52 -0
  52. package/skills/ui-design/SKILL.md +26 -1461
  53. 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 -0
  54. package/skills/ui-design/references/progressive-02-/345/255/227/344/275/223.md +155 -0
  55. 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 -0
  56. 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 -0
  57. 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 -0
  58. 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 -0
  59. 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 -0
  60. 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 -0
  61. package/skills/v8-crud-api/SKILL.md +20 -245
  62. 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 -0
  63. 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 -0
  64. package/skills/v8-export-import/SKILL.md +15 -425
  65. 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 -0
  66. package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md +202 -0
  67. 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 -0
  68. package/skills/v8-file-upload/SKILL.md +16 -354
  69. 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 +227 -0
  70. 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 +149 -0
  71. package/skills/v8-frontend-events/SKILL.md +19 -205
  72. package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +219 -0
  73. package/skills/v8-http-integration/SKILL.md +14 -236
  74. package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md +220 -0
  75. 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 -0
  76. package/skills/v8-menu-buttons/SKILL.md +15 -511
  77. package/skills/v8-menu-buttons/references/progressive-01-2-/346/214/211/351/222/256/345/257/271/350/261/241-schema.md +221 -0
  78. 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 +224 -0
  79. 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 -0
  80. package/skills/v8-mq-mqtt/SKILL.md +11 -175
  81. package/skills/v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-/347/211/251/350/201/224/347/275/221.md +181 -0
  82. package/skills/v8-security/SKILL.md +16 -329
  83. package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +199 -0
  84. package/skills/v8-security/references/progressive-02-7-/346/227/245/345/277/227/350/256/260/345/275/225.md +158 -0
  85. package/skills/v8-table-event/SKILL.md +16 -236
  86. 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 -0
  87. 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 -0
  88. package/skills/v8-workflow/SKILL.md +19 -160
  89. 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 -0
  90. package/skills/workspace-conventions/SKILL.md +29 -361
  91. 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 -0
  92. 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 +196 -0
  93. 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 -0
@@ -0,0 +1,216 @@
1
+ # v8-table-event 详细参考 1
2
+
3
+ > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
+
5
+ <!-- microi-progressive:chunk id=v8-table-event-005 sha256=38d1253f165733f4d1064dea9d381c087848f715da8acda7d5aa3bbbee464a86 -->
6
+ ## InFormV8.js — 表单打开事件
7
+
8
+ ```javascript
9
+ // 新增时设置默认值
10
+ if (V8.FormMode === 'Add') {
11
+ V8.FormSet('Status', 1);
12
+ V8.FormSet('CreateTime', DateNow('yyyy-MM-dd HH:mm:ss'));
13
+ V8.FormSet('CreatorId', V8.CurrentUser.Id);
14
+ V8.FormSet('CreatorName', V8.CurrentUser.Name);
15
+ }
16
+
17
+ // 编辑时禁用某些字段
18
+ if (V8.FormMode === 'Edit') {
19
+ V8.FieldSet('Account', 'Readonly', true); // 账号不可修改
20
+ }
21
+
22
+ // 查看模式隐藏操作按钮
23
+ if (V8.FormMode === 'View') {
24
+ V8.HideFormBtn('Save');
25
+ }
26
+
27
+ // 根据角色控制字段可见性
28
+ if (V8.CurrentUser.RoleName.indexOf('管理员') === -1) {
29
+ V8.FieldSet('AuditField', 'Visible', false);
30
+ }
31
+ ```
32
+
33
+ <!-- /microi-progressive:chunk -->
34
+ <!-- microi-progressive:chunk id=v8-table-event-006 sha256=e62b20919da58241cbe816a3b62d9a8eef5b713f8afab776f69c26f87df691c7 -->
35
+ ## SubmitFormV8.js — 前端提交校验
36
+
37
+ ```javascript
38
+ // 自定义校验
39
+ var phone = V8.Form.Phone;
40
+ if (phone && !/^1[3-9]\d{9}$/.test(phone)) {
41
+ V8.Tips('手机号格式不正确', false);
42
+ return false; // 返回 false 阻止提交
43
+ }
44
+
45
+ // 业务逻辑校验
46
+ if (V8.Form.StartDate > V8.Form.EndDate) {
47
+ V8.Tips('开始日期不能大于结束日期', false);
48
+ return false;
49
+ }
50
+ ```
51
+
52
+ <!-- /microi-progressive:chunk -->
53
+ <!-- microi-progressive:chunk id=v8-table-event-007 sha256=4187c2ed36373b1ee239c5668c2ec898a52029b3ce5443aba688ffec4a690a8e -->
54
+ ## SubmitBeforeServerV8.js — 服务端提交前
55
+
56
+ ```javascript
57
+ // V8.Form 是即将写入数据库的数据
58
+ // V8.OldForm 是修改前的旧数据(仅更新时有值)
59
+ // V8.FormSubmitAction:'Insert' / 'Update' / 'Delete'
60
+
61
+ // 新增时:自动填充审计字段
62
+ if (V8.FormSubmitAction === 'Insert') {
63
+ V8.Form.CreateTime = DateNow('yyyy-MM-dd HH:mm:ss');
64
+ V8.Form.CreateUserId = V8.CurrentUser.Id;
65
+ }
66
+
67
+ // 更新时:记录修改人
68
+ if (V8.FormSubmitAction === 'Update') {
69
+ V8.Form.UpdateTime = DateNow('yyyy-MM-dd HH:mm:ss');
70
+ V8.Form.UpdateUserId = V8.CurrentUser.Id;
71
+ }
72
+
73
+ // 删除时:校验是否允许删除
74
+ if (V8.FormSubmitAction === 'Delete') {
75
+ var related = V8.FormEngine.GetTableDataCount('OrderDetail', {
76
+ _Where: [['OrderId', '=', V8.Form.Id]]
77
+ });
78
+ if (related.DataCount > 0) {
79
+ return { Code: 0, Msg: '该订单下有明细数据,不允许删除' };
80
+ }
81
+ }
82
+
83
+ // 唯一性校验
84
+ if (V8.FormSubmitAction === 'Insert' || V8.FormSubmitAction === 'Update') {
85
+ var where = [['Code', '=', V8.Form.Code]];
86
+ if (V8.FormSubmitAction === 'Update') {
87
+ where.push(['AND', 'Id', '<>', V8.Form.Id]);
88
+ }
89
+ var exist = V8.FormEngine.GetFormData('Product', { _Where: where });
90
+ if (exist.Code === 1 && exist.Data) {
91
+ return { Code: 0, Msg: '编码已存在' };
92
+ }
93
+ }
94
+
95
+ // 返回 { Code: 0, Msg: '...' } 阻止提交并自动回滚事务
96
+ // 无需手动调用 V8.DbTrans.Rollback()
97
+ ```
98
+
99
+ <!-- /microi-progressive:chunk -->
100
+ <!-- microi-progressive:chunk id=v8-table-event-008 sha256=be4accafd23b39c0a2be912d4c0b4f3bc79e43c88604d7a0bfc5637357e13550 -->
101
+ ## SubmitAfterServerV8.js — 服务端提交后
102
+
103
+ ```javascript
104
+ // 此时数据已成功写入数据库(仍在事务中)
105
+ // 返回 { Code: 0 } 仍可回滚事务
106
+
107
+ // 新增后:自动创建关联数据。保持默认 Server 调用,不触发目标表事件
108
+ if (V8.FormSubmitAction === 'Insert') {
109
+ V8.FormEngine.AddFormData('UserProfile', {
110
+ UserId: V8.Form.Id,
111
+ NickName: V8.Form.Name
112
+ }, V8.DbTrans);
113
+ }
114
+
115
+ // 更新后:同步更新其它表的冗余字段
116
+ if (V8.FormSubmitAction === 'Update') {
117
+ if (V8.OldForm.Name !== V8.Form.Name) {
118
+ V8.FormEngine.UptFormDataByWhere('OrderHeader', {
119
+ _Where: [['CustomerId', '=', V8.Form.Id]],
120
+ CustomerName: V8.Form.Name
121
+ });
122
+ }
123
+ }
124
+
125
+ // 通知(调用其他接口引擎,可共享事务)
126
+ V8.ApiEngine.Run('send-notification', {
127
+ userId: V8.Form.Id,
128
+ type: V8.FormSubmitAction
129
+ }, V8.DbTrans);
130
+
131
+ // 记录操作日志
132
+ V8.Method.AddSysLog({
133
+ Title: V8.FormSubmitAction + ' ' + V8.TableModel.Name,
134
+ Content: JSON.stringify({ Id: V8.Form.Id }),
135
+ Type: '业务日志'
136
+ });
137
+ ```
138
+
139
+ `SubmitAfterServerV8` 的“After”仍是“写入后、提交前”。需要在事务真正提交后才发布的缓存版本、跨节点通知等副作用,不能直接在事件中执行。平台为 `microi_database` 提供专用 `V8.Method.RefreshExtensionDatabases()`:事件调用时只登记提交后回调,提交成功才递增当前租户共享 Redis 版本,回滚时自动丢弃。普通业务的外部消息仍优先使用同事务 outbox,不能把任意不可撤销副作用都塞进内存回调。
140
+
141
+ <!-- /microi-progressive:chunk -->
142
+ <!-- microi-progressive:chunk id=v8-table-event-009 sha256=d415302a8108d9e11755a046bdbffe0c84a135ec6ed0e6b1dc3fc128a8ef38b6 -->
143
+ ## DataFilterV8.js — 服务端数据处理事件
144
+
145
+ 获取列表/表单数据后,每行数据都会执行一次此事件。
146
+
147
+ ```javascript
148
+ // V8.RowIndex — 当前行索引(从 0 开始)
149
+ // V8.Form — 当前行数据
150
+ // V8.NotSaveField — 指定哪些字段编辑时不保存(数组)
151
+ // V8.CacheData — 用于缓存数据,避免每行重复查询
152
+
153
+ // 补充计算字段
154
+ V8.Form.TotalPrice = V8.Form.Price * V8.Form.Quantity;
155
+
156
+ // 指定某些字段不保存(仅在编辑表单时有效)
157
+ V8.NotSaveField = ['TotalPrice', 'CompanyName'];
158
+
159
+ // 使用 CacheData 避免 N+1 查询
160
+ if (!V8.CacheData.deptMap) {
161
+ var depts = V8.FormEngine.GetTableData('Department', {});
162
+ var map = {};
163
+ for (var i = 0; i < depts.Data.length; i++) {
164
+ map[depts.Data[i].Id] = depts.Data[i].Name;
165
+ }
166
+ V8.CacheData.deptMap = map;
167
+ }
168
+ V8.Form.DeptName = V8.CacheData.deptMap[V8.Form.DeptId] || '';
169
+
170
+ // 数据脱敏
171
+ if (V8.Form.Phone) {
172
+ V8.Form.Phone = V8.Form.Phone.substring(0, 3) + '****' + V8.Form.Phone.substring(7);
173
+ }
174
+ ```
175
+
176
+ <!-- /microi-progressive:chunk -->
177
+ <!-- microi-progressive:chunk id=v8-table-event-010 sha256=e3e0593f037fcfe66b6aa12dd342a10e8b270fcfef2cb3dd0dac52d3796973c5 -->
178
+ ## 事件上下文变量
179
+
180
+ ### 前端事件
181
+
182
+ | 变量 | 说明 | 可用事件 |
183
+ |------|------|---------|
184
+ | `V8.Form` | 当前表单数据(新增时也有 Id) | 全部 |
185
+ | `V8.OldForm` | 已加载的修改前旧数据 | 普通表单;提交前/后 |
186
+ | `V8.FormMode` | `'Add'` / `'Edit'` / `'View'` | 全部 |
187
+ | `V8.FormOutAction` | `'Insert'`/`'Update'`/`'Close'`/`'Delete'` | FormOut |
188
+ | `V8.FormSubmitAction` | `'Insert'` / `'Update'` / `'Delete'` | SubmitBefore |
189
+ | `V8.EventName` | 当前事件名 | 全部 |
190
+ | `V8.CurrentUser` | 当前用户 | 全部 |
191
+ | `V8.TableId` / `V8.TableName` | 当前表 Id / Name | 全部 |
192
+ | `V8.SelectedData` / `V8.TableRowSelected` | 选中的行数组 | 列表/批量按钮 |
193
+ | `V8.CurrentTableData` | 当前表当页数据 | 全部 |
194
+ | `V8.ClientType` | `'PC'`/`'IOS'`/`'Android'`/`'H5'`/`'WeChat'` | 全部 |
195
+ | `V8.ThisValue` | 当前字段新值:可能是对象、原始值或行内 `{New,Old}` | FieldValueChange |
196
+ | `V8.OldValue` | 当前字段旧值,仅行内编辑可靠 | 表格行内 FieldValueChange |
197
+ | `V8.KeyCode` | 键盘事件的键码 | FieldOnKeyup |
198
+ | `V8.Event` | 原生事件;键盘事件目前不提供 | FieldSlotButtonClick 等显式事件 |
199
+ | `V8.ParentV8` | 子表中访问父表 V8 对象 | 子表事件 |
200
+
201
+ ### 后端事件
202
+
203
+ | 变量 | 说明 | 可用事件 |
204
+ |------|------|---------|
205
+ | `V8.Form` | 当前表单/行数据 | 全部 |
206
+ | `V8.OldForm` | 提交前旧数据 | SubmitBefore/After |
207
+ | `V8.FormSubmitAction` | `'Insert'`/`'Update'`/`'Delete'` | SubmitBefore/After |
208
+ | `V8.TableModel` | 表模型(Id, Name 等) | SubmitBefore/After |
209
+ | `V8.EventName` | 当前事件名 | 全部 |
210
+ | `V8.InvokeType` | `'Server'`/`'Client'` | 全部 |
211
+ | `V8.CurrentUser` | 当前用户 | 全部 |
212
+ | `V8.RowIndex` | 行索引(从 0) | DataFilter |
213
+ | `V8.NotSaveField` | 不保存的字段(数组,可写) | DataFilter |
214
+ | `V8.CacheData` | 缓存数据(避免 N+1,可写) | DataFilter |
215
+
216
+ <!-- /microi-progressive:chunk -->
@@ -0,0 +1,46 @@
1
+ # v8-table-event 详细参考 2
2
+
3
+ > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
+
5
+ <!-- microi-progressive:chunk id=v8-table-event-011 sha256=20342f03d457bd86d1d3e4b80ee8f2ffa254f0b60312a18bc3dab2ce2d448308 -->
6
+ ## 前端事件名(V8.EventName 可能的值)
7
+
8
+ | 值 | 说明 |
9
+ |---|---|
10
+ | `FormIn` | 进入表单事件 |
11
+ | `FormSubmitBefore` | 提交前事件 |
12
+ | `FormOut` | 离开表单事件 |
13
+ | `FieldValueChange` | 字段值变更事件 |
14
+ | `FieldOnKeyup` | 文本框键盘事件 |
15
+ | `TableFieldOnKeyup` | 表格行内文本框键盘事件 |
16
+ | `FieldSlotButtonClick` | 单行文本插槽按钮点击事件 |
17
+ | `V8BtnRun` | V8 按钮执行事件 |
18
+ | `V8BtnLimit` | V8 按钮是否显示事件 |
19
+ | `BtnFormDetailRun` | 详情按钮 V8 按钮 |
20
+ | `TableRowClick` | 表格行点击 V8 事件 |
21
+ | `OpenTableBefore` | 弹出表格前事件 |
22
+ | `OpenTableSubmit` | 弹出表格提交事件 |
23
+ | `PageTab` | 多 Tab 页签 V8 事件 |
24
+ | `WFNodeStart` | 流程节点开始 V8 事件 |
25
+ | `WFNodeEnd` | 流程节点结束 V8 事件 |
26
+
27
+ <!-- /microi-progressive:chunk -->
28
+ <!-- microi-progressive:chunk id=v8-table-event-012 sha256=380fc790dcf02a27f8b47d9a894b98cb90ebc7ea6b57a5b30075d3d9d32a0262 -->
29
+ ## 注意事项
30
+
31
+ - 前端事件可使用 `window` 对象和 `async/await`,后端事件不可以
32
+ - 后端提交前/后事件返回 `{ Code: 0, Msg: '...' }` 可阻止数据写入并回滚事务
33
+ - 直接修改 `V8.Form` 的字段值即可改变最终写入的数据
34
+ - 后端事件中使用 `V8.FormEngine` 默认是 Server 调用,不触发目标表事件;`_InvokeType:'Client'` 恰好会触发目标表事件,不能用于“避免递归”
35
+ - `_InvokeType:'Server'` 只表达事件调用语义,不是客户端授权开关;浏览器伪造它不会获得受信任权限
36
+ - `V8.FormSubmitAction` 的值是 `'Insert'`/`'Update'`/`'Delete'`(非 Add/Upt/Del)
37
+ - 在 DataFilterV8 中使用 `V8.CacheData` 缓存查询结果,避免每行执行 N+1 查询
38
+ - 表事件调用下游接口时,`diy_table.V8Unlimited` 不会自动放开下游接口;下游 `sys_apiengine.V8Unlimited` 必须独立配置,避免一次开关无边界扩散到整条调用链
39
+
40
+ ### 复盘:提交后事件误把增量表单当作完整记录
41
+
42
+ - 触发场景:插件、MCP 或后端只更新代码等少数字段时,`SubmitAfterServerV8` 直接对 `V8.Form.Id`、业务 Key 调用 `toLowerCase()`,保存动作因字段未出现在增量参数中而异常。
43
+ - 根因:事件假设 `V8.Form` 始终包含整行数据,没有兼容稀疏更新(sparse patch)。
44
+ - 通用规则:提交后事件使用非本次必传字段前,必须从 `V8.OldForm` 合并兜底,或凭已有 `Id` 回查当前记录;调用字符串方法前先显式 `String(...)` 并校验空值。写缓存时应缓存合并后的完整模型,不能用稀疏对象覆盖整行缓存。
45
+ - 自动化检查:分别只更新一个普通字段、只更新大文本代码字段并执行一次完整表单保存;事件均不得报错,按 Id、唯一 Key 和可选地址回读缓存都应得到完整记录。
46
+ <!-- /microi-progressive:chunk -->
@@ -9,6 +9,8 @@ description: Microi V8 工作流事件指南。用于编写审批流条件、节
9
9
 
10
10
  你正在开发 Microi 吾码平台的工作流(审批流程)V8 事件。流程引擎基于表单引擎,通过 V8 事件控制审批逻辑。
11
11
 
12
+ <!-- microi-progressive:begin -->
13
+ <!-- microi-progressive:chunk id=v8-workflow-000 sha256=9030cd2de9f1febfb9a749c82cf83e97ccb8fb972a3f8f0ff11067488e14cd8e -->
12
14
  ## 本地优先与版本头(必做)
13
15
 
14
16
  工作流节点、连线条件、开始/结束节点等 V8 代码如果有本地文件,必须优先修改 `microi-v8-engine/<租户>/<项目>/...` 下的本地文件,再同步到数据库。插件提示本地/远端不一致时,先比对并合并,不得直接覆盖。
@@ -30,6 +32,8 @@ description: Microi V8 工作流事件指南。用于编写审批流条件、节
30
32
 
31
33
  生成工作流 V8 代码时,代码内容本身(文件头、普通注释、`console.log`、返回 `Msg` 等)不要包含 `Microi`、`吾码` 等平台品牌文字,除非业务数据或字段值本身必须如此。生成代码要有可维护注释:每个 `function` 前写清用途、关键参数和返回值;路线选择、审批人计算、状态回写、撤回/驳回处理、跨表联动等复杂代码段前写短注释说明业务原因;避免“给变量赋值”这类无信息量注释。若工作流存储表支持 `Version`/`ChangeHistory`,历史说明也必须最新在前并保留旧记录。
32
34
 
35
+ <!-- /microi-progressive:chunk -->
36
+ <!-- microi-progressive:chunk id=v8-workflow-001 sha256=013233bfa935a24b668691318ea79c2f0a95787d05d0b033b82859a5999878ba -->
33
37
  ## 工作流物理表
34
38
 
35
39
  | 表名 | 说明 |
@@ -64,6 +68,8 @@ var history = V8.Db.FromSql(
64
68
  .ToArray();
65
69
  ```
66
70
 
71
+ <!-- /microi-progressive:chunk -->
72
+ <!-- microi-progressive:chunk id=v8-workflow-002 sha256=1f94d40c041929aafc45ec975f42bcbbc50c3ba424ed499c7bdf65fa73a41041 -->
67
73
  ## 流程 V8 事件执行顺序
68
74
 
69
75
  1. 用户点击发起流程或处理工作
@@ -80,6 +86,8 @@ var history = V8.Db.FromSql(
80
86
  12. **节点结束 V8 事件(后端 WFNodeEnd)**
81
87
  13. **节点结束 V8 事件(前端 WFNodeEnd)**
82
88
 
89
+ <!-- /microi-progressive:chunk -->
90
+ <!-- microi-progressive:chunk id=v8-workflow-003 sha256=f5776a5b8fe4e460f79e20e9806b3a80bcadf6f1e09408880bd5ca911cb79533 -->
83
91
  ## V8.WF 上下文属性
84
92
 
85
93
  ### 所有流程事件可访问
@@ -113,6 +121,8 @@ var history = V8.Db.FromSql(
113
121
  |------|------|
114
122
  | `V8.WF.WorkResult` | 流程执行结果(发送到了哪个节点、哪些审批人) |
115
123
 
124
+ <!-- /microi-progressive:chunk -->
125
+ <!-- microi-progressive:chunk id=v8-workflow-004 sha256=d8445c1d473579fde063179d6330eefaa2373f1166e837656b780058295de3a3 -->
116
126
  ## ApprovalType 审批类型
117
127
 
118
128
  | 值 | 说明 |
@@ -122,6 +132,8 @@ var history = V8.Db.FromSql(
122
132
  | `Recall` | 撤回 |
123
133
  | `Auto` | 发起流程(开始节点) / 业务节点 / 自动结束节点 |
124
134
 
135
+ <!-- /microi-progressive:chunk -->
136
+ <!-- microi-progressive:chunk id=v8-workflow-005 sha256=96e49e15fcb4b9da83f46b6818e198f338cb77ce76d11c56dfddebc2cc24f881 -->
125
137
  ## 条件判断 V8 事件(后端 WFNodeLine)
126
138
 
127
139
  根据业务规则决定流程走向。优先推荐设置 `V8.NextNodeId` 直接指定下一节点;如仍使用条件线的条件值,也可以设置 `V8.LineValue`。
@@ -139,88 +151,8 @@ if (V8.Form.Money <= 100) {
139
151
  }
140
152
  ```
141
153
 
142
- ## 节点开始 V8 事件
143
-
144
- ### 前端 — 指定审批人
145
-
146
- ```javascript
147
- // V8.EventName === 'WFNodeStart'
148
- // 可以强制指定下一节点审批人
149
- if (V8.Form.DeptId === 'special-dept') {
150
- V8.WF.ForceSelectUsers = ['user-id-1', 'user-id-2'];
151
- }
152
- ```
153
-
154
- ### 后端 — 阻止流程提交
155
-
156
- ```javascript
157
- // V8.EventName === 'WFNodeStart'
158
- // 返回 Code: 0 可以阻止流程提交并回滚事务
159
- if (!V8.Form.ApprovalFiles) {
160
- V8.Result = { Code: 0, Msg: '请先上传审批附件' };
161
- }
162
- ```
163
-
164
- ## 节点结束 V8 事件
165
-
166
- ### 后端 — 流程结束后业务处理
167
-
168
- ```javascript
169
- // V8.EventName === 'WFNodeEnd'
170
- var approvalType = V8.WF.ApprovalType;
171
-
172
- // 同意 — 更新业务状态
173
- if (approvalType === 'Agree') {
174
- // 判断是否到达最终节点
175
- var nextNode = V8.WF.NextNode;
176
- if (!nextNode || nextNode.NodeType === 'End') {
177
- // 流程结束,更新业务状态
178
- V8.FormEngine.UptFormData(V8.TableModel.Name, {
179
- Id: V8.Form.Id,
180
- ApprovalStatus: 'Approved',
181
- ApprovalTime: DateNow('yyyy-MM-dd HH:mm:ss')
182
- });
183
- }
184
- }
185
-
186
- // 拒绝 — 回退状态
187
- if (approvalType === 'Disagree') {
188
- V8.FormEngine.UptFormData(V8.TableModel.Name, {
189
- Id: V8.Form.Id,
190
- ApprovalStatus: 'Rejected',
191
- RejectReason: V8.WF.ApprovalIdea
192
- });
193
- }
194
-
195
- // 撤回
196
- if (approvalType === 'Recall') {
197
- V8.FormEngine.UptFormData(V8.TableModel.Name, {
198
- Id: V8.Form.Id,
199
- ApprovalStatus: 'Draft'
200
- });
201
- }
202
-
203
- // 通知下一审批人
204
- if (V8.WF.NextTodoUsers && V8.WF.NextTodoUsers.length > 0) {
205
- for (var i = 0; i < V8.WF.NextTodoUsers.length; i++) {
206
- V8.ApiEngine.Run('send-notification', {
207
- userId: V8.WF.NextTodoUsers[i].Id,
208
- title: '您有新的审批任务',
209
- content: V8.CurrentUser.Name + '提交了' + V8.TableModel.Name + '审批'
210
- });
211
- }
212
- }
213
- ```
214
-
215
- ### 前端 — 流程提交后提示
216
-
217
- ```javascript
218
- // V8.EventName === 'WFNodeEnd'
219
- if (V8.WF.WorkResult) {
220
- V8.Tips('流程已提交', true);
221
- }
222
- ```
223
-
154
+ <!-- /microi-progressive:chunk -->
155
+ <!-- microi-progressive:chunk id=v8-workflow-006 sha256=e67b72bf060a38ed5f94a57f3978026d151bb971fcf47a0b30a434dba819c264 -->
224
156
  ## 前端发起流程
225
157
 
226
158
  ```javascript
@@ -242,83 +174,10 @@ V8.WF.StartWork({
242
174
  });
243
175
  ```
244
176
 
245
- ## 前端打开流程表单
246
-
247
- ```javascript
248
- // 发起流程
249
- V8.OpenFormWF(V8.Form, 'Add', {
250
- WorkType: 'StartWork',
251
- FlowDesignId: 'flow-design-id'
252
- });
177
+ <!-- /microi-progressive:chunk -->
178
+ ## 详细参考路由(渐进披露)
253
179
 
254
- // 查看流程
255
- V8.OpenFormWF(V8.Form, 'View', {
256
- WorkType: 'ViewWork',
257
- FlowDesignId: 'flow-design-id'
258
- });
259
- ```
180
+ 仅在当前任务涉及对应主题时读取;下列文件合计保留了原 SKILL.md 的全部详细知识。
260
181
 
261
- ## MCP 创建/检查/测试工作流
262
-
263
- 从自然语言需求创建审批流时,优先整理成完整 Manifest 的 `workflows` 配置,再走 MCP 干跑和验收流程。
264
-
265
- ```json
266
- {
267
- "workflows": [
268
- {
269
- "FlowDesign": { "FlowName": "请假审批", "table": "diy_leave", "IsEnable": 1 },
270
- "Nodes": [
271
- { "Id": "start", "NodeName": "发起人", "NodeType": "Start", "LineValueV8": "" },
272
- { "Id": "leader", "NodeName": "部门负责人审批", "NodeType": "Approve", "Roles": "dept-leader" },
273
- { "Id": "end", "NodeName": "结束", "NodeType": "End" }
274
- ],
275
- "Lines": [
276
- { "Id": "line_start_leader", "FromNodeId": "start", "ToNodeId": "leader", "LineName": "发起人 到 部门负责人审批", "LineValue": "" },
277
- { "Id": "line_leader_end", "FromNodeId": "leader", "ToNodeId": "end", "LineName": "部门负责人审批 到 结束", "LineValue": "" }
278
- ]
279
- }
280
- ]
281
- }
282
- ```
283
-
284
- MCP 操作顺序:
285
-
286
- 1. `microi_get_db_schema`:确认业务表、已有流程、角色、字段。
287
- 2. `microi_get_manifest_schema`:按 Manifest 协议生成 tables/modules/workflows。
288
- 3. `microi_plan_system`:本地干跑,必须修复 workflow 拓扑错误。
289
- 4. `microi_check_workflow_package`:单独检查某个 workflow package。
290
- 5. `microi_test_workflow_condition`:对图形条件生成的 `LineValueV8` 传入样例 `formData`,验证会选中哪条路线。
291
- 6. `microi_generate_system` 或 `microi_save_workflow_package`:用户明确确认后再写入。
292
-
293
- 工作流建模规则:
294
-
295
- - 必须有且仅有 1 个开始节点,至少 1 个结束节点。
296
- - 所有 `wf_line.FromNodeId/ToNodeId` 必须指向存在的节点。
297
- - 线路标题 `LineName` 默认使用 `{起点节点名称} 到 {终点节点名称}`,不要把业务条件名写成线路标题。
298
- - 条件名称只作为图形配置/注释标记里的业务说明;修改条件名称不应改变线路标题。
299
- - 多出线节点必须配置条件判断 V8,优先设置 `V8.NextNodeId`,只有兼容旧条件值时才设置 `V8.LineValue`。
300
- - 图形条件生成的 V8 会带 `MICROI_WF_LINE_CONDITION_JSON` 标记,MCP 测试工具只解析该标记,不执行任意手写 V8。
301
-
302
- ## 发起流程与表单保存
303
-
304
- 新建业务数据并发起流程时,应先保存表单,再启动流程,或使用平台的合并接口 `StartWorkWithForm` 在同一事务里完成。首次发起建议以 `Add` 模式打开流程表单;如果前端提前生成了 `Id` 但业务表还没有该行,后端会使用 `_NoLineForAdd` 兜底,避免 `UptFormData` 报“数据显示不存在”。
305
-
306
- ## 流程相关表
307
-
308
- | 表 | 说明 |
309
- |---|---|
310
- | `WF_FlowDesign` | 流程图设计表 |
311
- | `WF_Node` | 流程节点属性表 |
312
- | `WF_Line` | 流程条件(线)属性表 |
313
- | `WF_Flow` | 流程实例表 |
314
- | `WF_Work` | 流程工作待办表 |
315
- | `WF_History` | 流程轨迹表 |
316
-
317
- ## 注意事项
318
-
319
- - 条件判断 V8 事件可以设置 `V8.NextNodeId` 直接指定下一节点;未设置时才按 `V8.LineValue` 匹配条件线的**条件值**
320
- - 配置图形化条件时,节点/路线标识来自流程拓扑,条件名称只是规则名称,不要用条件名称覆盖 `wf_line.LineName`
321
- - 节点开始后端事件返回 `{ Code: 0, Msg: '...' }` 或 `V8.Result = { Code: 0 }` 可阻止流程提交
322
- - 流程事件在事务中执行,任何节点返回失败都会回滚
323
- - `V8.WF.ApprovalType === 'Auto'` 表示自动节点(发起、业务节点、自动结束),无需人工审批
324
- - `V8.WF.ForceSelectUsers` 仅在**前端节点开始事件**中有效
182
+ - [references/progressive-01-节点开始-v8-事件.md](references/progressive-01-节点开始-v8-事件.md):节点开始 V8 事件;节点结束 V8 事件;前端打开流程表单;MCP 创建/检查/测试工作流;发起流程与表单保存;流程相关表;注意事项
183
+ <!-- microi-progressive:end -->
@@ -0,0 +1,180 @@
1
+ # v8-workflow 详细参考 1
2
+
3
+ > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
+
5
+ <!-- microi-progressive:chunk id=v8-workflow-007 sha256=9c40c62b67065c7e9f6821ef748d75595f004f069909258d9867490b74e115b7 -->
6
+ ## 节点开始 V8 事件
7
+
8
+ ### 前端 — 指定审批人
9
+
10
+ ```javascript
11
+ // V8.EventName === 'WFNodeStart'
12
+ // 可以强制指定下一节点审批人
13
+ if (V8.Form.DeptId === 'special-dept') {
14
+ V8.WF.ForceSelectUsers = ['user-id-1', 'user-id-2'];
15
+ }
16
+ ```
17
+
18
+ ### 后端 — 阻止流程提交
19
+
20
+ ```javascript
21
+ // V8.EventName === 'WFNodeStart'
22
+ // 返回 Code: 0 可以阻止流程提交并回滚事务
23
+ if (!V8.Form.ApprovalFiles) {
24
+ V8.Result = { Code: 0, Msg: '请先上传审批附件' };
25
+ }
26
+ ```
27
+
28
+ <!-- /microi-progressive:chunk -->
29
+ <!-- microi-progressive:chunk id=v8-workflow-008 sha256=f023312e7d95c518428c2e6d1df99b43cc36d41659aa75768b13ff83cf52b3b0 -->
30
+ ## 节点结束 V8 事件
31
+
32
+ ### 后端 — 流程结束后业务处理
33
+
34
+ ```javascript
35
+ // V8.EventName === 'WFNodeEnd'
36
+ var approvalType = V8.WF.ApprovalType;
37
+
38
+ // 同意 — 更新业务状态
39
+ if (approvalType === 'Agree') {
40
+ // 判断是否到达最终节点
41
+ var nextNode = V8.WF.NextNode;
42
+ if (!nextNode || nextNode.NodeType === 'End') {
43
+ // 流程结束,更新业务状态
44
+ V8.FormEngine.UptFormData(V8.TableModel.Name, {
45
+ Id: V8.Form.Id,
46
+ ApprovalStatus: 'Approved',
47
+ ApprovalTime: DateNow('yyyy-MM-dd HH:mm:ss')
48
+ });
49
+ }
50
+ }
51
+
52
+ // 拒绝 — 回退状态
53
+ if (approvalType === 'Disagree') {
54
+ V8.FormEngine.UptFormData(V8.TableModel.Name, {
55
+ Id: V8.Form.Id,
56
+ ApprovalStatus: 'Rejected',
57
+ RejectReason: V8.WF.ApprovalIdea
58
+ });
59
+ }
60
+
61
+ // 撤回
62
+ if (approvalType === 'Recall') {
63
+ V8.FormEngine.UptFormData(V8.TableModel.Name, {
64
+ Id: V8.Form.Id,
65
+ ApprovalStatus: 'Draft'
66
+ });
67
+ }
68
+
69
+ // 通知下一审批人
70
+ if (V8.WF.NextTodoUsers && V8.WF.NextTodoUsers.length > 0) {
71
+ for (var i = 0; i < V8.WF.NextTodoUsers.length; i++) {
72
+ V8.ApiEngine.Run('send-notification', {
73
+ userId: V8.WF.NextTodoUsers[i].Id,
74
+ title: '您有新的审批任务',
75
+ content: V8.CurrentUser.Name + '提交了' + V8.TableModel.Name + '审批'
76
+ });
77
+ }
78
+ }
79
+ ```
80
+
81
+ ### 前端 — 流程提交后提示
82
+
83
+ ```javascript
84
+ // V8.EventName === 'WFNodeEnd'
85
+ if (V8.WF.WorkResult) {
86
+ V8.Tips('流程已提交', true);
87
+ }
88
+ ```
89
+
90
+ <!-- /microi-progressive:chunk -->
91
+ <!-- microi-progressive:chunk id=v8-workflow-009 sha256=a927ce0325e130608823800c83c85d9e83d54fea61dbcfed32208d49f4012118 -->
92
+ ## 前端打开流程表单
93
+
94
+ ```javascript
95
+ // 发起流程
96
+ V8.OpenFormWF(V8.Form, 'Add', {
97
+ WorkType: 'StartWork',
98
+ FlowDesignId: 'flow-design-id'
99
+ });
100
+
101
+ // 查看流程
102
+ V8.OpenFormWF(V8.Form, 'View', {
103
+ WorkType: 'ViewWork',
104
+ FlowDesignId: 'flow-design-id'
105
+ });
106
+ ```
107
+
108
+ <!-- /microi-progressive:chunk -->
109
+ <!-- microi-progressive:chunk id=v8-workflow-010 sha256=ea15dea212f044a16bdccbf75ebe3a28ce3eb3ff27c989e8c6b4ec567e170032 -->
110
+ ## MCP 创建/检查/测试工作流
111
+
112
+ 从自然语言需求创建审批流时,优先整理成完整 Manifest 的 `workflows` 配置,再走 MCP 干跑和验收流程。
113
+
114
+ ```json
115
+ {
116
+ "workflows": [
117
+ {
118
+ "FlowDesign": { "FlowName": "请假审批", "table": "diy_leave", "IsEnable": 1 },
119
+ "Nodes": [
120
+ { "Id": "start", "NodeName": "发起人", "NodeType": "Start", "LineValueV8": "" },
121
+ { "Id": "leader", "NodeName": "部门负责人审批", "NodeType": "Approve", "Roles": "dept-leader" },
122
+ { "Id": "end", "NodeName": "结束", "NodeType": "End" }
123
+ ],
124
+ "Lines": [
125
+ { "Id": "line_start_leader", "FromNodeId": "start", "ToNodeId": "leader", "LineName": "发起人 到 部门负责人审批", "LineValue": "" },
126
+ { "Id": "line_leader_end", "FromNodeId": "leader", "ToNodeId": "end", "LineName": "部门负责人审批 到 结束", "LineValue": "" }
127
+ ]
128
+ }
129
+ ]
130
+ }
131
+ ```
132
+
133
+ MCP 操作顺序:
134
+
135
+ 1. `microi_get_db_schema`:确认业务表、已有流程、角色、字段。
136
+ 2. `microi_get_manifest_schema`:按 Manifest 协议生成 tables/modules/workflows。
137
+ 3. `microi_plan_system`:本地干跑,必须修复 workflow 拓扑错误。
138
+ 4. `microi_check_workflow_package`:单独检查某个 workflow package。
139
+ 5. `microi_test_workflow_condition`:对图形条件生成的 `LineValueV8` 传入样例 `formData`,验证会选中哪条路线。
140
+ 6. `microi_generate_system` 或 `microi_save_workflow_package`:用户明确确认后再写入。
141
+
142
+ 工作流建模规则:
143
+
144
+ - 必须有且仅有 1 个开始节点,至少 1 个结束节点。
145
+ - 所有 `wf_line.FromNodeId/ToNodeId` 必须指向存在的节点。
146
+ - 线路标题 `LineName` 默认使用 `{起点节点名称} 到 {终点节点名称}`,不要把业务条件名写成线路标题。
147
+ - 条件名称只作为图形配置/注释标记里的业务说明;修改条件名称不应改变线路标题。
148
+ - 多出线节点必须配置条件判断 V8,优先设置 `V8.NextNodeId`,只有兼容旧条件值时才设置 `V8.LineValue`。
149
+ - 图形条件生成的 V8 会带 `MICROI_WF_LINE_CONDITION_JSON` 标记,MCP 测试工具只解析该标记,不执行任意手写 V8。
150
+
151
+ <!-- /microi-progressive:chunk -->
152
+ <!-- microi-progressive:chunk id=v8-workflow-011 sha256=ab8c37da582f7463663ab9a609cf31e95c94e38181bc37b7c880a27f19f01a0e -->
153
+ ## 发起流程与表单保存
154
+
155
+ 新建业务数据并发起流程时,应先保存表单,再启动流程,或使用平台的合并接口 `StartWorkWithForm` 在同一事务里完成。首次发起建议以 `Add` 模式打开流程表单;如果前端提前生成了 `Id` 但业务表还没有该行,后端会使用 `_NoLineForAdd` 兜底,避免 `UptFormData` 报“数据显示不存在”。
156
+
157
+ <!-- /microi-progressive:chunk -->
158
+ <!-- microi-progressive:chunk id=v8-workflow-012 sha256=39a371dc5106862955945741a65c2fd08423cfedbc028e6aba0ba6aadde9cc34 -->
159
+ ## 流程相关表
160
+
161
+ | 表 | 说明 |
162
+ |---|---|
163
+ | `WF_FlowDesign` | 流程图设计表 |
164
+ | `WF_Node` | 流程节点属性表 |
165
+ | `WF_Line` | 流程条件(线)属性表 |
166
+ | `WF_Flow` | 流程实例表 |
167
+ | `WF_Work` | 流程工作待办表 |
168
+ | `WF_History` | 流程轨迹表 |
169
+
170
+ <!-- /microi-progressive:chunk -->
171
+ <!-- microi-progressive:chunk id=v8-workflow-013 sha256=1e0afbf91035c773357ab43dbc3658a62e368ce65ca329d1047d543558ea2e90 -->
172
+ ## 注意事项
173
+
174
+ - 条件判断 V8 事件可以设置 `V8.NextNodeId` 直接指定下一节点;未设置时才按 `V8.LineValue` 匹配条件线的**条件值**
175
+ - 配置图形化条件时,节点/路线标识来自流程拓扑,条件名称只是规则名称,不要用条件名称覆盖 `wf_line.LineName`
176
+ - 节点开始后端事件返回 `{ Code: 0, Msg: '...' }` 或 `V8.Result = { Code: 0 }` 可阻止流程提交
177
+ - 流程事件在事务中执行,任何节点返回失败都会回滚
178
+ - `V8.WF.ApprovalType === 'Auto'` 表示自动节点(发起、业务节点、自动结束),无需人工审批
179
+ - `V8.WF.ForceSelectUsers` 仅在**前端节点开始事件**中有效
180
+ <!-- /microi-progressive:chunk -->