QueryUtil.java 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. package jnpf.util;
  2. import cn.hutool.core.util.ObjectUtil;
  3. import com.baomidou.mybatisplus.annotation.TableField;
  4. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  5. import jnpf.database.model.superQuery.SuperJsonModel;
  6. import jnpf.database.model.superQuery.SuperQueryJsonModel;
  7. import jnpf.emnus.SearchMethodEnum;
  8. import jnpf.model.QueryAllModel;
  9. import jnpf.model.visualJson.FieLdsModel;
  10. import jnpf.model.visualJson.config.ConfigModel;
  11. import jnpf.onlinedev.util.onlineDevUtil.OnlineProductSqlUtils;
  12. import lombok.Data;
  13. import org.apache.poi.ss.formula.functions.T;
  14. import java.lang.reflect.Field;
  15. import java.util.ArrayList;
  16. import java.util.List;
  17. import java.util.Map;
  18. @Data
  19. public class QueryUtil {
  20. /**
  21. * 运算符
  22. */
  23. private SearchMethodEnum symbol;
  24. /**
  25. * 逻辑拼接符号
  26. */
  27. private boolean and;
  28. /**
  29. * 组件标识
  30. */
  31. private String jnpfKey;
  32. /**
  33. * 字段key
  34. */
  35. private String vModel;
  36. /**
  37. * 自定义的值
  38. */
  39. private Object fieldValue;
  40. /**
  41. * 自定义的值2
  42. */
  43. private Object fieldValueTwo;
  44. /**
  45. * 实体对象
  46. */
  47. private Map<String, Class> classMap;
  48. /**
  49. * 数据库类型
  50. */
  51. private String dbType;
  52. private Boolean isSqlServer = false;
  53. private List<String> dataList = new ArrayList<>();
  54. public <T> MPJLambdaWrapper<T> queryList(QueryAllModel queryAllModel) {
  55. MPJLambdaWrapper<T> wrapper = queryAllModel.getWrapper();
  56. classMap = queryAllModel.getClassMap();
  57. dbType = queryAllModel.getDbType();
  58. isSqlServer = "Microsoft SQL Server".equalsIgnoreCase(dbType);
  59. List<List<SuperJsonModel>> superJsonModelList = queryAllModel.getQueryList();
  60. for (List<SuperJsonModel> list : superJsonModelList) {
  61. boolean flag = false;
  62. for (SuperJsonModel superJsonModel : list) {
  63. if (superJsonModel.getConditionList().size() > 0) {
  64. for (SuperQueryJsonModel item : superJsonModel.getConditionList()) {
  65. if (item.getGroups().size() > 0) {
  66. flag = true;
  67. }
  68. }
  69. }
  70. }
  71. if (list.size() > 0 && flag) {
  72. wrapper.and(gw -> {
  73. for (SuperJsonModel superJsonModel : list) {
  74. String matchLogic = superJsonModel.getMatchLogic();
  75. Boolean authorizeLogic = superJsonModel.getAuthorizeLogic();
  76. boolean isAddMatchLogic = SearchMethodEnum.And.getSymbol().equalsIgnoreCase(matchLogic);
  77. List<SuperQueryJsonModel> conditionList = superJsonModel.getConditionList();
  78. if (conditionList.size() == 0) continue;
  79. //参数值转换
  80. OnlineProductSqlUtils.superList(conditionList, true);
  81. if (authorizeLogic) {
  82. gw.and(tw -> {
  83. queryWrapperList(tw, conditionList, isAddMatchLogic);
  84. });
  85. } else {
  86. gw.or(tw -> {
  87. queryWrapperList(tw, conditionList, isAddMatchLogic);
  88. });
  89. }
  90. }
  91. });
  92. }
  93. }
  94. return wrapper;
  95. }
  96. private <T> void queryWrapperList(MPJLambdaWrapper<T> tw, List<SuperQueryJsonModel> conditionList, boolean isAddMatchLogic) {
  97. for (SuperQueryJsonModel superQueryJsonModel : conditionList) {
  98. String logic = superQueryJsonModel.getLogic();
  99. and = SearchMethodEnum.And.getSymbol().equalsIgnoreCase(logic);
  100. List<FieLdsModel> queryList = superQueryJsonModel.getGroups();
  101. if (queryList.size() > 0) {
  102. queryWrapper(tw, queryList, isAddMatchLogic);
  103. }
  104. }
  105. }
  106. private <T> void queryWrapper(MPJLambdaWrapper<T> tw, List<FieLdsModel> queryListAll, boolean isAnd) {
  107. if (isAnd) {
  108. tw.and(qw -> {
  109. query(qw, queryListAll);
  110. });
  111. } else {
  112. tw.or(qw -> {
  113. query(qw, queryListAll);
  114. });
  115. }
  116. }
  117. private <T> void query(MPJLambdaWrapper<T> qw, List<FieLdsModel> queryListAll) {
  118. for (FieLdsModel fieLdsModel : queryListAll) {
  119. List<FieLdsModel> queryList = new ArrayList() {{
  120. add(fieLdsModel);
  121. }};
  122. if (and) {
  123. qw.and(ew -> {
  124. fieldsModel(ew, queryList);
  125. });
  126. } else {
  127. qw.or(ew -> {
  128. fieldsModel(ew, queryList);
  129. });
  130. }
  131. }
  132. }
  133. private void fieldsModel(MPJLambdaWrapper wrapper, List<FieLdsModel> queryList) {
  134. for (FieLdsModel fieLdsModel : queryList) {
  135. ConfigModel config = fieLdsModel.getConfig();
  136. jnpfKey = config.getJnpfKey();
  137. symbol = SearchMethodEnum.getSearchMethod(fieLdsModel.getSymbol());
  138. vModel = fieLdsModel.getVModel();
  139. if (!and) {
  140. wrapper.or();
  141. }
  142. String table = ObjectUtil.isNotEmpty(config.getRelationTable()) ? config.getRelationTable() : config.getTableName();
  143. Class<T> tClass = classMap.get(table);
  144. try {
  145. Field declaredField = null;
  146. Field[] declaredFields = tClass.getDeclaredFields();
  147. for (Field item : declaredFields) {
  148. String tableFieldName = item.getAnnotation(TableField.class) == null ? "" : item.getAnnotation(TableField.class).value();
  149. if (vModel.equalsIgnoreCase(tableFieldName) || item.getName().equals(vModel)) {
  150. declaredField = item;
  151. break;
  152. }
  153. }
  154. declaredField.setAccessible(true);
  155. vModel = table + "." + declaredField.getAnnotation(TableField.class).value();
  156. } catch (Exception e) {
  157. e.printStackTrace();
  158. }
  159. fieldValue = fieLdsModel.getFieldValueOne();
  160. fieldValueTwo = fieLdsModel.getFieldValueTwo();
  161. dataList = fieLdsModel.getDataList();
  162. getSymbolWrapper(wrapper);
  163. }
  164. }
  165. private void getNullWrapper(MPJLambdaWrapper<?> wrapper) {
  166. if (!and) {
  167. wrapper.or(t -> t.isNull(vModel));
  168. } else {
  169. wrapper.and(t -> t.isNull(vModel));
  170. }
  171. }
  172. private void getNotNullWrapper(MPJLambdaWrapper<?> wrapper) {
  173. if (!and) {
  174. wrapper.or(t -> t.isNotNull(vModel));
  175. } else {
  176. wrapper.and(t -> t.isNotNull(vModel));
  177. }
  178. }
  179. private void getInWrapper(MPJLambdaWrapper<?> wrapper) {
  180. if (!and) {
  181. wrapper.or(qw -> {
  182. for (String id : dataList) {
  183. if (isSqlServer) {
  184. id = String.valueOf(id).replaceAll("\\[", "[[]");
  185. }
  186. switch (symbol) {
  187. case Included:
  188. qw.or().like(vModel, id);
  189. break;
  190. default:
  191. qw.notLike(vModel, id);
  192. break;
  193. }
  194. }
  195. });
  196. } else {
  197. wrapper.and(qw -> {
  198. for (String id : dataList) {
  199. if (isSqlServer) {
  200. id = String.valueOf(id).replaceAll("\\[", "[[]");
  201. }
  202. switch (symbol) {
  203. case Included:
  204. qw.or().like(vModel, id);
  205. break;
  206. default:
  207. qw.notLike(vModel, id);
  208. break;
  209. }
  210. }
  211. });
  212. }
  213. }
  214. private void getSymbolWrapper(MPJLambdaWrapper<?> wrapper) {
  215. switch (symbol) {
  216. case IsNull:
  217. getNullWrapper(wrapper);
  218. break;
  219. case IsNotNull:
  220. getNotNullWrapper(wrapper);
  221. break;
  222. case Equal:
  223. wrapper.eq(vModel, fieldValue);
  224. break;
  225. case NotEqual:
  226. wrapper.ne(vModel, fieldValue);
  227. break;
  228. case GreaterThan:
  229. wrapper.gt(vModel, fieldValue);
  230. break;
  231. case LessThan:
  232. wrapper.lt(vModel, fieldValue);
  233. break;
  234. case GreaterThanOrEqual:
  235. wrapper.ge(vModel, fieldValue);
  236. break;
  237. case LessThanOrEqual:
  238. wrapper.le(vModel, fieldValue);
  239. break;
  240. case Like:
  241. if (isSqlServer) {
  242. fieldValue = String.valueOf(fieldValue).replaceAll("\\[", "[[]");
  243. }
  244. wrapper.like(vModel, fieldValue);
  245. break;
  246. case NotLike:
  247. if (isSqlServer) {
  248. fieldValue = String.valueOf(fieldValue).replaceAll("\\[", "[[]");
  249. }
  250. wrapper.notLike(vModel, fieldValue);
  251. break;
  252. case Included:
  253. case NotIncluded:
  254. getInWrapper(wrapper);
  255. break;
  256. case Between:
  257. wrapper.between(vModel, fieldValue, fieldValueTwo);
  258. break;
  259. default:
  260. break;
  261. }
  262. }
  263. }