|
|
@@ -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);
|
|
|
+ }
|
|
|
+}
|