Quellcode durchsuchen

区域管理部分接口提交

fuyuchuan vor 10 Stunden
Ursprung
Commit
413fa03a24
29 geänderte Dateien mit 844 neuen und 3 gelöschten Zeilen
  1. 1 1
      service-ems/service-ems-biz/src/main/java/com/usky/ems/MybatisGenerator.java
  2. 36 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/controller/web/EmsChannelTypeController.java
  3. 21 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/controller/web/EmsChannelTypeParameterController.java
  4. 21 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/controller/web/EmsChannelTypeParameterValueController.java
  5. 26 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/controller/web/EmsModelController.java
  6. 1 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/domain/EmsChannel.java
  7. 61 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/domain/EmsChannelType.java
  8. 71 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/domain/EmsChannelTypeParameter.java
  9. 71 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/domain/EmsChannelTypeParameterValue.java
  10. 16 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/mapper/EmsChannelTypeMapper.java
  11. 16 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/mapper/EmsChannelTypeParameterMapper.java
  12. 16 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/mapper/EmsChannelTypeParameterValueMapper.java
  13. 16 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/EmsChannelTypeParameterService.java
  14. 16 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/EmsChannelTypeParameterValueService.java
  15. 23 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/EmsChannelTypeService.java
  16. 15 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/EmsModelService.java
  17. 20 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/impl/EmsChannelTypeParameterServiceImpl.java
  18. 20 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/impl/EmsChannelTypeParameterValueServiceImpl.java
  19. 71 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/impl/EmsChannelTypeServiceImpl.java
  20. 91 1
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/impl/EmsModelServiceImpl.java
  21. 36 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/vo/EmsAttributePointVO.java
  22. 33 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/vo/EmsChannelTypeParameterShowVO.java
  23. 28 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/vo/EmsChannelTypeParameterValueShowVO.java
  24. 31 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/vo/EmsChannelTypeShowVO.java
  25. 23 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/vo/EmsGatewayDeviceTreeNode.java
  26. 12 1
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/vo/EmsModelSaveRequest.java
  27. 16 0
      service-ems/service-ems-biz/src/main/resources/mapper/ems/EmsChannelTypeMapper.xml
  28. 18 0
      service-ems/service-ems-biz/src/main/resources/mapper/ems/EmsChannelTypeParameterMapper.xml
  29. 18 0
      service-ems/service-ems-biz/src/main/resources/mapper/ems/EmsChannelTypeParameterValueMapper.xml

+ 1 - 1
service-ems/service-ems-biz/src/main/java/com/usky/ems/MybatisGenerator.java

@@ -70,7 +70,7 @@ public class MybatisGenerator {
         // strategy.setTablePrefix("t_"); // 表名前缀
         strategy.setEntityLombokModel(true); //使用lombok
         //修改自己想要生成的表
-        strategy.setInclude("ems_cons_platform_config");  // 逆向工程使用的表   如果要生成多个,这里可以传入String[]
+        strategy.setInclude(new String[]{"ems_channel_type", "ems_channel_type_parameter", "ems_channel_type_parameter_value"});  // 逆向工程使用的表   如果要生成多个,这里可以传入String[]
         mpg.setStrategy(strategy);
 
         // 关闭默认 xml 生成,调整生成 至 根目录

+ 36 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/controller/web/EmsChannelTypeController.java

@@ -0,0 +1,36 @@
+package com.usky.ems.controller.web;
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.ems.service.EmsChannelTypeService;
+import com.usky.ems.service.vo.EmsChannelTypeShowVO;
+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;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 通道类型 前端控制器
+ * </p>
+ *
+ * @author ya
+ * @since 2026-03-16
+ */
+@RestController
+@RequestMapping("/channelType")
+public class EmsChannelTypeController {
+
+    @Autowired
+    private EmsChannelTypeService emsChannelTypeService;
+
+    /**
+     * 通道配置数据查询:返回所有通道类型及其参数、参数可选值(树形结构)
+     */
+    @GetMapping("/show")
+    public ApiResult<List<EmsChannelTypeShowVO>> show() {
+        return ApiResult.success(emsChannelTypeService.show());
+    }
+}
+

+ 21 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/controller/web/EmsChannelTypeParameterController.java

@@ -0,0 +1,21 @@
+package com.usky.ems.controller.web;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.stereotype.Controller;
+
+/**
+ * <p>
+ * 通道类型参数 前端控制器
+ * </p>
+ *
+ * @author ya
+ * @since 2026-03-16
+ */
+@Controller
+@RequestMapping("/emsChannelTypeParameter")
+public class EmsChannelTypeParameterController {
+
+}
+

+ 21 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/controller/web/EmsChannelTypeParameterValueController.java

@@ -0,0 +1,21 @@
+package com.usky.ems.controller.web;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.stereotype.Controller;
+
+/**
+ * <p>
+ * 通道类型参数可选值 前端控制器
+ * </p>
+ *
+ * @author ya
+ * @since 2026-03-16
+ */
+@Controller
+@RequestMapping("/emsChannelTypeParameterValue")
+public class EmsChannelTypeParameterValueController {
+
+}
+

+ 26 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/controller/web/EmsModelController.java

@@ -162,4 +162,30 @@ public class EmsModelController {
         emsModelService.deleteAttributePoint(id);
         return ApiResult.success();
     }
+
+    /**
+     * 网关-通道-设备树(中间面板)
+     * GET /prod-api/service-ems/model/gateway-device/tree
+     * @param spaceId 空间ID(可选,不传返回全部网关)
+     * @param keyword 网关名称关键字(可选,模糊)
+     */
+    @GetMapping("/model/gateway-device/tree")
+    public ApiResult<List<EmsGatewayDeviceTreeNode>> getGatewayDeviceTree(
+            @RequestParam(required = false) Long spaceId,
+            @RequestParam(required = false) String keyword) {
+        return ApiResult.success(emsModelService.getGatewayDeviceTree(spaceId, keyword));
+    }
+
+    /**
+     * 属性点位列表(右侧面板)
+     * GET /prod-api/service-ems/model/attribute-point/list
+     * @param deviceId 设备ID(必填)
+     */
+    @GetMapping("/model/attribute-point/list")
+    public ApiResult<List<EmsAttributePointVO>> getAttributePointList(
+            @RequestParam String deviceId) {
+        return ApiResult.success(emsModelService.getAttributePointList(deviceId));
+    }
+
+
 }

+ 1 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/domain/EmsChannel.java

@@ -27,6 +27,7 @@ public class EmsChannel implements Serializable {
     private String gatewayId;
     private String name;
     @TableField("channel_type_id")
+    // 通道类型ID(1:Serial Port,2:TCP)
     private Integer channelTypeId;
     @TableField("updated_by")
     private Long updatedBy;

+ 61 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/domain/EmsChannelType.java

@@ -0,0 +1,61 @@
+package com.usky.ems.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 通道类型
+ * </p>
+ *
+ * @author ya
+ * @since 2026-03-16
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class EmsChannelType implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 自增ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 类型名称
+     */
+    private String name;
+
+    /**
+     * 类型值
+     */
+    private String value;
+
+    /**
+     * 更新人
+     */
+    private Long updatedBy;
+
+    /**
+     * 记录更新时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 创建人
+     */
+    private Long createdBy;
+
+    /**
+     * 记录创建时间
+     */
+    private LocalDateTime createTime;
+
+
+}

+ 71 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/domain/EmsChannelTypeParameter.java

@@ -0,0 +1,71 @@
+package com.usky.ems.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 通道类型参数
+ * </p>
+ *
+ * @author ya
+ * @since 2026-03-16
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class EmsChannelTypeParameter implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 自增ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 通道类型ID
+     */
+    private Integer channelTypeId;
+
+    /**
+     * 参数名称
+     */
+    private String name;
+
+    /**
+     * 参数值
+     */
+    private String value;
+
+    /**
+     * 排序
+     */
+    private Integer sort;
+
+    /**
+     * 更新人
+     */
+    private Long updatedBy;
+
+    /**
+     * 记录更新时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 创建人
+     */
+    private Long createdBy;
+
+    /**
+     * 记录创建时间
+     */
+    private LocalDateTime createTime;
+
+
+}

+ 71 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/domain/EmsChannelTypeParameterValue.java

@@ -0,0 +1,71 @@
+package com.usky.ems.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 通道类型参数可选值
+ * </p>
+ *
+ * @author ya
+ * @since 2026-03-16
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class EmsChannelTypeParameterValue implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 自增ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 通道类型参数ID
+     */
+    private Integer channelTypeParameterId;
+
+    /**
+     * 可选值名称
+     */
+    private String name;
+
+    /**
+     * 可选值
+     */
+    private String value;
+
+    /**
+     * 排序
+     */
+    private Integer sort;
+
+    /**
+     * 更新人
+     */
+    private Long updatedBy;
+
+    /**
+     * 记录更新时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 创建人
+     */
+    private Long createdBy;
+
+    /**
+     * 记录创建时间
+     */
+    private LocalDateTime createTime;
+
+
+}

+ 16 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/mapper/EmsChannelTypeMapper.java

@@ -0,0 +1,16 @@
+package com.usky.ems.mapper;
+
+import com.usky.ems.domain.EmsChannelType;
+import com.usky.common.mybatis.core.CrudMapper;
+
+/**
+ * <p>
+ * 通道类型 Mapper 接口
+ * </p>
+ *
+ * @author ya
+ * @since 2026-03-16
+ */
+public interface EmsChannelTypeMapper extends CrudMapper<EmsChannelType> {
+
+}

+ 16 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/mapper/EmsChannelTypeParameterMapper.java

@@ -0,0 +1,16 @@
+package com.usky.ems.mapper;
+
+import com.usky.ems.domain.EmsChannelTypeParameter;
+import com.usky.common.mybatis.core.CrudMapper;
+
+/**
+ * <p>
+ * 通道类型参数 Mapper 接口
+ * </p>
+ *
+ * @author ya
+ * @since 2026-03-16
+ */
+public interface EmsChannelTypeParameterMapper extends CrudMapper<EmsChannelTypeParameter> {
+
+}

+ 16 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/mapper/EmsChannelTypeParameterValueMapper.java

@@ -0,0 +1,16 @@
+package com.usky.ems.mapper;
+
+import com.usky.ems.domain.EmsChannelTypeParameterValue;
+import com.usky.common.mybatis.core.CrudMapper;
+
+/**
+ * <p>
+ * 通道类型参数可选值 Mapper 接口
+ * </p>
+ *
+ * @author ya
+ * @since 2026-03-16
+ */
+public interface EmsChannelTypeParameterValueMapper extends CrudMapper<EmsChannelTypeParameterValue> {
+
+}

+ 16 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/service/EmsChannelTypeParameterService.java

@@ -0,0 +1,16 @@
+package com.usky.ems.service;
+
+import com.usky.ems.domain.EmsChannelTypeParameter;
+import com.usky.common.mybatis.core.CrudService;
+
+/**
+ * <p>
+ * 通道类型参数 服务类
+ * </p>
+ *
+ * @author ya
+ * @since 2026-03-16
+ */
+public interface EmsChannelTypeParameterService extends CrudService<EmsChannelTypeParameter> {
+
+}

+ 16 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/service/EmsChannelTypeParameterValueService.java

@@ -0,0 +1,16 @@
+package com.usky.ems.service;
+
+import com.usky.ems.domain.EmsChannelTypeParameterValue;
+import com.usky.common.mybatis.core.CrudService;
+
+/**
+ * <p>
+ * 通道类型参数可选值 服务类
+ * </p>
+ *
+ * @author ya
+ * @since 2026-03-16
+ */
+public interface EmsChannelTypeParameterValueService extends CrudService<EmsChannelTypeParameterValue> {
+
+}

+ 23 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/service/EmsChannelTypeService.java

@@ -0,0 +1,23 @@
+package com.usky.ems.service;
+
+import com.usky.ems.domain.EmsChannelType;
+import com.usky.ems.service.vo.EmsChannelTypeShowVO;
+import com.usky.common.mybatis.core.CrudService;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 通道类型 服务类
+ * </p>
+ *
+ * @author ya
+ * @since 2026-03-16
+ */
+public interface EmsChannelTypeService extends CrudService<EmsChannelType> {
+
+    /**
+     * 查询通道配置数据(类型 + 参数 + 参数可选值树形结构)
+     */
+    List<EmsChannelTypeShowVO> show();
+}

+ 15 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/service/EmsModelService.java

@@ -1,6 +1,8 @@
 package com.usky.ems.service;
 
+import com.usky.ems.service.vo.EmsAttributePointVO;
 import com.usky.ems.service.vo.EmsEnergyTypeVO;
+import com.usky.ems.service.vo.EmsGatewayDeviceTreeNode;
 import com.usky.ems.service.vo.EmsModelSaveRequest;
 import com.usky.ems.service.vo.EmsStructureTreeNode;
 
@@ -69,4 +71,17 @@ public interface EmsModelService {
     void updateAttributePoint(Long id, EmsModelSaveRequest request);
     /** 属性点位:删除 */
     void deleteAttributePoint(Long id);
+
+    /**
+     * 网关-通道-设备树(中间面板)
+     * @param spaceId 空间ID(可选,不传返回全部网关)
+     * @param keyword 网关名称关键字模糊搜索(可选)
+     */
+    List<EmsGatewayDeviceTreeNode> getGatewayDeviceTree(Long spaceId, String keyword);
+
+    /**
+     * 属性点位列表(右侧面板)
+     * @param deviceId 设备ID
+     */
+    List<EmsAttributePointVO> getAttributePointList(String deviceId);
 }

+ 20 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/service/impl/EmsChannelTypeParameterServiceImpl.java

@@ -0,0 +1,20 @@
+package com.usky.ems.service.impl;
+
+import com.usky.ems.domain.EmsChannelTypeParameter;
+import com.usky.ems.mapper.EmsChannelTypeParameterMapper;
+import com.usky.ems.service.EmsChannelTypeParameterService;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 通道类型参数 服务实现类
+ * </p>
+ *
+ * @author ya
+ * @since 2026-03-16
+ */
+@Service
+public class EmsChannelTypeParameterServiceImpl extends AbstractCrudService<EmsChannelTypeParameterMapper, EmsChannelTypeParameter> implements EmsChannelTypeParameterService {
+
+}

+ 20 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/service/impl/EmsChannelTypeParameterValueServiceImpl.java

@@ -0,0 +1,20 @@
+package com.usky.ems.service.impl;
+
+import com.usky.ems.domain.EmsChannelTypeParameterValue;
+import com.usky.ems.mapper.EmsChannelTypeParameterValueMapper;
+import com.usky.ems.service.EmsChannelTypeParameterValueService;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 通道类型参数可选值 服务实现类
+ * </p>
+ *
+ * @author ya
+ * @since 2026-03-16
+ */
+@Service
+public class EmsChannelTypeParameterValueServiceImpl extends AbstractCrudService<EmsChannelTypeParameterValueMapper, EmsChannelTypeParameterValue> implements EmsChannelTypeParameterValueService {
+
+}

+ 71 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/service/impl/EmsChannelTypeServiceImpl.java

@@ -0,0 +1,71 @@
+package com.usky.ems.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.usky.ems.domain.EmsChannelType;
+import com.usky.ems.domain.EmsChannelTypeParameter;
+import com.usky.ems.domain.EmsChannelTypeParameterValue;
+import com.usky.ems.mapper.EmsChannelTypeMapper;
+import com.usky.ems.mapper.EmsChannelTypeParameterMapper;
+import com.usky.ems.mapper.EmsChannelTypeParameterValueMapper;
+import com.usky.ems.service.EmsChannelTypeService;
+import com.usky.ems.service.vo.EmsChannelTypeParameterShowVO;
+import com.usky.ems.service.vo.EmsChannelTypeParameterValueShowVO;
+import com.usky.ems.service.vo.EmsChannelTypeShowVO;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 通道类型 服务实现类
+ * </p>
+ *
+ * @author ya
+ * @since 2026-03-16
+ */
+@Service
+public class EmsChannelTypeServiceImpl extends AbstractCrudService<EmsChannelTypeMapper, EmsChannelType> implements EmsChannelTypeService {
+
+    @Autowired
+    private EmsChannelTypeMapper emsChannelTypeMapper;
+    @Autowired
+    private EmsChannelTypeParameterMapper channelTypeParameterMapper;
+    @Autowired
+    private EmsChannelTypeParameterValueMapper channelTypeParameterValueMapper;
+
+    @Override
+    public List<EmsChannelTypeShowVO> show() {
+        List<EmsChannelType> types = emsChannelTypeMapper.selectList(new LambdaQueryWrapper<>());
+        List<EmsChannelTypeShowVO> result = new ArrayList<>(types.size());
+        for (EmsChannelType type : types) {
+            EmsChannelTypeShowVO vo = new EmsChannelTypeShowVO();
+            BeanUtils.copyProperties(type, vo);
+            List<EmsChannelTypeParameter> params = channelTypeParameterMapper.selectList(
+                    new LambdaQueryWrapper<EmsChannelTypeParameter>()
+                            .eq(EmsChannelTypeParameter::getChannelTypeId, type.getId())
+                            .orderByAsc(EmsChannelTypeParameter::getSort));
+            List<EmsChannelTypeParameterShowVO> paramVos = params.stream().map(p -> {
+                EmsChannelTypeParameterShowVO pvo = new EmsChannelTypeParameterShowVO();
+                BeanUtils.copyProperties(p, pvo);
+                List<EmsChannelTypeParameterValue> values = channelTypeParameterValueMapper.selectList(
+                        new LambdaQueryWrapper<EmsChannelTypeParameterValue>()
+                                .eq(EmsChannelTypeParameterValue::getChannelTypeParameterId, p.getId())
+                                .orderByAsc(EmsChannelTypeParameterValue::getSort));
+                pvo.setChannelTypeValueList(values.stream().map(v -> {
+                    EmsChannelTypeParameterValueShowVO vvo = new EmsChannelTypeParameterValueShowVO();
+                    BeanUtils.copyProperties(v, vvo);
+                    return vvo;
+                }).collect(Collectors.toList()));
+                return pvo;
+            }).collect(Collectors.toList());
+            vo.setChannelTypeParameterList(paramVos);
+            result.add(vo);
+        }
+        return result;
+    }
+}

+ 91 - 1
service-ems/service-ems-biz/src/main/java/com/usky/ems/service/impl/EmsModelServiceImpl.java

@@ -4,7 +4,9 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.usky.ems.domain.*;
 import com.usky.ems.mapper.*;
 import com.usky.ems.service.EmsModelService;
+import com.usky.ems.service.vo.EmsAttributePointVO;
 import com.usky.ems.service.vo.EmsEnergyTypeVO;
+import com.usky.ems.service.vo.EmsGatewayDeviceTreeNode;
 import com.usky.ems.service.vo.EmsModelSaveRequest;
 import com.usky.ems.service.vo.EmsStructureTreeNode;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -300,7 +302,7 @@ public class EmsModelServiceImpl implements EmsModelService {
         EmsChannel c = new EmsChannel();
         c.setGatewayId(gatewayId);
         c.setName(name);
-        c.setChannelTypeId(1);
+        c.setChannelTypeId(request.getChannelTypeId());
         emsChannelMapper.insert(c);
         return c.getId();
     }
@@ -398,4 +400,92 @@ public class EmsModelServiceImpl implements EmsModelService {
     public void deleteAttributePoint(Long id) {
         emsDeviceFunctionMapper.deleteById(id);
     }
+
+    @Override
+    public List<EmsGatewayDeviceTreeNode> getGatewayDeviceTree(Long spaceId, String keyword) {
+        // 1. 查询网关列表
+        LambdaQueryWrapper<EmsGateway> gwWrapper = new LambdaQueryWrapper<>();
+        if (spaceId != null) {
+            gwWrapper.eq(EmsGateway::getSpaceId, spaceId);
+        }
+        if (keyword != null && !keyword.trim().isEmpty()) {
+            gwWrapper.like(EmsGateway::getName, keyword.trim());
+        }
+        List<EmsGateway> gateways = emsGatewayMapper.selectList(gwWrapper);
+
+        List<EmsGatewayDeviceTreeNode> result = new ArrayList<>();
+        for (EmsGateway gw : gateways) {
+            EmsGatewayDeviceTreeNode gwNode = new EmsGatewayDeviceTreeNode();
+            gwNode.setId(gw.getId());
+            gwNode.setName(gw.getName());
+            gwNode.setType("gateway");
+
+            // 2. 查询该网关下的通道
+            List<EmsChannel> channels = emsChannelMapper.selectList(
+                    new LambdaQueryWrapper<EmsChannel>().eq(EmsChannel::getGatewayId, gw.getId()));
+            List<EmsGatewayDeviceTreeNode> channelNodes = new ArrayList<>();
+            for (EmsChannel ch : channels) {
+                EmsGatewayDeviceTreeNode chNode = new EmsGatewayDeviceTreeNode();
+                chNode.setId(ch.getId());
+                chNode.setName(ch.getName());
+                chNode.setType("channel");
+
+                // 3. 查询该通道下的设备
+                List<EmsDevice> devices = emsDeviceMapper.selectList(
+                        new LambdaQueryWrapper<EmsDevice>().eq(EmsDevice::getChannelId, ch.getId()));
+                List<EmsGatewayDeviceTreeNode> deviceNodes = new ArrayList<>();
+                for (EmsDevice dev : devices) {
+                    EmsGatewayDeviceTreeNode devNode = new EmsGatewayDeviceTreeNode();
+                    devNode.setId(dev.getId());
+                    devNode.setName(dev.getName());
+                    devNode.setType("device");
+                    deviceNodes.add(devNode);
+                }
+
+                // 只有当设备列表不为空时,才设置通道的 children
+                if (!deviceNodes.isEmpty()) {
+                    chNode.setChildren(deviceNodes);
+                    channelNodes.add(chNode);
+                }
+            }
+
+            // 只有当通道列表不为空时,才设置网关的 children
+            if (!channelNodes.isEmpty()) {
+                gwNode.setChildren(channelNodes);
+                result.add(gwNode);
+            }
+        }
+        return result;
+    }
+
+
+    @Override
+    public List<EmsAttributePointVO> getAttributePointList(String deviceId) {
+        if (deviceId == null || deviceId.trim().isEmpty()) {
+            return Collections.emptyList();
+        }
+        List<EmsDeviceFunction> functions = emsDeviceFunctionMapper.selectList(
+                new LambdaQueryWrapper<EmsDeviceFunction>().eq(EmsDeviceFunction::getDeviceId, deviceId));
+        List<EmsAttributePointVO> result = new ArrayList<>();
+        for (EmsDeviceFunction f : functions) {
+            EmsAttributePointVO vo = new EmsAttributePointVO();
+            vo.setId(f.getId());
+            vo.setProductId(f.getProductId());
+            vo.setProductTemplateId(f.getProductTemplateId());
+            vo.setDeviceId(f.getDeviceId());
+            vo.setName(f.getName());
+            vo.setIdentifier(f.getIdentifier());
+            vo.setValue(f.getValue());
+            vo.setAcqTime(f.getAcqTime());
+            vo.setRatio(f.getRatio());
+            vo.setPreservable(f.getPreservable());
+            vo.setBindingAcq(f.getBindingAcq());
+            vo.setUpdatedBy(f.getUpdatedBy());
+            vo.setUpdateTime(f.getUpdateTime());
+            vo.setCreatedBy(f.getCreatedBy());
+            vo.setCreateTime(f.getCreateTime());
+            result.add(vo);
+        }
+        return result;
+    }
 }

+ 36 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/service/vo/EmsAttributePointVO.java

@@ -0,0 +1,36 @@
+package com.usky.ems.service.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 属性点位列表项(基础建模右侧面板)
+ * 对应 leo.ems_device_function
+ */
+@Data
+public class EmsAttributePointVO {
+    private Long id;
+    private Long productId;
+    private Long productTemplateId;
+    private String deviceId;
+    private String identifier;
+    private String name;
+    private String value;
+    private LocalDateTime acqTime;
+    private BigDecimal ratio;
+    private Integer preservable;
+    private Integer bindingAcq;
+    private Long updatedBy;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime updateTime;
+    private Long createdBy;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+}

+ 33 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/service/vo/EmsChannelTypeParameterShowVO.java

@@ -0,0 +1,33 @@
+package com.usky.ems.service.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * 通道配置 show 接口 - 通道类型参数(含可选值列表)
+ */
+@Data
+public class EmsChannelTypeParameterShowVO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private Integer id;
+    private Integer channelTypeId;
+    private String name;
+    private String value;
+    private Integer sort;
+    private Long updatedBy;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime updateTime;
+    private Long createdBy;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+    /**
+     * 参数可选值列表
+     */
+    private List<EmsChannelTypeParameterValueShowVO> channelTypeValueList;
+}

+ 28 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/service/vo/EmsChannelTypeParameterValueShowVO.java

@@ -0,0 +1,28 @@
+package com.usky.ems.service.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 通道配置 show 接口 - 通道类型参数可选值
+ */
+@Data
+public class EmsChannelTypeParameterValueShowVO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private Integer id;
+    private Integer channelTypeParameterId;
+    private String name;
+    private String value;
+    private Integer sort;
+    private Long updatedBy;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime updateTime;
+    private Long createdBy;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+}

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

@@ -0,0 +1,31 @@
+package com.usky.ems.service.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * 通道配置 show 接口 - 通道类型(含参数及可选值树形数据)
+ */
+@Data
+public class EmsChannelTypeShowVO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private Integer id;
+    private String name;
+    private String value;
+    private Long updatedBy;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime updateTime;
+    private Long createdBy;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+    /**
+     * 通道类型参数列表(含可选值)
+     */
+    private List<EmsChannelTypeParameterShowVO> channelTypeParameterList;
+}

+ 23 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/service/vo/EmsGatewayDeviceTreeNode.java

@@ -0,0 +1,23 @@
+package com.usky.ems.service.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 网关-通道-设备树节点(基础建模中间面板)
+ * type: "gateway" / "channel" / "device"
+ * id:   gateway/device 为 String,channel 为 Long
+ */
+@Data
+public class EmsGatewayDeviceTreeNode {
+
+    private Object id;
+    private String name;
+    private String type;
+    
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private List<EmsGatewayDeviceTreeNode> children;
+}

+ 12 - 1
service-ems/service-ems-biz/src/main/java/com/usky/ems/service/vo/EmsModelSaveRequest.java

@@ -15,11 +15,22 @@ public class EmsModelSaveRequest {
     private Long buildingId;
     private Long regionId;
     private Long floorId;
-    private String gatewayId;
+
     private Long channelId;
+    // 通道类型ID(1:Serial Port,2:TCP)
+    private Integer channelTypeId;
+
     private String deviceId;
     private Long energyTypeId;
 
+    private String gatewayId;
+    // 备注
+    private String remark;
+    // 是否虚拟设备 0:否 1:是
+    private Integer virtualDevice;
+    // 数据中心ID 0:默认(本地数据中心)
+    private Long dataCenterId;
+
     private String name;
     private String code;
     private BigDecimal area;

+ 16 - 0
service-ems/service-ems-biz/src/main/resources/mapper/ems/EmsChannelTypeMapper.xml

@@ -0,0 +1,16 @@
+<?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="com.usky.ems.mapper.EmsChannelTypeMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.ems.domain.EmsChannelType">
+        <id column="id" property="id" />
+        <result column="name" property="name" />
+        <result column="value" property="value" />
+        <result column="updated_by" property="updatedBy" />
+        <result column="update_time" property="updateTime" />
+        <result column="created_by" property="createdBy" />
+        <result column="create_time" property="createTime" />
+    </resultMap>
+
+</mapper>

+ 18 - 0
service-ems/service-ems-biz/src/main/resources/mapper/ems/EmsChannelTypeParameterMapper.xml

@@ -0,0 +1,18 @@
+<?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="com.usky.ems.mapper.EmsChannelTypeParameterMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.ems.domain.EmsChannelTypeParameter">
+        <id column="id" property="id" />
+        <result column="channel_type_id" property="channelTypeId" />
+        <result column="name" property="name" />
+        <result column="value" property="value" />
+        <result column="sort" property="sort" />
+        <result column="updated_by" property="updatedBy" />
+        <result column="update_time" property="updateTime" />
+        <result column="created_by" property="createdBy" />
+        <result column="create_time" property="createTime" />
+    </resultMap>
+
+</mapper>

+ 18 - 0
service-ems/service-ems-biz/src/main/resources/mapper/ems/EmsChannelTypeParameterValueMapper.xml

@@ -0,0 +1,18 @@
+<?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="com.usky.ems.mapper.EmsChannelTypeParameterValueMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.ems.domain.EmsChannelTypeParameterValue">
+        <id column="id" property="id" />
+        <result column="channel_type_parameter_id" property="channelTypeParameterId" />
+        <result column="name" property="name" />
+        <result column="value" property="value" />
+        <result column="sort" property="sort" />
+        <result column="updated_by" property="updatedBy" />
+        <result column="update_time" property="updateTime" />
+        <result column="created_by" property="createdBy" />
+        <result column="create_time" property="createTime" />
+    </resultMap>
+
+</mapper>