Compare commits

..

3 Commits

Author SHA1 Message Date
Yxq
4d35a2a337 后端改动 2025-12-09 11:14:28 +08:00
Yxq
b456252541 前端改动 2025-12-09 11:14:08 +08:00
Yxq
2550458b0f 新增质检看板 2025-12-09 11:13:23 +08:00
18 changed files with 1096 additions and 178 deletions

View File

@ -36,6 +36,9 @@ import PickP2 from "@/views/PickP2.vue";
import PickP3 from "@/views/PickP3.vue";
import InboundP2 from "@/views/InboundP2.vue";
import InboundP3 from "@/views/InboundP3.vue";
import QualityP7 from "@/views/QualityP7.vue";
import QualityP9 from "@/views/QualityP9.vue";
import QualityP8 from "@/views/QualityP8.vue";
const debounce = (fn, delay) => {
let timer = null;
@ -64,7 +67,10 @@ export default {
InboundP3,
PickP1,
PickP2,
PickP3
PickP3,
QualityP7,
QualityP8,
QualityP9
},
setup() {
const route = useRoute();
@ -78,12 +84,15 @@ export default {
//
const titleMapping = {
'1': ' 1 号入库',
'2': ' 2 号入库',
'3': ' 3 号入库',
'4': 'P1 站台拣选',
'5': 'P2 站台拣选',
'6': 'P3 站台拣选',
'1': ' 立库 1 号入库',
'2': ' 立库 2 号入库',
'3': ' 立库 3 号入库',
'4': '立库 P1 站台拣选',
'5': '立库 P2 站台拣选',
'6': '立库 P3 站台拣选',
'7': '海关 P7 站台收货质检',
'8': '海关 P8 站台收货质检',
'9': '海关 P9 站台收货质检',
};
//
@ -95,7 +104,7 @@ export default {
}
const operation = titleMapping[standId];
if (operation) {
return `丰尚立库 ${operation} 状态一览表`;
return `丰尚 ${operation} 状态一览表`;
}
// standId
return '丰尚立库 状态一览表';
@ -110,6 +119,9 @@ export default {
if (standId === '4') return 'PickP1';
if (standId === '5') return 'PickP2';
if (standId === '6') return 'PickP3';
if (standId === '7') return 'QualityP7';
if (standId === '8') return 'QualityP8';
if (standId === '9') return 'QualityP9';
return 'Inbound'; //
});

View File

@ -0,0 +1,150 @@
<template>
<div>
<DataTable :columns="columns" :data="rows" />
</div>
</template>
<script setup>
import { ref, onMounted, onUnmounted } from 'vue';
import DataTable from '../components/DataTable.vue';
//
const columns = [
{ key: 'vehicleId', title: '托盘号' },
{ key: 'matNo', title: '物料号' },
{ key: 'inspectStatus', title: '是否质检' },
{ key: 'inspectCode', title: '质检结果' },
];
const rows = ref([]);
let timer = null;
//
async function getContainerNos() {
try {
// 106
const response106 = await fetch('http://172.18.222.253:9980/api/upper/pub/getStandCode?standId=106');
const data106 = await response106.json();
const containerNo106 = data106.returnData || '';
// 108
const response108 = await fetch('http://172.18.222.253:9980/api/upper/pub/getStandCode?standId=108');
const data108 = await response108.json();
const containerNo108 = data108.returnData || '';
return [containerNo106, containerNo108].filter(no => no !== '');
} catch (error) {
console.error('获取托盘号失败:', error);
return [];
}
}
//
async function getQualityData(containerNos) {
const qualityData = [];
for (const containerNo of containerNos) {
try {
// EWM
const response = await fetch('http://your-ewm-api-endpoint/data', { // API
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Basic ' + btoa('asrs:mom@123456') // Basic Auth
},
body: JSON.stringify({ containerNo })
});
if (response.ok) {
const data = await response.json();
//
if (data.grInfoList && Array.isArray(data.grInfoList)) {
data.grInfoList.forEach(item => {
qualityData.push({
vehicleId: data.containerNo,
matNo: item.matNo,
inspectStatus: item.inspectStatus ? '是' : '否',
inspectCode: item.inspectStatus ? (item.firstDemo ? '首样合格' : '质检合格') : '未质检'
});
});
}
}
} catch (error) {
console.error(`获取托盘${containerNo}的质检数据失败:`, error);
}
}
return qualityData;
}
async function load() {
try {
//
const containerNos = await getContainerNos();
if (containerNos.length > 0) {
//
const qualityData = await getQualityData(containerNos);
rows.value = qualityData;
} else {
rows.value = [];
}
} catch (error) {
console.error('加载质检数据失败:', error);
rows.value = [];
}
}
onMounted(() => {
load();
timer = setInterval(load, 5000);
});
onUnmounted(() => {
if (timer) {
clearInterval(timer);
}
});
</script>
<style scoped>
.title-center {
text-align: center;
}
/* 增大表格整体字体 */
:deep(.table-wrapper) {
font-size: 40px;
}
:deep(thead th) {
font-size: 40px; /* 表头字体稍大 */
}
:deep(tbody td) {
font-size: 40px; /* 表格内容字体 */
padding: 16px 12px; /* 同时增加内边距使布局更舒适 */
}
/* 设置第一列料箱号宽度为30% */
:deep(th:nth-child(1)),
:deep(td:nth-child(1)) {
width: 40%;
}
/* 设置第二列起点宽度为10% */
:deep(th:nth-child(2)),
:deep(td:nth-child(2)) {
width: 20%;
}
/* 设置第三列(终点)宽度 */
:deep(th:nth-child(3)),
:deep(td:nth-child(3)) {
width: 15%;
}
/* 设置第四列(优先级)宽度 */
:deep(th:nth-child(4)),
:deep(td:nth-child(4)) {
width: 25%;
}
</style>

View File

@ -0,0 +1,133 @@
<template>
<div>
<DataTable :columns="columns" :data="rows" />
</div>
</template>
<script setup>
import { ref, onMounted, onUnmounted } from 'vue';
import DataTable from '../components/DataTable.vue';
//
const columns = [
{ key: 'vehicleId', title: '托盘号' },
{ key: 'matNo', title: '物料号' },
{ key: 'inspectStatus', title: '是否质检' },
{ key: 'inspectCode', title: '质检结果' },
];
const rows = ref([]);
let timer = null;
//
async function getContainerNos() {
try {
// 114
const response114 = await fetch('http://172.18.222.253:9980/api/upper/pub/getStandCode?standId=114');
const data114 = await response114.json();
const containerNo114 = data114.returnData || '';
// 116
const response116 = await fetch('http://172.18.222.253:9980/api/upper/pub/getStandCode?standId=116');
const data116 = await response116.json();
const containerNo116 = data116.returnData || '';
return [containerNo114, containerNo116].filter(no => no !== '');
} catch (error) {
console.error('获取托盘号失败:', error);
return [];
}
}
//
async function getQualityData(containerNos) {
const qualityData = [];
for (const containerNo of containerNos) {
try {
//
qualityData.push({
vehicleId: containerNo,
matNo: 'MAT-' + Math.floor(Math.random() * 10000),
inspectStatus: Math.random() > 0.5 ? '是' : '否',
inspectCode: Math.random() > 0.5 ? '合格' : '不合格'
});
} catch (error) {
console.error(`处理托盘${containerNo}数据失败:`, error);
}
}
return qualityData;
}
async function load() {
try {
//
const containerNos = await getContainerNos();
if (containerNos.length > 0) {
//
const qualityData = await getQualityData(containerNos);
rows.value = qualityData;
} else {
rows.value = [];
}
} catch (error) {
console.error('加载质检数据失败:', error);
rows.value = [];
}
}
onMounted(() => {
load();
timer = setInterval(load, 5000);
});
onUnmounted(() => {
if (timer) {
clearInterval(timer);
}
});
</script>
<style scoped>
.title-center {
text-align: center;
}
/* 增大表格整体字体 */
:deep(.table-wrapper) {
font-size: 40px;
}
:deep(thead th) {
font-size: 40px; /* 表头字体稍大 */
}
:deep(tbody td) {
font-size: 40px; /* 表格内容字体 */
padding: 16px 12px; /* 同时增加内边距使布局更舒适 */
}
/* 设置第一列料箱号宽度为30% */
:deep(th:nth-child(1)),
:deep(td:nth-child(1)) {
width: 40%;
}
/* 设置第二列起点宽度为10% */
:deep(th:nth-child(2)),
:deep(td:nth-child(2)) {
width: 20%;
}
/* 设置第三列(终点)宽度 */
:deep(th:nth-child(3)),
:deep(td:nth-child(3)) {
width: 15%;
}
/* 设置第四列(优先级)宽度 */
:deep(th:nth-child(4)),
:deep(td:nth-child(4)) {
width: 25%;
}
</style>

View File

@ -0,0 +1,133 @@
<template>
<div>
<DataTable :columns="columns" :data="rows" />
</div>
</template>
<script setup>
import { ref, onMounted, onUnmounted } from 'vue';
import DataTable from '../components/DataTable.vue';
//
const columns = [
{ key: 'vehicleId', title: '托盘号' },
{ key: 'matNo', title: '物料号' },
{ key: 'inspectStatus', title: '是否质检' },
{ key: 'inspectCode', title: '质检结果' },
];
const rows = ref([]);
let timer = null;
//
async function getContainerNos() {
try {
// 114
const response114 = await fetch('http://172.18.222.253:9980/api/upper/pub/getStandCode?standId=122');
const data114 = await response114.json();
const containerNo114 = data114.returnData || '';
// 116
const response116 = await fetch('http://172.18.222.253:9980/api/upper/pub/getStandCode?standId=124');
const data116 = await response116.json();
const containerNo116 = data116.returnData || '';
return [containerNo114, containerNo116].filter(no => no !== '');
} catch (error) {
console.error('获取托盘号失败:', error);
return [];
}
}
//
async function getQualityData(containerNos) {
const qualityData = [];
for (const containerNo of containerNos) {
try {
//
qualityData.push({
vehicleId: containerNo,
matNo: 'MAT-' + Math.floor(Math.random() * 10000),
inspectStatus: Math.random() > 0.5 ? '是' : '否',
inspectCode: Math.random() > 0.5 ? '合格' : '不合格'
});
} catch (error) {
console.error(`处理托盘${containerNo}数据失败:`, error);
}
}
return qualityData;
}
async function load() {
try {
//
const containerNos = await getContainerNos();
if (containerNos.length > 0) {
//
const qualityData = await getQualityData(containerNos);
rows.value = qualityData;
} else {
rows.value = [];
}
} catch (error) {
console.error('加载质检数据失败:', error);
rows.value = [];
}
}
onMounted(() => {
load();
timer = setInterval(load, 5000);
});
onUnmounted(() => {
if (timer) {
clearInterval(timer);
}
});
</script>
<style scoped>
.title-center {
text-align: center;
}
/* 增大表格整体字体 */
:deep(.table-wrapper) {
font-size: 40px;
}
:deep(thead th) {
font-size: 40px; /* 表头字体稍大 */
}
:deep(tbody td) {
font-size: 40px; /* 表格内容字体 */
padding: 16px 12px; /* 同时增加内边距使布局更舒适 */
}
/* 设置第一列料箱号宽度为30% */
:deep(th:nth-child(1)),
:deep(td:nth-child(1)) {
width: 40%;
}
/* 设置第二列起点宽度为10% */
:deep(th:nth-child(2)),
:deep(td:nth-child(2)) {
width: 20%;
}
/* 设置第三列(终点)宽度 */
:deep(th:nth-child(3)),
:deep(td:nth-child(3)) {
width: 15%;
}
/* 设置第四列(优先级)宽度 */
:deep(th:nth-child(4)),
:deep(td:nth-child(4)) {
width: 25%;
}
</style>

View File

@ -179,6 +179,7 @@ import UploadExcelBaseGoods from '@/excel/UploadExcelBaseGoods.vue'
import UploadExcelKanban from '@/excel/UploadExcelKanban.vue'
import {exportGoodsExcel} from "@/api/excel";
import {dateFormatter} from "@/utils/formatter";
import { getUserPermission } from '@/api/user.js'
/**
* 常量定义
@ -245,14 +246,38 @@ const handleSelectionChange = (row) => {
selectedRows.value = selectedRows.value.filter(item => item.goodsId !== row.goodsId)
}
}
//
//
const handleBatchEdit = () => {
const permissionParams = {
loginAccountUpdate: store.getters.getUser.loginAccount,
roleIdOp: store.getters.getUser.roleId,
userName: USER_NAME
}
getUserPermission(permissionParams).then(res => {
if (res.data.code === 0) {
// "D"
const permissionStr = res.data.message || ''
if (!permissionStr.includes('B')) {
//
ElMessage.error('您没有批量修改时间的权限')
return
}
//
if (selectedRows.value.length === 0) {
ElMessage.warning('请至少选择一条记录')
return
}
batchEditForm.pickingDate = ''
showBatchEditDialog.value = true
} else {
ElMessage.error(res.data.message || '权限检查失败')
}
}).catch(err => {
console.log(err)
ElMessage.error('权限检查失败')
})
}
const handleSelectAllChange = (val) => {
@ -328,13 +353,29 @@ const saveEdit = (editForm) => {
//
//
const handleDelete = (row) => {
//
const permissionParams = {
loginAccountUpdate: store.getters.getUser.loginAccount,
roleIdOp: store.getters.getUser.roleId,
userName: USER_NAME
}
getUserPermission(permissionParams).then(res => {
if (res.data.code === 0) {
// "C"
const permissionStr = res.data.message || ''
if (!permissionStr.includes('B')) {
//
ElMessage.error('您没有加急操作的权限')
return
}
//
let request = {
taskId: row.taskId,
}
upOutsType( request).then((res) => {
upOutsType(request).then((res) => {
if (res.data.code === 0) {
ElMessage({
message: '操作成功',
@ -348,6 +389,13 @@ const handleDelete = (row) => {
});
}
})
} else {
ElMessage.error(res.data.message || '权限检查失败')
}
}).catch(err => {
console.log(err)
ElMessage.error('权限检查失败')
})
}
//
const showEditDialog = ref(false)
@ -359,10 +407,26 @@ const editFormRef = ref()
//
const handleEdit = (row) => {
const permissionParams = {
loginAccountUpdate: store.getters.getUser.loginAccount,
roleIdOp: store.getters.getUser.roleId,
userName: USER_NAME
}
getUserPermission(permissionParams).then(res => {
if (res.data.code === 0) {
// "C"
const permissionStr = res.data.message || ''
if (!permissionStr.includes('B')) {
//
ElMessage.error('您没有编辑时间的权限')
return
}
editForm.taskId = row.taskId
// 使 formatDateToDay
editForm.pickingDate = row.pickingDate ? formatDateToDay(row.pickingDate) : ''
showEditDialog.value = true
}
})
}
const formatDateToDay = (dateString) => {

View File

@ -2,59 +2,59 @@
<el-config-provider :locale="zhCn">
<el-container class="content">
<div class="work-area">
<!-- <fieldset class="search-area">-->
<!-- <el-form ref="outTaskRef" :model="outTaskEntity" :label-position="labelPosition" label-width="158px"-->
<!-- style="max-width: 100%" :rules="requestRules" status-icon>-->
<!-- <div style="display: flex; justify-content: space-between;">-->
<!-- <el-row>-->
<!-- &lt;!&ndash; <el-form-item label="出库类型" prop="outType">-->
<!-- <el-select-v2 style="width: 196px" v-model="outTaskEntity.outType" placeholder="请选择入库类型"-->
<!-- :options="outTypeOptions"></el-select-v2>-->
<!-- </el-form-item> &ndash;&gt;-->
<!-- <el-form-item label="料号" prop="goodsId">-->
<!-- <el-input v-model="outTaskEntity.goodsId" @blur="getLackQty()" clearable/>-->
<!-- </el-form-item>-->
<fieldset class="search-area">
<el-form ref="outTaskRef" :model="outTaskEntity" :label-position="labelPosition" label-width="158px"
style="max-width: 100%" :rules="requestRules" status-icon>
<div style="display: flex; justify-content: space-between;">
<el-row>
<!-- <el-form-item label="出库类型" prop="outType">
<el-select-v2 style="width: 196px" v-model="outTaskEntity.outType" placeholder="请选择入库类型"
:options="outTypeOptions"></el-select-v2>
</el-form-item> -->
<el-form-item label="料号" prop="goodsId">
<el-input v-model="outTaskEntity.goodsId" @blur="getLackQty()" clearable/>
</el-form-item>
<!-- <el-form-item label="数量" prop="needNum">-->
<!-- <el-input-number style="width: 196px" v-model.number="outTaskEntity.needNum"-->
<!-- controls-position="right" :min="1" clearable/>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="箱号" prop="vehicleId">-->
<!-- <el-input v-model="outTaskEntity.vehicleId" clearable/>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="特殊库存" prop="specialStock">-->
<!-- <el-input v-model="outTaskEntity.specialStock" ref="specialStock" clearable/>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="特殊库存号" prop="specialStockNo">-->
<!-- <el-input v-model="outTaskEntity.specialStockNo" ref="specialStockNo" clearable/>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="特殊库存item号" prop="specialStockItemNo">-->
<!-- <el-input v-model="outTaskEntity.specialStockItemNo" ref="specialStockItemNo" clearable/>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="批次号" prop="batchNo">-->
<!-- <el-input v-model="outTaskEntity.batchNo" ref="batchNo" clearable/>-->
<!-- </el-form-item>-->
<!-- &lt;!&ndash; <el-form-item label="原因" prop="reason" v-if="outTaskEntity.outType === 9">-->
<!-- <el-select-v2 style="width: 196px" v-model="outTaskEntity.reason" placeholder="请选择紧急出库原因"-->
<!-- :options="reasonOptions"></el-select-v2>-->
<!-- </el-form-item> &ndash;&gt;-->
<!-- <el-form-item label="工单" prop="workOrder" v-if="outTaskEntity.reason === '缺料'">-->
<!-- <el-input v-model="outTaskEntity.workOrder" @blur="getLackQty()" clearable/>-->
<!-- </el-form-item>-->
<!-- </el-row>-->
<!-- <el-row>-->
<!-- <el-button type="primary"-->
<!-- style="height: 50px; width: 100px; margin: auto 5px auto 5px; font-size: large; color: black;"-->
<!-- @click="confirmOut()">确认出库-->
<!-- </el-button>-->
<!-- <el-button type="warning"-->
<!-- style="height: 50px; width: 100px; margin: auto 5px auto 5px; font-size: large; color: black;"-->
<!-- @click="clearInput()">清除输入-->
<!-- </el-button>-->
<!-- </el-row>-->
<!-- </div>-->
<!-- </el-form>-->
<!-- </fieldset>-->
<el-form-item label="数量" prop="needNum">
<el-input-number style="width: 196px" v-model.number="outTaskEntity.needNum"
controls-position="right" :min="1" clearable/>
</el-form-item>
<el-form-item label="箱号" prop="vehicleId">
<el-input v-model="outTaskEntity.vehicleId" clearable/>
</el-form-item>
<el-form-item label="特殊库存" prop="specialStock">
<el-input v-model="outTaskEntity.specialStock" ref="specialStock" clearable/>
</el-form-item>
<el-form-item label="特殊库存号" prop="specialStockNo">
<el-input v-model="outTaskEntity.specialStockNo" ref="specialStockNo" clearable/>
</el-form-item>
<el-form-item label="特殊库存item号" prop="specialStockItemNo">
<el-input v-model="outTaskEntity.specialStockItemNo" ref="specialStockItemNo" clearable/>
</el-form-item>
<el-form-item label="批次号" prop="batchNo">
<el-input v-model="outTaskEntity.batchNo" ref="batchNo" clearable/>
</el-form-item>
<!-- <el-form-item label="原因" prop="reason" v-if="outTaskEntity.outType === 9">
<el-select-v2 style="width: 196px" v-model="outTaskEntity.reason" placeholder="请选择紧急出库原因"
:options="reasonOptions"></el-select-v2>
</el-form-item> -->
<el-form-item label="工单" prop="workOrder" v-if="outTaskEntity.reason === '缺料'">
<el-input v-model="outTaskEntity.workOrder" @blur="getLackQty()" clearable/>
</el-form-item>
</el-row>
<el-row>
<el-button type="primary"
style="height: 50px; width: 100px; margin: auto 5px auto 5px; font-size: large; color: black;"
@click="confirmOut()">确认出库
</el-button>
<el-button type="warning"
style="height: 50px; width: 100px; margin: auto 5px auto 5px; font-size: large; color: black;"
@click="clearInput()">清除输入
</el-button>
</el-row>
</div>
</el-form>
</fieldset>
<!-- 修改confirm-area为竖直布局表单项两两一排 -->
<!-- 修改confirm-area为竖直布局表单项两两一排 -->
<div style="display: flex; margin-top: 10px;">

View File

@ -118,6 +118,9 @@ import {confirmInventory, getInventoryConfirm, requestInventory} from "@/api/tas
import {labelPosition} from "@/constant/form";
import UploadExcelInventory from "@/excel/UploadExcelInventory.vue";
import {loading} from "@/utils/loading";
//
import { getUserPermission } from '@/api/user.js'
const STAND_ID = store.getters.getStandId
const USER_NAME = store.getters.getUserName
@ -294,16 +297,36 @@ const clearConfirmEntity = (index) => {
//
const sendInventoryRequest = () => {
// (A)
const permissionParams = {
loginAccountUpdate: store.getters.getUser.loginAccount,
roleIdOp: store.getters.getUser.roleId,
userName: USER_NAME
}
getUserPermission(permissionParams).then(res => {
if (res.data.code === 0) {
// "A"
const permissionStr = res.data.message || ''
if (!permissionStr.includes('A')) {
//
ElMessage.error('您没有下发盘点任务的权限')
return
}
//
inventoryRequestFormEntity.goodsId = inventoryRequestFormEntity.goodsId.trim().toUpperCase()
inventoryRequestFormEntity.vehicleId = inventoryRequestFormEntity.vehicleId.trim().toUpperCase()
inventoryRequestFormEntity.specialStock = inventoryRequestFormEntity.specialStock.trim().toUpperCase()
inventoryRequestFormEntity.specialStockNo = inventoryRequestFormEntity.specialStockNo.trim().toUpperCase()
inventoryRequestFormEntity.specialStockItemNo = inventoryRequestFormEntity.specialStockItemNo.trim().toUpperCase()
inventoryRequestFormEntity.batchNo = inventoryRequestFormEntity.batchNo.trim().toUpperCase()
if (inventoryRequestFormEntity.goodsId === '') {
ElMessage.error("料号为必须项。")
return
}
const request = {
goodsId: inventoryRequestFormEntity.goodsId,
vehicleId: inventoryRequestFormEntity.vehicleId,
@ -314,6 +337,7 @@ const sendInventoryRequest = () => {
standId: STAND_ID,
userName: USER_NAME
}
loading.open('处理中...')
requestInventory(request).then(res => {
const response = res.data
@ -329,8 +353,16 @@ const sendInventoryRequest = () => {
}).finally(() => {
loading.close()
})
} else {
ElMessage.error(res.data.message || '权限检查失败')
}
}).catch(err => {
console.log(err)
ElMessage.error('权限检查失败')
})
}
// / ()
const confirmOrRelease = (index) => {
const entity = confirmEntities[index]
@ -340,6 +372,10 @@ const confirmOrRelease = (index) => {
goodsId: entity.goodsId,
vehicleId: entity.vehicleId,
confirmNum: entity.confirmNum,
specialStock: entity.specialStock,
specialStockNo: entity.specialStockNo,
specialStockItemNo: entity.specialStockItemNo,
batchNo: entity.batchNo,
standId: getChildStandIdByIndex(index),
userName: USER_NAME
}

View File

@ -24,12 +24,12 @@
</el-col>
<el-col :span="22" :offset="1">
<el-form-item label="本次实际拣选:" required>
<el-input class="form-input large-center-input" v-model="bindingData.planPickQty" clearable/>
<el-input class="form-input large-center-input" v-model="bindingData.planPickQty" clearable readonly/>
</el-form-item>
</el-col>
<el-col :span="22" :offset="1">
<el-form-item label="实际剩余数量:" required>
<el-input class="form-input large-center-input" v-model="bindingData.realRemainQty" clearable/>
<el-input class="form-input large-center-input" v-model="bindingData.realRemainQty" clearable readonly/>
</el-form-item>
</el-col>
<el-col :span="22" :offset="1">
@ -204,6 +204,10 @@ export default {
realRemainQty: this.bindingData.realRemainQty,
isOut: this.bindingData.isOut,
putArea: this.bindingData.putArea,
specialStock: this.bindingData.specialStock,
specialStockNo: this.bindingData.specialStockNo,
specialStockItemNo: this.bindingData.specialStockItemNo,
batchNo: this.bindingData.batchNo
},
standId: this.bindingData.standId,
userName: USER_NAME
@ -313,6 +317,10 @@ export default {
this.bindingData.putArea = result.stockConfirm.putArea || ''
this.bindingData.warningQty = result.stockConfirm.warningQty
this.bindingData.remark = result.stockConfirm.remark
this.bindingData.specialStock = result.stockConfirm.specialStock
this.bindingData.specialStockNo = result.stockConfirm.specialStockNo
this.bindingData.specialStockItemNo = result.stockConfirm.specialStockItemNo
this.bindingData.batchNo = result.stockConfirm.batchNo
}
console.log(this.bindingData)
} else {

View File

@ -128,6 +128,7 @@ import {pickingTaskStatusOptions} from '@/constant/options.js'
import { addAllOptionOfOptions } from '@/utils/generator.js'
import { loading } from '@/utils/loading'
import {errorBox} from "@/utils/myMessageBox";
import { getUserPermission } from '@/api/user.js'
/**
* 常量定义
*/
@ -177,6 +178,24 @@ const resizeHeight = () => {
}
const editCurrentRowFormEntity = (row) => {
// (F)
const permissionParams = {
loginAccountUpdate: store.getters.getUser.loginAccount,
roleIdOp: store.getters.getUser.roleId,
userName: USER_NAME
}
getUserPermission(permissionParams).then(res => {
if (res.data.code === 0) {
// "F"
const permissionStr = res.data.message || ''
if (!permissionStr.includes('D')) {
//
ElMessage.error('您没有编辑拣选任务的权限')
return
}
//
pickId = row.pickId
Object.assign(pickTaskFormEntity, {
pickId: row.pickId,
@ -186,9 +205,17 @@ const editCurrentRowFormEntity = (row) => {
})
console.log('编辑行数据:', pickTaskFormEntity) //
dialogVisible.value = true
} else {
ElMessage.error(res.data.message || '权限检查失败')
}
}).catch(err => {
console.log(err)
ElMessage.error('权限检查失败')
})
}
const submitInfo = (formData) => {
const params = {
pickId: formData.pickId,

View File

@ -133,6 +133,7 @@ import { addAllOptionOfOptions } from '@/utils/generator.js'
import { loading } from '@/utils/loading'
import {requireStockOutEmpty} from "@/api/task";
import {errorBox} from "@/utils/myMessageBox";
import { getUserPermission } from '@/api/user.js'
// API
/**
@ -328,8 +329,34 @@ const submitUpdateRow = (rowFormEntity) => {
/**
* 出空箱功能相关方法
*/
//
const openEmptyBoxDialog = () => {
// (E)
const permissionParams = {
loginAccountUpdate: store.getters.getUser.loginAccount,
roleIdOp: store.getters.getUser.roleId,
userName: USER_NAME
}
getUserPermission(permissionParams).then(res => {
if (res.data.code === 0) {
// "E"
const permissionStr = res.data.message || ''
if (!permissionStr.includes('C')) {
//
ElMessage.error('您没有出空箱操作的权限')
return
}
//
emptyBoxDialogVisible.value = true
} else {
ElMessage.error(res.data.message || '权限检查失败')
}
}).catch(err => {
console.log(err)
ElMessage.error('权限检查失败')
})
}
const cancelEmptyBox = () => {

View File

@ -30,6 +30,8 @@
<script setup>
import store from '@/store'
import router from '@/router'
import { getUserPermission } from '@/api/user.js'
import { ElMessage } from 'element-plus'
const user = store.getters.getUserName//
const token = store.getters.getToken//
@ -39,7 +41,31 @@ const loginToWms = () => {
}
// PDA
const PdaToWms = () => {
// PDA
const params = {
loginAccountUpdate: store.getters.getUser.loginAccount, // 使
roleIdOp: store.getters.getUser.roleId,
userName: user
}
getUserPermission(params).then(res => {
if (res.data.code === 0) {
// "E"PDA
const permissionStr = res.data.message || ''
if (permissionStr.includes('E')) {
// PDAPDA
router.replace({ path: '/pda' })
} else {
// PDA
ElMessage.error('您没有访问PDA系统的权限')
}
} else {
ElMessage.error(res.data.message || '权限检查失败')
}
}).catch(err => {
console.log(err)
ElMessage.error('权限检查失败')
})
}
//
const loginToImage = () => {

View File

@ -4,8 +4,10 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.wms_main.constant.enums.wms.WmsPickTaskStatusEnum;
import com.wms_main.dao.ITAppPickTaskService;
import com.wms_main.dao.ITAppStockCompareService;
import com.wms_main.dao.ITAppStockService;
import com.wms_main.dao.ITempEwmInboundDataService;
import com.wms_main.model.bo.wcs.WcsStackerTask;
import com.wms_main.model.bo.wms.StockConfirmEntity;
import com.wms_main.model.dto.request.ewm.*;
import com.wms_main.model.dto.request.wcs.WcsBoxArriveRequest;
import com.wms_main.model.dto.request.wcs.WcsTaskResultRequest;
@ -19,9 +21,11 @@ import com.wms_main.model.dto.response.wcs.WcsApiResponse;
import com.wms_main.model.dto.response.wms.BaseWmsApiResponse;
import com.wms_main.model.dto.response.wms.WmsApiResponse;
import com.wms_main.model.po.TAppPickTask;
import com.wms_main.model.po.TAppStock;
import com.wms_main.model.po.TAppStockCompare;
import com.wms_main.model.vo.wms.InventoryConfirmVo;
import com.wms_main.model.vo.wms.TaskConfirmVo;
import com.wms_main.repository.utils.StringUtils;
import com.wms_main.service.api.IEwmApiService;
import com.wms_main.service.controller.ITaskControllerService;
import lombok.RequiredArgsConstructor;
@ -41,7 +45,7 @@ public class TaskController {
private final ITaskControllerService taskControllerService;
private final IEwmApiService ewmApiService;
private final ITAppPickTaskService appPickTaskService;// 拣选任务服务
private final ITAppStockService appStockService;// 库存服务
/**
* 请求入库
@ -58,7 +62,7 @@ public class TaskController {
* @param stockOutRequest 请求信息
* @return 处理结果
*/
//@PostMapping("/requireStockOut")
@PostMapping("/requireStockOut")
public BaseWmsApiResponse requireStockOut(@RequestBody StockOutRequest stockOutRequest) {
return taskControllerService.requireStockOut(stockOutRequest);
}
@ -133,11 +137,67 @@ public class TaskController {
* test
*/
@PostMapping("/status")
public EwmApiBackResponse test(@RequestBody SendWarehouseOutCompletedRequest request) {
public EwmApiBackResponse test(@RequestBody StockConfirmEntity stockConfirm) {
//return taskControllerService.ewmInformationBack(wcsVehicleInRequest);
// return ewmApiService.getEwmStock(request);
return ewmApiService.sendWarehouseOutCompleted(request);
//return ewmApiService.sendWarehouseOutCompleted(request);
//return ewmApiService.sendWarehouseInCompleted(new SendWarehouseInCompletedRequest());
// 查询对应的库存信息
List<TAppStock> stockList = appStockService.list(new LambdaQueryWrapper<TAppStock>()
.eq(TAppStock::getVehicleId, stockConfirm.getVehicleId())
.eq(TAppStock::getGoodsId, stockConfirm.getGoodsId())
// 特殊库存字段精确匹配 - 根据传入值决定匹配条件
.and(wrapper -> {
if (StringUtils.isEmpty(stockConfirm.getSpecialStock())) {
// 如果传入null或空字符串匹配数据库中为null或空字符串的记录
wrapper.isNull(TAppStock::getSpecialStock)
.or()
.eq(TAppStock::getSpecialStock, "");
} else {
// 如果传入有值精确匹配该值
wrapper.eq(TAppStock::getSpecialStock, stockConfirm.getSpecialStock());
}
})
.and(wrapper -> {
if (StringUtils.isEmpty(stockConfirm.getSpecialStockNo())) {
// 如果传入null或空字符串匹配数据库中为null或空字符串的记录
wrapper.isNull(TAppStock::getSpecialStockNo)
.or()
.eq(TAppStock::getSpecialStockNo, "");
} else {
// 如果传入有值精确匹配该值
wrapper.eq(TAppStock::getSpecialStockNo, stockConfirm.getSpecialStockNo());
}
})
.and(wrapper -> {
if (StringUtils.isEmpty(stockConfirm.getSpecialStockItemNo())) {
// 如果传入null或空字符串匹配数据库中为null或空字符串的记录
wrapper.isNull(TAppStock::getSpecialStockItemNo)
.or()
.eq(TAppStock::getSpecialStockItemNo, "");
} else {
// 如果传入有值精确匹配该值
wrapper.eq(TAppStock::getSpecialStockItemNo, stockConfirm.getSpecialStockItemNo());
}
})
.and(wrapper -> {
if (StringUtils.isEmpty(stockConfirm.getBatchNo())) {
// 如果传入null或空字符串匹配数据库中为null或空字符串的记录
wrapper.isNull(TAppStock::getBatchNo)
.or()
.eq(TAppStock::getBatchNo, "");
} else {
// 如果传入有值精确匹配该值
wrapper.eq(TAppStock::getBatchNo, stockConfirm.getBatchNo());
}
})
.orderByDesc(TAppStock::getFirstInTime)
);
return EwmApiBackResponse.success(
"查询成功",
stockList
);
}
/**

View File

@ -34,4 +34,28 @@ public class InventoryConfirmRequest extends BaseWmsRequest {
*/
@JsonProperty("confirmNum")
private Integer confirmNum;
/**
* 特殊库存
*/
@JsonProperty("specialStock")
private String specialStock;
/**
* 批次号
*/
@JsonProperty("batchNo")
private String batchNo;
/**
* 特殊库存号
*/
@JsonProperty("specialStockNo")
private String specialStockNo;
/**
* 特殊库存item号
*/
@JsonProperty("specialStockItemNo")
private String specialStockItemNo;
}

View File

@ -18,7 +18,7 @@ public interface IStockDataService {
* @param userName 用户名
* @param inventoryId 盘点任务号
*/
void updateStockInfo(StockConfirmEntity stockConfirm, String standId, String userName, String reason, String inventoryId);
boolean updateStockInfo(StockConfirmEntity stockConfirm, String standId, String userName, String reason, String inventoryId);
/**
* 查询库存预警值

View File

@ -260,7 +260,7 @@ public class ConveyTaskServiceImpl implements IConveyTaskService {
.eq(TAppStock::getStockStatus, WmsStockStatusEnums.OUTING.getCode())
);
// 更新当前载具到达当前点位的拣选任务为已到达
updateVehicleArriveStatus(targetPickTask);
//updateVehicleArriveStatus(targetPickTask);
}
// 更新拣选任务信息添加拣选任务记录信息
pickRecords.add(new TAppPickTaskBak(
@ -549,6 +549,20 @@ public class ConveyTaskServiceImpl implements IConveyTaskService {
return resultVo;
}
/**
* 构建包含特殊库存属性的复合键
* @param stock 库存对象
* @return 复合键字符串
*/
private String buildCompositeKey(TAppStock stock) {
return stock.getGoodsId() + "_" +
(stock.getSpecialStock() != null ? stock.getSpecialStock() : "") + "_" +
(stock.getBatchNo() != null ? stock.getBatchNo() : "") + "_" +
(stock.getSpecialStockNo() != null ? stock.getSpecialStockNo() : "") + "_" +
(stock.getSpecialStockItemNo() != null ? stock.getSpecialStockItemNo() : "");
}
/**
* 获取这个载具的盘点确认信息
* @param vehicleId 载具号
@ -570,28 +584,45 @@ public class ConveyTaskServiceImpl implements IConveyTaskService {
if (stockList == null || stockList.isEmpty()) {
return null;
}
// 将这些库存根据料号Map一下 并汇总库存数量
// 将这些库存根据料号Map一下 并汇总库存数量相同特殊库存属性的才汇总
Map<String, Integer> sumNumByGoodsMap = new HashMap<>();
Map<String, TAppStock> firstStockByGoodsMap = new HashMap<>();
for (TAppStock stock : stockList) {
if (sumNumByGoodsMap.containsKey(stock.getGoodsId())) {
sumNumByGoodsMap.replace(stock.getGoodsId(), sumNumByGoodsMap.get(stock.getGoodsId()) + stock.getRealNum());
// 构建包含特殊库存属性的复合键
String compositeKey = buildCompositeKey(stock);
// 为每个goodsId+特殊属性组合只保留一个代表性的库存记录用于获取特殊库存信息
if (!firstStockByGoodsMap.containsKey(compositeKey)) {
firstStockByGoodsMap.put(compositeKey, stock);
}
// 只汇总相同特殊库存属性的库存数量
if (sumNumByGoodsMap.containsKey(compositeKey)) {
sumNumByGoodsMap.replace(compositeKey, sumNumByGoodsMap.get(compositeKey) + stock.getRealNum());
} else {
sumNumByGoodsMap.put(stock.getGoodsId(), stock.getRealNum());
sumNumByGoodsMap.put(compositeKey, stock.getRealNum());
}
}
List<TAppPickTask> pickTasks = appPickTaskService.list(new LambdaQueryWrapper<TAppPickTask>()
.eq(TAppPickTask::getVehicleId, vehicleId)
.eq(TAppPickTask::getPickStatus, WmsPickTaskStatusEnum.ARRIVE.getCode())
);
for (TAppInventory inventory : inventoryList) {
if (sumNumByGoodsMap.containsKey(inventory.getGoodsId())) {
// 使用相同的复合键逻辑来匹配库存
String inventoryCompositeKey = buildCompositeKeyForInventory(inventory);
if (sumNumByGoodsMap.containsKey(inventoryCompositeKey)) {
// 返回盘点确认信息
InventoryConfirmVo inventoryConfirmVo = new InventoryConfirmVo();
inventoryConfirmVo.setInventoryId(inventory.getInventoryId());
inventoryConfirmVo.setGoodsId(inventory.getGoodsId());
inventoryConfirmVo.setVehicleId(inventory.getVehicleId());
inventoryConfirmVo.setStockNum(sumNumByGoodsMap.get(inventory.getGoodsId()));
inventoryConfirmVo.setConfirmNum(sumNumByGoodsMap.get(inventory.getGoodsId()));
inventoryConfirmVo.setStockNum(sumNumByGoodsMap.get(inventoryCompositeKey));
inventoryConfirmVo.setConfirmNum(sumNumByGoodsMap.get(inventoryCompositeKey));
inventoryConfirmVo.setChildStandId(pickTasks.getFirst().getPickStand());
inventoryConfirmVo.setSpecialStock(inventory.getSpecialStock());
inventoryConfirmVo.setSpecialStockNo(inventory.getSpecialStockNo());
@ -601,6 +632,21 @@ public class ConveyTaskServiceImpl implements IConveyTaskService {
return inventoryConfirmVo;
}
}
return null;
}
/**
* 构建包含特殊库存属性的复合键用于Inventory对象
* @param inventory 盘点对象
* @return 复合键字符串
*/
private String buildCompositeKeyForInventory(TAppInventory inventory) {
return inventory.getGoodsId() + "_" +
(inventory.getSpecialStock() != null ? inventory.getSpecialStock() : "") + "_" +
(inventory.getBatchNo() != null ? inventory.getBatchNo() : "") + "_" +
(inventory.getSpecialStockNo() != null ? inventory.getSpecialStockNo() : "") + "_" +
(inventory.getSpecialStockItemNo() != null ? inventory.getSpecialStockItemNo() : "");
}
}

View File

@ -591,6 +591,20 @@ public class StackerTaskServiceImpl implements IStackerTaskService {
""
);
appTaskService.save(outTask);
// 添加到达即删除的拣选任务
TAppPickTask pickTask = new TAppPickTask(
UUIDUtils.getNewUUID(),
"P21", // 与出库任务的目标站台一致
vehicleId,
WmsPickTaskStatusEnum.TEMP.getCode(),
LocalDateTime.now(),
null,
null,
null,
3 // 类型设置为3表示到达即删除
);
appPickTaskService.save(pickTask);
}else {
log.info("调用EWM系统接口成功请求参数: {}", request);
}

View File

@ -19,7 +19,6 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.*;
@ -42,17 +41,78 @@ public class StockDataServiceImpl implements IStockDataService {
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void updateStockInfo(StockConfirmEntity stockConfirm, String standId, String userName, String reason, String inventoryId) {
public boolean updateStockInfo(StockConfirmEntity stockConfirm, String standId, String userName, String reason, String inventoryId) {
if (stockConfirm == null || StringUtils.isEmpty(stockConfirm.getVehicleId()) || StringUtils.isEmpty(stockConfirm.getGoodsId())
|| stockConfirm.getRealRemainQty() == null) {
return;
return false;
}
// 查询对应的库存信息
List<TAppStock> stockList = appStockService.list(new LambdaQueryWrapper<TAppStock>()
.eq(TAppStock::getVehicleId, stockConfirm.getVehicleId())
.eq(TAppStock::getGoodsId, stockConfirm.getGoodsId())
// 特殊库存字段精确匹配 - 根据传入值决定匹配条件
.and(wrapper -> {
if (StringUtils.isEmpty(stockConfirm.getSpecialStock())) {
// 如果传入null或空字符串匹配数据库中为null或空字符串的记录
wrapper.isNull(TAppStock::getSpecialStock)
.or()
.eq(TAppStock::getSpecialStock, "");
} else {
// 如果传入有值精确匹配该值
wrapper.eq(TAppStock::getSpecialStock, stockConfirm.getSpecialStock());
}
})
.and(wrapper -> {
if (StringUtils.isEmpty(stockConfirm.getSpecialStockNo())) {
// 如果传入null或空字符串匹配数据库中为null或空字符串的记录
wrapper.isNull(TAppStock::getSpecialStockNo)
.or()
.eq(TAppStock::getSpecialStockNo, "");
} else {
// 如果传入有值精确匹配该值
wrapper.eq(TAppStock::getSpecialStockNo, stockConfirm.getSpecialStockNo());
}
})
.and(wrapper -> {
if (StringUtils.isEmpty(stockConfirm.getSpecialStockItemNo())) {
// 如果传入null或空字符串匹配数据库中为null或空字符串的记录
wrapper.isNull(TAppStock::getSpecialStockItemNo)
.or()
.eq(TAppStock::getSpecialStockItemNo, "");
} else {
// 如果传入有值精确匹配该值
wrapper.eq(TAppStock::getSpecialStockItemNo, stockConfirm.getSpecialStockItemNo());
}
})
.and(wrapper -> {
if (StringUtils.isEmpty(stockConfirm.getBatchNo())) {
// 如果传入null或空字符串匹配数据库中为null或空字符串的记录
wrapper.isNull(TAppStock::getBatchNo)
.or()
.eq(TAppStock::getBatchNo, "");
} else {
// 如果传入有值精确匹配该值
wrapper.eq(TAppStock::getBatchNo, stockConfirm.getBatchNo());
}
})
.orderByDesc(TAppStock::getFirstInTime)
);
// 添加查询相同载具号和料号但remainNum小于realNum的数据
List<TAppStock> additionalStockList = appStockService.list(new LambdaQueryWrapper<TAppStock>()
.eq(TAppStock::getVehicleId, stockConfirm.getVehicleId())
.eq(TAppStock::getGoodsId, stockConfirm.getGoodsId())
.apply("remain_num < real_num")
);
// 合并两个列表
if (additionalStockList != null && !additionalStockList.isEmpty()) {
stockList.addAll(additionalStockList);
}
if (stockList == null || stockList.isEmpty()){
return false;
}
// 更新列表
List<TAppStock> removeStocks = new ArrayList<>();
List<TAppStock> updateStocks = new ArrayList<>();
@ -138,6 +198,7 @@ public class StockDataServiceImpl implements IStockDataService {
if (!stockUpdateList.isEmpty()) {
appStockUpdateService.saveBatch(stockUpdateList);
}
return true;
}
/**

View File

@ -1092,8 +1092,63 @@ public class TaskControllerServiceImpl implements ITaskControllerService {
}
}
// /**
// * 将EWM返回的数据保存到临时表中
// * @param response EWM接口返回的数据
// * @param vehicleNo 载具号
// */
// private void saveEwmDataToTempTable(EwmApiLocalResponse response, String vehicleNo) {
// if (response == null || response.getContent() == null || response.getContent().toString().isEmpty()) {
// log.warn("EWM返回数据为空或无任务明细载具号: {}", vehicleNo);
// return;
// }
// try {
// boolean deletedCount = tempEwmInboundDataService.remove(new LambdaQueryWrapper<TAppTempEwmInboundData>()
// .eq(TAppTempEwmInboundData::getContainerNo, vehicleNo)
// .eq(TAppTempEwmInboundData::getProcessStatus, 0));
//
// log.info("删除旧的EWM临时数据: {} 条,载具号: {}", deletedCount, vehicleNo);
//
// // 转换并保存数据
// List<TAppTempEwmInboundData> dataList = new ArrayList<>();
// EwmApiLocalResponse.Content content = response.getContent();
//
// for (TaskDetailInfo taskDetail : content.getTaskDetailInfo()) {
// TAppTempEwmInboundData data = new TAppTempEwmInboundData();
// data.setId(UUIDUtils.getNewUUID()); // 不要使用固定值"123"
// data.setBillNo(content.getBillNo());
// data.setBillType(content.getBillType());
// data.setContainerNo(content.getContainerNo() != null ? content.getContainerNo() : vehicleNo);
// data.setTaskNo(taskDetail.getTaskNo());
// data.setOrderNo(taskDetail.getOrderNo());
// data.setOrderType(taskDetail.getOrderType());
// data.setMatNo(taskDetail.getMatNo());
// data.setMatDesc(taskDetail.getMatDesc());
// data.setSkuQty(taskDetail.getSkuQty());
// data.setSkuUnit(taskDetail.getSkuUnit());
// data.setRemark(taskDetail.getRemark());
// data.setSpecialStock(taskDetail.getSpecialStock());
// data.setSpecialStockNo(taskDetail.getSpecialStockNo());
// data.setSpecialStockItemNo(taskDetail.getSpecialStockItemNo());
// data.setBatchNo(taskDetail.getBatchNo());
// data.setProcessStatus(0); // 待处理状态
// data.setCreateTime(LocalDateTime.now());
// data.setUpdateTime(LocalDateTime.now());
// dataList.add(data);
// }
//
// if (!dataList.isEmpty()) {
// // 批量插入时指定合理的批次大小
// boolean saveResult = tempEwmInboundDataService.saveBatch(dataList);
// log.info("保存EWM数据结果: {},载具号: {},记录数: {}", saveResult, vehicleNo, dataList.size());
// }
// } catch (Exception e) {
// log.error("保存EWM数据到临时表失败载具号: {}", vehicleNo, e);
// throw e; // 重新抛出异常以便上层处理
// }
// }
/**
* 将EWM返回的数据保存到临时表中
* 将EWM返回的数据保存到临时表中并根据goodsIdspecialStockspecialStockNospecialStockItemNobatchNo进行合并
* @param response EWM接口返回的数据
* @param vehicleNo 载具号
*/
@ -1110,11 +1165,28 @@ public class TaskControllerServiceImpl implements ITaskControllerService {
log.info("删除旧的EWM临时数据: {} 条,载具号: {}", deletedCount, vehicleNo);
// 转换并保存数据
List<TAppTempEwmInboundData> dataList = new ArrayList<>();
Map<String, TAppTempEwmInboundData> dataMap = new HashMap<>();
EwmApiLocalResponse.Content content = response.getContent();
for (TaskDetailInfo taskDetail : content.getTaskDetailInfo()) {
// 构建唯一键用于识别相同记录
String key = String.join("|",
taskDetail.getMatNo() != null ? taskDetail.getMatNo() : "",
taskDetail.getSpecialStock() != null ? taskDetail.getSpecialStock() : "",
taskDetail.getSpecialStockNo() != null ? taskDetail.getSpecialStockNo() : "",
taskDetail.getSpecialStockItemNo() != null ? taskDetail.getSpecialStockItemNo() : "",
taskDetail.getBatchNo() != null ? taskDetail.getBatchNo() : "");
if (dataMap.containsKey(key)) {
// 合并相同记录的数量
TAppTempEwmInboundData existingData = dataMap.get(key);
existingData.setSkuQty(existingData.getSkuQty().add(taskDetail.getSkuQty()));
existingData.setUpdateTime(LocalDateTime.now());
dataMap.put(key, existingData);
} else {
// 创建新记录
TAppTempEwmInboundData data = new TAppTempEwmInboundData();
data.setId(UUIDUtils.getNewUUID()); // 不要使用固定值"123"
data.setId(UUIDUtils.getNewUUID());
data.setBillNo(content.getBillNo());
data.setBillType(content.getBillType());
data.setContainerNo(content.getContainerNo() != null ? content.getContainerNo() : vehicleNo);
@ -1133,8 +1205,12 @@ public class TaskControllerServiceImpl implements ITaskControllerService {
data.setProcessStatus(0); // 待处理状态
data.setCreateTime(LocalDateTime.now());
data.setUpdateTime(LocalDateTime.now());
dataList.add(data);
dataMap.put(key, data);
}
}
// 将Map中的值转换为List
List<TAppTempEwmInboundData> dataList = new ArrayList<>(dataMap.values());
if (!dataList.isEmpty()) {
// 批量插入时指定合理的批次大小
@ -1275,6 +1351,9 @@ public class TaskControllerServiceImpl implements ITaskControllerService {
if (!response.isSuccess()) {
return WcsApiResponse.error(response.getMessage(), null);
}
if (response.getContent().getTaskDetailInfo().size() > 1){
return WcsApiResponse.error("该容器绑定了多个料,请检查。", null);
}
// 判断是否为空箱
if (response.getContent().isEmptyContainer()) {
if (!outsCheckList.isEmpty() || !stockList.isEmpty()){
@ -1748,7 +1827,10 @@ public class TaskControllerServiceImpl implements ITaskControllerService {
}
}
// 更新库存信息
stockDataService.updateStockInfo(confirmTaskRequest.getStockConfirm(), confirmTaskRequest.getStandId(), confirmTaskRequest.getUserName(), "出库拣选", null);
if (!stockDataService.updateStockInfo(confirmTaskRequest.getStockConfirm(), confirmTaskRequest.getStandId(), confirmTaskRequest.getUserName(), "出库拣选", null)){
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return BaseWmsApiResponse.error("库存发生变化,更新失败,请联系管理员确认!");
}
if (conveyTaskService.releaseStandVehicle(thisPickTask)) {
if (requestForCompleted.getPickingDetail() != null && !requestForCompleted.getPickingDetail().isEmpty()){
//1. 回告EWM系统出库完成
@ -1808,13 +1890,12 @@ public class TaskControllerServiceImpl implements ITaskControllerService {
log.info("容器置空调用EWM系统接口成功请求参数: {}", request);
}
}
if (appPickTaskService.exists(new LambdaQueryWrapper<TAppPickTask>()
.eq(TAppPickTask::getVehicleId, thisPickTask.getVehicleId())
.eq(TAppPickTask::getPickStatus, WmsPickTaskStatusEnum.ARRIVE.getCode())
)){
return BaseWmsApiResponse.success("继续拣选");
}
// if (appPickTaskService.exists(new LambdaQueryWrapper<TAppPickTask>()
// .eq(TAppPickTask::getVehicleId, thisPickTask.getVehicleId())
// .eq(TAppPickTask::getPickStatus, WmsPickTaskStatusEnum.ARRIVE.getCode())
// )){
// return BaseWmsApiResponse.success("继续拣选");
// }
return BaseWmsApiResponse.success("确认成功。");
}
@ -2134,8 +2215,16 @@ public class TaskControllerServiceImpl implements ITaskControllerService {
stockConfirm.setVehicleId(targetInventory.getVehicleId());
stockConfirm.setGoodsId(targetInventory.getGoodsId());
stockConfirm.setRealRemainQty(inventoryConfirmRequest.getConfirmNum());
stockConfirm.setSpecialStock(inventoryConfirmRequest.getSpecialStock());
stockConfirm.setSpecialStockNo(inventoryConfirmRequest.getSpecialStockNo());
stockConfirm.setSpecialStockItemNo(inventoryConfirmRequest.getSpecialStockItemNo());
stockConfirm.setBatchNo(inventoryConfirmRequest.getBatchNo());
// 更新库存信息
stockDataService.updateStockInfo(stockConfirm, inventoryConfirmRequest.getStandId(), inventoryConfirmRequest.getUserName(), "盘点确认", targetInventory.getInventoryId());
boolean updateStockInfo = stockDataService.updateStockInfo(stockConfirm, inventoryConfirmRequest.getStandId(), inventoryConfirmRequest.getUserName(), "盘点确认", targetInventory.getInventoryId());
if (!updateStockInfo) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return BaseWmsApiResponse.error("库存发生变化,更新失败,请联系管理员确认!");
}
} else {
return BaseWmsApiResponse.error("请求的盘点任务号未查到对应的盘点任务。");
}
@ -2330,13 +2419,21 @@ public class TaskControllerServiceImpl implements ITaskControllerService {
requestForCompleted.setWaveNo(thisOut.getFirst().getWaveNo());
requestForCompleted.setPickingType(thisOut.getFirst().getPickingType());
int isEmpty = confirmTaskRequest.getTaskConfirm().getIsEmpty();
LambdaQueryWrapper<TAppPickPlan> pickPlanQueryWrapper;
if (isEmpty == 0){
pickPlanQueryWrapper = new LambdaQueryWrapper<TAppPickPlan>()
.eq(TAppPickPlan::getPlanId, thisOut.getFirst().getPickPlanId());
}else{
// 清除拣选计划
LambdaQueryWrapper<TAppPickPlan> pickPlanQueryWrapper = new LambdaQueryWrapper<TAppPickPlan>()
pickPlanQueryWrapper = new LambdaQueryWrapper<TAppPickPlan>()
.eq(TAppPickPlan::getWorkIndex, confirmTaskRequest.getTaskConfirm().getTaskId());
if (confirmTaskRequest.getStockConfirm() != null && StringUtils.isNotEmpty(confirmTaskRequest.getStockConfirm().getVehicleId())) {
// 箱号
pickPlanQueryWrapper.eq(TAppPickPlan::getVehicleId, confirmTaskRequest.getStockConfirm().getVehicleId());
}
}
appPickPlanService.remove(pickPlanQueryWrapper);
return "";
}