每完成一任务或暂停时追加一段。新会话开场读最新一段接上。
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。6b8dd8a「配置统一与文档同步」(huangjie,Jun 19 01:14,在夜跑 00:10 之后),工作区 clean。该提交含:.gitignore 补编译产物忽略 + 移除误入库 .flattened-pom.xml/截图、8 处 application-local/App.config 配置统一、进度文档同步。夜跑的配置/迁移改动 + business-app 修改 + 文档已被用户一次性提交固化。6b8dd8a diff 确认,aivfo-business-manage-app-lanucher/application-local.properties):①错库 aivfo-tl(中划线,仅4视频表)→ aivfo_tl(正确业务库,交接卡 23:40 注5 疑点已修);②密码 Aivfo.2017→root;③IP 统一 ${server.ip}=192.168.0.108(MySQL/Nacos/FastDFS);④FastDFS 双 tracker(:22122,:22123)→ 单 ${server.ip}:22122。server.port=10020 + spring.application.name=aivfo-business-manage-pc-dev 仍与 business-pc 完全相同(diff 中为上下文行、未改)→ app 与 pc 不能同起。是有意保留(不同时跑)还是需另行区分端口/服务名,待定。6b8dd8a 提交、整集群冒烟已做)。交接卡追加本段。autofocustool/HwTest 控制台,确认硬件物理可用——7串口握手 + 6相机出图(2592x1944,15.1MB BMP) + 6电机精确运动(偏差0) + 全传感器 + 自动对焦闭环(转well→Z扫描→拍照算清晰度→选层)。2个坏仓=house7/9(成像过曝均值228/231 + 清晰度峰0.03/0.19,串口/相机/电机指令层都不坏)。ivf_tl_operate_2.0/OperateHwTest 控制台,引用 ivf_tl_Entity + ivf_tl_Services:
· 硬件:用真实 ComBin(命令队列+同步Wait+Channel)scan 7舱(握手/三路温度/压力/舱门/缓冲瓶/CCDSN/电机位置全读到)+ motor house8(Z→90000偏差0 / 水平→well1偏差0 / 复位)全通,与demo一致。
· HTTP:用真实 HttpHelper 登录(Init/Login)+ GetSettingHouseApi(tl-control)+ GetQuickButtonsApi(surface,返7按钮)全通。TraceFilter 对"Content-Type=json 但无body"请求 → getBody→resolveBodyFromRequest 的 body.subscribe() 消费/release 破坏请求流 → 网关转发返回 content-length:0。修:TraceFilter 仅 content-length≠0 才读body(aivfo-web-reactive/.../TraceFilter.java)。operate实际不触发(HttpHelper无参用无Content-Type重载)。discovery.enabled=false没注册;gateway routes[1]=lb://...surface(缺-dev)≠注册名...surface-dev;routes[6]=lb://...data-transmission-dev(多-dev)≠注册名...data-transmission。修:surface enabled=true + routes[1]加-dev + routes[6]去-dev,使路由匹配实际注册名。重打包 gateway(含bug-1的framework修复)+surface,kill旧进程(10010/10040,★repackage前必须kill否则jar被占rename失败★)重启。复测:nacos 5→6服务,surface经gateway getButtons返真实数据,data-transmission经gateway showCache返数据,operate真实 HttpHelper.GetQuickButtonsApi返7按钮端到端通。aivfo-web-reactive/.../TraceFilter.java;gateway application-local.properties(routes[1]/[6]);surface application-local.properties(discovery.enabled);新增测试工具 autofocustool/HwTest + ivf_tl_operate_2.0/OperateHwTest。★均未 git 提交,待用户过目★。System.UnauthorizedAccessException(6舱全连不上)。Win32_Process::Terminate+.NET Process.Kill —— 全部 STILL_RUNNING。内核级不可终止进程,用户态任何 API+任何权限都杀不掉,只能重启电脑清内核。bash 临时文件/start-all.sh 拉起全部 7 微服务(gateway10010/tl-control10050/business-pc10020/surface10040/oplog10060/aivfo-service7081/data-transmission10030带lib原生DLL),等约 2 分钟(内存紧张启动慢)。ivf_tl_operate_2.0/ivf_tl_Operate/bin/Release/net6.0-windows/ivf_tl_Operate.exe。★只启一个实例,确认旧进程已无再启,避免再次串口占用★。tlInfo/time 持续报错 = 空库无 tlNum=20230411 设备数据(非bug,需先建设备基础数据)。bash 临时文件/start-all.sh 起 7 微服务。验证:端口 10010/20/30/40/50/60 + 7081 全 LISTENING;日志确认 gateway「管理员admin登陆成功」+ tl-control 定时任务运行中(完全启动)。/ns/service/list 返 0 是 API 调用方式问题,实际服务正常(gateway 登录成功为证)。③★进度状态.yaml 被某进程改成损坏 UTF-16(UTF-8 字节被逐字节提升再存 UTF-16LE,混合码点)→ Read/Edit 读为空/Unknown。已用 Write 重建为干净 UTF-8(无 BOM),损坏原件备份在 临时文件/yaml_corrupt_backup.bin。交接卡/进度数据.js 仍是正常 UTF-8 未受影响★。_wellSettings[*].eepromClearPosition(与 operate verNewValue 默认同源,>0 才用,否则才跳过)。git diff +12/-1。备份 临时文件/HouseBin.cs.bak。6b8dd8a 不变,改动在工作区未 commit。aivfo_tl_setting.sql:tl_setting +5 对焦列(focus_layer_spacing_pulse/count/down/peak_ratio_threshold/local_autofocus_enabled)、house_well_setting +2 覆盖列、新增 house_autofocus_calibration 表;log.sql:system_log 后追加 operation_log 表。②两 migration 文件头加注"全新部署 base 已含,仅供旧库增量升级"(autofocus 迁移强调 MySQL8 ADD COLUMN 无 IF NOT EXISTS,旧库重跑前 DESC 判列)。③新增幂等 runner sql/init-database.sh(建 7 库 CREATE DATABASE IF NOT EXISTS + 导 base,可重跑)。④清单.md:aivfo_tl_setting 表数 17→18、log 行补 operation_log、新增"〇一键部署"与"四 migrations 分工"段。OperationLogger.Run(模块,操作,()=>核心调用,input:...)(自动计时+异常重抛,保持原异常流);多步流程用 Begin scope 串 traceId。②View code-behind 事件多自带 try/catch 吞异常不重抛,用 using var _op = OperationLogger.Begin(模块,操作) + try 末尾 _op.Success()/catch 开头 _op.Fail(...)。铁律:OperationScope.Dispose 无法探测异常默认记"成功",所有失败路径(校验早return/接口false/catch)必须显式 Fail(),否则失败误记成功。守卫子句留 scope 外,input 排除密码等敏感字段,全限定名不加 using,每处加 // M8-G3-1: 注释。dotnet build ivf_tl_Operate/ivf_tl_Operate.csproj -c Debug 0 错误,已成功生成(两轮:VM 层后一次、code-behind 层后一次)。BufferDebug 几条 MVVMTK0034(直接引用 currentHouse 字段)系原有代码非本次引入。codegraph sync up to date。onDeliveryFailed: local.WriteFallback(投递失败/队列满整条 JSON 落兜底,由 Pipeline 补送定时器恢复后补回);② InitCore 在 ConfigFilePath 非空时起 OperationLogConfigWatcher(存静态字段);③ Shutdown 释放 watcher。JToken.Value<bool>() 无参非法 → 改 (bool)en/(bool)me(前已判 .Type==Boolean,强转安全)。dotnet build Aivfo.OperationLog/Aivfo.OperationLog.csproj -c Debug = 0 错误 0 警告。codegraph sync up to date。git push:617cc53..968f9ae,现 main...origin/main 同步。_container(ContentControl),外层只有 一个 Viewbox{Uniform}(MainWindow.xaml.cs M4-01-1 无条件包裹 MainGrid)。Viewbox 以无约束测量子页自然尺寸再等比缩放——故含 * 星号行的页靠根 Height=2736 撑开;直接删根尺寸,星号行塌缩成内容高、Viewbox 拿到扁画布→视觉崩。样板 MainPageView(Auto/Auto/*/Auto)根已删尺寸但宿主未给基准,自身也是此隐患(M4 视觉本未验)。MainWindow.xaml:<Grid x:Name="MainGrid"> 加 Width="1824" Height="2736"(唯一固定设计基准;_container/_mask 同在其下基准统一;D6 真机校准只调这一处;一并修好样板页)。不动 .xaml.cs。
· 改动2 11 全屏子页根 Height="2736" Width="1824" → d:DesignHeight="2736" d:DesignWidth="1824"(11 页均已有 xmlns:d+mc:Ignorable,d: 运行时忽略仅设计期):About/Alarm/AutoFocus/Buffer/Chart/Detail/DishRecord/HouseSetting/Photo/Setting/HouseDebug。CCDSettingView 根已 d:DesignHeight=450/Width=800 达标不改;AddDishWindowView 是 <Window> 弹窗(非 _container 全屏页)归 G2-1 弹框族单独处理。Height="2736"/裸 Width="1824" 清零(残留 Width=1824 全是内层 WrapPanel/Grid,非根);② 各页 d:DesignHeight="2736" 计数=1 就位;③ dotnet build ivf_tl_Operate.csproj -c Debug = 0 错误(2056 警告全预存 nullable/MVVMTK0034,本轮只改 XAML 不引入);④ codegraph sync up to date(XAML 非索引符号)。SoftKeyboardHost.cs(+37/-14),交接卡无记录=上次电脑重启时正在调"设备舱室调试输入密码的小键盘问题"中断。本会话续接核实+收尾。MainWindow.xaml 的 MainGrid 加固定 Width=1824 Height=2736 并套进唯一的 Viewbox{Uniform} 后,KeyboardOverlay 原方案"把键盘浮层动态 Add 到窗口 root Panel"失效——固定尺寸的 MainGrid 在 Viewbox 内,运行期新增的子树不会被父级重新测量/布局,键盘渲染成 0×0 不可见(代码注释记"实测复现")。这正是用户说的小键盘问题。SoftKeyboardHost.cs 一处,KeyboardOverlay):
· 加字段 _popup;Show() 重写:键盘 + 全窗透明背景捕获层(bgCatcher,点空白=取消) 装进 _layer(Grid winW×winH),再放进顶层 Popup(PlacementMode.Relative / PlacementTarget=_window / HorizontalOffset=VerticalOffset=0 / 全窗尺寸 / AllowsTransparency=true / StaysOpen=true) → IsOpen=true。Popup 是独立顶层 HWND/布局根,脱离 Viewbox 与固定 MainGrid,必被测量渲染,绕开 0×0 坑。
· 键盘尺寸从写死 px(1000/700 + MaxWidth) 改为按窗口 ActualWidth/ActualHeight 动态算(Password=min(960,W.62)×min(560,H.52);Number=min(640,W.42)×min(470,H.46),fallback 1920×1080)——Popup 走屏幕像素、不随 Viewbox 缩放。
· Dispose():_popup.IsOpen=false; Child=null; _popup=null。遮罩逻辑不变(有 _mask 复用、否则 _rootPanel 注入半透明层;MainWindow 走 _mask 复用)。dotnet build ivf_tl_Operate.csproj -c Debug = 0 error(2060 警告全预存 nullable/MVVMTK0034)。
· 不变形:SoftKeyboard.xaml 内部全 Grid/UniformGrid * 星号比例,给定固定 W/H 自适应填满,宽高比合理。
· 不崩:按键样式依赖 {StaticResource TouchMinSize},定义在 Resources/AdaptiveStyles.xaml,已在 App.xaml:30 合并进 Application.Resources(App 级);WPF 资源查找 fallback 到 Application.Resources,故 Popup 内逻辑树孤立也能找到,不抛 StaticResource 异常。
· 0×0 根因:Popup 独立布局根,方向对症。_mask 在 Viewbox 内、键盘在 Popup 屏幕坐标,重点看对齐);③输入实时写回 PasswordBox(tl13579 校验照常触发)+数字键盘(参数输入)同路径顺带验。bin/Debug/net6.0-windows/ivf_tl_Operate.exe,cmd start 拉起;git-bash ./exe 直跑被沙箱拒=exit126,改 cmd //c start)。VerticalAlignment=Center/Margin=0/Width=kbW/Height=kbH;kbW=Password min(960,W.62)/Number min(640,W.42);kbH=Password min(860,H.62)/Number min(680,H.55)。键盘+bgCatcher 装 _layer 放顶层 Popup(脱离 Viewbox)。dotnet build operate 0 error(每轮改后重编译+重启验)。