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