优化
This commit is contained in:
parent
fc34d7f3b8
commit
41bf5bed58
@ -13,6 +13,7 @@ import java.util.List;
|
||||
@AllArgsConstructor
|
||||
public class PathToRobotChangeXYArgDTO {
|
||||
private List<PathToRobotChangeXYArgMovePoseDTO> pose2ds;
|
||||
private PathToRobotChangeXYArgMovePoseDTO pose2d;
|
||||
private PathToRobotChangeXYArgPoseDTO backPose;
|
||||
private PathToRobotChangeXYArgPoseDTO cargoPose;
|
||||
private Double height;
|
||||
|
@ -23,11 +23,14 @@ public class CommonApiImpl implements CommonApi {
|
||||
try {
|
||||
String str = 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));
|
||||
}else {
|
||||
log.info("MQTT消息发送成功topic :{}, 内容 :{}",topic, str);
|
||||
}*/
|
||||
}
|
||||
} catch (MqttException e) {
|
||||
log.info("MQTT消息发送异常 :{}",e);
|
||||
}
|
||||
@ -37,11 +40,14 @@ public class CommonApiImpl implements CommonApi {
|
||||
public void commonMethodStr(String str, String topic) {
|
||||
try {
|
||||
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));
|
||||
}else {
|
||||
log.info("MQTT消息发送成功topic :{}, 内容 :{}",topic, str);
|
||||
}*/
|
||||
}
|
||||
} catch (MqttException e) {
|
||||
log.info("MQTT消息发送异常 :{}",e);
|
||||
}
|
||||
|
@ -33,9 +33,10 @@ management:
|
||||
|
||||
# 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://10.10.7.116:1883
|
||||
host: tcp://10.10.7.114:1883
|
||||
username: adminuser
|
||||
password: adminuser
|
||||
qos: 2
|
||||
|
@ -140,8 +140,9 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
|
||||
|
||||
if (!RobotStatusCodeEnum.SUCCESS.getType().equals(robotCompleteTaskDTO.getStatusCode())) {
|
||||
log.info("车机上报异常 :{}", JSON.toJSONString(robotCompleteTaskDTO));
|
||||
closeTask(robotCompleteTaskDTO);//todo 取不了和放不了的异常
|
||||
//todo 取不了和放不了的异常
|
||||
redisUtil.del(robotDoingActionKey);
|
||||
closeTask(robotCompleteTaskDTO);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -396,6 +397,12 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void closeTask(RobotCompleteTaskDTO robotCompleteTaskDTO) {
|
||||
|
||||
if (RobotStatusCodeEnum.EXCEEDING_SECONDS.getType().equals(robotCompleteTaskDTO.getStatusCode())) {
|
||||
doTaskContinue(robotCompleteTaskDTO);
|
||||
return;
|
||||
}
|
||||
|
||||
PPCloseOrder(robotCompleteTaskDTO);
|
||||
// taskService.closeTaskDetail(robotCompleteTaskDTO.getOrderId().toString(),robotCompleteTaskDTO.getMac());
|
||||
String robotNo = robotInformationService.getRobotNoByMac(robotCompleteTaskDTO.getMac());
|
||||
@ -470,6 +477,12 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
|
||||
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());
|
||||
} else if (CommandTypeEnum.WORK_PICK_UP_GOODS.getType().equals(commandType)) {
|
||||
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)) {
|
||||
logOne.setActionMsg("车辆正在放货");
|
||||
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.RELEASEING.getType());
|
||||
} else if (CommandTypeEnum.MOVE_POSES.getType().equals(commandType)) {
|
||||
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())
|
||||
@ -604,7 +621,9 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
|
||||
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.GO_TAKE.getType());
|
||||
} else if (CommandTypeEnum.WORK_PICK_UP_GOODS.getType().equals(commandType)) {
|
||||
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())) {
|
||||
@ -613,7 +632,9 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
|
||||
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.GO_RELEASE.getType());
|
||||
} else if (CommandTypeEnum.WORK_DROP_OFF_GOODS.getType().equals(commandType)) {
|
||||
logOne.setActionMsg("车辆正在放货");
|
||||
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.RELEASEING.getType());
|
||||
if (!RobotTaskStageEnum.DONE.getType().equals(taskStage)) {
|
||||
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.RELEASEING.getType());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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.constant.robot.RobotExecutionStateConstant;
|
||||
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.path.PathIsReachEnum;
|
||||
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.path.PathPlanningService;
|
||||
import cn.iocoder.yudao.module.system.service.robot.RobotInformationService;
|
||||
@ -32,6 +38,9 @@ public class RobotWorkStatusApiImpl implements RobotWorkStatusApi {
|
||||
@Resource
|
||||
private PathPlanningService pathPlanningService;
|
||||
|
||||
@Autowired
|
||||
private RobotTaskDetailMapper robotTaskDetailMapper;
|
||||
|
||||
@Override
|
||||
public void robotWorkStatus(String message) {
|
||||
log.info("111111作业实时行为上报: {}", message);
|
||||
@ -61,6 +70,59 @@ public class RobotWorkStatusApiImpl implements RobotWorkStatusApi {
|
||||
, 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package cn.iocoder.yudao.module.system.config.poperties.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class RobotDoingAction {
|
||||
private Long doingActionCacheTime;
|
||||
}
|
@ -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;
|
||||
}
|
@ -153,7 +153,7 @@ public class RobotInformationController {
|
||||
@Operation(summary = "恢复任务")
|
||||
@PreAuthorize("@ss.hasPermission('robot:information:doTaskContinue')")
|
||||
public CommonResult<Boolean> doTaskContinue(@RequestParam("robotNo") String robotNo) {
|
||||
informationService.doTaskContinue(robotNo);
|
||||
informationService.doTaskContinue(robotNo,false);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
|
@ -13,7 +13,8 @@ public enum RobotStatusCodeEnum {
|
||||
FAIL_JSON("10001","入参JSON解析失败"),
|
||||
FAIL_SYSTEM("10002","系统内部异常"),
|
||||
FAIL_UN_KNOW("10003","未知错误"),
|
||||
FAIL_UN_SUPPOD("10004","未支持该指令执行");
|
||||
FAIL_UN_SUPPOD("10004","未支持该指令执行"),
|
||||
EXCEEDING_SECONDS("10017","PP发送的任务超过5秒到达");
|
||||
/**
|
||||
* 类型
|
||||
*/
|
||||
|
@ -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;
|
||||
}
|
@ -84,9 +84,11 @@ public class RobotJob {
|
||||
RLock lock = redissonUtils.getLock(RobotCacheLockEnum.ROBOT_TASK_DISTRIBUTE_LOCK.getKey());
|
||||
if (lock.tryLock()){
|
||||
try {
|
||||
log.info("----下发自动充电任务----");
|
||||
log.info("----111111下发自动充电任务----");
|
||||
autoChargeService.autoChargeJob();
|
||||
} finally {
|
||||
} catch (Exception e) {
|
||||
log.info("自动充电异常 :{}",e);
|
||||
} finally {
|
||||
lock.unlock();
|
||||
}
|
||||
}else {
|
||||
@ -105,9 +107,11 @@ public class RobotJob {
|
||||
RLock lock = redissonUtils.getLock(RobotCacheLockEnum.ROBOT_TASK_DISTRIBUTE_LOCK.getKey());
|
||||
if (lock.tryLock()){
|
||||
try {
|
||||
log.info("----下发任务给路径规划----");
|
||||
log.info("----111111下发任务给路径规划----");
|
||||
robotPathPlanningService.sendTaskToPP();
|
||||
} finally {
|
||||
} catch (Exception e) {
|
||||
log.info("----分配任务异常---- :{}",e);
|
||||
} finally {
|
||||
lock.unlock();
|
||||
}
|
||||
}else {
|
||||
@ -127,12 +131,16 @@ public class RobotJob {
|
||||
|
||||
RLock lock = redissonUtils.getLock(RobotCacheLockEnum.ROBOT_TASK_ADD_LOCK.getKey());
|
||||
if (lock.tryLock()){
|
||||
|
||||
try {
|
||||
log.info("----创建循环任务----");
|
||||
log.info("----111111创建循环任务----");
|
||||
cycleService.cycleTaskJob();
|
||||
} finally {
|
||||
} catch (Exception e) {
|
||||
log.error("创建循环任务异常 :{}",e);
|
||||
} finally {
|
||||
lock.unlock();
|
||||
}
|
||||
|
||||
}else {
|
||||
log.info("下发任务给路径规划未获取到锁");
|
||||
throw exception(REDISSON_NOT_OBTAIN_LOCK);
|
||||
@ -173,7 +181,9 @@ public class RobotJob {
|
||||
log.info("----统计时长开始----");
|
||||
TenantContextHolder.setTenantId(1L);
|
||||
robotWorkingHoursStatisticsService.statisticsRobotDuration();
|
||||
} finally {
|
||||
} catch (Exception e) {
|
||||
log.info("统计工作时长异常 :{}",e);
|
||||
} finally {
|
||||
lock.unlock();
|
||||
}
|
||||
}else {
|
||||
|
@ -11,12 +11,14 @@ 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.scheduling.annotation.Scheduled;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
@EnableScheduling
|
||||
@Component
|
||||
|
@ -162,7 +162,7 @@ public interface RobotInformationService extends IService<RobotInformationDO> {
|
||||
* 继续做任务
|
||||
* @param robotNo
|
||||
*/
|
||||
void doTaskContinue(String robotNo);
|
||||
void doTaskContinue(String robotNo,Boolean isRobot);
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -162,13 +162,10 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
|
||||
@Value("${zn.is_simulation:false}")
|
||||
private Boolean isSimulation;
|
||||
|
||||
@Value("${zn.restore_task_restart:true}")
|
||||
private Boolean restoreTaskRestart;
|
||||
|
||||
@Value("${zn.full_electricity:95}")
|
||||
private String fullElectricity;
|
||||
|
||||
@Value("${zn.path_planning.task_chche_time:604800}")
|
||||
@Value("${zn.task.task_chche_time:604800}")
|
||||
private Long taskChcheTime;
|
||||
|
||||
@Resource
|
||||
@ -369,17 +366,17 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
|
||||
validateInformationExists(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>()
|
||||
.eq(PositionMapItemDO::getRobotNo, robotInformationDO.getRobotNo())
|
||||
.eq(PositionMapItemDO::getUseStatus, UseStatusEnum.USEING.getType())
|
||||
.eq(PositionMapItemDO::getType, PositionMapItemEnum.STOP.getType())
|
||||
.last("limit 1"));
|
||||
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);
|
||||
}else if (ObjectUtil.isNotEmpty(positionMapItem) && ObjectUtil.isNotEmpty(updateReqVO.getFloorAreaJson())
|
||||
&& !updateReqVO.getFloorAreaJson().contains(positionMapItem.getPositionMapId())) {
|
||||
} else if (ObjectUtil.isNotEmpty(positionMapItem) && ObjectUtil.isNotEmpty(updateReqVO.getFloorAreaJson())
|
||||
&& !updateReqVO.getFloorAreaJson().contains(positionMapItem.getPositionMapId())) {
|
||||
throw exception(ROBOT_PART_AREA);
|
||||
}
|
||||
}
|
||||
@ -1167,7 +1164,7 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
|
||||
*/
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void doTaskContinue(String robotNo) {
|
||||
public void doTaskContinue(String robotNo, Boolean isRobot) {
|
||||
|
||||
RobotTaskDetailActionLogDO actionLog = taskDetailActionLogService.getOriginalLastTaskByRobotNo(robotNo);
|
||||
if (ObjectUtil.isEmpty(actionLog)) {
|
||||
@ -1208,16 +1205,20 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
|
||||
|
||||
TaskToPathPlanningDTO pathPlanning = JSONUtil.toBean((String) o, TaskToPathPlanningDTO.class);
|
||||
|
||||
RLock lock = redissonUtils.getLock(RobotCacheLockEnum.ROBOT_TASK_DISTRIBUTE_LOCK.getKey());
|
||||
if (lock.tryLock()) {
|
||||
try {
|
||||
resendToPP(pathPlanning, actionLog, robotInformationDO);
|
||||
} finally {
|
||||
lock.unlock();
|
||||
}
|
||||
if (isRobot) {
|
||||
resendToPP(pathPlanning, actionLog, robotInformationDO);
|
||||
} else {
|
||||
log.info("下发任务给路径规划未获取到锁");
|
||||
throw exception(REDISSON_NOT_OBTAIN_LOCK);
|
||||
RLock lock = redissonUtils.getLock(RobotCacheLockEnum.ROBOT_TASK_DISTRIBUTE_LOCK.getKey());
|
||||
if (lock.tryLock()) {
|
||||
try {
|
||||
resendToPP(pathPlanning, actionLog, robotInformationDO);
|
||||
} finally {
|
||||
lock.unlock();
|
||||
}
|
||||
} else {
|
||||
log.info("下发任务给路径规划未获取到锁");
|
||||
throw exception(REDISSON_NOT_OBTAIN_LOCK);
|
||||
}
|
||||
}
|
||||
|
||||
UserOperationLogSaveReqVO operationLog = UserOperationLogSaveReqVO.builder()
|
||||
@ -1254,9 +1255,7 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
|
||||
List<TaskRobotNoLimittationAreaDTO> robotNoLimitions = Arrays.asList(taskRobotNoLimittationAreaDTO);
|
||||
pathPlanning.setRobotNoLimitationAreaDTOS(robotNoLimitions);
|
||||
|
||||
if (!isSimulation || !restoreTaskRestart) {
|
||||
resendToPPData(pathPlanning, actionLog, robotInformationDO, false);
|
||||
}
|
||||
resendToPPData(pathPlanning, actionLog, robotInformationDO, false);
|
||||
|
||||
List<TaskToPathPlanningDTO> pathPlanningList = new ArrayList<>();
|
||||
pathPlanningList.add(pathPlanning);
|
||||
@ -1329,27 +1328,35 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
|
||||
Object cargoDetected = redisUtil.get(cargoDetectedKey);
|
||||
if (ObjectUtil.isNotEmpty(cargoDetected) && RobotStatusCodeConstant.CARGO_DETECTED.equals(Boolean.parseBoolean(String.valueOf(cargoDetected)))) {
|
||||
//说明取货完成
|
||||
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);
|
||||
}
|
||||
takeDone(pathPlanning,robotTaskDetail);
|
||||
} else if (!RobotTaskStageEnum.UN_START.getType().equals(robotTaskDetail.getTaskStage())
|
||||
&& !RobotTaskStageEnum.GO_TAKE.getType().equals(robotTaskDetail.getTaskStage())
|
||||
&& !RobotTaskStageEnum.TAKEING.getType().equals(robotTaskDetail.getTaskStage())) {
|
||||
takeDone(pathPlanning,robotTaskDetail);
|
||||
} else {
|
||||
takeCheck(robotTaskDetail.getFromLocationId(), robotTaskDetail.getRobotTaskId(), isRemote);
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验放货任务
|
||||
*
|
||||
|
@ -193,13 +193,11 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper, RobotTask
|
||||
@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) {
|
||||
if (taskNotCheck) {
|
||||
robotSimulationService.createTask(createReqVO);
|
||||
return 1L;
|
||||
}
|
||||
|
@ -90,11 +90,12 @@ public class CycleServiceImpl implements CycleService {
|
||||
Map<Long, List<RobotTaskDetailDO>> taskIdMap =
|
||||
detailDOS.stream().collect(Collectors.groupingBy(RobotTaskDetailDO::getRobotTaskId));
|
||||
|
||||
String incrementByKey = redisUtil.getIncrementByKey(RobotCacheLockEnum.TASK_NO.getKey());
|
||||
|
||||
|
||||
List<RobotTaskDO> taskDOList = new ArrayList<>();
|
||||
List<RobotTaskDetailDO> taskDetailList = new LinkedList<>();
|
||||
for (RobotTaskDO v : taskList) {
|
||||
String incrementByKey = redisUtil.getIncrementByKey(RobotCacheLockEnum.TASK_NO.getKey());
|
||||
RobotTaskDO taskData = getTaskData(incrementByKey, v);
|
||||
List<RobotTaskDetailDO> taskDetailDOS = getTaskDetailData(taskData,taskIdMap,v.getId());
|
||||
taskDOList.add(taskData);
|
||||
@ -102,10 +103,21 @@ public class CycleServiceImpl implements CycleService {
|
||||
v.setRemainingCycleNumber(0l);
|
||||
}
|
||||
|
||||
taskMapper.insertBatch(taskDOList);
|
||||
taskMapper.insert(taskDOList);
|
||||
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> 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());
|
||||
});
|
||||
|
||||
List<RobotTaskDetailAddVO> bean = BeanUtils.toBean(taskDetailList, RobotTaskDetailAddVO.class);
|
||||
List<RobotTaskDetailAddVO> bean = BeanUtils.toBean(taskDetails, RobotTaskDetailAddVO.class);
|
||||
Map<Long, List<RobotTaskDetailAddVO>> taskDetailMap =
|
||||
bean.stream().collect(Collectors.groupingBy(RobotTaskDetailAddVO::getRobotTaskId));
|
||||
taskDetailMap.forEach((k,v) ->{
|
||||
|
@ -92,7 +92,7 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
|
||||
.in(RobotInformationDO::getRobotStatus, RobotStatusEnum.STAND_BY.getType(), RobotStatusEnum.CHARGE.getType())
|
||||
.eq(RobotInformationDO::getRobotTaskModel, RobotTaskModelEnum.NORMAL.getType()));
|
||||
|
||||
if (robots.isEmpty()) {
|
||||
if (ObjectUtil.isEmpty(robots)) {
|
||||
log.info("暂无空闲的机器人");
|
||||
return pair;
|
||||
}
|
||||
|
@ -95,7 +95,7 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService {
|
||||
@Value("${zn.robot_config.offset_height}")
|
||||
private Double offsetHeight;
|
||||
|
||||
@Value("${zn.path_planning.task_chche_time:604800}")
|
||||
@Value("${zn.task.task_chche_time:604800}")
|
||||
private Long taskChcheTime;
|
||||
|
||||
@Value("${zn.move-no:MOVE}")
|
||||
@ -148,8 +148,8 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService {
|
||||
return;
|
||||
}
|
||||
|
||||
log.info("-------查找车子------ ,:{}",JSON.toJSONString(robots));
|
||||
log.info("-------查找任务------ ,:{}",JSON.toJSONString(taskDetailDOS));
|
||||
log.info("-------可以分配任务的车辆编号------ ,:{}",JSON.toJSONString(robots.stream().map(RobotInformationDO::getRobotNo).collect(Collectors.toList())));
|
||||
log.info("-------需要执行的任务id------ ,:{}",JSON.toJSONString(taskDetailDOS.stream().map(RobotTaskDetailDO::getId).collect(Collectors.toList())));
|
||||
distributeTasksToPP(robots, taskDetailDOS);
|
||||
|
||||
}
|
||||
|
@ -238,16 +238,16 @@ zn:
|
||||
priority_config: 50 #优先级
|
||||
task: #任务相关的配置
|
||||
check_sku_info: true #校验物料信息
|
||||
task_chche_time: 1209600 #任务缓存的时间, 默认一星期
|
||||
robot_config: #机器人取放货默认配置
|
||||
offset_height: 0.1 #叉起货需要在原来高度基础上偏移的高度
|
||||
default_tray_height: 0.82 #默认每层高度
|
||||
open_rate_limiter: true #是否开启限流
|
||||
path_planning:
|
||||
task_chche_time: 1209600 #任务缓存的时间, 默认一星期
|
||||
is_simulation: true # 是否为仿真环境
|
||||
is_simulation: false # 是否为仿真环境
|
||||
send_robot_init_pose: true # 是否为发送默认的车辆所在地图和点位
|
||||
restore_task_restart: true # 恢复任务是否全部重新执行 true:全部重新开始
|
||||
synchronous_all_map_node: 500 # 点位信息每次发送的数据量
|
||||
# synchronous_all_map_node: 500 # 点位信息每次发送的数据量
|
||||
task_not_check: true # 创建任务不校验
|
||||
|
||||
logging:
|
||||
|
Loading…
Reference in New Issue
Block a user