ludc
2023-06-16 64decfa5272a6b068c3afb6ea5f071a0fdbb9b21
修改bug,添加高级查询SQL拼接方法
已修改4个文件
132 ■■■■ 文件已修改
Source/UBCS-WEB/.gitignore 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/UBCSSqlKeyword.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyTemplateAttrServiceImpl.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java 102 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/.gitignore
@@ -1,6 +1,6 @@
.DS_Store
node_modules
/dist
# /dist
/tests/e2e/videos/
/tests/e2e/screenshots/
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/UBCSSqlKeyword.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.vci.ubcs.starter.web.util.VciDateUtil;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.StringUtil;
@@ -35,6 +36,7 @@
    private static final String IS_NULL = "_null";
    private static final String NOT_NULL = "_notnull";
    private static final String IGNORE = "_ignore";
    public UBCSSqlKeyword() {
    }
@@ -234,13 +236,14 @@
     * @param keyword
     * @return
     */
    private static String getColumn(String column, String keyword) {
    public static String getColumn(String column, String keyword) {
        //没有转下划线映射
        return StringUtil.removeSuffix(column, keyword).toLowerCase(Locale.ROOT);
        return StringUtil.removeSuffix(column, keyword).toLowerCase(Locale.ROOT).trim();
    }
    public static String filter(String param) {
        return param == null ? null : param.replaceAll("(?i)'|%|--|insert|delete|select|count|group|union|drop|truncate|alter|grant|execute|exec|xp_cmdshell|call|declare|sql", "");
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyTemplateAttrServiceImpl.java
@@ -69,11 +69,6 @@
    @Resource
    private CodeClassifyTemplateAttrMapper codeClassifyTemplateAttrMapper;
    //    @Resource
    //    CodeClstempattrMapper codeClstempattrMapper;
        //    @Resource
    //    ICodeTempphaseService codeTempphaseService;
    @Resource
    IDictBizClient iDictBizClient;
@@ -723,8 +718,8 @@
        }
        //这个模板下已经有的属性
//        VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(CodeClassifyTemplateAttrDO.class);
//        queryWrapper.addQueryMap("CLASSIFYTEMPLATEOID",templateAttrOid);
        // VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(CodeClassifyTemplateAttrDO.class);
        // queryWrapper.addQueryMap("CLASSIFYTEMPLATEOID",templateAttrOid);
        Map<String,Object> condition = new HashMap<>(1);
        condition.put("CLASSIFYTEMPLATEOID",templateAttrOid);
        List<CodeClassifyTemplateAttr> codeClassifyTemplateAttrDOList = baseMapper.selectByMap(condition);
@@ -779,21 +774,13 @@
        CodeClassifyTemplate codeClassifyTemplateDO = codeClassifyTemplateMapper.selectById(templateAttrOid);
        //这个业务类型下的所有属性
        // TODO 待完善
        List<BtmTypeAttributeVO> boAttrs =  null; // (List<BtmTypeAttributeVO>) attributeClient.selectById(codeClassifyTemplateDO.getBtmTypeId());//this.btmService.listAttributeByBtmIdHasDefault(codeClassifyTemplateDO.getBtmTypeId());
//        codeOsbtmtypeattributeMapper.selectById(codeClassifyTemplateDO.getBtmTypeId());
//        BeanUtils.copyProperties(codeOsbtmtypeattributeMapper.selectById(codeClassifyTemplateDO.getBtmTypeId()),boAttrs);
        // TODO 已完善
        List<BtmTypeAttributeVO> boAttrs =  (List<BtmTypeAttributeVO>) btmTypeClient.getAllAttributeByBtmId(codeClassifyTemplateDO.getBtmTypeId());
        //这个模板下已经有的属性
        //把默认的属性也添加到boAttrs
        if(boAttrs == null){
            boAttrs = new ArrayList<>();
        }
//        VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(CodeClassifyTemplateAttrDO.class);
//        queryWrapper.addQueryMap("CLASSIFYTEMPLATEOID",templateAttrOid);
//        Map<String,Object> condition = new HashMap<>(1);
//        condition.put("CLASSIFYTEMPLATEOID",templateAttrOid);
        QueryWrapper<CodeClassifyTemplateAttr> wrapper=new QueryWrapper<>();
        wrapper.eq("CLASSIFYTEMPLATEOID",templateAttrOid);
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java
@@ -18,6 +18,7 @@
import com.vci.ubcs.code.mapper.CodeWupinMapper;
import com.vci.ubcs.code.mapper.CommonsMapper;
import com.vci.ubcs.code.service.*;
import com.vci.ubcs.code.util.ClientBusinessObject;
import com.vci.ubcs.code.vo.CodeKeyAttrRepeatVO;
import com.vci.ubcs.code.vo.pagemodel.UITableFieldVO;
import com.vci.ubcs.code.vo.pagemodel.UITablePageVO;
@@ -36,6 +37,7 @@
import com.vci.ubcs.starter.revision.model.TreeQueryObject;
import com.vci.ubcs.starter.revision.model.TreeWrapperOptions;
import com.vci.ubcs.starter.revision.service.RevisionModelUtil;
import com.vci.ubcs.starter.util.UBCSSqlKeyword;
import com.vci.ubcs.starter.web.constant.QueryOptionConstant;
import com.vci.ubcs.starter.web.constant.RegExpConstant;
import com.vci.ubcs.starter.web.enumpck.BooleanEnum;
@@ -60,6 +62,8 @@
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.StringPool;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.Cache;
@@ -326,6 +330,7 @@
        }
        return comboboxKVs;
    }
    /**
     * 修改状态
     *
@@ -1711,10 +1716,10 @@
            });
            andCondtionMap.forEach((k, v) -> {
                andSql.add(getConditionSql(k.toLowerCase(), v, referFieldMap, attrVOMap));
                andSql.add(getConditionSql(k.toLowerCase(), v, referFieldMap, attrVOMap,btmType));
            });
            orConditionMap.forEach((k, v) -> {
                orSql.add(getConditionSql(k.toLowerCase(), v, referFieldMap, attrVOMap));
                orSql.add(getConditionSql(k.toLowerCase(), v, referFieldMap, attrVOMap,btmType));
            });
        }
        //组合起来
@@ -1786,7 +1791,65 @@
     * @param attrVOMap     属性的映射
     * @return Sql语句
     */
    private String getConditionSql(String key, String value, Map<String/**参照的属性**/, String/**实际的属性**/> referFieldMap, Map<String, CodeClassifyTemplateAttrVO> attrVOMap) {
    private String getConditionSql(String key, String value, Map<String/**参照的属性**/, String/**实际的属性**/> referFieldMap, Map<String, CodeClassifyTemplateAttrVO> attrVOMap,String btmType) {
        /*if (!Func.hasEmpty(new Object[]{key,value}) && !key.endsWith("_ignore")) {
            if (key.endsWith("_like")) {
                String field = UBCSSqlKeyword.getColumn(key, "_like");
                if (referFieldMap.containsKey(field)) {
                    //说明还是参照里面的,我们默认这种情况下都是字符串吧,因为参照的属性不一定用的平台的属性池里的,所以大部分情况下,显示的属性都是字符串吧
                    return referFieldMap.get(field) + SPACE + "LIKE" + SPACE + "concat(%,"+"concat('" + value + "'" + SPACE+",%)";
                } else {
                    return (field.contains(".") ? "" : "t.") + field + SPACE + " <= " + getStringValueInWhere(field, value, attrVOMap);
                }
            } else if (key.endsWith("_notequal")) {
                qw.ne(UBCSSqlKeyword.getColumn(key, "_notequal"), v);
            } else if (key.endsWith("_likeleft")) {
                qw.likeLeft(UBCSSqlKeyword.getColumn(key, "_likeleft"), v);
            } else if (key.endsWith("_likeright")) {
                qw.likeRight(UBCSSqlKeyword.getColumn(key, "_likeright"), v);
            } else if (key.endsWith("_notlike")) {
                qw.notLike(UBCSSqlKeyword.getColumn(key, "_notlike"), v);
            } else if (key.endsWith("_ge")) {
                String field = UBCSSqlKeyword.getColumn(key, "_ge");
                if (referFieldMap.containsKey(field)) {
                    //说明还是参照里面的,我们默认这种情况下都是字符串吧,因为参照的属性不一定用的平台的属性池里的,所以大部分情况下,显示的属性都是字符串吧
                    return referFieldMap.get(field) + SPACE + " >= '" + value + "'" + SPACE;
                } else {
                    return (field.contains(".") ? "" : "t.") + field + SPACE + " >= " + getStringValueInWhere(value, field, attrVOMap);
                }
            } else if (key.endsWith("_le")) {
                //说明是<=的。我们需要先获取一下
                String field = UBCSSqlKeyword.getColumn(key, "_le");
                if (referFieldMap.containsKey(field)) {
                    //说明还是参照里面的,我们默认这种情况下都是字符串吧,因为参照的属性不一定用的平台的属性池里的,所以大部分情况下,显示的属性都是字符串吧
                    return referFieldMap.get(field) + SPACE + " <= '" + value + "'" + SPACE;
                } else {
                    return (field.contains(".") ? "" : "t.") + field + SPACE + " <= " + getStringValueInWhere(field, value, attrVOMap);
                }
            } else if (key.endsWith("_gt")) {
                qw.gt(UBCSSqlKeyword.getColumn(key, "_gt"), v);
            } else if (key.endsWith("_lt")) {
                qw.lt(UBCSSqlKeyword.getColumn(key, "_lt"), v);
            } else if (key.endsWith("_datege")) {
                qw.ge(UBCSSqlKeyword.getColumn(key, "_datege"), DateUtil.parse(String.valueOf(v), "yyyy-MM-dd HH:mm:ss"));
            } else if (key.endsWith("_dategt")) {
                qw.gt(UBCSSqlKeyword.getColumn(key, "_dategt"), DateUtil.parse(String.valueOf(v), "yyyy-MM-dd HH:mm:ss"));
            } else if (key.endsWith("_dateequal")) {
                qw.eq(UBCSSqlKeyword.getColumn(key, "_dateequal"), DateUtil.parse(String.valueOf(v), "yyyy-MM-dd HH:mm:ss"));
            } else if (key.endsWith("_datele")) {
                qw.le(UBCSSqlKeyword.getColumn(key, "_datele"), DateUtil.parse(String.valueOf(v), "yyyy-MM-dd HH:mm:ss"));
            } else if (key.endsWith("_datelt")) {
                qw.lt(UBCSSqlKeyword.getColumn(key, "_datelt"), DateUtil.parse(String.valueOf(v), "yyyy-MM-dd HH:mm:ss"));
            } else if (key.endsWith("_null")) {
                qw.isNull(UBCSSqlKeyword.getColumn(key, "_null"));
            } else if (key.endsWith("_notnull")) {
                qw.isNotNull(UBCSSqlKeyword.getColumn(key, "_notnull"));
            } else {
                qw.eq(UBCSSqlKeyword.getColumn(key, "_equal"), v);
            }
        }*/
        if (key.endsWith("_begin")) {
            //说明是>=的。我们需要先获取一下
            String field = (key.substring(0, key.length() - 6).toLowerCase().trim());
@@ -1809,12 +1872,11 @@
            if (referFieldMap.containsKey(key)) {
                //说明是参照的,我们参照的查询都认为是字符串,如果是时间格式的查询肯定有问题,
                String selectKey = referFieldMap.get(key);
                return getSqlByValue(selectKey, value, null);
                return getSqlByValue(selectKey, value, null,btmType);
            } else {
                return getSqlByValue(key, value, attrVOMap);
                return getSqlByValue(key, value, attrVOMap,btmType);
            }
        }
    }
    /**
@@ -1873,6 +1935,24 @@
    }
    /**
     * 查看是否默认属性
     * @param selectKey
     * @param btmType
     * @return
     */
    private boolean isDefaultAttr(String selectKey, String btmType){
        if(StringUtils.isBlank(btmType)){
            return false;
        }
        R<BtmTypeVO> r = btmTypeClient.getDefaultAttrByBtmId(btmType);
        List<BtmTypeAttributeVO> attributes = r.getData().getAttributes();
        if(r.getCode() != 200 || attributes.isEmpty()){
            return false;
        }
        return  attributes.stream().anyMatch(item->item.getId().equals(selectKey));
    }
    /**
     * 封装最终的sql语句中的值部分
     *
     * @param selectKey 查询的字段
@@ -1880,12 +1960,12 @@
     * @param attrVOMap 属性的显示对象映射
     * @return sql里的值
     */
    private String getSqlByValue(String selectKey, String value, Map<String, CodeClassifyTemplateAttrVO> attrVOMap) {
    private String getSqlByValue(String selectKey, String value, Map<String, CodeClassifyTemplateAttrVO> attrVOMap,String btmType) {
        StringBuilder sql = new StringBuilder();
        // TODO 待完善
        //    if (!selectKey.contains(".") && (attrVOMap.containsKey(selectKey.toLowerCase(Locale.ROOT)) || attributeService.isDefaultAttr(selectKey) || selectKey.matches(RegExpConstant.LETTER))) {
        //        sql.append("t.");
        //    }
        // TODO 已完善
        if (!selectKey.contains(".") && (attrVOMap.containsKey(selectKey.toLowerCase(Locale.ROOT)) || isDefaultAttr(selectKey,btmType) || selectKey.matches(RegExpConstant.LETTER))) {
            sql.append("t.");
        }
        if (value.startsWith(QueryOptionConstant.IN)) {
            sql.append(selectKey)
                .append(SPACE)