取消任务校验
This commit is contained in:
parent
84b0106cc7
commit
6bb201eb04
@ -19,6 +19,7 @@ public class PathToRobotChangeXYDTO {
|
||||
//这个实体类不要修改
|
||||
private String executionType;
|
||||
private String orderId;
|
||||
private String timeStamp;
|
||||
private String orderType;
|
||||
private String robotNo;
|
||||
private String taskType;
|
||||
|
@ -18,6 +18,7 @@ public class PathToRobotDTO {
|
||||
//这个实体类的信息,不能修改
|
||||
//这个实体类的信息,不能修改
|
||||
private String orderType;
|
||||
private String timeStamp;
|
||||
private Integer isCommandEnd;
|
||||
private String robotNo;
|
||||
private String commandType;
|
||||
|
@ -22,7 +22,7 @@ public class RobotStatusServiceImpl implements MqttService {
|
||||
*/
|
||||
@Override
|
||||
public void analysisMessage(String message) {
|
||||
// log.info("处理RobotStatusServiceImpl的消息 :{}", message);
|
||||
log.info("处理RobotStatusServiceImpl的消息 :{}", message);
|
||||
RobotPoseStatusDTO robotStatusData = JSON.parseObject(message, RobotPoseStatusDTO.class);
|
||||
robotStatusApi.robotStatusUpdate(robotStatusData);
|
||||
}
|
||||
|
@ -126,6 +126,7 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
|
||||
@Value("${zn.is_simulation:false}")
|
||||
private Boolean isSimulation;
|
||||
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void doRobotDoneTask(RobotCompleteTaskDTO robotCompleteTaskDTO) {
|
||||
log.info("111111机器人完成任务上报 :{}", JSON.toJSONString(robotCompleteTaskDTO));
|
||||
@ -407,7 +408,9 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
|
||||
|| RobotTaskStageEnum.UN_START.getType().equals(robotTaskDetailDO.getTaskStage())) {
|
||||
robotTaskDetailDO.setTaskStatus(RobotTaskDetailStatusEnum.NEW.getType());
|
||||
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.UN_START.getType());
|
||||
robotTaskDetailDO.setRobotNo("");
|
||||
if (!isSimulation) {
|
||||
robotTaskDetailDO.setRobotNo("");
|
||||
}
|
||||
robotTaskDetailDO.setOccurError(ZeroOneEnum.ZERO.getType());
|
||||
robotTaskDetailMapper.updateById(robotTaskDetailDO);
|
||||
String taskNo = taskDetailService.getTaskNoByDetailId(robotCompleteTaskDTO.getOrderId());
|
||||
|
@ -49,4 +49,7 @@ public class RobotTaskChcheConstant {
|
||||
|
||||
//机器人物料数量(拼接的是mac地址)
|
||||
public static String ROBOT_TASK_SKU_INFO = "robot:task:sku:info";
|
||||
|
||||
//所有的车辆信息 获得到一个map, key是 mac,value是具体信息
|
||||
public static String ROBOT_ALL_INFORMATION = "robot:all:information";
|
||||
}
|
||||
|
@ -0,0 +1,67 @@
|
||||
package cn.iocoder.yudao.module.system.schedul;
|
||||
|
||||
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import cn.iocoder.yudao.module.system.api.robot.processor.RequestProcessor;
|
||||
import cn.iocoder.yudao.module.system.api.robot.websocket.RobotInformationVO;
|
||||
import cn.iocoder.yudao.module.system.constant.CommonConstant;
|
||||
import cn.iocoder.yudao.module.system.service.robot.RobotInformationService;
|
||||
import cn.iocoder.yudao.module.system.util.redis.RedisUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
@EnableScheduling
|
||||
@Component
|
||||
@Slf4j
|
||||
public class RcsMapScheduled {
|
||||
|
||||
@Resource
|
||||
private RedisUtil redisUtil;
|
||||
|
||||
@Resource
|
||||
private RequestProcessor processor;
|
||||
|
||||
@Autowired
|
||||
private RobotInformationService robotInformationService;
|
||||
|
||||
private static final ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10);
|
||||
|
||||
// 这个方法将每200毫秒执行一次
|
||||
// @Scheduled(fixedDelay = 300, timeUnit = TimeUnit.MILLISECONDS)
|
||||
public void executeTask() {
|
||||
fixedThreadPool.execute(() ->{
|
||||
sendRobotInformationToRcsMap();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送车辆信息给车机
|
||||
*/
|
||||
private void sendRobotInformationToRcsMap() {
|
||||
Map<String, RobotInformationVO> robotInformationVOS = robotInformationService.getAllRobotByRedis();
|
||||
if (ObjectUtil.isEmpty(robotInformationVOS)) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (Map.Entry<String, RobotInformationVO> item : robotInformationVOS.entrySet()) {
|
||||
RobotInformationVO v = item.getValue();
|
||||
if (ObjectUtil.isEmpty(v)) {
|
||||
v = robotInformationService.getRobotByRedis(item.getKey());
|
||||
}
|
||||
/*processor.handleRequest(floorZoneDTO.getFloor() + CommonConstant.SYMBOL + floorZoneDTO.getArea(),
|
||||
item.getKey(), JSONUtil.toJsonStr(v));*/
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -14,7 +14,6 @@ import cn.iocoder.yudao.module.system.util.redis.RedisUtil;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||
import org.springframework.scheduling.annotation.Scheduled;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
@ -23,12 +22,11 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
@EnableScheduling
|
||||
@Component
|
||||
@Slf4j
|
||||
public class ScheduledTasks {
|
||||
public class ThreeDimensionalScheduled {
|
||||
|
||||
@Resource
|
||||
private PositionMapService positionMapService;
|
@ -515,7 +515,8 @@ public class PathPlanningServiceImpl implements PathPlanningService {
|
||||
BigDecimal y = (sino.multiply(robotXOffset, MathContext.DECIMAL32)).add(coso.multiply(robotYOffset, MathContext.DECIMAL32)).add(y1);
|
||||
cargoPose.setX(x.doubleValue());
|
||||
cargoPose.setY(y.doubleValue());
|
||||
log.info("转换后 :{}",JSON.toJSONString(pathToRobotChangeXY));
|
||||
log.info("111111转换前数据 :{}",message);
|
||||
log.info("111111转换后 :{}",JSON.toJSONString(pathToRobotChangeXY));
|
||||
commonApi.commonMethodStr(JSON.toJSONString(pathToRobotChangeXY), topic);
|
||||
}
|
||||
|
||||
|
@ -162,7 +162,7 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
|
||||
@Value("${zn.is_simulation:false}")
|
||||
private Boolean isSimulation;
|
||||
|
||||
@Value("${zn.restore_task_ restart:true}")
|
||||
@Value("${zn.restore_task_restart:true}")
|
||||
private Boolean restoreTaskRestart;
|
||||
|
||||
@Value("${zn.full_electricity:95}")
|
||||
|
@ -62,6 +62,7 @@ import cn.iocoder.yudao.module.system.service.information.DeviceInformationServi
|
||||
import cn.iocoder.yudao.module.system.service.log.RobotTaskDetailActionLogService;
|
||||
import cn.iocoder.yudao.module.system.service.log.UserOperationLogService;
|
||||
import cn.iocoder.yudao.module.system.service.positionmap.PositionMapItemService;
|
||||
import cn.iocoder.yudao.module.system.service.robot.simulation.RobotSimulationService;
|
||||
import cn.iocoder.yudao.module.system.service.statistics.RobotWorkingHoursStatisticsService;
|
||||
import cn.iocoder.yudao.module.system.util.redis.RedisUtil;
|
||||
import cn.iocoder.yudao.module.system.util.redis.RedissonUtils;
|
||||
@ -186,9 +187,22 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper, RobotTask
|
||||
@Resource
|
||||
private RobotWorkingHoursStatisticsService robotWorkingHoursStatisticsService;
|
||||
|
||||
@Resource
|
||||
private RobotSimulationService robotSimulationService;
|
||||
|
||||
@Value("${zn.task_not_check:true}")
|
||||
private Boolean taskNotCheck;
|
||||
|
||||
@Value("${zn.is_simulation:false}")
|
||||
private Boolean isSimulation;
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Long createTask(RobotTaskSaveReqVO createReqVO) throws InterruptedException {
|
||||
if (taskNotCheck && isSimulation) {
|
||||
robotSimulationService.createTask(createReqVO);
|
||||
return 1L;
|
||||
}
|
||||
//校验
|
||||
doTaskCheck(createReqVO);
|
||||
|
||||
|
@ -148,7 +148,8 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService {
|
||||
return;
|
||||
}
|
||||
|
||||
log.info("-------查找到车子和任务------");
|
||||
log.info("-------查找车子------ ,:{}",JSON.toJSONString(robots));
|
||||
log.info("-------查找任务------ ,:{}",JSON.toJSONString(taskDetailDOS));
|
||||
distributeTasksToPP(robots, taskDetailDOS);
|
||||
|
||||
}
|
||||
@ -498,6 +499,7 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService {
|
||||
if (ObjectUtil.isEmpty(taskDetailDO.getRobotNo())) {
|
||||
robotNoLimitions = robotNoLimitationArea;
|
||||
} else {
|
||||
log.info("区域 :{}",JSON.toJSONString(robotDoReleaseMap));
|
||||
TaskRobotNoLimittationAreaDTO taskRobotNoLimittationAreaDTO = robotDoReleaseMap.get(taskDetailDO.getRobotNo());
|
||||
if (ObjectUtil.isEmpty(taskRobotNoLimittationAreaDTO)) {
|
||||
log.info("车辆没有能行走的区域 :{}", taskDetailDO.getRobotNo());
|
||||
|
@ -0,0 +1,8 @@
|
||||
package cn.iocoder.yudao.module.system.service.robot.simulation;
|
||||
|
||||
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotTaskSaveReqVO;
|
||||
|
||||
public interface RobotSimulationService {
|
||||
|
||||
void createTask(RobotTaskSaveReqVO createReqVO);
|
||||
}
|
@ -0,0 +1,513 @@
|
||||
package cn.iocoder.yudao.module.system.service.robot.simulation;
|
||||
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.module.mqtt.api.common.CommonApi;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotInformationPageReqVO;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotTaskDetailAddVO;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotTaskSaveReqVO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.cycle.TaskCycleDO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.housearea.HouseAreaDO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.houselane.WareHouseLaneDO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.houselocation.WareHouseLocationDO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapItemDO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotInformationDO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDetailDO;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.cycle.TaskCycleMapper;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.housearea.HouseAreaMapper;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.houselane.WareHouseLaneMapper;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.houselocation.WareHouseLocationMapper;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.information.DeviceInformationMapper;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.log.RobotTaskDetailActionLogMapper;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotChargeLogMapper;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotInformationMapper;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotTaskDetailMapper;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotTaskMapper;
|
||||
import cn.iocoder.yudao.module.system.enums.redis.RobotCacheLockEnum;
|
||||
import cn.iocoder.yudao.module.system.enums.robot.LocationEnableEnum;
|
||||
import cn.iocoder.yudao.module.system.enums.robot.LocationLockEnum;
|
||||
import cn.iocoder.yudao.module.system.enums.robot.LocationUseStatusEnum;
|
||||
import cn.iocoder.yudao.module.system.enums.robot.MoveAllEnum;
|
||||
import cn.iocoder.yudao.module.system.enums.robot.ReleaseTakeEnum;
|
||||
import cn.iocoder.yudao.module.system.enums.robot.RobotTaskTypeEnum;
|
||||
import cn.iocoder.yudao.module.system.service.information.DeviceInformationService;
|
||||
import cn.iocoder.yudao.module.system.service.log.RobotTaskDetailActionLogService;
|
||||
import cn.iocoder.yudao.module.system.service.log.UserOperationLogService;
|
||||
import cn.iocoder.yudao.module.system.service.positionmap.PositionMapItemService;
|
||||
import cn.iocoder.yudao.module.system.service.robot.RobotInformationService;
|
||||
import cn.iocoder.yudao.module.system.service.robot.RobotTaskDetailService;
|
||||
import cn.iocoder.yudao.module.system.service.statistics.RobotWorkingHoursStatisticsService;
|
||||
import cn.iocoder.yudao.module.system.util.redis.RedisUtil;
|
||||
import cn.iocoder.yudao.module.system.util.redis.RedissonUtils;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.google.common.collect.Lists;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception0;
|
||||
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.TASK_CREATE_FAIL;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
@Validated
|
||||
public class RobotSimulationServiceImpl implements RobotSimulationService{
|
||||
|
||||
@Resource
|
||||
private RobotTaskMapper taskMapper;
|
||||
|
||||
@Resource
|
||||
private WareHouseLocationMapper locationMapper;
|
||||
|
||||
@Resource
|
||||
private RedisUtil redisUtil;
|
||||
|
||||
@Resource
|
||||
private RobotTaskDetailMapper taskDetailMapper;
|
||||
|
||||
@Resource
|
||||
private RobotTaskDetailService robotTaskDetailService;
|
||||
|
||||
@Resource
|
||||
private RobotInformationMapper informationMapper;
|
||||
|
||||
|
||||
@Value("${zn.task-no:ZN}")
|
||||
private String taskNo;
|
||||
|
||||
@Value("${zn.task.check_sku_info:true}")
|
||||
private Boolean checkSkuInfo;
|
||||
|
||||
|
||||
@Resource
|
||||
private WareHouseLaneMapper houseLaneMapper;
|
||||
|
||||
@Resource
|
||||
private HouseAreaMapper houseAreaMapper;
|
||||
|
||||
@Value("${zn.move-no:MOVE}")
|
||||
private String moveTaskNo;
|
||||
|
||||
@Resource
|
||||
private PositionMapItemService positionMapItemService;
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public void createTask(RobotTaskSaveReqVO createReqVO) {
|
||||
|
||||
//设置任务号
|
||||
if (ObjectUtil.isEmpty(createReqVO.getTaskNo())) {
|
||||
String incrementByKey = redisUtil.getIncrementByKey(RobotCacheLockEnum.TASK_NO.getKey());
|
||||
createReqVO.setTaskNo(taskNo + DateUtils.getYearMonthDay() + incrementByKey);
|
||||
}
|
||||
|
||||
log.info("111111创建一个不校验的任务 :{}",createReqVO.getTaskNo());
|
||||
|
||||
RobotTaskDO task = BeanUtils.toBean(createReqVO, RobotTaskDO.class);
|
||||
task.setRemainingCycleNumber(task.getCycleNumber());
|
||||
taskMapper.insert(task);
|
||||
|
||||
List<Long> laneIds = new ArrayList<>();
|
||||
List<Long> areaIds = new ArrayList<>();
|
||||
if (ObjectUtil.isNotEmpty(task.getSkuInfo()) && checkSkuInfo) {
|
||||
List<WareHouseLaneDO> wareHouseLaneDOS = houseLaneMapper.selectList(new LambdaQueryWrapper<WareHouseLaneDO>()
|
||||
.eq(WareHouseLaneDO::getLaneMsg, task.getSkuInfo()));
|
||||
if (ObjectUtil.isNotEmpty(wareHouseLaneDOS)) {
|
||||
laneIds = wareHouseLaneDOS.stream().map(WareHouseLaneDO::getId).collect(Collectors.toList());
|
||||
}
|
||||
List<HouseAreaDO> houseAreaDOS = houseAreaMapper.selectList(new LambdaQueryWrapper<HouseAreaDO>()
|
||||
.eq(HouseAreaDO::getSkuInfo, task.getSkuInfo()));
|
||||
if (ObjectUtil.isNotEmpty(houseAreaDOS)) {
|
||||
areaIds = houseAreaDOS.stream().map(HouseAreaDO::getId).collect(Collectors.toList());
|
||||
}
|
||||
}
|
||||
|
||||
//查找库位
|
||||
List<Long> locationIds = new ArrayList<>();
|
||||
if (MoveAllEnum.NO.getType().equals(createReqVO.getDoMoveAll())) {
|
||||
locationIds = setSingleLocationIdNo(createReqVO.getTaskDetailList(), task, laneIds, areaIds);
|
||||
} else {
|
||||
locationIds = setAllLocationIdNo(createReqVO, task.getId(), laneIds, areaIds, task.getSkuInfo());
|
||||
}
|
||||
|
||||
// 插入
|
||||
createReqVO.getTaskDetailList()
|
||||
.forEach(taskDetail -> {
|
||||
taskDetail.setRobotTaskId(task.getId());
|
||||
});
|
||||
robotTaskDetailService.insertRobotDetailList(createReqVO.getTaskDetailList());
|
||||
|
||||
List<List<Long>> fromPartition = Lists.partition(locationIds, 100);
|
||||
fromPartition.forEach(list -> {
|
||||
locationMapper.updateLocationLockList(list, task.getId(), LocationLockEnum.NO.getType());
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public List<Long> setSingleLocationIdNo(List<RobotTaskDetailAddVO> taskDetailList, RobotTaskDO task,
|
||||
List<Long> laneIds, List<Long> areaIds) {
|
||||
//取货中的map_item_id, 此集合不能执行放货的任务
|
||||
List<Long> takeMapItemIds = taskDetailMapper.selectTakeMapItemIds();
|
||||
if (ObjectUtil.isEmpty(takeMapItemIds)) {
|
||||
takeMapItemIds = new ArrayList<>();
|
||||
}
|
||||
//放货中的map_item_id, 此集合不能执行取货的任务
|
||||
List<Long> releaseMapItemIds = taskDetailMapper.selectReleaseMapItemIds();
|
||||
if (ObjectUtil.isEmpty(releaseMapItemIds)) {
|
||||
releaseMapItemIds = new ArrayList<>();
|
||||
}
|
||||
|
||||
List<Long> locationIds = new ArrayList<>();
|
||||
Set<Long> chooseLocationIds = new HashSet<>();
|
||||
|
||||
for (RobotTaskDetailAddVO robotTaskVo : taskDetailList) {
|
||||
robotTaskVo.setRobotTaskId(task.getId());
|
||||
robotTaskVo.setPriority(task.getPriority());
|
||||
RobotTaskTypeEnum robotTaskType = RobotTaskTypeEnum.getRobotTaskType(robotTaskVo.getTaskType());
|
||||
switch (robotTaskType) {
|
||||
case TAKE_RELEASE:
|
||||
doTakeRelease(robotTaskVo, locationIds, takeMapItemIds, releaseMapItemIds, laneIds, areaIds, task.getSkuInfo(), chooseLocationIds);
|
||||
break;
|
||||
case PARK:
|
||||
doPark(robotTaskVo, locationIds, takeMapItemIds, releaseMapItemIds);
|
||||
break;
|
||||
case CHARGE:
|
||||
doCharge(robotTaskVo, takeMapItemIds, releaseMapItemIds);
|
||||
break;
|
||||
case MOVE:
|
||||
doMove(robotTaskVo, locationIds, takeMapItemIds, releaseMapItemIds);
|
||||
break;
|
||||
case TAKE:
|
||||
doTake(robotTaskVo, locationIds, takeMapItemIds, releaseMapItemIds, chooseLocationIds);
|
||||
break;
|
||||
case RELEASE:
|
||||
doRelease(robotTaskVo, locationIds, takeMapItemIds, releaseMapItemIds, laneIds, areaIds, task.getSkuInfo(), chooseLocationIds);
|
||||
break;
|
||||
case SCAN:
|
||||
//暂无此功能
|
||||
doScan(robotTaskVo, locationIds, takeMapItemIds, releaseMapItemIds);
|
||||
break;
|
||||
case DETECTING_TRAYS:
|
||||
//暂无此功能
|
||||
doDetectingTrays(robotTaskVo, locationIds, takeMapItemIds, releaseMapItemIds);
|
||||
break;
|
||||
case MOVE_TO_POINT:
|
||||
doMoveToPoint(robotTaskVo);
|
||||
break;
|
||||
default:
|
||||
log.error("任务类型不存在 ");
|
||||
throw exception0(TASK_CREATE_FAIL.getCode(), "任务类型不存在");
|
||||
}
|
||||
}
|
||||
return locationIds;
|
||||
}
|
||||
|
||||
|
||||
public void doTakeRelease(RobotTaskDetailAddVO robotTaskVo, List<Long> locationIds,
|
||||
List<Long> takeMapItemIds, List<Long> releaseMapItemIds,
|
||||
List<Long> laneIds, List<Long> areaIds, String skuInfo, Set<Long> chooseLocationIds) {
|
||||
|
||||
|
||||
//校验放货库位
|
||||
setToLocation(robotTaskVo, null, locationIds, takeMapItemIds, releaseMapItemIds, laneIds, areaIds, skuInfo, chooseLocationIds);
|
||||
locationIds.add(robotTaskVo.getToLocationId());
|
||||
|
||||
//校验取货库位
|
||||
setFromLocation(robotTaskVo, null, locationIds, takeMapItemIds, releaseMapItemIds, chooseLocationIds);
|
||||
locationIds.add(robotTaskVo.getFromLocationId());
|
||||
|
||||
//验证取货库位是否存在未完成的任务
|
||||
Set<Long> set = new HashSet<>();
|
||||
set.add(robotTaskVo.getFromLocationId());
|
||||
}
|
||||
|
||||
/**
|
||||
* 移动到指定点位
|
||||
*
|
||||
* @param robotTaskVo
|
||||
*/
|
||||
private void doMoveToPoint(RobotTaskDetailAddVO robotTaskVo) {
|
||||
PositionMapItemDO positionMapItem = positionMapItemService.getPositionMapItem(robotTaskVo.getReleaseId());
|
||||
robotTaskVo.setToLocationNo(String.valueOf(positionMapItem.getSortNum()));
|
||||
}
|
||||
|
||||
/**
|
||||
* 检测托盘类型
|
||||
*
|
||||
* @param robotTaskVo
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void doDetectingTrays(RobotTaskDetailAddVO robotTaskVo, List<Long> locationIds, List<Long> takeMapItemIds,
|
||||
List<Long> releaseMapItemIds) {
|
||||
/*setToLocation(robotTaskVo,getMapIdsByRobotNo(robotTaskVo.getRobotNo()),new ArrayList<>());
|
||||
locationIds.add(robotTaskVo.getToLocationId());*/
|
||||
}
|
||||
|
||||
/**
|
||||
* 扫描码
|
||||
*
|
||||
* @param robotTaskVo
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void doScan(RobotTaskDetailAddVO robotTaskVo, List<Long> locationIds, List<Long> takeMapItemIds,
|
||||
List<Long> releaseMapItemIds) {
|
||||
/*setToLocation(robotTaskVo,getMapIdsByRobotNo(robotTaskVo.getRobotNo()),new ArrayList<>());
|
||||
locationIds.add(robotTaskVo.getToLocationId());*/
|
||||
}
|
||||
|
||||
/**
|
||||
* 仅放货
|
||||
*
|
||||
* @param robotTaskVo
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void doRelease(RobotTaskDetailAddVO robotTaskVo, List<Long> locationIds, List<Long> takeMapItemIds,
|
||||
List<Long> releaseMapItemIds, List<Long> laneIds, List<Long> areaIds, String skuInfo,
|
||||
Set<Long> chooseLocationIds) {
|
||||
setToLocation(robotTaskVo, null, locationIds, takeMapItemIds,
|
||||
releaseMapItemIds, laneIds, areaIds, skuInfo, chooseLocationIds);
|
||||
locationIds.add(robotTaskVo.getToLocationId());
|
||||
}
|
||||
|
||||
public void setFromLocation(RobotTaskDetailAddVO robotTaskVo, Set<Long> mapIds, List<Long> locationIds,
|
||||
List<Long> takeMapItemIds, List<Long> releaseMapItemIds, Set<Long> chooseLocationIds) {
|
||||
if (ReleaseTakeEnum.TO_LOCATION.getType().equals(robotTaskVo.getTakeType())) {
|
||||
WareHouseLocationDO query = WareHouseLocationDO.builder().id(robotTaskVo.getTakeId()).build();
|
||||
WareHouseLocationDO locationDO = locationMapper.queryAllByLimit(query);
|
||||
robotTaskVo.setFromLocationNo(locationDO.getLocationNo());
|
||||
robotTaskVo.setFromLocationId(robotTaskVo.getTakeId());
|
||||
robotTaskVo.setFromLocationStorey(locationDO.getLocationStorey());
|
||||
robotTaskVo.setFromLaneId(locationDO.getLaneId());
|
||||
robotTaskVo.setFromLocationNumber(locationDO.getLocationNumber());
|
||||
robotTaskVo.setFromMapItemId(locationDO.getMapItemId());
|
||||
takeMapItemIds.add(locationDO.getMapItemId());
|
||||
} else {
|
||||
WareHouseLocationDO wareHouseLocationDO =
|
||||
locationMapper.selectByTypeAndId(LocationUseStatusEnum.YES.getType(), robotTaskVo.getTakeType(),
|
||||
robotTaskVo.getTakeId(), locationIds, null, releaseMapItemIds, new ArrayList<>(), new ArrayList<>());
|
||||
robotTaskVo.setFromLocationNo(wareHouseLocationDO.getLocationNo());
|
||||
robotTaskVo.setFromLocationId(wareHouseLocationDO.getId());
|
||||
robotTaskVo.setFromLocationStorey(wareHouseLocationDO.getLocationStorey());
|
||||
robotTaskVo.setFromLaneId(wareHouseLocationDO.getLaneId());
|
||||
robotTaskVo.setFromLocationNumber(wareHouseLocationDO.getLocationNumber());
|
||||
robotTaskVo.setFromMapItemId(wareHouseLocationDO.getMapItemId());
|
||||
takeMapItemIds.add(wareHouseLocationDO.getMapItemId());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 仅取货
|
||||
*
|
||||
* @param robotTaskVo
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void doTake(RobotTaskDetailAddVO robotTaskVo, List<Long> locationIds, List<Long> takeMapItemIds,
|
||||
List<Long> releaseMapItemIds, Set<Long> chooseLocationIds) {
|
||||
|
||||
setFromLocation(robotTaskVo, null, locationIds, takeMapItemIds, releaseMapItemIds, chooseLocationIds);
|
||||
locationIds.add(robotTaskVo.getFromLocationId());
|
||||
}
|
||||
|
||||
public Set<Long> getMapIdsByRobotNo(String robotNo) {
|
||||
if (ObjectUtil.isNotEmpty(robotNo)) {
|
||||
RobotInformationPageReqVO pageReqVO = new RobotInformationPageReqVO();
|
||||
pageReqVO.setRobotNo(robotNo);
|
||||
return informationMapper.selectPage(pageReqVO).getList()
|
||||
.stream()
|
||||
.findFirst()
|
||||
.map(RobotInformationDO::getFloorAreaJson)
|
||||
.orElse(new HashSet<>());
|
||||
}
|
||||
return new HashSet<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* 移动
|
||||
*
|
||||
* @param robotTaskVo
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void doMove(RobotTaskDetailAddVO robotTaskVo, List<Long> locationIds, List<Long> takeMapItemIds,
|
||||
List<Long> releaseMapItemIds) {
|
||||
setToLocation(robotTaskVo, null, locationIds, takeMapItemIds, releaseMapItemIds,
|
||||
null, null, null, null);
|
||||
locationIds.add(robotTaskVo.getToLocationId());
|
||||
}
|
||||
|
||||
/**
|
||||
* 充电
|
||||
*
|
||||
* @param robotTaskVo
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void doCharge(RobotTaskDetailAddVO robotTaskVo, List<Long> takeMapItemIds,
|
||||
List<Long> releaseMapItemIds) {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 停车
|
||||
*
|
||||
* @param robotTaskVo
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void doPark(RobotTaskDetailAddVO robotTaskVo, List<Long> locationIds, List<Long> takeMapItemIds,
|
||||
List<Long> releaseMapItemIds) {
|
||||
// todo 停车后续停到等待点
|
||||
/*setToLocation(robotTaskVo,getMapIdsByRobotNo(robotTaskVo.getRobotNo()),locationIds);
|
||||
locationIds.add(robotTaskVo.getToLocationId());*/
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 设置放货和取货的id
|
||||
*
|
||||
* @param createReqVO
|
||||
* @param taskId
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public List<Long> setAllLocationIdNo(RobotTaskSaveReqVO createReqVO, Long taskId,
|
||||
List<Long> laneIds, List<Long> areaIds, String skuInfo) {
|
||||
List<RobotTaskDetailAddVO> taskDetailList = createReqVO.getTaskDetailList();
|
||||
|
||||
List<RobotTaskDetailAddVO> newTaskDetailList = new ArrayList<>();
|
||||
List<Long> mapItemIds = new ArrayList<>();
|
||||
|
||||
//被此次任务锁定的空库位id
|
||||
List<Long> toLocationIds = new ArrayList<>();
|
||||
//被此次任务锁定的有货库位id
|
||||
List<Long> fromLocationIds = new ArrayList<>();
|
||||
for (RobotTaskDetailAddVO robotTaskVo : taskDetailList) {
|
||||
Set<Long> mapIds = new HashSet<>();
|
||||
|
||||
//查找有货且非锁定的库位
|
||||
WareHouseLocationDO query = null;
|
||||
if (ReleaseTakeEnum.TO_LANE.getType().equals(robotTaskVo.getTakeType())) {
|
||||
query = WareHouseLocationDO.builder()
|
||||
.laneId(robotTaskVo.getTakeId())
|
||||
.build();
|
||||
} else if (ReleaseTakeEnum.TO_AREA.getType().equals(robotTaskVo.getTakeType())) {
|
||||
query = WareHouseLocationDO.builder()
|
||||
.areaId(robotTaskVo.getTakeId())
|
||||
.build();
|
||||
}
|
||||
|
||||
List<WareHouseLocationDO> stockList = locationMapper.selectLocations(query, toLocationIds, mapIds,
|
||||
new ArrayList<>(), new ArrayList<>(), new ArrayList<>());
|
||||
if (ObjectUtil.isEmpty(stockList)) {
|
||||
log.error("取货线库/区域为空或者已锁定或者机器人取放货区域受限制 :{}", robotTaskVo.toString());
|
||||
throw exception0(TASK_CREATE_FAIL.getCode(), "取货线库/区域为空或者已锁定或者机器人取放货区域受限制");
|
||||
}
|
||||
|
||||
//查找空库位
|
||||
WareHouseLocationDO releaseQuery = null;
|
||||
if (ReleaseTakeEnum.TO_LANE.getType().equals(robotTaskVo.getReleaseType())) {
|
||||
releaseQuery = WareHouseLocationDO.builder()
|
||||
.laneId(robotTaskVo.getReleaseId())
|
||||
.build();
|
||||
} else if (ReleaseTakeEnum.TO_AREA.getType().equals(robotTaskVo.getReleaseType())) {
|
||||
releaseQuery = WareHouseLocationDO.builder()
|
||||
.areaId(robotTaskVo.getReleaseId())
|
||||
.build();
|
||||
}
|
||||
|
||||
List<WareHouseLocationDO> releaseStockList = locationMapper.selectLocations(releaseQuery, toLocationIds, mapIds,
|
||||
laneIds, areaIds, mapItemIds);
|
||||
if (ObjectUtil.isEmpty(releaseStockList) || releaseStockList.size() < stockList.size()) {
|
||||
log.error("放货线库/区域库位数量不足或者机器人取放货区域受限制 :{}", robotTaskVo.toString());
|
||||
throw exception0(TASK_CREATE_FAIL.getCode(), "放货线库/区域库位数量不足或者机器人取放货区域受限制");
|
||||
}
|
||||
Collections.reverse(releaseStockList);
|
||||
//赋值数据
|
||||
List<RobotTaskDetailAddVO> addTaskDetailList = getTaskDatail(stockList, releaseStockList, toLocationIds,
|
||||
robotTaskVo, taskId, fromLocationIds);
|
||||
newTaskDetailList.addAll(addTaskDetailList);
|
||||
|
||||
}
|
||||
createReqVO.setTaskDetailList(newTaskDetailList);
|
||||
|
||||
if (ObjectUtil.isNotEmpty(fromLocationIds)) {
|
||||
toLocationIds.addAll(fromLocationIds);
|
||||
}
|
||||
return toLocationIds;
|
||||
}
|
||||
|
||||
private List<RobotTaskDetailAddVO> getTaskDatail(List<WareHouseLocationDO> stockList,
|
||||
List<WareHouseLocationDO> releaseStockList,
|
||||
List<Long> toLocationIds, RobotTaskDetailAddVO robotTaskVo,
|
||||
Long taskId, List<Long> fromLocationIds) {
|
||||
List<RobotTaskDetailAddVO> addTaskDetailList = new ArrayList<>();
|
||||
for (int i = 0; i < stockList.size(); i++) {
|
||||
RobotTaskDetailAddVO robotTaskDetailAddVo = new RobotTaskDetailAddVO();
|
||||
robotTaskDetailAddVo.setTaskType(robotTaskVo.getTaskType());
|
||||
robotTaskDetailAddVo.setReleaseType(robotTaskVo.getReleaseType());
|
||||
robotTaskDetailAddVo.setTakeType(robotTaskVo.getTakeType());
|
||||
robotTaskDetailAddVo.setTakeId(robotTaskVo.getTakeId());
|
||||
robotTaskDetailAddVo.setReleaseId(robotTaskVo.getReleaseId());
|
||||
robotTaskDetailAddVo.setRobotNo(robotTaskVo.getRobotNo());
|
||||
robotTaskDetailAddVo.setFromLocationNo(stockList.get(i).getLocationNo());
|
||||
robotTaskDetailAddVo.setFromLocationId(stockList.get(i).getId());
|
||||
robotTaskDetailAddVo.setToLocationNo(releaseStockList.get(i).getLocationNo());
|
||||
robotTaskDetailAddVo.setToLocationId(releaseStockList.get(i).getId());
|
||||
robotTaskDetailAddVo.setFromLaneId(stockList.get(i).getLaneId());
|
||||
robotTaskDetailAddVo.setToLaneId(releaseStockList.get(i).getLaneId());
|
||||
robotTaskDetailAddVo.setFromLocationNumber(stockList.get(i).getLocationNumber());
|
||||
robotTaskDetailAddVo.setFromMapItemId(stockList.get(i).getMapItemId());
|
||||
robotTaskDetailAddVo.setToMapItemId(releaseStockList.get(i).getMapItemId());
|
||||
robotTaskDetailAddVo.setRobotTaskId(taskId);
|
||||
robotTaskDetailAddVo.setPriority(robotTaskVo.getPriority());
|
||||
robotTaskDetailAddVo.setFromLocationStorey(stockList.get(i).getLocationStorey());
|
||||
robotTaskDetailAddVo.setToLocationStorey(releaseStockList.get(i).getLocationStorey());
|
||||
addTaskDetailList.add(robotTaskDetailAddVo);
|
||||
|
||||
toLocationIds.add(releaseStockList.get(i).getId());
|
||||
fromLocationIds.add(stockList.get(i).getId());
|
||||
}
|
||||
return addTaskDetailList;
|
||||
}
|
||||
|
||||
public void setToLocation(RobotTaskDetailAddVO robotTaskVo, Set<Long> mapIds, List<Long> locationIds,
|
||||
List<Long> takeMapItemIds, List<Long> releaseMapItemIds,
|
||||
List<Long> laneIds, List<Long> areaIds, String skuInfo, Set<Long> chooseLocationIds) {
|
||||
if (ReleaseTakeEnum.TO_LOCATION.getType().equals(robotTaskVo.getReleaseType())) {
|
||||
WareHouseLocationDO query = WareHouseLocationDO.builder().id(robotTaskVo.getReleaseId()).build();
|
||||
WareHouseLocationDO locationDO = locationMapper.queryAllByLimit(query);
|
||||
robotTaskVo.setToLocationNo(locationDO.getLocationNo());
|
||||
robotTaskVo.setToLocationId(robotTaskVo.getReleaseId());
|
||||
robotTaskVo.setToLocationStorey(locationDO.getLocationStorey());
|
||||
robotTaskVo.setToLaneId(locationDO.getLaneId());
|
||||
robotTaskVo.setToLocationNumber(locationDO.getLocationNumber());
|
||||
robotTaskVo.setToMapItemId(locationDO.getMapItemId());
|
||||
releaseMapItemIds.add(locationDO.getMapItemId());
|
||||
} else {
|
||||
WareHouseLocationDO wareHouseLocationDO =
|
||||
locationMapper.selectByTypeAndId(LocationUseStatusEnum.NO.getType(), robotTaskVo.getReleaseType()
|
||||
, robotTaskVo.getReleaseId(), locationIds, null, takeMapItemIds, laneIds, areaIds);
|
||||
robotTaskVo.setToLocationNo(wareHouseLocationDO.getLocationNo());
|
||||
robotTaskVo.setToLocationId(wareHouseLocationDO.getId());
|
||||
robotTaskVo.setToLocationStorey(wareHouseLocationDO.getLocationStorey());
|
||||
robotTaskVo.setToLaneId(wareHouseLocationDO.getLaneId());
|
||||
robotTaskVo.setToLocationNumber(wareHouseLocationDO.getLocationNumber());
|
||||
robotTaskVo.setToMapItemId(wareHouseLocationDO.getMapItemId());
|
||||
releaseMapItemIds.add(wareHouseLocationDO.getMapItemId());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -213,6 +213,7 @@ zn:
|
||||
send_robot_init_pose: true # 是否为发送默认的车辆所在地图和点位
|
||||
restore_task_restart: false # 恢复任务是否全部重新执行 true:全部重新开始
|
||||
synchronous_all_map_node: 500 # 点位信息每次发送的数据量
|
||||
task_not_check: true # 创建任务不校验
|
||||
|
||||
|
||||
#海康威视的相关配置
|
||||
|
@ -248,6 +248,7 @@ zn:
|
||||
send_robot_init_pose: true # 是否为发送默认的车辆所在地图和点位
|
||||
restore_task_restart: true # 恢复任务是否全部重新执行 true:全部重新开始
|
||||
synchronous_all_map_node: 500 # 点位信息每次发送的数据量
|
||||
task_not_check: true # 创建任务不校验
|
||||
|
||||
logging:
|
||||
file:
|
||||
|
@ -241,6 +241,7 @@ zn:
|
||||
send_robot_init_pose: true # 是否为发送默认的车辆所在地图和点位
|
||||
restore_task_restart: false # 恢复任务是否全部重新执行 true:全部重新开始
|
||||
synchronous_all_map_node: 500 # 点位信息每次发送的数据量
|
||||
task_not_check: true # 创建任务不校验
|
||||
|
||||
#海康威视的相关配置
|
||||
isc:
|
||||
|
Loading…
Reference in New Issue
Block a user