## 问题归因
- 活动/期号为空：后端仅在存在抽奖日志时填充活动信息，未抽取或刚支付时为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:<aid>|issue:<iss>|count:<N>` 填充 `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为“-”
   - 即时模式支付后，轮询显示中奖等级与商品信息
   - 明细表显示正确单价/金额

## 验收标准
- 所有问题项均有正确数据或合理占位显示
- 即时/定时、积分/金额支付四种组合下展示正确
- 架构不破坏现有接口：前端仅增量使用新增字段