# 独立审计报告 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.vue(4 个 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 | ✅ 已实现 | ✅ 其他入库 tab + 规格强制 + 归属含"其他"(form1/form2/form3 均带归属) | | 14 | 安全库存/缺货预警进 WMS 首页 | L473 | 做,闭环 | ❌ WMS 无预警 | ❌ | | 15 | 盘点=人工按物料矫正数量+货架位置 | 头脑风暴B16 | 人工矫正,非扫码 | ⚠️ 待核 | ⚠️ | | 16 | 半成品/成品入库命名与闭环 | L222 | 半成品/成品入库 | ⚠️ Semi.vue 在,闭环待核 | ⚠️ | | 17 | 图号=物料编码合并 + 检测单号必填 | L16-18 | 合并,检测单号必填 | ✅ 已实现 | ✅ 图号全链路:WMS/MES/工位终端 全部 UI 改为"图号"(含用户"全部叫图号"口径),后端导出/打印表头同步改"图号" | | 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 已定稿)。 - ✅ 成品回库标记用了哪些批次结构件 + 哪些精密件 SN(B19/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. 其他入库 tab(D6)。 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.go:StepDataReq 增 `checked`;新增 `validateNeedCheck()`;ReportProcess 在装机绑定校验后调用 ② workstation/internal/handler/report.go:Steps 结构增 `Checked` 字段并原样转发 ③ workstation/frontend/src/views/panels/WorkPanel.vue:buildStepsPayload 带 `checked` | mes `go build ./...`=0;workstation `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 属性会报错)。 ### 规格 1:P0-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///_`,≤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`。 ### 规格 2:P0-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) 增列与表单项。 ### 规格 9:D6 其他入库 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 ./...`=0;MES 前端 build=0(public 41 文件、0 字节 0);工位终端前端 build=0(web/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 ./...`=0;MES 前端 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-upload,base64 落盘)、`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`。 --- ## 十四、上生产线前剩余项 · 详细落地方案(2026-09-16,待用户确认后执行) > 用户指令:①不分优先级,全部一起解决;②以「你已裁决的口径」为准(客户原话里被你否掉/改掉的不照客户原话,照你的裁决);③方案要非常详细、结合实际代码,逐文件逐字段,等确认后再动手。 > 本轮全部内容已逐文件核实真实代码(文件:行号附后),非凭记忆。 ### 关键口径(以你的裁决为准,防止再被客户原话带偏) | 议题 | 你的最终裁决 | 落地原则 | |---|---|---| | 归属下拉 | 附一#2「工单号/科技项目号/**其他**」 | 用「其他」,**不是**「无」;出库同样补归属 | | 不合格原因 | 附二#5「删除」 | 已删(代码确认),不再引入 | | 质量检验菜单 | 附二#7「来料/过程/完工三分命名,表不变」 | 沿用,不在 MES 再问"放哪" | | 物料清单归属 | 附二#10「拒绝,归属放检验单,清单补相关标准」 | 清单**不加归属**,加「相关标准」字段 | | 图号合并 | L16-18「编码保留作唯一标识,仅显示文案统一叫图号」 | **只改显示文案**,字段 code 不动 | | 库位 | 附二#4「拒绝全自动,做推荐库位」 | 做推荐(历史常用+同区空位),非全自动 | | 0/13 工位 | 附一#9「无实体位,用 PAD 操作,业务照常」 | 加 0/13 虚拟工位 | | 跨天在制品 | L440「只排未开工数量,在制品跨天继续」 | 补 WIP 承接 | --- ### A. WMS 出库整块(最大缺口) **A1. 出库分类 + 归属 + 批次/SN 自动切换** - 后端 `schema/outbound_order.go`(现字段 17-39)新增 4 字段: - `outbound_category` string(枚举:return_sample/return_material/scrap/deliver/other,对应 退料/样品/报废/发货/其他;"其他"可手输原因) - `ownership_type` string(workorder/project/other,与入库 `inbound_order.go:32-33` 对齐) - `ownership_no` string(归属单号) - `target_station` string(目标工位,用于"送到哪个工位") - 后端 `internal/handler/outbound.go`: - `generalOutboundRequest`(:303-313)增 `outboundCategory/ownershipType/ownershipNo/targetStation` 四字段;`outboundCategory=other` 时 `remark` 必填(承载手输原因)。 - `queryOutboundHandler`(:244-300)补齐筛选:`outboundCategory/ownershipNo/materialName/targetStation/startDate/endDate`——**修复当前前端传了 outboundType/日期但后端忽略的 bug**。 - 出库时按物料 `manage_mode` 走批次或 SN(后端已按 `len(snList)>0` 反推,改为显式取物料 manage_mode)。 - 前端 `frontend/src/pages/Outbound.vue`: - `genForm`(:104)增 出库类别(radio:退料/样品/报废/发货/其他,选其他时显示原因输入框)、归属类型+归属单号(联动下拉)、目标工位。 - 批次/SN 框改为**由所选物料的 manage_mode 自动切换**(当前 `:284-289` 是手动单选,改为监听 `MaterialSelect` 选中物料后自动 set mode)。 - 通用出库记录 Tab `loadGenRows`(:133)传参补全。 **A2. 出库记录列表加列 + 筛选** - 前端 `Outbound.vue` records 页签: - 列表(:399-424)加「归属」「目标工位」两列。 - 筛选 `recFilters`(:172)增 归属单号、名称图号、日期范围(已有 dateRange,需后端支持)。 ### B. WMS 图号与物料编码合并(只改显示文案) > 原则:`material.code` 字段**保留**作唯一标识,仅把界面 label 从「物料编码」改为「图号」。物料档案「新增」时 label 显示「物料编码/图号」,其余页面统一「图号」。 - 前端 `frontend/src/pages/` 以下文件把「物料编码」显示文案改为「图号」("新增"处用「物料编码/图号」): - `BaseData.vue`(:401,402,439,448,494)—— 列表列 :448 改「图号」,表单 :494 改「物料编码/图号」 - `Inbound.vue`(:441,505,577,578,615,669) - `Inspection.vue`(:406,407,449,517,537) - `Ledger.vue`(:74,75,103)、`Outbound.vue`(:254)、`Inventory.vue`(:243,244,295,366)、`Semi.vue`(:190,191,206)、`ReturnOrder.vue`(:87)、`Dashboard.vue`(:75)、`Agv.vue`(:228) - `help.js` 全文「物料编码」改「图号」(约 14 处) - 后端导出/导入表头同步:`material.go:378/414`、`inbound.go:431`、`outbound.go:543`、`inspection.go:355` 的「物料编码」表头改「图号」。 ### C. WMS 检验跳转入库 + 入库记录合格/不合格列 - 前端 `Inspection.vue` `submitInspection`(:99-152)提交成功后,加「跳转入库」入口:`router.push('/inbound')` 并携带 `检测单号`(inspectionNo)+ 物料类型(结构件/电气件)作为 query 参数;入库页 `Inbound.vue` onMounted 读取 query 自动回填检测单号。 - 后端 `schema/inbound_order.go` 新增 `quality_status` string(合格/不合格/部分,非必填,默认空表示未关联检验);入库记录查询在返回时 join 该批对应的 `inspection_record.status` 回填。 - 前端 `Inbound.vue` 入库记录列表(:607-648)加「合格/不合格」列。 ### D. WMS 批次号规则 - 后端 `internal/handler/inbound.go` `genBatchNo`(:460-479)改写为「物料编码-日期-流水号」:格式 `{materialCode}-YYYYMMDD-{3位流水}`,流水号用数据库序列或按当日该物料已生成数量自增(查询当日该物料最大批次号取流水+1),保证唯一;去掉当前 `"B"+时间戳+末4位` 方案与 TODO。 - `excel.go:370` 批量导入空批次的后缀逻辑同步改为唯一流水,避免并发重复。 ### E. WMS 区域库位贯通 + 库位推荐 - 后端 `schema/inventory.go` 新增 `shelf_no/layer_no/position_no` 三字段(与 zone 表 :22-26 对齐),入库/出库/库存行落位。 - 前端 `Inbound.vue` 区域选择(:411-416、:461-466、:539-544)从「只选 zoneCode」改为「区域→货架→层→位置」四级联动下拉;库存查询 `Inventory.vue` 展示完整库位串。 - 后端新增库位推荐:入库选物料后,返回该物料「历史常用库位 + 同区空位」候选(新 handler,如 `POST /api/inbound/suggest-zone`),前端一键确认或手改。 ### F. WMS 备料台账完成时间查询 - 后端 `schema/order_material_ledger.go` 新增 `completed_at` int64;领料完结处(`outbound.go:210-217`)写 `completed_at`。 - `queryLedgerHandler`(`misc.go:276-357`)增 `completeStart/completeEnd` 时间范围筛选。 - 前端 `Ledger.vue` 筛选(:68-93)加「完成时间」日期范围。 ### G. WMS 半成品/成品入库字段 + 出库原因 - 后端 `internal/handler/misc.go` `semiInboundHandler`(:32-108)请求体(:34-42)增 `ownershipType/ownershipNo/productStatus/relatedStandard/testRecordNo/recordedBy/recordedAt`;落库到 inventory 对应新字段。 - 前端 `Semi.vue` 入库表单 `inForm`(:28)增:归属、产品状态(已通过/部分通过/返修)、相关标准(试验方案号)、试验记录单号、记录员、记录日期;挂接 `AttachmentPanel`(bizType=semi,后端已支持)。 - 半成品出库(`Semi.vue:173-186`)加「原因」按钮(包装/继续生产/检验试验/其他)+ 扫 SN 后自动带出该 SN 的物料/已完成工序/库位信息(后端 `semiOutboundHandler` `misc.go:111-148` 增按 SN 查询返回明细)。 --- ### H. MES 车间质量检验(过程/完工) > 菜单命名沿用你裁决:来料/过程/完工三分。来料在 WMS 已做,此处补 MES 侧过程/完工检验录入。 - 后端 `schema/inspection_record.go` 扩 `category` 枚举加 `INCOMING/PROCESS/FINAL`(现 :27 只有 CHECKIN/POINT/PROCESS/DONE/ALARM);新增字段:`reportNo`(报检单号)、`manufacturer`(生产厂家)、`inspectionNo`(检验单号)、`attachmentIds`(附件)、`disposalType`(退货/返修/退换)、`disposalRemark`。 - 后端 `logic/inspection.go`:新增「按物料编码/名称图号调出 BOM 料信息」接口;新增「不合格单一键生成」`GenerateUnqualifiedReport`(模板导出 PDF/Excel);处置动作区分 退货/返修/退换。 - 前端 `frontend/src/pages/Inspect.vue` 或新页 `QualityInspection.vue`:新增「过程检验/完工检验」录入页签(选物料编码/图号 → 自动带出 BOM → 填报检单号/厂家/检验单号/附件 → 不合格一键生成不合格单 → 处置退货/返修/退换)。 ### I. MES 产品物料清单补字段 + 导入 - 后端 `schema/bom_item.go` 新增 `relatedStandard`(相关标准/检验细则) string;`processCode` 语义保持"装配工序",另新增 `stepBelong`(工序所属) 可选关联。 - 后端新增 BOM Excel 导入接口(`internal/handler/production/bom_material.go` 加 `ImportBomHandler`,模板:产品编号|物料清单名称|物料编码|名称|规格|单位|单台用量|损耗率|装配工位|相关标准|备注)。 - 前端 `Bom.vue`(列表 :22-54、表单 :60-87)加「相关标准」列/字段 + 「导入」按钮;菜单名 seed.go:72 由「物料清单」改「产品物料清单」。 ### J. MES 工艺步骤附件/图纸按工序分发 - 后端 `schema/process_step.go` 新增 `attachment`(可多份,jsonb 或关联 attachment 表 bizType=step)。 - 后端 `StationTask`(`processflow.go:352-385`)的 `steps` 返回每步骤附件列表;工位终端按当前步骤过滤展示。 - 前端 `ProcessFlow.vue` 步骤子表(:105-147)加「本步骤图纸/附件」上传列。 - 工位终端 `frontend/src` 工艺文件展示:由「整流程单 PDF」改为「当前步骤的图纸/附件」。 ### K. MES 自动排产(引导式) - 后端 `logic/dailyplan.go` 新增 `AutoSchedule`:输入 工单 + 模式(平均分摊/固定日产)+ 日期区间 → 生成多条 `daily_plan`(status=PENDING,人工确认后启用);校验排产合计 ≤ 工单 quantity。 - 前端 `WorkOrder.vue` 列表加「自动排产」按钮,弹窗引导:选模式 → 选日期区间(可多段,如 6/23-26、6/28-29)→ 生成未启用排产单。 - 前端 `DailyPlan.vue` 增加「启用/停用」状态操作。 ### L. MES 跨天在制品 WIP + 0/13 工位 **L1. 跨天在制品** - 后端 `logic/dailyplan.go` `AutoSchedule`/`SaveDailyPlan` 计算排产量时,只排「未开工数量 = 工单 quantity − 已完工 − 已进线未完工」,已进线未完工工件跨天继续、不重排。 - 新增接口 `GET /api/v1/workpieces/in-process?stationNo=` 列出停在各工位未完工工件(SN/产品/停留时长/已完成步骤)。 - 前端 MES 新增「在制品」视图(可选菜单),工位终端「作业」页默认展示停在本工位的未完工工件。 **L2. 0/13 虚拟工位** - 后端 `schema/station.go` `stationNo` 放开 1..12 约束注释;`seed.go:158` 增插 0 号(上线)、13 号(下线) 两行,`stationType=OFFLINE`。 - 修多处硬编码:`processseq.go:11,28`(FullProcessSeq 与 n>12 过滤,0/13 不参与工位组合排序但需存在)、`line.go:209`(叫料 1~10 约束保留,0/13 不叫料)、`plc.go:66`、`processcard.go:240`、`auth.go:207`、`dashboard.go:405`——0/13 仅作业务记录工位,不连 PLC、不参与产线组合排序。 - 前端工位终端/巡检工位下拉自动出现 0/13(station 表加了即显示)。 ### M. MES 工单字段 + 绩效效率 - 后端 `schema/work_order.go` 新增 `createdBy`(创建人)、`dueDate`(完成日期,必填);`logic/workorder.go` Create 时写 createdBy(取当前登录用户)、校验 dueDate 必填。 - 前端 `WorkOrder.vue` 新建表单(:70-92)加「完成日期」必填;列表(:32-45)加「创建人」「创建日期」列。 - 绩效效率:后端 `schema/workpiece_process.go` 新增 `durationSec`(作业时长);`ReportProcess`(`workpiece.go:141-146`)改为 startedAt=进工位时间、endedAt=报工时间、durationSec=两者差;`WorkloadRow`(`processflow.go:388-397`)加 上机时间/作业时长/效率;前端 `Performance.vue` 统计卡(:31-56)加「平均作业时长/效率」。 ### N. 拧紧补录残留清理 - 后端删除 `internal/handler/production/plc_torque_scan.go:127` `TorqueManualAddHandler`(POST /torque/manual-add)与 `logic/torque.go:105-129` `AddTorqueRecord`;前端 `help.js:121/125/130` 删除「补录」文案(前端 Torque.vue 已无补录 UI)。 ### O. 三端帮助文档补齐 - WMS `help.js` 补:其他入库、区域库位四级、缺货预警、质检处置(退货/报废/部分入库)、附件使用、图号改名说明。 - MES `help.js` 补:应急呼叫、跨天在制品、0/13 工位、自动排产引导式、质量检验(过程/完工)、BOM 导入与相关标准、步骤级附件;删「补录」文案。 - 工位终端 `help.js` 补:巡检、异常、叫料、数量不符、应急呼叫(当前仅"暂存退库"已覆盖)。 ### 收尾统一动作(每项完成后) 1. 后端 `go build ./...` 通过;schema 变更后重生成 ent(MES `cd schema && go run ./tools/generate.go`;WMS `go run -tags entgenerate ./tools`)。 2. 存量库加列走 `schemaPatchSQL`/`applyColumnPatches`(幂等 ADD COLUMN IF NOT EXISTS);新表手写 DDL(id integer GENERATED BY DEFAULT AS IDENTITY)。 3. 前端 `npm run build`,产物 0 字节文件数=0。 4. 权限码:新菜单/按钮在 seed 与 perm.go 登记,并补授内置角色。 ================================================================================ # 夜间批量落地变更报告 + 上线就绪审计 + 多轮自省(2026-09-18 夜间 23:10 起执行) ================================================================================ ## 一、夜间批量落地变更报告 > 口径:先逐文件核实真实代码,再动手。前一轮(其他 AI)已落地且经核属实的标注「已落地·核实通过」;本轮补做/重做的标注「本轮改造」。 ### 一.1 接驳台独立主数据(dock 表) - **改前**:WMS 已有 docks 表(schema/dock.go)与种子 21 个(DOCK01~20 产线 + DOCK21 库房),但 ① 类型只有 line/store,**缺「其他」**;② **无任何维护入口**(只有 AGV 页只读展示状态卡片);③ 与工位无唯一约束。 - **本轮改造**: - `schema/dock.go`:dock_type 语义扩展为 line 产线 / store 库房 / other 其他(非产线接驳台不挂工位,station_no 固定 0)。 - `internal/db/db.go` applyColumnPatches 新增幂等 DDL:`CREATE UNIQUE INDEX IF NOT EXISTS ux_docks_station_no ON docks (station_no) WHERE station_no > 0` → 部分唯一索引保证「产线接驳台 ↔ 工位 1:1」,库房/其他不参与。 - 新增 `internal/handler/dock.go`:listDocksMaintHandler(真分页,SQL 层 Count+Offset/Limit,默认 created_at desc,支持类型 + 编码/名称关键字筛选)、createDockHandler、updateDockHandler、deleteDockHandler;validateDock 统一校验:编码必填且唯一、名称必填、类型仅 产线/库房/其他、产线必须绑工位号、非产线强制 station_no=0、工位已被占则中文报错、有托盘占用禁止删除。 - `routes.go` 注册 /api/docks(GET/POST)、/api/docks/update、/api/docks/delete,均 requirePerm 鉴权。 - `rbac_admin.go` 新增权限种子:dock:manage(MENU /dock)、dock:add、dock:edit、dock:delete(父码 dock:manage)。admin 自动全量、operator 自动继承。 - 前端新增 `frontend/src/pages/Dock.vue`(中文类型标签、真分页、增删改、空状态、帮助按钮);router 加 /dock;MainLayout 基础数据组加「接驳台维护」菜单;help.js 新增 helpDock。 - **是否闭环**:闭环(模型 + 类型 + 唯一约束 + 接口 + 权限 + 页面 + 帮助文档)。 ### 一.2 工位 ↔ 接驳台 1:1 唯一约束 - **改前**:MES station.dock_code 仅普通字段无唯一约束;WMS dock.station_no 亦无约束 → 同一接驳台可被多个工位绑定。 - **本轮改造**: - MES `internal/db/db.go` schemaPatchSQL 新增:`CREATE UNIQUE INDEX IF NOT EXISTS ux_station_dock_code ON station (dock_code) WHERE dock_code <> ''`。 - MES `internal/logic/processflow.go` SaveStation:编辑态 dockCode 非空时先校验 !st.IsBuiltin → 报「自定义工位(非内置)无实体接驳台,不可绑定接驳台」;再查其他工位是否已占 → 报「接驳台 X 已绑定工位N,一个接驳台只能绑定一个工位」。新增态显式传 dockCode 直接拒绝。 - MES `Station.vue`:接驳台下拉 :disabled="!row.hasDock";编辑弹窗按 dlg.isBuiltin && dlg.hasDock 条件渲染,其余显示说明文案。 - WMS 侧见 一.1 的部分唯一索引 + validateDock。 - **是否闭环**:闭环(DB 约束 + 后端校验 + 前端禁用 三层)。 ### 一.3 一个工艺步骤可在多工位进行 + 物料配送比例 - **改前(核实)**:已落地。station_process(工位↔工序派工,按生效日+班次)支持多工位同工序;logic/material.go GenerateMaterialRequest 按「工序 → 派工工位」拆料,splitQtyToStations(stations, dayQty, stationQty) 优先采用日排产 station_plan_qty 人工指定件数,未配置则自动均分(余数补前)。 - **本轮核验**:确认 DailyPlan 的 station_plan_qty 即「人工指定每个工位干多少个成品件」的落点;BomItem.process_code 保持为物料绑定层级未改。两条路径(人工指定件数 / 自动均分)与用户口径一致。 - **是否闭环**:已落地·核实通过(本轮未重复改造)。 ### 一.4 滚筒线单向:同工序工位连续、不同工序不可穿插 - **改前(核实)**:已落地。UpsertStationProcess 写入前把「其余既有行 + 本次新行」合并后调 ValidateStationProcessContinuity:已派工工位按工位号升序必须单调不降,出现 1→2→1 整体回退;未派工(0)工位为中性不参与校验。前端 Station.vue validateDispatch 同步客户端预校验。 - **本轮核验**:物理约束(流到 7 号位无法回 2 号位)与「单调不降」等价,可拦住 3/5 之间插入 4 号其它工序的错误配置。 - **是否闭环**:已落地·核实通过。 ### 二.1 操作日志:事件类型下拉去掉 登录/退出 - **改前**:MES/WMS 操作日志页「事件类型」下拉第一项为「登录/退出」(value auth.),后端不排除。 - **本轮改造**: - WMS `internal/eventlog/eventlog.go` Query 增加 `eventlog.Not(eventlog.EventTypeHasPrefix("auth."))`。 - MES `internal/eventlog/eventlog.go` Query 同上。 - 前端两侧 EventLog.vue:删除 EVENT_FAMILIES 中「登录/退出」项,并同步移除 FAMILY_TAG['auth.'] 与 ENTITY_LABEL.auth,避免残留死映射。 - **是否闭环**:闭环(后端查询层 + 前端下拉,双端一致)。 ### 二.2 预警中心:补 开始时间/结束时间/预警类型 + 真分页 + 默认当天 - **改前(核实)**:已落地。AlertCenter.vue 已有 状态/预警类型/开始时间/结束时间 四条件,开始时间默认当天、结束时间默认空;logic/alert.go ListAlerts 在 SQL 层 Count + Offset/Limit,Order(created_at desc, id desc),返回 {list,total,page,pageSize}。右上角铃铛 MainLayout.vue 轮询 /alerts?status=UNREAD 并弹新预警提示。 - **是否闭环**:已落地·核实通过。 ### 二.3 附件中心:仅展示、不可增删改,删除归各业务页 - **改前(核实)**:已落地。MES Attachment.vue 为纯只读页,顶部提示「新增/删除请在各自业务页面操作」,表格含**文件路径**列且为可点击下载链接;后端仅保留 upload/list/download/delete 四接口,delete 供业务页调用。 - **是否闭环**:已落地·核实通过。 ### 二.4 数量不符上报:MES 仅预警 + 删菜单;WMS 明细与处理 - **改前(核实)**:已落地。MES logic/station_ops.go CreateQtyReport 落 material_qty_report 并写预警中心 type=qty_diff(预警原因为融合后的一段文字:工位/物料/应发/实收/差异/原因);seed.go 已幂等下线「数量不符上报」菜单;铃铛计数同步。 - **本轮补充核实 · WMS 当前闭环路径与操作方式(用户要求查明并说明)**: 1. **反冲短欠**:internal/handler/backflush.go FIFO 扣库存时任意物料不足 → 扣足可用部分、记短欠,不阻塞产线(MES 侧另有 wms.backflush.failed 事件日志)。 2. **盘点差异写回**:internal/handler/stocktake.go recordStocktakeHandler 记录实盘与账面差异;finishStocktakeHandler 按「增量修正」原则(quantity += diffQty,绝不覆盖最终值)可选写回库存;差异行携带区域/货架/层/位。 3. **退库确认**:MES 工位退料 → /api/internal/return-order 预建「待确认收货」退库单 → WMS「退库确认」页库管点确认收货 → 库存加回、状态变已收货。 4. **现场操作方式**:工位发现数量不符 → 工位终端上报(MES 只产生预警,不产生处理动作)→ 库房人员按预警内容到 WMS,走「盘点(差异写回)」或「退库确认」两条路径之一做实物与账面对齐;反冲产生的短欠在 WMS 反冲出库单中留痕。 - **遗留风险(需客户确认)**:WMS **没有专门的「数量不符」明细/处理页**,靠盘点差异 + 退库确认 + 反冲短欠三条既有功能闭环;MES 的 material_qty_report 明细不会自动流转到 WMS。若客户要求「MES 预警 → WMS 生成待处理工单」,需新增一条 MES→WMS 内部接口与处理页。 ### 二.5 / 三 主数据架构与菜单命名(产品型号 ↔ 物料档案) - **改前(核实)**:**主体已落地**。WMS materials.item_type 1原材料/2半成品/3成品/4其他;MES 菜单已改名「物料档案」(MainLayout + router + ProductType.vue 文案 + help.js);MES 经 WMS 内部接口实时代理成品;WMS helpMaterial 已含品类来源说明(原材料=进货、半成品/成品=自产、其他=辅料/工装/试验设备、成品可作零部件被再加工)。 - **本轮改造(补齐未落地部分)**: 1. **取消定时同步(三.0)**:bj_power_mes/main.go 删除 10 分钟 SyncProducibleToWMS 定时 goroutine;logic/producible.go 的 SyncProducibleToWMS **重写**为 ComputeProducible(ctx) (*ProducibleResult, error)(现算现返不推送);wmsclient.SyncProducible 删除;新增内部接口 GET /api/internal/producible(X-API-TOKEN)。WMS 侧 mesclient.FetchProducible 实时拉取,queryProducibleHandler 改为「实时拉 → 全量覆盖本地快照(单事务)→ 返回」,旧 /api/internal/producible/sync 接收端与 producibleSyncHandler **整块删除**。→ 两系统间**再无任何定时/批量同步**。 2. **BOM 子项放开 item_type + 成品递归展开(三.4.1)**:SaveBom 本就无品类限制(核实通过)。新增递归展开:WMS 新增内部接口 POST /api/internal/material/types(返回 {types:{code:itemType}});MES wmsclient.MaterialTypes;logic/material.go 新增 expandBomToLeaf(BOM 子项在 WMS 为成品 item_type=3 时按其自身物料清单继续展开,用量按倍率相乘,深度上限 10,同路径重复编码判循环引用并跳过记日志,WMS 不可达降级为「全部叶子」并记 eventlog 不阻塞);GenerateMaterialRequest 改为按展开后的叶子物料算料 → **成品 A 引用成品 B 时备料能递归展开到原材料**。 3. **半成品不纳入库存汇总(三.4.2)**:WMS internal/handler/stock.go —— 物料汇总 aggregateMaterialSummary 未指定品类时 CategoryNEQ(2) 排除半成品(显式选「半成品」仍可查);区域汇总 buildZoneSummary 加 CategoryNEQ(invCatSemi);缺货预警 shortageHandler 加 material.ItemTypeNEQ(2)。库存**明细**查询保留半成品可见(便于现场核对),仅汇总/预警口径排除。 - **是否闭环**:闭环(追溯侧递归见遗留风险)。 ### 二.6 内置工位规则 - **改前(核实)**:已落地。station.is_builtin / station.has_dock 双字段;种子 SQL 回填 station_no BETWEEN 0 AND 13 为内置、1..10 有接驳台;SaveStation 内置工位改类型被拒、页面新增一律非内置;DeleteStation 内置拒绝删除;前端删除按钮 v-if="... && !row.isBuiltin"、类型单选 :disabled="dlg.isBuiltin"。 - **本轮改造**:补齐「内置工位才有接驳台」的前端约束与后端非内置禁绑校验(见 一.2)。 - **是否闭环**:闭环。 ### 本轮实际修改/新增文件清单 | 项目 | 文件 | 说明 | |---|---|---| | WMS | schema/dock.go | dock_type 增加 other | | WMS | internal/db/db.go | ux_docks_station_no 部分唯一索引 | | WMS | internal/handler/dock.go | 新增接驳台 CRUD + validateDock | | WMS | internal/handler/routes.go | /api/docks*、/api/internal/material/types;删除 /api/internal/producible/sync | | WMS | internal/handler/rbac_admin.go | dock:manage/add/edit/delete 权限种子 | | WMS | internal/handler/material.go | materialTypesHandler | | WMS | internal/handler/stock.go | 半成品排除汇总/预警(3 处) | | WMS | internal/handler/producible.go | 重写为实时拉取 | | WMS | internal/mesclient/client.go | FetchProducible + ProducibleResult | | WMS | internal/eventlog/eventlog.go | 排除 auth.* | | WMS | frontend/src/pages/Dock.vue(新) | 接驳台维护页 | | WMS | frontend/src/router/index.js、layouts/MainLayout.vue、help.js、pages/EventLog.vue | 路由/菜单/帮助/日志下拉 | | MES | internal/db/db.go | ux_station_dock_code 部分唯一索引 | | MES | internal/logic/processflow.go | SaveStation 接驳台 1:1 + 非内置禁绑 | | MES | internal/logic/producible.go | SyncProducibleToWMS → ComputeProducible | | MES | internal/logic/material.go | expandBomToLeaf 递归展开 | | MES | internal/wmsclient/client.go | 删 SyncProducible、加 MaterialTypes | | MES | internal/handler/production/producible.go(新)、routes_production.go | /api/internal/producible | | MES | internal/handler/production/bom_material.go | 清理未用 import | | MES | internal/eventlog/eventlog.go | 排除 auth.* | | MES | main.go | 删除定时同步 goroutine | | MES | frontend/src/pages/Station.vue、EventLog.vue | 接驳台禁用/日志下拉 | ### 构建与产物校验 | 项 | 结果 | |---|---| | WMS go build ./... | rc=0 | | MES go build ./... | rc=0 | | 工位终端 go build ./... | rc=0 | | MES 前端 npm run build | 成功;public 42 文件,**0 字节文件=0** | | WMS 前端 npm run build | 成功;web/static 44 文件,**0 字节文件=0** | | 旧产物备份 | 先改名备份再全量重建,备份已移出(未 rm) | | exe 打包 | 未打包(遵守禁令) | ## 二、上线就绪审计报告 ### 2.0 外部参照(联网调研结论,已落到本项目可执行项) 调研来源:WMS 试运行/上线检查清单(Starshipit Go-live checklist、通天晓 WMS 试运行 6 项检查、C-WMS 五类就绪检查、DNC Cloud WMS Go-Live Checklist)。行业共识归纳为 6 项:**主数据核对 → 期初库存账实一致 → 业务流程演练(含异常流程)→ 接口联调(含异常/断连)→ 人员与权限 → 指标与回退预案**。 对照本项目的可执行结论(非泛泛而谈): 1. **库位/接驳台编码唯一性必须与现场标牌逐一对应** → 本轮已为 docks 加 station_no 部分唯一索引、为 station.dock_code 加部分唯一索引;上线前需把 DOCK 编码贴到现场标牌(**现场动作,非代码**)。 2. **期初库存必须以盘点结果为准,差异追到原因而不是直接改数** → WMS 已有 stocktake 增量写回(不覆盖最终值),符合;但需确认上线前已跑一轮完整盘点。 3. **异常流程不能遗漏** → 反冲短欠、退库确认、盘点差异三条异常路径已存在(见 二.4),但「数量不符」缺 WMS 专页(已列风险)。 4. **接口必须做断连/异常测试** → MES→WMS 已有降级:备料物料校验不可达降级放行并记 eventlog、反冲失败仅记 wms.backflush.failed 不回滚完工、可生产数量拉取失败返回中文错误。本轮新增的 MaterialTypes 同样降级为「全部叶子」。 5. **权限按岗位分配并复核** → admin/operator/inspector 三内置角色,admin 强制全量,operator 自动继承新增的 dock:* 权限。 6. **回退预案** → 见下方「不通过项 R4」,目前缺书面的跨系统回退步骤。 ### 2.1 构建与产物 | 检查项 | 结论 | 证据 | |---|---|---| | 三服务 go build ./... | 通过 | WMS/MES/工位终端均 rc=0(含 go:embed 目录重新生成后复验) | | 前端产物 0 字节文件 | 通过 | MES public 42 文件 ZERO_BYTE=0;WMS web/static 44 文件 ZERO_BYTE=0(Python 扫描) | | go:embed 目录正确 | 通过 | MES 内嵌 public;WMS 内嵌 web/static;构建后再次 go build 通过说明资源齐全 | | 配置/端口/迁移脚本 | 通过 | etc/*.yaml 齐全;部署手册端口 8888/8890/8892/5173 与实际一致 | | exe 打包 | 未做(遵守禁令) | 交付前由用户显式指示再打包 | ### 2.2 主流程端到端(工单 → 日排产 → 备料 → 下发 → 工位执行 → 报工 → 反冲 → 入库 → 追溯) | 环节 | 结论 | 证据/说明 | |---|---|---| | 工单 | 通过 | WorkOrder.vue + logic/workorder.go;工单号 WO-日期-001 重复自动升号;工位组合必填、按工艺流程分组 | | 日排产 | 通过 | DailyPlan.vue + logic/dailyplan.go;支持日期范围 + AVG/FIXED 模式;station_plan_qty 支持人工指定每工位件数 | | 备料 | 通过(本轮增强) | logic/material.go GenerateMaterialRequest:按今日 station_process 派工拆料到工位,接驳台取 station.dock_code;本轮新增 expandBomToLeaf 成品递归展开 | | 下发(PLC/工位) | 通过 | PlcSend.vue 已改为按 station_process 自动派生路线,去掉手工 Picker | | 工位执行 | 通过 | 工位终端 8892 按 station.flow_id 驱动步骤填报;全步骤完成 + 物料绑齐才报工 | | 报工 | 通过 | logic/workpiece.go DoneWorkpiece | | 反冲 | 通过(含降级) | DoneWorkpiece 末尾 backflushWorkpiece → WMS /api/internal/material/backflush FIFO 扣库存;失败仅记 wms.backflush.failed,不回滚完工 | | 成品入库 | 通过(含降级) | 报工后 Wms.FinishedInbound 回流 WMS 入库(category=3 成品);失败记日志不阻塞 | | 追溯 | 通过(有缺口) | logic/workpiece.go Trace + DashboardTrace + BuildBindTrace 三入口齐全;**但追溯/装机绑定的物料校验未走 expandBomToLeaf 递归**(见 R1) | | 降级路径 | 通过 | WMS 不可达时:物料校验降级放行、反冲降级记账、品类查询降级为叶子、可生产数量返回中文错误 | ### 2.3 跨系统一致 | 检查项 | 结论 | 证据 | |---|---|---| | 内部接口鉴权 | 通过 | MES 内部组 X-API-TOKEN;WMS 内部组 wrapInternal;令牌 Hardman_2026 在两端 etc/*.yaml 一致 | | JWT 组鉴权 | 通过 | WMS requirePerm 显式登记(本轮 /api/docks* 已登记);MES permissionGuard 按 pathPermMap | | 字段对齐 | 通过 | 图号=WMS materials.code 全库唯一锚点;dock_code 与 WMS dock.dock_code 对齐;item_type 语义一致 | | WMS 不可达降级 | 通过 | 4 条降级路径(见 2.2) | | 定时同步 | 通过(本轮清除) | 已无任何周期同步任务,全部改为实时按需 | ### 2.4 权限与菜单 | 检查项 | 结论 | 证据 | |---|---|---| | 权限码与菜单一致 | 通过 | WMS MainLayout 按 permissionCodes 过滤;本轮 dock:manage 菜单 + dock:add/edit/delete 按钮均已 seed | | admin 锁定 | 通过 | rbac_admin.go 强制 admin 角色全量权限且不可缩减、不可编辑/删除/停用 | | 新增接口已注册权限 | 通过 | /api/docks* 全部 requirePerm;/api/internal/* 走 X-API-TOKEN | | 无越权放行 | 基本通过 | WMS 新接口均显式 requirePerm;MES 内部接口组 token 保护 | ### 2.5 健壮性 | 检查项 | 结论 | 说明 | |---|---|---| | 错误提示中文 | 通过 | 本轮新增 dock 校验、可生产数量拉取、接驳台绑定冲突均为中文 | | 重复提交/并发 | 部分通过 | 部分唯一索引防重复绑定;报工/质检无事务包裹(见 R2,历史遗留 P0) | | 负数/空值 | 通过 | 接驳台 工位号 <=0 拒绝、数量 <=0 跳过生成 | | 日志与预警 | 通过 | 事件日志覆盖 dock.create/update/delete、bom.expand.cycle、wms_skip 等新写点 | ### 2.6 部署 | 检查项 | 结论 | 说明 | |---|---|---| | 部署手册与实际一致 | 通过 | 端口、自动建库、内部 token、依赖(PostgreSQL ≥14 / Redis ≥6)均与实际代码一致 | | 默认账号 | 通过 | admin / 123456(双系统一致),建议上线后立即改密 | | 大屏免登录 | 通过 | /display 路由在前端守卫白名单,后端 SSE/快照接口走内部 token | ### 2.7 界面与术语 | 检查项 | 结论 | 说明 | |---|---|---| | 英文残留 | 通过 | 本轮新增页面全中文(产线/库房/其他、接驳台维护);项目内既有「产品物料清单」等口径已统一 | | 术语统一 | 通过 | 产品物料清单 / 电气件 / 产品编号 / 检测单号 三端一致;物料档案双系统同名 | | 列表真分页 | 通过 | 新增接驳台页 SQL 层分页;预警中心、物料档案等均已真分页 | | 默认 created_at desc | 通过 | 新增接口与既有列表一致 | | 录入页不内嵌列表 | 通过 | 接驳台为列表页 + 弹窗录入,符合规范 | ### 2.8 权威文档逐条闭环核对(桌面《软件系统问题-hd.doc》) - 抽取方式:Python zipfile 直读 word/document.xml,`` 切段 + `` 取文。结果:**total_paragraphs=265,answer_paragraphs=80**(与上次一致,本次未改动该 DOC)。 - 按关键词(待做/开发中/暂不/待确认/未提供)筛出 **23 条**含非「已实现」表述的答段。逐条阅读发现:**这 23 条绝大多数是「已实现 + 历史待做说明」的双段拼接**(此前回填时把新答文追加在原答文后,未删旧文),并非真实未实现。 - **需要回填(文档滞后于代码)的条目**(段序号 / 主题 / 代码实际状态): - 12 库位四级联动 — 代码已支持区域→货架→层→位置级联与推荐库位,答文尾部仍留「部分实现…尚未上线」 - 27 按图号推荐库位 — 已实现(/zone/recommend 历史常用位+同区空位),答文仍写「开发中」 - 34 / 37 通用出库类别与归属 — 已实现(退料/退货/样品/报废/发货/其他 + 归属联动),答文仍写「待做」 - 40 / 43 出库记录筛选与列 — 已实现(后端真实接收参数、列表含归属单号/目标工位),答文仍写「待做」 - 62 检验合格跳转入库带检测单号 — 已实现(弹窗引导 + 自动回填),答文仍写「待做」 - 104 / 107 半成品成品入库字段 — 字段已全落地,答文仍写「待做/说明」 - 110 半成品成品出库原因按钮 — 已实现,答文仍写「开发中」 - 116 备料台账完成时间筛选 — 已实现(completed_at + 范围筛选),答文仍写「开发中」 - 124 工单数量/完成日期/创建人 — 已实现,答文仍写「开发中」 - 130 日排产自动排产 — 已实现(AVG/FIXED + 总量校验),答文仍写「开发中」 - 133 / 243 / 259 产品物料清单相关标准/装配工序/Excel 导入 — 均已实现,答文仍写「开发中」 - 145 绩效作业时长与效率 — 已实现(durationSec + 导出),答文仍写「开发中」 - 216 跨天在制品承接 — 已实现,答文仍写「开发中」 - 219 0/13 虚拟工位 — 已实现且支持扩展到 14/15,答文仍写「开发中」 - 251 工艺步骤级附件 — 已实现,答文仍写「开发中」 - 239 退库闭环 — 已实现(预建待确认 + WMS 确认收货),答文写「待确认」 - **客观无法单方闭环、应如实保留的**:56 纸质单据 OCR(增强项)、127 工单与 OA 衔接(待客户提供接口规范)、104 后半段 OA 对接。 - **另有 2 条需按本轮变更更新**:接驳台独立主数据(新增维护页与「其他」类型)、数量不符(MES 仅预警 / WMS 三条闭环路径)。以上均未改动 DOC(用户要求不改,只列待回填)。 ### 2.9 上线就绪结论 **结论:具备上线条件(有条件通过)。** - 必须先行:**3 项现场/运维准备**(见 R3:期初盘点与差异处理、现场标牌与接驳台编码核对、默认账号改密与角色分配复核); - 建议上线前补齐:**R1 追溯递归**、**R2 报工/质检事务**; - 需客户确认:**WMS 是否要「数量不符」专门处理页**(二.4 遗留风险)。 ### 不通过 / 风险项汇总 | 编号 | 问题 | 严重度 | 现状 | 建议 | |---|---|---|---|---| | R1 | 追溯/装机绑定的物料校验未走成品递归展开 | 中 | 仅备料算料走 expandBomToLeaf;Trace/BuildBindTrace 仍按单层 BOM | 上线前把 expandBomToLeaf 复用到追溯与绑定校验(本轮未做,因涉及追溯链路回归面较大,需一次完整回归) | | R2 | 报工/质检无事务包裹(历史 P0,另一 AI 修复中) | 高 | U3/U4 已在问题清单 | 上线前必须完成,否则并发报工会产脏数据 | | R3 | 现场数据准备未在代码侧覆盖 | 中 | 期初盘点、标牌张贴、账号改密均属现场动作 | 上线前由现场执行并留书面确认 | | R4 | 缺书面跨系统回退/应急步骤 | 中 | 部署手册有启动参数但无回退预案 | 建议补一节「WMS 不可达 / MES 不可达 / 断网」的现场处置步骤 | | R5 | WMS 无「数量不符」专页 | 中 | 靠盘点差异 + 退库确认 + 反冲短欠闭环 | 待客户确认是否要专门处理页 | ## 三、多轮自省记录 + 优化清单 ### 第 1 轮(代码质量):是完整功能还是缝缝补补? - 自问:有没有留下兼容分支、旧字段、旧表、TODO、半成品? - 发现并当场修掉: 1. `validateDock` 原按值传参 → 非产线类型强制 station_no=0 的赋值会丢失(页面传了工位号也会落库)→ 改为指针传参(**已修**)。 2. 删除定时同步后 `wmsclient.SyncProducible` 成为孤儿函数 → 直接删除,不留死代码(**已修**)。 3. WMS `/api/internal/producible/sync` 接收端与 `producibleSyncHandler` 在改为实时拉取后已无调用方 → 整块删除 + 路由摘除(**已修**)。 4. MES `bom_material.go` 因上述删除产生未用 import → 清理(**已修**)。 5. 前端 `auth.` 相关 FAMILY_TAG / ENTITY_LABEL 残留映射 → 一并删除,避免死代码(**已修**)。 - 复验:三服务 go build rc=0,无未用变量/导入。 ### 第 2 轮(客户视角):现场能不能真跑通? - 自问 A:**并行工位物料比例怎么落到备料单?** → 核实 `splitQtyToStations`:日排产 station_plan_qty 人工指定优先,否则按日总量均分;备料单按 station_no 分单 + targetDock 取 station.dock_code。**可跑通**,但要求排产时必须填各工位件数,否则均分可能与现场节拍不符 → 已在 Station.vue 派工弹窗提示中说明(既有)。 - 自问 B:**滚筒线单向回流约束是否真拦得住错误配置?** → 后端 `ValidateStationProcessContinuity` 在写入前对「合并后全集」校验,不合法整体回退,不会写半截。**能拦住**。 - 自问 C:**内置工位与 PLC 顺序流转** → is_builtin 由种子回填 0~13,页面新增的从 14 起,类型/删除均被拒。**闭环**。 - 自问 D:**库房/其他类型接驳台无绑定工位是否被允许?** → validateDock 对非 line 类型强制 station_no=0,唯一索引用 `WHERE station_no > 0` 排除 → **正确**。 - 自问 E:**成品作零部件递归展开** → 本轮已实现备料侧;**发现追溯侧未走递归**(R1),当场评估:改动涉及 Trace/BuildBindTrace 回归面,今晚无法完整回归,故如实列入风险而非假装完成。 - 自问 F:**半成品不进库存汇总是否漏统计口径?** → 已排除物料汇总、区域汇总、缺货预警三处;**明细查询保留半成品可见**,避免现场查不到货 → 口径正确(汇总不统计、现场可核对)。 ### 第 3 轮(上线视角):明天现场用会出什么问题? - 数据从哪来:接驳台靠种子 21 个 + 本轮新增维护页;工位靠种子 + 页面新增;物料靠 WMS 物料档案(唯一真源)。→ 需现场核对编码与标牌(R3)。 - 错了怎么发现:预警中心(时间/类型筛选 + 铃铛)+ 操作日志 + 事件日志新增 dock/bom.expand 写点。→ 已覆盖。 - 卡住了怎么恢复:WMS 不可达 → 备料降级放行、反冲记日志不阻塞;MES 不可达 → WMS 可生产数量返回中文错误而非白屏。→ 已覆盖。 - 误操作兜底:接驳台有托盘禁删、内置工位禁删禁改类型、非内置禁绑接驳台、编码唯一。→ 已覆盖。 - 仍缺:书面回退预案(R4)、默认密码 123456 未强制改密(R3)。 ### 第 4 轮(回归):前几轮修复有没有引入新问题? - 逐一复验: 1. 删除 /api/internal/producible/sync → WMS 侧 `queryProducibleHandler` 改为实时拉取,前端 /stock/producible 调用不变,**接口契约未变**,Inventory.vue 无需改动。 2. 备料改走叶子物料 → 备料单字段(materialCode/name/unit/manageMode/reqQty)保持一致,MaterialRequest.vue 无需改动。 3. 半成品排除汇总 → 显式筛选「半成品」仍可查,**未造成数据不可见**。 4. 操作日志排除 auth.* → 仅影响操作日志页,EventLog.Write 仍写全量事件,其他功能不受影响。 5. 新增 dock 权限 → admin/operator 自动获得,inspector 不获得(符合质检角色定位)。 - 回归结果:三服务 go build rc=0;两个前端重建成功且 0 字节文件=0;未发现新引入问题。 ### 优化清单(已落地) | 问题 | 改法 | 文件 | |---|---|---| | 接驳台无独立维护入口 | 新增主数据 CRUD + 页面 + 菜单 + 权限 + 帮助 | WMS dock.go / Dock.vue / routes.go / rbac_admin.go / help.js | | 接驳台可被多工位重复绑定 | 部分唯一索引 + 后端校验 + 前端禁用 | MES db.go / processflow.go / Station.vue;WMS db.go / dock.go | | 非产线位置无法登记接驳台 | dock_type 增加 other | WMS schema/dock.go | | 操作日志混入登录/退出 | 查询层排除 auth.* + 下拉去项 | 两端 eventlog.go / EventLog.vue | | 存在 10 分钟定时推送 | 改为实时按需拉取,删除推送端与定时 goroutine | MES main.go / producible.go / wmsclient;WMS producible.go / mesclient / routes.go | | 成品作零部件备料漏料 | expandBomToLeaf 递归展开 | MES logic/material.go;WMS material.go(types 接口) | | 半成品混入库存汇总与缺货预警 | 汇总/预警排除 category=2 / item_type=2 | WMS handler/stock.go(3 处) | | 非内置工位可绑接驳台 | 后端拒绝 + 前端禁用 | MES processflow.go / Station.vue | ### 必须上线前处理但今晚做不了的 | 项 | 原因 | |---|---| | R1 追溯/绑定校验复用递归展开 | 需对 Trace、DashboardTrace、BuildBindTrace 三条链路做完整回归,今晚剩余时间不足以保证回归质量;列为上线前必做 | | R2 报工/质检事务包裹 | 历史 P0,另一 AI 正在修复中,避免并发改动冲突 | | R3 现场数据准备(盘点/标牌/改密/权限复核) | 属现场执行动作,非代码可完成 | | R4 书面回退预案 | 需与现场确认应急联系人与处置顺序,不宜由代码侧凭空编写 | | 桌面 DOC 的 23 条答文回填 | 用户明确要求**不改该 DOC**,只列待回填清单 | ## 09-19 上午补充:R1 修复 + 《问题-hd.doc》客户问题闭环核对 ### 一、R1 递归展开复用至追溯(已修复闭环) - 问题:成品作零部件被引用时,追溯(BuildBindTrace)只显示上层成品、漏下层料、追溯断链;此前仅备料场景走递归。 - 改动文件:`MES/internal/logic/workpiece_bind.go` - 新增 `BindNode` 结构 + `expandBindBom(ctx, productCode, bomName, qty, depth, path)`:递归展开物料组成树,**不依赖 WMS**(用 BomItem 是否存在 productCode 记录判断有无下级 BOM,避免 WMS 不可达时不展开),防环(maxDepth=10 + path 标记)。 - `BindTraceVO` 新增 `BomTree []BindNode`;`BuildBindTrace` 组装追溯时生成组成树。 - 装机绑定齐套校验(validateStationBinds / StationBindPanelData)**保持顶层**——工人扫的是成品整件 SN,递归只用于追溯展示,符合现场"成品整体装机"操作。 - 前端 `Trace.vue`:装机绑定 tab 新增「物料组成(递归展开成品零部件到原材料)」表格(flatBom 扁平化+缩进,row-key 用路径避免树形冲突)。 - 校验:MES `go build ./...` rc=0;MES 前端 `npm run build` 成功(6.88s),`public` 0 字节文件=0。 - 闭环:是(后端+前端)。 ### 二、《问题-hd.doc》客户问题闭环核对(Explore 子代理逐条对照源码) - 文档共 80 条「答」段,其中 27 条含「待做/开发中/待完善」等滞后字样。 - 结论:绝大多数滞后字样为**文档滞后**——对应功能已在代码中完整实现(代码注释频繁引用「客户诉求 问题记录 Lxxx」行号作为证据)。 - 真正未闭环 / 部分实现(代码真未做或仅部分): 1. [22] 工单备料自动出库(平时无需操作的自动出库)—— 真未闭环:备料需求已同步 WMS,但出库动作仍由库管在 WMS 手动执行。 2. [125] 各记录视图按工单号查询 —— 部分实现:数量不符/巡检已带工单号,其余视图待补。 3. [167] MES 质量检验录入自动带出 BOM 信息 —— 部分实现:WMS 侧检索已落地,MES 侧待补。 4. [170] MES 过程/完工检验记录模糊查询 —— 部分实现:WMS 已完成,MES 侧待补。 5. [141] 装配工位固定备注操作人姓名 —— 部分实现:操作人随报工留痕,独立备注字段未加。 - 真等待客户 / 已决策不做: - [72][88] OA 对接(入库字段已落地,需客户提供 OA 接口规范后接入)。 - [39] 纸质单据 OCR 自动识别(已决策暂不做,属增强项)。 - 其余 70+ 条「答」段(含 27 条滞后中的绝大多数)功能均已实现,仅文档尾部残留「待做」字样,属文档滞后,不影响功能闭环。 - 注:《软件系统问题-hd.doc》本体是否回填(把滞后答文改写为「已完成」)**未执行**——此前铁律为「不改 DOC」,本次不擅自改动该权威文档;如需回填,按 begin 倒序用 edsdk 改写。 ### 三、用户问题(客户问题)闭环结论 - 用户本批指令(接驳台四项 + 六项整改 + 主数据合并):全部闭环。 - 客户《问题-hd.doc》中的用户问题:**绝大部分已实现闭环**(代码侧),仅 [22][125][167][170][141] 部分/未闭环 + [72][88][39] 等待客户/暂不做。 - 未修完清单(需跟进):[22]自动出库、[125][167][170][141] 跨系统/跨视图缺口、[72][88] OA 需客户提供规范、[39] OCR(已决策不做,可忽略)。 ## 四、DOC 回填执行完成(2026-09-19 晚,用户"回填吧"指令) > 上文"不改 DOC、回填未执行"已被用户"回填吧"明确推翻,本条为实际执行记录,取代该"未执行"表述。 - **执行方式**:edSDK `doc_find_and_replace` 经 `--json-file`(UTF-8 直读 JSON)绕过 PowerShell 对 `--json` 字符串的引号破坏;每条替换后做磁盘级校验(old 文本消失 + new 文本出现)方判成功。 - **回填总量**:**39 条**滞后答段 = 原抽取 37 条(`_edits.json`)+ 全量扫描补出 **2 条漏网矛盾段**(答段#35 半成品/成品查询归属单号「已实现…属待落地项」、#79 图纸/工艺文件按工序分发「已实现…待落地项」)。 - **改写口径**: - **A 类 29 条**:代码已实现、文档尾部残留"待做/开发中/待完善"字样 → 截断到首个滞后词、改写为"答:已完成。+已落地描述"。 - **B 类 10 条**:真实部分未闭环 → 诚实改为"答:部分实现。"/"答:待做/说明。",保留真实缺口,不谎报"已完成"。 - **落盘校验(zipfile 直读磁盘)**:39 条 old 文本全部消失(残留 0),new 文本全部落盘(缺失 0);开头"已完成/已实现"且含强滞后词的真实矛盾段 = **0**。 - **备份**:原文件备份 `C:\Users\ThinkPad\Desktop\软件系统问题-hd.bak-20260919.doc`(24111 字节);现文件 22042 字节(去滞后尾巴后体积缩小)。 ### 仍真实未闭环(非文档滞后,需产品/现场跟进,B 类诚实保留) | 项 | 状态 | 说明 | |---|---|---| | [22] 备料自动出库 | 部分实现 | 出库仍由库管在 WMS 按备料单手动领料,"平时无需操作的自动出库"未做 | | [9][19] 入库库位联动+推荐 | 部分实现 | 逐级联动已落地;按图号自动推荐库位尚在开发排期(非文档滞后) | | [72][88] OA 对接 | 待客户 | 需客户提供 OA 接口规范后接入(增强项) | | [39] 纸质单据 OCR | 暂不做 | 已决策不做,属增强项 | | [125][57] 记录查询补工单号 | 部分实现 | 数量不符/巡检等已支持,其余视图按记录类型逐步补 | | [141] 装配工位固定备注操作人 | 部分实现 | 操作人随报工留痕,独立备注字段未加 | | [167][170] MES 侧检验自动带出 BOM / 模糊查询 | 部分实现 | WMS 侧已完成,MES 侧待补 | - **结论**:客户《问题-hd.doc》"答"段已全部与代码真实状态对齐(已完成/部分实现/待做 三态准确),无虚假"已完成"矛盾;剩余未闭环均为真实产品缺口,见表待跟进。