feat(system): 新增设备地图关联功能并优化机器人信息相关接口- 新增设备地图关联相关实体、控制器、服务和 mapper
- 在机器人信息中集成设备地图关联数据 - 优化机器人信息查询接口,支持按地图 ID 查询- 修复公告板中设备类型默认图片显示问题 - 更新机器人状态相关 API,简化消息处理逻辑
This commit is contained in:
parent
0d10b907f3
commit
8e8a4259d1
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
|
||||
}
|
@ -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;
|
||||
|
||||
}
|
@ -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;
|
||||
|
||||
}
|
@ -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')")
|
||||
|
@ -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')")
|
||||
|
@ -23,4 +23,7 @@ public class DeviceStatusInfoVO {
|
||||
@Schema(description = "异常数量")
|
||||
private Integer abnormalNum = 0;
|
||||
|
||||
@Schema(description = "默认图片")
|
||||
private String defaultImage;
|
||||
|
||||
}
|
||||
|
@ -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") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 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;
|
||||
|
||||
}
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
@ -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);
|
||||
}
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
@ -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)));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -110,4 +110,11 @@ public interface RobotInformationService extends IService<RobotInformationDO> {
|
||||
* @return
|
||||
*/
|
||||
RobotInformationVO getRobotByRedis(String macAddress);
|
||||
|
||||
/**
|
||||
* 根据地图id查询车辆信息
|
||||
* @param mapId
|
||||
* @return
|
||||
*/
|
||||
List<RobotInformationDO> getListByMapId(Long mapId);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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>
|
@ -298,4 +298,18 @@
|
||||
#{robotNo}
|
||||
</foreach>
|
||||
</select>
|
||||
<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>
|
Loading…
Reference in New Issue
Block a user