feat(system): 优化库区管理和设备信息展示

- 新增库区删除功能
- 完善设备状态信息统计
- 优化地图点位与库区、通道关联逻辑
- 重构设备信息获取方法
- 优化数据字典查询效率
This commit is contained in:
aikai 2025-02-21 10:52:47 +08:00
parent 9ee9fc7994
commit 1be88c8b42
33 changed files with 445 additions and 57 deletions

View File

@ -92,6 +92,18 @@ public class PositionMapLineDTO {
@Schema(description = "膨胀区域右") @Schema(description = "膨胀区域右")
private BigDecimal expansionZoneRight; private BigDecimal expansionZoneRight;
@Schema(description = "起点宽")
private BigDecimal beginWidth;
@Schema(description = "起点高")
private BigDecimal beginHigh;
@Schema(description = "终点宽")
private BigDecimal endWidth;
@Schema(description = "终点高")
private BigDecimal endHigh;
@Schema(description = "车头朝向( 0:正正 1:正反 2:反正 3:反反)", example = "15890") @Schema(description = "车头朝向( 0:正正 1:正反 2:反正 3:反反)", example = "15890")
private Integer toward; private Integer toward;

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.system.controller.admin.bulletinboard.vo; package cn.iocoder.yudao.module.system.controller.admin.bulletinboard.vo;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.DeviceStatusInfoVO;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotInformationStatisticsVO; import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotInformationStatisticsVO;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDO; 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.dal.dataobject.robot.RobotWarnMsgDO;
@ -22,4 +23,8 @@ public class BulletinBoardVO {
private RobotInformationStatisticsVO statistics; private RobotInformationStatisticsVO statistics;
@Schema(description = "车辆异常信息") @Schema(description = "车辆异常信息")
private List<RobotWarnMsgDO> robotWarnMsgDOS; private List<RobotWarnMsgDO> robotWarnMsgDOS;
@Schema(description = "车辆信息")
List<RobotElectricityLevelVO> robotElectricityLevelVOS;
@Schema(description = "设备信息")
private List<DeviceStatusInfoVO> deviceStatusInfoVOS;
} }

View File

@ -9,8 +9,20 @@ import lombok.ToString;
public class RobotElectricityLevelVO { public class RobotElectricityLevelVO {
@Schema(description = "AGV编号") @Schema(description = "AGV编号")
private String robotNo; private String robotNo;
@Schema(description = "状态") @Schema(description = "设备mac地址")
private String status; private String macAddress;
@Schema(description = "待命 0否 1是")
private Integer standby = 0;
@Schema(description = "任务中 0否 1是")
private Integer inTask = 0;
@Schema(description = "锁定 0否 1是")
private Integer doLock = 0;
@Schema(description = "离线 0否 1是")
private Integer offline = 0;
@Schema(description = "充电中 0否 1是")
private Integer charge = 0;
@Schema(description = "故障 0否 1是")
private Integer fault = 0;
@Schema(description = "电量") @Schema(description = "电量")
private String batSoc; private String batSoc;
} }

View File

@ -3,8 +3,11 @@ package cn.iocoder.yudao.module.system.controller.admin.housearea;
import cn.iocoder.yudao.module.system.controller.admin.housearea.vo.HouseAreaPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.housearea.vo.HouseAreaPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.housearea.vo.HouseAreaRespVO; import cn.iocoder.yudao.module.system.controller.admin.housearea.vo.HouseAreaRespVO;
import cn.iocoder.yudao.module.system.controller.admin.housearea.vo.HouseAreaSaveReqVO; import cn.iocoder.yudao.module.system.controller.admin.housearea.vo.HouseAreaSaveReqVO;
import cn.iocoder.yudao.module.system.controller.admin.houselane.vo.WareHouseLanePageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.houselane.vo.WareHouseLaneRespVO;
import cn.iocoder.yudao.module.system.controller.admin.houselane.vo.WareHouseLaneSaveReqVO; import cn.iocoder.yudao.module.system.controller.admin.houselane.vo.WareHouseLaneSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.housearea.HouseAreaDO; import cn.iocoder.yudao.module.system.dal.dataobject.housearea.HouseAreaDO;
import cn.iocoder.yudao.module.system.dal.dataobject.houselane.WareHouseLaneDO;
import cn.iocoder.yudao.module.system.service.housearea.HouseAreaService; import cn.iocoder.yudao.module.system.service.housearea.HouseAreaService;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
@ -87,4 +90,12 @@ public class HouseAreaController {
return success(BeanUtils.toBean(list, HouseAreaRespVO.class)); return success(BeanUtils.toBean(list, HouseAreaRespVO.class));
} }
@DeleteMapping("/delete")
@Operation(summary = "删除库区")
@Parameter(name = "id", description = "菜单编号", required= true, example = "1024")
public CommonResult<Boolean> delete(@RequestParam("id") Long id) {
houseAreaService.delete(id);
return success(true);
}
} }

View File

@ -28,6 +28,10 @@ public class HouseAreaRespVO {
@ExcelProperty("库区说明") @ExcelProperty("库区说明")
private String areaMsg; private String areaMsg;
@Schema(description = "物料信息")
@ExcelProperty("物料信息")
private String skuInfo;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间") @ExcelProperty("创建时间")
private LocalDateTime createTime; private LocalDateTime createTime;

View File

@ -1,10 +1,15 @@
package cn.iocoder.yudao.module.system.controller.admin.houselane; package cn.iocoder.yudao.module.system.controller.admin.houselane;
import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.CommonResult;
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.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.system.controller.admin.housearea.vo.HouseAreaPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.housearea.vo.HouseAreaRespVO;
import cn.iocoder.yudao.module.system.controller.admin.houselane.vo.WareHouseLanePageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.houselane.vo.WareHouseLaneRespVO; import cn.iocoder.yudao.module.system.controller.admin.houselane.vo.WareHouseLaneRespVO;
import cn.iocoder.yudao.module.system.controller.admin.houselane.vo.WareHouseLaneSaveReqVO; import cn.iocoder.yudao.module.system.controller.admin.houselane.vo.WareHouseLaneSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.housearea.HouseAreaDO;
import cn.iocoder.yudao.module.system.dal.dataobject.houselane.WareHouseLaneDO; import cn.iocoder.yudao.module.system.dal.dataobject.houselane.WareHouseLaneDO;
import cn.iocoder.yudao.module.system.service.houselane.WareHouseLaneService; import cn.iocoder.yudao.module.system.service.houselane.WareHouseLaneService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
@ -62,4 +67,20 @@ public class WareHouseLaneController {
.orderByAsc(WareHouseLaneDO::getId)); .orderByAsc(WareHouseLaneDO::getId));
return success(BeanUtils.toBean(list, WareHouseLaneRespVO.class)); return success(BeanUtils.toBean(list, WareHouseLaneRespVO.class));
} }
@GetMapping("/page")
@Operation(summary = "获得线库分页")
@PreAuthorize("@ss.hasPermission('ware:house-area:query')")
public CommonResult<PageResult<WareHouseLaneRespVO>> getHouseAreaPage(@Valid WareHouseLanePageReqVO pageReqVO) {
PageResult<WareHouseLaneDO> pageResult = houseLaneService.getHouseLanePage(pageReqVO);
return success(BeanUtils.toBean(pageResult, WareHouseLaneRespVO.class));
}
@DeleteMapping("/delete")
@Operation(summary = "删除线库")
@Parameter(name = "id", description = "菜单编号", required= true, example = "1024")
public CommonResult<Boolean> delete(@RequestParam("id") Long id) {
houseLaneService.delete(id);
return success(true);
}
} }

View File

@ -1,8 +1,10 @@
package cn.iocoder.yudao.module.system.controller.admin.positionmap; package cn.iocoder.yudao.module.system.controller.admin.positionmap;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.framework.common.enums.NodeTypeEnum; import cn.iocoder.yudao.framework.common.enums.NodeTypeEnum;
import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.system.controller.admin.positionmap.dto.NodeBaseDTO; import cn.iocoder.yudao.module.system.controller.admin.positionmap.dto.NodeBaseDTO;
@ -19,6 +21,7 @@ import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.validation.Valid; import javax.validation.Valid;
import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -45,12 +48,15 @@ public class PositionMapItemController {
Map<Integer, List<NodeBaseDTO>> map = nodeBaseDTOS.stream().collect(Collectors.groupingBy(NodeBaseDTO::getType)); Map<Integer, List<NodeBaseDTO>> map = nodeBaseDTOS.stream().collect(Collectors.groupingBy(NodeBaseDTO::getType));
// -- 获取到对应地图的所有点位 // -- 获取到对应地图的所有点位
List<PositionMapItemDO> oldList = positionMapItemService.getByMapId(positionMapId); List<PositionMapItemDO> oldList = positionMapItemService.getByMapId(positionMapId);
Map<Integer, List<PositionMapItemDO>> oldMap = oldList.stream().collect(Collectors.groupingBy(PositionMapItemDO::getType)); List<PositionMapItemDO> newAllList = new ArrayList<>();
for (Integer key : NodeTypeEnum.getAllTypes()) { for (Integer key : NodeTypeEnum.getAllTypes()) {
List<NodeBaseDTO> nodeBaseDTOList = CollectionUtil.isEmpty(map.get(key)) ? Collections.emptyList() : map.get(key); List<NodeBaseDTO> nodeBaseDTOList = CollectionUtil.isEmpty(map.get(key)) ? Collections.emptyList() : map.get(key);
List<PositionMapItemDO> oldItemList = CollectionUtil.isEmpty(oldMap.get(key)) ? Collections.emptyList() : oldMap.get(key); List<PositionMapItemDO> newList = nodeProcessingContext.processNodesByStrategy(positionMapId, key, nodeBaseDTOList);
nodeProcessingContext.processNodesByStrategy(positionMapId, oldItemList, key, nodeBaseDTOList); newAllList.addAll(newList);
} }
List<List<PositionMapItemDO>> list = CollectionUtils.compareLists(oldList, newAllList,
(oldVal, newVal) -> ObjectUtil.equal(oldVal.getId(), newVal.getId()));
positionMapItemService.batchSaveOrEditOrDel(positionMapId, list);
return success(true); return success(true);
} }

View File

@ -90,6 +90,18 @@ public class PositionMapLineDTO {
@Schema(description = "膨胀区域右") @Schema(description = "膨胀区域右")
private BigDecimal expansionZoneRight; private BigDecimal expansionZoneRight;
@Schema(description = "起点宽")
private BigDecimal beginWidth;
@Schema(description = "起点高")
private BigDecimal beginHigh;
@Schema(description = "终点宽")
private BigDecimal endWidth;
@Schema(description = "终点高")
private BigDecimal endHigh;
@Schema(description = "车头朝向( 0:正正 1:正反 2:反正 3:反反)") @Schema(description = "车头朝向( 0:正正 1:正反 2:反正 3:反反)")
private Integer toward; private Integer toward;
} }

View File

@ -85,6 +85,18 @@ public class PositionMapLinePageReqVO extends PageParam {
@Schema(description = "膨胀区域右", example = "15890") @Schema(description = "膨胀区域右", example = "15890")
private BigDecimal expansionZoneRight; private BigDecimal expansionZoneRight;
@Schema(description = "起点宽")
private BigDecimal beginWidth;
@Schema(description = "起点高")
private BigDecimal beginHigh;
@Schema(description = "终点宽")
private BigDecimal endWidth;
@Schema(description = "终点高")
private BigDecimal endHigh;
@Schema(description = "行走方法 0.直线 1.曲线") @Schema(description = "行走方法 0.直线 1.曲线")
private Integer method; private Integer method;

View File

@ -94,6 +94,18 @@ public class PositionMapLineRespVO {
@ExcelProperty("膨胀区域右") @ExcelProperty("膨胀区域右")
private BigDecimal expansionZoneRight; private BigDecimal expansionZoneRight;
@Schema(description = "起点宽")
private BigDecimal beginWidth;
@Schema(description = "起点高")
private BigDecimal beginHigh;
@Schema(description = "终点宽")
private BigDecimal endWidth;
@Schema(description = "终点高")
private BigDecimal endHigh;
@Schema(description = "行走方法 0.直线 1.曲线") @Schema(description = "行走方法 0.直线 1.曲线")
@ExcelProperty("行走方法 0.直线 1.曲线") @ExcelProperty("行走方法 0.直线 1.曲线")
private Integer method; private Integer method;

View File

@ -82,6 +82,18 @@ public class PositionMapLineSaveReqVO {
@Schema(description = "膨胀区域右", example = "15890") @Schema(description = "膨胀区域右", example = "15890")
private BigDecimal expansionZoneRight; private BigDecimal expansionZoneRight;
@Schema(description = "起点宽")
private BigDecimal beginWidth;
@Schema(description = "起点高")
private BigDecimal beginHigh;
@Schema(description = "终点宽")
private BigDecimal endWidth;
@Schema(description = "终点高")
private BigDecimal endHigh;
@Schema(description = "行走方法 0.直线 1.曲线") @Schema(description = "行走方法 0.直线 1.曲线")
private Integer method; private Integer method;

View File

@ -0,0 +1,26 @@
package cn.iocoder.yudao.module.system.controller.admin.robot.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 设备状态数量信息
*
* @author 艾楷
*/
@Data
public class DeviceStatusInfoVO {
@Schema(description = "设备类型")
private Integer deviceType;
@Schema(description = "总数量")
private Integer totalNum = 0;
@Schema(description = "正常数量")
private Integer normalNum = 0;
@Schema(description = "异常数量")
private Integer abnormalNum = 0;
}

View File

@ -0,0 +1,22 @@
package cn.iocoder.yudao.module.system.controller.admin.robot.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class RobotInfoStatusVO {
@Schema(description = "设备mac地址")
private String macAddress;
@Schema(description = "待命 0否 1是")
private Integer standby = 0;
@Schema(description = "任务中 0否 1是")
private Integer inTask = 0;
@Schema(description = "锁定 0否 1是")
private Integer doLock = 0;
@Schema(description = "离线 0否 1是")
private Integer offline = 0;
@Schema(description = "充电中 0否 1是")
private Integer charge = 0;
@Schema(description = "故障 0否 1是")
private Integer fault = 0;
}

View File

@ -32,6 +32,7 @@ public class PositionMapItemDO extends BaseDO {
/** /**
* 库区id * 库区id
*/ */
@TableField(updateStrategy = FieldStrategy.IGNORED)
private Long areaId; private Long areaId;
/** /**
* 线库id * 线库id

View File

@ -122,6 +122,27 @@ public class PositionMapLineDO extends BaseDO {
* 膨胀区域右 * 膨胀区域右
*/ */
private BigDecimal expansionZoneRight; private BigDecimal expansionZoneRight;
/**
* 起点宽
*/
private BigDecimal beginWidth;
/**
* 起点高
*/
private BigDecimal beginHigh;
/**
* 终点宽
*/
private BigDecimal endWidth;
/**
* 终点高
*/
private BigDecimal endHigh;
/** /**
* 行走方法 0.直线 1.曲线 * 行走方法 0.直线 1.曲线
*/ */

View File

@ -20,6 +20,7 @@ public interface WareHouseLaneMapper extends BaseMapperX<WareHouseLaneDO> {
default PageResult<WareHouseLaneDO> selectPage(WareHouseLanePageReqVO reqVO) { default PageResult<WareHouseLaneDO> selectPage(WareHouseLanePageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<WareHouseLaneDO>() return selectPage(reqVO, new LambdaQueryWrapperX<WareHouseLaneDO>()
.eqIfPresent(WareHouseLaneDO::getPositionMapId, reqVO.getPositionMapId())
.likeIfPresent(WareHouseLaneDO::getLaneName, reqVO.getLaneName()) .likeIfPresent(WareHouseLaneDO::getLaneName, reqVO.getLaneName())
.eqIfPresent(WareHouseLaneDO::getLaneMsg, reqVO.getLaneMsg()) .eqIfPresent(WareHouseLaneDO::getLaneMsg, reqVO.getLaneMsg())
.betweenIfPresent(WareHouseLaneDO::getCreateTime, reqVO.getCreateTime()) .betweenIfPresent(WareHouseLaneDO::getCreateTime, reqVO.getCreateTime())

View File

@ -8,6 +8,7 @@ import cn.iocoder.yudao.module.mqtt.api.task.dto.Pose2ds;
import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapItemPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapItemPageReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapItemDO; import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapItemDO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List; import java.util.List;
@ -31,6 +32,7 @@ public interface PositionMapItemMapper extends BaseMapperX<PositionMapItemDO> {
/** /**
* 根据库位id查询 * 根据库位id查询
*
* @param locationId * @param locationId
* @return * @return
*/ */
@ -38,8 +40,24 @@ public interface PositionMapItemMapper extends BaseMapperX<PositionMapItemDO> {
/** /**
* 根据position_map_id 查询 * 根据position_map_id 查询
*
* @param positionMapId * @param positionMapId
* @return * @return
*/ */
List<PositionMapItemSynDTO> getAllByMapId(Long positionMapId); List<PositionMapItemSynDTO> getAllByMapId(Long positionMapId);
/**
* 将areaId设为空
*
* @param mapId
* @param areaId
*/
void emptyAreaId(@Param("mapId") Long mapId, @Param("areaId") Long areaId);
/**
* 将laneId设为空
* @param mapId
* @param laneId
*/
void emptyLaneId(@Param("mapId") Long mapId, @Param("laneId") Long laneId);
} }

View File

@ -14,10 +14,7 @@ import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import java.util.ArrayList; import java.util.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component @Component
public class NodeProcessingContext { public class NodeProcessingContext {
@ -57,18 +54,14 @@ public class NodeProcessingContext {
} }
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void processNodesByStrategy(Long positionMapId, List<PositionMapItemDO> oldItemList, int key, List<NodeBaseDTO> nodeBaseDTOS) { public List<PositionMapItemDO> processNodesByStrategy(Long positionMapId, int key, List<NodeBaseDTO> nodeBaseDTOS) {
// -- 获取对应的策略 - 如果没有对应的直接 return // -- 获取对应的策略 - 如果没有对应的直接 return
NodeProcessingStrategy strategy = strategyMap.get(key); NodeProcessingStrategy strategy = strategyMap.get(key);
if (strategy == null) { if (strategy == null) {
return; return Collections.emptyList();
} }
// 策略模式 策略实现 // 策略模式 策略实现 - 组装好数据后返回给上一层
strategy.processNodes(positionMapId, nodeBaseDTOS); strategy.processNodes(positionMapId, nodeBaseDTOS);
return BeanUtil.copyToList(nodeBaseDTOS, PositionMapItemDO.class);
List<PositionMapItemDO> newList = BeanUtil.copyToList(nodeBaseDTOS, PositionMapItemDO.class);
List<List<PositionMapItemDO>> list = CollectionUtils.compareLists(oldItemList, newList,
(oldVal, newVal) -> ObjectUtil.equal(oldVal.getId(), newVal.getId()));
positionMapItemService.batchSaveOrEditOrDel(positionMapId, list);
} }
} }

View File

@ -24,6 +24,8 @@ public class DeviceStrategyImpl implements NodeProcessingStrategy {
// -- 策略3 处理设备点 // -- 策略3 处理设备点
// -- 将data里面的json 数据转为实体类 - 再对比节点id - 然后做新增删除修改操作 // -- 将data里面的json 数据转为实体类 - 再对比节点id - 然后做新增删除修改操作
List<DeviceInformationDO> newList = new ArrayList<>(); List<DeviceInformationDO> newList = new ArrayList<>();
// -- 拿到这个地图所绑定的设备 -
List<DeviceInformationDO> oldList = deviceInformationService.getDeviceInfoBindByMapId(positionMapId);
nodeBaseDTOS.forEach(item -> { nodeBaseDTOS.forEach(item -> {
if (item.getId() == null) { if (item.getId() == null) {
item.setId(getId()); item.setId(getId());
@ -34,16 +36,14 @@ public class DeviceStrategyImpl implements NodeProcessingStrategy {
deviceInformationDO.setLocationY(item.getLocationY()); deviceInformationDO.setLocationY(item.getLocationY());
deviceInformationDO.setActualLocationX(item.getActualLocationX()); deviceInformationDO.setActualLocationX(item.getActualLocationX());
deviceInformationDO.setActualLocationY(item.getActualLocationY()); deviceInformationDO.setActualLocationY(item.getActualLocationY());
deviceInformationDO.setPositionMapId(positionMapId); deviceInformationDO.setPositionMapId(positionMapId);
deviceInformationDO.setPositionMapItemId(item.getId()); deviceInformationDO.setPositionMapItemId(item.getId());
newList.add(deviceInformationDO); newList.add(deviceInformationDO);
item.setDataJson(JSONUtil.toJsonStr(deviceInformationDO)); item.setDataJson(JSONUtil.toJsonStr(deviceInformationDO));
}); });
List<DeviceInformationDO> oldList = deviceInformationService.getByMapId(positionMapId);
List<List<DeviceInformationDO>> list = CollectionUtils.compareLists(oldList, newList, List<List<DeviceInformationDO>> list = CollectionUtils.compareLists(oldList, newList,
(oldVal, newVal) -> ObjectUtil.equal(oldVal.getId(), newVal.getId())); (oldVal, newVal) -> ObjectUtil.equal(oldVal.getId(), newVal.getId()));
deviceInformationService.batchSaveOrEditOrDel(positionMapId, list); deviceInformationService.batchEditOrDel(list);
} }
} }

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.system.service.bulletinboard; package cn.iocoder.yudao.module.system.service.bulletinboard;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
@ -9,11 +10,15 @@ import cn.iocoder.yudao.module.system.constant.robot.RobotTaskChcheConstant;
import cn.iocoder.yudao.module.system.controller.admin.bulletinboard.vo.BulletinBoardVO; import cn.iocoder.yudao.module.system.controller.admin.bulletinboard.vo.BulletinBoardVO;
import cn.iocoder.yudao.module.system.controller.admin.bulletinboard.vo.RobotElectricityLevelVO; import cn.iocoder.yudao.module.system.controller.admin.bulletinboard.vo.RobotElectricityLevelVO;
import cn.iocoder.yudao.module.system.controller.admin.bulletinboard.vo.TaskStatusVO; import cn.iocoder.yudao.module.system.controller.admin.bulletinboard.vo.TaskStatusVO;
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.controller.admin.robot.vo.RobotInformationStatisticsVO;
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.RobotInformationDO;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDO; 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.dal.dataobject.robot.RobotWarnMsgDO;
import cn.iocoder.yudao.module.system.enums.robot.RobotTaskDetailStatusEnum; import cn.iocoder.yudao.module.system.enums.robot.RobotTaskDetailStatusEnum;
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.RobotInformationService;
import cn.iocoder.yudao.module.system.service.robot.RobotTaskService; import cn.iocoder.yudao.module.system.service.robot.RobotTaskService;
import cn.iocoder.yudao.module.system.service.robot.RobotWarnMsgService; import cn.iocoder.yudao.module.system.service.robot.RobotWarnMsgService;
@ -26,6 +31,7 @@ import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@ -44,6 +50,8 @@ public class BulletinBoardServiceImpl implements BulletinBoardService {
private RobotInformationService robotInformationService; private RobotInformationService robotInformationService;
@Resource @Resource
private RedisUtil redisUtil; private RedisUtil redisUtil;
@Resource
private DeviceInformationService deviceInformationService;
@Override @Override
public BulletinBoardVO getBulletinBoard() { public BulletinBoardVO getBulletinBoard() {
@ -94,21 +102,49 @@ public class BulletinBoardServiceImpl implements BulletinBoardService {
vo.setStatistics(statisticsVO); vo.setStatistics(statisticsVO);
// 车辆异常信息 // 车辆异常信息
vo.setRobotWarnMsgDOS(robotWarnMsgDOS); vo.setRobotWarnMsgDOS(robotWarnMsgDOS);
List<RobotElectricityLevelVO> robotElectricityLevelVOS = new ArrayList<>(); List<RobotElectricityLevelVO> robotElectricityLevelVOS = new ArrayList<>();
List<RobotInformationDO> allRobot = robotInformationService.getAllRobot(); List<RobotInformationDO> allRobot = robotInformationService.getAllRobot();
List<RobotInfoStatusVO> agvListStatusInfo = robotInformationService.getAGVListStatusInfo();
Map<String, RobotInfoStatusVO> map = agvListStatusInfo.stream().collect(Collectors.toMap(RobotInfoStatusVO::getMacAddress, Function.identity()));
for (RobotInformationDO robotInformationDO : allRobot) { for (RobotInformationDO robotInformationDO : allRobot) {
String pose2dKey = RobotTaskChcheConstant.ROBOT_INFORMATION_POSE_BAT_SOC + robotInformationDO.getMacAddress(); String pose2dKey = RobotTaskChcheConstant.ROBOT_INFORMATION_POSE_BAT_SOC + robotInformationDO.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);
if (robotStatusDataPoseDTO != null) { if (robotStatusDataPoseDTO != null) {
RobotElectricityLevelVO robotElectricityLevelVO = new RobotElectricityLevelVO(); RobotElectricityLevelVO robotElectricityLevelVO = new RobotElectricityLevelVO();
//todo 这里缺少一个状态
RobotInfoStatusVO item = map.get(robotInformationDO.getMacAddress());
if (item != null) {
BeanUtil.copyProperties(item, robotElectricityLevelVO);
}
robotElectricityLevelVO.setRobotNo(robotInformationDO.getRobotNo()); robotElectricityLevelVO.setRobotNo(robotInformationDO.getRobotNo());
robotElectricityLevelVO.setBatSoc(robotStatusDataPoseDTO.getBat_soc()); robotElectricityLevelVO.setBatSoc(robotStatusDataPoseDTO.getBat_soc());
robotElectricityLevelVOS.add(robotElectricityLevelVO); robotElectricityLevelVOS.add(robotElectricityLevelVO);
} }
} }
return null; vo.setRobotElectricityLevelVOS(robotElectricityLevelVOS);
// - 获取所有设备
List<DeviceInformationDO> deviceInformationDOS = deviceInformationService.list();
//根据设备类型分组
Map<Integer, List<DeviceInformationDO>> deviceMap = deviceInformationDOS.stream().collect(Collectors.groupingBy(DeviceInformationDO::getDeviceType));
List<DeviceStatusInfoVO> deviceStatusInfoVOS = new ArrayList<>();
for (Map.Entry<Integer, List<DeviceInformationDO>> entry : deviceMap.entrySet()) {
Integer deviceType = entry.getKey();
DeviceStatusInfoVO deviceStatusInfoVO = new DeviceStatusInfoVO();
deviceStatusInfoVO.setDeviceType(deviceType);
List<DeviceInformationDO> deviceInformationDOList = entry.getValue();
if (CollectionUtil.isEmpty(deviceInformationDOList)) {
deviceStatusInfoVOS.add(deviceStatusInfoVO);
continue;
}
deviceStatusInfoVO.setTotalNum(deviceInformationDOList.size());
long count = deviceInformationDOList.stream().filter(a -> a.getDeviceStatus().equals(3)).count();
deviceStatusInfoVO.setNormalNum((int) count);
deviceStatusInfoVO.setAbnormalNum(deviceStatusInfoVO.getTotalNum() - deviceStatusInfoVO.getNormalNum());
deviceStatusInfoVOS.add(deviceStatusInfoVO);
}
vo.setDeviceStatusInfoVOS(deviceStatusInfoVOS);
return vo;
} }
} }

View File

@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataSaveReqVO; import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO; import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO;
@ -171,7 +172,9 @@ public class DictDataServiceImpl implements DictDataService {
@Override @Override
public List<DictDataDO> getDictDataListByDictType(String dictType) { public List<DictDataDO> getDictDataListByDictType(String dictType) {
List<DictDataDO> list = dictDataMapper.selectList(DictDataDO::getDictType, dictType); List<DictDataDO> list = dictDataMapper.selectList(new LambdaQueryWrapperX<DictDataDO>()
.eq(DictDataDO::getDictType, dictType)
.eq(DictDataDO::getStatus, CommonStatusEnum.ENABLE.getStatus()));
list.sort(Comparator.comparing(DictDataDO::getSort)); list.sort(Comparator.comparing(DictDataDO::getSort));
return list; return list;
} }

View File

@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.system.controller.admin.housearea.vo.HouseAreaPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.housearea.vo.HouseAreaPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.housearea.vo.HouseAreaSaveReqVO; import cn.iocoder.yudao.module.system.controller.admin.housearea.vo.HouseAreaSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.housearea.HouseAreaDO; import cn.iocoder.yudao.module.system.dal.dataobject.housearea.HouseAreaDO;
import com.baomidou.mybatisplus.extension.service.IService;
import javax.validation.Valid; import javax.validation.Valid;
import java.util.List; import java.util.List;
@ -13,7 +14,7 @@ import java.util.List;
* *
* @author 陈宾顺 * @author 陈宾顺
*/ */
public interface HouseAreaService { public interface HouseAreaService extends IService<HouseAreaDO> {
/** /**
* 创建库区 * 创建库区
@ -62,7 +63,15 @@ public interface HouseAreaService {
/** /**
* 获得全部库区 * 获得全部库区
*
* @return * @return
*/ */
List<HouseAreaDO> getHouseAreaList(Long positionMapId); List<HouseAreaDO> getHouseAreaList(Long positionMapId);
/**
* 删除库区
*
* @param id
*/
void delete(Long id);
} }

View File

@ -18,7 +18,9 @@ import cn.iocoder.yudao.module.system.dal.mysql.housearea.HouseAreaMapper;
import cn.iocoder.yudao.module.system.service.houselocation.HouseLocationService; import cn.iocoder.yudao.module.system.service.houselocation.HouseLocationService;
import cn.iocoder.yudao.module.system.service.positionmap.PositionMapItemService; import cn.iocoder.yudao.module.system.service.positionmap.PositionMapItemService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource; import javax.annotation.Resource;
@ -38,7 +40,7 @@ import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.THERE_ARE_
*/ */
@Service @Service
@Validated @Validated
public class HouseAreaServiceImpl implements HouseAreaService { public class HouseAreaServiceImpl extends ServiceImpl<HouseAreaMapper, HouseAreaDO> implements HouseAreaService {
@Resource @Resource
private HouseAreaMapper houseAreaMapper; private HouseAreaMapper houseAreaMapper;
@ -66,6 +68,7 @@ public class HouseAreaServiceImpl implements HouseAreaService {
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public void deleteHouseArea(Long id) { public void deleteHouseArea(Long id) {
// 校验存在 // 校验存在
validateHouseAreaExists(id); validateHouseAreaExists(id);
@ -90,6 +93,7 @@ public class HouseAreaServiceImpl implements HouseAreaService {
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public void createOrEditOrDel(HouseAreaSaveReqVO createReqVO) { public void createOrEditOrDel(HouseAreaSaveReqVO createReqVO) {
HouseAreaDO houseArea = BeanUtil.copyProperties(createReqVO, HouseAreaDO.class); HouseAreaDO houseArea = BeanUtil.copyProperties(createReqVO, HouseAreaDO.class);
houseAreaMapper.insertOrUpdate(houseArea); houseAreaMapper.insertOrUpdate(houseArea);
@ -162,4 +166,14 @@ public class HouseAreaServiceImpl implements HouseAreaService {
.orderByAsc(HouseAreaDO::getId)); .orderByAsc(HouseAreaDO::getId));
} }
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
HouseAreaDO areaDO = this.getById(id);
this.removeById(id);
//获取当前库区所对应的地图
// 点位中包含库区id的数据设为null
positionMapItemService.emptyAreaId(areaDO.getPositionMapId(), id);
}
} }

View File

@ -39,4 +39,9 @@ public interface WareHouseLaneService extends IService<WareHouseLaneDO> {
*/ */
void createOrEditOrDel(@Valid WareHouseLaneSaveReqVO createReqVO); void createOrEditOrDel(@Valid WareHouseLaneSaveReqVO createReqVO);
/**
* 删除线库
* @param id
*/
void delete(Long id);
} }

View File

@ -7,9 +7,11 @@ import cn.hutool.json.JSONUtil;
import cn.iocoder.yudao.framework.common.enums.NodeTypeEnum; import cn.iocoder.yudao.framework.common.enums.NodeTypeEnum;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.system.controller.admin.houselane.vo.WareHouseLanePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.houselane.vo.WareHouseLanePageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.houselane.vo.WareHouseLaneSaveReqVO; import cn.iocoder.yudao.module.system.controller.admin.houselane.vo.WareHouseLaneSaveReqVO;
import cn.iocoder.yudao.module.system.controller.admin.positionmap.dto.PositionMapConditionDTO; import cn.iocoder.yudao.module.system.controller.admin.positionmap.dto.PositionMapConditionDTO;
import cn.iocoder.yudao.module.system.dal.dataobject.housearea.HouseAreaDO;
import cn.iocoder.yudao.module.system.dal.dataobject.houselane.WareHouseLaneDO; import cn.iocoder.yudao.module.system.dal.dataobject.houselane.WareHouseLaneDO;
import cn.iocoder.yudao.module.system.dal.dataobject.houselocation.WareHouseLocationDO; import cn.iocoder.yudao.module.system.dal.dataobject.houselocation.WareHouseLocationDO;
import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapItemDO; import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapItemDO;
@ -142,4 +144,13 @@ public class WareHouseLaneServiceImpl extends ServiceImpl<WareHouseLaneMapper, W
houseLocationService.updateBatchById(wareHouseLocationList); houseLocationService.updateBatchById(wareHouseLocationList);
} }
} }
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
WareHouseLaneDO wareHouseLaneDO = this.getById(id);
this.removeById(id);
// 点位中包含线库id的数据设为null
positionMapItemService.emptyLaneId(wareHouseLaneDO.getPositionMapId(), id);
}
} }

View File

@ -12,6 +12,7 @@ import cn.iocoder.yudao.module.system.dal.mysql.houselocation.WareHouseLocationM
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource; import javax.annotation.Resource;
@ -35,6 +36,7 @@ public class HouseLocationServiceImpl extends ServiceImpl<WareHouseLocationMappe
private WareHouseLocationMapper houseLocationMapper; private WareHouseLocationMapper houseLocationMapper;
@Override @Override
@Transactional(rollbackFor = Exception.class)
public Long createHouseLocation(WareHouseLocationSaveReqVO createReqVO) { public Long createHouseLocation(WareHouseLocationSaveReqVO createReqVO) {
// 插入 // 插入
WareHouseLocationDO houseLocation = BeanUtils.toBean(createReqVO, WareHouseLocationDO.class); WareHouseLocationDO houseLocation = BeanUtils.toBean(createReqVO, WareHouseLocationDO.class);
@ -44,6 +46,7 @@ public class HouseLocationServiceImpl extends ServiceImpl<WareHouseLocationMappe
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public void updateHouseLocation(WareHouseLocationSaveReqVO updateReqVO) { public void updateHouseLocation(WareHouseLocationSaveReqVO updateReqVO) {
// 校验存在 // 校验存在
validateHouseLocationExists(updateReqVO.getId()); validateHouseLocationExists(updateReqVO.getId());
@ -53,6 +56,7 @@ public class HouseLocationServiceImpl extends ServiceImpl<WareHouseLocationMappe
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public void deleteHouseLocation(Long id) { public void deleteHouseLocation(Long id) {
// 校验存在 // 校验存在
validateHouseLocationExists(id); validateHouseLocationExists(id);
@ -89,6 +93,7 @@ public class HouseLocationServiceImpl extends ServiceImpl<WareHouseLocationMappe
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public void batchSaveOrEditOrDel(Long positionMapId, List<List<WareHouseLocationDO>> list) { public void batchSaveOrEditOrDel(Long positionMapId, List<List<WareHouseLocationDO>> list) {
//批量添加修改删除 //批量添加修改删除
if (isNotEmpty(list.get(0))) { if (isNotEmpty(list.get(0))) {

View File

@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.system.controller.admin.information.dto.Statistic
import cn.iocoder.yudao.module.system.controller.admin.information.vo.DeviceInformationPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.information.vo.DeviceInformationPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.information.vo.DeviceInformationSaveReqVO; import cn.iocoder.yudao.module.system.controller.admin.information.vo.DeviceInformationSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.information.DeviceInformationDO; import cn.iocoder.yudao.module.system.dal.dataobject.information.DeviceInformationDO;
import com.baomidou.mybatisplus.extension.service.IService;
import javax.validation.Valid; import javax.validation.Valid;
import java.util.List; import java.util.List;
@ -17,7 +18,7 @@ import java.util.Map;
* *
* @author 陈宾顺 * @author 陈宾顺
*/ */
public interface DeviceInformationService { public interface DeviceInformationService extends IService<DeviceInformationDO> {
/** /**
* 创建设备信息 * 创建设备信息
@ -60,10 +61,9 @@ public interface DeviceInformationService {
/** /**
* 批量新增删除修改 * 批量新增删除修改
* *
* @param positionMapId
* @param list * @param list
*/ */
void batchSaveOrEditOrDel(Long positionMapId, List<List<DeviceInformationDO>> list); void batchEditOrDel(List<List<DeviceInformationDO>> list);
/** /**
* 通过地图id获取设备列表 * 通过地图id获取设备列表
@ -90,20 +90,31 @@ public interface DeviceInformationService {
/** /**
* 获得设备信息分类列表 * 获得设备信息分类列表
*
* @return * @return
*/ */
Map<Integer, List<DeviceInformationDO>> classification(); Map<Integer, List<DeviceInformationDO>> classification();
/** /**
* 统计设备 * 统计设备
*
* @return * @return
*/ */
List<StatisticsInformationDTO> getDeviceNumber(); List<StatisticsInformationDTO> getDeviceNumber();
/** /**
* 查看全部设备 * 查看全部设备
*
* @param pageReqVO * @param pageReqVO
* @return * @return
*/ */
List<DeviceInformationDO> getInformationList(@Valid DeviceInformationPageReqVO pageReqVO); List<DeviceInformationDO> getInformationList(@Valid DeviceInformationPageReqVO pageReqVO);
/**
* 获取设备信息 通过地图id - 并且设备有绑定具体点位 即点位id不为空
*
* @param positionMapId
* @return
*/
List<DeviceInformationDO> getDeviceInfoBindByMapId(Long positionMapId);
} }

View File

@ -4,7 +4,6 @@ import cn.hutool.core.util.ObjectUtil;
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.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.grpc.api.GrpcServiceApi;
import cn.iocoder.yudao.module.system.constant.device.DeviceChcheConstant; import cn.iocoder.yudao.module.system.constant.device.DeviceChcheConstant;
import cn.iocoder.yudao.module.system.controller.admin.information.dto.DeviceInformationDTO; import cn.iocoder.yudao.module.system.controller.admin.information.dto.DeviceInformationDTO;
import cn.iocoder.yudao.module.system.controller.admin.information.dto.MapBindDeviceInfoDTO; import cn.iocoder.yudao.module.system.controller.admin.information.dto.MapBindDeviceInfoDTO;
@ -13,13 +12,13 @@ import cn.iocoder.yudao.module.system.controller.admin.information.vo.DeviceInfo
import cn.iocoder.yudao.module.system.controller.admin.information.vo.DeviceInformationSaveReqVO; import cn.iocoder.yudao.module.system.controller.admin.information.vo.DeviceInformationSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO; 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.information.DeviceInformationDO;
import cn.iocoder.yudao.module.system.dal.mysql.config.CommonConfigMapper;
import cn.iocoder.yudao.module.system.dal.mysql.information.DeviceInformationMapper; import cn.iocoder.yudao.module.system.dal.mysql.information.DeviceInformationMapper;
import cn.iocoder.yudao.module.system.enums.device.DeviceStatusEnum; import cn.iocoder.yudao.module.system.enums.device.DeviceStatusEnum;
import cn.iocoder.yudao.module.system.enums.device.PictureConfigEnum; import cn.iocoder.yudao.module.system.enums.device.PictureConfigEnum;
import cn.iocoder.yudao.module.system.service.dict.DictDataService; import cn.iocoder.yudao.module.system.service.dict.DictDataService;
import cn.iocoder.yudao.module.system.util.redis.RedisUtil; import cn.iocoder.yudao.module.system.util.redis.RedisUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -33,7 +32,6 @@ import java.util.stream.Collectors;
import static cn.hutool.core.collection.CollUtil.isNotEmpty; import static cn.hutool.core.collection.CollUtil.isNotEmpty;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.INFORMATION_MAC_EXIST; import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.INFORMATION_MAC_EXIST;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.INFORMATION_NOT_EXISTS; import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.INFORMATION_NOT_EXISTS;
@ -45,7 +43,7 @@ import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.INFORMATIO
@Service @Service
@Validated @Validated
@Slf4j @Slf4j
public class DeviceInformationServiceImpl implements DeviceInformationService { public class DeviceInformationServiceImpl extends ServiceImpl<DeviceInformationMapper, DeviceInformationDO> implements DeviceInformationService {
@Resource @Resource
private DeviceInformationMapper informationMapper; private DeviceInformationMapper informationMapper;
@ -53,18 +51,14 @@ public class DeviceInformationServiceImpl implements DeviceInformationService {
@Resource @Resource
private DictDataService dictDataService; private DictDataService dictDataService;
@Resource
private GrpcServiceApi grpcServiceApi;
@Resource @Resource
private RedisUtil redisUtil; private RedisUtil redisUtil;
@Override @Override
public Long createInformation(DeviceInformationSaveReqVO createReqVO) { public Long createInformation(DeviceInformationSaveReqVO createReqVO) {
DeviceInformationPageReqVO pageReqVO = new DeviceInformationPageReqVO(); // -- 先判断库里是否有相通的mac地址数据
pageReqVO.setMacAddress(createReqVO.getMacAddress()); long count = this.count(new LambdaQueryWrapper<DeviceInformationDO>().eq(DeviceInformationDO::getMacAddress, createReqVO.getMacAddress()));
PageResult<DeviceInformationDO> pageResult = informationMapper.selectPage(pageReqVO); if (count > 0L) {
if (ObjectUtil.isNotEmpty(pageResult.getList())) {
throw exception(INFORMATION_MAC_EXIST); throw exception(INFORMATION_MAC_EXIST);
} }
@ -114,7 +108,7 @@ public class DeviceInformationServiceImpl implements DeviceInformationService {
// 校验存在 // 校验存在
validateInformationExists(id); validateInformationExists(id);
DeviceInformationDO deviceInformationDO = informationMapper.selectById(id); DeviceInformationDO deviceInformationDO = informationMapper.selectById(id);
String deviceKey = DeviceChcheConstant.DEVICE_LAST_TIME +deviceInformationDO.getMacAddress(); String deviceKey = DeviceChcheConstant.DEVICE_LAST_TIME + deviceInformationDO.getMacAddress();
Object object = redisUtil.get(deviceKey); Object object = redisUtil.get(deviceKey);
if (ObjectUtil.isEmpty(object)) { if (ObjectUtil.isEmpty(object)) {
deviceInformationDO.setDeviceStatus(DeviceStatusEnum.OFF_LINE.getType()); deviceInformationDO.setDeviceStatus(DeviceStatusEnum.OFF_LINE.getType());
@ -122,11 +116,11 @@ public class DeviceInformationServiceImpl implements DeviceInformationService {
} }
try { try {
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime curTimeLDT = LocalDateTime.parse((String)object, df); LocalDateTime curTimeLDT = LocalDateTime.parse((String) object, df);
deviceInformationDO.setDeviceLastTime(curTimeLDT); deviceInformationDO.setDeviceLastTime(curTimeLDT);
deviceInformationDO.setDeviceStatus(DeviceStatusEnum.ON_LINE.getType()); deviceInformationDO.setDeviceStatus(DeviceStatusEnum.ON_LINE.getType());
} catch (Exception e) { } catch (Exception e) {
log.info("查询设备最后通讯时间异常 :{}",e.getMessage()); log.info("查询设备最后通讯时间异常 :{}", e.getMessage());
} }
return deviceInformationDO; return deviceInformationDO;
} }
@ -138,16 +132,19 @@ public class DeviceInformationServiceImpl implements DeviceInformationService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void batchSaveOrEditOrDel(Long positionMapId, List<List<DeviceInformationDO>> list) { public void batchEditOrDel(List<List<DeviceInformationDO>> list) {
//批量添加修改删除 //批量添加修改删除
if (isNotEmpty(list.get(0))) { List<DeviceInformationDO> editList = new ArrayList<>();
informationMapper.insertBatch(list.get(0)); if (isNotEmpty(list.get(0)) || isNotEmpty(list.get(1))) {
} editList.addAll(list.get(0));
if (isNotEmpty(list.get(1))) { editList.addAll(list.get(1));
informationMapper.updateBatch(list.get(1));
} }
if (isNotEmpty(list.get(2))) { if (isNotEmpty(list.get(2))) {
informationMapper.deleteByIds(convertList(list.get(2), DeviceInformationDO::getId)); list.get(2).forEach(a -> a.setPositionMapItemId(null));
editList.addAll(list.get(2));
}
if (isNotEmpty(editList)){
informationMapper.updateBatch(editList);
} }
} }
@ -170,6 +167,7 @@ public class DeviceInformationServiceImpl implements DeviceInformationService {
/** /**
* 获得设备信息分类列表 * 获得设备信息分类列表
*
* @return * @return
*/ */
@Override @Override
@ -181,7 +179,7 @@ public class DeviceInformationServiceImpl implements DeviceInformationService {
// todo 需要设置设备通讯的时间 // todo 需要设置设备通讯的时间
for (DeviceInformationDO deviceInformationDO : deviceInformationDOS) { for (DeviceInformationDO deviceInformationDO : deviceInformationDOS) {
String deviceKey = DeviceChcheConstant.DEVICE_LAST_TIME +deviceInformationDO.getMacAddress(); String deviceKey = DeviceChcheConstant.DEVICE_LAST_TIME + deviceInformationDO.getMacAddress();
Object object = redisUtil.get(deviceKey); Object object = redisUtil.get(deviceKey);
if (ObjectUtil.isEmpty(object)) { if (ObjectUtil.isEmpty(object)) {
deviceInformationDO.setDeviceStatus(DeviceStatusEnum.OFF_LINE.getType()); deviceInformationDO.setDeviceStatus(DeviceStatusEnum.OFF_LINE.getType());
@ -189,11 +187,11 @@ public class DeviceInformationServiceImpl implements DeviceInformationService {
} }
try { try {
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime curTimeLDT = LocalDateTime.parse((String)object, df); LocalDateTime curTimeLDT = LocalDateTime.parse((String) object, df);
deviceInformationDO.setDeviceLastTime(curTimeLDT); deviceInformationDO.setDeviceLastTime(curTimeLDT);
deviceInformationDO.setDeviceStatus(DeviceStatusEnum.ON_LINE.getType()); deviceInformationDO.setDeviceStatus(DeviceStatusEnum.ON_LINE.getType());
} catch (Exception e) { } catch (Exception e) {
log.info("查询设备最后通讯时间异常 :{}",e.getMessage()); log.info("查询设备最后通讯时间异常 :{}", e.getMessage());
} }
} }
@ -202,8 +200,8 @@ public class DeviceInformationServiceImpl implements DeviceInformationService {
.collect(Collectors.groupingBy(DeviceInformationDO::getDeviceType)); .collect(Collectors.groupingBy(DeviceInformationDO::getDeviceType));
ArrayList<Map.Entry<Integer, List<DeviceInformationDO>>> list = new ArrayList<Map.Entry<Integer, List<DeviceInformationDO>>>(collect.entrySet()); ArrayList<Map.Entry<Integer, List<DeviceInformationDO>>> list = new ArrayList<Map.Entry<Integer, List<DeviceInformationDO>>>(collect.entrySet());
Collections.sort(list, new Comparator<Map.Entry<Integer, List<DeviceInformationDO>>>() { Collections.sort(list, new Comparator<Map.Entry<Integer, List<DeviceInformationDO>>>() {
public int compare(Map.Entry<Integer, List<DeviceInformationDO>> o1, Map.Entry<Integer, List<DeviceInformationDO>> o2) { public int compare(Map.Entry<Integer, List<DeviceInformationDO>> o1, Map.Entry<Integer, List<DeviceInformationDO>> o2) {
return o1.getKey().compareTo(o2.getKey()); // 按照值排序 return o1.getKey().compareTo(o2.getKey()); // 按照值排序
} }
}); });
@ -213,6 +211,7 @@ public class DeviceInformationServiceImpl implements DeviceInformationService {
/** /**
* 统计设备 * 统计设备
*
* @return * @return
*/ */
@Override @Override
@ -252,7 +251,7 @@ public class DeviceInformationServiceImpl implements DeviceInformationService {
// todo 需要设置设备通讯的时间 // todo 需要设置设备通讯的时间
for (DeviceInformationDO deviceInformationDO : deviceInformationDOS) { for (DeviceInformationDO deviceInformationDO : deviceInformationDOS) {
String deviceKey = DeviceChcheConstant.DEVICE_LAST_TIME +deviceInformationDO.getMacAddress(); String deviceKey = DeviceChcheConstant.DEVICE_LAST_TIME + deviceInformationDO.getMacAddress();
Object object = redisUtil.get(deviceKey); Object object = redisUtil.get(deviceKey);
if (ObjectUtil.isEmpty(object)) { if (ObjectUtil.isEmpty(object)) {
deviceInformationDO.setDeviceStatus(DeviceStatusEnum.OFF_LINE.getType()); deviceInformationDO.setDeviceStatus(DeviceStatusEnum.OFF_LINE.getType());
@ -260,17 +259,24 @@ public class DeviceInformationServiceImpl implements DeviceInformationService {
} }
try { try {
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime curTimeLDT = LocalDateTime.parse((String)object, df); LocalDateTime curTimeLDT = LocalDateTime.parse((String) object, df);
deviceInformationDO.setDeviceLastTime(curTimeLDT); deviceInformationDO.setDeviceLastTime(curTimeLDT);
deviceInformationDO.setDeviceStatus(DeviceStatusEnum.ON_LINE.getType()); deviceInformationDO.setDeviceStatus(DeviceStatusEnum.ON_LINE.getType());
} catch (Exception e) { } catch (Exception e) {
log.info("查询设备最后通讯时间异常 :{}",e.getMessage()); log.info("查询设备最后通讯时间异常 :{}", e.getMessage());
} }
} }
return deviceInformationDOS; return deviceInformationDOS;
} }
@Override
public List<DeviceInformationDO> getDeviceInfoBindByMapId(Long positionMapId) {
return informationMapper.selectList(new LambdaQueryWrapperX<DeviceInformationDO>()
.eq(DeviceInformationDO::getPositionMapId, positionMapId)
.isNotNull(DeviceInformationDO::getPositionMapItemId));
}
@Override @Override
public void mapBindDeviceInfo(MapBindDeviceInfoDTO dto) { public void mapBindDeviceInfo(MapBindDeviceInfoDTO dto) {
DeviceInformationDO deviceInformationDO = informationMapper.selectById(dto.getDeviceInfoId()); DeviceInformationDO deviceInformationDO = informationMapper.selectById(dto.getDeviceInfoId());

View File

@ -77,4 +77,19 @@ public interface PositionMapItemService extends IService<PositionMapItemDO> {
* @return * @return
*/ */
List<PositionMapItemDO> getByCondition(PositionMapConditionDTO positionMapConditionDTO); List<PositionMapItemDO> getByCondition(PositionMapConditionDTO positionMapConditionDTO);
/**
* 清空areaId
*
* @param mapId
* @param areaId
*/
void emptyAreaId(Long mapId, Long areaId);
/**
* 清空laneId
* @param mapId
* @param laneId
*/
void emptyLaneId(Long mapId, Long laneId);
} }

View File

@ -10,6 +10,7 @@ import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapItem
import cn.iocoder.yudao.module.system.dal.mysql.positionmap.PositionMapItemMapper; import cn.iocoder.yudao.module.system.dal.mysql.positionmap.PositionMapItemMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource; import javax.annotation.Resource;
@ -69,6 +70,7 @@ public class PositionMapItemServiceImpl extends ServiceImpl<PositionMapItemMappe
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public void batchSaveOrEditOrDel(Long positionMapId, List<List<PositionMapItemDO>> list) { public void batchSaveOrEditOrDel(Long positionMapId, List<List<PositionMapItemDO>> list) {
//批量添加修改删除 //批量添加修改删除
if (isNotEmpty(list.get(0))) { if (isNotEmpty(list.get(0))) {
@ -95,5 +97,15 @@ public class PositionMapItemServiceImpl extends ServiceImpl<PositionMapItemMappe
.eqIfPresent(PositionMapItemDO::getLaneId, dto.getLaneId())); .eqIfPresent(PositionMapItemDO::getLaneId, dto.getLaneId()));
} }
@Override
public void emptyAreaId(Long positionMapId, Long areaId) {
positionMapItemMapper.emptyAreaId(positionMapId, areaId);
}
@Override
public void emptyLaneId(Long mapId, Long laneId) {
positionMapItemMapper.emptyLaneId(mapId, laneId);
}
} }

View File

@ -63,6 +63,12 @@ public interface RobotInformationService extends IService<RobotInformationDO> {
*/ */
RobotInformationStatisticsVO statisticsInformation(); RobotInformationStatisticsVO statisticsInformation();
/**
* 获取所有AGV状态
* @return
*/
List<RobotInfoStatusVO> getAGVListStatusInfo();
/** /**
* 查询能正常使用的车辆 * 查询能正常使用的车辆
* *

View File

@ -335,6 +335,48 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
return info; return info;
} }
@Override
public List<RobotInfoStatusVO> getAGVListStatusInfo() {
List<RobotInfoStatusVO> list = new ArrayList<>();
// -- 先从缓存中 获取AGV状态信息 - 如果没有的话 - 再从数据库中获取 - 并且缓存到redis中
List<RobotInformationDO> robotInformationDO = informationMapper.selectList();
if (robotInformationDO == null) {
return list;
}
for (RobotInformationDO informationDO : robotInformationDO) {
RobotInfoStatusVO vo = new RobotInfoStatusVO();
//0待命1任务中2锁定3离线4:充电中5:故障
String pose2dKey = RobotTaskChcheConstant.ROBOT_INFORMATION_POSE_BAT_SOC + informationDO.getMacAddress();
Object object = redisUtil.get(pose2dKey);
if (ObjectUtil.isEmpty(object)) {
//离线
vo.setOffline(1);
}
if (RobotTaskModelEnum.REJECTION.getType().equals(informationDO.getRobotTaskModel())) {
//锁定
vo.setDoLock(1);
}
//设置异常
String errorLevelKey = RobotTaskChcheConstant.ROBOT_ERROR_LEVEL + informationDO.getMacAddress();
Object errorLevel = redisUtil.get(errorLevelKey);
if (ObjectUtil.isNotEmpty(errorLevel) && Integer.parseInt(errorLevel.toString()) >= 3) {
vo.setFault(1);
}
if (RobotStatusEnum.STAND_BY.getType().equals(informationDO.getRobotStatus())) {
//待命中
vo.setStandby(1);
} else if (RobotStatusEnum.CHARGE.getType().equals(informationDO.getRobotStatus())) {
//充电中
vo.setCharge(1);
} else {
//任务中
vo.setInTask(1);
}
list.add(vo);
}
return list;
}
/** /**
* @return * @return
*/ */

View File

@ -267,6 +267,18 @@
</set> </set>
where id = #{id} where id = #{id}
</update> </update>
<update id="emptyAreaId">
update ware_position_map_item
set area_id = null
where position_map_id = #{mapId}
and area_id = #{areaId}
</update>
<update id="emptyLaneId">
update ware_position_map_item
set lane_id = null
where position_map_id = #{mapId}
and lane_id = #{laneId}
</update>
<!--通过主键删除--> <!--通过主键删除-->
<delete id="deleteById"> <delete id="deleteById">