From b8254baf5aa4f2a9a1074fab5b1495bef90e5413 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Thu, 19 Feb 2026 12:09:52 +0800 Subject: [PATCH] =?UTF-8?q?feat(mes):=20=E6=8A=BD=E5=8F=96=E9=80=9A?= =?UTF-8?q?=E7=94=A8=20Select=20=E4=B8=8B=E6=8B=89=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=EF=BC=8C=E6=9B=BF=E6=8D=A2=E5=90=84=E8=A1=A8=E5=8D=95=E5=86=85?= =?UTF-8?q?=E8=81=94=20el-select?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将 MES 模块中各表单的内联 el-select + 手动加载 SimpleList 数据的模式, 统一抽取为独立的 Select 组件,每个组件自包含数据加载和前端搜索过滤。 新增 8 个 Select 组件: - MdItemSelect(物料产品选择器) - MdClientSelect(客户选择器) - MdVendorSelect(供应商选择器) - MdUnitMeasureSelect(计量单位选择器) - MdWorkshopSelect(车间选择器) - WmWarehouseSelect(仓库选择器) - QcIndicatorSelect(质检指标选择器) - TmToolTypeSelect(工具类型选择器) 改造 10 个消费者文件: - WorkOrderForm.vue:产品/客户/供应商选择器替换 - WorkOrderBom.vue:物料/单位选择器替换,修复 handleBomItemChange - MdItemForm.vue:计量单位选择器替换 - WorkstationForm.vue:车间/仓库选择器替换 - MachineryForm.vue:车间选择器替换 - TemplateItemForm.vue:物料选择器替换 - TemplateIndicatorForm.vue:质检指标/计量单位选择器替换 - ToolForm.vue:工具类型选择器替换 - workstation/index.vue:搜索栏车间选择器替换 - tool/index.vue:搜索栏工具类型选择器替换 --- src/views/mes/dv/machinery/MachineryForm.vue | 14 +-- .../md/client/components/MdClientSelect.vue | 81 ++++++++++++++++ src/views/mes/md/item/MdItemForm.vue | 14 +-- .../mes/md/item/components/MdItemSelect.vue | 87 +++++++++++++++++ .../components/MdUnitMeasureSelect.vue | 81 ++++++++++++++++ .../md/vendor/components/MdVendorSelect.vue | 81 ++++++++++++++++ .../mes/md/workstation/WorkstationForm.vue | 40 ++------ .../components/MdWorkshopSelect.vue | 81 ++++++++++++++++ src/views/mes/md/workstation/index.vue | 19 +--- src/views/mes/pro/workorder/WorkorderBom.vue | 44 ++------- src/views/mes/pro/workorder/WorkorderForm.vue | 95 ++----------------- .../components/QcIndicatorSelect.vue | 81 ++++++++++++++++ .../mes/qc/template/TemplateIndicatorForm.vue | 44 +-------- .../mes/qc/template/TemplateItemForm.vue | 17 +--- src/views/mes/tm/tool/ToolForm.vue | 28 ++---- .../tm/tool/components/TmToolTypeSelect.vue | 81 ++++++++++++++++ src/views/mes/tm/tool/index.vue | 20 +--- .../components/WmWarehouseSelect.vue | 81 ++++++++++++++++ 18 files changed, 702 insertions(+), 287 deletions(-) create mode 100644 src/views/mes/md/client/components/MdClientSelect.vue create mode 100644 src/views/mes/md/item/components/MdItemSelect.vue create mode 100644 src/views/mes/md/unitmeasure/components/MdUnitMeasureSelect.vue create mode 100644 src/views/mes/md/vendor/components/MdVendorSelect.vue create mode 100644 src/views/mes/md/workstation/components/MdWorkshopSelect.vue create mode 100644 src/views/mes/qc/indicator/components/QcIndicatorSelect.vue create mode 100644 src/views/mes/tm/tool/components/TmToolTypeSelect.vue create mode 100644 src/views/mes/wm/warehouse/components/WmWarehouseSelect.vue diff --git a/src/views/mes/dv/machinery/MachineryForm.vue b/src/views/mes/dv/machinery/MachineryForm.vue index 8718d5c3a..833ed8956 100644 --- a/src/views/mes/dv/machinery/MachineryForm.vue +++ b/src/views/mes/dv/machinery/MachineryForm.vue @@ -47,14 +47,7 @@ - - - + @@ -133,7 +126,7 @@ import { getIntDictOptions, DICT_TYPE } from '@/utils/dict' import { DvMachineryApi, DvMachineryVO } from '@/api/mes/dv/machinery' import { DvMachineryTypeApi } from '@/api/mes/dv/machinery/type' -import { MdWorkshopApi, MdWorkshopVO } from '@/api/mes/md/workstation/workshop' +import MdWorkshopSelect from '@/views/mes/md/workstation/components/MdWorkshopSelect.vue' import { defaultProps, handleTree } from '@/utils/tree' import { MesDvMachineryStatusEnum } from '@/views/mes/utils/constants' import { generateRandomStr } from '@/utils' @@ -170,7 +163,6 @@ const formRules = reactive({ }) const formRef = ref() // 表单 Ref const machineryTypeTree = ref([]) // 设备类型树 -const workshopList = ref([]) // 车间列表 /** 生成设备编码 */ const generateCode = () => { @@ -186,8 +178,6 @@ const open = async (type: string, id?: number) => { // 加载设备类型树 const typeData = await DvMachineryTypeApi.getMachineryTypeSimpleList() machineryTypeTree.value = handleTree(typeData) - // 加载车间列表 - workshopList.value = await MdWorkshopApi.getWorkshopSimpleList() // 修改时,设置数据 if (id) { formLoading.value = true diff --git a/src/views/mes/md/client/components/MdClientSelect.vue b/src/views/mes/md/client/components/MdClientSelect.vue new file mode 100644 index 000000000..343db1174 --- /dev/null +++ b/src/views/mes/md/client/components/MdClientSelect.vue @@ -0,0 +1,81 @@ + + + + diff --git a/src/views/mes/md/item/MdItemForm.vue b/src/views/mes/md/item/MdItemForm.vue index 4193ea7f8..b16a20f56 100644 --- a/src/views/mes/md/item/MdItemForm.vue +++ b/src/views/mes/md/item/MdItemForm.vue @@ -32,14 +32,7 @@ - - - + @@ -146,7 +139,7 @@ import MdItemBatchConfigForm from './MdItemBatchConfigForm.vue' import MdProductBomForm from './MdProductBomForm.vue' import MdProductSopForm from './MdProductSopForm.vue' import MdProductSipForm from './MdProductSipForm.vue' -import { MdUnitMeasureApi, MdUnitMeasureVO } from '@/api/mes/md/unitmeasure' +import MdUnitMeasureSelect from '@/views/mes/md/unitmeasure/components/MdUnitMeasureSelect.vue' import { CommonStatusEnum } from '@/utils/constants' import { defaultProps, handleTree } from '@/utils/tree' @@ -186,7 +179,6 @@ const formRules = reactive({ const formRef = ref() // 表单 Ref const itemTypeTree = ref([]) // 物料分类树 const itemTypeList = ref([]) // 物料分类列表(扁平) -const unitMeasureList = ref([]) // 计量单位列表 /** 当前物料的「物料/产品」标识 */ const currentItemOrProduct = computed(() => { @@ -222,8 +214,6 @@ const open = async (type: string, id?: number) => { // 物料分类 itemTypeList.value = await MdItemTypeApi.getItemTypeSimpleList() itemTypeTree.value = handleTree(itemTypeList.value) - // 计量单位 - unitMeasureList.value = await MdUnitMeasureApi.getUnitMeasureSimpleList() } defineExpose({ open }) // 提供 open 方法,用于打开弹窗 diff --git a/src/views/mes/md/item/components/MdItemSelect.vue b/src/views/mes/md/item/components/MdItemSelect.vue new file mode 100644 index 000000000..289867bdb --- /dev/null +++ b/src/views/mes/md/item/components/MdItemSelect.vue @@ -0,0 +1,87 @@ + + + + diff --git a/src/views/mes/md/unitmeasure/components/MdUnitMeasureSelect.vue b/src/views/mes/md/unitmeasure/components/MdUnitMeasureSelect.vue new file mode 100644 index 000000000..dd5d843b8 --- /dev/null +++ b/src/views/mes/md/unitmeasure/components/MdUnitMeasureSelect.vue @@ -0,0 +1,81 @@ + + + + diff --git a/src/views/mes/md/vendor/components/MdVendorSelect.vue b/src/views/mes/md/vendor/components/MdVendorSelect.vue new file mode 100644 index 000000000..f23f2b7b2 --- /dev/null +++ b/src/views/mes/md/vendor/components/MdVendorSelect.vue @@ -0,0 +1,81 @@ + + + + diff --git a/src/views/mes/md/workstation/WorkstationForm.vue b/src/views/mes/md/workstation/WorkstationForm.vue index b90443bd7..3602a00ba 100644 --- a/src/views/mes/md/workstation/WorkstationForm.vue +++ b/src/views/mes/md/workstation/WorkstationForm.vue @@ -26,14 +26,7 @@ - - - + @@ -45,20 +38,12 @@ - - - + @change="handleWarehouseSelectChange" + /> @@ -143,8 +128,9 @@ diff --git a/src/views/mes/md/workstation/index.vue b/src/views/mes/md/workstation/index.vue index 4fb83f4ca..cd8948317 100644 --- a/src/views/mes/md/workstation/index.vue +++ b/src/views/mes/md/workstation/index.vue @@ -27,19 +27,7 @@ /> - - - + @@ -134,7 +122,7 @@ import { dateFormatter } from '@/utils/formatTime' import download from '@/utils/download' import { MdWorkstationApi, MdWorkstationVO } from '@/api/mes/md/workstation' -import { MdWorkshopApi, MdWorkshopVO } from '@/api/mes/md/workstation/workshop' +import MdWorkshopSelect from './components/MdWorkshopSelect.vue' import WorkstationForm from './WorkstationForm.vue' import { DICT_TYPE, getIntDictOptions } from '@/utils/dict' @@ -146,7 +134,6 @@ const { t } = useI18n() // 国际化 const loading = ref(true) // 列表的加载中 const list = ref([]) // 列表的数据 const total = ref(0) // 列表的总页数 -const workshopList = ref([]) // 车间列表 const queryParams = reactive({ pageNo: 1, pageSize: 10, @@ -214,7 +201,5 @@ const handleExport = async () => { /** 初始化 **/ onMounted(async () => { await getList() - // 加载车间列表 - workshopList.value = await MdWorkshopApi.getWorkshopSimpleList() }) diff --git a/src/views/mes/pro/workorder/WorkorderBom.vue b/src/views/mes/pro/workorder/WorkorderBom.vue index f6a769f0f..9871d8053 100644 --- a/src/views/mes/pro/workorder/WorkorderBom.vue +++ b/src/views/mes/pro/workorder/WorkorderBom.vue @@ -44,35 +44,10 @@ v-loading="bomFormLoading" > - - - + - - - + import { ProWorkOrderBomApi, ProWorkOrderBomVO } from '@/api/mes/pro/workorder/bom' -import { MdItemApi, MdItemVO } from '@/api/mes/md/item' -import { MdUnitMeasureApi } from '@/api/mes/md/unitmeasure' +import { MdItemVO } from '@/api/mes/md/item' +import MdItemSelect from '@/views/mes/md/item/components/MdItemSelect.vue' +import MdUnitMeasureSelect from '@/views/mes/md/unitmeasure/components/MdUnitMeasureSelect.vue' defineOptions({ name: 'WorkOrderBom' }) @@ -161,17 +137,12 @@ const bomFormRules = reactive({ quantity: [{ required: true, message: '预计使用量不能为空', trigger: 'blur' }] }) const bomFormRef = ref() -const itemList = ref([]) -const unitMeasureList = ref([]) /** 打开 BOM 表单弹窗 */ const openBomForm = async (type: string, row?: any) => { bomDialogVisible.value = true bomDialogTitle.value = type === 'create' ? '添加物料' : '编辑物料' bomFormType.value = type - // 加载物料和单位列表 - itemList.value = await MdItemApi.getItemSimpleList() - unitMeasureList.value = await MdUnitMeasureApi.getUnitMeasureSimpleList() // 重置表单 bomFormData.value = { id: undefined, @@ -188,9 +159,8 @@ const openBomForm = async (type: string, row?: any) => { } /** 物料变更:自动填充单位 */ -const handleBomItemChange = (itemId: number) => { - const item = itemList.value.find((i) => i.id === itemId) - if (item && item.unitMeasureId) { +const handleBomItemChange = (item: MdItemVO | undefined) => { + if (item?.unitMeasureId) { bomFormData.value.unitMeasureId = item.unitMeasureId } } diff --git a/src/views/mes/pro/workorder/WorkorderForm.vue b/src/views/mes/pro/workorder/WorkorderForm.vue index 535121d8e..74b12831b 100644 --- a/src/views/mes/pro/workorder/WorkorderForm.vue +++ b/src/views/mes/pro/workorder/WorkorderForm.vue @@ -69,43 +69,12 @@ - - - - - - - - - - - - - + /> @@ -123,46 +92,15 @@ - - - - + - - - - + - @@ -224,10 +162,10 @@ diff --git a/src/views/mes/qc/template/TemplateIndicatorForm.vue b/src/views/mes/qc/template/TemplateIndicatorForm.vue index 616882f68..ee7514dcf 100644 --- a/src/views/mes/qc/template/TemplateIndicatorForm.vue +++ b/src/views/mes/qc/template/TemplateIndicatorForm.vue @@ -9,19 +9,7 @@ v-loading="formLoading" > - - - + - - - + import { QcTemplateApi, QcTemplateIndicatorVO } from '@/api/mes/qc/template' -import { QcIndicatorApi, QcIndicatorVO } from '@/api/mes/qc/indicator' -import { MdUnitMeasureApi, MdUnitMeasureVO } from '@/api/mes/md/unitmeasure' +import QcIndicatorSelect from '@/views/mes/qc/indicator/components/QcIndicatorSelect.vue' +import MdUnitMeasureSelect from '@/views/mes/md/unitmeasure/components/MdUnitMeasureSelect.vue' defineOptions({ name: 'TemplateIndicatorForm' }) @@ -116,11 +91,6 @@ const formRules = reactive({ }) const formRef = ref() -/** 质检指标精简列表 */ -const indicatorList = ref([]) -/** 计量单位精简列表 */ -const unitMeasureList = ref([]) - /** 打开弹窗 */ const open = async (type: string, id?: number, templateId?: number) => { dialogVisible.value = true @@ -128,12 +98,6 @@ const open = async (type: string, id?: number, templateId?: number) => { formType.value = type resetForm() formData.value.templateId = templateId - // 并行加载下拉数据 - // TODO @AI:串行加载; - ;[indicatorList.value, unitMeasureList.value] = await Promise.all([ - QcIndicatorApi.getIndicatorSimpleList(), - MdUnitMeasureApi.getUnitMeasureSimpleList() - ]) if (id) { formLoading.value = true try { diff --git a/src/views/mes/qc/template/TemplateItemForm.vue b/src/views/mes/qc/template/TemplateItemForm.vue index de705399e..19b313e34 100644 --- a/src/views/mes/qc/template/TemplateItemForm.vue +++ b/src/views/mes/qc/template/TemplateItemForm.vue @@ -9,16 +9,7 @@ v-loading="formLoading" > - - - - - + import { QcTemplateApi, QcTemplateItemVO } from '@/api/mes/qc/template' -import { MdItemApi, MdItemVO } from '@/api/mes/md/item' +import MdItemSelect from '@/views/mes/md/item/components/MdItemSelect.vue' defineOptions({ name: 'TemplateItemForm' }) @@ -102,8 +93,6 @@ const formRules = reactive({ }) const formRef = ref() -/** 物料精简列表 */ -const itemList = ref([]) /** 打开弹窗 */ const open = async (type: string, id?: number, templateId?: number) => { @@ -112,8 +101,6 @@ const open = async (type: string, id?: number, templateId?: number) => { formType.value = type resetForm() formData.value.templateId = templateId - // 加载物料列表 - itemList.value = await MdItemApi.getItemSimpleList() if (id) { formLoading.value = true try { diff --git a/src/views/mes/tm/tool/ToolForm.vue b/src/views/mes/tm/tool/ToolForm.vue index 243a03b0b..0e7fa6ee1 100644 --- a/src/views/mes/tm/tool/ToolForm.vue +++ b/src/views/mes/tm/tool/ToolForm.vue @@ -29,19 +29,11 @@ - - - + /> @@ -142,7 +134,8 @@ diff --git a/src/views/mes/tm/tool/index.vue b/src/views/mes/tm/tool/index.vue index 4eac5a6ae..be77b9312 100644 --- a/src/views/mes/tm/tool/index.vue +++ b/src/views/mes/tm/tool/index.vue @@ -28,19 +28,7 @@ /> - - - + ([]) // 工具类型列表 - /** 查询列表 */ const getList = async () => { loading.value = true @@ -258,7 +244,5 @@ const handleExport = async () => { /** 初始化 **/ onMounted(async () => { await getList() - // 加载工具类型列表 - toolTypeList.value = await TmToolTypeApi.getToolTypeSimpleList() }) diff --git a/src/views/mes/wm/warehouse/components/WmWarehouseSelect.vue b/src/views/mes/wm/warehouse/components/WmWarehouseSelect.vue new file mode 100644 index 000000000..f544d1e1a --- /dev/null +++ b/src/views/mes/wm/warehouse/components/WmWarehouseSelect.vue @@ -0,0 +1,81 @@ + + + +