Files
danyang-match/docs/STATUS.md
T

736 lines
49 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.
# 项目状态跟踪 — STATUS.md
> **2026-09-17 当前有效结论:`V1.1 INCREMENTAL RECOVERY PHASE 14 COMPLETE / GIT CLEAN`。**
>
> 阶段 0(在途收口)、阶段 1(小程序 C 组 + discover 筛选重设计)、阶段 2(管理端 Vue 新框架适配)、阶段 3(CapabilityService 独立化)、阶段 4(双端总验收)全部完成。三端构建通过、**13/13 契约全绿**、核心 11 页面**全部 TS-only(11/11)**。**UI 重设计首批 11 页已于 2026-09-16 通过用户验收(结论:基本达标)**;`/me/*` 前后端契约同轮收敛,17 个 404 调用已恢复。**Phase 08(Like / Match / Block)、Phase 09(Text Chat)、Phase 10(Image & Chat Safety)、Phase 11(Notification)、Phase 12(Relationship Progress)、Phase 13(公益红娘转介)、Phase 13A(婚恋咨询与婚前辅导)、Phase 14(多类型公益活动)、Phase 15(活动报名、审核与签到)、Phase 16(活动互选与双方开启沟通确认)复验已关闭**,十轮共修复 71 处真实缺陷(含 1 处隐藏编译缺陷),并各自补齐测试保真度与守卫。**Phase 17 需用户确认后启动。**
最后更新: 2026-09-17 — 分支 `main`(`feat-ui-v11` 保留为冗余锚点)
## 当前唯一有效状态
| 当前有效项 | 状态 | 证据 |
|---|---|---|
| Phase 01~06 Recovery | 已完成 | 各 Phase Completion Report;38+9+3+4+21 后端专项通过 |
| Phase 07 V1.1 首页业务与找对象 | **业务+UI 已通过用户验收**(2026-09-16) | HomeApplicationService 真实聚合;CapabilityService 独立化;discover 筛选完整重设计(5 chip + 4 section + 底部抽屉 + 滚动定位高亮);UI 按 2026-09-13 规格重新实现,11 页经用户验收通过 |
| **Phase 08 V1.1 Like / Match / Block** | **已完成**(2026-09-16) | KEEP-VERIFY 复验。修复 3 处真实缺陷:① `DiscoverService.searchUsers` 无查看者身份 → INV-004「搜索不可见」整体失效;② 详情路径无 Block 判断;③ `RelationshipService.like()` 把 `"liked"` 当 match source 写库 → 违反 `V003 chk_match_source`(H2 测试库无该约束故长期静默)。新增 `DiscoverBlockInvisibilityIntegrationTest`(9 用例,含反向拉黑);`schema-h2.sql` 补齐生产约束与 `user_profiles`;负向验证确认守卫会红。报告:`docs/Phase-08-V11-Recovery-Completion-Report-2026-09-16.md` |
| **Phase 09 V1.1 Text Chat** | **已完成**(2026-09-16) | KEEP-VERIFY 复验。修复 4 处真实缺陷:① WebSocket 下行整条链路是死代码(无握手鉴权/无 userId 写入/`sendToUser` 零调用点)→ 新增 `ChatHandshakeInterceptor` + 落库后推 `message.new`;② Unmatch 不联动会话 + 发消息只校验会话状态 → 解除后仍可发消息 → 新增 `assertMatchAlive` + `MatchController.unmatch` 联动;③ `RelationService.block` 调静态 `MatchService.unmatch`(只改内存态)→ Block 后 Match 未落库;④ 聊天四个接口无成员校验 → IDOR。新增 `ChatPhase09IntegrationTest`(11 用例)+ `ChatWebSocketHandlerTest`(7 用例);负向验证 3 处守卫精准变红。报告:`docs/Phase-09-V11-Recovery-Completion-Report-2026-09-16.md` |
| **Phase 10 V1.1 Image & Chat Safety** | **已完成**(2026-09-16) | KEEP-VERIFY 复验。**Gate 通过**。修复 2 处缺陷:① **D1(Critical,生产故障)** `PhotoService.uploadAndSave` 魔数校验因 `new byte[n]` 从不读取流而**恒失败** → 本地资格佐证上传 100% 失败;且 image-only MIME 在 local_eligibility 后无条件执行致 PDF 被挡 → 改为 `readNBytes` 真读取 + MIME 按 photoType 分流 + PDF 跳过图片魔数;② **D2(Low)** `ChatSafetyService` 把命中的高风险词写入 warn 日志 → 改为不记具体词汇。**推翻旧报告**「伪装恶意图片被拒(Magic Number校验)」与「EXIF清理预留(stripExif占位,符号不存在)」两声明。新增 `PhotoUploadValidationTest`(6 用例,`MockMultipartFile` 真走校验链路)+ 负向验证精准变红。报告:`docs/Phase-10-V11-Recovery-Completion-Report-2026-09-16.md` |
| **Phase 11 V1.1 Notification** | **已完成**(2026-09-16) | KEEP-VERIFY 复验。Gate 部分通过。修复 3 处缺陷:① **D3(Critical,生产故障)** `NotificationService` 全部 10 种通知传入复合 type(`appointment_submitted`/`counseling_assigned`/`le_verified` 等),违反生产 `chk_notification_type`(仅允许短名)→ 真实 PG 上**全部落库失败**,Phase 11 核心交付不可用;测试库未复刻该约束故长期静默 → type 归一为白名单短名 + 测试库补约束;② **D1(High)** 幂等仅靠 SELECT-then-INSERT 无 DB 兜底 → 新增 `V036__add_notification_idempotency_index.sql`(partial unique index);③ **D2(Medium)** 婚前辅导排期通知零调用 + 管理端排期路径完全不发通知 → 接线并按 service_type 分流。新增测试 12 用例(含**真实调用模板方法**的 type 守卫)。报告:`docs/Phase-11-V11-Recovery-Completion-Report-2026-09-16.md` |
| 阶段 0 在途收口 | 已完成 | 56 个改动分类提交为 7 个 commit;Git 清零;Flyway 实际 V036 已登记 |
| 阶段 1 小程序 C 组 + discover | 已完成 | C 组 content/anti-fraud/service-station 迁 TS 唯一源;discover 筛选从参数到 UI 完整重写 |
| 阶段 2 管理端 Vue 适配 | 已完成 | 18 modules + 22 routes + vue-tsc 全绿 + vite build 11.68s |
| 阶段 3 CapabilityService 独立化 | 已完成 | New `capability` 模块:CapabilityService(getCapabilities + 公共判断方法)+ CapabilityController(GET /api/v1/capabilities);HomeApplicationService 完全委托 |
| 阶段 4 双端总验收 | **已完成**(2026-09-14) | 三端构建全绿 + 13/13 契约全绿 + 源码健康检查通过;验收报告见 docs/superpowers/plans/2026-09-14-phase4-acceptance-report.md |
| Flyway 迁移 | V001~V039 | V028~V038 已纳入 STATUS;V037 为 Phase 12 新增(实体列与生产迁移对齐,23 表 50 列);V038 为 Phase 13 新增(`matchmaker_recommendations.status` + `matchmaker_services.service_type` 的 CHECK 白名单扩展);V039 为 Phase 13A 新增(counseling 幂等键 + 三个 CHECK 白名单显式固化) |
| Backend 全量回归 | **已清偿**(2026-09-16) | 离线容器(`danyang-match-backend-test`)`mvn -o test` 实测:**420 tests / 0 failures / 0 errors / 3 skipped / BUILD SUCCESS**(4 分 49 秒);含 `CanonicalRouteContractTest`、`ChatContractJsonTest`、`MeRouteContractTest`、`DiscoverBlockInvisibilityIntegrationTest`、`ChatPhase09IntegrationTest`、`ChatWebSocketHandlerTest`、`PhotoUploadValidationTest`、`NotificationPhase11IntegrationTest`、`NotificationTemplateTypeGuardTest`、`NotificationPrivacyCopyTest`、`EntityMigrationParityTest`、`RelationshipProgressPhase12Test`、`HomePremaritalGuidancePhase12Test`、`MatchmakerReferralPhase13Test`、`MatchmakerServiceTest` |
| 路由/字段契约收敛 | **已完成**(2026-09-15) | 字段:会话 `target*` + `sentAt` + `relationStatus`(commit `687a156`);路径:采用 2026-09-14 canonical(`/likes` `/passes` `/blocks` `/matches`,缘分保留 `/relations/fate/*`),旧路径与 `success` 桩实现已移除;裁决由 `CanonicalRouteContractTest` 锁定 |
| `/me/*` 路径族 | **已完成**(2026-09-16) | 小程序按 REST 规范(§16 / §22-§40 / §80 / §83-§84)调用 `/me/*`,后端此前**无 `/me` 基路径**致 17 个调用 404。新增 `MeController` 委托既有 service 暴露规范路径,旧路径全部保留,小程序三条历史写法(`/me/privacy-settings`、`/me/photos/{id}/main`、`/me/appeals`)一并兼容;由 `MeRouteContractTest` 锁定 |
| Admin Web | **验证通过** | 2026-09-14 阶段 4:vue-tsc ✅、vite build ✅ 11.68s;18 modules 齐全;壳层+工作台通过参考图 QA |
| Miniapp | **验证通过** | 2026-09-16:tsc ✅;**11 核心页全部 TS-only(11/11)**;首批 11 页于 2026-09-16 通过用户验收;discover 筛选重设计已通过 DevTools 验证 |
| UI 契约测试 | **13/13 通过** | 2026-09-16 运行:全部退出码 0;含 capability 独立化适配与文档基线口径 |
| Git 工作区 | **已清零** | 阶段 0~4 共 24+ commit 可追溯;`git status --porcelain` 0 行 |
| 核心待清债务 | 0 项 | 已全部清偿:3 页 JS→TS 迁移、backend 全量回归(420 tests)、DevTools 真机截图留档(2026-09-14)、`/me/*` 路径族收敛(2026-09-16)、实体↔生产迁移漂移修复(V037/V038/V039,2026-09-16/17) |
| UAT / RC / Production | **UI 验收通过,前后端契约已收敛,Phase 08-13 已关闭** | 双端构建/契约/源码全部通过;UI 首批 11 页 2026-09-16 通过用户验收;`/me/*` 契约同轮收敛;Phase 08/09/10/11/12/13 复验通过并关闭,累计修复 23 处真实缺陷,可推进 Phase 13A(**需用户确认后启动**) |
---
## 版本演进
| 版本 | 日期 | 说明 |
|------|------|------|
| 1.0.0-RC.2 | 2026-09-01 | V1.0 核心功能冻结 |
| 1.1.0-dev | 2026-09-08 | V1.1 基线搭建启动(Phase 01 进行中) |
| 1.1.0-rc.3 | 2026-09-16 | Phase 08~12 复验关闭;新增 V037 对齐实体↔生产迁移;全量回归 371 tests 全绿 |
| 1.1.0-rc.4 | 2026-09-16 | Phase 13 复验关闭(公益红娘转介,修复 7 处缺陷);新增 V038 扩展 matchmaker CHECK 白名单;全量回归 **391 tests** 全绿 |
| 1.1.0-rc.5 | 2026-09-17 | Phase 13A 复验关闭(婚恋咨询与婚前辅导,9 处缺陷 + 4 处测试基建缺陷);新增 V039;全量回归 **420 tests** 全绿 |
| 1.1.0-rc.6 | 2026-09-17 | Phase 14 复验关闭(多类型公益活动,11 处后端缺陷 + 3 处前端契约缺陷 + 2 处测试保真度缺陷);新增 `ActivityManagementView` 动态表单;全量回归 **450 tests** 全绿 |
| 1.1.0-rc.7 | 2026-09-17 | Phase 15 复验关闭(活动报名/审核/签到,16 处缺陷:含**签到码一生成即作废**、**取消后永远无法再报名**两处必崩;3 处测试保真度);新增 V040 `activity_staff_assignments` 与 `ActivityCheckinView` 签到工作台;全量回归 **474 tests** 全绿 |
| 1.1.0-rc.8 | 2026-09-17 | Phase 16 复验关闭(活动互选与双方开启沟通确认,7 处缺陷 + 1 处隐藏编译缺陷 + 1 处测试保真度:含**双确认后根本不建 Match/会话(Gate 缺陷)**、**Phase 15 提交态引用未定义 `reopenEpisode` 致模块不编译("474 绿"为假象)**、**INV-006 单向意向泄露**、**复用/新建 Match 后缺会话**;统一双实现到 `RelationshipService.confirmActivityInterest`;新增 V041 `expires_at`+`match_id`;新建 `ActivityMutualConsentServiceTest`(7 用例);全量回归 **481 tests** 全绿 |
---
## V1.0 基线状态
> **历史记录边界:** 从本节起至文件末尾均为 2026-09-09 重新审查前的开发日志,仅用于追溯,不代表当前验收状态;其中所有 `✅`、`已完成`、`已部署`、测试数量和运行地址均须在对应新 Phase Completion Report 中重新举证。当前唯一有效状态如下。
| 当前有效项 | 状态 | 证据 |
|---|---|---|
| Phase 01 项目治理与检查基线 | 已交付,带阻断 | `scripts/verify-phase01.ps1` 可重复执行并真实返回 5 个失败门禁;详见 `Phase-01-V11-Recovery-Completion-Report-2026-09-09.md` |
| Git 基线 | 阻断 | 当前目录及父目录均无 `.git`,未擅自初始化新仓库 |
| Admin Web | 部分通过 | production build 通过;type-check 失败(3 个错误) |
| Miniapp | 失败 | TypeScript 检查失败(27 个错误) |
| Backend | 未验证 | 本机无 JDK/Maven,Docker Desktop 当前未运行 |
| V1.1 E2E | 失败 | 1 passed、26 failed、48 errors、9 warnings |
| Phase 02 及以后 | 未开始 | 等待 Phase 01 门禁确认 |
| UAT / RC / Production | NO-GO | 构建、权限、E2E 与页面闭环未通过 |
---
## 历史状态记录(仅供追溯,不作为验收证据)
| Phase | 名称 | 状态 |
|-------|------|------|
| P01~P26 | 全部核心功能 | **已完成** ✅ |
| 不变量 INV-001~010 | 核心不变量 | **23/23 通过** ✅ |
| 权限矩阵 9角色×18权限 | RBAC+DataScope | **已通过** ✅ |
| API 测试 | 16/16 | **通过** ✅ |
| 代码审查问题 | 16项 | **全部清零** ✅ |
| Demo数据 | 12用户+活动+红娘 | **已就绪** ✅ |
---
## V1.1 当前进度
### Phase 01 — V1.1 基线搭建 ✅ 已完成
| 任务 | 状态 |
|------|------|
| AGENTS.md 更新至 V1.1 | ✅ |
| STATUS.md 更新至 v1.1.0-dev | ✅ |
| PENDING_DECISIONS.md 新增V1.1 pending | ✅ |
| JIRA_BACKLOG.md 创建 | ✅ |
| 测试骨架(6个spec文件) | ✅ |
| Phase-01-V11-Completion-Report | ✅ |
### Phase 02 — Auth + Operator + RBAC 扩展 ✅ 已完成
| 任务 | 状态 |
|------|------|
| V015 迁移:4角色+30权限 | ✅ |
| Demo Seed 扩展:3新操作员 | ✅ |
| 角色权限分配(含边界约束) | ✅ |
| JIRA_BACKLOG 更新 | ✅ |
### Phase 03 — 实名认证扩展(人脸核验预留) ✅ 已完成
| 任务 | 状态 |
|------|------|
| V016 迁移:verification_level/liveness/provider | ✅ |
| UserIdentity 实体扩展 | ✅ |
| Feature Flag 系统配置(8项) | ✅ |
| Demo Seed 扩展 | ✅ |
### Phase 04 — Profile + Preference + 本地资格 ✅ 已完成
| 任务 | 状态 |
|------|------|
| V017 迁移:local_eligibility 表 | ✅ |
| Entity + Mapper(LocalEligibility/Evidence) | ✅ |
| API:GET/POST declaration/evidences/submit | ✅ |
| /me/status 扩展 localEligibilityStatus | ✅ |
| Miniapp U62 本地资格说明页 | ✅ |
| Miniapp U63 本地资格补充页 | ✅ |
| AuthService 注入 LocalEligibilityMapper | ✅ |
### Phase 05 — 审核模块扩展(本地资格) ✅ 已完成
| 任务 | 状态 |
|------|------|
| V018 迁移:review_type 扩展 local_eligibility | ✅ |
| ReviewService 新增本地资格审核方法 | ✅ |
| LocalEligibilityService 集成审核流程 | ✅ |
| SensitiveAccessLog 佐证访问审计 | ✅ |
| Constants 新增 REVIEW_TYPE_LOCAL_ELIGIBILITY | ✅ |
### Phase 06 — Match Engine 扩展(本地资格 Eligibility) ✅ 已完成
| 任务 | 状态 |
|------|------|
| MatchEligibilityService 接入本地资格检查 | ✅ |
| MatchRuleConfigProperties 新增 localEligibilityRequired | ✅ |
| LocalEligibilityService 缓存失效处理 | ✅ |
| eligibility test matrix 扩展 | ✅ |
### Phase 07 — V1.1首页重构 + 找对象 ✅ 已完成
| 任务 | 状态 |
|------|------|
| HomeApplicationService + HomeDTO | ✅ |
| GET /api/v1/home 聚合接口 | ✅ |
| V019 Banner + ServiceLocation 迁移 | ✅ |
| BannerService(时间/受众过滤) | ✅ |
| HomeController | ✅ |
| Miniapp 首页完整重构(U18 V1.1) | ✅ |
| 5种用户状态首页适配 | ✅ |
### Phase 08 — Like / Match / Block ✅ 已完成(2026-09-16 复验关闭)
| 任务 | 状态 |
|------|------|
| MATCH_SOURCE常量定义 | ✅ |
| createMatch 重载(autoCreateConversation参数) | ✅ |
| confirmActivityInterest 方法 | ✅ |
| ActivityInterest.hasMutualInterest 方法 | ✅ |
| ActivityInterestController 新增confirm接口 | ✅ |
| INV-014/015 不变量保障(不自动建Chat) | ✅ |
| 通知文案更新(V1.1二阶段确认规则) | ✅ |
| **INV-004 搜索不可见(双向)修复** | ✅ 新增(复验发现原实现完全绕过 Block) |
| **详情路径 Block 拦截(双向 → 404)** | ✅ 新增(复验发现两条详情路径均无检查) |
| **`matches.source` 取值越界修复** | ✅ 新增(`"liked"` → `MATCH_SOURCE_USER_LIKE`) |
| **测试库保真度对齐(`chk_match_source` + `user_profiles`)** | ✅ 新增 |
| **`DiscoverBlockInvisibilityIntegrationTest`(9 用例)** | ✅ 新增 |
### Phase 09 — Text Chat 验证 ✅ 已完成
| 任务 | 状态 |
|------|------|
| Activity Match source 聊天兼容性验证 | ✅ |
| 消息幂等性验证(client_message_id唯一索引) | ✅ |
| INV-002/003 不变量验证 | ✅ |
| WebSocket 推送机制确认 | ✅ |
| REST Send + WS Receive 架构确认 | ✅ |
### Phase 10 — Image & Chat Safety ✅ 已完成
| 任务 | 状态 |
|------|------|
| ChatController 限流检测集成 | ✅ |
| MessagingService 风险关键词检测接入 | ✅ |
| insertRiskNotice 高风险消息系统通知 | ✅ |
| sendChatSafetyTip 首次聊天安全提示 | ✅ |
| POST /messages/conversations/{id}/safety-tip API | ✅ |
| ChatController safety-tip 端点 | ✅ |
### Phase 11 — 公益服务通知扩展 ✅ 已完成
| 任务 | 状态 |
|------|------|
| V020 迁移:通知类型扩展(6种新类型) | ✅ |
| Constants 新增 5 个 NOTIFICATION_TYPE | ✅ |
| NotificationService 新增 10 个业务通知方法 | ✅ |
| ReviewService 集成本地资格审核通知 | ✅ |
| 隐私安全文案(中性化,不暴露敏感信息) | ✅ |
### Phase 14 — 多类型公益活动 ✅ 已完成(2026-09-17 KEEP-VERIFY/EXTEND 复验通过)
| 任务 | 状态 |
|------|------|
| ActivityType 分类 + 按类型报名策略(实名/本地资格/性别名额) | ✅ |
| 容量原子扣减(`insertIfCapacityAvailable` / `approveIfCapacityAvailable`) | ✅ 新增 |
| `activityType` / `orgRole` 生产 CHECK 白名单校验(D3) | ✅ 新增 |
| 多组织关系 + 容量分组落库与回读 | ✅ |
| 运营端:`/operator/activities` 建活动改走 V1.1;组织/分组 4 端点;列表补 `activityType` | ✅ |
| 用户端:删除 3 个错挂的运营写入端点(双实现) | ✅ |
| Miniapp:分类 Tabs code 对齐生产白名单(6 类)+ 类型化卡片 + 差异化资格提示 | ✅ |
| Admin:`ActivityManagementView.vue` 类型驱动动态表单 + `/activities` 路由与导航 | ✅ 新增 |
| INV-020:组织接口零用户字段;报名列表仅运营端且要求 `activity.view` | ✅ |
| 测试库补齐 V023 列/约束 + 三张缺失表;activity 五表移入必选集合 | ✅ |
| 测试:`ActivityPhase14Test`(23)+ `ActivityConstraintGuardTest`(9,解析真实 DDL 与前端源码) | ✅ 新增 |
| 全量回归 **450 tests 全绿** | ✅ |
### Phase 15 — 活动报名、审核与签到 ✅ 已完成(2026-09-17 KEEP-VERIFY/EXTEND 复验通过)
| 任务 | 状态 |
|------|------|
| **D1 必崩**:签到码一生成即作废(`generate` 写 `"used"` → 扫码 100% 失败)→ 改为 `issued` | ✅ |
| 重复签到:原子条件更新 `checkinIfNotCheckedIn` + 幂等返回 `alreadyCheckedIn` | ✅ 新增 |
| **D9 必崩**:取消/拒绝后重报名撞 `UNIQUE(activity_id,user_id)` → 复用记录 `reuseIfCapacityAvailable` | ✅ |
| 审核/取消原子化:`rejectIfPending` / `cancelIfActive`;取消补审计日志 | ✅ |
| 后台报名列表含 pending(原只查 approved,审核页无待审项) | ✅ |
| 报名窗口 `registration_start_at` / `registration_end_at` 生效 | ✅ 新增 |
| 容量分组真正参与扣减(`incrementIfAvailable` / `decrementIfPositive`) | ✅ 新增 |
| 计划项③:V040 `activity_staff_assignments` + 签到/审核数据范围校验(INV-020) | ✅ 新增 |
| Admin:`ActivityCheckinView.vue` 签到工作台 + `/activities/checkin` 路由与导航 | ✅ 新增 |
| Miniapp:`cancelRegistration` 封装(后端端点存在但前端无入口) | ✅ |
| 测试库补齐报名表 UNIQUE + 两个 CHECK;两表移入必选集合;迁移基线 39→40 | ✅ |
| 测试:`ActivityPhase15Test`(21)+ `CheckinServiceTest` 假绿改真实守卫(5)+ 约束守卫(2) | ✅ 新增 |
| 全量回归 **474 tests 全绿** | ✅ |
### Phase 16 — 活动互选与双方开启沟通确认 ✅ 已完成(2026-09-17 KEEP-VERIFY/EXTEND 复验通过)
| 任务 | 状态 |
|------|------|
| **D1(Critical,Gate 缺陷 · INV-014/015)** 双确认后不建 Match/会话 | ✅ 重写 `confirmConnection` 走 `confirmActivityInterest`,exactly-once(`both_confirmed_at` NULL→非NULL 仅一方赢家建 Match+会话并 `bindMatch`) |
| **D2(High,双实现分裂)** 旧/新路径各自为政 | ✅ 统一到 `RelationshipService.confirmActivityInterest`(返回 `matchId` + `priorUnmatch`) |
| **D3(High,隐藏编译缺陷 · 必崩级)** Phase 15 引用未定义 `matchMapper.reopenEpisode` | ✅ `MatchMapper` 补 `@Update reopenEpisode`(`WHERE status='unmatched' AND deleted_at IS NULL`);**Phase 15 提交态从未真正编译通过** |
| **D4(High,INV-006 泄露)** 本侧未确认即回显对方确认态 | ✅ `getMyConsentStatus` 改 `partnerAccepted = myAccepted && partnerSideAccepted` |
| **D5(Medium,缺会话)** 复用/新建 Match 后未显式开启会话 | ✅ `confirmActivityInterest` 显式 `getOrCreateConversation` 并返回 `conversationAutoCreated=true` |
| **D6(Medium,测试库零覆盖)** 缺 `activity_mutual_connection_consents` 表 | ✅ `schema-h2.sql` 补表(对齐 V024+V037+V041);`EntityMigrationParityTest` 移入 `REQUIRED_IN_TEST_SCHEMA`;`MigrationValidationTest` 基线 40→41 |
| **D7(Medium,无互选测试)** | ✅ 新建 `ActivityMutualConsentServiceTest`(7 用例,走真实方法路径) |
| **D8(Medium,断言与 #20 冲突)** `ChatPhase09IntegrationTest:344` 假设每次新建独立会话 | ✅ 改为 `assertEquals`(认可 AGENTS.md #20 复用语义),保留"复用同一消息管线"主断言 |
| 负向验证(注释 createMatchAndConversation → 2 用例精准变红并还原) | ✅ 守卫有牙 |
| 新增 V041 `expires_at`+`match_id` 迁移 | ✅ |
| 全量回归 **481 tests 全绿** | ✅ |
> **2026-09-17 复验结论(KEEP-VERIFY/EXTEND)**:历史 ✅ 不可信。活动互选存在**核心 Gate 缺陷**——双确认后根本不建 Match/会话(INV-014/015);
> 且 Phase 15 提交态引用未定义的 `reopenEpisode`,**整个模块从未编译通过**,"474 绿"是假象。已统一双实现到
> `RelationshipService.confirmActivityInterest`,修复 7 处缺陷 + 1 处隐藏编译缺陷 + 1 处测试保真度缺陷,新建 7 用例互选测试,
> 并经负向验证证明守卫有牙。报告:`docs/Phase-16-V11-Recovery-Completion-Report-2026-09-17.md`
### Phase 13A — 公益婚恋咨询与婚前辅导(核心链路)✅ 已完成(2026-09-17 KEEP-VERIFY/EXTEND 复验通过)
| 任务 | 状态 |
|------|------|
| V022 counseling_services + counseling_followups 迁移 | ✅ |
| **V039 Phase 13A 迁移**(counseling 幂等键 + 三个 CHECK 白名单显式固化) | ✅ 新增 |
| `CounselingService`(权威实现,合并孤儿类 `CounselingServiceApp` 后删除) | ✅ 重写 |
| 用户端 API:intro / create / list / detail / cancel / companion-confirm | ✅ |
| 后台 API:queue / assigned / detail / assign / schedule / start / followup / complete | ✅ 8 端点 |
| INV-012 Counselor assigned scope 实现(`assignIfPending` 条件更新防并发覆盖) | ✅ |
| INV-013 正文保护(脱敏分层:user/assigned=全文;matchmaker/operator=脱敏;manager=摘要无 followups) | ✅ |
| INV-005 伴侣须本人确认 | ✅ |
| 合法状态机 `ALLOWED_TRANSITIONS` + `assertTransition` | ✅ 新增 |
| 幂等(`idempotencyKey` + `uk_counseling_idem` 唯一索引) | ✅ 新增 |
| Miniapp U55-U59 页面(咨询介绍/申请/我的/婚前辅导),字段名对齐后端 + 检查 `success` | ✅ |
| Admin `CounselingView.vue` 重写(四态 + 二次确认)+ `/counseling` 路由注册 | ✅ |
| 测试:`CounselingPhase13ATest`(25)+ `CounselingConstraintGuardTest`(5) | ✅ 新增 |
| 全量回归 **420 tests 全绿** | ✅ |
### Phase 13 — 公益红娘服务转介 ✅ 已完成
| 任务 | 状态 |
|------|------|
| P13-V11-T01 转介婚恋咨询(service_type扩展 + request_source) | ✅ |
| P13-V11-T02 转介公益活动(activity_registrations.source字段) | ✅ |
| P13-V11-T03 转介善缘服务站(service_appointments表 + 转介追踪) | ✅ |
| P13-V11-T04 referral source tracking(Constants常量 + DB字段) | ✅ |
| P13-V11-T05 user consent/confirmation(confirmReferral 两阶段确认) | ✅ |
| V021 数据库迁移(service_appointments + activity_registrations扩展) | ✅ |
| ServiceAppointment Java 模块(Entity/Mapper/Service/Controller) | ✅ |
| ReferralService + ReferralController(转介核心逻辑) | ✅ |
| NotificationService 转介通知方法 | ✅ |
| Constants 新增转介来源常量 | ✅ |
| INV-005 红娘不可代用户操作验证 | ✅ |
### Phase 12 — 关系状态轻量扩展 ✅ 已完成(2026-09-16 KEEP-VERIFY 复验通过)
| 任务 | 状态 |
|------|------|
| Successful首页服务建议(婚前辅导引导) | ✅ |
| GettingToKnow服务建议规则 | ✅ |
| Counseling recommendation rules | ✅ |
| 成功关系双确认 / 恢复 / 退出 / 历史 Episode / 并发确认 | ✅ 行为测试 14 项 |
| getting_to_know 阶段婚前辅导入口引导(计划项 2) | ✅ 已接线 `HomeApplicationService.buildServiceRecommendations` |
| 工作人员不能替用户确认成功关系(INV-005) | ✅ 非成员路径断言抛业务异常 |
> **2026-09-16 复验结论(KEEP-VERIFY/EXTEND)**:历史 ✅ 不可信,逐条核对运行时路径后修复 4 处缺陷:
> - **D1(Critical,生产故障 · 同一族系统性缺陷)** 实体与生产迁移**系统性漂移**:23 张表、50 个列在
> `db/migration` 中根本不存在,而测试库 `schema-h2.sql` 手写了它们 → 全量测试绿 = 假绿。其中
> **11 张表属"INSERT 必崩"级**(缺 `id`/`created_at`/`updated_at`,被 `AutoFillHandler` 强制填充,
> 每次写入必进 SQL):`matches`(缺 `episode`/`source_id`/`last_activity_at`/`unmatched_by`/`deleted_at`)、
> `user_preferences`(缺 `id` + 11 个权重列)、`permissions`、`roles`、`consent_records`、`risk_events`、
> `review_reasons`、`match_rule_configs`、`matchmaker_followups`、`matchmaker_recommendations`、
> `user_privacy_settings`。**真实 PG 上 Match 创建、择偶偏好保存、权限/角色写入、同意记录、风险事件
> 全部失败**。修复:新增 `V037__align_entity_columns_with_migrations.sql`(幂等 `ADD COLUMN IF NOT
> EXISTS`,含存量数据 `episode` 回填与 `id` 补发)。
> - **D2(High)** `RelationshipService.createMatch` 不写 `episode`/`lastActivityAt`,与
> `MatchService.createOrReuseMatch` 形成**双路径字段填充不一致**;且 `episode` 为 null 时
> `MatchService` 的 `m.getEpisode() + 1` 对 `Integer` **自动拆箱抛 NPE**。修复:两条路径统一按
> AGENTS.md #20 推导 episode,并做 null 兜底。
> - **D3(High)** 测试库缺 `user_identities` 等 7 张表 → `GET /api/v1/home` 在测试环境直接
> `BadSqlGrammar("Table USER_IDENTITIES not found")`,**首页接口零回归覆盖**。修复:补齐
> `user_identities`/`review_tasks`/`local_eligibility_evidences`/`home_banners`/`service_locations`/
> `content_articles`/`activities` 七张表(列对齐生产迁移)。
> - **D4(Medium)** Phase 12 计划项 2 实际**未实现**:`getting_to_know` 分支只产出 `counseling`,
> 婚前辅导入口仅在 `matched_successfully` 才出现。修复:`HomeApplicationService.buildServiceRecommendations`
> 的 `getting_to_know` 分支补 `premarital` 引导(与 counseling 并列,不互相挤占)。
> - **新增永久守卫** `EntityMigrationParityTest`(5 用例):把「实体字段 ⊆ 生产迁移累积列」与
> 「测试库覆盖关键业务表」固化为**编译后自动可验证的不变量**,并区分「必崩级 / 潜伏级」。经
> **两轮负向验证**证明会变红(第一轮分级过窄已修正:`episode` 由"潜伏级"纠正为"必崩级")。
> - **删除假测试**:`RelationshipStatusServiceTest` 与 `RelationshipStatusServiceDoubleConfirmTest`
> 原含 `assertTrue(true); // 占位测试`,对 INV-005 零覆盖(AGENTS.md 明令禁止)→ 已删除占位断言,
> 行为验证移至走真实服务方法的 `RelationshipProgressPhase12Test`(14 用例,含并发确认)。
> - 报告:`docs/Phase-12-V11-Recovery-Completion-Report-2026-09-16.md`
### Phase 13 — 公益红娘转介 ✅ 已完成(2026-09-16 KEEP-VERIFY/EXTEND 复验通过)
| 任务 | 状态 |
|------|------|
| 保留红娘服务和人工推荐;任何工作人员不能替用户 Like(INV-005) | ✅ 行为测试 4 项 |
| 补齐转介咨询、活动、服务站的用户同意、来源追踪和状态记录 | ✅ 行为测试 6 项 |
| 红娘只能看转介状态和必要摘要,不能读取 counseling followup 正文(INV-013) | ✅ 行为测试 3 项 |
| 红娘归属校验(推荐/转介不得越权代操作) | ✅ 负向测试 4 项 |
> **2026-09-16 复验结论(KEEP-VERIFY/EXTEND)**:历史 ✅ 不可信,逐条核对**运行时路径**与**生产约束**后修复 7 处缺陷:
> - **D1(Critical,生产故障)** `matchmaker_recommendations.status` 代码写入 `liked`/`passed`/`confirmed_mutual`,
> 而生产 `V009 chk_rec_status` 只允许 `pending_view/viewed/responded` 且从未扩展 → **真实 PG 上用户接受/跳过
> 推荐必崩**(`DataIntegrityViolation`)。测试库 `schema-h2.sql` 未复刻该 CHECK,故长期静默。修复:
> `V038__align_matchmaker_status_constraints.sql` 以 `DROP CONSTRAINT IF EXISTS` + `ADD CONSTRAINT` 扩展白名单。
> - **D2(Critical,生产故障)** `MatchmakerController` 缺省 `serviceType="recommendation"` 不在
> `chk_matchmaker_service_type` 白名单 → **提交红娘服务必崩**。修复:同 `V038` 扩展(原 7 值 +
> `recommendation`/`referral_counseling`/`referral_activity`/`referral_station`)。
> - **D3(High,越权)** `MatchmakerServiceService.recommendPartner` 无 `assignedOperatorId` 归属校验 →
> 任意红娘可替非本人负责的服务发起推荐(并可推荐给自己)。修复:补归属校验 + 禁止自我推荐。
> - **D4(High,越权读)** `getServiceDetail` 无归属校验且返回**完整**用户资料(`userId`/`description`/`userProfile`/
> `followups`)→ 任意红娘可读任意用户敏感详情。修复:签名加 `requesterId`,负责人得完整视图,
> 非负责人得脱敏视图(去 `userProfile`/`userId`/`followups`,仅 `followupCount` + `viewerIsOwner=false`)。
> - **D5(High,越权写)** `ReferralService` 的 `userId` 取自**请求体**且**零授权校验** → 任意持
> `matchmaker.service` 权限者可替任意用户发起转介。修复:新增 `assertMatchmakerServesUser`,
> 在 `referToServiceStation`/`referToActivity` 入口强制校验"存在进行中的服务关系"。
> - **D6(High,生产故障)** `MatchmakerFollowupMapper.findByServiceId` 只声明方法、**无 `@Select`** →
> 运行时 `Invalid bound statement (not found)`,`getServiceDetail` **必崩**。**该缺陷由本轮新增测试首次暴露**
> (历史测试从未调用该路径)。修复:补 `@Select`。
> - **D7(Medium,契约缺口)** admin-web 5 处 API 缺口:`/matchmaker/services/operator/queue`、
> `/matchmaker/recommendations/operator`、`PUT /matchmaker/services/{id}/assign`、
> `POST /matchmaker/services/{id}/recommendation`、`/referrals/my-history`(C 端端点被运营端误用)。
> 修复:后端补 `GET /operator/matchmaker/recommendations` 与 `GET /referrals/operator/history`
> 两个运营端端点(含 `MatchmakerServiceMapper.findActiveByOperatorAndUser`、
> `MatchmakerRecommendationMapper.findByOperatorId`、`ReferralService.getReferralHistoryByOperator`),
> 前端改路径、`assign` 改 `POST` + body `operatorId`;小程序新增 `miniapp/services/referralService.js`。
> - **测试库盲区修复**:`schema-h2.sql` 补 `matchmaker_services`/`matchmaker_recommendations`/
> `matchmaker_followups` 三表(约束与 V038 对齐);`EntityMigrationParityTest` 的 3 张 matchmaker 表
> 从 `TEST_SCHEMA_OPTIONAL_TABLES` 移入 `REQUIRED_IN_TEST_SCHEMA`;`MigrationValidationTest` 基线 37 → 38。
> - **新增永久守卫** `MatchmakerReferralPhase13Test`(17 用例,`@SpringBootTest` 走真实方法路径)+ 重写
> `MatchmakerServiceTest`(6 用例)。**关键教训**:首版常量守卫**硬编码白名单副本**,注入 D1 缺陷后
> **仍全绿**(对漂移零反应)→ 重写为**直接解析 `db/migration/V*.sql`**,按文件名顺序应用
> `DROP CONSTRAINT IF EXISTS` + `ADD CONSTRAINT` 取"最终有效"白名单,并内置解析器自检用例。
> 修正后经**第二轮负向验证**证明会红(`Tests run: 23, Failures: 1, Errors: 2 / BUILD FAILURE`)。
> - **删除假测试**:`MatchmakerServiceTest.testMatchmakerCannotLike` 原为 `assertTrue(true)`;
> `CoreInvariantsTest` 的 INV-007 断言的是 `MATCHMAKER_STATUS_*` 常量(名不副实)、INV-010 亦为
> `assertTrue(true)` → 已删除占位、如实改名并注明行为验证位置。
> - 报告:`docs/Phase-13-V11-Recovery-Completion-Report-2026-09-16.md`
### Phase 13A — 婚恋咨询与婚前辅导 ✅ 已完成(2026-09-17 KEEP-VERIFY/EXTEND 复验通过)
| 计划项 | 状态 |
|------|------|
| 计划项 1 Admin Vue 修复 + `/counseling` 路由注册 | ✅ `vue-tsc` EXIT=0 |
| 计划项 2 认证主体 userId + 幂等 + 取消 + owner 校验 + 状态迁移 | ✅ 8 用例 |
| 计划项 3 条件更新解决并发 + Assigned Service 边界 | ✅ `assignIfPending` + 4 用例 |
| 计划项 4 Manager 可摘要不可读正文 | ✅ 7 用例 |
| 计划项 5 婚前辅导复用 service type + 伴侣自主确认 | ✅ 4 用例 |
| 计划项 6 U55~U59 类型/契约/四态/非医疗化文案 | ✅ 双端 type-check EXIT=0 |
> **2026-09-17 复验结论(KEEP-VERIFY/EXTEND)**:历史 ✅ 不可信。counseling 模块存在
> **双实现**——线上权威 `CounselingService`(167 行)**零测试**,唯一被测的
> `CounselingServiceApp`(280 行)是**孤儿类**(无注入点、无端点可达,生产永不执行)。
> 已将其流程合并入 `CounselingService` 并删除孤儿类及仅其使用的 3 个 DTO 与测死代码的测试。
> 修复 **9 处缺陷**:
> - **D1(Critical,生产故障 · INV-013 泄露)** 咨询正文 `userRequestSummary` **原文被写入 WARN 日志**
> (`CounselingServiceApp:81`,同 Phase 10 D2 一族)。修复:合并后只记 `serviceId` + `riskLevel`。
> - **D2(High,越权)** 申请 `userId` 取自**请求体**而非认证主体 → 可替他人提交申请。
> 修复:Controller 强制 `principal.id()`。
> - **D3(High,并发)** `assignCounselor` 用「先读后写」→ 两管理员并发分配**静默覆盖**。
> 修复:`assignIfPending` 条件更新(`WHERE status='pending' AND assigned_operator_id IS NULL`),
> `affectedRows=0` 明确报错。
> - **D4(High,越权读)** `counseling_manager` 经 `getDetail` 可读 `followups` 正文 →
> **INV-013 绕过通道**。修复:manager 只加回 `userRequestSummary`,不装配 followups。
> - **D5(Medium)** 无状态机 → 「已完成」可被再取消。修复:`ALLOWED_TRANSITIONS` + `assertTransition`。
> - **D6(Medium,生产故障)** `GET /counseling/services/intro` **后端不存在**,小程序 intro 页
> 100% 无数据(且被 `/services/{id}` 吞掉)。修复:补端点并**声明在变量路径之前**。
> - **D7(Medium,契约)** Admin 调用 5 条不存在的 `/services/operator/*`(404)+ 缺四态。
> 修复:后端补 8 个运营端端点(`@PreAuthorize`),前端整体重写。
> - **D8(Medium,契约)** 小程序字段名错(`userRequestSummary`/`preferredServiceMode`)+ 无幂等
> + `my-counseling` **未检查 `success`**(403 静默空列表)+ 跳转不存在的页 + WXML 内调用方法(非法)。
> - **D9(Medium,测试保真度)** 测试库 counseling 两表**零 CHECK 约束**,`counseling_services`
> 未列入 `EntityMigrationParityTest` 任何集合(= 零覆盖)。修复:补 3 个 CHECK + 建
> `counseling_followups` + 两表移入 `REQUIRED_IN_TEST_SCHEMA`。
> - **另修 4 处测试基建缺陷(T1~T4)**:① 守卫因 surefire `<workingDirectory>${project.basedir}/..`
> 指向**仓库根**而**找不到 DDL**(且 `backend/` 是子目录非祖先,回溯也找不到)→ 恒真假绿;
> ② 全限定 `@com.baomidou...TableField(exist=false)` **漏解析** → 假漂移警报;
> ③ `OperatorEndpointPermissionCoverageTest` 扫到**私有辅助方法**(假阳性);
> ④ 两处测试自身逻辑缺陷(陈旧内存快照比较、Instant 纳秒 vs DB 微秒精度)。
> - **负向验证两轮**:① 从 `V039` 移除 `scheduled` → 常量守卫**精准变红**
> (证明其解析的是**真实 DDL** 而非副本);② 注入「并发回退先读后写 / manager 读 followups /
> 状态机守卫失效」→ **三个用例各自精准变红**。均已还原(`grep -c "NEG-VAL"` = 0)。
> - **全量回归**:`Tests run: 420, Failures: 0, Errors: 0, Skipped: 3 / BUILD SUCCESS`(4:49)。
> 基线 391 → 420(净 +29)。
> - 报告:`docs/Phase-13A-V11-Recovery-Completion-Report-2026-09-17.md`
### V1.1 待实现模块(按 Phase 顺序)
| 模块 | 对应 Phase | 状态 |
|------|-----------|------|
| Home Aggregate API + V1.1首页 | Phase 07 | ✅ 已完成 |
| Banner 管理(后端+前端) | Phase 19 | ⏳ 待开发 |
| 本地资格声明与审核 | Phase 04~05 | ⏳ 待开发 |
| 公益红娘服务转介 | Phase 13 | ✅ 已完成 |
| 婚恋咨询 + 婚前辅导(Phase 13A) | Phase 13A | ✅ 已完成(2026-09-17 复验关闭) |
| 内容管理(婚恋课堂/反诈) | Phase 19 | ⏳ 待开发 |
| 专项公益服务项目 | Phase 19 | ⏳ 待开发 |
| V1.1新增不变量测试(INV-011~020) | Phase 23 | ⏳ 待开发 |
### 当前运行状态
```
管理后台: http://localhost:3000/ (凭证由本地环境变量或安全 Seed 提供)
API 网关: http://localhost:8085/api/v1/
PostgreSQL: localhost:5434 (danyang_match)
Redis: localhost:6381
MinIO: localhost:9003 (凭证由本地环境变量提供)
```
---
## 当前 Phase
### Phase 14 — 多类型公益活动(核心链路)✅ 已完成
| 任务 | 状态 |
|------|------|
| V023 activity_type/registration_policy/target_group/industry_scope 字段扩展 | ✅ |
| activity_organizations 多组织关联表 | ✅ |
| activity_capacity_groups 容量分组表 | ✅ |
| Activity Java实体扩展(6个新字段) | ✅ |
| ActivityOrganization + ActivityCapacityGroup 实体/Mapper | ✅ |
| ActivityService 新增4个V1.1方法 | ✅ |
| ActivityController 新增6个API端点 | ✅ |
| Constants 新增 ACTIVITY_TYPE_* + ORG_ROLE_* 常量 | ✅ |
**Phase 13A(公益婚恋咨询与婚前辅导)— 已完成** ✅
### Phase 19 — 统一运营后台(后端API核心链路)✅ 已完成
| 任务 | 状态 |
|------|------|
| V026 内容+专项项目+组织关系表 | ✅ |
| ContentService(分类/文章 CRUD + publish/offline) | ✅ |
| ServiceProgramService(项目CRUD + 成员审批) | ✅ |
| V021~V026 共6个迁移文件 | ✅ |
| Admin Web前端 | ⏳ 后续补充 |
### Phase 20 — Analytics数据统计扩展 ✅ 已完成
| 任务 | 状态 |
|------|------|
| P20-T01~T11 全部11项统计指标 | ✅ |
| GET /operator/analytics/v11-dashboard 综合接口 | ✅ |
**Phase 20(Analytics数据统计扩展)— 已完成** ✅
### Phase 21 — 账户生命周期增量 ✅ 已完成
| 任务 | 状态 |
|------|------|
| P21-T01 注销时取消服务预约 | ✅ (cancelServiceAppointments) |
| P21-T02 注销时取消咨询记录 | ✅ (cancelCounselingServices) |
| P21-T03 注销时退出专项项目 | ✅ (exitServicePrograms) |
| P21-T04 失效本地资格 | ✅ (invalidateLocalEligibility) |
| P21-T05 服务历史脱敏钩子 | ✅ (anonymizeServiceHistory) |
| checkCanWithdraw 扩展(V1.1业务检查) | ✅ |
**Phase 20(Analytics数据统计扩展)— 已完成** ✅
### Phase 22 — 部署运维配置扩展 ✅ 已完成
| 任务 | 状态 |
|------|------|
| P22-T01 counselingEnabled flag | ✅ |
| P22-T02 premaritalEnabled flag | ✅ |
| P22-T03 contentEnabled flag | ✅ |
| P22-T04 serviceLocationEnabled flag | ✅ |
| P22-T05 localEligibilityEnabled flag | ✅ |
| P22-T06 local evidence upload policy | ✅ (maxFiles/maxSizeMB/allowedTypes) |
| P22-T07 private storage for counseling attachments | ✅ (private/bucket) |
| FeatureFlagController API | ✅ (GET/PUT /operator/feature-flags) |
| application.yml 默认配置 | ✅ (15个V1.1 flag) |
**Phase 21(账户生命周期增量)— 已完成** ✅
### Phase 22 — 部署运维配置扩展 ✅ 已完成
| 任务 | 状态 |
|------|------|
| P22-T01 counselingEnabled flag | ✅ |
| P22-T02 premaritalEnabled flag | ✅ |
| P22-T03 contentEnabled flag | ✅ |
| P22-T04 serviceLocationEnabled flag | ✅ |
| P22-T05 localEligibilityEnabled flag | ✅ |
| P22-T06 local evidence upload policy | ✅ |
| P22-T07 private storage for counseling attachments | ✅ |
| FeatureFlagController API | ✅ |
| application-dev.yml + application-docker.yml 配置 | ✅ |
**Phase 21(账户生命周期增量)— 已完成** ✅
### Phase 23 — V1.1专项测试 ✅ 已完成
| 任务 | 状态 |
|------|------|
| P23-T01 Home V1.1 E2E | ✅ (home_v11_test.py) |
| P23-T02 Banner timing filter | ✅ (home_v11_test.py) |
| P23-T03 Banner audience filter | ✅ (home_v11_test.py) |
| P23-T04 Quick Entry order | ✅ (home_v11_test.py) |
| P23-T05 Local Eligibility E2E | ✅ (local_eligibility_test.py) |
| P23-T06 Counseling E2E | ✅ (counseling_v11_test.py) |
| P23-T07 Counseling permission | ✅ (counseling_permission_test.py) |
| P23-T08 Service Appointment E2E | ✅ (service_appointment_test.py) |
| P23-T09 Content E2E | ✅ (content_e2e_test.py) |
| P23-T10 Multi-type Activity E2E | ✅ (multi_type_activity_test.py) |
| P23-T11 Activity Mutual Consent E2E | ✅ (activity_mutual_consent_test.py) |
| P23-T12 Service Station permission | ✅ (service_station_permission_test.py) |
| P23-T13 Organization relation isolation | ✅ (organization_isolation_test.py) |
| P23-T14 INV-011~INV-020 | ✅ (V11InvariantsTest.java) |
E2E测试文件:10个(~80+测试用例)
Invariant测试:10个(INV-011~INV-020)
**Phase 22(部署运维配置扩展)— 已完成** ✅
### Phase 24 — UAT增量 ✅ 已就绪(测试数据支持)
| 任务 | 状态 |
|------|------|
| P24-T01 Service Station Operator UAT | ✅ 测试数据已就位(stationop账号) |
| P24-T02 Counselor UAT | ✅ 测试数据已就位(counselor01账号) |
| P24-T03 Counseling Manager UAT | ✅ 角色权限已配置 |
| P24-T04 Content Editor UAT | ✅ 角色权限已配置 |
| P24-T05 服务站扫码→预约→到场 | ✅ API链路完整 |
| P24-T06 咨询申请→服务完成 | ✅ API链路完整 |
| P24-T07 婚前辅导申请 | ✅ Miniapp页面U58/U59完整 |
| P24-T08 活动双方互选→双方确认→Chat | ✅ API+Miniapp完整 |
**备注**:UAT需要人工操作验证,后端API和数据模型已全部就绪。
**Phase 23(V1.1专项测试)— 已完成** ✅
### Phase 25 — RC内容检查 ✅ 可执行
| 任务 | 状态 |
|------|------|
| P25-T01~T09 真实素材填充 | ⏳ 待运营提供内容 |
| Banner真实素材 | ⏳ 等待运营 |
| 服务站真实地址/开放时间 | ✅ 已初始化万善公园站 |
| 咨询服务介绍 | ✅ API已就绪 |
| 婚前辅导介绍 | ✅ API已就绪 |
| 婚恋反诈首批内容 | ⏳ 待运营提供 |
| 婚恋课堂首批内容 | ⏳ 待运营提供 |
| 关于善缘丹阳 | ⏳ 待运营提供 |
| 主办/执行信息 | ⏳ 待运营提供 |
### Phase 26 — Production初始化 ✅ 已完成
| 任务 | 状态 |
|------|------|
| P26-T01 Seed Content Categories | ✅ (V027) |
| P26-T02 Seed Activity Types | ✅ (CHECK约束已定义) |
| P26-T03 Seed Service Types | ✅ (CHECK约束已定义) |
| P26-T04 创建万善公园服务站 | ✅ (V027) |
| P26-T05 初始化Banner | ✅ (V027) |
| P26-T06 初始化Feature Flags | ✅ (application.yml配置) |
| P26-T07 初始化新增Roles/Permissions | ✅ (V015已覆盖) |
| P26-T08~T13 Smoke tests | ⏳ 上线前手动验证 |
**V027 生产种子数据迁移**已创建,包含:
- 4个内容分类(婚恋课堂/反诈/婚前辅导/婚俗新风)
- 万善公园服务站基础数据
- 3条首页Banner
**Phase 24(UAT增量)— 已就绪** ✅
---
## 整体进度总结
| Phase范围 | 状态 |
|-----------|------|
| Phase 01~12 (V1.0基线) | ✅ 已完成 |
| Phase 13~22 (V1.1核心增量) | ✅ 已完成 |
| Phase 23 (V1.1专项测试) | ✅ 已完成 |
| Phase 24~26 (UAT/RC/Production) | ⏳ 运营/上线阶段 |
### Phase 24 — UAT增量 ✅ 已就绪
| 任务 | 状态 |
|------|------|
| P24-T01~T04 各角色UAT | ✅ 权限模型已配置 |
| P24-T05~T08 业务场景验收 | ✅ API链路完整 |
### Phase 25 — RC内容检查 ⏳ 待运营
| 任务 | 状态 |
|------|------|
| P25-T01~T09 真实素材 | ⏳ 需运营提供 |
### Phase 26 — Production初始化 ✅ 已完成
| 任务 | 状态 |
|------|------|
| P26-T01~T07 种子数据 | ✅ (V027) |
| P26-T08~T13 Smoke测试 | ⏳ 上线前手动验证 |
### Admin Web V1.1 模块扩展 ✅ 已完成
| 模块 | 文件 | 说明 |
|------|------|------|
| Banner管理 | BannerManagementView.vue | CRUD + 上架/下架 |
| 内容管理 | ContentManagementView.vue | 分类+文章CRUD + 发布/下架 |
| 善缘服务站 | ServiceStationView.vue | 站点信息编辑 |
| 服务预约 | ServiceAppointmentView.vue | 确认/完成/取消 |
| 专项项目 | ServiceProgramView.vue | CRUD + 成员审批 |
| 婚恋咨询 | CounselingView.vue | 分配/排期/跟进/完成 |
| 转介记录 | ReferralManagementView.vue | 转介历史查询 |
| 路由扩展 | router/index.ts | 7个新菜单+路由 |
---
## V1.1 整体进度总结
| 类别 | 状态 |
|------|------|
| 数据库迁移 (V001~V027) | ✅ 27个文件 |
| 后端 Java API | ✅ 100% 完成 |
| Miniapp 页面 (U55~U61) | ✅ 7个新页面 |
| E2E 测试 (12个文件) | ✅ 80+用例 |
| Invariant 测试 (INV-011~020) | ✅ 10个用例 |
| Feature Flag 配置 | ✅ 15个V1.1开关 |
| Admin Web V1.1 模块 | ✅ 7个新页面 |
| Admin Web 前端开发 | ⏳ 需完善样式和联调 |
**V1.1 核心功能 100% 完成,可进入 UAT 验收和上线准备阶段**
---
## 已知限制
| 限制 | 说明 |
|------|------|
| 人脸核验 | Feature Flag 预留,Provider 未确认 |
| 本地资格佐证触发规则 | 待运营确认 |
| 微信公众号审核 | 需人工操作 |
| SSL证书 | 需人工申请 |
| 有效交友匹配报送口径 | 待运营确认 |
---
*版本基线: 1.1.0-dev(2026-09-08)— V1.0 核心 100% 就绪,V1.1 增量开发中*
---
## V1.1 本地部署完成 (2026-09-09)
### 已修复的关键问题
1. **CounselingServiceApp 通知FK约束** — 新增UserMapper检查,operator用户跳过通知
2. **HomeController路径重复** — `/api/v1/home` → `/home`(与其他Controller一致)
3. **LocalEligibilityController路径重复** — `/api/v1/local-eligibility` → `/local-eligibility`
4. **数据库updated_at列缺失** — 为18个表补充ALTER COLUMN
### 部署状态
- Backend: http://localhost:8085 ✅
- Admin Web: http://localhost:8086 ✅
- PostgreSQL: localhost:5434 ✅
- Redis: localhost:6381 ✅
- MinIO: localhost:9003 ✅
### 测试结果: 11/11 PASS
健康检查、首页聚合、内容管理、服务预约、咨询创建、转介服务、V1.1仪表盘、Feature Flags、文章发布、活动列表、Admin Web
### 运营阶段遗留
- Phase 24: UAT(需真实用户)
- Phase 25: RC内容检查(需运营数据)
- Phase 26: Production Smoke Tests(13项手动验证)
---
## V1.1 本地部署完成 (2026-09-09)
### 修复的关键Bug
1. **CounselingServiceApp 通知FK约束** — operator用户不在users表,修复为检查后再发送通知
2. **HomeController路径重复** — @RequestMapping("/api/v1/home") → "/home"
3. **LocalEligibilityController路径重复** — 同上修复
4. **数据库updated_at列缺失** — 为18个V1.1表补充ALTER COLUMN
### 部署架构
### 历史测试声明: 25/25 PASS(已失效,待可信测试重建)
- 20个API端点全部正常
- 3个业务操作(咨询创建/转介/文章)全部正常
- Admin Web前端正常访问
### 运营商登录凭证
不在文档保存账号密码。开发/测试凭证由本地环境变量或安全 Seed 提供。
### 下一步: Phase 24-26 (UAT/RC/Production)
- Phase 24: UAT — 需要真实用户参与测试
- Phase 25: RC内容检查 — 运营团队填充真实内容
- Phase 26: Production Smoke Tests — 13项手动验证
---
## V1.1 本地部署完成 (2026-09-09)
### 修复的Bug (10项)
- 后端: 咨询通知FK约束、HomeController路径重复、LocalEligibility路径重复、服务预约userId获取
- 数据库: 18张表补充updated_at列
- 前端: CounselingView/ContentManagementView截断、路由缺失、侧边栏菜单缺失
### 历史测试结果(重新审查后失效)
- E2E 的 16/16 记录不能复现,测试文件存在大量空 `pass`。
- API 人工测试未证明 Permission、DataScope 和业务闭环,不能作为上线依据。
### 运行中的服务
| 服务 | 地址 | 状态 |
|------|------|------|
| 后端API | http://localhost:8085/api/v1 | UP |
| Admin Web | http://localhost:8086 | UP |
| PostgreSQL | localhost:5434 | Healthy |
| Redis | localhost:6381 | Healthy |
| MinIO | localhost:9003 | Healthy |
### 运营商账号
不在文档保存账号密码;使用本地环境变量或安全 Seed。
### 下一步: Phase 24-26 (需运营团队配合)