父文档:
../00-需求总览.md· 对应需求 13 · 决策 D3/D4/D5/D10 本轮性质:整个系统的改造。因为加入了本地自动对焦,微服务里"用图片清晰度评分来选清晰层"的旧方法整条删除。本文档写明:为什么删、删什么、保留什么、删了之后下游怎么同步改,确保对着文档能直接、准确地改。
旧逻辑(没有本地自动对焦时的权宜方法):
下位机对同一个 well 在不同垂直电机位置(shootingPosition)拍多张图 → 上传云端 → 微服务 aivfo-data-transmission 用 OpenCV native 打分(清晰度评分)→ 取分数最高那张的位置作为"最清晰层 clearPosition" → 回传 aivof-tl-control 计算对焦起点与 CCD 拍照位置 → 下发下位机。
问题:这种"云端打分选层"效果差(autofocustool 文档记录"7 组测试全部选错"),且依赖网络、链路长。
本轮:autofocustool 的本地 Tenengrad÷mean 四步标定在机旁直接算出最清晰层,不再需要云端打分选层。因此微服务这条"选层打分链"要删除。
| 链路 | 处理对象 | 作用 | 本轮 |
|---|---|---|---|
| ① 选层打分链 | PhotoMode.AUTOFOCUS 自动对焦图(一 well 多层) |
OpenCV 打分→选最清晰层→回传对焦位置 | 删除 |
| ② 抠图/clearest 链 | PhotoMode.CCD 正式拍照图 |
抠图(cropping)+水印→展示+AI识别 | 保留 |
致命陷阱:两条链都出现 "clearest / 最清晰" 字样,但 ② 的
clearest来自下位机直接标记(ImageDTO.clearest),不是微服务打分。AI 识别、前端展示、DegreeOfClarity查询都走 ②。误删 ② 会废掉展示和 AI 识别。
下位机(AUTOFOCUS模式, 一well多层, 带shootingPosition)
│ Kafka 原图 ImageDTO(photographType=AUTOFOCUS)
▼
[data-transmission] ReceivePictureMessageInfo.receive() :66
- uploadImage 上传原图 :98
- buildPictureDao 落库 t_picture :151
- 转发抠图消息 → Kafka cropping :112-114
▼
[data-transmission] ReceivePictureCroppingMessage.receive() :76
- pictureManage.cropPicture(...) :114/:116
▼
PictureManage.cropPicture() :155/:198
└─ AUTOFOCUS 分支 cutAutofocus() :331
→ PictureProcessingImpl.pictureScore() :91
→ picture.getscore(...) JNA→opencv_world*.dll :96 ★打分★
- score 写回 PictureDAO.imageScore :226/:249
- 末张(END) 发布 ImageReceiveCompleteEvent :160-167
▼
[data-transmission] ImageReceiveCompleteEventHandle.handler() :56
- imageDataHandle() switch photographType :63
└─ case AUTOFOCUS → focusPointUpdate() :77
▼
focusPointUpdate() :120
- 取本批次全部对焦图 :136
- ★ max(comparing(PictureDAO::getImageScore)) 选最高分 :143
- clearPosition = max.getShootingPosition() :144 ← "最清晰层位置"
- mattingSuccessNumber = list.size() :146
- autofocusFeign.calAutoFocusDTO(CalAutoFocusDTO) :148
▼ Feign
[tl-control] AutofocusFeign.calAutoFocusDTO() :40
→ autofocusApi.calAutofocusPosition() :42
▼
[tl-control] AutofocusApiController.calAutofocusPosition() :37
- 发布 AutofocusUpdateEvent(clearPosition,mattingSuccessNumber) :45
▼
AutofocusUpdateEventHandle.handler() :33→:47
→ HousePhotographSettingManageImpl.calPhotoPosition() :52
- calAutofocusStart: 对焦起点=clearPosition-(下移层数×脉冲) :104/:125
- calCCDPosition: 据最清晰位置生成各CCD拍照层位置
- 写库 t_house_photograph_setting(下位机据此拍照)
核心选层就两行:ImageReceiveCompleteEventHandle.java:143-144(选最高分→取位置);打分在 PictureProcessingImpl.java:96。
| 项 | 文件:行号 |
|---|---|
ImageReceiveCompleteEventHandle.focusPointUpdate() 整个方法 |
data-transmission ImageReceiveCompleteEventHandle.java:120-149 |
imageDataHandle() 的 case AUTOFOCUS 分支 |
同文件 :72-78 |
AutofocusFeign 整个类(唯一调用方是 focusPointUpdate) |
tl-control AutofocusFeign.java:25-66 |
CalAutoFocusDTO |
data-transmission CalAutoFocusDTO.java |
cutAutofocus() 私有方法 |
PictureManage.java:331-355 |
PictureProcessing.pictureScore() + native getscore 绑定 |
PictureProcessingImpl.java:91-104(:96 JNA) |
告警类型 CLOUD_SERVER_FOCUS_ALARM |
AutofocusFeign.java:55 引用,随删 |
(依 D5)控制侧 AutofocusApiController / AutofocusApi / CalAutoFocusPositionParamDTO / AutofocusUpdateEvent(Handle) / calPhotoPosition 非首次分支 |
AutofocusApiController.java:37;AutofocusUpdateEventHandle.java:33;HousePhotographSettingManageImpl.java:69-88 |
| 项 | 说明 | 文件:行号 |
|---|---|---|
PictureManage.cropPicture()(2 个重载) |
删 AUTOFOCUS 打分分支,仅留 CCD 抠图;决定 AUTOFOCUS 图是否仍上传/落库 | PictureManage.java:174-182 / :234-247 |
PictureDAO.imageScore 字段写入 |
微服务不再写;但前端对焦预览仍读它(见 4.3/D10) | buildUpdateDao :226/:249 |
HousePhotographSettingManageImpl.calPhotoPosition |
🔶D5:保留则改为"接收本地对焦结果"输入源;否则连 else 分支删 | :50/:69-88 |
t_picture.clearest / image_score |
CCD 的 clearest 仍由下位机带来保留;AUTOFOCUS 的 image_score 失去写入源 | ImageDTO.clearest proto:82,落库:180 |
| 项 | 文件:行号 |
|---|---|
cutCCD() + pictureCropping() 抠图加水印主流程 |
PictureManage.java:273;PictureProcessingImpl.java:49 |
ReceivePictureMessageInfo / ReceivePictureCroppingMessage 主体(收图/抠图/落库/转发) |
— |
saveVideoSpliceInfo() CCD 视频合成 |
ImageReceiveCompleteEventHandle.java:70/:92 |
AI 识别转发 PictureIdentifyEvent(按 CCD clearest 选图送 AI) |
ReceivePictureCroppingMessage.java:172-178 |
DegreeOfClarity 枚举 + 业务侧 getClearest/getClearestByDevelopTime 查询(CCD 体系,下位机标记,与选层打分独立) |
DegreeOfClarity.java;ResourceServiceImpl.java:134/:244 |
对焦起点/CCD 位置的新来源:原产自微服务 focusPointUpdate:143-144(选最高分图位置)→ Feign → calPhotoPosition → 写 t_house_photograph_setting,下位机据此拍照。改本地后,最清晰位置由机旁本地对焦算法直接得出(autofocustool),不再云端回传。
必须同步确认/修改的下游:
🔶D5(最大决策点):t_house_photograph_setting 由谁写?
calPhotoPosition 接口,但输入改为"本地对焦算出的位置"(本地→上报→仍走该接口写库下发)。改动小、保留云端记录。AutofocusApiController→calPhotoPosition。最彻底、最少绕行,但失去云端位置记录。🔶D10:前端对焦预览
aivfo-data-transmission ResourceServiceImpl.getAutofocusPictures:463(:470 用 imageScore 拼文件名,:476 max(imageScore) 标 highestScore)和 front-management AutoFocusWindow.xaml.cs:149-152 都消费 imageScore/highestScore。AI 识别:不受影响(走 CCD 的 clearest,不是打分链)—— 但需回归验证确认。
数据库:t_picture.image_score 列保留但停写(AUTOFOCUS);video* 表不受影响。
本轮是整个系统改造,下面把每个微服务被"删云端选层打分"波及的程度逐个写明。 ⚠️ 总览:云端"清晰度打分"(
t_picture.image_score)的真实消费点只有 business-manage 两处(会 NPE 崩溃,必须改);data-transmission 是打分的生产者(删);tl-control 是对焦位置编排(改);ai-middleware / gateway / aivfo-service 不受影响(仅回归确认)。
见上文 §3/§4/§5。要点:删 focusPointUpdate/pictureScore/cutAutofocus/AutofocusFeign;保留 cutCCD 抠图、视频合成、AI 转发。t_picture.image_score 从此停写(变 null)——这会让下游 business-manage 的读取方崩溃,见 6.2。
这是最容易被漏、且会直接导致"系统不能用"的地方。 business-manage 有两处强依赖 image_score,打分删除后字段全 null:
| 功能 | 位置 | 删打分后果 | 改造 |
|---|---|---|---|
对焦预览选最高分 getAutofocusPictures |
ResourceServiceImpl.java:462-481(:470 imageName 拼分数、:476 max(imageScore).setHighestScore) |
:476 全 null 时 Comparator NPE 崩溃;:470 名字拼成 ..._null |
去掉"选最高分"逻辑或改判据(CCD clearest/居中层);imageName 去掉分数段 |
详情时间线最佳对焦帧 getFocusBestPicture |
ResourceServiceImpl.java:430-434 → PictureDAOServiceImpl.java:179(getImageScore().compareTo) |
NPE 风险,最佳帧失准 | 改判据为最新 image_time 或 clearest |
FocusPreviewPictureVO.imageScore/highestScore |
FocusPreviewPictureVO.java:71-78 | 字段失去来源 | 保留为兼容字段或删;前端读取需同步确认 |
接口 /getAutofocusPictures、/downloadFocusPicture |
ResourceController.java:192-205 | 预览数据失真/异常 | 同上;downloadFocusPicture(:637-643 仅按类型查)不受影响 |
调用链:前端 POST /getAutofocusPictures → ResourceManageImpl:630(转发) → ResourceServiceImpl:462 → Feign 调 data-transmission PictureDAOServiceImpl.getLastAutofocusPictureByEmbryoId:241 → SQL PictureMapper.xml:77-100(查 t_picture 分表,photograph_type=1 AUTOFOCUS)。front-management 的"对焦预览"正是走这条 business-manage 链路(不是直连 data-transmission)。
决策 D10 落点:对焦预览不必整体下线——它展示的是一组对焦层原图,核心数据(图/层/time)不依赖打分。最小改动 = 消除 NPE + 换选层判据。但必须改,否则一点开患者详情就崩。
见 §5。calPhotoPosition 保留为"接收本地对焦结果"(A) 或彻底删由本地下发(B)。告警 CLOUD_SERVER_FOCUS_ALARM(AutofocusFeign.java:52-56) 和 FocusAlarmHandler(:111 用 focusState) 都是下位机定位失败告警、与打分无关,不需改,回归确认即可。
AI 识别用的"对焦层数 currentFocal"(PictureNameDTO.java:33、AiPictureResultVO.java:46)只是文件名里的层号标签,来自 CCD/clearest 链,不读 image_score。AI 识别的是 stage/stageProb/properties(PictureManageImpl.java:159-173),与打分无关。且 Tools.splitPictureName:67 的 setCurrentFocal 已注释。→ 保留不动,只冒烟验证图片文件名层号仍正常填充。
全量搜 focus/对焦/score/打分 无匹配。网关无对焦路由、service 无打分逻辑。→ 不改。
| 微服务 | 角色 | 改造 | 风险 |
|---|---|---|---|
| data-transmission | 打分生产者 | ★删打分链、留抠图 | 停写 image_score 波及 6.2 |
| business-manage | 打分消费者 | ★★改两处选层判据(消 NPE) | 不改则患者详情崩溃 |
| tl-control | 对焦位置编排 | 改 calPhotoPosition(D5) | 决策点 |
| ai-middleware | AI 识别 | 不改,回归 | 低 |
| gateway / aivfo-service | 网关/通用 | 不改 | 无 |
AutofocusFeign/打分相关死代码残留或启动报错。CLOUD_SERVER_FOCUS_ALARM/FocusAlarmHandler)仍按下位机定位失败正常触发。