新增仓储模块页面与 API、店铺授权/店铺订单页面及路由权限目录; 扩展菜单管理同步能力支持二级子菜单与三级按钮;优化公告、仓库地址、下单等页面。 Co-authored-by: Cursor <cursoragent@cursor.com>
25 KiB
订单批量处理与异步队列方案
文档定位:梳理 OMS 后端现有订单批量相关 API、执行模式与可复用资产,并给出统一异步队列改造建议。
对照仓库:C:\Users\wilso\Desktop\oms0414-back(SimpleAdmin.sln)
前端对照:E:\oms0414\src\views\order\myOrders\index.vue
关联文档:docs/oms系统设计-050801.md(订单章)、docs/rbac系统设计-060801.md(权限)
编写日期:2026-07-07
技术决策:选用 RabbitMQ 作为订单批量异步队列方案(v2.0)
1 导读
1.1 这份文档解决什么问题?
- 盘点当前后端所有「批量处理订单」相关 HTTP 接口(含原生批量与前端循环伪批量)。
- 说明各接口入参/出参、Service 实现位置、同步/异步执行方式。
- 指出现有最接近队列的组件(
t_order_task、SmallBagTrackOrderNotifier)及其局限。 - 建议按业务类型划分异步队列、统一批量 Job API 草案与落地优先级。
- 定义基于 RabbitMQ 的交换机/队列拓扑、消息契约、Consumer 与 Fake 框架集成方式(已定稿)。
1.2 技术决策
| 项 | 决策 |
|---|---|
| 消息中间件 | RabbitMQ |
| .NET 接入 | 优先复用 Fake 生态 Fake.RabbitMQ(连接池/通道池);订单 Job 使用 Work Queue 模式 自建 Publisher/Consumer |
与 Fake.EventBus.RabbitMQ 关系 |
事件总线用于跨模块集成事件(如 Job 完成通知);订单子任务投递不走 EventBus,走专用 Work Queue |
| 状态持久化 | MySQL t_order_batch_job / t_order_batch_job_item 为权威进度;MQ 仅负责调度与重试 |
| 宿主部署 | SimpleAdmin.Api 进程内注册 Consumer(IHostedService);后期可拆独立 Worker 项目 |
1.3 现状结论(摘要)
| 维度 | 现状 |
|---|---|
| API 暴露 | OrderService(partial class)上 [HttpPost] / [HttpGet],Fake 动态 API,无手写 Controller |
| 原生批量 API | 异常件 3 个 + 小包 batch-create + Excel 导入 + 条件导出,共 5 类 |
| 伪批量 | My Orders 页 8 个单票 API,前端 for 循环逐条调用 |
| 队列基础设施 | 规划 RabbitMQ(项目基线已约定 MQ,见 oms0414-back/开发复刻说明.md);当前代码尚未引用 Fake.RabbitMQ |
| 轻量异步 | SmallBagTrackOrderNotifier 使用 Task.Run(无持久化、无重试) |
| 任务表 | t_order_task 记录 Excel 导入进度,但处理仍在 HTTP 请求内同步完成 |
| 权限 | 前端 Order.MyOrders.*;后端 API 未做细粒度 PermissionCode 校验 |
2 接口总览
flowchart LR
subgraph api [SimpleAdmin.Api]
HTTP["/order/batch/jobs"]
OS[OrderService]
end
subgraph db [MySQL]
JOB[t_order_batch_job]
ITEM[t_order_batch_job_item]
end
subgraph rmq [RabbitMQ]
EX["exchange: oms.order.batch"]
QD["queue: order.batch.integration"]
QA["queue: order.batch.account"]
QB["queue: order.batch.state"]
QC["queue: order.batch.exception"]
QE["queue: order.batch.document"]
QF["queue: order.batch.create"]
DLX["DLX: oms.order.batch.dlx"]
end
subgraph consumers [Consumers IHostedService]
CD[IntegrationConsumer]
CA[AccountConsumer]
CB[StateConsumer]
CC[ExceptionConsumer]
CE[DocumentConsumer]
CF[CreateConsumer]
end
HTTP --> JOB
HTTP --> EX
EX --> QD & QA & QB & QC & QE & QF
QD & QA & QB & QC & QE & QF --> consumers
consumers --> ITEM
consumers --> OS
QD & QA & QB & QC & QE & QF -.失败.-> DLX
2.1 分类一览(改造后目标)
flowchart TB
subgraph native [原生批量 API]
EP["/order/mark-problematic<br/>/order/mark-claimed<br/>/order/handle-status/update"]
PCB["/order/parcel/batch-create"]
UP["/order/upload + task/*"]
EX["/order/export"]
end
subgraph pseudo [伪批量 - 前端循环单票 API]
PAY["/order/pay"]
PD["/order/pre-declare"]
INT["/order/intercept / cancel-intercept"]
DEL["/order/delete"]
PRT["/order/print"]
TRK["/order/track-upsert-small-bag"]
DS["/order/downstream-forward-create-one"]
end
subgraph svc [OrderService 同步处理]
OS[OrderService partial]
end
subgraph async_hint [现有轻量异步]
OT[t_order_task 仅记录]
STN[SmallBagTrackOrderNotifier Task.Run]
end
native --> OS
pseudo --> OS
UP --> OT
PCB --> STN
2.2 原生批量 API 清单
| 路由 | 方法 | Service 方法 | 文件 | 批量语义 | 上限 | 执行模式 |
|---|---|---|---|---|---|---|
/order/mark-problematic |
POST | MarkProblematicAsync |
OrderService.Exception.cs |
List<int> OrderIds |
200 | 同步 foreach,部分成功 |
/order/mark-claimed |
POST | MarkClaimedAsync |
同上 | List<int> OrderIds |
200 | 同上 |
/order/handle-status/update |
POST | UpdateHandleStatusAsync |
同上 | List<int> OrderIds |
200 | 同上(仅 processed) |
/order/parcel/batch-create |
POST | BatchCreateParcelAsync |
OrderService.cs |
List<OrderParcelCreateInput> |
2000 | 同步 for,逐条明细 |
/order/upload |
POST | UploadAsync → ImportOrdersAsync |
OrderService.Helpers.cs |
Excel 多行 | — | 同步逐行 + 写 OrderTask |
/order/task/list |
GET | GetTaskListAsync |
OrderService.Helpers.cs |
查询导入任务 | — | 只读 |
/order/task/detail |
GET | GetTaskDetailAsync |
同上 | 含失败行 | — | 只读 |
/order/export |
POST | ExportAsync |
OrderService.cs |
筛选条件全量 | — | 同步生成 xlsx |
2.3 伪批量 API 清单(单票入参,前端循环)
| 路由 | 方法 | Service 方法 | 文件 | 业务特点 | 前端权限码(参考) |
|---|---|---|---|---|---|
/order/pay |
POST | PayAsync |
OrderService.cs |
扣客户余额,需事务/幂等 | Order.MyOrders.Pay |
/order/pre-declare |
POST | PreDeclareAsync |
同上 | 改订单状态 | Order.MyOrders.PreDeclare |
/order/intercept |
POST | InterceptAsync |
同上 | IsIntercept=1 |
Order.MyOrders.Intercept |
/order/cancel-intercept |
POST | CancelInterceptAsync |
同上 | IsIntercept=0 |
Order.MyOrders.CancelIntercept |
/order/delete |
POST | DeleteAsync |
同上 | 软删 + 物理删 | Order.MyOrders.Delete |
/order/print |
POST | PrintAsync |
OrderService.Helpers.cs |
生成打印 HTML | Order.MyOrders.Print / BatchPrint |
/order/track-upsert-small-bag |
POST | TrackUpsertSmallBagAsync |
OrderService.ParcelBilling.cs |
HTTP 调轨迹服务 | Order.MyOrders.CreateTrack |
/order/downstream-forward-create-one |
POST | DownstreamForwardCreateOneAsync |
OrderService.DownstreamForward.cs |
HTTP 调下游 itfx | Order.MyOrders.ForwardDownstream |
公共入参 OrderActionInput:
public class OrderActionInput
{
[Required] public int Id { get; set; }
[StringLength(64)] public string? RequestId { get; set; }
}
辅助只读:
| 路由 | 方法 | 说明 |
|---|---|---|
/order/downstream-create-one-body |
GET | 预览下游请求体,不实际转发 |
2.4 单票编辑类 API(详情抽屉,非列表批量)
| 路由 | 方法 | Service 方法 | 文件 |
|---|---|---|---|
/order/update |
POST | UpdateOrderDetailAsync |
OrderService.OrderEdit.cs |
/order/weight/update |
POST | UpdateOrderWeightsAsync |
同上 |
/order/fee/recalculate-receivable |
POST | RecalculateReceivableFeesAsync |
同上 |
/order/fee/recalculate-payable |
POST | RecalculatePayableFeesAsync |
同上 |
/order/fee/add |
POST | AddOrderFeeAsync |
同上 |
/order/parcel/create |
POST | CreateParcelAsync |
OrderService.cs / ParcelBilling.cs |
2.5 非 OrderIds 的「批量数据处理」
| 路由 | 方法 | 说明 |
|---|---|---|
/order/price-check |
POST | 多产品 × 多仓库运费试算,同步嵌套循环 |
/order/list |
POST | 分页列表 |
/order/status-counts |
GET | 状态 Tab 计数 |
3 DTO 与出参模型
3.1 异常件批量(推荐复用为队列 Job 汇总出参)
文件:Oms.Application/Dtos/Orders/OrderExceptionDtos.cs
// 统一批量出参
public class OrderBatchActionResultOutput
{
public int SuccessCount { get; set; }
public List<OrderBatchActionFailureOutput> Failures { get; set; } = [];
}
public class OrderBatchActionFailureOutput
{
public int OrderId { get; set; }
public string? ServiceNo { get; set; }
public string Reason { get; set; } = string.Empty;
}
// 问题件
public class OrderMarkProblematicInput
{
public List<int> OrderIds { get; set; } = [];
public int? IssueTemplateId { get; set; }
public string? IssueType { get; set; }
public string? Title { get; set; }
public string? Content { get; set; }
public string? Remark { get; set; }
}
// 理赔件
public class OrderMarkClaimedInput
{
public List<int> OrderIds { get; set; } = [];
public string? ClaimType { get; set; }
public decimal? ClaimAmount { get; set; }
public string? ClaimCurrency { get; set; }
public string? ClaimReason { get; set; }
public string? Remark { get; set; }
}
// 标记已处理
public class OrderHandleStatusUpdateInput
{
public List<int> OrderIds { get; set; } = [];
public string? HandleStatus { get; set; }
public string? Remark { get; set; }
}
内部约束:MaxExceptionBatchSize = 200(OrderService.Exception.cs)。
3.2 小包批量创建
文件:Oms.Application/Dtos/Orders/OrderParcelBatchCreateInput.cs 等
- 入参:
OrderParcelBatchCreateInput继承List<OrderParcelCreateInput>,单条结构与/order/parcel/create一致。 - 出参:
OrderParcelBatchCreateOutput { BatchNo, SuccessCount, FailCount, Items[] } - 上限:
ParcelBatchMaxCount = 2000(OrderService.ParcelBilling.cs)
3.3 Excel 导入
| DTO | 字段 |
|---|---|
OrderUploadInput |
File (IFormFile), TemplateId |
OrderUploadOutput |
TaskId |
OrderTaskListInput |
分页查询参数 |
OrderTaskOutput / OrderTaskDetailOutput |
任务汇总 + 失败明细 FailList |
3.4 条件导出
| DTO | 字段 |
|---|---|
OrderExportInput |
status, keyword, createTimeStart, createTimeEnd |
OrderExportOutput |
downloadUrl, expireAt(24h 过期) |
4 现有执行模式详解
4.1 异常件批量(已实现部分成功)
调用链:
MarkProblematicAsync / MarkClaimedAsync / UpdateHandleStatusAsync
→ NormalizeOrderIds(去重、非空、≤200)
→ ExecuteProblematicBatchAsync / ExecuteExceptionBatchAsync
→ 逐条 try/catch,成功 SuccessCount++,失败写入 Failures
问题件单条逻辑:OrderExceptionWorkflowService.TryMarkProblematicAsync(Issues/OrderExceptionWorkflowService.cs),含通知(OrderIssueNotificationService)。
4.2 小包批量创建
BatchCreateParcelAsync
→ 生成 BatchNo
→ for each OrderParcelCreateInput
→ CreateParcelCoreAsync(预报、计费、落库)
→ 成功则 EnqueueSmallBagTrackUpsertAsync(轨迹)
→ 返回逐条 Items 明细
4.3 Excel 导入(有任务表,非真异步)
UploadAsync → ImportOrdersAsync
→ Insert OrderTask(Status=processing)
→ foreach Excel 行
→ CreateImportOrderAsync 或记录 OrderTaskFail
→ 更新 task Quantity / SuccessCount / FailCount / Status=completed
→ 返回 { taskId }
局限:整个导入阻塞当前 HTTP 请求;Status=processing 仅为记录,无独立 Consumer。
4.4 轨迹轻量异步(现有唯一 fire-and-forget)
文件:Oms.Application/Integrations/SmallBagTrack/SmallBagTrackOrderNotifier.cs
public void Enqueue(SmallBagTrackUpsertRequest request)
{
_ = Task.Run(async () =>
{
using var scope = scopeFactory.CreateScope();
var client = scope.ServiceProvider.GetRequiredService<ISmallBagTrackOrderClient>();
await client.UpsertAsync(request);
});
}
性质:单票、内存队列、无持久化、无重试、进程重启即丢失。
4.5 前端伪批量行为
文件:src/views/order/myOrders/index.vue
- 勾选多行后,对
pay/pre-declare/intercept等 逐条 POSTOrderActionInput。 - 支付等操作:任一失败即中断,无部分成功汇总(与异常件 API 不同)。
- 批量打印 / 轨迹 / 下游:循环调用后前端汇总结果弹窗。
5 现有基础设施盘点
| 组件 | 是否存在 | 说明 |
|---|---|---|
| RabbitMQ Work Queue | ❌ 未接入 | 本期建设 |
Fake.RabbitMQ |
❌ 未引用 | 连接池/通道池,见 SPEC.md §9.3 |
Fake.EventBus.RabbitMQ |
❌ 未引用 | 可选,用于 Job 完成等集成事件 |
订单专用 IHostedService |
❌ | 无 |
BackgroundService |
✅ 1 个 | 仅 XhsScheduledPublishWorker(小红书定时发布) |
Task.Run |
✅ | 轨迹 UpsertSmallBag、导出文件清理等 |
t_order_task |
✅ | 导入任务记录 + t_order_task_fail 失败行 |
SmallBagTrackOrderNotifier |
✅ | 内存 fire-and-forget |
5.1 OrderTask 实体(可演进为通用批量 Job 表)
表:t_order_task
实体:Oms.Domain/OrdersAggregate/Entities/OrderTask.cs
| 字段 | 说明 |
|---|---|
TaskName |
如 批量下单_yyyyMMddHHmmss |
Quantity |
总条数 |
SuccessCount / FailCount |
成功/失败计数 |
Status |
processing → completed |
TemplateId |
Excel 模板 Id |
CustomerId |
客户归属 |
演进建议:扩展 Action、PayloadJson、StartedAt、FinishedAt,或新建 t_order_batch_job 与之并存。
6 RabbitMQ 队列分组(与业务 Action 映射)
按 业务风险 + 耗时 + 外部依赖 划分 6 条业务队列 + 1 条死信队列:
| 队列组 | RabbitMQ Queue | Routing Key | 包含 Action | 并发建议 | Prefetch |
|---|---|---|---|---|---|
| D. 外部集成 | oms.order.batch.integration |
integration.* |
track-upsert-small-bag, downstream-forward-create-one |
中(限流防打爆下游) | 5 |
| F. 订单创建 | oms.order.batch.create |
create.* |
parcel-create, import-row |
中 | 10 |
| A. 账务 | oms.order.batch.account |
account.* |
pay |
低(按 CustomerId 串行) | 1 |
| B. 状态变更 | oms.order.batch.state |
state.* |
pre-declare, intercept, cancel-intercept, delete, handle-status-update |
高 | 20 |
| C. 异常工作流 | oms.order.batch.exception |
exception.* |
mark-problematic, mark-claimed |
中 | 10 |
| E. 文档生成 | oms.order.batch.document |
document.* |
print, export |
低 | 3 |
| 死信 | oms.order.batch.dlx |
— | 超过最大重试的子任务 | — | — |
Exchange:oms.order.batch(类型 topic,持久化 durable=true)。
6.1 落地顺序建议
- D(外部集成) — 轨迹、下游预报最阻塞 HTTP,且已有
SmallBagTrackOrderNotifier可替换为 Publisher。 - F(创建/导入) —
OrderTask表与失败明细已就绪,补 Worker 即可真异步。 - A(支付) — 资金类须严格幂等与对账。
- B / C / E — 按产品优先级迭代。
7 统一批量 Job API 草案
7.1 路由设计
| 路由 | 方法 | 说明 |
|---|---|---|
/order/batch/jobs |
POST | 创建批量任务,写 DB 并 Publish 到 RabbitMQ,立即返回 jobId |
/order/batch/jobs/{id} |
GET | 查询进度与汇总结果 |
/order/batch/jobs/{id}/items |
GET | 逐条明细(成功/失败/进行中) |
/order/batch/jobs/{id}/cancel |
POST | 取消未执行子任务(可选) |
/order/batch/jobs/{id}/retry-failed |
POST | 将 failed 子任务重新 Publish(可选) |
7.2 入参草案
public class OrderBatchJobCreateInput
{
/// <summary>
/// pay | pre-declare | intercept | cancel-intercept | delete |
/// print | track-upsert-small-bag | downstream-forward-create-one |
/// mark-problematic | mark-claimed | handle-status-update | export | ...
/// </summary>
public string Action { get; set; } = string.Empty;
public List<int> OrderIds { get; set; } = [];
public JsonElement? Payload { get; set; }
public string? RequestId { get; set; }
}
7.3 出参草案
public class OrderBatchJobOutput
{
public long JobId { get; set; }
public string Action { get; set; } = string.Empty;
public string Status { get; set; } = string.Empty;
public int Total { get; set; }
public int SuccessCount { get; set; }
public int FailCount { get; set; }
public DateTime? StartedAt { get; set; }
public DateTime? FinishedAt { get; set; }
}
单条明细复用 OrderBatchActionFailureOutput,扩展 Status:pending / running / success / failed。
8 RabbitMQ 实施方案(已定稿)
8.1 为何选 RabbitMQ
| 能力 | 说明 |
|---|---|
| 持久化队列 | 进程重启不丢任务(配合 delivery_mode=2) |
| 死信 + 延迟重试 | 业务失败与系统失败分离治理 |
| 多队列隔离 | 支付、外部 HTTP、导入互不阻塞 |
| 水平扩展 | 多 API/Worker 实例共享 Consumer |
| 与项目基线一致 | 开发复刻说明.md 已约定 RabbitMQ;Fake 提供 Fake.RabbitMQ 连接池 |
不采用 Hangfire / DB 轮询的原因:订单批量含大量外部 HTTP 与长耗时导入,需要独立队列削峰与跨实例消费;DB 轮询难以优雅做按客户串行与 DLX。
8.2 NuGet 与模块依赖
在 SimpleAdmin.Api / Oms.Application 增加:
<PackageReference Include="Fake.RabbitMQ" Version="$(FakePackageVersion)" />
<!-- 可选:Job 完成集成事件 -->
<PackageReference Include="Fake.EventBus.RabbitMQ" Version="$(FakePackageVersion)" />
模块依赖(OmsApplicationModule 或新建 OmsRabbitMqModule):
[DependsOn(typeof(FakeRabbitMqModule))]
public class OmsRabbitMqModule : FakeModule { }
8.3 配置(appsettings / Consul)
{
"RabbitMQ": {
"Connections": {
"Default": {
"HostName": "rabbitmq",
"Port": 5672,
"UserName": "oms",
"Password": "***",
"VirtualHost": "/oms"
}
}
}
}
队列声明在应用启动时由 OrderBatchQueueInitializer(IHostedService)执行:创建 Exchange、6 条业务 Queue、DLX、绑定关系。
8.4 消息契约
队列消息体 OrderBatchJobMessage(JSON,Newtonsoft 驼峰):
public class OrderBatchJobMessage
{
public long JobId { get; set; }
public long JobItemId { get; set; }
public string Action { get; set; } = string.Empty; // pay, delete, track-upsert-small-bag, ...
public int OrderId { get; set; }
public int? CustomerId { get; set; } // A 组串行键
public string? PayloadJson { get; set; } // Action 专用参数
public int OperatorUserId { get; set; }
public string MessageId { get; set; } = string.Empty; // 幂等键
public int RetryCount { get; set; }
}
发布流程:
POST /order/batch/jobs
→ 写 t_order_batch_job + items(status=pending)
→ 按 Action 映射 routingKey,逐条 Publish 到 oms.order.batch
→ 立即返回 { jobId }
消费流程:
Consumer 收到消息
→ 查 item 是否已成功(幂等跳过)
→ item.status=running
→ IOrderBatchActionExecutor.ExecuteAsync(message)
→ 成功:item.status=success,更新 job 计数
→ 业务失败:item.status=failed + reason,ACK
→ 系统失败:NACK requeue;RetryCount>=3 → DLX
→ job 全部终态后 status=completed
8.5 与现有组件的替换关系
| 现有 | 改造后 |
|---|---|
SmallBagTrackOrderNotifier(Task.Run) |
Publish 到 oms.order.batch.integration,routingKey=integration.track-upsert |
ImportOrdersAsync 同步 foreach |
上传存文件/OSS → 写 job → 每行一条消息到 oms.order.batch.create |
前端 My Orders 循环 pay 等 |
统一 POST /order/batch/jobs,轮询 GET /order/batch/jobs/{id} |
异常件 API mark-problematic 等 |
兼容期保留同步 API;新增 async=true 或独立 Job API 走 MQ |
8.6 重试与死信策略
| 场景 | 策略 |
|---|---|
| 下游 HTTP 超时/5xx | NACK + requeue,指数退避(x-message-ttl + DLX 延迟队列,或 Consumer 内 Task.Delay 后重发) |
| 业务校验失败(已支付、状态不允许) | 记 failed,ACK 不重试 |
| 消息重复消费 | MessageId + DB 唯一约束,已 success 则直接 ACK |
| DLX 堆积 | 告警 + 管理端「重新投递」接口 |
建议队列参数:
x-dead-letter-exchange: oms.order.batch.dlx
x-dead-letter-routing-key: dead
8.7 部署拓扑
flowchart TB
subgraph prod [生产环境]
API1[SimpleAdmin.Api 实例 1]
API2[SimpleAdmin.Api 实例 2]
RMQ[RabbitMQ Cluster]
MySQL[(MySQL)]
end
API1 & API2 -->|Publish/Consume| RMQ
API1 & API2 --> MySQL
FE[oms0414 前端] -->|创建 Job / 轮询进度| API1
- 第一期:Consumer 与 API 同进程(
IHostedService),减少运维复杂度。 - 第二期:拆
Oms.OrderWorker独立控制台项目,仅引用Oms.Application+ Consumers。
8.8 本地开发
docker-compose 增加 RabbitMQ 服务(管理台 15672):
rabbitmq:
image: rabbitmq:3.13-management
ports:
- "5672:5672"
- "15672:15672"
environment:
RABBITMQ_DEFAULT_USER: oms
RABBITMQ_DEFAULT_PASS: oms123
RABBITMQ_DEFAULT_VHOST: /oms
8.9 Consumer 执行原则
- 复用现有 Service:
IOrderBatchActionExecutor按action分发,内部调用抽离后的单条逻辑。 - 幂等:
MessageId = {jobId}:{orderId}:{action};DB 唯一键(JobId, OrderId, Action);支付额外校验IsPaid。 - 部分成功:业务失败 ACK 并写
failed;系统失败 NACK requeue,超次进 DLX。 - 并发:A 组
prefetch=1+customerId串行;D 组全局限流。 - 可观测:日志带
JobId/OrderId/Action;可选OrderBatchJobCompletedEto走Fake.EventBus.RabbitMQ。
9 关键文件索引(规划新增)
| 文件(规划路径) | 职责 |
|---|---|
Oms.Application/Messaging/OrderBatchJobMessage.cs |
MQ 消息契约 |
Oms.Application/Messaging/IOrderBatchJobPublisher.cs |
Publish 抽象 |
Oms.Application/Messaging/OrderBatchQueueInitializer.cs |
启动声明 Exchange/Queue |
Oms.Application/Workers/OrderBatch/*Consumer.cs |
6 组 RabbitMQ Consumer |
Oms.Application/Services/Orders/Batch/IOrderBatchActionExecutor.cs |
Action 执行分发 |
Oms.Application/Services/Orders/OrderService.cs |
pay/delete/export/batch-create/upload 等主 API |
Oms.Application/Services/Orders/OrderService.Exception.cs |
原生 OrderIds 批量异常件 API |
Oms.Application/Services/Orders/OrderService.ParcelBilling.cs |
小包创建、轨迹同步 |
Oms.Application/Services/Orders/OrderService.DownstreamForward.cs |
下游预报转发 |
Oms.Application/Services/Orders/OrderService.Helpers.cs |
Excel 导入、打印、任务查询 |
Oms.Application/Integrations/SmallBagTrack/SmallBagTrackOrderNotifier.cs |
待替换为 MQ Publisher |
Oms.Domain/OrdersAggregate/Entities/OrderBatchJob.cs |
Job 实体(规划) |
src/views/order/myOrders/index.vue |
前端伪批量循环(待改 Job API) |
10 与主设计文档的关系
- 订单状态机、费用、模板字段详见
docs/oms系统设计-050801.md第 4 章。 - 客户隔离、
CustomerId解析见 OMS 设计 §1.4 与 RBAC 设计文档。 - Fake 框架 RabbitMQ 能力见
oms0414-back/SPEC.md§9.3(Fake.RabbitMQ、Fake.EventBus.RabbitMQ)。
11 后续工作清单(RabbitMQ 实施)
阶段一:基础设施(D 组)
docker-compose/ 生产环境部署 RabbitMQ(vhost/oms)- 引用
Fake.RabbitMQ,配置RabbitMQ:Connections:Default - 新建
OmsRabbitMqModule、OrderBatchQueueInitializer - 新建
t_order_batch_job/t_order_batch_job_item表 - 实现
IOrderBatchJobPublisher+OrderBatchJobMessage - 实现
IntegrationBatchConsumer(轨迹、下游预报) - 替换
SmallBagTrackOrderNotifier为 MQ Publish
阶段二:创建与导入(F 组)
/order/upload改为上传落库 + 按行入队oms.order.batch.createparcel/batch-create改为创建 Job 后异步消费- 复用/扩展
OrderTask与OrderBatchJob关系(如需兼容旧前端)
阶段三:统一 Job API + 前端
- 新增
/order/batch/jobs系列 API - 前端 My Orders 批量操作改 Job API + 进度轮询
- 实现 B/C/E/A 组 Consumer 与
IOrderBatchActionExecutor
阶段四:治理与测试
- DLX 监控告警、
retry-failed管理接口 - 补充
SimpleAdmin.Api.IntegrationTests(Publish → Consume → DB 状态) - 可选:拆
Oms.OrderWorker独立进程
文档版本:v2.0 | 技术决策:RabbitMQ | 2026-07-07