Files
bj_power/临时.md
T
SunYF 932700ca65 refactor: 清理MES端本地product_type冗余代码,对齐WMS主数据架构
1.  移除MES端本地product_type实体、schema及相关CRUD代码,改为通过WMS内部API代理获取物料主数据
2.  更新物料管理粒度逻辑,新增"其他"类型(3)支持,同步更新入库校验规则
3.  修复前端物料选择、库存筛选等页面的类型判断逻辑,统一使用manage_mode区分管理类型
4.  清理静态资源文件冗余的样式代码,调整前端页面展示逻辑
5.  更新帮助文档,修正物料类型的说明描述
2026-09-22 07:41:40 +08:00

69 lines
6.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 物料档案对齐 — 审核结果与方案(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),该部分一行未动,见下方「还有什么没干」。