diff --git a/docs/STATUS.md b/docs/STATUS.md index 212812d..66e6a72 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -4,6 +4,8 @@ > 维护规则:æ¯�完整完æˆ�一个需求,**倒åº�åœ¨æœ¬æ–‡é¡¶éƒ¨åŠ ä¸€æ�¡**(日期 + 主题 + 关键事实);其余主文档(架构 / 规划 / 技术债 / 部署)维护å�„自的"当å‰�有效说法",本文å�ªè®°å½•"什么时候å�šåˆ°äº†å“ªä¸€æ¥"。维护规则出处è§�æ ¹ç›®å½• [AGENTS.md](../AGENTS.md)。 > 早期æ�¡ç›®ï¼ˆ2026-09-17 之å‰�)已精简为锚点,完整æµ�æ°´è§� [archive/2026-09_governance_batches.md](archive/2026-09_governance_batches.md) 与 [archive/2026-09_status_history.md](archive/2026-09_status_history.md)。 +> 2026-09-24(**D17 Human-in-Loop è€�师傅ç»�验å��馈批 3 上线(å‰�端按钮 + Dialog + ç»�éªŒè§’æ ‡ï¼‰â€”â€”é—环å�¯è§†**:①[ResultView.vue:35-47](frontend/src/modules/moldinsight/ResultView.vue#L35-L47) 方案å�¡ç‰‡ summary-header åŠ `t-tag theme="success" variant="light"` ç»�éªŒè§’æ ‡ï¼ˆ"📚 历å�²ç»�验 N æ�¡"),从 `hintsByAxis[currentAxisHint]` 读å�–,按 scheme_axis ç´¢å¼•ï¼Œæ— hints æ—¶ä¸�渲染;② [ResultView.vue:131-138](frontend/src/modules/moldinsight/ResultView.vue#L131-L138) `export-buttons-bar` åŠ `ðŸ‘� è€�师傅å��馈` 按钮(`v-if="canGiveFeedback"` 角色门控:admin 或 process_engineer);③ 新建 [components/HumanFeedbackDialog.vue](frontend/src/modules/moldinsight/components/HumanFeedbackDialog.vue):t-dialog + t-form + t-radio-group 三选一(采纳 / 建议调整 / æ‹’ç»�)+ t-textarea åŽŸå› + 调整建议(仅 adjust 模å¼�显éš�);æ��交走 `moldinsightApi.submitExperienceFeedback`,æˆ�功å�Ž emit `submitted` 让父组件é‡�拉 hints åˆ·æ–°è§’æ ‡ï¼›â‘£ [shared/api-client.ts:407-444](frontend/src/shared/api-client.ts#L407-L444) `moldinsightApi` 新增 `getExperienceHints` / `submitExperienceFeedback` 两个方法(生æˆ�类型由 openapi-typescript 自动产出);⑤ [ResultView.vue](frontend/src/modules/moldinsight/ResultView.vue) `onMounted` è°ƒ `loadExperienceHints` 拉一次 + å��馈æ��交å�Ž `onFeedbackSubmitted` å†�拉一次(写入å�³æ¶ˆè´¹å‰�端å�¯è§�);`canGiveFeedback` èµ° `is_superuser || roles å�« process_engineer` 表达å¼�(项目硬规则"å‰�端ä¸�è¦�ç ´å�� ResultView.vue 视觉一致性":按钮与既有 6 个 t-button å�Œä¸€ `export-buttons-bar`,theme/size ä¸€è‡´ï¼›è§’æ ‡ theme="success" variant="light" 与既有 t-tag theme="primary" / "warning" å�Œæ¬¾ï¼‰ã€‚**接å�£å�˜æ›´ä¸‰ä»¶å¥—éš�批完æˆ�**:openapi.json é‡�导出(2 个新 path,å�« ExperienceFeedbackCreate / ExperienceHintItem / ExperienceHintsResponse 三个新 schema)→ `npm run gen:api` å†�生 types/api.ts → `npm run build` 通过。**å�Žç«¯åŸºçº¿**:**192 passed, 13 skipped**(批 3 ä¸�改å�Žç«¯ï¼‰ï¼›**å‰�端构建**:vue-tsc + vite 通过,ResultView 包大å°� 37.18 kB / 11.91 kB gzip。**D17 é—环端到端å�¯ç”¨**:admin / process_engineer 在 ResultView 点"ðŸ‘� è€�师傅å��馈" → Dialog 选"采纳"+ å†™åŽŸå› â†’ æ��交 → è§’æ ‡å�³æ—¶åˆ·æ–°ï¼ˆé‡�拉 hints);下次å�ŒæŒ‡çº¹ STP 分æž�,`PartingCandidateGenerator` 候选方å�‘åŠ æˆ� + `PartingSchemeScorer` total_score åŠ æˆ� + method æ ‡ç¾å�‡çº§ `human_experience_primary`。**下一æ¥**:批 4(衰å‡�机制完善 + DFM 规则库独立模å�—化 + ç»�验冲çª�仲è£� UI)按需排期。) + > 2026-09-23(**D17 Human-in-Loop è€�师傅ç»�验å��馈批 2 上线(算法接ç¼� + OCC payload 通é�“)——é—环通**:①算法层 4 ä¸ªæ ¸å¿ƒæ–‡ä»¶åŠ `hints` å½¢å�‚é€�ä¼ é“¾ï¼š[parting_candidate_generator.py:13-66](src/moldinsight/core/parting_candidate_generator.py#L13-L66) `_build_axis_metrics` 末尾按 hints åŠ æˆ�(`weight × 20` 上é™�,`sample_count ≥ 2 + weight ≥ 0.5` → method æ ‡ç¾å�‡çº§ `human_experience_primary`);[parting_scheme_scorer.py:8-46](src/moldinsight/core/parting_scheme_scorer.py#L8-L46) `_score_scheme` 新增 `human_hint_bonus` å—æ®µï¼ˆweight × 12 上é™�,sample_count < 2 æ—¶ ×0.5 折å�Šï¼‰ï¼Œçº³å…¥ total_scoreï¼›[multi_scheme_planner.py:26-86](src/moldinsight/core/multi_scheme_planner.py#L26-L86) `generate_plan` é€�ä¼ hints 到下两层,`global_summary.applied_hints` 注入返回;② [processing_service.py:531-595](src/moldinsight/services/processing_service.py#L531-L595) `_step_generate_cavity` è°ƒ `experience_feedback_service.resolve_for_process_params` æ‹¿å�ŒæŒ‡çº¹ hints,装进 run_occ payload 顶层 `experience_hints` å—æ®µï¼ˆæ™®é€š dict é€�ä¼ ï¼Œpickle 安全,满足 [occ_worker.py:7-8](src/moldinsight/core/occ_worker.py#L7-L8) 硬规则);③ [occ_worker.py:117-140](src/moldinsight/core/occ_worker.py#L117-L140) `_op_generate_cavity` 读 `payload.get("experience_hints") or {}` é€�ä¼ ç»™ `planner.generate_plan(..., hints=...)`;④ D17 é—环验è¯�:è€�师傅写一æ�¡å�ŒæŒ‡çº¹ `adopted` → å�Œ X 通é�“下次分æž� `priority_score` +18,`score_breakdown.human_hint_bonus` +12(sample_count=3),method æ ‡ç¾å�‡çº§ `human_experience_primary`。**接å�£é�¢é›¶å�˜åŒ–**(路径 / schema ä¸�动;仅 OCC å�进程内部å“�应å�« `global_summary.applied_hints`,由å‰�端 ResultView æ¸²æŸ“è§’æ ‡â€”â€”æ‰¹ 3 实现)。**测试基线**:**192 passed, 13 skipped**(批 2 净增 7 通过 + 4 OCC-gated skip:candidate_generator 3 例 / scheme_scorer 4 ä¾‹åœ¨æ— OCC 环境跑通,multi_scheme_planner + processing_service 4 例 OCC-gated å¾… conda `gemold` 镜åƒ�验è¯�)。**接å�£å�˜æ›´ä¸‰ä»¶å¥—执行节点**:openapi.json é‡�导出与å‰�端 `gen:api` 待批 3 完æˆ�å�Žä¸€å¹¶æ‰§è¡Œï¼ˆå‰�端调用两 path + ResultView 渲染一并改)。**下一æ¥**:批 3 å‰�端(ResultView 按钮组 + `HumanFeedbackDialog.vue` + `moldinsightApi` 两个方法 + ç»�éªŒè§’æ ‡ï¼‰ã€‚ï¼‰ > 2026-09-23(**D17 Human-in-Loop è€�师傅ç»�验å��馈批 1 上线(数æ�® + æ�ƒé™� + 写入 API)**:①新增 `experience_feedback` 表(32 表è¿�移,alembic head `b7d1f4a92c3e`)——è€�师傅对系统推è��方案给出"采纳 / 调整 / æ‹’ç»�"å��馈,按"产å“�指纹 + 工艺å�‚æ•°"为键跨任务匹é…�,下次å�ŒæŒ‡çº¹äº§å“�分æž�自动消费;② 新增 3 个æ�ƒé™�ç �(`view_experience_feedback` / `feedback_experience_hint` / `manage_experience_feedback`)+ 新角色 `process_engineer`(å�« view + feedback æ�ƒé™�,admin 角色 permissions å�Œæ¥è¡¥é½�);③ 新增 2 个端点(`POST /api/tasks/{task_id}/experience-feedback` æ��交å��馈 + `GET /api/tasks/{task_id}/experience-hints` 拉å�–å�ŒæŒ‡çº¹åކå�² hints 摘è¦�);④ `init_db.py` å¹‚ç‰ bug ä¿®å¤�——既有 DB å�¯åŠ¨æœŸä¸�å†�跳过新增æ�ƒé™� / 角色补登(`init_permissions` / `init_roles` 改为按 code 比对,新增ä¿�留已有 id);⑤ ORM / è¿�ç§» / service / router / api 注册å�‡è�½ä½�:D9 边界(service.flush + 路由 commit);D17 è¡°å‡�(写新å��馈时å�Œ `stp_file_id` æ•´ä½“ç»æœŸ 90 天 TTL);`User.has_permission` 全仓首次调用点([src/shared/models/identity.py:38](src/shared/models/identity.py#L38) æ¤å‰�仅定义零调用)。**接å�£é�¢æ–°å¢ž 2 path**(openapi.json é‡�导出éš�批 3 一并执行——批 2 OCC payload 接ç¼�改了 `/api/status/{task_id}` 实际å“�应结构需ç‰åˆ° OCC 集æˆ�è�½åœ°å†�é‡�导出)。**测试基线**:**185 passed, 9 skipped**(批 1 净增 59 测试,å�« `compute_fingerprint` 分桶å�‚数化覆盖 bbox / volume / face / undercut / material / is_foam å�„边界值 + API 契约 401/403/422/200 路径 + è¡°å‡�ç»æœŸ + ä»»åŠ¡å½’å±žæ ¡éªŒ + ORM 注册收å�£ï¼‰ã€‚**下一æ¥**:批 2 算法接ç¼�(PartingCandidateGenerator / PartingSchemeScorer / MultiSchemeMoldPlanner é€�ä¼ hints + OCC worker payload `experience_hints` 通é�“)+ 批 3 å‰�端按钮 + å��馈 Dialog + ç»�éªŒè§’æ ‡æ¸²æŸ“ã€‚ï¼‰ diff --git a/docs/TECH_DEBT.md b/docs/TECH_DEBT.md index 13530c0..a1e6723 100644 --- a/docs/TECH_DEBT.md +++ b/docs/TECH_DEBT.md @@ -235,8 +235,14 @@ - [occ_worker.py](src/moldinsight/core/occ_worker.py) `_op_generate_cavity`:`payload.get("experience_hints") or {}` é€�ä¼ ç»™ `planner.generate_plan`,普通 dict 跨进程 pickle 安全 - 测试基线:192 passed, 13 skipped(批 2 净增 7 通过 + 4 OCC-gated skip) -**剩余工作(按ä¾�赖顺åº�)**: -- 批 3:å‰�端按钮组(ResultView.vue `export-buttons-bar` 内è�”)+ `HumanFeedbackDialog.vue` 组件 + `moldinsightApi.getExperienceHints` / `submitExperienceFeedback` + ç»�验æ��ç¤ºè§’æ ‡æ¸²æŸ“ï¼ˆ`applied_hints` 按 scheme_axis 索引) +**批 3 已完æˆ�(å‰�端按钮 + Dialog + ç»�éªŒè§’æ ‡ï¼‰â€”â€” é—环å�¯è§†**: +- [ResultView.vue:35-47](frontend/src/modules/moldinsight/ResultView.vue#L35-L47) 方案å�¡ç‰‡ summary-header åŠ `t-tag` ç»�éªŒè§’æ ‡ï¼ˆ`currentAxisHint` computed 按 scheme_axis 索引 hintsByAxisï¼Œæ— hints ä¸�渲染) +- [ResultView.vue:131-138](frontend/src/modules/moldinsight/ResultView.vue#L131-L138) `export-buttons-bar` åŠ `ðŸ‘� è€�师傅å��馈` 按钮(`v-if="canGiveFeedback"` 角色门控:admin 或 process_engineer) +- [HumanFeedbackDialog.vue](frontend/src/modules/moldinsight/components/HumanFeedbackDialog.vue) 新组件:t-dialog + t-form + t-radio-group 三选一 + t-textarea;走 `moldinsightApi.submitExperienceFeedback`,æˆ�功å�Ž emit `submitted` 让父组件é‡�拉 hints +- [shared/api-client.ts:407-444](frontend/src/shared/api-client.ts#L407-L444) `moldinsightApi` 新增 `getExperienceHints` / `submitExperienceFeedback` +- 接å�£å�˜æ›´ä¸‰ä»¶å¥—éš�批完æˆ�:openapi.json é‡�导出(2 æ–° path)→ `npm run gen:api` → `npm run build` 通过 + +**剩余工作(按需排期)**: - 批 4:衰å‡�机制完善(与 DB ä¸€è‡´æ€§å®šæœŸæ ¸æŸ¥ï¼‰+ DFM 规则库独立模å�—化 + ç»�验冲çª�仲è£� UI ~~原现状 / å½±å“�~~:算法生æˆ�çš„æ–¹æ¡ˆä¸ŽçœŸå®žå·¥ç¨‹å†³ç–æœ‰å·®è·�,è€�师傅æ¯�次都è¦�推翻系统建议é‡�æ�¥ï¼Œæ²‰æ·€ç»�éªŒæ— ç»“æž„åŒ–è·¯å¾„ã€‚ diff --git a/frontend/src/modules/moldinsight/ResultView.vue b/frontend/src/modules/moldinsight/ResultView.vue index 00ab659..2e65778 100644 --- a/frontend/src/modules/moldinsight/ResultView.vue +++ b/frontend/src/modules/moldinsight/ResultView.vue @@ -33,7 +33,17 @@