Browse Source

添加部分空间关系接口

luoguangyi 3 years ago
parent
commit
7be109da58

+ 0 - 8
src/main/java/com/persagy/proxy/adm/controller/RelationShContainSpBaseController.java

@@ -3,28 +3,20 @@ package com.persagy.proxy.adm.controller;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
-import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.JsonNodeFactory;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.persagy.dmp.basic.dto.RequestData;
 import com.persagy.dmp.basic.model.QueryCriteria;
-import com.persagy.dmp.common.helper.SpringHelper;
 import com.persagy.dmp.digital.client.DigitalObjectFacade;
 import com.persagy.dmp.digital.entity.ObjectDigital;
 import com.persagy.dmp.digital.entity.ObjectRelation;
 import com.persagy.proxy.adm.constant.AdmCommonConstant;
-import com.persagy.proxy.adm.constant.AdmObjectType;
 import com.persagy.proxy.adm.constant.enums.AdmDictCategoryEnum;
 import com.persagy.proxy.adm.request.AdmResponse;
-import com.persagy.proxy.adm.service.IAdmDictService;
 import com.persagy.proxy.adm.service.IAdmRelationService;
 import com.persagy.proxy.common.client.DmpRwdClient;
-import com.persagy.proxy.common.entity.DmpResult;
 import com.persagy.proxy.common.entity.InstanceUrlParam;
 import com.persagy.proxy.common.entity.RelationDTO;
 import org.springframework.beans.factory.annotation.Autowired;

+ 139 - 0
src/main/java/com/persagy/proxy/adm/controller/RelationSpInBdOrFlController.java

@@ -0,0 +1,139 @@
+package com.persagy.proxy.adm.controller;
+
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.dmp.basic.model.QueryCriteria;
+import com.persagy.proxy.adm.constant.AdmCommonConstant;
+import com.persagy.proxy.adm.request.AdmResponse;
+import com.persagy.proxy.adm.service.IAdmRelationService;
+import com.persagy.proxy.common.client.DmpRwdClient;
+import com.persagy.proxy.common.entity.InstanceUrlParam;
+import com.persagy.proxy.common.entity.RelationDTO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @description:025、关系-业务空间所在的建筑楼层
+ * @author:lgy
+ * @data:2021/9/24 19:46
+ */
+@RestController
+@RequestMapping("/rel/sp-in")
+public class RelationSpInBdOrFlController {
+    @Autowired
+    private IAdmRelationService service;
+    @Autowired
+    DmpRwdClient rwdClient;
+    @Value("${middleware.group.code}")
+    private String groupCode;
+
+    /**
+     * 默认图类型
+     */
+    public static String DEFAULT_GRAPH_CODE = "ArchSubset";
+    /**
+     * 默认边类型
+     */
+    public static String DEFAULT_REL_CODE = "Bd2Sp";
+    /**
+     * 创建业务空间和建筑的关系
+     * @param param
+     * @return
+     * @throws Exception
+     */
+    @PostMapping(value = {"/bd-create"})
+    public AdmResponse spInBdCreate(@RequestParam("projectId") String projectId,
+                              @RequestBody JSONObject param) throws Exception {
+        String buildingId = param.getString("buildingId");
+        String spaceId = param.getString("spaceId");
+        String type = param.getString("objectType");
+        if(!StrUtil.isAllNotEmpty(buildingId,spaceId,type)) {
+            return AdmResponse.failure("必填项:buildingId(竖井id)、spaceId(业务空间id),objectType");
+        }
+        // 创建关系对象
+        List<RelationDTO> voList = new ArrayList<>();
+        voList.add(new RelationDTO(null, DEFAULT_GRAPH_CODE, DEFAULT_REL_CODE, type, buildingId , spaceId));
+        // 组装上下文条件
+        InstanceUrlParam context = new InstanceUrlParam(groupCode, null, projectId, AdmCommonConstant.APP_ID);
+        service.doSave(context, voList);
+        return AdmResponse.success();
+    }
+
+    /**
+     * 删除业务空间和建筑的关系
+     * @param    paramList    对象
+     * @return                       删除的结果信息
+     */
+    @PostMapping("/bd-del")
+    public AdmResponse delete(@RequestParam String projectId,
+                              @RequestBody JSONArray paramList) throws Exception {
+        // 组装上下文条件
+        InstanceUrlParam context = new InstanceUrlParam(groupCode, null, projectId, AdmCommonConstant.APP_ID);
+        for (int i = 0; i < paramList.size(); i++) {
+            JSONObject param = paramList.getJSONObject(i);
+            String buildingId = param.getString("buildingId");
+            String spaceId = param.getString("spaceId");
+            String type = param.getString("objectType");
+            if(!StrUtil.isAllNotEmpty(buildingId,spaceId)) {
+                return AdmResponse.failure("spaceId和buildingId 不可以为空");
+            }
+            ObjectNode node = JsonNodeFactory.instance.objectNode();
+            node.put("graphCode", DEFAULT_GRAPH_CODE);
+            node.put("relCode", DEFAULT_REL_CODE);
+            node.put("objFrom", buildingId);
+            node.put("objTo",spaceId);
+            QueryCriteria criteria = new QueryCriteria();
+            criteria.setCriteria(node);
+            service.doDelete(context, criteria);
+        }
+        return AdmResponse.success();
+    }
+
+    /**
+     * 修改业务空间所在的建筑
+     * @param    requestParam    对象
+     * @return                       删除的结果信息
+     */
+    @PostMapping("/bd-del")
+    public AdmResponse delete(@RequestParam String projectId,
+                              @RequestBody JSONObject requestParam) throws Exception {
+        JSONArray content = requestParam.getJSONArray("content");
+        for (int i = 0; i < content.size(); i++) {
+            JSONObject param = content.getJSONObject(i);
+            String buildingId = param.getString("buildingId");
+            String spaceId = param.getString("spaceId");
+            String type = param.getString("objectType");
+            if(!StrUtil.isAllNotEmpty(buildingId,spaceId,type)) {
+                return AdmResponse.failure("buildingId、spaceId、objectType 不能为空");
+            }
+        }
+        // 组装上下文条件
+        InstanceUrlParam context = new InstanceUrlParam(groupCode, null, projectId, AdmCommonConstant.APP_ID);
+        for (int i = 0; i < content.size(); i++) {
+            JSONObject param = content.getJSONObject(i);
+            String buildingId = param.getString("buildingId");
+            String spaceId = param.getString("spaceId");
+            String type = param.getString("objectType");
+            ObjectNode node = JsonNodeFactory.instance.objectNode();
+            node.put("graphCode", DEFAULT_GRAPH_CODE);
+            node.put("relCode", DEFAULT_REL_CODE);
+            node.put("objFrom", buildingId);
+            node.put("objTo",spaceId);
+            QueryCriteria criteria = new QueryCriteria();
+            criteria.setCriteria(node);
+            service.doDelete(context, criteria);
+            // 创建关系对象
+            List<RelationDTO> voList = new ArrayList<>();
+            voList.add(new RelationDTO(null, DEFAULT_GRAPH_CODE, DEFAULT_REL_CODE, type, buildingId , spaceId));
+            service.doSave(context, voList);
+        }
+        return AdmResponse.success();
+    }
+}

+ 258 - 0
src/main/java/com/persagy/proxy/adm/controller/RelationSpaceConnectionController.java

@@ -0,0 +1,258 @@
+package com.persagy.proxy.adm.controller;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.dmp.basic.dto.RequestData;
+import com.persagy.dmp.basic.model.QueryCriteria;
+import com.persagy.dmp.digital.client.DigitalObjectFacade;
+import com.persagy.dmp.digital.entity.ObjectDigital;
+import com.persagy.dmp.digital.entity.ObjectRelation;
+import com.persagy.proxy.adm.constant.AdmCommonConstant;
+import com.persagy.proxy.adm.constant.enums.AdmDictCategoryEnum;
+import com.persagy.proxy.adm.request.AdmResponse;
+import com.persagy.proxy.adm.service.IAdmRelationService;
+import com.persagy.proxy.common.client.DmpRwdClient;
+import com.persagy.proxy.common.entity.InstanceUrlParam;
+import com.persagy.proxy.common.entity.RelationDTO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * @description:024、关系-空间关系
+ * @author:lgy
+ * @data:2021/9/24 11:53
+ */
+@RestController
+@RequestMapping("/rel/sp-rel")
+public class RelationSpaceConnectionController {
+
+    @Autowired
+    private IAdmRelationService service;
+    @Autowired
+    DmpRwdClient rwdClient;
+    @Value("${middleware.group.code}")
+    private String groupCode;
+
+//    //默认图类型 业务空间(同类)邻接关系
+//    public static final String DEFAULT_GRAPH_CODE = "SpaceNeighborhood";
+//    //None	空间隔断无门窗
+//    public static final String REL_CODE_NONE = "None";
+//    //Door	空间隔断有门
+//    public static final String REL_CODE_DOOR = "Door";
+//    //Window	空间隔断有窗
+//    public static final String REL_CODE_WINDOW = "Window";
+//    //DoorWindow	空间隔断有门窗
+//    public static final String REL_CODE_DOORWINDOW = "DoorWindow";
+//    //Connect	空间连通
+//    public static final String REL_CODE_CONNECT = "Connect";
+
+    /**
+     * 创创建邻接关系
+     * 图类型 GraphType:空间邻接关系 SpaceNeighborhood 建筑交通关系 TrafficNetwork  空气流通关系  ConvectionNetwork  光照辐射关系  RadiationNetwork
+     *
+     * @param param
+     * @return
+     * @throws Exception
+     */
+    @PostMapping(value = {"/space-neighborhood-Create"})
+    public AdmResponse spaceNeighborhood(@RequestParam("projectId") String projectId,
+                                         @RequestBody JSONObject param) throws Exception {
+        JSONArray contentList = param.getJSONArray("content");
+        for (int i = 0; i < contentList.size(); i++) {
+            JSONObject content = contentList.getJSONObject(i);
+            String spaceIdOne = content.getString("spaceIdOne");
+            String spaceIdTwo = content.getString("spaceIdTwo");
+            String graphType = content.getString("graphType");
+            String relType = content.getString("relType");
+            String zoneType = content.getString("zoneType");
+            if (!StrUtil.isAllNotEmpty(graphType, spaceIdTwo, spaceIdOne, relType)) {
+                return AdmResponse.failure("请检查数据的完整性");
+            }
+            if (StrUtil.isEmpty(zoneType)) {
+                QueryCriteria queryCriteria = new QueryCriteria();
+                ObjectNode criteria = JsonNodeFactory.instance.objectNode();
+                criteria.put("id", spaceIdOne);
+                queryCriteria.setCriteria(criteria);
+                List<ObjectNode> objectNodeList = DigitalObjectFacade.query(groupCode, projectId, AdmCommonConstant.APP_ID, null, queryCriteria);
+                if (CollUtil.isNotEmpty(objectNodeList)) {
+                    String classCode = objectNodeList.get(0).get("classCode").asText();
+                    content.put("zoneType", classCode);
+                }
+            }
+        }
+        // 组装上下文条件
+        InstanceUrlParam context = new InstanceUrlParam(groupCode, null, projectId, AdmCommonConstant.APP_ID);
+        for (int i = 0; i < contentList.size(); i++) {
+            JSONObject content = contentList.getJSONObject(i);
+            String spaceIdOne = content.getString("spaceIdOne");
+            String spaceIdTwo = content.getString("spaceIdTwo");
+            String graphType = content.getString("graphType");
+            String relType = content.getString("relType");
+            String zoneType = content.getString("zoneType");
+            QueryCriteria queryRequest = new QueryCriteria();
+            ObjectNode node = JsonNodeFactory.instance.objectNode();
+            node.put("graphCode", graphType);
+            node.put("relCode", relType);
+            node.put("relValue", zoneType);
+            node.put("objFrom", spaceIdOne);
+            node.put("objTo", spaceIdTwo);
+            queryRequest.setCriteria(node);
+            service.doDelete(context, queryRequest);
+            // 创建关系对象
+            List<RelationDTO> voList = new ArrayList<>();
+            voList.add(new RelationDTO(null, graphType, relType, zoneType, spaceIdOne, spaceIdTwo));
+            service.doSave(context, voList);
+        }
+        return AdmResponse.success();
+    }
+
+    /**
+     * 查询空间关系
+     * " 楼层id FloorId   图类型 GraphType:空间邻接关系 SpaceNeighborhood 建筑交通关系 TrafficNetwork  空气流通关系  ConvectionNetwork  光照辐射关系  RadiationNetwork ,边类型RelType
+     *
+     * @param param
+     * @return 创建的结果信息
+     */
+    @PostMapping("/space-neighborhood-query")
+    public AdmResponse spaceNeighborhoodQuery(@RequestParam("projectId") String projectId,
+                                              @RequestBody JSONObject param) throws Exception {
+        //原接口传入一个filter进行过滤,不清楚具体参数前无法兼容该接口
+        //TODO:
+        return AdmResponse.failure("不支持该接口");
+    }
+
+    /**
+     * 删除某一个关系
+     * 为了防止误删,边类型也改成了必填项
+     *
+     * @param paramList 对象
+     * @return 删除的结果信息
+     */
+    @PostMapping("/delete")
+    public AdmResponse delete(@RequestParam String projectId,
+                              @RequestBody JSONArray paramList) throws Exception {
+        if (CollUtil.isEmpty(paramList)) {
+            return AdmResponse.success();
+        }
+        for (int i = 0; i < paramList.size(); i++) {
+            JSONObject param = paramList.getJSONObject(i);
+            String spaceIdOne = param.getString("spaceIdOne");
+            String spaceIdTwo = param.getString("spaceIdTwo");
+            String graphType = param.getString("graphType");
+            String relType = param.getString("relType");
+            String zoneType = param.getString("zoneType");
+            if (!StrUtil.isAllNotEmpty(spaceIdOne, spaceIdTwo, graphType, relType, zoneType)) {
+                return AdmResponse.failure("必填: SpaceIdOne、SpaceIdTwo、GraphType、ZoneType、relType");
+            }
+        }
+        // 组装上下文条件
+        InstanceUrlParam context = new InstanceUrlParam(groupCode, null, projectId, AdmCommonConstant.APP_ID);
+        for (int i = 0; i < paramList.size(); i++) {
+            JSONObject param = paramList.getJSONObject(i);
+            String spaceIdOne = param.getString("spaceIdOne");
+            String spaceIdTwo = param.getString("spaceIdTwo");
+            String graphType = param.getString("graphType");
+            String relType = param.getString("relType");
+            String zoneType = param.getString("zoneType");
+            if (!StrUtil.isAllNotEmpty(spaceIdOne, spaceIdTwo, graphType, relType, zoneType)) {
+                return AdmResponse.failure("必填: SpaceIdOne、SpaceIdTwo、GraphType、ZoneType、relType");
+            }
+            QueryCriteria criteria = new QueryCriteria();
+            ObjectNode node = JsonNodeFactory.instance.objectNode();
+            node.put("graphCode", graphType);
+            node.put("relCode", relType);
+            node.put("relValue", zoneType);
+            node.put("objFrom", spaceIdOne);
+            node.put("objTo", spaceIdTwo);
+            criteria.setCriteria(node);
+            service.doDelete(context, criteria);
+            //无方向的关系应该只删除一次,下面的应该不需要,为了防止可能出现的有方向的关系,此处额外删除一次
+            ObjectNode node2 = JsonNodeFactory.instance.objectNode();
+            node2.put("graphCode", graphType);
+            node2.put("relCode", relType);
+            node2.put("relValue", zoneType);
+            node2.put("objFrom", spaceIdTwo);
+            node2.put("objTo", spaceIdOne);
+            criteria.setCriteria(node2);
+            service.doDelete(context, criteria);
+        }
+        return AdmResponse.success();
+    }
+
+    /**
+     * 清除某个楼层下的数据
+     *
+     * @param param 竖井和业务空间的关系对象
+     * @return 创建的结果信息
+     */
+    @PostMapping("/delete-floor")
+    public AdmResponse createSpshs(@RequestParam("projectId") String projectId,
+                                   @RequestBody JSONObject param) throws Exception {
+        String graphType = param.getString("graphType");
+        String relType = param.getString("relType");
+        String zoneType = param.getString("zoneType");
+        String floorId = param.getString("floorId");
+        if (!StrUtil.isAllNotEmpty(graphType, relType, zoneType, floorId)) {
+            return AdmResponse.failure("必填 graphType、floorId、ZoneType、relType");
+        }
+        InstanceUrlParam context = new InstanceUrlParam(groupCode, null, projectId, AdmCommonConstant.APP_ID);
+        RequestData requestData = RequestData.builder().classCode(zoneType).floorId(floorId).projectId(projectId).objType(AdmDictCategoryEnum.SPACE.getValue()).build();
+        //关系查询空间id
+        List<ObjectDigital> objectDigitals = DigitalObjectFacade.queryObjectListSuperiorId(groupCode, projectId, AdmCommonConstant.APP_ID, null, requestData);
+        //楼层、建筑、对象类查询的空间id
+        Set<String> spaceIdSet = objectDigitals.stream().map(ObjectDigital::getId).collect(Collectors.toSet());
+        HashMap<String, ObjectRelation> distinctMap = new HashMap<>(spaceIdSet.size());
+        for (String spaceId : spaceIdSet) {
+            QueryCriteria queryRequestTmp = new QueryCriteria();
+            ObjectNode nodeTmp = JsonNodeFactory.instance.objectNode();
+            nodeTmp.put("graphCode", graphType);
+            nodeTmp.put("relCode", relType);
+            nodeTmp.put("relValue", zoneType);
+            nodeTmp.put("objFrom", spaceId);
+            queryRequestTmp.setCriteria(nodeTmp);
+            //关系查询空间id
+            List<ObjectRelation> objectRelations = service.queryByCondition(context, queryRequestTmp);
+            for (ObjectRelation objectRelation : objectRelations) {
+                String key = StrUtil.format("{}_{}_{}_{}_{}", objectRelation.getGraphCode(), objectRelation.getRelCode(), objectRelation.getRelValue(), objectRelation.getObjFrom(), objectRelation.getObjTo());
+                distinctMap.put(key, objectRelation);
+            }
+            nodeTmp = JsonNodeFactory.instance.objectNode();
+            nodeTmp.put("graphCode", graphType);
+            nodeTmp.put("relCode", relType);
+            nodeTmp.put("relValue", zoneType);
+            nodeTmp.put("objTo",spaceId);
+            queryRequestTmp.setCriteria(nodeTmp);
+            //关系查询空间id
+            objectRelations = service.queryByCondition(context, queryRequestTmp);
+            for (ObjectRelation objectRelation : objectRelations) {
+                String key = StrUtil.format("{}_{}_{}_{}_{}", objectRelation.getGraphCode(), objectRelation.getRelCode(), objectRelation.getRelValue(), objectRelation.getObjFrom(), objectRelation.getObjTo());
+                distinctMap.put(key, objectRelation);
+            }
+        }
+        for (ObjectRelation objectRelation : distinctMap.values()) {
+            QueryCriteria queryRequest = new QueryCriteria();
+            ObjectNode node = JsonNodeFactory.instance.objectNode();
+            node.put("graphCode", objectRelation.getGraphCode());
+            node.put("relCode", objectRelation.getRelCode());
+            node.put("relValue", objectRelation.getRelValue());
+            node.put("objFrom", objectRelation.getObjFrom());
+            node.put("objTo", objectRelation.getObjTo());
+            queryRequest.setCriteria(node);
+            service.doDelete(context, queryRequest);
+        }
+        return AdmResponse.success();
+    }
+
+
+}

+ 200 - 0
src/main/java/com/persagy/proxy/adm/controller/RelationSyForBdController.java

@@ -0,0 +1,200 @@
+package com.persagy.proxy.adm.controller;
+
+
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.dmp.basic.model.QueryCriteria;
+import com.persagy.dmp.digital.entity.ObjectRelation;
+import com.persagy.proxy.adm.constant.AdmCommonConstant;
+import com.persagy.proxy.adm.request.AdmResponse;
+import com.persagy.proxy.adm.service.IAdmRelationService;
+import com.persagy.proxy.common.client.DmpRwdClient;
+import com.persagy.proxy.common.entity.InstanceUrlParam;
+import com.persagy.proxy.common.entity.RelationDTO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @description:026、关系-系统服务于建筑
+ * @author:lgy
+ * @data:2021/9/24 20:29
+ */
+@RestController
+@RequestMapping("/rel/sy-for-bd")
+public class RelationSyForBdController {
+    @Autowired
+    private IAdmRelationService service;
+    @Autowired
+    DmpRwdClient rwdClient;
+    @Value("${middleware.group.code}")
+    private String groupCode;
+
+    /**
+     * 默认图类型
+     */
+    public static String DEFAULT_GRAPH_CODE = "MechForArch";
+    /**
+     * 默认边类型
+     */
+    public static String DEFAULT_REL_CODE = "Sy2Bd";
+
+    /**
+     * 创建系统服务于建筑关系
+     * @param param
+     * @return
+     * @throws Exception
+     */
+    @PostMapping(value = {"/link"})
+    public AdmResponse create(@RequestParam("projectId") String projectId,
+                              @RequestBody JSONObject param) throws Exception {
+        String sysId = param.getString("sysId");
+        String buildingId = param.getString("buildingId");
+        if(!StrUtil.isAllNotEmpty(buildingId,sysId)) {
+            return AdmResponse.failure("必填项:SysId(系统id)、BuildingId(建筑id)");
+        }
+        // 创建关系对象
+        List<RelationDTO> voList = new ArrayList<>();
+        voList.add(new RelationDTO(null, DEFAULT_GRAPH_CODE, DEFAULT_REL_CODE, null, sysId , buildingId));
+        // 组装上下文条件
+        InstanceUrlParam context = new InstanceUrlParam(groupCode, null, projectId, AdmCommonConstant.APP_ID);
+        service.doSave(context, voList);
+        return AdmResponse.success();
+    }
+
+    /**
+     * 根据对象删除关系
+     * 根据对象删除系统服务于建筑的关系,只针对一个对象
+     * @param    param    对象
+     * @param   type                 空间类型
+     * @return                       删除的结果信息
+     */
+    @PostMapping("/unlink")
+    public AdmResponse delete(@RequestParam String projectId,
+                              @RequestParam(value = "type", required = false) String type,
+                              @RequestBody JSONObject param) throws Exception {
+        if(CollUtil.isEmpty(param)) {
+            return AdmResponse.success();
+        }
+        // 组装上下文条件
+        InstanceUrlParam context = new InstanceUrlParam(groupCode, null, projectId, AdmCommonConstant.APP_ID);
+        // 组装条件
+        QueryCriteria criteria = new QueryCriteria();
+        String sysId = param.getString("sysId");
+        String buildingId = param.getString("buildingId");
+        if(!StrUtil.isAllNotEmpty(buildingId,sysId)) {
+            return AdmResponse.failure("必填项:SysId(系统id)、BuildingId(建筑id)");
+        }
+        ObjectNode node = JsonNodeFactory.instance.objectNode();
+        node.put("graphCode", DEFAULT_GRAPH_CODE);
+        node.put("relCode", DEFAULT_REL_CODE);
+        node.put("objFrom", sysId);
+        node.put("objTo",buildingId);
+        criteria.setCriteria(node);
+        service.doDelete(context, criteria);
+        return AdmResponse.success();
+    }
+
+    /**
+     * 创建系统服务于建筑关系
+     * 系统服务于建筑,系统一对多
+     * @param   param
+     * @return                       创建的结果信息
+     */
+    @PostMapping("/link-shsps")
+    public AdmResponse createBd(@RequestParam("projectId") String projectId,
+                                   @RequestBody JSONObject param) throws Exception {
+        String sysId = param.getString("sysId");
+        JSONArray buildingIdList = param.getJSONArray("buildingIdList");
+        if(StrUtil.isBlank(sysId) || CollUtil.isEmpty(buildingIdList)) {
+            return AdmResponse.failure("必填项:BuildingIdList(建筑id列表)、SysId(系统id),测方法会覆盖以前的记录");
+        }
+        // 创建关系对象.先删除,后添加
+        InstanceUrlParam context = new InstanceUrlParam(groupCode, null, projectId, AdmCommonConstant.APP_ID);
+        QueryCriteria queryRequestTmp = new QueryCriteria();
+        ObjectNode nodeTmp = JsonNodeFactory.instance.objectNode();
+        nodeTmp.put("graphCode", DEFAULT_GRAPH_CODE);
+        nodeTmp.put("relCode", DEFAULT_REL_CODE);
+        nodeTmp.put("objFrom", sysId);
+        queryRequestTmp.setCriteria(nodeTmp);
+        //关系之前的关系,并且删除
+        List<ObjectRelation> objectRelations = service.queryByCondition(context, queryRequestTmp);
+        for (ObjectRelation objectRelation : objectRelations) {
+            QueryCriteria queryRequest = new QueryCriteria();
+            ObjectNode node = JsonNodeFactory.instance.objectNode();
+            node.put("graphCode", objectRelation.getGraphCode());
+            node.put("relCode", objectRelation.getRelCode());
+            node.put("relValue", objectRelation.getRelValue());
+            node.put("objFrom", objectRelation.getObjFrom());
+            node.put("objTo", objectRelation.getObjTo());
+            queryRequest.setCriteria(node);
+            service.doDelete(context, queryRequest);
+        }
+        List<RelationDTO> voList = new ArrayList<>();
+        for(int i = 0;i < buildingIdList.size();i++) {
+            String buildingId = buildingIdList.getString(i);
+            if(StrUtil.isBlank(buildingId)) {
+                continue;
+            }
+            voList.add(new RelationDTO(null, DEFAULT_GRAPH_CODE, DEFAULT_REL_CODE, null, sysId, buildingId));
+        }
+        // 组装上下文条件
+        service.doSave(context, voList);
+        return AdmResponse.success();
+    }
+
+    /**
+     * 服务于建筑的系统,建筑一对多
+     * @param   param
+     * @return                       创建的结果信息
+     */
+    @PostMapping("/link-sy")
+    public AdmResponse createSy(@RequestParam("projectId") String projectId,
+                                @RequestBody JSONObject param) throws Exception {
+        String buildingId = param.getString("buildingId");
+        JSONArray sysIdList = param.getJSONArray("sysIdList");
+        if(StrUtil.isBlank(buildingId) || CollUtil.isEmpty(sysIdList)) {
+            return AdmResponse.failure("必填项:sysIdList(系统id列表)、BuildingId(建筑id),测方法会覆盖以前的记录");
+        }
+        // 创建关系对象.先删除,后添加
+        InstanceUrlParam context = new InstanceUrlParam(groupCode, null, projectId, AdmCommonConstant.APP_ID);
+        QueryCriteria queryRequestTmp = new QueryCriteria();
+        ObjectNode nodeTmp = JsonNodeFactory.instance.objectNode();
+        nodeTmp.put("graphCode", DEFAULT_GRAPH_CODE);
+        nodeTmp.put("relCode", DEFAULT_REL_CODE);
+        nodeTmp.put("objTo", buildingId);
+        queryRequestTmp.setCriteria(nodeTmp);
+        //关系之前的关系,并且删除
+        List<ObjectRelation> objectRelations = service.queryByCondition(context, queryRequestTmp);
+        for (ObjectRelation objectRelation : objectRelations) {
+            QueryCriteria queryRequest = new QueryCriteria();
+            ObjectNode node = JsonNodeFactory.instance.objectNode();
+            node.put("graphCode", objectRelation.getGraphCode());
+            node.put("relCode", objectRelation.getRelCode());
+            node.put("relValue", objectRelation.getRelValue());
+            node.put("objFrom", objectRelation.getObjFrom());
+            node.put("objTo", objectRelation.getObjTo());
+            queryRequest.setCriteria(node);
+            service.doDelete(context, queryRequest);
+        }
+        List<RelationDTO> voList = new ArrayList<>();
+        for(int i = 0;i < sysIdList.size();i++) {
+            String sysId = sysIdList.getString(i);
+            if(StrUtil.isBlank(sysId)) {
+                continue;
+            }
+            voList.add(new RelationDTO(null, DEFAULT_GRAPH_CODE, DEFAULT_REL_CODE, null, sysId, buildingId));
+        }
+        // 组装上下文条件
+        service.doSave(context, voList);
+        return AdmResponse.success();
+    }
+}