Commit ded1d9e8 by qinjianhui

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

parent f25d0809
......@@ -54,6 +54,7 @@ declare module 'vue' {
ElTag: typeof import('element-plus/es')['ElTag']
ElTimeline: typeof import('element-plus/es')['ElTimeline']
ElTimelineItem: typeof import('element-plus/es')['ElTimelineItem']
ElTimePicker: typeof import('element-plus/es')['ElTimePicker']
ElTooltip: typeof import('element-plus/es')['ElTooltip']
ElTree: typeof import('element-plus/es')['ElTree']
ElUpload: typeof import('element-plus/es')['ElUpload']
......
......@@ -329,15 +329,21 @@ const validateField = (
if (!strValue) {
if (field === 'buyAmount') row._buyAmountError = '必填项'
else row._priceError = '必填项'
} else if (!/^\d+(\.\d+)?$/.test(strValue)) {
if (field === 'buyAmount') row._buyAmountError = '请输入有效数字'
else row._priceError = '请输入有效数字'
} else if (field === 'buyAmount') {
// 备货数量只能输入正整数
if (!/^[1-9]\d*$/.test(strValue)) {
row._buyAmountError = '请输入正整数'
} else {
row._buyAmountError = ''
}
} else if (field === 'price') {
if (!/^\d+(\.\d+)?$/.test(strValue)) {
row._priceError = '请输入有效数字'
} else if (Number(strValue) === 0) {
if (field === 'buyAmount') row._buyAmountError = `${fieldLabel}不能为0`
else row._priceError = `${fieldLabel}不能为0`
row._priceError = `${fieldLabel}不能为0`
} else {
if (field === 'buyAmount') row._buyAmountError = ''
else row._priceError = ''
row._priceError = ''
}
}
}
const validateDetailsList = (): boolean => {
......
......@@ -85,11 +85,12 @@
v-model="row.currentShipQuantity"
clearable
size="small"
type="number"
:min="0"
style="width: 100px"
@wheel.prevent
@blur="validateField(row, 'currentShipQuantity')"
/>
<div v-if="row._currentShipQuantityError" class="field-error">
{{ row._currentShipQuantityError }}
</div>
</template>
</TableView>
</div>
......@@ -129,7 +130,7 @@ import {
import TableView from '@/components/TableView.vue'
import { BigNumber } from 'bignumber.js'
defineProps<{
const props = defineProps<{
warehouseList: WarehouseListData[]
}>()
......@@ -258,6 +259,21 @@ const handleDeleteSelected = () => {
)
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 () => {
if (!formRef.value) return
......@@ -273,12 +289,10 @@ const handleDispatch = async () => {
return
}
for (const item of formData.value.detailsList || []) {
if (!item.currentShipQuantity) {
ElMessage.warning('请填写本次发货数量')
if (!validateDetailsList()) {
ElMessage.warning('请检查本次发货数量是否正确填写')
return
}
}
const overQuantitySkus = (formData.value.detailsList || [])
.filter(
......@@ -314,11 +328,13 @@ const handleDispatch = async () => {
const {
stockingUpManageNo,
warehouseId,
warehouseName,
expectDeliveryTime,
currencyCode,
detailsList,
} = formData.value
const warehouseName = props.warehouseList.find(
(item) => item.id === warehouseId,
)?.name
try {
const res = await supplierDispatchApi({
manageId: currentRow.value?.id as number,
......@@ -389,6 +405,30 @@ const open = async (row: TableData) => {
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 })
</script>
......
......@@ -163,7 +163,7 @@
>
</span>
<span class="item">
<span v-if="status !== 'COMPLETED' && status !== 'CANCELLED'" class="item">
<ElButton type="success" @click="addInternalTag"
>添加内部便签</ElButton
>
......@@ -321,7 +321,7 @@ const tableColumns = computed(() => {
return <ElTag type="success">备货中</ElTag>
}
if (row.status === 'COMPLETED') {
return <ElTag type="success">完成</ElTag>
return <ElTag type="success">备货完成</ElTag>
}
if (row.status === 'CANCELLED') {
return <ElTag type="danger">已取消</ElTag>
......@@ -664,7 +664,7 @@ const handleSubmitAudit = async () => {
return ElMessage.warning('请选择要操作的数据')
}
try {
await ElMessageBox.confirm('确定要提交审核吗?', '提示', {
await ElMessageBox.confirm('确定将选中的订单提交至审核?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
......@@ -689,7 +689,7 @@ const handleDeleteOrder = async () => {
return ElMessage.warning('请选择一条数据')
}
try {
await ElMessageBox.confirm('确定要删除选中的数据吗?', '提示', {
await ElMessageBox.confirm('确定删除选中的订单??', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
......
......@@ -64,7 +64,11 @@
clearable
size="small"
style="width: 70px"
@blur="validateField(row, 'buyStored')"
/>
<div v-if="row._buyStoredError" class="field-error">
{{ row._buyStoredError }}
</div>
</template>
<template #rejectsAmount="{ row }">
<ElInput
......@@ -72,7 +76,11 @@
clearable
size="small"
style="width: 70px"
@blur="validateField(row, 'rejectsAmount')"
/>
<div v-if="row._rejectsAmountError" class="field-error">
{{ row._rejectsAmountError }}
</div>
</template>
<template #locationName="{ row }">
<ElSelect
......@@ -144,6 +152,10 @@ const formData = ref<StockingApplyOrderDetailData>({
checkerUserId: undefined,
remark: '',
})
type StockingApplyOrderDetailListWithError = StockingApplyOrderDetailList & {
_buyStoredError?: string
_rejectsAmountError?: string
}
const tableColumns = ref([
{
label: 'SKU图片',
......@@ -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 () => {
if (!formRef.value) return
try {
......@@ -356,14 +407,14 @@ const handleSubmit = async () => {
} catch {
return
}
for (const item of formData.value.detailsList) {
if (!item.buyStored) {
ElMessage.error(`库存SKU:${item.warehouseSku}入库数量不能为空`)
if (!validateDetailsList()) {
ElMessage.warning('请检查入库数量和不良品数是否正确填写')
return
}
const overQuantitySkus = []
for (const item of formData.value.detailsList) {
if (Number(item.buyStored) > Number(item.shipmentQuantity)) {
ElMessage.error(`库存SKU:${item.warehouseSku}入库数量不能大于申请数量`)
return
overQuantitySkus.push(item.warehouseSku)
}
const locationCode = allLocationList.value.find(
(location: loactionData) => location.id === Number(item.locationId),
......@@ -375,6 +426,21 @@ const handleSubmit = async () => {
.plus(rejectsAmount)
.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(
(item) => item.id === formData.value.checkerUserId,
)?.account
......@@ -396,6 +462,7 @@ const handleSubmit = async () => {
loading.close()
}
}
defineExpose({ open })
</script>
......@@ -439,4 +506,23 @@ defineExpose({ open })
.dialog-footer {
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>
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