diff --git a/.planning/REQUIREMENTS.md b/.planning/REQUIREMENTS.md index 9679ca9..1b6a0e8 100644 --- a/.planning/REQUIREMENTS.md +++ b/.planning/REQUIREMENTS.md @@ -32,11 +32,11 @@ ### REALNAME — 实名激活架构重构(方案 G) -- [ ] **REALNAME-01**: 移除 `tb_package.enable_realname_activation` 字段,新增 `expiry_base VARCHAR(30)` 字段(`from_activation` / `from_purchase`) -- [ ] **REALNAME-02**: `activateMainPackage` 改写激活决策逻辑 — 按卡类型(industry/normal)+ 购买路径(C端/后台囤货)+ `expiry_base` 三维决策 -- [ ] **REALNAME-03**: `client_order/service.go` 实名检查改为按卡类型判断(`card_category == "normal"`),删除 `packagesNeedRealname()` 函数 -- [ ] **REALNAME-04**: `ActivateByRealname()` 按 `ExpiryBase` 选择激活时间基准(`from_purchase` 用 CreatedAt,`from_activation` 用当前时刻) -- [ ] **REALNAME-05**: 套餐管理 API DTO 更新 — 移除 `enable_realname_activation`,新增 `expiry_base` 枚举字段 +- [x] **REALNAME-01**: 移除 `tb_package.enable_realname_activation` 字段,新增 `expiry_base VARCHAR(30)` 字段(`from_activation` / `from_purchase`) +- [x] **REALNAME-02**: `activateMainPackage` 改写激活决策逻辑 — 按卡类型(industry/normal)+ 购买路径(C端/后台囤货)+ `expiry_base` 三维决策 +- [x] **REALNAME-03**: `client_order/service.go` 实名检查改为按卡类型判断(`card_category == "normal"`),删除 `packagesNeedRealname()` 函数 +- [x] **REALNAME-04**: `ActivateByRealname()` 按 `ExpiryBase` 选择激活时间基准(`from_purchase` 用 CreatedAt,`from_activation` 用当前时刻) +- [x] **REALNAME-05**: 套餐管理 API DTO 更新 — 移除 `enable_realname_activation`,新增 `expiry_base` 枚举字段 ### POLL — 轮询系统小修(方案 H) @@ -133,11 +133,11 @@ | FIN-01 | Phase 2 | Pending | | FIN-02 | Phase 2 | Pending | | FIN-03 | Phase 2 | Pending | -| REALNAME-01 | Phase 2 | Pending | -| REALNAME-02 | Phase 2 | Pending | -| REALNAME-03 | Phase 2 | Pending | -| REALNAME-04 | Phase 2 | Pending | -| REALNAME-05 | Phase 2 | Pending | +| REALNAME-01 | Phase 2 | Complete | +| REALNAME-02 | Phase 2 | Complete | +| REALNAME-03 | Phase 2 | Complete | +| REALNAME-04 | Phase 2 | Complete | +| REALNAME-05 | Phase 2 | Complete | | POLL-01 | Phase 2 | Pending | | POLL-02 | Phase 2 | Pending | | POLL-03 | Phase 2 | Pending | diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md index a0d6a6c..106ff2c 100644 --- a/.planning/ROADMAP.md +++ b/.planning/ROADMAP.md @@ -57,7 +57,7 @@ Plans: Plans: - [ ] 02-01-PLAN.md — PERM-01/02 + FIN-01/02/03 + POLL-01/02/03/04:权限/财务/轮询小修合并(Wave 1) -- [ ] 02-02-PLAN.md — REALNAME-01~05:实名激活架构重构,原子执行(Wave 1,parallel) +- [x] 02-02-PLAN.md — REALNAME-01~05:实名激活架构重构,原子执行(Wave 1,parallel) --- @@ -123,7 +123,7 @@ Plans: | Phase | Plans Complete | Status | Completed | |-------|----------------|--------|-----------| | 1. P0 紧急修复 | 5/5 | Complete | 2026-03-27 | -| 2. 权限/财务/实名/轮询修复 | 0/2 | Not started | - | +| 2. 权限/财务/实名/轮询修复 | 1/2 | In Progress| | | 3. 设备体系完善 | 0/1 | Not started | - | | 4. 退款 + 支付 + 运营修复 | 0/1 | Not started | - | | 5. 代码质量清理 | 0/1 | Not started | - | diff --git a/.planning/STATE.md b/.planning/STATE.md index 3dfd949..744e0db 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -3,12 +3,12 @@ gsd_state_version: 1.0 milestone: v1.0 milestone_name: milestone status: unknown -last_updated: "2026-03-28T01:47:47.024Z" +last_updated: "2026-03-28T02:41:33.151Z" progress: total_phases: 6 completed_phases: 1 - total_plans: 5 - completed_plans: 5 + total_plans: 7 + completed_plans: 6 --- # Project State — 君鸿卡管系统 @@ -21,8 +21,8 @@ progress: ## Current Position -Phase: 2 -Plan: Not started +Phase: 02 (perm-fin-realname-poll) — EXECUTING +Plan: 2 of 2 | Field | Value | |-------|-------| | **Current Phase** | 1 — P0 紧急修复 | @@ -42,7 +42,7 @@ Progress: [ 1 ]──[ 2 ]──[ 3 ]──[ 4 ]──[ 5 ]──[ 6 ] **Core Value:** 业务链路完整可用——代理能采购分配卡/设备,C端客户能充值购包激活套餐,佣金能正确计算并可提现。这条主链路必须端到端跑通。 -**Current Focus:** Phase 01 — p0 +**Current Focus:** Phase 02 — perm-fin-realname-poll --- @@ -76,6 +76,7 @@ Progress: [ 1 ]──[ 2 ]──[ 3 ]──[ 4 ]──[ 5 ]──[ 6 ] | Phase 01-p0 P04 | 4min | 1 tasks | 1 files | | Phase 01-p0 P02 | 3min | 1 tasks | 2 files | | Phase 01-p0 P03 | 8min | 2 tasks | 4 files | +| Phase 02-perm-fin-realname-poll P02 | 25min | 2 tasks | 8 files | ## Accumulated Context diff --git a/.planning/phases/02-perm-fin-realname-poll/02-02-SUMMARY.md b/.planning/phases/02-perm-fin-realname-poll/02-02-SUMMARY.md new file mode 100644 index 0000000..1d44b75 --- /dev/null +++ b/.planning/phases/02-perm-fin-realname-poll/02-02-SUMMARY.md @@ -0,0 +1,95 @@ +--- +phase: 02-perm-fin-realname-poll +plan: "02" +subsystem: realname-activation +tags: [realname, package, migration, refactor] +dependency_graph: + requires: [] + provides: [REALNAME-01, REALNAME-02, REALNAME-03, REALNAME-04, REALNAME-05] + affects: [package, order, client_order, activation_service] +tech_stack: + added: [] + patterns: [three-dimensional-decision, expiry-base-enum] +key_files: + created: + - migrations/000089_realname_expiry_base.up.sql + - migrations/000089_realname_expiry_base.down.sql + modified: + - internal/model/package.go + - internal/model/dto/package_dto.go + - internal/store/postgres/package_store.go + - internal/service/order/service.go + - internal/service/client_order/service.go + - internal/service/package/service.go + - internal/service/package/activation_service.go + - internal/task/auto_purchase.go +decisions: + - "expiry_base 枚举替代 enable_realname_activation 布尔字段,清晰分离等实名语义与计时起点语义" + - "三维决策:行业卡永远直接激活,C 端购买直接激活,后台囤货按 expiry_base 决定" + - "auto_purchase.go 被认定为 C 端路径,不适用 expiry_base 三维决策" +metrics: + duration: "~25min" + completed_date: "2026-03-28" + tasks: 2 + files: 8 +--- + +# Phase 02 Plan 02: 实名激活架构重构 Summary + +将 `enable_realname_activation` 布尔字段替换为 `expiry_base` 枚举(from_activation/from_purchase),重构激活决策为三维判断(卡类型+购买路径+expiry_base),全链路原子完成。 + +## Tasks Completed + +| Task | Description | Commits | +|------|-------------|---------| +| 1 | DB 迁移 + Model + Store 清理(REALNAME-01) | `344850f` | +| 2a | DTO 更新(REALNAME-05) | `244a274` | +| 2b | activateMainPackage 三维决策(REALNAME-02) | `7dd5563` | +| 2c | C 端实名检查按卡类型(REALNAME-03) | `0ebb3d7` | +| 2d | ActivateByRealname 按 ExpiryBase 选时间基准(REALNAME-04) | `60b43bb` | +| 2e | auto_purchase.go 废弃引用清除(偏差修复) | `4be473c` | + +## Verification + +``` +migrate-version: 89, dirty=false ✓ +EnableRealnameActivation/enable_realname_activation/packagesNeedRealname 零引用 ✓ +ExpiryBase 引用出现在 package.go、package_dto.go、order/service.go、 + client_order/service.go、activation_service.go ✓ +go build ./internal/... 零错误 ✓ +``` + +## Deviations from Plan + +### Auto-fixed Issues + +**1. [Rule 1 - Bug] auto_purchase.go 含废弃 EnableRealnameActivation 引用** +- **发现于:** Task 2 完成后编译验证 +- **问题:** `internal/task/auto_purchase.go:433` 引用已删除的 `pkg.EnableRealnameActivation` 字段,导致编译失败 +- **修复:** 识别 auto_purchase 为 C 端充值触发路径,不适用 expiry_base 三维决策,删除该分支并添加注释说明 +- **文件:** `internal/task/auto_purchase.go` +- **Commit:** `4be473c` + +**2. [Rule 1 - Bug] package/service.go DTO 映射引用 EnableRealnameActivation** +- **发现于:** Task 2 DTO 替换后 LSP 报错 +- **问题:** `service.go` 的 Create/Update/toResponse 函数仍映射旧字段 +- **修复:** 同步更新三处映射为 `ExpiryBase` +- **文件:** `internal/service/package/service.go` +- **Commit:** 含于 `244a274` + +## Known Stubs + +无已知留桩。全链路变更已完整实现。 + +## Self-Check: PASSED + +- `migrations/000089_realname_expiry_base.up.sql` — FOUND ✓ +- `migrations/000089_realname_expiry_base.down.sql` — FOUND ✓ +- `internal/model/package.go` ExpiryBase 字段 — FOUND ✓ +- `internal/model/dto/package_dto.go` ExpiryBase 三处 — FOUND ✓ +- `internal/store/postgres/package_store.go` 直接一步 Create — FOUND ✓ +- Commit `344850f` (REALNAME-01) — FOUND ✓ +- Commit `244a274` (REALNAME-05) — FOUND ✓ +- Commit `7dd5563` (REALNAME-02) — FOUND ✓ +- Commit `0ebb3d7` (REALNAME-03) — FOUND ✓ +- Commit `60b43bb` (REALNAME-04) — FOUND ✓