This commit is contained in:
cbs 2025-06-16 16:25:53 +08:00
parent fc34d7f3b8
commit 41bf5bed58
21 changed files with 269 additions and 71 deletions

View File

@ -13,6 +13,7 @@ import java.util.List;
@AllArgsConstructor @AllArgsConstructor
public class PathToRobotChangeXYArgDTO { public class PathToRobotChangeXYArgDTO {
private List<PathToRobotChangeXYArgMovePoseDTO> pose2ds; private List<PathToRobotChangeXYArgMovePoseDTO> pose2ds;
private PathToRobotChangeXYArgMovePoseDTO pose2d;
private PathToRobotChangeXYArgPoseDTO backPose; private PathToRobotChangeXYArgPoseDTO backPose;
private PathToRobotChangeXYArgPoseDTO cargoPose; private PathToRobotChangeXYArgPoseDTO cargoPose;
private Double height; private Double height;

View File

@ -23,11 +23,14 @@ public class CommonApiImpl implements CommonApi {
try { try {
String str = JSON.toJSONString(obj); String str = JSON.toJSONString(obj);
mqttUtils.pub(topic, JSON.toJSONString(obj)); mqttUtils.pub(topic, JSON.toJSONString(obj));
/*if (str.length() > 510) { if(topic.equals("AGV_POSE")) {
return;
}
if (str.length() > 510) {
log.info("MQTT消息发送成功topic :{}, 内容 :{}",topic, str.substring(0, 500)); log.info("MQTT消息发送成功topic :{}, 内容 :{}",topic, str.substring(0, 500));
}else { }else {
log.info("MQTT消息发送成功topic :{}, 内容 :{}",topic, str); log.info("MQTT消息发送成功topic :{}, 内容 :{}",topic, str);
}*/ }
} catch (MqttException e) { } catch (MqttException e) {
log.info("MQTT消息发送异常 :{}",e); log.info("MQTT消息发送异常 :{}",e);
} }
@ -37,11 +40,14 @@ public class CommonApiImpl implements CommonApi {
public void commonMethodStr(String str, String topic) { public void commonMethodStr(String str, String topic) {
try { try {
mqttUtils.pub(topic, str); mqttUtils.pub(topic, str);
/*if (str.length() > 510) { if(topic.equals("AGV_POSE")) {
return;
}
if (str.length() > 510) {
log.info("MQTT消息发送成功topic :{}, 内容 :{}",topic, str.substring(0, 500)); log.info("MQTT消息发送成功topic :{}, 内容 :{}",topic, str.substring(0, 500));
}else { }else {
log.info("MQTT消息发送成功topic :{}, 内容 :{}",topic, str); log.info("MQTT消息发送成功topic :{}, 内容 :{}",topic, str);
}*/ }
} catch (MqttException e) { } catch (MqttException e) {
log.info("MQTT消息发送异常 :{}",e); log.info("MQTT消息发送异常 :{}",e);
} }

View File

@ -33,9 +33,10 @@ management:
# MQTT # MQTT
mqtt: mqtt:
host: tcp://123.57.12.40:1883 # host: tcp://123.57.12.40:1883
# host: tcp://127.0.0.1:1883 # host: tcp://127.0.0.1:1883
# host: tcp://10.10.7.116:1883 # host: tcp://10.10.7.116:1883
host: tcp://10.10.7.114:1883
username: adminuser username: adminuser
password: adminuser password: adminuser
qos: 2 qos: 2

View File

@ -140,8 +140,9 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
if (!RobotStatusCodeEnum.SUCCESS.getType().equals(robotCompleteTaskDTO.getStatusCode())) { if (!RobotStatusCodeEnum.SUCCESS.getType().equals(robotCompleteTaskDTO.getStatusCode())) {
log.info("车机上报异常 :{}", JSON.toJSONString(robotCompleteTaskDTO)); log.info("车机上报异常 :{}", JSON.toJSONString(robotCompleteTaskDTO));
closeTask(robotCompleteTaskDTO);//todo 取不了和放不了的异常 //todo 取不了和放不了的异常
redisUtil.del(robotDoingActionKey); redisUtil.del(robotDoingActionKey);
closeTask(robotCompleteTaskDTO);
return; return;
} }
@ -396,6 +397,12 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
*/ */
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void closeTask(RobotCompleteTaskDTO robotCompleteTaskDTO) { public void closeTask(RobotCompleteTaskDTO robotCompleteTaskDTO) {
if (RobotStatusCodeEnum.EXCEEDING_SECONDS.getType().equals(robotCompleteTaskDTO.getStatusCode())) {
doTaskContinue(robotCompleteTaskDTO);
return;
}
PPCloseOrder(robotCompleteTaskDTO); PPCloseOrder(robotCompleteTaskDTO);
// taskService.closeTaskDetail(robotCompleteTaskDTO.getOrderId().toString(),robotCompleteTaskDTO.getMac()); // taskService.closeTaskDetail(robotCompleteTaskDTO.getOrderId().toString(),robotCompleteTaskDTO.getMac());
String robotNo = robotInformationService.getRobotNoByMac(robotCompleteTaskDTO.getMac()); String robotNo = robotInformationService.getRobotNoByMac(robotCompleteTaskDTO.getMac());
@ -470,6 +477,12 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
warnMsgService.sendWarnMsgToWebsocket(warnMsg.getWarnMsg()); warnMsgService.sendWarnMsgToWebsocket(warnMsg.getWarnMsg());
} }
private void doTaskContinue(RobotCompleteTaskDTO robotCompleteTaskDTO) {
log.info("恢复任务");
String robotNo = robotInformationService.getRobotNoByMac(robotCompleteTaskDTO.getMac());
robotInformationService.doTaskContinue(robotNo, true);
}
/** /**
* 处理充电中 * 处理充电中
* *
@ -566,13 +579,17 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.GO_TAKE.getType()); robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.GO_TAKE.getType());
} else if (CommandTypeEnum.WORK_PICK_UP_GOODS.getType().equals(commandType)) { } else if (CommandTypeEnum.WORK_PICK_UP_GOODS.getType().equals(commandType)) {
logOne.setActionMsg("车辆正在取货"); logOne.setActionMsg("车辆正在取货");
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.TAKEING.getType()); if (!RobotTaskStageEnum.GO_RELEASE.getType().equals(taskStage)) {
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.TAKEING.getType());
}
} else if (CommandTypeEnum.WORK_DROP_OFF_GOODS.getType().equals(commandType)) { } else if (CommandTypeEnum.WORK_DROP_OFF_GOODS.getType().equals(commandType)) {
logOne.setActionMsg("车辆正在放货"); logOne.setActionMsg("车辆正在放货");
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.RELEASEING.getType()); robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.RELEASEING.getType());
} else if (CommandTypeEnum.MOVE_POSES.getType().equals(commandType)) { } else if (CommandTypeEnum.MOVE_POSES.getType().equals(commandType)) {
logOne.setActionMsg("车辆正在前往" + robotTaskDetailDO.getToLocationNo() + "放货"); logOne.setActionMsg("车辆正在前往" + robotTaskDetailDO.getToLocationNo() + "放货");
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.GO_RELEASE.getType()); if (!RobotTaskStageEnum.DONE.getType().equals(taskStage)) {
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.GO_RELEASE.getType());
}
} }
} else if (PathTaskTypeEnum.CHARGE.getType().equals(robotCompleteTaskDTO.getOrderType()) } else if (PathTaskTypeEnum.CHARGE.getType().equals(robotCompleteTaskDTO.getOrderType())
@ -604,7 +621,9 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.GO_TAKE.getType()); robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.GO_TAKE.getType());
} else if (CommandTypeEnum.WORK_PICK_UP_GOODS.getType().equals(commandType)) { } else if (CommandTypeEnum.WORK_PICK_UP_GOODS.getType().equals(commandType)) {
logOne.setActionMsg("车辆正在取货"); logOne.setActionMsg("车辆正在取货");
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.TAKEING.getType()); if (!RobotTaskStageEnum.DONE.getType().equals(taskStage)) {
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.TAKEING.getType());
}
} }
} else if (PathTaskTypeEnum.RELEASE.getType().equals(robotCompleteTaskDTO.getOrderType())) { } else if (PathTaskTypeEnum.RELEASE.getType().equals(robotCompleteTaskDTO.getOrderType())) {
@ -613,7 +632,9 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.GO_RELEASE.getType()); robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.GO_RELEASE.getType());
} else if (CommandTypeEnum.WORK_DROP_OFF_GOODS.getType().equals(commandType)) { } else if (CommandTypeEnum.WORK_DROP_OFF_GOODS.getType().equals(commandType)) {
logOne.setActionMsg("车辆正在放货"); logOne.setActionMsg("车辆正在放货");
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.RELEASEING.getType()); if (!RobotTaskStageEnum.DONE.getType().equals(taskStage)) {
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.RELEASEING.getType());
}
} }
} }

View File

@ -4,9 +4,15 @@ import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
import cn.iocoder.yudao.module.system.api.robot.vo.RobotWorkStatusDTO; import cn.iocoder.yudao.module.system.api.robot.vo.RobotWorkStatusDTO;
import cn.iocoder.yudao.module.system.constant.robot.RobotExecutionStateConstant; import cn.iocoder.yudao.module.system.constant.robot.RobotExecutionStateConstant;
import cn.iocoder.yudao.module.system.controller.admin.log.vo.RobotOperationLogSaveReqVO; import cn.iocoder.yudao.module.system.controller.admin.log.vo.RobotOperationLogSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDetailDO;
import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotTaskDetailMapper;
import cn.iocoder.yudao.module.system.enums.common.ZeroOneEnum; import cn.iocoder.yudao.module.system.enums.common.ZeroOneEnum;
import cn.iocoder.yudao.module.system.enums.path.PathIsReachEnum; import cn.iocoder.yudao.module.system.enums.path.PathIsReachEnum;
import cn.iocoder.yudao.module.system.enums.robot.CommandTypeEnum; import cn.iocoder.yudao.module.system.enums.robot.CommandTypeEnum;
import cn.iocoder.yudao.module.system.enums.robot.RobotTaskDetailStatusEnum;
import cn.iocoder.yudao.module.system.enums.robot.RobotTaskTypeEnum;
import cn.iocoder.yudao.module.system.enums.robot.task.RobotTaskStageEnum;
import cn.iocoder.yudao.module.system.enums.robot.task.WorkProgressEnum;
import cn.iocoder.yudao.module.system.service.log.RobotOperationLogService; import cn.iocoder.yudao.module.system.service.log.RobotOperationLogService;
import cn.iocoder.yudao.module.system.service.path.PathPlanningService; import cn.iocoder.yudao.module.system.service.path.PathPlanningService;
import cn.iocoder.yudao.module.system.service.robot.RobotInformationService; import cn.iocoder.yudao.module.system.service.robot.RobotInformationService;
@ -32,6 +38,9 @@ public class RobotWorkStatusApiImpl implements RobotWorkStatusApi {
@Resource @Resource
private PathPlanningService pathPlanningService; private PathPlanningService pathPlanningService;
@Autowired
private RobotTaskDetailMapper robotTaskDetailMapper;
@Override @Override
public void robotWorkStatus(String message) { public void robotWorkStatus(String message) {
log.info("111111作业实时行为上报: {}", message); log.info("111111作业实时行为上报: {}", message);
@ -61,6 +70,59 @@ public class RobotWorkStatusApiImpl implements RobotWorkStatusApi {
, data.getCommandType(), PathIsReachEnum.END_WORK.getType()); , data.getCommandType(), PathIsReachEnum.END_WORK.getType());
} }
if (CommandTypeEnum.WORK_PICK_UP_GOODS.getType().equals(data.getCommandType())
&& RobotExecutionStateConstant.DONE.equals(Integer.valueOf(data.getExecutionState()))
&& WorkProgressEnum.FORK_OFFSET.getType().equals(data.getWorkProgress())) {
setTakeDone(data.getOrderId());
}else if (CommandTypeEnum.WORK_DROP_OFF_GOODS.getType().equals(data.getCommandType())
&& RobotExecutionStateConstant.DONE.equals(Integer.valueOf(data.getExecutionState()))
&& WorkProgressEnum.FORK_OFFSET.getType().equals(data.getWorkProgress())) {
setReleaseDone(data.getOrderId());
}
} }
private void setReleaseDone(String orderId) {
RobotTaskDetailDO data = new RobotTaskDetailDO();
data.setId(Long.valueOf(orderId));
data.setTaskStage(RobotTaskStageEnum.DONE.getType());
data.setTaskStatus(RobotTaskDetailStatusEnum.DONE.getType());
robotTaskDetailMapper.updateRobotDetailById(data);
}
private void setTakeDone(String orderId) {
RobotTaskDetailDO robotTaskDetailDO = robotTaskDetailMapper.selectById(orderId);
if (RobotTaskTypeEnum.TAKE_RELEASE.getType().equals(robotTaskDetailDO.getTaskType())) {
RobotTaskDetailDO data = new RobotTaskDetailDO();
data.setId(robotTaskDetailDO.getId());
data.setTaskStage(RobotTaskStageEnum.GO_RELEASE.getType());
robotTaskDetailMapper.updateRobotDetailById(data);
}else if (RobotTaskTypeEnum.TAKE.getType().equals(robotTaskDetailDO.getTaskType())){
RobotTaskDetailDO data = new RobotTaskDetailDO();
data.setId(robotTaskDetailDO.getId());
data.setTaskStage(RobotTaskStageEnum.DONE.getType());
data.setTaskStatus(RobotTaskDetailStatusEnum.DONE.getType());
robotTaskDetailMapper.updateRobotDetailById(data);
}
}
} }

View File

@ -0,0 +1,34 @@
package cn.iocoder.yudao.module.system.config.poperties;
import cn.iocoder.yudao.module.system.config.poperties.dto.RobotConfig;
import cn.iocoder.yudao.module.system.config.poperties.dto.RobotDoingAction;
import cn.iocoder.yudao.module.system.config.poperties.dto.Task;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;
@Data
@RefreshScope
@Component
@ConfigurationProperties(prefix = "zn")
public class ZnConfigConstant {
private String taskNo;
private String moveNo;
private String chargeNo;
private String cameraSecretKey;
private Boolean doCycle;
private Boolean laneAutoMove;
private Long robotPositionCacheTime;
private Boolean cycleDoAutoMove;
private String fullElectricity;
private String taskNeedSingle;
private String locationNumberReduce;
private RobotDoingAction robotDoingAction;
private Task task ;
private RobotConfig robotConfig;
private Boolean openRateLimiter;
private Boolean isSimulation ;
private Boolean sendRobotInitPose;
private Boolean synchronousAllMapNode;
}

View File

@ -0,0 +1,9 @@
package cn.iocoder.yudao.module.system.config.poperties.dto;
import lombok.Data;
@Data
public class RobotConfig {
private Double offsetHeight;
private Double defaultTrayHeight;
}

View File

@ -0,0 +1,8 @@
package cn.iocoder.yudao.module.system.config.poperties.dto;
import lombok.Data;
@Data
public class RobotDoingAction {
private Long doingActionCacheTime;
}

View File

@ -0,0 +1,9 @@
package cn.iocoder.yudao.module.system.config.poperties.dto;
import lombok.Data;
@Data
public class Task {
private Boolean checkSkuInfo;
private Long taskChcheTime;
}

View File

@ -153,7 +153,7 @@ public class RobotInformationController {
@Operation(summary = "恢复任务") @Operation(summary = "恢复任务")
@PreAuthorize("@ss.hasPermission('robot:information:doTaskContinue')") @PreAuthorize("@ss.hasPermission('robot:information:doTaskContinue')")
public CommonResult<Boolean> doTaskContinue(@RequestParam("robotNo") String robotNo) { public CommonResult<Boolean> doTaskContinue(@RequestParam("robotNo") String robotNo) {
informationService.doTaskContinue(robotNo); informationService.doTaskContinue(robotNo,false);
return success(true); return success(true);
} }

View File

@ -13,7 +13,8 @@ public enum RobotStatusCodeEnum {
FAIL_JSON("10001","入参JSON解析失败"), FAIL_JSON("10001","入参JSON解析失败"),
FAIL_SYSTEM("10002","系统内部异常"), FAIL_SYSTEM("10002","系统内部异常"),
FAIL_UN_KNOW("10003","未知错误"), FAIL_UN_KNOW("10003","未知错误"),
FAIL_UN_SUPPOD("10004","未支持该指令执行"); FAIL_UN_SUPPOD("10004","未支持该指令执行"),
EXCEEDING_SECONDS("10017","PP发送的任务超过5秒到达");
/** /**
* 类型 * 类型
*/ */

View File

@ -0,0 +1,17 @@
package cn.iocoder.yudao.module.system.enums.robot.task;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum WorkProgressEnum {
FORK_OFFSET("FORK_OFFSET","取放货");
/**
* 类型
*/
private final String type;
private final String msg;
}

View File

@ -84,9 +84,11 @@ public class RobotJob {
RLock lock = redissonUtils.getLock(RobotCacheLockEnum.ROBOT_TASK_DISTRIBUTE_LOCK.getKey()); RLock lock = redissonUtils.getLock(RobotCacheLockEnum.ROBOT_TASK_DISTRIBUTE_LOCK.getKey());
if (lock.tryLock()){ if (lock.tryLock()){
try { try {
log.info("----下发自动充电任务----"); log.info("----111111下发自动充电任务----");
autoChargeService.autoChargeJob(); autoChargeService.autoChargeJob();
} finally { } catch (Exception e) {
log.info("自动充电异常 :{}",e);
} finally {
lock.unlock(); lock.unlock();
} }
}else { }else {
@ -105,9 +107,11 @@ public class RobotJob {
RLock lock = redissonUtils.getLock(RobotCacheLockEnum.ROBOT_TASK_DISTRIBUTE_LOCK.getKey()); RLock lock = redissonUtils.getLock(RobotCacheLockEnum.ROBOT_TASK_DISTRIBUTE_LOCK.getKey());
if (lock.tryLock()){ if (lock.tryLock()){
try { try {
log.info("----下发任务给路径规划----"); log.info("----111111下发任务给路径规划----");
robotPathPlanningService.sendTaskToPP(); robotPathPlanningService.sendTaskToPP();
} finally { } catch (Exception e) {
log.info("----分配任务异常---- :{}",e);
} finally {
lock.unlock(); lock.unlock();
} }
}else { }else {
@ -127,12 +131,16 @@ public class RobotJob {
RLock lock = redissonUtils.getLock(RobotCacheLockEnum.ROBOT_TASK_ADD_LOCK.getKey()); RLock lock = redissonUtils.getLock(RobotCacheLockEnum.ROBOT_TASK_ADD_LOCK.getKey());
if (lock.tryLock()){ if (lock.tryLock()){
try { try {
log.info("----创建循环任务----"); log.info("----111111创建循环任务----");
cycleService.cycleTaskJob(); cycleService.cycleTaskJob();
} finally { } catch (Exception e) {
log.error("创建循环任务异常 :{}",e);
} finally {
lock.unlock(); lock.unlock();
} }
}else { }else {
log.info("下发任务给路径规划未获取到锁"); log.info("下发任务给路径规划未获取到锁");
throw exception(REDISSON_NOT_OBTAIN_LOCK); throw exception(REDISSON_NOT_OBTAIN_LOCK);
@ -173,7 +181,9 @@ public class RobotJob {
log.info("----统计时长开始----"); log.info("----统计时长开始----");
TenantContextHolder.setTenantId(1L); TenantContextHolder.setTenantId(1L);
robotWorkingHoursStatisticsService.statisticsRobotDuration(); robotWorkingHoursStatisticsService.statisticsRobotDuration();
} finally { } catch (Exception e) {
log.info("统计工作时长异常 :{}",e);
} finally {
lock.unlock(); lock.unlock();
} }
}else { }else {

View File

@ -11,12 +11,14 @@ import cn.iocoder.yudao.module.system.util.redis.RedisUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
@EnableScheduling @EnableScheduling
@Component @Component

View File

@ -162,7 +162,7 @@ public interface RobotInformationService extends IService<RobotInformationDO> {
* 继续做任务 * 继续做任务
* @param robotNo * @param robotNo
*/ */
void doTaskContinue(String robotNo); void doTaskContinue(String robotNo,Boolean isRobot);
/** /**
* *

View File

@ -162,13 +162,10 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
@Value("${zn.is_simulation:false}") @Value("${zn.is_simulation:false}")
private Boolean isSimulation; private Boolean isSimulation;
@Value("${zn.restore_task_restart:true}")
private Boolean restoreTaskRestart;
@Value("${zn.full_electricity:95}") @Value("${zn.full_electricity:95}")
private String fullElectricity; private String fullElectricity;
@Value("${zn.path_planning.task_chche_time:604800}") @Value("${zn.task.task_chche_time:604800}")
private Long taskChcheTime; private Long taskChcheTime;
@Resource @Resource
@ -369,17 +366,17 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
validateInformationExists(updateReqVO.getId()); validateInformationExists(updateReqVO.getId());
RobotInformationDO robotInformationDO = informationMapper.selectById(updateReqVO.getId()); RobotInformationDO robotInformationDO = informationMapper.selectById(updateReqVO.getId());
if (RobotStatusEnum.STAND_BY.getType().equals(robotInformationDO.getRobotStatus()) ) { if (RobotStatusEnum.STAND_BY.getType().equals(robotInformationDO.getRobotStatus())) {
PositionMapItemDO positionMapItem = positionMapItemMapper.selectOne(new LambdaQueryWrapper<PositionMapItemDO>() PositionMapItemDO positionMapItem = positionMapItemMapper.selectOne(new LambdaQueryWrapper<PositionMapItemDO>()
.eq(PositionMapItemDO::getRobotNo, robotInformationDO.getRobotNo()) .eq(PositionMapItemDO::getRobotNo, robotInformationDO.getRobotNo())
.eq(PositionMapItemDO::getUseStatus, UseStatusEnum.USEING.getType()) .eq(PositionMapItemDO::getUseStatus, UseStatusEnum.USEING.getType())
.eq(PositionMapItemDO::getType, PositionMapItemEnum.STOP.getType()) .eq(PositionMapItemDO::getType, PositionMapItemEnum.STOP.getType())
.last("limit 1")); .last("limit 1"));
if (ObjectUtil.isNotEmpty(positionMapItem) && ObjectUtil.isEmpty(updateReqVO.getFloorAreaJson())) { if (ObjectUtil.isNotEmpty(positionMapItem) && ObjectUtil.isEmpty(updateReqVO.getFloorAreaJson())) {
log.info("车辆 :{} ,停靠在 :{},",robotInformationDO.getRobotNo(), positionMapItem.getPositionMapId()); log.info("车辆 :{} ,停靠在 :{},", robotInformationDO.getRobotNo(), positionMapItem.getPositionMapId());
throw exception(ROBOT_PART_AREA); throw exception(ROBOT_PART_AREA);
}else if (ObjectUtil.isNotEmpty(positionMapItem) && ObjectUtil.isNotEmpty(updateReqVO.getFloorAreaJson()) } else if (ObjectUtil.isNotEmpty(positionMapItem) && ObjectUtil.isNotEmpty(updateReqVO.getFloorAreaJson())
&& !updateReqVO.getFloorAreaJson().contains(positionMapItem.getPositionMapId())) { && !updateReqVO.getFloorAreaJson().contains(positionMapItem.getPositionMapId())) {
throw exception(ROBOT_PART_AREA); throw exception(ROBOT_PART_AREA);
} }
} }
@ -1167,7 +1164,7 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void doTaskContinue(String robotNo) { public void doTaskContinue(String robotNo, Boolean isRobot) {
RobotTaskDetailActionLogDO actionLog = taskDetailActionLogService.getOriginalLastTaskByRobotNo(robotNo); RobotTaskDetailActionLogDO actionLog = taskDetailActionLogService.getOriginalLastTaskByRobotNo(robotNo);
if (ObjectUtil.isEmpty(actionLog)) { if (ObjectUtil.isEmpty(actionLog)) {
@ -1208,16 +1205,20 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
TaskToPathPlanningDTO pathPlanning = JSONUtil.toBean((String) o, TaskToPathPlanningDTO.class); TaskToPathPlanningDTO pathPlanning = JSONUtil.toBean((String) o, TaskToPathPlanningDTO.class);
RLock lock = redissonUtils.getLock(RobotCacheLockEnum.ROBOT_TASK_DISTRIBUTE_LOCK.getKey()); if (isRobot) {
if (lock.tryLock()) { resendToPP(pathPlanning, actionLog, robotInformationDO);
try {
resendToPP(pathPlanning, actionLog, robotInformationDO);
} finally {
lock.unlock();
}
} else { } else {
log.info("下发任务给路径规划未获取到锁"); RLock lock = redissonUtils.getLock(RobotCacheLockEnum.ROBOT_TASK_DISTRIBUTE_LOCK.getKey());
throw exception(REDISSON_NOT_OBTAIN_LOCK); if (lock.tryLock()) {
try {
resendToPP(pathPlanning, actionLog, robotInformationDO);
} finally {
lock.unlock();
}
} else {
log.info("下发任务给路径规划未获取到锁");
throw exception(REDISSON_NOT_OBTAIN_LOCK);
}
} }
UserOperationLogSaveReqVO operationLog = UserOperationLogSaveReqVO.builder() UserOperationLogSaveReqVO operationLog = UserOperationLogSaveReqVO.builder()
@ -1254,9 +1255,7 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
List<TaskRobotNoLimittationAreaDTO> robotNoLimitions = Arrays.asList(taskRobotNoLimittationAreaDTO); List<TaskRobotNoLimittationAreaDTO> robotNoLimitions = Arrays.asList(taskRobotNoLimittationAreaDTO);
pathPlanning.setRobotNoLimitationAreaDTOS(robotNoLimitions); pathPlanning.setRobotNoLimitationAreaDTOS(robotNoLimitions);
if (!isSimulation || !restoreTaskRestart) { resendToPPData(pathPlanning, actionLog, robotInformationDO, false);
resendToPPData(pathPlanning, actionLog, robotInformationDO, false);
}
List<TaskToPathPlanningDTO> pathPlanningList = new ArrayList<>(); List<TaskToPathPlanningDTO> pathPlanningList = new ArrayList<>();
pathPlanningList.add(pathPlanning); pathPlanningList.add(pathPlanning);
@ -1329,27 +1328,35 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
Object cargoDetected = redisUtil.get(cargoDetectedKey); Object cargoDetected = redisUtil.get(cargoDetectedKey);
if (ObjectUtil.isNotEmpty(cargoDetected) && RobotStatusCodeConstant.CARGO_DETECTED.equals(Boolean.parseBoolean(String.valueOf(cargoDetected)))) { if (ObjectUtil.isNotEmpty(cargoDetected) && RobotStatusCodeConstant.CARGO_DETECTED.equals(Boolean.parseBoolean(String.valueOf(cargoDetected)))) {
//说明取货完成 //说明取货完成
pathPlanning.setTakeLevel(null); takeDone(pathPlanning,robotTaskDetail);
pathPlanning.setTakeGroupId(null); } else if (!RobotTaskStageEnum.UN_START.getType().equals(robotTaskDetail.getTaskStage())
pathPlanning.setTakeLocationNumber(null); && !RobotTaskStageEnum.GO_TAKE.getType().equals(robotTaskDetail.getTaskStage())
pathPlanning.setTakePointId(null); && !RobotTaskStageEnum.TAKEING.getType().equals(robotTaskDetail.getTaskStage())) {
pathPlanning.setTakeOffsetHeight(null); takeDone(pathPlanning,robotTaskDetail);
pathPlanning.setTakeOffsetHeight(null);
pathPlanning.setTaskType(PathTaskTypeToRobotEnum.DROP_OFF_GOODS.getType());
WareHouseLocationDO wareHouseLocation = wareHouseLocationMapper.selectById(robotTaskDetail.getFromLocationId());
if (wareHouseLocation.getTaskId().equals(robotTaskDetail.getTakeId()) && LocationLockEnum.NO.getType().equals(wareHouseLocation.getLocationLock())) {
wareHouseLocation.setSkuInfo(null);
wareHouseLocation.setSkuNumber(0L);
wareHouseLocation.setLocationLock(LocationLockEnum.YES.getType());
wareHouseLocation.setLocationUseStatus(LocationUseStatusEnum.NO.getType());
wareHouseLocationMapper.updateById(wareHouseLocation);
}
} else { } else {
takeCheck(robotTaskDetail.getFromLocationId(), robotTaskDetail.getRobotTaskId(), isRemote); takeCheck(robotTaskDetail.getFromLocationId(), robotTaskDetail.getRobotTaskId(), isRemote);
} }
releaseCheck(robotTaskDetail.getToLocationId(), robotTaskDetail.getRobotTaskId()); releaseCheck(robotTaskDetail.getToLocationId(), robotTaskDetail.getRobotTaskId());
} }
public void takeDone(TaskToPathPlanningDTO pathPlanning,RobotTaskDetailDO robotTaskDetail) {
pathPlanning.setTakeLevel(null);
pathPlanning.setTakeGroupId(null);
pathPlanning.setTakeLocationNumber(null);
pathPlanning.setTakePointId(null);
pathPlanning.setTakeOffsetHeight(null);
pathPlanning.setTakeOffsetHeight(null);
pathPlanning.setTaskType(PathTaskTypeToRobotEnum.DROP_OFF_GOODS.getType());
WareHouseLocationDO wareHouseLocation = wareHouseLocationMapper.selectById(robotTaskDetail.getFromLocationId());
if (wareHouseLocation.getTaskId().equals(robotTaskDetail.getTakeId()) && LocationLockEnum.NO.getType().equals(wareHouseLocation.getLocationLock())) {
wareHouseLocation.setSkuInfo(null);
wareHouseLocation.setSkuNumber(0L);
wareHouseLocation.setLocationLock(LocationLockEnum.YES.getType());
wareHouseLocation.setLocationUseStatus(LocationUseStatusEnum.NO.getType());
wareHouseLocationMapper.updateById(wareHouseLocation);
}
}
/** /**
* 校验放货任务 * 校验放货任务
* *

View File

@ -193,13 +193,11 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper, RobotTask
@Value("${zn.task_not_check:true}") @Value("${zn.task_not_check:true}")
private Boolean taskNotCheck; private Boolean taskNotCheck;
@Value("${zn.is_simulation:false}")
private Boolean isSimulation;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Long createTask(RobotTaskSaveReqVO createReqVO) throws InterruptedException { public Long createTask(RobotTaskSaveReqVO createReqVO) throws InterruptedException {
if (taskNotCheck && isSimulation) { if (taskNotCheck) {
robotSimulationService.createTask(createReqVO); robotSimulationService.createTask(createReqVO);
return 1L; return 1L;
} }

View File

@ -90,11 +90,12 @@ public class CycleServiceImpl implements CycleService {
Map<Long, List<RobotTaskDetailDO>> taskIdMap = Map<Long, List<RobotTaskDetailDO>> taskIdMap =
detailDOS.stream().collect(Collectors.groupingBy(RobotTaskDetailDO::getRobotTaskId)); detailDOS.stream().collect(Collectors.groupingBy(RobotTaskDetailDO::getRobotTaskId));
String incrementByKey = redisUtil.getIncrementByKey(RobotCacheLockEnum.TASK_NO.getKey());
List<RobotTaskDO> taskDOList = new ArrayList<>(); List<RobotTaskDO> taskDOList = new ArrayList<>();
List<RobotTaskDetailDO> taskDetailList = new LinkedList<>(); List<RobotTaskDetailDO> taskDetailList = new LinkedList<>();
for (RobotTaskDO v : taskList) { for (RobotTaskDO v : taskList) {
String incrementByKey = redisUtil.getIncrementByKey(RobotCacheLockEnum.TASK_NO.getKey());
RobotTaskDO taskData = getTaskData(incrementByKey, v); RobotTaskDO taskData = getTaskData(incrementByKey, v);
List<RobotTaskDetailDO> taskDetailDOS = getTaskDetailData(taskData,taskIdMap,v.getId()); List<RobotTaskDetailDO> taskDetailDOS = getTaskDetailData(taskData,taskIdMap,v.getId());
taskDOList.add(taskData); taskDOList.add(taskData);
@ -102,10 +103,21 @@ public class CycleServiceImpl implements CycleService {
v.setRemainingCycleNumber(0l); v.setRemainingCycleNumber(0l);
} }
taskMapper.insertBatch(taskDOList); taskMapper.insert(taskDOList);
taskMapper.updateById(taskList); taskMapper.updateById(taskList);
Collections.reverse(taskDetailList);
taskDetailMapper.insertBatch(taskDetailList); List<RobotTaskDetailDO> moves = taskDetailList.stream().filter(v -> RobotTaskTypeEnum.MOVE_TO_POINT.getType().equals(v.getTaskType())).collect(Collectors.toList());
List<RobotTaskDetailDO> takes = taskDetailList.stream().filter(v -> !RobotTaskTypeEnum.MOVE_TO_POINT.getType().equals(v.getTaskType())).collect(Collectors.toList());
List<RobotTaskDetailDO> taskDetails= new LinkedList<>();
if (ObjectUtil.isNotEmpty(moves)) {
taskDetails.addAll(moves);
}
if (ObjectUtil.isNotEmpty(takes)) {
Collections.reverse(takes);
taskDetails.addAll(takes);
}
taskDetailMapper.insert(taskDetails);
List<Long> fromLocationIds = taskDetailList.stream().map(RobotTaskDetailDO::getFromLocationId).collect(Collectors.toList()); List<Long> fromLocationIds = taskDetailList.stream().map(RobotTaskDetailDO::getFromLocationId).collect(Collectors.toList());
List<Long> toLocationIds = taskDetailList.stream().map(RobotTaskDetailDO::getToLocationId).collect(Collectors.toList()); List<Long> toLocationIds = taskDetailList.stream().map(RobotTaskDetailDO::getToLocationId).collect(Collectors.toList());
@ -118,7 +130,7 @@ public class CycleServiceImpl implements CycleService {
locationMapper.updateLocationLockList(list, -1l, LocationLockEnum.NO.getType()); locationMapper.updateLocationLockList(list, -1l, LocationLockEnum.NO.getType());
}); });
List<RobotTaskDetailAddVO> bean = BeanUtils.toBean(taskDetailList, RobotTaskDetailAddVO.class); List<RobotTaskDetailAddVO> bean = BeanUtils.toBean(taskDetails, RobotTaskDetailAddVO.class);
Map<Long, List<RobotTaskDetailAddVO>> taskDetailMap = Map<Long, List<RobotTaskDetailAddVO>> taskDetailMap =
bean.stream().collect(Collectors.groupingBy(RobotTaskDetailAddVO::getRobotTaskId)); bean.stream().collect(Collectors.groupingBy(RobotTaskDetailAddVO::getRobotTaskId));
taskDetailMap.forEach((k,v) ->{ taskDetailMap.forEach((k,v) ->{

View File

@ -92,7 +92,7 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
.in(RobotInformationDO::getRobotStatus, RobotStatusEnum.STAND_BY.getType(), RobotStatusEnum.CHARGE.getType()) .in(RobotInformationDO::getRobotStatus, RobotStatusEnum.STAND_BY.getType(), RobotStatusEnum.CHARGE.getType())
.eq(RobotInformationDO::getRobotTaskModel, RobotTaskModelEnum.NORMAL.getType())); .eq(RobotInformationDO::getRobotTaskModel, RobotTaskModelEnum.NORMAL.getType()));
if (robots.isEmpty()) { if (ObjectUtil.isEmpty(robots)) {
log.info("暂无空闲的机器人"); log.info("暂无空闲的机器人");
return pair; return pair;
} }

View File

@ -95,7 +95,7 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService {
@Value("${zn.robot_config.offset_height}") @Value("${zn.robot_config.offset_height}")
private Double offsetHeight; private Double offsetHeight;
@Value("${zn.path_planning.task_chche_time:604800}") @Value("${zn.task.task_chche_time:604800}")
private Long taskChcheTime; private Long taskChcheTime;
@Value("${zn.move-no:MOVE}") @Value("${zn.move-no:MOVE}")
@ -148,8 +148,8 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService {
return; return;
} }
log.info("-------查找车子------ ,:{}",JSON.toJSONString(robots)); log.info("-------可以分配任务的车辆编号------ ,:{}",JSON.toJSONString(robots.stream().map(RobotInformationDO::getRobotNo).collect(Collectors.toList())));
log.info("-------查找任务------ ,:{}",JSON.toJSONString(taskDetailDOS)); log.info("-------需要执行的任务id------ ,:{}",JSON.toJSONString(taskDetailDOS.stream().map(RobotTaskDetailDO::getId).collect(Collectors.toList())));
distributeTasksToPP(robots, taskDetailDOS); distributeTasksToPP(robots, taskDetailDOS);
} }

View File

@ -238,16 +238,16 @@ zn:
priority_config: 50 #优先级 priority_config: 50 #优先级
task: #任务相关的配置 task: #任务相关的配置
check_sku_info: true #校验物料信息 check_sku_info: true #校验物料信息
task_chche_time: 1209600 #任务缓存的时间, 默认一星期
robot_config: #机器人取放货默认配置 robot_config: #机器人取放货默认配置
offset_height: 0.1 #叉起货需要在原来高度基础上偏移的高度 offset_height: 0.1 #叉起货需要在原来高度基础上偏移的高度
default_tray_height: 0.82 #默认每层高度 default_tray_height: 0.82 #默认每层高度
open_rate_limiter: true #是否开启限流 open_rate_limiter: true #是否开启限流
path_planning: path_planning:
task_chche_time: 1209600 #任务缓存的时间, 默认一星期 task_chche_time: 1209600 #任务缓存的时间, 默认一星期
is_simulation: true # 是否为仿真环境 is_simulation: false # 是否为仿真环境
send_robot_init_pose: true # 是否为发送默认的车辆所在地图和点位 send_robot_init_pose: true # 是否为发送默认的车辆所在地图和点位
restore_task_restart: true # 恢复任务是否全部重新执行 true:全部重新开始 # synchronous_all_map_node: 500 # 点位信息每次发送的数据量
synchronous_all_map_node: 500 # 点位信息每次发送的数据量
task_not_check: true # 创建任务不校验 task_not_check: true # 创建任务不校验
logging: logging: