ludc
2024-10-17 d02571d59633367ac76b7f58ab38584698b1aa1b
高级查询中增加范围查询功能
已修改3个文件
196 ■■■■ 文件已修改
Source/UBCS-WEB/src/components/advanced-query/advancedQuery.vue 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/MybatisParameterUtil.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/advanced-query/advancedQuery.vue
@@ -144,6 +144,9 @@
        }, {
          value: "_notlike",
          label: "不包含",
        },{
          value: "_in",
          label: "范围(,间隔)",
        }
      ],
      // 字段类型是单选或下拉框类型的条件数组
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/MybatisParameterUtil.java
@@ -14,7 +14,7 @@
import java.util.Map;
/**
 * in 参数截取,返回wrapper
 * in 参数截取,返回wrapper/或者where条件字符串
 *
 * @author ludc
 * @date 2023/5/5
@@ -22,6 +22,76 @@
public class MybatisParameterUtil {
    /**
     * Oracle IN 查询的最大参数限制
      */
    private static final int MAX_IN_CLAUSE_SIZE = 1000;
    /**
     * 将给定的 ID 列表转换为适合 Oracle 的查询条件
     *
     * @param ids ID 列表
     * @return 适合 Oracle 的查询条件
     */
    public static String convertToOrConditions(String filed,List<String> ids) {
        if (ids == null || ids.isEmpty()) {
            return "";
        }
        StringBuilder queryBuilder = new StringBuilder();
        int size = ids.size();
        // 分批处理,避免超过 Oracle IN 查询的最大限制
        for (int i = 0; i < size; i += MAX_IN_CLAUSE_SIZE) {
            int end = Math.min(i + MAX_IN_CLAUSE_SIZE, size);
            List<String> subList = ids.subList(i, end);
            if (queryBuilder.length() > 0) {
                queryBuilder.append(" OR ");
            }
            queryBuilder.append("(")
                .append(getInClause(filed,subList)).append(")");
        }
        return queryBuilder.toString();
    }
     /*
     * 获取 IN 查询条件字符串
     * @param ids ID 列表
     * @return IN 查询条件字符串
     */
    private static String getInClause(String filed,List<String> ids) {
        StringBuilder inClauseBuilder = new StringBuilder();
        inClauseBuilder.append(filed + " IN (");
        for (int i = 0; i < ids.size(); i++) {
            inClauseBuilder.append("'").append(ids.get(i)).append("'");
            if (i < ids.size() - 1) {
                inClauseBuilder.append(", ");
            }
        }
        inClauseBuilder.append(")");
        return inClauseBuilder.toString();
    }
    /**
     * 获取 IN 查询条件字符串(不包含in)
     *
     * @param ids ID 列表
     * @return IN 查询条件字符串
     */
    public static String getInClause(List<String> ids) {
        StringBuilder inClauseBuilder = new StringBuilder();
        for (int i = 0; i < ids.size(); i++) {
            inClauseBuilder.append("'").append(ids.get(i)).append("'");
            if (i < ids.size() - 1) {
                inClauseBuilder.append(", ");
            }
        }
        return inClauseBuilder.toString();
    }
    /**
     * in作为查询条件时,防止大于1000出现报错,对条件进行截取,连表查询的wrapper
     * @param wrapper MPJLambdaWrapper,不进行连表查询时使用
     * @param column 作为in的条件列
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java
@@ -2050,7 +2050,7 @@
    @Override
    public DataGrid<Map<String, String>> queryGrid(String btmType, CodeClassifyTemplateVO templateVO, Map<String, String> conditionMap, PageHelper pageHelper) {
        CodeTemplateAttrSqlBO sqlBO = getSqlByTemplateVO(btmType, templateVO, conditionMap, pageHelper);
//        List<Map> maps = boService.queryByOnlySqlForMap(sqlBO.getSqlHasPage());
        // List<Map> maps = boService.queryByOnlySqlForMap(sqlBO.getSqlHasPage());
        List<Map<String, String>> maps = null;
        try {
            maps = commonsMapper.queryByOnlySqlForMap(sqlBO.getSqlHasPage());
@@ -2070,39 +2070,39 @@
                for (String s : map.keySet()) {
                    data.put(s.toLowerCase(Locale.ROOT), map.get(s) == null ? null : String.valueOf(map.get(s)));
                }
//                map.forEach((key, value) -> {
//                    data.put(((String) key).toLowerCase(Locale.ROOT), String.valueOf(value));
//                });
                //    map.forEach((key, value) -> {
                //        data.put(((String) key).toLowerCase(Locale.ROOT), String.valueOf(value));
                //    });
                dataList.add(data);
            });
            wrapperData(dataList, templateVO, sqlBO.getSelectFieldList(), false);
//            maps.stream().forEach(map -> {
//                Map<String, String> data = new HashMap<>();
////                map.forEach((key, value) -> {
////                    data.put(((String) key).toLowerCase(Locale.ROOT), String.valueOf(value));
////                });
//                for (String s : map.keySet()) {
//                    data.put(((String) s).toLowerCase(Locale.ROOT), String.valueOf(map.get(s)));
//                }
//                dataList.add(data);
//            });
            // maps.stream().forEach(map -> {
            //     Map<String, String> data = new HashMap<>();
            //     map.forEach((key, value) -> {
            //         data.put(((String) key).toLowerCase(Locale.ROOT), String.valueOf(value));
            //     });
            //     for (String s : map.keySet()) {
            //         data.put(((String) s).toLowerCase(Locale.ROOT), String.valueOf(map.get(s)));
            //     }
            //     dataList.add(data);
            // });
        }
//        dataGrid.setData(dataList);
//        if (!CollectionUtils.isEmpty(maps)) {
//            wrapperData(maps, templateVO, sqlBO.getSelectFieldList(), false);
//            maps.stream().forEach(map -> {
//                Map<String, String> data = new HashMap<>();
////                map.forEach((key, value) -> {
////                    data.put(((String) key).toLowerCase(Locale.ROOT), String.valueOf(value));
////                });
//                for (String s : map.keySet()) {
//                    data.put(((String) s).toLowerCase(Locale.ROOT), String.valueOf(map.get(s)));
//                }
//                dataList.add(data);
//            });
        //        dataGrid.setData(dataList);
        //        if (!CollectionUtils.isEmpty(maps)) {
        //            wrapperData(maps, templateVO, sqlBO.getSelectFieldList(), false);
        //            maps.stream().forEach(map -> {
        //                Map<String, String> data = new HashMap<>();
        ////                map.forEach((key, value) -> {
        ////                    data.put(((String) key).toLowerCase(Locale.ROOT), String.valueOf(value));
        ////                });
        //                for (String s : map.keySet()) {
        //                    data.put(((String) s).toLowerCase(Locale.ROOT), String.valueOf(map.get(s)));
        //                }
        //                dataList.add(data);
        //            });
        dataGrid.setData(dataList);
        dataGrid.setTotal(Long.parseLong(commonsMapper.selectBySql(sqlBO.getSqlCount()).get(0).values().toArray()[0].toString()));
//        }
        //        }
        return dataGrid;
    }
@@ -2179,7 +2179,7 @@
                    userVOMap.put(String.valueOf(data.getId()), data);
                }
            }
//            Map<String, SmUserVO> userVOMap = Optional.ofNullable(userQueryService.listUserByUserIds(userIds)).orElseGet(() -> new ArrayList<>()).stream().collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
            // Map<String, SmUserVO> userVOMap = Optional.ofNullable(userQueryService.listUserByUserIds(userIds)).orElseGet(() -> new ArrayList<>()).stream().collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
            dataMap.stream().forEach(data -> {
                String creator = data.getOrDefault("creator", null);
                if (StringUtils.isNotBlank(creator) && userVOMap.containsKey(creator.toLowerCase(Locale.ROOT))) {
@@ -2569,8 +2569,19 @@
                if (referFieldMap.containsKey(field)) {
                    return VciBaseUtil.toInSql(referFieldMap.get(field), value);  //referFieldMap.get(field) + SPACE + "= '" + value + "'" + SPACE;
                } else {
                    return (field.contains(".") ? "" : "t.") + field + SPACE + "= " + getStringValueInWhere(field, value, attrVOMap) + "" + SPACE;
                    //TODO:暂时没考虑IN>1000条的问题
                    //return (field.contains(".") ? "" : "t.") + field + SPACE + "= " + getStringValueInWhere(field, value, attrVOMap) + "" + SPACE;
                    return (field.contains(".") ? "" : "t.") + field + SPACE + "IN (" + getStringValueInWhere(field, "IN//"+value, attrVOMap) + ")" + SPACE;
                }
            } else if (key.endsWith("_notin")) {
                String field = UBCSSqlKeyword.getColumn(key, "_in");
                if (referFieldMap.containsKey(field)) {
                    return VciBaseUtil.toInSql(referFieldMap.get(field), value);  //referFieldMap.get(field) + SPACE + "= '" + value + "'" + SPACE;
                } else {
                    //return (field.contains(".") ? "" : "t.") + field + SPACE + "not in (" + getStringValueInWhere(field, "IN//"+value, attrVOMap) + ")" + SPACE;
                    return (field.contains(".") ? "" : "t.") + field + SPACE + "IN (" + getStringValueInWhere(field, "IN//"+value, attrVOMap) + ")" + SPACE;
                }
            } else {
//                if (referFieldMap.containsKey(key)) {
//                    //说明是参照的,我们参照的查询都认为是字符串,如果是时间格式的查询肯定有问题,
@@ -2667,13 +2678,21 @@
                    || VciFieldTypeEnum.VTInteger.equals(fieldTypeEnum)) {
                    return value;
                } else {
                    if(value.contains("IN//")){
                        return MybatisParameterUtil.getInClause(Func.toStrList(value.replace("IN//","")));
                    }
                    return "'" + value + "'";
                }
            } else {
                if ((value.startsWith("(") && value.endsWith(")")) || (value.startsWith("'") && value.endsWith("'"))) {
                    return value;
                }else if(value.contains("IN//")){
                    //暂时不考虑>1000的情况,因为搜索一般也不会出现搜索1000条的情况
                    //return MybatisParameterUtil.convertToOrConditions(field, Func.toStrList(value.replace("IN//","")));
                    return MybatisParameterUtil.getInClause(Func.toStrList(value.replace("IN//","")));
                }else{
                    return "'" + value + "'";
                }
                return "'" + value + "'";
            }
        }
@@ -3042,26 +3061,26 @@
            }
        });
        return mapDataGrid;
//        List<String> selectFieldList = templateVO.getAttributes().stream().map(CodeClassifyTemplateAttrVO::getId).collect(Collectors.toList());
//        //参照让平台直接查询就行
//        List<String> finalSelectFieldList = selectFieldList;
//        List<CodeClassifyTemplateAttrVO> referAttrVOs = templateVO.getAttributes().stream().filter(
//                s -> StringUtils.isNotBlank(s.getReferbtmid())
//                        &&
//                        (finalSelectFieldList.size() ==0 || finalSelectFieldList.contains(s.getId().toLowerCase(Locale.ROOT)))
//        ).collect(Collectors.toList());
//        if(!CollectionUtils.isEmpty(referAttrVOs)){
//            for (int i = 0; i < referAttrVOs.size(); i++) {
//                selectFieldList.add(referAttrVOs.get(i).getId() + ".name");
//            }
//        }
//        //我们使用和业务类型的来查询
//        DataGrid<Map<String,String>> dataGrid = boService.queryGridByBo(btmTypeId, conditionMap, pageHelper, selectFieldList);
//        //我们需要使用模板来转换
//        if(!CollectionUtils.isEmpty(dataGrid.getData())){
//            wrapperData(dataGrid.getData(),templateVO,finalSelectFieldList,false);
//        }
//        return dataGrid;
        //        List<String> selectFieldList = templateVO.getAttributes().stream().map(CodeClassifyTemplateAttrVO::getId).collect(Collectors.toList());
        //        //参照让平台直接查询就行
        //        List<String> finalSelectFieldList = selectFieldList;
        //        List<CodeClassifyTemplateAttrVO> referAttrVOs = templateVO.getAttributes().stream().filter(
        //                s -> StringUtils.isNotBlank(s.getReferbtmid())
        //                        &&
        //                        (finalSelectFieldList.size() ==0 || finalSelectFieldList.contains(s.getId().toLowerCase(Locale.ROOT)))
        //        ).collect(Collectors.toList());
        //        if(!CollectionUtils.isEmpty(referAttrVOs)){
        //            for (int i = 0; i < referAttrVOs.size(); i++) {
        //                selectFieldList.add(referAttrVOs.get(i).getId() + ".name");
        //            }
        //        }
        //        //我们使用和业务类型的来查询
        //        DataGrid<Map<String,String>> dataGrid = boService.queryGridByBo(btmTypeId, conditionMap, pageHelper, selectFieldList);
        //        //我们需要使用模板来转换
        //        if(!CollectionUtils.isEmpty(dataGrid.getData())){
        //            wrapperData(dataGrid.getData(),templateVO,finalSelectFieldList,false);
        //        }
        //        return dataGrid;
    }
    /**