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 () => {
formData.value.code = await AutoCodeRecordApi.generateAutoCode(MesAutoCodeRuleCode.ITEM_CODE)
formData.value.code = await AutoCodeRecordApi.generateAutoCode(MesAutoCodeRuleCode.MD_ITEM_CODE)
}
/** 分类变更时,同步更新 itemOrProduct */

View File

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

View File

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

View File

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

View File

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

View File

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