//package com.jiayuep.ipp.common.mybatis.interceptor;
//
//
//import cn.hutool.core.collection.CollectionUtil;
//import com.baomidou.mybatisplus.extension.plugins.handler.DataPermissionHandler;
//import com.jiayuep.ipp.common.mybatis.annotation.DataPermissions;
//import com.jiayuep.ipp.common.mybatis.base.BaseDataEntity;
//import lombok.extern.slf4j.Slf4j;
//import net.sf.jsqlparser.expression.Expression;
//import net.sf.jsqlparser.expression.StringValue;
//import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
//import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
//import net.sf.jsqlparser.expression.operators.relational.InExpression;
//import net.sf.jsqlparser.expression.operators.relational.ItemsList;
//import net.sf.jsqlparser.schema.Column;
//import org.apache.commons.compress.utils.Sets;
//import sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl;
//
//import java.lang.reflect.Type;
//import java.util.Arrays;
//import java.util.List;
//import java.util.stream.Collectors;
//
//@Slf4j
//public class DataPermissionsPlus implements DataPermissionHandler {
//	@Override
//	public Expression getSqlSegment(Expression where, String mappedStatementId) {
//
//		try {
//			//注解逻辑判断  添加注解了才拦截
//			Class<?> classType = Class.forName(mappedStatementId.substring(0, mappedStatementId.lastIndexOf(".")));
//			//判断mapper传入的entity 是否继承了BaseDataEntity
//			boolean isDataEntity = this.validateEntity(classType);
//
//			if (isDataEntity) {
//
//				boolean isDataPermission = classType.isAnnotationPresent(DataPermissions.class);
//
//				if (isDataPermission) {
//					String mName = mappedStatementId.substring(mappedStatementId.lastIndexOf(".") + 1, mappedStatementId.length());
//					DataPermissions permissions = classType.getAnnotation(DataPermissions.class);
//					String[] scopes = permissions.scope();
//					String columnName = permissions.value();
//					List<String> scopeFilter = Arrays.stream(scopes).filter(s -> s.equals(mName)).collect(Collectors.toList());
//
//					if (CollectionUtil.isEmpty(scopeFilter)) {
//						List<String> unitCodes = SecurityUtils.getUser().getUnitCodes();
//
//						ItemsList itemsList = new ExpressionList(unitCodes.stream().map(StringValue::new).collect(Collectors.toList())); // 把集合转变为JSQLParser需要的元素列表
//						InExpression inExpression = new InExpression(new Column(columnName), itemsList); //  order_tbl.dept_id IN ('2', '3', '4', '5')
//						return new AndExpression(where, inExpression);
//					}
//
//
//				}
//			}
//
//		} catch (Exception e) {
//
//			log.error("{}:数据权限设置失败！！", mappedStatementId);
//
//			e.printStackTrace();
//		}
//
//		return where;
//
//
//	}
//
//	/**
//	 * 校验maperr中的对应实体 是否继承的是BaseDataEntity（权限基础类）
//	 *
//	 * @param classType
//	 * @return
//	 * @throws Exception
//	 */
//	private boolean validateEntity(Class<?> classType) throws Exception {
//		boolean result = false;
//		Type[] genericInterfaces = classType.getGenericInterfaces();
//		if (genericInterfaces != null && genericInterfaces.length > 0) {
//			Type[] actualTypeArguments = ((ParameterizedTypeImpl) genericInterfaces[0]).getActualTypeArguments();
//			if (actualTypeArguments != null && actualTypeArguments.length > 0) {
//				String typeName = actualTypeArguments[0].getTypeName();
//				Class<?> obj = Class.forName(typeName);
//
//				String objName = obj.getSuperclass().getName();
//
//				Class<BaseDataEntity> baseDataEntityClass = BaseDataEntity.class;
//
//				String baseDataEntityName = baseDataEntityClass.getName();
//
//				if (objName.equals(baseDataEntityName)) {
//					result = true;
//				}
//			}
//		}
//		return result;
//	}
//}
