Files
bj_power/临时.md
T
SunYF 4a5e2d7bac feat: 完成多模块迭代更新
- 新增过程巡检按步骤上报、数量不符上报、工位退料功能
- 增加工单工程编号三级归属字段
- 新增物料安全库存与缺货预警
- 新增附件管理、退库单管理模块
- 优化生产看板展示逻辑与前端页面文案
- 清理冗余的工艺路线相关代码与备份文件
2026-09-15 16:37:39 +08:00

523 lines
47 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 独立审计报告 v2(对照文档 × 真实代码,含裁决)
> 审计日期:2026-09-15 | 本轮为第二次独立审计,按你定下的三级裁决规则重写。
>
> **裁决规则(务必先读,其他 AI 也照此执行):**
> 1. **时间优先**:文档越靠后越新,越靠后越准。同一件事若早期说法与后期矛盾,一律以**后期**为准。
> - 时间轴(旧→新):头脑风暴(早期方案) → 问题记录(客户59条+你的批注) → 问题修复记录(你把已修项迁走后的最新) → 产线布局说明(修正版) → 本次审计。
> 2. **优先级(高→低)****闭环 > 你的回复 > 客户问题**。
> - 意思是:客户提的需求,若你后来在回复里改了/否了/给了更优口径,以你的回复为准;
> - 而最终一切以「能不能闭环」裁决——哪怕客户和你都说要,只要代码证明它接不上、是僵尸,就判为"未闭环,需改/需删"。
> 3. 标记:✅已闭环 | ⚠️部分闭环/需补 | ❌未闭环 | 🟥过度设计(砍)。
---
## 〇、一句话结论
**核心业务流(配置→库存→排产→派工→报工→追溯→流程卡)已能跑通,但仍有 6 处硬闭环缺口(P0)+ 若干过度设计未清理。** 其中 WMS 附件与检验处置是最大黑洞(客户要了,代码 0 落地);工位终端的巡检四动作、应急呼叫、备料四态、产品型号级流程卡也未闭环。工艺路线与预警规则属"建了没用/多余",应删。
---
## 一、P0 闭环缺口(客户要了、你已确认要、但代码没闭环)—— 必须补
### P0-1 WMS 附件能力 0 落地 ❌(最大黑洞)
- **客户要**:入库/物料档案挂图纸 PDF 可查看(问题记录 L26-30);检验上传附件(L107);成品入库附件(L218);图纸按工序分发(L533-536);步骤级工艺文件(L513)。
- **你的裁决**:L30「列表可查看附件、上传附件」;L516「文件统一进附件中心」。
- **代码事实**:WMS 全仓**无附件表、无上传/查看接口、无前端入口**handler/routes.go 里附件相关仅 excel.go/material.go 的"导入"字样,非附件挂载)。MES 有 attachment 表,WMS 没有。
- **闭环判定**:❌ 未闭环。客户"图纸/检验附件"在 WMS 侧 0 落地。
- **最优方案**
1. WMS 复用 MES 的 attachment 单表模型,bizType 枚举:inbound / material / inspection / semi / outbound。
2. 在 WMS 各业务页**内嵌附件区**(上传/查看/删除,PDF 新窗口预览,≤20MB),不建独立"附件中心"菜单。
3. 图纸按工序分发:在 MES 工艺步骤表加 attachment 关联,工位终端执行到该步骤时显示对应图纸/文件。
### P0-2 WMS 质量检验不闭环 ❌
- **客户要**(L135):不合格不入库、不上产线,仅合格品入库存数量;处置分 退货/报废/部分入库(L137-145,你已画了处置表)。
- **你的裁决**:L135「不合格不入库,这才是正确逻辑」。
- **代码事实**:检验能记合格/不合格,但**入库不校验质量状态**;**无不合格品处置动作**(退货/报废/部分入库/禁入)。
- **闭环判定**:❌ 未闭环。检验结果与入库/库存是断开的。
- **最优方案**
1. 入库提交时**服务端校验**:该批/该 SN 若存在"不合格"检验记录 → 拦截,不允许入合格库存。
2. 检验"部分入库"时强制选处置方式(退货→货运单号+原因;报废→原因),生成处置单。
3. 库存明细增加"质量状态"(合格/不合格/待退),不合格自动隔离,不可出库/上线。
### P0-3 工位终端缺 签到/点检/过程巡检/完工确认/应急呼叫 ❌
- **客户要**(L350):这些「都在工位终端、扫码枪和 pad 上操作」。
- **你的裁决**L352/L393「把 MES 这四项移植到工位终端触控版」;L396「不分期,一次性落地」。
- **代码事实**:工位终端只有 **作业 / 物料叫料 / 移料 / 工艺文件(PDF) / 工作量** 5 个面板(Main.vue:41-51),**无**签到/点检/巡检/完工确认/退料/应急呼叫。签到/点检/过程巡检/完工确认当前只在 MES 的 Inspect.vue4 个 Tab),不在工位终端。
- **闭环判定**:❌ 未闭环(客户明确要求"在工位终端",你答应了,代码没做)。
- **最优方案**
1. 工位终端新增「巡检」面板,含 4 个动作:开工签到(拍照片)、工位点检(勾选项+拍照)、过程巡检(**按工艺步骤**逐条提交)、完工确认(扫 SN,未全部完成则拦)。
2. 过程巡检必须**按步骤**(见 P0-4),MES 端保留查询/审核/统计,不重复录入。
3. 应急呼叫:工位终端一个「呼叫」按钮 → 落库 + MES 预警中心实时显示 + pad 端顶部提示(纯软件,不依赖安灯硬件,你 L614 已定)。
### P0-4 过程巡检"按工单"而非"按步骤" ⚠️
- **客户要**(L519):过程巡检支持**分工序**提交工序间检验记录,全部工序完成后**一键生成工序间检验记录**。
- **你的裁决**:L522「过程巡检按步骤提交,每条关联 工单/SN/工位/步骤;一键生成汇总」。
- **代码事实**Inspect.vue 的过程巡检按 **工单(orderNo)+结果+签字** 提交,非按工艺步骤逐条;且无一键汇总生成。
- **闭环判定**:⚠️ 半闭环。记录有了,但维度错(工单级而非步骤级),无法"每一步都检验"。
- **最优方案**:过程巡检改为按「该工单的工艺步骤」逐条提交(结论+实测值+照片),全步骤完成后一键生成《工序间检验记录》PDF/Excel。
### P0-5 备料台账四态 未实现 ❌
- **客户要**L242-258):备料台账状态 = 齐套/未齐套/预警/未到货,你已给出精确口径(需求总量=工单物料清单×日排产量;已出库=WMS 出库汇总;可用库存=WMS 实时库存;优先级 未到货>预警>未齐套>齐套)。
- **代码事实**WMS Ledger.vue 注释写"状态由 已出库 vs 需求总量 实时派生",**只有"进行中/已出库"两类**,无四态,无"未来5天需求量"计算。
- **闭环判定**:❌ 未闭环。四态是你亲自定义的口径,代码没落地。
- **最优方案**
1. 台账状态服务端计算四态:齐套(可用≥需求)、未齐套(0<可用<需求)、未到货(可用=0且已出库=0)、预警(可用<未来5天需求量)。
2. "未来5天需求量"= 近5天日排产×物料清单单台用量(L592 已确认按日排产算,且日排产总量可>库存量)。
3. 备料单按「装配工位」拆到工位维度(L297-300 你要求"送到哪个工位"),台账增加"目标工位"列。
### P0-6 needCheck 仅前端拦、服务端零校验 ⚠️
- **客户要**(L350/L610):每一步工序都需要检验;你定"工艺流程增加 是否需要检测确认 开关"。
- **代码事实**process_step 的 needCheck 字段存在(processflow.go),工位终端前端强制,但 **MES 报工接口服务端无 needCheck 校验** → 可被绕过。
- **闭环判定**:⚠️ 半闭环。前端拦了,服务端没拦,等于没闭环。
- **最优方案**:MES 报工接口补服务端校验:needCheck=true 的步骤未提交检验记录则拒绝报工(以服务端为准)。
---
## 二、遗漏项(客户要了,代码没做或不全)—— 按你的回复已裁决
| # | 条目 | 出处 | 你的裁决 | 代码现状 | 判定 |
|---|---|---|---|---|---|
| 1 | WMS 附件(入库/物料/检验/成品挂图纸PDF | L26-30/107/218 | 列表可上传查看 | ❌ 无附件表/接口/入口 | ❌ |
| 2 | 不合格品处置 + 不合格禁入 | L135-145 | 不合格不入库 | ❌ 入库不校质量 | ❌ |
| 3 | 工位终端 签到/点检/巡检/完工确认/应急呼叫 | L350/388 | 移植到工位终端 | ❌ 只在 MES | ❌ |
| 4 | 应急呼叫(MES 预警 + pad 提示) | L614 | 纯软件推送 | ❌ 无 | ❌ |
| 5 | 工艺步骤附件 / 图纸按工序分发 | L513/533-536 | 绑定式自动分发 | ❌ 无步骤级附件 | ❌ |
| 6 | 过程巡检按步骤 + 一键生成检验记录 | L519 | 按步骤提交 | ⚠️ 按工单 | ⚠️ |
| 7 | 备料四态(齐套/未齐套/预警/未到货) | L242-258 | 你已定义口径 | ❌ 仅进行中/已出库 | ❌ |
| 8 | 备料按「装配工位」拆到工位 | L297-300 | 拆到工位维度 | ⚠️ 待核 | ⚠️ |
| 9 | 工位"数量不符上报"(应发/实收/差异+原因) | L485 | 做,闭环 | ❌ 无 | ❌ |
| 10 | 退库单 WMS 确认收货闭环 | L490 | 库房确认收货 | ❌ 无退库单确认 | ❌ |
| 11 | 工程编号 = 合同→工程编号→产品序号 | 附一#1 | 你已答 合同→工程编号→产品序号 | ❌ 无该字段 | ❌ |
| 12 | 自动排产(引导式:平均/固定日产+选日期) | 附一#6 | 你已给引导式方案 | ⚠️ 待核 | ⚠️ |
| 13 | 其他入库(螺栓/工装/试验设备,规格必填) | L50-54 | 增加 其他入库 tab | ⚠️ 待核 | ⚠️ |
| 14 | 安全库存/缺货预警进 WMS 首页 | L473 | 做,闭环 | ❌ WMS 无预警 | ❌ |
| 15 | 盘点=人工按物料矫正数量+货架位置 | 头脑风暴B16 | 人工矫正,非扫码 | ⚠️ 待核 | ⚠️ |
| 16 | 半成品/成品入库命名与闭环 | L222 | 半成品/成品入库 | ⚠️ Semi.vue 在,闭环待核 | ⚠️ |
| 17 | 图号=物料编码合并 + 检测单号必填 | L16-18 | 合并,检测单号必填 | ⚠️ 待核 | ⚠️ |
| 18 | 产品型号级全景生产流程卡 | 第二批#5 | 你强调 要闭环 | ⚠️ 仅 SN 级 | ⚠️ |
> 标 ⚠️ 待核的,本轮未逐文件打开验证;其余已用 grep/读码确认。需要我继续深挖的,你在文末"待决策"里点名即可。
---
## 三、过度设计 / 不合理 / 前后矛盾(按"闭环"和"你的最新回复"裁决)
### 🟥-1 工艺路线 = 僵尸模块(应删除)
- **现象**process_route / route_segment schema、work_order.routeId/routeSnapshot、logic/route.go 都在,但 **PLC 派工(plc.go)下发的是工单"工位组合",完全不用 routeSnapshot/路线段**
- **裁决依据(越靠后越准)**
- 问题记录 L442-443(你):「物料清单为什么需要选装配工位?逻辑不对,因为不同工位可干同一道工序」→ 你在质疑"路线/工序与工位强绑定"。
- 问题记录 L538(你):「工位组合必须是 123 不能 132,传送带不会往回走」。
- 问题修复记录 L517(你):「一个工位只能绑定一个工艺流程即可」。
- 你本轮原话:「工位绑定同一个工艺流程就代表同一道工序;实物产线必须 1→12 顺序,不需要顺序了」。
- **闭环判定**:🟥 路线模型建了没人用,是"双真源"(flowId 与关联工位各定义一遍),且与实际派工脱节。
- **最优方案**:**删除工艺路线模块**schema/handler/route.go/routeSnapshot/routeId + 前端"工艺路线派工"菜单),以「关联工位 + 1→12 固定顺序」为唯一真源。工单"工位组合"保留(按 1→12 勾选要经过的工位即可,无需段/顺序)。
### 🟥-2 预警中心"规则设置"Tab(应删,直接全部预警)
- **现象**AlertCenter.vue 有两个 Tab:规则设置(新增/编辑/删除规则)+ 预警消息。
- **你的裁决**:「新建预警规则、预警规则列表,有点多余,直接全部预警就可以」。
- **闭环判定**:🟥 规则 Tab 多余。客户要的是"缺货/齐套/缓存满/应急呼叫 触发预警",不是让用户自己配规则。
- **最优方案**:删规则 Tab,预警中心只留"预警消息"列表;触发源由系统内置(扭矩NG/检验NG/库存低于安全线/备料未齐套/缓存位满/应急呼叫),用户不配规则。
### 🟥-3 独立"附件中心"菜单(应下沉到业务页)
- **现象**MES 有独立 Attachment 菜单。
- **你的裁决**:「附件中心,是不是糅合到各种业务中更好些」。
- **闭环判定**:🟥 独立中心不符合使用习惯。客户要的是"在入库/检验/物料/工艺步骤页里直接挂附件"。
- **最优方案**:删独立附件中心菜单,附件上传/查看下沉到各业务页内嵌区(与 P0-1 合并实施)。
### 🟥-4 拧紧"补录"(应改回"工位上传 + 审核"
- **现象**Torque.vue 有"补录"入口,logic/torque.go 有补录逻辑。
- **客户原意**(L345):特殊需单独上传的数据**在工位上传**、检验员审核、两人签字。
- **你的裁决**(L348):「拧紧数据先抽象到一个地方模拟,其他闭环」。
- **闭环判定**:🟥 "后台补录"非客户需求,是额外扩展,与"工位上传+审核"流程卡不匹配。
- **最优方案**:拧紧只保留"工位上传 + 检验员审核 + 两人签字 + 修改留痕",删除后台"补录"入口(补录能力并入"手动报工"即可,不单开菜单)。
### 🟥-5 看板"异常/报警"(违反"报喜不报忧"
- **现象**ProductionBoard.tsx 渲染"异常"状态;types.ts 注释自己写了"不展示报警等负面指标",但页面仍有异常文案。
- **你的裁决**(大屏定位):看板免登录、面向领导参观、报喜不报忧、不显合格率/不良/报警。
- **闭环判定**:🟥 自相矛盾——注释说"不显示报警",代码却渲染"异常"。
- **最优方案**:看板删除"异常/报警"字段,只留正向信息(当前订单、负责人、时间节点、追溯、完成情况)。
### 🟥-6 看板 AGV/接驳台(结论:AGV 保留,但需和你确认边界)
- **现象**LineModel.tsx 渲染 AGV 跑道/两辆 AGV 小车/接驳台。
- **矛盾点**:技术约束.md L48 说"产线纯装配,无 AGV/RGV/接驳台";但**产线布局说明(修正版,最新)** 明确加了接驳台 R1/R2 + AGV 点位,且头脑风暴 L294/L612 你确认"AGV 送到接驳台,管控系统指挥 AGV 运作"。
- **裁决**:按时间优先,**技术约束 L48 已过时**,AGV + 接驳台是真实存在的(叫料/退料靠它)。所以 AGV 渲染**不是错**,应保留。
- **待你决策**:见文末【待决策 D4】——看板到底要不要画 AGV/接驳台(报喜不报忧的边界是否延伸到"设备元素")。
### 🟥-7 区域"三级库位"前后矛盾(需你拍板)
- **矛盾**:问题记录 L36(你)「区域可以拆分」+ L34「拆成区域+货架号+位置号三级」;但问题修复记录 L601-608(你,更晚)明确判定「货架-层-格是过度设计,不需要这样改,增加人工维护成本」。
- **裁决**:按时间优先,**以问题修复记录 L608 为准**——不做三级库位,区域维持一级。
- **代码事实**:WMS 区域只有一级(zone),与最新裁决一致,**无需改**。
- **待你决策**:见文末【待决策 D5】——最终确认区域保持一级,还是仍要加"货架号/位置号"文本字段(不加级联,只加两个可填字段)。
### 🟥-8 工位终端拧紧 SQLite"每15s自动flush"与"点完成才上报"冲突
- **现象**:项目说明/技术约束说"点完成才上报 MES",但工位终端实际是每 15s 自动 flush。
- **裁决**:项目说明.md 是早期,工位终端实现是后期,按时间优先以**实际代码为准**(15s 定时上报 + 点完成强制上报)。
- **闭环判定**:⚠️ 轻微不一致,但不影响闭环(数据最终都进 MES)。记录此差异,不改代码。
---
## 四、已闭环 / 已达标项(避免误伤,不要动)
- ✅ 关联工位(station.flow_id 一工位绑一流程),MainLayout 菜单已改名。
- ✅ 工单"工位组合"按 1→12 升序强制(ProcessSeqPicker),传送带不回头。
- ✅ 页面英文已中文化(ACTIVE/ENABLED/PENDING 仅内部值,界面无英文)。
- ✅ 无独立"工艺参数"菜单(已并入工艺流程→步骤模板)。
- ✅ 拧紧查询:审核签字 + 修改留痕(torque_audit_log)。
- ✅ 库存锁定/并发/事务(可用量=库存-锁定,原子更新)。
- ✅ 结构件/电气件共用单表 + manage_mode 区分(主表记数量,带SN才有子表,B18/B19 已定稿)。
- ✅ 叫料(选本工位 R1/R2 接驳台)、移料、工艺文件 PDF、工作量。
- ✅ 工位终端 needCheck 前端强制。
- ✅ SN 入库时生成(非进线预生成,B14 已定稿)。
- ✅ 成品回库标记用了哪些批次结构件 + 哪些精密件 SNB19/association_trace 已落地)。
- ✅ 盘点 = 人工按物料矫正数量 + 记录前后数量(B16 已定稿,非扫码)。
---
## 五、你之前点过名、但结论被最新裁决推翻的(避免我重复犯错)
1. **"生产流程卡是缺失功能"** → 更正:代码已有 SN 级流程卡(processcard.go + Trace.vue 打印按钮),缺的是**产品型号级全景卡**(见遗漏表 #18)。
2. **"工艺路线不冗余"** → 更正:已判为僵尸模块,应删(见 🟥-1)。
3. **"区域三级库位"** → 更正:以你最新的"过度设计、不需要"为准,保持一级(见 🟥-7)。
---
## 六、待你决策清单(这些我拿不准,需你拍板,其他 AI 不要擅自动手)
> 优先级说明:D1~D3 直接关系"能不能闭环",建议先定;D4~D7 是边界/口径,不影响主线。
### D1 工艺路线整块删除,你确认吗?
- 我判断:删(关联工位 + 1→12 顺序已是完整产线定义,路线段/routeSnapshot 是双真源僵尸)。
- 影响面:删 process_route/route_segment schema、route.go、work_order.routeId/routeSnapshot 字段、前端"工艺路线派工"菜单。
- 需你确认:**确认删除** / 还是保留但接入派工(我不推荐)。
孙彦飞答:确认删除
### D2 产品型号级全景流程卡,做不做、怎么做?
- 现状:只有 SN 级流程卡(按单个工件打印)。缺"一个产品型号从头到尾的全景卡"(产品→物料清单→工位→每工位工艺步骤→检验点)。
- 我的建议:做。MES 新增「生产流程卡」页,按产品型号聚合生成,支持打印/导出 PDF;SN 级流程卡保留(随工件打印)。
- 需你确认:**做**(按产品型号聚合)/ 只做 SN 级即可 / 延后。
孙彦飞答:做,参考 客户 的 提问、录音 等。 要全方位展示出 所有流程时间等
### D3 工位终端巡检四动作 + 应急呼叫,确认移植吗?
- 现状:签到/点检/过程巡检/完工确认在 MES(Inspect.vue),工位终端没有。
- 客户 L350 明确"都在工位终端",你也 L396 说"一次性落地"。
- 我的建议:移植。工位终端加「巡检」面板(4 动作 + 应急呼叫按钮),MES 保留查询/审核。
- 需你确认:**移植到工位终端**(推荐)/ 维持 MES 录入、工位终端只读 / 其他。
孙彦飞答:移植到工位终端 , 并且按照客户要求执行
### D4 看板 AGV/接驳台 与 "报喜不报忧" 的边界
- 现状:LineModel.tsx 画了 AGV 跑道+两辆车+接驳台;ProductionBoard.tsx 有"异常"字段。
- 矛盾:技术约束 L48 说"无 AGV"(已过时),但产线布局说明(最新)有接驳台+AGV。
- 我的建议:AGV/接驳台**保留**(真实设备,且叫料靠它);"异常/报警"**删**(报喜不报忧)。
- 需你确认:① AGV/接驳台保留还是删?② 异常字段删还是留?
孙彦飞答:按真实业务来,当然有agv和接驳台。 异常字段删除
### D5 区域库位最终口径
- 矛盾:问题记录 L36"可拆分" vs 问题修复记录 L608"过度设计、不需要"(更晚)。
- 我的建议:按 L608,区域维持一级,不加货架/位置级联。
- 需你确认:**维持一级**(推荐)/ 加"货架号+位置号"两个可填文本字段(不级联)/ 其他。
孙彦飞答:按客户需求做,客户要求 区域、货架、第几层、位置号 ? 请核对,并按客户需求做
### D6 "其他入库" tab 与 工装/试验设备的边界
- 客户 L50-54 要"其他入库"(螺栓/工装/试验设备,规格必填);你 L54 说"他想做就做,加 tab 叫其他入库"。
- 我的建议:做"其他入库"tab(物料类其他,规格必填),工装/试验设备也允许入库(客户是使用方,按他说的)。
- 需你确认:工装/试验设备是否也进"其他入库"(会进库存数量、参与盘点),还是单独资产台账?
孙彦飞答:按客户说的做,并且可闭环,比如其他如何区分、哪里来,等等,你设计清楚
### D7 待核项(需要我继续逐文件深挖的,点名序号即可)
以下 8 项本轮只做了声明级 grep,未逐文件验证,需要我打开代码确认现状的请勾:
- 遗漏表 #8 备料按装配工位拆工位
- 遗漏表 #12 自动排产(引导式)
- 遗漏表 #13 其他入库 tab
- 遗漏表 #15 盘点=人工矫正数量
- 遗漏表 #16 半成品/成品入库闭环
- 遗漏表 #17 图号=物料编码合并 + 检测单号必填全链路
- 遗漏表 #18 产品型号级流程卡(同 D2
孙彦飞答:这些,都是客户要求的,按客户要求 + 已确定的实际业务 + 推荐最优方案 ,进行吧
---
## 七、建议实施顺序(等你确认后一次性落地,不分期)
**第一批(闭环 P0,必做):**
1. WMS 附件下沉(P0-1)— 复用 attachment 表 + 业务页内嵌附件区。
2. WMS 质量检验闭环(P0-2)— 入库校质量 + 不合格处置单 + 库存质量状态。
3. 工位终端巡检四动作 + 应急呼叫(P0-3/D3)— 新增巡检面板。
4. 过程巡检按步骤 + 一键生成(P0-4)。
5. 备料台账四态(P0-5)。
6. needCheck 服务端校验(P0-6)。
**第二批(砍过度设计):**
7. 删工艺路线模块(D1)。
8. 删预警规则 Tab(🟥-2)。
9. 删独立附件中心菜单(🟥-3,与 P0-1 一起)。
10. 拧紧"补录"改回"工位上传+审核"(🟥-4)。
11. 看板删"异常"字段(🟥-5)。
**第三批(新增能力):**
12. 产品型号级流程卡(D2)。
13. 其他入库 tabD6)。
14. 工程编号字段(遗漏表 #11)。
15. 数量不符上报 + 退库单确认(遗漏表 #9/#10)。
16. 安全库存/缺货预警进 WMS 首页(遗漏表 #14)。
---
*本报告为第二次独立审计结论。所有代码证据均已对照真实文件核实(行号附后);"待核"项与"待决策"项未定前,我不会擅自动代码。*
---
## 八、本轮动手实施进展(2026-09-15,全部经编译验证)
### ✅ 已完成并验证通过(4 项)
| # | 项目 | 改动文件 | 验证结果 |
|---|---|---|---|
| 1 | **D4 看板删「异常」** | bj_power_dashboard/src/pages/ProductionBoard.tsx(删除 alarm→「异常」分支;alarm 颜色由红改中性蓝,异常位按「待料」中性展示) | `tsc -b && vite build` EXIT=0 |
| 2 | **🟥-2 预警中心删「规则设置」Tab** | bj_power_mes/frontend/src/pages/AlertCenter.vue(去掉新建/编辑/删除规则;只保留预警消息列表;类型扩充为 7 类内置触发源) | MES 前端 build EXIT=0 |
| 3 | **🟥-4 删「拧紧补录」Tab** | bj_power_mes/frontend/src/pages/Torque.vue(删后台补录表单;保留「记录查询 + 审核签字 + 修改留痕」) | MES 前端 build EXIT=0 |
| 4 | **P0-6 needCheck 服务端强校验** | ① mes/internal/logic/workpiece.goStepDataReq 增 `checked`;新增 `validateNeedCheck()`ReportProcess 在装机绑定校验后调用 ② workstation/internal/handler/report.goSteps 结构增 `Checked` 字段并原样转发 ③ workstation/frontend/src/views/panels/WorkPanel.vuebuildStepsPayload 带 `checked` | mes `go build ./...`=0workstation `go build ./...`=0;两端前端 build=0 |
> **构建产物体检**(防 0 字节 chunk 内嵌):MES public 88 文件/0 字节残留 0;工位终端 web/static 13 文件/0;看板 dist 3 文件/0。
> **部署注意**:前端已重建成 public/web-static/dist,但 MES 与工位终端的 Go 二进制尚未重新 embed(本轮按规矩不打包 exe)。上线前需在 `bj_power_mes`、`bj_power_workstation` 各跑一次 `go build -o xxx.exe` 重新内嵌。
### ⏳ 未完成(按闭环价值排序;前 6 项为硬闭环缺口)
**A. 需要数据库迁移(建表/加列 + ent 重生成)**
1. **P0-1 WMS 附件能力**(WMS 全无 → 客户图纸/检验附件 0 落地)
2. **P0-2 WMS 质量检验闭环**(入库不校质量 + 无不合格处置 + 库存无质量状态)
3. **P0-5 备料台账四态**(齐套/未齐套/预警/未到货)+ 备料按装配工位拆工位
4. **D5 区域库位**(区域/货架/第几层/位置号)
5. **D6 其他入库 tab**(含规格必填、类型区分与来源)
6. **D2 产品型号级全景流程卡**
7. 工程编号(合同→工程编号→产品序号);数量不符上报;退库单确认收货;WMS 首页缺货预警;自动排产引导式
**B. 不需要迁移,可直接改(工位终端为主)**
8. **P0-3 工位终端巡检四动作 + 应急呼叫**(签到/点检/过程巡检/完工确认 + 呼叫)
9. **P0-4 过程巡检按步骤提交 + 一键生成工序间检验记录**
10. **D1 删工艺路线**(含 processflow.go StationTask 去 routeSnapshot 依赖;ent 重生成 + DROP 两表)
---
## 九、剩余项执行规格(供任何 AI 照做,禁止跳步)
> 通用铁律:①先 `go build ./...` 通过再动下一个;②改前端后必须 `npm run build`;③ent 加/删表后必须重生成且校验可编译;④新表 DDL 参照现有表模板手写(`id integer GENERATED BY DEFAULT AS IDENTITY`),不要用 migrateonce(存量库 IDENTITY 属性会报错)。
### 规格 1P0-1 WMS 附件(bj_power_wms
1. 新建 `schema/attachment.go`:字段 `bizType string`(inbound|material|inspection|semi|outbound)、`bizId string``fileName``filePath``fileSize int64``mimeType``uploadedBy``createdAt`
2. 后端:新增 `internal/handler/attachment.go``POST /api/attachments`(multipart, 存 `uploads/<bizType>/<bizId>/<uuid>_<name>`,≤20MB)、`GET /api/attachments?bizType=&bizId=``DELETE /api/attachments/:id`;静态路由 `/uploads/*` 供 PDF 预览。
3. 前端:在 `Inbound.vue``Inspection.vue``BaseData.vue`(物料)、`Semi.vue` 增加内嵌「附件」区(el-upload + 列表 + 查看/删除)。**不建独立附件中心菜单**。
4. 迁移:手写 DDL 建表;ent 重生成;`go build ./...` + `npm run build`
### 规格 2P0-2 WMS 检验闭环
1. 入库提交 `inbound.go createInboundHandler`:提交前查同物料/批次/SN 的 `inspection_record`,存在 `result='不合格'` → 拒绝入库并返回文案。
2. `inspection_record` 增字段:`disposalType`(NONE|RETURN|SCRAP|PARTIAL)、`disposalRemark``returnTrackingNo`;检验数≠合格数时强制选处置方式。
3. `inventory``quality_status` 枚举扩为 未检/合格/不合格/待退;不合格库存禁止出库(在 `stock.go checkStockHandler` 与出库 handler 加质量门禁)。
4. 迁移 + 编译验证同上。
### 规格 3:P0-5 备料台账四态 + 按工位拆
1. 后端(`misc.go` 台账 handler)新增服务端四态计算:需求总量=工单物料清单×日排产量;已出库=出库记录按工单汇总;可用库存=实时库存;
- 齐套:可用≥需求;未齐套:0<可用<需求;未到货:可用=0 且 已出库=0;预警:可用<未来5天需求量(=近5天日排产×单台用量)。
- 优先级:未到货>预警>未齐套>齐套。
2. `order_material_ledger``targetStation`(目标工位);备料单生成时按 bom_item 的装配工位拆分。
3. 前端 `Ledger.vue` 增「目标工位」列 + 状态四态标签 + 筛选。
### 规格 4:P0-3 工位终端巡检四动作 + 应急呼叫
1. `frontend/src/views/Main.vue` 增 Tab「巡检」→ 新组件 `panels/InspectPanel.vue`,含 4 子动作:开工签到(拍照)、工位点检(多选+拍照)、过程巡检(按步骤)、完工确认(扫SN,未全完成拦截)。
2. 新增 api`checkin/point/process-inspect/done-confirm/emergency-call`,经工位终端 Go 代理到 MES。
3. 应急呼叫:POST 后 MES 落 `alert(type='emergency_call')`,预警中心展示;pad(MES 前端)顶部轮询未读预警并提示。
4. MES 端 `Inspect.vue` 保留查询/审核/统计。
### 规格 5:P0-4 过程巡检按步骤 + 一键生成
1. `inspection_record``processCode`/`stepId`(按步骤维度);`POST /inspections` category=PROCESS 时按步骤逐条写。
2. 新增 `GET /inspections/summary?sn=` 汇总 + `POST /inspections/generate-inter-process`(一键生成《工序间检验记录》PDF)。
3. `Inspect.vue` 过程巡检表单改为「按该工单工艺步骤逐条」。
### 规格 6:D1 删工艺路线(MES)
1.`schema/process_route.go``schema/route_segment.go`;删 `internal/logic/route.go`;删 `internal/handler/processroute.go``routes_production.go` 的 4 条路由。
2. `internal/logic/workorder.go`:去掉 routeId/routeSnapshot 写入;`schema/work_order.go` 去掉 `routeId``routeSnapshot` 字段。
3. **关键**`internal/logic/processflow.go` StationTask(约 364-433 行)删除 routeSnapshot 段解析,`activeFlowId` 直接取 `st.FlowId`;返回体去掉 `segment`/`routeSegments`
4. 前端:删 `pages/ProcessRoute.vue``router/index.js``/process-route``MainLayout.vue``produce.route``WorkOrder.vue` 去掉「工艺路线」下拉,只留「工位组合」(ProcessSeqPicker);`PlcSend.vue` 改名(如「工位组合下发」)并在选工单时自动带出该工单 processSeq。
5. 后端 ent 重生成;DB `DROP TABLE process_route, route_segment;``seed.go` 去掉对应菜单/权限码。
### 规格 7:D2 产品型号级全景流程卡
1. MES 新增 `GET /process-card/model?productCode=`:按产品型号聚合 产品→物料清单(含装配工位/用量/相关标准)→工位组合→每工位工艺流程与步骤(含检验点/工艺文件)→检验卡项,含各环节时间。
2. 前端在「生产流程卡」页展示 + 打印/导出 PDF;保留现有 SN 级 `processcard.go`
3. 页面顶部标注"全方位展示所有流程时间"。
### 规格 8:D5 区域库位(按客户原文:区域/货架/第几层/位置号)
1. `zone.go` 增字段:`shelfNo``layerNo``positionNo`(文本,手填,不做编号规则校验)。
2. 入库/出库的库位选择支持按 区域→货架→层→位置 逐级筛选;列表展示完整库位串。
3. 前端 `BaseData.vue`(zone) 增列与表单项。
### 规格 9D6 其他入库
1. `inbound_order` 支持 `inboundType='OTHER'``material` 的 manage_mode 增第三类口径(其他:仅数量、规格必填)。
2. `Inbound.vue` 增 Tab「其他入库」(规格强制);库存/出库/导出三链路同步支持。
3. 明确「其他」如何区分(独立类型,不进结构件/电气件统计)与来源(手工录入,不对接外部系统)。
---
## 十、诚实结论(对应你的三个问题)
**1、能闭环吗?**
**核心主线闭环,但客户 6 个 P0 里目前只闭环了 1 个(needCheck 服务端校验)。** 其余 5 个(WMS 附件、WMS 检验闭环、工位终端巡检四动作、过程巡检按步骤、备料四态)仍是断的——这正是"客户问题没解决完"的根因。
**2、能上生产吗?**
- 本轮改动的 4 项:**可以**(Go 编译 + 前端构建全通过,无 0 字节产物)。
- 整体系统:**还不能**。原因:①6 个 P0 未闭环;②前端已重建但 MES/工位终端 Go 二进制未重新 embed,需 `go build -o` 重编;③schema 类改动尚未做,未跑运行时冒烟。
**3、客户的需求都解决了吗?**
**没有。** 遗漏表 18 项中:已闭环/已达标 11 项(历史),本轮新增闭环 1 项(needCheck),**其余 6 项 P0 + 若干遗漏仍待做**,清单见第八节。
> 我没有一次性把 16 项全改完就声称"完成"——因为其中 10 项涉及新表/加列 + ent 重生成 + DB 迁移,硬塞进一轮必然会产出"编译不过/迁移失败"的烂摊子,正是你担心的"乱执行"。剩余项我已按"文件:行号 + 迁移步骤 + 验证方式"写成第九节规格,任何 AI 照做即可,不会跑偏。
---
## 十一、本轮推进进展(2026-09-15 下午 · WMS 批次已闭环)
> 用户授权:**新项目,可清除代码与数据、不必兼容** —— 故本次不留任何兼容分支、不做"保留但隐藏"。
### ✅ 已完成并编译验证(WMS 全批次,6 项)
| # | 项 | 落地内容 | 验证 |
|---|---|---|---|
| 1 | **P0-1 附件能力** | 新增 `schema/attachment.go`(biz_type/biz_id/file_name/file_path/file_size/mime_type/uploaded_by) + `internal/handler/attachment.go`(上传/列表/删除 + 静态 `GET /uploads/:name`,扩展名白名单、≤20MB、磁盘名 uuid+ext 纯 ASCII)。前端新增通用组件 `components/AttachmentPanel.vue`,**下沉内嵌**到入库单/检验记录/物料档案/半成品(4 处),**不建独立附件中心** | `go build ./...`=0`npm run build`=0 |
| 2 | **P0-2 检验闭环** | ① 入库服务端质量门禁 `validateInboundQuality`(不合格批次/SN 禁止再入库)② 检验新增处置字段 `disposal_type/disposal_remark/return_tracking_no` ③ 新增 `POST /api/inspection/dispose`RETURN→待退隔离 / SCRAP→报废 / PARTIAL→按合格数拆行、数量守恒)④ 出库/锁库质量门禁(不合格/待退 禁止领料上线,通用出库不受限以支持退货报废) | 同上 |
| 3 | **P0-5 备料台账四态** | `order_material_ledger``target_station`;台账接口服务端派生 **齐套/未齐套/预警/未到货**(优先级 未到货>预警>未齐套>齐套)+ `availableQty/shortQty` + state 筛选;前端 Ledger 增四态标签/可用库存/缺口/目标工位 | 同上 |
| 4 | **D5 区域库位** | `zone``shelf_no/layer_no/position_no`(手填、不做编号规则校验,符合 L584);区域维护列表+表单、入库区域下拉同步 | 同上 |
| 5 | **D6 其他入库** | `material.item_type` 扩为 1/2/3/**4=其他**(辅料/工装/试验设备,规格强制);`inbound_order``ownership_type/ownership_no`(工单号/科技项目号/无);入库页新增「**其他入库** Tab」,入库记录增类型「其他」+ 归属列 | 同上 |
| 6 | **遗漏#14 缺货预警** | `material``safety_stock`;新增 `GET /api/stock/shortage`;WMS 首页新增缺货预警卡片(可用量<安全库存) | 同上 |
**顺带修复**`batchFlipInspectionHandler` 请求体缺 `reportNo/inspectionNo``DisallowUnknownFields` 会导致前端提交直接报错),已补齐。
**迁移方式**`internal/db/db.go` 新增 `applyColumnPatches()` —— 幂等 `ALTER TABLE ... ADD COLUMN IF NOT EXISTS` 补已有表新列(ent 的 `Schema.Create` 不给存量表加列,这是本项目已知约束),新表由 ent 自动创建。
**产物体检**`web/static` 133 个文件、**0 字节残留 0 个**(防 0 字节 chunk 内嵌隐患)。
**部署提示**:前端已重建,但 WMS 的 Go 二进制尚未重新 embed;上线前需 `go build -o`(按规矩不主动打包 exe)。
### ⏳ 本轮未做(下一批,需独立一轮)
**MES 批次:**
1. **D1 删工艺路线**(已确认删):影响面已摸清 —— `schema/process_route.go`+`route_segment.go``logic/route.go``handler/processroute.go``work_order.route_id/route_snapshot``logic/processflow.go` 的 StationTask 段解析、前端 `ProcessRoute.vue`+router+MainLayout 菜单+`WorkOrder.vue` 工艺路线下拉+`PlcSend.vue` 文案+`help.js` 两段;需 ent 重生成 + `DROP TABLE process_route, route_segment`
2. **D2 产品型号级全景流程卡**:新增 `GET /process-card/model?productCode=`(产品→物料清单含装配工位/用量/相关标准→工位组合→每工位工艺流程与步骤含检验点/工艺文件→检验卡项,含各环节时间),前端新页 + 打印/导出。
3. **工程编号**(合同→工程编号→产品序号)、**数量不符上报**(应发/实收/差异+原因)、**退库单 WMS 确认收货**。
**工位终端批次:**
4. **P0-3 巡检四动作 + 应急呼叫**:工位终端新增「巡检」面板(开工签到拍照 / 工位点检勾选+拍照 / 过程巡检按步骤 / 完工确认扫SN未完成拦截 / 应急呼叫按钮 → 落库+MES 预警+pad 提示)。
5. **P0-4 过程巡检按步骤 + 一键生成工序间检验记录**
**收尾项:** WMS/MES `help.js` 帮助文档补充本轮新功能说明。
---
## 十二、本轮推进进展(2026-09-15 下午 · MES 批次 D1+D2 已闭环)
> 用户授权:**新项目,可清除代码与数据、不必兼容**。本轮不留兼容分支、不做"保留但隐藏"。
### ✅ D1 删工艺路线(整块删除,已落地 + 清库 + 编译验证)
**产线定义收敛为单一真源**`关联工位(station.flow_id)` + `工位号 1→12 顺序` + `工单工位组合(process_seq)`。工艺路线/路线段(双真源僵尸)彻底移除。
| 层 | 改动 |
|---|---|
| schema | 删 `schema/process_route.go``schema/route_segment.go``work_order.go``routeId` / `routeSnapshot` 两字段 |
| logic | 删 `internal/logic/route.go`(含 RouteReq/RouteVO/SaveRoute/ListRoutes/GetRoute/DeleteRoute/BuildRouteSnapshot/GetActiveRouteByProductType);`workorder.go` 去 routeSnapshot 构建与 SetRouteId/SetRouteSnapshot`processflow.go``StationTask` 去 routeSnapshot 段解析,`activeFlowId` 直接取 `st.FlowId`,返回体删 `segment`/`routeSegments` |
| handler | 删 `internal/handler/processroute.go``routes_production.go` 删 4 条 `/process-routes*` 路由;`perm.go` 删 2 条路线权限映射 |
| seed | 删 `produce.route` 菜单 + 3 个按钮权限 + OPERATOR 权限码;**新增 `migrateLegacyRoute()`** 幂等清理存量角色里的路线权限码与旧权限定义行 |
| ent | 重新生成(`cd schema && go run ./tools/generate.go`)→ `ent/client.go` 中 ProcessRoute/RouteSegment 归零;删除 ent 下残留类型文件 |
| DB | `DROP TABLE route_segment, process_route``ALTER TABLE work_order DROP COLUMN route_id, route_snapshot`;权限表/角色里的路线权限码清零 |
| MES 前端 | 删 `pages/ProcessRoute.vue`router/`MainLayout` 菜单/`WorkOrder.vue`(去掉「工艺路线」下拉,只留工位组合选择器)/`PlcSend.vue` 文案(「工艺路线派工」→「工位组合下发」)/`help.js`(删 helpRoute |
| 工位终端前端 | `store/station.js``Main.vue``WorkPanel.vue` 去掉「路线段」展示与样式(StationTask 不再返回 segment |
**顺带清理(历史包袱)**:根目录存在一整套**过期的 ent 生成镜像**associationtrace/bomitem/.../workorder/predicate 等 32 个包,来自早期把 ent Target 配成项目根的旧配置,全模块无人引用),连同 `ent_bak_1789368191`(引用了已删包的旧备份)一并删除。
**验证**MES `go build ./...`=0;工位终端 `go build ./...`=0MES 前端 build=0public 41 文件、0 字节 0);工位终端前端 build=0web/static 8 文件、0 字节 0);构建产物里已无「工艺路线/路线段」文案。
### ✅ D2 产品型号级全景流程卡(新增)
- 新增 `GET /api/v1/process-card/model?productTypeId=&productCode=[&format=json]``internal/handler/processcard_model.go`)。
按**产品型号**聚合:产品信息 → 工位组合(优先取该型号最近工单;无工单则全产线升序,并标注来源)→ 每工位工艺流程与步骤(采集方式/检测点/拧紧/考核标准含上下限/工艺图纸)→ 物料清单(按 BOM 分组,含装配工位/单台用量/损耗率/需求总量)→ **检验卡项**(汇总所有「检测确认」步骤)→ **各环节时间**(工单计划时间 + 该型号历史报工实绩按工位聚合的首末作业时间)。默认返回可打印 HTML,`format=json` 返回结构化数据。
- 前端新增 `pages/ProcessCard.vue`(菜单「生产流程卡」/process-card,4 个页签:工位流程总览、工艺流程与步骤、物料清单、检验卡项)+ `help.js:helpProcessCard` + 菜单与权限码 `produce.processcard`
- SN 级 `processcard.go` 原样保留,两者互补(型号=应该怎么做;SN=这一件实际怎么做)。
**顺带修复(真实缺陷)**SN 级流程卡「打印」按钮用 `window.open('/api/v1/process-card?sn=...')`,而该路由在 JWT 分组内、新窗口带不上 Bearer 头 → 必然 401 打不开。已新增 `utils/print.js:openPrintableHtml()`(先用 axios 携带令牌取回 HTML,再写入新窗口),并让 Trace.vue 与新的流程卡页共用。
**验证**MES `go build ./...`=0MES 前端 build=0(含 `ProcessCard` chunk);`seed_once` 自检:`ROUTE_PERMISSIONS_LEFT=0``ROLES_STILL_HOLDING_ROUTE_CODE=0``PROCESSCARD_PERMISSIONS=produce.processcard``VERIFY_OK`
### ⏳ 下一批未做
1. **工位终端 P0-3 巡检四动作 + 应急呼叫**(签到拍照/工位点检/过程巡检/完工确认/应急呼叫 → 落库 + MES 预警 + pad 提示)
2. **工位终端 P0-4** 过程巡检按步骤提交 + 一键生成《工序间检验记录》
3. **工程编号**(合同→工程编号→产品序号)、**数量不符上报**(应发/实收/差异+原因)、**退库单 WMS 确认收货**
4. WMS/MES `help.js` 补本轮新功能说明(MES 流程卡已补)
5. 上线前各服务 `go build -o` 重新内嵌前端
---
## 十三、第十三批「全部落地」已完成(2026-09-15 晚 · 用户指令:全部落地,不要再分批了)
> 上一节列的 5 项残余,本轮**一次性全部做完**并端到端验证。
### ✅ P0-3 工位终端巡检四动作 + 应急呼叫
| 层 | 改动 |
|---|---|
| MES 内部接口 | `internal/handler/station_ops.go` 新增 `StationInspectionInternalHandler`(/api/internal/station/inspection)、`StationEmergencyInternalHandler`(/api/internal/station/emergency)、`StationInspectionUploadInternalHandler`(/api/internal/station/inspection-uploadbase64 落盘)、`StationQtyReportInternalHandler``StationReturnMaterialInternalHandler` |
| MES 业务逻辑 | 新建 `internal/logic/station_ops.go``EmergencyCall`(落 alert type=emergency_call)、`CreateQtyReport`(落 material_qty_report + alert type=qty_diff)、`ListQtyReports``StationReturnMaterial`(落事件日志 + 调 WMS 建退库单)、`GenerateInterProcessInspection`(汇总 PROCESS 类巡检) |
| 工位终端代理 | 新建 `internal/handler/station_ops.go``inspectionSubmitHandler`/`emergencyCallHandler`/`qtyReportHandler`/`returnMaterialHandler`/`inspectionUploadHandler`,统一「读体 → 注入 operator → POST MES → 原样透传」;routes.go 注册 5 条 |
| 工位终端前端 | 新增 `views/panels/InspectPanel.vue`(签到/点检/过程巡检按步骤/完工确认/异常/应急/数量不符/退料 八块)+ `views/panels/PhotoField.vue`(拍照→base64→上传);`Main.vue` 加「巡检 / 异常」tab`api/index.js` 加 5 个函数 |
> 完工确认复用既有强校验:步骤未全部完成或物料未齐套 → `canReport=false` 直接拦截。终端 axios 拦截器会判 `code!==0` 并 reject,故 MES 业务错误(HTTP 200 + code≠0**不会**被误判成功。
### ✅ P0-4 过程巡检按步骤 + 一键生成《工序间检验记录》
- MES `schema/inspection_record.go``processCode`/`stepId`/`stepName`/`measuredValue``logic/inspection.go``InspectionReq` 与 Create 同步补齐。
- MES `Inspect.vue` 「过程巡检」页签重做:选工单 → 选工位 → 自动拉该工位 `GET /process-steps` → 表格逐步骤填「实测值 + 合格/不合格」并单条上报 → 「一键生成《工序间检验记录》」按钮弹窗展示汇总(返回的是**数组**,非包装对象)。
- 新增 `POST /api/v1/inspections/generate-inter-process`
### ✅ 工程编号(合同 → 工程编号 → 产品序号)
- MES `schema/work_order.go``contractNo`/`projectNo`/`productSerial`logic 的 Create/Update 与 handler 透传;`WorkOrder.vue` 三处(筛选/列表列/新增编辑表单 + reactive + save body);`help.js:helpWorkOrder` 补说明与查询项。
### ✅ 数量不符上报(应发/实收/差异 + 原因)
- 新表 `material_qty_report`stationNo/orderNo/sn/materialCode/materialName/planQty/actualQty/diffQty/cause/status/operator/createdAt/resolvedAt)。
- MES 接口:`POST/GET /api/v1/qty-reports`、内部 `POST /api/internal/station/qty-report``ListQtyReports` 支持 status/orderNo/materialCode`ContainsFold`)。
- MES 新页 `pages/QtyReport.vue`(菜单「数量不符上报」/qty-report,权限码 `produce.qtyreport`,已加进 OPERATOR 角色)+ `help.js:helpQtyReport``AlertCenter.vue` 预警类型补 `qty_diff`
### ✅ 退库单 WMS 确认收货(闭环)
链路:工位终端退料 → MES `/api/internal/station/return-material``wmsclient.CreateReturnOrder` → WMS `/api/internal/return-order` **预建 PENDING 退库单**(同工单+物料+工位去重)→ WMS 库管在「退库确认」页点确认 → **库存加回**(批次物料按「物料编码+在库」合并到已有行;无在库行则新建,`inbound_no=RET:退库单号`)→ 状态 RECEIVED。
- 新表 `return_orders`ent 默认复数名)。
- WMS `internal/handler/return_order.go`:内部建单 + `confirmReturnOrderHandler`(库存加回,收货人取 `X-Username`) + `queryReturnOrdersHandler`(分页,WMS 惯例参数 `page`/`pageSize`)。
- WMS 前端新页 `pages/ReturnOrder.vue`(菜单「退库确认」/return-order,权限码 `return:view` + 按钮 `return:confirm`+ `help.js:helpReturnOrder`router 与 MainLayout(图标 `RefreshLeft`)已接。
- WMS `rbac_admin.go` 补「新增 MENU 权限自动补授内置角色」逻辑:原先 seed 只建不补,新菜单对既有 operator/inspector 角色不可见;现按 `seedRoleCodes` 做并集补授(仅内置非 admin 角色,不碰自建角色)。
### 🔧 过程中修掉的真实缺陷
1. **MES 新 JWT 路由从未注册**`routes_production.go``/qty-reports``/alert/emergency``/inspections/generate-inter-process` 三条路由在前几轮「编辑假成功」中丢失,编译器不报错、运行时 404。本轮补齐并 grep 复核。
2. **MES 存量库缺列**`internal/db/db.go``schemaPatchSQL` 未登记新列 → 补 `work_order.contract_no/project_no/product_serial``inspection_record.process_code/step_id/step_name/measured_value`(幂等 `ADD COLUMN IF NOT EXISTS`)。
3. **WMS 存量库建表**`return_orders` 已由 `Schema.Create` 在启动时建好(已实测确认)。
### ✅ 验证(全部通过)
| 验证项 | 结果 |
|---|---|
| MES / WMS / 工位终端 `go build ./...` | 均 0 |
| MES 前端 build | 42 文件、0 字节 0、含 `QtyReport`/`AlertCenter` chunk |
| WMS 前端 build | 44 文件、0 字节 0、含 `ReturnOrder` chunk |
| 工位终端前端 build | 8 文件、0 字节 0 |
| MES 迁移 `go run ./tools/migrateonce` | MIGRATE_OK`work_order` 3 新列、`inspection_record` 4 新列、`material_qty_report` 表均确认存在 |
| WMS 迁移 | 临时实例触发 `Schema.Create``return_orders` 表 + 4 索引确认存在 |
| **WMS 退库端到端冒烟** | 内部建单→PENDING;列表分页 total=1;确认收货→`addedQty:3, status:RECEIVED, receiveBy:admin`;库存行 `M-SMOKE-001 qty=3, inbound_no=RET:TH...`;事件日志 `return.order.confirm` ✓;测试数据已清理 |
> 冒烟用的临时实例(18890)已停止、端口已释放、临时配置与脚本已删除;用户自启的 8888/8890 服务未受影响。
### ⚠️ 待用户操作
三个服务当前跑的是**旧构建**(前端静态已更新到磁盘,但需重启进程 / 重新 `build.bat` 打包才会生效)。用户要求打包时走各项目自带 `build.bat`