Files
bj_power/临时.md
T
SunYF 37f10d3a13 refactor: 重构产线工位与备料流程,移除冗余字段
1. 移除工单、工件、日排产中的冗余工位组合/接驳台字段
2. 新增工位接驳台编码字段与唯一约束,关联WMS接驳台主数据
3. 重构日排产为工位产量分配模式,替代原接驳台列表
4. 新增备料单工位级字段与分批出库支持
5. 移除定时同步可生产数量,改为WMS实时拉取接口
6. 过滤操作日志,排除登录/退出相关日志
7. 调整仪表盘工序展示逻辑为今日派工路线
8. 新增接驳台维护菜单与基础数据
2026-09-19 07:50:21 +08:00

94 KiB
Raw Blame History

独立审计报告 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 已实现 其他入库 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 已定稿)。
  • 成品回库标记用了哪些批次结构件 + 哪些精密件 SNB19/association_trace 已落地)。
  • 盘点 = 人工按物料矫正数量 + 记录前后数量(B16 已定稿,非扫码)。

五、你之前点过名、但结论被最新裁决推翻的(避免我重复犯错)

  1. "生产流程卡是缺失功能" → 更正:代码已有 SN 级流程卡(processcard.go + Trace.vue 打印按钮),缺的是产品型号级全景卡(见遗漏表 #18)。
  2. "工艺路线不冗余" → 更正:已判为僵尸模块,应删(见 🟥-1)。
  3. "区域三级库位" → 更正:以你最新的"过度设计、不需要"为准,保持一级(见 🟥-7)。

六、待你决策清单(这些我拿不准,需你拍板,其他 AI 不要擅自动手)

优先级说明:D1D3 直接关系"能不能闭环",建议先定;D4D7 是边界/口径,不影响主线。

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.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_mesbj_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 stringfileNamefilePathfileSize int64mimeTypeuploadedBycreatedAt
  2. 后端:新增 internal/handler/attachment.goPOST /api/attachments(multipart, 存 uploads/<bizType>/<bizId>/<uuid>_<name>,≤20MB)、GET /api/attachments?bizType=&bizId=DELETE /api/attachments/:id;静态路由 /uploads/* 供 PDF 预览。
  3. 前端:在 Inbound.vueInspection.vueBaseData.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)、disposalRemarkreturnTrackingNo;检验数≠合格数时强制选处置方式。
  3. inventoryquality_status 枚举扩为 未检/合格/不合格/待退;不合格库存禁止出库(在 stock.go checkStockHandler 与出库 handler 加质量门禁)。
  4. 迁移 + 编译验证同上。

规格 3:P0-5 备料台账四态 + 按工位拆

  1. 后端(misc.go 台账 handler)新增服务端四态计算:需求总量=工单物料清单×日排产量;已出库=出库记录按工单汇总;可用库存=实时库存;
    • 齐套:可用≥需求;未齐套:0<可用<需求;未到货:可用=0 且 已出库=0;预警:可用<未来5天需求量(=近5天日排产×单台用量)。
    • 优先级:未到货>预警>未齐套>齐套。
  2. order_material_ledgertargetStation(目标工位);备料单生成时按 bom_item 的装配工位拆分。
  3. 前端 Ledger.vue 增「目标工位」列 + 状态四态标签 + 筛选。

规格 4:P0-3 工位终端巡检四动作 + 应急呼叫

  1. frontend/src/views/Main.vue 增 Tab「巡检」→ 新组件 panels/InspectPanel.vue,含 4 子动作:开工签到(拍照)、工位点检(多选+拍照)、过程巡检(按步骤)、完工确认(扫SN,未全完成拦截)。
  2. 新增 apicheckin/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_recordprocessCode/stepId(按步骤维度);POST /inspections category=PROCESS 时按步骤逐条写。
  2. 新增 GET /inspections/summary?sn= 汇总 + POST /inspections/generate-inter-process(一键生成《工序间检验记录》PDF)。
  3. Inspect.vue 过程巡检表单改为「按该工单工艺步骤逐条」。

规格 6D1 删工艺路线(MES

  1. schema/process_route.goschema/route_segment.go;删 internal/logic/route.go;删 internal/handler/processroute.goroutes_production.go 的 4 条路由。
  2. internal/logic/workorder.go:去掉 routeId/routeSnapshot 写入;schema/work_order.go 去掉 routeIdrouteSnapshot 字段。
  3. 关键internal/logic/processflow.go StationTask(约 364-433 行)删除 routeSnapshot 段解析,activeFlowId 直接取 st.FlowId;返回体去掉 segment/routeSegments
  4. 前端:删 pages/ProcessRoute.vuerouter/index.js/process-routeMainLayout.vueproduce.routeWorkOrder.vue 去掉「工艺路线」下拉,只留「工位组合」(ProcessSeqPicker);PlcSend.vue 改名(如「工位组合下发」)并在选工单时自动带出该工单 processSeq。
  5. 后端 ent 重生成;DB DROP TABLE process_route, route_segment;seed.go 去掉对应菜单/权限码。

规格 7D2 产品型号级全景流程卡

  1. MES 新增 GET /process-card/model?productCode=:按产品型号聚合 产品→物料清单(含装配工位/用量/相关标准)→工位组合→每工位工艺流程与步骤(含检验点/工艺文件)→检验卡项,含各环节时间。
  2. 前端在「生产流程卡」页展示 + 打印/导出 PDF;保留现有 SN 级 processcard.go
  3. 页面顶部标注"全方位展示所有流程时间"。

规格 8:D5 区域库位(按客户原文:区域/货架/第几层/位置号)

  1. zone.go 增字段:shelfNolayerNopositionNo(文本,手填,不做编号规则校验)。
  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 ./...=0npm run build=0
2 P0-2 检验闭环 ① 入库服务端质量门禁 validateInboundQuality(不合格批次/SN 禁止再入库)② 检验新增处置字段 disposal_type/disposal_remark/return_tracking_no ③ 新增 POST /api/inspection/disposeRETURN→待退隔离 / SCRAP→报废 / PARTIAL→按合格数拆行、数量守恒)④ 出库/锁库质量门禁(不合格/待退 禁止领料上线,通用出库不受限以支持退货报废) 同上
3 P0-5 备料台账四态 order_material_ledgertarget_station;台账接口服务端派生 齐套/未齐套/预警/未到货(优先级 未到货>预警>未齐套>齐套)+ availableQty/shortQty + state 筛选;前端 Ledger 增四态标签/可用库存/缺口/目标工位 同上
4 D5 区域库位 zoneshelf_no/layer_no/position_no(手填、不做编号规则校验,符合 L584);区域维护列表+表单、入库区域下拉同步 同上
5 D6 其他入库 material.item_type 扩为 1/2/3/4=其他(辅料/工装/试验设备,规格强制);inbound_orderownership_type/ownership_no(工单号/科技项目号/无);入库页新增「其他入库 Tab」,入库记录增类型「其他」+ 归属列 同上
6 遗漏#14 缺货预警 materialsafety_stock;新增 GET /api/stock/shortage;WMS 首页新增缺货预警卡片(可用量<安全库存) 同上

顺带修复batchFlipInspectionHandler 请求体缺 reportNo/inspectionNoDisallowUnknownFields 会导致前端提交直接报错),已补齐。

迁移方式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.gologic/route.gohandler/processroute.gowork_order.route_id/route_snapshotlogic/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.goschema/route_segment.gowork_order.gorouteId / routeSnapshot 两字段
logic internal/logic/route.go(含 RouteReq/RouteVO/SaveRoute/ListRoutes/GetRoute/DeleteRoute/BuildRouteSnapshot/GetActiveRouteByProductType);workorder.go 去 routeSnapshot 构建与 SetRouteId/SetRouteSnapshotprocessflow.goStationTask 去 routeSnapshot 段解析,activeFlowId 直接取 st.FlowId,返回体删 segment/routeSegments
handler internal/handler/processroute.goroutes_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_routeALTER TABLE work_order DROP COLUMN route_id, route_snapshot;权限表/角色里的路线权限码清零
MES 前端 pages/ProcessRoute.vuerouter/MainLayout 菜单/WorkOrder.vue(去掉「工艺路线」下拉,只留工位组合选择器)/PlcSend.vue 文案(「工艺路线派工」→「工位组合下发」)/help.js(删 helpRoute
工位终端前端 store/station.jsMain.vueWorkPanel.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=0ROLES_STILL_HOLDING_ROUTE_CODE=0PROCESSCARD_PERMISSIONS=produce.processcardVERIFY_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 落盘)、StationQtyReportInternalHandlerStationReturnMaterialInternalHandler
MES 业务逻辑 新建 internal/logic/station_ops.goEmergencyCall(落 alert type=emergency_call)、CreateQtyReport(落 material_qty_report + alert type=qty_diff)、ListQtyReportsStationReturnMaterial(落事件日志 + 调 WMS 建退库单)、GenerateInterProcessInspection(汇总 PROCESS 类巡检)
工位终端代理 新建 internal/handler/station_ops.goinspectionSubmitHandler/emergencyCallHandler/qtyReportHandler/returnMaterialHandler/inspectionUploadHandler,统一「读体 → 注入 operator → POST MES → 原样透传」;routes.go 注册 5 条
工位终端前端 新增 views/panels/InspectPanel.vue(签到/点检/过程巡检按步骤/完工确认/异常/应急/数量不符/退料 八块)+ views/panels/PhotoField.vue(拍照→base64→上传);Main.vue 加「巡检 / 异常」tabapi/index.js 加 5 个函数

完工确认复用既有强校验:步骤未全部完成或物料未齐套 → canReport=false 直接拦截。终端 axios 拦截器会判 code!==0 并 reject,故 MES 业务错误(HTTP 200 + code≠0不会被误判成功。

P0-4 过程巡检按步骤 + 一键生成《工序间检验记录》

  • MES schema/inspection_record.goprocessCode/stepId/stepName/measuredValuelogic/inspection.goInspectionReq 与 Create 同步补齐。
  • MES Inspect.vue 「过程巡检」页签重做:选工单 → 选工位 → 自动拉该工位 GET /process-steps → 表格逐步骤填「实测值 + 合格/不合格」并单条上报 → 「一键生成《工序间检验记录》」按钮弹窗展示汇总(返回的是数组,非包装对象)。
  • 新增 POST /api/v1/inspections/generate-inter-process

工程编号(合同 → 工程编号 → 产品序号)

  • MES schema/work_order.gocontractNo/projectNo/productSeriallogic 的 Create/Update 与 handler 透传;WorkOrder.vue 三处(筛选/列表列/新增编辑表单 + reactive + save body);help.js:helpWorkOrder 补说明与查询项。

数量不符上报(应发/实收/差异 + 原因)

  • 新表 material_qty_reportstationNo/orderNo/sn/materialCode/materialName/planQty/actualQty/diffQty/cause/status/operator/createdAt/resolvedAt)。
  • MES 接口:POST/GET /api/v1/qty-reports、内部 POST /api/internal/station/qty-reportListQtyReports 支持 status/orderNo/materialCodeContainsFold)。
  • MES 新页 pages/QtyReport.vue(菜单「数量不符上报」/qty-report,权限码 produce.qtyreport,已加进 OPERATOR 角色)+ help.js:helpQtyReportAlertCenter.vue 预警类型补 qty_diff

退库单 WMS 确认收货(闭环)

链路:工位终端退料 → MES /api/internal/station/return-materialwmsclient.CreateReturnOrder → WMS /api/internal/return-order 预建 PENDING 退库单(同工单+物料+工位去重)→ WMS 库管在「退库确认」页点确认 → 库存加回(批次物料按「物料编码+在库」合并到已有行;无在库行则新建,inbound_no=RET:退库单号)→ 状态 RECEIVED。

  • 新表 return_ordersent 默认复数名)。
  • 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:helpReturnOrderrouter 与 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.goschemaPatchSQL 未登记新列 → 补 work_order.contract_no/project_no/product_serialinspection_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_OKwork_order 3 新列、inspection_record 4 新列、material_qty_report 表均确认存在
WMS 迁移 临时实例触发 Schema.Createreturn_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 stringworkorder/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=otherremark 必填(承载手输原因)。
    • 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/414inbound.go:431outbound.go:543inspection.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
  • queryLedgerHandlermisc.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)增:归属、产品状态(已通过/部分通过/返修)、相关标准(试验方案号)、试验记录单号、记录员、记录日期;挂接 AttachmentPanelbizType=semi,后端已支持)。
  • 半成品出库(Semi.vue:173-186)加「原因」按钮(包装/继续生产/检验试验/其他)+ 扫 SN 后自动带出该 SN 的物料/已完成工序/库位信息(后端 semiOutboundHandler misc.go:111-148 增按 SN 查询返回明细)。

H. MES 车间质量检验(过程/完工)

菜单命名沿用你裁决:来料/过程/完工三分。来料在 WMS 已做,此处补 MES 侧过程/完工检验录入。

  • 后端 schema/inspection_record.gocategory 枚举加 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(相关标准/检验细则) stringprocessCode 语义保持"装配工序",另新增 stepBelong(工序所属) 可选关联。
  • 后端新增 BOM Excel 导入接口(internal/handler/production/bom_material.goImportBomHandler,模板:产品编号|物料清单名称|物料编码|名称|规格|单位|单台用量|损耗率|装配工位|相关标准|备注)。
  • 前端 Bom.vue(列表 :22-54、表单 :60-87)加「相关标准」列/字段 + 「导入」按钮;菜单名 seed.go:72 由「物料清单」改「产品物料清单」。

J. MES 工艺步骤附件/图纸按工序分发

  • 后端 schema/process_step.go 新增 attachment(可多份,jsonb 或关联 attachment 表 bizType=step)。
  • 后端 StationTaskprocessflow.go:352-385)的 steps 返回每步骤附件列表;工位终端按当前步骤过滤展示。
  • 前端 ProcessFlow.vue 步骤子表(:105-147)加「本步骤图纸/附件」上传列。
  • 工位终端 frontend/src 工艺文件展示:由「整流程单 PDF」改为「当前步骤的图纸/附件」。

K. MES 自动排产(引导式)

  • 后端 logic/dailyplan.go 新增 AutoSchedule:输入 工单 + 模式(平均分摊/固定日产)+ 日期区间 → 生成多条 daily_planstatus=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,28FullProcessSeq 与 n>12 过滤,0/13 不参与工位组合排序但需存在)、line.go:209(叫料 1~10 约束保留,0/13 不叫料)、plc.go:66processcard.go:240auth.go:207dashboard.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(作业时长)ReportProcessworkpiece.go:141-146)改为 startedAt=进工位时间、endedAt=报工时间、durationSec=两者差;WorkloadRowprocessflow.go:388-397)加 上机时间/作业时长/效率;前端 Performance.vue 统计卡(:31-56)加「平均作业时长/效率」。

N. 拧紧补录残留清理

  • 后端删除 internal/handler/production/plc_torque_scan.go:127 TorqueManualAddHandlerPOST /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 变更后重生成 entMES cd schema && go run ./tools/generate.goWMS go run -tags entgenerate ./tools)。
  2. 存量库加列走 schemaPatchSQL/applyColumnPatches(幂等 ADD COLUMN IF NOT EXISTS);新表手写 DDLid 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.godock_type 语义扩展为 line 产线 / store 库房 / other 其他(非产线接驳台不挂工位,station_no 固定 0)。
    • internal/db/db.go applyColumnPatches 新增幂等 DDLCREATE UNIQUE INDEX IF NOT EXISTS ux_docks_station_no ON docks (station_no) WHERE station_no > 0 → 部分唯一索引保证「产线接驳台 ↔ 工位 1:1」,库房/其他不参与。
    • 新增 internal/handler/dock.golistDocksMaintHandler(真分页,SQL 层 Count+Offset/Limit,默认 created_at desc,支持类型 + 编码/名称关键字筛选)、createDockHandler、updateDockHandler、deleteDockHandlervalidateDock 统一校验:编码必填且唯一、名称必填、类型仅 产线/库房/其他、产线必须绑工位号、非产线强制 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 加 /dockMainLayout 基础数据组加「接驳台维护」菜单;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/LimitOrder(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. 取消定时同步(三.0bj_power_mes/main.go 删除 10 分钟 SyncProducibleToWMS 定时 goroutinelogic/producible.go 的 SyncProducibleToWMS 重写为 ComputeProducible(ctx) (*ProducibleResult, error)(现算现返不推送);wmsclient.SyncProducible 删除;新增内部接口 GET /api/internal/producibleX-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.MaterialTypeslogic/material.go 新增 expandBomToLeafBOM 子项在 WMS 为成品 item_type=3 时按其自身物料清单继续展开,用量按倍率相乘,深度上限 10,同路径重复编码判循环引用并跳过记日志,WMS 不可达降级为「全部叶子」并记 eventlog 不阻塞);GenerateMaterialRequest 改为按展开后的叶子物料算料 → 成品 A 引用成品 B 时备料能递归展开到原材料
    3. 半成品不纳入库存汇总(三.4.2WMS 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=0WMS web/static 44 文件 ZERO_BYTE=0Python 扫描)
go:embed 目录正确 通过 MES 内嵌 publicWMS 内嵌 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-TOKENWMS 内部组 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 新接口均显式 requirePermMES 内部接口组 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<w:p> 切段 + <w:t> 取文。结果:total_paragraphs=265answer_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 追溯/装机绑定的物料校验未走成品递归展开 仅备料算料走 expandBomToLeafTrace/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.vueWMS db.go / dock.go
非产线位置无法登记接驳台 dock_type 增加 other WMS schema/dock.go
操作日志混入登录/退出 查询层排除 auth.* + 下拉去项 两端 eventlog.go / EventLog.vue
存在 10 分钟定时推送 改为实时按需拉取,删除推送端与定时 goroutine MES main.go / producible.go / wmsclientWMS producible.go / mesclient / routes.go
成品作零部件备料漏料 expandBomToLeaf 递归展开 MES logic/material.goWMS material.gotypes 接口)
半成品混入库存汇总与缺货预警 汇总/预警排除 category=2 / item_type=2 WMS handler/stock.go3 处)
非内置工位可绑接驳台 后端拒绝 + 前端禁用 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 []BindNodeBuildBindTrace 组装追溯时生成组成树。
    • 装机绑定齐套校验(validateStationBinds / StationBindPanelData保持顶层——工人扫的是成品整件 SN,递归只用于追溯展示,符合现场"成品整体装机"操作。
    • 前端 Trace.vue:装机绑定 tab 新增「物料组成(递归展开成品零部件到原材料)」表格(flatBom 扁平化+缩进,row-key 用路径避免树形冲突)。
  • 校验:MES go build ./... rc=0MES 前端 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(已决策不做,可忽略)。