修复bug,回退测试方法

This commit is contained in:
梁州 2025-11-13 10:48:09 +08:00
parent 504b7cb96b
commit dc62dd9cfa
4 changed files with 120 additions and 571 deletions

View File

@ -490,8 +490,6 @@ public class TaskController {
taskService.remove(new LambdaQueryWrapper<Task>().eq(Task::getTaskId, inTask.getTaskId()));
// 移除当前料箱所有的拣选任务
pickTaskService.remove(new LambdaQueryWrapper<PickTask>().eq(PickTask::getVehicleId, inTask.getVehicleId()));
// 移除当前料箱所有的outsideVehicles---todo 这张表已经废弃不用
// outsideVehiclesService.remove(new LambdaQueryWrapper<OutsideVehicles>().eq(OutsideVehicles::getVehicleId, inTask.getVehicleId()));
// 清除当前料箱的所有盘点任务
inventoryService.remove(new LambdaQueryWrapper<InventoryList>().eq(InventoryList::getVehicleId, inTask.getVehicleId()));
}
@ -512,22 +510,16 @@ public class TaskController {
.set(Vehicle::getVehicleStatus, VehicleStatus.OUT.getCode())
.eq(Vehicle::getVehicleId, outTask.getVehicleId())
.ne(Vehicle::getVehicleStatus, VehicleStatus.OUT.getCode()));
// 当前载具上所有库存状态设置为拣选---todo 是否要更改为outed状态
// 当前载具上所有库存状态设置为拣选
stockService.update(new LambdaUpdateWrapper<Stock>()
.set(Stock::getStockStatus, StockStatus.PICKING.getCode())
.set(Stock::getStockStatus, StockStatus.OUTED.getCode())
.eq(Stock::getVehicleId, outTask.getVehicleId())
.ne(Stock::getStockStatus, StockStatus.PICKING.getCode()));
.ne(Stock::getStockStatus, StockStatus.OUTED.getCode()));
// 将该载具对应的拣选任务设置为可发送状态
pickTaskService.update(new LambdaUpdateWrapper<PickTask>()
.set(PickTask::getPickStatus, PickTaskStatusEnum.NEW.getCode())
.eq(PickTask::getVehicleId, outTask.getVehicleId())
.eq(PickTask::getPickStatus, PickTaskStatusEnum.TEMP.getCode()));
// 设置特殊---todo 此表废弃
// standStackerTaskService.update(new LambdaUpdateWrapper<StandStackerTask>()
// .set(StandStackerTask::getTaskStatus, 1)
// .set(StandStackerTask::getFinishTime, LocalDateTime.now())
// .eq(StandStackerTask::getVehicleId, outTask.getVehicleId())
// .ne(StandStackerTask::getTaskStatus, 1));
} else {// 代表整出
// 删除当前载具上所有库存
List<Stock> removeStocks = stockService.list(new LambdaQueryWrapper<Stock>().eq(Stock::getVehicleId, outTask.getVehicleId()));
@ -912,7 +904,7 @@ public class TaskController {
.set(PickTask::getLastUpdateTime, LocalDateTime.now())
.eq(PickTask::getVehicleId, boxArriveRequest.getVehicleNo())
.eq(PickTask::getPickStatus, PickTaskStatusEnum.TEMP.getCode()));
// 重置当前站台非当前箱子的已完成拣选任务 todo
// 重置当前站台非当前箱子的已完成拣选任务
pickTaskService.update(new LambdaUpdateWrapper<PickTask>()
.set(PickTask::getPickStatus, PickTaskStatusEnum.NEW.getCode())
.set(PickTask::getLastUpdateTime, LocalDateTime.now())
@ -923,6 +915,11 @@ public class TaskController {
standService.update(new LambdaUpdateWrapper<Stand>()
.set(Stand::getPickVehicle, boxArriveRequest.getVehicleNo())
.eq(Stand::getStandId, pickTask.getStandId()));
// 更新库存为拣选中
stockService.update(new LambdaUpdateWrapper<Stock>()
.set(Stock::getStockStatus, StockStatus.PICKING.getCode())
.eq(Stock::getVehicleId, boxArriveRequest.getVehicleNo())
.ne(Stock::getStockStatus, StockStatus.PICKING.getCode()));
response.setCode(ResponseCode.OK.getCode());
response.setMessage("上报成功");
@ -1084,8 +1081,23 @@ public class TaskController {
wcsETaskRequest.setOrderId(generateId(workQuery.getGoodsId() + "_"));
wcsETaskRequest.setVehicleNo(vehicleId);
String sendToWcsETaskUrl = configMap.get(ConfigMapKeyEnum.URL_WCS_E_TASK.getConfigKey());
// TODO 这里是模拟的
if (StringUtils.isEmpty(sendToWcsETaskUrl)) {
// url地址为空
logger.error("向Wcs发送电子标签亮灯任务的地址为空");
throw new Exception("向Wcs发送电子标签亮灯任务的地址为空");
} else {
// 发送信息
logger.info("发送电子标签亮灯请求:{}", convertJsonString(wcsETaskRequest));
ResponseEntity result = JSON.parseObject(HttpUtils.sendHttpPostWithoutToken(sendToWcsETaskUrl, convertJsonString(wcsETaskRequest)), ResponseEntity.class);
try {
logService.save(new WmsLog(WmsUtils.generateId("LOG_"), "发送电子标签任务", "eTagTask", convertJsonString(wcsETaskRequest), convertJsonString(result), sendToWcsETaskUrl, LocalDateTime.now(), "WMS"));
} catch (Exception e) {
logger.error("插入日志错误");
}
if (result == null || !Objects.equals(result.getCode(), ResponseCode.OK.getCode())) {
logger.error("发送电子标签亮灯任务失败:{}", convertJsonString(result));
throw new Exception("发送电子标签亮灯任务失败");
} else {
// 更新workFlow数据
workFlowService.updateBatchById(workFlows);
// 更新亮灯数据
@ -1094,36 +1106,8 @@ public class TaskController {
.set(ETagLocation::getTaskType, wcsETaskRequest.getTaskType())
.set(ETagLocation::getVehicleNo, wcsETaskRequest.getVehicleNo())
.in(ETagLocation::getELocationId, eTaskDataList.stream().map(ETaskData::getLocation).collect(Collectors.toList())));
// TODO 模拟结束要去掉注释
// if (StringUtils.isEmpty(sendToWcsETaskUrl)) {
// // url地址为空
// logger.error("向Wcs发送电子标签亮灯任务的地址为空");
// throw new Exception("向Wcs发送电子标签亮灯任务的地址为空");
// } else {
// // 发送信息
// logger.info("发送电子标签亮灯请求:{}", convertJsonString(wcsETaskRequest));
// ResponseEntity result = JSON.parseObject(HttpUtils.sendHttpPostWithoutToken(sendToWcsETaskUrl, convertJsonString(wcsETaskRequest)), ResponseEntity.class);
// try {
// logService.save(new WmsLog(WmsUtils.generateId("LOG_"), "发送电子标签任务", "eTagTask", convertJsonString(wcsETaskRequest), convertJsonString(result), sendToWcsETaskUrl, LocalDateTime.now(), "WMS"));
// } catch (Exception e) {
// logger.error("插入日志错误");
// }
// if (result == null || !Objects.equals(result.getCode(), ResponseCode.OK.getCode())) {
// logger.error("发送电子标签亮灯任务失败:{}", convertJsonString(result));
// throw new Exception("发送电子标签亮灯任务失败");
// } else {
// // 更新workFlow数据
// workFlowService.updateBatchById(workFlows);
// // 更新亮灯数据
// etagLocationService.update(new LambdaUpdateWrapper<ETagLocation>()
// .set(ETagLocation::getPickStatus, 1)
// .set(ETagLocation::getTaskType, wcsETaskRequest.getTaskType())
// .set(ETagLocation::getVehicleNo, wcsETaskRequest.getVehicleNo())
// .in(ETagLocation::getELocationId, eTaskDataList.stream().map(ETaskData::getLocation).collect(Collectors.toList())));
// }
// }
}
}
}
// 更新站台数据
standService.update(new LambdaUpdateWrapper<Stand>()
@ -1412,49 +1396,6 @@ public class TaskController {
}
// 更新实际拣选数量
workFlow.setPickedNum(workFlow.getPickedNum().add(BigDecimal.valueOf(eTaskFeedbackRequest.getConfirmNum())));
// todo---下面两张表废弃使用
// if (eTaskFeedbackRequest.getConfirmNum().compareTo(eTaskFeedbackRequest.getNeedNum()) < 0) {
// int diffNum = eTaskFeedbackRequest.getNeedNum() - eTaskFeedbackRequest.getConfirmNum();
// // 查站台要料表---未分配以及分配但未完全分配
// GoodsToStation goodsToStation = goodsToStationService.getOne(new LambdaQueryWrapper<GoodsToStation>()
// .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<PickTask>()
// .eq(PickTask::getStandId, workFlow.getWorkStation())
// .eq(PickTask::getPickStatus, PickTaskStatusEnum.FINISH.getCode())
// .last("limit 1"));
// if (pickTask != null) {
// // 更新当前的outsideVehicles状态为一个新状态拉取任务时不拉取它
// List<OutsideVehicles> outsideVehiclesList = outsideVehiclesService.list(new LambdaQueryWrapper<OutsideVehicles>()
// .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 {
// if (workFlow.getPickedNum().compareTo(workFlow.getNeedNum()) < 0) {
// // 缺料未完成
// workFlow.setLightStatus(0);// 未亮灯
// workFlow.setWorkStatus(1);// 正在做
// } else {
// workFlow.setLightStatus(2);// 已拍灯
// workFlow.setWorkStatus(2);// 已完成
// }
// }
if (workFlow.getPickedNum().compareTo(workFlow.getNeedNum()) < 0) {
// 缺料未完成
workFlow.setLightStatus(0);// 未亮灯
@ -1582,8 +1523,8 @@ public class TaskController {
.last("limit 1"));
if (pickTask == null) {
// 没有拣货任务直接放行
// 调用Wcs的放行接口 TODO 测试时注释
// wcsService.sendWcsDisposeVehicle(new WcsDisposeVehicleRequest(standId, null));
// 调用Wcs的放行接口
wcsService.sendWcsDisposeVehicle(new WcsDisposeVehicleRequest(standId, null));
// 更新站台信息
standService.update(new LambdaUpdateWrapper<Stand>()
.set(Stand::getLastUseTime, LocalDateTime.now())
@ -1609,25 +1550,6 @@ public class TaskController {
stockService.updateById(existStock);
stockUpdateRecordService.addStockUpdateRecord(originStock, existStock, StockUpdateReasonEnum.CONFIRM_UPDATE.getReason(), workConfirmRequest.getUserName(), quantityBefore);
}
// todo---此表废弃使用
// OutsideVehicles currentGoodsVehicle = outsideVehiclesService.getOne(new LambdaQueryWrapper<OutsideVehicles>()
// .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) {
@ -1638,14 +1560,6 @@ public class TaskController {
existStock.setGoodsRelated(goodsDetail);
stockService.updateById(existStock);
stockUpdateRecordService.addStockUpdateRecord(originStock, existStock, StockUpdateReasonEnum.CONFIRM_UPDATE.getReason(), workConfirmRequest.getUserName(), quantityBefore);
// todo---此表废弃使用
// OutsideVehicles currentGoodsVehicle = outsideVehiclesService.getOne(new LambdaQueryWrapper<OutsideVehicles>()
// .eq(OutsideVehicles::getVehicleId, pickTask.getVehicleId())
// .eq(OutsideVehicles::getGoodsId, workConfirmRequest.getGoodsId())
// .last("limit 1"));
// currentGoodsVehicle.setRemainNum(BigDecimal.ZERO);
// currentGoodsVehicle.setOutStatus(2);
// outsideVehiclesService.updateById(currentGoodsVehicle);
}
}
}
@ -1689,8 +1603,8 @@ public class TaskController {
pickTaskRecordService.save(pickTaskRecord);
// 删除当前拣选任务
pickTaskService.removeById(pickTask);
// 不需要放行 TODO 测试时注释
// wcsService.sendWcsDisposeVehicle(new WcsDisposeVehicleRequest(standId, pickTask.getVehicleId()));
// 不需要放行
wcsService.sendWcsDisposeVehicle(new WcsDisposeVehicleRequest(standId, pickTask.getVehicleId()));
// 判断是不是已经完成工作
if (workFlowService.exists(new LambdaQueryWrapper<WorkFlow>()
.eq(WorkFlow::getWorkStation, standId)
@ -1728,8 +1642,8 @@ public class TaskController {
pickTaskRecordService.save(pickTaskRecord);
// 删除当前拣选任务
pickTaskService.removeById(pickTask);
// 放行 TODO 测试时注释
// wcsService.sendWcsDisposeVehicle(new WcsDisposeVehicleRequest(standId, pickTask.getVehicleId()));
// 放行
wcsService.sendWcsDisposeVehicle(new WcsDisposeVehicleRequest(standId, pickTask.getVehicleId()));
// 判断是不是已经完成工作
if (workFlowService.exists(new LambdaQueryWrapper<WorkFlow>()
.eq(WorkFlow::getWorkStation, standId)
@ -2855,7 +2769,7 @@ public class TaskController {
return convertJsonString(response);
}
// TODO 以下是非计划领料变动
// 以下是非计划领料变动
// 1. 判断当前站台是否允许非计划
if (targetStand.getAllowNoPlan() != 1) {
logger.error("当前站台不允许非计划领料:{}。", targetStand.getStandId());
@ -2889,11 +2803,10 @@ public class TaskController {
// 出库任务列表
List<Task> outTasks = new ArrayList<>();
// TODO 非计划变动
// 非计划变动
// 拣选任务列表
List<PickTask> pickTasks = new ArrayList<>();
// 尝试生成出库任务
List<String> pickStandIds = new ArrayList<>();
for (Stock tempStock : stockList) {
@ -2931,7 +2844,7 @@ public class TaskController {
tempOutTask.setIsPicking(1);
outTasks.add(tempOutTask);
// TODO 非计划变动
// 非计划变动
// 只有备料站台才下发拣选任务
if (targetStand.getStandType() == 2) {
// 创建拣选任务
@ -2973,7 +2886,7 @@ public class TaskController {
.eq(Task::getVehicleId, tempStock.getVehicleId())
.eq(Task::getTaskStatus, WmsTaskStatus.NEW.getCode()));
// TODO 非计划变动
// 非计划变动
if (targetStand.getStandType() == 1) {
// 入库站台
thisVehiclePickTasks.forEach(pickTask -> {
@ -3004,7 +2917,7 @@ public class TaskController {
// 保存出库任务
taskService.saveBatch(outTasks);
// TODO 非计划变动
// 非计划变动
// 保存拣选任务
if (!pickTasks.isEmpty()) {
pickTaskService.saveBatch(pickTasks);
@ -3284,9 +3197,6 @@ public class TaskController {
}
}
// TODO 以下是盘点待做
/**
* 盘点请求
*

View File

@ -39,10 +39,10 @@ public class KateWorkExecutor implements Job {
public void execute(JobExecutionContext jobExecutionContext) {
// 创建工作
createWork();
// 执行工作
doWork();
// 修复工作
repairWork();
// 执行工作
doWork();
}
/**

View File

@ -105,12 +105,6 @@ public class WmsJobServiceImplements implements IWmsJobService {
continue;
}
}
// if (task.getTaskPriority() == 1) {
// if (Objects.equals(task.getTaskType(), TaskType.OUT.getCode())
// && task.getIsPicking() == 1 && StringUtils.isNotEmpty(task.getPickStand())) {
// continue;
// }
// }
// 创建发送的任务
WcsTaskRequest tempTask = new WcsTaskRequest();
tempTask.setTaskId(task.getTaskGroup());
@ -134,45 +128,45 @@ public class WmsJobServiceImplements implements IWmsJobService {
return;
}
// 下面这行代码模拟wcs下发成功
simulateSendPickOutTasks(taskGroupIds, Collections.emptyList(), Collections.emptyList(), Collections.emptyList());
// // 发送任务
// String url = configMap.get(ConfigMapKeyEnum.URL_WCS_TASK.getConfigKey());
// if (url != null) {
// logger.info("向WCS发送任务地址{},请求详情:{}", url, convertJsonString(request));
// ResponseEntity result = JSON.parseObject(HttpUtils.sendHttpPostWithoutToken(url, convertJsonString(request)), ResponseEntity.class);
// try {
// logService.save(new WmsLog(WmsUtils.generateId("LOG_"), "向WCS发送任务", "SetStackerTask", JSON.toJSONString(request), JSON.toJSONString(result), url, LocalDateTime.now(), "WMS"));
// } catch (Exception e) {
// logger.error("保存发送任务的日志错误。");
// }
// if (result == null) {
// logger.error("发送任务异常。");
// } else {
// if (Objects.equals(ResponseCode.OK.getCode(), result.getCode())) {
// logger.info("发送WCS任务成功。");
// taskService.update(new LambdaUpdateWrapper<Task>()
// .set(Task::getTaskStatus, WmsTaskStatus.WAIT.getCode())
// .in(Task::getTaskGroup, taskGroupIds)
// .eq(Task::getTaskStatus, WmsTaskStatus.NEW.getCode()));
// } else {
// // 判断returnData的数据
// if (result.getReturnData() != null) {
// List<WcsTaskRequest> errorTasks = JSON.parseArray(result.getReturnData().toString(), WcsTaskRequest.class);
// if (!errorTasks.isEmpty()) {
// List<String> failedTaskIds = errorTasks.stream().map(WcsTaskRequest::getTaskId).distinct().toList();
// // 更新任务状态为异常
// taskService.update(new LambdaUpdateWrapper<Task>()
// .set(Task::getTaskStatus, WmsTaskStatus.EXCEPTION.getCode())
// .in(Task::getTaskGroup, failedTaskIds)
// .eq(Task::getTaskStatus, WmsTaskStatus.NEW.getCode()));
// }
// }
// logger.error("发送任务错误:{}", convertJsonString(result));
// }
// }
// } else {
// logger.error("WCS发送任务地址为空。");
// }
// simulateSendPickOutTasks(taskGroupIds, Collections.emptyList(), Collections.emptyList(), Collections.emptyList());
// 发送任务
String url = configMap.get(ConfigMapKeyEnum.URL_WCS_TASK.getConfigKey());
if (url != null) {
logger.info("向WCS发送任务地址{},请求详情:{}", url, convertJsonString(request));
ResponseEntity result = JSON.parseObject(HttpUtils.sendHttpPostWithoutToken(url, convertJsonString(request)), ResponseEntity.class);
try {
logService.save(new WmsLog(WmsUtils.generateId("LOG_"), "向WCS发送任务", "SetStackerTask", JSON.toJSONString(request), JSON.toJSONString(result), url, LocalDateTime.now(), "WMS"));
} catch (Exception e) {
logger.error("保存发送任务的日志错误。");
}
if (result == null) {
logger.error("发送任务异常。");
} else {
if (Objects.equals(ResponseCode.OK.getCode(), result.getCode())) {
logger.info("发送WCS任务成功。");
taskService.update(new LambdaUpdateWrapper<Task>()
.set(Task::getTaskStatus, WmsTaskStatus.WAIT.getCode())
.in(Task::getTaskGroup, taskGroupIds)
.eq(Task::getTaskStatus, WmsTaskStatus.NEW.getCode()));
} else {
// 判断returnData的数据
if (result.getReturnData() != null) {
List<WcsTaskRequest> errorTasks = JSON.parseArray(result.getReturnData().toString(), WcsTaskRequest.class);
if (!errorTasks.isEmpty()) {
List<String> failedTaskIds = errorTasks.stream().map(WcsTaskRequest::getTaskId).distinct().toList();
// 更新任务状态为异常
taskService.update(new LambdaUpdateWrapper<Task>()
.set(Task::getTaskStatus, WmsTaskStatus.EXCEPTION.getCode())
.in(Task::getTaskGroup, failedTaskIds)
.eq(Task::getTaskStatus, WmsTaskStatus.NEW.getCode()));
}
}
logger.error("发送任务错误:{}", convertJsonString(result));
}
}
} else {
logger.error("WCS发送任务地址为空。");
}
}
} catch (Exception exception) {
logger.error("向WCS发送任务时发生异常{}", convertJsonString(exception));
@ -180,362 +174,6 @@ public class WmsJobServiceImplements implements IWmsJobService {
}
}
/**
* 发送PickOut任务
* @throws Exception 异常
*/
// @Override
// public void sendPickOutTasks() throws Exception {
// try {
// // 检索任务表---新建未下发的任务
// LambdaQueryWrapper<Task> waitForDistributeTaskQuery = new LambdaQueryWrapper<Task>()
// .eq(Task::getTaskStatus, WmsTaskStatus.NEW.getCode())
// .eq(Task::getTaskType, TaskType.OUT.getCode())
// .eq(Task::getTaskPriority, 1);
// List<Task> allTasks = taskService.list(waitForDistributeTaskQuery);
// if (!allTasks.isEmpty()) {
// String max_vehicle_nums = configMap.get(ConfigMapKeyEnum.MAX_VEHICLE_NUMS.getConfigKey());
// String max_wcs_accept_nums = configMap.get(ConfigMapKeyEnum.MAX_WCS_ACCEPT_NUMS.getConfigKey());
// String max_stand_vehicle_nums = configMap.get(ConfigMapKeyEnum.MAX_STAND_VEHICLE_NUMS.getConfigKey());
// if (StringUtils.isEmpty(max_vehicle_nums) || StringUtils.isEmpty(max_wcs_accept_nums) || StringUtils.isEmpty(max_stand_vehicle_nums)) {
// logger.error("配置未生成");
// return;
// }
// int maxVehicleNums = Integer.parseInt(max_vehicle_nums);// 线体最大箱子数量
// int maxWcsAcceptNums = Integer.parseInt(max_wcs_accept_nums);// wcs最大一次性可接受任务数量
// int maxStandVehicleNums = Integer.parseInt(max_stand_vehicle_nums);// 每个站台最大箱子数量
// List<String> outsideVehicles = outsideVehiclesService.selectDistinctVehicles();
// if (outsideVehicles == null || outsideVehicles.isEmpty()) {
// outsideVehicles = Collections.emptyList();
// }
// int remainVehicleNums = maxVehicleNums - outsideVehicles.size();// 线体剩余箱子数量
// if (remainVehicleNums <= 0) {
// return;
// }
//
// // 需要发送给wcs的任务列表
// List<WcsTaskRequest> request = new ArrayList<>();
// // 已经下发的任务组列表
// List<String> taskGroupIds = new ArrayList<>();
// // 本次生成的箱子
// List<String> pickVehicleIds = new ArrayList<>();
// // 本次跳过的箱子
// List<String> skipVehicleIds = new ArrayList<>();
// // 查找所有站台拣选任务
// List<PickTask> standPickTasks = pickTaskService.list();
// // 生成一个Map计算每个站台已经出库的拣选任务
// Map<String, Integer> outPickTaskMap = new HashMap<>();
// Map<String, Integer> updatedOutPickTaskMap = new HashMap<>();
// // 轮询工作站台判断是否需要下发任务
// List<Stand> stands = standService.list(new LambdaQueryWrapper<Stand>()
// .eq(Stand::getIsLock, 0).eq(Stand::getStandStatus, 0)
// .eq(Stand::getStandType, 2));
// for (Stand workStation : stands) {
// outPickTaskMap.put(workStation.getStandId(), workStation.getPickVehicleCount());
// updatedOutPickTaskMap.put(workStation.getStandId(), workStation.getPickVehicleCount());
// }
// // 轮询堆垛机状态
// List<Stand> stackerList = standService.list(new LambdaQueryWrapper<Stand>()
// .eq(Stand::getIsLock, 0).eq(Stand::getStandStatus, 0)
// .eq(Stand::getStandType, 3));
// List<Task> stackRunningTasks = taskService.list(new LambdaQueryWrapper<Task>()
// .eq(Task::getTaskType, TaskType.OUT.getCode())
// .and(wrapper -> wrapper.eq(Task::getTaskStatus, WmsTaskStatus.WAIT.getCode())
// .or().eq(Task::getTaskStatus, WmsTaskStatus.RUN.getCode())));
// Map<Integer, Integer> runningTaskNumToEquipmentMap = new HashMap<>();
// for (Stand stacker : stackerList) {
// // 找这台堆垛机正在执行的拣选出库任务数量
// runningTaskNumToEquipmentMap.put(stacker.getEquipmentId(), 0);
// }
// // 生成堆垛机可用列表
// for (Task tempStackRunningTask : stackRunningTasks) {
// if (instantLocationMap.containsKey(tempStackRunningTask.getOrigin())) {
// int key = instantLocationMap.get(tempStackRunningTask.getOrigin()).getEquipmentId();
// if (runningTaskNumToEquipmentMap.isEmpty()) {
// // 没有可用堆垛机
// break;
// }
// if (runningTaskNumToEquipmentMap.containsKey(key)) {
// if (runningTaskNumToEquipmentMap.get(key) >= 3) {
// runningTaskNumToEquipmentMap.remove(key);
// } else {
// runningTaskNumToEquipmentMap.replace(key, runningTaskNumToEquipmentMap.get(key) + 1);
// }
// }
// }
// }
// if (runningTaskNumToEquipmentMap.isEmpty()) {
// // 没有可用堆垛机
// return;
// }
// // 还有可用堆垛机
// while(!runningTaskNumToEquipmentMap.isEmpty()) {
// if (request.size() >= maxWcsAcceptNums || remainVehicleNums <= 0) {
// // 超过wcs一次可接受数量
// break;
// }
// if (outPickTaskMap.isEmpty()) {
// // 没有站台可以使用
// break;
// }
// // 先找出目前数量最少的站台
// String standId = outPickTaskMap.entrySet().stream()
// .min(Comparator.comparingInt(Map.Entry::getValue))
// .map(Map.Entry::getKey)
// .orElse("");
// List<String> vehicleIds;
// if (StringUtils.isNotEmpty(standId)) {
// // 如果这个站台箱子数量超过最大每个站台的箱子数量则跳过
// if (outPickTaskMap.get(standId) >= maxStandVehicleNums) {
// outPickTaskMap.remove(standId);
// continue;
// }
// // 查找这个站台未下发的料箱
// vehicleIds = standPickTasks.stream()
// .filter(pickTask -> pickTask.getStandId().equals(standId) && pickTask.getPickStatus().equals(PickTaskStatusEnum.TEMP.getCode())
// && !pickVehicleIds.contains(pickTask.getVehicleId())
// && !skipVehicleIds.contains(pickTask.getVehicleId()))
// .map(PickTask::getVehicleId)
// .distinct()
// .toList();
// if (vehicleIds.isEmpty()) {
// outPickTaskMap.remove(standId);
// continue;
// }
// } else {
// vehicleIds = standPickTasks.stream()
// .filter(pickTask -> pickTask.getPickStatus().equals(PickTaskStatusEnum.TEMP.getCode())
// && !pickVehicleIds.contains(pickTask.getVehicleId())
// && !skipVehicleIds.contains(pickTask.getVehicleId()))
// .map(PickTask::getVehicleId)
// .distinct()
// .toList();
// if (vehicleIds.isEmpty()) {
// break;
// }
// }
// // 生成箱子-站台数量的Map
// Map<String, Integer> vehicleStandsMap = new HashMap<>();
// standPickTasks.forEach(pickTask -> {
// if (vehicleIds.contains(pickTask.getVehicleId())) {
// vehicleStandsMap.put(pickTask.getVehicleId(),
// vehicleStandsMap.getOrDefault(pickTask.getVehicleId(), 0) + 1);
// }
// });
// // 最多使用的箱子
// String maxVehicleId = vehicleStandsMap.entrySet().stream()
// .max(Comparator.comparingInt(Map.Entry::getValue))
// .map(Map.Entry::getKey)
// .orElse("");
// if (!StringUtils.isEmpty(maxVehicleId)) {
// // 找到这个箱子的任务
// List<Task> outPickTasks = allTasks.stream().filter(task -> task.getVehicleId().equals(maxVehicleId) && !pickVehicleIds.contains(task.getVehicleId())
// && task.getIsPicking() == 1 && StringUtils.isNotEmpty(task.getPickStand())).toList();
// if (!outPickTasks.isEmpty()) {
// // 更新每个站台的拣选箱数量
// List<String> maxStandIds = standPickTasks.stream()
// .filter(pickTask -> pickTask.getVehicleId().equals(maxVehicleId))
// .map(PickTask::getStandId)
// .distinct()
// .toList();
// // 给当前设备号+1
// int equipmentId = instantLocationMap.get(outPickTasks.get(0).getOrigin()).getEquipmentId();
// if (runningTaskNumToEquipmentMap.containsKey(equipmentId)) {
// boolean flag = false;
// for (Task task : outPickTasks) {
// if (taskGroupIds.contains(task.getTaskGroup())) {
// // 该任务组已经下发
// continue;
// }
// if (StringUtils.isNotEmpty(task.getPreTask())) {// 当前任务具有前置任务
// // 查询一下前置的任务有没有存在存在则不下发
// if (taskService.exists(new LambdaQueryWrapper<Task>().eq(Task::getTaskId, task.getPreTask()))) {
// continue;
// }
// }
// // 创建发送的任务
// WcsTaskRequest tempTask = new WcsTaskRequest();
// tempTask.setTaskId(task.getTaskGroup());
// tempTask.setTaskType(task.getTaskType());
// tempTask.setOrigin(task.getOrigin());
// tempTask.setDestination(task.getDestination());
// tempTask.setVehicleNo(task.getVehicleId());
// tempTask.setVehicleSize(task.getVehicleSize());
// tempTask.setWeight(task.getWeight());
// tempTask.setPriority(task.getTaskPriority());
// request.add(tempTask);
// // 已经发送过的任务组
// taskGroupIds.add(task.getTaskGroup());
// flag = true;
// }
// if (flag) {
// if (!maxStandIds.isEmpty()) {
// maxStandIds.forEach(tempStandId -> {
// outPickTaskMap.put(tempStandId, outPickTaskMap.getOrDefault(tempStandId, 0) + 1);
// updatedOutPickTaskMap.put(tempStandId, updatedOutPickTaskMap.getOrDefault(tempStandId, 0) + 1);
// });
// }
// runningTaskNumToEquipmentMap.replace(equipmentId, runningTaskNumToEquipmentMap.get(equipmentId) + 1);
// // 已经发送过的vehicleId
// pickVehicleIds.add(maxVehicleId);
// vehicleStandsMap.remove(maxVehicleId);
// // 剩余线体可继续出库料箱数量
// remainVehicleNums--;
// }
// } else {
// if (!skipVehicleIds.contains(maxVehicleId)) {
// skipVehicleIds.add(maxVehicleId);
// }
// }
// } else {
// if (!skipVehicleIds.contains(maxVehicleId)) {
// skipVehicleIds.add(maxVehicleId);
// }
// }
// }
// // 最少使用的箱子
// String minVehicleId = vehicleStandsMap.entrySet().stream()
// .min(Comparator.comparingInt(Map.Entry::getValue))
// .map(Map.Entry::getKey)
// .orElse("");
// if (!StringUtils.isEmpty(minVehicleId)) {
// // 找到这个箱子的任务
// List<Task> outPickTasks = allTasks.stream().filter(task -> task.getVehicleId().equals(minVehicleId) && !pickVehicleIds.contains(task.getVehicleId())
// && task.getIsPicking() == 1 && StringUtils.isNotEmpty(task.getPickStand())).toList();
// if (!outPickTasks.isEmpty()) {
// // 更新每个站台的拣选箱数量
// List<String> minStandIds = standPickTasks.stream()
// .filter(pickTask -> pickTask.getVehicleId().equals(minVehicleId))
// .map(PickTask::getStandId)
// .distinct()
// .toList();
// // 给当前设备号+1
// int equipmentId = instantLocationMap.get(outPickTasks.get(0).getOrigin()).getEquipmentId();
// if (runningTaskNumToEquipmentMap.containsKey(equipmentId)) {
// boolean flag = false;
// for (Task task : outPickTasks) {
// if (taskGroupIds.contains(task.getTaskGroup())) {
// // 该任务组已经下发
// continue;
// }
// if (StringUtils.isNotEmpty(task.getPreTask())) {// 当前任务具有前置任务
// // 查询一下前置的任务有没有存在存在则不下发
// if (taskService.exists(new LambdaQueryWrapper<Task>().eq(Task::getTaskId, task.getPreTask()))) {
// continue;
// }
// }
// // 创建发送的任务
// WcsTaskRequest tempTask = new WcsTaskRequest();
// tempTask.setTaskId(task.getTaskGroup());
// tempTask.setTaskType(task.getTaskType());
// tempTask.setOrigin(task.getOrigin());
// tempTask.setDestination(task.getDestination());
// tempTask.setVehicleNo(task.getVehicleId());
// tempTask.setVehicleSize(task.getVehicleSize());
// tempTask.setWeight(task.getWeight());
// tempTask.setPriority(task.getTaskPriority());
// request.add(tempTask);
// // 已经发送过的任务组
// taskGroupIds.add(task.getTaskGroup());
// flag = true;
// }
// if (flag) {
// if (!minStandIds.isEmpty()) {
// minStandIds.forEach(tempStandId -> {
// outPickTaskMap.put(tempStandId, outPickTaskMap.getOrDefault(tempStandId, 0) + 1);
// updatedOutPickTaskMap.put(tempStandId, updatedOutPickTaskMap.getOrDefault(tempStandId, 0) + 1);
// });
// }
// runningTaskNumToEquipmentMap.replace(equipmentId, runningTaskNumToEquipmentMap.get(equipmentId) + 1);
// // 已经发送过的vehicleId
// pickVehicleIds.add(minVehicleId);
// vehicleStandsMap.remove(minVehicleId);
// // 剩余线体可继续出库料箱数量
// remainVehicleNums--;
// }
// } else {
// if (!skipVehicleIds.contains(minVehicleId)) {
// skipVehicleIds.add(minVehicleId);
// }
// }
// } else {
// if (!skipVehicleIds.contains(minVehicleId)) {
// skipVehicleIds.add(minVehicleId);
// }
// }
// }
// List<Integer> removeKeys = new ArrayList<>(runningTaskNumToEquipmentMap.keySet().stream().toList());
// for (int equipmentId : removeKeys) {
// // 剩余任务有没有这台堆垛机的
// List<Task> remainTasks = allTasks.stream().filter(task -> !skipVehicleIds.contains(task.getVehicleId()) && !pickVehicleIds.contains(task.getVehicleId())
// && task.getIsPicking() == 1 && StringUtils.isNotEmpty(task.getPickStand())).toList();
// if (remainTasks.isEmpty() || runningTaskNumToEquipmentMap.get(equipmentId) >= 3) {
// runningTaskNumToEquipmentMap.remove(equipmentId);
// }
// }
// }
//
// if (request.size() == 0) {
// // 没有新任务发送
// return;
// }
// // 发送任务
// String url = configMap.get(ConfigMapKeyEnum.URL_WCS_TASK.getConfigKey());
// if (url != null) {
// logger.info("向WCS发送拣选出库任务地址{},请求详情:{}", url, convertJsonString(request));
// ResponseEntity result = JSON.parseObject(HttpUtils.sendHttpPostWithoutToken(url, convertJsonString(request)), ResponseEntity.class);
// try {
// logService.save(new WmsLog(WmsUtils.generateId("LOG_"), "向WCS发送任务", "SetStackerTask", JSON.toJSONString(request), JSON.toJSONString(result), url, LocalDateTime.now(), "WMS"));
// } catch (Exception e) {
// logger.error("插入日志错误。");
// }
// if (result == null) {
// logger.error("发送拣选出库任务异常。");
// } else {
// if (Objects.equals(ResponseCode.OK.getCode(), result.getCode())) {
// logger.info("发送WCS拣选出库任务成功。");
// taskService.update(new LambdaUpdateWrapper<Task>()
// .set(Task::getTaskStatus, WmsTaskStatus.WAIT.getCode())
// .in(Task::getTaskGroup, taskGroupIds)
// .eq(Task::getTaskStatus, WmsTaskStatus.NEW.getCode()));
// // 流转载具状态变更
// if (!pickVehicleIds.isEmpty()) {
// outsideVehiclesService.update(new LambdaUpdateWrapper<OutsideVehicles>()
// .set(OutsideVehicles::getOutStatus, 1)
// .in(OutsideVehicles::getVehicleId, pickVehicleIds));
// // 更新站台拣选箱数
// for (String tempStandId : updatedOutPickTaskMap.keySet()) {
// standService.update(new LambdaUpdateWrapper<Stand>()
// .set(Stand::getPickVehicleCount, updatedOutPickTaskMap.get(tempStandId))
// .eq(Stand::getStandId, tempStandId));
// }
// }
// } else {
// // 判断returnData的数据
// if (result.getReturnData() != null) {
// List<WcsTaskRequest> errorTasks = JSON.parseArray(result.getReturnData().toString(), WcsTaskRequest.class);
// if (!errorTasks.isEmpty()) {
// List<String> failedTaskIds = errorTasks.stream().map(WcsTaskRequest::getTaskId).distinct().toList();
// // 更新任务状态为异常
// taskService.update(new LambdaUpdateWrapper<Task>()
// .set(Task::getTaskStatus, WmsTaskStatus.EXCEPTION.getCode())
// .in(Task::getTaskGroup, failedTaskIds)
// .eq(Task::getTaskStatus, WmsTaskStatus.NEW.getCode()));
// }
// }
// logger.error("发送拣选出库任务错误:{}", convertJsonString(result));
// }
// }
// } else {
// logger.error("WCS发送任务地址为空。");
// }
// }
// } catch (Exception exception) {
// logger.error("向WCS发送拣选出库任务时发生异常{}", convertJsonString(exception));
// throw new Exception("向WCS发送拣选出库任务时发生异常。");
// }
// }
/**
* 发送拣选任务
*/
@ -577,31 +215,31 @@ public class WmsJobServiceImplements implements IWmsJobService {
request.add(requestSingle);
}
// 下面是模拟发送wcs拣选任务
simulateSendPickTasks(vehicleAndStansMap.keySet().stream().toList());
// if (!request.isEmpty()) {
// // 发送任务
// String url = configMap.get(ConfigMapKeyEnum.URL_WCS_PICK_TASK.getConfigKey());
// if (url != null) {
// logger.info("向WCS发送拣选任务地址{},请求详情:{}", url, convertJsonString(request));
// ResponseEntity result = JSON.parseObject(HttpUtils.sendHttpPostWithoutToken(url, convertJsonString(request)), ResponseEntity.class);
// try {
// logService.save(new WmsLog(WmsUtils.generateId("LOG_"), "向WCS发送拣选任务", "setConveyTask", convertJsonString(request), convertJsonString(result), url, LocalDateTime.now(), "WMS"));
// } catch (Exception e) {
// logger.error("插入日志错误。");
// }
// if (result != null && Objects.equals(ResponseCode.OK.getCode(), result.getCode())) {
// logger.info("发送拣选任务成功。");
// pickTaskService.update(new LambdaUpdateWrapper<PickTask>()
// .set(PickTask::getPickStatus, PickTaskStatusEnum.SEND.getCode())
// .in(PickTask::getVehicleId, vehicleAndStansMap.keySet())
// .eq(PickTask::getPickStatus, PickTaskStatusEnum.NEW.getCode()));
// } else {
// logger.error("发送拣选任务错误:{}", convertJsonString(result));
// }
// } else {
// logger.error("WCS发送拣选任务地址为空。");
// }
// }
// simulateSendPickTasks(vehicleAndStansMap.keySet().stream().toList());
if (!request.isEmpty()) {
// 发送任务
String url = configMap.get(ConfigMapKeyEnum.URL_WCS_PICK_TASK.getConfigKey());
if (url != null) {
logger.info("向WCS发送拣选任务地址{},请求详情:{}", url, convertJsonString(request));
ResponseEntity result = JSON.parseObject(HttpUtils.sendHttpPostWithoutToken(url, convertJsonString(request)), ResponseEntity.class);
try {
logService.save(new WmsLog(WmsUtils.generateId("LOG_"), "向WCS发送拣选任务", "setConveyTask", convertJsonString(request), convertJsonString(result), url, LocalDateTime.now(), "WMS"));
} catch (Exception e) {
logger.error("插入日志错误。");
}
if (result != null && Objects.equals(ResponseCode.OK.getCode(), result.getCode())) {
logger.info("发送拣选任务成功。");
pickTaskService.update(new LambdaUpdateWrapper<PickTask>()
.set(PickTask::getPickStatus, PickTaskStatusEnum.SEND.getCode())
.in(PickTask::getVehicleId, vehicleAndStansMap.keySet())
.eq(PickTask::getPickStatus, PickTaskStatusEnum.NEW.getCode()));
} else {
logger.error("发送拣选任务错误:{}", convertJsonString(result));
}
} else {
logger.error("WCS发送拣选任务地址为空。");
}
}
} catch (Exception exception) {
logger.error("向WCS发送拣选任务时发生异常{}", convertJsonString(exception));
throw new Exception("向WCS发送拣选任务时发生异常。");

View File

@ -393,7 +393,7 @@ public class WorkServiceImplements implements IWorkService {
// 分出在库的物料
List<Stock> onStockStockList = allStockList.stream().filter(stock -> Objects.equals(stock.getStockStatus(), StockStatus.OK.getCode())).sorted(Comparator.comparing(Stock::getCreateTime)).toList();
for (String standId : canUseStandIdList) {
Map<Integer, String> equipVehicleOfThisStandMap = new HashMap<>();
Map<Integer, Integer> equipTaskOfThisStandMap = new HashMap<>();
// 生成这个站台在这个设备出库的箱子
for (Task task : outTaskList) {
if (StringUtils.isEmpty(task.getPickStand())) {
@ -401,9 +401,9 @@ public class WorkServiceImplements implements IWorkService {
continue;
}
int equipmentId = getStackerIdByLocationId(task.getOrigin());
if (equipmentId != 0 && !equipVehicleOfThisStandMap.containsKey(equipmentId) && Objects.equals(task.getPickStand(), standId)) {
if (equipmentId != 0 && Objects.equals(task.getPickStand(), standId)) {
// 当前设备当前站台的任务
equipVehicleOfThisStandMap.put(equipmentId, task.getVehicleId());
equipTaskOfThisStandMap.put(equipmentId, equipTaskOfThisStandMap.getOrDefault(equipmentId, 0) + 1);
}
}
Map<String, String> thisStandOutVehicleMap = new HashMap<>();// 键为载具号值为库存id
@ -433,8 +433,8 @@ public class WorkServiceImplements implements IWorkService {
continue;
}
// 判断这个设备能否出库
if (equipVehicleOfThisStandMap.containsKey(equipmentId)) {
// 这个站台在这台设备已经生成过任务不再重复生成
if (equipTaskOfThisStandMap.containsKey(equipmentId) && equipTaskOfThisStandMap.get(equipmentId) >= 2) {
// 这个站台在这台设备已经生成过两条任务不再生成
continue;
}
// 判断这个库存是否被当前站台需要
@ -505,7 +505,7 @@ public class WorkServiceImplements implements IWorkService {
// 添加本次出库载具
thisTimeOutVehicleIds.add(stock.getVehicleId());
// 添加设备
equipVehicleOfThisStandMap.put(equipmentId, stock.getVehicleId());
equipTaskOfThisStandMap.put(equipmentId, equipTaskOfThisStandMap.getOrDefault(equipmentId, 0) + 1);
// 此处是为了将同一个载具尽量在同一个站台捡完
thisStandOutVehicleMap.put(stock.getVehicleId(), stock.getStockId());
}
@ -1076,6 +1076,7 @@ public class WorkServiceImplements implements IWorkService {
continue;
}
workFlow.setWorkStatus(-1);// 设置暂存状态
workFlow.setDistributedNum(BigDecimal.ZERO);
finalWorkFlows.add(workFlow);
}
if (!finalWorkFlows.isEmpty()) {