Commit 35c01867 authored by 赵啸非's avatar 赵啸非

添加数据权限

parent 539d40f3
package com.mortals.xhx.annotation;
import java.lang.annotation.*;
/**
*
* @author: zxfei
* @date: 2024/5/15 16:09
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
public @interface DataPermission {
/**
* 数据权限类型
* 1 上下级授权 2 数据范围授权
*/
String permissionType() default "2";
/**
* 配置菜单的组件路径,用于数据权限
*/
String componentRoute() default "";
}
package com.mortals.xhx.base.framework.aspect;
import com.mortals.framework.service.IAuthTokenService;
import com.mortals.framework.service.IUser;
import com.mortals.xhx.annotation.DataPermission;
import com.mortals.xhx.common.utils.RuleQueryGenerator;
import com.mortals.xhx.module.dimension.model.DimensionResourceRuleEntity;
import com.mortals.xhx.module.dimension.service.DimensionResourceRuleService;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.List;
@Aspect
@Slf4j
@Component
public class DataPermissionAspect {
@Autowired
private DimensionResourceRuleService dimensionResourceRuleService;
@Autowired
private IAuthTokenService authTokenService;
public static final String DATA_PERMISSION_SEARCH_SQL = "DATA_PERMISSION_SEARCH_SQL";
@Pointcut("@annotation(com.mortals.xhx.annotation.DataPermission)")
public void pointCut() {
}
@Around("pointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
String componentRoute = request.getServletPath();
IUser loginUser = authTokenService.getLoginUser(request);
MethodSignature signature = (MethodSignature) point.getSignature();
Method method = signature.getMethod();
DataPermission permissionData = method.getAnnotation(DataPermission.class);
//获取授权方式
String permissionType = permissionData.permissionType();
//获取组件路由 通过controller 获取
// String componentRoute = permissionData.componentRoute();
if (!ObjectUtils.isEmpty(componentRoute)) {
// 查找当前用户此资源路径下的所有规则
List<DimensionResourceRuleEntity> componentRules = dimensionResourceRuleService.getRoleComponentRule(loginUser.getId(), componentRoute);
if (!ObjectUtils.isEmpty(componentRules)) {
//在request添加属性
// DataPermissionUtils.installDataSearchConditon(request, componentRules);
//DataPermissionUtils.installUserInfo(request, loginUser);
//todo 构建数据权限sql 并设置到request中。
String permissionSql = RuleQueryGenerator.getPermissionSql(componentRules,loginUser);
log.info("permissionSql:{}", permissionSql);
request.setAttribute(DATA_PERMISSION_SEARCH_SQL, permissionSql);
// Map<Long, List<DimensionResourceRuleEntity>> ruleMap = RuleQueryGenerator.getRuleMapByRoleId(componentRules);
}
// String permissionSql = RuleQueryGenerator.getPermissionSql(identityId);
}
return point.proceed();
}
}
package com.mortals.xhx.common.utils;
import com.mortals.framework.service.IUser;
import com.mortals.xhx.module.dimension.model.DimensionResourceRuleEntity;
import org.apache.commons.compress.utils.Lists;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
public class DataPermissionUtils {
public static final String COMPONENT_DATA_RULES = "COMPONENT_DATA_RULES";
public static final String SYS_USER_INFO = "SYS_USER_INFO";
/**
* 往链接请求里面,传入数据查询条件
*
* @param request
* @param componentRules
*/
public static void installDataSearchConditon(HttpServletRequest request, List<DimensionResourceRuleEntity> componentRules) {
// 1.先从request获取MENU_DATA_AUTHOR_RULES,如果存则获取到LIST
List<DimensionResourceRuleEntity> list = loadDataSearchCondition(request);
if (list == null) {
// 2.如果不存在,则new一个list
list = Lists.newArrayList();
}
list.addAll(componentRules);
// 3.往list里面增量存指
request.setAttribute(COMPONENT_DATA_RULES, list);
}
/**
* 往链接请求里面,传入数据查询条件
*
* @param request
* @param searchSql
*/
public static void installSearchSql(HttpServletRequest request,String searchSql) {
// 1.先从request获取MENU_DATA_AUTHOR_RULES,如果存则获取到LIST
// 3.往list里面增量存指
// request.setAttribute(DATA_PERMISSION_SEARCH_SQL, searchSql);
}
/**
* 获取请求对应的数据权限规则
*/
@SuppressWarnings("unchecked")
public static synchronized List<DimensionResourceRuleEntity> loadDataSearchCondition(HttpServletRequest request) {
return (List<DimensionResourceRuleEntity>) request.getAttribute(COMPONENT_DATA_RULES);
}
public static synchronized void installUserInfo(HttpServletRequest request, IUser userinfo) {
request.setAttribute(SYS_USER_INFO, userinfo);
}
}
package com.mortals.xhx.common.utils;
import cn.hutool.core.util.ReflectUtil;
import com.google.common.collect.Maps;
import com.mortals.framework.service.IUser;
import com.mortals.framework.util.StringUtils;
import com.mortals.xhx.common.code.RuleConditionEnum;
import com.mortals.xhx.common.code.RuleTypeEnum;
import com.mortals.xhx.module.dimension.model.DimensionResourceRuleEntity;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.springframework.util.ObjectUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 权限sql 查询语句实现
*
* @author: zxfei
* @date: 2024/5/15 10:44
*/
@Slf4j
@UtilityClass
public class RuleQueryGenerator {
private static final String SQL_AND = " and ";
private static final String SQL_OR = " or ";
private static final String SQL_JOINT = " (%s) ";
public static String getPermissionSql(List<DimensionResourceRuleEntity> conditionList, IUser loginUser) {
//存在权限
//对当前身份根据规则编码分组-去除不同角色中相同编码且规则值为ALL的规则 并根据角色id分组
Map<Long, List<DimensionResourceRuleEntity>> ruleMap = getRuleMapByRoleId(conditionList);
StringBuilder sb = new StringBuilder();
String roleSql;
if (MapUtils.isNotEmpty(ruleMap)) {
//按角色拼接SQL
for (Map.Entry<Long, List<DimensionResourceRuleEntity>> entry : ruleMap.entrySet()) {
List<DimensionResourceRuleEntity> lists = entry.getValue();
// 同角色之间使用 AND
roleSql = buildRoleSql(lists, loginUser);
//角色之间使用 OR
if (StringUtils.isNotEmpty(roleSql)) {
jointSqlByRoles(sb, roleSql);
}
}
}
return sb.toString();
}
/**
* 获取带有数据权限的SQL
*
* @param identityId 身份ID
*/
public String getPermissionSql(String identityId) {
//------------------------获取当前身份的数据规则------------------------------------
List<DimensionResourceRuleEntity> conditionList = getCurrentIdentyPermission(identityId);
if (ObjectUtils.isEmpty(conditionList)) {
//没有权限
return "1 = 0";
}
//存在权限
//对当前身份根据规则编码分组-去除不同角色中相同编码且规则值为ALL的规则 并根据角色id分组
Map<Long, List<DimensionResourceRuleEntity>> ruleMap = getRuleMapByRoleId(conditionList);
StringBuilder sb = new StringBuilder();
String roleSql;
if (MapUtils.isNotEmpty(ruleMap)) {
//按角色拼接SQL
for (Map.Entry<Long, List<DimensionResourceRuleEntity>> entry : ruleMap.entrySet()) {
List<DimensionResourceRuleEntity> lists = entry.getValue();
// 同角色之间使用 AND
roleSql = buildRoleSql(lists, null);
//角色之间使用 OR
if (StringUtils.isNotEmpty(roleSql)) {
jointSqlByRoles(sb, roleSql);
}
}
}
return sb.toString();
}
private static List<DimensionResourceRuleEntity> getCurrentIdentyPermission(String identityId) {
return null;
/* //----------------------------获取所有数据规则-----------------------------
List<DimensionResourceRuleEntity> roleRuleList = DataPermissionUtils.loadDataSearchCondition();
if(ObjectUtils.isEmpty(roleRuleList)){
return null;
}
//-----------------------------过滤掉不属于当前身份的规则-----------------------------------
return roleRuleList.stream()
// .filter(item -> item.getIdentityId().equals(identityId))
.collect(Collectors.toList());*/
}
/**
* 构建单角色SQL
*/
private static String buildRoleSql(List<DimensionResourceRuleEntity> lists, IUser loginUser) {
StringBuilder roleSql = new StringBuilder();
for (DimensionResourceRuleEntity item : lists) {
//如果出现全选 则 代表全部,不需要限定范围
if ("ALL".equals(item.getRuleValue())) {
continue;
}
//将规则转换成SQL
String filedSql = convertRuleToSql(item, loginUser);
if(!ObjectUtils.isEmpty(filedSql)){
roleSql.append(SQL_AND).append(filedSql);
}
}
return roleSql.toString();
}
/**
* 将单一规则转化成SQL,默认全部使用 In
* ruleCode : area_test
* ruleValue : 区域1,区域2,区域3
*
* @param rule 规则值
*/
private static String convertRuleToSql(DimensionResourceRuleEntity rule, IUser loginUser) {
//判断规则类型
String ruleValueConvert = "";
if (RuleConditionEnum.属于.getValue().equalsIgnoreCase(rule.getRuleCondition())) {
String whereCondition = " in ";
if(RuleTypeEnum.系统上下问变量.getValue()==rule.getRuleType()){
ruleValueConvert = getInConditionValue(rule.getRuleValue(),loginUser);
if(ObjectUtils.isEmpty(ruleValueConvert)) return null;
return rule.getRuleCode() + whereCondition + ruleValueConvert;
}else{
ruleValueConvert = getInConditionValue(rule.getRuleValue());
if(ObjectUtils.isEmpty(ruleValueConvert)) return null;
return rule.getRuleCode() + whereCondition + ruleValueConvert;
}
} else if (RuleConditionEnum.大于.getValue().equalsIgnoreCase(rule.getRuleCondition())) {
String whereCondition = " > ";
ruleValueConvert = getGreaterConditionValue(rule.getRuleValue());
return rule.getRuleCode() + whereCondition + ruleValueConvert;
} else {
//todo
//不支持的类型
}
return null;
}
/**
* IN字符串转换
* 区域1, 区域2, 区域3 --> ("区域1","区域2","区域3")
* 江西大区 --> ("江西大区")
*/
private static String getInConditionValue(String ruleValue) {
String[] temp = ruleValue.split(",");
StringBuilder res = new StringBuilder();
for (String string : temp) {
res.append(",'").append(string).append("'");
}
return "(" + res.substring(1) + ")";
}
/**
* IN字符串转换
* 区域1, 区域2, 区域3 --> ("区域1","区域2","区域3")
* 江西大区 --> ("江西大区")
*/
private static String getInConditionValue(String ruleValue,IUser loginUser) {
//el表达式 提取变量 再通过反射获取值,最终设置值
Object fieldValue = ReflectUtil.getFieldValue(loginUser, ruleValue);
if(fieldValue!=null){
return "(" + fieldValue + ")";
}
return null;
}
/**
* > 字符串转换
* 区域1, 区域2, 区域3 --> ("区域1","区域2","区域3")
* 江西大区 --> ("江西大区")
*/
private static String getGreaterConditionValue(String ruleValue) {
return ruleValue;
}
/**
* 拼接单角色的SQL
*
* @param sqlBuilder 总的SQL
* @param roleSql 单角色SQL
*/
private static void jointSqlByRoles(StringBuilder sqlBuilder, String roleSql) {
roleSql = roleSql.replaceFirst(SQL_AND, "");
if (StringUtils.isEmpty(sqlBuilder.toString())) {
sqlBuilder.append(String.format(SQL_JOINT, roleSql));
} else {
sqlBuilder.append(SQL_OR).append(String.format(SQL_JOINT, roleSql));
}
}
/**
* 1. 对当前身份根据规则编码分组-去除不同角色中相同编码且规则值为ALL的规则
* 2. 对角色进行分组
*
* @param conditionList 数据规则
* @return 分组后的规则list
*/
public static Map<Long, List<DimensionResourceRuleEntity>> getRuleMapByRoleId(List<DimensionResourceRuleEntity> conditionList) {
//--------过滤掉不属于当前身份的规则,并对条件编码进行分组-----------------------------------
Map<String, List<DimensionResourceRuleEntity>> conditionMap = conditionList.stream().collect(Collectors.groupingBy(DimensionResourceRuleEntity::getRuleCode));
//--------相同编码分组中存在ALL的排除掉-----------------------------------------------
List<DimensionResourceRuleEntity> newRoleRuleList = new ArrayList<>();
if (MapUtils.isNotEmpty(conditionMap)) {
for (Map.Entry<String, List<DimensionResourceRuleEntity>> entry : conditionMap.entrySet()) {
boolean flag = true;
List<DimensionResourceRuleEntity> lists = entry.getValue();
for (DimensionResourceRuleEntity item : lists) {
if ("ALL".equals(item.getRuleValue())) {
flag = false;
break;
}
}
if (flag) {
newRoleRuleList.addAll(lists);
}
}
}
if (CollectionUtils.isNotEmpty(newRoleRuleList)) {
return newRoleRuleList.stream().collect(Collectors.groupingBy(DimensionResourceRuleEntity::getRoleId));
}
return Maps.newHashMap();
}
}
package com.mortals.xhx.module.child.dao; package com.mortals.xhx.module.child.dao;
import com.mortals.framework.dao.ICRUDDao; import com.mortals.framework.dao.ICRUDDao;
import com.mortals.framework.model.PageInfo;
import com.mortals.framework.model.Result;
import com.mortals.xhx.module.child.model.ChildLicenseDatasetEntity; import com.mortals.xhx.module.child.model.ChildLicenseDatasetEntity;
import com.mortals.xhx.module.child.model.ChildLicenseDatasetQuery;
import com.mortals.xhx.module.child.model.ChildLicenseInfoFieldEntity;
import java.util.List; import java.util.List;
/** /**
* 行业许可子证数据集Dao * 行业许可子证数据集Dao
* 行业许可子证数据集 DAO接口 * 行业许可子证数据集 DAO接口
* *
* @author zxfei * @author zxfei
* @date 2024-07-27 * @date 2024-07-27
*/ */
public interface ChildLicenseDatasetDao extends ICRUDDao<ChildLicenseDatasetEntity,Long>{ public interface ChildLicenseDatasetDao extends ICRUDDao<ChildLicenseDatasetEntity, Long> {
String SQLID_CUSTOM_LIST = "getCustomList";
String SQLID_CUSTOM_COUNT = "getCustomListCount";
Result<ChildLicenseInfoFieldEntity> getCustomList(ChildLicenseDatasetQuery appDatasetQuery, PageInfo pageInfo);
} }
package com.mortals.xhx.module.child.dao.ibatis; package com.mortals.xhx.module.child.dao.ibatis;
import com.mortals.framework.model.PageInfo;
import com.mortals.framework.model.ParamDto;
import com.mortals.framework.model.Result;
import com.mortals.xhx.module.child.model.ChildLicenseDatasetQuery;
import com.mortals.xhx.module.child.model.ChildLicenseInfoFieldEntity;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import com.mortals.xhx.module.child.dao.ChildLicenseDatasetDao; import com.mortals.xhx.module.child.dao.ChildLicenseDatasetDao;
import com.mortals.xhx.module.child.model.ChildLicenseDatasetEntity; import com.mortals.xhx.module.child.model.ChildLicenseDatasetEntity;
import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import com.mortals.framework.dao.ibatis.BaseCRUDDaoMybatis; import com.mortals.framework.dao.ibatis.BaseCRUDDaoMybatis;
import java.util.List; import java.util.List;
/** /**
* 行业许可子证数据集DaoImpl DAO接口 * 行业许可子证数据集DaoImpl DAO接口
* *
* @author zxfei * @author zxfei
* @date 2024-07-27 * @date 2024-07-27
*/ */
@Repository("childLicenseDatasetDao") @Repository("childLicenseDatasetDao")
public class ChildLicenseDatasetDaoImpl extends BaseCRUDDaoMybatis<ChildLicenseDatasetEntity,Long> implements ChildLicenseDatasetDao { public class ChildLicenseDatasetDaoImpl extends BaseCRUDDaoMybatis<ChildLicenseDatasetEntity, Long> implements ChildLicenseDatasetDao {
@Override
public Result<ChildLicenseInfoFieldEntity> getCustomList(ChildLicenseDatasetQuery appDatasetQuery, PageInfo pageInfo) {
Result<ChildLicenseInfoFieldEntity> result = new Result();
ParamDto paramDto = this.getQueryParam(appDatasetQuery);
int count = this.getCustomCount(paramDto);
List list = null;
if (count == 0) {
list = new ArrayList();
} else if (pageInfo.getPrePageResult() == -1) {
list = this.getSqlSession().selectList(this.getSqlId(SQLID_CUSTOM_LIST), paramDto);
} else {
list = this.getSqlSession().selectList(this.getSqlId(SQLID_CUSTOM_LIST), paramDto);
}
pageInfo.setTotalResult(count);
result.setPageInfo(pageInfo);
result.setList(list);
return result;
}
public int getCustomCount(ParamDto paramDto) {
return this.getSqlSession().selectOne(this.getSqlId(SQLID_CUSTOM_COUNT), this.cpyQueryParamDto(paramDto));
}
} }
...@@ -3,6 +3,8 @@ import com.mortals.framework.model.BaseEntityLong; ...@@ -3,6 +3,8 @@ import com.mortals.framework.model.BaseEntityLong;
import com.mortals.xhx.module.child.model.ChildLicenseDatasetEntity; import com.mortals.xhx.module.child.model.ChildLicenseDatasetEntity;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import com.mortals.xhx.module.child.model.ChildLicenseDatasetQuery;
import lombok.Data; import lombok.Data;
import com.mortals.framework.annotation.Excel; import com.mortals.framework.annotation.Excel;
import java.math.BigDecimal; import java.math.BigDecimal;
...@@ -16,8 +18,31 @@ import java.util.Date; ...@@ -16,8 +18,31 @@ import java.util.Date;
@Data @Data
public class ChildLicenseDatasetVo extends BaseEntityLong { public class ChildLicenseDatasetVo extends BaseEntityLong {
/** 主键ID,主键,自增长列表 */ /**
private List <Long> idList; * 字段编码
*/
private String fieldCode;
/**
* 字段名称
*/
private String fieldName;
/**
* 字段值
*/
private String fieldValue;
private Long appId;
private List<Long> idList;
private List<String> fieldNameList;
private List<String> fieldValueList;
/** OR条件集合,列表项之间是OR,项内容之间是AND,如:(list[0].1 and list[0].2) or (list[1].3 and list[1].4) */
private List<ChildLicenseDatasetQuery> orConditionList;
/** AND条件集合,列表项之间是AND,项内容之间是OR,如:(list[0].1 or list[0].2) and (list[1].3 or list[1].4) */
private List<ChildLicenseDatasetQuery> andConditionList;
} }
\ No newline at end of file
...@@ -3,6 +3,8 @@ import com.mortals.framework.model.BaseEntityLong; ...@@ -3,6 +3,8 @@ import com.mortals.framework.model.BaseEntityLong;
import com.mortals.xhx.module.child.model.ChildLicenseInfoFieldEntity; import com.mortals.xhx.module.child.model.ChildLicenseInfoFieldEntity;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import com.mortals.xhx.module.child.model.ChildLicenseInfoFieldQuery;
import lombok.Data; import lombok.Data;
import com.mortals.framework.annotation.Excel; import com.mortals.framework.annotation.Excel;
import java.math.BigDecimal; import java.math.BigDecimal;
...@@ -19,5 +21,11 @@ public class ChildLicenseInfoFieldVo extends BaseEntityLong { ...@@ -19,5 +21,11 @@ public class ChildLicenseInfoFieldVo extends BaseEntityLong {
/** 序号,主键,自增长列表 */ /** 序号,主键,自增长列表 */
private List <Long> idList; private List <Long> idList;
/** OR条件集合,列表项之间是OR,项内容之间是AND,如:(list[0].1 and list[0].2) or (list[1].3 and list[1].4) */
private List<ChildLicenseInfoFieldQuery> orConditionList;
/** AND条件集合,列表项之间是AND,项内容之间是OR,如:(list[0].1 or list[0].2) and (list[1].3 or list[1].4) */
private List<ChildLicenseInfoFieldQuery> andConditionList;
} }
\ No newline at end of file
...@@ -19,5 +19,8 @@ public class ChildLicenseVo extends BaseEntityLong { ...@@ -19,5 +19,8 @@ public class ChildLicenseVo extends BaseEntityLong {
/** 主键ID,主键,自增长列表 */ /** 主键ID,主键,自增长列表 */
private List <Long> idList; private List <Long> idList;
/**
* 站点列表
*/
private List<Long> siteIdList;
} }
\ No newline at end of file
package com.mortals.xhx.module.child.service; package com.mortals.xhx.module.child.service;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
import com.mortals.framework.model.PageInfo;
import com.mortals.framework.model.Result;
import com.mortals.framework.service.ICRUDService; import com.mortals.framework.service.ICRUDService;
import com.mortals.xhx.module.child.model.ChildLicenseDatasetEntity; import com.mortals.xhx.module.child.model.ChildLicenseDatasetEntity;
import com.mortals.xhx.module.child.dao.ChildLicenseDatasetDao; import com.mortals.xhx.module.child.dao.ChildLicenseDatasetDao;
import com.mortals.xhx.module.child.model.ChildLicenseDatasetQuery;
import com.mortals.xhx.module.child.model.ChildLicenseInfoFieldEntity;
/** /**
* ChildLicenseDatasetService * ChildLicenseDatasetService
* *
...@@ -13,4 +20,8 @@ import com.mortals.xhx.module.child.dao.ChildLicenseDatasetDao; ...@@ -13,4 +20,8 @@ import com.mortals.xhx.module.child.dao.ChildLicenseDatasetDao;
public interface ChildLicenseDatasetService extends ICRUDService<ChildLicenseDatasetEntity,Long>{ public interface ChildLicenseDatasetService extends ICRUDService<ChildLicenseDatasetEntity,Long>{
ChildLicenseDatasetDao getDao(); ChildLicenseDatasetDao getDao();
Result<ChildLicenseInfoFieldEntity> findCustomList(ChildLicenseDatasetQuery appDatasetQuery, PageInfo pageInfo, Context context) throws AppException;
} }
\ No newline at end of file
package com.mortals.xhx.module.child.service.impl; package com.mortals.xhx.module.child.service.impl;
import com.mortals.framework.model.PageInfo;
import com.mortals.framework.model.Result;
import com.mortals.xhx.module.child.model.ChildLicenseDatasetQuery;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import java.util.Map;
import java.util.function.Function; import java.util.function.Function;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.mortals.framework.service.impl.AbstractCRUDServiceImpl; import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
...@@ -16,6 +21,8 @@ import org.springframework.util.ObjectUtils; ...@@ -16,6 +21,8 @@ import org.springframework.util.ObjectUtils;
import java.util.Date; import java.util.Date;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
/** /**
* ChildLicenseDatasetService * ChildLicenseDatasetService
...@@ -86,4 +93,9 @@ public class ChildLicenseDatasetServiceImpl extends AbstractCRUDServiceImpl<Chil ...@@ -86,4 +93,9 @@ public class ChildLicenseDatasetServiceImpl extends AbstractCRUDServiceImpl<Chil
childLicenseInfoFieldService.removeList(childLicenseInfoFieldlist,context); childLicenseInfoFieldService.removeList(childLicenseInfoFieldlist,context);
super.removeAfter(ids, context, result); super.removeAfter(ids, context, result);
} }
@Override
public Result<ChildLicenseInfoFieldEntity> findCustomList(ChildLicenseDatasetQuery appDatasetQuery, PageInfo pageInfo, Context context) throws AppException {
return this.dao.getCustomList(appDatasetQuery, pageInfo);
}
} }
\ No newline at end of file
package com.mortals.xhx.module.child.service.impl; package com.mortals.xhx.module.child.service.impl;
import com.mortals.xhx.common.utils.BeanUtil;
import com.mortals.xhx.module.child.model.*;
import com.mortals.xhx.module.child.service.ChildLicenseDatasetService;
import com.mortals.xhx.module.child.service.ChildLicenseInfoFieldService;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function; import java.util.function.Function;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.mortals.framework.service.impl.AbstractCRUDServiceImpl; import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
import com.mortals.framework.exception.AppException; import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context; import com.mortals.framework.model.Context;
import com.mortals.xhx.module.child.dao.ChildLicenseTempleteFieldDao; import com.mortals.xhx.module.child.dao.ChildLicenseTempleteFieldDao;
import com.mortals.xhx.module.child.model.ChildLicenseTempleteFieldEntity;
import com.mortals.xhx.module.child.service.ChildLicenseTempleteFieldService; import com.mortals.xhx.module.child.service.ChildLicenseTempleteFieldService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.util.ObjectUtils;
/** /**
* ChildLicenseTempleteFieldService * ChildLicenseTempleteFieldService
* 行业许可子证模板信息字段 service实现 * 行业许可子证模板信息字段 service实现
* *
* @author zxfei * @author zxfei
* @date 2024-07-27 * @date 2024-07-27
*/ */
@Service("childLicenseTempleteFieldService") @Service("childLicenseTempleteFieldService")
@Slf4j @Slf4j
public class ChildLicenseTempleteFieldServiceImpl extends AbstractCRUDServiceImpl<ChildLicenseTempleteFieldDao, ChildLicenseTempleteFieldEntity, Long> implements ChildLicenseTempleteFieldService { public class ChildLicenseTempleteFieldServiceImpl extends AbstractCRUDServiceImpl<ChildLicenseTempleteFieldDao, ChildLicenseTempleteFieldEntity, Long> implements ChildLicenseTempleteFieldService {
@Autowired
private ChildLicenseDatasetService childLicenseDatasetService;
@Autowired
private ChildLicenseInfoFieldService childLicenseInfoFieldService;
/**
* @param entity
* @param context
* @throws AppException
*/
@Override
protected void saveAfter(ChildLicenseTempleteFieldEntity entity, Context context) throws AppException {
//同步添加已有模板数据
ChildLicenseDatasetQuery appDatasetQuery = new ChildLicenseDatasetQuery();
appDatasetQuery.setAppId(entity.getSubLicenseId());
List<ChildLicenseDatasetEntity> childLicenseDatasetEntities = childLicenseDatasetService.find(appDatasetQuery, context);
// 判断该数据集 是否已经存在 没存在 再添加
ArrayList<ChildLicenseInfoFieldEntity> fieldSaveList = new ArrayList<>();
for (ChildLicenseDatasetEntity childLicenseDatasetEntity : childLicenseDatasetEntities) {
ChildLicenseInfoFieldQuery appInfoFieldQuery = new ChildLicenseInfoFieldQuery();
appInfoFieldQuery.setDatasetId(childLicenseDatasetEntity.getId());
appInfoFieldQuery.setFieldCode(entity.getFieldCode());
appInfoFieldQuery.setFieldType(entity.getFieldType());
ChildLicenseInfoFieldEntity childLicenseInfoFieldEntity = childLicenseInfoFieldService.selectOne(appInfoFieldQuery, context);
if (ObjectUtils.isEmpty(childLicenseInfoFieldEntity)) {
ChildLicenseInfoFieldEntity fieldEntity = new ChildLicenseInfoFieldEntity();
fieldEntity.initAttrValue();
BeanUtils.copyProperties(entity, fieldEntity, BeanUtil.getNullPropertyNames(entity));
fieldEntity.setDatasetId(childLicenseDatasetEntity.getId());
fieldEntity.setId(null);
fieldSaveList.add(fieldEntity);
}
}
if (!ObjectUtils.isEmpty(fieldSaveList)) {
childLicenseInfoFieldService.save(fieldSaveList, context);
}
super.saveAfter(entity, context);
}
} }
\ No newline at end of file
package com.mortals.xhx.module.child.web; package com.mortals.xhx.module.child.web;
import cn.hutool.core.collection.ListUtil;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.PageInfo;
import com.mortals.framework.model.Result;
import com.mortals.framework.web.BaseCRUDJsonBodyMappingController; import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
import com.mortals.xhx.base.system.param.service.ParamService; import com.mortals.xhx.base.system.param.service.ParamService;
import com.mortals.xhx.module.child.model.ChildLicenseDatasetQuery;
import com.mortals.xhx.module.child.model.ChildLicenseInfoFieldEntity;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
...@@ -13,12 +20,10 @@ import com.mortals.xhx.module.child.model.ChildLicenseDatasetEntity; ...@@ -13,12 +20,10 @@ import com.mortals.xhx.module.child.model.ChildLicenseDatasetEntity;
import com.mortals.xhx.module.child.service.ChildLicenseDatasetService; import com.mortals.xhx.module.child.service.ChildLicenseDatasetService;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import com.mortals.framework.util.StringUtils; import com.mortals.framework.util.StringUtils;
import java.util.HashMap;
import java.util.List; import java.util.*;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import java.util.Arrays;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import static com.mortals.framework.ap.SysConstains.*; import static com.mortals.framework.ap.SysConstains.*;
...@@ -46,5 +51,69 @@ public class ChildLicenseDatasetController extends BaseCRUDJsonBodyMappingContro ...@@ -46,5 +51,69 @@ public class ChildLicenseDatasetController extends BaseCRUDJsonBodyMappingContro
super.init(model, context); super.init(model, context);
} }
@Override
protected void doListBefore(ChildLicenseDatasetEntity query, Map<String, Object> model, Context context) throws AppException {
if (!ObjectUtils.isEmpty(query.getOrConditionList()) || !ObjectUtils.isEmpty(query.getAndConditionList())) {
ChildLicenseDatasetQuery appDatasetQuery = new ChildLicenseDatasetQuery();
if (!ObjectUtils.isEmpty(query.getAndConditionList())) {
appDatasetQuery.setOrConditionList(query.getAndConditionList());
}
if (!ObjectUtils.isEmpty(query.getOrConditionList())) {
appDatasetQuery.setOrConditionList(query.getOrConditionList());
appDatasetQuery.setAppId(query.getAppId());
appDatasetQuery.setOrderCols(query.getOrderCols());
PageInfo pageInfo = this.buildPageInfo(query);
Result<ChildLicenseInfoFieldEntity> customResult = this.service.findCustomList(appDatasetQuery, pageInfo, context);
//根据查询条件的数量去除数量不足的结果
int count = query.getOrConditionList().size();
List<Long> datasetIdList = customResult.getList().stream().map(item -> item.getDatasetId()).collect(Collectors.toList());
Map<Long, Long> collect = datasetIdList.stream().collect(Collectors.groupingBy(x -> x, Collectors.counting()));
List<Long> dataSets = collect.entrySet().stream().map(entrySet -> {
if (entrySet.getValue() == count) {
return entrySet.getKey();
} else {
return null;
}
}).filter(f -> f != null).collect(Collectors.toList());
if (!ObjectUtils.isEmpty(dataSets)) {
//排序-
List<Long> orderList = new ArrayList<>();
for (Long dataId : datasetIdList) {
if(dataSets.contains(dataId)){
orderList.add(dataId);
}
}
query.setIdList(orderList);
} else {
query.setIdList(ListUtil.toList(0L));
}
query.setOrConditionList(null);
}
}
if (!ObjectUtils.isEmpty(query.getFieldCode()) || !ObjectUtils.isEmpty(query.getFieldName())) {
ChildLicenseDatasetQuery appDatasetQuery = new ChildLicenseDatasetQuery();
appDatasetQuery.setFieldCode(query.getFieldCode());
appDatasetQuery.setFieldName(query.getFieldName());
appDatasetQuery.setAppId(query.getAppId());
// String fieldValue = StrUtil.addPrefixIfNot(query.getFieldValue(), "%");
// fieldValue = StrUtil.addSuffixIfNot(fieldValue, "%");
appDatasetQuery.setFieldValue(query.getFieldValue());
PageInfo pageInfo = this.buildPageInfo(query);
Result<ChildLicenseInfoFieldEntity> customResult = this.service.findCustomList(appDatasetQuery, pageInfo, context);
List<Long> datasetIdList = customResult.getList().stream().map(item -> item.getDatasetId()).collect(Collectors.toList());
if (!ObjectUtils.isEmpty(datasetIdList)) {
query.setIdList(datasetIdList);
//query.setOrderColList();
} else {
query.setIdList(ListUtil.toList(0L));
}
}
super.doListBefore(query, model, context);
}
} }
\ No newline at end of file
package com.mortals.xhx.module.dimension.dao;
import com.mortals.framework.dao.ICRUDDao;
import com.mortals.xhx.module.dimension.model.DimensionEntity;
/**
* 授权维度Dao
* 授权维度 DAO接口
*
* @author zxfei
* @date 2024-05-16
*/
public interface DimensionDao extends ICRUDDao<DimensionEntity,Long>{
}
package com.mortals.xhx.module.dimension.dao;
import com.mortals.framework.dao.ICRUDDao;
import com.mortals.xhx.module.dimension.model.DimensionResourceRuleEntity;
import java.util.List;
/**
* 角色资源维度规则Dao
* 角色资源维度规则 DAO接口
*
* @author zxfei
* @date 2024-05-16
*/
public interface DimensionResourceRuleDao extends ICRUDDao<DimensionResourceRuleEntity,Long>{
List<DimensionResourceRuleEntity> getRoleComponentRule(Long userId,String route);
}
package com.mortals.xhx.module.dimension.dao.ibatis;
import com.mortals.framework.dao.ibatis.BaseCRUDDaoMybatis;
import com.mortals.xhx.module.dimension.dao.DimensionDao;
import com.mortals.xhx.module.dimension.model.DimensionEntity;
import org.springframework.stereotype.Repository;
/**
* 授权维度DaoImpl DAO接口
*
* @author zxfei
* @date 2024-05-16
*/
@Repository("dimensionDao")
public class DimensionDaoImpl extends BaseCRUDDaoMybatis<DimensionEntity,Long> implements DimensionDao {
}
package com.mortals.xhx.module.dimension.dao.ibatis;
import com.mortals.framework.dao.ibatis.BaseCRUDDaoMybatis;
import com.mortals.xhx.module.dimension.dao.DimensionResourceRuleDao;
import com.mortals.xhx.module.dimension.model.DimensionResourceRuleEntity;
import org.springframework.stereotype.Repository;
import java.util.HashMap;
import java.util.List;
/**
* 角色资源维度规则DaoImpl DAO接口
*
* @author zxfei
* @date 2024-05-16
*/
@Repository("dimensionResourceRuleDao")
public class DimensionResourceRuleDaoImpl extends BaseCRUDDaoMybatis<DimensionResourceRuleEntity,Long> implements DimensionResourceRuleDao {
/**
* @param userId
* @param route
* @return
*/
@Override
public List<DimensionResourceRuleEntity> getRoleComponentRule(Long userId, String route) {
return getSqlSession().selectList(getSqlId("getRoleComponentRule"), new HashMap<String, Object>() {
{
put("userId", userId);
put("route", route);
}
});
}
}
package com.mortals.xhx.module.dimension.model;
import com.mortals.xhx.module.dimension.model.vo.DimensionVo;
import lombok.Data;
/**
* 授权维度实体对象
*
* @author zxfei
* @date 2024-05-16
*/
@Data
public class DimensionEntity extends DimensionVo {
private static final long serialVersionUID = 1L;
/**
* 维度编码
*/
private String dimensionCode;
/**
* 维度名称
*/
private String dimensionName;
/**
* 维度值
*/
private String dimensionValue;
/**
* 维度类型(1.固定值,2.系统上下问变量)
*/
private Integer dimensionType;
@Override
public int hashCode() {
return this.getId().hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == null) return false;
if (obj instanceof DimensionEntity) {
DimensionEntity tmp = (DimensionEntity) obj;
if (this.getId() == tmp.getId()) {
return true;
}
}
return false;
}
public void initAttrValue(){
this.dimensionCode = "";
this.dimensionName = "";
this.dimensionValue = "";
this.dimensionType = 1;
}
}
\ No newline at end of file
package com.mortals.xhx.module.dimension.model;
import com.mortals.xhx.module.dimension.model.vo.DimensionResourceRuleVo;
import lombok.Data;
/**
* 角色资源维度规则实体对象
*
* @author zxfei
* @date 2024-05-22
*/
@Data
public class DimensionResourceRuleEntity extends DimensionResourceRuleVo {
private static final long serialVersionUID = 1L;
/**
* 角色ID
*/
private Long roleId;
/**
* 资源ID
*/
private Long resourceId;
/**
* 规则编码
*/
private String ruleCode;
/**
* 规则名称
*/
private String ruleName;
/**
* 规则条件(IN.属于,<.小于,>.大于,=.等于,!=.不等于,>=.大于等于,<=.小于等于,like %.左模糊,like %.右模糊)
*/
private String ruleCondition;
/**
* 规则值,固定值或者系统变量
*/
private String ruleValue;
/**
* 规则值类型(1.固定值,2.系统上下问变量)
*/
private Integer ruleType;
/**
* 角色名称
*/
private String roleName;
/**
* 资源名称
*/
private String resourceName;
@Override
public int hashCode() {
return this.getId().hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == null) return false;
if (obj instanceof DimensionResourceRuleEntity) {
DimensionResourceRuleEntity tmp = (DimensionResourceRuleEntity) obj;
if (this.getId() == tmp.getId()) {
return true;
}
}
return false;
}
public void initAttrValue(){
this.roleId = null;
this.resourceId = null;
this.ruleCode = "";
this.ruleName = "";
this.ruleCondition = "IN";
this.ruleValue = "";
this.ruleType = 1;
this.roleName = "";
this.resourceName = "";
}
}
\ No newline at end of file
package com.mortals.xhx.module.dimension.model.vo;
import com.mortals.framework.model.BaseEntityLong;
import lombok.Data;
import java.util.List;
/**
* 角色资源维度规则视图对象
*
* @author zxfei
* @date 2024-05-16
*/
@Data
public class DimensionResourceRuleVo extends BaseEntityLong {
/** 序号,主键,自增长列表 */
private List <Long> idList;
}
\ No newline at end of file
package com.mortals.xhx.module.dimension.model.vo;
import com.mortals.framework.model.BaseEntityLong;
import lombok.Data;
import java.util.List;
/**
* 授权维度视图对象
*
* @author zxfei
* @date 2024-05-16
*/
@Data
public class DimensionVo extends BaseEntityLong {
/** 序号,主键,自增长列表 */
private List <Long> idList;
}
\ No newline at end of file
package com.mortals.xhx.module.dimension.service;
import com.mortals.framework.service.ICRUDService;
import com.mortals.xhx.module.dimension.dao.DimensionResourceRuleDao;
import com.mortals.xhx.module.dimension.model.DimensionResourceRuleEntity;
import java.util.List;
/**
* DimensionResourceRuleService
*
* 角色资源维度规则 service接口
*
* @author zxfei
* @date 2024-05-16
*/
public interface DimensionResourceRuleService extends ICRUDService<DimensionResourceRuleEntity,Long>{
DimensionResourceRuleDao getDao();
/**
* 根据当前controller路由获取用户角色资源维度规则
* @param userId
* @param route 当前controller路由
* @return
*/
List<DimensionResourceRuleEntity> getRoleComponentRule(Long userId,String route);
}
\ No newline at end of file
package com.mortals.xhx.module.dimension.service;
import com.mortals.framework.service.ICRUDService;
import com.mortals.xhx.module.dimension.dao.DimensionDao;
import com.mortals.xhx.module.dimension.model.DimensionEntity;
/**
* DimensionService
*
* 授权维度 service接口
*
* @author zxfei
* @date 2024-05-16
*/
public interface DimensionService extends ICRUDService<DimensionEntity,Long>{
DimensionDao getDao();
}
\ No newline at end of file
package com.mortals.xhx.module.dimension.service.impl;
import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
import com.mortals.xhx.module.dimension.dao.DimensionResourceRuleDao;
import com.mortals.xhx.module.dimension.model.DimensionResourceRuleEntity;
import com.mortals.xhx.module.dimension.service.DimensionResourceRuleService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* DimensionResourceRuleService
* 角色资源维度规则 service实现
*
* @author zxfei
* @date 2024-05-16
*/
@Service("dimensionResourceRuleService")
@Slf4j
public class DimensionResourceRuleServiceImpl extends AbstractCRUDServiceImpl<DimensionResourceRuleDao, DimensionResourceRuleEntity, Long> implements DimensionResourceRuleService {
/**
* @param userId
* @param route 当前controller路由
* @return
*/
@Override
public List<DimensionResourceRuleEntity> getRoleComponentRule(Long userId, String route) {
return this.getDao().getRoleComponentRule(userId, route);
}
}
\ No newline at end of file
package com.mortals.xhx.module.dimension.service.impl;
import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
import com.mortals.xhx.module.dimension.dao.DimensionDao;
import com.mortals.xhx.module.dimension.model.DimensionEntity;
import com.mortals.xhx.module.dimension.service.DimensionService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* DimensionService
* 授权维度 service实现
*
* @author zxfei
* @date 2024-05-16
*/
@Service("dimensionService")
@Slf4j
public class DimensionServiceImpl extends AbstractCRUDServiceImpl<DimensionDao, DimensionEntity, Long> implements DimensionService {
}
\ No newline at end of file
package com.mortals.xhx.module.dimension.web;
import com.mortals.framework.model.Context;
import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
import com.mortals.xhx.base.system.param.service.ParamService;
import com.mortals.xhx.common.code.DimensionTypeEnum;
import com.mortals.xhx.module.dimension.model.DimensionEntity;
import com.mortals.xhx.module.dimension.service.DimensionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
/**
*
* 授权维度
*
* @author zxfei
* @date 2024-05-16
*/
@RestController
@RequestMapping("dimension")
public class DimensionController extends BaseCRUDJsonBodyMappingController<DimensionService,DimensionEntity,Long> {
@Autowired
private ParamService paramService;
public DimensionController(){
super.setModuleDesc( "授权维度");
}
@Override
protected void init(Map<String, Object> model, Context context) {
this.addDict(model, "dimensionType", DimensionTypeEnum.getEnumMap());
super.init(model, context);
}
}
\ No newline at end of file
package com.mortals.xhx.module.dimension.web;
import com.mortals.framework.model.Context;
import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
import com.mortals.xhx.base.system.param.service.ParamService;
import com.mortals.xhx.common.code.RuleConditionEnum;
import com.mortals.xhx.common.code.RuleTypeEnum;
import com.mortals.xhx.module.dimension.model.DimensionResourceRuleEntity;
import com.mortals.xhx.module.dimension.service.DimensionResourceRuleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
/**
*
* 角色资源维度规则
*
* @author zxfei
* @date 2024-05-16
*/
@RestController
@RequestMapping("dimension/resource/rule")
public class DimensionResourceRuleController extends BaseCRUDJsonBodyMappingController<DimensionResourceRuleService,DimensionResourceRuleEntity,Long> {
@Autowired
private ParamService paramService;
public DimensionResourceRuleController(){
super.setModuleDesc( "角色资源维度规则");
}
@Override
protected void init(Map<String, Object> model, Context context) {
this.addDict(model, "ruleCondition", RuleConditionEnum.getEnumMap());
this.addDict(model, "ruleType", RuleTypeEnum.getEnumMap());
super.init(model, context);
}
}
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"mybatis-3-mapper.dtd">
<mapper namespace="com.mortals.xhx.module.dimension.dao.ibatis.DimensionResourceRuleDaoImpl">
<!-- 获取列表 -->
<select id="getRoleComponentRule" parameterType="java.util.HashMap" resultMap="DimensionResourceRuleEntity-Map">
SELECT DISTINCT
t1.role_id,
t1.resource_id,
t1.rule_code,
t1.rule_name,
t1.rule_condition,
t1.rule_value,
t1.rule_type,
t2.userId
FROM
mortals_xhx_dimension_resource_rule t1
LEFT JOIN mortals_xhx_role_user t2 ON t1.role_id = t2.roleId
LEFT JOIN mortals_xhx_role_auth t3 ON t1.role_id = t3.roleId
LEFT JOIN mortals_xhx_resource t4 ON t4.id = t3.resourceId
WHERE
FIND_IN_SET( #{route}, t4.url )
AND t2.userId = #{userId}
</select>
</mapper>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment