04-微服务改造方案.md 14 KB

04 · 微服务改造方案(删除选层打分 + 保留抠图链 + 下游同步)

父文档:../00-需求总览.md · 对应需求 13 · 决策 D3/D4/D5/D10 本轮性质:整个系统的改造。因为加入了本地自动对焦,微服务里"用图片清晰度评分来选清晰层"的旧方法整条删除。本文档写明:为什么删、删什么、保留什么、删了之后下游怎么同步改,确保对着文档能直接、准确地改。


1. 背景:为什么删

旧逻辑(没有本地自动对焦时的权宜方法): 下位机对同一个 well 在不同垂直电机位置(shootingPosition)拍多张图 → 上传云端 → 微服务 aivfo-data-transmissionOpenCV native 打分(清晰度评分)→ 取分数最高那张的位置作为"最清晰层 clearPosition" → 回传 aivof-tl-control 计算对焦起点与 CCD 拍照位置 → 下发下位机。

问题:这种"云端打分选层"效果差(autofocustool 文档记录"7 组测试全部选错"),且依赖网络、链路长。

本轮autofocustool 的本地 Tenengrad÷mean 四步标定在机旁直接算出最清晰层,不再需要云端打分选层。因此微服务这条"选层打分链"要删除。


2. ⚠️ 关键:两条同名但独立的链路,只删其一

链路 处理对象 作用 本轮
① 选层打分链 PhotoMode.AUTOFOCUS 自动对焦图(一 well 多层) OpenCV 打分→选最清晰层→回传对焦位置 删除
② 抠图/clearest 链 PhotoMode.CCD 正式拍照图 抠图(cropping)+水印→展示+AI识别 保留

致命陷阱:两条链都出现 "clearest / 最清晰" 字样,但 ② 的 clearest 来自下位机直接标记(ImageDTO.clearest),不是微服务打分。AI 识别、前端展示、DegreeOfClarity 查询都走 ②。误删 ② 会废掉展示和 AI 识别。


3. 选层打分链路图(要删的 ①,附文件:行号)

下位机(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


4. 改造清单(删 / 改 / 保留)

4.1 【删】选层打分专属

文件:行号
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

4.2 【改】来源/语义变化

说明 文件:行号
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

4.3 【保留】抠图/展示/AI(与选层无关)

文件:行号
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

5. 删了之后的替代数据源与下游同步(C:必须一起改)

对焦起点/CCD 位置的新来源:原产自微服务 focusPointUpdate:143-144(选最高分图位置)→ Feign → calPhotoPosition → 写 t_house_photograph_setting,下位机据此拍照。改本地后,最清晰位置由机旁本地对焦算法直接得出(autofocustool),不再云端回传。

必须同步确认/修改的下游:

  1. 🔶D5(最大决策点):t_house_photograph_setting 由谁写?

    • 方案 A:保留 calPhotoPosition 接口,但输入改为"本地对焦算出的位置"(本地→上报→仍走该接口写库下发)。改动小、保留云端记录。
    • 方案 B:彻底由机旁本地直接下发位置给下位机,删除整条 AutofocusApiController→calPhotoPosition。最彻底、最少绕行,但失去云端位置记录。
    • 建议先选 A(保留可追溯、改动可控),稳定后再评估 B。
  2. 🔶D10:前端对焦预览

    • aivfo-data-transmission ResourceServiceImpl.getAutofocusPictures:463(:470 用 imageScore 拼文件名,:476 max(imageScore) 标 highestScore)和 front-management AutoFocusWindow.xaml.cs:149-152 都消费 imageScore/highestScore
    • 删微服务打分后 imageScore 无来源 → 该预览"最高分高亮"失效。需确认:对焦预览随本地化一起下线,还是改由本地标定结果回填?
  3. AI 识别:不受影响(走 CCD 的 clearest,不是打分链)—— 但需回归验证确认。

  4. 数据库t_picture.image_score 列保留但停写(AUTOFOCUS);video* 表不受影响。


6. 逐个微服务的影响范围与改造方案(整个系统,全覆盖)

本轮是整个系统改造,下面把每个微服务被"删云端选层打分"波及的程度逐个写明。 ⚠️ 总览:云端"清晰度打分"(t_picture.image_score)的真实消费点只有 business-manage 两处(会 NPE 崩溃,必须改);data-transmission 是打分的生产者(删);tl-control 是对焦位置编排(改);ai-middleware / gateway / aivfo-service 不受影响(仅回归确认)。

6.1 aivfo-data-transmission(打分生产者 → 删生产、留抠图)

见上文 §3/§4/§5。要点:删 focusPointUpdate/pictureScore/cutAutofocus/AutofocusFeign;保留 cutCCD 抠图、视频合成、AI 转发。t_picture.image_score 从此停写(变 null)——这会让下游 business-manage 的读取方崩溃,见 6.2

6.2 aivfo-business-manage(打分消费者 → ★必须改,否则 NPE 崩溃)

这是最容易被漏、且会直接导致"系统不能用"的地方。 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_timeclearest
FocusPreviewPictureVO.imageScore/highestScore FocusPreviewPictureVO.java:71-78 字段失去来源 保留为兼容字段或删;前端读取需同步确认
接口 /getAutofocusPictures/downloadFocusPicture ResourceController.java:192-205 预览数据失真/异常 同上;downloadFocusPicture(:637-643 仅按类型查)不受影响

调用链:前端 POST /getAutofocusPicturesResourceManageImpl: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 + 换选层判据。但必须改,否则一点开患者详情就崩。

6.3 aivof-tl-control(对焦位置编排 → 改/D5)

见 §5。calPhotoPosition 保留为"接收本地对焦结果"(A) 或彻底删由本地下发(B)。告警 CLOUD_SERVER_FOCUS_ALARM(AutofocusFeign.java:52-56) 和 FocusAlarmHandler(:111 用 focusState) 都是下位机定位失败告警、与打分无关,不需改,回归确认即可。

6.4 aivfo-ai-middleware(不受影响,仅回归)

AI 识别用的"对焦层数 currentFocal"(PictureNameDTO.java:33、AiPictureResultVO.java:46)只是文件名里的层号标签,来自 CCD/clearest 链,不读 image_score。AI 识别的是 stage/stageProb/properties(PictureManageImpl.java:159-173),与打分无关。且 Tools.splitPictureName:67setCurrentFocal 已注释。→ 保留不动,只冒烟验证图片文件名层号仍正常填充。

6.5 aivfo-gateway / aivfo-service(不受影响

全量搜 focus/对焦/score/打分 无匹配。网关无对焦路由、service 无打分逻辑。→ 不改。

6.6 影响小结表

微服务 角色 改造 风险
data-transmission 打分生产者 ★删打分链、留抠图 停写 image_score 波及 6.2
business-manage 打分消费者 ★★改两处选层判据(消 NPE) 不改则患者详情崩溃
tl-control 对焦位置编排 改 calPhotoPosition(D5) 决策点
ai-middleware AI 识别 不改,回归
gateway / aivfo-service 网关/通用 不改

7. 验收(本专题)

  1. 删打分链后,自动对焦走本地:放皿→本地标定→得最清晰层→拍照位置正确下发→正常拍照。
  2. CCD 抠图/水印/视频合成不受影响(回归对比)。
  3. AI 识别正常(按 CCD clearest 选图、文件名层号正常)。
  4. business-manage 患者详情/对焦预览/最佳对焦帧/对焦图下载四处不报 NPE(6.2 改造后回归)。
  5. 前端对焦预览按 D10 结论处理(消 NPE + 换判据 / 本地回填),无残留报错。
  6. AutofocusFeign/打分相关死代码残留或启动报错。
  7. 对焦失败告警(CLOUD_SERVER_FOCUS_ALARM/FocusAlarmHandler)仍按下位机定位失败正常触发。