工作时长、初始化数据

This commit is contained in:
cbs 2025-07-02 09:11:14 +08:00
parent fe186d3117
commit f428509644
24 changed files with 335 additions and 72 deletions

View File

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

View File

@ -61,4 +61,6 @@ public interface RobotTaskDetailActionLogMapper extends BaseMapperX<RobotTaskDet
* @return
*/
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 selectByMacAndIdNotIn(@Param("macAddress") String macAddress,@Param("id") Long id);
void initRobotInformation();
}

View File

@ -167,4 +167,13 @@ public interface RobotTaskDetailMapper extends BaseMapperX<RobotTaskDetailDO> {
* @return
*/
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
*/
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)) {
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.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();
}
}

View File

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

View File

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

View File

@ -90,4 +90,8 @@ public interface RobotTaskDetailActionLogService {
* @return
*/
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"));
}
@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

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

View File

@ -362,7 +362,7 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
.last("limit 1"));
RobotAcceptTaskDTO robotTask = new RobotAcceptTaskDTO();
robotTask.setOrderId(robotInformationDO.getTaskDetailId()+"");
robotTask.setOrderId(robotInformationDO.getTaskDetailId() + "");
robotTask.setTopic(RobotTopicConstant.ROBOT_TASK_MOVE_TOPIC + robotInformationDO.getMacAddress());
robotTask.setExecutionType(ExecutionTypeEnum.PAUSE.getType());
mqttUtils.pub(robotTask.getTopic(), JSON.toJSONString(robotTask));
@ -377,13 +377,18 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
.last("limit 1"));
RobotAcceptTaskDTO robotTask = new RobotAcceptTaskDTO();
robotTask.setOrderId(robotInformationDO.getTaskDetailId()+"");
robotTask.setOrderId(robotInformationDO.getTaskDetailId() + "");
robotTask.setTopic(RobotTopicConstant.ROBOT_TASK_MOVE_TOPIC + robotInformationDO.getMacAddress());
robotTask.setExecutionType(ExecutionTypeEnum.CONTINUE.getType());
mqttUtils.pub(robotTask.getTopic(), JSON.toJSONString(robotTask));
mapStopService.rcsDeleteStopRobotAddLog(robotNo);
}
@Override
public void initRobotInformation() {
informationMapper.initRobotInformation();
}
/**
* 校验IP地址是否合法
@ -438,8 +443,8 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
if (RobotStatusEnum.STOP_FREE.getType().equals(updateReqVO.getRobotStatus())
|| RobotStatusEnum.STOP_DOING.getType().equals(updateReqVO.getRobotStatus())) {
updateReqVO.setRobotStatus(robotInformationDO.getRobotStatus());
}else if (!updateReqVO.getRobotStatus().equals(robotInformationDO.getRobotStatus())) {
str = str + " 修改车辆状态: " +RobotStatusEnum.getMsg(updateReqVO.getRobotStatus());
} else if (!updateReqVO.getRobotStatus().equals(robotInformationDO.getRobotStatus())) {
str = str + " 修改车辆状态: " + RobotStatusEnum.getMsg(updateReqVO.getRobotStatus());
}
if (!updateReqVO.getRobotNo().equals(robotInformationDO.getRobotNo())) {
@ -744,7 +749,7 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
}
for (RobotInformationPageRespVO v : targetList) {
setMsgAndRobotStatus(v,stopRobotNos);
setMsgAndRobotStatus(v, stopRobotNos);
}
if (ObjectUtil.isNotEmpty(pageReqVO.getRobotStatisticsType())) {
@ -807,7 +812,7 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
*
* @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())) {
v.setIsStop(ZeroOneEnum.ONE.getType());
@ -1238,7 +1243,14 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
@Transactional(rollbackFor = Exception.class)
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)) {
throw exception(ROBOT_LAST_TASK_NO_EXISTS);
}
@ -1248,10 +1260,6 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
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())) {
throw exception(ROBOT_REJECTION);
}
@ -1259,11 +1267,9 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
String mac = getMacByRobotNo(robotNo);
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);
// mqttUtils.pub(PathPlanningTopicConstant.CLEAN_AGV, JSON.toJSONString(build));
@ -1343,15 +1349,14 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
String plantingKey = PathPlanningChcheConstant.PATH_PLANNING_TASK + pathPlanning.getOrderId();
redisUtil.set(plantingKey, JSON.toJSONString(pathPlanning), znConfigConstant.getTask().getTaskCacheTime());
log.info("任务下发给PP :{}", JSON.toJSONString(pathPlanningList));
// commonApi.commonMethod(pathPlanningList, PathPlanningTopicConstant.TASK_ASSIGNMENT_REQUEST);
log.info("111111恢复任务下发给PP :{}", JSON.toJSONString(pathPlanningList));
mqttUtils.pub(PathPlanningTopicConstant.TASK_ASSIGNMENT_REQUEST, JSON.toJSONString(pathPlanningList));
}
private void resendToPPData(TaskToPathPlanningDTO pathPlanning, RobotTaskDetailActionLogDO actionLog, RobotInformationDO robotInformationDO, Boolean isRemote) {
if (PathTaskTypeEnum.MOVE_TO_WAIT.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())
|| PathTaskTypeEnum.AUTO_CHARGE.getType().equals(actionLog.getCommandType())) {
chargeTask(pathPlanning, robotInformationDO);
@ -1660,7 +1665,7 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
List<RobotInformationDO> robotInformationDOS = informationMapper.selectList(new LambdaQueryWrapperX<RobotInformationDO>()
.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())

View File

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

View File

@ -30,6 +30,7 @@ import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@ -94,7 +95,7 @@ public class CycleServiceImpl implements CycleService {
List<RobotTaskDO> taskDOList = new ArrayList<>();
List<RobotTaskDetailDO> 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<RobotTaskDetailDO> 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<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,
@ -194,7 +211,7 @@ public class CycleServiceImpl implements CycleService {
* @return
*/
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();
BeanUtils.copyProperties(v, task);
task.setRemainingCycleNumber(v.getRemainingCycleNumber() - 1);

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

@ -83,6 +83,9 @@ public class RobotWorkingHoursStatisticsServiceImpl extends ServiceImpl<RobotWor
&& RobotStatusEnum.STAND_BY.getType().equals(robot.getRobotStatus())) {
RobotWorkingHoursStatisticsDO statisticsDO = new RobotWorkingHoursStatisticsDO();
statisticsDO.setDuration(getMinutes(freeTimeObject));
if (statisticsDO.getDuration() == 0) {
continue;
}
statisticsDO.setRobotNo(robot.getRobotNo());
Long mapId = informationService.getRobotMapIdByRobotNo(robot.getRobotNo());
if (ObjectUtil.isNotEmpty(mapId)) {
@ -112,11 +115,14 @@ public class RobotWorkingHoursStatisticsServiceImpl extends ServiceImpl<RobotWor
if (ObjectUtil.isNotEmpty(statisticsDOS)) {
robotWorkingHoursStatisticsMapper.insertBatch(statisticsDOS);
}
}
/**
* 创建这台车的空闲时间
* 别改事务传播
*
* @param robotNo
*/
@Override
@ -164,15 +170,15 @@ public class RobotWorkingHoursStatisticsServiceImpl extends ServiceImpl<RobotWor
List<RobotWorkHourStatisticsDTO> 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<RobotWor
private List<RobotWorkingHoursStatisticsDO> getWorkingHoursStatisticsByActionLog(List<RobotTaskDetailActionLogDO> actionLogList) {
List<RobotWorkingHoursStatisticsDO> statisticsDOList = new ArrayList<>();
List<Long> logIds = new ArrayList<>();
Map<String, RobotWorkingHoursStatisticsDO> 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<RobotWor
statisticsDO.setPositionMapId(v.getPositionMapId());
Integer durationTypeByTaskType = DurationTypeEnum.getDurationTypeByTaskType(v.getCommandType());
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;
}

View File

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

View File

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

View File

@ -19,6 +19,19 @@
task_detail_id = #{taskDetailId}
and command_id = '-1'
</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"
resultType="cn.iocoder.yudao.module.system.dal.dataobject.log.RobotTaskDetailActionLogDO">
select
@ -45,7 +58,7 @@
from
robot_task_detail_action_log
where
command_id != '-1'
command_id is null
and deleted = '0'
and already_counted = '0'
and create_time >= DATE_SUB(NOW(), INTERVAL 48 HOUR)
@ -61,5 +74,6 @@
and deleted = '0'
and robot_no = #{robotNo}
order by create_time desc
limit 2
</select>
</mapper>

View File

@ -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 @@
</choose>
</where>
</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">
update_time = #{updateTime},
</if>
<if test="occurError != null">
occur_error = #{occurError},
</if>
<if test="deleted != null">
deleted = #{deleted},
</if>
@ -466,6 +484,19 @@
#{id}
</foreach>
</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">
@ -473,6 +504,9 @@
from robot_task_detail
where id = #{id}
</delete>
<delete id="truncate">
TRUNCATE TABLE robot_task_detail
</delete>
</mapper>

View File

@ -496,11 +496,28 @@
</foreach>
</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
from robot_task
where id = #{id}
</delete>
<delete id="truncate">
TRUNCATE TABLE robot_task
</delete>
</mapper>