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

6.3 KiB
Raw Blame History

物料档案对齐 — 审核结果与方案(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/materialsL244-246)目前只有 GET/POST/PUT,补一行: POST /api/internal/materials/deletedeleteMaterialHandlerhandler 已在 material.go L179 写好,只差注册)。
  2. 加附件内部代理:新增 /api/internal/attachments/upload | list | deleteX-API-TOKEN 版),供 MES 代理调用,保证 MES/WMS 附件单一来源一致。

B. MES 后端(4 处)

  1. wmsclient 补 MaterialDelete + 附件方法(upload/list/delete)。
  2. logic 新建 materials 代理方法(page/get/post/put/delete,纯代理 WMS;WMS 宕机时读写均报错并提示,无本地缓存)。
  3. handler 加 materials handler(对应 6 个接口)。
  4. routes_production.go 注册 /materials/*perm.go 加对应权限码。

C. MES 前端(1 处)

  1. ProductType.vue:接口 /product-types/materials;字段对齐 WMS图号/名称/规格/单位/品类/类型/安全库存/说明/附件);「编码」label 改「图号」;品类下拉含「其他」。

D. 验证

  1. 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 定位);删除 entent/producttype 两个不再使用的 import。
  2. internal/handler/processcard_model.go(流程卡):buildModelCard 原读本地 client.ProductType.Get/Query → 改为 logic.New(svcCtx).ProductTypeByID/ByCodeWMS)。顺带修复:此前本地表为空,流程卡产品名实际取不到,现改读 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.gogo run ./tools/generate.go 重生 ent(自动剔除 ProductType 生成代码)→ go build ./... 通过(BUILD_EXIT=0)→ 在 db.goschemaPatchSQL 追加 DROP TABLE IF EXISTS product_type 并移除旧的 product_type ALTER 补丁 → go run . migrate(密码门禁通过)真实删除存量表。
  • psql 核验:information_schemaproduct_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),该部分一行未动,见下方「还有什么没干」。