diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotTaskStatusApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotTaskStatusApiImpl.java index c093e4f72..669a9de7e 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotTaskStatusApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotTaskStatusApiImpl.java @@ -150,7 +150,7 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi { if (ObjectUtil.isNotEmpty(robotCompleteTaskDTO.getCommandStatus()) && RobotExecutionStateConstant.UN_DO.equals(robotCompleteTaskDTO.getCommandStatus().getExecutionState())) { log.info("任务未开始 :{}", robotCompleteTaskDTO.getOrderId()); - }else if (RobotExecutionStateConstant.UN_DO.equals(robotCompleteTaskDTO.getExecutionState()) + } else if (RobotExecutionStateConstant.UN_DO.equals(robotCompleteTaskDTO.getExecutionState()) || RobotExecutionStateConstant.STOP.equals(robotCompleteTaskDTO.getExecutionState()) || RobotExecutionStateConstant.CLOSE.equals(robotCompleteTaskDTO.getExecutionState())) { log.info("任务未开始/暂停/取消 :{}", robotCompleteTaskDTO.getOrderId()); @@ -247,6 +247,7 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi { redisUtil.del(RobotTaskChcheConstant.ROBOT_TASK_SKU_INFO + robotCompleteTaskDTO.getMac()); } //todo 后面考虑下充电,车机目前对充电的逻辑未定义 + RobotTaskDetailDO robotTaskDetail = null; if (PathTaskTypeEnum.MOVE.getType().equals(robotCompleteTaskDTO.getOrderType()) || PathTaskTypeEnum.MOVE_TO_WAIT_STOP.getType().equals(robotCompleteTaskDTO.getOrderType()) || PathTaskTypeEnum.MOVE_TO_POINT.getType().equals(robotCompleteTaskDTO.getOrderType()) @@ -254,7 +255,7 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi { || PathTaskTypeEnum.TAKE.getType().equals(robotCompleteTaskDTO.getOrderType()) || PathTaskTypeEnum.CHARGE.getType().equals(robotCompleteTaskDTO.getOrderType()) || PathTaskTypeEnum.RELEASE.getType().equals(robotCompleteTaskDTO.getOrderType())) { - taskDone(robotCompleteTaskDTO); + robotTaskDetail = taskDone(robotCompleteTaskDTO); } else if (PathTaskTypeEnum.TAKE_RELEASE.getType().equals(robotCompleteTaskDTO.getOrderType())) { RobotTaskDetailDO robotTaskDetailDO = robotTaskDetailMapper.selectById(robotCompleteTaskDTO.getOrderId()); @@ -266,7 +267,7 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi { robotTaskDetailMapper.updateById(robotTaskDetailDO); return; } else if (CommandTypeEnum.WORK_DROP_OFF_GOODS.getType().equals(robotCompleteTaskDTO.getCommandStatus().getCommandType())) { - taskDone(robotCompleteTaskDTO); + robotTaskDetail = taskDone(robotCompleteTaskDTO); } } @@ -276,6 +277,29 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi { } 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); } /** @@ -416,16 +440,18 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi { RobotTaskDetailDO robotTaskDetailDO = robotTaskDetailMapper.selectById(robotCompleteTaskDTO.getOrderId()); if (PathTaskTypeEnum.TAKE_RELEASE.getType().equals(robotCompleteTaskDTO.getOrderType()) || PathTaskTypeEnum.TAKE.getType().equals(robotCompleteTaskDTO.getOrderType())) { + RobotTaskDetailDO detailDO = new RobotTaskDetailDO(); if (RobotTaskStageEnum.GO_TAKE.getType().equals(robotTaskDetailDO.getTaskStage()) || RobotTaskStageEnum.UN_START.getType().equals(robotTaskDetailDO.getTaskStage())) { - robotTaskDetailDO.setTaskStatus(RobotTaskDetailStatusEnum.NEW.getType()); - robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.UN_START.getType()); + detailDO.setTaskStatus(RobotTaskDetailStatusEnum.NEW.getType()); + detailDO.setTaskStage(RobotTaskStageEnum.UN_START.getType()); if (!znConfigConstant.getIsSimulation()) { // robotTaskDetailDO.setRobotNo(""); } - robotTaskDetailDO.setOccurError(ZeroOneEnum.ZERO.getType()); - robotTaskDetailMapper.updateById(robotTaskDetailDO); + detailDO.setOccurError(ZeroOneEnum.ZERO.getType()); +// robotTaskDetailMapper.updateById(robotTaskDetailDO); + robotTaskDetailMapper.updateRobotDetailById(detailDO); String taskNo = taskDetailService.getTaskNoByDetailId(robotCompleteTaskDTO.getOrderId()); msg = robotNo + "_" + "车辆发生异常,重新分配其他车辆执行此任务" + taskNo + " - " + robotCompleteTaskDTO.getOrderId(); } @@ -540,7 +566,7 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi { * * @param robotCompleteTaskDTO */ - private void taskDone(RobotCompleteTaskDTO robotCompleteTaskDTO) { + private RobotTaskDetailDO taskDone(RobotCompleteTaskDTO robotCompleteTaskDTO) { RobotTaskDetailDO robotTaskDetailDO = setTaskDone(robotCompleteTaskDTO); @@ -561,6 +587,7 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi { String plantingKey = PathPlanningChcheConstant.PATH_PLANNING_TASK + robotCompleteTaskDTO.getOrderId(); redisUtil.del(plantingKey); } + return robotTaskDetailDO; } @@ -574,7 +601,7 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi { RobotTaskDetailDO robotTaskDetailDO = robotTaskDetailMapper.selectById(robotCompleteTaskDTO.getOrderId()); Long taskStage = robotTaskDetailDO.getTaskStage(); - log.info("任务 :{} , 当前阶段 :{}",robotCompleteTaskDTO.getOrderId(),taskStage); + log.info("任务 :{} , 当前阶段 :{}", robotCompleteTaskDTO.getOrderId(), taskStage); RobotTaskDO robotTask = robotTaskMapper.selectById(robotTaskDetailDO.getRobotTaskId()); @@ -583,7 +610,10 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi { RobotTaskDetailActionLogSaveReqVO logOne = new RobotTaskDetailActionLogSaveReqVO(); 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() + "取货"); @@ -596,7 +626,8 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi { } else if (CommandTypeEnum.WORK_DROP_OFF_GOODS.getType().equals(commandType)) { logOne.setActionMsg("车辆正在放货" + robotTaskDetailDO.getToLocationNo()); 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() + "放货"); if (!RobotTaskStageEnum.DONE.getType().equals(taskStage)) { robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.GO_RELEASE.getType()); @@ -642,7 +673,7 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi { logOne.setActionMsg("车辆正在前往" + robotTaskDetailDO.getToLocationNo() + "放货"); robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.GO_RELEASE.getType()); } else if (CommandTypeEnum.WORK_DROP_OFF_GOODS.getType().equals(commandType)) { - logOne.setActionMsg("车辆正在放货"+ robotTaskDetailDO.getToLocationNo()); + logOne.setActionMsg("车辆正在放货" + robotTaskDetailDO.getToLocationNo()); if (!RobotTaskStageEnum.DONE.getType().equals(taskStage)) { robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.RELEASEING.getType()); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/log/RobotTaskDetailActionLogMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/log/RobotTaskDetailActionLogMapper.java index 70a73edb6..c70bf902b 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/log/RobotTaskDetailActionLogMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/log/RobotTaskDetailActionLogMapper.java @@ -61,4 +61,6 @@ public interface RobotTaskDetailActionLogMapper extends BaseMapperX getLastTwoTask(@Param("robotNo") String robotNo); + + void alreadyCounted(@Param("ids") List ids); } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotInformationMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotInformationMapper.java index b13efbd4d..b6e3d3f28 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotInformationMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotInformationMapper.java @@ -92,4 +92,6 @@ public interface RobotInformationMapper extends BaseMapperX RobotInformationDO selectByRobotNoAndIdNotIn(@Param("robotNo") String robotNo, @Param("id") Long id); RobotInformationDO selectByMacAndIdNotIn(@Param("macAddress") String macAddress,@Param("id") Long id); + + void initRobotInformation(); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotTaskDetailMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotTaskDetailMapper.java index 9a4e0ab93..fe4a5a23e 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotTaskDetailMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotTaskDetailMapper.java @@ -167,4 +167,13 @@ public interface RobotTaskDetailMapper extends BaseMapperX { * @return */ RobotTaskManualInterventionDTO getRobotTaskAutomaticArtificial(@Param("type") String type); + + /** + * 清除所有数据 + */ + void truncate(); + + List selectAutoCreateCycleTaskForever(); + + void setTaskUnDo(@Param("ids") List ids); } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotTaskMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotTaskMapper.java index 565fd9e22..70af3c500 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotTaskMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotTaskMapper.java @@ -86,4 +86,11 @@ public interface RobotTaskMapper extends BaseMapperX { * @return */ List selectDoingTaskByRobotNo(@Param("robotNo") String robotNo); + + /** + * 清除所有数据 + */ + void truncate(); + + void setTaskUnDo(@Param("ids") Set ids); } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/enums/robot/statistics/DurationTypeEnum.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/enums/robot/statistics/DurationTypeEnum.java index 68be4121b..72c1365b9 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/enums/robot/statistics/DurationTypeEnum.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/enums/robot/statistics/DurationTypeEnum.java @@ -28,6 +28,6 @@ public enum DurationTypeEnum { || PathTaskTypeEnum.AUTO_CHARGE.getType().equals(commonType)) { return CHARGE_TIME.type; } - return CHARGE_TIME.type; + return TASK_TIME.type; } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/robot/RobotJob.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/robot/RobotJob.java index cd91eace5..2f8815373 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/robot/RobotJob.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/robot/RobotJob.java @@ -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.CycleService; 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.pathplanning.RobotPathPlanningService; import cn.iocoder.yudao.module.system.service.statistics.RobotWorkingHoursStatisticsService; @@ -51,6 +52,9 @@ public class RobotJob { @Resource private RobotInformationService informationService; + @Resource + private InitTaskService initTaskService; + @Resource private RobotWorkingHoursStatisticsService robotWorkingHoursStatisticsService; @@ -64,13 +68,13 @@ public class RobotJob { locks.add(RobotCacheLockEnum.ROBOT_TASK_DISTRIBUTE_LOCK.getKey()); locks.add(RobotCacheLockEnum.ROBOT_TASK_ADD_LOCK.getKey()); RLock lock = redissonUtils.getLocks(locks); - if (lock.tryLock()){ + if (lock.tryLock()) { try { robotTaskAutoMoveService.distributeAutoMoveJob(); - } finally { + } finally { lock.unlock(); } - }else { + } else { log.info("下发自动移库任务未获取到锁"); throw exception(REDISSON_NOT_OBTAIN_LOCK); } @@ -82,16 +86,16 @@ public class RobotJob { public void AutoChargeJob() { RLock lock = redissonUtils.getLock(RobotCacheLockEnum.ROBOT_TASK_DISTRIBUTE_LOCK.getKey()); - if (lock.tryLock()){ + if (lock.tryLock()) { try { log.info("----111111下发自动充电任务----"); autoChargeService.autoChargeJob(); } catch (Exception e) { - log.info("自动充电异常 :{}",e); + log.info("自动充电异常 :{}", e); } finally { lock.unlock(); } - }else { + } else { log.info("下发自动充电任务未获取到锁"); throw exception(REDISSON_NOT_OBTAIN_LOCK); } @@ -105,23 +109,22 @@ public class RobotJob { public void DistributeTasksToPathPlanningJob() { RLock lock = redissonUtils.getLock(RobotCacheLockEnum.ROBOT_TASK_DISTRIBUTE_LOCK.getKey()); - if (lock.tryLock()){ + if (lock.tryLock()) { try { log.info("----111111下发任务给路径规划----"); robotPathPlanningService.sendTaskToPP(); } catch (Exception e) { - log.info("----分配任务异常---- :{}",e); + log.info("----分配任务异常---- :{}", e); } finally { lock.unlock(); } - }else { + } else { log.info("下发任务给路径规划未获取到锁"); throw exception(REDISSON_NOT_OBTAIN_LOCK); } } - /** * 创建循环任务 */ @@ -130,18 +133,18 @@ public class RobotJob { public void cycleTaskJob() { RLock lock = redissonUtils.getLock(RobotCacheLockEnum.ROBOT_TASK_ADD_LOCK.getKey()); - if (lock.tryLock()){ + if (lock.tryLock()) { try { log.info("----111111创建循环任务----"); cycleService.cycleTaskJob(); } catch (Exception e) { - log.error("创建循环任务异常 :{}",e); + log.error("创建循环任务异常 :{}", e); } finally { lock.unlock(); } - }else { + } else { log.info("下发任务给路径规划未获取到锁"); throw exception(REDISSON_NOT_OBTAIN_LOCK); } @@ -156,15 +159,15 @@ public class RobotJob { public void rcsHeartBeat() { RLock lock = redissonUtils.getLock(RobotCacheLockEnum.ROBOT_RCS_HEART_BEAT_LOCK.getKey()); - if (lock.tryLock()){ + if (lock.tryLock()) { try { log.info("----维护车机心跳----"); TenantContextHolder.setTenantId(1L); informationService.rcsHeartBeat(); - } finally { + } finally { lock.unlock(); } - }else { + } else { throw exception(REDISSON_NOT_OBTAIN_LOCK); } } @@ -176,18 +179,29 @@ public class RobotJob { @TenantJob public void statisticsDuration() { RLock lock = redissonUtils.getLock(RobotCacheLockEnum.ROBOT_STATISTICS_DURATION_LOCK.getKey()); - if (lock.tryLock()){ + if (lock.tryLock()) { try { log.info("----统计时长开始----"); TenantContextHolder.setTenantId(1L); robotWorkingHoursStatisticsService.statisticsRobotDuration(); } catch (Exception e) { - log.info("统计工作时长异常 :{}",e); + log.info("统计工作时长异常 :{}", e); } finally { lock.unlock(); } - }else { + } else { throw exception(REDISSON_NOT_OBTAIN_LOCK); } } + + + /** + * 恢复数据 (只能是测试的时候用,上线禁止使用) + */ + @XxlJob("initTaskJob") + @TenantJob + public void initTaskJob() { + TenantContextHolder.setTenantId(1L); + initTaskService.initTask(); + } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/schedul/ThreeDimensionalScheduled.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/schedul/ThreeDimensionalScheduled.java index eadef3ca1..776ee5b82 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/schedul/ThreeDimensionalScheduled.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/schedul/ThreeDimensionalScheduled.java @@ -42,7 +42,7 @@ public class ThreeDimensionalScheduled { private static final ExecutorService FIXED_THREAD_POOL = Executors.newFixedThreadPool(3); // 这个方法将每200毫秒执行一次 - @Scheduled(fixedDelay = 300, timeUnit = TimeUnit.MILLISECONDS) +// @Scheduled(fixedDelay = 300, timeUnit = TimeUnit.MILLISECONDS) public void executeTask() { FIXED_THREAD_POOL.execute(this::sendData); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/housearea/HouseAreaServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/housearea/HouseAreaServiceImpl.java index 354a2a32b..40e9d3652 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/housearea/HouseAreaServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/housearea/HouseAreaServiceImpl.java @@ -178,7 +178,7 @@ public class HouseAreaServiceImpl extends ServiceImpl logIds); + + RobotTaskDetailActionLogDO getLastActionLogByDetailId(Long taskDetailId); } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/log/RobotTaskDetailActionLogServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/log/RobotTaskDetailActionLogServiceImpl.java index e43ef1f68..80f58171e 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/log/RobotTaskDetailActionLogServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/log/RobotTaskDetailActionLogServiceImpl.java @@ -141,4 +141,18 @@ public class RobotTaskDetailActionLogServiceImpl implements RobotTaskDetailActio .last("limit 1")); } + @Override + public void alreadyCounted(List logIds) { + taskDetailActionLogMapper.alreadyCounted(logIds); + } + + @Override + public RobotTaskDetailActionLogDO getLastActionLogByDetailId(Long taskDetailId) { + return taskDetailActionLogMapper.selectOne(new LambdaQueryWrapperX() + .eq(RobotTaskDetailActionLogDO::getTaskDetailId, taskDetailId) + .eq(RobotTaskDetailActionLogDO::getCommandId, CommandIdEnum.TASK.getType()) + .orderByDesc(RobotTaskDetailActionLogDO::getCreateTime) + .last("limit 1")); + } + } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationService.java index 73a6fc7eb..dbcb616fb 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationService.java @@ -262,4 +262,7 @@ public interface RobotInformationService extends IService { void stopRobot(String robotNo); void continueRobot(String robotNo); + + void initRobotInformation(); + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationServiceImpl.java index 674e433c3..e71097ddc 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationServiceImpl.java @@ -362,7 +362,7 @@ public class RobotInformationServiceImpl extends ServiceImpl stopRobotNos) { + private void setMsgAndRobotStatus(RobotInformationPageRespVO v, List stopRobotNos) { if (ObjectUtil.isNotEmpty(stopRobotNos) && stopRobotNos.contains(v.getRobotNo())) { v.setIsStop(ZeroOneEnum.ONE.getType()); @@ -1238,7 +1243,14 @@ public class RobotInformationServiceImpl extends ServiceImpl() + .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)) { throw exception(ROBOT_LAST_TASK_NO_EXISTS); } @@ -1248,10 +1260,6 @@ public class RobotInformationServiceImpl extends ServiceImpl() - .eq(RobotInformationDO::getRobotNo, robotNo) - .last("limit 1")); - if (RobotTaskModelEnum.REJECTION.getType().equals(robotInformationDO.getRobotTaskModel())) { throw exception(ROBOT_REJECTION); } @@ -1259,11 +1267,9 @@ public class RobotInformationServiceImpl extends ServiceImpl robotInformationDOS = informationMapper.selectList(new LambdaQueryWrapperX() .in(RobotInformationDO::getRobotNo, robotNos)); for (RobotInformationDO robotInformationDO : robotInformationDOS) { - robotSimulationPose.setOrderId(robotInformationDO.getTaskDetailId()+""); + robotSimulationPose.setOrderId(robotInformationDO.getTaskDetailId() + ""); mqttUtils.pub(RobotTopicConstant.ROBOT_TASK_MOVE_TOPIC + robotInformationDO.getMacAddress(), JSON.toJSONString(robotSimulationPose)); UserOperationLogSaveReqVO operationLog = UserOperationLogSaveReqVO.builder() .operateAction(str + robotInformationDO.getRobotNo()) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskDetailServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskDetailServiceImpl.java index cfe07949e..b84abb44a 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskDetailServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskDetailServiceImpl.java @@ -230,7 +230,7 @@ public class RobotTaskDetailServiceImpl implements RobotTaskDetailService { .id(robotTaskDetailDO.getId().toString()) .build(); // commonApi.commonMethod(closePathPlanting, PathPlanningTopicConstant.KILL_TASK); - mqttUtils.pub(PathPlanningTopicConstant.KILL_TASK,JSON.toJSONString(closePathPlanting)); + mqttUtils.pub(PathPlanningTopicConstant.KILL_TASK, JSON.toJSONString(closePathPlanting)); } @Override @@ -258,18 +258,28 @@ public class RobotTaskDetailServiceImpl implements RobotTaskDetailService { || RobotTaskStageEnum.GO_TAKE.getType().equals(detailDO.getTaskStage()) || RobotTaskStageEnum.TAKEING.getType().equals(detailDO.getTaskStage())) { robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.TAKEING_EXCEPTION.getType()); - }else { + } else { 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()); - }else if(RobotTaskTypeEnum.RELEASE.getType().equals(detailDO.getTaskType())) { + } else if (RobotTaskTypeEnum.RELEASE.getType().equals(detailDO.getTaskType())) { robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.RELEASEING_EXCEPTION.getType()); - }else { + } else { robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.EXCEPTION.getType()); } robotTaskDetailDO.setOccurError(ZeroOneEnum.ONE.getType()); - taskDetailMapper.updateById(robotTaskDetailDO); + taskDetailMapper.updateRobotDetailById(robotTaskDetailDO); + + List taskDetailDOS = taskDetailMapper.selectList(new LambdaQueryWrapperX() + .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); } /** diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskServiceImpl.java index f6611dac7..798d49c2b 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskServiceImpl.java @@ -533,9 +533,8 @@ public class RobotTaskServiceImpl extends ServiceImpl taskDOList = new ArrayList<>(); List taskDetailList = new LinkedList<>(); 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); List taskDetailDOS = getTaskDetailData(taskData,taskIdMap,v.getId()); taskDOList.add(taskData); @@ -136,6 +137,22 @@ public class CycleServiceImpl implements CycleService { robotTaskService.addCycle(k,v); }); taskCycleMapper.deletByRobotTaskIds(taskIds); + setTaskUnDo(); + } + + public void setTaskUnDo() { + List detailDOS = taskDetailMapper.selectAutoCreateCycleTaskForever(); + if (ObjectUtil.isEmpty(detailDOS)) { + return; + } + List detailIds = new ArrayList<>(); + Set taskIds = new HashSet<>(); + for (RobotTaskDetailDO detail : detailDOS) { + detailIds.add(detail.getId()); + taskIds.add(detail.getRobotTaskId()); + } + taskDetailMapper.setTaskUnDo(detailIds); + taskMapper.setTaskUnDo(taskIds); } private List getTaskDetailData(RobotTaskDO taskData, Map taskDetailDOS = taskDetailMapper.selectList(new LambdaQueryWrapperX() + .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(); + } +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/statistics/RobotWorkingHoursStatisticsServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/statistics/RobotWorkingHoursStatisticsServiceImpl.java index f84ce4326..dc6de4665 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/statistics/RobotWorkingHoursStatisticsServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/statistics/RobotWorkingHoursStatisticsServiceImpl.java @@ -83,6 +83,9 @@ public class RobotWorkingHoursStatisticsServiceImpl extends ServiceImpl list = new ArrayList<>(); - robotMap.forEach((k,v) ->{ + robotMap.forEach((k, v) -> { RobotWorkHourStatisticsDTO statisticsDTO = new RobotWorkHourStatisticsDTO(); statisticsDTO.setRobotNo(k); 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()); - 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()); - 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.setTaskTimeNum(taskTimeStr); @@ -201,6 +207,9 @@ public class RobotWorkingHoursStatisticsServiceImpl extends ServiceImpl getWorkingHoursStatisticsByActionLog(List actionLogList) { List statisticsDOList = new ArrayList<>(); + List logIds = new ArrayList<>(); + + Map map = new HashMap<>(); for (RobotTaskDetailActionLogDO v : actionLogList) { RobotWorkingHoursStatisticsDO statisticsDO = new RobotWorkingHoursStatisticsDO(); if (ObjectUtil.isNotEmpty(v.getDuration())) { @@ -215,9 +224,21 @@ public class RobotWorkingHoursStatisticsServiceImpl extends ServiceImpl diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotInformationMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotInformationMapper.xml index 1a8e28ac3..fb0c1b225 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotInformationMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotInformationMapper.xml @@ -147,6 +147,15 @@ robot_no = #{robotNo} + + update + robot_information + set + robot_status = '3', + robot_task_model = '1' + where deleted = '0' + + delete diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotTaskDetailActionLogMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotTaskDetailActionLogMapper.xml index ac165b399..8013fa87b 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotTaskDetailActionLogMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotTaskDetailActionLogMapper.xml @@ -19,6 +19,19 @@ task_detail_id = #{taskDetailId} and command_id = '-1' + + + update + robot_task_detail_action_log + set already_counted = '1' + where + id in + + #{id} + + + \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotTaskDetailMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotTaskDetailMapper.xml index 594280437..b5a246c6c 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotTaskDetailMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotTaskDetailMapper.xml @@ -227,7 +227,8 @@ robot_task_detail t1, robot_task t2 where 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 t1.task_status = '2' and t1.deleted = '0' @@ -381,6 +382,20 @@ + @@ -447,6 +462,9 @@ update_time = #{updateTime}, + + occur_error = #{occurError}, + deleted = #{deleted}, @@ -466,6 +484,19 @@ #{id} + + update + robot_task_detail + set + task_status = '0', + task_stage = '0' + where + id in + + #{id} + + @@ -473,6 +504,9 @@ from robot_task_detail where id = #{id} + + TRUNCATE TABLE robot_task_detail + \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotTaskMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotTaskMapper.xml index 997b4bf98..66e37f831 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotTaskMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotTaskMapper.xml @@ -496,11 +496,28 @@ + + update + robot_task + set + task_status = '0', + task_stage = '0' + where + id in + + #{id} + + + delete from robot_task where id = #{id} + + TRUNCATE TABLE robot_task + \ No newline at end of file