## 问题归因 - 活动/期号为空:后端仅在存在抽奖日志时填充活动信息,未抽取或刚支付时为0。参考 internal/api/admin/pay_orders_admin.go:167-191。 - 中奖字段与等级:前端直接展示“是否中奖”,但应改为“中奖等级”并基于 `activity.level`/`reward_id` 显示;未抽取时应显示“待开奖”。 - 支付信息不全:只显示 `ActualAmount`,未分解“积分抵扣金额/积分数量”;`PayPreorderID` 为0时未做断言处理。 - 商品价格与金额为0:抽奖订单常无商品明细或价格未赋值;可根据奖励商品填充价格,或以“抽奖价格×次数”为明细。 ## 后端改造(GetPayOrderDetail) - 文件:internal/api/admin/pay_orders_admin.go - 变更点: 1) 无抽奖日志时,解析 `order.Remark` 中 `lottery:activity:|issue:|count:` 填充 `activity.activity_id/issue_id`,查询 `issue.issue_number` 与 `activity.activity_name`。 2) 扩展支付信息:`payment.points_amount`(订单积分抵扣金额,单位分)、`payment.points_used`(抵扣积分数量=points_amount/10)、`payment.total_amount`(订单总额,单位分)。 3) 返回 `activity.count`(抽次数);若有奖励商品,补充 `activity.product_price`(商品价格,单位分)。 4) 若订单无 `order_items`,在响应中提供 `computed_items`:基于“抽奖价格×次数”构造一条展示用明细(前端优先显示 `computed_items`)。 5) `payment.pay_preorder_id` 为0时仍返回,前端据此显示“-”。 ## 前端改造(订单详情抽屉) - 文件:web/admin/src/views/…(订单详情抽屉组件,使用 fetchGetOrderDetail) - 变更点: 1) 活动:显示 `activity.activity_name`;下方附 `issue_number`;不显示 `(ID:0)`。 2) 状态区:移除“是否中奖”;改为“中奖等级”显示 `activity.level`,若 `reward_id` 为空则显示“待开奖”。 3) 支付区: - “实付”显示:`payment.actual_amount/100` 元 - 新增“积分抵扣”:`payment.points_used` 积分(约 `points_amount/100` 元) - 新增“订单总额”:`payment.total_amount/100` 元 - “预订单ID”:显示 `payment.pay_preorder_id`,为0则显示“-” 4) 明细表: - 优先显示 `computed_items` 的“单价/金额”,否则显示 `items`; - 若有中奖商品,显示 `activity.reward_name` 与 `activity.product_price`。 ## 路由与API契约 - 前端调用不变:`GET admin/pay/orders/:order_no` - 响应新增字段: - `activity.count`、`activity.product_price` - `payment.points_amount`、`payment.points_used`、`payment.total_amount` - `computed_items: [{name, quantity, unit_price, amount}]` ## 实施步骤 1) 后端:更新 GetPayOrderDetail 填充解析与新增字段;构造 `computed_items`。 2) 前端:更新详情组件的数据映射与展示逻辑;删改“是否中奖”,补充字段渲染与空值处理。 3) 验证: - 无抽奖日志的订单仍能显示活动名称与期号 - 积分全额支付场景显示积分抵扣与总额,实付为0,预订单ID为“-” - 即时模式支付后,轮询显示中奖等级与商品信息 - 明细表显示正确单价/金额 ## 验收标准 - 所有问题项均有正确数据或合理占位显示 - 即时/定时、积分/金额支付四种组合下展示正确 - 架构不破坏现有接口:前端仅增量使用新增字段