|
|
|
|
@ -31,7 +31,7 @@
|
|
|
|
|
</el-row>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-col v-if="!isSampleMode" :span="12">
|
|
|
|
|
<el-form-item :label="t('FactoryModeling.ProductInformation.dialogCategoryTypeLabel')" prop="categoryType">
|
|
|
|
|
<el-radio-group v-model="formData.categoryType" @change="handleCategoryTypeChange">
|
|
|
|
|
<el-radio
|
|
|
|
|
@ -49,7 +49,7 @@
|
|
|
|
|
<el-input v-model="formData.name" :placeholder="t('FactoryModeling.ProductInformation.dialogNamePlaceholder')" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-col v-if="!isSampleMode" :span="12">
|
|
|
|
|
<el-form-item :label="t('FactoryModeling.ProductInformation.dialogCategoryLabel')" prop="categoryId">
|
|
|
|
|
<el-tree-select
|
|
|
|
|
v-model="formData.categoryId"
|
|
|
|
|
@ -74,7 +74,7 @@
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col v-if="formData.categoryType === 2 || formData.categoryType === 3" :span="12">
|
|
|
|
|
<el-col v-if="!isSampleMode && (formData.categoryType === 2 || formData.categoryType === 3)" :span="12">
|
|
|
|
|
<el-form-item :label="t('FactoryModeling.ProductInformation.dialogPurchaseUnitLabel')" prop="purchaseUnitId">
|
|
|
|
|
<el-select v-model="formData.purchaseUnitId" clearable :placeholder="t('FactoryModeling.ProductInformation.dialogUnitPlaceholder')" class="w-1/1" @change="handlePurchaseUnitChange">
|
|
|
|
|
<el-option
|
|
|
|
|
@ -86,12 +86,12 @@
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-col v-if="!isSampleMode" :span="12">
|
|
|
|
|
<el-form-item :label="t('FactoryModeling.ProductInformation.dialogStandardLabel')" prop="standard">
|
|
|
|
|
<el-input v-model="formData.standard" :placeholder="t('FactoryModeling.ProductInformation.dialogStandardPlaceholder')" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-col v-if="!isSampleMode" :span="12">
|
|
|
|
|
<el-form-item :label="t('FactoryModeling.ProductInformation.dialogExpiryDayLabel')" prop="expiryDay">
|
|
|
|
|
<el-input-number
|
|
|
|
|
v-model="formData.expiryDay"
|
|
|
|
|
@ -102,7 +102,7 @@
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col v-if="isProductCategory" :span="12">
|
|
|
|
|
<el-col v-if="!isSampleMode && isProductCategory" :span="12">
|
|
|
|
|
<el-form-item label="关联设备" prop="devices">
|
|
|
|
|
<el-input
|
|
|
|
|
:model-value="deviceDisplayText"
|
|
|
|
|
@ -112,7 +112,7 @@
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col v-if="isProductCategory" :span="12">
|
|
|
|
|
<el-col v-if="!isSampleMode && isProductCategory" :span="12">
|
|
|
|
|
<el-form-item label="关联模具" prop="molds">
|
|
|
|
|
<el-input
|
|
|
|
|
:model-value="moldDisplayText"
|
|
|
|
|
@ -122,7 +122,7 @@
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col v-if="formData.categoryType === 1" :span="12">
|
|
|
|
|
<el-col v-if="!isSampleMode && formData.categoryType === 1" :span="12">
|
|
|
|
|
<el-form-item :label="t('FactoryModeling.ProductInformation.dialogPackagingSchemeLabel')" prop="packagingSchemes">
|
|
|
|
|
<el-input
|
|
|
|
|
:model-value="displayPackagingSchemeText"
|
|
|
|
|
@ -134,7 +134,7 @@
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col v-if="formData.categoryType === 2 || formData.categoryType === 3" :span="12">
|
|
|
|
|
<el-col v-if="!isSampleMode && (formData.categoryType === 2 || formData.categoryType === 3)" :span="12">
|
|
|
|
|
<el-form-item :label="t('FactoryModeling.ProductInformation.dialogSupplierLabel')" prop="suppliers">
|
|
|
|
|
<el-input
|
|
|
|
|
:model-value="displaySupplierText"
|
|
|
|
|
@ -146,7 +146,7 @@
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col v-if="formData.categoryType === 3" :span="8">
|
|
|
|
|
<el-col v-if="!isSampleMode && formData.categoryType === 3" :span="8">
|
|
|
|
|
<el-form-item :label="t('FactoryModeling.ProductInformation.dialogSparePartLevelLabel')" prop="sparePartLevel">
|
|
|
|
|
<el-radio-group v-model="formData.sparePartLevel">
|
|
|
|
|
<el-radio
|
|
|
|
|
@ -159,7 +159,7 @@
|
|
|
|
|
</el-radio-group>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col v-if="formData.categoryType === 3" :span="8">
|
|
|
|
|
<el-col v-if="!isSampleMode && formData.categoryType === 3" :span="8">
|
|
|
|
|
<el-form-item :label="t('FactoryModeling.ProductInformation.dialogFragileFlagLabel')" prop="fragileFlag">
|
|
|
|
|
<el-radio-group v-model="formData.fragileFlag">
|
|
|
|
|
<el-radio :label="1">{{ t('common.yes') }}</el-radio>
|
|
|
|
|
@ -167,17 +167,17 @@
|
|
|
|
|
</el-radio-group>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col v-if="formData.categoryType === 3" :span="8">
|
|
|
|
|
<el-col v-if="!isSampleMode && formData.categoryType === 3" :span="8">
|
|
|
|
|
<el-form-item :label="t('FactoryModeling.ProductInformation.dialogPurchaseCycleLabel')" prop="purchaseCycle">
|
|
|
|
|
<el-input-number v-model="formData.purchaseCycle" :min="0" :precision="0" class="!w-1/1" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col v-if="formData.categoryType === 3" :span="8">
|
|
|
|
|
<el-col v-if="!isSampleMode && formData.categoryType === 3" :span="8">
|
|
|
|
|
<el-form-item :label="t('FactoryModeling.ProductInformation.dialogBrandLabel')" prop="brand">
|
|
|
|
|
<el-input v-model="formData.brand" :placeholder="t('FactoryModeling.ProductInformation.dialogBrandPlaceholder')" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col v-if="formData.categoryType === 2 || formData.categoryType === 3" :span="12">
|
|
|
|
|
<el-col v-if="!isSampleMode && (formData.categoryType === 2 || formData.categoryType === 3)" :span="12">
|
|
|
|
|
<el-form-item :label="t('FactoryModeling.ProductInformation.dialogPurchaseUnitConvertLabel')" prop="purchaseUnitConvertQuantity">
|
|
|
|
|
<el-input-number v-model="formData.purchaseUnitConvertQuantity" :min="1" :precision="0" class="!w-1/1" />
|
|
|
|
|
<div class="form-item-tip">{{ purchaseUnitConvertTipText }}</div>
|
|
|
|
|
@ -196,13 +196,13 @@
|
|
|
|
|
</el-radio-group>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="8">
|
|
|
|
|
<el-col v-if="!isSampleMode" :span="8">
|
|
|
|
|
<el-form-item label="是否样品" prop="isSample">
|
|
|
|
|
<el-switch v-model="formData.isSample" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<template v-if="formData.isSample">
|
|
|
|
|
<el-col :span="8">
|
|
|
|
|
<el-col :span="isSampleMode ? 12 : 8">
|
|
|
|
|
<el-form-item label="样品分类" prop="sampleCategory">
|
|
|
|
|
<el-select v-model="formData.sampleCategory" clearable placeholder="请选择样品分类" class="w-1/1">
|
|
|
|
|
<el-option
|
|
|
|
|
@ -214,7 +214,7 @@
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="8">
|
|
|
|
|
<el-col :span="isSampleMode ? 12 : 8">
|
|
|
|
|
<el-form-item label="所属事业部" prop="bizUnit">
|
|
|
|
|
<el-input v-model="formData.bizUnit" placeholder="请输入所属事业部" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
@ -445,6 +445,7 @@ const message = useMessage()
|
|
|
|
|
const dialogTitle = ref('')
|
|
|
|
|
const formLoading = ref(false)
|
|
|
|
|
const formType = ref('')
|
|
|
|
|
const isSampleMode = ref(false)
|
|
|
|
|
const deviceSelectDialogRef = ref()
|
|
|
|
|
const moldSelectDialogRef = ref()
|
|
|
|
|
const searchFormRef = ref()
|
|
|
|
|
@ -680,6 +681,10 @@ const validateBarCode = (_rule, value, callback) => {
|
|
|
|
|
callback()
|
|
|
|
|
}
|
|
|
|
|
const validatePackagingSchemes = (_rule, value, callback) => {
|
|
|
|
|
if (isSampleMode.value) {
|
|
|
|
|
callback()
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if (formData.value.categoryType !== 1) {
|
|
|
|
|
callback()
|
|
|
|
|
return
|
|
|
|
|
@ -695,6 +700,10 @@ const validatePackagingSchemes = (_rule, value, callback) => {
|
|
|
|
|
callback()
|
|
|
|
|
}
|
|
|
|
|
const validateSuppliers = (_rule, value, callback) => {
|
|
|
|
|
if (isSampleMode.value) {
|
|
|
|
|
callback()
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if (formData.value.categoryType !== 2 && formData.value.categoryType !== 3) {
|
|
|
|
|
callback()
|
|
|
|
|
return
|
|
|
|
|
@ -968,16 +977,60 @@ const supplierList = ref<any[]>([])
|
|
|
|
|
|
|
|
|
|
let openRequestId = 0
|
|
|
|
|
|
|
|
|
|
const findFirstCategoryId = (tree: any[]): number | undefined => {
|
|
|
|
|
const queue = [...(tree || [])]
|
|
|
|
|
while (queue.length) {
|
|
|
|
|
const node = queue.shift()
|
|
|
|
|
if (!node) continue
|
|
|
|
|
if (node.id !== undefined && node.id !== null) {
|
|
|
|
|
return Number(node.id)
|
|
|
|
|
}
|
|
|
|
|
if (Array.isArray(node.children) && node.children.length) {
|
|
|
|
|
queue.push(...node.children)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return undefined
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const applySampleDefaults = () => {
|
|
|
|
|
if (!isSampleMode.value) return
|
|
|
|
|
formData.value.isSample = true
|
|
|
|
|
formData.value.bizUnit = formData.value.bizUnit || 'BIT'
|
|
|
|
|
if (!formData.value.categoryId) {
|
|
|
|
|
formData.value.categoryId = findFirstCategoryId(categoryList.value) as any
|
|
|
|
|
}
|
|
|
|
|
if (!formData.value.unitId && unitList.value.length > 0) {
|
|
|
|
|
formData.value.unitId = unitList.value[0].id as any
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const validateSampleDefaults = () => {
|
|
|
|
|
if (!isSampleMode.value) return true
|
|
|
|
|
applySampleDefaults()
|
|
|
|
|
if (!formData.value.categoryType || !formData.value.categoryId) {
|
|
|
|
|
message.warning('请先维护产品分类基础资料,用于保存样品必需的系统分类')
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
if (!formData.value.unitId) {
|
|
|
|
|
message.warning('请先维护库存单位,或为样品选择库存单位')
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const open = async (type: string, id?: number, defaultData?: Record<string, any>) => {
|
|
|
|
|
const currentOpenId = ++openRequestId
|
|
|
|
|
dialogTitle.value = t('action.' + type)
|
|
|
|
|
formType.value = type
|
|
|
|
|
isSampleMode.value = Boolean(defaultData?.sampleMode)
|
|
|
|
|
resetForm()
|
|
|
|
|
if (!id) {
|
|
|
|
|
if (defaultData) {
|
|
|
|
|
const initialData = { ...defaultData }
|
|
|
|
|
delete initialData.sampleMode
|
|
|
|
|
formData.value = {
|
|
|
|
|
...formData.value,
|
|
|
|
|
...defaultData
|
|
|
|
|
...initialData
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
const typeOptions = getIntDictOptions(DICT_TYPE.MATERIAL_CLASSIFICATION_TYPE)
|
|
|
|
|
@ -1024,12 +1077,15 @@ const open = async (type: string, id?: number, defaultData?: Record<string, any>
|
|
|
|
|
const categoryData = await ProductCategoryApi.getProductCategorySimpleList(formData.value.categoryType)
|
|
|
|
|
categoryList.value = handleTree(categoryData, 'id', 'parentId')
|
|
|
|
|
unitList.value = await ProductUnitApi.getProductUnitSimpleList()
|
|
|
|
|
// 加载包装方案列表
|
|
|
|
|
const schemeData = await PackagingSchemeApi.getPackagingSchemePage({ pageNo: 1, pageSize: 100, status: 0 })
|
|
|
|
|
packagingSchemeList.value = schemeData.list || []
|
|
|
|
|
// 加载供应商列表
|
|
|
|
|
const supplierData = await SupplierApi.getSupplierPage({ pageNo: 1, pageSize: 100, status: 0 })
|
|
|
|
|
supplierList.value = supplierData.list || []
|
|
|
|
|
applySampleDefaults()
|
|
|
|
|
if (!isSampleMode.value) {
|
|
|
|
|
// 加载包装方案列表
|
|
|
|
|
const schemeData = await PackagingSchemeApi.getPackagingSchemePage({ pageNo: 1, pageSize: 100, status: 0 })
|
|
|
|
|
packagingSchemeList.value = schemeData.list || []
|
|
|
|
|
// 加载供应商列表
|
|
|
|
|
const supplierData = await SupplierApi.getSupplierPage({ pageNo: 1, pageSize: 100, status: 0 })
|
|
|
|
|
supplierList.value = supplierData.list || []
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
defineExpose({ open })
|
|
|
|
|
@ -1126,6 +1182,7 @@ const normalizeDefaultStatus = (list: any[] | undefined, defaultId: number | und
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const submitForm = async () => {
|
|
|
|
|
if (!validateSampleDefaults()) return
|
|
|
|
|
await formRef.value.validate()
|
|
|
|
|
formLoading.value = true
|
|
|
|
|
try {
|
|
|
|
|
|