diff --git a/src/main/java/com/wms/controller/ExcelController.java b/src/main/java/com/wms/controller/ExcelController.java index dd97414..48c0a03 100644 --- a/src/main/java/com/wms/controller/ExcelController.java +++ b/src/main/java/com/wms/controller/ExcelController.java @@ -99,7 +99,8 @@ public class ExcelController { } catch (Exception e) { // 回滚事务 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); - logger.error("查询上传记录发生异常:{}", convertJsonString(e)); + e.printStackTrace(); + logger.error("查询上传记录发生异常:{}", e.getMessage()); response.setCode(ResponseCode.ERROR.getCode()); response.setMessage("查询上传记录发生异常"); return convertJsonString(response); diff --git a/src/main/java/com/wms/controller/GoodsController.java b/src/main/java/com/wms/controller/GoodsController.java index 636e848..ee43c98 100644 --- a/src/main/java/com/wms/controller/GoodsController.java +++ b/src/main/java/com/wms/controller/GoodsController.java @@ -135,7 +135,8 @@ public class GoodsController { } catch (Exception e) { // 回滚事务 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); - logger.error("更新物料信息发生异常:{}", convertJsonString(e)); + e.printStackTrace(); + logger.error("更新物料信息发生异常:{}", e.getMessage()); // 返回其他异常 rsp.setCode(ResponseCode.ERROR.getCode()); rsp.setMessage("更新物料信息发生异常"); diff --git a/src/main/java/com/wms/controller/KateWorkQueryController.java b/src/main/java/com/wms/controller/KateWorkQueryController.java index 2b4b722..26c533d 100644 --- a/src/main/java/com/wms/controller/KateWorkQueryController.java +++ b/src/main/java/com/wms/controller/KateWorkQueryController.java @@ -114,7 +114,8 @@ public class KateWorkQueryController { } catch (Exception e) { // 回滚事务 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); - logger.error("查询DBS发生异常:{}", convertJsonString(e)); + e.printStackTrace(); + logger.error("查询DBS发生异常:{}", e.getMessage()); response.setCode(ResponseCode.ERROR.getCode()); response.setMessage("查询DBS发生异常"); return convertJsonString(response); diff --git a/src/main/java/com/wms/controller/MonitorController.java b/src/main/java/com/wms/controller/MonitorController.java index 91139c0..fb88a6c 100644 --- a/src/main/java/com/wms/controller/MonitorController.java +++ b/src/main/java/com/wms/controller/MonitorController.java @@ -8,6 +8,8 @@ import com.wms.entity.app.monitor.WorkInfoByStand; import com.wms.entity.table.*; import com.wms.service.*; import lombok.RequiredArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.CrossOrigin; @@ -31,6 +33,7 @@ import static com.wms.utils.StringUtils.convertJsonString; @RequestMapping(value = "/monitor") @RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class MonitorController { + private final static Logger logger = LoggerFactory.getLogger(MonitorController.class); private final LocationService locationService; private final WorkFlowService workFlowService; private final WorkSummaryService workSummaryService; @@ -68,7 +71,7 @@ public class MonitorController { response.setEmpty(0); response.setEmptyUsed(0); } - System.out.println("结束执行getLocationUseDetail方法:"+(System.currentTimeMillis()-l)); + logger.info("结束执行getLocationUseDetail方法:{}",(System.currentTimeMillis()-l)); return convertJsonString(response); } diff --git a/src/main/java/com/wms/controller/TaskController.java b/src/main/java/com/wms/controller/TaskController.java index c1ff7ef..b934cfb 100644 --- a/src/main/java/com/wms/controller/TaskController.java +++ b/src/main/java/com/wms/controller/TaskController.java @@ -169,6 +169,12 @@ public class TaskController { private final WorkSummaryService workSummaryService; private final InventoryHistoryService inventoryHistoryService; + + // 定义全局锁对象 为了电子标签反馈消息互斥 + private static final Object GLOBAL_LOCK = new Object(); +// private static final Object GLOBAL_REC_TASK_LOCK = new Object(); +// private static final Object GLOBAL_CONFIRM_FINISH_LOCK = new Object(); + /** * 接收入库任务请求 * @@ -304,312 +310,314 @@ public class TaskController { logger.info("接收到任务反馈:{},ip地址:{}", convertJsonString(wcsTaskResultRequest), HttpUtils.getIpAddr(servletRequest)); // 创建响应信息 ResponseEntity response = new ResponseEntity(); - try { - String validateInfo = validateService.validateTaskResult(wcsTaskResultRequest); - if (!Objects.equals(validateInfo, TaskResultValidationEnum.OK.getErrorMessage())) { - logger.error("任务反馈请求验证失败:{}", validateInfo); - // 返回其他异常 - response.setCode(ResponseCode.ERROR.getCode()); - response.setMessage("任务反馈请求验证失败:" + validateInfo); - return convertJsonString(response); - } - // 解析任务号 - List feedBackTasks = taskService.list(new LambdaQueryWrapper().eq(Task::getTaskGroup, wcsTaskResultRequest.getTaskId())); - // 任务状态 - int taskType = feedBackTasks.get(0).getTaskType(); - // 任务状态 - int taskStatus = wcsTaskResultRequest.getTaskStatus(); - // 判断任务状态 - if (taskStatus == WcsTaskStatus.FINISH.getCode()) {// 任务完成 - // 入库任务完成 - if (taskType == TaskType.IN.getCode()) { - // 对所有任务组里面的入库任务进行处理 - for (Task inTask : feedBackTasks) { - if (!Objects.equals(inTask.getTaskType(), TaskType.IN.getCode())) { - // 非入库任务跳过 - continue; - } - // 当前载具是否有移库任务 - boolean haveMoveTask = taskService.exists(new LambdaQueryWrapper() - .eq(Task::getVehicleId, inTask.getVehicleId()) - .eq(Task::getTaskType, TaskType.MOVE.getCode())); - // 如果是入库 - if (inTask.getTaskId().startsWith("RK")) { - // 添加库存 - if (inTask.getGoodsRelated() != null && StringUtils.isNotEmpty(inTask.getGoodsRelated().getGoodsId())) { - // 查询这个物料有没有库存 - Stock existStock = stockService.getOne(new LambdaQueryWrapper() - .apply("goods_related ->> '$.goodsId' = {0}" + MYSQL_JSON_CI, inTask.getGoodsRelated().getGoodsId()) - .eq(Stock::getVehicleId, inTask.getVehicleId()) - .last("limit 1")); - if (existStock != null) { - Stock originStock = BeanUtil.copyProperties(existStock, Stock.class); - BigDecimal quantityBefore = originStock.getGoodsRelated().getRemainNum(); - // 已有库存,直接更新数量 - existStock.setLocationId(inTask.getDestination()); - existStock.getGoodsRelated().setRemainNum(existStock.getGoodsRelated().getRemainNum().add(inTask.getGoodsRelated().getOpNum())); - existStock.getGoodsRelated().setTotalNum(existStock.getGoodsRelated().getTotalNum().add(inTask.getGoodsRelated().getOpNum())); - stockService.update(existStock, new LambdaUpdateWrapper().eq(Stock::getStockId, existStock.getStockId())); - stockUpdateRecordService.addStockUpdateRecord(originStock, existStock, StockUpdateReasonEnum.UPDATE_IN.getReason(), inTask.getUserName(), quantityBefore); - } else { - Stock newStock = new Stock(); - newStock.setStockId(generateId("ST_")); - newStock.setVehicleId(inTask.getVehicleId()); - newStock.setLocationId(inTask.getDestination()); - newStock.setNoUseDays(0); - newStock.setIsInventory(0); - newStock.setCreateTime(LocalDateTime.now()); - newStock.setWeight(inTask.getWeight()); - newStock.setGoodsType(inTask.getGoodsRelated().getGoodsType()); - StockDetailInfo detailInfo = new StockDetailInfo(); - detailInfo.setGoodsId(inTask.getGoodsRelated().getGoodsId()); - detailInfo.setGoodsName(inTask.getGoodsRelated().getGoodsName()); - detailInfo.setGoodsStatus(GoodsStatus.OK.getCode()); - detailInfo.setRemainNum(inTask.getGoodsRelated().getOpNum()); - detailInfo.setTotalNum(inTask.getGoodsRelated().getOpNum()); - newStock.setGoodsRelated(detailInfo); - stockService.save(newStock); - stockUpdateRecordService.addStockUpdateRecord(null, newStock, StockUpdateReasonEnum.ADD_IN.getReason(), inTask.getUserName(), BigDecimal.ZERO); - } - // 消除看板 - Goods goods = goodsService.getOne(new LambdaQueryWrapper().eq(Goods::getGoodsId, inTask.getGoodsRelated().getGoodsId()).last("limit 1")); - if (goods != null && goods.getFeedingType().equals("PULL")) { - if (goods.getKanbanList() != null && !goods.getKanbanList().isEmpty()) { - BigDecimal kanbanQuantity = inTask.getGoodsRelated().getOpNum().divide(goods.getQuantityPerKanban(), 0, RoundingMode.FLOOR); - // 查这个料的看板需求 - List waitForUpdateKanban = new ArrayList<>(); - List kanbanList = kanbanService.list(new LambdaQueryWrapper() - .eq(Kanban::getGoodsId, goods.getGoodsId()) - .eq(Kanban::getKanbanStatus, 0) - .orderByAsc(Kanban::getLastRequestTime)); - for (Kanban kanban : kanbanList) { - if (kanbanQuantity.compareTo(BigDecimal.ZERO) <= 0) { - break; - } - kanban.setKanbanStatus(1); - kanban.setLastPullTime(LocalDateTime.now()); - waitForUpdateKanban.add(kanban); - kanbanQuantity = kanbanQuantity.subtract(BigDecimal.ONE); - } - // 更新看板信息 - kanbanService.updateBatchById(waitForUpdateKanban); - } - } - } - } - // 更新库存状态 - List backStocks = stockService.list(new LambdaQueryWrapper() - .eq(Stock::getVehicleId, inTask.getVehicleId())); - for (Stock stock : backStocks) { - if (stock.getGoodsRelated().getRemainNum().compareTo(BigDecimal.ZERO) == 0) { - // 库存数量为0时要删除当前库存 - stockService.removeById(stock.getStockId()); - } else { - if (haveMoveTask) { - // 后续有移库 - stock.setStockStatus(StockStatus.MOVE.getCode()); - } else { - // 后续没有移库 - stock.setStockStatus(StockStatus.OK.getCode()); - } - stock.setLocationId(inTask.getDestination()); - stock.setLastUpdateTime(LocalDateTime.now()); - stock.setLastUpdateUser(inTask.getUserName()); - stockService.update(stock, new LambdaUpdateWrapper().eq(Stock::getStockId, stock.getStockId())); - } - } - // 当前载具 - Vehicle currentVehicle = vehicleService.getOne(new LambdaQueryWrapper().eq(Vehicle::getVehicleId, inTask.getVehicleId()).last("limit 1")); - if (currentVehicle == null) { - // 添加载具 - Vehicle newVehicle = new Vehicle(); - newVehicle.setVehicleId(inTask.getVehicleId()); - newVehicle.setVehicleType(""); - newVehicle.setVehicleStatus(VehicleStatus.ON.getCode()); - newVehicle.setCurrentLocation(inTask.getDestination()); - if (haveMoveTask) { - newVehicle.setVehicleStatus(VehicleStatus.MOVE.getCode()); - } else { - newVehicle.setVehicleStatus(VehicleStatus.ON.getCode()); - } - boolean haveStocks = stockService.exists(new LambdaQueryWrapper().eq(Stock::getVehicleId, inTask.getVehicleId())); - if (haveStocks) { - newVehicle.setIsEmpty(0); - } else { - newVehicle.setIsEmpty(1); - } - // 设置当前料箱的类型 - if (inTask.getGoodsRelated() != null && inTask.getGoodsRelated().getGoodsType() != null && inTask.getGoodsRelated().getGoodsId() != null) { - newVehicle.setVehicleType(inTask.getGoodsRelated().getGoodsType()); - if (Objects.equals(newVehicle.getVehicleType(), "间接物料")) { - // 如果是间接物料,则设置配对物料 - List vehicleDetailInfos = new ArrayList<>(); - vehicleDetailInfos.add(new VehicleDetailInfo(inTask.getGoodsRelated().getGoodsId())); - newVehicle.setDetails(vehicleDetailInfos); - } - } - newVehicle.setLastInTime(LocalDateTime.now()); - vehicleService.save(newVehicle); - } else { - // 更新载具 - currentVehicle.setCurrentLocation(inTask.getDestination()); - if (haveMoveTask) { - currentVehicle.setVehicleStatus(VehicleStatus.MOVE.getCode()); - } else { - currentVehicle.setVehicleStatus(VehicleStatus.ON.getCode()); - } - boolean haveStocks = stockService.exists(new LambdaQueryWrapper().eq(Stock::getVehicleId, inTask.getVehicleId())); - if (haveStocks) { - currentVehicle.setIsEmpty(0); - } else { - currentVehicle.setIsEmpty(1); - } - if (inTask.getGoodsRelated() != null && inTask.getGoodsRelated().getGoodsType() != null && inTask.getGoodsRelated().getGoodsId() != null) { - currentVehicle.setVehicleType(inTask.getGoodsRelated().getGoodsType()); - if (Objects.equals(currentVehicle.getVehicleType(), "间接物料")) { - // 如果是间接物料,则设置配对物料 - List vehicleDetailInfos = currentVehicle.getDetails() == null ? new ArrayList<>() : currentVehicle.getDetails(); - if (!vehicleDetailInfos.stream().map(VehicleDetailInfo::getGoodsId).toList().contains(inTask.getGoodsRelated().getGoodsId())) { - vehicleDetailInfos.add(new VehicleDetailInfo(inTask.getGoodsRelated().getGoodsId())); - currentVehicle.setDetails(vehicleDetailInfos); - } - } - } - currentVehicle.setLastInTime(LocalDateTime.now()); - vehicleService.update(currentVehicle, new LambdaUpdateWrapper().eq(Vehicle::getVehicleId, currentVehicle.getVehicleId())); - } - // 添加任务记录 - inTask.setTaskStatus(WmsTaskStatus.FINISH.getCode()); - inTask.setFinishTime(LocalDateTime.now()); - taskRecordService.save(BeanUtil.copyProperties(inTask, TaskRecord.class)); - // 删除移库任务 - taskService.remove(new LambdaQueryWrapper().eq(Task::getTaskId, inTask.getTaskId())); - // 移除当前料箱所有的拣选任务 - pickTaskService.remove(new LambdaQueryWrapper().eq(PickTask::getVehicleId, inTask.getVehicleId())); - // 移除当前料箱所有的outsideVehicles - outsideVehiclesService.remove(new LambdaQueryWrapper().eq(OutsideVehicles::getVehicleId, inTask.getVehicleId())); - // 清除当前料箱的所有盘点任务 - inventoryService.remove(new LambdaQueryWrapper().eq(InventoryList::getVehicleId, inTask.getVehicleId())); - } - } - // 出库任务 - if (taskType == TaskType.OUT.getCode()) { - // 对所有任务组里面的出库任务进行处理 - for (Task outTask : feedBackTasks) { - if (!Objects.equals(outTask.getTaskType(), TaskType.OUT.getCode())) { - // 非出库任务跳过 - continue; - } - // 查询到当前料箱 - Vehicle outVehicle = vehicleService.getOne(new LambdaQueryWrapper().eq(Vehicle::getVehicleId, outTask.getVehicleId())); - if (outTask.getIsPicking() == 1) { - // 当前载具设置为出库中状态 - vehicleService.update(new LambdaUpdateWrapper() - .set(Vehicle::getVehicleStatus, VehicleStatus.OUT.getCode()) - .eq(Vehicle::getVehicleId, outTask.getVehicleId()) - .ne(Vehicle::getVehicleStatus, VehicleStatus.OUT.getCode())); - // 当前载具上所有库存状态设置为拣选 - stockService.update(new LambdaUpdateWrapper() - .set(Stock::getStockStatus, StockStatus.PICKING.getCode()) - .eq(Stock::getVehicleId, outTask.getVehicleId()) - .ne(Stock::getStockStatus, StockStatus.PICKING.getCode())); - // 将该载具对应的拣选任务设置为可发送状态 - pickTaskService.update(new LambdaUpdateWrapper() - .set(PickTask::getPickStatus, PickTaskStatusEnum.NEW.getCode()) - .eq(PickTask::getVehicleId, outTask.getVehicleId()) - .eq(PickTask::getPickStatus, PickTaskStatusEnum.TEMP.getCode())); - // 设置特殊 - standStackerTaskService.update(new LambdaUpdateWrapper() - .set(StandStackerTask::getTaskStatus, 1) - .set(StandStackerTask::getFinishTime, LocalDateTime.now()) - .eq(StandStackerTask::getVehicleId, outTask.getVehicleId()) - .ne(StandStackerTask::getTaskStatus, 1)); - } else {// 代表整出 - // 删除当前载具上所有库存 - List removeStocks = stockService.list(new LambdaQueryWrapper().eq(Stock::getVehicleId, outTask.getVehicleId())); - for (Stock stock : removeStocks) { - stockUpdateRecordService.addStockUpdateRecord(stock, null, StockUpdateReasonEnum.FULL_OUT.getReason(), outTask.getUserName(), stock.getGoodsRelated().getRemainNum()); - } - stockService.remove(new LambdaQueryWrapper().eq(Stock::getVehicleId, outTask.getVehicleId())); - // 删除当前载具的所有拣选任务 - pickTaskService.remove(new LambdaQueryWrapper().eq(PickTask::getVehicleId, outTask.getVehicleId())); - } - // 添加任务记录 - outTask.setTaskStatus(WmsTaskStatus.FINISH.getCode()); - outTask.setFinishTime(LocalDateTime.now()); - taskRecordService.save(BeanUtil.copyProperties(outTask, TaskRecord.class)); - // 删除出库任务 - taskService.remove(new LambdaQueryWrapper().eq(Task::getTaskId, outTask.getTaskId())); - // 释放原来的库位 - if (outVehicle == null || !Objects.equals(outVehicle.getVehicleType(), "间接物料")) { - locationService.update(new LambdaUpdateWrapper() - .set(Location::getLocationStatus, LocationStatus.EMPTY.getCode()) - .set(Location::getVehicleId, "") - .eq(Location::getLocationId, outTask.getOrigin())); - } - } - } - // 移库任务完成 - if (taskType == TaskType.MOVE.getCode()) { - // 对所有任务组里面的移库任务进行处理 - for (Task moveTask : feedBackTasks) { - if (!Objects.equals(moveTask.getTaskType(), TaskType.MOVE.getCode())) { - // 非移库任务跳过 - continue; - } - // 更新库存 - LambdaUpdateWrapper lambdaUpdateWrapperOfStock = new LambdaUpdateWrapper() - .set(Stock::getLocationId, moveTask.getDestination()) - .set(Stock::getStockStatus, StockStatus.OK.getCode()) - .set(Stock::getLastUpdateTime, LocalDateTime.now()) - .set(Stock::getLastUpdateUser, moveTask.getUserName()) - .eq(Stock::getVehicleId, moveTask.getVehicleId()) - .eq(Stock::getStockStatus, StockStatus.MOVE.getCode()); - stockService.update(lambdaUpdateWrapperOfStock); - // 更新载具 - LambdaUpdateWrapper lambdaUpdateWrapperOfVehicle = new LambdaUpdateWrapper() - .set(Vehicle::getVehicleStatus, VehicleStatus.ON.getCode()) - .set(Vehicle::getCurrentLocation, moveTask.getDestination()) - .eq(Vehicle::getVehicleId, moveTask.getVehicleId()) - .eq(Vehicle::getVehicleStatus, VehicleStatus.MOVE.getCode()); - vehicleService.update(lambdaUpdateWrapperOfVehicle); - // 释放原来的库位 - LambdaUpdateWrapper lambdaUpdateWrapperOfLocation = new LambdaUpdateWrapper() - .set(Location::getLocationStatus, LocationStatus.EMPTY.getCode()) - .set(Location::getVehicleId, "") - .eq(Location::getLocationId, moveTask.getOrigin()) - .eq(Location::getLocationStatus, LocationStatus.OCCUPY.getCode()); - locationService.update(lambdaUpdateWrapperOfLocation); - // 添加任务记录 - moveTask.setTaskStatus(WmsTaskStatus.FINISH.getCode()); - moveTask.setFinishTime(LocalDateTime.now()); - taskRecordService.save(BeanUtil.copyProperties(moveTask, TaskRecord.class)); - // 删除移库任务 - taskService.remove(new LambdaQueryWrapper().eq(Task::getTaskId, moveTask.getTaskId())); - } - } - } else if (taskStatus == WcsTaskStatus.RUN.getCode()) {// 任务开始运行 - // 更新任务状态为正在运行 - for (Task task : feedBackTasks) { - task.setTaskStatus(WmsTaskStatus.RUN.getCode()); - } - taskService.updateBatchById(feedBackTasks); - } - - // 返回成功 - logger.info("处理任务反馈成功"); - response.setCode(ResponseCode.OK.getCode()); - response.setMessage("处理任务反馈成功"); - return convertJsonString(response); - } catch (Exception e) { - // 回滚事务 - TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); - logger.error("发生异常:{}", convertJsonString(e)); + String validateInfo = validateService.validateTaskResult(wcsTaskResultRequest); + if (!Objects.equals(validateInfo, TaskResultValidationEnum.OK.getErrorMessage())) { + logger.error("任务反馈请求验证失败:{}", validateInfo); // 返回其他异常 response.setCode(ResponseCode.ERROR.getCode()); - response.setMessage("任务反馈发生异常"); + response.setMessage("任务反馈请求验证失败:" + validateInfo); return convertJsonString(response); } + synchronized (GLOBAL_LOCK) { + try { + // 解析任务号 + List feedBackTasks = taskService.list(new LambdaQueryWrapper().eq(Task::getTaskGroup, wcsTaskResultRequest.getTaskId())); + // 任务状态 + int taskType = feedBackTasks.get(0).getTaskType(); + // 任务状态 + int taskStatus = wcsTaskResultRequest.getTaskStatus(); + // 判断任务状态 + if (taskStatus == WcsTaskStatus.FINISH.getCode()) {// 任务完成 + // 入库任务完成 + if (taskType == TaskType.IN.getCode()) { + // 对所有任务组里面的入库任务进行处理 + for (Task inTask : feedBackTasks) { + if (!Objects.equals(inTask.getTaskType(), TaskType.IN.getCode())) { + // 非入库任务跳过 + continue; + } + // 当前载具是否有移库任务 + boolean haveMoveTask = taskService.exists(new LambdaQueryWrapper() + .eq(Task::getVehicleId, inTask.getVehicleId()) + .eq(Task::getTaskType, TaskType.MOVE.getCode())); + // 如果是入库 + if (inTask.getTaskId().startsWith("RK")) { + // 添加库存 + if (inTask.getGoodsRelated() != null && StringUtils.isNotEmpty(inTask.getGoodsRelated().getGoodsId())) { + // 查询这个物料有没有库存 + Stock existStock = stockService.getOne(new LambdaQueryWrapper() + .apply("goods_related ->> '$.goodsId' = {0}" + MYSQL_JSON_CI, inTask.getGoodsRelated().getGoodsId()) + .eq(Stock::getVehicleId, inTask.getVehicleId()) + .last("limit 1")); + if (existStock != null) { + Stock originStock = BeanUtil.copyProperties(existStock, Stock.class); + BigDecimal quantityBefore = originStock.getGoodsRelated().getRemainNum(); + // 已有库存,直接更新数量 + existStock.setLocationId(inTask.getDestination()); + existStock.getGoodsRelated().setRemainNum(existStock.getGoodsRelated().getRemainNum().add(inTask.getGoodsRelated().getOpNum())); + existStock.getGoodsRelated().setTotalNum(existStock.getGoodsRelated().getTotalNum().add(inTask.getGoodsRelated().getOpNum())); + stockService.update(existStock, new LambdaUpdateWrapper().eq(Stock::getStockId, existStock.getStockId())); + stockUpdateRecordService.addStockUpdateRecord(originStock, existStock, StockUpdateReasonEnum.UPDATE_IN.getReason(), inTask.getUserName(), quantityBefore); + } else { + Stock newStock = new Stock(); + newStock.setStockId(generateId("ST_")); + newStock.setVehicleId(inTask.getVehicleId()); + newStock.setLocationId(inTask.getDestination()); + newStock.setNoUseDays(0); + newStock.setIsInventory(0); + newStock.setCreateTime(LocalDateTime.now()); + newStock.setWeight(inTask.getWeight()); + newStock.setGoodsType(inTask.getGoodsRelated().getGoodsType()); + StockDetailInfo detailInfo = new StockDetailInfo(); + detailInfo.setGoodsId(inTask.getGoodsRelated().getGoodsId()); + detailInfo.setGoodsName(inTask.getGoodsRelated().getGoodsName()); + detailInfo.setGoodsStatus(GoodsStatus.OK.getCode()); + detailInfo.setRemainNum(inTask.getGoodsRelated().getOpNum()); + detailInfo.setTotalNum(inTask.getGoodsRelated().getOpNum()); + newStock.setGoodsRelated(detailInfo); + stockService.save(newStock); + stockUpdateRecordService.addStockUpdateRecord(null, newStock, StockUpdateReasonEnum.ADD_IN.getReason(), inTask.getUserName(), BigDecimal.ZERO); + } + // 消除看板 + Goods goods = goodsService.getOne(new LambdaQueryWrapper().eq(Goods::getGoodsId, inTask.getGoodsRelated().getGoodsId()).last("limit 1")); + if (goods != null && goods.getFeedingType().equals("PULL")) { + if (goods.getKanbanList() != null && !goods.getKanbanList().isEmpty()) { + BigDecimal kanbanQuantity = inTask.getGoodsRelated().getOpNum().divide(goods.getQuantityPerKanban(), 0, RoundingMode.FLOOR); + // 查这个料的看板需求 + List waitForUpdateKanban = new ArrayList<>(); + List kanbanList = kanbanService.list(new LambdaQueryWrapper() + .eq(Kanban::getGoodsId, goods.getGoodsId()) + .eq(Kanban::getKanbanStatus, 0) + .orderByAsc(Kanban::getLastRequestTime)); + for (Kanban kanban : kanbanList) { + if (kanbanQuantity.compareTo(BigDecimal.ZERO) <= 0) { + break; + } + kanban.setKanbanStatus(1); + kanban.setLastPullTime(LocalDateTime.now()); + waitForUpdateKanban.add(kanban); + kanbanQuantity = kanbanQuantity.subtract(BigDecimal.ONE); + } + // 更新看板信息 + kanbanService.updateBatchById(waitForUpdateKanban); + } + } + } + } + // 更新库存状态 + List backStocks = stockService.list(new LambdaQueryWrapper() + .eq(Stock::getVehicleId, inTask.getVehicleId())); + for (Stock stock : backStocks) { + if (stock.getGoodsRelated().getRemainNum().compareTo(BigDecimal.ZERO) == 0) { + // 库存数量为0时要删除当前库存 + stockService.removeById(stock.getStockId()); + } else { + if (haveMoveTask) { + // 后续有移库 + stock.setStockStatus(StockStatus.MOVE.getCode()); + } else { + // 后续没有移库 + stock.setStockStatus(StockStatus.OK.getCode()); + } + stock.setLocationId(inTask.getDestination()); + stock.setLastUpdateTime(LocalDateTime.now()); + stock.setLastUpdateUser(inTask.getUserName()); + stockService.update(stock, new LambdaUpdateWrapper().eq(Stock::getStockId, stock.getStockId())); + } + } + // 当前载具 + Vehicle currentVehicle = vehicleService.getOne(new LambdaQueryWrapper().eq(Vehicle::getVehicleId, inTask.getVehicleId()).last("limit 1")); + if (currentVehicle == null) { + // 添加载具 + Vehicle newVehicle = new Vehicle(); + newVehicle.setVehicleId(inTask.getVehicleId()); + newVehicle.setVehicleType(""); + newVehicle.setVehicleStatus(VehicleStatus.ON.getCode()); + newVehicle.setCurrentLocation(inTask.getDestination()); + if (haveMoveTask) { + newVehicle.setVehicleStatus(VehicleStatus.MOVE.getCode()); + } else { + newVehicle.setVehicleStatus(VehicleStatus.ON.getCode()); + } + boolean haveStocks = stockService.exists(new LambdaQueryWrapper().eq(Stock::getVehicleId, inTask.getVehicleId())); + if (haveStocks) { + newVehicle.setIsEmpty(0); + } else { + newVehicle.setIsEmpty(1); + } + // 设置当前料箱的类型 + if (inTask.getGoodsRelated() != null && inTask.getGoodsRelated().getGoodsType() != null && inTask.getGoodsRelated().getGoodsId() != null) { + newVehicle.setVehicleType(inTask.getGoodsRelated().getGoodsType()); + if (Objects.equals(newVehicle.getVehicleType(), "间接物料")) { + // 如果是间接物料,则设置配对物料 + List vehicleDetailInfos = new ArrayList<>(); + vehicleDetailInfos.add(new VehicleDetailInfo(inTask.getGoodsRelated().getGoodsId())); + newVehicle.setDetails(vehicleDetailInfos); + } + } + newVehicle.setLastInTime(LocalDateTime.now()); + vehicleService.save(newVehicle); + } else { + // 更新载具 + currentVehicle.setCurrentLocation(inTask.getDestination()); + if (haveMoveTask) { + currentVehicle.setVehicleStatus(VehicleStatus.MOVE.getCode()); + } else { + currentVehicle.setVehicleStatus(VehicleStatus.ON.getCode()); + } + boolean haveStocks = stockService.exists(new LambdaQueryWrapper().eq(Stock::getVehicleId, inTask.getVehicleId())); + if (haveStocks) { + currentVehicle.setIsEmpty(0); + } else { + currentVehicle.setIsEmpty(1); + } + if (inTask.getGoodsRelated() != null && inTask.getGoodsRelated().getGoodsType() != null && inTask.getGoodsRelated().getGoodsId() != null) { + currentVehicle.setVehicleType(inTask.getGoodsRelated().getGoodsType()); + if (Objects.equals(currentVehicle.getVehicleType(), "间接物料")) { + // 如果是间接物料,则设置配对物料 + List vehicleDetailInfos = currentVehicle.getDetails() == null ? new ArrayList<>() : currentVehicle.getDetails(); + if (!vehicleDetailInfos.stream().map(VehicleDetailInfo::getGoodsId).toList().contains(inTask.getGoodsRelated().getGoodsId())) { + vehicleDetailInfos.add(new VehicleDetailInfo(inTask.getGoodsRelated().getGoodsId())); + currentVehicle.setDetails(vehicleDetailInfos); + } + } + } + currentVehicle.setLastInTime(LocalDateTime.now()); + vehicleService.update(currentVehicle, new LambdaUpdateWrapper().eq(Vehicle::getVehicleId, currentVehicle.getVehicleId())); + } + // 添加任务记录 + inTask.setTaskStatus(WmsTaskStatus.FINISH.getCode()); + inTask.setFinishTime(LocalDateTime.now()); + taskRecordService.save(BeanUtil.copyProperties(inTask, TaskRecord.class)); + // 删除移库任务 + taskService.remove(new LambdaQueryWrapper().eq(Task::getTaskId, inTask.getTaskId())); + // 移除当前料箱所有的拣选任务 + pickTaskService.remove(new LambdaQueryWrapper().eq(PickTask::getVehicleId, inTask.getVehicleId())); + // 移除当前料箱所有的outsideVehicles + outsideVehiclesService.remove(new LambdaQueryWrapper().eq(OutsideVehicles::getVehicleId, inTask.getVehicleId())); + // 清除当前料箱的所有盘点任务 + inventoryService.remove(new LambdaQueryWrapper().eq(InventoryList::getVehicleId, inTask.getVehicleId())); + } + } + // 出库任务 + if (taskType == TaskType.OUT.getCode()) { + // 对所有任务组里面的出库任务进行处理 + for (Task outTask : feedBackTasks) { + if (!Objects.equals(outTask.getTaskType(), TaskType.OUT.getCode())) { + // 非出库任务跳过 + continue; + } + // 查询到当前料箱 + Vehicle outVehicle = vehicleService.getOne(new LambdaQueryWrapper().eq(Vehicle::getVehicleId, outTask.getVehicleId())); + if (outTask.getIsPicking() == 1) { + // 当前载具设置为出库中状态 + vehicleService.update(new LambdaUpdateWrapper() + .set(Vehicle::getVehicleStatus, VehicleStatus.OUT.getCode()) + .eq(Vehicle::getVehicleId, outTask.getVehicleId()) + .ne(Vehicle::getVehicleStatus, VehicleStatus.OUT.getCode())); + // 当前载具上所有库存状态设置为拣选 + stockService.update(new LambdaUpdateWrapper() + .set(Stock::getStockStatus, StockStatus.PICKING.getCode()) + .eq(Stock::getVehicleId, outTask.getVehicleId()) + .ne(Stock::getStockStatus, StockStatus.PICKING.getCode())); + // 将该载具对应的拣选任务设置为可发送状态 + pickTaskService.update(new LambdaUpdateWrapper() + .set(PickTask::getPickStatus, PickTaskStatusEnum.NEW.getCode()) + .eq(PickTask::getVehicleId, outTask.getVehicleId()) + .eq(PickTask::getPickStatus, PickTaskStatusEnum.TEMP.getCode())); + // 设置特殊 + standStackerTaskService.update(new LambdaUpdateWrapper() + .set(StandStackerTask::getTaskStatus, 1) + .set(StandStackerTask::getFinishTime, LocalDateTime.now()) + .eq(StandStackerTask::getVehicleId, outTask.getVehicleId()) + .ne(StandStackerTask::getTaskStatus, 1)); + } else {// 代表整出 + // 删除当前载具上所有库存 + List removeStocks = stockService.list(new LambdaQueryWrapper().eq(Stock::getVehicleId, outTask.getVehicleId())); + for (Stock stock : removeStocks) { + stockUpdateRecordService.addStockUpdateRecord(stock, null, StockUpdateReasonEnum.FULL_OUT.getReason(), outTask.getUserName(), stock.getGoodsRelated().getRemainNum()); + } + stockService.remove(new LambdaQueryWrapper().eq(Stock::getVehicleId, outTask.getVehicleId())); + // 删除当前载具的所有拣选任务 + pickTaskService.remove(new LambdaQueryWrapper().eq(PickTask::getVehicleId, outTask.getVehicleId())); + } + // 添加任务记录 + outTask.setTaskStatus(WmsTaskStatus.FINISH.getCode()); + outTask.setFinishTime(LocalDateTime.now()); + taskRecordService.save(BeanUtil.copyProperties(outTask, TaskRecord.class)); + // 删除出库任务 + taskService.remove(new LambdaQueryWrapper().eq(Task::getTaskId, outTask.getTaskId())); + // 释放原来的库位 + if (outVehicle == null || !Objects.equals(outVehicle.getVehicleType(), "间接物料")) { + locationService.update(new LambdaUpdateWrapper() + .set(Location::getLocationStatus, LocationStatus.EMPTY.getCode()) + .set(Location::getVehicleId, "") + .eq(Location::getLocationId, outTask.getOrigin())); + } + } + } + // 移库任务完成 + if (taskType == TaskType.MOVE.getCode()) { + // 对所有任务组里面的移库任务进行处理 + for (Task moveTask : feedBackTasks) { + if (!Objects.equals(moveTask.getTaskType(), TaskType.MOVE.getCode())) { + // 非移库任务跳过 + continue; + } + // 更新库存 + LambdaUpdateWrapper lambdaUpdateWrapperOfStock = new LambdaUpdateWrapper() + .set(Stock::getLocationId, moveTask.getDestination()) + .set(Stock::getStockStatus, StockStatus.OK.getCode()) + .set(Stock::getLastUpdateTime, LocalDateTime.now()) + .set(Stock::getLastUpdateUser, moveTask.getUserName()) + .eq(Stock::getVehicleId, moveTask.getVehicleId()) + .eq(Stock::getStockStatus, StockStatus.MOVE.getCode()); + stockService.update(lambdaUpdateWrapperOfStock); + // 更新载具 + LambdaUpdateWrapper lambdaUpdateWrapperOfVehicle = new LambdaUpdateWrapper() + .set(Vehicle::getVehicleStatus, VehicleStatus.ON.getCode()) + .set(Vehicle::getCurrentLocation, moveTask.getDestination()) + .eq(Vehicle::getVehicleId, moveTask.getVehicleId()) + .eq(Vehicle::getVehicleStatus, VehicleStatus.MOVE.getCode()); + vehicleService.update(lambdaUpdateWrapperOfVehicle); + // 释放原来的库位 + LambdaUpdateWrapper lambdaUpdateWrapperOfLocation = new LambdaUpdateWrapper() + .set(Location::getLocationStatus, LocationStatus.EMPTY.getCode()) + .set(Location::getVehicleId, "") + .eq(Location::getLocationId, moveTask.getOrigin()) + .eq(Location::getLocationStatus, LocationStatus.OCCUPY.getCode()); + locationService.update(lambdaUpdateWrapperOfLocation); + // 添加任务记录 + moveTask.setTaskStatus(WmsTaskStatus.FINISH.getCode()); + moveTask.setFinishTime(LocalDateTime.now()); + taskRecordService.save(BeanUtil.copyProperties(moveTask, TaskRecord.class)); + // 删除移库任务 + taskService.remove(new LambdaQueryWrapper().eq(Task::getTaskId, moveTask.getTaskId())); + } + } + } else if (taskStatus == WcsTaskStatus.RUN.getCode()) {// 任务开始运行 + // 更新任务状态为正在运行 + for (Task task : feedBackTasks) { + task.setTaskStatus(WmsTaskStatus.RUN.getCode()); + } + taskService.updateBatchById(feedBackTasks); + } + + // 返回成功 + logger.info("处理任务反馈成功"); + response.setCode(ResponseCode.OK.getCode()); + response.setMessage("处理任务反馈成功"); + return convertJsonString(response); + } catch (Exception e) { + // 回滚事务 + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + logger.error("发生异常:{}", convertJsonString(e)); + // 返回其他异常 + response.setCode(ResponseCode.ERROR.getCode()); + response.setMessage("任务反馈发生异常"); + return convertJsonString(response); + } + } } /** @@ -873,62 +881,64 @@ public class TaskController { public String boxArrive(@RequestBody WcsBoxArriveRequest boxArriveRequest) { logger.info("接收到Wcs上报箱子到达:{},ip地址:{}", convertJsonString(boxArriveRequest), HttpUtils.getIpAddr(servletRequest)); ResponseEntity response = new ResponseEntity(); - try { - // 校验请求参数 - String validateInfo = validateService.validateBoxArriveRequest(boxArriveRequest); - if (!Objects.equals(validateInfo, "")) {// 验证未通过 - logger.error("Wcs上报箱子到达验证错误:{}", validateInfo); - response.setCode(ResponseCode.ERROR.getCode()); - response.setMessage(validateInfo); - return convertJsonString(response); - } - // 查找到对应的拣选任务 - PickTask pickTask = pickTaskService.getOne(new LambdaQueryWrapper() - .eq(PickTask::getVehicleId, boxArriveRequest.getVehicleNo()) - .eq(PickTask::getStandId, boxArriveRequest.getLocation()) - .last("limit 1")); - if (pickTask == null || StringUtils.isEmpty(pickTask.getPickTaskId())) { - logger.error("拣选任务查询失败"); - response.setCode(ResponseCode.ERROR.getCode()); - response.setMessage("拣选任务查询失败"); - return convertJsonString(response); - } - // 更新这个站台当前箱子的拣选任务为完成 - pickTaskService.update(new LambdaUpdateWrapper() - .set(PickTask::getPickStatus, PickTaskStatusEnum.FINISH.getCode()) - .set(PickTask::getLastUpdateTime, LocalDateTime.now()) - .set(PickTask::getArriveTime, LocalDateTime.now()) - .eq(PickTask::getVehicleId, boxArriveRequest.getVehicleNo()) - .eq(PickTask::getStandId, boxArriveRequest.getLocation())); - // 更新这个箱子其他的暂存任务为待下发 - pickTaskService.update(new LambdaUpdateWrapper() - .set(PickTask::getPickStatus, PickTaskStatusEnum.NEW.getCode()) - .set(PickTask::getLastUpdateTime, LocalDateTime.now()) - .eq(PickTask::getVehicleId, boxArriveRequest.getVehicleNo()) - .eq(PickTask::getPickStatus, PickTaskStatusEnum.TEMP.getCode())); - // 重置当前站台非当前箱子的已完成拣选任务 todo - pickTaskService.update(new LambdaUpdateWrapper() - .set(PickTask::getPickStatus, PickTaskStatusEnum.NEW.getCode()) - .set(PickTask::getLastUpdateTime, LocalDateTime.now()) - .ne(PickTask::getVehicleId, boxArriveRequest.getVehicleNo()) - .eq(PickTask::getStandId, boxArriveRequest.getLocation()) - .eq(PickTask::getPickStatus, PickTaskStatusEnum.FINISH.getCode())); - // 更新站台信息 - standService.update(new LambdaUpdateWrapper() - .set(Stand::getPickVehicle, boxArriveRequest.getVehicleNo()) - .eq(Stand::getStandId, pickTask.getStandId())); + synchronized (GLOBAL_LOCK) { + try { + // 校验请求参数 + String validateInfo = validateService.validateBoxArriveRequest(boxArriveRequest); + if (!Objects.equals(validateInfo, "")) {// 验证未通过 + logger.error("Wcs上报箱子到达验证错误:{}", validateInfo); + response.setCode(ResponseCode.ERROR.getCode()); + response.setMessage(validateInfo); + return convertJsonString(response); + } + // 查找到对应的拣选任务 + PickTask pickTask = pickTaskService.getOne(new LambdaQueryWrapper() + .eq(PickTask::getVehicleId, boxArriveRequest.getVehicleNo()) + .eq(PickTask::getStandId, boxArriveRequest.getLocation()) + .last("limit 1")); + if (pickTask == null || StringUtils.isEmpty(pickTask.getPickTaskId())) { + logger.error("拣选任务查询失败"); + response.setCode(ResponseCode.ERROR.getCode()); + response.setMessage("拣选任务查询失败"); + return convertJsonString(response); + } + // 更新这个站台当前箱子的拣选任务为完成 + pickTaskService.update(new LambdaUpdateWrapper() + .set(PickTask::getPickStatus, PickTaskStatusEnum.FINISH.getCode()) + .set(PickTask::getLastUpdateTime, LocalDateTime.now()) + .set(PickTask::getArriveTime, LocalDateTime.now()) + .eq(PickTask::getVehicleId, boxArriveRequest.getVehicleNo()) + .eq(PickTask::getStandId, boxArriveRequest.getLocation())); + // 更新这个箱子其他的暂存任务为待下发 + pickTaskService.update(new LambdaUpdateWrapper() + .set(PickTask::getPickStatus, PickTaskStatusEnum.NEW.getCode()) + .set(PickTask::getLastUpdateTime, LocalDateTime.now()) + .eq(PickTask::getVehicleId, boxArriveRequest.getVehicleNo()) + .eq(PickTask::getPickStatus, PickTaskStatusEnum.TEMP.getCode())); + // 重置当前站台非当前箱子的已完成拣选任务 todo + pickTaskService.update(new LambdaUpdateWrapper() + .set(PickTask::getPickStatus, PickTaskStatusEnum.NEW.getCode()) + .set(PickTask::getLastUpdateTime, LocalDateTime.now()) + .ne(PickTask::getVehicleId, boxArriveRequest.getVehicleNo()) + .eq(PickTask::getStandId, boxArriveRequest.getLocation()) + .eq(PickTask::getPickStatus, PickTaskStatusEnum.FINISH.getCode())); + // 更新站台信息 + standService.update(new LambdaUpdateWrapper() + .set(Stand::getPickVehicle, boxArriveRequest.getVehicleNo()) + .eq(Stand::getStandId, pickTask.getStandId())); - response.setCode(ResponseCode.OK.getCode()); - response.setMessage("上报成功"); - return convertJsonString(response); - } catch (Exception e) { - // 回滚事务 - TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); - logger.error("上报时发生异常:{}", convertJsonString(e)); - // 返回其他异常 - response.setCode(ResponseCode.ERROR.getCode()); - response.setMessage("上报时发生异常"); - return convertJsonString(response); + response.setCode(ResponseCode.OK.getCode()); + response.setMessage("上报成功"); + return convertJsonString(response); + } catch (Exception e) { + // 回滚事务 + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + logger.error("上报时发生异常:{}", convertJsonString(e)); + // 返回其他异常 + response.setCode(ResponseCode.ERROR.getCode()); + response.setMessage("上报时发生异常"); + return convertJsonString(response); + } } } @@ -1357,139 +1367,142 @@ public class TaskController { public String getETaskFeedBack(@RequestBody WcsETaskFeedbackRequest eTaskFeedbackRequest) { logger.info("获取电子标签反馈:{},ip地址:{}", convertJsonString(eTaskFeedbackRequest), HttpUtils.getIpAddr(servletRequest)); ResponseEntity response = new ResponseEntity(); - try { - if (eTaskFeedbackRequest == null || StringUtils.isEmpty(eTaskFeedbackRequest.getTaskId()) || eTaskFeedbackRequest.getTaskType() == null) { - logger.error("请求参数补全,缺少任务号、任务类型。"); - response.setCode(ResponseCode.ERROR.getCode()); - response.setMessage("请求参数补全,缺少任务号、任务类型。"); - return convertJsonString(response); - } - if (eTaskFeedbackRequest.getTaskType() == 1) {// 拣选任务 - // 查询到对应的库位,如果不是亮灯状态,不接受反馈 - if (!etagLocationService.exists(new LambdaQueryWrapper() - .eq(ETagLocation::getELocationId, eTaskFeedbackRequest.getLocation()) - .eq(ETagLocation::getPickStatus, 1))) { - logger.error("当前位置无亮灯信息。"); - response.setCode(ResponseCode.ERROR.getCode()); - response.setMessage("当前位置无亮灯信息。"); - return convertJsonString(response); - } - // 根据taskId查找对应的workFlow - WorkFlow workFlow = workFlowService.getOne(new LambdaQueryWrapper().eq(WorkFlow::getWorkFlowId, eTaskFeedbackRequest.getTaskId()).last("limit 1")); - if (workFlow == null) { - logger.error("反馈的任务号查找不到对应的工作信息。"); - response.setCode(ResponseCode.ERROR.getCode()); - response.setMessage("反馈的任务号查找不到对应的工作信息。"); - return convertJsonString(response); - } else { - if (workFlow.getPickedNum().compareTo(workFlow.getNeedNum()) >= 0) { - logger.error("当前工作拣货数量已足够,请勿重复拍灯。"); + if (eTaskFeedbackRequest == null || StringUtils.isEmpty(eTaskFeedbackRequest.getTaskId()) || eTaskFeedbackRequest.getTaskType() == null) { + logger.error("请求参数补全,缺少任务号、任务类型。"); + response.setCode(ResponseCode.ERROR.getCode()); + response.setMessage("请求参数补全,缺少任务号、任务类型。"); + return convertJsonString(response); + } + synchronized (GLOBAL_LOCK) { + try { + if (eTaskFeedbackRequest.getTaskType() == 1) {// 拣选任务 + // 查询到对应的库位,如果不是亮灯状态,不接受反馈 + if (!etagLocationService.exists(new LambdaQueryWrapper() + .eq(ETagLocation::getELocationId, eTaskFeedbackRequest.getLocation()) + .eq(ETagLocation::getPickStatus, 1))) { + logger.error("当前位置无亮灯信息。"); response.setCode(ResponseCode.ERROR.getCode()); - response.setMessage("当前工作拣货数量已足够,请勿重复拍灯。"); + response.setMessage("当前位置无亮灯信息。"); return convertJsonString(response); } - } - // 更新实际拣选数量 - workFlow.setPickedNum(workFlow.getPickedNum().add(BigDecimal.valueOf(eTaskFeedbackRequest.getConfirmNum()))); - if (eTaskFeedbackRequest.getConfirmNum().compareTo(eTaskFeedbackRequest.getNeedNum()) < 0) { - int diffNum = eTaskFeedbackRequest.getNeedNum() - eTaskFeedbackRequest.getConfirmNum(); - // 查站台要料表---未分配以及分配但未完全分配 - GoodsToStation goodsToStation = goodsToStationService.getOne(new LambdaQueryWrapper() - .eq(GoodsToStation::getWorkStation, workFlow.getWorkStation()) - .eq(GoodsToStation::getGoodsId, workFlow.getGoodsId()) - .last("limit 1")); - if (goodsToStation != null) { - // 更新站台要料数量 - BigDecimal newDistributeNum = goodsToStation.getDistributedNum().subtract(BigDecimal.valueOf(diffNum)); - goodsToStation.setDistributedNum(newDistributeNum.compareTo(BigDecimal.ZERO) <= 0 ? BigDecimal.ZERO : newDistributeNum); - goodsToStation.setDistributeStatus(1); - goodsToStationService.updateById(goodsToStation); - } - // 查询当前站台的拣货任务 - PickTask pickTask = pickTaskService.getOne(new LambdaQueryWrapper() - .eq(PickTask::getStandId, workFlow.getWorkStation()) - .eq(PickTask::getPickStatus, PickTaskStatusEnum.FINISH.getCode()) - .last("limit 1")); - if (pickTask != null) { - // 更新当前的outsideVehicles状态为一个新状态,拉取任务时不拉取它 - List outsideVehiclesList = outsideVehiclesService.list(new LambdaQueryWrapper() - .eq(OutsideVehicles::getVehicleId, pickTask.getVehicleId()) - .eq(OutsideVehicles::getGoodsId, workFlow.getGoodsId())); - for (OutsideVehicles outsideVehicles : outsideVehiclesList) { - outsideVehicles.setOutStatus(2); + // 根据taskId查找对应的workFlow + WorkFlow workFlow = workFlowService.getOne(new LambdaQueryWrapper().eq(WorkFlow::getWorkFlowId, eTaskFeedbackRequest.getTaskId()).last("limit 1")); + if (workFlow == null) { + logger.error("反馈的任务号查找不到对应的工作信息。"); + response.setCode(ResponseCode.ERROR.getCode()); + response.setMessage("反馈的任务号查找不到对应的工作信息。"); + return convertJsonString(response); + } else { + if (workFlow.getPickedNum().compareTo(workFlow.getNeedNum()) >= 0) { + logger.error("当前工作拣货数量已足够,请勿重复拍灯。"); + response.setCode(ResponseCode.ERROR.getCode()); + response.setMessage("当前工作拣货数量已足够,请勿重复拍灯。"); + return convertJsonString(response); } - outsideVehiclesService.updateBatchById(outsideVehiclesList); } - // 更新workFlow状态 - workFlow.setLightStatus(0);// 未亮灯 - workFlow.setWorkStatus(1);// 正在做 - } else { - if (workFlow.getPickedNum().compareTo(workFlow.getNeedNum()) < 0) { - // 缺料未完成 + // 更新实际拣选数量 + workFlow.setPickedNum(workFlow.getPickedNum().add(BigDecimal.valueOf(eTaskFeedbackRequest.getConfirmNum()))); + if (eTaskFeedbackRequest.getConfirmNum().compareTo(eTaskFeedbackRequest.getNeedNum()) < 0) { + int diffNum = eTaskFeedbackRequest.getNeedNum() - eTaskFeedbackRequest.getConfirmNum(); + // 查站台要料表---未分配以及分配但未完全分配 + GoodsToStation goodsToStation = goodsToStationService.getOne(new LambdaQueryWrapper() + .eq(GoodsToStation::getWorkStation, workFlow.getWorkStation()) + .eq(GoodsToStation::getGoodsId, workFlow.getGoodsId()) + .last("limit 1")); + if (goodsToStation != null) { + // 更新站台要料数量 + BigDecimal newDistributeNum = goodsToStation.getDistributedNum().subtract(BigDecimal.valueOf(diffNum)); + goodsToStation.setDistributedNum(newDistributeNum.compareTo(BigDecimal.ZERO) <= 0 ? BigDecimal.ZERO : newDistributeNum); + goodsToStation.setDistributeStatus(1); + goodsToStationService.updateById(goodsToStation); + } + // 查询当前站台的拣货任务 + PickTask pickTask = pickTaskService.getOne(new LambdaQueryWrapper() + .eq(PickTask::getStandId, workFlow.getWorkStation()) + .eq(PickTask::getPickStatus, PickTaskStatusEnum.FINISH.getCode()) + .last("limit 1")); + if (pickTask != null) { + // 更新当前的outsideVehicles状态为一个新状态,拉取任务时不拉取它 + List outsideVehiclesList = outsideVehiclesService.list(new LambdaQueryWrapper() + .eq(OutsideVehicles::getVehicleId, pickTask.getVehicleId()) + .eq(OutsideVehicles::getGoodsId, workFlow.getGoodsId())); + for (OutsideVehicles outsideVehicles : outsideVehiclesList) { + outsideVehicles.setOutStatus(2); + } + outsideVehiclesService.updateBatchById(outsideVehiclesList); + } + // 更新workFlow状态 workFlow.setLightStatus(0);// 未亮灯 workFlow.setWorkStatus(1);// 正在做 } else { - workFlow.setLightStatus(2);// 已拍灯 - workFlow.setWorkStatus(2);// 已完成 + if (workFlow.getPickedNum().compareTo(workFlow.getNeedNum()) < 0) { + // 缺料未完成 + workFlow.setLightStatus(0);// 未亮灯 + workFlow.setWorkStatus(1);// 正在做 + } else { + workFlow.setLightStatus(2);// 已拍灯 + workFlow.setWorkStatus(2);// 已完成 + } } + // 更新workFlow + workFlow.setFinishTime(LocalDateTime.now()); + workFlowService.updateById(workFlow); + // 更新库存数量 + Stock existStock = stockService.getOne(new LambdaQueryWrapper() + .apply("goods_related ->> '$.goodsId' = {0}" + MYSQL_JSON_CI, workFlow.getGoodsId()) + .eq(Stock::getVehicleId, eTaskFeedbackRequest.getVehicleNo()) + .last("limit 1")); + if (existStock != null && existStock.getGoodsRelated() != null) { + Stock originStock = BeanUtil.copyProperties(existStock, Stock.class); + BigDecimal quantityBefore = originStock.getGoodsRelated().getRemainNum(); + StockDetailInfo goodsDetail = existStock.getGoodsRelated(); + goodsDetail.setRemainNum(goodsDetail.getRemainNum().subtract(BigDecimal.valueOf(eTaskFeedbackRequest.getConfirmNum()))); + existStock.setGoodsRelated(goodsDetail); + stockService.updateById(existStock); + stockUpdateRecordService.addStockUpdateRecord(originStock, existStock, StockUpdateReasonEnum.KITTING_UPDATE.getReason(), workFlow.getWorkStation() + "-电子标签灯光反馈", quantityBefore); + } + // 更新电子标签库位信息 + etagLocationService.update(new LambdaUpdateWrapper() + .set(ETagLocation::getPickStatus, 0) + .set(ETagLocation::getTaskId, "") + .set(ETagLocation::getVehicleNo, "") + .set(ETagLocation::getTaskType, null) + .set(ETagLocation::getNeedNum, null) + .set(ETagLocation::getConfirmNum, null) + .eq(ETagLocation::getELocationId, eTaskFeedbackRequest.getLocation())); + } else {// 小盒子放入大盒子 + // 根据location查询到对应的配置 + ELocationConfigLast eLocationConfigLast = eLocationConfigLastService.getOne(new LambdaQueryWrapper() + .eq(ELocationConfigLast::getELocationId, eTaskFeedbackRequest.getLocation()) + .last("limit 1")); + if (eLocationConfigLast != null) { + // 设置状态为已取走 + eLocationConfigLast.setBoxStatus(2); + eLocationConfigLastService.updateById(eLocationConfigLast); + } + // 更新电子标签库位信息 + etagLocationService.update(new LambdaUpdateWrapper() + .set(ETagLocation::getPickStatus, 0) + .set(ETagLocation::getTaskId, "") + .set(ETagLocation::getVehicleNo, "") + .set(ETagLocation::getTaskType, null) + .set(ETagLocation::getNeedNum, null) + .set(ETagLocation::getConfirmNum, null) + .eq(ETagLocation::getELocationId, eTaskFeedbackRequest.getLocation())); } - // 更新workFlow - workFlow.setFinishTime(LocalDateTime.now()); - workFlowService.updateById(workFlow); - // 更新库存数量 - Stock existStock = stockService.getOne(new LambdaQueryWrapper() - .apply("goods_related ->> '$.goodsId' = {0}" + MYSQL_JSON_CI, workFlow.getGoodsId()) - .eq(Stock::getVehicleId, eTaskFeedbackRequest.getVehicleNo()) - .last("limit 1")); - if (existStock != null && existStock.getGoodsRelated() != null) { - Stock originStock = BeanUtil.copyProperties(existStock, Stock.class); - BigDecimal quantityBefore = originStock.getGoodsRelated().getRemainNum(); - StockDetailInfo goodsDetail = existStock.getGoodsRelated(); - goodsDetail.setRemainNum(goodsDetail.getRemainNum().subtract(BigDecimal.valueOf(eTaskFeedbackRequest.getConfirmNum()))); - existStock.setGoodsRelated(goodsDetail); - stockService.updateById(existStock); - stockUpdateRecordService.addStockUpdateRecord(originStock, existStock, StockUpdateReasonEnum.KITTING_UPDATE.getReason(), workFlow.getWorkStation() + "-电子标签灯光反馈", quantityBefore); - } - // 更新电子标签库位信息 - etagLocationService.update(new LambdaUpdateWrapper() - .set(ETagLocation::getPickStatus, 0) - .set(ETagLocation::getTaskId, "") - .set(ETagLocation::getVehicleNo, "") - .set(ETagLocation::getTaskType, null) - .set(ETagLocation::getNeedNum, null) - .set(ETagLocation::getConfirmNum, null) - .eq(ETagLocation::getELocationId, eTaskFeedbackRequest.getLocation())); - } else {// 小盒子放入大盒子 - // 根据location查询到对应的配置 - ELocationConfigLast eLocationConfigLast = eLocationConfigLastService.getOne(new LambdaQueryWrapper() - .eq(ELocationConfigLast::getELocationId, eTaskFeedbackRequest.getLocation()) - .last("limit 1")); - if (eLocationConfigLast != null) { - // 设置状态为已取走 - eLocationConfigLast.setBoxStatus(2); - eLocationConfigLastService.updateById(eLocationConfigLast); - } - // 更新电子标签库位信息 - etagLocationService.update(new LambdaUpdateWrapper() - .set(ETagLocation::getPickStatus, 0) - .set(ETagLocation::getTaskId, "") - .set(ETagLocation::getVehicleNo, "") - .set(ETagLocation::getTaskType, null) - .set(ETagLocation::getNeedNum, null) - .set(ETagLocation::getConfirmNum, null) - .eq(ETagLocation::getELocationId, eTaskFeedbackRequest.getLocation())); + response.setCode(ResponseCode.OK.getCode()); + response.setMessage("处理反馈成功"); + return convertJsonString(response); + + } catch (Exception e) { + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + logger.error("处理反馈异常:{}", convertJsonString(e)); + response.setCode(ResponseCode.ERROR.getCode()); + response.setMessage("处理反馈异常"); + return convertJsonString(response); } - response.setCode(ResponseCode.OK.getCode()); - response.setMessage("处理反馈成功"); - return convertJsonString(response); - } catch (Exception e) { - // 回滚事务 - TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); - logger.error("处理反馈异常:{}", convertJsonString(e)); - response.setCode(ResponseCode.ERROR.getCode()); - response.setMessage("处理反馈异常"); - return convertJsonString(response); } + } /** @@ -1505,147 +1518,187 @@ public class TaskController { public String confirmFinishWork(@RequestBody WorkConfirmRequest workConfirmRequest) { logger.info("接收到确认当前拣货完成(wms界面触发)请求:{},ip地址:{}", convertJsonString(workConfirmRequest), HttpUtils.getIpAddr(servletRequest)); ResponseEntity response = new ResponseEntity(); - try { - // 获取站台号 - String standId = ""; - if (StringUtils.isNotEmpty(workConfirmRequest.getStandId())) { - // 站台号从请求参数中获取 - standId = workConfirmRequest.getStandId(); - } else { - // 站台号从ip获取 - Stand standOfIp = standService.getOne(new LambdaQueryWrapper() - .eq(Stand::getStandIp, HttpUtils.getIpAddr(servletRequest)) - .eq(Stand::getStandType, 2) - .last("limit 1")); - if (standOfIp != null && StringUtils.isNotEmpty(standOfIp.getStandId())) { - standId = standOfIp.getStandId(); - } - } - if (StringUtils.isEmpty(standId)) { - logger.error("请求参数缺少站台号。"); - response.setCode(ResponseCode.ERROR.getCode()); - response.setMessage("请求参数缺少站台号。"); - return convertJsonString(response); - } - if (StringUtils.isEmpty(workConfirmRequest.getGoodsId())) { - logger.error("请求参数缺少料号。"); - response.setCode(ResponseCode.ERROR.getCode()); - response.setMessage("请求参数缺少料号。"); - return convertJsonString(response); - } - // 判断当前站台是否还有亮灯数据 - if (etagLocationService.exists(new LambdaQueryWrapper() - .eq(ETagLocation::getWorkStation, standId) - .eq(ETagLocation::getPickStatus, 1))) { - logger.error("站台灯光未全部拍灭,请检查。"); - response.setCode(ResponseCode.ERROR.getCode()); - response.setMessage("站台灯光未全部拍灭,请检查。"); - return convertJsonString(response); - } - // 查询当前站台的拣货任务 - PickTask pickTask = pickTaskService.getOne(new LambdaQueryWrapper() - .eq(PickTask::getStandId, standId) - .eq(PickTask::getPickStatus, PickTaskStatusEnum.FINISH.getCode()) - .last("limit 1")); - if (pickTask == null) { - // 没有拣货任务,直接放行 - // 调用Wcs的放行接口 - wcsService.sendWcsDisposeVehicle(new WcsDisposeVehicleRequest(standId, null)); - // 更新站台信息 - standService.update(new LambdaUpdateWrapper() - .set(Stand::getLastUseTime, LocalDateTime.now()) - .set(Stand::getPickVehicle, "") - .set(Stand::getPickGoods, "") - .set(Stand::getPickTip, "") - .eq(Stand::getStandId, standId)); - response.setCode(ResponseCode.OK.getCode()); - response.setMessage("确认成功,放行"); - } else { - Stock existStock = stockService.getOne(new LambdaQueryWrapper() - .apply("goods_related ->> '$.goodsId' = {0}" + MYSQL_JSON_CI, workConfirmRequest.getGoodsId()) - .eq(Stock::getVehicleId, pickTask.getVehicleId()) - .last("limit 1"));// 更新库存数量 - // 处理库存偏差 - if (workConfirmRequest.getRemainNumReal().compareTo(workConfirmRequest.getRemainNumOrigin()) != 0) { - if (existStock != null && existStock.getGoodsRelated() != null) { - Stock originStock = BeanUtil.copyProperties(existStock, Stock.class); - BigDecimal quantityBefore = originStock.getGoodsRelated().getRemainNum(); - StockDetailInfo goodsDetail = existStock.getGoodsRelated(); - goodsDetail.setRemainNum(workConfirmRequest.getRemainNumReal()); - existStock.setGoodsRelated(goodsDetail); - stockService.updateById(existStock); - stockUpdateRecordService.addStockUpdateRecord(originStock, existStock, StockUpdateReasonEnum.CONFIRM_UPDATE.getReason(), workConfirmRequest.getUserName(), quantityBefore); - } - OutsideVehicles currentGoodsVehicle = outsideVehiclesService.getOne(new LambdaQueryWrapper() - .eq(OutsideVehicles::getVehicleId, pickTask.getVehicleId()) - .eq(OutsideVehicles::getGoodsId, workConfirmRequest.getGoodsId()) - .last("limit 1")); - if (workConfirmRequest.getRemainNumReal().compareTo(BigDecimal.ZERO) == 0) {// 实际剩余数量为0 - // 更新流转载具表剩余数量 - if (currentGoodsVehicle != null) { - currentGoodsVehicle.setRemainNum(BigDecimal.ZERO); - currentGoodsVehicle.setOutStatus(2); - outsideVehiclesService.updateById(currentGoodsVehicle); - } - } else { - // 更新流转载具表剩余数量 todo - if (currentGoodsVehicle != null) { - currentGoodsVehicle.setRemainNum(currentGoodsVehicle.getRemainNum().add(workConfirmRequest.getRemainNumReal().subtract(workConfirmRequest.getRemainNumOrigin()))); - outsideVehiclesService.updateById(currentGoodsVehicle); - } - } + synchronized (GLOBAL_LOCK) { + try { + // 获取站台号 + String standId = ""; + if (StringUtils.isNotEmpty(workConfirmRequest.getStandId())) { + // 站台号从请求参数中获取 + standId = workConfirmRequest.getStandId(); } else { - if (existStock != null && existStock.getGoodsRelated() != null) { - if (workConfirmRequest.getRemainNumOrigin().compareTo(BigDecimal.ZERO) == 0) { + // 站台号从ip获取 + Stand standOfIp = standService.getOne(new LambdaQueryWrapper() + .eq(Stand::getStandIp, HttpUtils.getIpAddr(servletRequest)) + .eq(Stand::getStandType, 2) + .last("limit 1")); + if (standOfIp != null && StringUtils.isNotEmpty(standOfIp.getStandId())) { + standId = standOfIp.getStandId(); + } + } + if (StringUtils.isEmpty(standId)) { + logger.error("请求参数缺少站台号。"); + response.setCode(ResponseCode.ERROR.getCode()); + response.setMessage("请求参数缺少站台号。"); + return convertJsonString(response); + } + if (StringUtils.isEmpty(workConfirmRequest.getGoodsId())) { + logger.error("请求参数缺少料号。"); + response.setCode(ResponseCode.ERROR.getCode()); + response.setMessage("请求参数缺少料号。"); + return convertJsonString(response); + } + // 判断当前站台是否还有亮灯数据 + if (etagLocationService.exists(new LambdaQueryWrapper() + .eq(ETagLocation::getWorkStation, standId) + .eq(ETagLocation::getPickStatus, 1))) { + logger.error("站台灯光未全部拍灭,请检查。"); + response.setCode(ResponseCode.ERROR.getCode()); + response.setMessage("站台灯光未全部拍灭,请检查。"); + return convertJsonString(response); + } + // 查询当前站台的拣货任务 + PickTask pickTask = pickTaskService.getOne(new LambdaQueryWrapper() + .eq(PickTask::getStandId, standId) + .eq(PickTask::getPickStatus, PickTaskStatusEnum.FINISH.getCode()) + .last("limit 1")); + if (pickTask == null) { + // 没有拣货任务,直接放行 + // 调用Wcs的放行接口 + wcsService.sendWcsDisposeVehicle(new WcsDisposeVehicleRequest(standId, null)); + // 更新站台信息 + standService.update(new LambdaUpdateWrapper() + .set(Stand::getLastUseTime, LocalDateTime.now()) + .set(Stand::getPickVehicle, "") + .set(Stand::getPickGoods, "") + .set(Stand::getPickTip, "") + .eq(Stand::getStandId, standId)); + response.setCode(ResponseCode.OK.getCode()); + response.setMessage("确认成功,放行"); + } else { + Stock existStock = stockService.getOne(new LambdaQueryWrapper() + .apply("goods_related ->> '$.goodsId' = {0}" + MYSQL_JSON_CI, workConfirmRequest.getGoodsId()) + .eq(Stock::getVehicleId, pickTask.getVehicleId()) + .last("limit 1"));// 更新库存数量 + // 处理库存偏差 + if (workConfirmRequest.getRemainNumReal().compareTo(workConfirmRequest.getRemainNumOrigin()) != 0) { + if (existStock != null && existStock.getGoodsRelated() != null) { Stock originStock = BeanUtil.copyProperties(existStock, Stock.class); BigDecimal quantityBefore = originStock.getGoodsRelated().getRemainNum(); StockDetailInfo goodsDetail = existStock.getGoodsRelated(); - goodsDetail.setRemainNum(BigDecimal.ZERO); + goodsDetail.setRemainNum(workConfirmRequest.getRemainNumReal()); existStock.setGoodsRelated(goodsDetail); stockService.updateById(existStock); stockUpdateRecordService.addStockUpdateRecord(originStock, existStock, StockUpdateReasonEnum.CONFIRM_UPDATE.getReason(), workConfirmRequest.getUserName(), quantityBefore); - OutsideVehicles currentGoodsVehicle = outsideVehiclesService.getOne(new LambdaQueryWrapper() - .eq(OutsideVehicles::getVehicleId, pickTask.getVehicleId()) - .eq(OutsideVehicles::getGoodsId, workConfirmRequest.getGoodsId()) - .last("limit 1")); - currentGoodsVehicle.setRemainNum(BigDecimal.ZERO); - currentGoodsVehicle.setOutStatus(2); - outsideVehiclesService.updateById(currentGoodsVehicle); + } + OutsideVehicles currentGoodsVehicle = outsideVehiclesService.getOne(new LambdaQueryWrapper() + .eq(OutsideVehicles::getVehicleId, pickTask.getVehicleId()) + .eq(OutsideVehicles::getGoodsId, workConfirmRequest.getGoodsId()) + .last("limit 1")); + if (workConfirmRequest.getRemainNumReal().compareTo(BigDecimal.ZERO) == 0) {// 实际剩余数量为0 + // 更新流转载具表剩余数量 + if (currentGoodsVehicle != null) { + currentGoodsVehicle.setRemainNum(BigDecimal.ZERO); + currentGoodsVehicle.setOutStatus(2); + outsideVehiclesService.updateById(currentGoodsVehicle); + } + } else { + // 更新流转载具表剩余数量 todo + if (currentGoodsVehicle != null) { + currentGoodsVehicle.setRemainNum(currentGoodsVehicle.getRemainNum().add(workConfirmRequest.getRemainNumReal().subtract(workConfirmRequest.getRemainNumOrigin()))); + outsideVehiclesService.updateById(currentGoodsVehicle); + } + } + } else { + if (existStock != null && existStock.getGoodsRelated() != null) { + if (workConfirmRequest.getRemainNumOrigin().compareTo(BigDecimal.ZERO) == 0) { + Stock originStock = BeanUtil.copyProperties(existStock, Stock.class); + BigDecimal quantityBefore = originStock.getGoodsRelated().getRemainNum(); + StockDetailInfo goodsDetail = existStock.getGoodsRelated(); + goodsDetail.setRemainNum(BigDecimal.ZERO); + existStock.setGoodsRelated(goodsDetail); + stockService.updateById(existStock); + stockUpdateRecordService.addStockUpdateRecord(originStock, existStock, StockUpdateReasonEnum.CONFIRM_UPDATE.getReason(), workConfirmRequest.getUserName(), quantityBefore); + OutsideVehicles currentGoodsVehicle = outsideVehiclesService.getOne(new LambdaQueryWrapper() + .eq(OutsideVehicles::getVehicleId, pickTask.getVehicleId()) + .eq(OutsideVehicles::getGoodsId, workConfirmRequest.getGoodsId()) + .last("limit 1")); + currentGoodsVehicle.setRemainNum(BigDecimal.ZERO); + currentGoodsVehicle.setOutStatus(2); + outsideVehiclesService.updateById(currentGoodsVehicle); + } } } - } - List goodsIdList = new ArrayList<>(); - // 查询库存 - List stockList = stockService.list(new LambdaQueryWrapper() - .eq(Stock::getVehicleId, pickTask.getVehicleId())); - if (stockList != null && !stockList.isEmpty()) { - for (Stock tempStock : stockList) { - // 当前确认料号 - if (Objects.equals(tempStock.getGoodsRelated().getGoodsId(), workConfirmRequest.getGoodsId())) { - continue; - } - if (!goodsIdList.contains(tempStock.getGoodsRelated().getGoodsId()) - && tempStock.getGoodsRelated().getRemainNum().compareTo(BigDecimal.ZERO) > 0) { - goodsIdList.add(tempStock.getGoodsRelated().getGoodsId()); + List goodsIdList = new ArrayList<>(); + // 查询库存 + List stockList = stockService.list(new LambdaQueryWrapper() + .eq(Stock::getVehicleId, pickTask.getVehicleId())); + if (stockList != null && !stockList.isEmpty()) { + for (Stock tempStock : stockList) { + // 当前确认料号 + if (Objects.equals(tempStock.getGoodsRelated().getGoodsId(), workConfirmRequest.getGoodsId())) { + continue; + } + if (!goodsIdList.contains(tempStock.getGoodsRelated().getGoodsId()) + && tempStock.getGoodsRelated().getRemainNum().compareTo(BigDecimal.ZERO) > 0) { + goodsIdList.add(tempStock.getGoodsRelated().getGoodsId()); + } } } - } - if (!goodsIdList.isEmpty()) { - // 判断这些物料是不是当前站台的工作流中仍然需要 - if (workFlowService.exists(new LambdaQueryWrapper() - .eq(WorkFlow::getWorkStation, standId) - .in(WorkFlow::getGoodsId, goodsIdList) - .notIn(WorkFlow::getWorkStatus, -1, 2))) { - // 需要,不放行,返回前台提示信息 - StandPickVo pickVoEntity = new StandPickVo(); - pickVoEntity.setTip("当前料箱还有其他物料需要拣货"); - standService.update(new LambdaUpdateWrapper() - .set(Stand::getPickGoods, "") - .set(Stand::getPickTip, pickVoEntity.getTip()) - .eq(Stand::getStandId, standId)); - response.setCode(ResponseCode.WARNING.getCode()); - response.setMessage("当前料箱还有其他物料需要拣货"); - response.setReturnData(pickVoEntity); + if (!goodsIdList.isEmpty()) { + // 判断这些物料是不是当前站台的工作流中仍然需要 + if (workFlowService.exists(new LambdaQueryWrapper() + .eq(WorkFlow::getWorkStation, standId) + .in(WorkFlow::getGoodsId, goodsIdList) + .notIn(WorkFlow::getWorkStatus, -1, 2))) { + // 需要,不放行,返回前台提示信息 + StandPickVo pickVoEntity = new StandPickVo(); + pickVoEntity.setTip("当前料箱还有其他物料需要拣货"); + standService.update(new LambdaUpdateWrapper() + .set(Stand::getPickGoods, "") + .set(Stand::getPickTip, pickVoEntity.getTip()) + .eq(Stand::getStandId, standId)); + response.setCode(ResponseCode.WARNING.getCode()); + response.setMessage("当前料箱还有其他物料需要拣货"); + response.setReturnData(pickVoEntity); + } else { + // 存储拣选记录 + PickTaskRecord pickTaskRecord = BeanUtil.copyProperties(pickTask, PickTaskRecord.class); + pickTaskRecord.setPickTaskId(generateId(pickTaskRecord.getPickTaskId())); + pickTaskRecord.setLastUpdateTime(LocalDateTime.now()); + pickTaskRecordService.save(pickTaskRecord); + // 删除当前拣选任务 + pickTaskService.removeById(pickTask); + // 不需要,放行 + wcsService.sendWcsDisposeVehicle(new WcsDisposeVehicleRequest(standId, pickTask.getVehicleId())); + // 判断是不是已经完成工作 + if (workFlowService.exists(new LambdaQueryWrapper() + .eq(WorkFlow::getWorkStation, standId) + .notIn(WorkFlow::getWorkStatus, -1, 2))) { + // 当前站台工作未全部完成 + standService.update(new LambdaUpdateWrapper() + .set(Stand::getLastUseTime, LocalDateTime.now()) + .set(Stand::getPickVehicle, "") + .set(Stand::getPickGoods, "") + .set(Stand::getPickTip, "") + .setDecrBy(Stand::getPickVehicleCount, 1) + .eq(Stand::getStandId, standId)); + response.setMessage("确认成功,放行"); + } else { + standService.update(new LambdaUpdateWrapper() + .set(Stand::getLastUseTime, LocalDateTime.now()) + .set(Stand::getPickVehicle, "") + .set(Stand::getPickGoods, "") + .set(Stand::getPickTip, "当前工作已经全部完成,请至完成界面进行后续工作。") + .setDecrBy(Stand::getPickVehicleCount, 1) + .eq(Stand::getStandId, standId)); + StandPickVo pickVoEntity = new StandPickVo(); + pickVoEntity.setTip("当前工作已经全部完成,请至完成界面进行后续工作。"); + // 当前站台工作已全部完成,需要提示工作完成,打印标签 + response.setMessage("当前工作已经全部完成,请至完成界面进行后续工作。"); + response.setReturnData(pickVoEntity); + } + response.setCode(ResponseCode.OK.getCode()); + } } else { // 存储拣选记录 PickTaskRecord pickTaskRecord = BeanUtil.copyProperties(pickTask, PickTaskRecord.class); @@ -1654,7 +1707,7 @@ public class TaskController { pickTaskRecordService.save(pickTaskRecord); // 删除当前拣选任务 pickTaskService.removeById(pickTask); - // 不需要,放行 + // 放行 wcsService.sendWcsDisposeVehicle(new WcsDisposeVehicleRequest(standId, pickTask.getVehicleId())); // 判断是不是已经完成工作 if (workFlowService.exists(new LambdaQueryWrapper() @@ -1685,54 +1738,16 @@ public class TaskController { } response.setCode(ResponseCode.OK.getCode()); } - } else { - // 存储拣选记录 - PickTaskRecord pickTaskRecord = BeanUtil.copyProperties(pickTask, PickTaskRecord.class); - pickTaskRecord.setPickTaskId(generateId(pickTaskRecord.getPickTaskId())); - pickTaskRecord.setLastUpdateTime(LocalDateTime.now()); - pickTaskRecordService.save(pickTaskRecord); - // 删除当前拣选任务 - pickTaskService.removeById(pickTask); - // 放行 - wcsService.sendWcsDisposeVehicle(new WcsDisposeVehicleRequest(standId, pickTask.getVehicleId())); - // 判断是不是已经完成工作 - if (workFlowService.exists(new LambdaQueryWrapper() - .eq(WorkFlow::getWorkStation, standId) - .notIn(WorkFlow::getWorkStatus, -1, 2))) { - // 当前站台工作未全部完成 - standService.update(new LambdaUpdateWrapper() - .set(Stand::getLastUseTime, LocalDateTime.now()) - .set(Stand::getPickVehicle, "") - .set(Stand::getPickGoods, "") - .set(Stand::getPickTip, "") - .setDecrBy(Stand::getPickVehicleCount, 1) - .eq(Stand::getStandId, standId)); - response.setMessage("确认成功,放行"); - } else { - standService.update(new LambdaUpdateWrapper() - .set(Stand::getLastUseTime, LocalDateTime.now()) - .set(Stand::getPickVehicle, "") - .set(Stand::getPickGoods, "") - .set(Stand::getPickTip, "当前工作已经全部完成,请至完成界面进行后续工作。") - .setDecrBy(Stand::getPickVehicleCount, 1) - .eq(Stand::getStandId, standId)); - StandPickVo pickVoEntity = new StandPickVo(); - pickVoEntity.setTip("当前工作已经全部完成,请至完成界面进行后续工作。"); - // 当前站台工作已全部完成,需要提示工作完成,打印标签 - response.setMessage("当前工作已经全部完成,请至完成界面进行后续工作。"); - response.setReturnData(pickVoEntity); - } - response.setCode(ResponseCode.OK.getCode()); } + return convertJsonString(response); + } catch (Exception e) { + // 回滚事务 + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + logger.error("确认时发生异常:{}", convertJsonString(e)); + response.setCode(ResponseCode.ERROR.getCode()); + response.setMessage("确认时发生异常"); + return convertJsonString(response); } - return convertJsonString(response); - } catch (Exception e) { - // 回滚事务 - TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); - logger.error("确认时发生异常:{}", convertJsonString(e)); - response.setCode(ResponseCode.ERROR.getCode()); - response.setMessage("确认时发生异常"); - return convertJsonString(response); } } @@ -2191,93 +2206,95 @@ public class TaskController { public String requestBack(@RequestBody RequestBackQuery requestBackQuery) { logger.info("Wcs请求箱子是否回库:{},ip地址:{}", convertJsonString(requestBackQuery), HttpUtils.getIpAddr(servletRequest)); ResponseEntity response = new ResponseEntity(); - try { - // 验证数量 - if (StringUtils.isEmpty(requestBackQuery.getVehicleId())) { - logger.error("缺少箱子号。"); - response.setCode(ResponseCode.ERROR.getCode()); - response.setMessage("缺少箱子号。"); - return convertJsonString(response); - } - // 判断这个箱子是否还有拣选任务 - boolean hasPickTasks = pickTaskService.exists(new LambdaQueryWrapper() - .eq(PickTask::getVehicleId, requestBackQuery.getVehicleId())); - if (!hasPickTasks) { - // 查询到当前料箱 - Vehicle vehicle = vehicleService.getOne(new LambdaQueryWrapper() - .eq(Vehicle::getVehicleId, requestBackQuery.getVehicleId()) - .last("limit 1")); - if (vehicle != null) { - if (Objects.equals(vehicle.getVehicleStatus(), VehicleStatus.ON.getCode())) { - logger.error("当前箱子{}已在库中,无法回库。", requestBackQuery.getVehicleId()); - response.setCode(ResponseCode.ERROR.getCode()); - response.setMessage("当前箱子" + requestBackQuery.getVehicleId() + "已在库中,无法回库。"); - return convertJsonString(response); - } - if (Objects.equals(vehicle.getVehicleStatus(), VehicleStatus.EXCEPTION.getCode())) { - logger.info("异常箱子,可以离开线体。"); - response.setCode(ResponseCode.OK.getCode()); - response.setMessage("异常箱子,可以离开线体。"); - return convertJsonString(response); - } - } else { - // 查询配置 - String allowEmptyBack = configMap.get(ConfigMapKeyEnum.ALLOW_EMPTY_BACK.getConfigKey()); - if (StringUtils.isEmpty(allowEmptyBack) || !allowEmptyBack.equals("1")) { - logger.error("当前配置不允许新空箱回库。"); - response.setCode(ResponseCode.OK.getCode()); - response.setMessage("当前配置不允许新空箱回库。"); - return convertJsonString(response); - } + synchronized (GLOBAL_LOCK) { + try { + // 验证数量 + if (StringUtils.isEmpty(requestBackQuery.getVehicleId())) { + logger.error("缺少箱子号。"); + response.setCode(ResponseCode.ERROR.getCode()); + response.setMessage("缺少箱子号。"); + return convertJsonString(response); } - // 判断当前载具是否有回库任务 - boolean hasBackTask = taskService.exists(new LambdaQueryWrapper() - .eq(Task::getVehicleId, requestBackQuery.getVehicleId()) - .eq(Task::getTaskType, TaskType.IN.getCode()) - .likeRight(Task::getTaskId, "HK_")); - if (!hasBackTask) { - // 判断当前载具是否有入库任务 - List inTasks = taskService.list(new LambdaQueryWrapper() + // 判断这个箱子是否还有拣选任务 + boolean hasPickTasks = pickTaskService.exists(new LambdaQueryWrapper() + .eq(PickTask::getVehicleId, requestBackQuery.getVehicleId())); + if (!hasPickTasks) { + // 查询到当前料箱 + Vehicle vehicle = vehicleService.getOne(new LambdaQueryWrapper() + .eq(Vehicle::getVehicleId, requestBackQuery.getVehicleId()) + .last("limit 1")); + if (vehicle != null) { + if (Objects.equals(vehicle.getVehicleStatus(), VehicleStatus.ON.getCode())) { + logger.error("当前箱子{}已在库中,无法回库。", requestBackQuery.getVehicleId()); + response.setCode(ResponseCode.ERROR.getCode()); + response.setMessage("当前箱子" + requestBackQuery.getVehicleId() + "已在库中,无法回库。"); + return convertJsonString(response); + } + if (Objects.equals(vehicle.getVehicleStatus(), VehicleStatus.EXCEPTION.getCode())) { + logger.info("异常箱子,可以离开线体。"); + response.setCode(ResponseCode.OK.getCode()); + response.setMessage("异常箱子,可以离开线体。"); + return convertJsonString(response); + } + } else { + // 查询配置 + String allowEmptyBack = configMap.get(ConfigMapKeyEnum.ALLOW_EMPTY_BACK.getConfigKey()); + if (StringUtils.isEmpty(allowEmptyBack) || !allowEmptyBack.equals("1")) { + logger.error("当前配置不允许新空箱回库。"); + response.setCode(ResponseCode.OK.getCode()); + response.setMessage("当前配置不允许新空箱回库。"); + return convertJsonString(response); + } + } + // 判断当前载具是否有回库任务 + boolean hasBackTask = taskService.exists(new LambdaQueryWrapper() .eq(Task::getVehicleId, requestBackQuery.getVehicleId()) .eq(Task::getTaskType, TaskType.IN.getCode()) - .likeRight(Task::getTaskId, "RK_")); - if (inTasks == null || inTasks.isEmpty()) { - // 生成回库任务 - Task backTask = new Task(); - backTask.setTaskId(generateId("HK_")); - backTask.setTaskGroup(generateId("")); - backTask.setTaskType(TaskType.IN.getCode()); - backTask.setTaskStatus(WmsTaskStatus.TEMP.getCode()); - backTask.setVehicleId(requestBackQuery.getVehicleId()); - backTask.setVehicleSize(1); - backTask.setWeight(BigDecimal.ZERO); - backTask.setTaskPriority(1); - backTask.setUserName("WMS"); - backTask.setCreateTime(LocalDateTime.now()); - // 保存任务 - taskService.save(backTask); - // 删除outsideVehicle表 - outsideVehiclesService.remove(new LambdaQueryWrapper().eq(OutsideVehicles::getVehicleId, requestBackQuery.getVehicleId())); - // 设置库存状态为回库中 - stockService.update(new LambdaUpdateWrapper() - .set(Stock::getStockStatus, StockStatus.BACK.getCode()) - .eq(Stock::getVehicleId, requestBackQuery.getVehicleId())); + .likeRight(Task::getTaskId, "HK_")); + if (!hasBackTask) { + // 判断当前载具是否有入库任务 + List inTasks = taskService.list(new LambdaQueryWrapper() + .eq(Task::getVehicleId, requestBackQuery.getVehicleId()) + .eq(Task::getTaskType, TaskType.IN.getCode()) + .likeRight(Task::getTaskId, "RK_")); + if (inTasks == null || inTasks.isEmpty()) { + // 生成回库任务 + Task backTask = new Task(); + backTask.setTaskId(generateId("HK_")); + backTask.setTaskGroup(generateId("")); + backTask.setTaskType(TaskType.IN.getCode()); + backTask.setTaskStatus(WmsTaskStatus.TEMP.getCode()); + backTask.setVehicleId(requestBackQuery.getVehicleId()); + backTask.setVehicleSize(1); + backTask.setWeight(BigDecimal.ZERO); + backTask.setTaskPriority(1); + backTask.setUserName("WMS"); + backTask.setCreateTime(LocalDateTime.now()); + // 保存任务 + taskService.save(backTask); + // 删除outsideVehicle表 + outsideVehiclesService.remove(new LambdaQueryWrapper().eq(OutsideVehicles::getVehicleId, requestBackQuery.getVehicleId())); + // 设置库存状态为回库中 + stockService.update(new LambdaUpdateWrapper() + .set(Stock::getStockStatus, StockStatus.BACK.getCode()) + .eq(Stock::getVehicleId, requestBackQuery.getVehicleId())); + } } + response.setCode(ResponseCode.OK.getCode()); + response.setMessage("可以回库。"); + } else { + response.setCode(ResponseCode.ERROR.getCode()); + response.setMessage("不可以回库。"); } - response.setCode(ResponseCode.OK.getCode()); - response.setMessage("可以回库。"); - } else { + return convertJsonString(response); + } catch (Exception e) { + // 回滚事务 + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + logger.error("处理回库请求异常,{}", convertJsonString(e)); response.setCode(ResponseCode.ERROR.getCode()); - response.setMessage("不可以回库。"); + response.setMessage("处理回库请求异常:" + e.getMessage()); + return convertJsonString(response); } - return convertJsonString(response); - } catch (Exception e) { - // 回滚事务 - TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); - logger.error("处理回库请求异常,{}", convertJsonString(e)); - response.setCode(ResponseCode.ERROR.getCode()); - response.setMessage("处理回库请求异常:" + e.getMessage()); - return convertJsonString(response); } } diff --git a/src/main/java/com/wms/controller/UserController.java b/src/main/java/com/wms/controller/UserController.java index 89e9786..35d8f80 100644 --- a/src/main/java/com/wms/controller/UserController.java +++ b/src/main/java/com/wms/controller/UserController.java @@ -125,7 +125,8 @@ public class UserController { } catch (Exception e) { // 回滚事务 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); - logger.info("数据库错误:{}", convertJsonString(e)); + e.printStackTrace(); + logger.error("数据库错误:{}", e.getMessage()); // 返回其他异常 rsp.setCode(ResponseCode.ERROR.getCode()); rsp.setMessage("登录异常"); @@ -175,7 +176,8 @@ public class UserController { } catch (Exception e) { // 回滚事务 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); - logger.info("数据库错误:{}", convertJsonString(e)); + e.printStackTrace(); + logger.error("数据库错误:{}", e.getMessage()); // 返回其他异常 rsp.setCode(ResponseCode.ERROR.getCode()); rsp.setMessage("登录异常"); @@ -357,7 +359,8 @@ public class UserController { } catch (Exception e) { // 回滚事务 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); - logger.info("查询用户列表失败:{}", convertJsonString(e)); + e.printStackTrace(); + logger.error("查询用户列表失败:{}", e.getMessage()); // 返回其他异常 rsp.setCode(ResponseCode.ERROR.getCode()); rsp.setMessage("查询用户列表失败。"); diff --git a/src/main/java/com/wms/controller/WmsLogController.java b/src/main/java/com/wms/controller/WmsLogController.java index 7c6d64f..a67712e 100644 --- a/src/main/java/com/wms/controller/WmsLogController.java +++ b/src/main/java/com/wms/controller/WmsLogController.java @@ -70,7 +70,8 @@ public class WmsLogController { response.setReturnData(pageDto); return convertJsonString(response); } catch (Exception e) { - logger.error("查询日志信息发生异常:{}", convertJsonString(e)); + e.printStackTrace(); + logger.error("查询日志信息发生异常:{}", e.getMessage()); response.setCode(ResponseCode.ERROR.getCode()); response.setMessage("查询日志信息发生异常"); return convertJsonString(response); diff --git a/src/main/java/com/wms/service/business/serviceImplements/WmsTaskServiceImplements.java b/src/main/java/com/wms/service/business/serviceImplements/WmsTaskServiceImplements.java index 8c51bcd..cc1d016 100644 --- a/src/main/java/com/wms/service/business/serviceImplements/WmsTaskServiceImplements.java +++ b/src/main/java/com/wms/service/business/serviceImplements/WmsTaskServiceImplements.java @@ -339,8 +339,8 @@ public class WmsTaskServiceImplements implements IWmsTaskService { } if (outsideVehicle.getRemainNum().compareTo(needNum) > 0) { // 当前箱子剩余物料数量多于需求数量 - needNum = BigDecimal.ZERO; outsideVehicle.setRemainNum(outsideVehicle.getRemainNum().subtract(needNum)); + needNum = BigDecimal.ZERO; usedOutsideVehiclesList.add(outsideVehicle); break; } else { @@ -348,6 +348,9 @@ public class WmsTaskServiceImplements implements IWmsTaskService { needNum = needNum.subtract(outsideVehicle.getRemainNum()); outsideVehicle.setRemainNum(BigDecimal.ZERO); usedOutsideVehiclesList.add(outsideVehicle); + if(needNum.compareTo(BigDecimal.ZERO) == 0){ + break; + } } } } @@ -429,13 +432,16 @@ public class WmsTaskServiceImplements implements IWmsTaskService { // 设备应该处于不可用状态,就不生成任务了 continue; } - if (tempStock.getGoodsRelated().getRemainNum().compareTo(needNum) > 0) { - // 当前箱子剩余物料数量多于需求数量 - needNum = BigDecimal.ZERO; + if (tempStock.getGoodsRelated().getRemainNum().compareTo(needNum) >= 0) { + // 设置剩余数量 StockDetailInfo goodsRelated = tempStock.getGoodsRelated(); goodsRelated.setRemainNum(goodsRelated.getRemainNum().subtract(needNum)); + tempStock.setGoodsRelated(goodsRelated); + // 当前箱子剩余物料数量多于需求数量 + needNum = BigDecimal.ZERO; + } else { // 当前箱子物料剩余数量少于需求数量 needNum = needNum.subtract(tempStock.getGoodsRelated().getRemainNum()); @@ -447,7 +453,10 @@ public class WmsTaskServiceImplements implements IWmsTaskService { waitForOutStockList.add(tempStock); // 将堆垛机任务数量更新 runningTaskNumToEquipmentMap.put(equipmentId, runningTaskNumToEquipmentMap.get(equipmentId) + 1); - break; + if(needNum.compareTo(BigDecimal.ZERO) == 0){ + break; + } +// break; } if (!waitForOutStockList.isEmpty()) { // 创建任务 diff --git a/src/main/java/com/wms/service/business/serviceImplements/WorkServiceImplements.java b/src/main/java/com/wms/service/business/serviceImplements/WorkServiceImplements.java index 59f8f29..f79ca70 100644 --- a/src/main/java/com/wms/service/business/serviceImplements/WorkServiceImplements.java +++ b/src/main/java/com/wms/service/business/serviceImplements/WorkServiceImplements.java @@ -15,8 +15,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Isolation; -import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.interceptor.TransactionAspectSupport; @@ -28,7 +26,6 @@ import java.util.stream.Collectors; import static com.wms.config.InitLocalConfig.*; import static com.wms.constants.WmsConstants.MYSQL_JSON_CI; -import static com.wms.utils.StringUtils.convertJsonString; import static com.wms.utils.WmsUtils.generateId; /** @@ -84,7 +81,7 @@ public class WorkServiceImplements implements IWorkService { * @param workStation 工作站台 */ @Override - @Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED) + @Transactional(rollbackFor = Exception.class) public void doWork(String workStation) { try { // 查找当前站台未开始的工作流 @@ -233,7 +230,7 @@ public class WorkServiceImplements implements IWorkService { goodsToStation.setDistributeStatus(2); } } - // 更新已分配数量 + // 更新已分配数量 todo goodsToStation.setDistributedNum(goodsToStation.getTotalNum().subtract(needNum)); } goodsToStationService.updateBatchById(notFinishedGoodsList); @@ -254,7 +251,8 @@ public class WorkServiceImplements implements IWorkService { .in(KateOrders::getSupplyArea, smallBoxes) .eq(KateOrders::getOrderStatus, 1)); } catch (Exception e) { - logger.error("执行站台:{}工作发生异常:{}", workStation, convertJsonString(e)); + e.printStackTrace(); + logger.error("执行站台:{}工作发生异常:{}", workStation, e.getMessage()); // 回滚事务 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } @@ -350,7 +348,10 @@ public class WorkServiceImplements implements IWorkService { .eq(KateDBS::getWorkOrder, workFlow.getOrderId())); } } - workSummaryService.saveBatch(workSummaryList); + //解决workSummary的主键冲突问题 去掉workSummaryListlist中对象WorkFlowId重复的对象 + workSummaryList = workSummaryList.stream().collect(Collectors.toMap(WorkSummary::getWorkFlowId, a -> a, (k1, k2) -> k1)).values().stream().collect(Collectors.toList()); + + workSummaryService.saveOrUpdateBatch(workSummaryList); // 移除工作流 workFlowService.remove(new LambdaQueryWrapper() .eq(WorkFlow::getWorkStation, workStation)); @@ -358,7 +359,7 @@ public class WorkServiceImplements implements IWorkService { goodsToStationService.remove(new LambdaQueryWrapper() .eq(GoodsToStation::getWorkStation, workStation)); } catch (Exception e) { - logger.error("完成站台:{}工作发生异常:{}", workStation, convertJsonString(e)); + logger.error("完成站台:{},工作发生异常:{}", workStation, e.getMessage()); result = "完成站台:" + workStation + "工作发生异常!"; } return result; @@ -444,7 +445,7 @@ public class WorkServiceImplements implements IWorkService { } tasksOfTodayMap.put(workConfig.getSmallBox(), toDaysOrders); } - // 判断是否有今天开工的工单和小工位 + // 生成今天开工的工单和小工位 if (!tasksOfTodayMap.isEmpty()) { for (String smallBoxKey : tasksOfTodayMap.keySet()) { List currentWorkCenterAndOrderDtoList = tasksOfTodayMap.get(smallBoxKey).stream().sorted(Comparator.comparingInt(WorkCenterAndOrderDto::getDbsSequence)).toList(); @@ -653,10 +654,10 @@ public class WorkServiceImplements implements IWorkService { .in(KateDBS::getWorkOrder, workOrderList) .eq(KateDBS::getDbsStatus, 0)); } - System.out.println("createTempWorkFlows 成功"); + logger.info("createTempWorkFlows 成功"); } } else { - System.out.println("createTempWorkFlows 为空"); + logger.info("createTempWorkFlows 为空"); } } @@ -768,14 +769,9 @@ public class WorkServiceImplements implements IWorkService { Map smallBoxToBigBoxConfigMap = workStationConfigs.stream().collect(Collectors.toMap(WorkStationConfig::getSmallBox, WorkStationConfig::getBigBox)); for (WorkFlow workFlow : needDistributeWorks) { if (smallBoxToBigBoxConfigMap.containsKey(workFlow.getWorkCenter())) { - if (workFlowsByBigBoxMap.containsKey(smallBoxToBigBoxConfigMap.get(workFlow.getWorkCenter()))) { - String bigBox = smallBoxToBigBoxConfigMap.get(workFlow.getWorkCenter()); - List thisBoxWorkFlows = new ArrayList<>(workFlowsByBigBoxMap.get(bigBox)); - thisBoxWorkFlows.add(workFlow); - workFlowsByBigBoxMap.replace(bigBox, thisBoxWorkFlows); - } else { - workFlowsByBigBoxMap.put(smallBoxToBigBoxConfigMap.get(workFlow.getWorkCenter()), List.of(workFlow)); - } + String bigbox = smallBoxToBigBoxConfigMap.get(workFlow.getWorkCenter()); + workFlowsByBigBoxMap.computeIfAbsent(bigbox, k -> new ArrayList<>()) + .add(workFlow); } } // 生成每个大盒子的物料种类map @@ -832,13 +828,15 @@ public class WorkServiceImplements implements IWorkService { Map> notDistributeYetWorksByBoxMap = new HashMap<>(); for (WorkFlow workFlow : thisBoxWorkFlows) { String boxNo = workFlow.getWorkOrder() + "@" + workFlow.getWorkCenter(); - if (notDistributeYetWorksByBoxMap.containsKey(boxNo)) { - List thisBoxNotDistributeYetWorks = new ArrayList<>(notDistributeYetWorksByBoxMap.get(boxNo)); - thisBoxNotDistributeYetWorks.add(workFlow); - notDistributeYetWorksByBoxMap.replace(boxNo, thisBoxNotDistributeYetWorks); - } else { - notDistributeYetWorksByBoxMap.put(boxNo, List.of(workFlow)); - } + notDistributeYetWorksByBoxMap.computeIfAbsent(boxNo, k -> new ArrayList<>()) + .add(workFlow); +// if (notDistributeYetWorksByBoxMap.containsKey(boxNo)) { +// List thisBoxNotDistributeYetWorks = new ArrayList<>(notDistributeYetWorksByBoxMap.get(boxNo)); +// thisBoxNotDistributeYetWorks.add(workFlow); +// notDistributeYetWorksByBoxMap.replace(boxNo, thisBoxNotDistributeYetWorks); +// } else { +// notDistributeYetWorksByBoxMap.put(boxNo, List.of(workFlow)); +// } } if (notDistributeYetWorksByBoxMap.isEmpty()) { // 当前大盒子全部分配完毕 @@ -865,9 +863,15 @@ public class WorkServiceImplements implements IWorkService { continue; } // 排序后的key +// List sortedKeyString = notDistributeYetWorksByBoxMap.keySet().stream() +// .sorted(Comparator.comparing(o -> workOrderToSequenceMap.get(o.split("@")[0]))) +// .sorted(Comparator.comparing(o -> o.split("@")[1])) +// .toList(); List sortedKeyString = notDistributeYetWorksByBoxMap.keySet().stream() - .sorted(Comparator.comparing(o -> workOrderToSequenceMap.get(o.split("@")[0]))) - .sorted(Comparator.comparing(o -> o.split("@")[1])) + .sorted( + Comparator.comparing((String o) -> workOrderToSequenceMap.get(o.split("@")[0])) + .thenComparing(o -> o.split("@")[1]) + ) .toList(); // 本次生成的电子标签配置 List thisStandELocationConfigs = stationToELocationConfigsMap.getOrDefault(targetStandId, new ArrayList<>()); @@ -953,7 +957,8 @@ public class WorkServiceImplements implements IWorkService { } logger.info("分配工作完成"); } catch (Exception e) { - logger.error("分配工作发生异常:{}", convertJsonString(e)); + e.printStackTrace(); + logger.error("分配工作发生异常:{}", e.getMessage()); // 回滚事务 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } diff --git a/src/main/java/com/wms/service/serviceImplements/LocationServiceImplements.java b/src/main/java/com/wms/service/serviceImplements/LocationServiceImplements.java index a9a925e..bc73fa8 100644 --- a/src/main/java/com/wms/service/serviceImplements/LocationServiceImplements.java +++ b/src/main/java/com/wms/service/serviceImplements/LocationServiceImplements.java @@ -101,19 +101,49 @@ public class LocationServiceImplements extends ServiceImpl stackerWithOneTask = runningTaskNumToEquipmentMap.entrySet().stream() + .filter(entry -> entry.getValue() == 1) .map(Map.Entry::getKey) - .orElse(null); - if (mostEmptyStackerId == null) { - // 跳出循环 + .findFirst(); + + Integer selectedStackerId; + + if (stackerWithOneTask.isPresent()) { + selectedStackerId = stackerWithOneTask.get(); + } else { + // 第二步:找当前任务最少的堆垛机 + selectedStackerId = runningTaskNumToEquipmentMap.entrySet().stream() + .min(Comparator.comparingInt(Map.Entry::getValue)) + .map(Map.Entry::getKey) + .orElse(null); + } + + if (selectedStackerId == null) { break; } - getOneLocationByEquipmentId(resultMap, mostEmptyStackerId, vehicleId); + + getOneLocationByEquipmentId(resultMap, selectedStackerId, vehicleId); if (!resultMap.isEmpty()) { break; } - runningTaskNumToEquipmentMap.remove(mostEmptyStackerId); + + // 分配失败就移除该堆垛机,避免死循环 + runningTaskNumToEquipmentMap.remove(selectedStackerId); } // 选择最近未使用的设备 diff --git a/src/main/java/com/wms/utils/excel/vo/KanbanExcelVo.java b/src/main/java/com/wms/utils/excel/vo/KanbanExcelVo.java index cf2214a..7d39c50 100644 --- a/src/main/java/com/wms/utils/excel/vo/KanbanExcelVo.java +++ b/src/main/java/com/wms/utils/excel/vo/KanbanExcelVo.java @@ -4,6 +4,8 @@ import com.alibaba.excel.annotation.ExcelProperty; import com.wms.entity.app.dto.extend.KanbanEntity; import com.wms.utils.StringUtils; import lombok.Data; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.lang.reflect.Field; import java.util.ArrayList; @@ -14,6 +16,7 @@ import java.util.List; */ @Data public class KanbanExcelVo { + private final static Logger log = LoggerFactory.getLogger(KanbanExcelVo.class); @ExcelProperty("KANBAN#1") private String KANBAN1; @ExcelProperty("KANBAN#2") @@ -137,7 +140,7 @@ public class KanbanExcelVo { } } catch (IllegalAccessException e) { // 捕捉异常 - System.out.println("设置看板发生异常:" + e.getMessage()); + log.info("设置看板发生异常:{}" , e.getMessage()); } } } @@ -160,7 +163,7 @@ public class KanbanExcelVo { } } catch (IllegalAccessException e) { // 捕捉异常 - System.out.println("转化看板数据配置时发生异常:" + e.getMessage()); + log.info("转化看板数据配置时发生异常:{}" ,e.getMessage()); } } } diff --git a/src/main/java/com/wms/utils/excel/vo/KanbanGoodsExcelVo.java b/src/main/java/com/wms/utils/excel/vo/KanbanGoodsExcelVo.java index 3bc9571..1b3b475 100644 --- a/src/main/java/com/wms/utils/excel/vo/KanbanGoodsExcelVo.java +++ b/src/main/java/com/wms/utils/excel/vo/KanbanGoodsExcelVo.java @@ -4,6 +4,8 @@ import com.alibaba.excel.annotation.ExcelProperty; import com.wms.entity.app.dto.extend.KanbanEntity; import com.wms.utils.StringUtils; import lombok.Data; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.lang.reflect.Field; import java.math.BigDecimal; @@ -15,6 +17,7 @@ import java.util.List; */ @Data public class KanbanGoodsExcelVo { + private final static Logger logger = LoggerFactory.getLogger(KanbanGoodsExcelVo.class); /** * 料号 */ @@ -318,7 +321,7 @@ public class KanbanGoodsExcelVo { } } catch (IllegalAccessException e) { // 捕捉异常 - System.out.println("设置看板发生异常:" + e.getMessage()); + logger.info("设置看板发生异常:{}" ,e.getMessage()); } } } @@ -341,7 +344,7 @@ public class KanbanGoodsExcelVo { } } catch (IllegalAccessException e) { // 捕捉异常 - System.out.println("转化看板数据配置时发生异常:" + e.getMessage()); + logger.info("转化看板数据配置时发生异常:{}" , e.getMessage()); } } } diff --git a/src/main/java/com/wms/webSocket/service/WebSocketService.java b/src/main/java/com/wms/webSocket/service/WebSocketService.java index de18d9c..f358295 100644 --- a/src/main/java/com/wms/webSocket/service/WebSocketService.java +++ b/src/main/java/com/wms/webSocket/service/WebSocketService.java @@ -6,7 +6,7 @@ import org.springframework.stereotype.Component; /** * ws服务 */ -@ServerEndpoint(value = "/websocket/{userName}") -@Component +//@ServerEndpoint(value = "/websocket/{userName}") +//@Component public class WebSocketService { } diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index efa9b9d..89cdc88 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -20,7 +20,8 @@ - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%line - %msg%n INFO @@ -38,7 +39,8 @@ - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%line - %msg%n WARNING @@ -56,7 +58,8 @@ - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%line - %msg%n ERROR @@ -74,7 +77,8 @@ - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%line - %msg%n DEBUG