From 6bb27899c1f1ae0454bbf41c5ebbf6c1f34d1a5d Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 15 Feb 2026 14:03:59 +0800 Subject: [PATCH 001/513] =?UTF-8?q?feat(mes):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E7=89=A9=E6=96=99=E4=BA=A7=E5=93=81=E5=88=86=E7=B1=BB=E4=B8=8E?= =?UTF-8?q?=E7=89=A9=E6=96=99=E4=BA=A7=E5=93=81=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 迁移 ktg-mes 的 md_item_type 和 md_item 两张表到 yudao-module-mes, 包含完整的 CRUD、树形分类、物料分页查询、enrichment 等功能。 后端新增 17 个文件(1337 行): - DO: MesMdItemTypeDO(树形分类)、MesMdItemDO(物料产品) - VO: 分类 3 个(List/Save/Resp)、物料 3 个(Page/Save/Resp) - Mapper: 2 个(BaseMapperX,纯 Java,无 XML) - Service: 4 个(接口 + 实现) - Controller: 2 个(/mes/md/item-type、/mes/md/item) - ErrorCodeConstants 追加 9 个错误码 关键业务逻辑: - 分类:父分类递归环路检测、同级名称/编码唯一性、删除保护(子分类+物料) - 物料:编码/名称全局唯一、分类存在校验、安全库存联动清零 - enrichment:物料 RespVO 通过 Service 关联填充 itemTypeName、itemOrProduct - 循环依赖:MesMdItemTypeServiceImpl 用 @Lazy 注入 MesMdItemService plan: plans/swirling-stirring-metcalfe.md --- src/api/mes/md/item/index.ts | 58 +++++ src/api/mes/md/item/type/index.ts | 51 ++++ src/views/mes/md/item/MdItemForm.vue | 219 +++++++++++++++++ src/views/mes/md/item/index.vue | 231 ++++++++++++++++++ src/views/mes/md/item/type/MdItemTypeForm.vue | 167 +++++++++++++ src/views/mes/md/item/type/index.vue | 214 ++++++++++++++++ 6 files changed, 940 insertions(+) create mode 100644 src/api/mes/md/item/index.ts create mode 100644 src/api/mes/md/item/type/index.ts create mode 100644 src/views/mes/md/item/MdItemForm.vue create mode 100644 src/views/mes/md/item/index.vue create mode 100644 src/views/mes/md/item/type/MdItemTypeForm.vue create mode 100644 src/views/mes/md/item/type/index.vue diff --git a/src/api/mes/md/item/index.ts b/src/api/mes/md/item/index.ts new file mode 100644 index 000000000..b64bd75b3 --- /dev/null +++ b/src/api/mes/md/item/index.ts @@ -0,0 +1,58 @@ +import request from '@/config/axios' + +// MES 物料产品 VO +export interface MdItemVO { + id: number // 物料编号 + code: string // 物料编码 + name: string // 物料名称 + specification: string // 规格型号 + unitOfMeasure: string // 单位编码 + itemTypeId: number // 物料分类编号 + itemTypeName?: string // 物料分类名称 + itemOrProduct?: string // 物料/产品标识 + status: number // 状态 + safeStockFlag: boolean // 是否启用安全库存 + minStock: number // 最低库存量 + maxStock: number // 最高库存量 + highValue: boolean // 是否高值物料 + batchFlag: boolean // 是否启用批次管理 + remark: string // 备注 +} + +// MES 物料产品 API +export const MdItemApi = { + // 查询物料产品分页 + getItemPage: async (params: any) => { + return await request.get({ url: `/mes/md/item/page`, params }) + }, + + // 查询物料产品精简列表 + getItemSimpleList: async () => { + return await request.get({ url: `/mes/md/item/simple-list` }) + }, + + // 查询物料产品详情 + getItem: async (id: number) => { + return await request.get({ url: `/mes/md/item/get?id=` + id }) + }, + + // 新增物料产品 + createItem: async (data: MdItemVO) => { + return await request.post({ url: `/mes/md/item/create`, data }) + }, + + // 修改物料产品 + updateItem: async (data: MdItemVO) => { + return await request.put({ url: `/mes/md/item/update`, data }) + }, + + // 删除物料产品 + deleteItem: async (id: number) => { + return await request.delete({ url: `/mes/md/item/delete?id=` + id }) + }, + + // 导出物料产品 Excel + exportItem: async (params: any) => { + return await request.download({ url: `/mes/md/item/export-excel`, params }) + } +} diff --git a/src/api/mes/md/item/type/index.ts b/src/api/mes/md/item/type/index.ts new file mode 100644 index 000000000..3833b9995 --- /dev/null +++ b/src/api/mes/md/item/type/index.ts @@ -0,0 +1,51 @@ +import request from '@/config/axios' + +// MES 物料产品分类 VO +export interface MdItemTypeVO { + id: number // 分类编号 + parentId: number // 父分类编号 + code: string // 分类编码 + name: string // 分类名称 + itemOrProduct: string // 物料/产品标识 + sort: number // 显示排序 + status: number // 状态 + remark: string // 备注 +} + +// MES 物料产品分类 API +export const MdItemTypeApi = { + // 查询物料产品分类列表 + getItemTypeList: async (params?: any) => { + return await request.get({ url: `/mes/md/item-type/list`, params }) + }, + + // 查询物料产品分类精简列表 + getItemTypeSimpleList: async () => { + return await request.get({ url: `/mes/md/item-type/simple-list` }) + }, + + // 查询物料产品分类详情 + getItemType: async (id: number) => { + return await request.get({ url: `/mes/md/item-type/get?id=` + id }) + }, + + // 新增物料产品分类 + createItemType: async (data: MdItemTypeVO) => { + return await request.post({ url: `/mes/md/item-type/create`, data }) + }, + + // 修改物料产品分类 + updateItemType: async (data: MdItemTypeVO) => { + return await request.put({ url: `/mes/md/item-type/update`, data }) + }, + + // 删除物料产品分类 + deleteItemType: async (id: number) => { + return await request.delete({ url: `/mes/md/item-type/delete?id=` + id }) + }, + + // 导出物料产品分类 Excel + exportItemType: async (params: any) => { + return await request.download({ url: `/mes/md/item-type/export-excel`, params }) + } +} diff --git a/src/views/mes/md/item/MdItemForm.vue b/src/views/mes/md/item/MdItemForm.vue new file mode 100644 index 000000000..6dded1f0d --- /dev/null +++ b/src/views/mes/md/item/MdItemForm.vue @@ -0,0 +1,219 @@ + + + diff --git a/src/views/mes/md/item/index.vue b/src/views/mes/md/item/index.vue new file mode 100644 index 000000000..75a4026eb --- /dev/null +++ b/src/views/mes/md/item/index.vue @@ -0,0 +1,231 @@ + + + diff --git a/src/views/mes/md/item/type/MdItemTypeForm.vue b/src/views/mes/md/item/type/MdItemTypeForm.vue new file mode 100644 index 000000000..0b84ed6f5 --- /dev/null +++ b/src/views/mes/md/item/type/MdItemTypeForm.vue @@ -0,0 +1,167 @@ + + + diff --git a/src/views/mes/md/item/type/index.vue b/src/views/mes/md/item/type/index.vue new file mode 100644 index 000000000..cd686161a --- /dev/null +++ b/src/views/mes/md/item/type/index.vue @@ -0,0 +1,214 @@ + + + + From 27f5fcb66ec775b46a9ca1f6a5138a7fcaa79b15 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 15 Feb 2026 15:43:49 +0800 Subject: [PATCH 002/513] =?UTF-8?q?feat(mes):=20=E5=AE=8C=E5=96=84?= =?UTF-8?q?=E7=89=A9=E6=96=99=E5=88=86=E7=B1=BB=E4=B8=8E=E7=89=A9=E6=96=99?= =?UTF-8?q?=E4=BA=A7=E5=93=81=E5=89=8D=E7=AB=AF=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 新增 ItemTypeTree 左侧分类树组件(支持搜索过滤、点击切换) 2. 物料列表改为左右布局(左侧树 + 右侧列表) 3. 新增 MesItemOrProductEnum 常量({ label, value } 结构) 4. 物料/产品列用 getItemOrProductLabel 翻译,安全库存列用 dict-tag 渲染 5. 表单改为 3 列布局(span=8),增加编码生成按钮和底部 Tab 占位 6. 分类管理移除导出按钮,分类表单修复 TS 类型和枚举默认值 7. 分类 API 移除 exportItemType --- src/api/mes/md/item/type/index.ts | 5 - src/views/mes/md/item/ItemTypeTree.vue | 78 +++++ src/views/mes/md/item/MdItemForm.vue | 70 +++-- src/views/mes/md/item/index.vue | 281 +++++++++--------- src/views/mes/md/item/type/MdItemTypeForm.vue | 22 +- src/views/mes/md/item/type/index.vue | 35 +-- src/views/mes/utils/constants.ts | 21 ++ 7 files changed, 313 insertions(+), 199 deletions(-) create mode 100644 src/views/mes/md/item/ItemTypeTree.vue create mode 100644 src/views/mes/utils/constants.ts diff --git a/src/api/mes/md/item/type/index.ts b/src/api/mes/md/item/type/index.ts index 3833b9995..edcd36e1a 100644 --- a/src/api/mes/md/item/type/index.ts +++ b/src/api/mes/md/item/type/index.ts @@ -42,10 +42,5 @@ export const MdItemTypeApi = { // 删除物料产品分类 deleteItemType: async (id: number) => { return await request.delete({ url: `/mes/md/item-type/delete?id=` + id }) - }, - - // 导出物料产品分类 Excel - exportItemType: async (params: any) => { - return await request.download({ url: `/mes/md/item-type/export-excel`, params }) } } diff --git a/src/views/mes/md/item/ItemTypeTree.vue b/src/views/mes/md/item/ItemTypeTree.vue new file mode 100644 index 000000000..ed3668f77 --- /dev/null +++ b/src/views/mes/md/item/ItemTypeTree.vue @@ -0,0 +1,78 @@ + + + diff --git a/src/views/mes/md/item/MdItemForm.vue b/src/views/mes/md/item/MdItemForm.vue index 6dded1f0d..20974d975 100644 --- a/src/views/mes/md/item/MdItemForm.vue +++ b/src/views/mes/md/item/MdItemForm.vue @@ -1,6 +1,6 @@