Compare commits

..

3 Commits

Author SHA1 Message Date
cbs
55712a77a5 地图配置 2025-07-02 18:07:53 +08:00
cbs
f428509644 工作时长、初始化数据 2025-07-02 09:11:14 +08:00
cbs
fe186d3117 检测距离/代码优化 2025-06-27 15:55:25 +08:00
38 changed files with 443 additions and 84 deletions

View File

@ -150,7 +150,7 @@ public class RobotReactiveStatusApiImpl implements RobotReactiveStatusApi {
.warnCode(robotStatusData.getErrorCode()) .warnCode(robotStatusData.getErrorCode())
.robotNo(robotNo) .robotNo(robotNo)
.warnType(RobotWarnType.ROBOT_WARN.getType()) .warnType(RobotWarnType.ROBOT_WARN.getType())
.warnMsg(robotNo + CommonConstant.SYMBOL + mappingDOS.getWarnMsg()) .warnMsg(robotNo+"号车" + CommonConstant.SYMBOL + mappingDOS.getWarnMsg())
.warnSolve(mappingDOS.getWarnSolve()) .warnSolve(mappingDOS.getWarnSolve())
.build(); .build();

View File

@ -147,7 +147,10 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
return; return;
} }
if (RobotExecutionStateConstant.UN_DO.equals(robotCompleteTaskDTO.getExecutionState()) if (ObjectUtil.isNotEmpty(robotCompleteTaskDTO.getCommandStatus())
&& RobotExecutionStateConstant.UN_DO.equals(robotCompleteTaskDTO.getCommandStatus().getExecutionState())) {
log.info("任务未开始 :{}", robotCompleteTaskDTO.getOrderId());
} else if (RobotExecutionStateConstant.UN_DO.equals(robotCompleteTaskDTO.getExecutionState())
|| RobotExecutionStateConstant.STOP.equals(robotCompleteTaskDTO.getExecutionState()) || RobotExecutionStateConstant.STOP.equals(robotCompleteTaskDTO.getExecutionState())
|| RobotExecutionStateConstant.CLOSE.equals(robotCompleteTaskDTO.getExecutionState())) { || RobotExecutionStateConstant.CLOSE.equals(robotCompleteTaskDTO.getExecutionState())) {
log.info("任务未开始/暂停/取消 :{}", robotCompleteTaskDTO.getOrderId()); log.info("任务未开始/暂停/取消 :{}", robotCompleteTaskDTO.getOrderId());
@ -244,6 +247,7 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
redisUtil.del(RobotTaskChcheConstant.ROBOT_TASK_SKU_INFO + robotCompleteTaskDTO.getMac()); redisUtil.del(RobotTaskChcheConstant.ROBOT_TASK_SKU_INFO + robotCompleteTaskDTO.getMac());
} }
//todo 后面考虑下充电车机目前对充电的逻辑未定义 //todo 后面考虑下充电车机目前对充电的逻辑未定义
RobotTaskDetailDO robotTaskDetail = null;
if (PathTaskTypeEnum.MOVE.getType().equals(robotCompleteTaskDTO.getOrderType()) if (PathTaskTypeEnum.MOVE.getType().equals(robotCompleteTaskDTO.getOrderType())
|| PathTaskTypeEnum.MOVE_TO_WAIT_STOP.getType().equals(robotCompleteTaskDTO.getOrderType()) || PathTaskTypeEnum.MOVE_TO_WAIT_STOP.getType().equals(robotCompleteTaskDTO.getOrderType())
|| PathTaskTypeEnum.MOVE_TO_POINT.getType().equals(robotCompleteTaskDTO.getOrderType()) || PathTaskTypeEnum.MOVE_TO_POINT.getType().equals(robotCompleteTaskDTO.getOrderType())
@ -251,7 +255,7 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
|| PathTaskTypeEnum.TAKE.getType().equals(robotCompleteTaskDTO.getOrderType()) || PathTaskTypeEnum.TAKE.getType().equals(robotCompleteTaskDTO.getOrderType())
|| PathTaskTypeEnum.CHARGE.getType().equals(robotCompleteTaskDTO.getOrderType()) || PathTaskTypeEnum.CHARGE.getType().equals(robotCompleteTaskDTO.getOrderType())
|| PathTaskTypeEnum.RELEASE.getType().equals(robotCompleteTaskDTO.getOrderType())) { || PathTaskTypeEnum.RELEASE.getType().equals(robotCompleteTaskDTO.getOrderType())) {
taskDone(robotCompleteTaskDTO); robotTaskDetail = taskDone(robotCompleteTaskDTO);
} else if (PathTaskTypeEnum.TAKE_RELEASE.getType().equals(robotCompleteTaskDTO.getOrderType())) { } else if (PathTaskTypeEnum.TAKE_RELEASE.getType().equals(robotCompleteTaskDTO.getOrderType())) {
RobotTaskDetailDO robotTaskDetailDO = robotTaskDetailMapper.selectById(robotCompleteTaskDTO.getOrderId()); RobotTaskDetailDO robotTaskDetailDO = robotTaskDetailMapper.selectById(robotCompleteTaskDTO.getOrderId());
@ -263,7 +267,7 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
robotTaskDetailMapper.updateById(robotTaskDetailDO); robotTaskDetailMapper.updateById(robotTaskDetailDO);
return; return;
} else if (CommandTypeEnum.WORK_DROP_OFF_GOODS.getType().equals(robotCompleteTaskDTO.getCommandStatus().getCommandType())) { } else if (CommandTypeEnum.WORK_DROP_OFF_GOODS.getType().equals(robotCompleteTaskDTO.getCommandStatus().getCommandType())) {
taskDone(robotCompleteTaskDTO); robotTaskDetail = taskDone(robotCompleteTaskDTO);
} }
} }
@ -273,6 +277,29 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
} }
taskDetailActionLogMapper.updateActionStatus(robotCompleteTaskDTO.getOrderId(), ActionStatusEnum.DONE.getType(), LocalDateTime.now()); taskDetailActionLogMapper.updateActionStatus(robotCompleteTaskDTO.getOrderId(), ActionStatusEnum.DONE.getType(), LocalDateTime.now());
addTaskDetailActionDoneLog(robotCompleteTaskDTO, robotTaskDetail);
}
private void addTaskDetailActionDoneLog(RobotCompleteTaskDTO robotCompleteTaskDTO, RobotTaskDetailDO robotTaskDetail) {
RobotTaskDetailActionLogSaveReqVO logOne = new RobotTaskDetailActionLogSaveReqVO();
String robotNo = robotInformationService.getRobotNoByMac(robotCompleteTaskDTO.getMac());
logOne.setActionMsg("车辆 " + robotNo + " 完成任务");
logOne.setRobotNo(robotNo);
logOne.setOriginalRobotNo(robotNo);
logOne.setTaskDetailId(robotCompleteTaskDTO.getOrderId());
if (ObjectUtil.isNotEmpty(robotTaskDetail)) {
logOne.setTaskStage(robotTaskDetail.getTaskStage());
logOne.setCommandType(PathTaskTypeEnum.getTaskType(robotTaskDetail.getTaskType()));
}
// logOne.setTaskNo(robotTask.getTaskNo());
logOne.setActionStatus(ActionStatusEnum.DONE.getType());
logOne.setStartTime(LocalDateTime.now());
logOne.setEndTime(LocalDateTime.now());
Long mapId = robotInformationService.getRobotMapIdByRobotNo(robotNo);
if (ObjectUtil.isNotEmpty(mapId)) {
logOne.setPositionMapId(mapId);
}
taskDetailActionLogService.createTaskDetailActionLog(logOne);
} }
/** /**
@ -413,16 +440,18 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
RobotTaskDetailDO robotTaskDetailDO = robotTaskDetailMapper.selectById(robotCompleteTaskDTO.getOrderId()); RobotTaskDetailDO robotTaskDetailDO = robotTaskDetailMapper.selectById(robotCompleteTaskDTO.getOrderId());
if (PathTaskTypeEnum.TAKE_RELEASE.getType().equals(robotCompleteTaskDTO.getOrderType()) if (PathTaskTypeEnum.TAKE_RELEASE.getType().equals(robotCompleteTaskDTO.getOrderType())
|| PathTaskTypeEnum.TAKE.getType().equals(robotCompleteTaskDTO.getOrderType())) { || PathTaskTypeEnum.TAKE.getType().equals(robotCompleteTaskDTO.getOrderType())) {
RobotTaskDetailDO detailDO = new RobotTaskDetailDO();
if (RobotTaskStageEnum.GO_TAKE.getType().equals(robotTaskDetailDO.getTaskStage()) if (RobotTaskStageEnum.GO_TAKE.getType().equals(robotTaskDetailDO.getTaskStage())
|| RobotTaskStageEnum.UN_START.getType().equals(robotTaskDetailDO.getTaskStage())) { || RobotTaskStageEnum.UN_START.getType().equals(robotTaskDetailDO.getTaskStage())) {
robotTaskDetailDO.setTaskStatus(RobotTaskDetailStatusEnum.NEW.getType()); detailDO.setTaskStatus(RobotTaskDetailStatusEnum.NEW.getType());
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.UN_START.getType()); detailDO.setTaskStage(RobotTaskStageEnum.UN_START.getType());
if (!znConfigConstant.getIsSimulation()) { if (!znConfigConstant.getIsSimulation()) {
// robotTaskDetailDO.setRobotNo(""); // robotTaskDetailDO.setRobotNo("");
} }
robotTaskDetailDO.setOccurError(ZeroOneEnum.ZERO.getType()); detailDO.setOccurError(ZeroOneEnum.ZERO.getType());
robotTaskDetailMapper.updateById(robotTaskDetailDO); // robotTaskDetailMapper.updateById(robotTaskDetailDO);
robotTaskDetailMapper.updateRobotDetailById(detailDO);
String taskNo = taskDetailService.getTaskNoByDetailId(robotCompleteTaskDTO.getOrderId()); String taskNo = taskDetailService.getTaskNoByDetailId(robotCompleteTaskDTO.getOrderId());
msg = robotNo + "_" + "车辆发生异常,重新分配其他车辆执行此任务" + taskNo + " - " + robotCompleteTaskDTO.getOrderId(); msg = robotNo + "_" + "车辆发生异常,重新分配其他车辆执行此任务" + taskNo + " - " + robotCompleteTaskDTO.getOrderId();
} }
@ -537,7 +566,7 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
* *
* @param robotCompleteTaskDTO * @param robotCompleteTaskDTO
*/ */
private void taskDone(RobotCompleteTaskDTO robotCompleteTaskDTO) { private RobotTaskDetailDO taskDone(RobotCompleteTaskDTO robotCompleteTaskDTO) {
RobotTaskDetailDO robotTaskDetailDO = setTaskDone(robotCompleteTaskDTO); RobotTaskDetailDO robotTaskDetailDO = setTaskDone(robotCompleteTaskDTO);
@ -558,6 +587,7 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
String plantingKey = PathPlanningChcheConstant.PATH_PLANNING_TASK + robotCompleteTaskDTO.getOrderId(); String plantingKey = PathPlanningChcheConstant.PATH_PLANNING_TASK + robotCompleteTaskDTO.getOrderId();
redisUtil.del(plantingKey); redisUtil.del(plantingKey);
} }
return robotTaskDetailDO;
} }
@ -571,6 +601,7 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
RobotTaskDetailDO robotTaskDetailDO = robotTaskDetailMapper.selectById(robotCompleteTaskDTO.getOrderId()); RobotTaskDetailDO robotTaskDetailDO = robotTaskDetailMapper.selectById(robotCompleteTaskDTO.getOrderId());
Long taskStage = robotTaskDetailDO.getTaskStage(); Long taskStage = robotTaskDetailDO.getTaskStage();
log.info("任务 :{} , 当前阶段 :{}", robotCompleteTaskDTO.getOrderId(), taskStage);
RobotTaskDO robotTask = robotTaskMapper.selectById(robotTaskDetailDO.getRobotTaskId()); RobotTaskDO robotTask = robotTaskMapper.selectById(robotTaskDetailDO.getRobotTaskId());
@ -579,7 +610,12 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
RobotTaskDetailActionLogSaveReqVO logOne = new RobotTaskDetailActionLogSaveReqVO(); RobotTaskDetailActionLogSaveReqVO logOne = new RobotTaskDetailActionLogSaveReqVO();
if (PathTaskTypeEnum.TAKE_RELEASE.getType().equals(robotCompleteTaskDTO.getOrderType())) { if (PathTaskTypeEnum.TAKE_RELEASE.getType().equals(robotCompleteTaskDTO.getOrderType())) {
if (CommandTypeEnum.MOVE_POSES.getType().equals(commandType) && RobotTaskStageEnum.UN_START.getType().equals(taskStage)) { if (CommandTypeEnum.WORK_PICK_UP_GOODS_MOVE_TO_CHECK.getType().equals(commandType)) {
logOne.setActionMsg("车辆正在前往" + robotTaskDetailDO.getFromLocationNo() + "取货");
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.GO_TAKE.getType());
} else if (CommandTypeEnum.MOVE_POSES.getType().equals(commandType) && (RobotTaskStageEnum.UN_START.getType().equals(taskStage)
|| RobotTaskStageEnum.GO_TAKE.getType().equals(taskStage)
|| RobotTaskStageEnum.TAKEING.getType().equals(taskStage))) {
logOne.setActionMsg("车辆正在前往" + robotTaskDetailDO.getFromLocationNo() + "取货"); logOne.setActionMsg("车辆正在前往" + robotTaskDetailDO.getFromLocationNo() + "取货");
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)) {
@ -590,7 +626,8 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
} else if (CommandTypeEnum.WORK_DROP_OFF_GOODS.getType().equals(commandType)) { } else if (CommandTypeEnum.WORK_DROP_OFF_GOODS.getType().equals(commandType)) {
logOne.setActionMsg("车辆正在放货" + robotTaskDetailDO.getToLocationNo()); logOne.setActionMsg("车辆正在放货" + robotTaskDetailDO.getToLocationNo());
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)
|| CommandTypeEnum.WORK_DROP_OFF_GOODS_MOVE_TO_CHECK.getType().equals(commandType)) {
logOne.setActionMsg("车辆正在前往" + robotTaskDetailDO.getToLocationNo() + "放货"); logOne.setActionMsg("车辆正在前往" + robotTaskDetailDO.getToLocationNo() + "放货");
if (!RobotTaskStageEnum.DONE.getType().equals(taskStage)) { if (!RobotTaskStageEnum.DONE.getType().equals(taskStage)) {
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.GO_RELEASE.getType()); robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.GO_RELEASE.getType());
@ -636,7 +673,7 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
logOne.setActionMsg("车辆正在前往" + robotTaskDetailDO.getToLocationNo() + "放货"); logOne.setActionMsg("车辆正在前往" + robotTaskDetailDO.getToLocationNo() + "放货");
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("车辆正在放货"+ robotTaskDetailDO.getToLocationNo()); logOne.setActionMsg("车辆正在放货" + robotTaskDetailDO.getToLocationNo());
if (!RobotTaskStageEnum.DONE.getType().equals(taskStage)) { if (!RobotTaskStageEnum.DONE.getType().equals(taskStage)) {
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.RELEASEING.getType()); robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.RELEASEING.getType());
} }

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.system.api.robot; package cn.iocoder.yudao.module.system.api.robot;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; 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;
@ -47,6 +48,10 @@ public class RobotWorkStatusApiImpl implements RobotWorkStatusApi {
TenantContextHolder.setTenantId(1L); TenantContextHolder.setTenantId(1L);
RobotWorkStatusDTO data = JSON.parseObject(message, RobotWorkStatusDTO.class); RobotWorkStatusDTO data = JSON.parseObject(message, RobotWorkStatusDTO.class);
if (ObjectUtil.isEmpty(data.getOrderId())) {
log.info("任务id为空,不进行处理");
return;
}
String robotNo = robotInformationService.getRobotNoByMac(data.getMac()); String robotNo = robotInformationService.getRobotNoByMac(data.getMac());
RobotOperationLogSaveReqVO createReqVO = RobotOperationLogSaveReqVO.builder() RobotOperationLogSaveReqVO createReqVO = RobotOperationLogSaveReqVO.builder()
.orderId(Long.valueOf(data.getOrderId())) .orderId(Long.valueOf(data.getOrderId()))

View File

@ -72,9 +72,9 @@ public class MqttUtils {
} }
if (message.length() > 510) { if (message.length() > 510) {
log.info("发送的主题 :{}, 内容 :{}",topic, message.substring(0, 500)); log.info("111111发送的主题 :{}, 内容 :{}",topic, message.substring(0, 500));
}else { }else {
log.info("发送的主题 :{}, 内容 :{}",topic, message); log.info("111111发送的主题 :{}, 内容 :{}",topic, message);
} }
} }

View File

@ -36,4 +36,6 @@ public class ZnConfigConstant {
private Boolean taskNotCheck; private Boolean taskNotCheck;
private Double checkShortestDistance; private Double checkShortestDistance;
private Double checkLongestDistance; private Double checkLongestDistance;
private String mapCheckDistance;
private String mapArcOffset;
} }

View File

@ -11,6 +11,7 @@ import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.module.system.api.path.PathApi; import cn.iocoder.yudao.module.system.api.path.PathApi;
import cn.iocoder.yudao.module.system.controller.admin.log.vo.UserOperationLogSaveReqVO; import cn.iocoder.yudao.module.system.controller.admin.log.vo.UserOperationLogSaveReqVO;
import cn.iocoder.yudao.module.system.controller.admin.positionmap.dto.NodeBaseDTO; import cn.iocoder.yudao.module.system.controller.admin.positionmap.dto.NodeBaseDTO;
import cn.iocoder.yudao.module.system.controller.admin.positionmap.dto.PositionMapConfigDTO;
import cn.iocoder.yudao.module.system.controller.admin.positionmap.dto.PositionMapItemNodeDTO; import cn.iocoder.yudao.module.system.controller.admin.positionmap.dto.PositionMapItemNodeDTO;
import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapItemRespVO; import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapItemRespVO;
import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapItemSaveReqVO; import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapItemSaveReqVO;
@ -165,4 +166,12 @@ public class PositionMapItemController {
map.put("LINE",lineList); map.put("LINE",lineList);
return success(map); return success(map);
} }
@GetMapping("/getCheckDistance")
@Operation(summary = "获取检测点距离")
@PreAuthorize("@ss.hasPermission('system:position-map-item:getCheckDistance')")
public CommonResult<PositionMapConfigDTO> getCheckDistance() {
PositionMapConfigDTO distance = positionMapItemService.getCheckDistance();
return success(distance);
}
} }

View File

@ -0,0 +1,14 @@
package cn.iocoder.yudao.module.system.controller.admin.positionmap.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "地图配置")
@Data
public class PositionMapConfigDTO {
@Schema(description = "库位到检测点距离")
private String mapCheckDistance;
@Schema(description = "弧线偏移量")
private String mapArcOffset;
}

View File

@ -128,7 +128,6 @@ public class RobotInformationController {
@Operation(summary = "获得车辆信息分页") @Operation(summary = "获得车辆信息分页")
@PreAuthorize("@ss.hasPermission('robot:information:list')") @PreAuthorize("@ss.hasPermission('robot:information:list')")
public CommonResult<PageResult<RobotInformationPageRespVO>> getRobotList(@Valid RobotInformationPageReqVO pageReqVO) { public CommonResult<PageResult<RobotInformationPageRespVO>> getRobotList(@Valid RobotInformationPageReqVO pageReqVO) {
pageReqVO.setPageSize(300);
PageResult<RobotInformationPageRespVO> pageResult = informationService.getInformationPage(pageReqVO); PageResult<RobotInformationPageRespVO> pageResult = informationService.getInformationPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, RobotInformationPageRespVO.class)); return success(BeanUtils.toBean(pageResult, RobotInformationPageRespVO.class));
} }

View File

@ -61,4 +61,6 @@ public interface RobotTaskDetailActionLogMapper extends BaseMapperX<RobotTaskDet
* @return * @return
*/ */
List<RobotTaskDetailActionLogDO> getLastTwoTask(@Param("robotNo") String robotNo); List<RobotTaskDetailActionLogDO> getLastTwoTask(@Param("robotNo") String robotNo);
void alreadyCounted(@Param("ids") List<Long> ids);
} }

View File

@ -92,4 +92,6 @@ public interface RobotInformationMapper extends BaseMapperX<RobotInformationDO>
RobotInformationDO selectByRobotNoAndIdNotIn(@Param("robotNo") String robotNo, @Param("id") Long id); RobotInformationDO selectByRobotNoAndIdNotIn(@Param("robotNo") String robotNo, @Param("id") Long id);
RobotInformationDO selectByMacAndIdNotIn(@Param("macAddress") String macAddress,@Param("id") Long id); RobotInformationDO selectByMacAndIdNotIn(@Param("macAddress") String macAddress,@Param("id") Long id);
void initRobotInformation();
} }

View File

@ -167,4 +167,13 @@ public interface RobotTaskDetailMapper extends BaseMapperX<RobotTaskDetailDO> {
* @return * @return
*/ */
RobotTaskManualInterventionDTO getRobotTaskAutomaticArtificial(@Param("type") String type); RobotTaskManualInterventionDTO getRobotTaskAutomaticArtificial(@Param("type") String type);
/**
* 清除所有数据
*/
void truncate();
List<RobotTaskDetailDO> selectAutoCreateCycleTaskForever();
void setTaskUnDo(@Param("ids") List<Long> ids);
} }

View File

@ -86,4 +86,11 @@ public interface RobotTaskMapper extends BaseMapperX<RobotTaskDO> {
* @return * @return
*/ */
List<RobotTaskDO> selectDoingTaskByRobotNo(@Param("robotNo") String robotNo); List<RobotTaskDO> selectDoingTaskByRobotNo(@Param("robotNo") String robotNo);
/**
* 清除所有数据
*/
void truncate();
void setTaskUnDo(@Param("ids") Set<Long> ids);
} }

View File

@ -28,6 +28,6 @@ public enum DurationTypeEnum {
|| PathTaskTypeEnum.AUTO_CHARGE.getType().equals(commonType)) { || PathTaskTypeEnum.AUTO_CHARGE.getType().equals(commonType)) {
return CHARGE_TIME.type; return CHARGE_TIME.type;
} }
return CHARGE_TIME.type; return TASK_TIME.type;
} }
} }

View File

@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.system.service.robot.RobotInformationService;
import cn.iocoder.yudao.module.system.service.robot.job.AutoChargeService; import cn.iocoder.yudao.module.system.service.robot.job.AutoChargeService;
import cn.iocoder.yudao.module.system.service.robot.job.CycleService; import cn.iocoder.yudao.module.system.service.robot.job.CycleService;
import cn.iocoder.yudao.module.system.service.robot.job.DistributeTasksService; import cn.iocoder.yudao.module.system.service.robot.job.DistributeTasksService;
import cn.iocoder.yudao.module.system.service.robot.job.InitTaskService;
import cn.iocoder.yudao.module.system.service.robot.job.RobotTaskAutoMoveService; import cn.iocoder.yudao.module.system.service.robot.job.RobotTaskAutoMoveService;
import cn.iocoder.yudao.module.system.service.robot.pathplanning.RobotPathPlanningService; import cn.iocoder.yudao.module.system.service.robot.pathplanning.RobotPathPlanningService;
import cn.iocoder.yudao.module.system.service.statistics.RobotWorkingHoursStatisticsService; import cn.iocoder.yudao.module.system.service.statistics.RobotWorkingHoursStatisticsService;
@ -51,6 +52,9 @@ public class RobotJob {
@Resource @Resource
private RobotInformationService informationService; private RobotInformationService informationService;
@Resource
private InitTaskService initTaskService;
@Resource @Resource
private RobotWorkingHoursStatisticsService robotWorkingHoursStatisticsService; private RobotWorkingHoursStatisticsService robotWorkingHoursStatisticsService;
@ -64,13 +68,13 @@ public class RobotJob {
locks.add(RobotCacheLockEnum.ROBOT_TASK_DISTRIBUTE_LOCK.getKey()); locks.add(RobotCacheLockEnum.ROBOT_TASK_DISTRIBUTE_LOCK.getKey());
locks.add(RobotCacheLockEnum.ROBOT_TASK_ADD_LOCK.getKey()); locks.add(RobotCacheLockEnum.ROBOT_TASK_ADD_LOCK.getKey());
RLock lock = redissonUtils.getLocks(locks); RLock lock = redissonUtils.getLocks(locks);
if (lock.tryLock()){ if (lock.tryLock()) {
try { try {
robotTaskAutoMoveService.distributeAutoMoveJob(); robotTaskAutoMoveService.distributeAutoMoveJob();
} finally { } finally {
lock.unlock(); lock.unlock();
} }
}else { } else {
log.info("下发自动移库任务未获取到锁"); log.info("下发自动移库任务未获取到锁");
throw exception(REDISSON_NOT_OBTAIN_LOCK); throw exception(REDISSON_NOT_OBTAIN_LOCK);
} }
@ -82,16 +86,16 @@ public class RobotJob {
public void AutoChargeJob() { public void AutoChargeJob() {
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("----111111下发自动充电任务----"); log.info("----111111下发自动充电任务----");
autoChargeService.autoChargeJob(); autoChargeService.autoChargeJob();
} catch (Exception e) { } catch (Exception e) {
log.info("自动充电异常 :{}",e); log.info("自动充电异常 :{}", e);
} finally { } finally {
lock.unlock(); lock.unlock();
} }
}else { } else {
log.info("下发自动充电任务未获取到锁"); log.info("下发自动充电任务未获取到锁");
throw exception(REDISSON_NOT_OBTAIN_LOCK); throw exception(REDISSON_NOT_OBTAIN_LOCK);
} }
@ -105,23 +109,22 @@ public class RobotJob {
public void DistributeTasksToPathPlanningJob() { public void DistributeTasksToPathPlanningJob() {
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("----111111下发任务给路径规划----"); log.info("----111111下发任务给路径规划----");
robotPathPlanningService.sendTaskToPP(); robotPathPlanningService.sendTaskToPP();
} catch (Exception e) { } catch (Exception e) {
log.info("----分配任务异常---- :{}",e); log.info("----分配任务异常---- :{}", e);
} finally { } finally {
lock.unlock(); lock.unlock();
} }
}else { } else {
log.info("下发任务给路径规划未获取到锁"); log.info("下发任务给路径规划未获取到锁");
throw exception(REDISSON_NOT_OBTAIN_LOCK); throw exception(REDISSON_NOT_OBTAIN_LOCK);
} }
} }
/** /**
* 创建循环任务 * 创建循环任务
*/ */
@ -130,18 +133,18 @@ public class RobotJob {
public void cycleTaskJob() { public void cycleTaskJob() {
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("----111111创建循环任务----"); log.info("----111111创建循环任务----");
cycleService.cycleTaskJob(); cycleService.cycleTaskJob();
} catch (Exception e) { } catch (Exception e) {
log.error("创建循环任务异常 :{}",e); log.error("创建循环任务异常 :{}", e);
} finally { } finally {
lock.unlock(); lock.unlock();
} }
}else { } else {
log.info("下发任务给路径规划未获取到锁"); log.info("下发任务给路径规划未获取到锁");
throw exception(REDISSON_NOT_OBTAIN_LOCK); throw exception(REDISSON_NOT_OBTAIN_LOCK);
} }
@ -156,15 +159,15 @@ public class RobotJob {
public void rcsHeartBeat() { public void rcsHeartBeat() {
RLock lock = redissonUtils.getLock(RobotCacheLockEnum.ROBOT_RCS_HEART_BEAT_LOCK.getKey()); RLock lock = redissonUtils.getLock(RobotCacheLockEnum.ROBOT_RCS_HEART_BEAT_LOCK.getKey());
if (lock.tryLock()){ if (lock.tryLock()) {
try { try {
log.info("----维护车机心跳----"); log.info("----维护车机心跳----");
TenantContextHolder.setTenantId(1L); TenantContextHolder.setTenantId(1L);
informationService.rcsHeartBeat(); informationService.rcsHeartBeat();
} finally { } finally {
lock.unlock(); lock.unlock();
} }
}else { } else {
throw exception(REDISSON_NOT_OBTAIN_LOCK); throw exception(REDISSON_NOT_OBTAIN_LOCK);
} }
} }
@ -176,18 +179,29 @@ public class RobotJob {
@TenantJob @TenantJob
public void statisticsDuration() { public void statisticsDuration() {
RLock lock = redissonUtils.getLock(RobotCacheLockEnum.ROBOT_STATISTICS_DURATION_LOCK.getKey()); RLock lock = redissonUtils.getLock(RobotCacheLockEnum.ROBOT_STATISTICS_DURATION_LOCK.getKey());
if (lock.tryLock()){ if (lock.tryLock()) {
try { try {
log.info("----统计时长开始----"); log.info("----统计时长开始----");
TenantContextHolder.setTenantId(1L); TenantContextHolder.setTenantId(1L);
robotWorkingHoursStatisticsService.statisticsRobotDuration(); robotWorkingHoursStatisticsService.statisticsRobotDuration();
} catch (Exception e) { } catch (Exception e) {
log.info("统计工作时长异常 :{}",e); log.info("统计工作时长异常 :{}", e);
} finally { } finally {
lock.unlock(); lock.unlock();
} }
}else { } else {
throw exception(REDISSON_NOT_OBTAIN_LOCK); throw exception(REDISSON_NOT_OBTAIN_LOCK);
} }
} }
/**
* 恢复数据 (只能是测试的时候用上线禁止使用)
*/
@XxlJob("initTaskJob")
@TenantJob
public void initTaskJob() {
TenantContextHolder.setTenantId(1L);
initTaskService.initTask();
}
} }

View File

@ -178,7 +178,7 @@ public class HouseAreaServiceImpl extends ServiceImpl<HouseAreaMapper, HouseArea
for (WareHouseLocationDO wareHouseLocationDO : wareHouseLocationDOS) { for (WareHouseLocationDO wareHouseLocationDO : wareHouseLocationDOS) {
wareHouseLocationDO.setAreaId(null); wareHouseLocationDO.setAreaId(null);
wareHouseLocationDO.setAreaName(null); wareHouseLocationDO.setAreaName(null);
wareHouseLocationDO.setSkuInfo(null); // wareHouseLocationDO.setSkuInfo(null);
} }
item.setDataJson(JSONUtil.toJsonStr(wareHouseLocationDOS)); item.setDataJson(JSONUtil.toJsonStr(wareHouseLocationDOS));
} }

View File

@ -90,4 +90,8 @@ public interface RobotTaskDetailActionLogService {
* @return * @return
*/ */
RobotTaskDetailActionLogDO getOriginalLastTaskByRobotNo(String robotNo); RobotTaskDetailActionLogDO getOriginalLastTaskByRobotNo(String robotNo);
void alreadyCounted(List<Long> logIds);
RobotTaskDetailActionLogDO getLastActionLogByDetailId(Long taskDetailId);
} }

View File

@ -141,4 +141,18 @@ public class RobotTaskDetailActionLogServiceImpl implements RobotTaskDetailActio
.last("limit 1")); .last("limit 1"));
} }
@Override
public void alreadyCounted(List<Long> logIds) {
taskDetailActionLogMapper.alreadyCounted(logIds);
}
@Override
public RobotTaskDetailActionLogDO getLastActionLogByDetailId(Long taskDetailId) {
return taskDetailActionLogMapper.selectOne(new LambdaQueryWrapperX<RobotTaskDetailActionLogDO>()
.eq(RobotTaskDetailActionLogDO::getTaskDetailId, taskDetailId)
.eq(RobotTaskDetailActionLogDO::getCommandId, CommandIdEnum.TASK.getType())
.orderByDesc(RobotTaskDetailActionLogDO::getCreateTime)
.last("limit 1"));
}
} }

View File

@ -174,6 +174,12 @@ public class PathPlanningServiceImpl implements PathPlanningService {
assembleDataToPP(relatedPathNode, positionMapLineDOS); assembleDataToPP(relatedPathNode, positionMapLineDOS);
} }
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
// commonApi.commonMethod(new PositionMapLineDTO(), PathPlanningTopicConstant.SYNCHRONOUS_ALL_MAP_LINE_END); // commonApi.commonMethod(new PositionMapLineDTO(), PathPlanningTopicConstant.SYNCHRONOUS_ALL_MAP_LINE_END);
mqttUtils.pub(PathPlanningTopicConstant.SYNCHRONOUS_ALL_MAP_LINE_END,JSON.toJSONString(new PositionMapLineDO())); mqttUtils.pub(PathPlanningTopicConstant.SYNCHRONOUS_ALL_MAP_LINE_END,JSON.toJSONString(new PositionMapLineDO()));
} }

View File

@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.system.service.positionmap;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.system.controller.admin.positionmap.dto.PositionMapConditionDTO; import cn.iocoder.yudao.module.system.controller.admin.positionmap.dto.PositionMapConditionDTO;
import cn.iocoder.yudao.module.system.controller.admin.positionmap.dto.PositionMapConfigDTO;
import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapItemPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapItemPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapItemSaveReqVO; import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapItemSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapItemDO; import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapItemDO;
@ -151,4 +152,6 @@ public interface PositionMapItemService extends IService<PositionMapItemDO> {
* @param mapId * @param mapId
*/ */
void checkHaveBindChangePoint(Long mapId); void checkHaveBindChangePoint(Long mapId);
PositionMapConfigDTO getCheckDistance();
} }

View File

@ -7,9 +7,11 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.module.mqtt.api.task.dto.Pose2ds; import cn.iocoder.yudao.module.mqtt.api.task.dto.Pose2ds;
import cn.iocoder.yudao.module.system.config.poperties.ZnConfigConstant;
import cn.iocoder.yudao.module.system.constant.robot.RobotTaskChcheConstant; import cn.iocoder.yudao.module.system.constant.robot.RobotTaskChcheConstant;
import cn.iocoder.yudao.module.system.controller.admin.log.vo.UserOperationLogSaveReqVO; import cn.iocoder.yudao.module.system.controller.admin.log.vo.UserOperationLogSaveReqVO;
import cn.iocoder.yudao.module.system.controller.admin.positionmap.dto.PositionMapConditionDTO; import cn.iocoder.yudao.module.system.controller.admin.positionmap.dto.PositionMapConditionDTO;
import cn.iocoder.yudao.module.system.controller.admin.positionmap.dto.PositionMapConfigDTO;
import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapItemPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapItemPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapItemSaveReqVO; import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapItemSaveReqVO;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotWarnMsgSaveReqVO; import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotWarnMsgSaveReqVO;
@ -26,6 +28,7 @@ import cn.iocoder.yudao.module.system.service.robot.RobotWarnMsgService;
import cn.iocoder.yudao.module.system.util.redis.RedisUtil; import cn.iocoder.yudao.module.system.util.redis.RedisUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@ -66,6 +69,9 @@ public class PositionMapItemServiceImpl extends ServiceImpl<PositionMapItemMappe
@Resource @Resource
private PositionChangePointBindingMapper positionChangePointBindingMapper; private PositionChangePointBindingMapper positionChangePointBindingMapper;
@Autowired
private ZnConfigConstant znConfigConstant;
@Override @Override
public Long createPositionMapItem(PositionMapItemSaveReqVO createReqVO) { public Long createPositionMapItem(PositionMapItemSaveReqVO createReqVO) {
// 插入 // 插入
@ -267,4 +273,12 @@ public class PositionMapItemServiceImpl extends ServiceImpl<PositionMapItemMappe
throw exception(MAP_EXIST_BINDING_POINT); throw exception(MAP_EXIST_BINDING_POINT);
} }
@Override
public PositionMapConfigDTO getCheckDistance() {
PositionMapConfigDTO configDTO = new PositionMapConfigDTO();
configDTO.setMapCheckDistance(znConfigConstant.getMapCheckDistance());
configDTO.setMapArcOffset(znConfigConstant.getMapArcOffset());
return configDTO;
}
} }

View File

@ -262,4 +262,7 @@ public interface RobotInformationService extends IService<RobotInformationDO> {
void stopRobot(String robotNo); void stopRobot(String robotNo);
void continueRobot(String robotNo); void continueRobot(String robotNo);
void initRobotInformation();
} }

View File

@ -362,7 +362,7 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
.last("limit 1")); .last("limit 1"));
RobotAcceptTaskDTO robotTask = new RobotAcceptTaskDTO(); RobotAcceptTaskDTO robotTask = new RobotAcceptTaskDTO();
robotTask.setOrderId(robotInformationDO.getTaskDetailId()+""); robotTask.setOrderId(robotInformationDO.getTaskDetailId() + "");
robotTask.setTopic(RobotTopicConstant.ROBOT_TASK_MOVE_TOPIC + robotInformationDO.getMacAddress()); robotTask.setTopic(RobotTopicConstant.ROBOT_TASK_MOVE_TOPIC + robotInformationDO.getMacAddress());
robotTask.setExecutionType(ExecutionTypeEnum.PAUSE.getType()); robotTask.setExecutionType(ExecutionTypeEnum.PAUSE.getType());
mqttUtils.pub(robotTask.getTopic(), JSON.toJSONString(robotTask)); mqttUtils.pub(robotTask.getTopic(), JSON.toJSONString(robotTask));
@ -377,13 +377,18 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
.last("limit 1")); .last("limit 1"));
RobotAcceptTaskDTO robotTask = new RobotAcceptTaskDTO(); RobotAcceptTaskDTO robotTask = new RobotAcceptTaskDTO();
robotTask.setOrderId(robotInformationDO.getTaskDetailId()+""); robotTask.setOrderId(robotInformationDO.getTaskDetailId() + "");
robotTask.setTopic(RobotTopicConstant.ROBOT_TASK_MOVE_TOPIC + robotInformationDO.getMacAddress()); robotTask.setTopic(RobotTopicConstant.ROBOT_TASK_MOVE_TOPIC + robotInformationDO.getMacAddress());
robotTask.setExecutionType(ExecutionTypeEnum.CONTINUE.getType()); robotTask.setExecutionType(ExecutionTypeEnum.CONTINUE.getType());
mqttUtils.pub(robotTask.getTopic(), JSON.toJSONString(robotTask)); mqttUtils.pub(robotTask.getTopic(), JSON.toJSONString(robotTask));
mapStopService.rcsDeleteStopRobotAddLog(robotNo); mapStopService.rcsDeleteStopRobotAddLog(robotNo);
} }
@Override
public void initRobotInformation() {
informationMapper.initRobotInformation();
}
/** /**
* 校验IP地址是否合法 * 校验IP地址是否合法
@ -438,8 +443,8 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
if (RobotStatusEnum.STOP_FREE.getType().equals(updateReqVO.getRobotStatus()) if (RobotStatusEnum.STOP_FREE.getType().equals(updateReqVO.getRobotStatus())
|| RobotStatusEnum.STOP_DOING.getType().equals(updateReqVO.getRobotStatus())) { || RobotStatusEnum.STOP_DOING.getType().equals(updateReqVO.getRobotStatus())) {
updateReqVO.setRobotStatus(robotInformationDO.getRobotStatus()); updateReqVO.setRobotStatus(robotInformationDO.getRobotStatus());
}else if (!updateReqVO.getRobotStatus().equals(robotInformationDO.getRobotStatus())) { } else if (!updateReqVO.getRobotStatus().equals(robotInformationDO.getRobotStatus())) {
str = str + " 修改车辆状态: " +RobotStatusEnum.getMsg(updateReqVO.getRobotStatus()); str = str + " 修改车辆状态: " + RobotStatusEnum.getMsg(updateReqVO.getRobotStatus());
} }
if (!updateReqVO.getRobotNo().equals(robotInformationDO.getRobotNo())) { if (!updateReqVO.getRobotNo().equals(robotInformationDO.getRobotNo())) {
@ -698,6 +703,16 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
List<RobotCameraAddVO> cameraAddVOList = cameraService.getCameraByRobotNo(robotInformationDO.getRobotNo()); List<RobotCameraAddVO> cameraAddVOList = cameraService.getCameraByRobotNo(robotInformationDO.getRobotNo());
bean.setCameraAddVOList(cameraAddVOList); bean.setCameraAddVOList(cameraAddVOList);
List<RobotMapStopDO> stopRobotNoByRobotNo = mapStopService.getStopRobotNoByRobotNo(robotInformationDO.getRobotNo());
if (ObjectUtil.isEmpty(stopRobotNoByRobotNo)) {
return bean;
} else if (RobotStatusEnum.STAND_BY.getType().equals(robotInformationDO.getRobotStatus())) {
robotInformationDO.setRobotStatus(RobotStatusEnum.STOP_FREE.getType());
} else {
robotInformationDO.setRobotStatus(RobotStatusEnum.STOP_DOING.getType());
}
return bean; return bean;
} }
@ -712,11 +727,19 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
@Override @Override
public PageResult<RobotInformationPageRespVO> getInformationPage(RobotInformationPageReqVO pageReqVO) { public PageResult<RobotInformationPageRespVO> getInformationPage(RobotInformationPageReqVO pageReqVO) {
PageResult<RobotInformationDO> pageResult = informationMapper.selectPage(pageReqVO); List<RobotInformationDO> list = informationMapper.selectList(new LambdaQueryWrapperX<RobotInformationDO>()
.eqIfPresent(RobotInformationDO::getRobotModelId, pageReqVO.getRobotModelId())
.eqIfPresent(RobotInformationDO::getRobotModelNumber, pageReqVO.getRobotModelNumber())
.likeIfPresent(RobotInformationDO::getRobotNo, pageReqVO.getRobotNo())
.eqIfPresent(RobotInformationDO::getRobotTaskModel, pageReqVO.getRobotTaskModel())
.eqIfPresent(RobotInformationDO::getMacAddress, pageReqVO.getMacAddress())
.eqIfPresent(RobotInformationDO::getRobotStatus, pageReqVO.getRobotStatus())
.betweenIfPresent(RobotInformationDO::getCreateTime, pageReqVO.getCreateTime())
.orderByDesc(RobotInformationDO::getId));
PageResult<RobotInformationPageRespVO> dataPage = new PageResult<>(); PageResult<RobotInformationPageRespVO> dataPage = new PageResult<>();
dataPage.setTotal(pageResult.getTotal()); Long total = ObjectUtil.isEmpty(list) ? 0L : list.size();
List<RobotInformationDO> list = pageResult.getList(); dataPage.setTotal(total);
List<RobotInformationPageRespVO> targetList = BeanUtil.copyToList(list, RobotInformationPageRespVO.class); List<RobotInformationPageRespVO> targetList = BeanUtil.copyToList(list, RobotInformationPageRespVO.class);
List<RobotMapStopDO> allRobotMapStops = mapStopService.getAllRobotMapStops(ZeroOneEnum.ONE.getType()); List<RobotMapStopDO> allRobotMapStops = mapStopService.getAllRobotMapStops(ZeroOneEnum.ONE.getType());
@ -726,7 +749,7 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
} }
for (RobotInformationPageRespVO v : targetList) { for (RobotInformationPageRespVO v : targetList) {
setMsgAndRobotStatus(v,stopRobotNos); setMsgAndRobotStatus(v, stopRobotNos);
} }
if (ObjectUtil.isNotEmpty(pageReqVO.getRobotStatisticsType())) { if (ObjectUtil.isNotEmpty(pageReqVO.getRobotStatisticsType())) {
@ -789,7 +812,7 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
* *
* @param v * @param v
*/ */
private void setMsgAndRobotStatus(RobotInformationPageRespVO v,List<String> stopRobotNos) { private void setMsgAndRobotStatus(RobotInformationPageRespVO v, List<String> stopRobotNos) {
if (ObjectUtil.isNotEmpty(stopRobotNos) && stopRobotNos.contains(v.getRobotNo())) { if (ObjectUtil.isNotEmpty(stopRobotNos) && stopRobotNos.contains(v.getRobotNo())) {
v.setIsStop(ZeroOneEnum.ONE.getType()); v.setIsStop(ZeroOneEnum.ONE.getType());
@ -1220,7 +1243,14 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void doTaskContinue(String robotNo, Boolean isRobot) { public void doTaskContinue(String robotNo, Boolean isRobot) {
RobotTaskDetailActionLogDO actionLog = taskDetailActionLogService.getOriginalLastTaskByRobotNo(robotNo); RobotInformationDO robotInformationDO = informationMapper.selectOne(new LambdaQueryWrapper<RobotInformationDO>()
.eq(RobotInformationDO::getRobotNo, robotNo)
.last("limit 1"));
if (ObjectUtil.isEmpty(robotInformationDO.getTaskDetailId())) {
throw exception(ROBOT_LAST_TASK_NO_EXISTS);
}
RobotTaskDetailActionLogDO actionLog = taskDetailActionLogService.getLastActionLogByDetailId(robotInformationDO.getTaskDetailId());
if (ObjectUtil.isEmpty(actionLog)) { if (ObjectUtil.isEmpty(actionLog)) {
throw exception(ROBOT_LAST_TASK_NO_EXISTS); throw exception(ROBOT_LAST_TASK_NO_EXISTS);
} }
@ -1230,10 +1260,6 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
TASK_ASSIGN_OTHER_ROBOT.getMsg() + actionLog.getRobotNo()); TASK_ASSIGN_OTHER_ROBOT.getMsg() + actionLog.getRobotNo());
} }
RobotInformationDO robotInformationDO = informationMapper.selectOne(new LambdaQueryWrapper<RobotInformationDO>()
.eq(RobotInformationDO::getRobotNo, robotNo)
.last("limit 1"));
if (RobotTaskModelEnum.REJECTION.getType().equals(robotInformationDO.getRobotTaskModel())) { if (RobotTaskModelEnum.REJECTION.getType().equals(robotInformationDO.getRobotTaskModel())) {
throw exception(ROBOT_REJECTION); throw exception(ROBOT_REJECTION);
} }
@ -1241,11 +1267,9 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
String mac = getMacByRobotNo(robotNo); String mac = getMacByRobotNo(robotNo);
robotCloseTaskDetail(actionLog.getTaskDetailId() + "", mac, actionLog.getCommandType()); robotCloseTaskDetail(actionLog.getTaskDetailId() + "", mac, actionLog.getCommandType());
if (!znConfigConstant.getIsSimulation()) { checkTaskDone(actionLog.getTaskDetailId() + "");
checkTaskDone(actionLog.getTaskDetailId() + "");
}
CleanAgvDTO build = CleanAgvDTO.builder().robotNo(robotNo).build(); // CleanAgvDTO build = CleanAgvDTO.builder().robotNo(robotNo).build();
// commonApi.commonMethod(build, PathPlanningTopicConstant.CLEAN_AGV); // commonApi.commonMethod(build, PathPlanningTopicConstant.CLEAN_AGV);
// mqttUtils.pub(PathPlanningTopicConstant.CLEAN_AGV, JSON.toJSONString(build)); // mqttUtils.pub(PathPlanningTopicConstant.CLEAN_AGV, JSON.toJSONString(build));
@ -1325,15 +1349,14 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
String plantingKey = PathPlanningChcheConstant.PATH_PLANNING_TASK + pathPlanning.getOrderId(); String plantingKey = PathPlanningChcheConstant.PATH_PLANNING_TASK + pathPlanning.getOrderId();
redisUtil.set(plantingKey, JSON.toJSONString(pathPlanning), znConfigConstant.getTask().getTaskCacheTime()); redisUtil.set(plantingKey, JSON.toJSONString(pathPlanning), znConfigConstant.getTask().getTaskCacheTime());
log.info("任务下发给PP :{}", JSON.toJSONString(pathPlanningList)); log.info("111111恢复任务下发给PP :{}", JSON.toJSONString(pathPlanningList));
// commonApi.commonMethod(pathPlanningList, PathPlanningTopicConstant.TASK_ASSIGNMENT_REQUEST);
mqttUtils.pub(PathPlanningTopicConstant.TASK_ASSIGNMENT_REQUEST, JSON.toJSONString(pathPlanningList)); mqttUtils.pub(PathPlanningTopicConstant.TASK_ASSIGNMENT_REQUEST, JSON.toJSONString(pathPlanningList));
} }
private void resendToPPData(TaskToPathPlanningDTO pathPlanning, RobotTaskDetailActionLogDO actionLog, RobotInformationDO robotInformationDO, Boolean isRemote) { private void resendToPPData(TaskToPathPlanningDTO pathPlanning, RobotTaskDetailActionLogDO actionLog, RobotInformationDO robotInformationDO, Boolean isRemote) {
if (PathTaskTypeEnum.MOVE_TO_WAIT.getType().equals(actionLog.getCommandType()) if (PathTaskTypeEnum.MOVE_TO_WAIT.getType().equals(actionLog.getCommandType())
|| PathTaskTypeEnum.MOVE_TO_WAIT_STOP.getType().equals(actionLog.getCommandType())) { || PathTaskTypeEnum.MOVE_TO_WAIT_STOP.getType().equals(actionLog.getCommandType())) {
moveToWaitTask(pathPlanning, actionLog.getRobotNo()); moveToWaitTask(pathPlanning, robotInformationDO.getRobotNo());
} else if (PathTaskTypeEnum.CHARGE.getType().equals(actionLog.getCommandType()) } else if (PathTaskTypeEnum.CHARGE.getType().equals(actionLog.getCommandType())
|| PathTaskTypeEnum.AUTO_CHARGE.getType().equals(actionLog.getCommandType())) { || PathTaskTypeEnum.AUTO_CHARGE.getType().equals(actionLog.getCommandType())) {
chargeTask(pathPlanning, robotInformationDO); chargeTask(pathPlanning, robotInformationDO);
@ -1642,7 +1665,7 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
List<RobotInformationDO> robotInformationDOS = informationMapper.selectList(new LambdaQueryWrapperX<RobotInformationDO>() List<RobotInformationDO> robotInformationDOS = informationMapper.selectList(new LambdaQueryWrapperX<RobotInformationDO>()
.in(RobotInformationDO::getRobotNo, robotNos)); .in(RobotInformationDO::getRobotNo, robotNos));
for (RobotInformationDO robotInformationDO : robotInformationDOS) { for (RobotInformationDO robotInformationDO : robotInformationDOS) {
robotSimulationPose.setOrderId(robotInformationDO.getTaskDetailId()+""); robotSimulationPose.setOrderId(robotInformationDO.getTaskDetailId() + "");
mqttUtils.pub(RobotTopicConstant.ROBOT_TASK_MOVE_TOPIC + robotInformationDO.getMacAddress(), JSON.toJSONString(robotSimulationPose)); mqttUtils.pub(RobotTopicConstant.ROBOT_TASK_MOVE_TOPIC + robotInformationDO.getMacAddress(), JSON.toJSONString(robotSimulationPose));
UserOperationLogSaveReqVO operationLog = UserOperationLogSaveReqVO.builder() UserOperationLogSaveReqVO operationLog = UserOperationLogSaveReqVO.builder()
.operateAction(str + robotInformationDO.getRobotNo()) .operateAction(str + robotInformationDO.getRobotNo())
@ -1772,6 +1795,10 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
TaskToPathPlanningDTO pathPlanning = JSONUtil.toBean((String) o, TaskToPathPlanningDTO.class); TaskToPathPlanningDTO pathPlanning = JSONUtil.toBean((String) o, TaskToPathPlanningDTO.class);
robotInformationDO.setTaskDetailId(id);
robotInformationDO.setRobotStatus(RobotStatusEnum.DOING.getType());
informationMapper.updateById(robotInformationDO);
TaskRobotNoLimittationAreaDTO taskRobotNoLimittationAreaDTO = TaskRobotNoLimittationAreaDTO taskRobotNoLimittationAreaDTO =
robotPathPlanningService.getRobotNoLimitationArea(Collections.singletonList(robotInformationDO)).get(0); robotPathPlanningService.getRobotNoLimitationArea(Collections.singletonList(robotInformationDO)).get(0);

View File

@ -230,7 +230,7 @@ public class RobotTaskDetailServiceImpl implements RobotTaskDetailService {
.id(robotTaskDetailDO.getId().toString()) .id(robotTaskDetailDO.getId().toString())
.build(); .build();
// commonApi.commonMethod(closePathPlanting, PathPlanningTopicConstant.KILL_TASK); // commonApi.commonMethod(closePathPlanting, PathPlanningTopicConstant.KILL_TASK);
mqttUtils.pub(PathPlanningTopicConstant.KILL_TASK,JSON.toJSONString(closePathPlanting)); mqttUtils.pub(PathPlanningTopicConstant.KILL_TASK, JSON.toJSONString(closePathPlanting));
} }
@Override @Override
@ -258,18 +258,28 @@ public class RobotTaskDetailServiceImpl implements RobotTaskDetailService {
|| RobotTaskStageEnum.GO_TAKE.getType().equals(detailDO.getTaskStage()) || RobotTaskStageEnum.GO_TAKE.getType().equals(detailDO.getTaskStage())
|| RobotTaskStageEnum.TAKEING.getType().equals(detailDO.getTaskStage())) { || RobotTaskStageEnum.TAKEING.getType().equals(detailDO.getTaskStage())) {
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.TAKEING_EXCEPTION.getType()); robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.TAKEING_EXCEPTION.getType());
}else { } else {
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.RELEASEING_EXCEPTION.getType()); robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.RELEASEING_EXCEPTION.getType());
} }
} else if(RobotTaskTypeEnum.TAKE.getType().equals(detailDO.getTaskType())) { } else if (RobotTaskTypeEnum.TAKE.getType().equals(detailDO.getTaskType())) {
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.TAKEING_EXCEPTION.getType()); robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.TAKEING_EXCEPTION.getType());
}else if(RobotTaskTypeEnum.RELEASE.getType().equals(detailDO.getTaskType())) { } else if (RobotTaskTypeEnum.RELEASE.getType().equals(detailDO.getTaskType())) {
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.RELEASEING_EXCEPTION.getType()); robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.RELEASEING_EXCEPTION.getType());
}else { } else {
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.EXCEPTION.getType()); robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.EXCEPTION.getType());
} }
robotTaskDetailDO.setOccurError(ZeroOneEnum.ONE.getType()); robotTaskDetailDO.setOccurError(ZeroOneEnum.ONE.getType());
taskDetailMapper.updateById(robotTaskDetailDO); taskDetailMapper.updateRobotDetailById(robotTaskDetailDO);
List<RobotTaskDetailDO> taskDetailDOS = taskDetailMapper.selectList(new LambdaQueryWrapperX<RobotTaskDetailDO>()
.eq(RobotTaskDetailDO::getRobotTaskId, detailDO.getRobotTaskId()));
if (taskDetailDOS.size() > 1) {
return;
}
RobotTaskDO robotTaskDO = new RobotTaskDO();
robotTaskDO.setId(detailDO.getRobotTaskId());
robotTaskDO.setTaskStatus(RobotTaskDetailStatusEnum.ABNORMAL.getType());
robotTaskMapper.updateRobot(robotTaskDO);
} }
/** /**

View File

@ -533,9 +533,8 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper, RobotTask
if (ObjectUtil.isEmpty(cargoDetected) || RobotStatusCodeConstant.CARGO_DETECTED.equals(cargoDetected)) { if (ObjectUtil.isEmpty(cargoDetected) || RobotStatusCodeConstant.CARGO_DETECTED.equals(cargoDetected)) {
robotInformationDO.setRobotTaskModel(RobotTaskModelEnum.REJECTION.getType()); robotInformationDO.setRobotTaskModel(RobotTaskModelEnum.REJECTION.getType());
}*/ }*/
//因为机器人如果正在抬叉取货这时把任务取消如果货叉刚好伸到托盘底下还是需要人为控制
// robotInformationDO.setRobotTaskModel(RobotTaskModelEnum.REJECTION.getType()); // robotInformationDO.setRobotTaskModel(RobotTaskModelEnum.REJECTION.getType());
robotInformationDO.setRobotStatus(RobotStatusEnum.STAND_BY.getType()); // robotInformationDO.setRobotStatus(RobotStatusEnum.STAND_BY.getType());
} }
informationMapper.updateById(robotInformationDOS); informationMapper.updateById(robotInformationDOS);
@ -1687,6 +1686,9 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper, RobotTask
case RELEASE: case RELEASE:
msg = "放货点 " + robotTaskRespVO.getToLocationNo(); msg = "放货点 " + robotTaskRespVO.getToLocationNo();
break; break;
case MOVE_TO_POINT:
msg = "移动到点位 " + robotTaskRespVO.getToLocationNo();
break;
default: default:
log.error("任务类型不存在"); log.error("任务类型不存在");
} }

View File

@ -30,6 +30,7 @@ import javax.annotation.Resource;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -94,7 +95,7 @@ public class CycleServiceImpl implements CycleService {
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()); String incrementByKey = redisUtil.getIncrementByKey(RobotCacheLockEnum.MOVE_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);
@ -136,6 +137,22 @@ public class CycleServiceImpl implements CycleService {
robotTaskService.addCycle(k,v); robotTaskService.addCycle(k,v);
}); });
taskCycleMapper.deletByRobotTaskIds(taskIds); taskCycleMapper.deletByRobotTaskIds(taskIds);
setTaskUnDo();
}
public void setTaskUnDo() {
List<RobotTaskDetailDO> detailDOS = taskDetailMapper.selectAutoCreateCycleTaskForever();
if (ObjectUtil.isEmpty(detailDOS)) {
return;
}
List<Long> detailIds = new ArrayList<>();
Set<Long> taskIds = new HashSet<>();
for (RobotTaskDetailDO detail : detailDOS) {
detailIds.add(detail.getId());
taskIds.add(detail.getRobotTaskId());
}
taskDetailMapper.setTaskUnDo(detailIds);
taskMapper.setTaskUnDo(taskIds);
} }
private List<RobotTaskDetailDO> getTaskDetailData(RobotTaskDO taskData, Map<Long, private List<RobotTaskDetailDO> getTaskDetailData(RobotTaskDO taskData, Map<Long,
@ -194,7 +211,7 @@ public class CycleServiceImpl implements CycleService {
* @return * @return
*/ */
public RobotTaskDO getTaskData(String incrementByKey, RobotTaskDO v ) { public RobotTaskDO getTaskData(String incrementByKey, RobotTaskDO v ) {
String taskNoStr = znConfigConstant.getTaskNo() + DateUtils.getYearMonthDay() + incrementByKey; String taskNoStr = znConfigConstant.getMoveNo() + DateUtils.getYearMonthDay() + incrementByKey;
RobotTaskDO task = new RobotTaskDO(); RobotTaskDO task = new RobotTaskDO();
BeanUtils.copyProperties(v, task); BeanUtils.copyProperties(v, task);
task.setRemainingCycleNumber(v.getRemainingCycleNumber() - 1); task.setRemainingCycleNumber(v.getRemainingCycleNumber() - 1);

View File

@ -80,11 +80,11 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
CommonConfigDO commonConfigDO = configMapper.selectOne(new LambdaQueryWrapper<CommonConfigDO>() CommonConfigDO commonConfigDO = configMapper.selectOne(new LambdaQueryWrapper<CommonConfigDO>()
.eq(CommonConfigDO::getConfigType, CommandConfigTypeEnum.CHARG_CONFIG.getType())); .eq(CommonConfigDO::getConfigType, CommandConfigTypeEnum.CHARG_CONFIG.getType()));
Boolean needDoCharge = needDoCharge(commonConfigDO); /*Boolean needDoCharge = needDoCharge(commonConfigDO);
if (needDoCharge) { if (needDoCharge) {
log.info("所有机器人都需要去执行充电任务"); log.info("所有机器人都需要去执行充电任务");
return pair; return pair;
} }*/
List<String> remoteRobotNos = controllerInformationMapper.getRemoteControllerRobotNos(); List<String> remoteRobotNos = controllerInformationMapper.getRemoteControllerRobotNos();
log.info("远遥中的车辆 :{}",JSON.toJSONString(remoteRobotNos)); log.info("远遥中的车辆 :{}",JSON.toJSONString(remoteRobotNos));
@ -123,6 +123,13 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
} }
String pose2dKey = RobotTaskChcheConstant.ROBOT_INFORMATION_POSE_BAT + robot.getMacAddress();
Object pose = redisUtil.get(pose2dKey);
if (ObjectUtil.isEmpty(pose)) {
log.info("车辆没有点位信息 :{}",robot.getRobotNo());
continue;
}
//取货的先执行放货再去充电 //取货的先执行放货再去充电
/*if (ObjectUtil.isNotEmpty(lastTaskDetailMap) && ObjectUtil.isNotEmpty(lastTaskDetailMap.get(robot.getRobotNo()))) { /*if (ObjectUtil.isNotEmpty(lastTaskDetailMap) && ObjectUtil.isNotEmpty(lastTaskDetailMap.get(robot.getRobotNo()))) {
robot.setRobotStatus(RobotStatusEnum.LAST_TASK_IS_TAKE.getType()); robot.setRobotStatus(RobotStatusEnum.LAST_TASK_IS_TAKE.getType());

View File

@ -0,0 +1,6 @@
package cn.iocoder.yudao.module.system.service.robot.job;
public interface InitTaskService {
void initTask();
}

View File

@ -0,0 +1,45 @@
package cn.iocoder.yudao.module.system.service.robot.job;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
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.dal.mysql.robot.RobotTaskMapper;
import cn.iocoder.yudao.module.system.enums.robot.RobotTaskStatusEnum;
import cn.iocoder.yudao.module.system.service.robot.RobotInformationService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Slf4j
@Service
public class InitTaskServiceImpl implements InitTaskService{
@Resource
private RobotTaskDetailMapper taskDetailMapper;
@Resource
private RobotTaskMapper robotTaskMapper;
@Resource
private RobotInformationService informationService;
@Override
public void initTask() {
log.info("将任务清除,上线时候,禁止使用");
List<RobotTaskDetailDO> taskDetailDOS = taskDetailMapper.selectList(new LambdaQueryWrapperX<RobotTaskDetailDO>()
.eq(RobotTaskDetailDO::getTaskStatus, RobotTaskStatusEnum.DOING.getType()));
if (ObjectUtil.isNotEmpty(taskDetailDOS)) {
for (RobotTaskDetailDO taskDetail : taskDetailDOS) {
String mac = informationService.getMacByRobotNo(taskDetail.getRobotNo());
informationService.robotCloseTaskDetail(String.valueOf(taskDetail.getId()), mac, "");
}
}
taskDetailMapper.truncate();
robotTaskMapper.truncate();
informationService.initRobotInformation();
}
}

View File

@ -120,7 +120,7 @@ public class RobotMapStopServiceImpl extends ServiceImpl<RobotMapStopMapper, Rob
@Override @Override
public List<String> getStopRobotNoByMapIds(Long id) { public List<String> getStopRobotNoByMapIds(Long id) {
List<RobotMapStopDO> positionMapItems = mapStopMapper.selectList(new LambdaQueryWrapperX<RobotMapStopDO>() List<RobotMapStopDO> positionMapItems = mapStopMapper.selectList(new LambdaQueryWrapperX<RobotMapStopDO>()
.eq(RobotMapStopDO::getStopType, ZeroOneEnum.ZERO.getType()) .eq(RobotMapStopDO::getStopType, ZeroOneEnum.ONE.getType())
.eq(RobotMapStopDO::getPositionMapId, id)); .eq(RobotMapStopDO::getPositionMapId, id));
if (ObjectUtil.isEmpty(positionMapItems)) { if (ObjectUtil.isEmpty(positionMapItems)) {
return new ArrayList<>(); return new ArrayList<>();

View File

@ -83,6 +83,9 @@ public class RobotWorkingHoursStatisticsServiceImpl extends ServiceImpl<RobotWor
&& RobotStatusEnum.STAND_BY.getType().equals(robot.getRobotStatus())) { && RobotStatusEnum.STAND_BY.getType().equals(robot.getRobotStatus())) {
RobotWorkingHoursStatisticsDO statisticsDO = new RobotWorkingHoursStatisticsDO(); RobotWorkingHoursStatisticsDO statisticsDO = new RobotWorkingHoursStatisticsDO();
statisticsDO.setDuration(getMinutes(freeTimeObject)); statisticsDO.setDuration(getMinutes(freeTimeObject));
if (statisticsDO.getDuration() == 0) {
continue;
}
statisticsDO.setRobotNo(robot.getRobotNo()); statisticsDO.setRobotNo(robot.getRobotNo());
Long mapId = informationService.getRobotMapIdByRobotNo(robot.getRobotNo()); Long mapId = informationService.getRobotMapIdByRobotNo(robot.getRobotNo());
if (ObjectUtil.isNotEmpty(mapId)) { if (ObjectUtil.isNotEmpty(mapId)) {
@ -112,11 +115,14 @@ public class RobotWorkingHoursStatisticsServiceImpl extends ServiceImpl<RobotWor
if (ObjectUtil.isNotEmpty(statisticsDOS)) { if (ObjectUtil.isNotEmpty(statisticsDOS)) {
robotWorkingHoursStatisticsMapper.insertBatch(statisticsDOS); robotWorkingHoursStatisticsMapper.insertBatch(statisticsDOS);
} }
} }
/** /**
* 创建这台车的空闲时间 * 创建这台车的空闲时间
* 别改事务传播 * 别改事务传播
*
* @param robotNo * @param robotNo
*/ */
@Override @Override
@ -164,15 +170,15 @@ public class RobotWorkingHoursStatisticsServiceImpl extends ServiceImpl<RobotWor
List<RobotWorkHourStatisticsDTO> list = new ArrayList<>(); List<RobotWorkHourStatisticsDTO> list = new ArrayList<>();
robotMap.forEach((k,v) ->{ robotMap.forEach((k, v) -> {
RobotWorkHourStatisticsDTO statisticsDTO = new RobotWorkHourStatisticsDTO(); RobotWorkHourStatisticsDTO statisticsDTO = new RobotWorkHourStatisticsDTO();
statisticsDTO.setRobotNo(k); statisticsDTO.setRobotNo(k);
Long freeTime = v.get(DurationTypeEnum.FREE_TIME.getType()); Long freeTime = v.get(DurationTypeEnum.FREE_TIME.getType());
String freeTimeStr = ObjectUtil.isNotEmpty(freeTime) ? String.format("%.1f",(freeTime.doubleValue() / 60)) : "0"; String freeTimeStr = ObjectUtil.isNotEmpty(freeTime) ? String.format("%.1f", (freeTime.doubleValue() / 60)) : "0";
Long taskTime = v.get(DurationTypeEnum.TASK_TIME.getType()); Long taskTime = v.get(DurationTypeEnum.TASK_TIME.getType());
String taskTimeStr = ObjectUtil.isNotEmpty(taskTime) ? String.format("%.1f",(taskTime.doubleValue() / 60)) : "0"; String taskTimeStr = ObjectUtil.isNotEmpty(taskTime) ? String.format("%.1f", (taskTime.doubleValue() / 60)) : "0";
Long chargeTime = v.get(DurationTypeEnum.CHARGE_TIME.getType()); Long chargeTime = v.get(DurationTypeEnum.CHARGE_TIME.getType());
String chargeTimeStr = ObjectUtil.isNotEmpty(chargeTime) ? String.format("%.1f",(chargeTime.doubleValue() / 60)) : "0"; String chargeTimeStr = ObjectUtil.isNotEmpty(chargeTime) ? String.format("%.1f", (chargeTime.doubleValue() / 60)) : "0";
statisticsDTO.setFreeTimeNum(freeTimeStr); statisticsDTO.setFreeTimeNum(freeTimeStr);
statisticsDTO.setTaskTimeNum(taskTimeStr); statisticsDTO.setTaskTimeNum(taskTimeStr);
@ -201,6 +207,9 @@ public class RobotWorkingHoursStatisticsServiceImpl extends ServiceImpl<RobotWor
private List<RobotWorkingHoursStatisticsDO> getWorkingHoursStatisticsByActionLog(List<RobotTaskDetailActionLogDO> actionLogList) { private List<RobotWorkingHoursStatisticsDO> getWorkingHoursStatisticsByActionLog(List<RobotTaskDetailActionLogDO> actionLogList) {
List<RobotWorkingHoursStatisticsDO> statisticsDOList = new ArrayList<>(); List<RobotWorkingHoursStatisticsDO> statisticsDOList = new ArrayList<>();
List<Long> logIds = new ArrayList<>();
Map<String, RobotWorkingHoursStatisticsDO> map = new HashMap<>();
for (RobotTaskDetailActionLogDO v : actionLogList) { for (RobotTaskDetailActionLogDO v : actionLogList) {
RobotWorkingHoursStatisticsDO statisticsDO = new RobotWorkingHoursStatisticsDO(); RobotWorkingHoursStatisticsDO statisticsDO = new RobotWorkingHoursStatisticsDO();
if (ObjectUtil.isNotEmpty(v.getDuration())) { if (ObjectUtil.isNotEmpty(v.getDuration())) {
@ -215,9 +224,21 @@ public class RobotWorkingHoursStatisticsServiceImpl extends ServiceImpl<RobotWor
statisticsDO.setPositionMapId(v.getPositionMapId()); statisticsDO.setPositionMapId(v.getPositionMapId());
Integer durationTypeByTaskType = DurationTypeEnum.getDurationTypeByTaskType(v.getCommandType()); Integer durationTypeByTaskType = DurationTypeEnum.getDurationTypeByTaskType(v.getCommandType());
statisticsDO.setDurationType(durationTypeByTaskType); statisticsDO.setDurationType(durationTypeByTaskType);
statisticsDOList.add(statisticsDO); logIds.add(v.getId());
String key = statisticsDO.getRobotNo() + "-" + statisticsDO.getPositionMapId() + "-" + statisticsDO.getDurationType();
RobotWorkingHoursStatisticsDO statistics = map.get(key);
if (ObjectUtil.isNotEmpty(statistics)) {
statistics.setDuration(statistics.getDuration()+statisticsDO.getDuration());
} else {
statisticsDOList.add(statisticsDO);
}
} }
if (ObjectUtil.isEmpty(logIds)) {
return statisticsDOList;
}
taskDetailActionLogService.alreadyCounted(logIds);
return statisticsDOList; return statisticsDOList;
} }

View File

@ -191,7 +191,7 @@ zn:
camera_secret_key: A2C4rv7DY012c9ef #摄像头秘钥 camera_secret_key: A2C4rv7DY012c9ef #摄像头秘钥
do_cycle: true #是否开启循环 do_cycle: true #是否开启循环
lane_auto_move: true #线库是否自动移库 true:线库执行自动移库 、false线库关闭执行自动移库 lane_auto_move: true #线库是否自动移库 true:线库执行自动移库 、false线库关闭执行自动移库
robot_position_cache_time: 10000000 #机器人上报点位存储时间(秒) robot_position_cache_time: 3 #机器人上报点位存储时间(秒)
cycle_do_auto_move: true #存在循环的任务,是否开启自动移库. true:存在循环任务,开启自动移库; false有循环任务不自动移库 cycle_do_auto_move: true #存在循环的任务,是否开启自动移库. true:存在循环任务,开启自动移库; false有循环任务不自动移库
full_electricity: 95 #机器人充满电的电量 full_electricity: 95 #机器人充满电的电量
task_need_single: true #机器人对同一线库/点位是不是只能有一台机器人做任务 (true:一个点位/线库,只有一台机器人) task_need_single: true #机器人对同一线库/点位是不是只能有一台机器人做任务 (true:一个点位/线库,只有一台机器人)
@ -214,6 +214,8 @@ zn:
task_not_check: true # 创建任务不校验 task_not_check: true # 创建任务不校验
check_shortest_distance: 1.5 # 检测点最短距离 check_shortest_distance: 1.5 # 检测点最短距离
check_longest_distance: 3.0 # 检测点最长距离 check_longest_distance: 3.0 # 检测点最长距离
map_check_distance: 2.2 #检测点成成距离
map_arc_offset: 15 #地图弧线距离
#海康威视的相关配置 #海康威视的相关配置

View File

@ -226,7 +226,7 @@ zn:
camera_secret_key: A2C4rv7DY012c9ef #摄像头秘钥 camera_secret_key: A2C4rv7DY012c9ef #摄像头秘钥
do_cycle: true #是否开启循环 do_cycle: true #是否开启循环
lane_auto_move: true #线库是否自动移库 true:线库执行自动移库 、false线库关闭执行自动移库 lane_auto_move: true #线库是否自动移库 true:线库执行自动移库 、false线库关闭执行自动移库
robot_position_cache_time: 10000000 #机器人上报点位存储时间(秒) robot_position_cache_time: 3 #机器人上报点位存储时间(秒)
cycle_do_auto_move: true #存在循环的任务,是否开启自动移库. true:存在循环任务,开启自动移库; false有循环任务不自动移库 cycle_do_auto_move: true #存在循环的任务,是否开启自动移库. true:存在循环任务,开启自动移库; false有循环任务不自动移库
full_electricity: 95 #机器人充满电的电量 full_electricity: 95 #机器人充满电的电量
task_need_single: true #机器人对同一线库/点位是不是只能有一台机器人做任务 (true:一个点位/线库,只有一台机器人) task_need_single: true #机器人对同一线库/点位是不是只能有一台机器人做任务 (true:一个点位/线库,只有一台机器人)
@ -240,7 +240,7 @@ zn:
check_sku_info: true #校验物料信息 check_sku_info: true #校验物料信息
task_cache_time: 1209600 #任务缓存的时间, 默认一星期 task_cache_time: 1209600 #任务缓存的时间, 默认一星期
robot_config: #机器人取放货默认配置 robot_config: #机器人取放货默认配置
offset_height: 0.1 #叉起货需要在原来高度基础上偏移的高度 offset_height: 0.15 #叉起货需要在原来高度基础上偏移的高度
default_tray_height: 0.82 #默认每层高度 default_tray_height: 0.82 #默认每层高度
open_rate_limiter: true #是否开启限流 open_rate_limiter: true #是否开启限流
is_simulation: false # 是否为仿真环境 is_simulation: false # 是否为仿真环境
@ -249,6 +249,8 @@ zn:
task_not_check: true # 创建任务不校验 task_not_check: true # 创建任务不校验
check_shortest_distance: 1.5 # 检测点最短距离 check_shortest_distance: 1.5 # 检测点最短距离
check_longest_distance: 3.0 # 检测点最长距离 check_longest_distance: 3.0 # 检测点最长距离
map_check_distance: 2.2 #检测点成成距离
map_arc_offset: 15 #地图弧线距离
logging: logging:
file: file:

View File

@ -219,7 +219,7 @@ zn:
camera_secret_key: A2C4rv7DY012c9ef #摄像头秘钥 camera_secret_key: A2C4rv7DY012c9ef #摄像头秘钥
do_cycle: true #是否开启循环 do_cycle: true #是否开启循环
lane_auto_move: true #线库是否自动移库 true:线库执行自动移库 、false线库关闭执行自动移库 lane_auto_move: true #线库是否自动移库 true:线库执行自动移库 、false线库关闭执行自动移库
robot_position_cache_time: 10000000 #机器人上报点位存储时间(秒) robot_position_cache_time: 3 #机器人上报点位存储时间(秒)
cycle_do_auto_move: true #存在循环的任务,是否开启自动移库. true:存在循环任务,开启自动移库; false有循环任务不自动移库 cycle_do_auto_move: true #存在循环的任务,是否开启自动移库. true:存在循环任务,开启自动移库; false有循环任务不自动移库
full_electricity: 95 #机器人充满电的电量 full_electricity: 95 #机器人充满电的电量
task_need_single: true #机器人对同一线库/点位是不是只能有一台机器人做任务 (true:一个点位/线库,只有一台机器人) task_need_single: true #机器人对同一线库/点位是不是只能有一台机器人做任务 (true:一个点位/线库,只有一台机器人)
@ -242,6 +242,8 @@ zn:
task_not_check: true # 创建任务不校验 task_not_check: true # 创建任务不校验
check_shortest_distance: 1.5 # 检测点最短距离 check_shortest_distance: 1.5 # 检测点最短距离
check_longest_distance: 3.0 # 检测点最长距离 check_longest_distance: 3.0 # 检测点最长距离
map_check_distance: 2.2 #检测点成成距离
map_arc_offset: 15 #地图弧线距离
#海康威视的相关配置 #海康威视的相关配置
isc: isc:

View File

@ -537,8 +537,8 @@
ware_house_location ware_house_location
set set
area_name = null, area_name = null,
area_id = null, area_id = null
sku_info = null -- sku_info = null
where where
area_id = #{areaId} area_id = #{areaId}
</update> </update>

View File

@ -147,6 +147,15 @@
robot_no = #{robotNo} robot_no = #{robotNo}
</update> </update>
<update id="initRobotInformation">
update
robot_information
set
robot_status = '3',
robot_task_model = '1'
where deleted = '0'
</update>
<!--通过主键删除--> <!--通过主键删除-->
<delete id="deleteById"> <delete id="deleteById">
delete delete

View File

@ -19,6 +19,19 @@
task_detail_id = #{taskDetailId} task_detail_id = #{taskDetailId}
and command_id = '-1' and command_id = '-1'
</update> </update>
<update id="alreadyCounted">
update
robot_task_detail_action_log
set already_counted = '1'
where
id in
<foreach collection="ids" item="id" index="index" open="(" close=")"
separator=",">
#{id}
</foreach>
</update>
<select id="getMistakeTaskByCommandType" <select id="getMistakeTaskByCommandType"
resultType="cn.iocoder.yudao.module.system.dal.dataobject.log.RobotTaskDetailActionLogDO"> resultType="cn.iocoder.yudao.module.system.dal.dataobject.log.RobotTaskDetailActionLogDO">
select select
@ -45,7 +58,7 @@
from from
robot_task_detail_action_log robot_task_detail_action_log
where where
command_id != '-1' command_id is null
and deleted = '0' and deleted = '0'
and already_counted = '0' and already_counted = '0'
and create_time >= DATE_SUB(NOW(), INTERVAL 48 HOUR) and create_time >= DATE_SUB(NOW(), INTERVAL 48 HOUR)
@ -61,5 +74,6 @@
and deleted = '0' and deleted = '0'
and robot_no = #{robotNo} and robot_no = #{robotNo}
order by create_time desc order by create_time desc
limit 2
</select> </select>
</mapper> </mapper>

View File

@ -227,7 +227,8 @@
robot_task_detail t1, robot_task t2 robot_task_detail t1, robot_task t2
where where
t2.id = t1.robot_task_id t2.id = t1.robot_task_id
and t2.remaining_cycle_number > 1 and t2.remaining_cycle_number > 0
and t2.remaining_cycle_number != 1000000
and t2.task_status = '2' and t2.task_status = '2'
and t1.task_status = '2' and t1.task_status = '2'
and t1.deleted = '0' and t1.deleted = '0'
@ -381,6 +382,20 @@
</choose> </choose>
</where> </where>
</select> </select>
<select id="selectAutoCreateCycleTaskForever"
resultType="cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDetailDO">
select
t1.*
from
robot_task_detail t1, robot_task t2
where
t2.id = t1.robot_task_id
and t2.remaining_cycle_number = 1000000
and t2.task_status = '2'
and t1.task_status = '2'
and t1.deleted = '0'
and t2.deleted = '0'
</select>
<!--通过主键修改数据--> <!--通过主键修改数据-->
@ -447,6 +462,9 @@
<if test="updateTime != null"> <if test="updateTime != null">
update_time = #{updateTime}, update_time = #{updateTime},
</if> </if>
<if test="occurError != null">
occur_error = #{occurError},
</if>
<if test="deleted != null"> <if test="deleted != null">
deleted = #{deleted}, deleted = #{deleted},
</if> </if>
@ -466,6 +484,19 @@
#{id} #{id}
</foreach> </foreach>
</update> </update>
<update id="setTaskUnDo">
update
robot_task_detail
set
task_status = '0',
task_stage = '0'
where
id in
<foreach collection="ids" item="id" index="index" open="(" close=")"
separator=",">
#{id}
</foreach>
</update>
<!--通过主键删除--> <!--通过主键删除-->
<delete id="deleteById"> <delete id="deleteById">
@ -473,6 +504,9 @@
from robot_task_detail from robot_task_detail
where id = #{id} where id = #{id}
</delete> </delete>
<delete id="truncate">
TRUNCATE TABLE robot_task_detail
</delete>
</mapper> </mapper>

View File

@ -496,11 +496,28 @@
</foreach> </foreach>
</update> </update>
<update id="setTaskUnDo">
update
robot_task
set
task_status = '0',
task_stage = '0'
where
id in
<foreach collection="ids" item="id" index="index" open="(" close=")"
separator=",">
#{id}
</foreach>
</update>
<!--通过主键删除--> <!--通过主键删除-->
<delete id="deleteById"> <delete id="deleteById">
delete delete
from robot_task from robot_task
where id = #{id} where id = #{id}
</delete> </delete>
<delete id="truncate">
TRUNCATE TABLE robot_task
</delete>
</mapper> </mapper>