feat(system): 添加机器人状态测试接口并优化数据处理

- 在 RobotInformationController 中添加 test 接口,用于测试机器人状态
- 在 RobotInformationService 中添加 test 方法,处理机器人状态数据
- 在 HouseAreaService 中修改 getHouseAreaList 方法,增加 positionMapId 参数- 在 application-local.yaml 中更新数据库连接 URL,添加 allowMultiQueries 参数
- 新增 RequestProcessor 类,用于处理和发送机器人状态数据
This commit is contained in:
aikai 2025-02-14 11:46:47 +08:00
parent 8565c226cf
commit 22c8eca028
3 changed files with 25 additions and 59 deletions

View File

@ -6,7 +6,6 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDTO;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.*; import cn.iocoder.yudao.module.system.controller.admin.robot.vo.*;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotInformationDO; import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotInformationDO;
import cn.iocoder.yudao.module.system.service.robot.RobotInformationService; import cn.iocoder.yudao.module.system.service.robot.RobotInformationService;
@ -18,7 +17,6 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.annotation.security.PermitAll;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; import javax.validation.Valid;
import java.io.IOException; import java.io.IOException;
@ -37,14 +35,6 @@ public class RobotInformationController {
@Resource @Resource
private RobotInformationService informationService; private RobotInformationService informationService;
@PostMapping("/test")
@Operation(summary = "测试")
@PermitAll
public CommonResult<Boolean> test(@RequestBody RobotStatusDTO dto) {
informationService.test(dto);
return success(true);
}
@PostMapping("/create") @PostMapping("/create")
@Operation(summary = "创建车辆信息") @Operation(summary = "创建车辆信息")
@PreAuthorize("@ss.hasPermission('robot:information:create')") @PreAuthorize("@ss.hasPermission('robot:information:create')")

View File

@ -1,13 +1,12 @@
package cn.iocoder.yudao.module.system.service.robot; package cn.iocoder.yudao.module.system.service.robot;
import java.util.*;
import javax.validation.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDTO;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.*; import cn.iocoder.yudao.module.system.controller.admin.robot.vo.*;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotInformationDO; import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotInformationDO;
import javax.validation.Valid;
import java.util.List;
/** /**
* 车辆信息 Service 接口 * 车辆信息 Service 接口
* *
@ -55,32 +54,30 @@ public interface RobotInformationService {
/** /**
* 统计车辆待命/任务中/离线 * 统计车辆待命/任务中/离线
*
* @return * @return
*/ */
RobotInformationStatisticsVO statisticsInformation(); RobotInformationStatisticsVO statisticsInformation();
/** /**
* 查询能正常使用的车辆 * 查询能正常使用的车辆
*
* @return * @return
*/ */
List<RobotInformationDO> getCanUseRobot(); List<RobotInformationDO> getCanUseRobot();
/** /**
* 查询所有车辆 * 查询所有车辆
*
* @return * @return
*/ */
List<RobotInformationDO> getAllRobot(); List<RobotInformationDO> getAllRobot();
/** /**
* 查询机器人编号 * 查询机器人编号
*
* @param mac * @param mac
* @return * @return
*/ */
String getRobotNoByMac(String mac); String getRobotNoByMac(String mac);
/**
*
* @param dto
*/
void test(@Valid RobotStatusDTO dto);
} }

View File

@ -5,9 +5,7 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
import cn.iocoder.yudao.module.system.api.robot.RequestProcessor; import cn.iocoder.yudao.module.system.api.robot.RequestProcessor;
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.dto.RobotStatusDataPoseDTO;
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.robot.vo.*; import cn.iocoder.yudao.module.system.controller.admin.robot.vo.*;
@ -55,8 +53,6 @@ public class RobotInformationServiceImpl implements RobotInformationService {
@Resource @Resource
private RedisUtil redisUtil; private RedisUtil redisUtil;
@Resource
private RequestProcessor processor;
@Override @Override
public Long createInformation(RobotInformationSaveReqVO createReqVO) { public Long createInformation(RobotInformationSaveReqVO createReqVO) {
@ -110,7 +106,7 @@ public class RobotInformationServiceImpl implements RobotInformationService {
// 更新 // 更新
RobotInformationDO updateObj = BeanUtils.toBean(updateReqVO, RobotInformationDO.class); RobotInformationDO updateObj = BeanUtils.toBean(updateReqVO, RobotInformationDO.class);
informationMapper.updateById(updateObj); informationMapper.updateById(updateObj);
redisUtil.set(RobotTaskChcheConstant.ROBOT_GET_ROBOTNO_BY_MAC + updateObj.getMacAddress(),updateObj.getRobotNo()); redisUtil.set(RobotTaskChcheConstant.ROBOT_GET_ROBOTNO_BY_MAC + updateObj.getMacAddress(), updateObj.getRobotNo());
} }
@Override @Override
@ -162,14 +158,15 @@ public class RobotInformationServiceImpl implements RobotInformationService {
/** /**
* 设置状态和信息 * 设置状态和信息
*
* @param v * @param v
*/ */
private void setMsgAndRobotStatus(RobotInformationPageRespVO v) { private void setMsgAndRobotStatus(RobotInformationPageRespVO v) {
String pose2dKey = RobotTaskChcheConstant.ROBOT_INFORMATION_POSE_BAT_SOC +v.getMacAddress(); String pose2dKey = RobotTaskChcheConstant.ROBOT_INFORMATION_POSE_BAT_SOC + v.getMacAddress();
Object object = redisUtil.get(pose2dKey); Object object = redisUtil.get(pose2dKey);
RobotStatusDataPoseDTO robotStatusDataPoseDTO= JSONUtil.toBean((String)object, RobotStatusDataPoseDTO.class); RobotStatusDataPoseDTO robotStatusDataPoseDTO = JSONUtil.toBean((String) object, RobotStatusDataPoseDTO.class);
String robotDoingActionKey = RobotTaskChcheConstant.ROBOT_QUERY_DOING_ACTION +v.getMacAddress(); String robotDoingActionKey = RobotTaskChcheConstant.ROBOT_QUERY_DOING_ACTION + v.getMacAddress();
Object action = redisUtil.get(robotDoingActionKey); Object action = redisUtil.get(robotDoingActionKey);
if (ObjectUtil.isNotEmpty(object) && ObjectUtil.isNotEmpty(robotStatusDataPoseDTO)) { if (ObjectUtil.isNotEmpty(object) && ObjectUtil.isNotEmpty(robotStatusDataPoseDTO)) {
@ -181,10 +178,10 @@ public class RobotInformationServiceImpl implements RobotInformationService {
if (RobotTaskModelEnum.REJECTION.getType().equals(v.getRobotTaskModel())) { if (RobotTaskModelEnum.REJECTION.getType().equals(v.getRobotTaskModel())) {
v.setRobotStatus(RobotInformationPageStatusEnum.DOLOCK.getType()); v.setRobotStatus(RobotInformationPageStatusEnum.DOLOCK.getType());
v.setMsg("车辆已经锁定"); v.setMsg("车辆已经锁定");
}else if (ObjectUtil.isEmpty(object)) { } else if (ObjectUtil.isEmpty(object)) {
v.setRobotStatus(RobotInformationPageStatusEnum.OFFLINE.getType()); v.setRobotStatus(RobotInformationPageStatusEnum.OFFLINE.getType());
v.setMsg("车辆已经离线"); v.setMsg("车辆已经离线");
}else if (RobotStatusEnum.STAND_BY.getType().equals(v.getRobotStatus())) { } else if (RobotStatusEnum.STAND_BY.getType().equals(v.getRobotStatus())) {
//查看机器人最后做的任务是不是充电 //查看机器人最后做的任务是不是充电
RobotTaskDetailDO robotTaskDetailDO = taskDetailMapper.selectOne(new LambdaQueryWrapper<RobotTaskDetailDO>() RobotTaskDetailDO robotTaskDetailDO = taskDetailMapper.selectOne(new LambdaQueryWrapper<RobotTaskDetailDO>()
.eq(RobotTaskDetailDO::getRobotNo, v.getRobotNo()) .eq(RobotTaskDetailDO::getRobotNo, v.getRobotNo())
@ -195,15 +192,15 @@ public class RobotInformationServiceImpl implements RobotInformationService {
&& RobotTaskStatusEnum.DOING.getType().equals(robotTaskDetailDO.getTaskStatus())) { && RobotTaskStatusEnum.DOING.getType().equals(robotTaskDetailDO.getTaskStatus())) {
v.setRobotStatus(RobotInformationPageStatusEnum.CHARGE.getType()); v.setRobotStatus(RobotInformationPageStatusEnum.CHARGE.getType());
v.setMsg("车辆正在充电"); v.setMsg("车辆正在充电");
}else { } else {
v.setRobotStatus(RobotInformationPageStatusEnum.STANDBY.getType()); v.setRobotStatus(RobotInformationPageStatusEnum.STANDBY.getType());
v.setMsg("车辆正在待命"); v.setMsg("车辆正在待命");
} }
}else if (RobotStatusEnum.DOING.getType().equals(v.getRobotStatus()) && ObjectUtil.isNotEmpty(action)) { } else if (RobotStatusEnum.DOING.getType().equals(v.getRobotStatus()) && ObjectUtil.isNotEmpty(action)) {
v.setRobotStatus(RobotInformationPageStatusEnum.INTASK.getType()); v.setRobotStatus(RobotInformationPageStatusEnum.INTASK.getType());
CommandTypeEnum commandType = CommandTypeEnum.getCommandType(String.valueOf(action)); CommandTypeEnum commandType = CommandTypeEnum.getCommandType(String.valueOf(action));
if (ObjectUtil.isNotEmpty(commandType)) { if (ObjectUtil.isNotEmpty(commandType)) {
v.setMsg("车辆正在"+commandType.getMsg()); v.setMsg("车辆正在" + commandType.getMsg());
} }
} else { } else {
v.setRobotStatus(RobotInformationPageStatusEnum.FAULT.getType()); v.setRobotStatus(RobotInformationPageStatusEnum.FAULT.getType());
@ -214,6 +211,7 @@ public class RobotInformationServiceImpl implements RobotInformationService {
/** /**
* 统计车辆待命/任务中/离线 * 统计车辆待命/任务中/离线
*
* @return * @return
*/ */
@Override @Override
@ -233,13 +231,13 @@ public class RobotInformationServiceImpl implements RobotInformationService {
Integer fault = 0; Integer fault = 0;
//0待命1任务中2锁定3离线4:充电中5:故障 //0待命1任务中2锁定3离线4:充电中5:故障
for (RobotInformationDO v : existRobot) { for (RobotInformationDO v : existRobot) {
String pose2dKey = RobotTaskChcheConstant.ROBOT_INFORMATION_POSE_BAT_SOC +v.getMacAddress(); String pose2dKey = RobotTaskChcheConstant.ROBOT_INFORMATION_POSE_BAT_SOC + v.getMacAddress();
Object object = redisUtil.get(pose2dKey); Object object = redisUtil.get(pose2dKey);
if (ObjectUtil.isEmpty(object)) { if (ObjectUtil.isEmpty(object)) {
offline++; offline++;
}else if (RobotTaskModelEnum.REJECTION.getType().equals(v.getRobotTaskModel())) { } else if (RobotTaskModelEnum.REJECTION.getType().equals(v.getRobotTaskModel())) {
doLock++; doLock++;
}else if (RobotStatusEnum.STAND_BY.getType().equals(v.getRobotStatus())) { } else if (RobotStatusEnum.STAND_BY.getType().equals(v.getRobotStatus())) {
//查看机器人最后做的任务是不是充电 //查看机器人最后做的任务是不是充电
RobotTaskDetailDO robotTaskDetailDO = taskDetailMapper.selectOne(new LambdaQueryWrapper<RobotTaskDetailDO>() RobotTaskDetailDO robotTaskDetailDO = taskDetailMapper.selectOne(new LambdaQueryWrapper<RobotTaskDetailDO>()
@ -250,11 +248,11 @@ public class RobotInformationServiceImpl implements RobotInformationService {
&& RobotTaskTypeEnum.CHARGE.getType().equals(robotTaskDetailDO.getTaskType()) && RobotTaskTypeEnum.CHARGE.getType().equals(robotTaskDetailDO.getTaskType())
&& RobotTaskStatusEnum.DOING.getType().equals(robotTaskDetailDO.getTaskStatus())) { && RobotTaskStatusEnum.DOING.getType().equals(robotTaskDetailDO.getTaskStatus())) {
charge++; charge++;
}else { } else {
standby++; standby++;
} }
}else if (RobotStatusEnum.DOING.getType().equals(v.getRobotStatus())) { } else if (RobotStatusEnum.DOING.getType().equals(v.getRobotStatus())) {
inTask++; inTask++;
} else { } else {
fault++; fault++;
@ -271,7 +269,6 @@ public class RobotInformationServiceImpl implements RobotInformationService {
} }
/** /**
*
* @return * @return
*/ */
@Override @Override
@ -289,6 +286,7 @@ public class RobotInformationServiceImpl implements RobotInformationService {
/** /**
* 根据mac查询机器人编号 * 根据mac查询机器人编号
*
* @param mac * @param mac
* @return * @return
*/ */
@ -307,29 +305,10 @@ public class RobotInformationServiceImpl implements RobotInformationService {
.eq(RobotInformationDO::getMacAddress, mac) .eq(RobotInformationDO::getMacAddress, mac)
.last("limit 1")); .last("limit 1"));
if (ObjectUtil.isNotEmpty(robotInformationDO)) { if (ObjectUtil.isNotEmpty(robotInformationDO)) {
redisUtil.set(RobotTaskChcheConstant.ROBOT_GET_ROBOTNO_BY_MAC + mac,robotInformationDO.getRobotNo()); redisUtil.set(RobotTaskChcheConstant.ROBOT_GET_ROBOTNO_BY_MAC + mac, robotInformationDO.getRobotNo());
return robotInformationDO.getRobotNo(); return robotInformationDO.getRobotNo();
} }
return ""; return "";
} }
@Override
public void test(RobotStatusDTO robotStatusDataDTO) {
TenantContextHolder.setTenantId(1L);
if (ObjectUtil.isEmpty(robotStatusDataDTO) || ObjectUtil.isEmpty(robotStatusDataDTO.getMac())) {
return;
}
RobotStatusDataPoseDTO robotStatusDataPoseDTO = new RobotStatusDataPoseDTO();
robotStatusDataPoseDTO.setX(robotStatusDataDTO.getData().getPose2d().getX());
robotStatusDataPoseDTO.setY(robotStatusDataDTO.getData().getPose2d().getY());
robotStatusDataPoseDTO.setYaw(robotStatusDataDTO.getData().getPose2d().getYaw());
robotStatusDataPoseDTO.setFloor(robotStatusDataDTO.getData().getFloor_zone().getFloor());
robotStatusDataPoseDTO.setArea(robotStatusDataDTO.getData().getFloor_zone().getArea());
robotStatusDataPoseDTO.setBat_soc(robotStatusDataDTO.getData().getPose2d().getBat_soc());
// 模拟请求
processor.handleRequest(robotStatusDataDTO.getData().getFloor_zone().getFloor() + "_" + robotStatusDataDTO.getData().getFloor_zone().getArea(),
robotStatusDataDTO.getMac(), JSONUtil.toJsonStr(robotStatusDataPoseDTO));
}
} }