Commit ded1d9e8 by qinjianhui

fix: 备货订单数量填写优化

parent f25d0809
...@@ -54,6 +54,7 @@ declare module 'vue' { ...@@ -54,6 +54,7 @@ declare module 'vue' {
ElTag: typeof import('element-plus/es')['ElTag'] ElTag: typeof import('element-plus/es')['ElTag']
ElTimeline: typeof import('element-plus/es')['ElTimeline'] ElTimeline: typeof import('element-plus/es')['ElTimeline']
ElTimelineItem: typeof import('element-plus/es')['ElTimelineItem'] ElTimelineItem: typeof import('element-plus/es')['ElTimelineItem']
ElTimePicker: typeof import('element-plus/es')['ElTimePicker']
ElTooltip: typeof import('element-plus/es')['ElTooltip'] ElTooltip: typeof import('element-plus/es')['ElTooltip']
ElTree: typeof import('element-plus/es')['ElTree'] ElTree: typeof import('element-plus/es')['ElTree']
ElUpload: typeof import('element-plus/es')['ElUpload'] ElUpload: typeof import('element-plus/es')['ElUpload']
......
...@@ -329,15 +329,21 @@ const validateField = ( ...@@ -329,15 +329,21 @@ const validateField = (
if (!strValue) { if (!strValue) {
if (field === 'buyAmount') row._buyAmountError = '必填项' if (field === 'buyAmount') row._buyAmountError = '必填项'
else row._priceError = '必填项' else row._priceError = '必填项'
} else if (!/^\d+(\.\d+)?$/.test(strValue)) { } else if (field === 'buyAmount') {
if (field === 'buyAmount') row._buyAmountError = '请输入有效数字' // 备货数量只能输入正整数
else row._priceError = '请输入有效数字' if (!/^[1-9]\d*$/.test(strValue)) {
} else if (Number(strValue) === 0) { row._buyAmountError = '请输入正整数'
if (field === 'buyAmount') row._buyAmountError = `${fieldLabel}不能为0` } else {
else row._priceError = `${fieldLabel}不能为0` row._buyAmountError = ''
} else { }
if (field === 'buyAmount') row._buyAmountError = '' } else if (field === 'price') {
else row._priceError = '' if (!/^\d+(\.\d+)?$/.test(strValue)) {
row._priceError = '请输入有效数字'
} else if (Number(strValue) === 0) {
row._priceError = `${fieldLabel}不能为0`
} else {
row._priceError = ''
}
} }
} }
const validateDetailsList = (): boolean => { const validateDetailsList = (): boolean => {
......
...@@ -85,11 +85,12 @@ ...@@ -85,11 +85,12 @@
v-model="row.currentShipQuantity" v-model="row.currentShipQuantity"
clearable clearable
size="small" size="small"
type="number"
:min="0"
style="width: 100px" style="width: 100px"
@wheel.prevent @blur="validateField(row, 'currentShipQuantity')"
/> />
<div v-if="row._currentShipQuantityError" class="field-error">
{{ row._currentShipQuantityError }}
</div>
</template> </template>
</TableView> </TableView>
</div> </div>
...@@ -129,7 +130,7 @@ import { ...@@ -129,7 +130,7 @@ import {
import TableView from '@/components/TableView.vue' import TableView from '@/components/TableView.vue'
import { BigNumber } from 'bignumber.js' import { BigNumber } from 'bignumber.js'
defineProps<{ const props = defineProps<{
warehouseList: WarehouseListData[] warehouseList: WarehouseListData[]
}>() }>()
...@@ -258,6 +259,21 @@ const handleDeleteSelected = () => { ...@@ -258,6 +259,21 @@ const handleDeleteSelected = () => {
) )
selectedProducts.value = [] selectedProducts.value = []
} }
const validateDetailsList = (): boolean => {
if (!formData.value.detailsList?.length) {
return true
}
let isValid = true
formData.value.detailsList.forEach((row) => {
const extendedRow = row as StockingOrderProductWithError
validateField(extendedRow, 'currentShipQuantity')
if (extendedRow._currentShipQuantityError) {
isValid = false
}
})
return isValid
}
const handleDispatch = async () => { const handleDispatch = async () => {
if (!formRef.value) return if (!formRef.value) return
...@@ -273,11 +289,9 @@ const handleDispatch = async () => { ...@@ -273,11 +289,9 @@ const handleDispatch = async () => {
return return
} }
for (const item of formData.value.detailsList || []) { if (!validateDetailsList()) {
if (!item.currentShipQuantity) { ElMessage.warning('请检查本次发货数量是否正确填写')
ElMessage.warning('请填写本次发货数量') return
return
}
} }
const overQuantitySkus = (formData.value.detailsList || []) const overQuantitySkus = (formData.value.detailsList || [])
...@@ -314,11 +328,13 @@ const handleDispatch = async () => { ...@@ -314,11 +328,13 @@ const handleDispatch = async () => {
const { const {
stockingUpManageNo, stockingUpManageNo,
warehouseId, warehouseId,
warehouseName,
expectDeliveryTime, expectDeliveryTime,
currencyCode, currencyCode,
detailsList, detailsList,
} = formData.value } = formData.value
const warehouseName = props.warehouseList.find(
(item) => item.id === warehouseId,
)?.name
try { try {
const res = await supplierDispatchApi({ const res = await supplierDispatchApi({
manageId: currentRow.value?.id as number, manageId: currentRow.value?.id as number,
...@@ -389,6 +405,30 @@ const open = async (row: TableData) => { ...@@ -389,6 +405,30 @@ const open = async (row: TableData) => {
loading.close() loading.close()
} }
} }
type StockingOrderProductWithError = StockingOrderProduct & {
_currentShipQuantityError?: string
}
const validateField = (
row: StockingOrderProductWithError,
field: 'currentShipQuantity',
) => {
const value = row[field]
const strValue = value === 0 || value === '0' ? '0' : String(value ?? '')
const fieldLabel = '本次发货数量'
if (!strValue) {
if (field === 'currentShipQuantity')
row._currentShipQuantityError = '必填项'
} else if (!/^\d+$/.test(strValue)) {
if (field === 'currentShipQuantity')
row._currentShipQuantityError = '只能输入正整数'
} else if (Number(strValue) === 0) {
if (field === 'currentShipQuantity')
row._currentShipQuantityError = `${fieldLabel}不能为0`
} else {
if (field === 'currentShipQuantity') row._currentShipQuantityError = ''
}
}
defineExpose({ open }) defineExpose({ open })
</script> </script>
......
...@@ -163,7 +163,7 @@ ...@@ -163,7 +163,7 @@
> >
</span> </span>
<span class="item"> <span v-if="status !== 'COMPLETED' && status !== 'CANCELLED'" class="item">
<ElButton type="success" @click="addInternalTag" <ElButton type="success" @click="addInternalTag"
>添加内部便签</ElButton >添加内部便签</ElButton
> >
...@@ -321,7 +321,7 @@ const tableColumns = computed(() => { ...@@ -321,7 +321,7 @@ const tableColumns = computed(() => {
return <ElTag type="success">备货中</ElTag> return <ElTag type="success">备货中</ElTag>
} }
if (row.status === 'COMPLETED') { if (row.status === 'COMPLETED') {
return <ElTag type="success">完成</ElTag> return <ElTag type="success">备货完成</ElTag>
} }
if (row.status === 'CANCELLED') { if (row.status === 'CANCELLED') {
return <ElTag type="danger">已取消</ElTag> return <ElTag type="danger">已取消</ElTag>
...@@ -664,7 +664,7 @@ const handleSubmitAudit = async () => { ...@@ -664,7 +664,7 @@ const handleSubmitAudit = async () => {
return ElMessage.warning('请选择要操作的数据') return ElMessage.warning('请选择要操作的数据')
} }
try { try {
await ElMessageBox.confirm('确定要提交审核吗?', '提示', { await ElMessageBox.confirm('确定将选中的订单提交至审核?', '提示', {
confirmButtonText: '确定', confirmButtonText: '确定',
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning', type: 'warning',
...@@ -689,7 +689,7 @@ const handleDeleteOrder = async () => { ...@@ -689,7 +689,7 @@ const handleDeleteOrder = async () => {
return ElMessage.warning('请选择一条数据') return ElMessage.warning('请选择一条数据')
} }
try { try {
await ElMessageBox.confirm('确定要删除选中的数据吗?', '提示', { await ElMessageBox.confirm('确定删除选中的订单??', '提示', {
confirmButtonText: '确定', confirmButtonText: '确定',
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning', type: 'warning',
......
...@@ -64,7 +64,11 @@ ...@@ -64,7 +64,11 @@
clearable clearable
size="small" size="small"
style="width: 70px" style="width: 70px"
@blur="validateField(row, 'buyStored')"
/> />
<div v-if="row._buyStoredError" class="field-error">
{{ row._buyStoredError }}
</div>
</template> </template>
<template #rejectsAmount="{ row }"> <template #rejectsAmount="{ row }">
<ElInput <ElInput
...@@ -72,7 +76,11 @@ ...@@ -72,7 +76,11 @@
clearable clearable
size="small" size="small"
style="width: 70px" style="width: 70px"
@blur="validateField(row, 'rejectsAmount')"
/> />
<div v-if="row._rejectsAmountError" class="field-error">
{{ row._rejectsAmountError }}
</div>
</template> </template>
<template #locationName="{ row }"> <template #locationName="{ row }">
<ElSelect <ElSelect
...@@ -144,6 +152,10 @@ const formData = ref<StockingApplyOrderDetailData>({ ...@@ -144,6 +152,10 @@ const formData = ref<StockingApplyOrderDetailData>({
checkerUserId: undefined, checkerUserId: undefined,
remark: '', remark: '',
}) })
type StockingApplyOrderDetailListWithError = StockingApplyOrderDetailList & {
_buyStoredError?: string
_rejectsAmountError?: string
}
const tableColumns = ref([ const tableColumns = ref([
{ {
label: 'SKU图片', label: 'SKU图片',
...@@ -349,6 +361,45 @@ const batchSetBuyStored = () => { ...@@ -349,6 +361,45 @@ const batchSetBuyStored = () => {
}) })
} }
const validateField = (
row: StockingApplyOrderDetailListWithError,
field: 'buyStored' | 'rejectsAmount',
) => {
const value = row[field]
const strValue = value === 0 || value === '0' ? '0' : String(value ?? '')
const fieldLabel = field === 'buyStored' ? '入库数量' : '不良品数'
if (!strValue) {
if (field === 'buyStored') row._buyStoredError = '必填项'
} else if (!/^\d+$/.test(strValue)) {
if (field === 'buyStored') row._buyStoredError = '只能输入正整数'
else if (field === 'rejectsAmount')
row._rejectsAmountError = '只能输入正整数'
} else if (Number(strValue) === 0) {
if (field === 'buyStored') row._buyStoredError = `${fieldLabel}不能为0`
else if (field === 'rejectsAmount') row._rejectsAmountError = ''
} else {
if (field === 'buyStored') row._buyStoredError = ''
else row._rejectsAmountError = ''
}
}
const validateDetailsList = (): boolean => {
if (!formData.value.detailsList?.length) {
return true
}
let isValid = true
formData.value.detailsList.forEach((row) => {
const extendedRow = row as StockingApplyOrderDetailListWithError
validateField(extendedRow, 'buyStored')
validateField(extendedRow, 'rejectsAmount')
if (extendedRow._buyStoredError || extendedRow._rejectsAmountError) {
isValid = false
}
})
return isValid
}
const handleSubmit = async () => { const handleSubmit = async () => {
if (!formRef.value) return if (!formRef.value) return
try { try {
...@@ -356,14 +407,14 @@ const handleSubmit = async () => { ...@@ -356,14 +407,14 @@ const handleSubmit = async () => {
} catch { } catch {
return return
} }
if (!validateDetailsList()) {
ElMessage.warning('请检查入库数量和不良品数是否正确填写')
return
}
const overQuantitySkus = []
for (const item of formData.value.detailsList) { for (const item of formData.value.detailsList) {
if (!item.buyStored) {
ElMessage.error(`库存SKU:${item.warehouseSku}入库数量不能为空`)
return
}
if (Number(item.buyStored) > Number(item.shipmentQuantity)) { if (Number(item.buyStored) > Number(item.shipmentQuantity)) {
ElMessage.error(`库存SKU:${item.warehouseSku}入库数量不能大于申请数量`) overQuantitySkus.push(item.warehouseSku)
return
} }
const locationCode = allLocationList.value.find( const locationCode = allLocationList.value.find(
(location: loactionData) => location.id === Number(item.locationId), (location: loactionData) => location.id === Number(item.locationId),
...@@ -375,6 +426,21 @@ const handleSubmit = async () => { ...@@ -375,6 +426,21 @@ const handleSubmit = async () => {
.plus(rejectsAmount) .plus(rejectsAmount)
.toNumber() .toNumber()
} }
if (overQuantitySkus.length > 0) {
ElMessageBox.alert(
`<div style="line-height: 1.6;"><span style="white-space: nowrap; flex-shrink: 0;">库存SKU:</span><span style="word-break: break-all; margin-left: 4px;">${overQuantitySkus.join(
',',
)}</span><span style="margin-top: 12px;">入库数量不能大于申请数量</span></div>`,
'提示',
{
confirmButtonText: '确定',
type: 'warning',
customClass: 'over-quantity-alert-box',
dangerouslyUseHTMLString: true,
},
)
return
}
const checkerName = userList.value.find( const checkerName = userList.value.find(
(item) => item.id === formData.value.checkerUserId, (item) => item.id === formData.value.checkerUserId,
)?.account )?.account
...@@ -396,6 +462,7 @@ const handleSubmit = async () => { ...@@ -396,6 +462,7 @@ const handleSubmit = async () => {
loading.close() loading.close()
} }
} }
defineExpose({ open }) defineExpose({ open })
</script> </script>
...@@ -439,4 +506,23 @@ defineExpose({ open }) ...@@ -439,4 +506,23 @@ defineExpose({ open })
.dialog-footer { .dialog-footer {
text-align: center; text-align: center;
} }
.field-error {
color: #f56c6c;
font-size: 12px;
line-height: 1;
margin-top: 2px;
text-align: center;
}
</style>
<style>
.over-quantity-alert-box {
width: 1000px !important;
max-width: 90vw !important;
}
.over-quantity-alert-box .el-message-box__message {
word-break: break-all;
line-height: 1.6;
padding: 10px 0;
}
</style> </style>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment