feat(mes): 更新供应商相关逻辑,添加英文名称及引用校验功能

重构供应商数据模型,替换供应商等级为英文名称,并在相关服务中添加对供应商引用的校验逻辑,以确保数据一致性和完整性。
pull/871/MERGE
YunaiV 2026-03-28 16:00:04 +08:00
parent f3138d8cd5
commit 3ac19a0c73
6 changed files with 63 additions and 50 deletions

View File

@ -189,7 +189,7 @@ const currentItemOrProduct = computed(() => formData.value.itemOrProduct || '')
/** 生成物料编码 */ /** 生成物料编码 */
const generateCode = async () => { const generateCode = async () => {
formData.value.code = await AutoCodeRecordApi.generateAutoCode(MesAutoCodeRuleCode.ITEM_CODE) formData.value.code = await AutoCodeRecordApi.generateAutoCode(MesAutoCodeRuleCode.MD_ITEM_CODE)
} }
/** 分类变更时,同步更新 itemOrProduct */ /** 分类变更时,同步更新 itemOrProduct */

View File

@ -6,6 +6,7 @@
:rules="formRules" :rules="formRules"
label-width="120px" label-width="120px"
v-loading="formLoading" v-loading="formLoading"
:disabled="isDetail"
> >
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
@ -52,7 +53,11 @@
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="供应商简介" prop="description"> <el-form-item label="供应商简介" prop="description">
<el-input v-model="formData.description" type="textarea" placeholder="请输入供应商简介" /> <el-input
v-model="formData.description"
type="textarea"
placeholder="请输入供应商简介"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -143,8 +148,8 @@
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="供应商LOGO" prop="logo"> <el-form-item label="供应商 LOGO" prop="logo">
<el-input v-model="formData.logo" placeholder="请输入供应商LOGO地址" /> <el-input v-model="formData.logo" placeholder="请输入供应商 LOGO 地址" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
@ -154,28 +159,31 @@
</el-col> </el-col>
</el-row> </el-row>
</el-form> </el-form>
<!-- 编辑时显示关联数据 tab --> <!-- 编辑/详情时显示关联数据 tab -->
<el-tabs v-if="formType === 'update'" v-model="activeTab" class="mt-10px"> <el-tabs v-if="formType !== 'create' && formData.id" v-model="activeTab" class="mt-10px">
<el-tab-pane label="供货记录" name="supplyRecord"> <el-tab-pane label="供货记录" name="supplyRecord" lazy>
<!-- TODO @芋艿供应商详情-供货记录 tab依赖 WM 采购入库模块 --> <VendorSupplyRecordTab :vendorId="formData.id" />
<el-empty description="功能开发中,敬请期待" />
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="退货记录" name="returnRecord"> <el-tab-pane label="退货记录" name="returnRecord" lazy>
<!-- TODO @芋艿供应商详情-退货记录 tab依赖 WM 供应商退货模块 --> <VendorReturnRecordTab :vendorId="formData.id" />
<el-empty description="功能开发中,敬请期待" />
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
<template #footer> <template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button> <el-button v-if="!isDetail" @click="submitForm" type="primary" :disabled="formLoading"
<el-button @click="dialogVisible = false"> </el-button> > </el-button
>
<el-button @click="dialogVisible = false">{{ isDetail ? '关 闭' : '取 消' }}</el-button>
</template> </template>
</Dialog> </Dialog>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { getIntDictOptions, getStrDictOptions, DICT_TYPE } from '@/utils/dict' import { getIntDictOptions, getStrDictOptions, DICT_TYPE } from '@/utils/dict'
import { MdVendorApi, MdVendorVO } from '@/api/mes/md/vendor' import { MdVendorApi, MdVendorVO } from '@/api/mes/md/vendor'
import { AutoCodeRecordApi } from '@/api/mes/md/autocode/record'
import { CommonStatusEnum } from '@/utils/constants' import { CommonStatusEnum } from '@/utils/constants'
import { generateRandomStr } from '@/utils' import { MesAutoCodeRuleCode } from '@/views/mes/utils/constants'
import VendorSupplyRecordTab from './components/VendorSupplyRecordTab.vue'
import VendorReturnRecordTab from './components/VendorReturnRecordTab.vue'
defineOptions({ name: 'MdVendorForm' }) defineOptions({ name: 'MdVendorForm' })
@ -183,9 +191,17 @@ const { t } = useI18n() // 国际化
const message = useMessage() // const message = useMessage() //
const dialogVisible = ref(false) // const dialogVisible = ref(false) //
const dialogTitle = ref('') // const dialogTitle = computed(() => {
const titles: Record<string, string> = {
create: '新增供应商',
update: '修改供应商',
detail: '查看供应商'
}
return titles[formType.value] || formType.value
})
const formLoading = ref(false) // 12 const formLoading = ref(false) // 12
const formType = ref('') // create - update - const formType = ref('') // create - update - detail -
const isDetail = computed(() => formType.value === 'detail') //
const activeTab = ref('supplyRecord') // tab const activeTab = ref('supplyRecord') // tab
const formData = ref({ const formData = ref({
id: undefined, id: undefined,
@ -243,18 +259,17 @@ const formRules = reactive({
const formRef = ref() // Ref const formRef = ref() // Ref
/** 生成供应商编码 */ /** 生成供应商编码 */
const generateCode = () => { const generateCode = async () => {
// TODO @ formData.value.code = await AutoCodeRecordApi.generateAutoCode(MesAutoCodeRuleCode.MD_VENDOR_CODE)
formData.value.code = 'VD' + generateRandomStr(12)
} }
/** 打开弹窗 */ /** 打开弹窗 */
const open = async (type: string, id?: number) => { const open = async (type: string, id?: number) => {
dialogVisible.value = true dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type formType.value = type
activeTab.value = 'supplyRecord'
resetForm() resetForm()
// // /
if (id) { if (id) {
formLoading.value = true formLoading.value = true
try { try {

View File

@ -62,8 +62,7 @@ const handleFilter = (query: string) => {
const keyword = query.toLowerCase() const keyword = query.toLowerCase()
filteredList.value = allList.value.filter( filteredList.value = allList.value.filter(
(item) => (item) =>
item.name?.toLowerCase().includes(keyword) || item.name?.toLowerCase().includes(keyword) || item.code?.toLowerCase().includes(keyword)
item.code?.toLowerCase().includes(keyword)
) )
} }

View File

@ -35,15 +35,14 @@
class="!w-240px" class="!w-240px"
/> />
</el-form-item> </el-form-item>
<el-form-item label="供应商等级" prop="level"> <el-form-item label="英文名称" prop="englishName">
<el-select v-model="queryParams.level" placeholder="请选择供应商等级" clearable class="!w-240px"> <el-input
<el-option v-model="queryParams.englishName"
v-for="dict in getStrDictOptions(DICT_TYPE.MES_VENDOR_LEVEL)" placeholder="请输入英文名称"
:key="dict.value" clearable
:label="dict.label" @keyup.enter="handleQuery"
:value="dict.value" class="!w-240px"
/> />
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="状态" prop="status"> <el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable class="!w-240px"> <el-select v-model="queryParams.status" placeholder="请选择状态" clearable class="!w-240px">
@ -66,12 +65,7 @@
> >
<Icon icon="ep:plus" class="mr-5px" /> 新增 <Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button> </el-button>
<el-button <el-button type="warning" plain @click="handleImport" v-hasPermi="['mes:md-vendor:import']">
type="warning"
plain
@click="handleImport"
v-hasPermi="['mes:md-vendor:import']"
>
<Icon icon="ep:upload" class="mr-5px" /> 导入 <Icon icon="ep:upload" class="mr-5px" /> 导入
</el-button> </el-button>
<el-button <el-button
@ -90,7 +84,13 @@
<!-- 列表 --> <!-- 列表 -->
<ContentWrap> <ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true"> <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="供应商编码" align="center" prop="code" width="120" /> <el-table-column label="供应商编码" align="center" prop="code" width="120">
<template #default="scope">
<el-link type="primary" @click="openForm('detail', scope.row.id)">
{{ scope.row.code }}
</el-link>
</template>
</el-table-column>
<el-table-column label="供应商名称" align="center" prop="name" min-width="180" /> <el-table-column label="供应商名称" align="center" prop="name" min-width="180" />
<el-table-column label="供应商简称" align="center" prop="nickname" width="100" /> <el-table-column label="供应商简称" align="center" prop="nickname" width="100" />
<el-table-column label="供应商等级" align="center" prop="level" width="120"> <el-table-column label="供应商等级" align="center" prop="level" width="120">
@ -143,12 +143,11 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download' import download from '@/utils/download'
import { MdVendorApi, MdVendorVO } from '@/api/mes/md/vendor' import { MdVendorApi, MdVendorVO } from '@/api/mes/md/vendor'
import MdVendorForm from './MdVendorForm.vue' import MdVendorForm from './MdVendorForm.vue'
import MdVendorImportForm from './MdVendorImportForm.vue' import MdVendorImportForm from './MdVendorImportForm.vue'
import { DICT_TYPE, getIntDictOptions, getStrDictOptions } from '@/utils/dict' import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
defineOptions({ name: 'MesMdVendor' }) defineOptions({ name: 'MesMdVendor' })
@ -164,7 +163,7 @@ const queryParams = reactive({
code: undefined, code: undefined,
name: undefined, name: undefined,
nickname: undefined, nickname: undefined,
level: undefined, englishName: undefined,
status: undefined status: undefined
}) })
const queryFormRef = ref() // const queryFormRef = ref() //

View File

@ -413,11 +413,12 @@ export const MesAutoCodePaddedMethodEnum = {
/** MES 自动编码规则 Code 枚举 */ /** MES 自动编码规则 Code 枚举 */
export const MesAutoCodeRuleCode = { export const MesAutoCodeRuleCode = {
ITEM_CODE: 'MD_ITEM_CODE', // 物料编码 MD_ITEM_CODE: 'MD_ITEM_CODE', // 物料编码
SN_CODE: 'WM_SN_CODE', // SN 码 MD_VENDOR_CODE: 'MD_VENDOR_CODE', // 供应商编码
PACKAGE_CODE: 'WM_PACKAGE_CODE', // 装箱单编码 WM_SN_CODE: 'WM_SN_CODE', // SN 码
BATCH_CODE: 'WM_BATCH_CODE', // 批次编码 WM_PACKAGE_CODE: 'WM_PACKAGE_CODE', // 装箱单编码
TASK_CODE: 'PRO_TASK_CODE', // 生产任务编码 WM_BATCH_CODE: 'WM_BATCH_CODE', // 批次编码
PRO_TASK_CODE: 'PRO_TASK_CODE', // 生产任务编码
QC_IQC_CODE: 'QC_IQC_CODE', // 来料检验单编码 QC_IQC_CODE: 'QC_IQC_CODE', // 来料检验单编码
QC_IPQC_CODE: 'QC_IPQC_CODE', // 过程检验单编码 QC_IPQC_CODE: 'QC_IPQC_CODE', // 过程检验单编码
QC_OQC_CODE: 'QC_OQC_CODE', // 出货检验单编码 QC_OQC_CODE: 'QC_OQC_CODE', // 出货检验单编码

View File

@ -204,8 +204,7 @@ const formRef = ref()
/** 生成装箱单编号 */ /** 生成装箱单编号 */
const generateCode = async () => { const generateCode = async () => {
// DONE @AI mes constants formData.value.code = await AutoCodeRecordApi.generateAutoCode(MesAutoCodeRuleCode.WM_PACKAGE_CODE)
formData.value.code = await AutoCodeRecordApi.generateAutoCode(MesAutoCodeRuleCode.PACKAGE_CODE)
} }
/** 打开弹窗 */ /** 打开弹窗 */