Procházet zdrojové kódy

调整querySpaceListByRoomFuncType接口,增加关系对象id返回

lijie před 3 roky
rodič
revize
dbba676101

+ 5 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/basic/dto/RequestData.java

@@ -117,5 +117,10 @@ public class RequestData {
     @JsonProperty("ecRelCodes")
     @JSONField(name = "ecRelCodes",alternateNames = {"ecRelCodes","ec_rel_codes"})
     private Set<String> ecRelCodes;
+    /** 过滤的对象id */
+    @JsonAlias({"filterObjId","filter_obj_id"})
+    @JsonProperty("filterObjId")
+    @JSONField(name = "filterObjId",alternateNames = {"filterObjId","filter_obj_id"})
+    private String filterObjId;
 
 }

+ 12 - 1
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/dao/ObjectRelationMapper.java

@@ -5,6 +5,7 @@ import com.persagy.dmp.digital.entity.ObjectDigital;
 import com.persagy.dmp.digital.entity.ObjectRelation;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
@@ -15,7 +16,7 @@ import java.util.Set;
  */
 public interface ObjectRelationMapper extends BaseMapper<ObjectRelation> {
     /***
-     * Description: 根据对象id(obj_to字段)
+     * Description: 根据对象id查询关系
      * @param objIds : 对象id
      * @param relCode : 关系code
      * @return : java.util.List<com.persagy.dmp.digital.entity.ObjectDigital>
@@ -24,4 +25,14 @@ public interface ObjectRelationMapper extends BaseMapper<ObjectRelation> {
      * Update By lijie 2021/8/26 12:07
      */
     List<ObjectDigital> selectRelCodesByObjToIdsAndRelCode(@Param("objIds") Set<String> objIds,@Param("relCode") String relCode);
+    /***
+     * Description: 根据对象id查询关系
+     * @param objIds : 对象id
+     * @param relCodes : 关系code集合
+     * @return : java.util.List<com.persagy.dmp.digital.entity.ObjectDigital>
+     * @author : lijie
+     * @date :2021/8/26 12:07
+     * Update By lijie 2021/8/26 12:07
+     */
+    List<ObjectDigital> selectRelCodesByObjIdsAndRelCodes(@Param("objIds") Set<String> objIds,@Param("relCodes") Set<String> relCodes);
 }

+ 41 - 4
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/service/impl/ObjectDigitalServiceImpl.java

@@ -208,7 +208,7 @@ public class ObjectDigitalServiceImpl implements IObjectDigitalService {
         // 3.1 获取关系code列表
         fillSubordinateRelCode(requestData);
         // 3.2 调用查询语句查询相关内容
-        return analysisQueryResultList(objectDigitalMapper.queryObjectListBySuperiorId(requestData),requestData);
+        return analysisQueryResultList(objectDigitalMapper.queryObjectListBySuperiorId(requestData),requestData,false);
     }
     /***
      * Description: 根据对象id获取下级关系code数组
@@ -222,6 +222,7 @@ public class ObjectDigitalServiceImpl implements IObjectDigitalService {
         if (StrUtil.isNotBlank(requestData.getEquipmentId())){
             // 设备下的部件
             requestData.setRelCodes(CollUtil.newHashSet(DigitalRelCode.EQ_2_EC.getIndex()));
+            requestData.setFilterObjId(requestData.getEquipmentId());
             return;
         }
         if (StrUtil.isNotBlank(requestData.getFloorId())){
@@ -231,6 +232,7 @@ public class ObjectDigitalServiceImpl implements IObjectDigitalService {
             // 设置设备查询部件
             requestData.setQueryEcFlag(true);
             requestData.setEcRelCodes(CollUtil.newHashSet(DigitalRelCode.EQ_2_EC.getIndex()));
+            requestData.setFilterObjId(requestData.getFloorId());
             return;
         }
         if (StrUtil.isNotBlank(requestData.getBuildingId())){
@@ -241,6 +243,7 @@ public class ObjectDigitalServiceImpl implements IObjectDigitalService {
             // 设置设备查询部件
             requestData.setQueryEcFlag(true);
             requestData.setEcRelCodes(CollUtil.newHashSet(DigitalRelCode.EQ_2_EC.getIndex()));
+            requestData.setFilterObjId(requestData.getBuildingId());
         }
     }
 
@@ -256,8 +259,7 @@ public class ObjectDigitalServiceImpl implements IObjectDigitalService {
         // 1.查询结果集
         List<List<ObjectDigital>> resultList =
                 objectDigitalMapper.queryObjectDigitalsByProjectId(requestData,requestData.getSkip(),requestData.getSize());
-        return analysisQueryResultList(resultList,requestData);
-
+        return analysisQueryResultList(resultList,requestData,true);
     }
     /***
      * Description: 解析结果集
@@ -268,7 +270,9 @@ public class ObjectDigitalServiceImpl implements IObjectDigitalService {
      * @date :2021/8/25 13:16
      * Update By lijie 2021/8/25 13:16
      */
-    private CommonResult<List<ObjectDigital>> analysisQueryResultList(List<List<ObjectDigital>> resultList,RequestData requestData) {
+    private CommonResult<List<ObjectDigital>> analysisQueryResultList(List<List<ObjectDigital>> resultList,
+                                                                      RequestData requestData,
+                                                                      Boolean fillRelFlag) {
         if (CollUtil.isEmpty(resultList)){
             return ResultHelper.multi(new ArrayList<>(),0);
         }
@@ -281,12 +285,45 @@ public class ObjectDigitalServiceImpl implements IObjectDigitalService {
             // 只返回数
             return ResultHelper.multi(new ArrayList<>(),totalCount.get(0).getTotalCount());
         }
+        fillRelIds(pageResult,fillRelFlag);
         // 2.过滤信息点
         retainObjInfos(pageResult,requestData.getReturnInfos());
         // 3.处理Fl2Sp的关系,将对应的空间对象的楼层id扔进去
         fillFloorIdIntoSpaceObjFromIds(pageResult);
         return ResultHelper.multi(pageResult,totalCount.get(0).getTotalCount());
     }
+
+    private void fillRelIds(List<ObjectDigital> pageResult,
+                            Boolean fillRelFlag) {
+        if (null==fillRelFlag || !fillRelFlag){
+            return;
+        }
+        // 注入关系
+        // 2.1 根据楼层id查询建筑id
+        // 2.2 根据空间id查询建筑id
+        // 2.3 根据设备id查询建筑id
+        // 2.4 根据系统id查询建筑id
+        Set<String> objIds = pageResult.stream().map(ObjectDigital::getId).collect(Collectors.toSet());
+        List<ObjectDigital> objectDigitals = objectRelationMapper.selectRelCodesByObjIdsAndRelCodes(objIds, CollUtil
+                .newHashSet(DigitalRelCode.EQ_2_EC.getIndex(), DigitalRelCode.BD_2_FL.getIndex(),
+                        DigitalRelCode.BD_2_SP.getIndex(), DigitalRelCode.SY_2_BD.getIndex(),
+                        DigitalRelCode.EQ_2_BD.getIndex()));
+        if (CollUtil.isEmpty(objectDigitals)){
+            return;
+        }
+        Map<String, ObjectDigital> digitalMap = objectDigitals.stream()
+                .collect(Collectors.toMap(ObjectDigital::getId, objectDigital -> objectDigital, (k1, k2) -> k1));
+        for (ObjectDigital objectDigital : pageResult) {
+            if (!digitalMap.containsKey(objectDigital.getId())){
+                continue;
+            }
+            objectDigital.setObjToIds(CollUtil
+                    .defaultIfEmpty(digitalMap.get(objectDigital.getId()).getObjToIds(),new HashSet<>()));
+            objectDigital.setObjFromIds(CollUtil
+                    .defaultIfEmpty(digitalMap.get(objectDigital.getId()).getObjFromIds(),new HashSet<>()));
+        }
+    }
+
     /***
      * Description: 填充关系id
      * @param objectDigitals : 查询结果集

+ 3 - 1
dmp-business/dmp-rwd/src/main/resources/db/init/schema.sql

@@ -122,7 +122,9 @@ CREATE TABLE IF NOT EXISTS `dt_object` (
   PRIMARY KEY (`id`) USING BTREE,
   KEY `idx_project_1` (`project_id`,`class_code`,`creation_time`) USING BTREE,
   KEY `idx_project_2` (`project_id`,`creation_time`) USING BTREE,
-  KEY `idx_project_3` (`project_id`,`modified_time`) USING BTREE
+  KEY `idx_project_3` (`project_id`,`modified_time`) USING BTREE,
+  KEY "idx_project_4" ("obj_type") USING BTREE,
+  KEY "idx_project_5" ("project_id") USING BTREE
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='对象实例表';
 
 CREATE TABLE IF NOT EXISTS `dt_relation` (

+ 31 - 5
dmp-business/dmp-rwd/src/main/resources/mapper/ObjectDigitalMapper.xml

@@ -90,7 +90,20 @@
         </include>
     </sql>
     <sql id="commonQueryObjByRel">
-        <include refid="commonQueryObjByRelSub">
+        (
+        <include refid="commonQueryObjByRelSubTo">
+            <property name="param" value="#{param}"/>
+        </include>
+        <if test="param.relCodes!=null and param.relCodes.size()>0">
+            <foreach collection="param.relCodes" open="AND dtr.rel_code IN (" close=")" separator="," item="relCode">
+                #{relCode}
+            </foreach>
+        </if>
+        GROUP BY dto.id
+        )
+        UNION
+        (
+        <include refid="commonQueryObjByRelSubFrom">
             <property name="param" value="#{param}"/>
         </include>
         <if test="param.relCodes!=null and param.relCodes.size()>0">
@@ -99,12 +112,25 @@
             </foreach>
         </if>
         GROUP BY dto.id
+        )
+
+    </sql>
+    <sql id="commonQueryObjByRelSubTo">
+        SELECT DISTINCT
+        dto.*,JSON_ARRAYAGG(dtr.obj_from) AS objFromIds,JSON_ARRAYAGG(dtr.obj_to) AS objToIds
+        FROM dt_object AS dto
+        LEFT JOIN (SELECT * FROM dt_relation AS dtrA WHERE dtrA.obj_to=#{param.filterObjId} OR
+        dtrA.obj_from=#{param.filterObjId}) AS dtr ON dtr.obj_to=dto.id
+        WHERE 1=1
+        <include refid="commonJoinQueryParam">
+            <property name="param" value="#{param}"/>
+        </include>
     </sql>
-    <sql id="commonQueryObjByRelSub">
+    <sql id="commonQueryObjByRelSubFrom">
         SELECT DISTINCT
         dto.*,JSON_ARRAYAGG(dtr.obj_from) AS objFromIds,JSON_ARRAYAGG(dtr.obj_to) AS objToIds
-        FROM dt_relation AS dtr
-        LEFT JOIN dt_object AS dto ON (dtr.obj_from=dto.id OR dtr.obj_to=dto.id)
+        FROM dt_object AS dto
+        LEFT JOIN (SELECT * FROM dt_relation AS dtrA WHERE dtrA.obj_to=#{param.filterObjId} OR dtrA.obj_from=#{param.filterObjId}) AS dtr ON dtr.obj_from=dto.id
         WHERE 1=1
         <include refid="commonJoinQueryParam">
             <property name="param" value="#{param}"/>
@@ -113,7 +139,7 @@
     <sql id="queryObjDataUnionEcData">
         <if test="param.queryEcFlag!=null and param.queryEcFlag='true'">
             UNION
-            (<include refid="commonQueryObjByRelSub">
+            (<include refid="commonQueryObjByRelSubTo">
                 <property name="param" value="#{param}"/>
             </include>
             <if test="param.ecRelCodes!=null and param.ecRelCodes.size()>0">

+ 51 - 0
dmp-business/dmp-rwd/src/main/resources/mapper/ObjectRelationMapper.xml

@@ -72,4 +72,55 @@
         </if>
         GROUP BY dtr.obj_to;
     </select>
+    <select id="selectRelCodesByObjIdsAndRelCodes" resultMap="ObjectDigitalResultMap">
+        SELECT
+        rdtr.*
+        FROM
+        (
+        (
+        SELECT
+        dtr.obj_to AS id,
+        IFNULL( JSON_ARRAYAGG( dtr.obj_to ), JSON_ARRAY( ) ) AS objToIds,
+        IFNULL( JSON_ARRAYAGG( dtr.obj_from ), JSON_ARRAY( ) ) AS objFromIds
+        FROM
+        dt_relation dtr
+        WHERE
+        1 = 1
+        <if test="objIds!=null and objIds.size()>0">
+            <foreach collection="objIds" item="objId" open="AND dtr.obj_to IN (" close=")" separator=",">
+                #{objId}
+            </foreach>
+        </if>
+        <if test="relCodes!=null and relCodes.size()>0">
+            <foreach collection="relCodes" item="relCode" open="AND dtr.rel_code IN (" close=")" separator=",">
+                #{relCode}
+            </foreach>
+        </if>
+        GROUP BY
+        dtr.obj_to
+        ) UNION
+        (
+        SELECT
+        dtr.obj_from AS id,
+        IFNULL( JSON_ARRAYAGG( dtr.obj_to ), JSON_ARRAY( ) ) AS objToIds,
+        IFNULL( JSON_ARRAYAGG( dtr.obj_from ), JSON_ARRAY( ) ) AS objFromIds
+        FROM
+        dt_relation dtr
+        WHERE
+        1 = 1
+        <if test="objIds!=null and objIds.size()>0">
+            <foreach collection="objIds" item="objId" open="AND dtr.obj_from IN (" close=")" separator=",">
+                #{objId}
+            </foreach>
+        </if>
+        <if test="relCodes!=null and relCodes.size()>0">
+            <foreach collection="relCodes" item="relCode" open="AND dtr.rel_code IN (" close=")" separator=",">
+                #{relCode}
+            </foreach>
+        </if>
+        GROUP BY
+        dtr.obj_from
+        )
+        ) AS rdtr;
+    </select>
 </mapper>