feat(system): 新增设备地图关联功能并优化机器人信息相关接口- 新增设备地图关联相关实体、控制器、服务和 mapper

- 在机器人信息中集成设备地图关联数据
- 优化机器人信息查询接口,支持按地图 ID 查询- 修复公告板中设备类型默认图片显示问题
- 更新机器人状态相关 API,简化消息处理逻辑
This commit is contained in:
aikai 2025-03-06 11:11:08 +08:00
parent 0d10b907f3
commit 8e8a4259d1
21 changed files with 526 additions and 24 deletions

View File

@ -2,7 +2,6 @@ package cn.iododer.yudao.module.mqtt.service;
import cn.iocoder.yudao.module.system.api.robot.RobotStatusApi;
import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDTO;
import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDataDTO;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@ -11,18 +10,19 @@ import javax.annotation.Resource;
@Slf4j
@Service
public class RobotStatusServiceImpl implements MqttService{
public class RobotStatusServiceImpl implements MqttService {
@Resource
private RobotStatusApi robotStatusApi;
/**
* 机器人点位
*
* @param message
*/
@Override
public void analysisMessage(String message) {
log.info("处理RobotStatusServiceImpl的消息 :{}",message);
RobotStatusDTO robotStatusData = JSON.parseObject(message , RobotStatusDTO.class);
log.info("处理RobotStatusServiceImpl的消息 :{}", message);
RobotStatusDTO robotStatusData = JSON.parseObject(message, RobotStatusDTO.class);
robotStatusApi.robotStatusUpdate(robotStatusData);
}
}

View File

@ -1,9 +1,6 @@
package cn.iocoder.yudao.module.system.api.robot;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.system.api.robot.dto.RobotCompleteTaskDTO;
import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDTO;
import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDataDTO;
import cn.iocoder.yudao.module.system.enums.ApiConstants;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;

View File

@ -0,0 +1,93 @@
package cn.iocoder.yudao.module.system.controller.admin.informationmapassociation;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.system.controller.admin.informationmapassociation.vo.InformationMapAssociationPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.informationmapassociation.vo.InformationMapAssociationRespVO;
import cn.iocoder.yudao.module.system.controller.admin.informationmapassociation.vo.InformationMapAssociationSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.informationmapassociation.InformationMapAssociationDO;
import cn.iocoder.yudao.module.system.service.informationmapassociation.InformationMapAssociationService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.List;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 设备地图关联")
@RestController
@RequestMapping("/system/information-map-association")
@Validated
public class InformationMapAssociationController {
@Resource
private InformationMapAssociationService informationMapAssociationService;
@PostMapping("/create")
@Operation(summary = "创建设备地图关联")
@PreAuthorize("@ss.hasPermission('system:information-map-association:create')")
public CommonResult<Long> createInformationMapAssociation(@Valid @RequestBody InformationMapAssociationSaveReqVO createReqVO) {
return success(informationMapAssociationService.createInformationMapAssociation(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新设备地图关联")
@PreAuthorize("@ss.hasPermission('system:information-map-association:update')")
public CommonResult<Boolean> updateInformationMapAssociation(@Valid @RequestBody InformationMapAssociationSaveReqVO updateReqVO) {
informationMapAssociationService.updateInformationMapAssociation(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除设备地图关联")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('system:information-map-association:delete')")
public CommonResult<Boolean> deleteInformationMapAssociation(@RequestParam("id") Long id) {
informationMapAssociationService.deleteInformationMapAssociation(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得设备地图关联")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('system:information-map-association:query')")
public CommonResult<InformationMapAssociationRespVO> getInformationMapAssociation(@RequestParam("id") Long id) {
InformationMapAssociationDO informationMapAssociation = informationMapAssociationService.getInformationMapAssociation(id);
return success(BeanUtils.toBean(informationMapAssociation, InformationMapAssociationRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得设备地图关联分页")
@PreAuthorize("@ss.hasPermission('system:information-map-association:query')")
public CommonResult<PageResult<InformationMapAssociationRespVO>> getInformationMapAssociationPage(@Valid InformationMapAssociationPageReqVO pageReqVO) {
PageResult<InformationMapAssociationDO> pageResult = informationMapAssociationService.getInformationMapAssociationPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, InformationMapAssociationRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出设备地图关联 Excel")
@PreAuthorize("@ss.hasPermission('system:information-map-association:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportInformationMapAssociationExcel(@Valid InformationMapAssociationPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<InformationMapAssociationDO> list = informationMapAssociationService.getInformationMapAssociationPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "设备地图关联.xls", "数据", InformationMapAssociationRespVO.class,
BeanUtils.toBean(list, InformationMapAssociationRespVO.class));
}
}

View File

@ -0,0 +1,28 @@
package cn.iocoder.yudao.module.system.controller.admin.informationmapassociation.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 设备地图关联分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class InformationMapAssociationPageReqVO extends PageParam {
@Schema(description = "地图id", example = "30278")
private Long positionMapId;
@Schema(description = "AGV设备id", example = "11651")
private Long robotInformationId;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

View File

@ -0,0 +1,31 @@
package cn.iocoder.yudao.module.system.controller.admin.informationmapassociation.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
@Schema(description = "管理后台 - 设备地图关联 Response VO")
@Data
@ExcelIgnoreUnannotated
public class InformationMapAssociationRespVO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "15277")
@ExcelProperty("主键ID")
private Long id;
@Schema(description = "地图id", example = "30278")
@ExcelProperty("地图id")
private Long positionMapId;
@Schema(description = "AGV设备id", example = "11651")
@ExcelProperty("AGV设备id")
private Long robotInformationId;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

View File

@ -0,0 +1,21 @@
package cn.iocoder.yudao.module.system.controller.admin.informationmapassociation.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
@Schema(description = "管理后台 - 设备地图关联新增/修改 Request VO")
@Data
public class InformationMapAssociationSaveReqVO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "15277")
private Long id;
@Schema(description = "地图id", example = "30278")
private Long positionMapId;
@Schema(description = "AGV设备id", example = "11651")
private Long robotInformationId;
}

View File

@ -71,6 +71,14 @@ public class PositionMapItemController {
return success(BeanUtils.toBean(positionMapItem, PositionMapItemRespVO.class));
}
@GetMapping("/getAGVPointInformation")
@Operation(summary = "获取AGV点位信息")
@Parameter(name = "macAddress", description = "mac地址", required = true, example = "1024")
public CommonResult<Object> getAGVPointInformation(@RequestParam("macAddress") String macAddress) {
Object object = positionMapItemService.getAGVPointInformation(macAddress);
return success(object);
}
@GetMapping("/list")
@Operation(summary = "获取仓库点位地图节点列表")
@PreAuthorize("@ss.hasPermission('system:position-map-item:query')")

View File

@ -78,6 +78,14 @@ public class RobotInformationController {
return success(BeanUtils.toBean(pageResult, RobotInformationPageRespVO.class));
}
@GetMapping("/getListByMapId")
@Operation(summary = "根据地图id获取车辆列表")
public CommonResult<List<RobotInformationRespVO>> getListByMapId(@RequestParam Long mapId) {
List<RobotInformationDO> list = informationService.getListByMapId(mapId);
return success(BeanUtils.toBean(list, RobotInformationRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出车辆信息 Excel")
@PreAuthorize("@ss.hasPermission('robot:information:export')")

View File

@ -23,4 +23,7 @@ public class DeviceStatusInfoVO {
@Schema(description = "异常数量")
private Integer abnormalNum = 0;
@Schema(description = "默认图片")
private String defaultImage;
}

View File

@ -0,0 +1,39 @@
package cn.iocoder.yudao.module.system.dal.dataobject.informationmapassociation;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
/**
* 设备地图关联 DO
*
* @author 芋道源码
*/
@TableName("robot_information_map_association")
@KeySequence("robot_information_map_association_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class InformationMapAssociationDO extends BaseDO {
/**
* 主键ID
*/
@TableId
private Long id;
/**
* 地图id
*/
private Long positionMapId;
/**
* AGV设备id
*/
private Long robotInformationId;
}

View File

@ -0,0 +1,28 @@
package cn.iocoder.yudao.module.system.dal.mysql.informationmapassociation;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.system.dal.dataobject.informationmapassociation.InformationMapAssociationDO;
import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.yudao.module.system.controller.admin.informationmapassociation.vo.*;
/**
* 设备地图关联 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface InformationMapAssociationMapper extends BaseMapperX<InformationMapAssociationDO> {
default PageResult<InformationMapAssociationDO> selectPage(InformationMapAssociationPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<InformationMapAssociationDO>()
.eqIfPresent(InformationMapAssociationDO::getPositionMapId, reqVO.getPositionMapId())
.eqIfPresent(InformationMapAssociationDO::getRobotInformationId, reqVO.getRobotInformationId())
.betweenIfPresent(InformationMapAssociationDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(InformationMapAssociationDO::getId));
}
}

View File

@ -1,16 +1,16 @@
package cn.iocoder.yudao.module.system.dal.mysql.robot;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotInformationPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotInformationStatisticsVO;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotInformationDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Set;
/**
* 车辆信息 Mapper
*
@ -35,6 +35,7 @@ public interface RobotInformationMapper extends BaseMapperX<RobotInformationDO>
/**
* 更新机器人状态
*
* @param robotNo
* @param robotStatus
*/
@ -42,6 +43,7 @@ public interface RobotInformationMapper extends BaseMapperX<RobotInformationDO>
/**
* 查询
*
* @param query
* @return
*/
@ -49,13 +51,15 @@ public interface RobotInformationMapper extends BaseMapperX<RobotInformationDO>
/**
* 根据机器人编号查询
*
* @param robotNos
* @return
*/
List<RobotInformationDO> selectByRobotNos(@Param("robotNos") Set<String> robotNos);
List<RobotInformationDO> selectByRobotNos(@Param("robotNos") Set<String> robotNos);
/**
* 更新任务模式0拒收任务1正常
*
* @param robotNos
* @param robotTaskModel
*/
@ -64,8 +68,17 @@ public interface RobotInformationMapper extends BaseMapperX<RobotInformationDO>
/**
* 批量更新机器人状态
*
* @param robotNos
* @param robotStatus
*/
void updateRobotListStatus(@Param("robotNos") Set<String> robotNos, @Param("robotStatus") Integer robotStatus);
}
/**
* 根据地图id获取地图下的机器人信息
*
* @param mapId
* @return
*/
List<RobotInformationDO> getListByMapId(@Param("mapId") Long mapId);
}

View File

@ -13,11 +13,13 @@ import cn.iocoder.yudao.module.system.controller.admin.bulletinboard.vo.TaskStat
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.DeviceStatusInfoVO;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotInfoStatusVO;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotInformationStatisticsVO;
import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO;
import cn.iocoder.yudao.module.system.dal.dataobject.information.DeviceInformationDO;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotInformationDO;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDO;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotWarnMsgDO;
import cn.iocoder.yudao.module.system.enums.robot.RobotTaskDetailStatusEnum;
import cn.iocoder.yudao.module.system.service.dict.DictDataService;
import cn.iocoder.yudao.module.system.service.information.DeviceInformationService;
import cn.iocoder.yudao.module.system.service.robot.RobotInformationService;
import cn.iocoder.yudao.module.system.service.robot.RobotTaskService;
@ -52,6 +54,8 @@ public class BulletinBoardServiceImpl implements BulletinBoardService {
private RedisUtil redisUtil;
@Resource
private DeviceInformationService deviceInformationService;
@Resource
private DictDataService dictDataService;
@Override
public BulletinBoardVO getBulletinBoard() {
@ -123,6 +127,10 @@ public class BulletinBoardServiceImpl implements BulletinBoardService {
}
}
vo.setRobotElectricityLevelVOS(robotElectricityLevelVOS);
// - 获取设备类型字典
List<DictDataDO> deviceTypeList = dictDataService.getDictDataListByDictType("device_type");
Map<String, DictDataDO> dictMap = deviceTypeList.stream().collect(Collectors.toMap(DictDataDO::getValue, Function.identity()));
// - 获取所有设备
List<DeviceInformationDO> deviceInformationDOS = deviceInformationService.list();
//根据设备类型分组
@ -132,6 +140,7 @@ public class BulletinBoardServiceImpl implements BulletinBoardService {
Integer deviceType = entry.getKey();
DeviceStatusInfoVO deviceStatusInfoVO = new DeviceStatusInfoVO();
deviceStatusInfoVO.setDeviceType(deviceType);
deviceStatusInfoVO.setDefaultImage(dictMap.get(String.valueOf(deviceType)) == null ? null : dictMap.get(String.valueOf(deviceType)).getRemark());
List<DeviceInformationDO> deviceInformationDOList = entry.getValue();
if (CollectionUtil.isEmpty(deviceInformationDOList)) {
deviceStatusInfoVOS.add(deviceStatusInfoVO);

View File

@ -0,0 +1,62 @@
package cn.iocoder.yudao.module.system.service.informationmapassociation;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.system.controller.admin.informationmapassociation.vo.InformationMapAssociationPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.informationmapassociation.vo.InformationMapAssociationSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.informationmapassociation.InformationMapAssociationDO;
import com.baomidou.mybatisplus.extension.service.IService;
import javax.validation.Valid;
import java.util.List;
/**
* 设备地图关联 Service 接口
*
* @author 芋道源码
*/
public interface InformationMapAssociationService extends IService<InformationMapAssociationDO> {
/**
* 创建设备地图关联
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createInformationMapAssociation(@Valid InformationMapAssociationSaveReqVO createReqVO);
/**
* 更新设备地图关联
*
* @param updateReqVO 更新信息
*/
void updateInformationMapAssociation(@Valid InformationMapAssociationSaveReqVO updateReqVO);
/**
* 删除设备地图关联
*
* @param id 编号
*/
void deleteInformationMapAssociation(Long id);
/**
* 获得设备地图关联
*
* @param id 编号
* @return 设备地图关联
*/
InformationMapAssociationDO getInformationMapAssociation(Long id);
/**
* 获得设备地图关联分页
*
* @param pageReqVO 分页查询
* @return 设备地图关联分页
*/
PageResult<InformationMapAssociationDO> getInformationMapAssociationPage(InformationMapAssociationPageReqVO pageReqVO);
/**
* @param id
* @param mapIds
*/
void saveOrUpdateOrDel(Long id, List<List<Long>> mapIds);
}

View File

@ -0,0 +1,81 @@
package cn.iocoder.yudao.module.system.service.informationmapassociation;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.system.controller.admin.informationmapassociation.vo.InformationMapAssociationPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.informationmapassociation.vo.InformationMapAssociationSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.informationmapassociation.InformationMapAssociationDO;
import cn.iocoder.yudao.module.system.dal.mysql.informationmapassociation.InformationMapAssociationMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import static cn.hutool.core.collection.CollUtil.isNotEmpty;
/**
* 设备地图关联 Service 实现类
*
* @author 芋道源码
*/
@Service
@Validated
public class InformationMapAssociationServiceImpl extends ServiceImpl<InformationMapAssociationMapper, InformationMapAssociationDO> implements InformationMapAssociationService {
@Resource
private InformationMapAssociationMapper informationMapAssociationMapper;
@Override
public Long createInformationMapAssociation(InformationMapAssociationSaveReqVO createReqVO) {
// 插入
InformationMapAssociationDO informationMapAssociation = BeanUtils.toBean(createReqVO, InformationMapAssociationDO.class);
informationMapAssociationMapper.insert(informationMapAssociation);
// 返回
return informationMapAssociation.getId();
}
@Override
public void updateInformationMapAssociation(InformationMapAssociationSaveReqVO updateReqVO) {
// 更新
InformationMapAssociationDO updateObj = BeanUtils.toBean(updateReqVO, InformationMapAssociationDO.class);
informationMapAssociationMapper.updateById(updateObj);
}
@Override
public void deleteInformationMapAssociation(Long id) {
// 删除
informationMapAssociationMapper.deleteById(id);
}
@Override
public InformationMapAssociationDO getInformationMapAssociation(Long id) {
return informationMapAssociationMapper.selectById(id);
}
@Override
public PageResult<InformationMapAssociationDO> getInformationMapAssociationPage(InformationMapAssociationPageReqVO pageReqVO) {
return informationMapAssociationMapper.selectPage(pageReqVO);
}
@Override
public void saveOrUpdateOrDel(Long id, List<List<Long>> mapIds) {
//批量添加修改删除
if (isNotEmpty(mapIds.get(0))) {
List<InformationMapAssociationDO> saveList = new ArrayList<>();
for (Long mapId : mapIds.get(0)) {
saveList.add(new InformationMapAssociationDO().setPositionMapId(mapId).setRobotInformationId(id));
}
informationMapAssociationMapper.insertBatch(saveList);
}
if (isNotEmpty(mapIds.get(2))) {
informationMapAssociationMapper.delete(new LambdaQueryWrapper<InformationMapAssociationDO>()
.eq(InformationMapAssociationDO::getRobotInformationId, id)
.in(InformationMapAssociationDO::getPositionMapId, mapIds.get(2)));
}
}
}

View File

@ -88,8 +88,17 @@ public interface PositionMapItemService extends IService<PositionMapItemDO> {
/**
* 清空laneId
*
* @param mapId
* @param laneId
*/
void emptyLaneId(Long mapId, Long laneId);
/**
* 通过mac地址获取AGV点位信息
*
* @param macAddress
* @return
*/
Object getAGVPointInformation(String macAddress);
}

View File

@ -3,11 +3,13 @@ package cn.iocoder.yudao.module.system.service.positionmap;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.system.constant.robot.RobotTaskChcheConstant;
import cn.iocoder.yudao.module.system.controller.admin.positionmap.dto.PositionMapConditionDTO;
import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapItemPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapItemSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapItemDO;
import cn.iocoder.yudao.module.system.dal.mysql.positionmap.PositionMapItemMapper;
import cn.iocoder.yudao.module.system.util.redis.RedisUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -30,6 +32,8 @@ public class PositionMapItemServiceImpl extends ServiceImpl<PositionMapItemMappe
@Resource
private PositionMapItemMapper positionMapItemMapper;
@Resource
private RedisUtil redisUtil;
@Override
public Long createPositionMapItem(PositionMapItemSaveReqVO createReqVO) {
@ -107,5 +111,15 @@ public class PositionMapItemServiceImpl extends ServiceImpl<PositionMapItemMappe
positionMapItemMapper.emptyLaneId(mapId, laneId);
}
@Override
public Object getAGVPointInformation(String macAddress) {
String pose2dKey = RobotTaskChcheConstant.ROBOT_INFORMATION_POSE_BAT_SOC + macAddress;
try {
// 睡眠 0.5s 以确保获取到是最新的数据
Thread.sleep(500);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
return redisUtil.get(pose2dKey);
}
}

View File

@ -110,4 +110,11 @@ public interface RobotInformationService extends IService<RobotInformationDO> {
* @return
*/
RobotInformationVO getRobotByRedis(String macAddress);
/**
* 根据地图id查询车辆信息
* @param mapId
* @return
*/
List<RobotInformationDO> getListByMapId(Long mapId);
}

View File

@ -1,9 +1,11 @@
package cn.iocoder.yudao.module.system.service.robot;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
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.tenant.core.context.TenantContextHolder;
import cn.iocoder.yudao.module.system.api.robot.RequestProcessor;
@ -12,17 +14,18 @@ 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.robot.RobotTaskChcheConstant;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.*;
import cn.iocoder.yudao.module.system.dal.dataobject.informationmapassociation.InformationMapAssociationDO;
import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapDO;
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.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.enums.robot.CommandTypeEnum;
import cn.iocoder.yudao.module.system.enums.robot.RobotStatusEnum;
import cn.iocoder.yudao.module.system.enums.robot.RobotTaskModelEnum;
import cn.iocoder.yudao.module.system.enums.robot.information.RobotStatisticsTypeEnum;
import cn.iocoder.yudao.module.system.service.informationmapassociation.InformationMapAssociationService;
import cn.iocoder.yudao.module.system.util.redis.RedisUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@ -30,10 +33,7 @@ import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@ -54,10 +54,6 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
@Resource
private PositionMapMapper positionMapMapper;
@Resource
private RobotTaskDetailMapper taskDetailMapper;
@Resource
private RobotModelMapper modelMapper;
@ -65,6 +61,8 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
private RedisUtil redisUtil;
@Resource
private RequestProcessor processor;
@Resource
private InformationMapAssociationService informationMapAssociationService;
// -- 获取所有的设备信息key
public static final String key = RobotTaskChcheConstant.ROBOT_GET_ROBOT_INFO;
@ -91,6 +89,17 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
// 插入
RobotInformationDO information = BeanUtils.toBean(createReqVO, RobotInformationDO.class);
informationMapper.insert(information);
// 新增AGV于地图关系表 -----
if (CollUtil.isNotEmpty(createReqVO.getFloorAreaJson())) {
List<InformationMapAssociationDO> list = new ArrayList<>();
for (Long mapId : createReqVO.getFloorAreaJson()) {
InformationMapAssociationDO item = new InformationMapAssociationDO();
item.setRobotInformationId(information.getId());
item.setPositionMapId(mapId);
list.add(item);
}
informationMapAssociationService.saveBatch(list);
}
// 返回
return information.getId();
}
@ -99,6 +108,11 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
public void updateInformation(RobotInformationSaveReqVO updateReqVO) {
// 校验存在
validateInformationExists(updateReqVO.getId());
RobotInformationDO robotInformationDO = informationMapper.selectById(updateReqVO.getId());
if (robotInformationDO == null) {
throw exception(ROBOT_INFORMATION_NOT_EXISTS);
}
//校验MAC地址
RobotInformationDO query = new RobotInformationDO();
query.setMacAddress(updateReqVO.getMacAddress());
@ -121,6 +135,12 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
RobotInformationDO updateObj = BeanUtils.toBean(updateReqVO, RobotInformationDO.class);
informationMapper.updateById(updateObj);
redisUtil.set(RobotTaskChcheConstant.ROBOT_GET_ROBOTNO_BY_MAC + updateObj.getMacAddress(), updateObj.getRobotNo());
// 更新AGV于地图关系表 -----
List<List<Long>> list = CollectionUtils.compareLists(
(CollUtil.isEmpty(robotInformationDO.getFloorAreaJson()) ? Collections.emptyList() : new ArrayList<>(robotInformationDO.getFloorAreaJson())),
(CollUtil.isEmpty(updateReqVO.getFloorAreaJson()) ? Collections.emptyList() : new ArrayList<>(updateReqVO.getFloorAreaJson())),
ObjectUtil::equal);
informationMapAssociationService.saveOrUpdateOrDel(updateReqVO.getId(), list);
}
@Override
@ -491,4 +511,9 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
}
return new RobotInformationVO();
}
@Override
public List<RobotInformationDO> getListByMapId(Long mapId) {
return informationMapper.getListByMapId(mapId);
}
}

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.iocoder.yudao.module.system.dal.mysql.informationmapassociation.InformationMapAssociationMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
</mapper>

View File

@ -298,4 +298,18 @@
#{robotNo}
</foreach>
</select>
</mapper>
<select id="getListByMapId"
resultType="cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotInformationDO">
select
a.*
from robot_information as a
left join robot_information_map_association as b on a.id = b.robot_information_id
<where>
a.deleted = 0
and b.deleted = 0
<if test="mapId != null">
and b.position_map_id = #{mapId}
</if>
</where>
</select>
</mapper>