## 订单操作者与产业链佣金语义修复功能总结 ### 1. 变更目标 本次变更围绕两个历史语义问题展开: 1. 订单 `operator_id/operator_type` 混用了“真实操作者账号”和“代理店铺 ID”,导致平台订单无法稳定显示真实操作者。 2. 订单 `commission_status` 只区分“待计算/已计算”,无法表达“有佣金 / 无佣金 / 链路异常待人工处理”的真实业务结果。 ### 2. 已完成的核心改动 #### 2.1 订单操作者改为账号语义 - 新增权威字段: - `operator_account_id` - `operator_account_type` - `operator_account_name` - 后台订单创建、H5 代理订单创建、客户端个人客户订单、自动购包订单都会写入真实操作者快照。 - 旧 `operator_id/operator_type` 保留为历史兼容字段,不再作为新语义权威来源。 #### 2.2 订单响应分离“操作者账号”和“业务店铺” - `operator_id/operator_type/operator_name` 现在按真实操作者账号语义返回。 - 新增 `seller_shop_id/seller_shop_name`,用于表达业务归属店铺展示。 - 历史订单优先使用新字段;若缺失,则按 `creator`、个人客户昵称、旧店铺型 `operator_id` 顺序兜底,避免平台旧订单出现空白操作者名称。 #### 2.3 订单佣金状态拆成“流程状态 + 业务结果” - `commission_status` 现在表示流程状态: - `1=待计算` - `2=已完成` - `3=待人工处理` - 新增 `commission_result` 表示业务结果: - `0=未知` - `1=有佣金` - `2=无佣金` - `3=链路异常` #### 2.4 差价佣金任务结果显式落单 - 佣金 worker 结束后会显式写回订单: - `已完成 + 有佣金` - `已完成 + 无佣金` - `待人工处理 + 链路异常` - 0 佣金订单不再长期停留在“待计算”。 #### 2.5 入队与幂等语义修复 - 钱包支付创建订单后,所有仍处于 `待计算` 的适用订单都会入队佣金任务,不再只覆盖特定购买角色。 - 重复支付回调、重复钱包支付不会重复入队。 - worker 对 `已完成/待人工处理` 订单直接跳过,避免重复补偿处理。 ### 3. 兼容策略 - migration 仅新增字段,不删除旧列。 - 历史订单读取时: - 优先使用 `operator_account_*` - 其次使用 `creator` 回填账号名 - 对旧代理订单保留店铺名兜底展示 - 历史订单的 `commission_result` 若未回填,则在响应层按佣金记录只读推断。 ### 4. 受影响文件 - `internal/model/order.go` - `internal/model/dto/order_dto.go` - `internal/service/order/service.go` - `internal/service/client_order/service.go` - `internal/service/commission_calculation/service.go` - `internal/store/postgres/order_store.go` - `internal/task/auto_purchase.go` - `pkg/constants/iot.go` - `migrations/000140_add_order_operator_snapshot_and_commission_result.*.sql` ### 5. 风险提示 - 历史订单若 `creator` 无法映射到账号,仍会退回旧店铺型操作者展示,仅保证“可读”而不强行伪造账号 ID。 - `commission_result=0` 仅作为历史兼容态存在;新计算链路应尽量落为明确业务结果。 - 本次不重构一次性佣金规则本身,只保证其异常待审记录能纳入订单最终流程结果判断。