DataRangeInterceptor.java 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package com.hz.employmentsite.util.datarange;
  2. import com.hz.employmentsite.enums.DataRangeEnum;
  3. import com.hz.employmentsite.services.service.AccountService;
  4. import com.hz.employmentsite.util.CustomerApplicationContext;
  5. import com.hz.employmentsite.util.datarange.annotations.*;
  6. import com.hz.employmentsite.vo.user.DataRange;
  7. import org.apache.ibatis.cache.CacheKey;
  8. import org.apache.ibatis.executor.Executor;
  9. import org.apache.ibatis.mapping.BoundSql;
  10. import org.apache.ibatis.mapping.MappedStatement;
  11. import org.apache.ibatis.mapping.ResultMap;
  12. import org.apache.ibatis.plugin.Interceptor;
  13. import org.apache.ibatis.plugin.Intercepts;
  14. import org.apache.ibatis.plugin.Invocation;
  15. import org.apache.ibatis.plugin.Signature;
  16. import org.apache.ibatis.session.ResultHandler;
  17. import org.apache.ibatis.session.RowBounds;
  18. import java.lang.reflect.Field;
  19. import java.util.ArrayList;
  20. import java.util.Arrays;
  21. import java.util.List;
  22. import java.util.Map;
  23. @Intercepts({
  24. @Signature(
  25. type = Executor.class,
  26. method = "query",
  27. args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}
  28. ), @Signature(
  29. type = Executor.class,
  30. method = "query",
  31. args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class}
  32. )})
  33. public class DataRangeInterceptor implements Interceptor {
  34. DataRangeUtils dataRangeUtils;
  35. AccountService accountService;
  36. public DataRangeInterceptor() {
  37. dataRangeUtils = CustomerApplicationContext.getBean(DataRangeUtils.class);
  38. accountService = CustomerApplicationContext.getBean(AccountService.class);
  39. }
  40. static int MAPPED_STATEMENT_INDEX = 0;// 这是对应上面的args的序号
  41. static int PARAMETER_INDEX = 1;
  42. @Override
  43. public Object intercept(Invocation invocation) throws Throwable {
  44. Object[] args = invocation.getArgs();
  45. MappedStatement ms = (MappedStatement) args[MAPPED_STATEMENT_INDEX];
  46. Object parameter = args[PARAMETER_INDEX];
  47. RowBounds rowBounds = (RowBounds) args[2];
  48. ResultHandler resultHandler = (ResultHandler) args[3];
  49. Executor executor = (Executor) invocation.getTarget();
  50. CacheKey cacheKey;
  51. BoundSql boundSql;
  52. if (args.length == 4) {
  53. //4 个参数时
  54. boundSql = ms.getBoundSql(parameter);
  55. cacheKey = executor.createCacheKey(ms, parameter, rowBounds, boundSql);
  56. } else {
  57. //6 个参数时
  58. cacheKey = (CacheKey) args[4];
  59. boundSql = (BoundSql) args[5];
  60. }
  61. String mainSql = boundSql.getSql();
  62. List<ResultMap> resultMaps = ms.getResultMaps();
  63. Class<?> entityClass = resultMaps.get(0).getType();
  64. if (Map.class.isAssignableFrom(entityClass)) {
  65. return invocation.proceed();
  66. } else {
  67. String whereClause = "";
  68. try {
  69. DataRange dataRange = this.dataRangeUtils.getCurrentRange();
  70. if (dataRange == null || dataRange.getRange() == DataRangeEnum.ALL.getValue()) {
  71. return invocation.proceed();
  72. }
  73. whereClause = getJoinSql(entityClass, dataRange);
  74. if (!whereClause.equals("")) {
  75. if(mainSql.contains("task.dotaskID,task.siteID")&&dataRange.getRange()==4){
  76. whereClause += " or x.siteID is null ";
  77. }
  78. mainSql = "select x.* from" +
  79. "(" + mainSql + ") x " +
  80. whereClause;
  81. boundSql = new BoundSql(ms.getConfiguration(), mainSql, boundSql.getParameterMappings(), boundSql.getParameterObject());
  82. }
  83. } catch (Exception ex) {
  84. return invocation.proceed();
  85. }
  86. }
  87. try{
  88. return executor.query(ms, parameter, rowBounds, resultHandler, cacheKey, boundSql);
  89. }
  90. catch (Exception ex){
  91. return invocation.proceed();
  92. }
  93. }
  94. private String getJoinSql(Class entityClass, DataRange dataRange) {
  95. return getJoinSqlByField(getField(entityClass, dataRange), dataRange);
  96. }
  97. private Field getField(Class entityClass, DataRange dataRange) {
  98. Field field = null;
  99. DataRangeEnum dataRangeEnum = DataRangeEnum.getDataRangeByValue(dataRange.getRange());
  100. switch (dataRangeEnum) {
  101. case City:
  102. break;
  103. case Region:
  104. field = Arrays.stream(entityClass.getDeclaredFields()).filter(x -> x.getAnnotationsByType(RegionID.class).length > 0)
  105. .findFirst().orElse(null);
  106. break;
  107. case Institution:
  108. field = Arrays.stream(entityClass.getDeclaredFields()).filter(x -> x.getAnnotationsByType(InstitutionID.class).length > 0)
  109. .findFirst().orElse(null);
  110. break;
  111. case Site:
  112. field = Arrays.stream(entityClass.getDeclaredFields()).filter(x -> x.getAnnotationsByType(SiteID.class).length > 0)
  113. .findFirst().orElse(null);
  114. break;
  115. case Company:
  116. field = Arrays.stream(entityClass.getDeclaredFields()).filter(x -> x.getAnnotationsByType(CompanyID.class).length > 0)
  117. .findFirst().orElse(null);
  118. break;
  119. case SELF:
  120. field = Arrays.stream(entityClass.getDeclaredFields()).filter(x -> x.getAnnotationsByType(UserID.class).length > 0)
  121. .findFirst().orElse(null);
  122. break;
  123. default:
  124. break;
  125. }
  126. return field;
  127. }
  128. private String getInStatement(List<String> rangeIDList) {
  129. List<String> idList = rangeIDList;
  130. if (idList == null) {
  131. idList = new ArrayList<>();
  132. }
  133. String inStatement = String.join(",",
  134. idList.stream().map(x -> "'" + x + "'").toArray(String[]::new));
  135. return inStatement;
  136. }
  137. private String getJoinSqlByField(Field keyField, DataRange dataRange) {
  138. if (keyField == null || dataRange.getRangeIDList() == null || dataRange.getRangeIDList().size() == 0)
  139. return "where 1=1";
  140. String keyFieldName = keyField.getName();
  141. String inStatement = getInStatement(dataRange.getRangeIDList());
  142. return " where x." + keyFieldName + " in (" + inStatement + ")";
  143. }
  144. }