@microi.net/cli 6.1.4 → 6.1.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 (104) 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/assets/build-meta.json +4 -4
  8. package/cordis.patch.yml +1 -1
  9. package/package.json +1 -1
  10. package/scripts/codex-marketplace.json +20 -20
  11. package/scripts/mcp-codex-stdio-adapter.js +189 -189
  12. package/scripts/mcp-server.js +79 -79
  13. package/scripts/mcp-trae-windows-launcher.cmd +21 -21
  14. package/scripts/microi-cli-mcp.js +7 -7
  15. package/scripts/microi-skills.meta.json +290 -290
  16. package/skills/.microi-skills-version.json +2 -2
  17. package/skills/.progressive-disclosure-manifest.json +13 -13
  18. package/skills/ai-engine/references/ai-employees.md +48 -48
  19. package/skills/ai-engine/references/self-hosted-digital-human.md +59 -59
  20. package/skills/business-blueprint/SKILL.md +193 -193
  21. package/skills/datasource-engine/SKILL.md +93 -93
  22. package/skills/dos-orm/SKILL.md +105 -105
  23. package/skills/dos-orm/references/api-reference.md +229 -229
  24. package/skills/email-engine/SKILL.md +81 -81
  25. package/skills/email-engine/references/v8-email.md +34 -34
  26. package/skills/job-engine/SKILL.md +179 -179
  27. package/skills/message-notification/SKILL.md +160 -156
  28. package/skills/message-notification/references/contracts.md +119 -102
  29. package/skills/microi/SKILL.md +14 -14
  30. package/skills/microi-ai-application/SKILL.md +115 -115
  31. package/skills/microi-ai-application/references/frontend-baseline.md +164 -164
  32. 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 +10 -10
  33. 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 +10 -10
  34. 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 +10 -10
  35. package/skills/microi-codex/SKILL.md +133 -130
  36. package/skills/microi-datasource-mapping/SKILL.md +131 -131
  37. package/skills/microi-db-schema/SKILL.md +182 -182
  38. package/skills/microi-db-schema/references/core-tables.md +695 -695
  39. package/skills/microi-db-schema/references/form-component-options.md +256 -256
  40. package/skills/microi-db-schema/references/schema-overview.md +202 -202
  41. package/skills/microi-db-schema/references/schema.md +646 -646
  42. package/skills/microi-db-schema/references/table-catalog.md +1599 -1599
  43. package/skills/microi-deployment/SKILL.md +262 -262
  44. package/skills/microi-deployment/references/deployment-matrix.md +112 -112
  45. package/skills/microi-docs-coverage/SKILL.md +133 -133
  46. package/skills/microi-docs-coverage/references/capability-map.md +91 -91
  47. package/skills/microi-form-engine/SKILL.md +338 -338
  48. package/skills/microi-form-engine/references/component-catalog.md +218 -218
  49. package/skills/microi-form-engine/references/data-source-events.md +124 -124
  50. package/skills/microi-left-right-layout/SKILL.md +141 -141
  51. package/skills/microi-microservice/references/runtime-delivery.md +282 -282
  52. package/skills/microi-solution-quotation/SKILL.md +79 -79
  53. package/skills/microi-sso/SKILL.md +102 -102
  54. package/skills/microi-sso/references/configuration-and-security.md +53 -53
  55. package/skills/microi-sso/references/inbound.md +53 -53
  56. package/skills/microi-sso/references/outbound.md +43 -43
  57. package/skills/microi-system-delivery/references/context-quality.md +3 -3
  58. package/skills/microi-system-delivery/references/progressive-01-/346/240/207/345/207/206/345/267/245/344/275/234/346/265/201.md +11 -11
  59. 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 +12 -12
  60. package/skills/microi-system-delivery/references/progressive-03-/345/256/211/345/205/250/344/270/216/350/267/250/347/253/257/351/252/214/346/224/266.md +8 -8
  61. package/skills/module-engine/SKILL.md +297 -297
  62. package/skills/module-engine/references/module-config.md +204 -204
  63. package/skills/ocr-engine/SKILL.md +113 -113
  64. 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 +10 -10
  65. 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 +12 -12
  66. package/skills/performance-testing/SKILL.md +227 -227
  67. package/skills/print-engine/SKILL.md +259 -259
  68. package/skills/production-readonly-audit/SKILL.md +41 -41
  69. package/skills/report-engine/SKILL.md +83 -83
  70. package/skills/search-engine/SKILL.md +75 -75
  71. package/skills/spider-engine/SKILL.md +190 -190
  72. package/skills/system-observability/SKILL.md +264 -264
  73. package/skills/system-observability/references/memory-incident-triage.md +77 -77
  74. package/skills/translate-engine/SKILL.md +140 -140
  75. package/skills/ui-design/assets/templates/MCI-DESIGN.md +206 -206
  76. package/skills/ui-design/references/design-pattern-library.md +184 -184
  77. package/skills/ui-design/references/mci-design-contract.md +163 -163
  78. package/skills/ui-design/references/motion-and-media.md +78 -78
  79. package/skills/ui-design/references/product-flow-recipes.md +94 -94
  80. package/skills/uniapp-mall-assets/SKILL.md +176 -176
  81. package/skills/unity-integration/SKILL.md +178 -178
  82. package/skills/unity-integration/references/sdk-api.md +82 -82
  83. package/skills/unity-integration/references/toolbox-migration.md +66 -66
  84. package/skills/unity-integration/references/webgl-hosting.md +57 -57
  85. package/skills/v8-cache-pattern/SKILL.md +320 -320
  86. package/skills/v8-debugging/SKILL.md +284 -284
  87. package/skills/v8-explorer-tree/SKILL.md +228 -228
  88. package/skills/v8-file-upload/SKILL.md +20 -1
  89. package/skills/v8-file-upload/references/cdn-alias-repair.md +13 -13
  90. package/skills/v8-frontend-events/references/bluetooth-print-api.md +135 -135
  91. package/skills/v8-frontend-events/references/bluetooth-print.md +258 -258
  92. package/skills/v8-image-processing/SKILL.md +190 -190
  93. package/skills/v8-image-processing/references/api-reference.md +623 -623
  94. package/skills/v8-mongodb/SKILL.md +257 -241
  95. package/skills/v8-mq-mqtt/references/mqtt-production.md +352 -352
  96. package/skills/v8-security/SKILL.md +8 -1
  97. package/skills/v8-sql-query/SKILL.md +302 -302
  98. package/skills/v8-template-engine/SKILL.md +167 -167
  99. package/skills/v8-utilities/references/platform-http-routes.md +83 -83
  100. package/skills/v8-workflow/references/workflow-configuration.md +49 -49
  101. package/skills/vision-engine/SKILL.md +160 -160
  102. package/skills/vision-engine/references/architecture-and-acceptance.md +194 -194
  103. 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 +34 -34
  104. 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 +6 -6
@@ -1,167 +1,167 @@
1
- ---
2
- name: v8-template-engine
3
- description: Microi V8 模板引擎指南。用于编写表格/表单模板渲染、V8.Result HTML/text 输出、行格式化、徽章、图片和自定义显示逻辑。
4
- ---
5
-
6
- > **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
7
-
8
- # Microi V8 模板引擎(表格/表单 V8 模板)
9
-
10
- 你正在为 Microi 吾码平台编写 **表格 V8 模板引擎**、**表单 V8 模板引擎** 代码。模板引擎用于在数据渲染后自定义最终展示效果(颜色、徽章、图片、HTML),是表单引擎的高级特性。
11
-
12
- ## 核心规则
13
-
14
- - 模板引擎绑定在【表单属性】的【表格 V8 模板引擎】或【表单 V8 模板引擎】
15
- - 通过给 `V8.Result` 赋值字符串(HTML 或纯文本)来控制最终渲染结果
16
- - 在 **表格模板** 中:每行数据都会执行一次,`V8.Form` 是当前行数据
17
- - 注意:`V8.Form` 此时只能访问到【模块引擎】配置的【查询列】字段;若查询列为空则可访问全部字段
18
- - 支持 `bootstrap`、`element-ui` 样式类名
19
- - `V8.EventName` 可能为 `TableTemplateEngine` 或 `FormTemplateEngine`
20
- - 表格模板同步执行,输出优先级是 `V8.Result` → JavaScript `return` → 原字段值;表单模板异步执行并以 `V8.Result` 为输出
21
- - 模板结果通过 `v-safe-html`/DOMPurify 净化。`script`、`iframe`、`on*` 事件属性、`javascript:` 等危险内容会被剥离,禁止依赖内联点击事件
22
- - 业务文本必须 HTML 转义后再拼接;权限、校验、状态写入等业务逻辑必须放后端
23
-
24
- 模板中需要拼 HTML 时,先定义安全转义函数:
25
-
26
- ```javascript
27
- var escapeHtml = function (value) {
28
- return String(value == null ? '' : value)
29
- .replace(/&/g, '&')
30
- .replace(/</g, '&lt;')
31
- .replace(/>/g, '&gt;')
32
- .replace(/"/g, '&quot;')
33
- .replace(/'/g, '&#39;');
34
- };
35
- ```
36
-
37
- ## 状态徽章(Bootstrap 样式)
38
-
39
- ```javascript
40
- var value = V8.Form.Zhuangtai;
41
- if (V8.IsNull(value)) {
42
- V8.Result = '';
43
- } else {
44
- var classStr = 'badge-primary';
45
- if (value === '禁用') classStr = 'badge-danger';
46
- else if (value === '未通过') classStr = 'badge-warning';
47
- else if (value === '待审核') classStr = 'badge-info';
48
- else if (value === '通过') classStr = 'badge-success';
49
- V8.Result = '<span class="badge badge-pill ' + classStr + '">' + escapeHtml(value) + '</span>';
50
- }
51
- ```
52
-
53
- 可用 Bootstrap 徽章类:`badge-primary`, `badge-secondary`, `badge-success`, `badge-danger`, `badge-warning`, `badge-info`, `badge-light`, `badge-dark`
54
-
55
- ## 内联样式(颜色高亮)
56
-
57
- ```javascript
58
- // 不同业务状态显示不同字体颜色
59
- if (V8.Form.XuqiuLX === '合并') {
60
- V8.Result = '<span style="color:blue;">' + escapeHtml(V8.Form.XuqiuDDH) + '</span>';
61
- } else if (V8.Form.HebingID) {
62
- V8.Result = '<span style="color:#999;">' + escapeHtml(V8.Form.XuqiuDDH) + '</span>';
63
- } else {
64
- V8.Result = escapeHtml(V8.Form.XuqiuDDH);
65
- }
66
- ```
67
-
68
- ## 单图列渲染
69
-
70
- ```javascript
71
- var html = '';
72
- var fileServer = V8.SysConfig.FileServer;
73
- if (!V8.IsNull(V8.Form.GongsiLOGO)) {
74
- html = '<img src="' + escapeHtml(fileServer + V8.Form.GongsiLOGO) + '" '
75
- + 'alt="公司Logo" '
76
- + 'style="height:40px;width:40px;object-fit:cover;margin:5px 0;" />';
77
- }
78
- V8.Result = html;
79
- ```
80
-
81
- ## 多图列渲染(带点击放大)
82
-
83
- ```javascript
84
- var html = '';
85
- var fileServer = V8.SysConfig.FileServer;
86
- if (!V8.IsNull(V8.Form.TupianMS) && V8.Form.TupianMS.indexOf('[') !== -1) {
87
- var imgs = JSON.parse(V8.Form.TupianMS);
88
- imgs.forEach(function(item) {
89
- var url = escapeHtml(fileServer + item.Path);
90
- html += '<a href="' + url + '" target="_blank" rel="noopener noreferrer">'
91
- + '<img src="' + url + '" alt="图片" '
92
- + 'style="width:40px;height:40px;object-fit:cover;margin:5px 5px 5px 0;" />'
93
- + '</a>';
94
- });
95
- }
96
- V8.Result = html;
97
- ```
98
-
99
- ## 进度条渲染
100
-
101
- ```javascript
102
- var percent = V8.Form.Progress || 0;
103
- var color = '#67C23A';
104
- if (percent < 30) color = '#F56C6C';
105
- else if (percent < 70) color = '#E6A23C';
106
-
107
- V8.Result =
108
- '<div style="width:100%;background:#eee;border-radius:4px;height:16px;position:relative;">'
109
- + '<div style="width:' + percent + '%;background:' + color + ';height:100%;border-radius:4px;"></div>'
110
- + '<span style="position:absolute;left:50%;top:0;transform:translateX(-50%);color:#333;font-size:12px;line-height:16px;">' + percent + '%</span>'
111
- + '</div>';
112
- ```
113
-
114
- ## 多字段合并显示
115
-
116
- ```javascript
117
- // 联系人姓名 + 电话脱敏
118
- var name = V8.Form.LianxiR || '';
119
- var phone = V8.Form.LianxiPhone || '';
120
- if (phone.length === 11) phone = phone.substring(0, 3) + '****' + phone.substring(7);
121
- V8.Result = '<div><b>' + escapeHtml(name) + '</b><br/><small style="color:#999;">'
122
- + escapeHtml(phone) + '</small></div>';
123
- ```
124
-
125
- 模块引擎已有更轻量的声明式方案:`ViewSchema.Layout.List.Columns` 可用 `Field + Lines +
126
- TrailingFields` 组成多行列,`Layout.Card` 可配置移动端顶部、右侧、正文、元信息和底部字段。
127
- 仅需要多字段排版、图标、`Tone/Color/Prefix/Suffix` 时优先使用声明式配置;需要复杂条件
128
- HTML 时再给被引用的 `diy_field` 配置 `V8TmpEngineTable`。两种方式都会复用净化后的模板
129
- 结果,且所有引用字段仍必须在模块查询列或 `_SelectFields` 中。
130
-
131
- ## 条件性图标
132
-
133
- ```javascript
134
- var html = escapeHtml(V8.Form.Title || '');
135
- if (V8.Form.IsHot === 1) html += ' <i class="fas fa-fire" style="color:#F56C6C;"></i>';
136
- if (V8.Form.IsNew === 1) html += ' <span class="badge badge-danger">NEW</span>';
137
- V8.Result = html;
138
- ```
139
-
140
- ## 与字段值变更事件配合(动态计算)
141
-
142
- ```javascript
143
- // 表格模板中根据多个字段计算
144
- var price = parseFloat(V8.Form.Price) || 0;
145
- var discount = parseFloat(V8.Form.Discount) || 1;
146
- var total = (price * discount).toFixed(2);
147
- var color = total > 1000 ? '#F56C6C' : '#67C23A';
148
- V8.Result = '<span style="color:' + color + ';font-weight:bold;">¥' + total + '</span>';
149
- ```
150
-
151
- ## 常见错误
152
-
153
- ❌ 不要在模板中调用 `V8.FormEngine`(每行都查 → N+1 性能问题);需要关联数据时在查询列、接口引擎或后端 `DataFilterV8` 预取,只有 `DataFilterV8` 才提供 `V8.CacheData`
154
- ❌ 不要依赖对象/数组的隐式字符串化;`V8.Result` 建议显式输出字符串
155
- ❌ 模板中 `V8.Form` 默认只有【查询列】字段;缺字段就要去模块引擎补查询列
156
- ❌ 不要在模板里写复杂业务逻辑(应放到接口引擎或 DataFilterV8)
157
- ❌ 不要输出 `onclick/onerror`、`script/iframe` 或 `javascript:` URL;DOMPurify 会剥离这些内容
158
-
159
- ## 与 DataFilterV8 的区别
160
-
161
- | | DataFilterV8(后端) | 模板引擎(前端) |
162
- |---|---|---|
163
- | 运行端 | 服务器 | 浏览器 |
164
- | 用途 | 加工数据、脱敏、补字段 | 渲染 HTML 样式 |
165
- | 输出 | `V8.Form.字段 = ...` | `V8.Result = '<html>...</html>'` |
166
- | 字段范围 | 全部数据 | 仅查询列 |
167
- | 性能 | 每行执行(可用 `V8.CacheData`) | 浏览器渲染时执行 |
1
+ ---
2
+ name: v8-template-engine
3
+ description: Microi V8 模板引擎指南。用于编写表格/表单模板渲染、V8.Result HTML/text 输出、行格式化、徽章、图片和自定义显示逻辑。
4
+ ---
5
+
6
+ > **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
7
+
8
+ # Microi V8 模板引擎(表格/表单 V8 模板)
9
+
10
+ 你正在为 Microi 吾码平台编写 **表格 V8 模板引擎**、**表单 V8 模板引擎** 代码。模板引擎用于在数据渲染后自定义最终展示效果(颜色、徽章、图片、HTML),是表单引擎的高级特性。
11
+
12
+ ## 核心规则
13
+
14
+ - 模板引擎绑定在【表单属性】的【表格 V8 模板引擎】或【表单 V8 模板引擎】
15
+ - 通过给 `V8.Result` 赋值字符串(HTML 或纯文本)来控制最终渲染结果
16
+ - 在 **表格模板** 中:每行数据都会执行一次,`V8.Form` 是当前行数据
17
+ - 注意:`V8.Form` 此时只能访问到【模块引擎】配置的【查询列】字段;若查询列为空则可访问全部字段
18
+ - 支持 `bootstrap`、`element-ui` 样式类名
19
+ - `V8.EventName` 可能为 `TableTemplateEngine` 或 `FormTemplateEngine`
20
+ - 表格模板同步执行,输出优先级是 `V8.Result` → JavaScript `return` → 原字段值;表单模板异步执行并以 `V8.Result` 为输出
21
+ - 模板结果通过 `v-safe-html`/DOMPurify 净化。`script`、`iframe`、`on*` 事件属性、`javascript:` 等危险内容会被剥离,禁止依赖内联点击事件
22
+ - 业务文本必须 HTML 转义后再拼接;权限、校验、状态写入等业务逻辑必须放后端
23
+
24
+ 模板中需要拼 HTML 时,先定义安全转义函数:
25
+
26
+ ```javascript
27
+ var escapeHtml = function (value) {
28
+ return String(value == null ? '' : value)
29
+ .replace(/&/g, '&amp;')
30
+ .replace(/</g, '&lt;')
31
+ .replace(/>/g, '&gt;')
32
+ .replace(/"/g, '&quot;')
33
+ .replace(/'/g, '&#39;');
34
+ };
35
+ ```
36
+
37
+ ## 状态徽章(Bootstrap 样式)
38
+
39
+ ```javascript
40
+ var value = V8.Form.Zhuangtai;
41
+ if (V8.IsNull(value)) {
42
+ V8.Result = '';
43
+ } else {
44
+ var classStr = 'badge-primary';
45
+ if (value === '禁用') classStr = 'badge-danger';
46
+ else if (value === '未通过') classStr = 'badge-warning';
47
+ else if (value === '待审核') classStr = 'badge-info';
48
+ else if (value === '通过') classStr = 'badge-success';
49
+ V8.Result = '<span class="badge badge-pill ' + classStr + '">' + escapeHtml(value) + '</span>';
50
+ }
51
+ ```
52
+
53
+ 可用 Bootstrap 徽章类:`badge-primary`, `badge-secondary`, `badge-success`, `badge-danger`, `badge-warning`, `badge-info`, `badge-light`, `badge-dark`
54
+
55
+ ## 内联样式(颜色高亮)
56
+
57
+ ```javascript
58
+ // 不同业务状态显示不同字体颜色
59
+ if (V8.Form.XuqiuLX === '合并') {
60
+ V8.Result = '<span style="color:blue;">' + escapeHtml(V8.Form.XuqiuDDH) + '</span>';
61
+ } else if (V8.Form.HebingID) {
62
+ V8.Result = '<span style="color:#999;">' + escapeHtml(V8.Form.XuqiuDDH) + '</span>';
63
+ } else {
64
+ V8.Result = escapeHtml(V8.Form.XuqiuDDH);
65
+ }
66
+ ```
67
+
68
+ ## 单图列渲染
69
+
70
+ ```javascript
71
+ var html = '';
72
+ var fileServer = V8.SysConfig.FileServer;
73
+ if (!V8.IsNull(V8.Form.GongsiLOGO)) {
74
+ html = '<img src="' + escapeHtml(fileServer + V8.Form.GongsiLOGO) + '" '
75
+ + 'alt="公司Logo" '
76
+ + 'style="height:40px;width:40px;object-fit:cover;margin:5px 0;" />';
77
+ }
78
+ V8.Result = html;
79
+ ```
80
+
81
+ ## 多图列渲染(带点击放大)
82
+
83
+ ```javascript
84
+ var html = '';
85
+ var fileServer = V8.SysConfig.FileServer;
86
+ if (!V8.IsNull(V8.Form.TupianMS) && V8.Form.TupianMS.indexOf('[') !== -1) {
87
+ var imgs = JSON.parse(V8.Form.TupianMS);
88
+ imgs.forEach(function(item) {
89
+ var url = escapeHtml(fileServer + item.Path);
90
+ html += '<a href="' + url + '" target="_blank" rel="noopener noreferrer">'
91
+ + '<img src="' + url + '" alt="图片" '
92
+ + 'style="width:40px;height:40px;object-fit:cover;margin:5px 5px 5px 0;" />'
93
+ + '</a>';
94
+ });
95
+ }
96
+ V8.Result = html;
97
+ ```
98
+
99
+ ## 进度条渲染
100
+
101
+ ```javascript
102
+ var percent = V8.Form.Progress || 0;
103
+ var color = '#67C23A';
104
+ if (percent < 30) color = '#F56C6C';
105
+ else if (percent < 70) color = '#E6A23C';
106
+
107
+ V8.Result =
108
+ '<div style="width:100%;background:#eee;border-radius:4px;height:16px;position:relative;">'
109
+ + '<div style="width:' + percent + '%;background:' + color + ';height:100%;border-radius:4px;"></div>'
110
+ + '<span style="position:absolute;left:50%;top:0;transform:translateX(-50%);color:#333;font-size:12px;line-height:16px;">' + percent + '%</span>'
111
+ + '</div>';
112
+ ```
113
+
114
+ ## 多字段合并显示
115
+
116
+ ```javascript
117
+ // 联系人姓名 + 电话脱敏
118
+ var name = V8.Form.LianxiR || '';
119
+ var phone = V8.Form.LianxiPhone || '';
120
+ if (phone.length === 11) phone = phone.substring(0, 3) + '****' + phone.substring(7);
121
+ V8.Result = '<div><b>' + escapeHtml(name) + '</b><br/><small style="color:#999;">'
122
+ + escapeHtml(phone) + '</small></div>';
123
+ ```
124
+
125
+ 模块引擎已有更轻量的声明式方案:`ViewSchema.Layout.List.Columns` 可用 `Field + Lines +
126
+ TrailingFields` 组成多行列,`Layout.Card` 可配置移动端顶部、右侧、正文、元信息和底部字段。
127
+ 仅需要多字段排版、图标、`Tone/Color/Prefix/Suffix` 时优先使用声明式配置;需要复杂条件
128
+ HTML 时再给被引用的 `diy_field` 配置 `V8TmpEngineTable`。两种方式都会复用净化后的模板
129
+ 结果,且所有引用字段仍必须在模块查询列或 `_SelectFields` 中。
130
+
131
+ ## 条件性图标
132
+
133
+ ```javascript
134
+ var html = escapeHtml(V8.Form.Title || '');
135
+ if (V8.Form.IsHot === 1) html += ' <i class="fas fa-fire" style="color:#F56C6C;"></i>';
136
+ if (V8.Form.IsNew === 1) html += ' <span class="badge badge-danger">NEW</span>';
137
+ V8.Result = html;
138
+ ```
139
+
140
+ ## 与字段值变更事件配合(动态计算)
141
+
142
+ ```javascript
143
+ // 表格模板中根据多个字段计算
144
+ var price = parseFloat(V8.Form.Price) || 0;
145
+ var discount = parseFloat(V8.Form.Discount) || 1;
146
+ var total = (price * discount).toFixed(2);
147
+ var color = total > 1000 ? '#F56C6C' : '#67C23A';
148
+ V8.Result = '<span style="color:' + color + ';font-weight:bold;">¥' + total + '</span>';
149
+ ```
150
+
151
+ ## 常见错误
152
+
153
+ ❌ 不要在模板中调用 `V8.FormEngine`(每行都查 → N+1 性能问题);需要关联数据时在查询列、接口引擎或后端 `DataFilterV8` 预取,只有 `DataFilterV8` 才提供 `V8.CacheData`
154
+ ❌ 不要依赖对象/数组的隐式字符串化;`V8.Result` 建议显式输出字符串
155
+ ❌ 模板中 `V8.Form` 默认只有【查询列】字段;缺字段就要去模块引擎补查询列
156
+ ❌ 不要在模板里写复杂业务逻辑(应放到接口引擎或 DataFilterV8)
157
+ ❌ 不要输出 `onclick/onerror`、`script/iframe` 或 `javascript:` URL;DOMPurify 会剥离这些内容
158
+
159
+ ## 与 DataFilterV8 的区别
160
+
161
+ | | DataFilterV8(后端) | 模板引擎(前端) |
162
+ |---|---|---|
163
+ | 运行端 | 服务器 | 浏览器 |
164
+ | 用途 | 加工数据、脱敏、补字段 | 渲染 HTML 样式 |
165
+ | 输出 | `V8.Form.字段 = ...` | `V8.Result = '<html>...</html>'` |
166
+ | 字段范围 | 全部数据 | 仅查询列 |
167
+ | 性能 | 每行执行(可用 `V8.CacheData`) | 浏览器渲染时执行 |
@@ -1,83 +1,83 @@
1
- # Microi 平台 HTTP 路由索引
2
-
3
- 本索引用于识别中文官网示例中的平台路由。路由可用不等于当前用户有权限;始终
4
- 传当前租户 `OsClient`,使用受支持的 Token/访问密钥,并让服务端重新做菜单、
5
- 表单、字段和数据范围校验。
6
-
7
- ## 接口引擎
8
-
9
- | 路由 | 用途 |
10
- |---|---|
11
- | `POST /apiengine/{ApiEngineKey}` | 推荐的稳定接口引擎入口 |
12
- | `POST /api/ApiEngine/Run` | 仅旧客户端兼容,Body 传 `ApiEngineKey`;新增固定业务禁止使用 |
13
- | `/apiengine/{ApiEngineKey}--OsClient--{OsClient}--` | 仅用于确实无法设置 Header/Form/Query 的 GET/HEAD 场景 |
14
-
15
- 普通请求优先在唯一 `osclient` Header 传租户,也可在 Query/Form/JSON 中冗余;
16
- 固定业务必须使用真实引擎动态地址或唯一 `ApiAddress`,使日志、流量、审计和限流
17
- 直接按引擎归因;旧通用入口只能由显式 `RunLegacy` 调用。
18
- 不要无脑把特殊租户后缀加到每条 URL。官网中的
19
- `/apiengine/test1`、`/apiengine/get-product-list`、打印、支付和 Excel demo
20
- 都是业务 `ApiEngineKey` 示例,不是固定平台接口。
21
-
22
- ## FormEngine
23
-
24
- 标准 Controller 路由:
25
-
26
- | 路由 | 用途 |
27
- |---|---|
28
- | `POST /api/formengine/GetTableData` | 查询列表 |
29
- | `POST /api/formengine/GetFormData` | 查询单条 |
30
- | `POST /api/formengine/AddFormData` | 新增 |
31
- | `POST /api/formengine/UptFormData` | 更新 |
32
- | `POST /api/formengine/DelFormData` | 删除 |
33
- | `POST /api/formengine/UptFormDataByWhere` | 按条件更新 |
34
- | `POST /api/formengine/DelFormDataByWhere` | 按条件删除 |
35
- | `POST /api/formengine/GetTableDataAnonymous` | 表配置允许时匿名查列表 |
36
- | `POST /api/formengine/GetFormDataAnonymous` | 表配置允许时匿名查单条 |
37
- | `POST /api/formengine/AddFormDataAnonymous` | 表配置允许时匿名新增 |
38
-
39
- 动态路由还支持
40
- `/api/formengine/{operation}-{FormEngineKey}`(兼容无连字符操作名与连字符操作名)。
41
- 访问密钥只需获得相应表/页面和 `form:read` 等作用域,不应把每个动态 URL 加入
42
- 无条件白名单。完整调用模型见 `v8-formengine-http`。
43
-
44
- ## 文件、消息、验证码与诊断
45
-
46
- | 路由 | 用途与边界 |
47
- |---|---|
48
- | `GET /api/Captcha/getCaptcha` | 获取验证码图片;同时保存响应 `captchaid` |
49
- | `POST /api/Captcha/Recognize` | 受控验证码识别,主要供采集引擎 |
50
- | `POST /api/HDFS/Upload` | 受限文件上传;优先用平台 SDK/V8 Upload |
51
- | `POST /apiengine/platform-private-file-url` | 获取当前租户短期私有文件地址;必须携带权威资源上下文 |
52
- | `GET /api/HDFS/OpenPrivateFile` | 受权打开私有文件/Office 代理 |
53
- | `POST /api/DiyChat/SendSystemMessage` | 发送站内消息;前端优先 `V8.SendSystemMessage` |
54
- | `POST /apiengine/platform-mq` | MQ 管理入口;Body 使用 `Action=Send`,仅当前租户超级管理员 |
55
- | `GET /apiengine/platform-service-health?OsClient={OsClient}` | 新版客户端固定匿名健康契约;返回 `Data.Status=Healthy`,新二进制同时返回真实后端版本;应用包先发布时版本可暂时为空,但健康结论不失败;不查询业务表 |
56
- | `GET /api/Diagnostics/health` | 旧节点滚动升级兼容健康路由;新版客户端不以它作为主要契约 |
57
- | `GET /api/Diagnostics/liveness` | 进程存活检查,不代表已就绪接流量 |
58
-
59
- `/api/example`、`/api/example/1` 仅用于说明 `V8.Http` 的普通 Controller 地址,
60
- 不属于 Microi 固定接口。
61
-
62
- ## 管理与内部交付接口
63
-
64
- 下列路由不是普通业务 SDK:
65
-
66
- | 路由 | 限制 |
67
- |---|---|
68
- | `POST /api/DiyField/UptDiyFieldList` | 开发设计字段批量保存;需设计权限 |
69
- | `POST /api/FormEngine/ImportDiyTableRow` | 表格/子表导入;后端复核字段、外键和权限 |
70
- | `POST /api/SysUser/GetSysUserPassword` | 仅存量 DES 密码的超级管理员兼容查看;必须审计,访问密钥/普通角色拒绝 |
71
- | `POST /api/V8Engine/UploadApplicationAssetStream` | 管理员应用文件分片流式上传 |
72
- | `POST /api/V8Engine/FinalizeApplicationStreamPublish` | 校验清单并原子切换应用版本 |
73
-
74
- 应用流式发布必须使用 MCP/平台发布流程:文件逐个校验 SHA-256,版本目录不可变,
75
- 同一应用用跨节点锁串行,入口文件最后切换。不得把这两个内部路由包装成匿名上传。
76
-
77
- ## 安全检查
78
-
79
- - URL 不携带长期 Token、密码、连接串、私钥或 Redis 凭据。
80
- - 动态表名、ApiEngineKey、文件路径和 redirect 都先走白名单/授权。
81
- - 匿名路由只对明确开启的表或接口生效,仍要限流、限大小并做业务校验。
82
- - 管理接口必须核验当前租户与管理员身份,写后回读;超时先回读,不能盲目重试。
83
- - 示例 URL 中的租户、表 Key、接口 Key 和 Id 都是占位值,不复制为生产常量。
1
+ # Microi 平台 HTTP 路由索引
2
+
3
+ 本索引用于识别中文官网示例中的平台路由。路由可用不等于当前用户有权限;始终
4
+ 传当前租户 `OsClient`,使用受支持的 Token/访问密钥,并让服务端重新做菜单、
5
+ 表单、字段和数据范围校验。
6
+
7
+ ## 接口引擎
8
+
9
+ | 路由 | 用途 |
10
+ |---|---|
11
+ | `POST /apiengine/{ApiEngineKey}` | 推荐的稳定接口引擎入口 |
12
+ | `POST /api/ApiEngine/Run` | 仅旧客户端兼容,Body 传 `ApiEngineKey`;新增固定业务禁止使用 |
13
+ | `/apiengine/{ApiEngineKey}--OsClient--{OsClient}--` | 仅用于确实无法设置 Header/Form/Query 的 GET/HEAD 场景 |
14
+
15
+ 普通请求优先在唯一 `osclient` Header 传租户,也可在 Query/Form/JSON 中冗余;
16
+ 固定业务必须使用真实引擎动态地址或唯一 `ApiAddress`,使日志、流量、审计和限流
17
+ 直接按引擎归因;旧通用入口只能由显式 `RunLegacy` 调用。
18
+ 不要无脑把特殊租户后缀加到每条 URL。官网中的
19
+ `/apiengine/test1`、`/apiengine/get-product-list`、打印、支付和 Excel demo
20
+ 都是业务 `ApiEngineKey` 示例,不是固定平台接口。
21
+
22
+ ## FormEngine
23
+
24
+ 标准 Controller 路由:
25
+
26
+ | 路由 | 用途 |
27
+ |---|---|
28
+ | `POST /api/formengine/GetTableData` | 查询列表 |
29
+ | `POST /api/formengine/GetFormData` | 查询单条 |
30
+ | `POST /api/formengine/AddFormData` | 新增 |
31
+ | `POST /api/formengine/UptFormData` | 更新 |
32
+ | `POST /api/formengine/DelFormData` | 删除 |
33
+ | `POST /api/formengine/UptFormDataByWhere` | 按条件更新 |
34
+ | `POST /api/formengine/DelFormDataByWhere` | 按条件删除 |
35
+ | `POST /api/formengine/GetTableDataAnonymous` | 表配置允许时匿名查列表 |
36
+ | `POST /api/formengine/GetFormDataAnonymous` | 表配置允许时匿名查单条 |
37
+ | `POST /api/formengine/AddFormDataAnonymous` | 表配置允许时匿名新增 |
38
+
39
+ 动态路由还支持
40
+ `/api/formengine/{operation}-{FormEngineKey}`(兼容无连字符操作名与连字符操作名)。
41
+ 访问密钥只需获得相应表/页面和 `form:read` 等作用域,不应把每个动态 URL 加入
42
+ 无条件白名单。完整调用模型见 `v8-formengine-http`。
43
+
44
+ ## 文件、消息、验证码与诊断
45
+
46
+ | 路由 | 用途与边界 |
47
+ |---|---|
48
+ | `GET /api/Captcha/getCaptcha` | 获取验证码图片;同时保存响应 `captchaid` |
49
+ | `POST /api/Captcha/Recognize` | 受控验证码识别,主要供采集引擎 |
50
+ | `POST /api/HDFS/Upload` | 受限文件上传;优先用平台 SDK/V8 Upload |
51
+ | `POST /apiengine/platform-private-file-url` | 获取当前租户短期私有文件地址;必须携带权威资源上下文 |
52
+ | `GET /api/HDFS/OpenPrivateFile` | 受权打开私有文件/Office 代理 |
53
+ | `POST /api/DiyChat/SendSystemMessage` | 发送站内消息;前端优先 `V8.SendSystemMessage` |
54
+ | `POST /apiengine/platform-mq` | MQ 管理入口;Body 使用 `Action=Send`,仅当前租户超级管理员 |
55
+ | `GET /apiengine/platform-service-health?OsClient={OsClient}` | 新版客户端固定匿名健康契约;返回 `Data.Status=Healthy`,新二进制同时返回真实后端版本;应用包先发布时版本可暂时为空,但健康结论不失败;不查询业务表 |
56
+ | `GET /api/Diagnostics/health` | 旧节点滚动升级兼容健康路由;新版客户端不以它作为主要契约 |
57
+ | `GET /api/Diagnostics/liveness` | 进程存活检查,不代表已就绪接流量 |
58
+
59
+ `/api/example`、`/api/example/1` 仅用于说明 `V8.Http` 的普通 Controller 地址,
60
+ 不属于 Microi 固定接口。
61
+
62
+ ## 管理与内部交付接口
63
+
64
+ 下列路由不是普通业务 SDK:
65
+
66
+ | 路由 | 限制 |
67
+ |---|---|
68
+ | `POST /api/DiyField/UptDiyFieldList` | 开发设计字段批量保存;需设计权限 |
69
+ | `POST /api/FormEngine/ImportDiyTableRow` | 表格/子表导入;后端复核字段、外键和权限 |
70
+ | `POST /api/SysUser/GetSysUserPassword` | 仅存量 DES 密码的超级管理员兼容查看;必须审计,访问密钥/普通角色拒绝 |
71
+ | `POST /api/V8Engine/UploadApplicationAssetStream` | 管理员应用文件分片流式上传 |
72
+ | `POST /api/V8Engine/FinalizeApplicationStreamPublish` | 校验清单并原子切换应用版本 |
73
+
74
+ 应用流式发布必须使用 MCP/平台发布流程:文件逐个校验 SHA-256,版本目录不可变,
75
+ 同一应用用跨节点锁串行,入口文件最后切换。不得把这两个内部路由包装成匿名上传。
76
+
77
+ ## 安全检查
78
+
79
+ - URL 不携带长期 Token、密码、连接串、私钥或 Redis 凭据。
80
+ - 动态表名、ApiEngineKey、文件路径和 redirect 都先走白名单/授权。
81
+ - 匿名路由只对明确开启的表或接口生效,仍要限流、限大小并做业务校验。
82
+ - 管理接口必须核验当前租户与管理员身份,写后回读;超时先回读,不能盲目重试。
83
+ - 示例 URL 中的租户、表 Key、接口 Key 和 Id 都是占位值,不复制为生产常量。
@@ -1,49 +1,49 @@
1
- # 工作流引擎配置清单
2
-
3
- 事实源:当前租户 `microi_get_db_schema`、`Microi.Core/Param/WFParam.cs`、
4
- `Microi.WorkFlow` 运行时、PC `views/workflow/component`。下表只描述审批工作流。
5
-
6
- ## 定义、节点、连线
7
-
8
- | 资源 | 可配置字段 | 用途与注意 |
9
- |---|---|---|
10
- | `wf_flowdesign` | `FlowName, Category, Description, Remark, Sort, Preview, JsonData` | 名称、分类、说明、排序、预览与画布数据;画布最终按 `wf_node/wf_line` 渲染。 |
11
- | `wf_flowdesign` | `TableId, IsEnable, Roles, StartV8, EndV8` | 关联业务 `diy_table.Id`、启用、允许发起角色、流程开始/结束事件。模块流程只选已启用项。 |
12
- | `wf_node` | `Id, NodeName, NodeType, Icon, Description, Remark, PositionLeft, PositionTop` | 稳定节点身份、类型和画布位置。坐标写为 CSS 像素;缺失时 MCP 自动布局。 |
13
- | `wf_node` | `Users, Roles, Depts, BindJobs, SameDeptApprove` | 前四者是 `[{Id,Name}]` JSON 审批人来源;`SameDeptApprove` 只进一步筛选同部门候选人,不能单独提供接收人。不能伪造跨租户 Id。 |
14
- | `wf_node` | `AllowSelectUsers, AllowAddUsers, AllowRecall, AllowHandOver, HideHandOverSelect, BackNodes, Timeout` | 上游手选下节点人员、加签、撤回、移交、隐藏移交选择、可退回节点、超时。`BackNodes` 保存 `[{Id,NodeName}]`;会签通常不启用手选。 |
15
- | `wf_node` | `CopyUsers, DisplayFields, HideFields, EditFields, FieldsConfig, FieldsConfigComponent, TableId` | 抄送 `IdName` 列表、节点表单字段权限、配置组件与业务表。字段配置应从当前表真实字段建模。 |
16
- | `wf_node` | `StartV8, StartV8Server, EndV8, EndV8Server, LineValueV8, AllowAddUserV8Code` | 前后端节点开始/结束事件、多出线选择与加签过滤代码。条件写在当前节点,不要误放在 `wf_line.V8Code`。 |
17
- | `wf_line` | `Id, FromNodeId, ToNodeId, LineName, LineValue, V8Code` | 稳定线身份、端点、展示标题、条件值与兼容线代码。标题用“起点 到 终点”;分支由源节点 `LineValueV8` 指定 `V8.NextNodeId` 或 `V8.LineValue`。 |
18
-
19
- `NodeType`:`Start` 发起;`Auto` 自动;`Business` 业务提交;
20
- `Approve` 审批;`Countersign` 会签;`End` 人工结束;`AutoEnd` 自动结束。
21
- 人工节点必须有真实接收人策略,否则流程可能创建实例却无待办。
22
-
23
- ## 实例与操作
24
-
25
- | 资源/动作 | 功能 |
26
- |---|---|
27
- | `wf_flow` | 流程实例、业务表/行、发起人、状态、最近表单 JSON、经办人与抄送汇总。`FormData` 会变化,不是原始快照。 |
28
- | `wf_work` | 每个接收人的待办/已办;按 `ReceiverId + WorkState` 确定可处理工作。 |
29
- | `wf_history` | 每一步的起止节点、连线、处理人、意见、表单与抄送历史。 |
30
- | `StartWork / StartWorkWithForm` | 发起流程;新业务行建议使用合并表单提交接口。 |
31
- | `SendWork / SendWorkWithForm` | 处理审批、业务节点、会签及后续自动节点。 |
32
- | `GetStartWFNode / GetWFNodeModel / GetNextNodeConfirmUsers` | 查询开始节点、节点属性及下一节点接收人。 |
33
- | `RecallWork / CancelFlow / HandOverWork` | 撤回、取消、移交。取消独立事务且可改写实例 `FormData`,须按业务终态复核。 |
34
- | `GetWFWork / GetWFFlow / GetWFHistory / GetWFStats / MarkCopyRead` | 待办、实例、历史、统计与抄送已读。普通用户须走身份与菜单/工作权限边界。 |
35
-
36
- ## MCP 到模块的生成顺序
37
-
38
- 1. 查询当前租户业务表、角色、用户、部门、岗位和现有流程;不要复制其它租户 Id。
39
- 2. Manifest 写入 `workflows[]` 的 `FlowDesign/Nodes/Lines`;人工节点设置人员策略,
40
- 所有连线指向同包节点,分支节点写 `LineValueV8`。
41
- 3. 模块设置 `openType:"WorkFlow"`、`table:"业务表名"`,同包流程传
42
- `flowName:"流程名称"`;现有流程传 `flowDesignId:"真实 Id"`。
43
- 4. 执行 `microi_plan_system`、`microi_check_workflow_package`,分支调用
44
- `microi_test_workflow_condition`;写入后回读三张定义表与 `sys_menu`,
45
- 用实际账号发起、处理、查看历史与流程图。
46
-
47
- `microi_check_workflow_package` 是本地结构检查;MCP 保存前还会核对当前租户的
48
- 用户、角色、部门和岗位 Id。账号是否仍有效、审批人是否有业务权限以及实际到达待办,
49
- 仍必须通过运行时与真实业务回读。
1
+ # 工作流引擎配置清单
2
+
3
+ 事实源:当前租户 `microi_get_db_schema`、`Microi.Core/Param/WFParam.cs`、
4
+ `Microi.WorkFlow` 运行时、PC `views/workflow/component`。下表只描述审批工作流。
5
+
6
+ ## 定义、节点、连线
7
+
8
+ | 资源 | 可配置字段 | 用途与注意 |
9
+ |---|---|---|
10
+ | `wf_flowdesign` | `FlowName, Category, Description, Remark, Sort, Preview, JsonData` | 名称、分类、说明、排序、预览与画布数据;画布最终按 `wf_node/wf_line` 渲染。 |
11
+ | `wf_flowdesign` | `TableId, IsEnable, Roles, StartV8, EndV8` | 关联业务 `diy_table.Id`、启用、允许发起角色、流程开始/结束事件。模块流程只选已启用项。 |
12
+ | `wf_node` | `Id, NodeName, NodeType, Icon, Description, Remark, PositionLeft, PositionTop` | 稳定节点身份、类型和画布位置。坐标写为 CSS 像素;缺失时 MCP 自动布局。 |
13
+ | `wf_node` | `Users, Roles, Depts, BindJobs, SameDeptApprove` | 前四者是 `[{Id,Name}]` JSON 审批人来源;`SameDeptApprove` 只进一步筛选同部门候选人,不能单独提供接收人。不能伪造跨租户 Id。 |
14
+ | `wf_node` | `AllowSelectUsers, AllowAddUsers, AllowRecall, AllowHandOver, HideHandOverSelect, BackNodes, Timeout` | 上游手选下节点人员、加签、撤回、移交、隐藏移交选择、可退回节点、超时。`BackNodes` 保存 `[{Id,NodeName}]`;会签通常不启用手选。 |
15
+ | `wf_node` | `CopyUsers, DisplayFields, HideFields, EditFields, FieldsConfig, FieldsConfigComponent, TableId` | 抄送 `IdName` 列表、节点表单字段权限、配置组件与业务表。字段配置应从当前表真实字段建模。 |
16
+ | `wf_node` | `StartV8, StartV8Server, EndV8, EndV8Server, LineValueV8, AllowAddUserV8Code` | 前后端节点开始/结束事件、多出线选择与加签过滤代码。条件写在当前节点,不要误放在 `wf_line.V8Code`。 |
17
+ | `wf_line` | `Id, FromNodeId, ToNodeId, LineName, LineValue, V8Code` | 稳定线身份、端点、展示标题、条件值与兼容线代码。标题用“起点 到 终点”;分支由源节点 `LineValueV8` 指定 `V8.NextNodeId` 或 `V8.LineValue`。 |
18
+
19
+ `NodeType`:`Start` 发起;`Auto` 自动;`Business` 业务提交;
20
+ `Approve` 审批;`Countersign` 会签;`End` 人工结束;`AutoEnd` 自动结束。
21
+ 人工节点必须有真实接收人策略,否则流程可能创建实例却无待办。
22
+
23
+ ## 实例与操作
24
+
25
+ | 资源/动作 | 功能 |
26
+ |---|---|
27
+ | `wf_flow` | 流程实例、业务表/行、发起人、状态、最近表单 JSON、经办人与抄送汇总。`FormData` 会变化,不是原始快照。 |
28
+ | `wf_work` | 每个接收人的待办/已办;按 `ReceiverId + WorkState` 确定可处理工作。 |
29
+ | `wf_history` | 每一步的起止节点、连线、处理人、意见、表单与抄送历史。 |
30
+ | `StartWork / StartWorkWithForm` | 发起流程;新业务行建议使用合并表单提交接口。 |
31
+ | `SendWork / SendWorkWithForm` | 处理审批、业务节点、会签及后续自动节点。 |
32
+ | `GetStartWFNode / GetWFNodeModel / GetNextNodeConfirmUsers` | 查询开始节点、节点属性及下一节点接收人。 |
33
+ | `RecallWork / CancelFlow / HandOverWork` | 撤回、取消、移交。取消独立事务且可改写实例 `FormData`,须按业务终态复核。 |
34
+ | `GetWFWork / GetWFFlow / GetWFHistory / GetWFStats / MarkCopyRead` | 待办、实例、历史、统计与抄送已读。普通用户须走身份与菜单/工作权限边界。 |
35
+
36
+ ## MCP 到模块的生成顺序
37
+
38
+ 1. 查询当前租户业务表、角色、用户、部门、岗位和现有流程;不要复制其它租户 Id。
39
+ 2. Manifest 写入 `workflows[]` 的 `FlowDesign/Nodes/Lines`;人工节点设置人员策略,
40
+ 所有连线指向同包节点,分支节点写 `LineValueV8`。
41
+ 3. 模块设置 `openType:"WorkFlow"`、`table:"业务表名"`,同包流程传
42
+ `flowName:"流程名称"`;现有流程传 `flowDesignId:"真实 Id"`。
43
+ 4. 执行 `microi_plan_system`、`microi_check_workflow_package`,分支调用
44
+ `microi_test_workflow_condition`;写入后回读三张定义表与 `sys_menu`,
45
+ 用实际账号发起、处理、查看历史与流程图。
46
+
47
+ `microi_check_workflow_package` 是本地结构检查;MCP 保存前还会核对当前租户的
48
+ 用户、角色、部门和岗位 Id。账号是否仍有效、审批人是否有业务权限以及实际到达待办,
49
+ 仍必须通过运行时与真实业务回读。