feat:物料档案-添加采购单位/采购换算数量字段

besure_bit
黄伟杰 2 weeks ago
parent d9921dcfc0
commit 166bb32c3d

@ -66,7 +66,7 @@
<el-form-item :label="t('FactoryModeling.ProductInformation.dialogUnitLabel')" prop="unitId"> <el-form-item :label="t('FactoryModeling.ProductInformation.dialogUnitLabel')" prop="unitId">
<el-select v-model="formData.unitId" clearable :placeholder="t('FactoryModeling.ProductInformation.dialogUnitPlaceholder')" class="w-1/1"> <el-select v-model="formData.unitId" clearable :placeholder="t('FactoryModeling.ProductInformation.dialogUnitPlaceholder')" class="w-1/1">
<el-option <el-option
v-for="unit in unitList" v-for="unit in inventoryUnitOptions"
:key="unit.id" :key="unit.id"
:label="unit.name" :label="unit.name"
:value="unit.id" :value="unit.id"
@ -165,6 +165,24 @@
<el-input v-model="formData.brand" :placeholder="t('FactoryModeling.ProductInformation.dialogBrandPlaceholder')" /> <el-input v-model="formData.brand" :placeholder="t('FactoryModeling.ProductInformation.dialogBrandPlaceholder')" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col v-if="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
v-for="unit in purchaseUnitOptions"
:key="unit.id"
:label="unit.name"
:value="unit.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col v-if="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>
</el-form-item>
</el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item :label="t('FactoryModeling.ProductInformation.dialogStatusLabel')" prop="status"> <el-form-item :label="t('FactoryModeling.ProductInformation.dialogStatusLabel')" prop="status">
<el-radio-group v-model="formData.status"> <el-radio-group v-model="formData.status">
@ -458,7 +476,10 @@ const formData = ref({
purchaseCycle: undefined as number | undefined, purchaseCycle: undefined as number | undefined,
brand: undefined as string | undefined, brand: undefined as string | undefined,
images: undefined as string | undefined, images: undefined as string | undefined,
sparePartLevel: undefined as number | undefined sparePartLevel: undefined as number | undefined,
purchaseUnitId: undefined as string | undefined,
purchaseUnitName: undefined as string | undefined,
purchaseUnitConvertQuantity: undefined as number | undefined
}) })
const selectedDeviceRows = ref<any[]>([]) const selectedDeviceRows = ref<any[]>([])
const selectedMoldRows = ref<any[]>([]) const selectedMoldRows = ref<any[]>([])
@ -884,12 +905,30 @@ const formRules = reactive({
categoryId: [{ required: true, message: t('FactoryModeling.ProductInformation.validatorCategoryRequired'), trigger: 'blur' }], categoryId: [{ required: true, message: t('FactoryModeling.ProductInformation.validatorCategoryRequired'), trigger: 'blur' }],
unitId: [{ required: true, message: t('FactoryModeling.ProductInformation.validatorUnitRequired'), trigger: 'blur' }], unitId: [{ required: true, message: t('FactoryModeling.ProductInformation.validatorUnitRequired'), trigger: 'blur' }],
status: [{ required: true, message: t('FactoryModeling.ProductInformation.validatorStatusRequired'), trigger: 'blur' }], status: [{ required: true, message: t('FactoryModeling.ProductInformation.validatorStatusRequired'), trigger: 'blur' }],
packagingSchemes: [{ validator: validatePackagingSchemes, trigger: 'change' }], packagingSchemes: [{ required: true, validator: validatePackagingSchemes, trigger: ['change', 'blur'] }],
suppliers: [{ validator: validateSuppliers, trigger: 'change' }] suppliers: [{ required: true, validator: validateSuppliers, trigger: ['change', 'blur'] }],
purchaseUnitId: [{ required: true, message: t('FactoryModeling.ProductInformation.validatorPurchaseUnitRequired'), trigger: 'change' }],
purchaseUnitConvertQuantity: [{ required: true, message: t('FactoryModeling.ProductInformation.validatorPurchaseUnitConvertRequired'), trigger: 'blur' }]
}) })
const formRef = ref() const formRef = ref()
const categoryList = ref<ProductCategoryVO[]>([]) const categoryList = ref<ProductCategoryVO[]>([])
const unitList = ref<ProductUnitVO[]>([]) const unitList = ref<ProductUnitVO[]>([])
const inventoryUnitOptions = computed(() => {
if (!formData.value.purchaseUnitId) return unitList.value
return unitList.value.filter((u: any) => u.id !== formData.value.purchaseUnitId)
})
const purchaseUnitOptions = computed(() => {
if (!formData.value.unitId) return unitList.value
return unitList.value.filter((u: any) => u.id !== formData.value.unitId)
})
const purchaseUnitConvertTipText = computed(() => {
const inventoryUnitName = unitList.value.find((u: any) => u.id === formData.value.unitId)?.name
const purchaseUnitName = unitList.value.find((u: any) => u.id === formData.value.purchaseUnitId)?.name
const qty = formData.value.purchaseUnitConvertQuantity
const base = t('FactoryModeling.ProductInformation.dialogPurchaseUnitConvertTip')
if (!inventoryUnitName || !purchaseUnitName || !qty) return base
return `${base}${inventoryUnitName} = ${qty} × ${purchaseUnitName}`
})
const packagingSchemeList = ref<any[]>([]) const packagingSchemeList = ref<any[]>([])
const supplierList = ref<any[]>([]) const supplierList = ref<any[]>([])
@ -981,10 +1020,22 @@ const handleCategoryTypeChange = async () => {
formData.value.purchaseCycle = undefined formData.value.purchaseCycle = undefined
formData.value.brand = undefined formData.value.brand = undefined
formData.value.sparePartLevel = undefined formData.value.sparePartLevel = undefined
formData.value.purchaseUnitId = undefined
formData.value.purchaseUnitName = undefined
formData.value.purchaseUnitConvertQuantity = undefined
const categoryData = await ProductCategoryApi.getProductCategorySimpleList(formData.value.categoryType) const categoryData = await ProductCategoryApi.getProductCategorySimpleList(formData.value.categoryType)
categoryList.value = handleTree(categoryData, 'id', 'parentId') categoryList.value = handleTree(categoryData, 'id', 'parentId')
} }
const handlePurchaseUnitChange = (val: any) => {
if (!val) {
formData.value.purchaseUnitName = undefined
return
}
const unit = unitList.value.find((u: any) => u.id === val)
formData.value.purchaseUnitName = unit?.name ?? undefined
}
const getQrcodeRefreshUrl = () => { const getQrcodeRefreshUrl = () => {
if (!formData.value.id || !formData.value.barCode) return '' if (!formData.value.id || !formData.value.barCode) return ''
return `/erp/product/regenerate-code?id=${formData.value.id}&code=${encodeURIComponent(String(formData.value.barCode))}` return `/erp/product/regenerate-code?id=${formData.value.id}&code=${encodeURIComponent(String(formData.value.barCode))}`
@ -1088,7 +1139,10 @@ const resetForm = () => {
fragileFlag: undefined, fragileFlag: undefined,
purchaseCycle: undefined, purchaseCycle: undefined,
brand: undefined, brand: undefined,
sparePartLevel: undefined sparePartLevel: undefined,
purchaseUnitId: undefined,
purchaseUnitName: undefined,
purchaseUnitConvertQuantity: undefined
} }
selectedDeviceRows.value = [] selectedDeviceRows.value = []
selectedMoldRows.value = [] selectedMoldRows.value = []
@ -1170,4 +1224,11 @@ watch(
padding: 16px; padding: 16px;
} }
} }
.form-item-tip {
font-size: 12px;
color: var(--el-text-color-placeholder);
line-height: 1.4;
margin-top: 4px;
}
</style> </style>

@ -195,6 +195,14 @@
</template> </template>
<!-- 物料/备件类型供应商 --> <!-- 物料/备件类型供应商 -->
<template v-if="productDetail.categoryType === 2 || productDetail.categoryType === 3"> <template v-if="productDetail.categoryType === 2 || productDetail.categoryType === 3">
<div class="detail-field">
<span class="field-label">{{ t('FactoryModeling.ProductInformation.dialogPurchaseUnitLabel') }}</span>
<span class="field-value">{{ formatValue(productDetail.purchaseUnitName) }}</span>
</div>
<div class="detail-field">
<span class="field-label">{{ t('FactoryModeling.ProductInformation.dialogPurchaseUnitConvertLabel') }}</span>
<span class="field-value">{{ formatPurchaseUnitConvert(productDetail) }}</span>
</div>
<div class="detail-field"> <div class="detail-field">
<span class="field-label">{{ t('FactoryModeling.ProductInformation.dialogSupplierLabel') }}</span> <span class="field-label">{{ t('FactoryModeling.ProductInformation.dialogSupplierLabel') }}</span>
<span class="field-value">{{ formatSupplierText(productDetail) }}</span> <span class="field-value">{{ formatSupplierText(productDetail) }}</span>
@ -559,6 +567,13 @@ const formatSparePartLevel = (value: any) => {
return dictItem?.label || formatValue(value) return dictItem?.label || formatValue(value)
} }
const formatPurchaseUnitConvert = (detail: any) => {
if (!detail?.purchaseUnitConvertQuantity) return '-'
const unitName = detail.unitName || ''
const purchaseUnitName = detail.purchaseUnitName || ''
return `${unitName} = ${detail.purchaseUnitConvertQuantity} × ${purchaseUnitName}`
}
const sparePartLevelDict = computed(() => getIntDictOptions(DICT_TYPE.SPARE_PARTS_LEVEL)) const sparePartLevelDict = computed(() => getIntDictOptions(DICT_TYPE.SPARE_PARTS_LEVEL))
const formatValue = (value: any) => { const formatValue = (value: any) => {

Loading…
Cancel
Save