取消任务校验

This commit is contained in:
cbs 2025-06-13 10:58:10 +08:00
parent 84b0106cc7
commit 6bb201eb04
16 changed files with 622 additions and 8 deletions

View File

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

View File

@ -18,6 +18,7 @@ public class PathToRobotDTO {
//这个实体类的信息,不能修改
//这个实体类的信息,不能修改
private String orderType;
private String timeStamp;
private Integer isCommandEnd;
private String robotNo;
private String commandType;

View File

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

View File

@ -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());

View File

@ -49,4 +49,7 @@ public class RobotTaskChcheConstant {
//机器人物料数量(拼接的是mac地址)
public static String ROBOT_TASK_SKU_INFO = "robot:task:sku:info";
//所有的车辆信息 获得到一个map key是 macvalue是具体信息
public static String ROBOT_ALL_INFORMATION = "robot:all:information";
}

View File

@ -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));*/
}
}
}

View File

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

View File

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

View File

@ -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}")

View File

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

View File

@ -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());

View File

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

View File

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

View File

@ -213,6 +213,7 @@ zn:
send_robot_init_pose: true # 是否为发送默认的车辆所在地图和点位
restore_task_restart: false # 恢复任务是否全部重新执行 true:全部重新开始
synchronous_all_map_node: 500 # 点位信息每次发送的数据量
task_not_check: true # 创建任务不校验
#海康威视的相关配置

View File

@ -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:

View 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: