diff --git a/src/main/java/com/wms/controller/TaskController.java b/src/main/java/com/wms/controller/TaskController.java index 714fa58..973f1d6 100644 --- a/src/main/java/com/wms/controller/TaskController.java +++ b/src/main/java/com/wms/controller/TaskController.java @@ -932,7 +932,7 @@ public class TaskController { @PostMapping("/getTasksByPage") @ResponseBody @Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED) - public String getTasksByPage(@RequestBody TaskQuery taskQuery){ + public String getTasksByPage(@RequestBody TaskQuery taskQuery) { ResponseEntity response = new ResponseEntity(); try { Page page = taskQuery.toMpPage(); @@ -966,7 +966,7 @@ public class TaskController { @PostMapping("/getTasks") @ResponseBody @Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED) - public String getTasks(@RequestBody TaskQuery taskQuery){ + public String getTasks(@RequestBody TaskQuery taskQuery) { ResponseEntity response = new ResponseEntity(); try { //更新条件 @@ -991,4 +991,142 @@ public class TaskController { return convertJsonString(response); } } + + /** + * 拣货完成确认回库 + * + * @param finishPickingRequest 拣货完成确认回库请求 + * @return 结果 + */ + @PostMapping("/finishPickingAndBack") + @ResponseBody + @Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED) + @MyLog(logTitle = "拣货完成确认回库", logMethod = "finishPickingAndBack") + public String finishPickingAndBack(@RequestBody FinishPickingRequest finishPickingRequest) { + logger.info("接收到拣货完成确认回库:{},ip地址:{}", JSON.toJSONString(finishPickingRequest), HttpUtils.getIpAddr(servletRequest)); + ResponseEntity response = new ResponseEntity(); + try { + String validateInfo = validateConfirmPickRequest(finishPickingRequest); + if (!validateInfo.equals("")) { + logger.error("拣货完成确认回库请求验证错误:{}", validateInfo); + response.setCode(ResponseCode.ERROR.getCode()); + response.setMessage(validateInfo); + return convertJsonString(response); + } + // 查询到对应的任务 + Task task = taskService.getOne(new LambdaQueryWrapper().eq(Task::getTaskId, finishPickingRequest.getTaskId())); + if (task == null) { + logger.error("请勿重复操作"); + response.setCode(ResponseCode.ERROR.getCode()); + response.setMessage("请勿重复操作"); + return convertJsonString(response); + } + // 查询对应库存 + Stock stock = stockService.getOne(new LambdaQueryWrapper() + .eq(Stock::getVehicleId, finishPickingRequest.getVehicleId()) + .apply("goods_related ->> '$.goodsId' = {0}", finishPickingRequest.getGoodsId())); + // 删除当前任务,并生成任务记录 + task.setFinishTime(LocalDateTime.now()); + task.setUserName(finishPickingRequest.getUserName()); + task.setTaskStatus(WmsTaskStatus.FINISH.getCode()); + taskRecordService.save(BeanUtil.copyProperties(task, TaskRecord.class)); + taskService.remove(new LambdaQueryWrapper().eq(Task::getTaskId, finishPickingRequest.getTaskId())); + // 更新库存 + StockDetailInfo goodsInfo = stock.getGoodsRelated(); + goodsInfo.setRemainNum(BigDecimal.valueOf(finishPickingRequest.getOriginNum() - finishPickingRequest.getOpNum())); + stock.setGoodsRelated(goodsInfo); + stockService.update(stock, new LambdaUpdateWrapper().eq(Stock::getStockId, stock.getStockId())); + // 判断当前载具是否还有拣选任务 + LambdaQueryWrapper sameVehicleTaskQuery = new LambdaQueryWrapper() + .eq(Task::getVehicleId, finishPickingRequest.getVehicleId()); + if (!taskService.exists(sameVehicleTaskQuery)) { + // 生成回库任务 + Map nextLocationMap = new HashMap<>(); + // 请求可用库位 + for (int i = 0; i < locationService.count(new LambdaQueryWrapper().eq(Location::getLocationStatus, LocationStatus.EMPTY.getCode())); i++) { + Map resultMap = locationService.getOneLocation(task.getDestination(), null); + if (resultMap.isEmpty() || !resultMap.containsKey("nextLocationId")) { + logger.error("暂无可用库位"); + response.setCode(ResponseCode.ERROR.getCode()); + response.setMessage("暂无可用库位!"); + return convertJsonString(response); + } else { + Location nextLocation = locationService.getOne(new LambdaQueryWrapper().eq(Location::getLocationId, resultMap.get("nextLocationId"))); + LambdaUpdateWrapper updateLocationWrapper = new LambdaUpdateWrapper() + .set(Location::getLocationStatus, LocationStatus.OCCUPY.getCode()) + .set(Location::getVehicleId, task.getVehicleId()) + .eq(Location::getLocationId, nextLocation.getLocationId()) + .eq(Location::getLocationStatus, LocationStatus.EMPTY.getCode()); + if (locationService.update(updateLocationWrapper)) { + nextLocationMap = resultMap; + break; + } + } + } + if (nextLocationMap.isEmpty() || !nextLocationMap.containsKey("nextLocationId")) { + logger.error("暂无可用库位"); + response.setCode(ResponseCode.ERROR.getCode()); + response.setMessage("暂无可用库位!"); + return convertJsonString(response); + } + // 生成入库任务 + Task tempInTask = new Task(); + tempInTask.setTaskId(generateId("HK_")); + tempInTask.setTaskType(TaskType.IN.getCode()); + tempInTask.setTaskStatus(WmsTaskStatus.NEW.getCode()); + tempInTask.setTaskGroup(generateId("")); + tempInTask.setTaskPriority(1); + tempInTask.setVehicleId(task.getVehicleId()); + tempInTask.setOrigin(task.getDestination()); + tempInTask.setDestination(nextLocationMap.get("nextLocationId")); + tempInTask.setVehicleSize(1); + tempInTask.setWeight(BigDecimal.valueOf(0.0)); + tempInTask.setCreateTime(LocalDateTime.now()); + tempInTask.setUserName(finishPickingRequest.getUserName()); + tempInTask.setPreTask(nextLocationMap.get("preTaskId")); + taskService.save(tempInTask); + // 返回请求 + logger.info("处理拣货完成确认回库成功"); + response.setCode(ResponseCode.OK.getCode()); + response.setMessage("处理拣货完成确认回库成功"); + } else { + 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); + } + } + + /** + * 验证拣货完成确认回库的请求的正确性 + * @param finishPickingRequest 拣货完成确认回库的请求 + * @return 结果-----正确则为"" + */ + private String validateConfirmPickRequest(FinishPickingRequest finishPickingRequest) { + // 判断是否缺少必须信息 + if (StringUtils.isEmpty(finishPickingRequest.getTaskId()) || StringUtils.isEmpty(finishPickingRequest.getVehicleId()) + || StringUtils.isEmpty(finishPickingRequest.getGoodsId())) { + return "请求缺少必须信息,请检查任务号+载具+物料组合是否齐全。"; + } + LambdaQueryWrapper taskLambdaQueryWrapperById = new LambdaQueryWrapper() + .eq(Task::getTaskId, finishPickingRequest.getTaskId()) + .eq(Task::getVehicleId, finishPickingRequest.getVehicleId()) + .apply("goods_related ->> '$.goodsId' = {0}", finishPickingRequest.getGoodsId()) + .eq(Task::getTaskType, TaskType.OUT.getCode()) + .eq(Task::getTaskStatus, WmsTaskStatus.PICKING.getCode()) + .eq(Task::getIsPicking, 1); + if (!taskService.exists(taskLambdaQueryWrapperById)) { + return "当前的请求信息没有对应的可拣选任务"; + } + return ""; + } } \ No newline at end of file diff --git a/src/main/java/com/wms/entity/app/request/FinishPickingRequest.java b/src/main/java/com/wms/entity/app/request/FinishPickingRequest.java new file mode 100644 index 0000000..a2f4503 --- /dev/null +++ b/src/main/java/com/wms/entity/app/request/FinishPickingRequest.java @@ -0,0 +1,41 @@ +package com.wms.entity.app.request; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * 拣货完成确认回库请求 + */ +@Data +public class FinishPickingRequest { + /** + * 任务号 + */ + @JsonProperty("taskId") + private String taskId; + /** + * 载具号 + */ + @JsonProperty("vehicleId") + private String vehicleId; + /** + * 物料编号 + */ + @JsonProperty("goodsId") + private String goodsId; + /** + * 操作数量 + */ + @JsonProperty("opNum") + private Integer opNum; + /** + * 原库存数量 + */ + @JsonProperty("originNum") + private Integer originNum; + /** + * 操作人员 + */ + @JsonProperty("userName") + private String userName; +} diff --git a/src/main/java/com/wms/entity/app/request/WcsTaskResultRequest.java b/src/main/java/com/wms/entity/app/request/WcsTaskResultRequest.java index c030de2..7aa5140 100644 --- a/src/main/java/com/wms/entity/app/request/WcsTaskResultRequest.java +++ b/src/main/java/com/wms/entity/app/request/WcsTaskResultRequest.java @@ -1,8 +1,6 @@ package com.wms.entity.app.request; import com.fasterxml.jackson.annotation.JsonProperty; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index e49269d..eaeab68 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -13,15 +13,15 @@ spring: # password: coder # driver-class-name: com.mysql.cj.jdbc.Driver # 宝开服务器--内网 - url: jdbc:mysql://192.168.3.254:3306/wms_miniload_bk7?characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowMultiQueries=true&rewriteBatchedStatements=true +# url: jdbc:mysql://192.168.3.254:3306/wms_miniload_bk7?characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowMultiQueries=true&rewriteBatchedStatements=true +# username: coder +# password: coder +# driver-class-name: com.mysql.cj.jdbc.Driver + # 上线环境 + url: jdbc:mysql://192.168.3.254:3306/wms_miniload_bk7_test?characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowMultiQueries=true&rewriteBatchedStatements=true username: coder password: coder driver-class-name: com.mysql.cj.jdbc.Driver - # 上线环境 -# url: jdbc:mysql://localhost:3306/wms_xizhou?characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowMultiQueries=true&rewriteBatchedStatements=true -# username: developer -# password: developer -# driver-class-name: com.mysql.cj.jdbc.Driver # 从库 # slave_1: # url: jdbc:mysql://localhost:3306/wms_miniload_bk7?characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowMultiQueries=true&rewriteBatchedStatements=true