package jnpf.onlinedev.util; import cn.hutool.core.util.ObjectUtil; import jnpf.database.model.query.SuperQueryJsonModel; import jnpf.emnus.SearchMethodEnum; import jnpf.model.visualjson.FieLdsModel; import jnpf.model.visualjson.config.ConfigModel; import jnpf.permission.model.authorize.OnlineDynamicSqlModel; import lombok.Data; import org.mybatis.dynamic.sql.*; import java.util.ArrayList; import java.util.List; @Data public class OnlineQuerySqlUtils { /** * 运算符 */ private SearchMethodEnum symbol; /** * 逻辑拼接符号 */ private boolean and; /** * 组件标识 */ private String jnpfKey; /** * 字段key */ private String vModel; /** * 自定义的值 */ private Object fieldValue; /** * 自定义的值2 */ private Object fieldValueTwo; private VisitableCondition sqlCondition = null; private BindableColumn sqlColumn = null; private List groupList = new ArrayList<>(); private boolean isSqlServer = false; private boolean isOracle = false; private boolean isAddMatchLogic = false; private List dataList = new ArrayList<>(); public List getSuperSql(List conditionList, List sqlModelList, String databaseProductName, String matchLogic) { isSqlServer = databaseProductName.equalsIgnoreCase("Microsoft SQL Server"); isOracle = databaseProductName.equalsIgnoreCase("oracle"); isAddMatchLogic = SearchMethodEnum.AND.getSymbol().equalsIgnoreCase(matchLogic); List groupQueryList = new ArrayList<>(); OnlineProductSqlUtils.superList(conditionList); for (SuperQueryJsonModel queryJsonModel : conditionList) { List fieLdsModelList = queryJsonModel.getGroups(); String logic = queryJsonModel.getLogic(); and = SearchMethodEnum.AND.getSymbol().equalsIgnoreCase(logic); List groupListAll = new ArrayList<>(); for (FieLdsModel fieLdsModel : fieLdsModelList) { ConfigModel config = fieLdsModel.getConfig(); sqlCondition = null; sqlColumn = null; groupList = new ArrayList<>(); jnpfKey = config.getJnpfKey(); symbol = SearchMethodEnum.getSearchMethod(fieLdsModel.getSymbol()); vModel = fieLdsModel.getVModel(); fieldValue = fieLdsModel.getFieldValueOne(); fieldValueTwo = fieLdsModel.getFieldValueTwo(); dataList = fieLdsModel.getDataList(); String tableName = ObjectUtil.isNotEmpty(config.getRelationTable()) ? config.getRelationTable() : config.getTableName(); OnlineDynamicSqlModel onlineDynamicSqlModel = sqlModelList.stream().filter(sql -> sql.getTableName().equals(tableName)).findFirst().orElse(null); if (onlineDynamicSqlModel != null) { getSymbolWrapper(onlineDynamicSqlModel); groupListAll.addAll(groupList); } } if (!groupListAll.isEmpty()) { if (isAddMatchLogic) { groupQueryList.add(SqlBuilder.and(DerivedColumn.of("1"), SqlBuilder.isEqualTo(and ? 1 : 2), groupListAll.toArray(new AndOrCriteriaGroup[groupListAll.size()]))); } else { groupQueryList.add(SqlBuilder.or(DerivedColumn.of("1"), SqlBuilder.isEqualTo(and ? 1 : 2), groupListAll.toArray(new AndOrCriteriaGroup[groupListAll.size()]))); } } } return groupQueryList; } private void getSymbolWrapper(OnlineDynamicSqlModel onlineDynamicSqlModel) { SqlTable sqlTable = onlineDynamicSqlModel.getSqlTable(); sqlColumn = sqlTable.column(vModel); List list = new ArrayList<>(); switch (symbol) { case IS_NULL: sqlCondition = SqlBuilder.isNull(); list.add(SqlBuilder.and(sqlTable.column(vModel), sqlCondition)); break; case IS_NOT_NULL: sqlCondition = SqlBuilder.isNotNull(); list.add(SqlBuilder.and(sqlTable.column(vModel), sqlCondition)); break; case EQUAL: sqlCondition = SqlBuilder.isEqualTo(fieldValue); list.add(SqlBuilder.and(sqlTable.column(vModel), sqlCondition)); break; case NOT_EQUAL: sqlCondition = SqlBuilder.isNotEqualTo(fieldValue); list.add(SqlBuilder.and(sqlTable.column(vModel), sqlCondition)); break; case GREATER_THAN: sqlCondition = SqlBuilder.isGreaterThan(fieldValue); list.add(SqlBuilder.and(sqlTable.column(vModel), sqlCondition)); break; case LESS_THAN: sqlCondition = SqlBuilder.isLessThan(fieldValue); list.add(SqlBuilder.and(sqlTable.column(vModel), sqlCondition)); break; case GREATER_THAN_OR_EQUAL: sqlCondition = SqlBuilder.isGreaterThanOrEqualTo(fieldValue); list.add(SqlBuilder.and(sqlTable.column(vModel), sqlCondition)); break; case LESS_THAN_OR_EQUAL: sqlCondition = SqlBuilder.isLessThanOrEqualTo(fieldValue); list.add(SqlBuilder.and(sqlTable.column(vModel), sqlCondition)); break; case LIKE: if (isSqlServer) { fieldValue = String.valueOf(fieldValue).replace("\\[", "[[]"); } sqlCondition = SqlBuilder.isLike("%" + fieldValue + "%"); list.add(SqlBuilder.and(sqlTable.column(vModel), sqlCondition)); break; case NOT_LIKE: if (isSqlServer) { fieldValue = String.valueOf(fieldValue).replace("\\[", "[[]"); } sqlCondition = SqlBuilder.isNotLike("%" + fieldValue + "%"); list.add(SqlBuilder.and(sqlTable.column(vModel), sqlCondition)); break; case INCLUDED: case NOT_INCLUDED: getInWrapper(sqlTable, list); break; case BETWEEN: sqlCondition = SqlBuilder.isBetween(fieldValue).and(fieldValueTwo); list.add(SqlBuilder.and(sqlTable.column(vModel), SqlBuilder.isBetween(fieldValue).and(fieldValueTwo))); break; default: break; } if (!list.isEmpty()) { int n = 1; if (symbol.equals(SearchMethodEnum.INCLUDED)) { n = 2; } if (and) { groupList.add(SqlBuilder.and(DerivedColumn.of("1"), SqlBuilder.isEqualTo(n), list.toArray(new AndOrCriteriaGroup[list.size()]))); } else { groupList.add(SqlBuilder.or(DerivedColumn.of("1"), SqlBuilder.isEqualTo(n), list.toArray(new AndOrCriteriaGroup[list.size()]))); } } } private void getInWrapper(SqlTable sqlTable, List list) { for (String value : dataList) { if (isSqlServer) { value = String.valueOf(value).replace("\\[", "[[]"); } if (SearchMethodEnum.INCLUDED.equals(symbol)) { sqlCondition = SqlBuilder.isLike("%" + value + "%"); list.add(SqlBuilder.or(sqlTable.column(vModel), SqlBuilder.isLike("%" + value + "%"))); } else { sqlCondition = SqlBuilder.isNotLike("%" + value + "%"); list.add(SqlBuilder.and(sqlTable.column(vModel), SqlBuilder.isNotLike("%" + value + "%"))); } } } }