| package com.stylefeng.guns.core.datascope; | 
|   | 
|   | 
| import com.baomidou.mybatisplus.toolkit.PluginUtils; | 
| import com.stylefeng.guns.core.support.CollectionKit; | 
| import org.apache.ibatis.executor.statement.StatementHandler; | 
| import org.apache.ibatis.mapping.BoundSql; | 
| import org.apache.ibatis.mapping.MappedStatement; | 
| import org.apache.ibatis.mapping.SqlCommandType; | 
| import org.apache.ibatis.plugin.*; | 
| import org.apache.ibatis.reflection.MetaObject; | 
| import org.apache.ibatis.reflection.SystemMetaObject; | 
|   | 
| import java.sql.Connection; | 
| import java.util.List; | 
| import java.util.Map; | 
| import java.util.Properties; | 
|   | 
| /** | 
|  * 数据范围的拦截器 | 
|  * | 
|  * @author fengshuonan | 
|  * @date 2017-07-23 21:26 | 
|  */ | 
| @Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})}) | 
| public class DataScopeInterceptor implements Interceptor { | 
|   | 
|     @Override | 
|     public Object intercept(Invocation invocation) throws Throwable { | 
|         StatementHandler statementHandler = (StatementHandler) PluginUtils.realTarget(invocation.getTarget()); | 
|         MetaObject metaStatementHandler = SystemMetaObject.forObject(statementHandler); | 
|         MappedStatement mappedStatement = (MappedStatement) metaStatementHandler.getValue("delegate.mappedStatement"); | 
|   | 
|         if (!SqlCommandType.SELECT.equals(mappedStatement.getSqlCommandType())) { | 
|             return invocation.proceed(); | 
|         } | 
|   | 
|         BoundSql boundSql = (BoundSql) metaStatementHandler.getValue("delegate.boundSql"); | 
|         String originalSql = boundSql.getSql(); | 
|         Object parameterObject = boundSql.getParameterObject(); | 
|   | 
|         //查找参数中包含DataScope类型的参数 | 
|         DataScope dataScope = findDataScopeObject(parameterObject); | 
|   | 
|         if (dataScope == null) { | 
|             return invocation.proceed(); | 
|         } else { | 
|             String scopeName = dataScope.getScopeName(); | 
|             List<Integer> deptIds = dataScope.getDeptIds(); | 
|             String join = CollectionKit.join(deptIds, ","); | 
|             originalSql = "select * from (" + originalSql + ") temp_data_scope where temp_data_scope." + scopeName + " in (" + join + ")"; | 
|             metaStatementHandler.setValue("delegate.boundSql.sql", originalSql); | 
|             return invocation.proceed(); | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 查找参数是否包括DataScope对象 | 
|      */ | 
|     public DataScope findDataScopeObject(Object parameterObj) { | 
|         if (parameterObj instanceof DataScope) { | 
|             return (DataScope) parameterObj; | 
|         } else if (parameterObj instanceof Map) { | 
|             for (Object val : ((Map<?, ?>) parameterObj).values()) { | 
|                 if (val instanceof DataScope) { | 
|                     return (DataScope) val; | 
|                 } | 
|             } | 
|         } | 
|         return null; | 
|     } | 
|   | 
|     @Override | 
|     public Object plugin(Object target) { | 
|         return Plugin.wrap(target, this); | 
|     } | 
|   | 
|     @Override | 
|     public void setProperties(Properties properties) { | 
|   | 
|     } | 
| } |