Files
junhong_cmp_fiber/openspec/changes/archive/2026-04-14-tech-debt-cleanup/proposal.md
huang d9de704d73
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 49s
归档
2026-04-14 12:14:29 +08:00

47 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## Why
项目经过持续迭代积累了一批历史技术债务API 文档覆盖率仅 18.75%9/48 Handler、废弃代码和常量散布各处、DTO 规范缺口近 122 处、支付配置硬编码导致多商户场景下验签会失败。**数据库迁移文件在开发阶段逐步累积至 114 个,包含 1 个缺失 `.down.sql` 的数据迁移和 1 个游离的 backfill 脚本**,无法支撑生产环境干净、可重复的部署。现阶段业务功能趋于稳定,是集中清理的最佳时机,不解决这些问题将持续拖累新功能开发效率和系统可靠性。
## What Changes
- **补全 API 文档生成器**`cmd/api/docs.go``cmd/gendocs/main.go` 注册缺失的 39 个 Handler使文档覆盖率达到 100%
- **实现支付动态配置加载**`order/service.go``recharge/service.go` 中 3 处 TODO`payment_config_id` 动态加载支付配置,替代全局单例 `s.wechatPayment`
- **提取轮询状态常量**:将 `polling_manual_trigger``manual_trigger_service``polling_manual_trigger_store``alert_service` 等文件中 10+ 处硬编码字符串(`"pending"``"completed"``"cancelled"` 等)提取到 `pkg/constants/`
- **删除废弃模板代码**`internal/task/sync.go` 是从未被入队的模板代码(轮询系统已实现真正的同步逻辑),连同 `pkg/constants/constants.go` 中的 `TaskTypeDataSync` 常量一并删除
- **清理废弃常量别名**`pkg/constants/wallet.go` 中 15 个已标注 `Deprecated` 的常量别名(`WalletTypeMain``WalletResourceType*``Card*` 前缀等),全局替换引用后删除
- **删除废弃 DTO 和方法**:确认无引用后删除 `DeviceBundle``DeviceBundleCard``AllocatedDevice` 三个 DTO 类型,以及 `CreateLegacy()``CheckAndStopCard()` 两个废弃方法
- **删除 Model 废弃字段并迁移**`iot_card.go``device.go` 中的 `FirstCommissionPaid``AccumulatedRecharge` 字段(已被 `*BySeriesJSON` 替代),删除 Model 定义并创建数据库迁移删除对应列
- **清理空文件和注释代码**:删除 `internal/routes/recharge.go` 空文件;删除 `pkg/database/postgres.go` 中注释掉的 `AutoMigrate()` 代码块;保留 `client_order/service.go` 中的实名认证检查注释(业务意图未确定)
- **批量补全 DTO `_name` 字段**122 个 Response DTO 中 int 类型状态字段缺少对应的 `_name`/`_text` 文字字段,补全字段定义和 Service 层赋值逻辑
- **清理未使用常量和错误码**:删除 `CodeExceedLimit` 错误码;为 `pkg/constants/iot.go` 中约 22 个未引用的预留常量添加"预留用于未来功能"注释
- **数据库迁移文件合并为生产基线**:将开发阶段积累的 114 个迁移文件000000~000113归档到 `migrations/archive/`,生成两个生产就绪的迁移文件:
- `000114_squash_baseline`:从当前数据库 schema 导出的完整建表 SQL一条命令完成全量建库
- `000115_init_data`:初始化数据(轮询系统预置配置 + 历史订单 `purchase_role` 回填,均幂等)
- 配套测试环境重置脚本 `scripts/reset_db.sh`
## Capabilities
### New Capabilities
- `payment-dynamic-config`:支付配置动态加载能力——订单和充值流程从 `payment_config_id` 动态加载对应的微信支付配置,支持多商户场景
- `polling-status-constants`:轮询触发日志状态常量——将分散的魔法字符串统一到 `pkg/constants/` 中,消除硬编码
- `migration-baseline`:生产就绪数据库迁移基线——将 114 个开发期迁移合并为 2 个生产基线迁移,支持一条命令完成全量建库与数据初始化
### Modified Capabilities
- `api-doc-coverage`API 文档完整性——docs.go/gendocs 补全所有 Handler 注册,规范要求接口必须出现在 OpenAPI 文档中
- `dto-name-fields`Response DTO 规范——补全 int 状态字段对应的 `_name`/`_text` 文字字段,满足项目 DTO 规范
## Impact
- **影响文件**`cmd/api/docs.go``cmd/gendocs/main.go``internal/service/order/service.go``internal/service/recharge/service.go``pkg/constants/`wallet.go、constants.go、iot.go 等)、`pkg/errors/codes.go``internal/model/iot_card.go``internal/model/device.go``internal/model/dto/` 下多个文件、`internal/task/sync.go``internal/routes/recharge.go``pkg/database/postgres.go``pkg/queue/handler.go`
- **数据库变更**
- 新增 `000114_squash_baseline.up/down.sql`(完整 schema 基线)
- 新增 `000115_init_data.up/down.sql`(初始化数据)
- 新增 `000116_remove_legacy_commission_fields.up/down.sql`(删除 `first_commission_paid``accumulated_recharge` 列)
- 归档 000000~000113 至 `migrations/archive/`
- **API 变更**:无(均为内部清理,不影响 API 契约)
- **破坏性变更**:无(生产环境首次部署,不存在历史数据迁移问题)
- **依赖变更**:无新增依赖
- **环境影响**:测试环境需执行 `./scripts/reset_db.sh` 重置为新基线(旧的 000000~000113 迁移历史将被清空)