# 故障排查与修复计划

针对您提出的四个问题，我制定了以下修复计划。我将使用中文进行回答和执行。

## 1. 虚拟发货问题 (Virtual Shipment)
*   **现状**: 后端代码中已存在 `UploadVirtualShipping` 调用，但在支付回调中如果上传失败，目前是忽略错误的（`_ = ...`），导致无法确定是否成功。
*   **修复**: 修改 `internal/api/pay/wechat_notify.go`，增加错误日志记录。如果虚拟发货上传失败，将在后台日志中打印详细错误原因，方便排查（如 `transaction_id` 错误或配置问题）。

## 2. 订单管理与退款 (Refund Button)
*   **现状**: 您提到的“履约”可能是指发货，但对于虚拟商品，通常需要的是“退款”。目前后台订单列表缺少直观的“退款”按钮。
*   **修复**:
    *   **前端**: 在 `web/admin/src/views/pay/orders/index.vue` 中添加“退款”按钮。
    *   **后端**: 对接现有的 `CreateRefund` 接口。该接口已包含完整的逻辑：调用微信退款、更新订单状态、**自动恢复用户积分**和**自动恢复优惠券**。

## 3. 道具卡添加不生效 (Item Card Issue)
*   **原因**: 经查代码 `internal/service/user/item_card_add.go`，当道具卡模板不存在或状态为“未启用”时，代码直接返回 `nil` (成功)，但实际上没有给用户添加卡片。这就是“不生效”且无报错的原因。
*   **修复**: 修改服务层代码，当道具卡不可用时，明确返回错误（如 `errors.New("item card not found or disabled")`），让接口报错，提示您具体原因。

## 4. 优惠券添加不生效 (Coupon Issue)
*   **原因**: 同上，`internal/service/user/coupon_add.go` 在优惠券模板未启用时也静默返回成功。
*   **修复**: 修改服务层代码，当优惠券不可用时，明确返回错误，确保您能看到操作失败的提示。

## 执行步骤
1.  **后端**: 修复道具卡和优惠券的“静默失败”逻辑，使其报错。
2.  **后端**: 在支付回调中增加虚拟发货的错误日志。
3.  **前端**: 在订单管理页面增加“退款”按钮并对接接口。
4.  **验证**: 通过 curl 或界面操作验证修复效果。
