|
|
|
@ -142,7 +142,7 @@
|
|
|
|
</el-table-column>
|
|
|
|
</el-table-column>
|
|
|
|
<el-table-column label="操作" fixed="right" width="200">
|
|
|
|
<el-table-column label="操作" fixed="right" width="200">
|
|
|
|
<template #default="scope">
|
|
|
|
<template #default="scope">
|
|
|
|
<el-button size="small" @click="childrenTableUpdate( scope.row)" v-if="auditStatusLoad">
|
|
|
|
<el-button size="small" @click="childrenTableUpdate( scope.row)" v-if="auditStatusLoad && partntTableSelectCell.instockType !== '6'">
|
|
|
|
打印
|
|
|
|
打印
|
|
|
|
</el-button>
|
|
|
|
</el-button>
|
|
|
|
<el-button
|
|
|
|
<el-button
|
|
|
|
@ -228,19 +228,6 @@
|
|
|
|
</el-row>
|
|
|
|
</el-row>
|
|
|
|
<el-table :data="dialogtable" style="width: 100%">
|
|
|
|
<el-table :data="dialogtable" style="width: 100%">
|
|
|
|
<el-table-column label="字段1" prop="date" v-if="false">
|
|
|
|
<el-table-column label="字段1" prop="date" v-if="false">
|
|
|
|
<template #default="scope">
|
|
|
|
|
|
|
|
<el-select
|
|
|
|
|
|
|
|
v-model="scope.row.date"
|
|
|
|
|
|
|
|
placeholder="Select"
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
<el-option
|
|
|
|
|
|
|
|
v-for="i in material_mategoryId"
|
|
|
|
|
|
|
|
:label="i.materialName"
|
|
|
|
|
|
|
|
:value="i.materialId"
|
|
|
|
|
|
|
|
:key="i.materialId"
|
|
|
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
</el-select>
|
|
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
</el-table-column>
|
|
|
|
</el-table-column>
|
|
|
|
|
|
|
|
|
|
|
|
<el-table-column label="物料编码" prop="materialCode">
|
|
|
|
<el-table-column label="物料编码" prop="materialCode">
|
|
|
|
@ -306,10 +293,10 @@
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
</el-table-column>
|
|
|
|
</el-table-column>
|
|
|
|
|
|
|
|
|
|
|
|
<el-table-column label="物料规格" prop="materialSpec">
|
|
|
|
<el-table-column label="物料规格" prop="materialSpe">
|
|
|
|
<template #default="scope">
|
|
|
|
<template #default="scope">
|
|
|
|
<el-select
|
|
|
|
<el-select
|
|
|
|
v-model="scope.row.materialSpec"
|
|
|
|
v-model="scope.row.materialSpe"
|
|
|
|
placeholder="选择物料"
|
|
|
|
placeholder="选择物料"
|
|
|
|
style="width: 240px"
|
|
|
|
style="width: 240px"
|
|
|
|
:disabled="true"
|
|
|
|
:disabled="true"
|
|
|
|
@ -357,22 +344,22 @@
|
|
|
|
<span v-else>{{ scope.row.instockQty }}</span>
|
|
|
|
<span v-else>{{ scope.row.instockQty }}</span>
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
</el-table-column>
|
|
|
|
</el-table-column>
|
|
|
|
<el-table-column label="有无条码" prop="codeYesNo">
|
|
|
|
<!-- <el-table-column label="有无条码" prop="codeYesNo">-->
|
|
|
|
<template #default="scope">
|
|
|
|
<!-- <template #default="scope">-->
|
|
|
|
<el-select
|
|
|
|
<!-- <el-select-->
|
|
|
|
v-model="scope.row.codeYesNo"
|
|
|
|
<!-- v-model="scope.row.codeYesNo"-->
|
|
|
|
placeholder="选择有无条码"
|
|
|
|
<!-- placeholder="选择有无条码"-->
|
|
|
|
style="width: 240px"
|
|
|
|
<!-- style="width: 240px"-->
|
|
|
|
>
|
|
|
|
<!-- >-->
|
|
|
|
<el-option
|
|
|
|
<!-- <el-option-->
|
|
|
|
v-for="i in wms_barcode_if"
|
|
|
|
<!-- v-for="i in wms_barcode_if"-->
|
|
|
|
:label="i.label"
|
|
|
|
<!-- :label="i.label"-->
|
|
|
|
:value="i.value"
|
|
|
|
<!-- :value="i.value"-->
|
|
|
|
:key="i.value"
|
|
|
|
<!-- :key="i.value"-->
|
|
|
|
/>
|
|
|
|
<!-- />-->
|
|
|
|
</el-select>
|
|
|
|
<!-- </el-select>-->
|
|
|
|
</template>
|
|
|
|
<!-- </template>-->
|
|
|
|
</el-table-column>
|
|
|
|
<!-- </el-table-column>-->
|
|
|
|
<el-table-column label="操作" fixed="right" width="200">
|
|
|
|
<el-table-column label="操作" fixed="right" width="200">
|
|
|
|
<template #default="scope">
|
|
|
|
<template #default="scope">
|
|
|
|
<el-button
|
|
|
|
<el-button
|
|
|
|
@ -558,8 +545,51 @@
|
|
|
|
<el-input v-model="childrenTableInfoForm.printedNum" placeholder="" :disabled="true"/>
|
|
|
|
<el-input v-model="childrenTableInfoForm.printedNum" placeholder="" :disabled="true"/>
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
<el-form-item label="分包数量" prop="splitPackageCount">
|
|
|
|
<el-form-item label="分包数量" prop="splitPackageCount">
|
|
|
|
<el-input-number v-model="childrenTableInfoForm.splitPackageCount" :min="1" :max="remainingQty" placeholder="请输入分包数量" />
|
|
|
|
<el-input-number v-model="childrenTableInfoForm.splitPackageCount" :min="1" :max="remainingQty" placeholder="请输入分包数量" @change="onSplitPackageCountChange" />
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- 当分包数量大于1时显示分包模式选择和每包数量配置 -->
|
|
|
|
|
|
|
|
<el-form-item v-if="childrenTableInfoForm.splitPackageCount > 1" label="分包模式">
|
|
|
|
|
|
|
|
<el-radio-group v-model="packageMode" @change="onPackageModeChange">
|
|
|
|
|
|
|
|
<el-radio value="average">平均分包</el-radio>
|
|
|
|
|
|
|
|
<el-radio value="custom">自定义每包数量</el-radio>
|
|
|
|
|
|
|
|
</el-radio-group>
|
|
|
|
|
|
|
|
</el-form-item>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- 平均分包模式显示分包预览 -->
|
|
|
|
|
|
|
|
<el-form-item v-if="childrenTableInfoForm.splitPackageCount > 1 && packageMode === 'average'" label="分包预览">
|
|
|
|
|
|
|
|
<div class="package-preview-container">
|
|
|
|
|
|
|
|
<div class="package-preview-item" v-for="(qty, index) in averagePackageList" :key="index">
|
|
|
|
|
|
|
|
<span class="package-label">第{{index + 1}}包:</span>
|
|
|
|
|
|
|
|
<span class="package-qty">{{qty}}个</span>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="total-qty-info">
|
|
|
|
|
|
|
|
<span>总计:{{averageTotal}} / {{remainingQty}}</span>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</el-form-item>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- 自定义每包数量模式显示输入框 -->
|
|
|
|
|
|
|
|
<el-form-item v-if="childrenTableInfoForm.splitPackageCount > 1 && packageMode === 'custom'" label="每包数量分配">
|
|
|
|
|
|
|
|
<div class="package-qty-container">
|
|
|
|
|
|
|
|
<div v-for="(qty, index) in packageQtyList" :key="index" class="package-qty-item">
|
|
|
|
|
|
|
|
<label>第{{index + 1}}包:</label>
|
|
|
|
|
|
|
|
<el-input-number
|
|
|
|
|
|
|
|
v-model="packageQtyList[index]"
|
|
|
|
|
|
|
|
:min="1"
|
|
|
|
|
|
|
|
:max="remainingQty"
|
|
|
|
|
|
|
|
placeholder="请输入数量"
|
|
|
|
|
|
|
|
@change="validateTotalQty"
|
|
|
|
|
|
|
|
size="small"
|
|
|
|
|
|
|
|
style="width: 120px;"
|
|
|
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="total-qty-info">
|
|
|
|
|
|
|
|
<span :class="{'error-text': totalPackageQty > remainingQty}">总计:{{totalPackageQty}} / {{remainingQty}}</span>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</el-form-item>
|
|
|
|
|
|
|
|
|
|
|
|
<el-form-item label="打印数量" prop="printCopies" v-if="childrenTableInfoForm.splitPackageCount === 1 || !childrenTableInfoForm.splitPackageCount">
|
|
|
|
<el-form-item label="打印数量" prop="printCopies" v-if="childrenTableInfoForm.splitPackageCount === 1 || !childrenTableInfoForm.splitPackageCount">
|
|
|
|
<el-input-number v-model="childrenTableInfoForm.printCopies" :min="1" :max="20" placeholder="请输入打印条码数量" />
|
|
|
|
<el-input-number v-model="childrenTableInfoForm.printCopies" :min="1" :max="20" placeholder="请输入打印条码数量" />
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
@ -657,9 +687,27 @@ const childrenTableInfoVisible = ref(false)
|
|
|
|
const updateDialog = ref(false)
|
|
|
|
const updateDialog = ref(false)
|
|
|
|
const dialogTitle = ref('添加')
|
|
|
|
const dialogTitle = ref('添加')
|
|
|
|
const dialogForm = ref<InstockOrderForm>({ instockType: '', orderNo: '', materialCategoryId: '', warehouseId: '' });
|
|
|
|
const dialogForm = ref<InstockOrderForm>({ instockType: '', orderNo: '', materialCategoryId: '', warehouseId: '' });
|
|
|
|
const parentTableInfoForm = ref({})
|
|
|
|
const parentTableInfoForm = ref<any>({
|
|
|
|
const parentTableApproveForm = ref({})
|
|
|
|
materialCategoryId: '',
|
|
|
|
const childrenTableInfoForm = ref({})
|
|
|
|
instockType: '',
|
|
|
|
|
|
|
|
auditBy: '',
|
|
|
|
|
|
|
|
warehouseCode: ''
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
const parentTableApproveForm = ref<any>({
|
|
|
|
|
|
|
|
auditStatus: '',
|
|
|
|
|
|
|
|
auditComments: ''
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
const childrenTableInfoForm = ref<any>({
|
|
|
|
|
|
|
|
materialCode: '',
|
|
|
|
|
|
|
|
instockQty: 0,
|
|
|
|
|
|
|
|
codeYesNo: '',
|
|
|
|
|
|
|
|
printedNum: 0,
|
|
|
|
|
|
|
|
splitPackageCount: 1,
|
|
|
|
|
|
|
|
printCopies: 1,
|
|
|
|
|
|
|
|
packageQtyList: [] as number[],
|
|
|
|
|
|
|
|
packageMode: 'average',
|
|
|
|
|
|
|
|
batchCode: ''
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const queryForm = ref({
|
|
|
|
const queryForm = ref({
|
|
|
|
@ -669,6 +717,7 @@ const queryForm = ref({
|
|
|
|
warehouseId: '',
|
|
|
|
warehouseId: '',
|
|
|
|
instockType: '',
|
|
|
|
instockType: '',
|
|
|
|
instockMethond: '',
|
|
|
|
instockMethond: '',
|
|
|
|
|
|
|
|
auditStatus: '',
|
|
|
|
pageNum: 1,
|
|
|
|
pageNum: 1,
|
|
|
|
pageSize: 10
|
|
|
|
pageSize: 10
|
|
|
|
})
|
|
|
|
})
|
|
|
|
@ -697,7 +746,7 @@ const materialList = ref([]);
|
|
|
|
const parentTableLoad = ref(false)
|
|
|
|
const parentTableLoad = ref(false)
|
|
|
|
const childrenTableLoad = ref(false)
|
|
|
|
const childrenTableLoad = ref(false)
|
|
|
|
const isView = ref(false)
|
|
|
|
const isView = ref(false)
|
|
|
|
const partntTableSelectCell = ref({})
|
|
|
|
const partntTableSelectCell = ref({ instockId: null })
|
|
|
|
const showSearch = ref(true)
|
|
|
|
const showSearch = ref(true)
|
|
|
|
const columns = ref([])
|
|
|
|
const columns = ref([])
|
|
|
|
|
|
|
|
|
|
|
|
@ -729,19 +778,49 @@ const submitForm = async() => {
|
|
|
|
const copies = Number(childrenTableInfoForm.value.printCopies) || 1
|
|
|
|
const copies = Number(childrenTableInfoForm.value.printCopies) || 1
|
|
|
|
const remaining = remainingQty.value
|
|
|
|
const remaining = remainingQty.value
|
|
|
|
|
|
|
|
|
|
|
|
if (split > remaining) {
|
|
|
|
|
|
|
|
ElMessage.error('分包数量不能超过剩余物料量')
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (split > 1) {
|
|
|
|
if (split > 1) {
|
|
|
|
if (remaining % split !== 0) {
|
|
|
|
// 分包逻辑:根据模式选择数据源
|
|
|
|
ElMessage.error('剩余物料量无法平均分包,请调整分包数量')
|
|
|
|
let finalPackageList = []
|
|
|
|
|
|
|
|
if (packageMode.value === 'average') {
|
|
|
|
|
|
|
|
// 平均分包模式:使用平均分包的结果
|
|
|
|
|
|
|
|
finalPackageList = averagePackageList.value
|
|
|
|
|
|
|
|
const total = averageTotal.value
|
|
|
|
|
|
|
|
if (total > remaining) {
|
|
|
|
|
|
|
|
ElMessage.error('平均分包总计不能超过剩余物料量')
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (total <= 0) {
|
|
|
|
|
|
|
|
ElMessage.error('平均分包数量必须大于0')
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
// 自定义模式:使用用户输入的数量
|
|
|
|
|
|
|
|
finalPackageList = packageQtyList.value
|
|
|
|
|
|
|
|
const total = totalPackageQty.value
|
|
|
|
|
|
|
|
if (total > remaining) {
|
|
|
|
|
|
|
|
ElMessage.error('每包数量总计不能超过剩余物料量')
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (total <= 0) {
|
|
|
|
|
|
|
|
ElMessage.error('每包数量必须大于0')
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// 检查是否有空或负数
|
|
|
|
|
|
|
|
if (packageQtyList.value.some(qty => !qty || qty <= 0)) {
|
|
|
|
|
|
|
|
ElMessage.error('每包数量必须大于0')
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 将最终的分包数量传递给后端
|
|
|
|
|
|
|
|
childrenTableInfoForm.value.packageQtyList = finalPackageList
|
|
|
|
|
|
|
|
childrenTableInfoForm.value.packageMode = packageMode.value // 传递模式信息
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
// 不分包逻辑
|
|
|
|
|
|
|
|
if (split > remaining) {
|
|
|
|
|
|
|
|
ElMessage.error('分包数量不能超过剩余物料量')
|
|
|
|
return
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// 对于分包>1,设置barcodeNum=1(每个包打印1份)
|
|
|
|
|
|
|
|
childrenTableInfoForm.value.printCopies = 1
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
if (copies < 1) {
|
|
|
|
if (copies < 1) {
|
|
|
|
ElMessage.error('重复打印数量至少为1')
|
|
|
|
ElMessage.error('重复打印数量至少为1')
|
|
|
|
return
|
|
|
|
return
|
|
|
|
@ -777,7 +856,7 @@ const generateBatchCode = (form) => {
|
|
|
|
}).join('')
|
|
|
|
}).join('')
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//物料大类
|
|
|
|
let mategoryOptions = ref([]);
|
|
|
|
let mategoryOptions = ref([]);
|
|
|
|
const getMaterialCategorySelect = async () => {
|
|
|
|
const getMaterialCategorySelect = async () => {
|
|
|
|
const res = await getBaseMaterialCategoryListInWMS(null);
|
|
|
|
const res = await getBaseMaterialCategoryListInWMS(null);
|
|
|
|
@ -844,9 +923,9 @@ const reset = () => {
|
|
|
|
instockCode: '',
|
|
|
|
instockCode: '',
|
|
|
|
materialCategoryId: '',
|
|
|
|
materialCategoryId: '',
|
|
|
|
materialCategoryName: '',
|
|
|
|
materialCategoryName: '',
|
|
|
|
warehouseId: '',
|
|
|
|
|
|
|
|
instockType: '',
|
|
|
|
instockType: '',
|
|
|
|
instockMethond: routeInstockMethondValue,// 使用保存的路由参数值
|
|
|
|
instockMethond: routeInstockMethondValue,// 使用保存的路由参数值
|
|
|
|
|
|
|
|
auditStatus: '',
|
|
|
|
pageNum: 1,
|
|
|
|
pageNum: 1,
|
|
|
|
pageSize: 10
|
|
|
|
pageSize: 10
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -875,8 +954,14 @@ const viewDetails = (e) => {
|
|
|
|
// 父表格新增
|
|
|
|
// 父表格新增
|
|
|
|
const parentTableAdd = () => {
|
|
|
|
const parentTableAdd = () => {
|
|
|
|
dialogVisible.value = true;
|
|
|
|
dialogVisible.value = true;
|
|
|
|
dialogForm.value = { instockType: '', orderNo: '', materialCategoryId: '', warehouseId: '' }; // Add more if needed
|
|
|
|
dialogForm.value = { instockType: '', orderNo: '', materialCategoryId: '', warehouseId: '' };
|
|
|
|
dialogtable.value = [];
|
|
|
|
dialogtable.value = [];
|
|
|
|
|
|
|
|
// 清空表单验证状态
|
|
|
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
|
|
|
if (dialogFormRef.value) {
|
|
|
|
|
|
|
|
dialogFormRef.value.clearValidate();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}, 100);
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// 父表格审批
|
|
|
|
// 父表格审批
|
|
|
|
@ -886,7 +971,7 @@ const parentTableApprove = async (e) => {
|
|
|
|
updateDialog.value = true
|
|
|
|
updateDialog.value = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// 父表格修改
|
|
|
|
// 父表格修改
|
|
|
|
const parentTableUpdate = async (e) => {
|
|
|
|
const parentTableUpdate = async (e?: any) => {
|
|
|
|
let id = ref(null)
|
|
|
|
let id = ref(null)
|
|
|
|
if (e) {
|
|
|
|
if (e) {
|
|
|
|
id.value = e.instockId
|
|
|
|
id.value = e.instockId
|
|
|
|
@ -899,7 +984,7 @@ const parentTableUpdate = async (e) => {
|
|
|
|
updateDialog.value = true
|
|
|
|
updateDialog.value = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// 父表格删除
|
|
|
|
// 父表格删除
|
|
|
|
const parentTableDelete = async (e) => {
|
|
|
|
const parentTableDelete = async (e?: any) => {
|
|
|
|
const delList = ref([])
|
|
|
|
const delList = ref([])
|
|
|
|
if (e) {
|
|
|
|
if (e) {
|
|
|
|
delList.value = [e.instockId]
|
|
|
|
delList.value = [e.instockId]
|
|
|
|
@ -953,7 +1038,20 @@ const addDialogTableCell = () => {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 新增提交
|
|
|
|
// 新增提交
|
|
|
|
const dialogSubmit = () => {
|
|
|
|
const dialogSubmit = async () => {
|
|
|
|
|
|
|
|
// 首先进行表单验证
|
|
|
|
|
|
|
|
if (!dialogFormRef.value) {
|
|
|
|
|
|
|
|
ElMessage.error('表单引用未找到');
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
await dialogFormRef.value.validate();
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
|
|
ElMessage.error('请填写完整的表单信息');
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
console.log(dialogtable.value)
|
|
|
|
console.log(dialogtable.value)
|
|
|
|
// 将前端行映射为后端明细字段,并进行基本校验与过滤
|
|
|
|
// 将前端行映射为后端明细字段,并进行基本校验与过滤
|
|
|
|
const detailList = (dialogtable.value || [])
|
|
|
|
const detailList = (dialogtable.value || [])
|
|
|
|
@ -1027,7 +1125,7 @@ const parentTableInfoSubmit = () =>{
|
|
|
|
const childrenTableUpdate = async (e) => {
|
|
|
|
const childrenTableUpdate = async (e) => {
|
|
|
|
const detail = (await getInstockDetail(e.instockDetailId)).data
|
|
|
|
const detail = (await getInstockDetail(e.instockDetailId)).data
|
|
|
|
const remaining = Number(detail.instockQty) - Number(detail.printedNum || 0)
|
|
|
|
const remaining = Number(detail.instockQty) - Number(detail.printedNum || 0)
|
|
|
|
if(remaining <= 0){
|
|
|
|
if(remaining < 1){
|
|
|
|
ElMessage.error('无剩余数量可打印')
|
|
|
|
ElMessage.error('无剩余数量可打印')
|
|
|
|
return
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -1166,10 +1264,12 @@ const handleAssociatePurchaseOrder = async () => {
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
// 使用新的API获取带统计数据的采购订单物料列表
|
|
|
|
// 使用新的API获取带统计数据的采购订单物料列表
|
|
|
|
const res = await getWmsPurchaseOrderDetailWithStatistics({ poNo: order.poNo });
|
|
|
|
const res = await getWmsPurchaseOrderDetailWithStatistics({
|
|
|
|
|
|
|
|
poNo: order.poNo
|
|
|
|
|
|
|
|
});
|
|
|
|
dialogtable.value = res.data.map(item => ({
|
|
|
|
dialogtable.value = res.data.map(item => ({
|
|
|
|
poDId: item.poDId, // 添加采购订单物料主键
|
|
|
|
poDId: item.poDId, // 添加采购订单物料主键
|
|
|
|
materialId: item.materialId,
|
|
|
|
materialId: item.materialCode, // 修正字段名
|
|
|
|
materialCode: item.materialCode,
|
|
|
|
materialCode: item.materialCode,
|
|
|
|
materialName: item.materialName,
|
|
|
|
materialName: item.materialName,
|
|
|
|
materialSpe: item.materialSpe,
|
|
|
|
materialSpe: item.materialSpe,
|
|
|
|
@ -1181,7 +1281,7 @@ const handleAssociatePurchaseOrder = async () => {
|
|
|
|
deliveryQty: item.deliveryQty, // 保存交付数量用于验证
|
|
|
|
deliveryQty: item.deliveryQty, // 保存交付数量用于验证
|
|
|
|
_showQtyInput: true // 标记显示数字输入框
|
|
|
|
_showQtyInput: true // 标记显示数字输入框
|
|
|
|
}));
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
|
|
ElMessage.success('关联采购订单成功,已加载物料列表及库存信息');
|
|
|
|
ElMessage.success('关联采购订单成功,已加载物料列表及库存信息');
|
|
|
|
} catch (error) {
|
|
|
|
} catch (error) {
|
|
|
|
console.error('获取采购订单物料列表失败:', error);
|
|
|
|
console.error('获取采购订单物料列表失败:', error);
|
|
|
|
@ -1222,7 +1322,7 @@ const validateQty = (row, val) => {
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 对于其他类型,验证不超过交付数量(如果有)
|
|
|
|
// 对于其他类型,验证不超过交付数量(如果有)
|
|
|
|
if (row.deliveryQty !== undefined && intVal > row.deliveryQty) {
|
|
|
|
if (row.deliveryQty !== undefined && intVal > row.deliveryQty) {
|
|
|
|
row.instockQty = row.deliveryQty;
|
|
|
|
row.instockQty = row.deliveryQty;
|
|
|
|
@ -1232,13 +1332,79 @@ const validateQty = (row, val) => {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// 确保 computed 定义在脚本开头
|
|
|
|
|
|
|
|
const remainingQty = computed(() => {
|
|
|
|
const remainingQty = computed(() => {
|
|
|
|
const instock = Number(childrenTableInfoForm.value.instockQty) || 0
|
|
|
|
const instock = Number(childrenTableInfoForm.value.instockQty) || 0
|
|
|
|
const printed = Number(childrenTableInfoForm.value.printedNum) || 0
|
|
|
|
const printed = Number(childrenTableInfoForm.value.printedNum) || 0
|
|
|
|
return Math.max(0, instock - printed) // 添加 Math.max 防护负值
|
|
|
|
return Math.max(0, instock - printed) // 添加 Math.max 防护负值
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 分包相关的响应式数据
|
|
|
|
|
|
|
|
const packageQtyList = ref([])
|
|
|
|
|
|
|
|
const packageMode = ref('average') // 分包模式:'average' 或 'custom'
|
|
|
|
|
|
|
|
const totalPackageQty = computed(() => {
|
|
|
|
|
|
|
|
return packageQtyList.value.reduce((sum, qty) => sum + (Number(qty) || 0), 0)
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 平均分包的数量列表和总数
|
|
|
|
|
|
|
|
const averagePackageList = ref([])
|
|
|
|
|
|
|
|
const averageTotal = computed(() => {
|
|
|
|
|
|
|
|
return averagePackageList.value.reduce((sum, qty) => sum + (Number(qty) || 0), 0)
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 分包数量变化时的处理函数
|
|
|
|
|
|
|
|
const onSplitPackageCountChange = (count) => {
|
|
|
|
|
|
|
|
if (count > 1) {
|
|
|
|
|
|
|
|
// 默认使用平均分包模式
|
|
|
|
|
|
|
|
packageMode.value = 'average'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 初始化数组
|
|
|
|
|
|
|
|
packageQtyList.value = new Array(count).fill(1)
|
|
|
|
|
|
|
|
averagePackageList.value = new Array(count).fill(1)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 计算平均分包
|
|
|
|
|
|
|
|
calculateAveragePackage(count)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 同时初始化自定义数量为平均值(作为备用)
|
|
|
|
|
|
|
|
packageQtyList.value = [...averagePackageList.value]
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
packageQtyList.value = []
|
|
|
|
|
|
|
|
averagePackageList.value = []
|
|
|
|
|
|
|
|
packageMode.value = 'average'
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 计算平均分包数量
|
|
|
|
|
|
|
|
const calculateAveragePackage = (count) => {
|
|
|
|
|
|
|
|
const remaining = remainingQty.value
|
|
|
|
|
|
|
|
if (remaining > 0 && count > 0) {
|
|
|
|
|
|
|
|
const avgQty = Math.floor(remaining / count)
|
|
|
|
|
|
|
|
const remainder = remaining % count
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (let i = 0; i < count; i++) {
|
|
|
|
|
|
|
|
averagePackageList.value[i] = avgQty + (i < remainder ? 1 : 0)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 分包模式变化时的处理
|
|
|
|
|
|
|
|
const onPackageModeChange = (mode) => {
|
|
|
|
|
|
|
|
if (mode === 'custom') {
|
|
|
|
|
|
|
|
// 切换到自定义模式时,使用平均分包的结果作为初始值
|
|
|
|
|
|
|
|
packageQtyList.value = [...averagePackageList.value]
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// 切换到平均模式时不需要特殊处理,因为平均值已经计算好了
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 验证总数量是否超出限制
|
|
|
|
|
|
|
|
const validateTotalQty = () => {
|
|
|
|
|
|
|
|
const total = totalPackageQty.value
|
|
|
|
|
|
|
|
const remaining = remainingQty.value
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (total > remaining) {
|
|
|
|
|
|
|
|
ElMessage.warning(`每包数量总计不能超过剩余数量 ${remaining}`)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const dialogFormRef = ref();
|
|
|
|
const dialogFormRef = ref();
|
|
|
|
const dialogFormRules = ref({
|
|
|
|
const dialogFormRules = ref({
|
|
|
|
warehouseId: [{ required: true, message: '请选择仓库', trigger: 'change' }],
|
|
|
|
warehouseId: [{ required: true, message: '请选择仓库', trigger: 'change' }],
|
|
|
|
@ -1250,7 +1416,7 @@ const isAddDisabled = computed(() => {
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
</script>
|
|
|
|
</script>
|
|
|
|
<style>
|
|
|
|
<style scoped>
|
|
|
|
.demo-form-inline .el-input {
|
|
|
|
.demo-form-inline .el-input {
|
|
|
|
--el-input-width: 220px;
|
|
|
|
--el-input-width: 220px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -1258,4 +1424,69 @@ const isAddDisabled = computed(() => {
|
|
|
|
.demo-form-inline .el-select {
|
|
|
|
.demo-form-inline .el-select {
|
|
|
|
--el-select-width: 220px;
|
|
|
|
--el-select-width: 220px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.package-qty-container {
|
|
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
|
|
|
gap: 8px;
|
|
|
|
|
|
|
|
max-height: 200px;
|
|
|
|
|
|
|
|
overflow-y: auto;
|
|
|
|
|
|
|
|
border: 1px solid #dcdfe6;
|
|
|
|
|
|
|
|
border-radius: 4px;
|
|
|
|
|
|
|
|
padding: 12px;
|
|
|
|
|
|
|
|
background-color: #fafafa;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.package-qty-item {
|
|
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
|
|
gap: 10px;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.package-qty-item label {
|
|
|
|
|
|
|
|
min-width: 60px;
|
|
|
|
|
|
|
|
font-size: 14px;
|
|
|
|
|
|
|
|
color: #606266;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.package-preview-container {
|
|
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
|
|
|
gap: 6px;
|
|
|
|
|
|
|
|
border: 1px solid #e4e7ed;
|
|
|
|
|
|
|
|
border-radius: 4px;
|
|
|
|
|
|
|
|
padding: 12px;
|
|
|
|
|
|
|
|
background-color: #f9f9f9;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.package-preview-item {
|
|
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
|
|
gap: 8px;
|
|
|
|
|
|
|
|
padding: 4px 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.package-label {
|
|
|
|
|
|
|
|
min-width: 60px;
|
|
|
|
|
|
|
|
font-size: 14px;
|
|
|
|
|
|
|
|
color: #606266;
|
|
|
|
|
|
|
|
font-weight: 500;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.package-qty {
|
|
|
|
|
|
|
|
font-size: 14px;
|
|
|
|
|
|
|
|
color: #409EFF;
|
|
|
|
|
|
|
|
font-weight: bold;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.total-qty-info {
|
|
|
|
|
|
|
|
padding-top: 8px;
|
|
|
|
|
|
|
|
border-top: 1px solid #e4e7ed;
|
|
|
|
|
|
|
|
font-weight: bold;
|
|
|
|
|
|
|
|
text-align: right;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.error-text {
|
|
|
|
|
|
|
|
color: #f56c6c;
|
|
|
|
|
|
|
|
}
|
|
|
|
</style>
|
|
|
|
</style>
|
|
|
|
|