Просмотр исходного кода

test(tdd): 测试负责人轮 2026-11-04 15:30 — 3 RED 键仍待研发 mark-yellow;刷新共享台账(357ctrl/1940handler/2715用例);本轮未 re-run JUnit(无mvn)

E2E Test Bot 1 неделя назад
Родитель
Сommit
d618acb9be

+ 58 - 0
docs/tdd/test/automation-run-2026-11-04-1530.md

@@ -0,0 +1,58 @@
+# TDD 测试闭环巡检轮 · 2026-11-04 15:30(测试负责人2 · 自动化)
+
+> 触发:定时自动化(测试负责人2 角色)|技能:TDD 多智能体研发测试调度(发现/跟踪模式,CFC 仅启用)
+> 纪律:测试负责人仅本工作区执行测试、写/校验阶段、登记与处置阻塞;不派发 opencode 实现、不代写业务代码;未推送不算完成。
+
+## 一、同步与基线
+
+- `git fetch` + `git pull --ff-only origin/cfclub`:本地 `e69659445`(15:10 轮)前进至 `94a9843ae`(仅 `chore: auto bump version and changelog [skip ci]`,与 TDD 无关)。
+- 同步阻塞点:`cfc-web/package-lock.json` 有宿主本地改动(auto-bump 生成物,非源码),已 `git checkout --` 还原至已提交态后再 FF 合并;该还原与下次 auto-bump 行为一致,不影响源码。
+- 工作区其余 50+ 处未提交改动(cfc-frontend 本地改动 / untracked / 其他 automation-run-*.md 日志)均**非本轮产出**,未纳入提交。
+
+## 二、状态机盘点(本轮实测)
+
+| 阶段 | 键数 | 键 |
+|------|------|-----|
+| RED | 3 | `health.report.createReport`、`dan.assessment.getActiveMaterial`、`guide.trainingPlan.getPlanDetail` |
+| YELLOW | 0 | — |
+| GREEN | 0 | — |
+| DONE | 0 | — |
+
+- 三键自 11-02 / 11-04 入池以来**始终处于 RED**,**未推进至 YELLOW**:实现已存在于库且已推远端,但研发侧尚未执行 `--mark-yellow`(O-1 仍「待裁决」,remote 自 15:10 后仅 auto-bump,无任何 tracker 更新 → 研发未补登)。
+- 远程无可观测的「研发已 mark-yellow」信号(`state.json` 为本地私有、不入版本库,故只能通过 O-1/B-6/B-7 台账确认;本轮确认研发未补登)。
+
+## 三、测试侧闭环就绪证据(沿用 15:10 实证)
+
+- 三键契约级单测均已落地并推远端,本轮确认文件与 `@Test` 数量:
+  - `HealthReportControllerCreateReportTest.java`:5 例(commit `81d8883f7`)
+  - `DanAssessmentControllerGetActiveMaterialTest.java`:3 例(commit `faf3ca174`)
+  - `TrainingPlanControllerGetPlanDetailTest.java`:8 例(TR-1 交付,impl `0af81d688`)
+  - 合计 **16 `@Test`**,15:10 轮离线实跑 **16/16 全绿**。
+- **本轮未 re-run JUnit**:本环境 `mvn` 不可用(`command -v mvn` → NO MVN),且无本机后端;依技能纪律测试角色不派发 opencode,故沿用 15:10 实证,不新造「已测」结论。
+
+## 四、共享台账刷新(发现/跟踪)
+
+- `discover_tests.py`:控制器 357|handler 1940(覆盖 363)|测试文件 203(@Test 1529)|覆盖分布 covered=24 / partial=192 / uncovered=140 / no-handler=1。
+- `test_inventory.py`:结构化 729 + Playwright 410 + Python 47 + Java @Test 1529 + 场景 9 = **2715** 用例/方法。
+- 三键契约测试类均已写入 `automation-status.md` / `discovery.md`(本轮刷新确认)。
+- 注:`discovery.md` 仍把 `getPlanDetail` 列于 TrainingPlanController「未覆盖方法」,系 handler↔测试映射口径未将 GetPlanDetailTest 计入覆盖(测试文件已登记 8 例),属跟踪口径差异,非真实缺口。
+
+## 五、阻塞与协调(跨角色通道)
+
+| 编号 | 类型 | 状态 | 本轮处置 |
+|------|------|------|----------|
+| B-6 | 研发(health.report.createReport RED 停滞) | 待处理 | 措辞已于 15:10 更新;本轮复核:实跑证据仍在,仍待研发 `--mark-yellow` |
+| B-7 | 研发(dan.assessment.getActiveMaterial RED 停滞) | 待处理 | 同上 |
+| B-9 | 研发(guide.trainingPlan.getPlanDetail 鉴权缺口观察) | 待处理 | 不阻断 RED→YELLOW→GREEN,仅缺陷观察回写 |
+| O-1 | 主理人(3 RED 键缺 `--mark-yellow`,状态机停滞) | 待裁决 | 15:20 建;研发未补登,本轮维持「待裁决」 |
+
+## 六、结论与待办
+
+- **本轮结论:闭环仍停滞于 RED,阻断原因为研发侧未执行 `--mark-yellow`(非测试侧责任,亦非环境阻塞)**。测试侧契约单测已齐备且实证 16/16 全绿,只待研发补登 YELLOW 后测试侧 `--mark-green` 收口。
+- 待办(owner):① 研发负责人对三键执行 `--mark-yellow --commit <impl sha>`(health/dan impl 已在库;getPlanDetail `0af81d688`),随后测试侧复验 `--mark-green`;② 闭环脚本 `git add -f` 仅含测试产物,勿漏提交 `run_interface_tests_cron.sh` 类修复脚本(历史教训 11-04 08:45);③ 清理工作区 50+ 处既有未提交改动(宿主本地,非本轮)。
+- **未实测项**:本轮未 re-run JUnit(无 Maven,沿用 15:10 实证);远程无研发 mark-yellow 信号(仅在 O-1/B-6/B-7 台账确认未补登)。
+
+## 提交动作
+
+- 已 `git add` 且仅提交本轮测试负责人产出:`docs/tdd/test/automation-status.md`、`docs/tdd/test/discovery.md`、`docs/tdd/test/inventory.md`、`docs/tdd/test/automation-run-2026-11-04-1530.md`。
+- 不触碰其余 50+ 处无关未提交改动;`git push origin cfclub` 后 `ls-remote` 实证 LOCAL==origin/cfclub。

+ 7 - 2
docs/tdd/test/automation-status.md

@@ -23,8 +23,8 @@
 | 用户场景(md) | 9 | 0 | 0 | 9 | 9 | 0 | 0 | 0 | 0 |
 | Playwright(e2e/integration) | 70 | 410 | 70 | 0 | 60 | 0 | 7 | 3 | 0 |
 | Python(pytest) | 11 | 47 | 11 | 0 | 11 | 0 | 0 | 0 | 0 |
-| Java后端测试 | 198 | 1491 | 198 | 0 | 181 | 0 | 15 | 2 | 0 |
-| **合计** | — | **2677** | **279** | **738** | 990 | 0 | 22 | 5 | 0 |
+| Java后端测试 | 203 | 1529 | 203 | 0 | 186 | 0 | 15 | 2 | 0 |
+| **合计** | — | **2715** | **284** | **738** | 995 | 0 | 22 | 5 | 0 |
 
 ## 二、结构化测试用例自动化状态(`tests/test-cases/*.md`)
 
@@ -856,6 +856,7 @@
 | 来源 | 用例数 | 自动化状态 | 执行状态 | 目标类 |
 | --- | --- | --- | --- | --- |
 | `cfc-backend/src/test/java/com/etotem/cfc/common/AdminRolesTest.java` | 9 | 已自动化(@Test) | 通过 | AdminRoles |
+| `cfc-backend/src/test/java/com/etotem/cfc/common/ResultCodeFactoryTest.java` | 11 | 已自动化(@Test) | 未跟踪 | ResultCodeFactory |
 | `cfc-backend/src/test/java/com/etotem/cfc/common/TestRoles.java` | 0 | 已自动化(@Test) | 未跟踪 | TestRoles.java |
 | `cfc-backend/src/test/java/com/etotem/cfc/config/AttributionStage1FoundationTest.java` | 7 | 已自动化(@Test) | 通过 | AttributionStage1Foundation |
 | `cfc-backend/src/test/java/com/etotem/cfc/config/DatabaseInitializerSeedTest.java` | 6 | 已自动化(@Test) | 通过 | DatabaseInitializerSeed |
@@ -872,7 +873,10 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthReportControllerProxyParseBindingTest.java` | 6 | 已自动化(@Test) | 未跟踪 | HealthReportControllerProxyParseBinding |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/IndicatorControllerTest.java` | 2 | 已自动化(@Test) | 未跟踪 | IndicatorController |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/IndicatorFavoriteControllerTest.java` | 10 | 已自动化(@Test) | 未跟踪 | IndicatorFavoriteController |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminAuthControllerLoginStatusTest.java` | 10 | 已自动化(@Test) | 未跟踪 | AdminAuthControllerLoginStatus |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminAuthWechatScanTest.java` | 11 | 已自动化(@Test) | 未跟踪 | AdminAuthWechatScan |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminButlerControllerEnvelopeTest.java` | 4 | 已自动化(@Test) | 未跟踪 | AdminButlerControllerEnvelope |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminCommissionConfigControllerTest.java` | 5 | 已自动化(@Test) | 未跟踪 | AdminCommissionConfigController |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminProductControllerBatchShelveTest.java` | 4 | 已自动化(@Test) | 通过 | AdminProductControllerBatchShelve |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/ReportParserAdminControllerTest.java` | 3 | 已自动化(@Test) | 通过 | ReportParserAdminController |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/SupplyTeamControllerInviteTest.java` | 7 | 已自动化(@Test) | 未跟踪 | SupplyTeamControllerInvite |
@@ -882,6 +886,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/family/FamilyMembersControllerListTest.java` | 4 | 已自动化(@Test) | 未跟踪 | FamilyMembersControllerList |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/family/FamilyMembersControllerRenameFamilyTest.java` | 2 | 已自动化(@Test) | 未跟踪 | FamilyMembersControllerRenameFamily |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/guide/TeacherMessageControllerMyTest.java` | 1 | 已自动化(@Test) | 通过 | TeacherMessageControllerMy |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/guide/TrainingPlanControllerGetPlanDetailTest.java` | 8 | 已自动化(@Test) | 未跟踪 | TrainingPlanControllerGetPlanDetail |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/guide/TrainingPlanControllerGetPlanListTest.java` | 10 | 已自动化(@Test) | 通过 | TrainingPlanControllerGetPlanList |
 | `cfc-backend/src/test/java/com/etotem/cfc/dto/ActivityDTOTest.java` | 3 | 已自动化(@Test) | 未跟踪 | ActivityDTO |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/DailyCheckinStreakFlowTest.java` | 6 | 已自动化(@Test) | 未跟踪 | DailyCheckinStreakFlow |

+ 179 - 55
docs/tdd/test/discovery.md

@@ -9,93 +9,95 @@
 | --- | --- |
 | 控制器总数 | 357 |
 | handler 方法总数 | 1940 |
-| handler 方法已覆盖 | 214 (11.0%) |
-| 单元-全覆盖(handler 方法) | 16 |
-| 单元-部分覆盖(handler 方法) | 73 |
-| 单元-未覆盖(handler 方法) | 267 |
+| handler 方法已覆盖 | 363 (18.7%) |
+| 单元-全覆盖(handler 方法) | 24 |
+| 单元-部分覆盖(handler 方法) | 192 |
+| 单元-未覆盖(handler 方法) | 140 |
 | 单元-无handler 方法 | 1 |
-| 测试文件数 | 198 |
-| @Test 方法总数 | 1491 |
+| 测试文件数 | 203 |
+| @Test 方法总数 | 1529 |
 | 含跳过/假设项(test 级 partial) | 4 |
 
 ## 二、未覆盖控制器(发现「缺口」· 非发明)
 
 > 以下控制器在当前测试源中**没有任何handler 方法被命中**。这是真实扫描得到的覆盖缺口。
 
-共 267 个:
+共 140 个:
 
 - `AdminController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminController.java`,65 方法)
 - `DanAssessmentController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/DanAssessmentController.java`,29 方法)
-- `AdminArticleController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminArticleController.java`,22 方法)
-- `TaskController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/task/TaskController.java`,18 方法)
 - `AdminInventoryController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminInventoryController.java`,15 方法)
 - `FamilyInviteController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/family/FamilyInviteController.java`,15 方法)
 - `OrchestrationController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/OrchestrationController.java`,15 方法)
 - `KeyPersonController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/KeyPersonController.java`,14 方法)
-- `AdminCouponController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminCouponController.java`,12 方法)
-- `SupplySystemController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/SupplySystemController.java`,12 方法)
-- `BadgeController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/BadgeController.java`,11 方法)
 - `SupplyHierarchyController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/SupplyHierarchyController.java`,11 方法)
-- `TrainingPlanController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/guide/TrainingPlanController.java`,11 方法)
-- `ActivityTeamController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/ActivityTeamController.java`,10 方法)
 - `AdminGuideController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminGuideController.java`,10 方法)
-- `CouponController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/CouponController.java`,10 方法)
 - `GuideController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/guide/GuideController.java`,10 方法)
 - `ProcurementTaskController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/product/ProcurementTaskController.java`,10 方法)
 - `TaskTemplatePackageController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/TaskTemplatePackageController.java`,10 方法)
 - `TeacherController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/guide/TeacherController.java`,10 方法)
 - `UserController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/UserController.java`,10 方法)
-- `AdminButlerController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminButlerController.java`,9 方法)
-- `FileRecordController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/FileRecordController.java`,9 方法)
 - `GutHealthProjectController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/GutHealthProjectController.java`,9 方法)
-- `KnowledgeBaseController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/KnowledgeBaseController.java`,9 方法)
 - `MarketController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/MarketController.java`,9 方法)
 - `PearlController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/PearlController.java`,9 方法)
 - `PpointConfigAdminController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/PpointConfigAdminController.java`,9 方法)
-- `AdminActivityController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminActivityController.java`,8 方法)
 - `ArticleCommentController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/content/ArticleCommentController.java`,8 方法)
-- `ContactController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/ContactController.java`,8 方法)
-- `DanReportController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/DanReportController.java`,8 方法)
-- `FamilyChallengeController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/FamilyChallengeController.java`,8 方法)
 - `PurchaseController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/PurchaseController.java`,8 方法)
-- `SupplyManageController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/SupplyManageController.java`,8 方法)
 - `SysMenuController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/SysMenuController.java`,8 方法)
 - `TaskReminderController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/task/TaskReminderController.java`,8 方法)
 - `AdminDistributionController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminDistributionController.java`,7 方法)
-- `AdminOrgController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminOrgController.java`,7 方法)
-- `AdminProductOrderController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminProductOrderController.java`,7 方法)
-- `AdminUnlockGateController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminUnlockGateController.java`,7 方法)
 - `AssessmentAdminController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AssessmentAdminController.java`,7 方法)
 - `BeijingNutritionController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/nutrition/BeijingNutritionController.java`,7 方法)
-- `CartController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/cart/CartController.java`,7 方法)
 - `DanAssessmentExecutionController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/dan/DanAssessmentExecutionController.java`,7 方法)
-- `GrowthPlanController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/growth/GrowthPlanController.java`,7 方法)
-- `GuideActivityController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/guide/GuideActivityController.java`,7 方法)
 - `NutritionProductController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/nutrition/NutritionProductController.java`,7 方法)
 - `PlannerCertificationController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/planner/PlannerCertificationController.java`,7 方法)
 - `ShareController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/ShareController.java`,7 方法)
 - `StreetController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/StreetController.java`,7 方法)
 - `TianpanController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/tianpan/TianpanController.java`,7 方法)
 - `AdminCommissionController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminCommissionController.java`,6 方法)
-- `AdminEnergyRuleController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminEnergyRuleController.java`,6 方法)
-- `AdminFoodController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminFoodController.java`,6 方法)
-- `AdminHomeBannerController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminHomeBannerController.java`,6 方法)
-- `AdminNoticeController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminNoticeController.java`,6 方法)
-- `AdminPeriodicServiceController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminPeriodicServiceController.java`,6 方法)
-- `AdminPromotionTierController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminPromotionTierController.java`,6 方法)
-- `AdminSystemPromptController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminSystemPromptController.java`,6 方法)
-- …(其余 207 个见完整扫描)
+- `AssessmentAppointmentController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/assessment/AssessmentAppointmentController.java`,6 方法)
+- `ContactMatchController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/ContactMatchController.java`,6 方法)
+- `CouponGiftController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/CouponGiftController.java`,6 方法)
+- `DietIngredientController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/diet/DietIngredientController.java`,6 方法)
+- `FamilyEarningsController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/FamilyEarningsController.java`,6 方法)
+- `FamilyPlatformBalanceController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/FamilyPlatformBalanceController.java`,6 方法)
+- `MindFortuneController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/mind/MindFortuneController.java`,6 方法)
+- `PackagePaymentController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/PackagePaymentController.java`,6 方法)
+- `ProductDeliveryConfigController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/product/ProductDeliveryConfigController.java`,6 方法)
+- `RewardController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/reward/RewardController.java`,6 方法)
+- `ServiceRoleApplicationController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/ServiceRoleApplicationController.java`,6 方法)
+- `AdminCategoryController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminCategoryController.java`,5 方法)
+- `AssessmentReportController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/assessment/AssessmentReportController.java`,5 方法)
+- `DietRecommendationController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/diet/DietRecommendationController.java`,5 方法)
+- `FatGoalController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/fatloss/FatGoalController.java`,5 方法)
+- `GuideAssessmentController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/guide/GuideAssessmentController.java`,5 方法)
+- `KnowledgeBaseVectorController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/KnowledgeBaseVectorController.java`,5 方法)
+- `MealRecommendController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/MealRecommendController.java`,5 方法)
+- `MediaController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/MediaController.java`,5 方法)
+- `ParentController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/family/ParentController.java`,5 方法)
+- `PointsController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/family/PointsController.java`,5 方法)
+- `RecommendationStatsController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/recommendation/RecommendationStatsController.java`,5 方法)
+- `RelationshipQualityController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/family/RelationshipQualityController.java`,5 方法)
+- `RewardWishlistController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/reward/RewardWishlistController.java`,5 方法)
+- `AdminBodyFatScaleController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminBodyFatScaleController.java`,4 方法)
+- `AssessmentComparisonController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/assessment/AssessmentComparisonController.java`,4 方法)
+- `AttributionController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/AttributionController.java`,4 方法)
+- `DietRecordController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/diet/DietRecordController.java`,4 方法)
+- `DistributionInviteController`(`cfc-backend/src/main/java/com/etotem/cfc/controller/DistributionInviteController.java`,4 方法)
+- …(其余 80 个见完整扫描)
 
 ## 三、部分覆盖控制器(已做一部分测试)
 
 > 这些控制器**已有测试但只覆盖了部分handler 方法**——即用户要求的「已经做了一部分测试的情况,要能够找到」。
 
-共 73 个:
+共 192 个:
 
 - `HealthReportController`:覆盖 1/59,未覆盖方法:createReport、getLatestReport、listFamilyReports、listAllReports、getReportIndicatorsWithPrevious、listIndicators、getMemberIndicators、getGutFlora、rebuildIndicatorCurrent、getMemberIndicatorCurrent
-- `HealthKnowledgeBaseController`:覆盖 1/28,未覆盖方法:batchQuery、list、add、update、delete、importKnowledgeBase、queryBacteria、batchQueryBacteria、queryIndicator、queryFood
+- `HealthKnowledgeBaseController`:覆盖 2/28,未覆盖方法:batchQuery、add、update、delete、importKnowledgeBase、queryBacteria、batchQueryBacteria、queryIndicator、queryFood、getSection
+- `AdminArticleController`:覆盖 1/22,未覆盖方法:create、update、detail、delete、publishById、publish、backfillTags、toggleFeatured、move、audit
 - `ProductOrderController`:覆盖 7/19,未覆盖方法:myOrderCounts、vendorConfirm、reviewUpdate、ship、applyRefund、handlePaymentSuccess、notify、activityAudit、activitySignIn、activityComplete
 - `AuthController`:覆盖 14/18,未覆盖方法:setSwitchPassword、verifyToken、ssoTicket、ssoLogin
+- `TaskController`:覆盖 1/18,未覆盖方法:getMinigameOptions、createTask、getTodayTasks、completeTask、startTask、reviewTask、getTaskHistory、getPendingReviewTasks、getTodayParentTasks、completeParentTask
 - `FamilyUserController`:覆盖 1/17,未覆盖方法:getUserInfo、updateUserInfo、joinFamily、createFamily、switchMode、switchRole、switchToFamilyMember、switchBackToParent、switchBackVerify、createFamilyMember
 - `GuideManagementController`:覆盖 3/17,未覆盖方法:resubmitApplication、getUserApplications、getApplicationRecords、generateInviteCode、getInviteCodes、validateInviteCode、getChildGuides、getAllChildGuides、getParentGuide、getGuidePackageTemplates
 - `MembershipController`:覆盖 4/17,未覆盖方法:getAllLevels、getMyMembership、getUpgradeRecords、upgradeOrder、activateTrial、createOrder、continueOrder、getPricingPlans、getMembershipCompare、paymentNotify
@@ -103,68 +105,185 @@
 - `CircleController`:覆盖 1/16,未覆盖方法:myCircles、discover、join、leave、create、update、pendingMembers、approve、feed、multiFeed
 - `ReportParserAdminController`:覆盖 1/15,未覆盖方法:listTypes、toggleType、deleteType、listFingerprints、saveFingerprint、deleteFingerprint、listImports、uploadImport、approveImport、rejectImport
 - `ActivityController`:覆盖 6/13,未覆盖方法:submitReview、register、cancelRegistration、myRegistrations、registrationRoster、checkin、checkinReview
-- `CommissionController`:覆盖 1/13,未覆盖方法:list、team、stats、balance、teamList、funnel、teamConsumption、myReferrer、teamTree、teamGrowthCurve
+- `CommissionController`:覆盖 2/13,未覆盖方法:team、stats、balance、teamList、funnel、teamConsumption、myReferrer、teamTree、teamGrowthCurve、teamAllMembersConsumptionCurve
 - `GrowthRecordController`:覆盖 4/13,未覆盖方法:getRecordList、getChildRecords、getRecordDetail、deleteRecord、syncExternalResult、createFromUpload、createSupplement、checkDuplicate、getSupplements
-- `HealthPlanController`:覆盖 1/13,未覆盖方法:generate、regenerateSection、save、confirm、list、detail、planTasks、availableTeachers、listPendingReview、updatePlan
+- `HealthPlanController`:覆盖 2/13,未覆盖方法:generate、regenerateSection、save、confirm、detail、planTasks、availableTeachers、listPendingReview、updatePlan、approvePlan
+- `AdminCouponController`:覆盖 1/12,未覆盖方法:PreAuthorize、PreAuthorize、PreAuthorize、PreAuthorize、PreAuthorize、PreAuthorize、PreAuthorize、PreAuthorize、giftTransfers、PreAuthorize
 - `StatsController`:覆盖 4/12,未覆盖方法:getDashboardSummary、getRevenueStats、getMembershipStats、childOverview、familySummary、pointsRanking、getTrafficAnalytics、recordProductView
+- `SupplySystemController`:覆盖 1/12,未覆盖方法:create、update、detail、toggleStatus、listAll、getMySystem、getMyTeams、memberList、addMember、removeMember
 - `WishController`:覆盖 11/12,未覆盖方法:priceAlias
 - `AIChatController`:覆盖 8/11,未覆盖方法:reportAnalyze、deleteConversation、transcribe
+- `BadgeController`:覆盖 1/11,未覆盖方法:getAllBadges、getBadgeDetail、createBadge、updateBadge、deleteBadge、grantBadge、getMemberBadges、toggleFavorite、getMemberStats、getFamilyRanking
 - `PaymentController`:覆盖 5/11,未覆盖方法:createWechatNativePay、getPaymentStatus、getOAuth2Url、oauth2Callback、handleV3Notify、generateQrCode
-- `AdminAuthController`:覆盖 2/10,未覆盖方法:sendCode、login、getAdminInfo、changePassword、updateInfo、resetPassword、loginByPassword、accountRoles
-- `AdminVirtualTeamController`:覆盖 1/10,未覆盖方法:list、create、update、toggle、addMember、removeMember、updateMember、userTeams、tree
-- `FamilyMembersController`:覆盖 1/10,未覆盖方法:listMembers、switchToMember、kickMember、leaveFamily、recycleMember、updateMember、renameFamily、checkEditable、logs
+- `TrainingPlanController`:覆盖 1/11,未覆盖方法:getPlanDetail、createPlan、updatePlan、addItem、updateItem、deleteItem、generateFromRecommendations、deployPlan、getExecutionBoard、deletePlan
+- `ActivityTeamController`:覆盖 1/10,未覆盖方法:create、detail、memberList、addMember、removeMember、assign、assignList、revokeAssignment、teamActivities
+- `AdminAuthController`:覆盖 5/10,未覆盖方法:getAdminInfo、changePassword、updateInfo、resetPassword、accountRoles
+- `AdminVirtualTeamController`:覆盖 2/10,未覆盖方法:create、update、toggle、addMember、removeMember、updateMember、userTeams、tree
+- `CouponController`:覆盖 1/10,未覆盖方法:claim、apply、exchange、exchangeable、productCoupons、checkoutList、joinRules、availableTemplates、my
+- `FamilyMembersController`:覆盖 2/10,未覆盖方法:switchToMember、kickMember、leaveFamily、recycleMember、updateMember、renameFamily、checkEditable、logs
 - `GuideFamilyTaskController`:覆盖 8/10,未覆盖方法:unbindFamily、getDashboardStats
 - `SubscriptionController`:覆盖 1/10,未覆盖方法:getPlans、createOrder、subscribe、cancel、setAutoRenew、getMyBenefits、checkBenefit、getTier、updateTier
-- `AdminProductController`:覆盖 1/9,未覆盖方法:list、review、shelve、detail、create、update、copy、delete
+- `AdminButlerController`:覆盖 4/9,未覆盖方法:review、assignMember、assignments、unassign、toggleAccepting
+- `AdminProductController`:覆盖 2/9,未覆盖方法:review、shelve、detail、create、update、copy、delete
 - `EnergyController`:覆盖 5/9,未覆盖方法:configureSourceRatios、getScoreHistory、getFamilyScoreHistory、getWealthDetail
+- `FileRecordController`:覆盖 1/9,未覆盖方法:upload、update、deleteFile、getTags、tagCreate、tagUpdate、tagDelete、stats
 - `FiveDimensionSelfCheckController`:覆盖 3/9,未覆盖方法:submit、getHistory、ignoreSelfCheck、generatePlan、getTrendAnalysis、aiGenerateQuestions
+- `KnowledgeBaseController`:覆盖 1/9,未覆盖方法:backfillTags、get、save、delete、bindDimensions、bindTags、uploadFile、fetchUrl
 - `ProductController`:覆盖 6/9,未覆盖方法:updateImages、specMap、relatedProducts
+- `AdminActivityController`:覆盖 1/8,未覆盖方法:review、detail、submitReview、audit、backfillTags、withdraw、reDraft
 - `CognitiveController`:覆盖 1/8,未覆盖方法:getChildCognitiveScores、getFamilyCognitiveScores、updateCognitiveScore、getRecommendations、createTaskFromRecommendation、getNorms、submitSelfTest
+- `ContactController`:覆盖 1/8,未覆盖方法:create、update、delete、detail、importPhone、interaction、inviteToFamily
+- `DanReportController`:覆盖 1/8,未覆盖方法:upload、edit、confirm、discard、completeAnalysis、detail、compare
+- `FamilyChallengeController`:覆盖 1/8,未覆盖方法:getHistory、updateProgress、respondChallenge、getTemplates、createChallenge、updateChallenge、deleteChallenge
 - `GuideTeamController`:覆盖 6/8,未覆盖方法:checkStatus、leaveTeam
+- `SupplyManageController`:覆盖 1/8,未覆盖方法:detail、create、update、delete、addRole、removeRole、adjustTier
+- `AdminOrgController`:覆盖 1/7,未覆盖方法:create、update、disable、detail、myOrg、userSearch
+- `AdminProductOrderController`:覆盖 1/7,未覆盖方法:detail、ship、updateExpress、close、approveRefund、rejectRefund
+- `AdminUnlockGateController`:覆盖 1/7,未覆盖方法:save、delete、sort、toggle、resetFamily、getFamilyProgress
+- `CartController`:覆盖 1/7,未覆盖方法:add、update、remove、count、comboOffer、replaceCombo
 - `DoaController`:覆盖 1/7,未覆盖方法:createStage、stageDetail、cancelStage、submitPlan、submitReview、weekList
-- `EmotionCheckinController`:覆盖 2/7,未覆盖方法:create、list、stats、weeklyReport、recognizeEmotion
+- `EmotionCheckinController`:覆盖 3/7,未覆盖方法:create、stats、weeklyReport、recognizeEmotion
+- `GrowthPlanController`:覆盖 1/7,未覆盖方法:createPlan、getChildPlans、getActivePlan、getPlanDetail、updatePlan、reviewPlan
+- `GuideActivityController`:覆盖 1/7,未覆盖方法:getActivityDetail、createActivity、updateActivity、publishActivity、cancelActivity、deleteActivity
 - `SupplyTeamController`:覆盖 1/7,未覆盖方法:listCustomers、bindCustomer、getRelation、getInviteCode、getInviteInfo、joinByInviteCode
 - `AdminEnergyConfigController`:覆盖 1/6,未覆盖方法:sourceList、sourceSave、sourceDelete、dailyLimits、dailyLimitSave
-- `AdminGuidePopupController`:覆盖 1/6,未覆盖方法:list、create、update、delete、stats
+- `AdminEnergyRuleController`:覆盖 1/6,未覆盖方法:create、update、delete、toggle、dimensions
+- `AdminFoodController`:覆盖 1/6,未覆盖方法:create、update、delete、detail、saveMonths
+- `AdminGuidePopupController`:覆盖 2/6,未覆盖方法:create、update、delete、stats
+- `AdminHomeBannerController`:覆盖 1/6,未覆盖方法:save、delete、batchDelete、toggle、updateSort
+- `AdminNoticeController`:覆盖 1/6,未覆盖方法:all、create、update、delete、pin
+- `AdminPeriodicServiceController`:覆盖 1/6,未覆盖方法:detail、create、update、delete、toggle
 - `AdminPlannerExamController`:覆盖 1/6,未覆盖方法:papers、createPaper、updatePaper、deletePaper、saveQuestions
-- `AdminSpecialPriceController`:覆盖 4/6,未覆盖方法:list、update
+- `AdminPromotionTierController`:覆盖 1/6,未覆盖方法:get、save、delete、evaluateAll、getUserTier
+- `AdminSpecialPriceController`:覆盖 5/6,未覆盖方法:update
+- `AdminSystemPromptController`:覆盖 1/6,未覆盖方法:save、reset、delete、listVersions、rollback
 - `ButlerController`:覆盖 1/6,未覆盖方法:apply、getProfile、updateProfile、getServiceRecords、getCommissions
 - `CfBalanceController`:覆盖 3/6,未覆盖方法:stats、familySummary、promotionEarnings
+- `ContentSectionController`:覆盖 1/6,未覆盖方法:getVisibleSections、getDetail、create、update、delete
 - `FoodRecommendController`:覆盖 2/6,未覆盖方法:getIndex、getHistory、getByFamily、getCautionFoods
+- `IndicatorAdminController`:覆盖 1/6,未覆盖方法:create、update、delete、listValues、backfill
 - `IndicatorController`:覆盖 2/6,未覆盖方法:quickLookup、sourceTypes、periods、correlationList
+- `InsurancePolicyController`:覆盖 1/6,未覆盖方法:detail、create、update、delete、upload
+- `PackageTemplateController`:覆盖 1/6,未覆盖方法:Operation、Operation、Operation、Operation、Operation
+- `PromotionMaterialController`:覆盖 1/6,未覆盖方法:detail、byScenario、create、update、delete
+- `ReportTemplateController`:覆盖 1/6,未覆盖方法:get、save、delete、toggle、indicators
+- `ServiceContentController`:覆盖 1/6,未覆盖方法:Operation、Operation、Operation、Operation、Operation
+- `ServiceTypeController`:覆盖 1/6,未覆盖方法:Operation、Operation、Operation、Operation、Operation
+- `SupplierProductController`:覆盖 1/6,未覆盖方法:create、update、detail、delete、shelve
+- `UserAddressController`:覆盖 1/6,未覆盖方法:get、create、update、delete、setDefault
 - `ActivityOrderController`:覆盖 1/5,未覆盖方法:create、pay、handlePaymentSuccess、notify
-- `AdminCommissionConfigController`:覆盖 1/5,未覆盖方法:getConfig、updateConfig、settle、refund
+- `AdminCommissionConfigController`:覆盖 2/5,未覆盖方法:getConfig、settle、refund
+- `AdminDiscountController`:覆盖 1/5,未覆盖方法:create、update、toggle、delete
 - `AdminOrgStatsController`:覆盖 2/5,未覆盖方法:families、active、revenue
+- `AdminPlannerCertificationController`:覆盖 1/5,未覆盖方法:syncHours、batchSyncHours、initByUser、backfill
 - `DailyCheckinController`:覆盖 4/5,未覆盖方法:detail
+- `DimensionConfigController`:覆盖 1/5,未覆盖方法:get、save、delete、tree
+- `EcomSupplierController`:覆盖 1/5,未覆盖方法:all、save、update、delete
 - `GameRecordController`:覆盖 1/5,未覆盖方法:getHistory、getBestScores、getStats、getLeaderboard
+- `HealthCircleController`:覆盖 1/5,未覆盖方法:create、join、leave、ranking
 - `HealthDimensionController`:覆盖 4/5,未覆盖方法:radarData
-- `HealthMealController`:覆盖 1/5,未覆盖方法:list、daily、weekly、alerts
-- `InviteController`:覆盖 2/5,未覆盖方法:bind、list、getQrCode
+- `HealthGrowthRecordController`:覆盖 1/5,未覆盖方法:detail、create、update、delete
+- `HealthMealController`:覆盖 2/5,未覆盖方法:daily、weekly、alerts
+- `InviteController`:覆盖 3/5,未覆盖方法:bind、getQrCode
 - `MbtiController`:覆盖 2/5,未覆盖方法:submit、profile、history
+- `MiniGameController`:覆盖 1/5,未覆盖方法:getGameByCode、getAllGames、updateStatus、completeGame
 - `PointsExchangeController`:覆盖 1/5,未覆盖方法:getProductList、getProductDetail、exchangeProduct、getExchangeStats
+- `ProductSkuController`:覆盖 1/5,未覆盖方法:get、create、update、delete
+- `RecommendationRuleAdminController`:覆盖 1/5,未覆盖方法:create、update、delete、batchEnable
+- `ReportMemberPermissionController`:覆盖 1/5,未覆盖方法:listByMember、grant、revoke、visibleMembers
+- `SupplySettlementController`:覆盖 1/5,未覆盖方法:detail、detailItems、create、confirm
 - `SurveyController`:覆盖 1/5,未覆盖方法:activeTemplates、confirmQuestions、submit、history
 - `TeacherFamilyBindingController`:覆盖 1/5,未覆盖方法:approve、reject、myRequests、cancel
+- `TeacherMessageController`:覆盖 1/5,未覆盖方法:sendMessage、replyMessage、getUnreadCount、getMyMessages
+- `AdminActivityCheckinController`:覆盖 1/4,未覆盖方法:export、add、review
+- `AdminAfterSalesController`:覆盖 1/4,未覆盖方法:detail、review、complete
+- `AdminCfEarnRuleController`:覆盖 1/4,未覆盖方法:save、toggle、history
+- `AdminEnergyBehaviorConfigController`:覆盖 1/4,未覆盖方法:detail、update、toggle
+- `AdminOrgMemberController`:覆盖 1/4,未覆盖方法:addMember、removeMember、changeType
+- `AdminPlannerCertCategoryController`:覆盖 1/4,未覆盖方法:create、update、delete
+- `AdminPlannerCourseController`:覆盖 1/4,未覆盖方法:create、update、delete
+- `AdminPlannerOfflineCourseController`:覆盖 1/4,未覆盖方法:create、update、delete
+- `AdminProductPpointController`:覆盖 1/4,未覆盖方法:save、delete、byProduct
+- `AdminRecipeController`:覆盖 1/4,未覆盖方法:create、update、delete
+- `AdminSettlementController`:覆盖 1/4,未覆盖方法:detail、confirm、stats
+- `AdminSubscriptionController`:覆盖 1/4,未覆盖方法:cancelSubscription、activateSubscription、getBenefitConfig
+- `AdminSupplierController`:覆盖 1/4,未覆盖方法:save、update、delete
+- `AdminSurveyController`:覆盖 1/4,未覆盖方法:save、delete、aiGenerate
 - `AdminUnifiedKnowledgeController`:覆盖 1/4,未覆盖方法:section、update、reset
+- `BaziConfigController`:覆盖 1/4,未覆盖方法:create、update、delete
+- `BloodTypeConfigController`:覆盖 1/4,未覆盖方法:create、update、delete
 - `ConsentController`:覆盖 2/4,未覆盖方法:withdrawConsent、checkConsent
+- `ConsigneeController`:覆盖 1/4,未覆盖方法:detail、save、delete
+- `FamilyMetricAggConfigController`:覆盖 1/4,未覆盖方法:save、delete、updateStatus
+- `FatDietController`:覆盖 1/4,未覆盖方法:create、delete、caloriesSummary
+- `FatWeightController`:覆盖 1/4,未覆盖方法:create、update、delete
+- `FinanceCheckinController`:覆盖 1/4,未覆盖方法:stats、create、delete
+- `HealthCheckinController`:覆盖 1/4,未覆盖方法:create、delete、stats
+- `MbtiProfileController`:覆盖 1/4,未覆盖方法:save、delete、seed
+- `MicroActionController`:覆盖 1/4,未覆盖方法:today、complete、checkToday
+- `NumSoulDetailConfigController`:覆盖 1/4,未覆盖方法:create、update、delete
 - `OctopusController`:覆盖 1/4,未覆盖方法:tentacles、addHelpLog、deleteHelpLog
 - `ParentAssessmentController`:覆盖 2/4,未覆盖方法:createAssessment、completeAssessment
-- `AdminHealthPlanController`:覆盖 1/3,未覆盖方法:list、detail
+- `ZodiacConfigController`:覆盖 1/4,未覆盖方法:create、update、delete
+- `ActivityFeedbackController`:覆盖 1/3,未覆盖方法:submit、my
+- `ActivityMaterialController`:覆盖 1/3,未覆盖方法:upload、delete
+- `AdminCfRateTierController`:覆盖 1/3,未覆盖方法:save、delete
+- `AdminHealthPlanController`:覆盖 2/3,未覆盖方法:detail
+- `AdminNotificationTemplateController`:覆盖 1/3,未覆盖方法:save、delete
 - `AdminPackageController`:覆盖 1/3,未覆盖方法:approvePackage、rejectPackage
+- `AdminPlanRuleController`:覆盖 1/3,未覆盖方法:save、delete
+- `AdminPosterTemplateController`:覆盖 1/3,未覆盖方法:save、delete
+- `AdminProblemDomainController`:覆盖 1/3,未覆盖方法:save、delete
+- `AdminPurchaseFieldController`:覆盖 1/3,未覆盖方法:predefined、save
+- `AdminSeasonalController`:覆盖 1/3,未覆盖方法:create、delete
+- `AdminServiceConfigController`:覆盖 1/3,未覆盖方法:save、invalidate
+- `AfterSalesController`:覆盖 1/3,未覆盖方法:create、detail
 - `BindInviteController`:覆盖 2/3,未覆盖方法:confirmBind
-- `CfCommissionController`:覆盖 1/3,未覆盖方法:rate、list
+- `CfCommissionController`:覆盖 2/3,未覆盖方法:rate
+- `CommissionDistController`:覆盖 1/3,未覆盖方法:userLogs、userTotal
+- `ContentDimensionThresholdController`:覆盖 1/3,未覆盖方法:batchSave、delete
+- `FatExerciseController`:覆盖 1/3,未覆盖方法:create、delete
+- `GrowthTaskController`:覆盖 1/3,未覆盖方法:claim、acceptDynamic
+- `GuideOrderController`:覆盖 1/3,未覆盖方法:Operation、Operation
+- `GuidePopupController`:覆盖 1/3,未覆盖方法:trigger、consume
+- `HealthExerciseController`:覆盖 1/3,未覆盖方法:create、syncWechatSteps
+- `IndicatorCorrelationAdminController`:覆盖 1/3,未覆盖方法:save、calibrate
+- `InnatePortraitConfigController`:覆盖 1/3,未覆盖方法:update、invalidate
+- `InteractionLogController`:覆盖 1/3,未覆盖方法:addInteraction、getInteractionTypes
+- `KnowledgeTagController`:覆盖 1/3,未覆盖方法:save、delete
 - `ManualDimensionScoreController`:覆盖 1/3,未覆盖方法:submit、history
+- `ReportParseAdminController`:覆盖 1/3,未覆盖方法:retry、backfillFood
+- `ReportSummaryController`:覆盖 1/3,未覆盖方法:detail、download
 - `ReportSurveyController`:覆盖 1/3,未覆盖方法:createSurvey、submitSurvey
 - `ReviewController`:覆盖 1/3,未覆盖方法:getReviewOrderDetail、getReviewStatus
 - `ScreeningController`:覆盖 1/3,未覆盖方法:submit、history
+- `SysConfigController`:覆盖 1/3,未覆盖方法:update、getAllAsMap
 - `VendorController`:覆盖 1/3,未覆盖方法:apply、getVendorInfo
+- `VirtualGoodsConfigAdminController`:覆盖 1/3,未覆盖方法:save、delete
+- `AdminChallengeScoreConfigController`:覆盖 1/2,未覆盖方法:update
+- `AdminProductConfigController`:覆盖 1/2,未覆盖方法:ResponseStatus
+- `AdminProductGiftController`:覆盖 1/2,未覆盖方法:save
+- `AdminProductGiftRuleController`:覆盖 1/2,未覆盖方法:save
 - `AdminProfileController`:覆盖 1/2,未覆盖方法:getProfile
+- `AdminVendorController`:覆盖 1/2,未覆盖方法:review
 - `BasicQuotaController`:覆盖 1/2,未覆盖方法:getAllQuotaStatus
+- `CfTransferController`:覆盖 1/2,未覆盖方法:send
+- `CircleChallengeController`:覆盖 1/2,未覆盖方法:getHistory
+- `DimensionWeightController`:覆盖 1/2,未覆盖方法:save
 - `EmiReportController`:覆盖 1/2,未覆盖方法:getFamilyLatestReports
-- `HealthWaterController`:覆盖 1/2,未覆盖方法:list
+- `HealthAlertController`:覆盖 1/2,未覆盖方法:dismiss
+- `HealthMeditationController`:覆盖 1/2,未覆盖方法:create
+- `HealthSleepController`:覆盖 1/2,未覆盖方法:create
+- `IndicatorMappingAdminController`:覆盖 1/2,未覆盖方法:importSeeds
+- `InviteMilestoneController`:覆盖 1/2,未覆盖方法:claim
 - `NutritionistController`:覆盖 1/2,未覆盖方法:apply
 - `ProblemSurveyController`:覆盖 1/2,未覆盖方法:submit
 - `ProductCategoryController`:覆盖 1/2,未覆盖方法:tree
 - `PromotionCommissionController`:覆盖 1/2,未覆盖方法:getFamilyTotal
+- `RecommendController`:覆盖 1/2,未覆盖方法:track
+- `ReportSummaryAdminController`:覆盖 1/2,未覆盖方法:sync
+- `SystemPromptPublicController`:覆盖 1/2,未覆盖方法:get
+- `UserNotificationController`:覆盖 1/2,未覆盖方法:read
 
 ## 四、测试清单(格式化已有测试)
 
@@ -210,8 +329,10 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/DataMigrationServiceTest.java` | com | 11 | 5 | 0 | DataMigrationController | skip×1、⚠部分 |
 | `cfc-backend/src/test/java/com/etotem/cfc/config/FamilyAccessInterceptorTest.java` | com | 11 | 0 | 0 | FamilyController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/PdfParseServiceTest.java` | com | 11 | 0 | 0 | — | — |
-| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/ActivityAdminServiceTest.java` | com | 10 | 9 | 0 | ActivityController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/common/ResultCodeFactoryTest.java` | com | 11 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/integration/service/ActivityAdminServiceTest.java` | com | 10 | 10 | 0 | ActivityController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/ActivityAuditTest.java` | com | 10 | 4 | 0 | ActivityController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminAuthControllerLoginStatusTest.java` | com | 10 | 1 | 3 | AdminAuthController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/ComboServiceTest.java` | com | 10 | 3 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/GrowthRecordSyncFlowTest.java` | com | 10 | 9 | 4 | GrowthController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/GuideHierarchyServiceTest.java` | com | 10 | 0 | 0 | GuideController | — |
@@ -244,6 +365,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/orchestration/OrchestrationEngineTest.java` | com | 8 | 0 | 0 | OrchestrationController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/ProductOrderServiceSpecialDealTest.java` | com | 8 | 1 | 0 | ProductController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/RealNameBackfillServiceTest.java` | com | 8 | 0 | 0 | — | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/guide/TrainingPlanControllerGetPlanDetailTest.java` | com | 8 | 0 | 0 | TrainingPlanController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/config/AttributionStage1FoundationTest.java` | com | 7 | 11 | 0 | AttributionController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/EnergySystemFlowTest.java` | com | 7 | 22 | 5 | EnergyController | skip×1、⚠部分 |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyMemberDimensionBaseScoreServiceTest.java` | com | 7 | 10 | 0 | FamilyController | — |
@@ -279,6 +401,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/util/UserUtilTest.java` | com | 6 | 0 | 0 | UserController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/WithdrawalServiceTest.java` | com | 6 | 0 | 0 | WithdrawalController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/ActivityTagServiceTest.java` | com | 5 | 1 | 0 | ActivityController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminCommissionConfigControllerTest.java` | com | 5 | 0 | 1 | AdminCommissionConfigController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/AttributionAdjustServiceTest.java` | com | 5 | 3 | 0 | AttributionController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/CartReplaceComboTest.java` | com | 5 | 0 | 0 | CartController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/CfLegacyLedgerWiringTest.java` | com | 5 | 0 | 0 | — | — |
@@ -299,6 +422,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/TaskServiceMinigameTest.java` | com | 5 | 0 | 0 | TaskController | skip×1、⚠部分 |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/UserServiceEffectiveFamilyIdsTest.java` | com | 5 | 0 | 0 | UserController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/task/VirtualPayTimeoutTaskTest.java` | com | 5 | 0 | 0 | VirtualPayController | — |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminButlerControllerEnvelopeTest.java` | com | 4 | 8 | 4 | AdminButlerController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminProductControllerBatchShelveTest.java` | com | 4 | 1 | 1 | AdminController | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/service/impl/CfGrowthEarnCallSiteTest.java` | com | 4 | 1 | 0 | — | — |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/service/ChallengeScoreServiceTest.java` | com | 4 | 0 | 0 | — | — |

+ 7 - 2
docs/tdd/test/inventory.md

@@ -11,9 +11,9 @@
 | 结构化测试用例(md) | 9 | 729 |
 | Playwright(spec.js) | 70 | 410 |
 | Python(pytest) | 11 | 47 |
-| Java后端(测试文件) | 198 | 1491 (@Test) |
+| Java后端(测试文件) | 203 | 1529 (@Test) |
 | 用户场景(md) | 9 | 文件级 |
-| **合计** | — | **2677** 用例/方法 |
+| **合计** | — | **2715** 用例/方法 |
 
 ## 二、结构化测试用例(`tests/test-cases/*.md`)
 
@@ -851,6 +851,7 @@
 | 测试文件 | 类型 | @Test数 | 目标类 | 来源 |
 | --- | --- | --- | --- | --- |
 | `cfc-backend/src/test/java/com/etotem/cfc/common/AdminRolesTest.java` | cfc-backend | 9 | AdminRoles | `cfc-backend/src/test/java/com/etotem/cfc/common/AdminRolesTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/common/ResultCodeFactoryTest.java` | cfc-backend | 11 | ResultCodeFactory | `cfc-backend/src/test/java/com/etotem/cfc/common/ResultCodeFactoryTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/common/TestRoles.java` | cfc-backend | 0 | TestRoles.java | `cfc-backend/src/test/java/com/etotem/cfc/common/TestRoles.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/config/AttributionStage1FoundationTest.java` | cfc-backend | 7 | AttributionStage1Foundation | `cfc-backend/src/test/java/com/etotem/cfc/config/AttributionStage1FoundationTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/config/DatabaseInitializerSeedTest.java` | cfc-backend | 6 | DatabaseInitializerSeed | `cfc-backend/src/test/java/com/etotem/cfc/config/DatabaseInitializerSeedTest.java` |
@@ -867,7 +868,10 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthReportControllerProxyParseBindingTest.java` | cfc-backend | 6 | HealthReportControllerProxyParseBinding | `cfc-backend/src/test/java/com/etotem/cfc/controller/HealthReportControllerProxyParseBindingTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/IndicatorControllerTest.java` | cfc-backend | 2 | IndicatorController | `cfc-backend/src/test/java/com/etotem/cfc/controller/IndicatorControllerTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/IndicatorFavoriteControllerTest.java` | cfc-backend | 10 | IndicatorFavoriteController | `cfc-backend/src/test/java/com/etotem/cfc/controller/IndicatorFavoriteControllerTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminAuthControllerLoginStatusTest.java` | cfc-backend | 10 | AdminAuthControllerLoginStatus | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminAuthControllerLoginStatusTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminAuthWechatScanTest.java` | cfc-backend | 11 | AdminAuthWechatScan | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminAuthWechatScanTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminButlerControllerEnvelopeTest.java` | cfc-backend | 4 | AdminButlerControllerEnvelope | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminButlerControllerEnvelopeTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminCommissionConfigControllerTest.java` | cfc-backend | 5 | AdminCommissionConfigController | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminCommissionConfigControllerTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminProductControllerBatchShelveTest.java` | cfc-backend | 4 | AdminProductControllerBatchShelve | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/AdminProductControllerBatchShelveTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/ReportParserAdminControllerTest.java` | cfc-backend | 3 | ReportParserAdminController | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/ReportParserAdminControllerTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/SupplyTeamControllerInviteTest.java` | cfc-backend | 7 | SupplyTeamControllerInvite | `cfc-backend/src/test/java/com/etotem/cfc/controller/admin/SupplyTeamControllerInviteTest.java` |
@@ -877,6 +881,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/family/FamilyMembersControllerListTest.java` | cfc-backend | 4 | FamilyMembersControllerList | `cfc-backend/src/test/java/com/etotem/cfc/controller/family/FamilyMembersControllerListTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/family/FamilyMembersControllerRenameFamilyTest.java` | cfc-backend | 2 | FamilyMembersControllerRenameFamily | `cfc-backend/src/test/java/com/etotem/cfc/controller/family/FamilyMembersControllerRenameFamilyTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/guide/TeacherMessageControllerMyTest.java` | cfc-backend | 1 | TeacherMessageControllerMy | `cfc-backend/src/test/java/com/etotem/cfc/controller/guide/TeacherMessageControllerMyTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/controller/guide/TrainingPlanControllerGetPlanDetailTest.java` | cfc-backend | 8 | TrainingPlanControllerGetPlanDetail | `cfc-backend/src/test/java/com/etotem/cfc/controller/guide/TrainingPlanControllerGetPlanDetailTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/controller/guide/TrainingPlanControllerGetPlanListTest.java` | cfc-backend | 10 | TrainingPlanControllerGetPlanList | `cfc-backend/src/test/java/com/etotem/cfc/controller/guide/TrainingPlanControllerGetPlanListTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/dto/ActivityDTOTest.java` | cfc-backend | 3 | ActivityDTO | `cfc-backend/src/test/java/com/etotem/cfc/dto/ActivityDTOTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/integration/DailyCheckinStreakFlowTest.java` | cfc-backend | 6 | DailyCheckinStreakFlow | `cfc-backend/src/test/java/com/etotem/cfc/integration/DailyCheckinStreakFlowTest.java` |