# tech-debt-cleanup 执行计划

## TL;DR

> **快速摘要**：清理项目技术债务：API 文档补全（18.75% → 100%）、支付配置动态化、轮询常量提取、废弃代码清理、Model 字段清理、DTO _name 字段补全、数据库迁移基线合并。
>
> **提案文件**：`openspec/changes/tech-debt-cleanup/`

---

## TODOs

### Task 1: 支付配置动态加载（pkg/payment + service层）

- [x] 1.1 在 `pkg/constants/redis.go` 中新增 `RedisPaymentConfigKey(configID uint) string` 函数
- [x] 1.2 确认 `pkg/payment/` 包中现有支付接口定义
- [x] 1.3 创建 `pkg/payment/loader.go`，定义 `PaymentConfigLoader` 接口和实现（Redis 缓存 TTL 1h）
- [x] 1.4 修改 `internal/service/order/service.go`，注入 paymentLoader，替换两处 TODO
- [x] 1.5 修改 `internal/service/recharge/service.go`，注入 paymentLoader，替换 TODO
- [x] 1.7 运行 `go build ./cmd/api ./cmd/worker` 确认编译，`go vet` 静态分析

### Task 2: API 文档生成器补全（docs.go + gendocs）

- [x] 2.1 修改 `cmd/api/docs.go`，注册所有 48 个 Handler（含 39 个缺失 Handler）
- [x] 2.2 修改 `cmd/gendocs/main.go`，同步注册所有 48 个 Handler
- [x] 2.3 运行 `go run cmd/gendocs/main.go` 生成 OpenAPI 文档，验证覆盖率
- [x] 2.4 人工核查生成文档接口数量与路由注册数量一致

### Task 3: 轮询状态常量提取（pkg/constants + handler/service/store）

- [x] 3.1 在 `pkg/constants/polling.go` 中新增轮询手动触发日志状态常量（4 个）
- [x] 3.2 修改 `internal/handler/admin/polling_manual_trigger.go`，替换硬编码字符串为常量
- [x] 3.3 修改 `internal/service/polling/manual_trigger_service.go`，替换硬编码字符串
- [x] 3.4 修改 `internal/store/postgres/polling_manual_trigger_store.go`，替换硬编码字符串
- [x] 3.5 修改 `internal/service/polling/alert_service.go`，替换 NotificationStatus 中的硬编码
- [x] 3.6 运行 grep 确认无剩余硬编码，`go vet` 静态分析

### Task 4: 废弃代码清理（sync.go + wallet.go + DTO + 方法）

- [x] 4.1 删除 `internal/task/sync.go`，清理 queue/handler.go 注册和 constants.go 中的 TaskTypeDataSync
- [x] 4.2 全局搜索 wallet.go 中 15 个废弃别名的引用情况
- [x] 4.3 替换所有有引用的废弃别名为新常量
- [x] 4.4 删除 `pkg/constants/wallet.go` 中所有 Deprecated 别名定义（15 个）
- [x] 4.5 删除 `internal/model/dto/enterprise_card_authorization_dto.go` 中的 3 个废弃 DTO 类型
- [x] 4.6 删除 `internal/service/order/service.go` 中的 `CreateLegacy()` 方法
- [x] 4.7 [跳过] `CheckAndStopCard()` 仍在 StopResumeServiceInterface 接口中且被活跃调用，不是废弃代码
- [x] 4.8 运行 `go build ./cmd/api ./cmd/worker` 和 `go vet` 确认编译无误

### Task 5: Model 废弃字段删除与数据库迁移

- [x] 5.1 从 `internal/model/iot_card.go` 中删除 `FirstCommissionPaid` 和 `AccumulatedRecharge` 字段
- [x] 5.2 从 `internal/model/device.go` 中删除 `FirstCommissionPaid` 和 `AccumulatedRecharge` 字段
- [x] 5.3 创建 `migrations/000116_remove_legacy_commission_fields.up.sql`（DROP COLUMN）
- [x] 5.4 创建 `migrations/000116_remove_legacy_commission_fields.down.sql`（ADD COLUMN 回滚）
- [x] 5.5 在测试环境执行迁移，通过 PostgreSQL MCP 确认字段已删除（字段不存在于 DB）
- [x] 5.6 运行 `go build ./cmd/api ./cmd/worker` 确认编译通过

### Task 6: DTO _name 字段补全（分模块逐批）

- [x] 6.1 遍历 `internal/model/dto/` 统计所有 int 状态字段缺少 _name 字段的清单
- [x] 6.2 **Account 模块**：补全 DTO _name 字段 + 常量映射函数 + Service 层赋值
- [x] 6.3 **Asset 模块**：补全 DTO _name 字段 + 常量映射函数 + Service 层赋值
- [x] 6.4 **Order 模块**：补全 DTO _name 字段 + 常量映射函数 + Service 层赋值
- [x] 6.5 **Commission 模块**：补全 DTO _name 字段 + 常量映射函数 + Service 层赋值
- [x] 6.6 **IotCard / Device 模块**：补全 DTO _name 字段 + 常量映射函数 + Service 层赋值
- [x] 6.7 **剩余模块**（Recharge、Wallet、Package、Shop 等）：批量补全
- [x] 6.8 全量编译与静态分析（`go build + go vet`）
- [x] 6.9 代码审查确认 _name 字段存在于 account/order/iot_card 等关键 DTO，Service 层赋值逻辑已实现（运行时验证需服务启动）

### Task 7: 未使用常量和错误码清理

- [x] 7.1 删除 `pkg/errors/codes.go` 中的 `CodeExceedLimit` 常量和对应错误消息映射
- [x] 7.2 为 `pkg/constants/iot.go` 中约 22 个未引用的预留常量添加用途注释
- [x] 7.3 运行 `go build` 和 `go vet` 确认清理无破坏

### Task 8: 删除空文件和注释代码

- [x] 8.1 删除 `internal/routes/recharge.go` 空文件
- [x] 8.2 删除 `pkg/database/postgres.go` 中的 AutoMigrate 注释块（行 90-95）
- [x] 8.3 保留 `internal/service/client_order/service.go` 中的实名认证检查注释，添加待确认标记

### Task 9: 全量编译验证

- [x] 9.1 运行 `go mod tidy` 确认依赖无变化
- [x] 9.2 运行 `go build ./cmd/api` 和 `go build ./cmd/worker` 确认编译通过
- [x] 9.3 运行 `go vet ./...` 进行静态分析
- [x] 9.4 运行 `gofmt -l ./internal ./pkg` 检查代码格式（修复了2个预存文件）

### Task 0: 数据库迁移文件合并为生产基线（需 DB 环境）

- [x] 0.1 确认当前数据库 schema 完整可用（PostgreSQL MCP 验证 66 张表存在）
- [x] 0.2 [跳过] pg_dump 不在当前环境，需在有 pg_dump 的机器手动执行：`pg_dump --schema-only --no-owner --no-acl -d junhong_cmp > migrations/000114_squash_baseline.up.sql`
- [x] 0.3 [跳过] 依赖 0.2，完成 0.2 后手动编写 DROP TABLE 语句
- [x] 0.4 创建 `migrations/000115_init_data.up.sql`（合并轮询配置初始数据 + purchase_role 回填）
- [x] 0.5 创建 `migrations/000115_init_data.down.sql`（回滚初始数据）
- [x] 0.6 归档旧迁移文件到 `migrations/archive/`（000000~000113 + backfill 脚本，共 228 个文件）
- [x] 0.7 编写测试环境重置脚本 `scripts/reset_db.sh`
- [ ] 0.8 [阻塞] 在全新数据库上验证 migrate up 完整链路（依赖 0.2）
- [ ] 0.9 [阻塞] 重置测试环境数据库，切换到新基线（需团队协调）

---

## Final Verification Wave

- [x] F1 全量编译通过：`go build ./cmd/api ./cmd/worker` 无错误
- [x] F2 静态分析通过：`go vet ./...` 无报告，`gofmt -l` 无格式问题（修复2个预存文件）
- [x] F3 API 文档覆盖率 100%：`go run cmd/gendocs/main.go` 生成文档包含 190 个 API 路径
- [x] F4 核心功能验证：代码审查通过（支付动态加载、轮询常量、_name字段已实现）
