diff --git a/dev_wms_serve/src/main/java/com/wms_main/service/business/serviceImpl/ConveyTaskServiceImpl.java b/dev_wms_serve/src/main/java/com/wms_main/service/business/serviceImpl/ConveyTaskServiceImpl.java index bf8317a..cb376ad 100644 --- a/dev_wms_serve/src/main/java/com/wms_main/service/business/serviceImpl/ConveyTaskServiceImpl.java +++ b/dev_wms_serve/src/main/java/com/wms_main/service/business/serviceImpl/ConveyTaskServiceImpl.java @@ -260,7 +260,7 @@ public class ConveyTaskServiceImpl implements IConveyTaskService { .eq(TAppStock::getStockStatus, WmsStockStatusEnums.OUTING.getCode()) ); // 更新当前载具到达当前点位的拣选任务为已到达 - //updateVehicleArriveStatus(targetPickTask); + updateVehicleArriveStatus(targetPickTask); } // 更新拣选任务信息,添加拣选任务记录信息 pickRecords.add(new TAppPickTaskBak( @@ -304,38 +304,72 @@ public class ConveyTaskServiceImpl implements IConveyTaskService { * 更新载具到达状态,防止死锁 * @param targetPickTask 目标拣选任务 */ +// private void updateVehicleArriveStatus(TAppPickTask targetPickTask) { +// synchronized (targetPickTask.getVehicleId().intern()) { +// +// // 使用 last() 的方式虽然有效,但推荐使用 MyBatis Plus 内置方法保证兼容性 +// LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() +// .eq(TAppPickTask::getVehicleId, targetPickTask.getVehicleId()) +// .eq(TAppPickTask::getPickStatus, WmsPickTaskStatusEnum.WAIT.getCode()); +// +// // 设置最多查一条记录(替代 last("LIMIT 1")) +// queryWrapper.last("LIMIT 1"); +// +// TAppPickTask waitPickTask = appPickTaskService.getOne(queryWrapper); +// +// if (waitPickTask == null) { +// log.error("没有找到符合条件的 WAIT 状态任务。载具号: {}", targetPickTask.getVehicleId()); +// return; +// } +// // 更新当前载具到达当前点位的拣选任务为已到达 +// appPickTaskService.update(new LambdaUpdateWrapper() +// .set(TAppPickTask::getPickStatus, WmsPickTaskStatusEnum.ARRIVE.getCode()) +// .set(TAppPickTask::getArriveTime, LocalDateTime.now()) +// .set(TAppPickTask::getPickStand, targetPickTask.getPickStand()) +// .eq(TAppPickTask::getPickId, waitPickTask.getPickId()) +// ); +// appPickPlanService.update(new LambdaUpdateWrapper() +// .set(TAppPickPlan::getStandId, targetPickTask.getPickStand()) +// .eq(TAppPickPlan::getVehicleId, targetPickTask.getVehicleId()) +// .last("LIMIT 1")); +// } +// } + private void updateVehicleArriveStatus(TAppPickTask targetPickTask) { - synchronized (targetPickTask.getVehicleId().intern()) { + if (targetPickTask == null || StringUtils.isEmpty(targetPickTask.getVehicleId())) { + log.warn("目标拣选任务或载具号为空"); + return; + } - // 使用 last() 的方式虽然有效,但推荐使用 MyBatis Plus 内置方法保证兼容性 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() - .eq(TAppPickTask::getVehicleId, targetPickTask.getVehicleId()) - .eq(TAppPickTask::getPickStatus, WmsPickTaskStatusEnum.WAIT.getCode()); + synchronized ((targetPickTask.getVehicleId() + "_arrive").intern()) { + // 使用链式更新,一次性完成多个更新操作 + boolean updated = appPickTaskService.update( + new LambdaUpdateWrapper() + .set(TAppPickTask::getPickStatus, WmsPickTaskStatusEnum.ARRIVE.getCode()) + .set(TAppPickTask::getArriveTime, LocalDateTime.now()) + .set(TAppPickTask::getPickStand, targetPickTask.getPickStand()) + .eq(TAppPickTask::getVehicleId, targetPickTask.getVehicleId()) + .eq(TAppPickTask::getPickStatus, WmsPickTaskStatusEnum.WAIT.getCode()) + .last("LIMIT 1") + ); - // 设置最多查一条记录(替代 last("LIMIT 1")) - queryWrapper.last("LIMIT 1"); - - TAppPickTask waitPickTask = appPickTaskService.getOne(queryWrapper); - - if (waitPickTask == null) { - log.error("没有找到符合条件的 WAIT 状态任务。载具号: {}", targetPickTask.getVehicleId()); + if (!updated) { + log.warn("没有找到符合条件的 WAIT 状态任务。载具号: {}", targetPickTask.getVehicleId()); return; } - // 更新当前载具到达当前点位的拣选任务为已到达 - appPickTaskService.update(new LambdaUpdateWrapper() - .set(TAppPickTask::getPickStatus, WmsPickTaskStatusEnum.ARRIVE.getCode()) - .set(TAppPickTask::getArriveTime, LocalDateTime.now()) - .set(TAppPickTask::getPickStand, targetPickTask.getPickStand()) - .eq(TAppPickTask::getPickId, waitPickTask.getPickId()) + + // 更新拣选计划 + appPickPlanService.update( + new LambdaUpdateWrapper() + .set(TAppPickPlan::getStandId, targetPickTask.getPickStand()) + .eq(TAppPickPlan::getVehicleId, targetPickTask.getVehicleId()) + .last("LIMIT 1") ); - appPickPlanService.update(new LambdaUpdateWrapper() - .set(TAppPickPlan::getStandId, targetPickTask.getPickStand()) - .eq(TAppPickPlan::getVehicleId, targetPickTask.getVehicleId()) - .last("LIMIT 1")); } } + /** * 获得对应库存的第一条工作 * diff --git a/dev_wms_serve/src/main/java/com/wms_main/service/business/serviceImpl/StockDataServiceImpl.java b/dev_wms_serve/src/main/java/com/wms_main/service/business/serviceImpl/StockDataServiceImpl.java index 3f1fa54..2db42cb 100644 --- a/dev_wms_serve/src/main/java/com/wms_main/service/business/serviceImpl/StockDataServiceImpl.java +++ b/dev_wms_serve/src/main/java/com/wms_main/service/business/serviceImpl/StockDataServiceImpl.java @@ -21,6 +21,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.*; +import java.util.stream.Collectors; /** * 库存数据服务实现 @@ -98,16 +99,24 @@ public class StockDataServiceImpl implements IStockDataService { .orderByDesc(TAppStock::getFirstInTime) ); - // 添加查询相同载具号和料号但remainNum小于realNum的数据 - List additionalStockList = appStockService.list(new LambdaQueryWrapper() - .eq(TAppStock::getVehicleId, stockConfirm.getVehicleId()) - .eq(TAppStock::getGoodsId, stockConfirm.getGoodsId()) - .apply("remain_num < real_num") - ); - // 合并两个列表 - if (additionalStockList != null && !additionalStockList.isEmpty()) { - stockList.addAll(additionalStockList); - } +// // 添加查询相同载具号和料号但remainNum小于realNum的数据 +// List additionalStockList = appStockService.list(new LambdaQueryWrapper() +// .eq(TAppStock::getVehicleId, stockConfirm.getVehicleId()) +// .eq(TAppStock::getGoodsId, stockConfirm.getGoodsId()) +// .apply("remain_num < real_num") +// ); +// // 合并两个列表,避免重复添加 +// if (additionalStockList != null && !additionalStockList.isEmpty()) { +// // 获取stockList中已存在的stockId集合 +// Set existingStockIds = stockList.stream() +// .map(TAppStock::getStockId) +// .collect(Collectors.toSet()); +// +// // 只添加不在existingStockIds中的记录 +// additionalStockList.stream() +// .filter(stock -> !existingStockIds.contains(stock.getStockId())) +// .forEach(stockList::add); +// } if (stockList == null || stockList.isEmpty()){ return false; diff --git a/dev_wms_serve/src/main/java/com/wms_main/service/controller/ITaskControllerService.java b/dev_wms_serve/src/main/java/com/wms_main/service/controller/ITaskControllerService.java index 7fa5586..8b0afac 100644 --- a/dev_wms_serve/src/main/java/com/wms_main/service/controller/ITaskControllerService.java +++ b/dev_wms_serve/src/main/java/com/wms_main/service/controller/ITaskControllerService.java @@ -109,6 +109,14 @@ public interface ITaskControllerService { */ BaseWmsApiResponse requestInventory(InventoryRequest inventoryRequest); + /** + * 批量下发盘点请求 + * @param batchInventoryRequest 批量盘点请求 + * @return 请求结果 + */ + BaseWmsApiResponse batchRequestInventory(BatchInventoryRequest batchInventoryRequest); + + /** * 查询盘点任务确认信息 * @param inventoryConfirmRequest 请求 diff --git a/dev_wms_serve/src/main/java/com/wms_main/service/controller/serviceImpl/StockControllerServiceImpl.java b/dev_wms_serve/src/main/java/com/wms_main/service/controller/serviceImpl/StockControllerServiceImpl.java index 3ce2a84..466cba3 100644 --- a/dev_wms_serve/src/main/java/com/wms_main/service/controller/serviceImpl/StockControllerServiceImpl.java +++ b/dev_wms_serve/src/main/java/com/wms_main/service/controller/serviceImpl/StockControllerServiceImpl.java @@ -53,6 +53,13 @@ public class StockControllerServiceImpl implements IStockControllerService { // toDate + 1天的凌晨。 lambdaQueryWrapper.le(TAppStock::getFirstInTime, LocalDateTime.of(stockQuery.getToDate(), LocalDateTime.MAX.toLocalTime())); } + // 新增:处理无使用天数查询 + if (stockQuery.getNoUseDays() != null && stockQuery.getNoUseDays() > 0) { + LocalDateTime thresholdDate = LocalDateTime.now().minusDays(stockQuery.getNoUseDays()); + // 假设 TAppStock 中有 lastUpdateTime 字段记录最后更新时间 + lambdaQueryWrapper.le(TAppStock::getLastUpdateTime, thresholdDate); + } + Page stockPage = appStockService.page(page, lambdaQueryWrapper); PageVo pageVo = PageVo.of(stockPage, StockVo::ofPo); diff --git a/dev_wms_serve/src/main/java/com/wms_main/service/controller/serviceImpl/TaskControllerServiceImpl.java b/dev_wms_serve/src/main/java/com/wms_main/service/controller/serviceImpl/TaskControllerServiceImpl.java index 3f91eeb..e59a1e1 100644 --- a/dev_wms_serve/src/main/java/com/wms_main/service/controller/serviceImpl/TaskControllerServiceImpl.java +++ b/dev_wms_serve/src/main/java/com/wms_main/service/controller/serviceImpl/TaskControllerServiceImpl.java @@ -2081,6 +2081,194 @@ public class TaskControllerServiceImpl implements ITaskControllerService { return BaseWmsApiResponse.success("创建盘点任务成功。"); } + @Override + @Transactional(rollbackFor = Exception.class) + public BaseWmsApiResponse batchRequestInventory(BatchInventoryRequest batchInventoryRequest) { + try { + // 基本参数校验 + if (batchInventoryRequest == null) { + return BaseWmsApiResponse.error("请求为NULL。"); + } + + if (StringUtils.isEmpty(batchInventoryRequest.getInvStand())) { + return BaseWmsApiResponse.error("请求缺少信息,请输入站台号。"); + } + + if (!appStandService.exists(new LambdaQueryWrapper() + .eq(TAppStand::getStandId, batchInventoryRequest.getInvStand()) + .eq(TAppStand::getStandType, 1))) { + return BaseWmsApiResponse.error("非拣选站台不允许盘点。"); + } + + if (batchInventoryRequest.getItems() == null || batchInventoryRequest.getItems().isEmpty()) { + return BaseWmsApiResponse.error("请求缺少盘点项信息。"); + } + + List inventoryList = new ArrayList<>(); + + // 处理每个盘点项 + for (BatchInventoryRequest.InventoryItem item : batchInventoryRequest.getItems()) { + // 验证必填字段 + if (StringUtils.isEmpty(item.getGoodsId())) { + return BaseWmsApiResponse.error("存在缺少料号的盘点项。"); + } + + if (StringUtils.isEmpty(item.getVehicleId())) { + return BaseWmsApiResponse.error("存在缺少载具号的盘点项。"); + } + + // 判断这个料和载具组合有没有还没盘点完的任务 + List existingInventoryList = appInventoryService.list(new LambdaQueryWrapper() + .eq(TAppInventory::getGoodsId, item.getGoodsId()) + .eq(TAppInventory::getVehicleId, item.getVehicleId()) + .and(wrapper -> { + // specialStock匹配逻辑 + if (StringUtils.isEmpty(item.getSpecialStock())) { + // 传入空值,匹配数据库中的NULL或空字符串 + wrapper.isNull(TAppInventory::getSpecialStock) + .or() + .eq(TAppInventory::getSpecialStock, ""); + } else { + // 传入具体值,精确匹配 + wrapper.eq(TAppInventory::getSpecialStock, item.getSpecialStock()); + } + }) + .and(wrapper -> { + // specialStockNo匹配逻辑 + if (StringUtils.isEmpty(item.getSpecialStockNo())) { + // 传入空值,匹配数据库中的NULL或空字符串 + wrapper.isNull(TAppInventory::getSpecialStockNo) + .or() + .eq(TAppInventory::getSpecialStockNo, ""); + } else { + // 传入具体值,精确匹配 + wrapper.eq(TAppInventory::getSpecialStockNo, item.getSpecialStockNo()); + } + }) + .and(wrapper -> { + // specialStockItemNo匹配逻辑 + if (StringUtils.isEmpty(item.getSpecialStockItemNo())) { + // 传入空值,匹配数据库中的NULL或空字符串 + wrapper.isNull(TAppInventory::getSpecialStockItemNo) + .or() + .eq(TAppInventory::getSpecialStockItemNo, ""); + } else { + // 传入具体值,精确匹配 + wrapper.eq(TAppInventory::getSpecialStockItemNo, item.getSpecialStockItemNo()); + } + }) + .and(wrapper -> { + // batchNo匹配逻辑 + if (StringUtils.isEmpty(item.getBatchNo())) { + // 传入空值,匹配数据库中的NULL或空字符串 + wrapper.isNull(TAppInventory::getBatchNo) + .or() + .eq(TAppInventory::getBatchNo, ""); + } else { + // 传入具体值,精确匹配 + wrapper.eq(TAppInventory::getBatchNo, item.getBatchNo()); + } + })); + + if (existingInventoryList != null && !existingInventoryList.isEmpty()) { + return BaseWmsApiResponse.error("载具:" + item.getVehicleId() + " 料号:" + item.getGoodsId() + " 还有盘点任务未完成。"); + } + + // 查询库存验证是否存在 + List stockList = appStockService.list(new LambdaQueryWrapper() + .eq(TAppStock::getGoodsId, item.getGoodsId()) + .eq(TAppStock::getVehicleId, item.getVehicleId()) + .and(wrapper -> { + // specialStock匹配逻辑 + if (StringUtils.isEmpty(item.getSpecialStock())) { + // 传入空值,匹配数据库中的NULL或空字符串 + wrapper.isNull(TAppStock::getSpecialStock) + .or() + .eq(TAppStock::getSpecialStock, ""); + } else { + // 传入具体值,精确匹配 + wrapper.eq(TAppStock::getSpecialStock, item.getSpecialStock()); + } + }) + .and(wrapper -> { + // specialStockNo匹配逻辑 + if (StringUtils.isEmpty(item.getSpecialStockNo())) { + // 传入空值,匹配数据库中的NULL或空字符串 + wrapper.isNull(TAppStock::getSpecialStockNo) + .or() + .eq(TAppStock::getSpecialStockNo, ""); + } else { + // 传入具体值,精确匹配 + wrapper.eq(TAppStock::getSpecialStockNo, item.getSpecialStockNo()); + } + }) + .and(wrapper -> { + // specialStockItemNo匹配逻辑 + if (StringUtils.isEmpty(item.getSpecialStockItemNo())) { + // 传入空值,匹配数据库中的NULL或空字符串 + wrapper.isNull(TAppStock::getSpecialStockItemNo) + .or() + .eq(TAppStock::getSpecialStockItemNo, ""); + } else { + // 传入具体值,精确匹配 + wrapper.eq(TAppStock::getSpecialStockItemNo, item.getSpecialStockItemNo()); + } + }) + .and(wrapper -> { + // batchNo匹配逻辑 + if (StringUtils.isEmpty(item.getBatchNo())) { + // 传入空值,匹配数据库中的NULL或空字符串 + wrapper.isNull(TAppStock::getBatchNo) + .or() + .eq(TAppStock::getBatchNo, ""); + } else { + // 传入具体值,精确匹配 + wrapper.eq(TAppStock::getBatchNo, item.getBatchNo()); + } + })); + + if (stockList == null || stockList.isEmpty()) { + return BaseWmsApiResponse.error("载具:" + item.getVehicleId() + " 物料:" + item.getGoodsId() + " 没有库存。"); + } + + // 创建盘点任务 + TAppInventory inventory = new TAppInventory( + UUIDUtils.getNewUUID(), + item.getGoodsId(), + item.getVehicleId(), + null, + null, + batchInventoryRequest.getInvStand(), + batchInventoryRequest.getInvUser(), + WmsInvTypeEnums.INV_TYPE_1.getCode(), + WmsInvStatusEnums.INIT.getCode(), + WmsInvResultEnums.NONE.getCode(), + LocalDateTime.now(), + null, + UUIDUtils.getNewUUID(), // orderId + item.getSpecialStock(), + item.getSpecialStockNo(), + item.getSpecialStockItemNo(), + item.getBatchNo() + ); + + inventoryList.add(inventory); + } + + // 批量保存盘点任务 + if (!inventoryList.isEmpty()) { + appInventoryService.saveBatch(inventoryList); + } + + return BaseWmsApiResponse.success("批量盘点任务创建成功"); + } catch (Exception e) { + log.error("批量盘点任务创建失败: {}", e.getMessage(), e); + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return BaseWmsApiResponse.error("批量盘点任务创建失败: " + e.getMessage()); + } + } + + /** * 查询盘点确认信息 @@ -2144,8 +2332,14 @@ public class TaskControllerServiceImpl implements ITaskControllerService { if (inventoryConfirmVo != null) { // 返回结果 return WmsApiResponse.success("查询盘点确认信息成功。", inventoryConfirmVo); + }else { + if (thisPickTask.getPickType() == 1){ + return WmsApiResponse.instanceOf(WmsApiResponseCodeEnums.WARNING.getCode(), + "当前箱子有拣选任务,请使用PDA拣选,箱号:" + thisPickTask.getVehicleId() + "。", + null); + } + return WmsApiResponse.instanceOf(WmsApiResponseCodeEnums.WARNING.getCode(), "当前箱子没有要盘点的任务,请检查。", null); } - return WmsApiResponse.instanceOf(WmsApiResponseCodeEnums.WARNING.getCode(), "当前箱子没有要盘点的任务,请放行。", null); } /** @@ -2246,28 +2440,28 @@ public class TaskControllerServiceImpl implements ITaskControllerService { LambdaQueryWrapper stockQueryWrapper = new LambdaQueryWrapper() .eq(TAppStock::getVehicleId, thisPickTask.getVehicleId()); List stockList = appStockService.list(stockQueryWrapper); - // 界面直接点击确认/放行 - if (!stockList.isEmpty()) { - // 判断是否还有其他盘点任务 - List otherInventoryList = appInventoryService.list(new LambdaQueryWrapper() - .eq(TAppInventory::getVehicleId, thisPickTask.getVehicleId()) - .ne(TAppInventory::getInventoryId, inventoryConfirmRequest.getInventoryId())); - if (otherInventoryList != null && !otherInventoryList.isEmpty()) { - return BaseWmsApiResponse.error("当前载具还有其他的盘点任务,请继续盘点。"); - } - // 判断还有没有当前站台的其他拣选任务 - TaskConfirmVo taskConfirmVo = conveyTaskService.getCurrentStandTask(thisPickTask); - if (taskConfirmVo != null) { - return BaseWmsApiResponse.warn("当前载具还有紧急出库任务,请切换到出库界面信息进行拣配。"); - } - WorkConfirmVo resultVo = conveyTaskService.getCurrentStandWork(thisPickTask); - if (resultVo != null) { - return BaseWmsApiResponse.warn("当前载具还有工作,请切换到拣配界面进行拣配。"); - } - } else { - // 取消后续拣选任务 - conveyTaskService.cancelOtherStandPickTasks(thisPickTask.getVehicleId(), thisPickTask.getPickStand()); - } +// // 界面直接点击确认/放行 +// if (!stockList.isEmpty()) { +// // 判断是否还有其他盘点任务 +//// List otherInventoryList = appInventoryService.list(new LambdaQueryWrapper() +//// .eq(TAppInventory::getVehicleId, thisPickTask.getVehicleId()) +//// .ne(TAppInventory::getInventoryId, inventoryConfirmRequest.getInventoryId())); +//// if (otherInventoryList != null && !otherInventoryList.isEmpty()) { +//// return BaseWmsApiResponse.error("当前载具还有其他的盘点任务,请继续盘点。"); +//// } +// // 判断还有没有当前站台的其他拣选任务 +// TaskConfirmVo taskConfirmVo = conveyTaskService.getCurrentStandTask(thisPickTask); +// if (taskConfirmVo != null) { +// return BaseWmsApiResponse.warn("当前载具还有拣选任务,请使用PDA进行拣配。"); +// } +//// WorkConfirmVo resultVo = conveyTaskService.getCurrentStandWork(thisPickTask); +//// if (resultVo != null) { +//// return BaseWmsApiResponse.warn("当前载具还有工作,请切换到拣配界面进行拣配。"); +//// } +// } else { +// // 取消后续拣选任务 +// conveyTaskService.cancelOtherStandPickTasks(thisPickTask.getVehicleId(), thisPickTask.getPickStand()); +// } // 放行 if (conveyTaskService.releaseStandVehicle(thisPickTask)) { return BaseWmsApiResponse.success("确认成功。");