<fix>[important]完善wcs回告

This commit is contained in:
葛林强 2024-07-17 10:48:44 +08:00
parent 6f740607da
commit 0c5613e6dc
7 changed files with 291 additions and 8 deletions

View File

@ -9,6 +9,7 @@ import com.wms.entity.app.container.SendContainerTaskRequest;
import com.wms.entity.app.wcs.WcsTask; import com.wms.entity.app.wcs.WcsTask;
import com.wms.entity.table.*; import com.wms.entity.table.*;
import com.wms.mapper.LocationMapper; import com.wms.mapper.LocationMapper;
import com.wms.mapper.StockMapper;
import com.wms.mapper.TaskMapper; import com.wms.mapper.TaskMapper;
import com.wms.service.*; import com.wms.service.*;
import com.wms.utils.HttpUtils; import com.wms.utils.HttpUtils;
@ -69,7 +70,7 @@ public class JobComponent extends BaseController {
*/ */
private final StockService stockService; private final StockService stockService;
private final TaskRecordService taskRecordService; private final TaskRecordService taskRecordService;
private final StockMapper stockMapper;
@Scheduled(fixedDelay = 1000) @Scheduled(fixedDelay = 1000)
@ -204,6 +205,13 @@ public class JobComponent extends BaseController {
if(emptyLocationItem == null) { if(emptyLocationItem == null) {
return; // 没有可用库位或者m库位存在干涉 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(); Task moveTask = new Task();
moveTask.setTaskId(UUID.randomUUID().toString()); moveTask.setTaskId(UUID.randomUUID().toString());
@ -339,6 +347,13 @@ public class JobComponent extends BaseController {
if(emptyLocationItem == null) { if(emptyLocationItem == null) {
return; // 没有可用库位或者m库位存在干涉 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(); Task moveTask = new Task();
moveTask.setTaskId(UUID.randomUUID().toString()); moveTask.setTaskId(UUID.randomUUID().toString());

View File

@ -1,9 +1,10 @@
package com.wms.constants.enums; package com.wms.constants.enums;
public enum UrlEnums { 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_SEND_TASK("WMS向WCS发送任务", "http://172.21.80.151: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_CHANGE_TASK("WMS请求变更任务状态", "http://172.21.80.151:18990/api/Wms/WmsTask/ChangeTaskStatus"),
URL_WMS_TO_WCS_CONTAINER_TASK("WMS向四向车发送任务",""); 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 description;
private final String value; private final String value;

View File

@ -29,7 +29,7 @@ public class ContainerController extends BaseController {
* @param request 请求信息 * @param request 请求信息
* @return 返回信息 * @return 返回信息
*/ */
@PostMapping("/CreateInstoreTask") @PostMapping("/createInstoreTask")
public CreateInstoreTaskResponse createInstoreTask(@RequestBody @Validated CreateInstoreTaskRequest request) { public CreateInstoreTaskResponse createInstoreTask(@RequestBody @Validated CreateInstoreTaskRequest request) {
return containerService.createInstoreTask(request); return containerService.createInstoreTask(request);
} }
@ -40,7 +40,7 @@ public class ContainerController extends BaseController {
* @param request 请求信息 * @param request 请求信息
* @return 响应信息 * @return 响应信息
*/ */
@PostMapping("/TaskStateNotice") @PostMapping("/taskStateNotice")
public ContainerApiLocalResponse taskStateNotice(@RequestBody @Validated TaskStateNoticeRequest request){ public ContainerApiLocalResponse taskStateNotice(@RequestBody @Validated TaskStateNoticeRequest request){
return containerService.taskStateNotice(request); return containerService.taskStateNotice(request);
} }

View File

@ -1,19 +1,29 @@
package com.wms.controller.others; package com.wms.controller.others;
import com.alibaba.fastjson2.JSON;
import com.wms.constants.enums.*; import com.wms.constants.enums.*;
import com.wms.entity.app.ResponseEntity; 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.MesApiLocalResponse;
import com.wms.entity.app.mes.SendMesPutInGoodsRequest;
import com.wms.entity.app.wcs.RequireInRequest; 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.Location;
import com.wms.entity.table.Stock; import com.wms.entity.table.Stock;
import com.wms.entity.table.Task; import com.wms.entity.table.Task;
import com.wms.mapper.LocationMapper; import com.wms.mapper.LocationMapper;
import com.wms.mapper.StockMapper; import com.wms.mapper.StockMapper;
import com.wms.mapper.TaskMapper; import com.wms.mapper.TaskMapper;
import com.wms.service.TaskService;
import com.wms.utils.HttpUtils;
import com.wms.utils.storage.LocationUtils; import com.wms.utils.storage.LocationUtils;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; 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.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -49,6 +59,16 @@ public class WcsController {
*/ */
private final LocationUtils locationUtils; private final LocationUtils locationUtils;
/**
* 请求头部信息
*/
private final HttpServletRequest servletRequest;
/**
* 任务服务
*/
private final TaskService taskService;
/** /**
* 立库申请入库 * 立库申请入库
@ -62,7 +82,7 @@ public class WcsController {
checkIsExist.setBatchNo(request.getVehicleNo()); checkIsExist.setBatchNo(request.getVehicleNo());
checkIsExist.setStockStatus(StockStatus.WAIT_IN.getCode()); checkIsExist.setStockStatus(StockStatus.WAIT_IN.getCode());
List<Stock> checkIsExistListResult = stockMapper.selStocks(checkIsExist); List<Stock> checkIsExistListResult = stockMapper.selStocks(checkIsExist);
if(checkIsExistListResult.isEmpty()) { if(checkIsExistListResult == null || checkIsExistListResult.isEmpty()) {
// 记录不存在 // 记录不存在
return new ResponseEntity(0, String.format("该条码不存在待入库记录,条码号:%s", request.getVehicleNo())); return new ResponseEntity(0, String.format("该条码不存在待入库记录,条码号:%s", request.getVehicleNo()));
} }
@ -111,10 +131,210 @@ public class WcsController {
task.setTaskPriority(1); task.setTaskPriority(1);
int addTask = taskMapper.addTask(task); int addTask = taskMapper.addTask(task);
if(addTask > 0) { if(addTask > 0) {
sendMesPutInGoods(checkIsExistListResult.get(0), emptyLocationItem.getLocationId()); // 发送 mes 入库上架
return new ResponseEntity(1, "存在入库任务,申请成功"); return new ResponseEntity(1, "存在入库任务,申请成功");
} }
return new ResponseEntity(0, "添加入库任务失败,网络连接异常,请稍后再试"); 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<Task> 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, "不处理的状态");
}
} }

View File

@ -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;
}

View File

@ -1,6 +1,8 @@
package com.wms.entity.app.wcs; package com.wms.entity.app.wcs;
import com.wms.entity.BaseEntity; import com.wms.entity.BaseEntity;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
/** /**
* WCS向WMS发送任务结果请求实体类 * WCS向WMS发送任务结果请求实体类
@ -10,10 +12,12 @@ public class WmsReceiveTaskResultEntity extends BaseEntity {
/** /**
* WMS任务编号 * WMS任务编号
*/ */
@NotBlank(message = "任务ID不允许为空")
private String taskId; private String taskId;
/** /**
* 任务状态 * 任务状态
*/ */
@NotNull(message = "任务状态不允许为空")
private Integer taskStatus; private Integer taskStatus;
/** /**
* 任务终点 * 任务终点

View File

@ -15,7 +15,7 @@ spring:
active: online active: online
server: server:
# 服务端配置 # 服务端配置
port: 12315 port: 19990
servlet: servlet:
# 接口地址 # 接口地址
context-path: / context-path: /