style:采购单位/库存单位字段调整

main
黄伟杰 1 week ago
parent 8e4a018324
commit ec25a0bd96

@ -38,6 +38,7 @@ export interface StockCheckItemVO {
productName: string // 产品名称
productBarCode: string // 产品条码
productUnitName: string // 产品单位名称
purchaseUnitName?: string // 采购单位名称
}
export interface StockCheckRecordVO {
@ -56,6 +57,7 @@ export interface StockCheckRecordVO {
barCode?: string
standard?: string
productUnitName?: string
purchaseUnitName?: string
unitName?: string
warehouseId?: number
warehouseName?: string

@ -21,6 +21,7 @@ export interface StockRecordVO {
productName: string
categoryName: string
unitName: string
purchaseUnitName?: string
warehouseName: string
creatorName: string
recordTime?: string

@ -11,6 +11,7 @@ export interface StockVO {
barCode?: string
categoryName?: string
unitName?: string
purchaseUnitName?: string
// 产品分类类型
categoryType?: number
// 仓库编号

@ -476,8 +476,8 @@ export default {
packagingRule: 'Packaging / Conversion Rule',
stockDisplay: 'Stock Display',
areaStockDisplay: 'Area Stock',
totalPackageCount: 'Total Packages',
totalBaseCount: 'Total Base Count',
totalPackageCount: 'Total',
totalBaseCount: 'Base Quantity',
unit: 'Unit',
count: 'Base Quantity',
latestInTime: 'Latest Inbound',
@ -642,6 +642,7 @@ export default {
outPackageCount: 'Outbound Package Count',
inPackageCount: 'Inbound Package Count',
inItemCount: 'Inbound Count',
inCount: 'Inbound Quantity',
outCount: 'Outbound Count',
packageCountWithItems: 'Package Count ({count} per package)',
itemCount: 'Item Count',
@ -2492,6 +2493,7 @@ export default {
validatorSupplierRequired: 'Supplier is required',
validatorPurchaseUnitRequired: 'Purchase unit is required',
validatorPurchaseUnitConvertRequired: 'Purchase conversion quantity is required',
validatorPurchaseUnitConvertPositive: 'Purchase conversion quantity must be greater than 0',
dialogFragileFlagLabel: 'Fragile',
dialogSparePartLevelLabel: 'Spare Part Level',
dialogPurchaseCycleLabel: 'Purchase Cycle (Days)',
@ -2499,7 +2501,7 @@ export default {
dialogBrandPlaceholder: 'Please enter brand',
dialogPurchaseUnitLabel: 'Purchase Unit',
dialogPurchaseUnitConvertLabel: 'Purchase Conversion Qty',
dialogPurchaseUnitConvertTip: 'Inventory Unit = Conversion Qty × Purchase Unit',
dialogPurchaseUnitConvertTip: '1 Purchase Unit = N Inventory Units',
images: 'Image',
categoryTree: 'Material Category',
addCategory: 'Add Category',

@ -476,8 +476,8 @@ export default {
packagingRule: '包装/换算规则',
stockDisplay: '库存展示',
areaStockDisplay: '库区库存',
totalPackageCount: '总数',
totalBaseCount: '总个数',
totalPackageCount: '总数',
totalBaseCount: '基本数量',
unit: '单位',
count: '基本数量',
latestInTime: '最近入库',
@ -642,6 +642,7 @@ export default {
outPackageCount: '出库包数',
inPackageCount: '入库包数',
inItemCount: '入库个数',
inCount: '入库数量',
outCount: '出库个数',
packageCountWithItems: '包数(每包{count}个)',
itemCount: '个数',
@ -3727,6 +3728,7 @@ export default {
validatorSupplierRequired: '供应商不能为空',
validatorPurchaseUnitRequired: '采购单位不能为空',
validatorPurchaseUnitConvertRequired: '采购换算数量不能为空',
validatorPurchaseUnitConvertPositive: '采购换算数量必须大于 0',
dialogFragileFlagLabel: '是否易损件',
dialogSparePartLevelLabel: '备件等级',
dialogPurchaseCycleLabel: '采购周期(天)',
@ -3734,7 +3736,7 @@ export default {
dialogBrandPlaceholder: '请输入品牌',
dialogPurchaseUnitLabel: '采购单位',
dialogPurchaseUnitConvertLabel: '采购换算数量',
dialogPurchaseUnitConvertTip: '库存单位 = 换算数量 × 采购单位',
dialogPurchaseUnitConvertTip: '1 采购单位 = N 库存单位',
images: '图片',
categoryTree: '物料分类',
addCategory: '新增分类',

@ -179,7 +179,7 @@
</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" />
<el-input-number v-model="formData.purchaseUnitConvertQuantity" :min="0" :step="0.01" class="!w-1/1" />
<div class="form-item-tip">{{ purchaseUnitConvertTipText }}</div>
</el-form-item>
</el-col>
@ -675,6 +675,23 @@ const validateSuppliers = (_rule, value, callback) => {
}
callback()
}
const validatePurchaseUnitConvertQuantity = (_rule, value, callback) => {
if (formData.value.categoryType !== 2 && formData.value.categoryType !== 3) {
callback()
return
}
if (value === undefined || value === null || value === '') {
callback(new Error(t('FactoryModeling.ProductInformation.validatorPurchaseUnitConvertRequired')))
return
}
const quantity = Number(value)
if (!Number.isFinite(quantity) || quantity <= 0) {
callback(new Error(t('FactoryModeling.ProductInformation.validatorPurchaseUnitConvertPositive')))
return
}
callback()
}
//
const packagingSchemeDialogVisible = ref(false)
const packagingSchemeDialogLoading = ref(false)
@ -908,7 +925,7 @@ const formRules = reactive({
packagingSchemes: [{ required: true, validator: validatePackagingSchemes, trigger: ['change', 'blur'] }],
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' }]
purchaseUnitConvertQuantity: [{ required: true, validator: validatePurchaseUnitConvertQuantity, trigger: ['blur', 'change'] }]
})
const formRef = ref()
const categoryList = ref<ProductCategoryVO[]>([])
@ -919,7 +936,7 @@ const purchaseUnitConvertTipText = computed(() => {
const qty = formData.value.purchaseUnitConvertQuantity
const base = t('FactoryModeling.ProductInformation.dialogPurchaseUnitConvertTip')
if (!inventoryUnitName || !purchaseUnitName || !qty) return base
return `${base}${inventoryUnitName} = ${qty} × ${purchaseUnitName}`
return `${base}1 ${purchaseUnitName} = ${qty} ${inventoryUnitName}`
})
const packagingSchemeList = ref<any[]>([])
const supplierList = ref<any[]>([])

@ -571,7 +571,7 @@ const formatPurchaseUnitConvert = (detail: any) => {
if (!detail?.purchaseUnitConvertQuantity) return '-'
const unitName = detail.unitName || ''
const purchaseUnitName = detail.purchaseUnitName || ''
return `${unitName} = ${detail.purchaseUnitConvertQuantity} × ${purchaseUnitName}`
return `1 ${purchaseUnitName} = ${detail.purchaseUnitConvertQuantity} ${unitName}`
}
const sparePartLevelDict = computed(() => getIntDictOptions(DICT_TYPE.SPARE_PARTS_LEVEL))

@ -328,7 +328,11 @@
</template>
</el-table-column>
<el-table-column :label="t('ErpStock.Check.materialSubCategory')" prop="subCategoryName" min-width="120" />
<el-table-column :label="t('ErpStock.Item.unit')" prop="unitName" align="center" min-width="80" />
<el-table-column :label="t('ErpStock.Item.unit')" prop="purchaseUnitName" align="center" min-width="80">
<template #default="{ row }">
{{ row.purchaseUnitName || row.unitName || '-' }}
</template>
</el-table-column>
<el-table-column :label="t('ErpStock.Check.standard')" prop="standard" min-width="120" show-overflow-tooltip />
</el-table>
<div class="stock-check-dialog-pagination">

@ -368,7 +368,7 @@ const getSourceTypeLabel = (value: number | string | undefined) => {
}
const getUnitName = (row: StockCheckRecordVO) => {
return row.productUnitName || row.unitName || ''
return row.purchaseUnitName || row.unitName || row.productUnitName || ''
}
const formatNumber = (value: number | string | undefined) => {

@ -149,7 +149,7 @@
</el-form-item>
</template>
</el-table-column>
<el-table-column v-if="isPurchaseUnitStockIn" :label="t('ErpStock.Item.inPackageCount')" prop="packageCount" min-width="140">
<el-table-column v-if="isPurchaseUnitStockIn" :label="inPackageCountLabel" prop="packageCount" min-width="140">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.packageCount`" :rules="formRules.packageCount" class="mb-0px!">
<el-input v-if="disabled" :model-value="row.packageCount ?? '-'" readonly />
@ -157,7 +157,7 @@
</el-form-item>
</template>
</el-table-column>
<el-table-column v-if="!isProductStockIn" :label="isPurchaseUnitStockIn ? t('ErpStock.Item.inItemCount') : t('ErpStock.Item.count')" prop="count" min-width="140">
<el-table-column v-if="!isProductStockIn" :label="isPurchaseUnitStockIn ? inItemCountLabel : t('ErpStock.Item.count')" prop="count" min-width="140">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.count`" :rules="formRules.count" class="mb-0px!">
<el-input v-if="disabled || isPurchaseUnitStockIn" :model-value="row.count ?? '-'" readonly />
@ -609,6 +609,17 @@ const selectorColumnLabel = computed(() => {
? `${t('ErpStock.Item.taskOrder')}/${t('ErpStock.Item.selectProduct')}`
: t('ErpStock.Item.selectProduct')
})
const getFirstUnitName = (keys: string[]) => {
const row = (formData.value || []).find((item) => keys.some((key) => item?.[key]))
const key = keys.find((itemKey) => row?.[itemKey])
return key ? row?.[key] : undefined
}
const formatInboundQuantityLabel = (unitName?: string) => {
const base = t('ErpStock.Item.inCount')
return unitName ? `${base}${unitName}` : base
}
const inPackageCountLabel = computed(() => formatInboundQuantityLabel(getFirstUnitName(['productUnitName', 'unitName'])))
const inItemCountLabel = computed(() => formatInboundQuantityLabel(getFirstUnitName(['purchaseUnitName'])))
const productDialogVisible = ref(false)
const productDialogLoading = ref(false)
const productDialogList = ref<any[]>([])

@ -87,7 +87,7 @@
<el-table-column label="单位" min-width="80">
<template #default="{ row }">
<el-form-item class="mb-0px!">
<el-input disabled v-model="row.productUnitName" />
<el-input disabled :model-value="getRowUnitName(row)" />
</el-form-item>
</template>
</el-table-column>
@ -287,6 +287,7 @@ const categoryTypeLabel = computed(() => {
const productColumnLabel = computed(() => categoryTypeLabel.value)
const productPlaceholder = computed(() => `请选择${productColumnLabel.value}`)
const productSelectTitle = computed(() => `选择${productColumnLabel.value}`)
const getRowUnitName = (row) => row.purchaseUnitName || row.unitName || row.productUnitName || '-'
watch(
() => props.items,
@ -343,6 +344,8 @@ function handleAdd() {
productId: undefined,
productName: undefined,
productUnitName: undefined,
purchaseUnitName: undefined,
unitName: undefined,
productBarCode: undefined,
stockCount: undefined,
productStockList: [],
@ -518,6 +521,8 @@ function fillRowByProduct(row, product) {
row.productId = product.id
row.productName = product.name
row.productUnitName = product.unitName
row.purchaseUnitName = product.purchaseUnitName
row.unitName = product.unitName
row.productBarCode = product.barCode
row.fromWarehouseId = undefined
row.fromAreaId = undefined
@ -532,6 +537,8 @@ function clearRowSelection(row) {
row.productId = undefined
row.productName = undefined
row.productUnitName = undefined
row.purchaseUnitName = undefined
row.unitName = undefined
row.productBarCode = undefined
row.stockCount = undefined
row.productStockList = []

@ -188,7 +188,8 @@ const formatNumber = (value: number | string | undefined) => {
const formatCountWithUnit = (row: StockRecordVO, withDirectionSign = false) => {
const value = withDirectionSign ? row.count : row.totalCount
const unit = row.unitName ? ` ${row.unitName}` : ''
const unitName = row.purchaseUnitName || row.unitName
const unit = unitName ? ` ${unitName}` : ''
if (value === undefined || value === null) return `-${unit}`
if (!withDirectionSign) return `${formatNumber(value)}${unit}`

@ -148,7 +148,11 @@
{{ formatStockCount(row.count) }}
</template>
</el-table-column> -->
<el-table-column :label="t('ErpStock.Stock.unit')" align="center" prop="unitName" min-width="90" sortable />
<el-table-column :label="t('ErpStock.Stock.unit')" align="center" prop="purchaseUnitName" min-width="90" sortable>
<template #default="{ row }">
{{ row.purchaseUnitName || row.unitName || '-' }}
</template>
</el-table-column>
<el-table-column :label="t('ErpStock.Stock.latestInTime')" align="center" min-width="180">
<template #default="{ row }">
{{ formatStockTime(getLatestInTime(row)) }}

Loading…
Cancel
Save