This commit is contained in:
陆一凡 2025-04-08 18:02:55 +08:00
parent b4cb27e7af
commit 75d7144ce7
4 changed files with 135 additions and 138 deletions

View File

@ -78,7 +78,7 @@ public class JobComponent extends BaseController {
private final VehicleMapper vehicleMapper;
@Scheduled(fixedDelay = 1000)
@Scheduled(fixedDelay = 2000)
public void sendTasksToWcs() {
try {
// 查找待下发的任务
@ -94,14 +94,14 @@ public class JobComponent extends BaseController {
sendTasksInToWcs(task);
return;
}
if(task.getTaskType().equals(TaskType.MOVE.getCode())){
sendTasksMoveToWcs(task);
return;
}
if(task.getTaskType().equals(TaskType.OUT.getCode()) || task.getTaskType().equals(TaskType.INVENTORY.getCode())){
sendTasksOutToWcs(task);
return;
}
if(task.getTaskType().equals(TaskType.MOVE.getCode())){
sendTasksMoveToWcs(task);
// return;
}
}
}catch (Exception exception){
logger.error("定时器下发任务发生异常:{}", exception.toString());

View File

@ -145,7 +145,7 @@ public class TaskOperation {
addStock.setProviderId("");
addStock.setProviderName("");
addStock.setExpirationDate(null);
addStock.setStockStatus(0);
addStock.setStockStatus(StockStatus.OK.getCode());
addStock.setGoodsStatus(null);
addStock.setCreateTime(new Date());
addStock.setLastUpdateTime(null);

View File

@ -31,11 +31,12 @@ public class OrderInImplement implements IOrderInService {
/**
* 查询入库单
*
* @param request 查询参数
* @return 返回结果
*/
public WmsApiResponse<List<AppOrderIn>> queryOrderIn(queryOrderInRequest request) {
if(request.getOrderStatus() == null || request.getOrderStatus().isEmpty()) {
if (request.getOrderStatus() == null || request.getOrderStatus().isEmpty()) {
return new WmsApiResponse<>(0, "查询成功", new ArrayList<>()); // 没有查询参数返回空
}
List<AppOrderIn> appOrderIns = appOrderInMapper.selectWithParams(request.getSearchStr(), request.getOrderStatus());
@ -43,14 +44,14 @@ public class OrderInImplement implements IOrderInService {
}
/**
* 添加入库单
*
* @param request 入库单参数
* @return 返回结果
*/
public WmsApiResponse<Object> addOrderIn(downOrderInRequest request){
if (WmsConstants.EMPTY_STOCK_BATCH_NO.equals(request.getVehicleNo())){
public WmsApiResponse<Object> addOrderIn(downOrderInRequest request) {
if (WmsConstants.EMPTY_STOCK_BATCH_NO.equals(request.getVehicleNo())) {
log.info("托盘{}为空托盘入库", request.vehicleNo);
AppOrderIn appOrderIn = new AppOrderIn();
appOrderIn.setRowId(UUID.randomUUID().toString());
@ -69,49 +70,45 @@ public class OrderInImplement implements IOrderInService {
//appOrderIn.setProductionDate(request.abcSelect);
appOrderInMapper.insert(appOrderIn);
return new WmsApiResponse<>(0, "添加成功", appOrderIn);
}else{
AppOrderIn selectOrderIn = new AppOrderIn();
selectOrderIn.setRemark("带物料托盘入库");
selectOrderIn.setVehicleNo(request.vehicleNo);
List<AppOrderIn> selEmpty = appOrderInMapper.select(selectOrderIn);
if (selEmpty == null || selEmpty.isEmpty()){
if (request.goodsNum <= 0){
return new WmsApiResponse<>(1, "数量必须大于0", null);
}
/* 插入数据,插入记录表 */
//OrderOut orderOutList = new OrderOut();
AppOrderIn appOrderIn = new AppOrderIn();
appOrderIn.setRowId(UUID.randomUUID().toString());
appOrderIn.setGuid(UUID.randomUUID().toString());
appOrderIn.setInType(1);
appOrderIn.setBatchNo(null);
appOrderIn.setVehicleNo(request.vehicleNo);
appOrderIn.setGoodsId(request.goodsId);
appOrderIn.setGoodsNum(BigDecimal.valueOf(request.goodsNum));
appOrderIn.setWareHouse(request.abcSelect);
if (Objects.equals(request.efSelect, "E")){
appOrderIn.setOrderStatus(0);
}else {
appOrderIn.setOrderStatus(2);
}
appOrderIn.setCreateTime(LocalDateTime.now());
appOrderIn.setCreatePerson("WMS");
appOrderIn.setUpdateTime(LocalDateTime.now());
appOrderIn.setRemark("");
appOrderInMapper.insert(appOrderIn);
return new WmsApiResponse<>(0, "添加成功", appOrderIn);
}else {
return new WmsApiResponse<>(1, "必须先删除带物料托盘入库任务!", null);
}
AppOrderIn selectOrderIn = new AppOrderIn();
selectOrderIn.setRemark("带物料托盘入库");
selectOrderIn.setVehicleNo(request.vehicleNo);
List<AppOrderIn> selEmpty = appOrderInMapper.select(selectOrderIn);
if (selEmpty == null || selEmpty.isEmpty()) {
if (request.goodsNum <= 0) {
return new WmsApiResponse<>(1, "数量必须大于0", null);
}
/* 插入数据,插入记录表 */
//OrderOut orderOutList = new OrderOut();
AppOrderIn appOrderIn = new AppOrderIn();
appOrderIn.setRowId(UUID.randomUUID().toString());
appOrderIn.setGuid(UUID.randomUUID().toString());
appOrderIn.setInType(1);
appOrderIn.setBatchNo(null);
appOrderIn.setVehicleNo(request.vehicleNo);
appOrderIn.setGoodsId(request.goodsId);
appOrderIn.setGoodsNum(BigDecimal.valueOf(request.goodsNum));
appOrderIn.setWareHouse(request.abcSelect);
appOrderIn.setOrderStatus(OrderInStatusEnum.CREATE.getCode());
appOrderIn.setCreateTime(LocalDateTime.now());
appOrderIn.setCreatePerson("WMS");
appOrderIn.setUpdateTime(LocalDateTime.now());
appOrderIn.setRemark("");
appOrderInMapper.insert(appOrderIn);
return new WmsApiResponse<>(0, "添加成功", appOrderIn);
} else {
return new WmsApiResponse<>(1, "当前托盘已有任务!", null);
}
}
/**
* 修改数量
*
* @param request 修改数量参数
* @return 返回结果
*/
public WmsApiResponse<Object> updateForNum(updateNumRequest request){
public WmsApiResponse<Object> updateForNum(updateNumRequest request) {
// if (request.get){
//
// }
@ -119,32 +116,33 @@ public class OrderInImplement implements IOrderInService {
AppOrderIn appOrderIn = new AppOrderIn();
appOrderIn.setRowId(request.getRowId());
List<AppOrderIn> appOrderIns = appOrderInMapper.select(appOrderIn);
if (appOrderIns.get(0).getGoodsId() == null || appOrderIns.get(0).getGoodsId().isEmpty()){
if (appOrderIns.get(0).getGoodsId() == null || appOrderIns.get(0).getGoodsId().isEmpty()) {
return new WmsApiResponse<>(999, "空托盘不允许修改物料数量,修改失败", null);
}
appOrderIn.setGoodsNum(request.getRealNum());
int i = appOrderInMapper.update(appOrderIn);
if(i > 0) {
if (i > 0) {
return new WmsApiResponse<>(0, "修改成功", null);
}else {
} else {
return new WmsApiResponse<>(999, "修改失败", null);
}
}
/**
* 绑定载具
*
* @param request 绑定参数
* @return 返回结果
*/
public WmsApiResponse<Object> bindingVehicle(bindingVehicleRequest request) {
String vehicleNo = request.getVehicleNo();
String code = request.getCode();
if(StringUtils.isEmpty(vehicleNo) || StringUtils.isEmpty(code)) {
if (StringUtils.isEmpty(vehicleNo) || StringUtils.isEmpty(code)) {
return new WmsApiResponse<>(999, "载具号或者条码为空", null);
}
// 拆分条码
// 前八位是零件号后面六位是批次后面一位是班次最后五位是数量
if(code.length() == 22) {
if (code.length() == 22) {
//return new WmsApiResponse<>(999, "条码长度错误", null);
String goodsId = code.substring(0, 10); // 物料编码
String productionDate = code.substring(10, 16); //生产日期
@ -159,12 +157,12 @@ public class OrderInImplement implements IOrderInService {
String batchNo = code.substring(0, 16); // 批次 ---- 这个批次应该是料号加中间六位
String shift = code.substring(17, 18); // 班次
String goodsNumStr = code.substring(18, 22); // 数量字符串
if(!goodsNumStr.matches("[0-9]+")) {
if (!goodsNumStr.matches("[0-9]+")) {
return new WmsApiResponse<>(999, "数量错误", null);
}
BigDecimal goodsNum = new BigDecimal(goodsNumStr); // 数量
List<AppOrderIn> selectRows = appOrderInMapper.select(new AppOrderIn(batchNo, goodsNum, OrderInStatusEnum.CREATE.getCode()));
if(selectRows == null || selectRows.isEmpty()) {
if (selectRows == null || selectRows.isEmpty()) {
return new WmsApiResponse<>(999, String.format("条码找不到入库单,无法绑定,条码:%s, 批次: %s, 数量: %s", code, batchNo, goodsNum), null);
}
AppOrderIn orderIn = selectRows.get(0); // 这条数据
@ -176,7 +174,7 @@ public class OrderInImplement implements IOrderInService {
bindingOrderIn.setUpdateTime(java.time.LocalDateTime.now());
//bindingOrderIn.setProductionDate(date);
//bindingOrderIn.setUpdateTime(date);
if(appOrderInMapper.update(bindingOrderIn) > 0) {
if (appOrderInMapper.update(bindingOrderIn) > 0) {
return new WmsApiResponse<>(0, "绑定成功", null);
}
return new WmsApiResponse<>(999, "绑定失败,未知异常,请重试", null);
@ -194,12 +192,12 @@ public class OrderInImplement implements IOrderInService {
String batchNo = code.substring(0, 14); // 批次 ---- 这个批次应该是料号加中间六位
//String shift = code.substring(17, 18); // 班次
String goodsNumStr = code.substring(16, 20); // 数量字符串
if(!goodsNumStr.matches("[0-9]+")) {
if (!goodsNumStr.matches("[0-9]+")) {
return new WmsApiResponse<>(999, "数量错误", null);
}
BigDecimal goodsNum = new BigDecimal(goodsNumStr); // 数量
List<AppOrderIn> selectRows = appOrderInMapper.select(new AppOrderIn(batchNo, goodsNum, OrderInStatusEnum.CREATE.getCode()));
if(selectRows == null || selectRows.isEmpty()) {
if (selectRows == null || selectRows.isEmpty()) {
return new WmsApiResponse<>(999, String.format("条码找不到入库单,无法绑定,条码:%s, 批次: %s, 数量: %s", code, batchNo, goodsNum), null);
}
AppOrderIn orderIn = selectRows.get(0); // 这条数据
@ -211,7 +209,7 @@ public class OrderInImplement implements IOrderInService {
bindingOrderIn.setUpdateTime(java.time.LocalDateTime.now());
//bindingOrderIn.setProductionDate(date);
//bindingOrderIn.setUpdateTime(date);
if(appOrderInMapper.update(bindingOrderIn) > 0) {
if (appOrderInMapper.update(bindingOrderIn) > 0) {
return new WmsApiResponse<>(0, "绑定成功", null);
}
return new WmsApiResponse<>(999, "绑定失败,未知异常,请重试", null);
@ -221,22 +219,21 @@ public class OrderInImplement implements IOrderInService {
}
/**
* 根据载具号查询入库单
*
* @param vehicleNo 载具号
* @return 返回结果
*/
public WmsApiResponse<List<AppOrderIn>> getOrderInWithVehicleNo(String vehicleNo) {
if(vehicleNo == null || vehicleNo.isEmpty()) {
if (vehicleNo == null || vehicleNo.isEmpty()) {
return new WmsApiResponse<>(999, "载具号不能为空", null);
}
AppOrderIn appOrderInQuery = new AppOrderIn();
appOrderInQuery.setVehicleNo(vehicleNo);
appOrderInQuery.setOrderStatus(OrderInStatusEnum.BINDING.getCode());
List<AppOrderIn> appOrderIns = appOrderInMapper.select(appOrderInQuery);
if(appOrderIns == null) {
if (appOrderIns == null) {
return new WmsApiResponse<>(999, "查询失败,请重试", new ArrayList<>());
}
return new WmsApiResponse<>(0, "查询成功", appOrderIns);
@ -244,11 +241,12 @@ public class OrderInImplement implements IOrderInService {
/**
* 解绑载具
*
* @param rowId 入库单行号
* @return 返回结果
*/
public WmsApiResponse<Object> unBindingVehicle(String rowId) {
if(rowId == null || rowId.isEmpty()) {
if (rowId == null || rowId.isEmpty()) {
return new WmsApiResponse<>(999, "入库单行号不能为空", null);
}
AppOrderIn unBindingVehicle = new AppOrderIn();
@ -257,7 +255,7 @@ public class OrderInImplement implements IOrderInService {
unBindingVehicle.setVehicleNo("");
unBindingVehicle.setUpdateTime(java.time.LocalDateTime.now());
int updateResult = appOrderInMapper.update(unBindingVehicle);
if(updateResult > 0) {
if (updateResult > 0) {
return new WmsApiResponse<>(0, "解绑成功", null);
}
return new WmsApiResponse<>(999, "解绑失败,请重试", null);
@ -276,7 +274,8 @@ public class OrderInImplement implements IOrderInService {
return new WmsApiResponse<>(0, "删除成功", true);
} else {
return new WmsApiResponse<>(1, "订单不存在", false);
} } catch (Exception e) {
}
} catch (Exception e) {
// 记录异常
return new WmsApiResponse<>(1, "删除失败", false);
}

View File

@ -84,7 +84,6 @@ public class ContainerImplement implements ContainerService {
* @param request 请求信息
* @return 响应信息
*/
@Override
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
public CreateInstoreTaskResponse createInstoreTask(CreateInstoreTaskRequest request) {
@ -156,82 +155,81 @@ public class ContainerImplement implements ContainerService {
success.setPalletNo(virtualPalletId);
success.setFromCellNo(request.getFromCellNo());
success.setToCellNo(useLocation.getLocationId());
}else {
// 查询待入库的批次号
AppOrderIn waitInStockQuery = new AppOrderIn();
waitInStockQuery.setVehicleNo(request.getPalletNo());
List<AppOrderIn> waitInStockList = appOrderInMapper.select(waitInStockQuery); // 查找待入库的批次号
if(waitInStockList.isEmpty()) {
log.error("条码:{} 不存在待入库的任务", request.getPalletNo());
return new CreateInstoreTaskResponse("400", String.format("条码:%s 不存在待入库的任务", request.getPalletNo()));
}
AppOrderIn appOrderIn = waitInStockList.get(0);
/* 查找可用库位 */
List<Location> canUseLocations = locationUtils.getNewLocation(2,appOrderIn);
if(canUseLocations.isEmpty()){
return new CreateInstoreTaskResponse("400", "没有可用库位");
}
// 判断高度来决定物料去低层还是高层
if (WmsConstants.LOW_FLOOR.equals(request.getHeight())) {
canUseLocations = canUseLocations.stream().filter(l -> l.getLayer() == 1).toList();
}
if (WmsConstants.HIGH_FLOOR.equals(request.getHeight())) {
canUseLocations = canUseLocations.stream().filter(l -> l.getLayer() != 1).toList();
}
Location useLocation = locationUtils.checkCanUseAndChange(canUseLocations);
if(useLocation == null) {
return new CreateInstoreTaskResponse("400", "暂没有可以直接使用的库位,因为存在互锁的库位,请等待当前任务都执行完成后再试");
}
/* 找到可用的库位 */ /* 生成任务(生成的任务直接运行中,因为此处会把任务直接回回去),更新库存表内状态为入库中 */
// 新建任务 插入任务表
Task newInTask = new Task();
newInTask.setTaskId(String.valueOf(Calendar.getInstance().getTimeInMillis()));
newInTask.setTaskGroup(UUID.randomUUID().toString());
newInTask.setTaskType(TaskType.IN.getCode());
newInTask.setTaskStatus(WmsTaskStatus.WAIT.getCode()); // 因为任务是直接返回去的所以直接是已下发状态
newInTask.setOrigin(request.getFromCellNo());
newInTask.setDestination(useLocation.getLocationId());
if (!waitInStockList.isEmpty() && waitInStockList.get(0) != null) {
newInTask.setGoodsId(waitInStockList.get(0).getGoodsId());
} else {
newInTask.setGoodsId(null); // 或者你可以选择不设置
}
newInTask.setWeight(Double.valueOf(request.getWeight()));
newInTask.setCreateTime(new java.util.Date());
newInTask.setUserName("四向车API");
newInTask.setVehicleSize(Integer.valueOf(request.getHeight()));
newInTask.setVehicleNo(request.getPalletNo());
newInTask.setTaskPriority(1);
newInTask.setProductionDate(null);
int insertTaskResult = taskMapper.addTask(newInTask); // 添加入库任务
if(insertTaskResult < 1) {
log.error("生成任务失败,无法插入新的入库任务");
return new CreateInstoreTaskResponse("400", "生成任务失败,无法插入新的入库任务");
}
// 更新库存中的待入库记录为入库中并将库位更新进去
for(AppOrderIn waitInStock : waitInStockList) {
AppOrderIn updateAppOrderIn = new AppOrderIn();
updateAppOrderIn.setRowId(waitInStock.getRowId());
updateAppOrderIn.setOrderStatus(OrderInStatusEnum.IN.getCode());
updateAppOrderIn.setUpdateTime(LocalDateTime.now());
appOrderInMapper.update(updateAppOrderIn);
}
// 占用库位
Location location = new Location();
location.setLocationId(useLocation.getLocationId());
location.setLocationStatus(LocationStatus.OCCUPY.getCode());
location.setVehicleId(request.getPalletNo());
locationMapper.modifyLocation(location);
success.setCode("200");
success.setMessage("生成入库任务成功");
success.setWmsTaskId(newInTask.getTaskId());
success.setPalletNo(request.getPalletNo());
success.setFromCellNo(request.getFromCellNo());
success.setToCellNo(useLocation.getLocationId());
return success;
}
// 查询待入库的批次号
AppOrderIn waitInStockQuery = new AppOrderIn();
waitInStockQuery.setVehicleNo(request.getPalletNo());
List<AppOrderIn> waitInStockList = appOrderInMapper.select(waitInStockQuery); // 查找待入库的批次号
if(waitInStockList.isEmpty()) {
log.error("托盘:{} 不存在待入库的任务", request.getPalletNo());
return new CreateInstoreTaskResponse("400", String.format("条码:%s 不存在待入库的任务", request.getPalletNo()));
}
AppOrderIn appOrderIn = waitInStockList.get(0);
/* 查找可用库位 */
List<Location> canUseLocations = locationUtils.getNewLocation(2,appOrderIn);
if(canUseLocations.isEmpty()){
return new CreateInstoreTaskResponse("400", "没有可用库位");
}
// 判断高度来决定物料去低层还是高层
if (WmsConstants.LOW_FLOOR.equals(request.getHeight())) {
canUseLocations = canUseLocations.stream().filter(l -> l.getLayer() == 1).toList();
}
if (WmsConstants.HIGH_FLOOR.equals(request.getHeight())) {
canUseLocations = canUseLocations.stream().filter(l -> l.getLayer() != 1).toList();
}
Location useLocation = locationUtils.checkCanUseAndChange(canUseLocations);
if(useLocation == null) {
return new CreateInstoreTaskResponse("400", "暂没有可以直接使用的库位,因为存在互锁的库位,请等待当前任务都执行完成后再试");
}
/* 找到可用的库位 */ /* 生成任务(生成的任务直接运行中,因为此处会把任务直接回回去),更新库存表内状态为入库中 */
// 新建任务 插入任务表
Task newInTask = new Task();
newInTask.setTaskId(String.valueOf(Calendar.getInstance().getTimeInMillis()));
newInTask.setTaskGroup(UUID.randomUUID().toString());
newInTask.setTaskType(TaskType.IN.getCode());
newInTask.setTaskStatus(WmsTaskStatus.WAIT.getCode()); // 因为任务是直接返回去的所以直接是已下发状态
newInTask.setOrigin(request.getFromCellNo());
newInTask.setDestination(useLocation.getLocationId());
if (!waitInStockList.isEmpty() && waitInStockList.get(0) != null) {
newInTask.setGoodsId(waitInStockList.get(0).getGoodsId());
} else {
newInTask.setGoodsId(null); // 或者你可以选择不设置
}
newInTask.setWeight(Double.valueOf(request.getWeight()));
newInTask.setCreateTime(new java.util.Date());
newInTask.setUserName("四向车请求");
newInTask.setVehicleSize(Integer.valueOf(request.getHeight()));
newInTask.setVehicleNo(request.getPalletNo());
newInTask.setTaskPriority(1);
newInTask.setProductionDate(null);
int insertTaskResult = taskMapper.addTask(newInTask); // 添加入库任务
if(insertTaskResult < 1) {
log.error("生成任务失败,无法插入新的入库任务");
return new CreateInstoreTaskResponse("400", "生成任务失败,无法插入新的入库任务");
}
// 更新库存中的待入库记录为入库中并将库位更新进去
for(AppOrderIn waitInStock : waitInStockList) {
AppOrderIn updateAppOrderIn = new AppOrderIn();
updateAppOrderIn.setRowId(waitInStock.getRowId());
updateAppOrderIn.setOrderStatus(OrderInStatusEnum.IN.getCode());
updateAppOrderIn.setUpdateTime(LocalDateTime.now());
appOrderInMapper.update(updateAppOrderIn);
}
// 占用库位
Location location = new Location();
location.setLocationId(useLocation.getLocationId());
location.setLocationStatus(LocationStatus.OCCUPY.getCode());
location.setVehicleId(request.getPalletNo());
locationMapper.modifyLocation(location);
success.setCode("200");
success.setMessage("生成入库任务成功");
success.setWmsTaskId(newInTask.getTaskId());
success.setPalletNo(request.getPalletNo());
success.setFromCellNo(request.getFromCellNo());
success.setToCellNo(useLocation.getLocationId());
return success;
}