﻿P10-04 工序单独立窗口 + 可编辑表格 + 优化勾选（永久/临时 + 原因）+ 全选

## 用户需求（2026-10-19 23:50 原话整理）
「工序单最好可以单独弹出，可以修改（增加勾选永久优化/临时优化，标题栏有一个全选，
可以一次性选择全部刀具前面的勾选，勾选优化可以写为什么优化，永久记忆的话，
你就可以知道是什么原因）、刀具后面直接跟转速、进给、AP、AE、备注」

## 现状
工序单是 `状态\artifacts\plan_<ts>\工序单.md`，出单后用记事本打开（只读难编辑）。
已有机制：`tools\sheet_feedback.py` 的 `apply` 与 `mul-ov`，把改动写到
`状态\overrides\<零件>.json`（临时覆盖，不动 parameters.json 全局预设）。
本卡不要重造这套机制，**复用**它。

## 要做的事

### 1) 独立窗口：NXAI 工序单编辑器
新建 WinForms 窗口（全新 exe，如 `NXAI工序单.exe`，源码 `app\NXAISheet.cs`，
或并入工作台另开一个 Form —— 二选一，但要写清哪个）。
高度 700+，宽度 1100+，表格区占主体，底部有按钮条。

### 2) 表头 + 全选
表格第一行（表头）最左侧放一个「全选」复选框，勾上则**所有行的优化复选框同步勾选**，
取消则全部取消（不影响已手工取消的单行，除非再次点全选）。
表头右侧显示「已勾选 N / 共 M 行」。

### 3) 列定义（严格按用户顺序）
```
[优化勾选] [工序] [刀具] [φ] [S(rpm)] [F(mm/min)] [ap] [ae] [备注] [优化类型] [优化原因]
```
- `优化类型`：下拉两选一 `临时` / `永久`
- `优化原因`：自由文本，勾选后可编辑；未勾选时置灰
- `备注`：自由文本，永远可编辑
- S/F/ap/ae 可直接双击编辑，必须是数字且 >0（非法值标红并禁止保存）

### 4) 保存语义（关键，不能混）
```
未勾选的行        → 保持工序单原值，不写任何东西
勾选 + 临时       → 写 状态\overrides\<零件>.json（本次生效，不动全局）
勾选 + 永久       → 写 overrides + 写长期记忆（memory），并把「优化原因」一起记进去
                    （这样以后同类情况能查到"当初为什么这么改"）
```
永久记忆的写入必须带上：零件名、工序、刀具、φ、原值→新值、原因、时间。
读取侧：下次出单时，若命中永久记忆，在工序单对应行标注「（记忆：<原因>）」。

### 5) 与工作台的衔接
- 工作台「① 出工序单」出单后，**默认用这个编辑器打开**（而不是记事本）。
- 编辑器底部按钮：`应用并重算`（调用 sheet_feedback.py apply 后重跑出单）、
  `只保存不重算`、`取消`、`打开产物目录`。
- 应用成功后，重新加载最新工序单并刷新表格，日志/状态栏显示"已应用 N 处优化"。

### 6) 数据读取健壮性
- 优先读 `process_plan.json`（结构化，字段可靠）
- 没有则解析 `工序单.md` 第一张表（注意 `☐/☑` 前缀行）
- 表头行与分隔行要跳过，不能把它们当数据行

## 验收（必须实测）
1. 打开 `状态\artifacts\plan_<最新>\` 的工序单，截图或贴出表格内容：
   证明列顺序、全选可用、S/F/ap/ae 可编辑
2. 实跑一次：勾选第 1 行「临时」改 S 从 6366.2 → 5000，应用后贴出
   - `状态\overrides\<零件>.json` 的实际内容
   - 重算后工序单里该行变成 5000（贴出前后对比）
3. 再实跑一次：勾选第 2 行「永久」并写原因 "这台机床 D8 刚性差"，
   贴出 memory 里写入的条目全文
4. 全选功能：点全选后贴出「已勾选 M / 共 M 行」，点取消后贴出 0 / M
5. 非法输入：S 填 "abc" 或 -1，证明会标红且不能保存
6. 门禁全绿：check_py_syntax 0 错误、run_eval 21/21、所有 tests\test_*.py 通过
7. 新增 .py 必须有 `P2-02 控制台编码护栏` 中文原文

## 约束
- 不改 cloud\、core\license.py、nx_post\
- 不伪造：截图/JSON/memory 内容必须是真实运行产出
- 完成后写 `状态\P10-04.done.json`

## 工序命名规范（用户定，2026-10-19 23:55，三张卡通用）
- 工序统一命名为 **A01、A02、A03 … A30**（两位数字，从 01 起按加工顺序递增）。
- 超过 30 道时继续 A31、A32…（两位不够就三位 A100，不截断、不重复）。
- 同一零件内**不许重名**；重新出单时按最新顺序重新编号。
- 命名与工序类型/刀具**解耦**：工序名只是编号，
  类型（面铣/钻孔/攻牙…）与刀具（D12/E8.5…）各自占列，不写进工序名。
- NX 里创建的工序名也用 A01…（Create 的 name 参数直接传它），
  不要用 NXAI_OP、roughing_1 这类临时名。
- 工序单表格「工序」列显示 A01…；工序类型放独立列（列名「类型」）。
- 「一键准备」按 A01…A30 顺序逐行建工序并生成刀路，日志逐行打印编号。
