Procházet zdrojové kódy

中心中台融合 系统定制接口 distinct 支持

lvxianyun před 3 roky
rodič
revize
3962ca0a88

+ 122 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/simple/controller/SystemController.java

@@ -1,13 +1,29 @@
 package com.persagy.dmp.rwd.simple.controller;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
+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.dto.RequestData;
+import com.persagy.dmp.basic.model.QueryCriteria;
+import com.persagy.dmp.basic.model.QueryOperator;
+import com.persagy.dmp.basic.utils.JsonNodeUtils;
+import com.persagy.dmp.basic.utils.QueryCriteriaHelper;
 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.model.response.CommonResult;
+import com.persagy.dmp.common.utils.JsonHelper;
 import com.persagy.dmp.common.utils.ParamCheckUtil;
+import com.persagy.dmp.common.utils.ResultHelper;
+import com.persagy.dmp.digital.entity.ObjectDigital;
+import com.persagy.dmp.digital.entity.ObjectRelation;
+import com.persagy.dmp.rwd.basic.constant.DigitalRelCode;
+import com.persagy.dmp.rwd.digital.utils.ObjectDigitalCriteriaHelper;
 import com.persagy.dmp.rwd.simple.service.ISystemService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -16,6 +32,8 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.io.IOException;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -44,4 +62,108 @@ public class SystemController {
         return result;
     }
 
+    /**
+     * 根据条件查询系统 针对查询条件中有distinct 和 projectiond 的情况
+     * {
+     *     "distinct": true,
+     *     "pageNumber": 1,
+     *     "pageSize": 1000,
+     *     "projection": [
+     *         "classCode",
+     *         "CategoryName"
+     *     ]
+     * }
+     * @param requestData
+     * @return
+     * @throws IOException
+     */
+    @PostMapping("/querySystemListByConditions")
+    public CommonResult<List<ObjectNode>> querySystemListByConditions(@RequestBody RequestData requestData) throws IOException {
+        // 暂时先拼接query接口参数进行查询,后续视情况再单独写逻辑
+        ObjectMapper objectMapper = JsonHelper.objectMapper;
+        QueryCriteria queryCriteria = new QueryCriteria();
+        queryCriteria.setOrders(requestData.getOrders());
+        queryCriteria.setPage(requestData.getPage());
+        queryCriteria.setSize(requestData.getSize());
+        ObjectNode objectNode = objectMapper.createObjectNode();
+        // 专业,系统类,设备类
+        if (StrUtil.isNotBlank(requestData.getClassCode())) {
+            ObjectNode classCodeObj = objectMapper.createObjectNode();
+            classCodeObj.put(QueryOperator.LIKE_RIGHT.getIndex(), requestData.getClassCode());
+            objectNode.set(ObjectDigital.CLASS_CODE_HUM, classCodeObj);
+        }
+        // 楼层id
+        if (StrUtil.isNotBlank(requestData.getFloorId())) {
+            // criteria条件
+            ObjectNode criteriaObj = objectMapper.createObjectNode();
+            criteriaObj.put(ObjectRelation.REL_CODE_HUM, DigitalRelCode.SY_2_FL.getIndex());
+            criteriaObj.put(ObjectRelation.OBJ_TO_HUM, requestData.getFloorId());
+            objectNode.set(ObjectRelation.RELATION_FROM_HUM, criteriaObj);
+        }
+        // 系统id
+        if (StrUtil.isNotBlank(requestData.getBuildingId())) {
+            // criteria条件
+            ObjectNode criteriaObj = objectMapper.createObjectNode();
+            criteriaObj.put(ObjectRelation.REL_CODE_HUM, DigitalRelCode.SY_2_BD.getIndex());
+            criteriaObj.put(ObjectRelation.OBJ_TO_HUM, requestData.getBuildingId());
+            objectNode.set(ObjectRelation.RELATION_FROM_HUM, criteriaObj);
+        }
+        objectNode.put(ObjectDigital.OBJ_TYPE_HUM, requestData.getObjType());
+        objectNode.put(ObjectDigital.PROP_VALID,Boolean.TRUE);
+        queryCriteria.setCriteria(objectNode);
+
+
+        //基础参数校验
+        ParamCheckUtil.checkParam(CommonConstant.QUERY_GROUPCODE);
+        // 增加判断传值项目id逻辑,2021年9月10日19:15:17
+        JsonNode projectNode = queryCriteria.getCriteria().get(RequestData.PROJECT_IDS_HUM);
+        if (queryCriteria.getCriteria().has(RequestData.PROJECT_IDS_HUM)){
+            queryCriteria.getCriteria().remove(RequestData.PROJECT_IDS_HUM);
+        }
+        QueryWrapper<ObjectDigital> wrapper = new QueryWrapper<>();
+        // 添加所属项目条件
+        // ConditionUtil.ensureProjectCriteriaDirectly(wrapper);
+        String projectId = AppContext.getContext().getProjectId();
+        if (null!=projectNode && projectNode.isArray()){
+            wrapper.in(StrUtil.toUnderlineCase(AppContext.PROJECT_ID), JsonHelper.toMultiEntity(projectNode,String.class));
+        }else {
+            wrapper.eq(StrUtil.isNotBlank(projectId), StrUtil.toUnderlineCase(AppContext.PROJECT_ID), projectId);
+        }
+        // 处理扩展条件
+        ObjectDigitalCriteriaHelper.presetDigitalCriteria(queryCriteria);
+        // 转换查询条件
+        QueryCriteriaHelper.toWrapper(wrapper, queryCriteria, ObjectDigital.class);
+
+        if(CollUtil.isNotEmpty(requestData.getProjection())){
+            StringBuilder distictParam = new StringBuilder( "DISTINCT ");
+            requestData.getProjection().stream().forEach(coulum ->{
+                if(coulum.equals(ObjectDigital.CLASS_CODE_HUM)){
+                    distictParam.append(ObjectDigital.CLASS_CODE).append(",");
+                }
+                if(coulum.equals(ObjectDigital.LOCAL_NAME_HUM)){
+                    distictParam.append(ObjectDigital.LOCAL_NAME).append(",");
+                }
+                if(coulum.equals(ObjectDigital.LOCAL_ID_HUM)){
+                    distictParam.append(ObjectDigital.LOCAL_ID).append(",");
+                }
+                if(coulum.equals(ObjectDigital.NAME)){
+                    distictParam.append(ObjectDigital.NAME).append(",");
+                }
+            });
+            String coulums = StrUtil.sub(distictParam.toString(),0, -1);
+            wrapper.select(coulums);
+        }
+
+        Page page = QueryCriteriaHelper.toPage(queryCriteria);
+        if(queryCriteria.isOnlyCount()) {
+            Integer total = systemService.queryCount(wrapper);
+            page.setTotal(total);
+        } else {
+            page = systemService.queryByCondition(QueryCriteriaHelper.toPage(queryCriteria), wrapper);
+        }
+        // 处理扩展属性
+        List<ObjectNode> records = JsonNodeUtils.toListNode(page.getRecords(), ObjectDigital.EXTRA_COLUMN, queryCriteria.getWithColumns());
+        return ResultHelper.multi(records, page.getTotal());
+    }
+
 }

+ 3 - 2
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/simple/dao/SystemCustomMapper.java

@@ -1,17 +1,18 @@
 package com.persagy.dmp.rwd.simple.dao;
 
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.persagy.dmp.basic.dto.RequestData;
+import com.persagy.dmp.digital.entity.ObjectDigital;
 import org.apache.ibatis.annotations.Param;
 
-import java.util.List;
 import java.util.Map;
 
 /**
  * @author lvxy
  * @date 2021/10/9
  */
-public interface SystemCustomMapper {
+public interface SystemCustomMapper extends BaseMapper<ObjectDigital> {
     /**
      *确定建筑不确定楼层 buildingId is not null
      */

+ 27 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/simple/service/ISystemService.java

@@ -1,8 +1,11 @@
 package com.persagy.dmp.rwd.simple.service;
 
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.persagy.dmp.basic.dto.RequestData;
+import com.persagy.dmp.digital.entity.ObjectDigital;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -16,4 +19,28 @@ public interface ISystemService {
      * 查询不确定楼层/不确定建筑 的系统
      */
     Page<Map<String,Object>> queryNotSureSystem(RequestData requestData);
+
+
+
+    /**
+     * 按条件计数
+     * @param queryWrapper 查询条件
+     * @return 结果数量
+     */
+    Integer queryCount(Wrapper<ObjectDigital> queryWrapper);
+
+    /**
+     * 按条件查询
+     * @param queryWrapper 查询条件
+     * @return 列表
+     */
+    List<ObjectDigital> queryByCondition(Wrapper<ObjectDigital> queryWrapper);
+
+    /**
+     * 按条件查询
+     * @param page 分页条件
+     * @param queryWrapper 查询条件
+     * @return 分页结果
+     */
+    Page queryByCondition(Page page, Wrapper<ObjectDigital> queryWrapper);
 }

+ 21 - 1
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/simple/service/impl/SystemServiceImpl.java

@@ -1,9 +1,13 @@
 package com.persagy.dmp.rwd.simple.service.impl;
 
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.persagy.dmp.basic.dto.RequestData;
+import com.persagy.dmp.digital.entity.ObjectDigital;
 import com.persagy.dmp.rwd.basic.utils.DigitalCommonUtils;
+import com.persagy.dmp.rwd.digital.dao.ObjectDigitalMapper;
 import com.persagy.dmp.rwd.simple.dao.SystemCustomMapper;
 import com.persagy.dmp.rwd.simple.service.ISystemService;
 import lombok.extern.slf4j.Slf4j;
@@ -11,6 +15,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -20,7 +25,7 @@ import java.util.Map;
 @Service
 @Slf4j
 @Transactional(rollbackFor = Exception.class)
-public class SystemServiceImpl implements ISystemService {
+public class SystemServiceImpl extends ServiceImpl<ObjectDigitalMapper, ObjectDigital> implements ISystemService {
 
     @Resource
     private SystemCustomMapper mapper;
@@ -36,4 +41,19 @@ public class SystemServiceImpl implements ISystemService {
                     .computePageObject(requestData),requestData);
         }
     }
+
+    @Override
+    public List<ObjectDigital> queryByCondition(Wrapper<ObjectDigital> queryWrapper) {
+        return mapper.selectList(queryWrapper);
+    }
+
+    @Override
+    public Integer queryCount(Wrapper<ObjectDigital> queryWrapper) {
+        return mapper.selectCount(queryWrapper);
+    }
+
+    @Override
+    public Page queryByCondition(Page page, Wrapper<ObjectDigital> queryWrapper) {
+        return mapper.selectPage(page, queryWrapper);
+    }
 }

+ 5 - 0
dmp-comp/dmp-digital-starter/src/main/java/com/persagy/dmp/basic/dto/RequestData.java

@@ -318,4 +318,9 @@ public class RequestData {
     @JsonProperty("groups")
     @JSONField(name = "groups")
     private List<String> groups;
+
+    /** distinct 查询 系统定制 **/
+    @JsonProperty("projection")
+    @JSONField(name = "projection")
+    private List<String> projection;
 }

+ 2 - 0
dmp-comp/dmp-digital-starter/src/main/java/com/persagy/dmp/digital/entity/ObjectDigital.java

@@ -43,6 +43,8 @@ public class ObjectDigital extends AuditableEntity {
     /** 对象本地名称 */
     public static final String LOCAL_NAME = "local_name";
     /** 对象本地编码 */
+    public static final String LOCAL_ID_HUM = "localId";
+    /** 对象本地编码 */
     public static final String LOCAL_ID = "local_id";
     /** 对象名称 */
     public static final String NAME = "name";

+ 22 - 0
dmp-comp/dmp-digital-starter/src/main/java/com/persagy/dmp/simple/client/DigitalObjectSimpleClient.java

@@ -1,6 +1,7 @@
 package com.persagy.dmp.simple.client;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.persagy.dmp.basic.config.DigitalFeignConfig;
 import com.persagy.dmp.basic.dto.RequestData;
 import com.persagy.dmp.common.model.response.CommonResult;
@@ -98,4 +99,25 @@ public interface DigitalObjectSimpleClient {
     Page<Map<String,Object>> queryNotSureSystem(@RequestParam("groupCode") String groupCode, @RequestParam("projectId") String projectId,
                                                 @RequestParam("appId") String appId,
                                                 @RequestParam("userId") String userId, @RequestBody RequestData requestData);
+    /**
+     * 根据条件查询系统 针对查询条件中有distinct 和 projectiond 的情况
+     * {
+     *     "distinct": true,
+     *     "pageNumber": 1,
+     *     "pageSize": 1000,
+     *     "projection": [
+     *         "classCode",
+     *         "CategoryName"
+     *     ]
+     * }
+     * @param groupCode: 集团编码
+     * @param appId: 应用ID
+     * @param userId: 用户ID
+     * @param requestData: 请求参数
+     * @return
+     */
+    @PostMapping("custom/system/querySystemListByConditions")
+    CommonResult<List<ObjectNode>> querySystemListByConditions(@RequestParam("groupCode") String groupCode, @RequestParam("projectId") String projectId,
+                                                               @RequestParam("appId") String appId,
+                                                               @RequestParam("userId") String userId, @RequestBody RequestData requestData);
 }

+ 25 - 0
dmp-comp/dmp-digital-starter/src/main/java/com/persagy/dmp/simple/client/DigitalObjectSimpleFacade.java

@@ -2,6 +2,7 @@ package com.persagy.dmp.simple.client;
 
 import cn.hutool.extra.spring.SpringUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.persagy.dmp.basic.dto.RequestData;
 import com.persagy.dmp.common.model.response.CommonResult;
 import com.persagy.dmp.common.utils.ResultHelper;
@@ -106,6 +107,30 @@ public class DigitalObjectSimpleFacade {
                                                                      @RequestParam("userId") String userId, @RequestBody RequestData requestData){
         Page<Map<String,Object>> result = client.queryNotSureSystem(groupCode, projectId,appId, userId, requestData);
         return result;
+    }
+
 
+    /**
+     * 根据条件查询系统 针对查询条件中有distinct 和 projectiond 的情况
+     * {
+     *     "distinct": true,
+     *     "pageNumber": 1,
+     *     "pageSize": 1000,
+     *     "projection": [
+     *         "classCode",
+     *         "CategoryName"
+     *     ]
+     * }
+     * @param groupCode: 集团编码
+     * @param appId: 应用ID
+     * @param userId: 用户ID
+     * @param requestData: 请求参数
+     * @return
+     */
+    public static CommonResult<List<ObjectNode>> querySystemListByConditions(@RequestParam("groupCode") String groupCode, @RequestParam("projectId") String projectId,
+                                                               @RequestParam("appId") String appId,
+                                                               @RequestParam("userId") String userId, @RequestBody RequestData requestData){
+        CommonResult<List<ObjectNode>> result = client.querySystemListByConditions(groupCode, projectId,appId, userId, requestData);
+        return result;
     }
 }