# 溪福俱乐部 Phase 1+2 — 现状差异分析
> **日期:** 2026-06-04
> **目的:** 在开始 Phase 1+2 实施前,明确现有代码与设计文档的差异,并提供决策依据
---
## 1. 现状总览
| 阶段 | 设计文档 | 实际状态 | 差异 |
|------|---------|---------|------|
| Phase 0 (骨架) | 角色模型 + TabBar + 服务商入驻 | ✅ **已实现** (本次提交 8 个 commits) | 无 |
| Phase 1 (商品系统) | 3 实体 + 3 Controller + 5 小程序页 + 3 Web 页 | ❌ **未实现** | 实体不存在 |
| Phase 2 (会员+积分) | 2 实体 + 1 实体扩展 + 2 Controller + 3 小程序页 + 1 Web 页 | 🟡 **部分实现** (代码层) | 与设计不一致 + DB 表未建 |
---
## 2. Phase 1 现状分析
### 2.1 设计要求 (care-family-club-design.md §3.2-3.6)
| 项目 | 内容 |
|------|------|
| **新实体** | `Product`, `ProductOrder`, `SysConfig` |
| **新Controller** | `ProductController`, `ProductOrderController`, `ProductVendorController`, `SysConfigController` |
| **新API端点** | 商品CRUD/审核/上下架/订单/支付/系统配置 |
| **新小程序页** | 5 页 (商品详情, 订单列表, 订单详情, 服务商中心, 商城页迭代) |
| **新Web页** | 3 页 (商品管理, 订单管理, 系统配置) |
### 2.2 实际状态
- **0 个 Product 相关文件** (entity/mapper/service/controller 均不存在)
- **0 个 SysConfig 相关文件**
- **商城页 `pages/shop/index.vue` 仅为占位** (Phase 0 实现)
- **发现页 `pages/discover/index.vue` 仅为占位** (Phase 0 实现)
**结论:** Phase 1 完全未开始,需要从零实现。
---
## 3. Phase 2 现状分析
### 3.1 设计要求 (care-family-club-design.md §3.4-3.5, §5-6)
| 项目 | 内容 |
|------|------|
| **新实体** | `FamilyMembership`, `MemberSelection` |
| **实体扩展** | `PointsLog` 新增 `type=member_deduct` |
| **新Controller** | `MembershipController`, `MemberSelectionController` |
| **新API端点** | 会员信息/购买/续费/等值商品选择/积分抵扣 |
| **新小程序页** | 3 页 (会员中心, 购买/续费, 等值商品选择) |
| **新Web页** | 1 页 (会员管理) |
| **会员等级** | **3 等级**: free / standard / premium |
| **会员年费** | standard = 1314元/年, premium = SysConfig 配置 |
| **核心业务** | 1314 等值商品选择 + 积分抵扣会员费 |
### 3.2 实际状态
#### 3.2.1 已存在的文件
| 文件 | 内容 | 状态 |
|------|------|------|
| `entity/FamilyMembership.java` | familyId, levelCode, startDate, endDate, paymentMethod, paymentStatus, orderNo, transactionId, amount, autoRenew, createdAt, updatedAt | ✅ 存在 |
| `entity/MembershipLevel.java` | levelCode, levelName, levelDesc, priceMonthly, priceYearly, features(JSON), maxChildren, maxTasksPerDay, aiReviewEnabled, prioritySupport, teacherConsultation | ✅ 存在 |
| `entity/PaymentOrder.java` | orderNo, familyId, levelCode, paymentType, amount, status, payMethod, transactionId, paidAt | ✅ 存在 |
| `controller/MembershipController.java` | 6 端点: /levels, /my, /current, /orders, /notify, /can-use | ✅ 存在 |
| `service/MembershipService.java` | 6 方法 (含占位实现) | ✅ 存在 |
| `service/api/MembershipServiceInterface.java` | 接口定义 | ✅ 存在 |
| `service/DatabaseSyncService.java` | 注册了 membership_levels/family_memberships 表 | ✅ 存在 |
#### 3.2.2 **关键问题**
| 问题 | 严重度 | 详情 |
|------|-------|------|
| **DB 表未建** | 🔴 严重 | `family_memberships`, `membership_levels`, `payment_orders` 在 DatabaseInitializer.java **无 DDL**; 在 schema.sql 也**无 DDL**。代码无法运行。 |
| **会员等级 4 vs 3** | 🟠 中 | 现有 FREE/BASIC/PROFESSIONAL/ENTERPRISE (4 等级) 与设计 free/standard/premium (3 等级) 不一致。 |
| **计价模式不同** | 🟠 中 | 现有: 月费 + 年费 (monthly + yearly)
设计: 仅年费 (1314元/年) |
| **字段不同** | 🟡 低 | 现有: features(JSON), maxChildren, maxTasksPerDay, aiReviewEnabled, prioritySupport, teacherConsultation
设计: 仅 startDate/endDate/autoRenew/paymentMethod/pointsDeducted/pointsAmount/status |
| **1314 等值商品选择** | 🔴 缺失 | `MemberSelection` 实体不存在, MemberSelectionController 不存在 |
| **积分抵扣会员费** | 🔴 缺失 | `PointsLog.type=member_deduct` 扩展未实现, `deductForMembership` 方法未实现 |
| **`createOrder` 残缺** | 🔴 严重 | `orderMapper.insert` 被注释掉, 订单无法写入 |
| **`processPaymentCallback` 残缺** | 🔴 严重 | 返回 `true` 但未执行任何实际操作 |
| **`familyId` 占位** | 🟠 中 | 多处硬编码 `Long familyId = 1L`, 未从 JWT 提取 |
| **Free 等级处理** | 🟡 低 | 现有代码有 `FREE` 等级; 设计 free 是"未付费的默认状态", 不需要独立的 MembershipLevel 记录 |
| **SysConfig 不存在** | 🔴 缺失 | `points_exchange_rate`, `points_deduct_cap`, `member_fee_standard`, `member_fee_premium`, `member_eligible_budget`, `renewal_discount_rate`, `member_discount_standard`, `member_discount_premium` 等配置均无实现 |
#### 3.2.3 无人引用的 API
- **无 frontend 消费者**: `grep` 整个 `cfc-frontend` (排除 node_modules) 找不到 `membership` 相关引用
- **无 web admin 消费者**: `grep` 整个 `cfc-web` (排除 node_modules) 找不到 `membership` 相关引用
- **无内部 Service 调用**: 现有代码无其他 Service 调用 MembershipService
**结论:** 现有 Phase 2 代码是**孤岛** — 没有任何消费者。修改它不会影响其他业务。
---
## 4. 决策选项分析
### 4.1 选项 A: 沿用现有 4 等级 (FREE/BASIC/PROFESSIONAL/ENTERPRISE)
| 维度 | 评估 |
|------|------|
| **改动量** | 🟢 较小 — 复用现有实体/Controller/Service 框架 |
| **设计一致性** | 🟠 偏离 — 与设计文档 3 等级不一致 |
| **业务契合** | 🟠 4 等级更细, 适合阶梯定价, 但与"1314元年费"哲学不符 |
| **向后兼容** | 🟢 DB 数据兼容 (现有数据保留) |
| **代码修改** | 补全 `createOrder` 实际逻辑, 补全 `processPaymentCallback`, 修正 `familyId` 提取, 补 DB DDL, 添加 MemberSelection, 添加积分抵扣 |
| **风险** | 🟢 低 (无消费者, 修改安全) |
### 4.2 选项 B: 重写为设计 3 等级 (free/standard/premium)
| 维度 | 评估 |
|------|------|
| **改动量** | 🟠 中等 — 需要修改 entity 字段, 重写 MembershipService 业务逻辑, 调整 levelCode 值 |
| **设计一致性** | 🟢 完全对齐设计文档 |
| **业务契合** | 🟢 "体验-标准-高级"3 等级匹配 1314 会员费定位 |
| **向后兼容** | 🟠 DB 需要数据迁移 (FREE/BASIC/PROFESSIONAL/ENTERPRISE → free/standard/premium) |
| **代码修改** | 删除 features/maxChildren 等冗余字段, 重写 MembershipService, 重建 DB DDL + 种子数据, 写 MemberSelection 完整实现 |
| **风险** | 🟡 中 (无消费者, 但需要数据迁移脚本) |
### 4.3 选项 C: 部分对齐 (混合方案)
保留现有 4 等级 (FREE/BASIC/PROFESSIONAL/ENTERPRISE),但**不重写**,仅在 Phase 2 计划中:
- 把 BASIC 视为 standard (1314元/年)
- 把 PROFESSIONAL 视为 premium (SysConfig 配置)
- FREE 视为设计中的"未付费免费体验" (无 FamilyMembership 记录,自动 isActive=false)
- 删除 ENTERPRISE 等级 (暂无需求)
| 维度 | 评估 |
|------|------|
| **改动量** | 🟢 最小 |
| **设计一致性** | 🟠 仍偏离 — 4 等级但只用 3 个 |
| **业务契合** | 🟠 OK — 业务效果与设计等价 |
| **风险** | 🟢 最低 |
---
## 5. 推荐
**推荐 选项 A: 沿用现有 4 等级**
**理由:**
1. **零消费者** — 现有 MembershipController 无任何 API 调用方, 重构无破坏性影响
2. **代码已存在** — 6 端点 + 6 Service 方法 + 3 实体结构已落地, 复用价值高
3. **改动聚焦** — 重点补全: (1) DB DDL (2) createOrder/processPaymentCallback 实际逻辑 (3) familyId 提取 (4) MemberSelection 新增 (5) 积分抵扣
4. **设计偏离可控** — 4 等级可视为"更细粒度", 不影响业务目标; 设计文档可后续修订
5. **降低风险** — 不引入数据迁移脚本, 不破坏现有代码
**关键补全任务 (Phase 2 计划):**
1. `DatabaseInitializer` 增加 3 张表 DDL + 种子数据 (FREE/BASIC/PROFESSIONAL/ENTERPRISE 各 1 条)
2. `MembershipService.createOrder` 实际写库 (注入 OrderMapper)
3. `MembershipService.processPaymentCallback` 实际开通/续费会员
4. `MembershipController` 所有 familyId 改用 `@RequestHeader("X-User-Id")` + User 查询
5. `MemberSelection` 实体 + Mapper + Service + Controller
6. `PointsLog.type` 扩展 (member_deduct 枚举值)
7. `PointsService.deductForMembership` 新方法
8. `SysConfig` 实体 (Phase 1 计划实现, Phase 2 复用)
9. 前端: 会员中心/购买/等值商品选择 3 页
10. Web: 会员管理 1 页
---
## 6. 实施顺序
```
Phase 0 (✅ 已完成) 角色模型 + TabBar + 服务商入驻
↓
Phase 1 (🆕 需新建) 商品系统
- Product / ProductOrder / SysConfig
- 服务商发布商品 + 管理员审核
- 商城页可浏览可购买
↓
Phase 2 (🟡 部分实现) 会员+积分
- 补 DB DDL + 补 Membership 业务逻辑
- 新增 MemberSelection (1314等值商品选择)
- 新增积分抵扣会员费
- 前端 3 页 + Web 1 页
```
**严格依赖**: Phase 2 依赖 Phase 1 的 Product (等值商品选择需要 Product 列表)
---
## 7. 需用户确认事项
1. **会员等级**: 选项 A (沿用 4 等级) / 选项 B (重写 3 等级) / 选项 C (混合)
2. **Phase 1 计划范围**: 完整实现 Product/Order/SysConfig + 5 小程序页 + 3 Web 页
3. **Phase 2 计划范围**: 补 Membership 业务 + MemberSelection + 积分抵扣 + 3 小程序页 + 1 Web 页
4. **支付方式**: 纯余额/积分支付 (无真实微信支付)
5. **种子数据**: 5 个示例商品 (覆盖 5 种 productType)
---
## 8. 文件清单预估
### Phase 1 计划文档需覆盖
**后端新建 (~10 个文件):**
- `entity/Product.java`, `entity/ProductOrder.java`, `entity/SysConfig.java`
- `mapper/ProductMapper.java`, `mapper/ProductOrderMapper.java`, `mapper/SysConfigMapper.java`
- `service/ProductService.java`, `service/ProductOrderService.java`, `service/SysConfigService.java`
- `dto/ProductDTO.java`, `dto/ProductOrderDTO.java`, `dto/SysConfigDTO.java`
- `controller/product/ProductController.java`, `controller/product/ProductOrderController.java`, `controller/product/ProductVendorController.java`, `controller/config/SysConfigController.java`
**后端修改 (~2 个文件):**
- `config/DatabaseInitializer.java` (新增 3 张表 DDL + 种子)
- `entity/User.java` (无变更, 但需在 DatabaseInitializer 增加商品 seeder)
**前端新建 (~5 个文件):**
- `pages/discover/product-detail.vue` (商品详情,可复用商城/发现)
- `pages/shop/order-list.vue` (订单列表)
- `pages/shop/order-detail.vue` (订单详情)
- `pages/vendor/products.vue` (服务商商品管理)
- `pages/vendor/orders.vue` (服务商订单管理)
**前端修改 (~3 个文件):**
- `pages/shop/index.vue` (从占位 → 商品列表)
- `pages/discover/index.vue` (从占位 → 活动+课程列表)
- `pages/vendor/center.vue` (添加商品管理/订单管理入口)
- `utils/api.js` (新增 product APIs)
**Web 新建 (~3 个文件):**
- `src/views/admin/ProductManage.vue` (商品管理)
- `src/views/admin/OrderManage.vue` (订单管理)
- `src/views/admin/SysConfig.vue` (系统配置)
**Web 修改 (~3 个文件):**
- `src/api/product.js` (新建)
- `src/router/index.js` (新增路由)
- `src/views/Layout.vue` (新增菜单)
### Phase 2 计划文档需覆盖 (待 Phase 1 完成后再细化)
(略 — 取决于用户选项 A/B/C 决策)