# 任务清单：fix-business-completion

> 5 项业务逻辑补全。F-1、F-4、J-3 各自独立；J-1 和 J-2 涉及同一文件，建议 J-2 先做。

## 任务组 1：F-1 佣金链断裂改为零额待审记录

- [x] 1.1 在 `pkg/constants/` 中新增常量 `CommissionStatusPendingReview = 99`，注释"待人工修正（链路断裂，需平台处理）"
- [x] 1.2 在 `internal/service/commission_calculation/service.go` 中，找到佣金链断裂处（`getCostPrice` 返回无配置后 `break` 的位置），在 `break` 前创建零额待审记录：`CommissionRecord{OrderID, ShopID, SeriesID, Amount: 0, Status: CommissionStatusPendingReview, Remark: "套餐系列[%d]未分配给该代理，请人工核查"}`
- [x] 1.3 记录失败不阻断主流程（`_ = store.Create()`），同时记录 Warn 日志
- [x] 1.4 确认佣金记录列表查询（`commission_record` 相关 Store/Service）已支持按 status 筛选（如已有 status 过滤则无需改动）
- [x] 1.5 验证：`go build ./...` 编译通过

## 任务组 2：F-4 C端订单 Handler 迁移 Service 层

- [x] 2.1 在 `internal/service/client_order/service.go` 中新增 `ListOrders(ctx context.Context, req *dto.ClientOrderListRequest) (*dto.ClientOrderListResponse, error)` 方法，将 Handler 中的 DB 查询逻辑迁移过来，使用正常数据权限（不用 SkipPermissionCtx）
- [x] 2.2 在 `internal/service/client_order/service.go` 中新增 `GetOrderDetail(ctx context.Context, orderID uint) (*dto.ClientOrderDetailResponse, error)` 方法
- [x] 2.3 修改 `internal/handler/app/client_order.go`，将直接 DB 查询替换为 Service 方法调用，删除 `h.db` 字段引用和 `SkipPermissionCtx` 用法
- [x] 2.4 如果 Handler struct 中 `db` 字段因此变为未使用，从 struct 和构造函数中移除
- [x] 2.5 验证：`rg "SkipPermissionCtx" internal/handler/app/client_order.go` 无残留，`go build ./...` 编译通过

## 任务组 3：J-2 平台钱包代购

- [x] 3.1 在 `internal/service/order/service.go:CreateLegacy` 的钱包支付分支中，新增 `buyerType == "" && resourceShopID != nil` 的条件分支
- [x] 3.2 该分支内：`orderBuyerType = model.BuyerTypeAgent`，`orderBuyerID = *resourceShopID`，成本价和钱包都使用 `*resourceShopID` 对应的代理
- [x] 3.3 无归属代理时（`resourceShopID == nil`）返回 `errors.New(errors.CodeInvalidParam, "不支持的钱包支付场景")`
- [x] 3.4 验证：`go build ./...` 编译通过

## 任务组 4：J-1 富友支付实现

- [x] 4.1 在 `internal/model/dto/` 中新增（或确认已存在）`FuiouPayJSAPIResponse` DTO：`AppID, TimeStamp, NonceStr, Package, SignType, PaySign`
- [x] 4.2 修改 `internal/service/order/service.go:FuiouPayJSAPI`，替换留桩为真实实现：查订单 → 校验状态 → 加载富友配置 → 构造 `fuiou.Client` → 调用 `WxPreCreate(JSAPI)` → 返回 JS-SDK 参数
- [x] 4.3 修改 `internal/service/order/service.go:FuiouPayMiniApp`，与 JSAPI 相同，`tradeType` 改为 `LETPAY`，`subAppid` 改为 `config.MiniappAppID`
- [ ] 4.4 通过 DBHub 向 `tb_wechat_config` 插入富友支付凭证数据（`provider_type='fuiou'`，凭证见方案文档 J-1 节）
- [x] 4.5 验证：`rg "暂未实现" internal/service/order/service.go` 确认富友相关留桩已全部替换，`go build ./...` 编译通过

## 任务组 5：J-3 卡/设备 status 3/4 触发

- [x] 5.1 确认 `pkg/constants/iot.go` 中存在 `IotCardStatusActivated = 3` 和 `IotCardStatusDeactivated = 4`（或类似常量），不存在则新增
- [x] 5.2 在套餐激活成功后（`activation_service.go` 或 `PackageActivationHandler`），追加条件更新：`UPDATE tb_iot_card SET status = 3 WHERE id = ? AND status < 3`
- [x] 5.3 如果是设备套餐，同时更新 `tb_device`：`UPDATE tb_device SET status = 3 WHERE id = ? AND status < 3`
- [x] 5.4 在套餐到期处理逻辑中（`OrderExpireHandler` 或类似），套餐过期后检查该卡/设备是否还有其他 active 套餐，无则更新 `status = 4`
- [x] 5.5 验证：`go build ./...` 编译通过

## 收尾验证

- [x] 6.1 执行 `go build ./...`，确认全量编译通过
