Browse Source

docs(d2-02-p5): data-transmission 迁108修抠图 + 视频合成逻辑厘清 + 部署形态变更

- 抠图失败根因:抠图/视频合成读FastDFS本地磁盘(getFileReallyPath),data-transmission在Windows读不到108的图->FileNotFoundException->crop_state=0
- 解法(不改业务代码):data-transmission迁108(与FastDFS同机),回归设计形态
- 迁移:SSH免密(trilead-ssh2)+传jar/原生库+yum装GTK3等opencv依赖+108配置(storagePath=/opt/fastdfs/storage)+停Windows端
- 验证:样片抠图success=1;108自动抠图20:29起各舱700+张crop_state=1实时成功
- 视频合成非bug:图差2帧(每胚胎才6张,需8帧),再拍2轮自动合成
- 原图查看代码改造前后未变+FastDFS协议下载实测通;若仍看不到=前端地址问题(待查)
- ★运维:data-transmission已迁108,start-all.sh移除它,勿Windows双开抢Kafka

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
huangjie 1 day ago
parent
commit
f13f8da779

+ 39 - 0
项目文档/开发环境/data-transmission-108部署配置.properties

@@ -0,0 +1,39 @@
+server.port=10030
+spring.application.name=aivfo-data-transmission
+server.servlet.context-path=/api/data/transmission/server
+server.ip=127.0.0.1
+#数据库连接配置
+aivfo.mybatis-plus.datasource.jdbcUrl=jdbc:mysql://${server.ip}:3306/aivfo_tl?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true
+aivfo.mybatis-plus.datasource.username=root
+aivfo.mybatis-plus.datasource.password=root
+aivfo.mybatis-plus.p6spy.enable=true
+# kafka
+aivfo.kafka.properties.ips=${server.ip}:9092
+aivfo.kafka.properties.consumer.autoOffsetReset=earliest
+aivfo.kafka.properties.consumer.group=wyl02
+aivfo.kafka.properties.producer.enable=true
+# dfs
+aivfo.dfs.fastdfs.enable=true
+aivfo.dfs.fastdfs.connectionPool.enabled=false
+aivfo.dfs.fastdfs.trackerServers=${server.ip}:22122
+# 108 实际 FastDFS 存储路径(store_path_count=1, store_path0=/opt/fastdfs/storage)
+aivfo.dfs.fastdfs.storagePath.group1[0]=/opt/fastdfs/storage
+aivfo.dfs.fastdfs.storagePath.group1[1]=/opt/fastdfs/storage
+aivfo.dfs.fastdfs.storagePath.group1[2]=/opt/fastdfs/storage
+aivfo.dfs.fastdfs.storagePath.group2[0]=/opt/fastdfs/storage
+aivfo.dfs.fastdfs.storagePath.group2[1]=/opt/fastdfs/storage
+aivfo.dfs.fastdfs.storagePath.group2[2]=/opt/fastdfs/storage
+#swagger
+aivfo.doc.swagger.title=aivfo-data-transmission
+aivfo.doc.swagger.description=图片接收服务
+aivfo.doc.swagger.version=1.0.0-SNAPSHOT
+aivfo.doc.swagger.base-package=com.aivfo.data.transmission.controller
+#mybatisplus
+aivfo.mybatis-plus.platform=pc
+#==================nacos服务发现配置==================
+spring.cloud.nacos.discovery.server-addr=${server.ip}:8848
+logging.level.com.aivfo.data.transmission.manage=debug
+# 108 原生库路径(opencv .so + libjavaImg.so)
+aivfo.jna.lib-path=/home/soft/aivfo/lib
+video.local.save.path=/home/soft/aivfo/video
+aivfo.monitor.client.monitorConf.serveId=e2e6dafcd0d6d5730c3ad091ddddab68

+ 7 - 4
项目文档/开发环境/start-all.sh

@@ -15,8 +15,11 @@ s business-pc    "aivfo-business-manage/aivfo-business-manage-lanucher/aivfo-bus
 s surface        "aivfo-business-manage/aivfo-business-manage-lanucher/aivfo-business-manage-surface-lanucher/target/aivfo-business-manage-surface-lanucher-2.2.4.0-SNAPSHOT.jar"
 s surface        "aivfo-business-manage/aivfo-business-manage-lanucher/aivfo-business-manage-surface-lanucher/target/aivfo-business-manage-surface-lanucher-2.2.4.0-SNAPSHOT.jar"
 s oplog          "aivfo-oplog/target/aivfo-oplog-1.0.0-SNAPSHOT.jar"
 s oplog          "aivfo-oplog/target/aivfo-oplog-1.0.0-SNAPSHOT.jar"
 s aivfo-service  "aivfo-service/target/aivfo-services.jar"
 s aivfo-service  "aivfo-service/target/aivfo-services.jar"
-# data-transmission 需原生 DLL(JavaImageDLL+opencv_world3416)在 PATH,否则 UnsatisfiedLinkError
-PATH="$DTLIB:$PATH" nohup "$JAVA" -Xmx256m -Djna.library.path="$DTLIB" -jar "$ROOT/aivfo-data-transmission/aivfo-data-transmission-lanucher/target/aivfo-data-transmission-lanucher-2.2.3.0-SNAPSHOT.jar" > "$LOG/run-data-transmission.log" 2>&1 &
-echo "started data-transmission pid=$!"
-echo "ALL_STARTED - 等约2分钟服务就绪。之后启动 operate(Release,会弹UAC):"
+# ★data-transmission 已迁到 108 Linux 跑(2026-06-26),不再在 Windows 起!
+#   原因:抠图/视频合成读 FastDFS 本地磁盘(getFileReallyPath),必须与 FastDFS 同机。详见特殊情况记录。
+#   108 启动:ssh root@192.168.0.108, cd /home/soft/aivfo/aivfo-data-transmission
+#     setsid /usr/lib/jvm/java-11/bin/java -Xmx256m -Djna.library.path=/home/soft/aivfo/lib \
+#       -jar aivfo-data-transmission-lanucher-2.2.3.0-SNAPSHOT.jar </dev/null >run.log 2>&1 &
+#   ⚠ 勿在 Windows 再起它,否则与 108 抢 Kafka 消费组。
+echo "ALL_STARTED - 等约2分钟服务就绪。data-transmission 在 108 单独起(见上注释)。之后启动 operate(Release,会弹UAC):"
 echo "  ivf_tl_operate_2.0/ivf_tl_Operate/bin/Release/net6.0-windows/ivf_tl_Operate.exe"
 echo "  ivf_tl_operate_2.0/ivf_tl_Operate/bin/Release/net6.0-windows/ivf_tl_Operate.exe"

+ 13 - 0
项目文档/进度/D2-02-第三阶段-自动对焦重构-特殊情况记录.md

@@ -194,3 +194,16 @@
 - ✅**完整端到端验证通过(17:25 一轮真机采集)**:4舱(2/4/6/8)拍照(一轮~15s)→ Kafka → data-transmission → **下划线库 aivfo_tl picture 分表入库 139 张** → **逐孔 embryo_id 与 embryo 表核对 20/20 全一致、0 不一致、无报错**。样例:仓2孔1-5→embryo17-21、仓4→33-37、仓6→49-53、仓8→65-69(带培养记录维度核对)。拍→入库延迟约9-15s。**图入对的库(前端读图的业务库)+ 正确关联病例,闭环达成。**
 - ✅**完整端到端验证通过(17:25 一轮真机采集)**:4舱(2/4/6/8)拍照(一轮~15s)→ Kafka → data-transmission → **下划线库 aivfo_tl picture 分表入库 139 张** → **逐孔 embryo_id 与 embryo 表核对 20/20 全一致、0 不一致、无报错**。样例:仓2孔1-5→embryo17-21、仓4→33-37、仓6→49-53、仓8→65-69(带培养记录维度核对)。拍→入库延迟约9-15s。**图入对的库(前端读图的业务库)+ 正确关联病例,闭环达成。**
 - 用户现场:未接气体源,补气[0->0]补不进=正常(新引擎"无气源提前退出"已处理,不影响采集)。
 - 用户现场:未接气体源,补气[0->0]补不进=正常(新引擎"无气源提前退出"已处理,不影响采集)。
 - **部署补充(重要)**:operate 部署/换环境时,**`operate\control\` 子目录的引擎必须同步最新编译**(编 control sln 后复制整目录),否则 operate 拉旧引擎。应纳入部署清单。
 - **部署补充(重要)**:operate 部署/换环境时,**`operate\control\` 子目录的引擎必须同步最新编译**(编 control sln 后复制整目录),否则 operate 拉旧引擎。应纳入部署清单。
+
+#### [Phase5·部署] ★data-transmission 迁到 108 修抠图 + 视频合成逻辑厘清 + 原图链路分析  — 2026-06-26 晚
+- **现象**:用户反馈培养记录看不到照片、视频不能播、原图也看不到。
+- **抠图失败根因**:抠图(`PictureManage.cutCCD`)和视频合成读图都用 `client.getFileReallyPath()`(**读 FastDFS 本地磁盘路径** `/opt/fastdfs/storage/...`),但 data-transmission 跑在 **Windows**,读不到 108 Linux 的磁盘 → `FileNotFoundException` → 抠图失败 → `crop_state=0` → 前端查 `crop_state=SUCCEED` 的图查不到、视频合成无源图。
+- **解法(不改业务代码)**:把 data-transmission **迁到 108**(回归设计形态——生产/医院 profile 本就配 Linux 路径、用户确认改造前本就在 Linux 跑;与 FastDFS 同机即可读本地磁盘)。
+- **迁移步骤(全自动)**:① SSH 免密(本机无 sshpass,用仓库里的 trilead-ssh2 jar 写 Java 推公钥)② scp 传 jar(184MB)+ `lib.zip`(Linux 原生库)③ 解压 `libjavaImg.so`+opencv3.4.16 全套 `.so`,跑 install.sh 注册 ldconfig ④ **yum 装 GTK3/cairo/gdk-pixbuf2/libtiff/gstreamer1**(opencv highgui 依赖,缺则 UnsatisfiedLinkError libgtk-3)⑤ 写 108 配置 `/home/soft/aivfo/aivfo-data-transmission/application-local.properties`(关键:`storagePath=/opt/fastdfs/storage`=108 FastDFS 真实路径、`jna.lib-path=/home/soft/aivfo/lib`、连 127.0.0.1 的 mysql/kafka/nacos)⑥ 停 Windows 端 ⑦ 108 启动(`setsid java -Xmx256m -Djna.library.path=/home/soft/aivfo/lib -jar ... </dev/null >run.log 2>&1 &`,note:nohup 不彻底 detach 会让 SSH 挂起,用 setsid+</dev/null)。
+- **验证**:① 用户给的 8 号舱样片实测抠图 `success=1, radius=616, 760ms`、输出 119KB(原生库能干活)② 108 自动抠图实证:**20:29 起各舱 700+ 张 `crop_state=1`,新图入库后 1 秒抠成功**(real-time)。
+- **结果**:
+  - ✅ **抠图迁 108 后恢复正常**(健康运行、Nacos 注册、`/actuator/health` UP)。
+  - ⏳ **视频合成**:逻辑正常,**非 bug**——日志「图片张数不足,视频需要 8 帧,只有 6 张图片,没有视频合成」。因抠图才从 20:29 成功、每胚胎每层才攒 6 个采集周期的图,差 2 帧。**再拍 2 轮(约 30 分钟)自动合成**。video 表 64 条 url 全空、video_splice 待合成队列消费中(48→26)。
+  - **原图查看**:`getSourcePictures` 代码改造前后**一字未改**(用 `sourceImageUrl`、`crop_state` 过滤已注释);`FastDFSClient` 也无改动;FastDFS 协议下载(`downloadFile`)实测通(621KB)。**原图链路本身没问题**。若前端仍看不到原图 = **前端(网页端,WebView2)拼下载地址的 IP/调用问题**(独立小问题,源码不在本仓库,待定位)。operate 详情页新老都只用 `imageUrl`(抠图),非原图入口。
+- ★**部署形态变更(运维须知)**:**data-transmission 现在跑在 108**(`/home/soft/aivfo/aivfo-data-transmission/`),不再在 Windows 跑。`start-all.sh` 已移除它。重启后 data-transmission 需在 108 单独起(命令见上)。Windows 端起 data-transmission 会与 108 抢 Kafka 消费组,**勿双开**。
+- **待明天**:接气源拍 2+ 轮 → 验证视频自动合成 + 前端能看图/视频;若原图仍看不到,定位网页前端的图片地址配置。