From 0c5613e6dc1f135c1ab2130632ae862d388410b3 Mon Sep 17 00:00:00 2001 From: icewint Date: Wed, 17 Jul 2024 10:48:44 +0800 Subject: [PATCH] =?UTF-8?q?[important]=E5=AE=8C=E5=96=84wcs=E5=9B=9E?= =?UTF-8?q?=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/wms/bussiness/JobComponent.java | 17 +- .../com/wms/constants/enums/UrlEnums.java | 7 +- .../others/ContainerController.java | 4 +- .../wms/controller/others/WcsController.java | 222 +++++++++++++++++- .../app/mes/SendMesPutInGoodsRequest.java | 43 ++++ .../app/wcs/WmsReceiveTaskResultEntity.java | 4 + src/main/resources/application.yml | 2 +- 7 files changed, 291 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/wms/entity/app/mes/SendMesPutInGoodsRequest.java diff --git a/src/main/java/com/wms/bussiness/JobComponent.java b/src/main/java/com/wms/bussiness/JobComponent.java index f5f812d..3b8606a 100644 --- a/src/main/java/com/wms/bussiness/JobComponent.java +++ b/src/main/java/com/wms/bussiness/JobComponent.java @@ -9,6 +9,7 @@ import com.wms.entity.app.container.SendContainerTaskRequest; import com.wms.entity.app.wcs.WcsTask; import com.wms.entity.table.*; import com.wms.mapper.LocationMapper; +import com.wms.mapper.StockMapper; import com.wms.mapper.TaskMapper; import com.wms.service.*; import com.wms.utils.HttpUtils; @@ -69,7 +70,7 @@ public class JobComponent extends BaseController { */ private final StockService stockService; private final TaskRecordService taskRecordService; - + private final StockMapper stockMapper; @Scheduled(fixedDelay = 1000) @@ -204,6 +205,13 @@ public class JobComponent extends BaseController { if(emptyLocationItem == null) { return; // 没有可用库位或者m库位存在干涉 } + // 锁定旧库位库存 + stockMapper.updateStockStatusWithLocationId(beforLocation.getLocationId(), StockStatus.LOCK.getCode()); + // 锁定新库位 + Location locationForUpdate = new Location(); + locationForUpdate.setLocationId(emptyLocationItem.getLocationId()); + locationForUpdate.setLocationStatus(LocationStatus.OCCUPY.getCode()); + locationMapper.modifyLocation(locationForUpdate); // 构造移库任务 Task moveTask = new Task(); moveTask.setTaskId(UUID.randomUUID().toString()); @@ -339,6 +347,13 @@ public class JobComponent extends BaseController { if(emptyLocationItem == null) { return; // 没有可用库位或者m库位存在干涉 } + // 锁定旧库位库存 + stockMapper.updateStockStatusWithLocationId(beforLocation.getLocationId(), StockStatus.LOCK.getCode()); + // 锁定新库位 + Location locationForUpdate = new Location(); + locationForUpdate.setLocationId(emptyLocationItem.getLocationId()); + locationForUpdate.setLocationStatus(LocationStatus.OCCUPY.getCode()); + locationMapper.modifyLocation(locationForUpdate); // 构造移库任务 Task moveTask = new Task(); moveTask.setTaskId(UUID.randomUUID().toString()); diff --git a/src/main/java/com/wms/constants/enums/UrlEnums.java b/src/main/java/com/wms/constants/enums/UrlEnums.java index ff2731d..df26a97 100644 --- a/src/main/java/com/wms/constants/enums/UrlEnums.java +++ b/src/main/java/com/wms/constants/enums/UrlEnums.java @@ -1,9 +1,10 @@ package com.wms.constants.enums; public enum UrlEnums { - URL_WMS_TO_WCS_SEND_TASK("WMS向WCS发送任务", "http://192.168.103.202:18990/api/Wms/WmsTask/SetStackerTask"), - URL_WMS_TO_WCS_CHANGE_TASK("WMS请求变更任务状态", "http://192.168.103.202:18990/api/Wms/WmsTask/ChangeTaskStatus"), - URL_WMS_TO_WCS_CONTAINER_TASK("WMS向四向车发送任务",""); + URL_WMS_TO_WCS_SEND_TASK("WMS向WCS发送任务", "http://172.21.80.151:18990/api/Wms/WmsTask/SetStackerTask"), + URL_WMS_TO_WCS_CHANGE_TASK("WMS请求变更任务状态", "http://172.21.80.151:18990/api/Wms/WmsTask/ChangeTaskStatus"), + URL_WMS_TO_WCS_CONTAINER_TASK("WMS向四向车发送任务","http://172.21.80.150:9991/api/Wcs/PushTask"), + URL_WMS_TO_MES_IN("扫码上架", ""); private final String description; private final String value; diff --git a/src/main/java/com/wms/controller/others/ContainerController.java b/src/main/java/com/wms/controller/others/ContainerController.java index 59bf53c..7826b0a 100644 --- a/src/main/java/com/wms/controller/others/ContainerController.java +++ b/src/main/java/com/wms/controller/others/ContainerController.java @@ -29,7 +29,7 @@ public class ContainerController extends BaseController { * @param request 请求信息 * @return 返回信息 */ - @PostMapping("/CreateInstoreTask") + @PostMapping("/createInstoreTask") public CreateInstoreTaskResponse createInstoreTask(@RequestBody @Validated CreateInstoreTaskRequest request) { return containerService.createInstoreTask(request); } @@ -40,7 +40,7 @@ public class ContainerController extends BaseController { * @param request 请求信息 * @return 响应信息 */ - @PostMapping("/TaskStateNotice") + @PostMapping("/taskStateNotice") public ContainerApiLocalResponse taskStateNotice(@RequestBody @Validated TaskStateNoticeRequest request){ return containerService.taskStateNotice(request); } diff --git a/src/main/java/com/wms/controller/others/WcsController.java b/src/main/java/com/wms/controller/others/WcsController.java index 2a5b244..42707d2 100644 --- a/src/main/java/com/wms/controller/others/WcsController.java +++ b/src/main/java/com/wms/controller/others/WcsController.java @@ -1,19 +1,29 @@ package com.wms.controller.others; +import com.alibaba.fastjson2.JSON; import com.wms.constants.enums.*; import com.wms.entity.app.ResponseEntity; +import com.wms.entity.app.container.ContainerApiLocalResponse; import com.wms.entity.app.mes.MesApiLocalResponse; +import com.wms.entity.app.mes.SendMesPutInGoodsRequest; import com.wms.entity.app.wcs.RequireInRequest; +import com.wms.entity.app.wcs.WmsReceiveTaskResultEntity; import com.wms.entity.table.Location; import com.wms.entity.table.Stock; import com.wms.entity.table.Task; import com.wms.mapper.LocationMapper; import com.wms.mapper.StockMapper; import com.wms.mapper.TaskMapper; +import com.wms.service.TaskService; +import com.wms.utils.HttpUtils; import com.wms.utils.storage.LocationUtils; +import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Isolation; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -49,6 +59,16 @@ public class WcsController { */ private final LocationUtils locationUtils; + /** + * 请求头部信息 + */ + private final HttpServletRequest servletRequest; + + /** + * 任务服务 + */ + private final TaskService taskService; + /** * 立库申请入库 @@ -62,7 +82,7 @@ public class WcsController { checkIsExist.setBatchNo(request.getVehicleNo()); checkIsExist.setStockStatus(StockStatus.WAIT_IN.getCode()); List checkIsExistListResult = stockMapper.selStocks(checkIsExist); - if(checkIsExistListResult.isEmpty()) { + if(checkIsExistListResult == null || checkIsExistListResult.isEmpty()) { // 记录不存在 return new ResponseEntity(0, String.format("该条码不存在待入库记录,条码号:%s", request.getVehicleNo())); } @@ -111,10 +131,210 @@ public class WcsController { task.setTaskPriority(1); int addTask = taskMapper.addTask(task); if(addTask > 0) { + sendMesPutInGoods(checkIsExistListResult.get(0), emptyLocationItem.getLocationId()); // 发送 mes 入库上架 return new ResponseEntity(1, "存在入库任务,申请成功"); } return new ResponseEntity(0, "添加入库任务失败,网络连接异常,请稍后再试"); } + + private void sendMesPutInGoods(Stock stock, String locationId) { + SendMesPutInGoodsRequest request = new SendMesPutInGoodsRequest(); + request.setGuid(stock.getStockId()); + request.setLosnr(stock.getBatchNo()); + request.setItemCode(stock.getGoodsId()); + request.setLotQty(String.valueOf(stock.getRealNum())); + request.setBinCode(locationId); + String requestString = JSON.toJSONString(request); + String responseString = HttpUtils.sendHttpPostWithoutToken(UrlEnums.URL_WMS_TO_MES_IN.getValue(), requestString); + MesApiLocalResponse result = JSON.parseObject(responseString, MesApiLocalResponse.class); + if(result != null && result.getTransFlag().equals(1)) { + log.info("发送MES入库上架成功,信息:{}", requestString); + } + log.info("发送MES入库上架失败,信息:{},返回信息:{}", requestString, responseString); + + } + + + /** + * 收到 wcs 返回的任务状态 + * @param wmsReceiveTaskResultEntity wcs请求值 + * @return 返回的信息 + */ + @PostMapping("/sendTaskResult") + @Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED) + public ResponseEntity receiveTaskResult(@RequestBody @Validated WmsReceiveTaskResultEntity wmsReceiveTaskResultEntity) { + log.info("接收到任务反馈:{},ip地址:{}", wmsReceiveTaskResultEntity.toLoggerString(), HttpUtils.getIpAddr(servletRequest)); + // 获取任务号 + String taskId = wmsReceiveTaskResultEntity.getTaskId(); + Integer taskStatus = wmsReceiveTaskResultEntity.getTaskStatus(); + String vehicleNo = wmsReceiveTaskResultEntity.getVehicleNo(); + // 查找对应任务 + Task taskForQuery = new Task(); + taskForQuery.setTaskGroup(taskId); + List tasks = taskService.selTasks(taskForQuery); + if(tasks == null || tasks.isEmpty()) { + return new ResponseEntity(-1, "没有找到对应的任务"); + } + Task task = tasks.get(0); + if(taskStatus.equals(WmsTaskStatus.FINISH.getCode())) { // 任务完成 + if(task.getTaskType().equals(TaskType.IN.getCode())) { // 入库 + /* 找出任务,完成该任务;找出该任务终点,更新库存为OK */ + // 完成任务 + Task completeTask = new Task(); + completeTask.setTaskId(task.getTaskId()); + completeTask.setTaskStatus(WmsTaskStatus.FINISH.getCode()); + completeTask.setFinishTime(new Date()); + taskMapper.executeTask(completeTask); // 完成任务 + // 更新库存为 ok + int updateStock = stockMapper.updateStockStatusWithLocationId(task.getDestination(), StockStatus.OK.getCode()); + if(updateStock > 0){ + log.info("入库完成更新库存成功,任务:{}", task.toLoggerString()); + return new ResponseEntity(0, "入库完成"); + } + return new ResponseEntity(0, "入库完成,更新库存失败"); + } + if(task.getTaskType().equals(TaskType.OUT.getCode())) { // 出库 + /* 找出任务,完成该任务;找出该任务终点,删除库存;释放库位 */ + // 完成任务 + Task completeTask = new Task(); + completeTask.setTaskId(task.getTaskId()); + completeTask.setTaskStatus(WmsTaskStatus.FINISH.getCode()); + completeTask.setFinishTime(new Date()); + taskMapper.executeTask(completeTask); // 完成任务 + // 释放库位 + Location updateLocation = new Location(); + updateLocation.setLocationId(task.getOrigin()); + updateLocation.setLocationStatus(LocationStatus.EMPTY.getCode()); + updateLocation.setVehicleId(""); + locationMapper.modifyLocation(updateLocation); // 更新库位为空 + // 删除库存 + int updateStock = stockMapper.deleteStockWithLocationId(task.getOrigin()); + if(updateStock > 0){ + log.info("出库完成删除库存成功,任务:{}", task.toLoggerString()); + return new ResponseEntity(0, "出库完成"); + } + return new ResponseEntity(0, "出库完成,删除库存失败"); + } + if(task.getTaskType().equals(TaskType.INVENTORY.getCode())) { // 盘点 + /* 找出任务,完成该任务;找出该任务终点,删除库存;释放库位 */ + // 完成任务 + Task completeTask = new Task(); + completeTask.setTaskId(task.getTaskId()); + completeTask.setTaskStatus(WmsTaskStatus.FINISH.getCode()); + completeTask.setFinishTime(new Date()); + taskMapper.executeTask(completeTask); // 完成任务 + // 释放库位 + Location updateLocation = new Location(); + updateLocation.setLocationId(task.getOrigin()); + updateLocation.setLocationStatus(LocationStatus.EMPTY.getCode()); + updateLocation.setVehicleId(""); + locationMapper.modifyLocation(updateLocation); // 更新库位为空 + // 删除库存 + int updateStock = stockMapper.deleteStockWithLocationId(task.getOrigin()); + if(updateStock > 0){ + log.info("盘点出库完成删除库存成功,任务:{}", task.toLoggerString()); + return new ResponseEntity(0, "盘点出库完成"); + } + return new ResponseEntity(0, "盘点出库完成,删除库存失败"); + } + if(task.getTaskType().equals(TaskType.MOVE.getCode())) { // 移库 + /* 找出任务,更新任务为完成;释放原库位;更新库存到新库位 */ + // 完成任务 + Task completeTask = new Task(); + completeTask.setTaskId(task.getTaskId()); + completeTask.setTaskStatus(WmsTaskStatus.FINISH.getCode()); + completeTask.setFinishTime(new Date()); + taskMapper.executeTask(completeTask); // 完成任务 + // 释放原库位 + // 释放库位 + Location updateLocation = new Location(); + updateLocation.setLocationId(task.getOrigin()); + updateLocation.setLocationStatus(LocationStatus.EMPTY.getCode()); + updateLocation.setVehicleId(""); + locationMapper.modifyLocation(updateLocation); // 更新库位为空 + // 更新库位 + int updatedLocation = stockMapper.updateLocationAndStatus(task.getOrigin(), task.getDestination(), StockStatus.OK.getCode()); + if(updatedLocation > 0){ + log.info("移库库位更新成功,任务:{}", task.toLoggerString()); + return new ResponseEntity(0, "移库库位更新成功"); + } + return new ResponseEntity(0, "移库库位更新失败"); + } + } + if(taskStatus.equals(WmsTaskStatus.CANCEL.getCode())) { // 任务取消 + if(task.getTaskType().equals(TaskType.IN.getCode())) { // 入库 + /* 找出任务,取消该任务;找出该任务终点,更新库存为OK */ + // 取消任务 + Task completeTask = new Task(); + completeTask.setTaskId(task.getTaskId()); + completeTask.setTaskStatus(WmsTaskStatus.CANCEL.getCode()); + completeTask.setFinishTime(new Date()); + taskMapper.executeTask(completeTask); // 取消任务 + // 更新库存为 ok + int updateStock = stockMapper.updateStockStatusWithLocationId(task.getDestination(), StockStatus.OK.getCode()); + if(updateStock > 0){ + log.info("入库取消更新库存成功,任务:{}", task.toLoggerString()); + return new ResponseEntity(0, "入库取消"); + } + return new ResponseEntity(0, "入库取消,更新库存失败"); + } + if(task.getTaskType().equals(TaskType.OUT.getCode())) { // 出库 + /* 找出任务,取消该任务;找出该任务终点,删除库存;释放库位 */ + // 取消任务 + Task completeTask = new Task(); + completeTask.setTaskId(task.getTaskId()); + completeTask.setTaskStatus(WmsTaskStatus.CANCEL.getCode()); + completeTask.setFinishTime(new Date()); + taskMapper.executeTask(completeTask); // 取消任务 + // 更新库存为 ok + int updateStock = stockMapper.updateStockStatusWithLocationId(task.getDestination(), StockStatus.OK.getCode()); + if(updateStock > 0){ + log.info("出库取消更新库存成功,任务:{}", task.toLoggerString()); + return new ResponseEntity(0, "出库取消"); + } + return new ResponseEntity(0, "出库取消,更新库存失败"); + } + if(task.getTaskType().equals(TaskType.INVENTORY.getCode())) { // 盘点 + /* 找出任务,取消该任务;找出该任务终点,删除库存;释放库位 */ + // 取消任务 + Task completeTask = new Task(); + completeTask.setTaskId(task.getTaskId()); + completeTask.setTaskStatus(WmsTaskStatus.CANCEL.getCode()); + completeTask.setFinishTime(new Date()); + taskMapper.executeTask(completeTask); // 取消任务 + // 更新库存为 ok + int updateStock = stockMapper.updateStockStatusWithLocationId(task.getDestination(), StockStatus.OK.getCode()); + if(updateStock > 0){ + log.info("盘点出库取消更新库存成功,任务:{}", task.toLoggerString()); + return new ResponseEntity(0, "盘点出库取消"); + } + return new ResponseEntity(0, "盘点出库取消,更新库存失败"); + } + if(task.getTaskType().equals(TaskType.MOVE.getCode())) { // 移库 + /* 找出任务,更新任务为取消;释放新库位;更新库存为OK */ + // 取消任务 + Task completeTask = new Task(); + completeTask.setTaskId(task.getTaskId()); + completeTask.setTaskStatus(WmsTaskStatus.CANCEL.getCode()); + completeTask.setFinishTime(new Date()); + taskMapper.executeTask(completeTask); // 取消任务 + // 释放库位 + Location updateLocation = new Location(); + updateLocation.setLocationId(task.getDestination()); + updateLocation.setLocationStatus(LocationStatus.EMPTY.getCode()); + updateLocation.setVehicleId(""); + locationMapper.modifyLocation(updateLocation); // 更新库位为空 + // 更新库位 + int updatedLocation = stockMapper.updateStockStatusWithLocationId(task.getOrigin(), StockStatus.OK.getCode()); + if(updatedLocation > 0){ + log.info("移库取消库位状态更新成功,任务:{}", task.toLoggerString()); + return new ResponseEntity(0, "移库取消库位状态更新成功"); + } + return new ResponseEntity(0, "移库取消库位状态更新失败"); + } + } + return new ResponseEntity(0, "不处理的状态"); + } } diff --git a/src/main/java/com/wms/entity/app/mes/SendMesPutInGoodsRequest.java b/src/main/java/com/wms/entity/app/mes/SendMesPutInGoodsRequest.java new file mode 100644 index 0000000..cce0bc2 --- /dev/null +++ b/src/main/java/com/wms/entity/app/mes/SendMesPutInGoodsRequest.java @@ -0,0 +1,43 @@ +package com.wms.entity.app.mes; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * 入库发送 mes + */ +@Data +public class SendMesPutInGoodsRequest { + + /** + * 唯一号 + */ + @JsonProperty("guid") + private String guid; + + /** + * 批次号 + */ + @JsonProperty("Losnr") + private String losnr; + + /** + * 料号 + */ + @JsonProperty("ItemCode") + private String itemCode; + + /** + * 数量 + */ + @JsonProperty("LotQty") + private String lotQty; + + /** + * 库位 + */ + @JsonProperty("BinCode") + private String binCode; + + +} diff --git a/src/main/java/com/wms/entity/app/wcs/WmsReceiveTaskResultEntity.java b/src/main/java/com/wms/entity/app/wcs/WmsReceiveTaskResultEntity.java index 425c224..96d0332 100644 --- a/src/main/java/com/wms/entity/app/wcs/WmsReceiveTaskResultEntity.java +++ b/src/main/java/com/wms/entity/app/wcs/WmsReceiveTaskResultEntity.java @@ -1,6 +1,8 @@ package com.wms.entity.app.wcs; import com.wms.entity.BaseEntity; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; /** * WCS向WMS发送任务结果请求实体类 @@ -10,10 +12,12 @@ public class WmsReceiveTaskResultEntity extends BaseEntity { /** * WMS任务编号 */ + @NotBlank(message = "任务ID不允许为空") private String taskId; /** * 任务状态 */ + @NotNull(message = "任务状态不允许为空") private Integer taskStatus; /** * 任务终点 diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 9fe86c0..59539cc 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -15,7 +15,7 @@ spring: active: online server: # 服务端配置 - port: 12315 + port: 19990 servlet: # 接口地址 context-path: /