Browse Source

fix bug:根据classCode查询对象信息点无法根据层级获取自定义信息点

lijie 3 years ago
parent
commit
2d35947617

+ 4 - 61
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/define/controller/ObjectInfoController.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 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.ObjectNode;
 import com.persagy.dmp.basic.model.QueryCriteria;
@@ -14,6 +15,7 @@ import com.persagy.dmp.common.constant.CommonConstant;
 import com.persagy.dmp.common.constant.ResponseCode;
 import com.persagy.dmp.common.context.AppContext;
 import com.persagy.dmp.common.exception.BusinessException;
+import com.persagy.dmp.common.helper.SpringHelper;
 import com.persagy.dmp.common.model.response.CommonResult;
 import com.persagy.dmp.common.utils.JsonHelper;
 import com.persagy.dmp.common.utils.ResultHelper;
@@ -44,7 +46,6 @@ import java.util.List;
 public class ObjectInfoController {
 
     private final IObjectInfoService service;
-    private final IObjectTypeService objectTypeService;
 
     @PostMapping("")
     public CommonResult<List<ObjectInfoDefine>> query(@RequestBody QueryCriteria criteria) {
@@ -56,66 +57,8 @@ public class ObjectInfoController {
         if (null!=objCriteria && objCriteria.size()>0){
             objCriteria.remove(CommonConstant.TYPE);
         }
-        QueryWrapper<ObjectInfoDefine> wrapper = new QueryWrapper<>();
-        // 处理classCode
-        ObjectTypeDefine objectTypeDefine = ensureClassCode(criteria);
-        // 添加所属项目条件
-        ConditionUtil.ensureProjectCriteria(wrapper);
-        // 转换查询条件
-        QueryCriteriaHelper.toWrapper(wrapper, criteria, ObjectInfoDefine.class);
-        Page<ObjectInfoDefine> page = QueryCriteriaHelper.toPage(criteria);
-        // 没有排序条件时,按默认条件排序
-        if(CollUtil.isEmpty(page.getOrders())) {
-            wrapper.orderByAsc("show_order");
-        }
-        if(criteria.isOnlyCount()) {
-            Integer total = service.queryCount(wrapper);
-            page.setTotal(total);
-        } else {
-            /// 20210819 临时处理,优化执行计划,解决Mysql:Out of sort memory问题
-            // wrapper.select("/*+ SET_VAR(sort_buffer_size = 2M) */*");
-            page = service.queryByCondition(QueryCriteriaHelper.toPage(criteria), wrapper);
-        }
-        // 20211013 兼容旧的逻辑,将通用信息点的classCode改为当前的classCode
-        List<ObjectInfoDefine> records = page.getRecords();
-        if (CollUtil.isNotEmpty(records) && null!=objectTypeDefine && StrUtil.isNotBlank(objectTypeDefine.getCode())){
-            records.forEach(record->record.setClassCode(objectTypeDefine.getCode()));
-        }
-        return ResultHelper.multi(records, page.getTotal());
-    }
-    /***
-     * Description: 处理对象类型,如果父级id存在则加上父级id
-     * @param criteria : 查询参数
-     * @return : void
-     * @author : lijie
-     * @date :2021/9/9 18:25
-     * Update By lijie 2021/9/9 18:25
-     */
-    private ObjectTypeDefine ensureClassCode(QueryCriteria criteria) {
-        ObjectNode objectNode = criteria.getCriteria();
-        if (!objectNode.has(ObjectDigital.CLASS_CODE_HUM)){
-            return null;
-        }
-        JsonNode jsonNode = objectNode.get(ObjectDigital.CLASS_CODE_HUM);
-        if (!jsonNode.isTextual()){
-            return null;
-        }
-        String classCode = jsonNode.asText();
-        LambdaQueryWrapper<ObjectTypeDefine> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(ObjectTypeDefine::getCode,classCode);
-        queryWrapper.eq(ObjectTypeDefine::getValid,true);
-        List<ObjectTypeDefine> objectTypeDefines = objectTypeService.queryByCondition(queryWrapper);
-        if (CollUtil.isEmpty(objectTypeDefines)){
-            return null;
-        }
-        ObjectTypeDefine objectTypeDefine = objectTypeDefines.get(0);
-        ArrayNode arrayNode = JsonHelper.objectMapper.createArrayNode();
-        arrayNode.add(classCode);
-        if (StrUtil.isNotBlank(objectTypeDefine.getParentCode())){
-            arrayNode.add(objectTypeDefine.getParentCode());
-        }
-        objectNode.set(ObjectDigital.CLASS_CODE_HUM,arrayNode);
-        return objectTypeDefine;
+        Page<ObjectInfoDefine> page = service.queryByCondition(criteria);
+        return ResultHelper.multi(page.getRecords(), page.getTotal());
     }
 
     @PostMapping("/create")

+ 9 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/define/dao/ObjectInfoMapper.java

@@ -1,7 +1,14 @@
 package com.persagy.dmp.rwd.define.dao;
 
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.persagy.dmp.define.entity.ObjectInfoDefine;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Set;
 
 /**
  * 信息点 DAO
@@ -9,4 +16,6 @@ import com.persagy.dmp.define.entity.ObjectInfoDefine;
  * @date 2021-06-25
  */
 public interface ObjectInfoMapper extends BaseMapper<ObjectInfoDefine> {
+    List<ObjectInfoDefine> queryByClassCodes(@Param(Constants.WRAPPER) Wrapper<ObjectInfoDefine> wrapper,
+                                             @Param("classCodes") Set<String> classCodes);
 }

+ 14 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/define/service/IObjectInfoService.java

@@ -1,8 +1,11 @@
 package com.persagy.dmp.rwd.define.service;
 
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.persagy.dmp.basic.model.QueryCriteria;
 import com.persagy.dmp.define.entity.ObjectInfoDefine;
+import com.persagy.dmp.define.entity.ObjectTypeDefine;
 
 import java.util.List;
 import java.util.Map;
@@ -64,6 +67,16 @@ public interface IObjectInfoService {
      */
     Page<ObjectInfoDefine> queryByCondition(Page<ObjectInfoDefine> page, Wrapper<ObjectInfoDefine> queryWrapper);
 
+    /***
+     * Description: 按条件查询
+     * @param criteria : 查询条件
+     * @return : com.baomidou.mybatisplus.extension.plugins.pagination.Page<com.persagy.dmp.define.entity.ObjectInfoDefine>
+     * @author : lijie
+     * @date :2021/10/20 11:01
+     * Update By lijie 2021/10/20 11:01
+     */
+    Page<ObjectInfoDefine> queryByCondition(QueryCriteria criteria);
+
     /**
      * 新增
      * @param voList 待新增数据
@@ -83,4 +96,5 @@ public interface IObjectInfoService {
      * @param idList 主键
      */
     void delete(List<String> idList);
+
 }

+ 120 - 4
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/define/service/impl/ObjectInfoServiceImpl.java

@@ -4,24 +4,40 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.text.StrFormatter;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.dmp.basic.model.QueryCriteria;
+import com.persagy.dmp.basic.utils.QueryCriteriaHelper;
+import com.persagy.dmp.common.constant.CommonConstant;
 import com.persagy.dmp.common.constant.ValidEnum;
 import com.persagy.dmp.common.exception.BusinessException;
+import com.persagy.dmp.common.helper.SpringHelper;
 import com.persagy.dmp.common.model.entity.BaseEntity;
 import com.persagy.dmp.define.entity.GraphDefine;
 import com.persagy.dmp.define.entity.ObjectInfoDefine;
+import com.persagy.dmp.define.entity.ObjectTypeDefine;
+import com.persagy.dmp.digital.entity.ObjectDigital;
+import com.persagy.dmp.mybatis.utils.ConditionUtil;
 import com.persagy.dmp.rwd.basic.constant.DigitalMessageConstant;
 import com.persagy.dmp.rwd.basic.utils.DigitalMessageHelper;
 import com.persagy.dmp.rwd.define.dao.ObjectInfoMapper;
 import com.persagy.dmp.rwd.define.service.IObjectInfoService;
+import com.persagy.dmp.rwd.define.service.IObjectTypeService;
 import com.persagy.dmp.rwd.parser.service.InfoDataFactory;
+import lombok.RequiredArgsConstructor;
+import org.hibernate.validator.constraints.Length;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import javax.validation.constraints.NotNull;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -32,12 +48,12 @@ import java.util.stream.Collectors;
  */
 @Service
 @Transactional(rollbackFor = Exception.class)
+@RequiredArgsConstructor
 public class ObjectInfoServiceImpl implements IObjectInfoService {
 
-    @Resource
-    private ObjectInfoMapper dao;
-    @Autowired
-    private DigitalMessageHelper messageSender;
+    private final ObjectInfoMapper dao;
+    private final DigitalMessageHelper messageSender;
+    private final IObjectTypeService objectTypeService;
 
     @Override
     public ObjectInfoDefine load(String id) {
@@ -85,6 +101,106 @@ public class ObjectInfoServiceImpl implements IObjectInfoService {
     public Page<ObjectInfoDefine> queryByCondition(Page<ObjectInfoDefine> page, Wrapper<ObjectInfoDefine> queryWrapper) {
         return dao.selectPage(page, queryWrapper);
     }
+    /***
+     * Description: 按条件查询
+     * @param criteria : 查询条件
+     * @return : com.baomidou.mybatisplus.extension.plugins.pagination.Page<com.persagy.dmp.define.entity.ObjectInfoDefine>
+     * @author : lijie
+     * @date :2021/10/20 11:01
+     * Update By lijie 2021/10/20 11:01
+     */
+    @Override
+    public Page<ObjectInfoDefine> queryByCondition(QueryCriteria criteria) {
+        List<ObjectTypeDefine> objectTypeDefines = queryClassCodes(criteria);
+        // 1.如果传的参数不包含classCode走公共逻辑
+        if (CollUtil.isEmpty(objectTypeDefines)){
+            QueryWrapper<ObjectInfoDefine> wrapper = new QueryWrapper<>();
+            // 添加所属项目条件
+            ConditionUtil.ensureProjectCriteria(wrapper);
+            // 转换查询条件
+            QueryCriteriaHelper.toWrapper(wrapper, criteria, ObjectInfoDefine.class);
+            Page<ObjectInfoDefine> page = QueryCriteriaHelper.toPage(criteria);
+            // 没有排序条件时,按默认条件排序
+            if(CollUtil.isEmpty(page.getOrders())) {
+                wrapper.orderByAsc("show_order");
+            }
+            if(criteria.isOnlyCount()) {
+                return page.setTotal(queryCount(wrapper));
+            }
+            /// 20210819 临时处理,优化执行计划,解决Mysql:Out of sort memory问题
+            // wrapper.select("/*+ SET_VAR(sort_buffer_size = 2M) */*");
+            return queryByCondition(QueryCriteriaHelper.toPage(criteria), wrapper);
+        }
+        // 2.包含classCode则不进行分页并且获取数据集合
+        // 2.1 如果为基础类型、且为平台级,优先级100
+        // 2.2 如果为基础类型、且为集团级,优先级200
+        // 2.3 如果为基础类型、且为项目级,优先级300
+        // 2.4 如果为非基础类型、且为平台级,优先级400
+        // 2.5 如果为非基础类型、且为集团级,优先级500
+        // 2.6 如果为非基础类型、且为项目级,优先级600
+        criteria.getCriteria().remove(ObjectDigital.CLASS_CODE_HUM);
+        List<ObjectInfoDefine> result = new ArrayList<>();
+        for (ObjectTypeDefine objectTypeDefine : objectTypeDefines) {
+            // 获取classCode集合
+            Set<String> classCodes = CollUtil.newHashSet(objectTypeDefine.getCode());
+            if (StrUtil.isNotBlank(objectTypeDefine.getParentCode())){
+                classCodes.add(objectTypeDefine.getParentCode());
+            }
+            if (CollUtil.isEmpty(classCodes)){
+                continue;
+            }
+            QueryWrapper<ObjectInfoDefine> wrapper = new QueryWrapper<>();
+            // 添加所属项目条件
+            ConditionUtil.ensureProjectCriteria(wrapper);
+            // 转换查询条件
+            QueryCriteriaHelper.toWrapper(wrapper, criteria, ObjectInfoDefine.class);
+            wrapper.orderByAsc("show_order");
+            wrapper.in(ObjectDigital.CLASS_CODE,classCodes);
+            List<ObjectInfoDefine> objectInfoDefines = dao.queryByClassCodes(wrapper,classCodes);
+            if (CollUtil.isEmpty(objectInfoDefines)){
+                continue;
+            }
+            objectInfoDefines.forEach(objectInfoDefine -> objectInfoDefine.setClassCode(objectInfoDefine.getCode()));
+            result.addAll(objectInfoDefines);
+        }
+        Page<ObjectInfoDefine> pageResult = new Page<>();
+        pageResult.setRecords(result);
+        pageResult.setSize(result.size());
+        pageResult.setTotal(result.size());
+        pageResult.setCurrent(1L);
+        return pageResult;
+    }
+
+    /***
+     * Description: 处理对象类型,如果父级id存在则加上父级id
+     * @param criteria : 查询参数
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/9 18:25
+     * Update By lijie 2021/9/9 18:25
+     */
+    private List<ObjectTypeDefine> queryClassCodes(QueryCriteria criteria) {
+        ObjectNode objectNode = criteria.getCriteria();
+        if (!objectNode.has(ObjectDigital.CLASS_CODE_HUM)){
+            return null;
+        }
+        JsonNode jsonNode = objectNode.get(ObjectDigital.CLASS_CODE_HUM);
+        QueryCriteria typeCriteria = new QueryCriteria();
+        typeCriteria.setCriteria(SpringHelper.getBean(ObjectMapper.class).createObjectNode());
+        typeCriteria.getCriteria().set("code",jsonNode);
+        typeCriteria.getCriteria().put("valid",true);
+        QueryWrapper<ObjectTypeDefine> wrapper = new QueryWrapper<>();
+        // 添加所属项目条件
+        ConditionUtil.ensureProjectCriteria(wrapper);
+        // 转换查询条件
+        QueryCriteriaHelper.toWrapper(wrapper, typeCriteria, ObjectTypeDefine.class);
+        List<ObjectTypeDefine> objectTypeDefines = objectTypeService.queryByCondition(wrapper);
+        if (CollUtil.isEmpty(objectTypeDefines)){
+            return null;
+        }
+        return objectTypeDefines;
+    }
+
 
     @Override
     public List<ObjectInfoDefine> insert(List<ObjectInfoDefine> voList) {

+ 134 - 0
dmp-business/dmp-rwd/src/main/resources/mapper/DefineInfoMapper.xml

@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.persagy.dmp.rwd.define.dao.ObjectInfoMapper">
+
+    <resultMap id="BaseResultMap" type="com.persagy.dmp.define.entity.ObjectInfoDefine">
+            <id property="id" column="id" jdbcType="VARCHAR"/>
+            <result property="code" column="code" jdbcType="VARCHAR"/>
+            <result property="name" column="name" jdbcType="VARCHAR"/>
+            <result property="aliasCode" column="alias_code" jdbcType="VARCHAR"/>
+            <result property="aliasName" column="alias_name" jdbcType="VARCHAR"/>
+            <result property="classCode" column="class_code" jdbcType="VARCHAR"/>
+            <result property="groupCode" column="group_code" jdbcType="VARCHAR"/>
+            <result property="projectId" column="project_id" jdbcType="VARCHAR"/>
+            <result property="category" column="category" jdbcType="VARCHAR"/>
+            <result property="firstTag" column="first_tag" jdbcType="VARCHAR"/>
+            <result property="secondTag" column="second_tag" jdbcType="VARCHAR"/>
+            <result property="priority" column="priority" jdbcType="VARCHAR"/>
+            <result property="inputMode" column="input_mode" jdbcType="VARCHAR"/>
+            <result property="unit" column="unit" jdbcType="VARCHAR"/>
+            <result property="dataType" column="data_type" jdbcType="VARCHAR"/>
+            <result property="isMultiple" column="is_multiple" jdbcType="INTEGER"/>
+            <result property="isRegion" column="is_region" jdbcType="INTEGER"/>
+            <result property="formater" column="formater" jdbcType="VARCHAR"/>
+            <result property="dataSource" column="data_source" jdbcType="OTHER" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
+            <result property="remark" column="remark" jdbcType="VARCHAR"/>
+            <result property="subFlag" column="sub_flag" jdbcType="INTEGER"/>
+            <result property="weakPoint" column="weak_point" jdbcType="INTEGER"/>
+            <result property="showOrder" column="show_order" jdbcType="INTEGER"/>
+            <result property="version" column="version" jdbcType="VARCHAR"/>
+            <result property="creator" column="creator" jdbcType="VARCHAR"/>
+            <result property="creationTime" column="creation_time" jdbcType="CHAR"/>
+            <result property="modifier" column="modifier" jdbcType="VARCHAR"/>
+            <result property="modifiedTime" column="modified_time" jdbcType="CHAR"/>
+            <result property="valid" column="valid" jdbcType="TINYINT"/>
+            <result property="ts" column="ts" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,`code`,`name`,
+        alias_code,alias_name,class_code,
+        group_code,project_id,category,
+        first_tag,second_tag,priority,
+        input_mode,unit,data_type,
+        is_multiple,is_region,formater,
+        data_source,remark,sub_flag,
+        weak_point,show_order,version,
+        creator,creation_time,modifier,
+        modified_time,valid,ts
+    </sql>
+    <select id="queryByClassCodes" resultMap="BaseResultMap">
+        SELECT
+            *
+        FROM
+            (
+                SELECT DISTINCT
+                    dt_define_info.*
+                FROM
+                    dt_define_info
+                        INNER JOIN dt_define_type ON dt_define_info.class_code = dt_define_type.CODE
+                WHERE
+                <foreach collection="classCodes" item="classCode" separator="," open="class_code IN (" close=")">
+                    #{classCode}
+                </foreach>
+                  AND EXISTS (
+                        SELECT
+                            1
+                        FROM
+                            (
+                                SELECT
+                                    dt_define_info.CODE,
+                                    max(
+                                            CASE
+                                                WHEN dt_define_info.class_code = dt_define_type.obj_type
+                                                    AND dt_define_info.project_id = '0' THEN
+                                                    100
+                                                WHEN dt_define_info.class_code = dt_define_type.obj_type
+                                                    AND dt_define_info.project_id = dt_define_info.group_code THEN
+                                                    200
+                                                WHEN dt_define_info.class_code = dt_define_type.obj_type
+                                                    AND dt_define_info.project_id != dt_define_info.group_code THEN
+                                                    300
+                                                WHEN dt_define_info.class_code != dt_define_type.obj_type
+                                                    AND dt_define_info.project_id = '0' THEN
+                                                    400
+                                                WHEN dt_define_info.class_code != dt_define_type.obj_type
+                                                    AND dt_define_info.project_id = dt_define_info.group_code THEN
+                                                    500
+                                                WHEN dt_define_info.class_code != dt_define_type.obj_type
+                                                    AND dt_define_info.project_id != dt_define_info.group_code THEN
+                                                    600 ELSE 0
+                                                END
+                                        ) show_level
+                                FROM
+                                    dt_define_info
+                                        INNER JOIN dt_define_type ON dt_define_info.class_code = dt_define_type.CODE
+                                WHERE
+                                    <foreach collection="classCodes" item="classCode" separator="," open="class_code IN (" close=")">
+                                        #{classCode}
+                                    </foreach>
+                                GROUP BY
+                                    dt_define_info.CODE
+                            ) T
+                        WHERE
+                            T.CODE = dt_define_info.CODE
+                          AND (
+                                  CASE
+                                      WHEN dt_define_info.class_code = dt_define_type.obj_type
+                                          AND dt_define_info.project_id = '0' THEN
+                                          100
+                                      WHEN dt_define_info.class_code = dt_define_type.obj_type
+                                          AND dt_define_info.project_id = dt_define_info.group_code THEN
+                                          200
+                                      WHEN dt_define_info.class_code = dt_define_type.obj_type
+                                          AND dt_define_info.project_id != dt_define_info.group_code THEN
+                                          300
+                                      WHEN dt_define_info.class_code != dt_define_type.obj_type
+                                          AND dt_define_info.project_id = '0' THEN
+                                          400
+                                      WHEN dt_define_info.class_code != dt_define_type.obj_type
+                                          AND dt_define_info.project_id = dt_define_info.group_code THEN
+                                          500
+                                      WHEN dt_define_info.class_code != dt_define_type.obj_type
+                                          AND dt_define_info.project_id != dt_define_info.group_code THEN
+                                          600 ELSE 0
+                                      END
+                                  ) = T.show_level
+                    )
+            ) dt_define_info WHERE ${ew.expression.sqlSegment};
+    </select>
+
+
+</mapper>