1. 移除MES端本地product_type实体、schema及相关CRUD代码,改为通过WMS内部API代理获取物料主数据 2. 更新物料管理粒度逻辑,新增"其他"类型(3)支持,同步更新入库校验规则 3. 修复前端物料选择、库存筛选等页面的类型判断逻辑,统一使用manage_mode区分管理类型 4. 清理静态资源文件冗余的样式代码,调整前端页面展示逻辑 5. 更新帮助文档,修正物料类型的说明描述
6.3 KiB
6.3 KiB
物料档案对齐 — 审核结果与方案(2026-09-21)
一、结论(先说)
「物料档案 类型下拉缺『其他』」在 WMS 端没有丢、没有回退——WMS 的品类/类型下拉一直都含「其他(辅料/工装/试验设备)」。 真正缺「其他」的是 MES 物料档案:MES 还停在「成品子集 /product-types」接口,根本没有全品类字段(品类/类型/安全库存/说明/附件全没有),所以 MES 端理所当然看不到「其他」。
MES 切到全品类 /materials 的链路只做了一半就被中断(WMS 侧只写了 delete handler、还没来得及注册路由)。这就是全部未完成工作量。
二、已落地且正确(无需再改,已核对源码)
- WMS 物料档案品类/类型下拉含「其他」(item_type=4) —— BaseData.vue:
- 搜索区品类下拉
L882:<el-option label="其他" :value="4" /> - 新增表单品类下拉
L966:<el-option :value="4" label="其他(辅料/工装/试验设备)" /> - 结论:未回退,仍存在。
- 搜索区品类下拉
- 出库记录「检测单号」列 + 搜索 —— Outbound.vue 已落地(表单 L501、列表列 L619/L726、搜索 L353/L662)。
- 来料检验抽屉分页(每页20) + 批量送检上限100 —— Inspection.vue 已落地(drawer L832、pendingPage.size=20、上限100 L312)。
- 单号格式
IB/OB + YYYYMMDD + -NNN+ 手填/自动生成 + 唯一校验 —— inbound.go(nextDailyNo L28 / validateUniqueNo L95)、outbound.go、excel.go 均已接入。
三、未完成清单 + 最优方案(按执行顺序)
A. WMS 侧(2 处)
- 注册删除路由:routes.go 的
/api/internal/materials(L244-246)目前只有 GET/POST/PUT,补一行:POST /api/internal/materials/delete→deleteMaterialHandler(handler 已在 material.go L179 写好,只差注册)。 - 加附件内部代理:新增
/api/internal/attachments/upload | list | delete(X-API-TOKEN 版),供 MES 代理调用,保证 MES/WMS 附件单一来源一致。
B. MES 后端(4 处)
- wmsclient 补
MaterialDelete+ 附件方法(upload/list/delete)。 - logic 新建 materials 代理方法(page/get/post/put/delete,纯代理 WMS;WMS 宕机时读写均报错并提示,无本地缓存)。
- handler 加 materials handler(对应 6 个接口)。
- routes_production.go 注册
/materials/*;perm.go 加对应权限码。
C. MES 前端(1 处)
- ProductType.vue:接口
/product-types→/materials;字段对齐 WMS(图号/名称/规格/单位/品类/类型/安全库存/说明/附件);「编码」label 改「图号」;品类下拉含「其他」。
D. 验证
- WMS + MES 后端编译通过,前端 build 通过。
四、关键决策(已定,不再来回问)
- MES「物料档案」菜单 = WMS 物料全品类代理视图;品类/类型含「其他」,与 WMS 完全一致。
- MES 原
/product-types(成品子集)= 纯 WMS 代理(方案 A,已落地代码,见第五节):不再保留本地product_type缓存/双写;WMS 不可达即报错,不再降级读本地。继续供工单/BOM 联查下拉使用,零影响。 - MES 不建独立物料表(无本地缓存);附件走 WMS 单一来源,保证两边一致、不分裂。
- 物理删除
product_type表属 ent 代码生成级改动,受「不编译」铁律约束,未在本轮执行,留给go generate ./ent+go build步骤(见第五节 D)。
五、/product-types 落地进展(2026-09-21 续 · 方案 A)
决策背景
用户确认:没有「WMS 宕机时 MES 还必须看物料」的硬需求,按默认建议选方案 A(纯代理,单一真源 = WMS)。
经代码核查,本地 product_type 表除「成品下拉降级兜底」外,还被流程卡、排产支撑两处生产代码读取(全代码零写入点,本就是空/陈旧残留)。
审计结论:双写/触发同步无法保证最终一致;纯代理可数学上保证一致。
已落地(代码,未编译验证)
internal/logic/product.go:删除localProductTypes降级函数 + 三处兜底分支;ListProductTypes/ListProductTypesPage改为纯 WMS 代理(WMS 宕→报错,不再喂空/旧数据);新增ProductTypeByID/ProductTypeByCode(读 WMS 全量按 id/code 定位);删除ent、ent/producttype两个不再使用的 import。internal/handler/processcard_model.go(流程卡):buildModelCard原读本地client.ProductType.Get/Query→ 改为logic.New(svcCtx).ProductTypeByID/ByCode(WMS)。顺带修复:此前本地表为空,流程卡产品名实际取不到,现改读 WMS 可正常显示。internal/logic/producible.go(排产支撑):产品名称映射、dropInactiveProducts停用过滤,原读本地EntClient.ProductType→ 改为s.ctx.Wms.ProductTypes(全量 /isActive=false取停用)。顺带修复:此前本地表为空,停用成品不会被剔除,现改读 WMS 可正常生效。- 应用层(logic/handler)已无任何
EntClient.ProductType/localProductTypes引用;WMS 端/api/internal/product-types?isActive=false已支持只返回停用成品,链路自洽。
物理删表(2026-09-21 已执行完成 · 用户授权「你干吧」)
- 执行链:删
schema/product_type.go→go run ./tools/generate.go重生 ent(自动剔除 ProductType 生成代码)→go build ./...通过(BUILD_EXIT=0)→ 在db.go的schemaPatchSQL追加DROP TABLE IF EXISTS product_type并移除旧的 product_type ALTER 补丁 →go run . migrate(密码门禁通过)真实删除存量表。 - psql 核验:
information_schema中product_type表 count=0(已不存在)。 - 应用层三处纯代理改造(product.go / processcard_model.go / producible.go)经编译验证自洽。
- 前端
ProductType.vue未改:wmsOnline字段仍由后端返回(纯代理后恒为true,预警横幅不会误触发),功能正常。
说明:本任务(方案 A 物理删表)已完成;但「MES 物料档案看到『其他』全品类」的原始目标仍依赖 临时.md 第三节的「全品类 /materials 代理视图」(8 处,WMS 2 + MES 后端 4 + MES 前端 1 + 验证 1),该部分一行未动,见下方「还有什么没干」。