Bläddra i källkod

完善电子地图相关接口,新增ems

hanzhengyi 3 dagar sedan
förälder
incheckning
daf2ed0740
40 ändrade filer med 1736 tillägg och 118 borttagningar
  1. 0 6
      service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/service/config/mqtt/MqttOutConfig.java
  2. 233 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/controller/web/EmsApiV1Controller.java
  3. 39 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/domain/EmsChannel.java
  4. 69 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/domain/EmsDevice.java
  5. 50 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/domain/EmsDeviceFunction.java
  6. 44 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/domain/EmsEnergyItemCode.java
  7. 64 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/domain/EmsGateway.java
  8. 71 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/domain/EmsProject.java
  9. 45 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/domain/EmsSpace.java
  10. 46 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/domain/EmsSpaceArea.java
  11. 67 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/domain/EmsSpaceBuilding.java
  12. 45 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/domain/EmsSpaceFloor.java
  13. 10 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/mapper/EmsChannelMapper.java
  14. 10 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/mapper/EmsDeviceFunctionMapper.java
  15. 10 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/mapper/EmsDeviceMapper.java
  16. 10 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/mapper/EmsEnergyItemCodeMapper.java
  17. 10 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/mapper/EmsGatewayMapper.java
  18. 10 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/mapper/EmsProjectMapper.java
  19. 10 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/mapper/EmsSpaceAreaMapper.java
  20. 10 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/mapper/EmsSpaceBuildingMapper.java
  21. 10 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/mapper/EmsSpaceFloorMapper.java
  22. 10 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/mapper/EmsSpaceMapper.java
  23. 22 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/EmsGatewayQueryService.java
  24. 72 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/EmsModelService.java
  25. 20 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/EmsOverviewService.java
  26. 87 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/impl/EmsGatewayQueryServiceImpl.java
  27. 401 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/impl/EmsModelServiceImpl.java
  28. 53 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/impl/EmsOverviewServiceImpl.java
  29. 16 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/vo/EmsEnergyTypeVO.java
  30. 24 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/vo/EmsGatewayDetailResponse.java
  31. 22 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/vo/EmsGatewayListItem.java
  32. 21 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/vo/EmsGatewayPageRequest.java
  33. 16 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/vo/EmsIdResponse.java
  34. 35 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/vo/EmsModelSaveRequest.java
  35. 23 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/vo/EmsProjectResponse.java
  36. 18 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/vo/EmsStructureTreeNode.java
  37. 11 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/vo/EmsSummaryRequest.java
  38. 20 0
      service-ems/service-ems-biz/src/main/java/com/usky/ems/service/vo/EmsSummaryResponse.java
  39. 0 108
      service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/MybatisGeneratorUtils.java
  40. 2 4
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasMapServiceImpl.java

+ 0 - 6
service-cdi/service-cdi-biz/src/main/java/com/usky/cdi/service/config/mqtt/MqttOutConfig.java

@@ -1,9 +1,6 @@
 package com.usky.cdi.service.config.mqtt;
 
 import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
-import com.alibaba.fastjson.JSONObject;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.context.annotation.Bean;
 import org.springframework.integration.annotation.MessagingGateway;
 import org.springframework.integration.annotation.ServiceActivator;
@@ -18,8 +15,6 @@ import org.springframework.stereotype.Component;
 
 import java.util.Map;
 
-import java.util.Map;
-
 /**
  * @author han
  * @date 2025/03/20 14:31
@@ -91,7 +86,6 @@ public class MqttOutConfig {
 
     // 注意:这个接口需要被Spring扫描到,所以我们保留@MessagingGateway注解
     // Spring会自动创建这个接口的实现类
-
     @MessagingGateway(defaultRequestChannel = CHANNEL_NAME_OUT)
     public interface MqttGateway {
         /**

+ 233 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/controller/web/EmsApiV1Controller.java

@@ -0,0 +1,233 @@
+package com.usky.ems.controller.web;
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.ems.service.EmsGatewayQueryService;
+import com.usky.ems.service.EmsModelService;
+import com.usky.ems.service.EmsOverviewService;
+import com.usky.ems.service.vo.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 能源能耗系统 API v1
+ *
+ * 对应 API 文档基础路径:/api/v1
+ * GET  /api/v1/overview/project           获取项目信息
+ * GET  /api/v1/overview/summary            获取项目数据概括
+ * GET  /api/v1/model/structure/tree        获取项目层级树
+ * GET  /api/v1/model/energy-type/list      能源类型列表
+ * POST /api/v1/model/building              新增建筑
+ * PUT  /api/v1/model/building/{id}        编辑建筑
+ * DELETE /api/v1/model/building/{id}      删除建筑
+ * POST /api/v1/model/region                新增区域
+ * PUT  /api/v1/model/region/{id}           编辑区域
+ * DELETE /api/v1/model/region/{id}         删除区域
+ * POST /api/v1/model/floor                 新增楼层
+ * PUT  /api/v1/model/floor/{id}            编辑楼层
+ * DELETE /api/v1/model/floor/{id}          删除楼层
+ * POST /api/v1/model/gateway               新增网关
+ * PUT  /api/v1/model/gateway/{id}         编辑网关
+ * DELETE /api/v1/model/gateway/{id}        删除网关
+ * POST /api/v1/model/channel               新增通道
+ * PUT  /api/v1/model/channel/{id}          编辑通道
+ * DELETE /api/v1/model/channel/{id}        删除通道
+ * POST /api/v1/model/device                新增设备
+ * PUT  /api/v1/model/device/{id}           编辑设备
+ * DELETE /api/v1/model/device/{id}         删除设备
+ * POST /api/v1/model/attribute-point      新增属性点位
+ * PUT  /api/v1/model/attribute-point/{id}  编辑属性点位
+ * DELETE /api/v1/model/attribute-point/{id} 删除属性点位
+ * GET  /api/v1/device/gateway/list         网关列表(分页)
+ * GET  /api/v1/device/gateway/{id}         网关详情
+ */
+@RestController
+@RequestMapping("/api/v1")
+public class EmsApiV1Controller {
+
+    @Autowired
+    private EmsOverviewService emsOverviewService;
+    @Autowired
+    private EmsModelService emsModelService;
+    @Autowired
+    private EmsGatewayQueryService emsGatewayQueryService;
+
+    /**
+     * 获取项目信息
+     */
+    @GetMapping("/overview/project")
+    public ApiResult<EmsProjectResponse> getProject(@RequestParam(required = false) Long projectId) {
+        return ApiResult.success(emsOverviewService.getProject(projectId));
+    }
+
+    /**
+     * 获取项目数据概括(时间维度联动)
+     */
+    @GetMapping("/overview/summary")
+    public ApiResult<EmsSummaryResponse> getSummary(EmsSummaryRequest request) {
+        return ApiResult.success(emsOverviewService.getSummary(
+                request.getProjectId(), request.getTimeDimension(), request.getTimeValue()));
+    }
+
+    /**
+     * 获取项目层级树(建筑、区域、楼层、网关)
+     */
+    @GetMapping("/model/structure/tree")
+    public ApiResult<EmsStructureTreeNode> getStructureTree(
+            @RequestParam(required = false) Long projectId,
+            @RequestParam(required = false, defaultValue = "true") Boolean includeGateway) {
+        return ApiResult.success(emsModelService.getStructureTree(projectId, includeGateway));
+    }
+
+    /**
+     * 能源类型列表(电、水、气)
+     */
+    @GetMapping("/model/energy-type/list")
+    public ApiResult<List<EmsEnergyTypeVO>> getEnergyTypeList() {
+        return ApiResult.success(emsModelService.getEnergyTypeList());
+    }
+
+    @PostMapping("/model/building")
+    public ApiResult<EmsIdResponse> createBuilding(@RequestBody EmsModelSaveRequest request) {
+        Long id = emsModelService.createBuilding(request);
+        return ApiResult.success(new EmsIdResponse(id));
+    }
+
+    @PutMapping("/model/building/{id}")
+    public ApiResult<Void> updateBuilding(@PathVariable Long id, @RequestBody EmsModelSaveRequest request) {
+        emsModelService.updateBuilding(id, request);
+        return ApiResult.success();
+    }
+
+    @DeleteMapping("/model/building/{id}")
+    public ApiResult<Void> deleteBuilding(@PathVariable Long id) {
+        emsModelService.deleteBuilding(id);
+        return ApiResult.success();
+    }
+
+    @PostMapping("/model/region")
+    public ApiResult<EmsIdResponse> createRegion(@RequestBody EmsModelSaveRequest request) {
+        Long id = emsModelService.createRegion(request);
+        return ApiResult.success(new EmsIdResponse(id));
+    }
+
+    @PutMapping("/model/region/{id}")
+    public ApiResult<Void> updateRegion(@PathVariable Long id, @RequestBody EmsModelSaveRequest request) {
+        emsModelService.updateRegion(id, request);
+        return ApiResult.success();
+    }
+
+    @DeleteMapping("/model/region/{id}")
+    public ApiResult<Void> deleteRegion(@PathVariable Long id) {
+        emsModelService.deleteRegion(id);
+        return ApiResult.success();
+    }
+
+    @PostMapping("/model/floor")
+    public ApiResult<EmsIdResponse> createFloor(@RequestBody EmsModelSaveRequest request) {
+        Long id = emsModelService.createFloor(request);
+        return ApiResult.success(new EmsIdResponse(id));
+    }
+
+    @PutMapping("/model/floor/{id}")
+    public ApiResult<Void> updateFloor(@PathVariable Long id, @RequestBody EmsModelSaveRequest request) {
+        emsModelService.updateFloor(id, request);
+        return ApiResult.success();
+    }
+
+    @DeleteMapping("/model/floor/{id}")
+    public ApiResult<Void> deleteFloor(@PathVariable Long id) {
+        emsModelService.deleteFloor(id);
+        return ApiResult.success();
+    }
+
+    @PostMapping("/model/gateway")
+    public ApiResult<EmsIdResponse> createGateway(@RequestBody EmsModelSaveRequest request) {
+        String id = emsModelService.createGateway(request);
+        return ApiResult.success(new EmsIdResponse(id));
+    }
+
+    @PutMapping("/model/gateway/{id}")
+    public ApiResult<Void> updateGateway(@PathVariable String id, @RequestBody EmsModelSaveRequest request) {
+        emsModelService.updateGateway(id, request);
+        return ApiResult.success();
+    }
+
+    @DeleteMapping("/model/gateway/{id}")
+    public ApiResult<Void> deleteGateway(@PathVariable String id) {
+        emsModelService.deleteGateway(id);
+        return ApiResult.success();
+    }
+
+    @PostMapping("/model/channel")
+    public ApiResult<EmsIdResponse> createChannel(@RequestBody EmsModelSaveRequest request) {
+        Long id = emsModelService.createChannel(request);
+        return ApiResult.success(new EmsIdResponse(id));
+    }
+
+    @PutMapping("/model/channel/{id}")
+    public ApiResult<Void> updateChannel(@PathVariable Long id, @RequestBody EmsModelSaveRequest request) {
+        emsModelService.updateChannel(id, request);
+        return ApiResult.success();
+    }
+
+    @DeleteMapping("/model/channel/{id}")
+    public ApiResult<Void> deleteChannel(@PathVariable Long id) {
+        emsModelService.deleteChannel(id);
+        return ApiResult.success();
+    }
+
+    @PostMapping("/model/device")
+    public ApiResult<EmsIdResponse> createDevice(@RequestBody EmsModelSaveRequest request) {
+        String id = emsModelService.createDevice(request);
+        return ApiResult.success(new EmsIdResponse(id));
+    }
+
+    @PutMapping("/model/device/{id}")
+    public ApiResult<Void> updateDevice(@PathVariable String id, @RequestBody EmsModelSaveRequest request) {
+        emsModelService.updateDevice(id, request);
+        return ApiResult.success();
+    }
+
+    @DeleteMapping("/model/device/{id}")
+    public ApiResult<Void> deleteDevice(@PathVariable String id) {
+        emsModelService.deleteDevice(id);
+        return ApiResult.success();
+    }
+
+    @PostMapping("/model/attribute-point")
+    public ApiResult<EmsIdResponse> createAttributePoint(@RequestBody EmsModelSaveRequest request) {
+        Long id = emsModelService.createAttributePoint(request);
+        return ApiResult.success(new EmsIdResponse(id));
+    }
+
+    @PutMapping("/model/attribute-point/{id}")
+    public ApiResult<Void> updateAttributePoint(@PathVariable Long id, @RequestBody EmsModelSaveRequest request) {
+        emsModelService.updateAttributePoint(id, request);
+        return ApiResult.success();
+    }
+
+    @DeleteMapping("/model/attribute-point/{id}")
+    public ApiResult<Void> deleteAttributePoint(@PathVariable Long id) {
+        emsModelService.deleteAttributePoint(id);
+        return ApiResult.success();
+    }
+
+    /**
+     * 网关列表(分页)
+     */
+    @GetMapping("/device/gateway/list")
+    public ApiResult<CommonPage<EmsGatewayListItem>> gatewayList(EmsGatewayPageRequest request) {
+        return ApiResult.success(emsGatewayQueryService.listGateways(request));
+    }
+
+    /**
+     * 网关详情
+     */
+    @GetMapping("/device/gateway/{id}")
+    public ApiResult<EmsGatewayDetailResponse> getGateway(@PathVariable String id) {
+        return ApiResult.success(emsGatewayQueryService.getGatewayById(id));
+    }
+}

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

@@ -0,0 +1,39 @@
+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;
+
+/**
+ * 网关通道(leo.ems_channel)
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("ems_channel")
+public class EmsChannel implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @TableField("gateway_id")
+    private String gatewayId;
+    private String name;
+    @TableField("channel_type_id")
+    private Integer channelTypeId;
+    @TableField("updated_by")
+    private Long updatedBy;
+    @TableField("update_time")
+    private LocalDateTime updateTime;
+    @TableField("created_by")
+    private Long createdBy;
+    @TableField("create_time")
+    private LocalDateTime createTime;
+}

+ 69 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/domain/EmsDevice.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;
+
+/**
+ * 设备(leo.ems_device)
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("ems_device")
+public class EmsDevice implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.INPUT)
+    private String id;
+
+    @TableField("project_id")
+    private Long projectId;
+    private String number;
+    private String name;
+    @TableField("product_id")
+    private Long productId;
+    @TableField("product_template_id")
+    private Long productTemplateId;
+    @TableField("installation_location")
+    private Long installationLocation;
+    @TableField("monitoring_location")
+    private Long monitoringLocation;
+    private String location;
+    @TableField("comm_address")
+    private String commAddress;
+    @TableField("channel_id")
+    private Long channelId;
+    @TableField("gateway_id")
+    private String gatewayId;
+    @TableField("virtual_device")
+    private Integer virtualDevice;
+    private Integer focus;
+    @TableField("device_system")
+    private Integer deviceSystem;
+    private Integer status;
+    @TableField("comm_status")
+    private Integer commStatus;
+    @TableField("comm_status_code")
+    private String commStatusCode;
+    @TableField("online_time")
+    private LocalDateTime onlineTime;
+    @TableField("offline_time")
+    private LocalDateTime offlineTime;
+    @TableField("external_id")
+    private String externalId;
+    @TableField("updated_by")
+    private Long updatedBy;
+    @TableField("update_time")
+    private LocalDateTime updateTime;
+    @TableField("created_by")
+    private Long createdBy;
+    @TableField("create_time")
+    private LocalDateTime createTime;
+}

+ 50 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/domain/EmsDeviceFunction.java

@@ -0,0 +1,50 @@
+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.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 设备功能数据/属性点位(leo.ems_device_function)
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("ems_device_function")
+public class EmsDeviceFunction implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @TableField("product_id")
+    private Long productId;
+    @TableField("product_template_id")
+    private Long productTemplateId;
+    @TableField("device_id")
+    private String deviceId;
+    private String identifier;
+    private String name;
+    private String value;
+    @TableField("acq_time")
+    private LocalDateTime acqTime;
+    private BigDecimal ratio;
+    private Integer preservable;
+    @TableField("binding_acq")
+    private Integer bindingAcq;
+    @TableField("updated_by")
+    private Long updatedBy;
+    @TableField("update_time")
+    private LocalDateTime updateTime;
+    @TableField("created_by")
+    private Long createdBy;
+    @TableField("create_time")
+    private LocalDateTime createTime;
+}

+ 44 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/domain/EmsEnergyItemCode.java

@@ -0,0 +1,44 @@
+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;
+
+/**
+ * 能源分项编码(leo.ems_energy_item_code),用于能源类型列表
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("ems_energy_item_code")
+public class EmsEnergyItemCode implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    private String code;
+    @TableField("parent_code")
+    private String parentCode;
+    private String unit;
+    @TableField("unit_name")
+    private String unitName;
+    private String name;
+    private String identifier;
+    @TableField("energy_type")
+    private Integer energyType;
+    @TableField("updated_by")
+    private Long updatedBy;
+    @TableField("update_time")
+    private LocalDateTime updateTime;
+    @TableField("created_by")
+    private Long createdBy;
+    @TableField("create_time")
+    private LocalDateTime createTime;
+}

+ 64 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/domain/EmsGateway.java

@@ -0,0 +1,64 @@
+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;
+
+/**
+ * 网关(leo.ems_gateway)
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("ems_gateway")
+public class EmsGateway implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.INPUT)
+    private String id;
+
+    @TableField("project_id")
+    private Long projectId;
+    private String name;
+    @TableField("space_id")
+    private Long spaceId;
+    private String version;
+    private String type;
+    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("data_center_id")
+    private Long dataCenterId;
+    private String iccid;
+    private Integer rssi;
+    @TableField("secret_key")
+    private String secretKey;
+    @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;
+}

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

@@ -0,0 +1,71 @@
+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.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 项目(leo.ems_project)
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("ems_project")
+public class EmsProject implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @TableField("space_id")
+    private Long spaceId;
+    private String name;
+    @TableField("platform_name")
+    private String platformName;
+    private String abbreviation;
+    private BigDecimal area;
+    @TableField("common_area")
+    private BigDecimal commonArea;
+    @TableField("air_conditioned_area")
+    private BigDecimal airConditionedArea;
+    @TableField("resident_population")
+    private Integer residentPopulation;
+    @TableField("province_code")
+    private String provinceCode;
+    @TableField("province_name")
+    private String provinceName;
+    @TableField("city_code")
+    private String cityCode;
+    @TableField("city_name")
+    private String cityName;
+    @TableField("district_code")
+    private String districtCode;
+    @TableField("district_name")
+    private String districtName;
+    private String location;
+    private String address;
+    @TableField("type_id")
+    private Integer typeId;
+    @TableField("type_name")
+    private String typeName;
+    private String image;
+    private String introduction;
+    private String logo;
+    @TableField("logo_min")
+    private String logoMin;
+    @TableField("updated_by")
+    private Long updatedBy;
+    @TableField("update_time")
+    private LocalDateTime updateTime;
+    @TableField("created_by")
+    private Long createdBy;
+    @TableField("create_time")
+    private LocalDateTime createTime;
+}

+ 45 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/domain/EmsSpace.java

@@ -0,0 +1,45 @@
+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;
+
+/**
+ * 空间(leo.ems_space)
+ * 空间类型:1项目 2区域 3建筑 4楼层 5房间
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("ems_space")
+public class EmsSpace 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;
+}

+ 46 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/domain/EmsSpaceArea.java

@@ -0,0 +1,46 @@
+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.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 区域(leo.ems_space_area)
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("ems_space_area")
+public class EmsSpaceArea implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @TableField("space_id")
+    private Long spaceId;
+    private String name;
+    private Integer type;
+    private BigDecimal area;
+    @TableField("common_area")
+    private BigDecimal commonArea;
+    @TableField("air_conditioned_area")
+    private BigDecimal airConditionedArea;
+    @TableField("resident_population")
+    private Integer residentPopulation;
+    @TableField("updated_by")
+    private Long updatedBy;
+    @TableField("update_time")
+    private LocalDateTime updateTime;
+    @TableField("created_by")
+    private Long createdBy;
+    @TableField("create_time")
+    private LocalDateTime createTime;
+}

+ 67 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/domain/EmsSpaceBuilding.java

@@ -0,0 +1,67 @@
+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.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 建筑(leo.ems_space_building)
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("ems_space_building")
+public class EmsSpaceBuilding implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @TableField("space_id")
+    private Long spaceId;
+    private String name;
+    private BigDecimal area;
+    @TableField("common_area")
+    private BigDecimal commonArea;
+    @TableField("air_conditioned_area")
+    private BigDecimal airConditionedArea;
+    @TableField("resident_population")
+    private Integer residentPopulation;
+    @TableField("province_code")
+    private String provinceCode;
+    @TableField("province_name")
+    private String provinceName;
+    @TableField("city_code")
+    private String cityCode;
+    @TableField("city_name")
+    private String cityName;
+    @TableField("district_code")
+    private String districtCode;
+    @TableField("district_name")
+    private String districtName;
+    private String location;
+    private String address;
+    private Integer floor;
+    private BigDecimal height;
+    @TableField("type_id")
+    private Integer typeId;
+    @TableField("type_name")
+    private String typeName;
+    private String image;
+    private String introduction;
+    @TableField("updated_by")
+    private Long updatedBy;
+    @TableField("update_time")
+    private LocalDateTime updateTime;
+    @TableField("created_by")
+    private Long createdBy;
+    @TableField("create_time")
+    private LocalDateTime createTime;
+}

+ 45 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/domain/EmsSpaceFloor.java

@@ -0,0 +1,45 @@
+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.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 楼层(leo.ems_space_floor)
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("ems_space_floor")
+public class EmsSpaceFloor implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @TableField("space_id")
+    private Long spaceId;
+    private String name;
+    private BigDecimal area;
+    @TableField("common_area")
+    private BigDecimal commonArea;
+    @TableField("air_conditioned_area")
+    private BigDecimal airConditionedArea;
+    @TableField("resident_population")
+    private Integer residentPopulation;
+    @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/EmsChannelMapper.java

@@ -0,0 +1,10 @@
+package com.usky.ems.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.ems.domain.EmsChannel;
+
+/**
+ * 通道 Mapper(leo.ems_channel)
+ */
+public interface EmsChannelMapper extends CrudMapper<EmsChannel> {
+}

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

@@ -0,0 +1,10 @@
+package com.usky.ems.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.ems.domain.EmsDeviceFunction;
+
+/**
+ * 设备功能/属性点位 Mapper(leo.ems_device_function)
+ */
+public interface EmsDeviceFunctionMapper extends CrudMapper<EmsDeviceFunction> {
+}

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

@@ -0,0 +1,10 @@
+package com.usky.ems.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.ems.domain.EmsDevice;
+
+/**
+ * 设备 Mapper(leo.ems_device)
+ */
+public interface EmsDeviceMapper extends CrudMapper<EmsDevice> {
+}

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

@@ -0,0 +1,10 @@
+package com.usky.ems.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.ems.domain.EmsEnergyItemCode;
+
+/**
+ * 能源分项编码 Mapper(leo.ems_energy_item_code)
+ */
+public interface EmsEnergyItemCodeMapper extends CrudMapper<EmsEnergyItemCode> {
+}

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

@@ -0,0 +1,10 @@
+package com.usky.ems.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.ems.domain.EmsGateway;
+
+/**
+ * 网关 Mapper(leo.ems_gateway)
+ */
+public interface EmsGatewayMapper extends CrudMapper<EmsGateway> {
+}

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

@@ -0,0 +1,10 @@
+package com.usky.ems.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.ems.domain.EmsProject;
+
+/**
+ * 项目 Mapper(leo.ems_project)
+ */
+public interface EmsProjectMapper extends CrudMapper<EmsProject> {
+}

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

@@ -0,0 +1,10 @@
+package com.usky.ems.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.ems.domain.EmsSpaceArea;
+
+/**
+ * 区域 Mapper(leo.ems_space_area)
+ */
+public interface EmsSpaceAreaMapper extends CrudMapper<EmsSpaceArea> {
+}

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

@@ -0,0 +1,10 @@
+package com.usky.ems.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.ems.domain.EmsSpaceBuilding;
+
+/**
+ * 建筑 Mapper(leo.ems_space_building)
+ */
+public interface EmsSpaceBuildingMapper extends CrudMapper<EmsSpaceBuilding> {
+}

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

@@ -0,0 +1,10 @@
+package com.usky.ems.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.ems.domain.EmsSpaceFloor;
+
+/**
+ * 楼层 Mapper(leo.ems_space_floor)
+ */
+public interface EmsSpaceFloorMapper extends CrudMapper<EmsSpaceFloor> {
+}

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

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

+ 22 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/service/EmsGatewayQueryService.java

@@ -0,0 +1,22 @@
+package com.usky.ems.service;
+
+import com.usky.common.core.bean.CommonPage;
+import com.usky.ems.service.vo.EmsGatewayDetailResponse;
+import com.usky.ems.service.vo.EmsGatewayListItem;
+import com.usky.ems.service.vo.EmsGatewayPageRequest;
+
+/**
+ * 网关列表与详情查询服务
+ */
+public interface EmsGatewayQueryService {
+
+    /**
+     * 分页查询网关列表
+     */
+    CommonPage<EmsGatewayListItem> listGateways(EmsGatewayPageRequest request);
+
+    /**
+     * 网关详情
+     */
+    EmsGatewayDetailResponse getGatewayById(String id);
+}

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

@@ -0,0 +1,72 @@
+package com.usky.ems.service;
+
+import com.usky.ems.service.vo.EmsEnergyTypeVO;
+import com.usky.ems.service.vo.EmsModelSaveRequest;
+import com.usky.ems.service.vo.EmsStructureTreeNode;
+
+import java.util.List;
+
+/**
+ * 基础建模服务(model:结构树、能源类型、建筑/区域/楼层/网关/通道/设备/属性点位)
+ */
+public interface EmsModelService {
+
+    /**
+     * 获取项目层级树(建筑、区域、楼层、网关)
+     */
+    EmsStructureTreeNode getStructureTree(Long projectId, Boolean includeGateway);
+
+    /**
+     * 能源类型列表(电、水、气)
+     */
+    List<EmsEnergyTypeVO> getEnergyTypeList();
+
+    /** 建筑:新增 */
+    Long createBuilding(EmsModelSaveRequest request);
+    /** 建筑:编辑 */
+    void updateBuilding(Long id, EmsModelSaveRequest request);
+    /** 建筑:删除 */
+    void deleteBuilding(Long id);
+
+    /** 区域:新增 */
+    Long createRegion(EmsModelSaveRequest request);
+    /** 区域:编辑 */
+    void updateRegion(Long id, EmsModelSaveRequest request);
+    /** 区域:删除 */
+    void deleteRegion(Long id);
+
+    /** 楼层:新增 */
+    Long createFloor(EmsModelSaveRequest request);
+    /** 楼层:编辑 */
+    void updateFloor(Long id, EmsModelSaveRequest request);
+    /** 楼层:删除 */
+    void deleteFloor(Long id);
+
+    /** 网关:新增 */
+    String createGateway(EmsModelSaveRequest request);
+    /** 网关:编辑 */
+    void updateGateway(String id, EmsModelSaveRequest request);
+    /** 网关:删除 */
+    void deleteGateway(String id);
+
+    /** 通道:新增 */
+    Long createChannel(EmsModelSaveRequest request);
+    /** 通道:编辑 */
+    void updateChannel(Long id, EmsModelSaveRequest request);
+    /** 通道:删除 */
+    void deleteChannel(Long id);
+
+    /** 设备:新增 */
+    String createDevice(EmsModelSaveRequest request);
+    /** 设备:编辑 */
+    void updateDevice(String id, EmsModelSaveRequest request);
+    /** 设备:删除 */
+    void deleteDevice(String id);
+
+    /** 属性点位:新增 */
+    Long createAttributePoint(EmsModelSaveRequest request);
+    /** 属性点位:编辑 */
+    void updateAttributePoint(Long id, EmsModelSaveRequest request);
+    /** 属性点位:删除 */
+    void deleteAttributePoint(Long id);
+}

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

@@ -0,0 +1,20 @@
+package com.usky.ems.service;
+
+import com.usky.ems.service.vo.EmsProjectResponse;
+import com.usky.ems.service.vo.EmsSummaryResponse;
+
+/**
+ * 能源总览服务(overview)
+ */
+public interface EmsOverviewService {
+
+    /**
+     * 获取项目信息(当前项目或指定 projectId)
+     */
+    EmsProjectResponse getProject(Long projectId);
+
+    /**
+     * 获取项目数据概括(时间维度联动)
+     */
+    EmsSummaryResponse getSummary(Long projectId, String timeDimension, String timeValue);
+}

+ 87 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/service/impl/EmsGatewayQueryServiceImpl.java

@@ -0,0 +1,87 @@
+package com.usky.ems.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.ems.domain.EmsGateway;
+import com.usky.ems.mapper.EmsGatewayMapper;
+import com.usky.ems.mapper.EmsSpaceMapper;
+import com.usky.ems.service.EmsGatewayQueryService;
+import com.usky.ems.service.vo.EmsGatewayDetailResponse;
+import com.usky.ems.service.vo.EmsGatewayListItem;
+import com.usky.ems.service.vo.EmsGatewayPageRequest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 网关列表与详情查询服务实现
+ */
+@Service
+public class EmsGatewayQueryServiceImpl implements EmsGatewayQueryService {
+
+    @Autowired
+    private EmsGatewayMapper emsGatewayMapper;
+    @Autowired
+    private EmsSpaceMapper emsSpaceMapper;
+
+    @Override
+    public CommonPage<EmsGatewayListItem> listGateways(EmsGatewayPageRequest request) {
+        int current = request.getCurrent() == null ? 1 : request.getCurrent();
+        int size = request.getSize() == null ? 10 : request.getSize();
+        Page<EmsGateway> p = new Page<>(current, size);
+        LambdaQueryWrapper<EmsGateway> q = new LambdaQueryWrapper<>();
+        if (request.getCommunicationStatus() != null) {
+            q.eq(EmsGateway::getCommStatus, request.getCommunicationStatus());
+        }
+        if (StringUtils.hasText(request.getName())) {
+            q.like(EmsGateway::getName, request.getName());
+        }
+        if (StringUtils.hasText(request.getCode())) {
+            q.eq(EmsGateway::getId, request.getCode());
+        }
+        Page<EmsGateway> page = emsGatewayMapper.selectPage(p, q);
+        List<EmsGatewayListItem> list = page.getRecords().stream().map(this::toListItem).collect(Collectors.toList());
+        return new CommonPage<>(list, page.getTotal(), size, current);
+    }
+
+    @Override
+    public EmsGatewayDetailResponse getGatewayById(String id) {
+        EmsGateway g = emsGatewayMapper.selectById(id);
+        if (g == null) return null;
+        EmsGatewayDetailResponse resp = new EmsGatewayDetailResponse();
+        resp.setId(g.getId());
+        resp.setName(g.getName());
+        resp.setSpaceId(g.getSpaceId());
+        resp.setCommunicationStatus(g.getCommStatus());
+        resp.setOnlineTime(g.getOnlineTime());
+        resp.setCreateTime(g.getCreateTime());
+        resp.setUpdateTime(g.getUpdateTime());
+        if (g.getSpaceId() != null) {
+            com.usky.ems.domain.EmsSpace space = emsSpaceMapper.selectById(g.getSpaceId());
+            if (space != null) {
+                resp.setFloorName(space.getName());
+            }
+        }
+        return resp;
+    }
+
+    private EmsGatewayListItem toListItem(EmsGateway g) {
+        EmsGatewayListItem item = new EmsGatewayListItem();
+        item.setId(g.getId());
+        item.setName(g.getName());
+        item.setSpaceId(g.getSpaceId());
+        item.setCommunicationStatus(g.getCommStatus());
+        item.setOnlineTime(g.getOnlineTime());
+        item.setCreateTime(g.getCreateTime());
+        item.setUpdateTime(g.getUpdateTime());
+        if (g.getSpaceId() != null) {
+            com.usky.ems.domain.EmsSpace space = emsSpaceMapper.selectById(g.getSpaceId());
+            if (space != null) item.setFloorName(space.getName());
+        }
+        return item;
+    }
+}

+ 401 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/service/impl/EmsModelServiceImpl.java

@@ -0,0 +1,401 @@
+package com.usky.ems.service.impl;
+
+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.EmsEnergyTypeVO;
+import com.usky.ems.service.vo.EmsModelSaveRequest;
+import com.usky.ems.service.vo.EmsStructureTreeNode;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+
+/**
+ * 基础建模服务实现(结构树、能源类型、建筑/区域/楼层/网关/通道/设备/属性点位 CRUD)
+ */
+@Service
+public class EmsModelServiceImpl implements EmsModelService {
+
+    @Autowired
+    private EmsProjectMapper emsProjectMapper;
+    @Autowired
+    private EmsSpaceMapper emsSpaceMapper;
+    @Autowired
+    private EmsSpaceBuildingMapper emsSpaceBuildingMapper;
+    @Autowired
+    private EmsSpaceAreaMapper emsSpaceAreaMapper;
+    @Autowired
+    private EmsSpaceFloorMapper emsSpaceFloorMapper;
+    @Autowired
+    private EmsGatewayMapper emsGatewayMapper;
+    @Autowired
+    private EmsChannelMapper emsChannelMapper;
+    @Autowired
+    private EmsDeviceMapper emsDeviceMapper;
+    @Autowired
+    private EmsDeviceFunctionMapper emsDeviceFunctionMapper;
+    @Autowired
+    private EmsEnergyItemCodeMapper emsEnergyItemCodeMapper;
+
+    private static final int SPACE_TYPE_PROJECT = 1;
+    private static final int SPACE_TYPE_REGION = 2;
+    private static final int SPACE_TYPE_BUILDING = 3;
+    private static final int SPACE_TYPE_FLOOR = 4;
+    private static final int SPACE_TYPE_ROOM = 5;
+
+    private EmsProject firstProject() {
+        List<EmsProject> list = emsProjectMapper.selectList(null);
+        return list.isEmpty() ? null : list.get(0);
+    }
+
+    @Override
+    public EmsStructureTreeNode getStructureTree(Long projectId, Boolean includeGateway) {
+        EmsProject project = projectId != null ? emsProjectMapper.selectById(projectId) : firstProject();
+        if (project == null) {
+            return null;
+        }
+        EmsStructureTreeNode root = new EmsStructureTreeNode();
+        root.setId(project.getId());
+        root.setName(project.getName());
+        root.setType("project");
+        root.setChildren(buildSpaceChildren(project.getSpaceId(), includeGateway == null || includeGateway));
+        return root;
+    }
+
+    private List<EmsStructureTreeNode> buildSpaceChildren(Long parentId, boolean includeGateway) {
+        if (parentId == null) return Collections.emptyList();
+        List<EmsSpace> list = emsSpaceMapper.selectList(new LambdaQueryWrapper<EmsSpace>().eq(EmsSpace::getParentId, parentId));
+        List<EmsStructureTreeNode> children = new ArrayList<>();
+        for (EmsSpace s : list) {
+            EmsStructureTreeNode node = new EmsStructureTreeNode();
+            node.setId(s.getId());
+            node.setName(s.getName());
+            if (s.getType() == SPACE_TYPE_BUILDING) {
+                node.setType("building");
+                EmsSpaceBuilding b = emsSpaceBuildingMapper.selectOne(new LambdaQueryWrapper<EmsSpaceBuilding>().eq(EmsSpaceBuilding::getSpaceId, s.getId()));
+                if (b != null) node.setName(b.getName());
+            } else if (s.getType() == SPACE_TYPE_REGION) {
+                node.setType("region");
+                EmsSpaceArea a = emsSpaceAreaMapper.selectOne(new LambdaQueryWrapper<EmsSpaceArea>().eq(EmsSpaceArea::getSpaceId, s.getId()));
+                if (a != null) node.setName(a.getName());
+            } else if (s.getType() == SPACE_TYPE_FLOOR) {
+                node.setType("floor");
+                EmsSpaceFloor f = emsSpaceFloorMapper.selectOne(new LambdaQueryWrapper<EmsSpaceFloor>().eq(EmsSpaceFloor::getSpaceId, s.getId()));
+                if (f != null) node.setName(f.getName());
+            } else {
+                node.setType("space");
+            }
+            List<EmsStructureTreeNode> sub = buildSpaceChildren(s.getId(), includeGateway);
+            if (includeGateway && (s.getType() == SPACE_TYPE_FLOOR || s.getType() == SPACE_TYPE_ROOM)) {
+                List<EmsGateway> gateways = emsGatewayMapper.selectList(new LambdaQueryWrapper<EmsGateway>().eq(EmsGateway::getSpaceId, s.getId()));
+                for (EmsGateway g : gateways) {
+                    EmsStructureTreeNode gw = new EmsStructureTreeNode();
+                    gw.setId(g.getId());
+                    gw.setName(g.getName());
+                    gw.setType("gateway");
+                    sub.add(gw);
+                }
+            }
+            node.setChildren(sub);
+            children.add(node);
+        }
+        return children;
+    }
+
+    @Override
+    public List<EmsEnergyTypeVO> getEnergyTypeList() {
+        String[] names = {"", "电", "水", "气"};
+        String[] codes = {"", "electric", "water", "gas"};
+        String[] units = {"", "kWh", "m³", "m³"};
+        List<EmsEnergyTypeVO> result = new ArrayList<>();
+        for (int i = 1; i <= 3; i++) {
+            EmsEnergyTypeVO vo = new EmsEnergyTypeVO();
+            vo.setId((long) i);
+            vo.setName(names[i]);
+            vo.setCode(codes[i]);
+            vo.setUnit(units[i]);
+            vo.setSortOrder(i - 1);
+            result.add(vo);
+        }
+        return result;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Long createBuilding(EmsModelSaveRequest request) {
+        Long projectId = request.getProjectId();
+        String name = request.getName();
+        EmsProject project = projectId != null ? emsProjectMapper.selectById(projectId) : firstProject();
+        if (project == null) return null;
+        EmsSpace space = new EmsSpace();
+        space.setName(name);
+        space.setParentId(project.getSpaceId());
+        space.setType(SPACE_TYPE_BUILDING);
+        space.setRootId(project.getSpaceId());
+        emsSpaceMapper.insert(space);
+        EmsSpaceBuilding building = new EmsSpaceBuilding();
+        building.setSpaceId(space.getId());
+        building.setName(name);
+        emsSpaceBuildingMapper.insert(building);
+        return space.getId();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateBuilding(Long id, EmsModelSaveRequest request) {
+        String name = request.getName();
+        EmsSpace space = emsSpaceMapper.selectById(id);
+        if (space != null && name != null) {
+            space.setName(name);
+            emsSpaceMapper.updateById(space);
+        }
+        EmsSpaceBuilding b = emsSpaceBuildingMapper.selectOne(new LambdaQueryWrapper<EmsSpaceBuilding>().eq(EmsSpaceBuilding::getSpaceId, id));
+        if (b != null && name != null) {
+            b.setName(name);
+            emsSpaceBuildingMapper.updateById(b);
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void deleteBuilding(Long id) {
+        emsSpaceBuildingMapper.delete(new LambdaQueryWrapper<EmsSpaceBuilding>().eq(EmsSpaceBuilding::getSpaceId, id));
+        emsSpaceMapper.deleteById(id);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Long createRegion(EmsModelSaveRequest request) {
+        Long buildingId = request.getBuildingId();
+        String name = request.getName();
+        EmsSpace space = new EmsSpace();
+        space.setName(name);
+        space.setParentId(buildingId);
+        EmsSpace parent = emsSpaceMapper.selectById(buildingId);
+        space.setRootId(parent != null ? parent.getRootId() : buildingId);
+        space.setType(SPACE_TYPE_REGION);
+        emsSpaceMapper.insert(space);
+        EmsSpaceArea area = new EmsSpaceArea();
+        area.setSpaceId(space.getId());
+        area.setName(name);
+        if (request.getArea() != null) area.setArea(request.getArea());
+        return space.getId();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateRegion(Long id, EmsModelSaveRequest request) {
+        String name = request.getName();
+        EmsSpace space = emsSpaceMapper.selectById(id);
+        if (space != null && name != null) {
+            space.setName(name);
+            emsSpaceMapper.updateById(space);
+        }
+        EmsSpaceArea a = emsSpaceAreaMapper.selectOne(new LambdaQueryWrapper<EmsSpaceArea>().eq(EmsSpaceArea::getSpaceId, id));
+        if (a != null) {
+            if (name != null) a.setName(name);
+            if (request.getArea() != null) a.setArea(request.getArea());
+            emsSpaceAreaMapper.updateById(a);
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void deleteRegion(Long id) {
+        emsSpaceAreaMapper.delete(new LambdaQueryWrapper<EmsSpaceArea>().eq(EmsSpaceArea::getSpaceId, id));
+        emsSpaceMapper.deleteById(id);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Long createFloor(EmsModelSaveRequest request) {
+        Long regionId = request.getRegionId();
+        String name = request.getName();
+        EmsSpace space = new EmsSpace();
+        space.setName(name);
+        space.setParentId(regionId);
+        EmsSpace parent = emsSpaceMapper.selectById(regionId);
+        space.setRootId(parent != null ? parent.getRootId() : regionId);
+        space.setType(SPACE_TYPE_FLOOR);
+        emsSpaceMapper.insert(space);
+        EmsSpaceFloor floor = new EmsSpaceFloor();
+        floor.setSpaceId(space.getId());
+        floor.setName(name);
+        emsSpaceFloorMapper.insert(floor);
+        return space.getId();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateFloor(Long id, EmsModelSaveRequest request) {
+        String name = request.getName();
+        EmsSpace space = emsSpaceMapper.selectById(id);
+        if (space != null && name != null) {
+            space.setName(name);
+            emsSpaceMapper.updateById(space);
+        }
+        EmsSpaceFloor f = emsSpaceFloorMapper.selectOne(new LambdaQueryWrapper<EmsSpaceFloor>().eq(EmsSpaceFloor::getSpaceId, id));
+        if (f != null && name != null) {
+            f.setName(name);
+            emsSpaceFloorMapper.updateById(f);
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void deleteFloor(Long id) {
+        emsSpaceFloorMapper.delete(new LambdaQueryWrapper<EmsSpaceFloor>().eq(EmsSpaceFloor::getSpaceId, id));
+        emsSpaceMapper.deleteById(id);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String createGateway(EmsModelSaveRequest request) {
+        Long floorId = request.getFloorId();
+        String name = request.getName();
+        String gwId = "GW" + System.currentTimeMillis();
+        if (gwId.length() > 13) gwId = gwId.substring(0, 13);
+        EmsGateway g = new EmsGateway();
+        g.setId(gwId);
+        g.setName(name);
+        g.setSpaceId(floorId);
+        g.setProjectId(0L);
+        EmsSpace space = floorId != null ? emsSpaceMapper.selectById(floorId) : null;
+        if (space != null) {
+            EmsProject p = firstProject();
+            if (p != null) g.setProjectId(p.getId());
+        }
+        g.setCommStatus(0);
+        g.setDataCenterId(0L);
+        g.setSecretKey("");
+        g.setVirtualDevice(0);
+        emsGatewayMapper.insert(g);
+        return g.getId();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateGateway(String id, EmsModelSaveRequest request) {
+        EmsGateway g = emsGatewayMapper.selectById(id);
+        if (g == null) return;
+        if (request.getName() != null) g.setName(request.getName());
+        if (request.getFloorId() != null) g.setSpaceId(request.getFloorId());
+        emsGatewayMapper.updateById(g);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void deleteGateway(String id) {
+        emsGatewayMapper.deleteById(id);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Long createChannel(EmsModelSaveRequest request) {
+        String gatewayId = request.getGatewayId();
+        String name = request.getName();
+        EmsChannel c = new EmsChannel();
+        c.setGatewayId(gatewayId);
+        c.setName(name);
+        c.setChannelTypeId(1);
+        emsChannelMapper.insert(c);
+        return c.getId();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateChannel(Long id, EmsModelSaveRequest request) {
+        EmsChannel c = emsChannelMapper.selectById(id);
+        if (c == null) return;
+        if (request.getName() != null) c.setName(request.getName());
+        if (request.getGatewayId() != null) c.setGatewayId(request.getGatewayId());
+        emsChannelMapper.updateById(c);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void deleteChannel(Long id) {
+        emsChannelMapper.deleteById(id);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String createDevice(EmsModelSaveRequest request) {
+        Long channelId = request.getChannelId();
+        String name = request.getName();
+        String devId = "DV" + System.currentTimeMillis();
+        if (devId.length() > 13) devId = devId.substring(0, 13);
+        EmsDevice d = new EmsDevice();
+        d.setId(devId);
+        d.setName(name);
+        d.setProjectId(0L);
+        d.setChannelId(channelId != null ? channelId : 0L);
+        d.setGatewayId("");
+        EmsChannel ch = channelId != null ? emsChannelMapper.selectById(channelId) : null;
+        if (ch != null) d.setGatewayId(ch.getGatewayId());
+        d.setProductId(0L);
+        d.setInstallationLocation(0L);
+        d.setMonitoringLocation(0L);
+        d.setCommAddress("");
+        d.setVirtualDevice(0);
+        d.setFocus(0);
+        d.setDeviceSystem(0);
+        d.setStatus(1);
+        d.setCommStatus(0);
+        emsDeviceMapper.insert(d);
+        return d.getId();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateDevice(String id, EmsModelSaveRequest request) {
+        EmsDevice d = emsDeviceMapper.selectById(id);
+        if (d == null) return;
+        if (request.getName() != null) d.setName(request.getName());
+        if (request.getChannelId() != null) d.setChannelId(request.getChannelId());
+        emsDeviceMapper.updateById(d);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void deleteDevice(String id) {
+        emsDeviceMapper.deleteById(id);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Long createAttributePoint(EmsModelSaveRequest request) {
+        String deviceId = request.getDeviceId();
+        String name = request.getName();
+        String code = request.getCode();
+        EmsDeviceFunction f = new EmsDeviceFunction();
+        f.setDeviceId(deviceId);
+        f.setName(name);
+        f.setIdentifier(code != null ? code : name);
+        f.setProductId(0L);
+        f.setProductTemplateId(0L);
+        f.setPreservable(1);
+        f.setBindingAcq(0);
+        emsDeviceFunctionMapper.insert(f);
+        return f.getId();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateAttributePoint(Long id, EmsModelSaveRequest request) {
+        EmsDeviceFunction f = emsDeviceFunctionMapper.selectById(id);
+        if (f == null) return;
+        if (request.getName() != null) f.setName(request.getName());
+        if (request.getCode() != null) f.setIdentifier(request.getCode());
+        emsDeviceFunctionMapper.updateById(f);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void deleteAttributePoint(Long id) {
+        emsDeviceFunctionMapper.deleteById(id);
+    }
+}

+ 53 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/service/impl/EmsOverviewServiceImpl.java

@@ -0,0 +1,53 @@
+package com.usky.ems.service.impl;
+
+import com.usky.ems.domain.EmsProject;
+import com.usky.ems.mapper.EmsProjectMapper;
+import com.usky.ems.service.EmsOverviewService;
+import com.usky.ems.service.vo.EmsProjectResponse;
+import com.usky.ems.service.vo.EmsSummaryResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 能源总览服务实现
+ */
+@Service
+public class EmsOverviewServiceImpl implements EmsOverviewService {
+
+    @Autowired
+    private EmsProjectMapper emsProjectMapper;
+
+    @Override
+    public EmsProjectResponse getProject(Long projectId) {
+        EmsProject project;
+        if (projectId != null) {
+            project = emsProjectMapper.selectById(projectId);
+        } else {
+            List<EmsProject> list = emsProjectMapper.selectList(null);
+            project = list.isEmpty() ? null : list.get(0);
+        }
+        if (project == null) {
+            return null;
+        }
+        EmsProjectResponse resp = new EmsProjectResponse();
+        resp.setId(project.getId());
+        resp.setName(project.getName());
+        resp.setCode(project.getAbbreviation());
+        resp.setDescription(project.getIntroduction());
+        resp.setArea(project.getArea());
+        resp.setResidentPopulation(project.getResidentPopulation());
+        resp.setCreateTime(project.getCreateTime());
+        resp.setUpdateTime(project.getUpdateTime());
+        return resp;
+    }
+
+    @Override
+    public EmsSummaryResponse getSummary(Long projectId, String timeDimension, String timeValue) {
+        EmsSummaryResponse resp = new EmsSummaryResponse();
+        resp.setTimeDimension(timeDimension);
+        resp.setTimeValue(timeValue);
+        return resp;
+    }
+}

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

@@ -0,0 +1,16 @@
+package com.usky.ems.service.vo;
+
+import lombok.Data;
+
+/**
+ * 能源类型(电、水、气)
+ */
+@Data
+public class EmsEnergyTypeVO {
+
+    private Long id;
+    private String name;
+    private String code;
+    private String unit;
+    private Integer sortOrder;
+}

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

@@ -0,0 +1,24 @@
+package com.usky.ems.service.vo;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 网关详情响应
+ */
+@Data
+public class EmsGatewayDetailResponse {
+
+    private String id;
+    private String name;
+    private Long spaceId;
+    private String floorName;
+    private String regionName;
+    private String buildingName;
+    private String installLocation;
+    private Integer communicationStatus;
+    private LocalDateTime onlineTime;
+    private LocalDateTime createTime;
+    private LocalDateTime updateTime;
+}

+ 22 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/service/vo/EmsGatewayListItem.java

@@ -0,0 +1,22 @@
+package com.usky.ems.service.vo;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 网关列表项(字段与 leo.ems_gateway 对应)
+ */
+@Data
+public class EmsGatewayListItem {
+
+    private String id;
+    private String name;
+    private Long spaceId;
+    private String floorName;
+    private String installLocation;
+    private Integer communicationStatus;
+    private LocalDateTime onlineTime;
+    private LocalDateTime createTime;
+    private LocalDateTime updateTime;
+}

+ 21 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/service/vo/EmsGatewayPageRequest.java

@@ -0,0 +1,21 @@
+package com.usky.ems.service.vo;
+
+import lombok.Data;
+
+/**
+ * 网关列表分页请求
+ */
+@Data
+public class EmsGatewayPageRequest {
+
+    private Integer current = 1;
+    private Integer size = 10;
+    /** 安装位置(模糊) */
+    private String installLocation;
+    /** 网关名称(模糊) */
+    private String name;
+    /** 网关编码(模糊) */
+    private String code;
+    /** 通讯状态:0-离线 1-在线,不传为全部 */
+    private Integer communicationStatus;
+}

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

@@ -0,0 +1,16 @@
+package com.usky.ems.service.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 新增接口返回 id(Long 或 String 转 Object)
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class EmsIdResponse {
+
+    private Object id;
+}

+ 35 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/service/vo/EmsModelSaveRequest.java

@@ -0,0 +1,35 @@
+package com.usky.ems.service.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 基础建模 - 建筑/区域/楼层/网关/通道/设备/属性点位 新增与编辑请求(通用字段)
+ * 各接口按需使用部分字段
+ */
+@Data
+public class EmsModelSaveRequest {
+
+    private Long projectId;
+    private Long buildingId;
+    private Long regionId;
+    private Long floorId;
+    private String gatewayId;
+    private Long channelId;
+    private String deviceId;
+    private Long energyTypeId;
+
+    private String name;
+    private String code;
+    private BigDecimal area;
+    private Integer floorNumber;
+    private Integer sortOrder;
+    private String installLocation;
+    private String configJson;
+    private Integer channelNo;
+    private String model;
+    private String dataType;
+    private String unit;
+    private String pointAddress;
+}

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

@@ -0,0 +1,23 @@
+package com.usky.ems.service.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 项目信息响应(数据总览 - 获取项目信息)
+ * 字段名与 leo.ems_project 一致
+ */
+@Data
+public class EmsProjectResponse {
+
+    private Long id;
+    private String name;
+    private String code;
+    private String description;
+    private BigDecimal area;
+    private Integer residentPopulation;
+    private LocalDateTime createTime;
+    private LocalDateTime updateTime;
+}

+ 18 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/service/vo/EmsStructureTreeNode.java

@@ -0,0 +1,18 @@
+package com.usky.ems.service.vo;
+
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 项目结构树节点(建筑、区域、楼层、网关)
+ */
+@Data
+public class EmsStructureTreeNode {
+
+    private Object id;
+    private String name;
+    private String type;
+    private List<EmsStructureTreeNode> children = new ArrayList<>();
+}

+ 11 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/service/vo/EmsSummaryRequest.java

@@ -0,0 +1,11 @@
+package com.usky.ems.service.vo;
+
+import lombok.Data;
+
+@Data
+public class EmsSummaryRequest {
+
+    private Long projectId;
+    private String timeDimension;
+    private String timeValue;
+}

+ 20 - 0
service-ems/service-ems-biz/src/main/java/com/usky/ems/service/vo/EmsSummaryResponse.java

@@ -0,0 +1,20 @@
+package com.usky.ems.service.vo;
+
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 项目数据概括响应
+ */
+@Data
+public class EmsSummaryResponse {
+
+    private String timeDimension;
+    private String timeValue;
+    private List<Object> categoryRatio = new ArrayList<>();
+    private List<Object> buildingRanking = new ArrayList<>();
+    private List<Object> usageTrend = new ArrayList<>();
+    private List<Object> subItemRatio = new ArrayList<>();
+}

+ 0 - 108
service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/MybatisGeneratorUtils.java

@@ -1,108 +0,0 @@
-package com.usky.sas.controller.web;//package com.usky.iot.controller;//package com.usky.dm.controller.web.business;//package com.usky.dm.controller.web;
-
-
-import com.baomidou.mybatisplus.core.toolkit.StringPool;
-import com.baomidou.mybatisplus.generator.AutoGenerator;
-import com.baomidou.mybatisplus.generator.InjectionConfig;
-import com.baomidou.mybatisplus.generator.config.*;
-import com.baomidou.mybatisplus.generator.config.po.TableInfo;
-import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author yq
- * @date 2021/7/6 11:42
- */
-public class MybatisGeneratorUtils {
-    public static void main(String[] args) {
-
-            shell("service-sas","service-sas-biz");
-    }
-
-    private static void shell(String parentName,String model) {
-
-        AutoGenerator mpg = new AutoGenerator();
-        //1、全局配置
-        GlobalConfig gc = new GlobalConfig();
-//        File file = new File(model);
-//        String path = file.getAbsolutePath();
-        String projectPath = System.getProperty("user.dir");
-        projectPath+="/"+parentName;
-        projectPath+="/"+model;
-        gc.setOutputDir(projectPath+ "/src/main/java");  //生成路径(一般都是生成在此项目的src/main/java下面)
-        //修改为自己的名字
-        gc.setAuthor("fu"); //设置作者
-        gc.setOpen(false);
-        gc.setFileOverride(true); //第二次生成会把第一次生成的覆盖掉
-        gc.setServiceName("%sService"); //生成的service接口名字首字母是否为I,这样设置就没有
-        gc.setBaseResultMap(true); //生成resultMap
-        mpg.setGlobalConfig(gc);
-
-        //2、数据源配置
-        //修改数据源
-        DataSourceConfig dsc = new DataSourceConfig();
-        dsc.setUrl("jdbc:mysql://192.168.10.165:3306/usky-cloud?useUnicode=true&serverTimezone=GMT&useSSL=false&characterEncoding=utf8");
-        dsc.setDriverName("com.mysql.jdbc.Driver");
-        dsc.setUsername("root");
-        dsc.setPassword("yt123456");
-        mpg.setDataSource(dsc);
-
-        // 3、包配置
-        PackageConfig pc = new PackageConfig();
-        pc.setParent("com.usky.sas");
-        pc.setController("controller.web");
-        pc.setEntity("domain");
-        pc.setMapper("mapper");
-        pc.setService("service");
-        pc.setServiceImpl("service.impl");
-//        pc.setXml("mapper.demo");
-        //pc.setModuleName("test");
-        mpg.setPackageInfo(pc);
-
-        // 4、策略配置
-        StrategyConfig strategy = new StrategyConfig();
-        strategy.setNaming(NamingStrategy.underline_to_camel);
-        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
-        strategy.setSuperMapperClass("com.usky.common.mybatis.core.CrudMapper");
-        strategy.setSuperServiceClass("com.usky.common.mybatis.core.CrudService");
-        strategy.setSuperServiceImplClass("com.usky.common.mybatis.core.AbstractCrudService");
-        // strategy.setTablePrefix("t_"); // 表名前缀
-        strategy.setEntityLombokModel(true); //使用lombok
-        //修改自己想要生成的表
-        strategy.setInclude("sas_snap_type_code");  // 逆向工程使用的表   如果要生成多个,这里可以传入String[]
-        mpg.setStrategy(strategy);
-
-        // 关闭默认 xml 生成,调整生成 至 根目录
-        //修改对应的模块名称
-        TemplateConfig tc = new TemplateConfig();
-        // 自定义配置
-        InjectionConfig cfg = new InjectionConfig() {
-            @Override
-            public void initMap() {
-                // to do nothing
-            }
-        };
-        //如果模板引擎是 velocity
-        String templatePath = "/templates/mapper.xml.vm";
-        // 自定义输出配置
-        List<FileOutConfig> focList = new ArrayList<>();
-        // 自定义配置会被优先输出
-        String finalProjectPath = projectPath;
-        focList.add(new FileOutConfig(templatePath) {
-            @Override
-            public String outputFile(TableInfo tableInfo) {
-                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
-                return finalProjectPath + "/src/main/resources/mapper/sas" + "/"
-                        + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
-            }
-        });
-        cfg.setFileOutConfigList(focList);
-        mpg.setCfg(cfg);
-        tc.setXml(null);
-        mpg.setTemplate(tc);
-        //5、执行
-        mpg.execute();
-    }
-}

+ 2 - 4
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasMapServiceImpl.java

@@ -117,9 +117,8 @@ public class SasMapServiceImpl extends AbstractCrudService<SasMapsMapper, SasMap
             if (map.getBackImgId() != null && !map.getBackImgId().isEmpty()) {
                 SasPic backPic = sasPicMapper.selectById(map.getBackImgId());
                 if (backPic != null) {
-                    String baseUrl = protocol + "://" + GetIpUtils.getServerIP() + ":" + port;
                     String path = (backPic.getUrl() != null ? backPic.getUrl() : "") + (backPic.getPath() != null ? backPic.getPath() : "");
-                    item.setBackImgUrl(baseUrl + path);
+                    item.setBackImgUrl(path);
                 }
             }
 
@@ -145,9 +144,8 @@ public class SasMapServiceImpl extends AbstractCrudService<SasMapsMapper, SasMap
                 if (d.getImgId() != null && !d.getImgId().isEmpty()) {
                     SasPic imgPic = sasPicMapper.selectById(d.getImgId());
                     if (imgPic != null) {
-                        String baseUrl = protocol + "://" + GetIpUtils.getServerIP() + ":" + port;
                         String path = (imgPic.getUrl() != null ? imgPic.getUrl() : "") + (imgPic.getPath() != null ? imgPic.getPath() : "");
-                        di.setImgUrl(baseUrl + path);
+                        di.setImgUrl(path);
                     }
                 }
                 SasDevice device = sasDeviceMapper.selectById(d.getDeviceId());