审核员:文档审核员(Claude Opus 4.8) · 日期:2026-06-17 审核对象:
项目文档/需求文档/(00-需求总览.md 总纲 + 01–12 子文档)对照 5 个 Java 微服务 + 2 个 .NET 客户端 + autofocustool 源码 审核方式:codegraph MCP(codegraph_explore / codegraph_node)核对符号与文件:行号,辅以 Grep 全局搜索 性质:只读审核,未修改任何源码
逐项核对 04/03/00-需求总览.md 中"现状 / 文件:行号 / 类名方法名"断言。结论:抽查项 100% 命中,行号精度极高(多数误差 0–2 行),无方法/类不存在的硬错误。
| 文档位置 | 文档声称 | 源码实际 | 影响改造 | 建议 |
|---|---|---|---|---|
| 04 §3/§4.1 | ImageReceiveCompleteEventHandle.java:120-149 focusPointUpdate 整方法 |
方法在 :120-148(结尾 148,doc 写 149 含闭括号,可接受) | 否(删除目标,定位准确) | 行号几乎完美,可直接照删 |
| 04 §3 :143-144 | 选最高分→取位置两行 | :143 max(Comparator.comparing(PictureDAO::getImageScore)).get();:144 setClearPosition(max.getShootingPosition()) |
否 | EXACT,无需修正 |
| 04 §3/§4.1 :96 | PictureProcessingImpl.java:91-104,:96 JNA getscore 打分 |
方法签名 :91(@Override :90),picture.getscore(...) 在 :96 |
否 | EXACT |
| 04 §4.1 :331 | PictureManage.java:331-355 cutAutofocus 私有方法 |
:331 private CropPictureInfo cutAutofocus(...),方法体至 :355 |
否 | EXACT。⚠️见下注:存在两个 PictureManage.java |
| 04 §4.1 | AutofocusFeign.java:25-66 整类,唯一调用方 focusPointUpdate |
类在 :25,文件 66 行;codegraph 确认仅被 ImageReceiveCompleteEventHandle 引用 | 否 | "唯一调用方"断言成立,可整类删 |
| 04 §4.1 :55 | CLOUD_SERVER_FOCUS_ALARM 引用随删 |
:55 AlarmTypeKeyEnums.CLOUD_SERVER_FOCUS_ALARM.getValue() |
否 | EXACT |
| 04 §6.2 | ResourceServiceImpl.java:462-481(business-manage),:470 拼分数、:476 max(imageScore) |
方法 :462-481;:470 setImageName(...{}_{}_{}_{}..., getImageScore());:476 max(Comparator.comparing(A->A.getImageScore())).get().setHighestScore(true) |
是(NPE 点1) | EXACT,核心断言成立 |
| 04 §6.2 | PictureDAOServiceImpl.java:179 getImageScore().compareTo |
:179 c1.getImageScore().compareTo(c2.getImageScore()),所在方法 getFocusBestPicture 起于 :173(doc §6.2 表内写 430-434→179,430-434 是 business-manage 包装层,179 是 data-transmission 实现层) |
是(NPE 点2) | EXACT。两层链路描述准确 |
| 04 §6.2 调用链 | …→ PictureDAOServiceImpl.getLastAutofocusPictureByEmbryoId:241 |
:241 方法存在 | 否 | EXACT |
| 03 §1 :105 | Imaging/Sharpness.cs:105 ÷mean 一次 |
:105 return sumSq / n / mean;,且 :99-104 注释明确记录"原 mean² 选错、改 mean 后峰落 92000" |
否(移植算法依据) | EXACT,注释佐证算法权威性 |
| 03 §1 :181 | Calib/CalibrationEngine.cs:181 CalibrateWell 四步标定 |
:181 public WellCalib CalibrateWell(...);CoarseFocus/ScanForCenter/ExposureMeter/精对焦四步齐全(:339/:149/:222) |
否 | EXACT |
| 03 §1 移植范围 | "不移植 SelfTest/SmokeTest/Calibrate/CalibWindow 等测试外壳" | autofocustool 下 SelfTest/SmokeTest/Calibrate/CalibTest/ToPng 目录实际仍在 | 否(措辞辨析) | 非错误:03 写的是"不移植"(未来动作)≠"已删"。见下方专项说明 |
| 00-需求总览.md §1.1 | 子系统清单:data-transmission=OpenCV(JNA)/4 表、tl-control=17 表、business=25 表等 | 目录结构、模块分层(controller/service/manage/mapper/...)与表数描述一致,5 个含 lanucher 的微服务均存在 | 否 | 一致,可信 |
任务点名"文档说已删、实际仍在"。核查结论——需求文档本身没有说错:
12 文档 :142 明写"autofocustool 文档称 SelfTest/SmokeTest 等已删,实际仍在",12 :299 进一步定调"按只删高置信度约定保留这些子工程"。PictureManage.java 存在两份:
aivfo-data-transmission/.../manage/image/PictureManage.java(本轮删 cutAutofocus 的目标)aivfo-ai-middleware/.../manage/PictureManage.java(AI 侧,不可误改)04 文档行号正确,但只写"PictureManage.java"易引歧义。建议:04 §4.1 引用处补全模块路径限定。
源码层级核对结论:两处都是先 stream 后 get()、未判 null 的真实消费点,t_picture.image_score 列注释即为"图片分数(如果是对焦才有值)"(PictureMapper.xml:25),删打分后 AUTOFOCUS 行该列全 null。
NPE 点1 属实:ResourceServiceImpl.java:476(business-manage)
copy.stream().max(Comparator.comparing(A -> A.getImageScore())).get()
—— Comparator.comparing 对 null 键调 compareTo 抛 NPE;即便容错,.get() 在空流也 NoSuchElement。一打开对焦预览即崩。断言成立。
NPE 点2 属实:PictureDAOServiceImpl.java:179(data-transmission,被 business-manage getFocusBestPicture:430-434 经 Feign 调用)
c1.getImageScore().compareTo(c2.getImageScore())
—— getImageScore() 返回 null 时 .compareTo 直接 NPE。"最佳对焦帧"查询触发即崩。断言成立。
两点的调用链(前端
/getAutofocusPictures→ businessResourceServiceImpl:462→ Feign → data-transmissiongetLastAutofocusPictureByEmbryoId:241)与 04 §6.2 描述一致,已逐跳验证。
t_house_photograph_setting)路径在 tl-control 侧成立:AutofocusUpdateEventHandle:47 → HousePhotographSettingManageImpl.calPhotoPosition:52 的 first/else 分支结构与 04 §4.1 描述吻合(else 分支 :69-88 EXACT)。全局搜 image_score / getImageScore / imageScore / highestScore / AutofocusFeign / focusPointUpdate / pictureScore 于 5 个 Java 微服务 + 2 个 .NET 客户端(排除 target/obj/bin)。
| # | 位置 | 类型 | 删打分后影响 | 08/04 是否覆盖 |
|---|---|---|---|---|
| 1 | data-transmission ImageReceiveCompleteEventHandle.java:143 |
消费(max 选层) | 删除目标 | ✅ 04/08 覆盖 |
| 2 | business-manage ResourceServiceImpl.java:476 |
消费(max→NPE) | NPE 崩 | ✅ 04§6.2/08§2b |
| 3 | data-transmission PictureDAOServiceImpl.java:179 |
消费(compareTo→NPE) | NPE 崩 | ✅ 04§6.2/08§2b |
| 4 | data-transmission PictureDAOServiceImpl.java:270 |
消费(orderByDesc(getImageScore),方法 getAutofocusPictureByEmbryoIdAndBatchNumber,正是 focusPointUpdate 调的查询) |
SQL 排序无 NPE,但全 null 后排序失意义 | ⚠️ 未单列 |
| 5 | data-transmission PictureDAOServiceImpl.java:325 |
消费(pageQueryPictures 末位 orderByDesc(getImageScore)) |
SQL 排序无 NPE,分页次序退化 | ⚠️ 未列 |
| 6 | business-manage ResourceServiceImpl.java:333 |
消费(getPictureByDevelopTime AUTOFOCUS 分支 orderByDesc(getImageScore),挑"按发育时间的最佳对焦帧") |
SQL 排序无 NPE,但最佳帧静默选错 | ⚠️ 第三个 business-manage 消费点,04"两处"未含 |
| 7 | data-transmission ReceivePictureCroppingMessage.java:226/229/249/252 |
生产(setImageScore(getScore())) |
写入源,随打分链删 | 部分隐含(04 §4.2 buildUpdateDao),未逐行点名 |
| 8 | data-transmission ReceivePictureMessageInfo.java:179 |
生产(setImageScore) |
写入源,随删 | 部分隐含 |
| 9 | data-transmission PictureDAO.java:126-127 / PictureMapper.xml:25 |
字段/列定义 | 列保留停写 | ✅ 04 §5.4 |
| 10 | business-manage FocusPreviewPictureVO.java:72、:78 highestScore |
DTO 字段 | 失去来源 | ✅ 04 §6.2 |
| 11 | front-management AutoFocusWindow.xaml.cs:149(imageScore 拼文件名)、:152 highestScore(高亮背景)、AutoFocusPictureEntity.cs:11/17 |
.NET 消费 | 高亮失效/文件名带 null | ✅ 04 §5.2/08 §2 (D10) |
| 12 | ivf_tl_control_2.0 HouseBin.cs:2446 GetImageScoreAndSaveImage、AivfoHelper.cs:35(P/Invoke native 打分)、picture.cs:150 image_score |
.NET 本地打分(生产侧) | 机旁端自身也有一套打分/评分 native 调用 | ❌ 04/08 完全未提 |
遗漏(中):第 6 项 ResourceServiceImpl.java:333 —— 04 §6.2 标题写"business-manage 有两处强依赖 image_score",实为三处。第三处是 SQL orderByDesc 不会 NPE,但属"最佳对焦帧选层判据",删打分后会静默选错帧(比 NPE 更隐蔽)。建议补入 04 §6.2 表与 08 §2b。
遗漏(中):第 12 项 ivf_tl_control_2.0 的本地打分路径 —— HouseBin.cs:2446 调 native GetImageScoreAndSaveImage,picture.cs 含 image_score 字段。文档把"打分"完全归为云端 data-transmission,但机旁 C# 客户端本身已存在一套 native 评分调用。本轮 control 要并入合并端,需确认这套 .NET 打分与云端打分链的关系(是否同源、是否随本地对焦一并替换/删除)。建议登记为待验证项。
遗漏(低):第 4/5 项 data-transmission 两处 orderByDesc(getImageScore) —— 不崩但排序退化。删打分后建议改排序键为 image_time,否则对焦图列表次序无意义。属低优先,宜在 04 §4.2 备注。
不受影响断言复核:ai-middleware / gateway / aivfo-service 全量搜
image_score/getImageScore无匹配,04 §6.4/§6.5"不受影响"成立。
| 决策 | 议题 | 源码现状 | 建议:可拍板 / 仍阻塞 | 理由 |
|---|---|---|---|---|
| 🔶D5 | calPhotoPosition 去留(A 保留接口改输入源 / B 彻底本地下发) |
HousePhotographSettingManageImpl.calPhotoPosition:52 含 first(初始化)/else(更新)两分支,else 用 clearPosition/mattingSuccessNumber 算对焦起点+CCD 位置并写 t_house_photograph_setting。几何换算逻辑完整、与打分解耦(只吃 clearPosition 这个位置值) |
可拍板选 A | 方法只依赖"最清晰位置"这一输入,本地标定算出的 FocusZ 可直接灌入,改动面小、保留云端可追溯记录。B 需重写下发通道、丢失云端记录,风险大。04 §5 已倾向 A,源码支持该选择。 |
| 🔶D6 | 自适应分辨率基准(Surface 实际分辨率 / Viewbox vs 弹性) | 源码无法给出物理屏参数(硬件信息) | 仍阻塞 | 需真机/硬件规格输入,非源码可定。属外部依赖。 |
| 🔶D7 | 退出屏蔽边界(是否留隐藏管理员退出) | 产品策略,源码不决定 | 仍阻塞(但低风险) | 纯产品决策,可与 UI 改造期一并拍板,不阻塞 M3 微服务改造。 |
| 🔶D8 | 配置分层边界(数据库/本地/无网兜底/权限) | 现状四处分散(App.config / TLSetting / EEPROM / calibration.json,见 02 §2.3),需 06 文档展开 | 仍阻塞(需 06 细化) | 需先盘点现有配置项清单再定分层,建议 M5 阶段前出 06 详案,当前不阻塞 M3。 |
| 🔶D9 | 标定结果回写 EEPROM | autofocustool 现状只写 calibration.json、从不回写 EEPROM(03 §4);写地址读写错配、0x12 回复长度两版矛盾 |
仍阻塞(硬阻塞,真机前置) | 03 §4/§6 明列写地址必须真机验证、回复长度需实测。无真机无法定,是 R4 上线前置条件。 |
| 🔶D10 | 前端对焦预览去留 | 经 business-manage /getAutofocusPictures 取数(非直连 data-transmission),两处 NPE 已确认(维度②)。front AutoFocusWindow 消费 imageScore/highestScore 已确认 |
半拍板:无论去留,先消 NPE 可立即拍板;"去/留"本身可暂缓 | NPE 修复与"预览是否下线"正交——必须先改判据消 NPE(否则患者详情崩),这点现在就能定。预览最终去留可待 UI 期再议。00-需求总览.md §5 D10 描述与源码完全吻合。 |
小结:D5、D10 可基于源码现状当下拍板(D5 选 A、D10 先消 NPE);D6/D9 是硬阻塞(依赖真机/硬件);D7/D8 是产品/盘点性决策,不阻塞 M3 微服务改造。
ResourceServiceImpl.java:333(getPictureByDevelopTime AUTOFOCUS 分支的 orderByDesc(getImageScore),静默选错最佳帧)。这是最实质的遗漏,不补会漏改。HouseBin.cs:2446 GetImageScoreAndSaveImage / AivfoHelper.cs:35 / picture.cs:150 image_score——文档把打分纯归云端,机旁 C# 端的 native 评分调用未提,合并改造需厘清其去留。GetImageScoreAndSaveImage)与云端 data-transmission 打分链是否同源/同 dll?本地对焦化后这套机旁评分是否一并废弃?(影响合并端硬件访问层与对焦集成)PictureDAOServiceImpl.java:270/:325 两处 orderByDesc(getImageScore) 删打分后排序键改 image_time 的回归确认。getPictureByDevelopTime:333(business-manage 第三消费点)改判据后,"按发育时间取最佳对焦帧"的临床展示是否仍正确。无 BLOCKED。所有点名抽查的关键文件均真实存在、行号吻合,codegraph 索引可用,审核完整执行。