From 4d35a2a33796a1809bdf6b871667e95c2476273e Mon Sep 17 00:00:00 2001 From: Yxq <2290299376@qq.com> Date: Tue, 9 Dec 2025 11:14:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8E=E7=AB=AF=E6=94=B9=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/wms/TaskController.java | 68 ++++++- .../request/wms/InventoryConfirmRequest.java | 24 +++ .../service/business/IStockDataService.java | 2 +- .../serviceImpl/ConveyTaskServiceImpl.java | 62 ++++++- .../serviceImpl/StackerTaskServiceImpl.java | 14 ++ .../serviceImpl/StockDataServiceImpl.java | 67 ++++++- .../TaskControllerServiceImpl.java | 173 ++++++++++++++---- 7 files changed, 356 insertions(+), 54 deletions(-) diff --git a/dev_wms_serve/src/main/java/com/wms_main/controller/wms/TaskController.java b/dev_wms_serve/src/main/java/com/wms_main/controller/wms/TaskController.java index cae68f6..37d1b26 100644 --- a/dev_wms_serve/src/main/java/com/wms_main/controller/wms/TaskController.java +++ b/dev_wms_serve/src/main/java/com/wms_main/controller/wms/TaskController.java @@ -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 stockList = appStockService.list(new LambdaQueryWrapper() + .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 + ); } /** diff --git a/dev_wms_serve/src/main/java/com/wms_main/model/dto/request/wms/InventoryConfirmRequest.java b/dev_wms_serve/src/main/java/com/wms_main/model/dto/request/wms/InventoryConfirmRequest.java index 888a261..e123392 100644 --- a/dev_wms_serve/src/main/java/com/wms_main/model/dto/request/wms/InventoryConfirmRequest.java +++ b/dev_wms_serve/src/main/java/com/wms_main/model/dto/request/wms/InventoryConfirmRequest.java @@ -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; } diff --git a/dev_wms_serve/src/main/java/com/wms_main/service/business/IStockDataService.java b/dev_wms_serve/src/main/java/com/wms_main/service/business/IStockDataService.java index 1ac4f07..e5725fa 100644 --- a/dev_wms_serve/src/main/java/com/wms_main/service/business/IStockDataService.java +++ b/dev_wms_serve/src/main/java/com/wms_main/service/business/IStockDataService.java @@ -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); /** * 查询库存预警值 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 dec1d8f..bf8317a 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( @@ -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 sumNumByGoodsMap = new HashMap<>(); + Map 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 pickTasks = appPickTaskService.list(new LambdaQueryWrapper() .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() : ""); + } + } diff --git a/dev_wms_serve/src/main/java/com/wms_main/service/business/serviceImpl/StackerTaskServiceImpl.java b/dev_wms_serve/src/main/java/com/wms_main/service/business/serviceImpl/StackerTaskServiceImpl.java index a8704f9..ff1fbe1 100644 --- a/dev_wms_serve/src/main/java/com/wms_main/service/business/serviceImpl/StackerTaskServiceImpl.java +++ b/dev_wms_serve/src/main/java/com/wms_main/service/business/serviceImpl/StackerTaskServiceImpl.java @@ -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); } 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 2be3488..3f1fa54 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 @@ -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 stockList = appStockService.list(new LambdaQueryWrapper() .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 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); + } + + if (stockList == null || stockList.isEmpty()){ + return false; + } + // 更新列表 List removeStocks = new ArrayList<>(); List updateStocks = new ArrayList<>(); @@ -138,6 +198,7 @@ public class StockDataServiceImpl implements IStockDataService { if (!stockUpdateList.isEmpty()) { appStockUpdateService.saveBatch(stockUpdateList); } + return true; } /** 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 99bb6c9..e599b25 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 @@ -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() +// .eq(TAppTempEwmInboundData::getContainerNo, vehicleNo) +// .eq(TAppTempEwmInboundData::getProcessStatus, 0)); +// +// log.info("删除旧的EWM临时数据: {} 条,载具号: {}", deletedCount, vehicleNo); +// +// // 转换并保存数据 +// List 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返回的数据保存到临时表中,并根据goodsId、specialStock、specialStockNo、specialStockItemNo、batchNo进行合并 * @param response EWM接口返回的数据 * @param vehicleNo 载具号 */ @@ -1110,32 +1165,53 @@ public class TaskControllerServiceImpl implements ITaskControllerService { log.info("删除旧的EWM临时数据: {} 条,载具号: {}", deletedCount, vehicleNo); // 转换并保存数据 - List dataList = new ArrayList<>(); + Map dataMap = new HashMap<>(); 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); + // 构建唯一键用于识别相同记录 + 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()); + 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()); + dataMap.put(key, data); + } } + // 将Map中的值转换为List + List dataList = new ArrayList<>(dataMap.values()); + if (!dataList.isEmpty()) { // 批量插入时指定合理的批次大小 boolean saveResult = tempEwmInboundDataService.saveBatch(dataList); @@ -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() - .eq(TAppPickTask::getVehicleId, thisPickTask.getVehicleId()) - .eq(TAppPickTask::getPickStatus, WmsPickTaskStatusEnum.ARRIVE.getCode()) - )){ - return BaseWmsApiResponse.success("继续拣选"); - } +// if (appPickTaskService.exists(new LambdaQueryWrapper() +// .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,12 +2419,20 @@ public class TaskControllerServiceImpl implements ITaskControllerService { requestForCompleted.setWaveNo(thisOut.getFirst().getWaveNo()); requestForCompleted.setPickingType(thisOut.getFirst().getPickingType()); - // 清除拣选计划 - LambdaQueryWrapper pickPlanQueryWrapper = new LambdaQueryWrapper() - .eq(TAppPickPlan::getWorkIndex, confirmTaskRequest.getTaskConfirm().getTaskId()); - if (confirmTaskRequest.getStockConfirm() != null && StringUtils.isNotEmpty(confirmTaskRequest.getStockConfirm().getVehicleId())) { - // 箱号 - pickPlanQueryWrapper.eq(TAppPickPlan::getVehicleId, confirmTaskRequest.getStockConfirm().getVehicleId()); + + int isEmpty = confirmTaskRequest.getTaskConfirm().getIsEmpty(); + LambdaQueryWrapper pickPlanQueryWrapper; + if (isEmpty == 0){ + pickPlanQueryWrapper = new LambdaQueryWrapper() + .eq(TAppPickPlan::getPlanId, thisOut.getFirst().getPickPlanId()); + }else{ + // 清除拣选计划 + pickPlanQueryWrapper = new LambdaQueryWrapper() + .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 "";