refactor: 重构产线工位与备料流程,移除冗余字段

1. 移除工单、工件、日排产中的冗余工位组合/接驳台字段
2. 新增工位接驳台编码字段与唯一约束,关联WMS接驳台主数据
3. 重构日排产为工位产量分配模式,替代原接驳台列表
4. 新增备料单工位级字段与分批出库支持
5. 移除定时同步可生产数量,改为WMS实时拉取接口
6. 过滤操作日志,排除登录/退出相关日志
7. 调整仪表盘工序展示逻辑为今日派工路线
8. 新增接驳台维护菜单与基础数据
This commit is contained in:
SunYF
2026-09-19 07:50:21 +08:00
parent 543655d441
commit 37f10d3a13
156 changed files with 4489 additions and 1285 deletions
+318
View File
@@ -671,3 +671,321 @@
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、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. **取消定时同步(三.0**bj_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.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=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 []BindNode``BuildBindTrace` 组装追溯时生成组成树。
- 装机绑定齐套校验(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(已决策不做,可忽略)。