Просмотр исходного кода

1、开发获取空间树接口;
2、开发网关-新增、修改、删除接口;

james 2 недель назад
Родитель
Сommit
ff38d17d5d
14 измененных файлов с 686 добавлено и 0 удалено
  1. 30 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/controller/web/BaseSpaceController.java
  2. 66 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/controller/web/DmpGatewayController.java
  3. 47 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/domain/BaseSpace.java
  4. 69 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/domain/DmpGateway.java
  5. 10 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/mapper/BaseSpaceMapper.java
  6. 10 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/mapper/DmpGatewayMapper.java
  7. 31 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/BaseSpaceService.java
  8. 24 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/DmpGatewayService.java
  9. 128 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/impl/BaseSpaceServiceImpl.java
  10. 155 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/impl/DmpGatewayServiceImpl.java
  11. 43 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/vo/BaseSpaceForestNodeVO.java
  12. 30 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/vo/DmpGatewayDetailResponse.java
  13. 24 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/vo/DmpGatewayListItem.java
  14. 19 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/vo/DmpGatewayPageRequest.java

+ 30 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/controller/web/BaseSpaceController.java

@@ -0,0 +1,30 @@
+package com.usky.ems.controller.web;
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.ems.service.BaseSpaceService;
+import com.usky.ems.service.vo.BaseSpaceForestNodeVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 空间树接口(base_space)
+ *
+ * GET /base-space/tree  获取空间树
+ */
+@RestController
+@RequestMapping("/base-space")
+public class BaseSpaceController {
+
+    @Autowired
+    private BaseSpaceService baseSpaceService;
+
+    /**
+     * 获取空间树(根据 base_space 构建)
+     */
+    @GetMapping("/tree")
+    public ApiResult<BaseSpaceForestNodeVO> tree() {
+        return ApiResult.success(baseSpaceService.tree());
+    }
+}

+ 66 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/controller/web/DmpGatewayController.java

@@ -0,0 +1,66 @@
+package com.usky.ems.controller.web;
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.ems.domain.DmpGateway;
+import com.usky.ems.service.DmpGatewayService;
+import com.usky.ems.service.vo.DmpGatewayDetailResponse;
+import com.usky.ems.service.vo.DmpGatewayListItem;
+import com.usky.ems.service.vo.DmpGatewayPageRequest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * dmp_gateway 网关维护 API(REST 风格对齐 IoT 模块 DmpDeviceInfoController 的增删改,列表与详情对齐 EmsGatewayController)
+ * 基础路径:/dmp/gateway(网关前缀如 /prod-api/service-ems 依部署而定)
+ */
+@RestController
+@RequestMapping("/dmp/gateway")
+public class DmpGatewayController {
+
+    @Autowired
+    private DmpGatewayService dmpGatewayService;
+
+    /**
+     * 分页列表
+     */
+    @GetMapping("/list")
+    public ApiResult<CommonPage<DmpGatewayListItem>> gatewayList(DmpGatewayPageRequest request) {
+        return ApiResult.success(dmpGatewayService.pageGateways(request));
+    }
+
+    /**
+     * 详情
+     */
+    @GetMapping("/{id}")
+    public ApiResult<DmpGatewayDetailResponse> getGateway(@PathVariable Integer id) {
+        return ApiResult.success(dmpGatewayService.getGatewayDetail(id));
+    }
+
+    /**
+     * 新增
+     */
+    @PostMapping
+    public ApiResult<Void> add(@RequestBody DmpGateway entity) {
+        dmpGatewayService.add(entity);
+        return ApiResult.success();
+    }
+
+    /**
+     * 修改
+     */
+    @PutMapping
+    public ApiResult<Void> edit(@RequestBody DmpGateway entity) {
+        dmpGatewayService.update(entity);
+        return ApiResult.success();
+    }
+
+    /**
+     * 删除
+     */
+    @DeleteMapping("/{id}")
+    public ApiResult<Void> remove(@PathVariable("id") Integer id) {
+        dmpGatewayService.remove(id);
+        return ApiResult.success();
+    }
+}

+ 47 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/domain/BaseSpace.java

@@ -0,0 +1,47 @@
+package com.usky.ems.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 空间(base_space)
+ * 空间类型:1项目 2区域 3建筑
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("base_space")
+public class BaseSpace implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    private String name;
+    @TableField("parent_id")
+    private Long parentId;
+    private Integer type;
+    @TableField("root_id")
+    private Long rootId;
+    private String path;
+    @TableField("path_name")
+    private String pathName;
+    private Integer deep;
+    @TableField("updated_by")
+    private Long updatedBy;
+    @TableField("update_time")
+    private LocalDateTime updateTime;
+    @TableField("created_by")
+    private Long createdBy;
+    @TableField("create_time")
+    private LocalDateTime createTime;
+    @TableField("tenant_id")
+    private Integer tenantId;
+}

+ 69 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/domain/DmpGateway.java

@@ -0,0 +1,69 @@
+package com.usky.ems.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 网关表(dmp_gateway)
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("dmp_gateway")
+public class DmpGateway implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("device_uuid")
+    private String deviceUuid;
+
+    private String name;
+
+    private String ip;
+
+    private Integer port;
+
+    @TableField("comm_status")
+    private Integer commStatus;
+
+    @TableField("online_time")
+    private LocalDateTime onlineTime;
+
+    @TableField("offline_time")
+    private LocalDateTime offlineTime;
+
+    @TableField("update_config_time")
+    private LocalDateTime updateConfigTime;
+
+    @TableField("update_protocol_time")
+    private LocalDateTime updateProtocolTime;
+
+    @TableField("upgrade_time")
+    private LocalDateTime upgradeTime;
+
+    @TableField("virtual_device")
+    private Integer virtualDevice;
+
+    private String remark;
+
+    @TableField("updated_by")
+    private Long updatedBy;
+
+    @TableField("update_time")
+    private LocalDateTime updateTime;
+
+    @TableField("created_by")
+    private Long createdBy;
+
+    @TableField("create_time")
+    private LocalDateTime createTime;
+}

+ 10 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/mapper/BaseSpaceMapper.java

@@ -0,0 +1,10 @@
+package com.usky.ems.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.ems.domain.BaseSpace;
+
+/**
+ * 空间 Mapper(base_space)
+ */
+public interface BaseSpaceMapper extends CrudMapper<BaseSpace> {
+}

+ 10 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/mapper/DmpGatewayMapper.java

@@ -0,0 +1,10 @@
+package com.usky.ems.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.ems.domain.DmpGateway;
+
+/**
+ * 网关表 dmp_gateway Mapper
+ */
+public interface DmpGatewayMapper extends CrudMapper<DmpGateway> {
+}

+ 31 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/service/BaseSpaceService.java

@@ -0,0 +1,31 @@
+package com.usky.ems.service;
+
+import com.usky.common.mybatis.core.CrudService;
+import com.usky.ems.domain.BaseSpace;
+import com.usky.ems.service.vo.BaseSpaceForestNodeVO;
+
+import java.util.List;
+
+/**
+ * 空间服务(base_space)
+ */
+public interface BaseSpaceService extends CrudService<BaseSpace> {
+
+    /**
+     * 构建空间树
+     *
+     * @return 根节点(如存在多个根,则返回一个虚拟根节点)
+     */
+    BaseSpaceForestNodeVO tree();
+
+    /**
+     * 获取当前用户在指定空间下有权限访问的空间ID列表
+     * 目前简单返回传入的 spaceId 本身,后续可根据实际权限模型扩展
+     */
+    List<Long> getAuthorizedSpaceIds(Long spaceId);
+
+    /**
+     * 递归获取某空间节点下的所有子节点(不包含自身)
+     */
+    List<BaseSpace> recursiveAllChildrenNode(Long spaceId);
+}

+ 24 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/service/DmpGatewayService.java

@@ -0,0 +1,24 @@
+package com.usky.ems.service;
+
+import com.usky.common.core.bean.CommonPage;
+import com.usky.common.mybatis.core.CrudService;
+import com.usky.ems.domain.DmpGateway;
+import com.usky.ems.service.vo.DmpGatewayDetailResponse;
+import com.usky.ems.service.vo.DmpGatewayListItem;
+import com.usky.ems.service.vo.DmpGatewayPageRequest;
+
+/**
+ * dmp_gateway 网关维护与查询
+ */
+public interface DmpGatewayService extends CrudService<DmpGateway> {
+
+    void add(DmpGateway entity);
+
+    void update(DmpGateway entity);
+
+    boolean remove(Integer id);
+
+    CommonPage<DmpGatewayListItem> pageGateways(DmpGatewayPageRequest request);
+
+    DmpGatewayDetailResponse getGatewayDetail(Integer id);
+}

+ 128 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/service/impl/BaseSpaceServiceImpl.java

@@ -0,0 +1,128 @@
+package com.usky.ems.service.impl;
+
+import com.usky.common.mybatis.core.AbstractCrudService;
+import com.usky.ems.domain.BaseSpace;
+import com.usky.ems.mapper.BaseSpaceMapper;
+import com.usky.ems.service.BaseSpaceService;
+import com.usky.ems.service.vo.BaseSpaceForestNodeVO;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * 空间服务实现(base_space)
+ */
+@Service
+public class BaseSpaceServiceImpl extends AbstractCrudService<BaseSpaceMapper, BaseSpace> implements BaseSpaceService {
+
+    @Override
+    public BaseSpaceForestNodeVO tree() {
+        List<BaseSpace> allSpaces = this.list();
+        if (allSpaces == null || allSpaces.isEmpty()) {
+            return null;
+        }
+
+        List<BaseSpaceForestNodeVO> allNodes = allSpaces.stream()
+                .map(this::toNode)
+                .collect(Collectors.toList());
+
+        allNodes.sort(Comparator.comparing(
+                BaseSpaceForestNodeVO::getName,
+                Comparator.nullsFirst(String::compareToIgnoreCase)
+        ));
+
+        Map<Long, BaseSpaceForestNodeVO> idNodeMap = new HashMap<>();
+        for (BaseSpaceForestNodeVO node : allNodes) {
+            if (node.getId() != null) {
+                idNodeMap.put(node.getId(), node);
+            }
+        }
+
+        List<BaseSpaceForestNodeVO> roots = new ArrayList<>();
+        for (BaseSpaceForestNodeVO node : allNodes) {
+            Long parentId = node.getParentId();
+            if (parentId != null && parentId != 0L) {
+                BaseSpaceForestNodeVO parent = idNodeMap.get(parentId);
+                if (parent != null) {
+                    node.setParentSpaceName(parent.getName());
+                    parent.getChildren().add(node);
+                } else {
+                    roots.add(node);
+                }
+            } else {
+                roots.add(node);
+            }
+        }
+
+        if (roots.isEmpty()) {
+            return null;
+        }
+
+        List<BaseSpaceForestNodeVO> distinctRoots = roots.stream()
+                .filter(Objects::nonNull)
+                .distinct()
+                .collect(Collectors.toList());
+
+        if (distinctRoots.size() == 1) {
+            return distinctRoots.get(0);
+        }
+
+        BaseSpaceForestNodeVO virtualRoot = new BaseSpaceForestNodeVO();
+        virtualRoot.setId(0L);
+        virtualRoot.setName("ROOT");
+        virtualRoot.setChildren(distinctRoots);
+        return virtualRoot;
+    }
+
+    @Override
+    public List<Long> getAuthorizedSpaceIds(Long spaceId) {
+        if (spaceId == null) {
+            return Collections.emptyList();
+        }
+        return Collections.singletonList(spaceId);
+    }
+
+    @Override
+    public List<BaseSpace> recursiveAllChildrenNode(Long spaceId) {
+        if (spaceId == null) {
+            return Collections.emptyList();
+        }
+        List<BaseSpace> result = new ArrayList<>();
+        collectChildren(spaceId, result);
+        return result;
+    }
+
+    private void collectChildren(Long parentId, List<BaseSpace> out) {
+        List<BaseSpace> children = this.list(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<BaseSpace>()
+                .eq(BaseSpace::getParentId, parentId));
+        if (children == null || children.isEmpty()) {
+            return;
+        }
+        out.addAll(children);
+        for (BaseSpace child : children) {
+            if (child != null && child.getId() != null) {
+                collectChildren(child.getId(), out);
+            }
+        }
+    }
+
+    private BaseSpaceForestNodeVO toNode(BaseSpace space) {
+        BaseSpaceForestNodeVO vo = new BaseSpaceForestNodeVO();
+        vo.setId(space.getId());
+        vo.setName(space.getName());
+        vo.setParentId(space.getParentId());
+        vo.setType(space.getType());
+        vo.setRootId(space.getRootId());
+        vo.setPath(space.getPath());
+        vo.setPathName(space.getPathName());
+        vo.setDeep(space.getDeep());
+        return vo;
+    }
+}

+ 155 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/service/impl/DmpGatewayServiceImpl.java

@@ -0,0 +1,155 @@
+package com.usky.ems.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.common.core.exception.BusinessException;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import com.usky.ems.domain.DmpGateway;
+import com.usky.ems.mapper.DmpGatewayMapper;
+import com.usky.ems.service.DmpGatewayService;
+import com.usky.ems.service.vo.DmpGatewayDetailResponse;
+import com.usky.ems.service.vo.DmpGatewayListItem;
+import com.usky.ems.service.vo.DmpGatewayPageRequest;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/**
+ * dmp_gateway 服务实现
+ */
+@Service
+public class DmpGatewayServiceImpl extends AbstractCrudService<DmpGatewayMapper, DmpGateway> implements DmpGatewayService {
+
+    @Override
+    public void add(DmpGateway entity) {
+        if (!StringUtils.hasText(entity.getDeviceUuid()) || !StringUtils.hasText(entity.getName())) {
+            throw new BusinessException("新增失败,设备 UUID 与名称不能为空");
+        }
+        if (deviceUuidExists(entity.getDeviceUuid(), null)) {
+            throw new BusinessException("新增失败,设备 UUID 已存在");
+        }
+        LocalDateTime now = LocalDateTime.now();
+        if (entity.getCommStatus() == null) {
+            entity.setCommStatus(0);
+        }
+        if (entity.getVirtualDevice() == null) {
+            entity.setVirtualDevice(0);
+        }
+        entity.setCreateTime(now);
+        entity.setUpdateTime(now);
+        this.save(entity);
+    }
+
+    @Override
+    public void update(DmpGateway entity) {
+        if (entity.getId() == null) {
+            throw new BusinessException("修改失败,缺少主键");
+        }
+        DmpGateway existing = this.getById(entity.getId());
+        Optional.ofNullable(existing).orElseThrow(() -> new BusinessException("网关不存在"));
+        String uuid = StringUtils.hasText(entity.getDeviceUuid()) ? entity.getDeviceUuid() : existing.getDeviceUuid();
+        String name = StringUtils.hasText(entity.getName()) ? entity.getName() : existing.getName();
+        if (!StringUtils.hasText(uuid) || !StringUtils.hasText(name)) {
+            throw new BusinessException("修改失败,设备 UUID 与名称不能为空");
+        }
+        if (deviceUuidExists(uuid, entity.getId())) {
+            throw new BusinessException("修改失败,设备 UUID 已存在");
+        }
+        entity.setDeviceUuid(uuid);
+        entity.setName(name);
+        entity.setUpdateTime(LocalDateTime.now());
+        this.updateById(entity);
+    }
+
+    @Override
+    public boolean remove(Integer id) {
+        DmpGateway g = this.getById(id);
+        Optional.ofNullable(g).orElseThrow(() -> new BusinessException("网关不存在"));
+        return this.removeById(id);
+    }
+
+    @Override
+    public CommonPage<DmpGatewayListItem> pageGateways(DmpGatewayPageRequest request) {
+        int current = request.getCurrent() == null ? 1 : request.getCurrent();
+        int size = request.getSize() == null ? 10 : request.getSize();
+        Page<DmpGateway> p = new Page<>(current, size);
+        LambdaQueryWrapper<DmpGateway> q = Wrappers.lambdaQuery();
+        if (request.getCommunicationStatus() != null) {
+            q.eq(DmpGateway::getCommStatus, request.getCommunicationStatus());
+        }
+        if (StringUtils.hasText(request.getName())) {
+            q.like(DmpGateway::getName, request.getName());
+        }
+        if (StringUtils.hasText(request.getDeviceUuid())) {
+            q.eq(DmpGateway::getDeviceUuid, request.getDeviceUuid());
+        }
+        q.orderByDesc(DmpGateway::getId);
+        Page<DmpGateway> page = baseMapper.selectPage(p, q);
+        List<DmpGatewayListItem> list = page.getRecords().stream().map(this::toListItem).collect(Collectors.toList());
+        return new CommonPage<>(list, page.getTotal(), size, current);
+    }
+
+    @Override
+    public DmpGatewayDetailResponse getGatewayDetail(Integer id) {
+        DmpGateway g = this.getById(id);
+        if (g == null) {
+            return null;
+        }
+        return toDetail(g);
+    }
+
+    private boolean deviceUuidExists(String deviceUuid, Integer excludeId) {
+        LambdaQueryWrapper<DmpGateway> w = Wrappers.lambdaQuery();
+        w.eq(DmpGateway::getDeviceUuid, deviceUuid);
+        DmpGateway one = this.getOne(w);
+        if (one == null) {
+            return false;
+        }
+        return excludeId == null || !Objects.equals(one.getId(), excludeId);
+    }
+
+    private DmpGatewayListItem toListItem(DmpGateway g) {
+        DmpGatewayListItem item = new DmpGatewayListItem();
+        item.setId(g.getId());
+        item.setDeviceUuid(g.getDeviceUuid());
+        item.setName(g.getName());
+        item.setIp(g.getIp());
+        item.setPort(g.getPort());
+        item.setCommunicationStatus(g.getCommStatus());
+        item.setOnlineTime(g.getOnlineTime());
+        item.setOfflineTime(g.getOfflineTime());
+        item.setVirtualDevice(g.getVirtualDevice());
+        item.setCreateTime(g.getCreateTime());
+        item.setUpdateTime(g.getUpdateTime());
+        return item;
+    }
+
+    private DmpGatewayDetailResponse toDetail(DmpGateway g) {
+        DmpGatewayDetailResponse r = new DmpGatewayDetailResponse();
+        r.setId(g.getId());
+        r.setDeviceUuid(g.getDeviceUuid());
+        r.setName(g.getName());
+        r.setIp(g.getIp());
+        r.setPort(g.getPort());
+        r.setCommunicationStatus(g.getCommStatus());
+        r.setOnlineTime(g.getOnlineTime());
+        r.setOfflineTime(g.getOfflineTime());
+        r.setUpdateConfigTime(g.getUpdateConfigTime());
+        r.setUpdateProtocolTime(g.getUpdateProtocolTime());
+        r.setUpgradeTime(g.getUpgradeTime());
+        r.setVirtualDevice(g.getVirtualDevice());
+        r.setRemark(g.getRemark());
+        r.setUpdatedBy(g.getUpdatedBy());
+        r.setUpdateTime(g.getUpdateTime());
+        r.setCreatedBy(g.getCreatedBy());
+        r.setCreateTime(g.getCreateTime());
+        return r;
+    }
+}

+ 43 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/service/vo/BaseSpaceForestNodeVO.java

@@ -0,0 +1,43 @@
+package com.usky.ems.service.vo;
+
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 空间树节点(对应 base_space)
+ */
+@Data
+public class BaseSpaceForestNodeVO {
+
+    /** 节点 ID(base_space.id) */
+    private Long id;
+
+    /** 名称(base_space.name) */
+    private String name;
+
+    /** 父节点 ID(base_space.parent_id) */
+    private Long parentId;
+
+    /** 空间类型:1项目 2区域 3建筑(base_space.type) */
+    private Integer type;
+
+    /** 根节点 ID(base_space.root_id) */
+    private Long rootId;
+
+    /** 节点路径(base_space.path) */
+    private String path;
+
+    /** 节点路径名称(base_space.path_name) */
+    private String pathName;
+
+    /** 深度(base_space.deep) */
+    private Integer deep;
+
+    /** 父空间名称(便于前端展示) */
+    private String parentSpaceName;
+
+    /** 子节点列表 */
+    private List<BaseSpaceForestNodeVO> children = new ArrayList<>();
+}

+ 30 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/service/vo/DmpGatewayDetailResponse.java

@@ -0,0 +1,30 @@
+package com.usky.ems.service.vo;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * dmp_gateway 详情响应
+ */
+@Data
+public class DmpGatewayDetailResponse {
+
+    private Integer id;
+    private String deviceUuid;
+    private String name;
+    private String ip;
+    private Integer port;
+    private Integer communicationStatus;
+    private LocalDateTime onlineTime;
+    private LocalDateTime offlineTime;
+    private LocalDateTime updateConfigTime;
+    private LocalDateTime updateProtocolTime;
+    private LocalDateTime upgradeTime;
+    private Integer virtualDevice;
+    private String remark;
+    private Long updatedBy;
+    private LocalDateTime updateTime;
+    private Long createdBy;
+    private LocalDateTime createTime;
+}

+ 24 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/service/vo/DmpGatewayListItem.java

@@ -0,0 +1,24 @@
+package com.usky.ems.service.vo;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * dmp_gateway 列表项
+ */
+@Data
+public class DmpGatewayListItem {
+
+    private Integer id;
+    private String deviceUuid;
+    private String name;
+    private String ip;
+    private Integer port;
+    private Integer communicationStatus;
+    private LocalDateTime onlineTime;
+    private LocalDateTime offlineTime;
+    private Integer virtualDevice;
+    private LocalDateTime createTime;
+    private LocalDateTime updateTime;
+}

+ 19 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/service/vo/DmpGatewayPageRequest.java

@@ -0,0 +1,19 @@
+package com.usky.ems.service.vo;
+
+import lombok.Data;
+
+/**
+ * dmp_gateway 分页列表请求
+ */
+@Data
+public class DmpGatewayPageRequest {
+
+    private Integer current = 1;
+    private Integer size = 10;
+    /** 网关名称(模糊) */
+    private String name;
+    /** 设备 uuid(精确) */
+    private String deviceUuid;
+    /** 通讯状态:0-离线 1-在线,不传为全部 */
+    private Integer communicationStatus;
+}