@microi.net/cli 5.5.8 → 5.6.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.
- package/.codebuddy-plugin/marketplace.json +2 -2
- package/.codebuddy-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.mcp.json +1 -1
- package/.workbuddy-plugin/marketplace.json +2 -2
- package/.workbuddy-plugin/plugin.json +1 -1
- package/README.md +71 -71
- package/assets/build-meta.json +5 -5
- package/assets/feature-matrix.json +129 -129
- package/cordis.patch.yml +1 -1
- package/package.json +1 -1
- package/scripts/codex-marketplace.json +20 -20
- package/scripts/mcp-codex-stdio-adapter.js +189 -189
- package/scripts/mcp-trae-windows-launcher.cmd +21 -21
- package/scripts/microi-cli-mcp.js +7 -7
- package/scripts/microi-codex-broker.js +447 -447
- package/scripts/microi-codex-router.js +582 -582
- package/scripts/microi-skills.meta.json +336 -336
- package/skills/.microi-skills-version.json +2 -2
- package/skills/.progressive-disclosure-manifest.json +3566 -3566
- package/skills/README.md +3 -3
- package/skills/ai-engine/SKILL.md +45 -43
- package/skills/ai-platform-governance/SKILL.md +177 -177
- package/skills/ai-platform-governance/references/progressive-01-/345/212/237/350/203/275/345/274/200/345/205/263.md +190 -190
- package/skills/app-store/SKILL.md +177 -177
- package/skills/business-blueprint/SKILL.md +85 -85
- package/skills/datasource-engine/SKILL.md +91 -91
- package/skills/dos-orm/SKILL.md +81 -81
- package/skills/dos-orm/references/api-reference.md +229 -229
- package/skills/email-engine/SKILL.md +80 -80
- package/skills/email-engine/references/v8-email.md +34 -34
- package/skills/job-engine/SKILL.md +154 -143
- package/skills/message-notification/SKILL.md +126 -126
- package/skills/message-notification/agents/openai.yaml +5 -5
- package/skills/message-notification/references/contracts.md +102 -102
- package/skills/microi-ai-app-auth.js +652 -652
- package/skills/microi-ai-application/SKILL.md +102 -94
- package/skills/microi-ai-application/agents/openai.yaml +4 -4
- package/skills/microi-ai-application/references/frontend-baseline.md +164 -164
- package/skills/microi-client-frontend/SKILL.md +43 -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 +2 -2
- 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 +28 -28
- 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 +56 -56
- package/skills/microi-codex/SKILL.md +46 -46
- package/skills/microi-codex-installer/SKILL.md +216 -216
- package/skills/microi-codex-installer/agents/openai.yaml +7 -7
- package/skills/microi-datasource-mapping/SKILL.md +67 -67
- package/skills/microi-db-schema/SKILL.md +6 -6
- package/skills/microi-db-schema/references/core-tables.md +18 -18
- package/skills/microi-db-schema/references/form-component-options.md +256 -256
- package/skills/microi-db-schema/references/schema-overview.md +11 -11
- package/skills/microi-db-schema/references/schema.md +46 -46
- package/skills/microi-db-schema/references/table-catalog.md +57 -57
- package/skills/microi-deployment/SKILL.md +18 -1
- package/skills/microi-deployment/references/deployment-matrix.md +101 -101
- package/skills/microi-docs-coverage/SKILL.md +123 -123
- package/skills/microi-docs-coverage/references/capability-map.md +1 -0
- package/skills/microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs +894 -894
- package/skills/microi-form-engine/SKILL.md +50 -50
- package/skills/microi-form-engine/references/component-catalog.md +218 -218
- package/skills/microi-form-engine/references/data-source-events.md +124 -124
- package/skills/microi-form-layout/SKILL.md +13 -13
- 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
- package/skills/microi-frontend-sdk/SKILL.md +4 -4
- package/skills/microi-frontend-sdk/references/progressive-01-token-/345/275/223/345/211/215/347/231/273/345/275/225/347/224/250/346/210/267/344/270/216/345/275/223/345/211/215/347/273/210/347/253/257/347/231/273/345/275/225/345/215/217/350/256/256.md +175 -175
- package/skills/microi-left-right-layout/SKILL.md +141 -141
- package/skills/microi-microservice/SKILL.md +12 -10
- package/skills/microi-microservice/references/runtime-delivery.md +278 -278
- 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
- package/skills/microi-solution-quotation/SKILL.md +78 -78
- package/skills/microi-solution-quotation/agents/openai.yaml +4 -4
- package/skills/microi-solution-quotation/scripts/build_solution_quote.py +296 -296
- package/skills/microi-sso/SKILL.md +85 -85
- package/skills/microi-sso/references/acceptance.md +49 -49
- package/skills/microi-sso/references/configuration-and-security.md +53 -53
- package/skills/microi-sso/references/inbound.md +53 -53
- package/skills/microi-sso/references/outbound.md +39 -39
- 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 +20 -20
- package/skills/microi-ui/SKILL.md +7 -2
- package/skills/microi-uniapp-frontend/SKILL.md +134 -134
- package/skills/microi-uniapp-frontend/references/progressive-01-/347/247/273/345/212/250/347/253/257/345/210/206/347/261/273-/345/217/214/346/240/217/345/210/227/350/241/250/347/213/254/347/253/213/346/273/232/345/212/250.md +136 -136
- package/skills/microi-uniapp-frontend/references/progressive-02-/345/205/263/351/224/256/344/270/232/345/212/241/350/265/204/344/272/247/344/270/215/345/276/227/351/273/230/350/256/244/351/200/211/344/270/255.md +124 -124
- package/skills/module-engine/SKILL.md +16 -16
- package/skills/ocr-engine/SKILL.md +2 -2
- package/skills/ocr-engine/agents/openai.yaml +1 -1
- package/skills/page-engine/SKILL.md +28 -28
- package/skills/page-engine/references/progressive-01-/346/211/200/346/234/211/347/273/204/344/273/266/347/261/273/345/236/213.md +126 -126
- package/skills/page-engine/references/progressive-02-/347/211/210/346/234/254/345/216/206/345/217/262-/345/271/266/345/217/221/344/277/235/345/255/230/344/270/216/345/233/236/346/273/232.md +42 -42
- package/skills/performance-testing/SKILL.md +120 -120
- package/skills/playwright-e2e/SKILL.md +84 -84
- package/skills/playwright-e2e/references/progressive-01-/345/205/250/350/207/252/345/212/250/347/231/273/345/275/225-/345/205/215/351/252/214/350/257/201/347/240/201-/344/275/206/344/270/215/345/205/215/345/257/206/347/240/201-/345/277/205/350/257/273.md +68 -68
- package/skills/playwright-e2e/references/progressive-02-/346/226/207/345/255/227/345/257/271/346/257/224/345/272/246/344/270/216/345/217/257/350/257/273/346/200/247/350/207/252/345/212/250/345/214/226/346/243/200/346/237/245-/345/277/205/345/201/232.md +64 -64
- package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +20 -20
- package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +69 -69
- package/skills/print-engine/SKILL.md +36 -36
- package/skills/production-readonly-audit/SKILL.md +41 -41
- package/skills/report-engine/SKILL.md +71 -71
- package/skills/scripts/optimize-progressive-disclosure.mjs +204 -204
- package/skills/scripts/refresh-progressive-disclosure.mjs +64 -64
- package/skills/scripts/validate-progressive-disclosure.mjs +52 -52
- package/skills/search-engine/SKILL.md +75 -75
- package/skills/spider-engine/SKILL.md +190 -190
- package/skills/system-observability/SKILL.md +162 -162
- package/skills/system-observability/references/memory-incident-triage.md +73 -73
- package/skills/translate-engine/SKILL.md +1 -1
- package/skills/ui-design/SKILL.md +3 -1
- package/skills/uniapp-mall-assets/SKILL.md +170 -170
- package/skills/unity-integration/SKILL.md +155 -155
- package/skills/unity-integration/agents/openai.yaml +4 -4
- package/skills/unity-integration/references/ai-app-delivery.md +103 -103
- package/skills/unity-integration/references/sdk-api.md +82 -82
- package/skills/unity-integration/references/toolbox-migration.md +66 -66
- package/skills/unity-integration/references/webgl-hosting.md +57 -57
- package/skills/v8-api-config/SKILL.md +378 -378
- package/skills/v8-cache-pattern/SKILL.md +306 -306
- package/skills/v8-crud-api/SKILL.md +29 -29
- package/skills/v8-crud-api/references/progressive-01-/346/237/245/350/257/242/345/210/227/350/241/250-/345/210/206/351/241/265.md +56 -56
- package/skills/v8-debugging/SKILL.md +143 -143
- package/skills/v8-explorer-tree/SKILL.md +64 -64
- package/skills/v8-export-import/references/progressive-01-excellayout-/351/253/230/347/272/247/350/207/252/347/224/261/345/270/203/345/261/200.md +201 -201
- package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md +118 -118
- package/skills/v8-export-import/references/progressive-03-/345/256/211/345/205/250-/346/200/247/350/203/275/346/263/250/346/204/217.md +32 -32
- package/skills/v8-file-upload/SKILL.md +154 -154
- 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 +133 -133
- package/skills/v8-file-upload/references/progressive-02-office-/346/226/207/344/273/266/345/234/250/347/272/277/347/274/226/350/276/221/347/211/210/346/234/254/345/217/267/350/247/204/345/210/231.md +138 -138
- package/skills/v8-formengine-http/SKILL.md +107 -107
- package/skills/v8-frontend-events/SKILL.md +22 -22
- package/skills/v8-frontend-events/references/bluetooth-print-api.md +135 -135
- package/skills/v8-frontend-events/references/bluetooth-print.md +247 -247
- package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +50 -50
- package/skills/v8-http-integration/SKILL.md +106 -106
- package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md +31 -31
- package/skills/v8-http-integration/references/progressive-02-/351/224/231/350/257/257/345/244/204/347/220/206/346/250/241/345/274/217.md +5 -5
- package/skills/v8-image-processing/SKILL.md +190 -190
- package/skills/v8-image-processing/agents/openai.yaml +4 -4
- package/skills/v8-image-processing/references/api-reference.md +623 -623
- package/skills/v8-menu-buttons/SKILL.md +103 -103
- package/skills/v8-menu-buttons/references/progressive-01-2-/346/214/211/351/222/256/345/257/271/350/261/241-schema.md +145 -145
- 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
- package/skills/v8-menu-buttons/references/progressive-03-10-/345/217/215/346/250/241/345/274/217-/351/201/277/345/205/215.md +43 -43
- package/skills/v8-mongodb/SKILL.md +65 -65
- package/skills/v8-mq-mqtt/SKILL.md +175 -175
- package/skills/v8-mq-mqtt/references/mqtt-production.md +342 -342
- package/skills/v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-/347/211/251/350/201/224/347/275/221.md +137 -137
- package/skills/v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs +203 -203
- package/skills/v8-saas-multi-tenant/SKILL.md +223 -223
- package/skills/v8-security/SKILL.md +25 -25
- package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +122 -122
- package/skills/v8-sql-query/SKILL.md +127 -127
- package/skills/v8-table-event/SKILL.md +20 -20
- 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 +18 -18
- package/skills/v8-table-event/references/progressive-02-/345/211/215/347/253/257/344/272/213/344/273/266/345/220/215-v8-eventname-/345/217/257/350/203/275/347/232/204/345/200/274.md +15 -15
- package/skills/v8-tcp-integration/SKILL.md +1 -1
- package/skills/v8-tcp-integration/agents/openai.yaml +4 -4
- package/skills/v8-template-engine/SKILL.md +59 -59
- package/skills/v8-utilities/SKILL.md +92 -92
- package/skills/v8-utilities/references/client-api-index.md +143 -143
- package/skills/v8-utilities/references/platform-http-routes.md +83 -83
- package/skills/v8-utilities/references/server-api-index.md +74 -74
- package/skills/v8-workflow/SKILL.md +44 -44
- package/skills/vision-engine/SKILL.md +19 -19
- package/skills/vision-engine/references/architecture-and-acceptance.md +34 -34
- package/skills/workspace-conventions/SKILL.md +236 -236
- 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
- package/skills/workspace-conventions/references/progressive-02-microi-net-api-/346/234/254/345/234/260/345/220/257/345/212/250/347/272/246/345/256/232.md +179 -179
- package/skills/workspace-conventions/references/progressive-03-cli-/344/270/216-ide-/346/217/222/344/273/266/351/224/231/347/211/210/345/205/261/345/255/230/347/272/246/345/256/232.md +21 -21
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: v8-mongodb
|
|
3
|
-
description: Microi V8 MongoDB 指南。用于使用 V8.MongoDb AddFormData、UptFormData、UptFormDataByWhere、DelFormData、DelFormDataByWhere、GetFormData、GetTableData、对象过滤和文档 Id。
|
|
3
|
+
description: Microi V8 MongoDB 指南。用于使用 V8.MongoDb AddFormData、UptFormData、UptFormDataByWhere、DelFormData、DelFormDataByWhere、GetFormData、GetTableData、对象过滤和文档 Id。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
> **Codex 非阻塞自动更新:** 当前宿主为 Codex 时,吾码 CLI、Codex 插件与工作区 AI/MCP 由后台自动更新;需要诊断时读取 `../microi-codex-installer/SKILL.md`。更新失败、等待空闲或尚未重载均不得阻断当前、正在进行或新建任务。非 Codex 宿主跳过此项。
|
|
@@ -14,10 +14,10 @@ description: Microi V8 MongoDB 指南。用于使用 V8.MongoDb AddFormData、Up
|
|
|
14
14
|
| 方法 | 说明 |
|
|
15
15
|
|------|------|
|
|
16
16
|
| `V8.MongoDb.AddFormData({...})` | 新增文档 |
|
|
17
|
-
| `V8.MongoDb.UptFormData({...})` | 修改文档(按 Id) |
|
|
18
|
-
| `V8.MongoDb.UptFormDataByWhere({...})` | 按非空 `_Where` 批量修改,禁止修改 `_id` |
|
|
19
|
-
| `V8.MongoDb.DelFormData({...})` | 删除文档(按 Id) |
|
|
20
|
-
| `V8.MongoDb.DelFormDataByWhere({...})` | 按非空 `_Where` 批量删除 |
|
|
17
|
+
| `V8.MongoDb.UptFormData({...})` | 修改文档(按 Id) |
|
|
18
|
+
| `V8.MongoDb.UptFormDataByWhere({...})` | 按非空 `_Where` 批量修改,禁止修改 `_id` |
|
|
19
|
+
| `V8.MongoDb.DelFormData({...})` | 删除文档(按 Id) |
|
|
20
|
+
| `V8.MongoDb.DelFormDataByWhere({...})` | 按非空 `_Where` 批量删除 |
|
|
21
21
|
| `V8.MongoDb.GetFormData({...})` | 查询单个文档(按 Id) |
|
|
22
22
|
| `V8.MongoDb.GetTableData({...})` | 查询文档列表 |
|
|
23
23
|
| `V8.MongoDb.NewId()` | 生成 MongoDB Id |
|
|
@@ -42,7 +42,7 @@ V8.MongoDb.AddFormData({
|
|
|
42
42
|
## 修改文档
|
|
43
43
|
|
|
44
44
|
```javascript
|
|
45
|
-
V8.MongoDb.UptFormData({
|
|
45
|
+
V8.MongoDb.UptFormData({
|
|
46
46
|
DbName: 'sys_log_2024',
|
|
47
47
|
TableName: 'log_2024_12',
|
|
48
48
|
Id: V8.Param.id, // 必传
|
|
@@ -50,50 +50,50 @@ V8.MongoDb.UptFormData({
|
|
|
50
50
|
Action: '更新操作',
|
|
51
51
|
UpdateTime: DateNow('yyyy-MM-dd HH:mm:ss')
|
|
52
52
|
}
|
|
53
|
-
});
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
### 按条件批量修改
|
|
57
|
-
|
|
58
|
-
```javascript
|
|
59
|
-
var result = V8.MongoDb.UptFormDataByWhere({
|
|
60
|
-
DbName: 'diy_chat_' + V8.OsClient.toLowerCase(),
|
|
61
|
-
TableName: 'chat_' + DateNow('yyyy'),
|
|
62
|
-
_Where: [
|
|
63
|
-
['FromUserId', '=', V8.Param.PeerUserId],
|
|
64
|
-
['ToUserId', '=', V8.CurrentUser.Id],
|
|
65
|
-
['IsRead', '=', false]
|
|
66
|
-
],
|
|
67
|
-
_FormData: { IsRead: true }
|
|
68
|
-
});
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
`_Where` 缺失、为空或包含无效条件时必须返回失败,不得执行全集合更新。`_FormData` 禁止设置 `_id` 或 `_id.*`。返回值的 `Data` 包含 `MatchedCount` 和 `ModifiedCount`。
|
|
53
|
+
});
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### 按条件批量修改
|
|
57
|
+
|
|
58
|
+
```javascript
|
|
59
|
+
var result = V8.MongoDb.UptFormDataByWhere({
|
|
60
|
+
DbName: 'diy_chat_' + V8.OsClient.toLowerCase(),
|
|
61
|
+
TableName: 'chat_' + DateNow('yyyy'),
|
|
62
|
+
_Where: [
|
|
63
|
+
['FromUserId', '=', V8.Param.PeerUserId],
|
|
64
|
+
['ToUserId', '=', V8.CurrentUser.Id],
|
|
65
|
+
['IsRead', '=', false]
|
|
66
|
+
],
|
|
67
|
+
_FormData: { IsRead: true }
|
|
68
|
+
});
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
`_Where` 缺失、为空或包含无效条件时必须返回失败,不得执行全集合更新。`_FormData` 禁止设置 `_id` 或 `_id.*`。返回值的 `Data` 包含 `MatchedCount` 和 `ModifiedCount`。
|
|
72
72
|
|
|
73
73
|
## 删除文档
|
|
74
74
|
|
|
75
75
|
```javascript
|
|
76
|
-
V8.MongoDb.DelFormData({
|
|
76
|
+
V8.MongoDb.DelFormData({
|
|
77
77
|
DbName: 'sys_log_2024',
|
|
78
78
|
TableName: 'log_2024_12',
|
|
79
79
|
Id: V8.Param.id // 必传
|
|
80
|
-
});
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
### 按条件批量删除
|
|
84
|
-
|
|
85
|
-
```javascript
|
|
86
|
-
var result = V8.MongoDb.DelFormDataByWhere({
|
|
87
|
-
DbName: 'diy_chat_' + V8.OsClient.toLowerCase(),
|
|
88
|
-
TableName: 'chat_last_contact',
|
|
89
|
-
_Where: [
|
|
90
|
-
['UserId', '=', V8.CurrentUser.Id],
|
|
91
|
-
['ContactUserId', '=', V8.Param.PeerUserId]
|
|
92
|
-
]
|
|
93
|
-
});
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
删除条件必须包含当前权威用户/资源边界,不能只用可伪造的前端参数。返回值的 `Data` 包含 `DeletedCount`。
|
|
80
|
+
});
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### 按条件批量删除
|
|
84
|
+
|
|
85
|
+
```javascript
|
|
86
|
+
var result = V8.MongoDb.DelFormDataByWhere({
|
|
87
|
+
DbName: 'diy_chat_' + V8.OsClient.toLowerCase(),
|
|
88
|
+
TableName: 'chat_last_contact',
|
|
89
|
+
_Where: [
|
|
90
|
+
['UserId', '=', V8.CurrentUser.Id],
|
|
91
|
+
['ContactUserId', '=', V8.Param.PeerUserId]
|
|
92
|
+
]
|
|
93
|
+
});
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
删除条件必须包含当前权威用户/资源边界,不能只用可伪造的前端参数。返回值的 `Data` 包含 `DeletedCount`。
|
|
97
97
|
|
|
98
98
|
## 查询单个文档
|
|
99
99
|
|
|
@@ -108,23 +108,23 @@ var result = V8.MongoDb.GetFormData({
|
|
|
108
108
|
## 查询文档列表
|
|
109
109
|
|
|
110
110
|
```javascript
|
|
111
|
-
var result = V8.MongoDb.GetTableData({
|
|
112
|
-
DbName: 'sys_log_2024',
|
|
113
|
-
TableName: 'log_2024_12',
|
|
111
|
+
var result = V8.MongoDb.GetTableData({
|
|
112
|
+
DbName: 'sys_log_2024',
|
|
113
|
+
TableName: 'log_2024_12',
|
|
114
114
|
_Where: [
|
|
115
115
|
['Type', '=', '访问菜单'],
|
|
116
116
|
['OR', 'Type', '=', '点击V8按钮']
|
|
117
|
-
],
|
|
118
|
-
_OrderBy: 'CreateTime',
|
|
119
|
-
_OrderByType: 'DESC',
|
|
120
|
-
_PageIndex: 1,
|
|
121
|
-
_PageSize: 20
|
|
122
|
-
});
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
`GetFormData` 和 `GetTableData` 属于 dynamic 无模式读取。服务端会在 MongoDB 投影阶段过滤 BSON 内部 `_t` CLR 类型判别字段,避免存量强类型 C# 写入留下的旧类型名称触发反序列化失败。`_t` 不是 V8 业务契约;业务需要类型标记时应使用自有字段(例如 `DocumentType`),不得读取、筛选或依赖 `_t`。强类型 C# MongoDB 模型仍按自身的多态映射处理。
|
|
126
|
-
|
|
127
|
-
## 实战模式
|
|
117
|
+
],
|
|
118
|
+
_OrderBy: 'CreateTime',
|
|
119
|
+
_OrderByType: 'DESC',
|
|
120
|
+
_PageIndex: 1,
|
|
121
|
+
_PageSize: 20
|
|
122
|
+
});
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
`GetFormData` 和 `GetTableData` 属于 dynamic 无模式读取。服务端会在 MongoDB 投影阶段过滤 BSON 内部 `_t` CLR 类型判别字段,避免存量强类型 C# 写入留下的旧类型名称触发反序列化失败。`_t` 不是 V8 业务契约;业务需要类型标记时应使用自有字段(例如 `DocumentType`),不得读取、筛选或依赖 `_t`。强类型 C# MongoDB 模型仍按自身的多态映射处理。
|
|
126
|
+
|
|
127
|
+
## 实战模式
|
|
128
128
|
|
|
129
129
|
### IoT 设备日志存储
|
|
130
130
|
|
|
@@ -183,11 +183,11 @@ return { Code: 1, Data: result };
|
|
|
183
183
|
|
|
184
184
|
## 注意事项
|
|
185
185
|
|
|
186
|
-
- MongoDB 参数统一使用**对象格式**:`{ DbName, TableName, Id, _FormData, _Where, _OrderBy, _OrderByType }`
|
|
187
|
-
- `DbName` 是 MongoDB 数据库名,`TableName` 是集合名
|
|
188
|
-
- `_Where` 条件语法与 `V8.FormEngine` 一致
|
|
189
|
-
- 批量写入仅接受安全字段名、已知操作符和非空条件;条件中的租户、用户和资源 Id 应来自 `V8.OsClient` / `V8.CurrentUser` / 权威回查,不得信任 `V8.Param` 中的同名身份字段
|
|
190
|
-
- 非主库 V8 运行时会把 MongoDB 操作绑定到当前租户;显式传入其它 `OsClient` 不能跨租户
|
|
191
|
-
- 适合存储日志、IoT 数据、大文档等非结构化 / 海量数据
|
|
192
|
-
- 建议按时间分库分表(如 `log_2024_01`),便于清理历史数据
|
|
193
|
-
- MongoDB 操作不参与 `V8.DbTrans` 事务。批量写入 `Code=1` 后即是已提交事实;后续 Hook/投递失败应返回警告或进入补偿,不得返回“未发生”导致盲目重试,重试必须有稳定业务 Id 幂等
|
|
186
|
+
- MongoDB 参数统一使用**对象格式**:`{ DbName, TableName, Id, _FormData, _Where, _OrderBy, _OrderByType }`
|
|
187
|
+
- `DbName` 是 MongoDB 数据库名,`TableName` 是集合名
|
|
188
|
+
- `_Where` 条件语法与 `V8.FormEngine` 一致
|
|
189
|
+
- 批量写入仅接受安全字段名、已知操作符和非空条件;条件中的租户、用户和资源 Id 应来自 `V8.OsClient` / `V8.CurrentUser` / 权威回查,不得信任 `V8.Param` 中的同名身份字段
|
|
190
|
+
- 非主库 V8 运行时会把 MongoDB 操作绑定到当前租户;显式传入其它 `OsClient` 不能跨租户
|
|
191
|
+
- 适合存储日志、IoT 数据、大文档等非结构化 / 海量数据
|
|
192
|
+
- 建议按时间分库分表(如 `log_2024_01`),便于清理历史数据
|
|
193
|
+
- MongoDB 操作不参与 `V8.DbTrans` 事务。批量写入 `Code=1` 后即是已提交事实;后续 Hook/投递失败应返回警告或进入补偿,不得返回“未发生”导致盲目重试,重试必须有稳定业务 Id 幂等
|
|
@@ -1,175 +1,175 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: v8-mq-mqtt
|
|
3
|
-
description: Microi V8 消息队列与 MQTT 生产指南。用于 V8.MQ.SendMsg、RabbitMQ 消费与幂等,以及内嵌 MQTT Broker、SaaS 租户认证、Topic ACL、TLS、QoS/Retain、七类 V8.MQTT 事件、设备级接口引擎、服务端下行、IoT 数据分层和多节点部署验收。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
> **Codex 非阻塞自动更新:** 当前宿主为 Codex 时,吾码 CLI、Codex 插件与工作区 AI/MCP 由后台自动更新;需要诊断时读取 `../microi-codex-installer/SKILL.md`。更新失败、等待空闲或尚未重载均不得阻断当前、正在进行或新建任务。非 Codex 宿主跳过此项。
|
|
7
|
-
|
|
8
|
-
# Microi V8 消息队列与 MQTT
|
|
9
|
-
|
|
10
|
-
你正在开发 Microi 吾码平台的 V8 引擎代码,需要使用 RabbitMQ 消息队列或 MQTT 物联网协议。
|
|
11
|
-
|
|
12
|
-
<!-- microi-progressive:begin -->
|
|
13
|
-
<!-- microi-progressive:chunk id=v8-mq-mqtt-000 sha256=4a6559aed1af036591a04002c6e3311d9f0957fbbabbcafdc4a6bad95dabd843 -->
|
|
14
|
-
## V8.MQ — RabbitMQ 消息队列
|
|
15
|
-
|
|
16
|
-
### 生产消息(后端)
|
|
17
|
-
|
|
18
|
-
```javascript
|
|
19
|
-
// 当前 V8EngineMQ 是同步包装,调用完成后直接返回 DosResult。
|
|
20
|
-
// 业务重试必须复用同一个 EventId,供消费者幂等去重。
|
|
21
|
-
var result = V8.MQ.SendMsg({
|
|
22
|
-
QueueName: 'order_process',
|
|
23
|
-
EventId: V8.Param.eventId || V8.Method.NewUlid(),
|
|
24
|
-
Message: {
|
|
25
|
-
ProductId: '123',
|
|
26
|
-
Count: 2,
|
|
27
|
-
OrderId: V8.Param.orderId
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
|
-
if (result.Code !== 1) return result;
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
逻辑队列名由服务端规范为 `microi.{lowerOsClient}.{queueName}`。V8 上下文、登录 Token 与后台显式 `OsClient` 是权威租户,body 不能切换到其它租户队列。
|
|
34
|
-
|
|
35
|
-
### 生产消息(前端)
|
|
36
|
-
|
|
37
|
-
```javascript
|
|
38
|
-
V8.ApiEngine.Run('platform-mq', {
|
|
39
|
-
Action: 'Send',
|
|
40
|
-
QueueName: 'queue_name',
|
|
41
|
-
EventId: stableEventId,
|
|
42
|
-
Message: { ProductId: '123', Count: 2 }
|
|
43
|
-
}).then(function(result) {
|
|
44
|
-
if (result.Code === 1) V8.Tips('消息已发送', true);
|
|
45
|
-
});
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
`platform-mq` 是应用商城交付的 Managed 管理接口,只允许当前租户超级管理员,
|
|
49
|
-
并在可信 V8 原子层固定租户、队列名和 1 MB 消息上限。普通业务前端应调用
|
|
50
|
-
自己的受权接口引擎,再由业务接口引擎执行 `V8.MQ.SendMsg`。
|
|
51
|
-
|
|
52
|
-
### 消费消息
|
|
53
|
-
|
|
54
|
-
消费者是一个接口引擎,在 `diy_queue_receive` 表中配置队列名和接口引擎 Key 后,消息到达时自动调用。
|
|
55
|
-
|
|
56
|
-
```javascript
|
|
57
|
-
// 消费者接口引擎
|
|
58
|
-
var message = V8.Param.Message; // object 类型
|
|
59
|
-
// message.EventId — 稳定业务幂等 Id
|
|
60
|
-
// message.Id — EventId 的兼容别名
|
|
61
|
-
// message.OsClient — 消息所属租户
|
|
62
|
-
// message.Message — 消息内容
|
|
63
|
-
// message.CurrentUserId — 生产消息的用户 Id
|
|
64
|
-
|
|
65
|
-
// 处理业务逻辑
|
|
66
|
-
var data = message.Message;
|
|
67
|
-
V8.FormEngine.UptFormData('Product', {
|
|
68
|
-
Id: data.ProductId,
|
|
69
|
-
Stock: data.Count
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
return { Code: 1, Data: { EventId: message.EventId } };
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
### 实战模式:异步处理耗时操作
|
|
76
|
-
|
|
77
|
-
```javascript
|
|
78
|
-
// 接口引擎:接收请求后发送到队列,快速返回
|
|
79
|
-
var sendResult = V8.MQ.SendMsg({
|
|
80
|
-
QueueName: 'order_process',
|
|
81
|
-
EventId: V8.Param.eventId,
|
|
82
|
-
Message: {
|
|
83
|
-
orderId: V8.Param.orderId,
|
|
84
|
-
action: 'create',
|
|
85
|
-
userId: V8.CurrentUser.Id
|
|
86
|
-
}
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
if (!sendResult || sendResult.Code !== 1) return sendResult;
|
|
90
|
-
|
|
91
|
-
return { Code: 1, Msg: '订单处理中,请稍候查看结果' };
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
```javascript
|
|
95
|
-
// 消费者接口引擎:异步处理订单
|
|
96
|
-
var msg = V8.Param.Message;
|
|
97
|
-
var data = msg.Message;
|
|
98
|
-
|
|
99
|
-
try {
|
|
100
|
-
// 耗时操作:调用第三方 ERP 接口
|
|
101
|
-
var erpResult = V8.Http.Post({
|
|
102
|
-
Url: 'https://erp.company.com/api/order',
|
|
103
|
-
PostParamString: JSON.stringify({ orderId: data.orderId }),
|
|
104
|
-
ParamType: 'json',
|
|
105
|
-
Timeout: 30
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
V8.FormEngine.UptFormData('Order', {
|
|
109
|
-
Id: data.orderId,
|
|
110
|
-
SyncStatus: 'success',
|
|
111
|
-
SyncTime: DateNow('yyyy-MM-dd HH:mm:ss')
|
|
112
|
-
});
|
|
113
|
-
return { Code: 1, Data: { EventId: msg.EventId } };
|
|
114
|
-
} catch (ex) {
|
|
115
|
-
V8.FormEngine.UptFormData('Order', {
|
|
116
|
-
Id: data.orderId,
|
|
117
|
-
SyncStatus: 'failed',
|
|
118
|
-
SyncError: ex.message
|
|
119
|
-
});
|
|
120
|
-
console.error('订单同步失败: ' + ex.message);
|
|
121
|
-
return { Code: 0, Msg: '订单同步失败' };
|
|
122
|
-
}
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
### MQ 配置
|
|
126
|
-
|
|
127
|
-
每个租户都必须配置 `MQHost/MQPort/MQUserName/MQPassword/MQVitrualHost`,并在 RabbitMQ 中真实创建独立 user/vhost,把权限限制在自己的 vhost 与 `microi.{lowerOsClient}.*` 队列。缺少配置或与其它已加载租户共用 user/password/vhost 时失败关闭,不回退主租户管理员账号。可选 `MQUseTls/MQTlsServerName`;`MQHost` 可用逗号分隔多个端点。当前 `AddMicroiMQ()` 默认注册 `MicroiRabbitMQSingleConnection`,不会按 `MQType` 自动切换实现。
|
|
128
|
-
|
|
129
|
-
在 `diy_queue_receive` 表新增记录后,后台同步会创建或更新消费者:
|
|
130
|
-
|
|
131
|
-
| 字段 | 含义 |
|
|
132
|
-
|------|------|
|
|
133
|
-
| `Type` | `1`=接口引擎;`2`=仅默认主租户受控 DLL |
|
|
134
|
-
| `QueueName` | 逻辑队列名(与生产端 `SendMsg({ QueueName, ... })` 一致) |
|
|
135
|
-
| `ApiEngineKey` | 消费者接口引擎 Key |
|
|
136
|
-
| `FailToReject` | 值为“是”时失败后允许有限重入队 |
|
|
137
|
-
| `Count` | 最大重入队次数;`0` 表示首次失败后直接删除 |
|
|
138
|
-
|
|
139
|
-
新增、修改或删除队列处理配置会在下一同步周期生效。同步间隔默认最多 180 秒,
|
|
140
|
-
正数 `MQListenerTime` 可缩短但最低 15 秒;Host、端口、凭据、vhost 或 TLS 变更
|
|
141
|
-
不会重建已缓存连接,需要滚动重启对应节点。
|
|
142
|
-
|
|
143
|
-
多节点会对同一租户队列使用 RabbitMQ competing consumer,但“只有一个节点收到”不等于业务只执行一次。消息 envelope 的 `EventId` 是稳定幂等键,消费者必须配合数据库唯一约束、inbox/条件更新保证副作用仅一次;连接凭据轮换后当前版本需要重启节点重建连接。
|
|
144
|
-
|
|
145
|
-
消费者使用 `prefetch=1`、手动 Ack。接口引擎返回可解析的 `DosResult Code=1` 才
|
|
146
|
-
明确成功;为兼容旧处理器,`null` 或非 `DosResult` 返回也会 Ack,因此新代码必须
|
|
147
|
-
显式返回 `{Code:1}` 或 `{Code:0}`。失败且 `FailToReject=是` 时,Redis 以 EventId
|
|
148
|
-
记录 7 天重试次数并在未达到 `Count` 前立即 requeue;当前源码没有退避和自动 DLQ,
|
|
149
|
-
达到上限或未启用重入队时会 Reject 且不 requeue。
|
|
150
|
-
|
|
151
|
-
---
|
|
152
|
-
|
|
153
|
-
<!-- /microi-progressive:chunk -->
|
|
154
|
-
<!-- microi-progressive:chunk id=v8-mq-mqtt-001 sha256=f65fe365f1adca83c0eabe95f73a658d6d79f33b3d9a8d34c5b35ede841e7d73 -->
|
|
155
|
-
## 注意事项
|
|
156
|
-
|
|
157
|
-
- MQ 消费者接口引擎通过 `V8.Param.Message` 获取消息,包含 `EventId`、兼容 `Id`、`OsClient`、`Message`、`CurrentUserId`
|
|
158
|
-
- MQ 适合异步解耦、削峰填谷、耗时操作异步化
|
|
159
|
-
- MQTT 七类事件在同一个接口引擎中处理,通过 `V8.EventName` 区分
|
|
160
|
-
- MQTT 适合 IoT 设备管理、实时数据采集
|
|
161
|
-
- 设备/告警/工单等业务事实优先进入关系库,高频遥测可进入 MongoDB,大附件进入对象存储
|
|
162
|
-
- RabbitMQ 租户凭据在 SaaS 引擎登记前必须先在真实 RabbitMQ 创建 user/vhost/权限;内嵌 MQTT Broker 直接校验 SaaS 中的 MQTT 凭据,使用外部 MQTT Broker 时另行完成真实 Broker 账号、ACL 与适配器配置
|
|
163
|
-
- `ConnectedClients` 只代表当前 MQTT 节点的诊断快照,不是集群全局在线事实
|
|
164
|
-
- MQTT 启动失败必须在控制台直接输出脱敏的底层原因、监听端口和针对性解决建议,并将同一诊断写入系统日志;不能只提示“查看系统日志”。端口占用须核对 PID 和节点归属,不得结束所有后端进程。
|
|
165
|
-
- 内嵌 MQTT Broker 不具备跨节点共享会话/订阅/retained 的集群一致性;多 API 节点生产部署应使用支持集群的外部 Broker,或把内嵌 Broker 固定到独立节点并由负载入口路由,不能让每个 API 节点各自充当一套独立 Broker
|
|
166
|
-
- MQTT 生产配置、安全语义、事件字段可用性和上线清单以 [MQTT 生产参考](references/mqtt-production.md) 为准
|
|
167
|
-
<!-- /microi-progressive:chunk -->
|
|
168
|
-
## 详细参考路由(渐进披露)
|
|
169
|
-
|
|
170
|
-
仅在当前任务涉及对应主题时读取;下列文件合计保留了原 SKILL.md 的全部详细知识。
|
|
171
|
-
|
|
172
|
-
- [references/progressive-01-v8-mqtt-iot-物联网.md](references/progressive-01-v8-mqtt-iot-物联网.md):V8.MQTT — IoT 物联网
|
|
173
|
-
<!-- microi-progressive:end -->
|
|
174
|
-
|
|
175
|
-
平台级 MQTT 状态与下行发布统一调用 Managed 接口引擎 `platform-mqtt`;该入口只允许当前租户超级管理员,并由 `V8.Method.ManageMqtt` 固定租户边界。普通设备业务仍应创建自己的授权接口引擎。
|
|
1
|
+
---
|
|
2
|
+
name: v8-mq-mqtt
|
|
3
|
+
description: Microi V8 消息队列与 MQTT 生产指南。用于 V8.MQ.SendMsg、RabbitMQ 消费与幂等,以及内嵌 MQTT Broker、SaaS 租户认证、Topic ACL、TLS、QoS/Retain、七类 V8.MQTT 事件、设备级接口引擎、服务端下行、IoT 数据分层和多节点部署验收。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
> **Codex 非阻塞自动更新:** 当前宿主为 Codex 时,吾码 CLI、Codex 插件与工作区 AI/MCP 由后台自动更新;需要诊断时读取 `../microi-codex-installer/SKILL.md`。更新失败、等待空闲或尚未重载均不得阻断当前、正在进行或新建任务。非 Codex 宿主跳过此项。
|
|
7
|
+
|
|
8
|
+
# Microi V8 消息队列与 MQTT
|
|
9
|
+
|
|
10
|
+
你正在开发 Microi 吾码平台的 V8 引擎代码,需要使用 RabbitMQ 消息队列或 MQTT 物联网协议。
|
|
11
|
+
|
|
12
|
+
<!-- microi-progressive:begin -->
|
|
13
|
+
<!-- microi-progressive:chunk id=v8-mq-mqtt-000 sha256=4a6559aed1af036591a04002c6e3311d9f0957fbbabbcafdc4a6bad95dabd843 -->
|
|
14
|
+
## V8.MQ — RabbitMQ 消息队列
|
|
15
|
+
|
|
16
|
+
### 生产消息(后端)
|
|
17
|
+
|
|
18
|
+
```javascript
|
|
19
|
+
// 当前 V8EngineMQ 是同步包装,调用完成后直接返回 DosResult。
|
|
20
|
+
// 业务重试必须复用同一个 EventId,供消费者幂等去重。
|
|
21
|
+
var result = V8.MQ.SendMsg({
|
|
22
|
+
QueueName: 'order_process',
|
|
23
|
+
EventId: V8.Param.eventId || V8.Method.NewUlid(),
|
|
24
|
+
Message: {
|
|
25
|
+
ProductId: '123',
|
|
26
|
+
Count: 2,
|
|
27
|
+
OrderId: V8.Param.orderId
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
if (result.Code !== 1) return result;
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
逻辑队列名由服务端规范为 `microi.{lowerOsClient}.{queueName}`。V8 上下文、登录 Token 与后台显式 `OsClient` 是权威租户,body 不能切换到其它租户队列。
|
|
34
|
+
|
|
35
|
+
### 生产消息(前端)
|
|
36
|
+
|
|
37
|
+
```javascript
|
|
38
|
+
V8.ApiEngine.Run('platform-mq', {
|
|
39
|
+
Action: 'Send',
|
|
40
|
+
QueueName: 'queue_name',
|
|
41
|
+
EventId: stableEventId,
|
|
42
|
+
Message: { ProductId: '123', Count: 2 }
|
|
43
|
+
}).then(function(result) {
|
|
44
|
+
if (result.Code === 1) V8.Tips('消息已发送', true);
|
|
45
|
+
});
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
`platform-mq` 是应用商城交付的 Managed 管理接口,只允许当前租户超级管理员,
|
|
49
|
+
并在可信 V8 原子层固定租户、队列名和 1 MB 消息上限。普通业务前端应调用
|
|
50
|
+
自己的受权接口引擎,再由业务接口引擎执行 `V8.MQ.SendMsg`。
|
|
51
|
+
|
|
52
|
+
### 消费消息
|
|
53
|
+
|
|
54
|
+
消费者是一个接口引擎,在 `diy_queue_receive` 表中配置队列名和接口引擎 Key 后,消息到达时自动调用。
|
|
55
|
+
|
|
56
|
+
```javascript
|
|
57
|
+
// 消费者接口引擎
|
|
58
|
+
var message = V8.Param.Message; // object 类型
|
|
59
|
+
// message.EventId — 稳定业务幂等 Id
|
|
60
|
+
// message.Id — EventId 的兼容别名
|
|
61
|
+
// message.OsClient — 消息所属租户
|
|
62
|
+
// message.Message — 消息内容
|
|
63
|
+
// message.CurrentUserId — 生产消息的用户 Id
|
|
64
|
+
|
|
65
|
+
// 处理业务逻辑
|
|
66
|
+
var data = message.Message;
|
|
67
|
+
V8.FormEngine.UptFormData('Product', {
|
|
68
|
+
Id: data.ProductId,
|
|
69
|
+
Stock: data.Count
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
return { Code: 1, Data: { EventId: message.EventId } };
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### 实战模式:异步处理耗时操作
|
|
76
|
+
|
|
77
|
+
```javascript
|
|
78
|
+
// 接口引擎:接收请求后发送到队列,快速返回
|
|
79
|
+
var sendResult = V8.MQ.SendMsg({
|
|
80
|
+
QueueName: 'order_process',
|
|
81
|
+
EventId: V8.Param.eventId,
|
|
82
|
+
Message: {
|
|
83
|
+
orderId: V8.Param.orderId,
|
|
84
|
+
action: 'create',
|
|
85
|
+
userId: V8.CurrentUser.Id
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
if (!sendResult || sendResult.Code !== 1) return sendResult;
|
|
90
|
+
|
|
91
|
+
return { Code: 1, Msg: '订单处理中,请稍候查看结果' };
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
```javascript
|
|
95
|
+
// 消费者接口引擎:异步处理订单
|
|
96
|
+
var msg = V8.Param.Message;
|
|
97
|
+
var data = msg.Message;
|
|
98
|
+
|
|
99
|
+
try {
|
|
100
|
+
// 耗时操作:调用第三方 ERP 接口
|
|
101
|
+
var erpResult = V8.Http.Post({
|
|
102
|
+
Url: 'https://erp.company.com/api/order',
|
|
103
|
+
PostParamString: JSON.stringify({ orderId: data.orderId }),
|
|
104
|
+
ParamType: 'json',
|
|
105
|
+
Timeout: 30
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
V8.FormEngine.UptFormData('Order', {
|
|
109
|
+
Id: data.orderId,
|
|
110
|
+
SyncStatus: 'success',
|
|
111
|
+
SyncTime: DateNow('yyyy-MM-dd HH:mm:ss')
|
|
112
|
+
});
|
|
113
|
+
return { Code: 1, Data: { EventId: msg.EventId } };
|
|
114
|
+
} catch (ex) {
|
|
115
|
+
V8.FormEngine.UptFormData('Order', {
|
|
116
|
+
Id: data.orderId,
|
|
117
|
+
SyncStatus: 'failed',
|
|
118
|
+
SyncError: ex.message
|
|
119
|
+
});
|
|
120
|
+
console.error('订单同步失败: ' + ex.message);
|
|
121
|
+
return { Code: 0, Msg: '订单同步失败' };
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### MQ 配置
|
|
126
|
+
|
|
127
|
+
每个租户都必须配置 `MQHost/MQPort/MQUserName/MQPassword/MQVitrualHost`,并在 RabbitMQ 中真实创建独立 user/vhost,把权限限制在自己的 vhost 与 `microi.{lowerOsClient}.*` 队列。缺少配置或与其它已加载租户共用 user/password/vhost 时失败关闭,不回退主租户管理员账号。可选 `MQUseTls/MQTlsServerName`;`MQHost` 可用逗号分隔多个端点。当前 `AddMicroiMQ()` 默认注册 `MicroiRabbitMQSingleConnection`,不会按 `MQType` 自动切换实现。
|
|
128
|
+
|
|
129
|
+
在 `diy_queue_receive` 表新增记录后,后台同步会创建或更新消费者:
|
|
130
|
+
|
|
131
|
+
| 字段 | 含义 |
|
|
132
|
+
|------|------|
|
|
133
|
+
| `Type` | `1`=接口引擎;`2`=仅默认主租户受控 DLL |
|
|
134
|
+
| `QueueName` | 逻辑队列名(与生产端 `SendMsg({ QueueName, ... })` 一致) |
|
|
135
|
+
| `ApiEngineKey` | 消费者接口引擎 Key |
|
|
136
|
+
| `FailToReject` | 值为“是”时失败后允许有限重入队 |
|
|
137
|
+
| `Count` | 最大重入队次数;`0` 表示首次失败后直接删除 |
|
|
138
|
+
|
|
139
|
+
新增、修改或删除队列处理配置会在下一同步周期生效。同步间隔默认最多 180 秒,
|
|
140
|
+
正数 `MQListenerTime` 可缩短但最低 15 秒;Host、端口、凭据、vhost 或 TLS 变更
|
|
141
|
+
不会重建已缓存连接,需要滚动重启对应节点。
|
|
142
|
+
|
|
143
|
+
多节点会对同一租户队列使用 RabbitMQ competing consumer,但“只有一个节点收到”不等于业务只执行一次。消息 envelope 的 `EventId` 是稳定幂等键,消费者必须配合数据库唯一约束、inbox/条件更新保证副作用仅一次;连接凭据轮换后当前版本需要重启节点重建连接。
|
|
144
|
+
|
|
145
|
+
消费者使用 `prefetch=1`、手动 Ack。接口引擎返回可解析的 `DosResult Code=1` 才
|
|
146
|
+
明确成功;为兼容旧处理器,`null` 或非 `DosResult` 返回也会 Ack,因此新代码必须
|
|
147
|
+
显式返回 `{Code:1}` 或 `{Code:0}`。失败且 `FailToReject=是` 时,Redis 以 EventId
|
|
148
|
+
记录 7 天重试次数并在未达到 `Count` 前立即 requeue;当前源码没有退避和自动 DLQ,
|
|
149
|
+
达到上限或未启用重入队时会 Reject 且不 requeue。
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
<!-- /microi-progressive:chunk -->
|
|
154
|
+
<!-- microi-progressive:chunk id=v8-mq-mqtt-001 sha256=f65fe365f1adca83c0eabe95f73a658d6d79f33b3d9a8d34c5b35ede841e7d73 -->
|
|
155
|
+
## 注意事项
|
|
156
|
+
|
|
157
|
+
- MQ 消费者接口引擎通过 `V8.Param.Message` 获取消息,包含 `EventId`、兼容 `Id`、`OsClient`、`Message`、`CurrentUserId`
|
|
158
|
+
- MQ 适合异步解耦、削峰填谷、耗时操作异步化
|
|
159
|
+
- MQTT 七类事件在同一个接口引擎中处理,通过 `V8.EventName` 区分
|
|
160
|
+
- MQTT 适合 IoT 设备管理、实时数据采集
|
|
161
|
+
- 设备/告警/工单等业务事实优先进入关系库,高频遥测可进入 MongoDB,大附件进入对象存储
|
|
162
|
+
- RabbitMQ 租户凭据在 SaaS 引擎登记前必须先在真实 RabbitMQ 创建 user/vhost/权限;内嵌 MQTT Broker 直接校验 SaaS 中的 MQTT 凭据,使用外部 MQTT Broker 时另行完成真实 Broker 账号、ACL 与适配器配置
|
|
163
|
+
- `ConnectedClients` 只代表当前 MQTT 节点的诊断快照,不是集群全局在线事实
|
|
164
|
+
- MQTT 启动失败必须在控制台直接输出脱敏的底层原因、监听端口和针对性解决建议,并将同一诊断写入系统日志;不能只提示“查看系统日志”。端口占用须核对 PID 和节点归属,不得结束所有后端进程。
|
|
165
|
+
- 内嵌 MQTT Broker 不具备跨节点共享会话/订阅/retained 的集群一致性;多 API 节点生产部署应使用支持集群的外部 Broker,或把内嵌 Broker 固定到独立节点并由负载入口路由,不能让每个 API 节点各自充当一套独立 Broker
|
|
166
|
+
- MQTT 生产配置、安全语义、事件字段可用性和上线清单以 [MQTT 生产参考](references/mqtt-production.md) 为准
|
|
167
|
+
<!-- /microi-progressive:chunk -->
|
|
168
|
+
## 详细参考路由(渐进披露)
|
|
169
|
+
|
|
170
|
+
仅在当前任务涉及对应主题时读取;下列文件合计保留了原 SKILL.md 的全部详细知识。
|
|
171
|
+
|
|
172
|
+
- [references/progressive-01-v8-mqtt-iot-物联网.md](references/progressive-01-v8-mqtt-iot-物联网.md):V8.MQTT — IoT 物联网
|
|
173
|
+
<!-- microi-progressive:end -->
|
|
174
|
+
|
|
175
|
+
平台级 MQTT 状态与下行发布统一调用 Managed 接口引擎 `platform-mqtt`;该入口只允许当前租户超级管理员,并由 `V8.Method.ManageMqtt` 固定租户边界。普通设备业务仍应创建自己的授权接口引擎。
|