@ -7,9 +7,13 @@ import cn.hutool.json.JSONUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult ;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils ;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils ;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX ;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils ;
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder ;
import cn.iocoder.yudao.module.mqtt.api.common.CommonApi ;
import cn.iocoder.yudao.module.mqtt.api.path.PathPlanningApi ;
import cn.iocoder.yudao.module.mqtt.api.path.task.TaskRobotNoLimittationAreaDTO ;
import cn.iocoder.yudao.module.mqtt.api.path.task.TaskToPathPlanningDTO ;
import cn.iocoder.yudao.module.mqtt.api.task.dto.RobotAcceptTaskDTO ;
import cn.iocoder.yudao.module.mqtt.api.task.dto.RobotRcsHeartBeatDTO ;
import cn.iocoder.yudao.module.mqtt.enums.task.ExecutionTypeEnum ;
@ -18,6 +22,7 @@ import cn.iocoder.yudao.module.system.api.robot.dto.FloorZoneDTO;
import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDTO ;
import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDataPoseDTO ;
import cn.iocoder.yudao.module.system.api.robot.vo.RobotInformationVO ;
import cn.iocoder.yudao.module.system.constant.path.PathPlanningChcheConstant ;
import cn.iocoder.yudao.module.system.constant.path.PathPlanningTopicConstant ;
import cn.iocoder.yudao.module.system.constant.robot.RobotTaskChcheConstant ;
import cn.iocoder.yudao.module.system.constant.robot.RobotTopicConstant ;
@ -25,22 +30,32 @@ import cn.iocoder.yudao.module.system.controller.admin.log.vo.UserOperationLogSa
import cn.iocoder.yudao.module.system.controller.admin.robot.proceed.RobotTaskProceedSaveReqVO ;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.* ;
import cn.iocoder.yudao.module.system.controller.admin.tool.dto.CleanAgvDTO ;
import cn.iocoder.yudao.module.system.dal.dataobject.houselocation.WareHouseLocationDO ;
import cn.iocoder.yudao.module.system.dal.dataobject.information.DeviceInformationDO ;
import cn.iocoder.yudao.module.system.dal.dataobject.informationmapassociation.InformationMapAssociationDO ;
import cn.iocoder.yudao.module.system.dal.dataobject.log.RobotTaskDetailActionLogDO ;
import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapDO ;
import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapItemDO ;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotInformationDO ;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotModelDO ;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDO ;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDetailDO ;
import cn.iocoder.yudao.module.system.dal.dataobject.wait.MoveToWaitDO ;
import cn.iocoder.yudao.module.system.dal.mysql.houselocation.WareHouseLocationMapper ;
import cn.iocoder.yudao.module.system.dal.mysql.information.DeviceInformationMapper ;
import cn.iocoder.yudao.module.system.dal.mysql.positionmap.PositionMapItemMapper ;
import cn.iocoder.yudao.module.system.dal.mysql.positionmap.PositionMapMapper ;
import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotInformationMapper ;
import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotModelMapper ;
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.common.ZeroOneEnum ;
import cn.iocoder.yudao.module.system.enums.device.DeviceTypeEnum ;
import cn.iocoder.yudao.module.system.enums.device.DeviceUseStatusEnum ;
import cn.iocoder.yudao.module.system.enums.item.PositionMapItemEnum ;
import cn.iocoder.yudao.module.system.enums.path.PathTaskTypeEnum ;
import cn.iocoder.yudao.module.system.enums.path.PathTaskTypeToRobotEnum ;
import cn.iocoder.yudao.module.system.enums.redis.RobotCacheLockEnum ;
import cn.iocoder.yudao.module.system.enums.robot.RobotStatusEnum ;
import cn.iocoder.yudao.module.system.enums.robot.RobotTaskDetailStatusEnum ;
import cn.iocoder.yudao.module.system.enums.robot.RobotTaskModelEnum ;
@ -51,12 +66,17 @@ import cn.iocoder.yudao.module.system.service.informationmapassociation.Informat
import cn.iocoder.yudao.module.system.service.log.RobotTaskDetailActionLogService ;
import cn.iocoder.yudao.module.system.service.log.UserOperationLogService ;
import cn.iocoder.yudao.module.system.service.positionmap.PositionMapItemService ;
import cn.iocoder.yudao.module.system.service.robot.pathplanning.RobotPathPlanningService ;
import cn.iocoder.yudao.module.system.service.robot.proceed.RobotTaskProceedService ;
import cn.iocoder.yudao.module.system.service.wait.MoveToWaitService ;
import cn.iocoder.yudao.module.system.util.redis.RedisUtil ;
import cn.iocoder.yudao.module.system.util.redis.RedissonUtils ;
import com.alibaba.fastjson.JSON ;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper ;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl ;
import lombok.extern.slf4j.Slf4j ;
import org.redisson.api.RLock ;
import org.springframework.beans.factory.annotation.Autowired ;
import org.springframework.stereotype.Service ;
import org.springframework.transaction.annotation.Transactional ;
import org.springframework.validation.annotation.Validated ;
@ -67,6 +87,7 @@ import java.util.function.Function;
import java.util.stream.Collectors ;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception ;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception0 ;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.* ;
/ * *
@ -114,6 +135,12 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
@Resource
private RobotTaskMapper taskMapper ;
@Autowired
private RobotPathPlanningService robotPathPlanningService ;
@Resource
private PositionMapItemMapper positionMapItemMapper ;
@Resource
private RedisUtil redisUtil ;
@Resource
@ -122,6 +149,14 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
private InformationMapAssociationService informationMapAssociationService ;
/ / - - 获取所有的设备信息key
public static final String key = RobotTaskChcheConstant . ROBOT_GET_ROBOT_INFO ;
@Autowired
private WareHouseLocationMapper wareHouseLocationMapper ;
@Resource
private PathPlanningApi pathPlanningApi ;
@Resource
private RedissonUtils redissonUtils ;
@Override
public Long createInformation ( RobotInformationSaveReqVO createReqVO ) {
@ -679,14 +714,10 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
. operateAction ( " 清除交管 " + robotNo )
. nickName ( SecurityFrameworkUtils . getLoginUserNickname ( ) ) . build ( ) ;
userOperationLogService . createUserOperationLog ( operationLog ) ;
CleanAgvDTO build = CleanAgvDTO . builder ( ) . robotNo ( robotNo ) . build ( ) ;
commonApi . commonMethod ( build , PathPlanningTopicConstant . CLEAN_AGV ) ;
RobotTaskDetailActionLogDO log = taskDetailActionLogService . getLastTaskByRobotNo ( robotNo ) ;
if ( ObjectUtil . isEmpty ( log ) | | ActionStatusEnum . DONE . getType ( ) . equals ( log . getActionStatus ( ) ) ) {
RobotTaskDetailActionLogDO log = closeTask ( robotNo ) ;
if ( ObjectUtil . isEmpty ( log ) ) {
return ;
}
String mac = getMacByRobotNo ( robotNo ) ;
robotCloseTaskDetail ( log . getTaskDetailId ( ) + " " , mac , log . getCommandType ( ) ) ;
RobotTaskDetailDO robotTaskDetail = taskDetailMapper . selectById ( log . getTaskDetailId ( ) ) ;
/ / 移动 、 充电任务需手动关闭
if ( PathTaskTypeEnum . CHARGE . getType ( ) . equals ( log . getCommandType ( ) )
@ -709,15 +740,270 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
/ / 不释放机器人状态 , 怕机器人接新任务
}
public RobotTaskDetailActionLogDO closeTask ( String robotNo ) {
CleanAgvDTO build = CleanAgvDTO . builder ( ) . robotNo ( robotNo ) . build ( ) ;
commonApi . commonMethod ( build , PathPlanningTopicConstant . CLEAN_AGV ) ;
RobotTaskDetailActionLogDO log = taskDetailActionLogService . getLastTaskByRobotNo ( robotNo ) ;
if ( ObjectUtil . isEmpty ( log ) | | ActionStatusEnum . DONE . getType ( ) . equals ( log . getActionStatus ( ) ) ) {
return null ;
}
String mac = getMacByRobotNo ( robotNo ) ;
robotCloseTaskDetail ( log . getTaskDetailId ( ) + " " , mac , log . getCommandType ( ) ) ;
return log ;
}
/ * *
* 继续做任务
*
* @param robotNo
* /
@Override
public void doTaskContinue ( String robotNo ) {
UserOperationLogSaveReqVO operationLog = UserOperationLogSaveReqVO . builder ( )
. operateAction ( " 继续做任务 " + robotNo )
. nickName ( SecurityFrameworkUtils . getLoginUserNickname ( ) ) . build ( ) ;
userOperationLogService . createUserOperationLog ( operationLog ) ;
RobotTaskDetailActionLogDO actionLog = closeTask ( robotNo ) ;
if ( ObjectUtil . isEmpty ( actionLog ) | | ActionStatusEnum . DONE . getType ( ) . equals ( actionLog . getActionStatus ( ) ) ) {
throw exception ( ROBOT_LAST_TASK_NO_EXISTS ) ;
}
String key = PathPlanningChcheConstant . PATH_PLANNING_TASK + actionLog . getTaskDetailId ( ) ;
Object o = redisUtil . get ( key ) ;
if ( ObjectUtil . isEmpty ( o ) ) {
throw exception ( ROBOT_LAST_TASK_DELETE ) ;
}
TaskToPathPlanningDTO pathPlanning = JSONUtil . toBean ( ( String ) o , TaskToPathPlanningDTO . class ) ;
RLock lock = redissonUtils . getLock ( RobotCacheLockEnum . ROBOT_TASK_DISTRIBUTE_LOCK . getKey ( ) ) ;
String msg = " " ;
if ( lock . tryLock ( ) ) {
try {
resendToPP ( pathPlanning , actionLog ) ;
} catch ( Exception e ) {
log . error ( " 下发任务给路径规划现异常 :{} " , e ) ;
msg = ObjectUtil . isNotEmpty ( e . getMessage ( ) ) ? e . getMessage ( ) : " 任务下发失败 " ;
} finally {
lock . unlock ( ) ;
}
} else {
log . info ( " 下发任务给路径规划未获取到锁 " ) ;
throw exception ( REDISSON_NOT_OBTAIN_LOCK ) ;
}
if ( ObjectUtil . isNotEmpty ( msg ) ) {
throw exception0 ( TASK_CHECK_EXCEPTION . getCode ( ) , msg ) ;
}
}
/ * *
* 将任务重新发给PP
* @param pathPlanning
* @param actionLog
* /
private void resendToPP ( TaskToPathPlanningDTO pathPlanning , RobotTaskDetailActionLogDO actionLog ) {
RobotInformationDO robotInformationDO = informationMapper . selectOne ( new LambdaQueryWrapper < RobotInformationDO > ( )
. eq ( RobotInformationDO : : getRobotNo , actionLog . getRobotNo ( ) ) ) ;
TaskRobotNoLimittationAreaDTO taskRobotNoLimittationAreaDTO =
robotPathPlanningService . getRobotNoLimitationArea ( Collections . singletonList ( robotInformationDO ) ) . get ( 0 ) ;
List < TaskRobotNoLimittationAreaDTO > robotNoLimitions = Arrays . asList ( taskRobotNoLimittationAreaDTO ) ;
pathPlanning . setRobotNoLimitationAreaDTOS ( robotNoLimitions ) ;
if ( PathTaskTypeEnum . MOVE_TO_WAIT . getType ( ) . equals ( actionLog . getCommandType ( ) )
| | PathTaskTypeEnum . MOVE_TO_WAIT_STOP . getType ( ) . equals ( actionLog . getCommandType ( ) ) ) {
moveToWaitTask ( pathPlanning , actionLog . getRobotNo ( ) ) ;
} else if ( PathTaskTypeEnum . CHARGE . getType ( ) . equals ( actionLog . getCommandType ( ) )
| | PathTaskTypeEnum . AUTO_CHARGE . getType ( ) . equals ( actionLog . getCommandType ( ) ) ) {
chargeTask ( pathPlanning , robotInformationDO ) ;
} else if ( PathTaskTypeEnum . TAKE_RELEASE . getType ( ) . equals ( actionLog . getCommandType ( ) ) ) {
takeReleaseTask ( pathPlanning ) ;
} else if ( PathTaskTypeEnum . TAKE . getType ( ) . equals ( actionLog . getCommandType ( ) ) ) {
takeTask ( pathPlanning ) ;
} else if ( PathTaskTypeEnum . RELEASE . getType ( ) . equals ( actionLog . getCommandType ( ) ) ) {
releaseTask ( pathPlanning ) ;
} else if ( PathTaskTypeEnum . MOVE . getType ( ) . equals ( actionLog . getCommandType ( ) ) ) {
}
List < TaskToPathPlanningDTO > pathPlanningList = new ArrayList < > ( ) ;
pathPlanningList . add ( pathPlanning ) ;
log . info ( " 任务下发给PP :{} " , JSON . toJSONString ( pathPlanningList ) ) ;
pathPlanningApi . synchronousLineObject ( pathPlanningList , PathPlanningTopicConstant . TASK_ASSIGNMENT_REQUEST ) ;
}
/ * *
* 仅放货
* @param pathPlanning
* /
private void releaseTask ( TaskToPathPlanningDTO pathPlanning ) {
RobotTaskDetailDO robotTaskDetail = checkTaskDone ( pathPlanning . getOrderId ( ) ) ;
releaseCheck ( robotTaskDetail . getToLocationId ( ) , robotTaskDetail . getRobotTaskId ( ) ) ;
}
/ * *
* 仅取货
* @param pathPlanning
* /
private void takeTask ( TaskToPathPlanningDTO pathPlanning ) {
RobotTaskDetailDO robotTaskDetail = checkTaskDone ( pathPlanning . getOrderId ( ) ) ;
takeCheck ( robotTaskDetail . getFromLocationId ( ) , robotTaskDetail . getRobotTaskId ( ) ) ;
}
public RobotTaskDetailDO checkTaskDone ( String id ) {
RobotTaskDetailDO robotTaskDetail = taskDetailMapper . selectById ( id ) ;
if ( RobotTaskStageEnum . DONE . getType ( ) . equals ( robotTaskDetail . getTaskStage ( ) ) ) {
throw exception ( ROBOT_LAST_TASK_NO_EXISTS ) ;
}
return robotTaskDetail ;
}
/ * *
* 取放货
* @param pathPlanning
* /
private void takeReleaseTask ( TaskToPathPlanningDTO pathPlanning ) {
RobotTaskDetailDO robotTaskDetail = checkTaskDone ( pathPlanning . getOrderId ( ) ) ;
if ( ! RobotTaskStageEnum . TAKEING . getType ( ) . equals ( robotTaskDetail . getTaskStage ( ) )
& & ! RobotTaskStageEnum . GO_TAKE . getType ( ) . equals ( robotTaskDetail . getTaskStage ( ) )
& & ! RobotTaskStageEnum . UN_START . getType ( ) . equals ( robotTaskDetail . getTaskStage ( ) ) ) {
/ / 只要放货
pathPlanning . setTakeLevel ( null ) ;
pathPlanning . setTakeGroupId ( null ) ;
pathPlanning . setTakeLocationNumber ( null ) ;
pathPlanning . setTakePointId ( null ) ;
pathPlanning . setTakeOffsetHeight ( null ) ;
pathPlanning . setTakeOffsetHeight ( null ) ;
pathPlanning . setTaskType ( PathTaskTypeToRobotEnum . DROP_OFF_GOODS . getType ( ) ) ;
} else {
takeCheck ( robotTaskDetail . getFromLocationId ( ) , robotTaskDetail . getRobotTaskId ( ) ) ;
}
releaseCheck ( robotTaskDetail . getToLocationId ( ) , robotTaskDetail . getRobotTaskId ( ) ) ;
}
/ * *
* 校验放货任务
*
* @param id
* @param takeId
* /
private void releaseCheck ( Long id , Long takeId ) {
WareHouseLocationDO wareHouseLocation = wareHouseLocationMapper . selectById ( id ) ;
if ( ZeroOneEnum . ONE . getType ( ) . equals ( wareHouseLocation . getLocationUseStatus ( ) ) ) {
throw exception ( TASK_RELEASE_LOCATION_NOT_EMPTY ) ;
}
if ( ! wareHouseLocation . getTaskId ( ) . equals ( takeId ) ) {
throw exception ( TASK_RELEASE_LOCATION_HAVE_OTHER_TASK ) ;
}
List < WareHouseLocationDO > locations = wareHouseLocationMapper . selectList ( new LambdaQueryWrapperX < WareHouseLocationDO > ( )
. eq ( WareHouseLocationDO : : getMapItemId , wareHouseLocation . getMapItemId ( ) )
. ne ( WareHouseLocationDO : : getId , id ) ) ;
if ( ObjectUtil . isEmpty ( locations ) ) {
return ;
}
List < WareHouseLocationDO > bigNumbers = locations . stream ( )
. filter ( v - > v . getLocationNumber ( ) > wareHouseLocation . getLocationNumber ( )
& & ZeroOneEnum . ZERO . getType ( ) . equals ( v . getLocationUseStatus ( ) ) )
. collect ( Collectors . toList ( ) ) ;
if ( ObjectUtil . isNotEmpty ( bigNumbers ) ) {
throw exception ( TASK_RELEASE_LOCATION_LOWER_LEVELS_EMPTY ) ;
}
}
/ * *
* 取货校验
*
* @param id
* @param takeId
* /
private void takeCheck ( Long id , Long takeId ) {
WareHouseLocationDO wareHouseLocation = wareHouseLocationMapper . selectById ( id ) ;
if ( ZeroOneEnum . ZERO . getType ( ) . equals ( wareHouseLocation . getLocationUseStatus ( ) ) ) {
throw exception ( TASK_TAKE_LOCATION_EMPTY ) ;
}
if ( ! wareHouseLocation . getTaskId ( ) . equals ( takeId ) ) {
throw exception ( TASK_TAKE_LOCATION_HAVE_OTHER_TASK ) ;
}
List < WareHouseLocationDO > locations = wareHouseLocationMapper . selectList ( new LambdaQueryWrapperX < WareHouseLocationDO > ( )
. eq ( WareHouseLocationDO : : getMapItemId , wareHouseLocation . getMapItemId ( ) )
. ne ( WareHouseLocationDO : : getId , id ) ) ;
if ( ObjectUtil . isEmpty ( locations ) ) {
return ;
}
List < WareHouseLocationDO > bigNumbers = locations . stream ( )
. filter ( v - > v . getLocationNumber ( ) < wareHouseLocation . getLocationNumber ( )
& & ZeroOneEnum . ONE . getType ( ) . equals ( v . getLocationUseStatus ( ) ) )
. collect ( Collectors . toList ( ) ) ;
if ( ObjectUtil . isNotEmpty ( bigNumbers ) ) {
throw exception ( TASK_TAKE_LOCATION_UPPER_LEVELS_NOT_EMPTY ) ;
}
}
/ * *
* 充电任务
* @param pathPlanning
* @param robot
* /
private void chargeTask ( TaskToPathPlanningDTO pathPlanning , RobotInformationDO robot ) {
List < DeviceInformationDO > deviceInformations = deviceInformationMapper . selectList ( new LambdaQueryWrapperX < DeviceInformationDO > ( )
. eq ( DeviceInformationDO : : getDeviceEnable , ZeroOneEnum . ONE . getType ( ) )
. eq ( DeviceInformationDO : : getDeviceUseStatus , DeviceUseStatusEnum . IDLE . getType ( ) )
. eq ( DeviceInformationDO : : getDeviceType , DeviceTypeEnum . CHARGING_STATION . getType ( ) ) ) ;
if ( ObjectUtil . isEmpty ( deviceInformations ) ) {
log . info ( " 没有空闲的充电桩 :{} " , robot . getRobotNo ( ) ) ;
throw exception ( ROBOT_NOT_FOUND_FREE_CHARGING_STATION ) ;
}
DeviceInformationDO deviceInformationDO = deviceInformations . stream ( )
. filter ( v - > v . getDeviceAttribute ( ) . equals ( robot . getChargeType ( ) )
& & robot . getFloorAreaJson ( ) . contains ( v . getPositionMapId ( ) ) )
. findFirst ( )
. orElse ( new DeviceInformationDO ( ) ) ;
if ( ObjectUtil . isEmpty ( deviceInformationDO . getDeviceNo ( ) ) ) {
log . info ( " 当前机器人查不到对应的充电桩类型、或者机器人不能在此区域充电 :{} " , robot . getRobotNo ( ) ) ;
throw exception ( ROBOT_NOT_FOUND_FREE_CHARGING_STATION ) ;
}
pathPlanning . setReleaseGroupId ( " POINT_ " + deviceInformationDO . getPositionMapItemId ( ) ) ;
pathPlanning . setReleasePointId ( deviceInformationDO . getPositionMapItemId ( ) ) ;
}
/ * *
* 移动到等待点
*
* @param pathPlanning
* /
private void moveToWaitTask ( TaskToPathPlanningDTO pathPlanning , String robotNo ) {
List < PositionMapItemDO > positionMapItems = positionMapItemMapper . selectList ( new LambdaQueryWrapperX < PositionMapItemDO > ( )
. eq ( PositionMapItemDO : : getType , PositionMapItemEnum . STOP . getType ( ) )
. eq ( PositionMapItemDO : : getUseStatus , ZeroOneEnum . ZERO . getType ( ) ) ) ;
if ( ObjectUtil . isEmpty ( positionMapItems ) ) {
log . info ( " ------没有空闲的停车点----- :{} " , robotNo ) ;
throw exception ( ROBOT_NOT_FOUND_WAIT_ITEM ) ;
}
List < String > waitIds = positionMapItems
. stream ( )
. map ( u - > u . getId ( ) + " " )
. collect ( Collectors . toList ( ) ) ;
pathPlanning . setWaitIds ( waitIds ) ;
}
/ * *
* 取放货清除交管
*
* @param robotTaskDetail
* /
private void takeReleaseCleanTrafficManagement ( RobotTaskDetailDO robotTaskDetail ) {
if ( RobotTaskStageEnum . UN_START . getType ( ) . equals ( robotTaskDetail . getTaskStage ( ) )
| | RobotTaskStageEnum . GO_TAKE . getType ( ) . equals ( robotTaskDetail . getTaskStage ( ) )
| | RobotTaskStageEnum . GO_RELEASE . getType ( ) . equals ( robotTaskDetail . getTaskStage ( ) ) ) {
| | RobotTaskStageEnum . GO_TAKE . getType ( ) . equals ( robotTaskDetail . getTaskStage ( ) ) ) {
log . info ( " 清除交管--任务阶段是前往取货/待执行/前往放货 :{} " , robotTaskDetail . getRobotNo ( ) ) ;
robotTaskDetail . setTaskStatus ( RobotTaskDetailStatusEnum . NEW . getType ( ) ) ;
robotTaskDetail . setRobotNo ( null ) ;
@ -739,6 +1025,7 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
/ * *
* 车机关闭任务
*
* @param id
* @param mac
* @param orderType