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

5.0 KiB
Raw Blame History

Why

项目经过持续迭代积累了一批历史技术债务API 文档覆盖率仅 18.75%9/48 Handler、废弃代码和常量散布各处、DTO 规范缺口近 122 处、支付配置硬编码导致多商户场景下验签会失败。数据库迁移文件在开发阶段逐步累积至 114 个,包含 1 个缺失 .down.sql 的数据迁移和 1 个游离的 backfill 脚本,无法支撑生产环境干净、可重复的部署。现阶段业务功能趋于稳定,是集中清理的最佳时机,不解决这些问题将持续拖累新功能开发效率和系统可靠性。

What Changes

  • 补全 API 文档生成器cmd/api/docs.gocmd/gendocs/main.go 注册缺失的 39 个 Handler使文档覆盖率达到 100%
  • 实现支付动态配置加载order/service.gorecharge/service.go 中 3 处 TODOpayment_config_id 动态加载支付配置,替代全局单例 s.wechatPayment
  • 提取轮询状态常量:将 polling_manual_triggermanual_trigger_servicepolling_manual_trigger_storealert_service 等文件中 10+ 处硬编码字符串("pending""completed""cancelled" 等)提取到 pkg/constants/
  • 删除废弃模板代码internal/task/sync.go 是从未被入队的模板代码(轮询系统已实现真正的同步逻辑),连同 pkg/constants/constants.go 中的 TaskTypeDataSync 常量一并删除
  • 清理废弃常量别名pkg/constants/wallet.go 中 15 个已标注 Deprecated 的常量别名(WalletTypeMainWalletResourceType*Card* 前缀等),全局替换引用后删除
  • 删除废弃 DTO 和方法:确认无引用后删除 DeviceBundleDeviceBundleCardAllocatedDevice 三个 DTO 类型,以及 CreateLegacy()CheckAndStopCard() 两个废弃方法
  • 删除 Model 废弃字段并迁移iot_card.godevice.go 中的 FirstCommissionPaidAccumulatedRecharge 字段(已被 *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-coverageAPI 文档完整性——docs.go/gendocs 补全所有 Handler 注册,规范要求接口必须出现在 OpenAPI 文档中
  • dto-name-fieldsResponse DTO 规范——补全 int 状态字段对应的 _name/_text 文字字段,满足项目 DTO 规范

Impact

  • 影响文件cmd/api/docs.gocmd/gendocs/main.gointernal/service/order/service.gointernal/service/recharge/service.gopkg/constants/wallet.go、constants.go、iot.go 等)、pkg/errors/codes.gointernal/model/iot_card.gointernal/model/device.gointernal/model/dto/ 下多个文件、internal/task/sync.gointernal/routes/recharge.gopkg/database/postgres.gopkg/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_paidaccumulated_recharge 列)
    • 归档 000000~000113 至 migrations/archive/
  • API 变更:无(均为内部清理,不影响 API 契约)
  • 破坏性变更:无(生产环境首次部署,不存在历史数据迁移问题)
  • 依赖变更:无新增依赖
  • 环境影响:测试环境需执行 ./scripts/reset_db.sh 重置为新基线(旧的 000000~000113 迁移历史将被清空)