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

main
黄伟杰 3 weeks ago
parent 8e4a018324
commit ec25a0bd96

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

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

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

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

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

@ -179,7 +179,7 @@
</el-col> </el-col>
<el-col v-if="formData.categoryType === 2 || formData.categoryType === 3" :span="12"> <el-col v-if="formData.categoryType === 2 || formData.categoryType === 3" :span="12">
<el-form-item :label="t('FactoryModeling.ProductInformation.dialogPurchaseUnitConvertLabel')" prop="purchaseUnitConvertQuantity"> <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> <div class="form-item-tip">{{ purchaseUnitConvertTipText }}</div>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -675,6 +675,23 @@ const validateSuppliers = (_rule, value, callback) => {
} }
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 packagingSchemeDialogVisible = ref(false)
const packagingSchemeDialogLoading = ref(false) const packagingSchemeDialogLoading = ref(false)
@ -908,7 +925,7 @@ const formRules = reactive({
packagingSchemes: [{ required: true, validator: validatePackagingSchemes, trigger: ['change', 'blur'] }], packagingSchemes: [{ required: true, validator: validatePackagingSchemes, trigger: ['change', 'blur'] }],
suppliers: [{ required: true, validator: validateSuppliers, trigger: ['change', 'blur'] }], suppliers: [{ required: true, validator: validateSuppliers, trigger: ['change', 'blur'] }],
purchaseUnitId: [{ required: true, message: t('FactoryModeling.ProductInformation.validatorPurchaseUnitRequired'), trigger: 'change' }], 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 formRef = ref()
const categoryList = ref<ProductCategoryVO[]>([]) const categoryList = ref<ProductCategoryVO[]>([])
@ -919,7 +936,7 @@ const purchaseUnitConvertTipText = computed(() => {
const qty = formData.value.purchaseUnitConvertQuantity const qty = formData.value.purchaseUnitConvertQuantity
const base = t('FactoryModeling.ProductInformation.dialogPurchaseUnitConvertTip') const base = t('FactoryModeling.ProductInformation.dialogPurchaseUnitConvertTip')
if (!inventoryUnitName || !purchaseUnitName || !qty) return base if (!inventoryUnitName || !purchaseUnitName || !qty) return base
return `${base}${inventoryUnitName} = ${qty} × ${purchaseUnitName}` return `${base}1 ${purchaseUnitName} = ${qty} ${inventoryUnitName}`
}) })
const packagingSchemeList = ref<any[]>([]) const packagingSchemeList = ref<any[]>([])
const supplierList = ref<any[]>([]) const supplierList = ref<any[]>([])

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

@ -328,7 +328,11 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="t('ErpStock.Check.materialSubCategory')" prop="subCategoryName" min-width="120" /> <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-column :label="t('ErpStock.Check.standard')" prop="standard" min-width="120" show-overflow-tooltip />
</el-table> </el-table>
<div class="stock-check-dialog-pagination"> <div class="stock-check-dialog-pagination">

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

@ -149,7 +149,7 @@
</el-form-item> </el-form-item>
</template> </template>
</el-table-column> </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 }"> <template #default="{ row, $index }">
<el-form-item :prop="`${$index}.packageCount`" :rules="formRules.packageCount" class="mb-0px!"> <el-form-item :prop="`${$index}.packageCount`" :rules="formRules.packageCount" class="mb-0px!">
<el-input v-if="disabled" :model-value="row.packageCount ?? '-'" readonly /> <el-input v-if="disabled" :model-value="row.packageCount ?? '-'" readonly />
@ -157,7 +157,7 @@
</el-form-item> </el-form-item>
</template> </template>
</el-table-column> </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 }"> <template #default="{ row, $index }">
<el-form-item :prop="`${$index}.count`" :rules="formRules.count" class="mb-0px!"> <el-form-item :prop="`${$index}.count`" :rules="formRules.count" class="mb-0px!">
<el-input v-if="disabled || isPurchaseUnitStockIn" :model-value="row.count ?? '-'" readonly /> <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.taskOrder')}/${t('ErpStock.Item.selectProduct')}`
: 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 productDialogVisible = ref(false)
const productDialogLoading = ref(false) const productDialogLoading = ref(false)
const productDialogList = ref<any[]>([]) const productDialogList = ref<any[]>([])

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

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

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

Loading…
Cancel
Save