feat(wms): 添加库存距离过期天数计算和调拨订单出库数量显示

- 在库存列表中添加距离过期天数列,根据创建时间和最长停留时间计算
- 在调拨订单明细中添加出库数量列
- 优化调拨订单打印逻辑,支持重新打印和删除任务的条件控制
- 更新相关接口和类型定义,增加出库数量和最长停留时间字段
master
zangch@mesnac.com 3 months ago
parent 3e2f9594cc
commit 3fee2722a4

@ -32,6 +32,11 @@ export interface AllocateOrderDetailVO {
materialName: string;
/**
*
*/
outSum?: number;
}
export interface AllocateOrderDetailForm extends BaseEntity {
@ -96,6 +101,11 @@ export interface AllocateOrderDetailForm extends BaseEntity {
erpSynchronousQty?: number;
/**
*
*/
outSum?: number;
}
@ -133,6 +143,11 @@ export interface AllocateOrderDetailQuery extends PageQuery {
materialName?: string;
/**
*
*/
outSum?: number;
/**
*
*/

@ -52,6 +52,14 @@ export interface InventoryVO {
warehouseName: string;
createTime?: string;
/**
*
*
*/
maxParkingTime?: number ;
}
export interface InventoryForm extends BaseEntity {
@ -112,6 +120,13 @@ export interface InventoryForm extends BaseEntity {
warehouseName?: string;
createTime?: string;
/**
*
*
*/
maxParkingTime?: number ;
}
export interface InventoryQuery extends PageQuery {
@ -174,6 +189,14 @@ export interface InventoryQuery extends PageQuery {
materialCategoryName?: string;
createTime?: string;
/**
*
*
*/
maxParkingTime?: number ;
/**
*
*/

@ -86,6 +86,11 @@
<el-table v-loading="loading" :data="inventoryList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column label="表主键" align="center" prop="inventoryId" v-if="columns[0].visible"/> -->
<el-table-column label="距离过期天数" align="center" v-if="columns[7].visible">
<template #default="scope">
{{ calculateDaysToExpire(scope.row) }}
</template>
</el-table-column>
<el-table-column label="批次码" align="center" prop="batchCode" v-if="columns[0].visible"/>
<!-- <el-table-column label="物料id" align="center" prop="materialId" v-if="columns[3].visible"/> -->
<el-table-column label="库位编码" align="center" prop="locationCode" v-if="columns[2].visible"/>
@ -183,6 +188,7 @@ import {
import { getBaseMaterialCategoryListInWMS } from '@/api/wms/baseMaterialCategory';
import dayjs from 'dayjs'; // dayjs
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { lock_state, inventory_status, material_mategories } = toRefs<any>(proxy?.useDict('lock_state', 'inventory_status', 'material_mategories'));
@ -212,6 +218,7 @@ const columns = ref<FieldOption[]>([
{ key: 4, label: `锁定状态`, visible: true },
{ key: 5, label: `库存状态`, visible: true },
{ key: 6, label: `仓库`, visible: true },
{ key: 7, label: `距离过期天数`, visible: true },
// { key: 11, label: `${comment}`, visible: true },
// { key: 12, label: `${comment}`, visible: true },
// { key: 13, label: `${comment}`, visible: true },
@ -230,6 +237,8 @@ const initFormData: InventoryForm = {
inventoryStatus: undefined,
storeId: undefined,
warehouseName: undefined,
createTime: undefined,
maxParkingTime: undefined,
}
const data = reactive<PageData<InventoryForm, InventoryQuery>>({
form: {...initFormData},
@ -248,6 +257,8 @@ const data = reactive<PageData<InventoryForm, InventoryQuery>>({
inventoryStatus: undefined,
storeId: undefined,
warehouseName: undefined,
createTime: undefined,
maxParkingTime: undefined,
params: {
}
},
@ -386,6 +397,17 @@ const getMaterialCategorySelect = async () => {
mategoryOptions.value = res.data;
};
const calculateDaysToExpire = (row: InventoryVO) => {
// (createTime + maxParkingTime) -
if (!row.createTime || !row.maxParkingTime) return 'N/A';
const entryDate = dayjs(row.createTime);
const expireDate = entryDate.add(row.maxParkingTime, 'day');
const today = dayjs();
const days = expireDate.diff(today, 'day');
return days >= 0 ? days : days; //
};
onMounted(() => {
// getMaterialList().then(e => {
// materialList.value = e.data

@ -107,6 +107,7 @@
<el-table-column label="调拨单号" align="center" prop="allocateCode"/>
<el-table-column label="物料" align="center" prop="materialName"/>
<el-table-column label="调拨数量" align="center" prop="allocateOrderQty"/>
<el-table-column label="出库数量" align="center" prop="outSum"/>
<el-table-column label="erp同步状态" align="center" prop="erpSynchronousStatus">
<template #default="scope">
<dict-tag :options="erp_synchronous_status" :value="scope.row.erpSynchronousStatus"/>
@ -121,14 +122,10 @@
type="primary">
创建任务
</el-button>
<el-button size="small" @click="recreateTasks(scope.row)"
v-if="hasExistingTasks(scope.row)"
type="warning">
重新创建
</el-button>
<el-button size="small" @click="deleteAllTasks(scope.row)"
v-if="hasExistingTasks(scope.row)"
type="danger">
type="danger"
:disabled="!canDelete(scope.row)">
删除任务
</el-button>
<el-button size="small" @click="viewPrintTasks(scope.row)">
@ -546,13 +543,13 @@
<el-table-column label="批次码" align="center" prop="batchCode" />
<el-table-column label="每包数量" align="center" prop="materialQty" />
<el-table-column label="条码数量" align="center" prop="apportionQty" />
<el-table-column label="入库状态" align="center" prop="inboundStatus">
<!-- <el-table-column label="入库状态" align="center" prop="inboundStatus">
<template #default="scope">
<el-tag :type="scope.row.inboundStatus === '0' ? 'warning' : scope.row.inboundStatus === '1' ? 'success' : 'info'">
{{ scope.row.inboundStatus === '0' ? '待入库' : scope.row.inboundStatus === '1' ? '已入库' : '入库中' }}
</el-tag>
</template>
</el-table-column>
</el-table-column>-->
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
@ -636,7 +633,6 @@ import {listUser} from "@/api/system/user";
import { getBaseMaterialCategoryListInWMS } from '@/api/wms/baseMaterialCategory';
const {proxy} = getCurrentInstance() as ComponentInternalInstance;
const {
approve_status,
@ -720,11 +716,6 @@ getBaseWarehouseList(null).then(e => {
baseStoreList.value = e.data
})
listUser({pageNum: 1, pageSize: 100}).then(e => {
userList.value = e.rows;
})
//
let mategoryOptions = ref([]);
let material_mategoryId = ref([]); //
@ -1173,30 +1164,47 @@ const loadAllTasks = async () => {
/** 打印按钮点击事件 */
const childrenTablePrint = async (row) => {
try {
//
const result = await validatePrintable({aoDId: row.aoDId});
if (!result.data) {
ElMessage.warning('该调拨明细已经打印过,不允许重复打印');
return;
// Web
const hasExisting = hasExistingTasks(row);
if (hasExisting) {
//
if (Number(row.outSum) !== Number(row.allocateOrderQty)) {
ElMessage.error(`只有出库数量等于调拨数量时才能重新打印,当前出库数量:${row.outSum},调拨数量:${row.allocateOrderQty}`);
return;
}
//
await ElMessageBox.confirm(
'该调拨明细已有打印任务,确定要重新打印并覆盖现有任务吗?',
'确认覆盖',
{
confirmButtonText: '确定覆盖',
cancelButtonText: '取消',
type: 'warning',
}
);
}
//
printForm.value = {
aoDId: row.aoDId,
//
await allocatePackagePrint({
allocateCode: row.allocateCode,
materialCode: row.materialCode,
materialName: row.materialName || '',
allocateOrderQty: Number(row.allocateOrderQty),
printMode: 'single',
splitPackageCount: 2,
printCopies: 1,
packageQtyList: []
};
aoDId: row.aoDId,
splitPackageCount: 1,
printCopies: 1
});
printDialogVisible.value = true;
ElMessage.success(hasExisting ? '重新打印成功' : '创建任务成功');
//
await loadTasksForDetail(row.aoDId);
if (partntTableSelectCell.value?.allocateOrderCode) {
await getChildrenTable({allocateCode: partntTableSelectCell.value.allocateOrderCode});
}
} catch (error) {
console.error('打印验证错误:', error);
ElMessage.error('打印验证失败');
if (error !== 'cancel') {
console.error('打印任务错误:', error);
ElMessage.error('操作失败:' + ((error as any).response?.data?.msg || (error as any).message || '未知错误'));
}
}
}
@ -1397,6 +1405,15 @@ const handlePrintSubmit = async () => {
}
}
const canReprint = (row) => {
// outSumdoubleallocateOrderQtyBigDecimal
return Number(row.outSum) === Number(row.allocateOrderQty);
}
const canDelete = (row) => {
// outSumdoubleallocateOrderQtyBigDecimal
return Number(row.outSum) === Number(row.allocateOrderQty);
}
</script>
<style>
.demo-form-inline .el-input {

Loading…
Cancel
Save