ソースを参照

配置统一与文档同步;.gitignore 补充编译产物忽略规则

- .gitignore 新增 bin/ obj/ *.flattened-pom.xml 等编译产物规则
- 移除已误入库的 .flattened-pom.xml
- 同步本地配置(application-local/App.config 等)与项目文档

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
huangjie 6 日 前
コミット
6b8dd8a
26 ファイル変更273 行追加143 行削除
  1. 20 0
      .gitignore
  2. 0 103
      aivfo-ai-middleware/aivfo-ai-middleware-lanucher/.flattened-pom.xml
  3. 5 4
      aivfo-business-manage/aivfo-business-manage-lanucher/aivfo-business-manage-app-lanucher/src/main/resources/application-local.properties
  4. 1 1
      aivfo-business-manage/aivfo-business-manage-lanucher/aivfo-business-manage-pc-lanucher/src/main/resources/application-local.properties
  5. 4 4
      aivfo-business-manage/aivfo-business-manage-lanucher/aivfo-business-manage-surface-lanucher/src/main/resources/application-local.properties
  6. BIN
      aivfo-business-manage/doc/img/图片筛选.png
  7. BIN
      aivfo-business-manage/doc/img/形态学标记导出.png
  8. BIN
      aivfo-business-manage/doc/img/胚胎形态学标记.png
  9. BIN
      aivfo-business-manage/doc/img/自动打标逻辑.png
  10. BIN
      aivfo-business-manage/doc/img/表格结构.png
  11. 1 1
      aivfo-data-transmission/aivfo-data-transmission-lanucher/src/main/resources/application-local.properties
  12. 1 1
      aivfo-front-manament-2.0/ivf_tl_Manage/App.config
  13. 1 1
      aivfo-gateway/aivfo-gateway-lanucher/src/main/resources/application-local.properties
  14. 1 1
      aivfo-oplog/src/main/resources/application-local.properties
  15. 2 1
      aivfo-service/src/main/resources/application-pro.properties
  16. 4 3
      aivof-tl-control/aivfo-tl-control-lanucher/src/main/resources/application-local.properties
  17. 5 2
      ivf_tl_operate_2.0/ivf_tl_Operate/App.config
  18. 2 0
      项目文档/开发环境/服务器测试环境.md
  19. 102 0
      项目文档/开发环境/连接配置清单-换服务器必读.md
  20. 1 0
      项目文档/开发计划/2026-06-17-M1-合并跑通子计划.md
  21. 1 0
      项目文档/开发计划/2026-06-17-M2-本地自动对焦子计划.md
  22. 78 0
      项目文档/进度/交接卡.md
  23. 6 6
      项目文档/进度/进度数据.js
  24. 15 14
      项目文档/进度/进度状态.yaml
  25. 8 0
      项目文档/需求文档/01-架构与合并方案.md
  26. 15 1
      项目文档/需求文档/14-全量操作日志方案.md

+ 20 - 0
.gitignore

@@ -1,2 +1,22 @@
 # CodeGraph 本地索引(用户本地生成,勿入库)
 .codegraph/
+*.log
+logs/
+log/
+临时文件/
+error/
+
+# Java / Maven 编译产物
+target/
+*.flattened-pom.xml
+
+# C# / .NET 编译产物
+[Bb]in/
+[Oo]bj/
+*.user
+*.suo
+.vs/
+
+# IDE
+.idea/
+*.iml

+ 0 - 103
aivfo-ai-middleware/aivfo-ai-middleware-lanucher/.flattened-pom.xml

@@ -1,103 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>com.aivfo</groupId>
-    <artifactId>aivfo-ai-middleware</artifactId>
-    <version>2.2.0.0-SNAPSHOT</version>
-  </parent>
-  <groupId>com.aivfo</groupId>
-  <artifactId>aivfo-ai-middleware-lanucher</artifactId>
-  <version>2.2.0.0-SNAPSHOT</version>
-  <dependencies>
-    <dependency>
-      <groupId>com.aivfo</groupId>
-      <artifactId>aivfo-ai-middleware-controller</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>commons-io</groupId>
-      <artifactId>commons-io</artifactId>
-      <version>2.13.0</version>
-    </dependency>
-  </dependencies>
-  <build>
-    <resources>
-      <resource>
-        <directory>src/main/resources</directory>
-        <excludes>
-          <exclude>application-dev.properties</exclude>
-          <exclude>application-hospital.properties</exclude>
-          <exclude>application-test.properties</exclude>
-        </excludes>
-      </resource>
-    </resources>
-    <plugins>
-      <plugin>
-        <groupId>org.springframework.boot</groupId>
-        <artifactId>spring-boot-maven-plugin</artifactId>
-        <version>2.2.7.RELEASE</version>
-        <executions>
-          <execution>
-            <goals>
-              <goal>repackage</goal>
-            </goals>
-          </execution>
-        </executions>
-        <configuration>
-          <skip>false</skip>
-        </configuration>
-      </plugin>
-      <plugin>
-        <artifactId>maven-deploy-plugin</artifactId>
-        <configuration>
-          <skip>true</skip>
-        </configuration>
-      </plugin>
-      <plugin>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>package</phase>
-            <goals>
-              <goal>single</goal>
-            </goals>
-          </execution>
-        </executions>
-        <configuration>
-          <descriptor>src/assembly/assembly.xml</descriptor>
-          <finalName>${project.name}</finalName>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>buildnumber-maven-plugin</artifactId>
-        <version>1.4</version>
-        <executions>
-          <execution>
-            <phase>validate</phase>
-            <goals>
-              <goal>create-timestamp</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>buildnumber-maven-plugin</artifactId>
-        <version>1.4</version>
-        <executions>
-          <execution>
-            <goals>
-              <goal>create-timestamp</goal>
-            </goals>
-          </execution>
-        </executions>
-        <inherited>false</inherited>
-        <configuration>
-          <timestampFormat>yyyyMMddHHmm</timestampFormat>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-</project>

+ 5 - 4
aivfo-business-manage/aivfo-business-manage-lanucher/aivfo-business-manage-app-lanucher/src/main/resources/application-local.properties

@@ -2,12 +2,13 @@
 server.port=10020
 spring.application.name=aivfo-business-manage-pc-dev
 server.servlet.contextPath=/api/businessManage/pc
+server.ip=192.168.0.108
 
 
 #==================数据库连接配置==================-
-aivfo.mybatis-plus.datasource.jdbcUrl=jdbc:mysql://192.168.31.89:3306/aivfo-tl?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true
+aivfo.mybatis-plus.datasource.jdbcUrl=jdbc:mysql://${server.ip}:3306/aivfo_tl?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true
 aivfo.mybatis-plus.datasource.username=root
-aivfo.mybatis-plus.datasource.password=Aivfo.2017
+aivfo.mybatis-plus.datasource.password=root
 aivfo.mybatis-plus.datasource.driverClassName=com.mysql.cj.jdbc.Driver
 #=====数据库安全、性能分析 开关
 aivfo.safety.enable=false
@@ -17,7 +18,7 @@ aivfo.mybatis-plus.p6spy.enable=true
 aivfo.mybatis-plus.platform=pc
 
 #==================nacos服务发现配置==================
-spring.cloud.nacos.discovery.server-addr=192.168.31.89:8848
+spring.cloud.nacos.discovery.server-addr=${server.ip}:8848
 
 #==================   swagger  ==================
 aivfo.doc.swagger.title=aivfo-business-manage-pc
@@ -28,7 +29,7 @@ aivfo.doc.swagger.base-package=com.aivfo.business.manage.pc.controller
 
 #==================   dfs  ==================
 aivfo.dfs.fastdfs.enable=true
-aivfo.dfs.fastdfs.trackerServers=192.168.31.89:22122,192.168.31.89:22123
+aivfo.dfs.fastdfs.trackerServers=${server.ip}:22122
 aivfo.dfs.fastdfs.storagePath.group1[0]=/mnt/data01/image/group1/storaged01
 aivfo.dfs.fastdfs.storagePath.group1[1]=/mnt/data01/image/group1/storaged02
 aivfo.dfs.fastdfs.storagePath.group1[2]=/mnt/data01/image/group1/storaged03

+ 1 - 1
aivfo-business-manage/aivfo-business-manage-lanucher/aivfo-business-manage-pc-lanucher/src/main/resources/application-local.properties

@@ -2,7 +2,7 @@
 server.port=10020
 spring.application.name=aivfo-business-manage-pc-dev
 server.servlet.contextPath=/api/businessManage/pc
-server.ip=localhost
+server.ip=192.168.0.108
 
 #==================数据库连接配置==================-
 aivfo.mybatis-plus.datasource.jdbcUrl=jdbc:mysql://${server.ip}:3306/aivfo_tl?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true

+ 4 - 4
aivfo-business-manage/aivfo-business-manage-lanucher/aivfo-business-manage-surface-lanucher/src/main/resources/application-local.properties

@@ -2,12 +2,12 @@
 server.port=10040
 spring.application.name=aivfo-business-manage-surface-dev
 server.servlet.contextPath=/api/businessManage/surface
-server.ip=192.168.0.91
+server.ip=192.168.0.108
 
 #==================数据库连接配置==================-
 aivfo.mybatis-plus.datasource.jdbcUrl=jdbc:mysql://${server.ip}:3306/aivfo_tl?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true
 aivfo.mybatis-plus.datasource.username=root
-aivfo.mybatis-plus.datasource.password=Aivfo.2017
+aivfo.mybatis-plus.datasource.password=root
 aivfo.mybatis-plus.multilingual.enable=true
 aivfo.mybatis-plus.multilingualControlProperties.tableName[0]=dictionary
 aivfo.mybatis-plus.multilingualControlProperties.tableName[1]=embryo_level
@@ -24,7 +24,7 @@ aivfo.mybatis-plus.p6spy.enable=true
 aivfo.mybatis-plus.platform=surface
 
 #==================nacos服务发现配置==================
-spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
+spring.cloud.nacos.discovery.server-addr=${server.ip}:8848
 spring.cloud.nacos.discovery.enabled=false
 
 #==================feign内部调用token==================
@@ -39,7 +39,7 @@ aivfo.doc.swagger.base-package=com.aivfo.business.manage.surface.controller
 
 #==================   dfs  ==================
 aivfo.dfs.fastdfs.enable=true
-aivfo.dfs.fastdfs.trackerServers=192.168.0.207:22122,192.168.0.207:22123
+aivfo.dfs.fastdfs.trackerServers=${server.ip}:22122
 aivfo.dfs.fastdfs.storagePath.group1[0]=/mnt/data01/image/group1/storaged01
 aivfo.dfs.fastdfs.storagePath.group1[1]=/mnt/data01/image/group1/storaged02
 aivfo.dfs.fastdfs.storagePath.group1[2]=/mnt/data01/image/group1/storaged03

BIN
aivfo-business-manage/doc/img/图片筛选.png


BIN
aivfo-business-manage/doc/img/形态学标记导出.png


BIN
aivfo-business-manage/doc/img/胚胎形态学标记.png


BIN
aivfo-business-manage/doc/img/自动打标逻辑.png


BIN
aivfo-business-manage/doc/img/表格结构.png


+ 1 - 1
aivfo-data-transmission/aivfo-data-transmission-lanucher/src/main/resources/application-local.properties

@@ -1,7 +1,7 @@
 server.port=10030
 spring.application.name=aivfo-data-transmission
 server.servlet.context-path=/api/data/transmission/server
-server.ip=localhost
+server.ip=192.168.0.108
 #数据库连接配置
 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

+ 1 - 1
aivfo-front-manament-2.0/ivf_tl_Manage/App.config

@@ -5,7 +5,7 @@
 		<add key="ClearLogDay" value="5" />
 		<add key="urlIp" value="http://192.168.1.92"/>
 		<add key="urlPort" value="10010" />
-		<add key="mqttIp" value="192.168.1.92"/>
+		<add key="mqttIp" value="192.168.0.108"/>
 		<add key="mqttPort" value="1883" />
 		<add key="Measurement" value="6" />
 		<add key="DownLoadMaxNum" value="1" />

+ 1 - 1
aivfo-gateway/aivfo-gateway-lanucher/src/main/resources/application-local.properties

@@ -1,7 +1,7 @@
 #==================端口服务名配置==================
 server.port=10010
 spring.application.name=aivfo-gateway-local
-server.ip=localhost
+server.ip=192.168.0.108
 
 #==================管理员配置==================
 aivfo.admin.account[0].username=admin

+ 1 - 1
aivfo-oplog/src/main/resources/application-local.properties

@@ -1,4 +1,4 @@
-server.ip=localhost
+server.ip=192.168.0.108
 # 数据源:log 库
 aivfo.mybatis-plus.datasource.jdbcUrl=jdbc:mysql://${server.ip}:3306/log?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true
 aivfo.mybatis-plus.datasource.username=root

+ 2 - 1
aivfo-service/src/main/resources/application-pro.properties

@@ -1,8 +1,9 @@
 server.port=7081
 server.max-http-header-size=50000
 spring.application.name=aivfo-service
+server.ip=192.168.0.108
 
-aivfo.mybatis-plus.datasource.jdbcUrl=jdbc:mysql://localhost:3306/aivfo_services?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true
+aivfo.mybatis-plus.datasource.jdbcUrl=jdbc:mysql://${server.ip}:3306/aivfo_services?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

+ 4 - 3
aivof-tl-control/aivfo-tl-control-lanucher/src/main/resources/application-local.properties

@@ -2,11 +2,12 @@
 server.port=10050
 spring.application.name=aivfo-tl-control
 server.servlet.contextPath=/api/tl/control
+server.ip=192.168.0.108
 #==================短信服务配置==================-
 com.aivfo.notify.url=http://211.149.139.131:7081/sms/sendMsg
 com.aivfo.notify.paramName=sendMsg
 #==================数据库连接配置==================-
-aivfo.mybatis-plus.datasource.jdbcUrl=jdbc:mysql://localhost:3306/aivfo_tl_setting?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true
+aivfo.mybatis-plus.datasource.jdbcUrl=jdbc:mysql://${server.ip}:3306/aivfo_tl_setting?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=false
@@ -17,7 +18,7 @@ aivfo.mybatis-plus.multilingual-control-properties.region=2
 #==================终  端  类  型==================
 aivfo.mybatis-plus.platform=pc
 #==================nacos服务发现配置==================
-spring.cloud.nacos.discovery.server-addr=localhost:8848
+spring.cloud.nacos.discovery.server-addr=${server.ip}:8848
 #==================   swagger  ==================
 aivfo.doc.swagger.title=aivfo-tl-control
 aivfo.doc.swagger.description=下位机控制接口说明
@@ -27,7 +28,7 @@ aivfo.doc.swagger.base-package=com.aivfo.tl.control.controller
 logging.level.com.aivfo=debug
 spring.main.allow-bean-definition-overriding=true
 #mqtt
-aivfo.mqtt.clients[0].url=tcp://127.0.0.1:1883
+aivfo.mqtt.clients[0].url=tcp://${server.ip}:1883
 aivfo.mqtt.clients[0].clientId=aivfo-tl-control-dev-wyl
 aivfo.mqtt.clients[0].username=aivfo
 aivfo.mqtt.clients[0].password=aivfo

+ 5 - 2
ivf_tl_operate_2.0/ivf_tl_Operate/App.config

@@ -18,10 +18,13 @@
 		<add key="urlIp" value="http://127.0.0.1" />
 		<!--内网接口的端口  本地层(重复键去重:以 operate 为准)-->
 		<add key="urlPort" value="10010" />
-		<!--内网mqtt的IP地址  本地层(重复键去重:以 operate 为准;IP 冲突统一为 operate 网段 192.168.1.92,control 原值 192.168.0.91 弃用;[M7] 现场核对)-->
-		<add key="mqttIp" value="127.0.0.1"/>
+		<!--内网mqtt的IP地址  本地层(重复键去重:以 operate 为准;2026-06-18 指向服务器测试环境 192.168.0.108,broker 在服务器)-->
+		<add key="mqttIp" value="192.168.0.108"/>
 		<!--内网mqtt的端口  本地层(重复键去重:以 operate 为准)-->
 		<add key="mqttPort" value="1883"/>
+		<!--Kafka 地址(M8 操作日志 oplog 发送端;缺此键则 App.xaml.cs:72 默认回退 127.0.0.1)2026-06-18 指向服务器 192.168.0.108-->
+		<add key="kfkaIP" value="192.168.0.108"/>
+		<add key="kfkaPort" value="9092"/>
 		<!--不可用模块,英文逗号隔开,示例-->
 		<!--<add key="houseEnabled" value="1,2"/>-->
 		<add key="houseEnabled" value=""/>

+ 2 - 0
项目文档/开发环境/服务器测试环境.md

@@ -103,6 +103,8 @@ curl http://192.168.0.108:8848/nacos/                                    # Nacos
 
 ## 五、微服务接入(把各端指向这台服务器)
 
+> 📌 各服务/各端**具体改哪些文件、哪些键**的完整清单见 **`连接配置清单-换服务器必读.md`**(换服务器照那个逐项改)。下面是要点:
+
 1. **改地址**:各微服务的连库 / Nacos / Kafka / FastDFS 地址,统一改成 `192.168.0.108:对应端口`(见第二节)。
 2. **MQTT**:各端 `App.config` / `properties` 里的 `mqttIp` 改成 `192.168.0.108`(端口 1883 不变)。
 3. **FastDFS**:业务侧 `server.ip` 指向 `192.168.0.108` 即可,**原生部署无需双IP映射**(见第六节)。

+ 102 - 0
项目文档/开发环境/连接配置清单-换服务器必读.md

@@ -0,0 +1,102 @@
+# 连接配置清单 —— 换中间件服务器照这个改
+
+> 用途:中间件(MySQL/Redis/Nacos/Kafka/FastDFS/MQTT)换一台服务器时,**照本文逐项改 IP/端口/账号密码**即可,不用满仓找。
+> 当前中间件部署:**服务器测试环境 `192.168.0.108`**(详见 `服务器测试环境.md`,本文连接信息与之对齐)。
+> 最后同步:2026-06-19。改动来源见 `进度/交接卡.md` 同日两段。
+
+> ## ✅ 2026-06-19 集群实测核验(claude 恢复会话)
+> 本文配置已在真实集群启动中验证,结论:
+> - **真实凭证连通全过**:MySQL `root/root`(7 库表数全对)、Redis `123456`(+PONG)、Nacos `nacos/nacos`(鉴权已关)、Kafka(oplog producer 连上)、MQTT 端口通;均为新服务器 `192.168.0.108`。
+> - **6 微服务真实启动 + 注册 Nacos**:gateway(10010)/tl-control(10050)/business-pc(10020)/oplog(10060)/data-transmission(10030)/surface;Hikari 连库、Kafka producer、Nacos 注册均成功。
+> - **业务闭环已验**:登录(gateway,admin/123456 拿 token)、tl-control 读(getAlarmTypeList 返真实数据)+ 写(update alarm_type mute 入库查实再还原)、business-pc 读(查 DB 返标准结果)、oplog(Kafka→operation_log 入库)。
+> - **⚠ 补执行了 2 条漏掉的 DB 迁移**(否则系统报错):`operation_log` 表(log 库)、`autofocus-data-layer`(aivfo_tl_setting 加对焦列,tl-control 启动曾因缺列报错)。
+> - **✅ gateway 路由已验证通**:经 gateway(10010)转发下游连续 5/5 返完整数据(getAlarmTypeList 1806B、写 update 真实入库)。注:服务**刚重启未启动完时**经 gateway 会短暂返空 200(负载均衡无健康实例),等服务起完即恢复——非 bug。operate/front 走的 gateway→微服务→DB 路径通。
+> - **⚠ business-app 配置实锤错误**:见下方第二节注 5(已从"疑"升级为"确认")。
+
+---
+
+## 一、中间件连接信息(当前 192.168.0.108)
+
+| 组件 | IP:端口 | 账号 | 密码 | 业务里怎么连 |
+|---|---|---|---|---|
+| **MySQL** | 192.168.0.108:**3306** | root | root | Java 各服务 jdbcUrl;C# 不直连 |
+| **Redis** | 192.168.0.108:**6379** | — | **123456** | ✅实测可连(+PONG)但 **全仓代码无任何服务使用 Redis**(无 `data-redis`/`RedisTemplate`/`Jedis`/`Redisson` 依赖)→ 部署了但不参与运行,换机**无需为它改任何配置** |
+| **Nacos** | 192.168.0.108:**8848**(+9848) | nacos | nacos | Java `spring.cloud.nacos.discovery.server-addr` |
+| **Kafka** | 192.168.0.108:**9092** | 无 | 无 | Java `aivfo.kafka.properties.ips`;C# operate 的 `kfkaIP`(oplog) |
+| **FastDFS** | tracker **22122** / storage 23000 / nginx **8888** | 无 | 无 | Java `aivfo.dfs.fastdfs.trackerServers`(只一个 tracker:22122) |
+| **MQTT**(Mosquitto) | 192.168.0.108:**1883** | aivfo | aivfo | Java `aivfo.mqtt.clients[0].url`;C# `mqttIp` |
+
+> 常用 MQTT topic:`TL/House/pc`、`TL/House/surface`、`TL/House/app`、`TL/DATA/{tlSn}`。
+
+---
+
+## 二、Java 微服务端 —— 换机只改每服务一行 `server.ip`
+
+**机制**:每个**激活**服务的 `application-{profile}.properties` 顶部有 `server.ip=`,其下各连接(MySQL/Nacos/Kafka/FastDFS)统一写 `${server.ip}`。**换服务器 = 把下表 8 个文件的 `server.ip` 改成新 IP**(连接行不用动)。激活 profile:除 `aivfo-service`=`pro`,其余均 `local`。
+
+| 服务 | 配置文件(相对仓库根) | profile | 连的中间件 | 库名 |
+|---|---|---|---|---|
+| gateway | `aivfo-gateway/aivfo-gateway-lanucher/src/main/resources/application-local.properties` | local | MySQL/Nacos/FastDFS | aivfo-auth |
+| data-transmission | `aivfo-data-transmission/aivfo-data-transmission-lanucher/.../application-local.properties` | local | MySQL/Nacos/**Kafka**/FastDFS | aivfo-tl(中划线) |
+| oplog | `aivfo-oplog/src/main/resources/application-local.properties` | local | MySQL/Nacos/**Kafka** | log |
+| business-**pc** | `aivfo-business-manage/.../aivfo-business-manage-pc-lanucher/.../application-local.properties` | local | MySQL/Nacos/FastDFS | aivfo_tl(下划线) |
+| business-**surface** | `.../aivfo-business-manage-surface-lanucher/.../application-local.properties` | local | MySQL/Nacos*/FastDFS | aivfo_tl |
+| business-**app** | `.../aivfo-business-manage-app-lanucher/.../application-local.properties` | local | MySQL/Nacos/FastDFS | ⚠ aivfo-tl(中划线,疑指错库) |
+| tl-control | `aivof-tl-control/aivfo-tl-control-lanucher/src/main/resources/application-local.properties` | local | MySQL/Nacos/**MQTT** | aivfo_tl_setting |
+| aivfo-service | `aivfo-service/src/main/resources/application-pro.properties` | **pro** | MySQL | aivfo_services |
+
+**换机要点 / 注意**:
+1. 8 个 `server.ip` 改新 IP 即可覆盖 MySQL+Nacos+Kafka+FastDFS+MQTT。
+2. **MySQL 账号密码**:全部 `root/root`(与服务器一致)。若新服务器账号变,改各档 `aivfo.mybatis-plus.datasource.username/password`。(历史坑:app/surface 曾是 `Aivfo.2017`,2026-06-18 已统一 root。)
+3. **Redis**:配置文件无显式 host;若新服务器 Redis 需配置,要确认框架默认是否够用(密码 123456)。
+4. **FastDFS**:服务器只一个 tracker → `${server.ip}:22122`(勿写回双 tracker `:22122,:22123`)。
+5. ⚠⚠ **business-app 配置实锤错误(2026-06-19 确认,非本次换机引入,git 改前即如此)**:`aivfo-business-manage-app-lanucher/application-local.properties` 是 **pc 档的整体克隆**——`spring.application.name=aivfo-business-manage-pc-dev`、`server.port=10020`、`contextPath=/api/businessManage/pc`、`platform=pc`、`base-package=...manage.pc.controller` 全是 pc;且**连错库** `aivfo-tl`(中划线,实测仅 4 张视频表 video/video_pictures/video_splice/video_update,是 data-transmission 的库)≠ pc/surface 的 `aivfo_tl`(下划线,25 张业务表)。后果:①与 pc 端口/服务名冲突,二者**不能同起**(实测集群只起了 pc,未起 app);②即便单起,连 `aivfo-tl` 取不到业务表(embryo/case_info/picture 等都不在该库)。**建议修法**(待你拍板,涉及改运行行为故未擅改):app 档应=pc 档结构 + app 专属身份(name=aivfo-business-manage-app-dev、contextPath=/api/businessManage/app、platform=app、base-package=...app.controller)+ DB 改 `aivfo_tl`(下划线)。
+6. `surface` 的 `nacos.discovery.enabled=false`(本就不注册)。
+7. `ai-middleware` 激活档**无任何中间件连接**(只有文件路径),换机不用动。
+8. 非激活 profile(`-dev/-test/-hospital`)里有过期 IP,**当前不生效**,如启用需另改。
+
+---
+
+## 三、C# 客户端 —— 配 IP/端口的地方(operate / front)
+
+### ★★ 两个大坑(改前必看)★★
+1. **`#if DEBUG` 会覆盖 App.config**:`AppData.cs` 构造函数里有 `#if DEBUG` 块,**DEBUG 编译时无条件写死**指向外网 `test-gateway.aivfo.com` / `211.149.139.131`,**App.config 完全不生效**。→ 部署给客户/连测试服务器,必须 **Release 编译**。
+2. **`outInter` 内外网开关**:App.config `outInter=1` 时,代码改用硬编码外网地址(忽略 App.config 的 url/mqtt)。→ 连内网中间件必须 **`outInter=0`**。
+   - 满足"Release + outInter=0"后,下表 App.config 的键才真正生效。
+
+### operate(`ivf_tl_operate_2.0/ivf_tl_Operate/`)
+App.config(`App.config`)键 → 代码读取处 `AppData.cs:79-82`、Kafka 在 `App.xaml.cs:72`:
+
+| 键 | 含义 | 当前值 | 换机设为 |
+|---|---|---|---|
+| `outInter` | 内/外网(0=内网读本表) | 0 | 0 |
+| `urlIp` + `urlPort` | **gateway** 地址 | http://127.0.0.1 : 10010 | gateway 所在机(微服务在本机→127.0.0.1) |
+| `mqttIp` + `mqttPort` | **MQTT** broker | 192.168.0.108 : 1883 | MQTT 所在机=192.168.0.108 |
+| `kfkaIP` + `kfkaPort` | **Kafka**(oplog 操作日志,M8) | 192.168.0.108 : 9092 | Kafka 所在机=192.168.0.108 |
+
+> 硬编码默认(App.config 缺键/DEBUG 时才用):`AppData.cs:59` BaseUrl、:61 MqttIp;`App.xaml.cs:72` kfkaIP 默认 127.0.0.1。
+
+### front 中央管理端(`aivfo-front-manament-2.0/ivf_tl_Manage/`)
+App.config 键 → 代码读取处 `AppData.cs:83-86`:
+
+| 键 | 含义 | 当前值 | 换机设为 |
+|---|---|---|---|
+| `outInter` | 内/外网 | 0 | 0 |
+| `urlIp` + `urlPort` | gateway 地址 | http://192.168.1.92 : 10010 | ⚠ gateway 所在机(待按 front 实际部署机定) |
+| `mqttIp` + `mqttPort` | MQTT broker | 192.168.0.108 : 1883 | 192.168.0.108 |
+
+> front 无 Kafka/oplog 接入。硬编码默认 `AppData.cs:123-125`。
+
+### control(`ivf_tl_control_2.0/ivf_tl_ControlTest/App.config`)
+含 `urlIp/kfkaIP/mqttIp`(值 192.168.0.91),但 **control 合并为 operate 单进程后,运行期读 operate 的 App.config,ControlTest 这份失效**(且该工程计划退役,见 01 §5.5)。**换机无需改它。**
+
+---
+
+## 四、换服务器操作清单(checklist)
+
+1. [ ] 新服务器装好 6 中间件,记下新 IP 与端口/账号密码(更新本文第一节 + `服务器测试环境.md`)。
+2. [ ] Java:改第二节 **8 个 `server.ip`** 为新 IP;如账号密码变,改各档 datasource user/pwd。
+3. [ ] C#:确认 **Release 编译 + `outInter=0`**;按第三节改 operate/front 的 `urlIp/mqttIp/(operate)kfkaIP`。
+4. [ ] Redis 若启用:确认 host/密码生效。
+5. [ ] 建库 + migration(见 `进度状态.yaml` 部署前置)。
+6. [ ] 起服务冒烟:gateway→各微服务注册 Nacos→operate 登录→MQTT 收发→拍图入 FastDFS→操作日志入 operation_log。

+ 1 - 0
项目文档/开发计划/2026-06-17-M1-合并跑通子计划.md

@@ -23,6 +23,7 @@
 **代码隔离原则(01 §5,全程遵守)**:
 - 不顺手重构 `ComBin`/`Channel`/`Camera`/`HouseBin` 的老协议逻辑;HAL 实现内部**调用**旧类,不改旧类内部。
 - 死代码先不删(`Window1` 的注释块、调试页旧 `ClosePort` 等),合并稳定后再清理;本计划仅"停用 + 隔离"。
+- **`ivf_tl_control_2.0` 整目录退役(删除)= 合并收尾动作,不在本计划执行**。解锁判据(01 §5.5,全满足才删):① 本 M1 真机验证通过(V-011~V-016 等) ② operate 现以 3 条 ProjectReference 引用的 `ivf_tl_Control`/`IvfTl.Hardware`/`IvfTl.AutoFocus` 物理并入合并解决方案 ③ 消解 operate/control 同名程序集(`ivf_tl_Entity`/`ivf_tl_Services`)冲突 ④ 改完引用编译 0 error。届时另起清理 Task。
 - 关键 hack 单独记录(control `StartRun` 里 MessageBox + SendMessage 点 Yes 的 hack、明文账号密码)。
 - 改前用 codegraph / grep 查调用面(C# 符号提取有限,必要时直接读调用方)。
 

+ 1 - 0
项目文档/开发计划/2026-06-17-M2-本地自动对焦子计划.md

@@ -25,6 +25,7 @@
 **代码隔离原则(01 §5,全程遵守)**:
 - 移植算法类时**不重构**其内部逻辑;只把它对硬件的依赖(`HouseMotor`/`SerialMotor`/`Camera`)换成 HAL 接口(`ISerialChannel`/`ICamera`),认准 03 §1 踩坑修复(÷mean 一次、丢残留帧、到位延时、按命令分超时),**逐字保留**。
 - **不移植测试外壳**:`SelfTest/SmokeTest/Calibrate/CalibTest/ToPng/CalibWindow/MainWindow.*`(03 §1 明列)。这些是 autofocustool 的 GUI/命令行驱动壳,合并端由 control 业务流与调试页驱动。
+- **`autofocustool` 整目录退役(删除)= 移植收尾动作,不在本计划执行**。现状:编译上已无任何工程引用(算法移植入 `IvfTl.AutoFocus`),但它是 `Protocol.cs` 下位机协议**权威**与对焦算法**逐行比对参照**。解锁判据(01 §5.5):**M2 真机验证通过**(V-020 + 对焦链 V-041~V-067,移植结果与原 autofocustool 一致)后方可删;验证期保留本地副本作比对/排障基准。
 - 死参数勿动:只移植 03 §3.2 在用参数(粗 `ZCoarseCenter=90000±30000` 步距 2000、精 `±6000` 步距 500),勿引入 §3.5 死参数(`HScanRange/ZHalf/ZLayers` 等旧未用字段)。
 
 **Git 说明**:根目录非 git 仓库,"Commit"步骤无法执行。每个 Task 末尾检查点用"保存并核对文件 + grep 残留"代替。

+ 78 - 0
项目文档/进度/交接卡.md

@@ -277,3 +277,81 @@
 - 源码核对硬断言全命中:oplog:10060 / operation_log 建表 / @OperateLog 3控制器4方法 / oplog-client 依赖 / tl-control 对焦列已补(V-047/V-064)。
 - 红线遵守:需求文档/01-14 与 00 业务语义只读;开发计划仅改状态/顺序。待用户定残项:5-1/5-2(需求12 的 EMQX/doc-11 引用)、6-1(M8-P1 断链 项目部署/→开发环境/)。
 - ★项目实际进度【未变】:仍是 M8 核心代码完成、真机验证 operate"串口失败"为断点。本轮不动代码、不动业务语义★。
+
+## 2026-06-18 22:10 · 14号方案补「两表合查排障」小节(纯文档,源自答疑核实)
+- 起因:用户连续追问日志组件关系,最后确认"同一 trace_id 查 operation_log + system_log 可更完整还原业务流程"。在代码里核实后回写文档。
+- 核实(codegraph):`TraceIdAspect.restLogAround` 一次性 `Trace.context().set(traceId)` + `MDC.put(TRACE_ID, traceId)`→两表 trace_id 同源同值;operation_log 走 Trace.context(OperateLogAspect),system_log 走 MDC(LoggerDBAppender)。`logback-aivfo.xml` DB appender 挂 `LevelFilter level=error`→system_log **只记 ERROR**(非"默认关")。
+- 改动:14-全量操作日志方案.md 新增 §7.1「两表合查排障」(同源保证/互补分工/排障姿势/三边界:须@BuildTraceId、system_log仅ERROR、C#段只有operation_log);并校正 §8 现状句"默认关"→"随 enable=true 开启、LevelFilter 只记 ERROR"。
+- 答疑结论(未落库,备记):两套日志非重复,是"一套机制@OperateLog + 两落点(operation_log/system_log) + 独立消费微服务 aivfo-oplog + C#端 Aivfo.OperationLog";建议不合并(拆分是为 log 组件不强依赖 kafka)。Aivfo.OperationLog 是类库,随 operate 发布产物带出,不单独装。ivf_tl_control_2.0 仍被 operate ProjectReference 引用(3工程),M1真机验证+依赖物理迁移前不可删。
+- 不动代码、不动业务语义、项目实际进度未变(仍为 M8 真机验证 operate 断点)。
+
+## 2026-06-18 22:35 · 方案+计划补「control/autofocustool 整目录退役判据」(纯文档,源自答疑核实)
+- 起因:用户问 ivf_tl_control_2.0 与 autofocustool 能否删;核实后判据写入方案与计划(用户明确"写进方案和计划",不进进度状态.yaml/交接卡当数据)。
+- 核实(grep csproj/sln):①control 仍被 operate 3 条 ProjectReference 引用(ivf_tl_Operate.csproj:624/627/630→ivf_tl_Control/IvfTl.Hardware/IvfTl.AutoFocus)→不可删。②autofocustool 全仓无任何工程引用(算法已移植入 IvfTl.AutoFocus,仅 IvfTl.AutoFocus.csproj:7 一句移植注释);其子工程 Calibrate/CalibTest/SelfTest/SmokeTest/ToPng 为测试外壳,不在任何 sln→编译可删,但为协议权威/比对参照,建议留到 M2 真机验证后。
+- 改动:①需求文档/01-架构与合并方案.md §5 新增第5条「整目录退役判据」表(两目录现状+全满足才删的判据)。②开发计划/M1子计划 范围约束加 control 整目录退役解锁条件(M1验证+物理并入+消同名程序集+编译绿)。③开发计划/M2子计划 范围约束加 autofocustool 退役条件(M2真机验证 V-020/V-041~067 通过)。
+- 不动代码/业务语义;进度未变(仍 M8 真机验证 operate 断点)。删除动作本身待对应里程碑验证通过后另起清理 Task。
+
+## 2026-06-18 23:10 · Java 微服务连接 IP 统一指向服务器测试环境 192.168.0.108
+- 起因:用户把中间件部署到服务器测试环境(192.168.0.108,见 开发环境/服务器测试环境.md),要把各处连接 IP 改到位。
+- 勘察:激活 profile=local(仅 aivfo-service=pro);IP 全在本地 properties、不走 Nacos;公共 application.properties 无连接配置。Redis 全仓配置 0 处(走框架默认/未配,本次无可改行)。
+- 改法(用户定):统一 server.ip=192.168.0.108 + 各连接用 ${server.ip}。改了 8 文件:
+  - 干净档(原已 ${server.ip},仅改 server.ip 一行):gateway / data-transmission / oplog / business-pc。
+  - 散落硬编码档(规整为 server.ip + ${server.ip}):business-app(192.168.31.89→)、business-surface(server.ip 192.168.0.91 + nacos 127.0.0.1 + dfs 192.168.0.207→)、tl-control(localhost + mqtt 127.0.0.1→)、aivfo-service pro(localhost→,新增 server.ip)。
+  - 密码:business-app / surface 的库密码 Aivfo.2017→root(服务器 MySQL root/root,其余服务本就 root/root)。
+  - FastDFS:原双 tracker(:22122,:22123)统一为单 ${server.ip}:22122(服务器只有一个 tracker)。
+- 核实:grep 全激活档无残留 localhost/127.0.0.1/旧IP(仅 tl-control 短信外部URL 211.149.139.131 保留,非中间件)。
+- ★疑点已标给用户、未擅改★:①business-app 端口 10020/服务名 aivfo-business-manage-pc-dev 与 pc 完全相同(疑 pc 遗留克隆,二者不能同起);②app 库名 aivfo-tl(中划线)≠ pc/surface 的 aivfo_tl(下划线业务库),疑指错库——只改 IP/密码,库名未动;③surface nacos discovery.enabled=false(本就不注册)。
+- ★未改:C# App.config(operate/front 的 urlIp/mqttIp)★——取决于微服务跑在哪(SITE-NET 决策),待用户定。Redis 若实际启用需另配 host:6379/密码123456。
+- 回写:进度状态.yaml SITE-NET 已更新为"部分推进"。代码改动未提交,待 C# 决策后一并提交。
+
+## 2026-06-18 23:40 · C# 客户端连接 IP 改向 + 产出《连接配置清单-换服务器必读.md》
+- 用户决策:微服务在本机、中间件在服务器(192.168.0.108)。据此:C# urlIp 指本机 gateway、mqttIp 指服务器 broker。
+- ★查清 C# 端两大坑(已写入清单)★:①AppData.cs 有 #if DEBUG 块无条件覆盖 App.config→DEBUG 编译时写死外网 test-gateway.aivfo.com/211.149.139.131,App.config 不生效→连内网中间件必须 Release 编译;②outInter=1 走硬编码外网→必须 outInter=0。满足"Release+outInter=0"App.config 才生效。
+- C# 改动:
+  - operate App.config:mqttIp 127.0.0.1→192.168.0.108;新增 kfkaIP=192.168.0.108/kfkaPort=9092(原缺键→App.xaml.cs:72 默认回退 127.0.0.1,oplog 发不到服务器 Kafka);urlIp 保持 http://127.0.0.1(gateway 在本机);outInter 本就 0。
+  - front App.config:mqttIp 192.168.1.92→192.168.0.108;urlIp 仍 192.168.1.92(gateway 所在机,front 实际部署机待定,已在清单标注)。
+  - control ControlTest App.config 未改(合并后读 operate 的、且该工程将退役)。
+- 新文档:项目文档/开发环境/连接配置清单-换服务器必读.md —— 中间件连接总表 + Java 8 服务"改一行 server.ip" + C# 配置点(含 DEBUG/outInter 坑)+ 换机 checklist。服务器测试环境.md §5 加了交叉引用。
+- C# 仅改 App.config(非 .cs),无需 codegraph sync。代码+文档改动尚未提交。
+
+## 2026-06-19 00:10 · 灾后恢复:全量重编译 + 集群拉起 + 业务闭环实测(claude 自主夜跑)
+> 背景:用户私自把中间件全搬到服务器 192.168.0.108、改了一批连接配置、删了编译产物、还删过 git 历史(git 不可信)。方案 A「向前重建」:不靠 git,用「能编译/能连/能跑」重建可信基线。用户授权自主通宵执行,守住一条红线:**不无人值守驱动真机电机**(物理不可逆;详见本段末)。
+
+### 一、连通鉴权自检(真实凭证,全过)
+- MySQL `root/root`:JDBC 真连 7 库,表数全对(auth4/services2/tl4/setting17/tl25/log1/quartz11)。
+- Redis `123456`:RESP 裸协议 `+OK +PONG`。Nacos `nacos/nacos`:登录 globalAdmin(鉴权已关)。
+- Kafka/MQTT/FastDFS 端口 OPEN;Kafka 真连由 oplog producer 启动实证(Cluster ID 拿到)。
+- 结论:服务器完全可用,**未动用本地 Docker 后备**。
+
+### 二、全量重编译(全绿)
+- Java:先 `mvn -DskipTests install` aivfo-framework(底座,1:17 SUCCESS),再 7 微服务**全部 EXIT 0**(gateway/tl-control/business-manage/data-transmission/oplog/aivfo-service/ai-middleware)。
+- C#:operate、front 两个 sln `dotnet build -c Release` **均 EXIT 0**(纯 warning 无 error)。注:operate/front 是 SDK 风格 net6.0-windows,dotnet 直接可编。
+- ★源码没丢,用户删的是 target/ 产物;本地仓库 com/aivfo SNAPSHOT 仍在。
+
+### 三、补执行 2 条漏掉的 DB 迁移(否则系统起不来)
+- `2026-06-18-operation-log.sql` → log 库建 `operation_log` 表(原仅 system_log;oplog 消费曾因表缺失静默失败)。
+- `2026-06-17-autofocus-data-layer.sql` → aivfo_tl_setting 建 house_autofocus_calibration 表 + tl_setting 加 5 列 + house_well_setting 加 2 列(tl-control 启动曾报 `Unknown column focus_layer_spacing_pulse`)。已 DESC 校验全部生效。
+
+### 四、集群拉起(7 服务全起;-Xmx256m,内存仅~1.8G 故分波)
+- 已起并 LISTENING:gateway 10010 / business-pc 10020 / data-transmission 10030 / surface 10040 / tl-control 10050 / oplog 10060 / aivfo-service 7081。注册 Nacos 5 个(surface 设计上 discovery.enabled=false 不注册)。
+- ★data-transmission 曾报 `UnsatisfiedLinkError JavaImageDLL`★:仅设 jna.library.path 不够(报"找不到指定的模块");**按本仓 进度数据.js 既载提示,把 `aivfo-data-transmission/lib` 加进**进程 PATH**(JavaImageDLL 依赖 opencv_world3416.dll,DLL 依赖链走 PATH)即启动成功**。启动命令:`PATH=<repo>/aivfo-data-transmission/lib:$PATH java -Djna.library.path=<lib> -jar ...`。
+- business-app 未起(端口 10020 与 pc 冲突,见下方实锤缺陷);ai-middleware 无中间件依赖未起。
+
+### 五、业务闭环实测(调用→入库→查库,全过)
+- **登录**(gateway):POST /api/gateway/auth/login `admin/123456`→code2000 拿 JWT。★admin 密码 = `123456`(算法 MD5(盐+pw+盐),盐 vik3KtL4...,管理员跳过权限校验)。
+- **tl-control 读**:POST /alarmSysSetting/getAlarmTypeList→返真实 alarm_type 数据(PRESS/TEMP...)。
+- **tl-control 写(可逆)**:POST /alarmSysSetting/update 把 id=44 mute 1→0,JDBC 查库确认 mute=0,再还原为 1。**写库链路实证**。
+- **business-pc 读**:POST /embryoCultureRecord/getTlInfoList→code2000 标准结果(查 DB)。
+- **oplog 端到端**:Java Kafka producer 发 tl-oplog→oplog 消费→写 operation_log→JDBC 查到 id=1 字段全对。**排障 backbone 实证可用**。
+
+### 六、踩坑/待办(给你醒来接)
+1. ~~gateway 路由返空体~~ **【已查清=假警报,非bug】**:首测时 tl-control 刚因迁移修复**重启、未启动完**,gateway 负载均衡尚无健康实例 → 返空 200。集群全稳后复测:经 gateway 调 getAlarmTypeList 连续 5/5 返 1806 字节、getAlarmTemplatePageList 1022、business-pc getTlInfoList 正常、经 gateway 写 update 也真实入库并返 150 字节。**结论:operate/front 走的 gateway→微服务→DB 完整路径通,无需处理**。
+2. ★**business-app 配置实锤错误**(历史遗留,非本次):app 档是 pc 整体克隆(name/port10020/context/platform/base-package 全 pc)+ 连错库 aivfo-tl(横,仅4视频表)。已在《连接配置清单》注5 升级为"确认"并给修法,**涉及改运行行为故未擅改,待你拍板**。
+3. **Redis 实为未使用**:全仓无 data-redis 依赖,部署了不参与运行,换机无需为它改配置。《连接配置清单》已更正。
+4. **data-transmission 原生库**:需在运行机补 JavaImageDLL 的依赖 DLL(VC++ 运行时/OpenCV)。
+5. **单元测试**:Java 侧 0 个 @Test;「M2-02 单测15/15」实为 C# autofocustool 的控制台自测(SelfTest=硬件自检/SmokeTest=冒烟/CalibTest=离线读图),**非断言式单测,且需硬件或样本图**,当前无法复现"15/15"数字——未伪造。
+
+### 七、真机/硬件红线(已与你确认)
+- operate 机器控制(电机/阀门/相机)=界面按钮直接开串口(ComBin/SerialBin);也有 CLI 路径 `SelfTest.exe`(真实动电机)。**未在无人值守时驱动**:GUI 无法无头点击 + 物理动作不可逆(舱内或有样本)。你在场说"舱内空、可动"后我再连跑,出问题实时拉 trace_id 判读。
+- 临时探针/脚本都在 `临时文件/`(DbProbe/TableList/OplogProducer/QueryLog/SqlRunner/start-cluster.sh 等)。集群进程仍在后台跑,日志在 临时文件/run-*.log。
+- 改动(配置/迁移已落服务器库 + 文档)尚未 git 提交,待你过目。

+ 6 - 6
项目文档/进度/进度数据.js

@@ -1,12 +1,12 @@
 // 进度数据(监控面板.html 读取)。每完成一步由助手回写,generatedAt 用于停滞检测。
 window.PROGRESS_DATA = {
   project: "时差培养箱合并改造",
-  generatedAt: "2026-06-18T20:41:00",
-  currentTask: "★M8 核心代码层完成(P1+P2+P3a+P3b+Pjava):三端日志机制全通 + operate主战场接入 + data-transmission真实接入(真实登录链路 operator/traceId 已验证);剩 front/tl-control/business接入 + Java生产服务铺@OperateLog + 逐方法手埋(应用层)+ 真机验证(需用户GUI)★",
-  currentStep: "Pjava完成:data-transmission 加 aivfo-oplog-client 依赖,3控制器4方法(设备设置更新/重初始化缓存/查询缓存/上传图片)加@OperateLog;真实链路自测——带JWT请求 operator=张医生_doctor_zhang+trace_id=真实值入operation_log,匿名请求 operator=anonymous;证 P2 机制在真实微服务+登录链路下 operator/traceId 正确填充,中文utf8mb4正确。新坑:data-transmission启动须把 aivfo-data-transmission/lib 加入进程PATH(JavaImageDLL依赖opencv_world3416.dll,DLL依赖链走PATH)",
-  nextStep: "★真机验证点(需用户GUI):跑operate进调试页→'串口失败'会被记operation_log→查日志排查任务#4(做日志的初衷)★;剩余代码层:front接入/tl-control+business接入(需先加kafka)/Java生产服务铺@OperateLog/逐方法手埋/§10配置集中下发;M8优先于M6/M7",
-  phase: "★★全部代码编译通过★★ C#合并端0error+M2-02单测15/15+四微服务BUILD SUCCESS+front 0error;M8三端日志链路全通",
-  note: "装.NET8+用既有JDK11后整个改造代码全部编译通过:C#(M1合并/M2对焦/M4UI/M5配置)0error;Java四微服务(tl-control/business/data-transmission/gateway)BUILD SUCCESS;M2-02单测15/15;Nexus可达。运行期中间件已就绪(docker 7容器:MySQL/Redis/Nacos/Kafka/FastDFS/MQTT-Mosquitto),M8端到端验证已用之、后端4微服务真机冒烟全绿;本机测试统一localhost/127.0.0.1。剩余=真机/下位机类验证(125待验证项需下位机/Surface/operate GUI/服务集群)。V-047真实状态:C#本地缓存链已通+服务器下发链Java/C#已补全并随四微服务编译通过,运行/真机待验。",
+  generatedAt: "2026-06-19T00:20:00",
+  currentTask: "★灾后恢复·方案A向前重建:全量重编译全绿(Java7微服务+底座 + C# operate/front 0error);连通鉴权全过;补执行2条漏掉DB迁移(operation_log+autofocus);集群已起6服务并业务闭环实测(登录/tl-control读写入库查实/business-pc读/oplog Kafka→库)。真机硬动作待用户在场★",
+  currentStep: "集群拉起:gateway10010/business-pc10020/surface10040/tl-control10050/oplog10060/aivfo-service7081 均LISTENING,前4注册Nacos;业务闭环:admin/123456登录拿token、tl-control update mute入库查实再还原、business-pc getTlInfoList查库、oplog发tl-oplog→operation_log入库id=1字段全对。data-transmission按本js既载提示用PATH加lib(JavaImageDLL+opencv_world3416)重试中",
+  nextStep: "①gateway路由已验证通(经网关5/5返完整数据,前测空200=服务重启窗口假象已排除);②定夺business-app实锤缺陷(pc克隆+连错库aivfo-tl);③data-transmission已用PATH加lib起通,部署他机需带原生DLL;④用户在场确认舱内安全后跑SelfTest真机控制;⑤过目后git提交(配置+迁移+文档已对齐)",
+  phase: "★★全量重编译全绿 + 6微服务真实运行 + 业务闭环实测通过★★ 软件层可信基线已重建;真机硬件动作与gateway路由待续",
+  note: "2026-06-19灾后恢复:用户搬中间件到服务器192.168.0.108+删产物+删git历史后,不靠git、用能编译/能连/能跑重建。Java7服务+framework+C#两端全0error;MySQL/Redis/Nacos/Kafka真实凭证连通;补建operation_log表+autofocus列(原漏迁移致tl-control/oplog报错);6服务起+Nacos注册;业务CRUD闭环(调用→入库→查库)实测过。待办见交接卡2026-06-19段。原M8/各里程碑代码状态不变(下方planTasks仍有效)。",
   planTasks: [
     { id: "Task1-4", name: "进度文件组(4文件)", status: "☑" },
     { id: "Task5", name: "M0-00 文档源码审核", status: "☑" },

+ 15 - 14
项目文档/进度/进度状态.yaml

@@ -1,16 +1,16 @@
 # 续接断点状态(机器可解析)。换会话/换电脑后首先读它定位。
 # 状态取值: 未开始 / 进行中 / 完成 / 代码完成待验证
 # 纪律:本字段只存【当前断点】,历史细节进 交接卡.md(见 CLAUDE.md 第三节)。
-更新时间: 2026-06-18 20:41
+更新时间: 2026-06-19 00:15
 当前任务: >
-  M8 全量操作日志【核心代码层完成且端到端自测通过】:P1 基础设施(operation_log 表 + aivfo-oplog 微服务:10060)/
-  P2 Java 机制(@OperateLog 切面→Kafka,data-transmission 3 控制器 4 方法已埋)/P3a C# 组件(Aivfo.OperationLog)/
-  P3b operate 主战场接入/Pjava data-transmission 真实接入——三端链路全通,全链路 traceId 对齐,
-  真实登录链路 operator/traceId 已验证(Kafka→operation_log 入库正确)。
-  下一步:①【真机验证 operate,做日志的初衷】operate 串口已埋点,跑舱室调试页"串口失败"会进 operation_log,
-  据此排查任务#4 下位机串口/COM;② 铺开:front 接入、tl-control/business 接入、Java 生产服务铺 @OperateLog、§10 配置集中下发。
-  ★真机验证断点(暂挂):operate 进舱室调试(工程师密码 tl13579)报"串口失败"(下位机串口/COM 待排查)。
-  历史细节(P1~Pjava 逐步实现与踩坑)见 交接卡.md 对应日期段。
+  【灾后恢复 方案A·向前重建——软件层已重建,真机硬动作待用户在场】
+  全量重编译全绿(Java 7微服务+framework底座 + C# operate/front 均0 error);连通鉴权自检全过
+  (MySQL/Redis/Nacos/Kafka真实凭证);补执行2条漏掉DB迁移(operation_log + autofocus-data-layer);
+  集群已起7服务(gateway10010/business-pc10020/data-transmission10030/surface10040/tl-control10050/oplog10060/aivfo-service7081),
+  业务闭环实测过(登录admin/123456、tl-control读+写入库查实、business-pc读、oplog Kafka→库)。
+  下一步(给醒来用户):①gateway 路由已验证通(经网关5/5返完整数据,前测空200=服务重启窗口假象,已排除);
+  ②定夺 business-app 实锤缺陷修法(pc克隆+连错库,见连接配置清单注5);③data-transmission 已用PATH加lib起通,部署他机需带原生DLL;
+  ④你在场确认"舱内空可动"后跑 SelfTest 真机控制;⑤过目后 git 提交。详见交接卡 2026-06-19 00:10 段。
 说明: >
   M0-M5 全部【可写源码】已完成,C#合并端 0 error + M2-02 单测 15/15。工具链就位(JDK11.0.25 + Maven3.9.9
   @ C:\TLData\tools),Nexus 凭证(admin)已配 ~/.m2/settings.xml(401 解除);framework install(93 个 aivfo
@@ -97,10 +97,11 @@
     需用户提供: false
   - id: SITE-NET
     描述: >
-      【2026-06-18 04:25 待用户确认】起微服务集群前需现场网络决策(不臆测乱改):
-      ①MQTT broker 实际位置——本机已补 docker tl-mqtt(Mosquitto,tcp://localhost:1883,
-      aivfo/aivfo);现场/下位机若用别的 broker,需定 IP 后统一 Java application-*.properties +
-      C# operate/front App.config。②server.ip 取值:全本机→localhost;下位机/Surface 需访问
-      本机微服务→改本机局域网 IP。③是否起整集群冒烟 + Nacos 是否需导入配置中心 dataId。
+      【2026-06-18 部分推进】中间件已部署到服务器测试环境 192.168.0.108(见 开发环境/服务器测试环境.md)。
+      已改:8 个激活 Java 服务(7 local + service pro)连接统一 server.ip=192.168.0.108、各连接用 ${server.ip}
+      (MySQL/Nacos/Kafka/FastDFS/MQTT),app/surface 库密码 Aivfo.2017→root。
+      仍待用户决策:①微服务集群跑在哪(服务器 vs 本机)——决定 C# operate/front App.config 的 urlIp 指向;
+      MQTT broker 在服务器,mqttIp 一般指 192.168.0.108。②C# App.config 尚未改(urlIp/mqttIp/tlNum)。
+      ③是否起整集群冒烟 + Nacos 是否需导入配置中心 dataId。
     阻塞: [起微服务集群, V-002~V-121真机类]
     需用户提供: true

+ 8 - 0
项目文档/需求文档/01-架构与合并方案.md

@@ -133,6 +133,14 @@ ivf_tl_Manage.sln
 2. **改前用 CodeGraph/调用链**查影响面(注:CodeGraph 对 C#/Java 符号节点提取有限,必要时直接读调用方)。
 3. **死代码先不删**(注释块、Hidden 控件),合并稳定后再清理。
 4. **关键 hack 单独记录**(如 control 启动 SendMessage 点弹窗 Yes、明文密码、tl13579 口令)。
+5. **整目录退役判据(何时可删 `ivf_tl_control_2.0` / `autofocustool`)**——二者均为"合并/移植源",删除是合并收尾动作,**必须满足判据再删**(删除排期落 M1/M2 子计划):
+
+   | 目录 | 现状(2026-06-18) | 可删判据(全满足才删) |
+   |---|---|---|
+   | `autofocustool`(算法/协议移植源) | 编译上**已无任何工程引用**(四步标定算法已移植入 `IvfTl.AutoFocus`,见 M2-01;其余为"测试外壳"不移植)。但它是 `Protocol.cs` **下位机协议权威**与对焦算法的**逐行比对参照** | **M2 真机验证通过**(V-020/对焦链 V-041~V-067):移植后的对焦/协议在真机与原 autofocustool 结果一致 |
+   | `ivf_tl_control_2.0`(合并并入源) | operate 仍以 **3 条 ProjectReference 直接引用**其 `ivf_tl_Control` / `IvfTl.Hardware` / `IvfTl.AutoFocus`(`ivf_tl_Operate.csproj:624/627/630`);删除即编译失败 | ① **M1 真机验证通过**(V-011~V-016/V-017~V-029) ② 被引 3 工程(及传递依赖)**物理并入** operate 合并解决方案 ③ 消解 operate/control **同名程序集**(`ivf_tl_Entity`/`ivf_tl_Services`)身份冲突(§2 步骤3) ④ 改完引用编译 0 error |
+
+   注:二者均在 git 初始提交(b474804),删后仍可从历史找回;验证期保留本地副本仅为比对/排障便利。
 
 ---
 

+ 15 - 1
项目文档/需求文档/14-全量操作日志方案.md

@@ -105,11 +105,25 @@
 - **C#→Java 透传**:C# 生成 trace_id,调后端时放 HTTP header;Kafka 消息也带 trace_id。同 trace_id 串起跨端全过程。
 - **C# 端**对齐生成 + 在进程内(含跨线程/异步)传递 trace_id。
 
+### 7.1 两表合查排障(operation_log + system_log)——同一 trace_id 缝合
+
+`operation_log` 与 `system_log` **谁也不是谁的子集**,但共用同一个 `trace_id`,合查能更完整还原一次业务流程:
+
+- **同源保证**:`TraceIdAspect`(入口挂 `@BuildTraceId`)**一次性**把同一 traceId 同时写入 `Trace.context()`(operation_log 切面读它)与 `MDC`(logback/`LoggerDBAppender` 写 system_log 读它)——所以两表 `trace_id` 是**同一个字符串**。
+- **分工(互补,不重复)**:
+  - `operation_log` = **跨端主线/骨架**:C#+Java 所有 `@OperateLog`/埋点操作,成功+失败都有,结构化(谁/输入/输出/耗时/result)。
+  - `system_log` = **Java 端 ERROR 补充/血肉**:链路里所有 `log.error`(含**没埋 `@OperateLog`** 处、框架/第三方库抛的异常栈),补上 operation_log 没盖到的根因。
+- **排障姿势**:operation_log 找 `result=失败` 那条定位**哪一步**坏 → 用同 `trace_id` 查 system_log 拿那一刻**底层异常堆栈**。
+- **三个边界(否则串不起来/查空)**:
+  1. **得有 traceId**:链路入口须挂 `@BuildTraceId`(或上游已透传);否则两表 trace_id 皆空,无法 join。
+  2. **system_log 只有 ERROR**(`LoggerDBAppender` 挂 `LevelFilter level=error`):流程全程成功时 system_log 一条都没有,只查 operation_log——它只在出错时补充价值。
+  3. **C# 段只有 operation_log**:system_log 是纯 Java logback 落库,C# 端不写;跨端流程里 C# 的腿只能靠 operation_log,Java 的腿才两表都有。
+
 ---
 
 ## 8. Java 端方案(复用现有框架,改动小)
 
-- **现状**:`aivfo-log-spring-boot` 已有 `@OperateLog` 注解 + `OperateLogAspect` 切面 + traceId/parentId + `LoggerDBAppender`(但默认关、只记 ERROR、同步写 `system_log`)。
+- **现状**:`aivfo-log-spring-boot` 已有 `@OperateLog` 注解 + `OperateLogAspect` 切面 + traceId/parentId + `LoggerDBAppender`(随 logback `enable=true` 开启、`LevelFilter` **只记 ERROR**、同步写 `system_log`)。
 - **做法**:
   - **操作日志**:复用/扩展 `@OperateLog` 注解语义(module/operation/记入参出参/耗时/operator/result),切面采集后**走 Kafka**(新增 Kafka 生产),而非现有同步 DBAppender。补齐 §5 缺的结构化字段(input/output/result/operation 可读名/elapsed)。
   - **技术日志**:`system_log` + `LoggerDBAppender` 保持现状(可选开启),通过 trace_id 与操作日志关联。