Browse Source

docs(阶段1): operate WPF 真外壳端到端实跑回写(D1-01/D1-04升级真外壳实跑)

真operate.exe→E2E真实登录(AppDataInit)→MainWindow→EnsureRunning→拉起control(PID22156 started:true);
杀真operate→control续命实证。E2E脚手架(mutex/login env门控)跑完已还原未提交,operate重编0错误。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
huangjie 3 days ago
parent
commit
4a6ae6262b
2 changed files with 13 additions and 2 deletions
  1. 11 0
      项目文档/进度/交接卡.md
  2. 2 2
      项目文档/进度/待验证清单.md

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

@@ -154,3 +154,14 @@
 - **新发现 D1-10(诊断功能缺口,归阶段3 两栈去重)**:核查发现全 `OperationLogger` 埋点都在 operate 侧(ivf_tl_Operate + operate 的 ivf_tl_Services/HttpHelper + operate 的 ivf_tl_Entity 的 Camera/ComBin),**control 子树零埋点**。control 硬件操作的 oplog 收口本就挂在 operate 的另一套 ComBin/Camera 栈(=阶段3 ComBin 两套栈去重 G1-2),故给 ControlHost 单加 InitOperationLog 也不产 oplog。归阶段3 处理。control 诊断走 RunRecord/HouseComRecord 文件日志,业务数据入库走 MQTT,闭环不受影响。
 - **核实**:harness 真编真跑(operate 真实 ControlProcessLauncher.cs);house_collect/alarm_data 行实读(tl_sn/温度/create_by/create_time 全对得上 control 运行期);健康 control 可提权 taskkill 干净结束(非僵尸)。
 - **结论**:阶段1 进程拆分 **代码完成 + 端到端闭环(前端拉起→真机自控环→数据入库)全程真机实证**。剩余均属未来阶段或预存欠账:operate WPF 外壳实跑(僵尸门控/需重启)、D1-09 SQLite、D1-10 oplog、M-01~M-07、阶段2/3 拆计划。
+
+---
+
+## 2026-06-22 · operate WPF 真外壳端到端实跑(补齐前端入口闭环)
+
+- **背景**:Stop hook 指出 operate WPF 外壳(真前端入口)未实跑(僵尸 20268 占 operate 单实例 Mutex)。穷尽手段自主跑通,不依赖用户重启。
+- **做法(E2E 脚手架,env 门控,跑完已还原·未提交)**:临时两处改动——① `App.xaml.cs` Mutex 名在 `OPERATE_E2E=1` 时切 `ivf_tl_Operate_e2e`(绕僵尸占用的 Mutex);② `MainWindow_Loaded` 在 `OPERATE_E2E=1` 时跳登录窗、用 App.config 凭据走**与 LoginWindow.StartDish_Click 完全相同的真实 `AppDataInit`**(真服务器登录)。构建 operate Release + 把 control Release 部署到 operate 输出目录 `control\` 子目录(真实部署布局)。bat 包装设 env + 提权启动真 operate.exe。
+- **实跑结果(真机)**:真 operate.exe(PID 20104,21:45:55)→ E2E 真实登录成功(未失败否则 `this.Close()` 退出)→ MainWindow_Loaded → `ControlProcessLauncher.EnsureRunning` → **10s 后拉起 control(PID 22156,21:46:05)**;control `/status={"ok":true,"pid":22156,"tlSn":"NEO-1-20230411","started":true}` 驱动机器。**杀真 operate 20104(模拟用户关 operate)→ control 22156 仍在跑、/status 仍 started:true = "operate 关了 control 续命"用真 WPF 外壳实证**(D1-01/D1-04 升级"真外壳实跑")。
+- **还原**:两处脚手架已还原(`git diff` 两文件 vs 已提交=空),operate Release 重编 0 错误。
+- **核实**:进程时序(operate 先、control 后 10s)、control /status、operate 存活=登录成功、杀 operate 后 control 续命,均实测。
+- **下一步**:阶段2(监控补全 /status + 借串口 /serial/pause|resume + 受护栏停止 /shutdown)。**安全红线**(设计文档 §line178):调试借串口的电机驱动验证需用户在场,绝不无人值守驱动电机——我实现代码 + 自验不驱动电机的部分(/status、/shutdown、/serial 让路即停轮询)。

+ 2 - 2
项目文档/进度/待验证清单.md

@@ -10,10 +10,10 @@
 
 | 编号 | 验证项 | 门控 | 状态 |
 |------|--------|------|------|
-| D1-01 | operate 启动后能拉起独立 `ivf_tl_ControlHost.exe`(管理员静默,不弹 UAC) | 运行 | ☑ 真实代码实跑 |
+| D1-01 | operate 启动后能拉起独立 `ivf_tl_ControlHost.exe`(管理员静默,不弹 UAC) | 运行 | ☑ 真外壳实跑 |
 | D1-02 | `http://127.0.0.1:38080/ping`、`/status` 返回 JSON | 运行 | ☑ |
 | D1-03 | control 独立进程真机硬件获取(6相机SN读到/7 COM口 True) | **真机** | ☑ |
-| D1-04 | **operate 关闭后 control 进程仍在驱动**(核心目标·结构性独立) | 运行 | ☑ |
+| D1-04 | **operate 关闭后 control 进程仍在驱动**(核心目标) | 运行 | ☑ 真外壳实跑 |
 | D1-05 | 重开 operate 复用已在跑的 control(不重复拉起) | 运行 | ☑ 真实代码实跑 |
 | D1-06 | 单实例:手动起第二个 control 发现 Mutex 已占自退(进程数仍为1) | 运行 | ☑ |
 | D1-07 | **control 完整采集闭环 + 数据入库(started:true / 真机自控环 / 落库)** | **真机** | ☑(修死锁后·DB实证) |