每完成一任务或暂停时追加一段。新会话开场读最新一段接上。
a746f4b(3182文件),工作分支 feature/merge-operate-control(master为基线可回退)。core.longpaths=true。autofocustool/.git 临时改名 .git_nested(其历史保留)。dd9b7df):operate MainWindow_Loaded 后台 Task.Run 托管 control StartMain.StartRun(),去 Environment.Exit;StartMain.cs 模块数≠11 的 MessageBox+SendMessage hack 改静默+日志+配置项 ContinueOnModuleCountMismatch;csproj 加 control 引用。3ea46f5):operate 登录账号透传 control AppData.Login(在 StartRun 前);Window1 在 ControlTest 测试工程、operate 本就不引用,去登录窗天然满足。13badf4):新建 IvfTl.Hardware 程序集(19文件)实现 13 文档 HAL 接口(单例+ISerialChannel/ICamera/IHouseGate/ICameraGate);采集端 HouseBin/SerialBin/BufferBottleBin 6处 new 点 + 调试端 HouseDebugPageViewModel 2处改 HAL 借用;相机三套 static 锁合并为唯一 ICameraGate。ace8553):5处image_score消费改判据(business-manage :476→clearest、:333→image_time、:470去分数段;data-transmission :179→image_time、:270/:325排序键),null安全。883d009,IvfTl.AutoFocus)→M2-02层公式+配置解析(b23ea76,真实单测15/15通过)→M2-03 StartAutoFocus本地化(3e16bef,HouseBin:1359改本地CalibrationEngine,N层公式换PhotoLayerCalculator)→M2-04标定落库(1c33f44,JSON真相源+SqlSugar镜像scene0/1,异常三层隔离)→M2-05调试页一键标定(a5e838e,适配器规避硬件二次Open,绿/红实时显示,基准scene0)→M2-06安全门(fcb7e31,local_autofocus_enabled默认关→降级基准位置)→M2-07对焦后手调拍摄层(0541505,实时预览+HTTP well-save持久化)→M2-01b评估(2d83cdc,机旁native打分确认死代码,留M3清理批次删)。88c6ecd/a99f0c8/539bf8d/767857e):自适应竖屏框架(去写死像素2736×1824+Viewbox全配置等比)/触控≥48隐式样式/圆形造型套Viewbox(16well几何零改)/自绘SoftKeyboard数字密码键盘停osk/主页零滚动。f425017/b54f7e7/dca8525/8b044b1):配置去重(16键并入operate单config+IP统一)/DPAPI密码加密+统一配置页+幂等迁移/只读服务监控页+链路健康/心跳解屏蔽(MqttService.cs:79死代码return)+防重连竞态+补传去重与堆积上限。58ad73f):extern alias实测无效→改命名空间隔离(control的ivf_tl_Entity→IvfTl.Control.Entity、ivf_tl_Services→IvfTl.Control.Services,78文件),错误26→13→0。9e56019):System.Drawing.Common 7.0.0对齐、HouseBin.PortName公开、MonitorSnapshot状态字段int→string、XAML StringFormat='..'转义、ServiceMonitorVM比较修正。32455ce。codegraph 已 init(44941节点/92641边),MCP工具需下次会话生效。项目部署/ 是临时建的文件夹,里面部署信息(IP/账号/中间件版本/是否用Redis/FastDFS手册/环境与账号清单.md/新机器交接说明.md)不准确,环境正在部署中、尚未弄好。时差项目源代码/项目文档/(源码+文档)+源码内 profile/App.config。dotnet build ivf_tl_Control.sln = 已成功生成,0 error(984 既有警告,非本次引入)。★Java 端本机缺 JDK11+Maven 无法编译★——本机仅 dotnet 8.0.422,JDK/mvn 全盘搜索未装;Java 改动登记【待装工具链后 mvn compile 验证】(改动为 lombok @Data 加字段 + mapper insert 加列,语法风险低,已静态自查:BigDecimal 已 import、列与 values 数量对齐)。mvn -DskipTests install 装 aivfo-framework(93 个 com.aivfo 模块入本地仓库),再编译微服务。【续接要点:本地多仓构建必须先 install aivfo-framework 底座,再 build 各微服务】。mvn -DskipTests compile(aivof-tl-control)= BUILD SUCCESS(31s),Reactor 全 SUCCESS:aivfo-tl-control-entity(TlSetting+5/HouseWellSetting+2/两VO/HouseWellSettingUpdate+3)、-mapper(两 Mapper.xml insert 列)、-service(updateManualLayerTune 接口)、-service-impl(LambdaUpdateWrapper 写三列)、-manage(updateHouseWellSettings 手调分支)。mvn -DskipTests compile,BUILD SUCCESS)★:
· aivfo-business-manage = SUCCESS(19 个模块全绿,含 M3-02 消 NPE 改动的 service-impl/manage;43s)。
· aivfo-data-transmission = SUCCESS(10 个模块全绿,含 M3-01 删打分链 / M3-03 calPhotoPosition 改本地;1m57s,其中 -manage 模块编译约 1.6min)。C:\TLData\_setup\tl-ready-check.sh。★Git Bash 里 docker 不在默认 PATH,先 export PATH="$PATH:/c/Program Files/Docker/Docker/resources/bin"★。中间件账号:mysql root/root、redis 密码123456、nacos nacos/nacos(鉴权已关)。sql/*.sql 建 7 库,未应用 sql/migrations/2026-06-17-autofocus-data-layer.sql(在子目录)。实测 aivfo_tl_setting 库缺全部对焦列 → 手动应用(docker exec -i tl-mysql mysql -uroot -proot aivfo_tl_setting < migration.sql,退出0)。DESC 校验通过:tl_setting +5 列(focus_layer_spacing_pulse=NULL/focus_layer_count=5/focus_layer_down=2/focus_peak_ratio_threshold=1.200/local_autofocus_enabled=0,默认值合设计)、house_well_setting +2 列(可空继承)、house_autofocus_calibration 建表(20 列)。待验证清单 V-001 ☐→☑。java.lang.UnsatisfiedLinkError: Unable to load library 'JavaImageDLL' → 启动期创建抠图 bean pictureProcessing(com.aivfo.jna.picture.PictureProcessing,饿汉式实例化)需 native 库 JavaImageDLL.dll,fat jar 内不含。时差项目源代码/aivfo-data-transmission/lib/(JavaImageDLL.dll + 依赖 opencv_world3416.dll)。-Djna.library.path="...\aivfo-data-transmission\lib" 且把该 lib 目录加入 PATH(供 JavaImageDLL.dll 定位其依赖 opencv)。重启成功:Tomcat 10030(context /api/data/transmission/server)、Nacos 注册 aivfo-data-transmission 192.168.0.39:10030。dotnet build ivf_tl_Operate.sln -c Debug = 0 error(net6.0-windows WPF,大量 warning 无碍)。验证合并端真机可编译。时差项目源代码/ivf_tl_operate_2.0/ivf_tl_Operate/bin/Debug/net6.0-windows/ivf_tl_Operate.exe。需求文档/14-全量操作日志方案.md(权威设计=spec)。关键决策:①异步通道走 Kafka(量大要稳不丢);②复用现有 aivfo-log-spring-boot(@OperateLog/traceId/parentId/TTL MDC),不另起炉灶;③操作日志建独立表 operation_log(与 system_log 并列同库、共享 trace_id 可 join,不挤进 system_log);④两级日志:操作级→Kafka入库(长期可查)、调试级→本地文件(串口/相机原始细节,按模块/按舱热开,不入库);⑤C# 组件化 Aivfo.OperationLog(异步队列→Kafka,与 Java starter 对称);⑥C# 全埋 operate+front,不埋 control+autofocustool(将并入operate会删);⑦可配置=运行时模块级开关+级别+按舱热开(先埋后配);⑧不建操作字典表(可读串直接落库);⑨开发规约强制:以后新写C#/Java代码都要埋点。LoggerDBAppender 其实默认关、只记ERROR、同步逐条写库(文件日志才包了AsyncAppender),不能直接扛全量操作日志→故走 Kafka+异步;system_log 已记 create_by=登录用户(操作人"谁"已有);Java 已有完整 traceId/parentId 体系(Trace TTL ThreadLocal)。writing-plans 出 M8 实现计划(日志库+aivfo-oplog微服务+Kafka topic+Java切面发Kafka+C#组件+全埋);之后回头排查 operate "串口失败"(任务#4)继续对焦真机验证。项目文档/开发计划/2026-06-18-M8-P1-日志基础设施实现计划.md★。6 个 Task(bite-sized+完整代码+TDD/验证+commit):①operation_log 建表(log库,字段对齐14§5,21列);②aivfo-oplog 微服务骨架(单模块,仿 aivfo-service,parent aivfo-business-parent,加 kafka/nacos starter,端口10060);③OperationLog 实体/mapper/service(mybatis-plus);④tl-oplog 消费者(实现 aivfo-kafka 的 ReceiveMessage,JSON→入库,失败兜底提交位移);⑤保留期清理(@Scheduled cron 0 17 3,aivfo.oplog.retention.days);⑥端到端验证(起服务→kafka-console-producer 发测试JSON→查 operation_log 入库)。sql/migrations/2026-06-18-operation-log.sql 建 operation_log(log库,19列+4索引),已应用。
② 新建微服务 aivfo-oplog(单模块,仿 aivfo-service,parent aivfo-business-parent,端口10060):pom/启动类/配置。
③ OperationLog 实体+mapper(@Mapper)+service(mybatis-plus IService)。
④ tl-oplog 消费者:OplogReceiveMessage(实现 aivfo-kafka 的 ReceiveMessage,JSON→入库,失败兜底返回true提交位移)+OplogReceiveError(最简实现)+OplogConsumerRunner(ApplicationRunner 启动时 createTopic+buildConsumerManualCommit 每分区一消费者)。
⑤ RetentionCleanTask(@Scheduled cron 0 17 3,按 aivfo.oplog.retention.days 删过期)。
⑥ 端到端验证:起服务→kafka-console-producer 发测试JSON→查 operation_log 查到完整记录(trace/project/module/operation/operator/result/error/elapsed/house/tl_sn 全对)。测试数据已删,不污染。responseWrapperAdvice 重复定义→加 spring.main.allow-bean-definition-overriding=true(已写进 application.properties)。
· Git Bash 路径转换把容器内 /opt/kafka/... 转成 Windows 路径→MSYS_NO_PATHCONV=1。
· 计划文档 Task1 写"21列"实为19列,已修正计划。java -jar target/aivfo-oplog-1.0.0-SNAPSHOT.jar(properties 已含 allow-bean-overriding,无需再加命令行参数)。@OperateLog 加 module()/operation()(默认空,旧无参用法兼容);② aivfo-log-spring-boot-core 新增 OperationLogMessage(字段对齐 §5/oplog消费端)+OperationLogSender 接口;③ OperateLogAspect 改造:环绕采集 traceId(Trace)/parentId(MDC "ParentId")/project(spring.application.name)/operator(AuthThreadLocal)/input/output(JSON,超4000截断)/result/error(异常+堆栈摘要)/elapsedMs/host,有 OperationLogSender bean 则发送(try兜底失败只warn),无则保持原 log.info(向后兼容);④ LogAutoConfiguration 用 ObjectProvider 可选注入 sender。aivfo-framework/module/aivfo-oplog-client(KafkaOperationLogSender 发 tl-oplog,@ConditionalOnBean(ProducerNormal)+@ConditionalOnMissingBean(OperationLogSender))。理由:不让 aivfo-log-spring-boot 反向依赖 kafka——有 kafka 的服务引此 starter 即接入,其余服务零影响★。已注册 module 聚合 pom + dependencies 管理。mvn install EXIT=0;tl-control mvn compile EXIT=0(向后兼容确认);subagent 报四微服务(tl-control/business/data-transmission/gateway)compile 全 SUCCESS;端到端(standalone CGLIB 触发注解方法→发tl-oplog→aivfo-oplog消费→operation_log)入库正确(module/operation 中文/result/elapsed 对;operator 因 standalone 无 auth 上下文走匿名兜底,真实请求链路下由现有过滤器填充,待铺开后复验)。测试数据已清。65b43f8,dotnet build EXIT=0,工作区干净,测试数据清零)。时差项目源代码/Aivfo.OperationLog/(独立 csproj,net6.0 纯类库,10源文件;operate/front 均 net6.0-windows 可引用):
· API:OperationLogger.Init/Log/Begin(自动计时)/Run(自动捕异常→失败);OperationLogContext(AsyncLocal 透传 traceId/parentId/operator/houseSn/wellSn + BeginScope 父子链)。
· 异步管道:System.Threading.Channels 非阻塞入队→后台批量发 Kafka,队列上限+降级,入队不阻塞不抛异常。
· Kafka:复用现有 Confluent.Kafka 2.1.1(control 已用,NuGet 离线缓存命中)→ 真发 tl-oplog(非降级)。IOplogTransport 抽象 + KafkaOplogTransport。
· 两级日志:操作级(达门槛)发 Kafka;调试级(Debug)只落本地文件不入库——已验证。
· schema 用 Newtonsoft [JsonProperty] 精确对齐 aivfo-oplog 消费端(camelCase)。ivf_tl_Operate.csproj+ivf_tl_Entity.csproj(串口/相机在 Entity)各加 ProjectReference→Aivfo.OperationLog。App.xaml.cs App_Startup 调 OperationLogger.Init(project=operate,Kafka=App.config kfkaIP:port=127.0.0.1:9092,Topic=tl-oplog),全 try 兜底。HttpHelper.HttpClientSendAsync(所有 callWebService 收口,记 url/参数/结果/耗时);② 串口 ComBin(OpenPort/ClosePort 操作级入库、SendCommand 高频走调试级落本地);③ 相机 Camera(Init/UnInit);④ 对焦调试 HouseDebugPageViewModel(一键标定 Begin scope、手调保存、电机控制 Run 捕异常)。OperationLogContext.TraceId;核对 Java 端 BasicConstant.TRACE_ID="traceId"+servlet TraceInterceptor+gateway TraceFilter 均 getHeader("traceId")→header 名完全一致,C#→Java 链路打通,无待对齐。AppData 登录成功后 SetOperationLogContext 设 OperationLogContext.Operator=CurrentUserInfo.username+TlSn;另存静态默认。eab2ebe;@OperateLog 在 data-transmission 3 controller;aivfo-oplog-client 依赖加入;operation_log 清零;工作区干净)。进度/全量文档体检报告-2026-06-18.md。CLAUDE.md(开机先读 + 回写协议含回写矩阵 + 文档地图 + 排障/编译/Git)。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(非"默认关")。背景:用户私自把中间件全搬到服务器 192.168.0.108、改了一批连接配置、删了编译产物、还删过 git 历史(git 不可信)。方案 A「向前重建」:不靠 git,用「能编译/能连/能跑」重建可信基线。用户授权自主通宵执行,守住一条红线:不无人值守驱动真机电机(物理不可逆;详见本段末)。
root/root:JDBC 真连 7 库,表数全对(auth4/services2/tl4/setting17/tl25/log1/quartz11)。123456:RESP 裸协议 +OK +PONG。Nacos nacos/nacos:登录 globalAdmin(鉴权已关)。mvn -DskipTests install aivfo-framework(底座,1:17 SUCCESS),再 7 微服务全部 EXIT 0(gateway/tl-control/business-manage/data-transmission/oplog/aivfo-service/ai-middleware)。dotnet build -c Release 均 EXIT 0(纯 warning 无 error)。注:operate/front 是 SDK 风格 net6.0-windows,dotnet 直接可编。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 校验全部生效。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 ...。admin/123456→code2000 拿 JWT。★admin 密码 = 123456(算法 MD5(盐+pw+盐),盐 vik3KtL4...,管理员跳过权限校验)。SelfTest.exe(真实动电机)。未在无人值守时驱动:GUI 无法无头点击 + 物理动作不可逆(舱内或有样本)。你在场说"舱内空、可动"后我再连跑,出问题实时拉 trace_id 判读。临时文件/(DbProbe/TableList/OplogProducer/QueryLog/SqlRunner/start-cluster.sh 等)。集群进程仍在后台跑,日志在 临时文件/run-*.log。