Files
danyang-match/docs/STATUS.md
T
WorkBuddy c607e87b45 fix(relationship): Phase 12 复验 —— 修复实体↔生产迁移系统性漂移(生产故障族)/ 双路径 episode 与 NPE / 测试库缺表致首页零覆盖 / 计划项 2 未实现
KEEP-VERIFY 复验发现并修复 4 处真实缺陷:
- D1(Critical,生产故障·同一族系统性缺陷)实体与 db/migration 系统性漂移:23 表 50 列在生产
  迁移中不存在,而测试库 schema-h2.sql 手写补齐 → 全量绿=假绿。其中 11 表属"INSERT 必崩"级
  (缺 id/created_at/updated_at,被 AutoFillHandler 强制填充),含 matches.episode、user_preferences
  权重列、permissions/roles、consent_records、risk_events 等;真实 PG 上 Match 创建、择偶偏好保存、
  权限/角色写入、同意记录、风险事件全部失败。修复:新增 V037(幂等 ADD COLUMN IF NOT EXISTS
  + 存量 episode 回填)。
- D2(High)RelationshipService.createMatch 不写 episode/lastActivityAt,与 MatchService 双路径
  填充不一致;且 episode 为 null 时 m.getEpisode()+1 对 Integer 自动拆箱抛 NPE。修复:统一按
  AGENTS.md #20 推导 + null 兜底。
- D3(High)测试库缺 user_identities 等 7 表 → GET /api/v1/home 在测试环境 BadSqlGrammar,
  首页接口零回归覆盖。修复:schema-h2.sql 补齐 7 表。
- D4(Medium)Phase 12 计划项 2 实际未实现:getting_to_know 分支只产出 counseling。修复:
  HomeApplicationService 补 premarital 引导(与 counseling 并列)。

测试保真度:
- 新增永久守卫 EntityMigrationParityTest(5 用例):把"实体字段 ⊆ 生产迁移累积列"与"测试库覆盖
  关键业务表"固化为自动不变量,区分"必崩级/潜伏级";经两轮负向验证证明会变红(第一轮分级过窄
  已修正:episode 由"潜伏级"纠正为"必崩级")。
- 新增 RelationshipProgressPhase12Test(14 用例,含 8 线程并发确认)与
  HomePremaritalGuidancePhase12Test(5 用例)。
- 删除 2 个假测试类中的 assertTrue(true) 占位(AGENTS.md 明令禁止),改走真实服务方法验证。

Gate:单方确认不改变最终关系 ✅ / 双确认后才 successful ✅ / 历史 Episode 可追踪 ✅ /
新 Episode 不恢复旧聊天权限(conversations.match_id UNIQUE)✅ / 非成员不可代确认 ✅

全量回归:371 tests / 0 failures / 0 errors / 3 skipped / BUILD SUCCESS(71 类,5m07s)
2026-09-16 23:01:13 +08:00

578 lines
32 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-16 当前有效结论:`V1.1 INCREMENTAL RECOVERY PHASE 4 COMPLETE / UI REDESIGN ACCEPTED BY USER / PHASE 08-12 RECOVERY CLOSED / GIT CLEAN`。**
>
> 阶段 0(在途收口)、阶段 1(小程序 C 组 + discover 筛选重设计)、阶段 2(管理端 Vue 新框架适配)、阶段 3(CapabilityService 独立化)、阶段 4(双端总验收)全部完成。三端构建通过、**13/13 契约全绿**、核心 11 页面**全部 TS-only(11/11)**。后端全量回归已清偿(371 tests / 0 failures / 0 errors)。**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)复验已关闭**,五轮共修复 16 处真实缺陷,并各自补齐测试保真度与守卫。**Phase 13 需用户确认后启动。**
最后更新: 2026-09-16 — 分支 `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~V037 | V028~V037 已纳入 STATUS;V037 为 Phase 12 新增(实体列与生产迁移对齐,23 表 50 列) |
| Backend 全量回归 | **已清偿**(2026-09-16) | 离线容器(`danyang-match-backend-test`)运行:**371 tests / 0 failures / 0 errors / 3 skipped / BUILD SUCCESS**;含 `CanonicalRouteContractTest`、`ChatContractJsonTest`、`MeRouteContractTest`、`DiscoverBlockInvisibilityIntegrationTest`、`ChatPhase09IntegrationTest`、`ChatWebSocketHandlerTest`、`PhotoUploadValidationTest`、`NotificationPhase11IntegrationTest`、`NotificationTemplateTypeGuardTest`、`NotificationPrivacyCopyTest`、`EntityMigrationParityTest`、`RelationshipProgressPhase12Test`、`HomePremaritalGuidancePhase12Test` |
| 路由/字段契约收敛 | **已完成**(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 全量回归(371 tests)、DevTools 真机截图留档(2026-09-14)、`/me/*` 路径族收敛(2026-09-16)、实体↔生产迁移漂移修复(V037,2026-09-16) |
| UAT / RC / Production | **UI 验收通过,前后端契约已收敛,Phase 08-12 已关闭** | 双端构建/契约/源码全部通过;UI 首批 11 页 2026-09-16 通过用户验收;`/me/*` 契约同轮收敛;Phase 08/09/10/11/12 复验通过并关闭,累计修复 16 处真实缺陷,可推进 Phase 13(**需用户确认后启动**) |
---
## 版本演进
| 版本 | 日期 | 说明 |
|------|------|------|
| 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 全绿 |
---
## 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 13A — 公益婚恋咨询与婚前辅导(核心链路)✅ 已完成
| 任务 | 状态 |
|------|------|
| V022 counseling_services + counseling_followups 迁移 | ✅ |
| CounselingServiceApp(Service/Controller/DTO) | ✅ |
| 用户端 API:intro / create / list / detail / cancel | ✅ |
| 后台 API:queue / assign / schedule / start / followup / complete / close | ✅ |
| INV-012 Counselor assigned scope 实现 | ✅ |
| Miniapp U55-U59 页面(咨询介绍/申请/我的/婚前辅导) | ✅ |
| app.json 路由注册 | ✅ |
| companionUserId 伴侣支持 | ✅ |
### 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`
### V1.1 待实现模块(按 Phase 顺序)
| 模块 | 对应 Phase | 状态 |
|------|-----------|------|
| Home Aggregate API + V1.1首页 | Phase 07 | ✅ 已完成 |
| Banner 管理(后端+前端) | Phase 19 | ⏳ 待开发 |
| 本地资格声明与审核 | Phase 04~05 | ⏳ 待开发 |
| 公益红娘服务转介 | Phase 13 | ✅ 已完成 |
| 婚恋咨询 + 婚前辅导(Phase 13A) | Phase 13A | ⏳ 待开发 |
| 内容管理(婚恋课堂/反诈) | 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 (需运营团队配合)