fix(REQ-2545): 记录菜单绑定角色关系的日志

This commit is contained in:
李昆鹏 2024-07-24 15:59:42 +08:00
parent f799013c6e
commit 7107a8364c
11 changed files with 312 additions and 31 deletions

View File

@ -0,0 +1,36 @@
package cn.axzo.tyr.client.common.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author likunpeng
* @version 1.0
* @date 2024/7/24
*/
@Getter
@AllArgsConstructor
public enum PermissionRelationOperateLogTypeEnum {
/**
* 同步
*/
SYNC("SYNC", "同步"),
/**
* oms后台更新资源绑定的角色
*/
OMS_FEATURE_RESOURCE_BIND_ROLE("OMS_FEATURE_RESOURCE_BIND_ROLE", "oms后台更新资源绑定的角色"),
/**
* oms后台更新角色绑定资源绑定的
*/
OMS_ROLE_BIND_FEATURE_RESOURCE("OMS_ROLE_BIND_FEATURE_RESOURCE", "oms后台更新角色绑定的资源"),
;
@EnumValue
private final String value;
private final String desc;
}

View File

@ -0,0 +1,35 @@
package cn.axzo.tyr.server.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author likunpeng
* @version 1.0
* @date 2024/7/24
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SaasPgroupPermissionRelationOperateLogOperateDO {
/**
* 资源ID列表
*/
private Long featureId;
/**
* 组ID列表
*/
private List<Long> groupIds;
/**
* 角色code列表
*/
private List<String> roleCodes;
}

View File

@ -0,0 +1,12 @@
package cn.axzo.tyr.server.repository.dao;
import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelationOperateLog;
import cn.axzo.tyr.server.repository.mapper.SaasPgroupPermissionRelationOperateLogMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Repository;
@Repository
public class SaasPgroupPermissionRelationOperateLogDao extends ServiceImpl<SaasPgroupPermissionRelationOperateLogMapper, SaasPgroupPermissionRelationOperateLog> {
}

View File

@ -0,0 +1,45 @@
package cn.axzo.tyr.server.repository.entity;
import cn.axzo.pokonyan.config.mybatisplus.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
/**
* @author likunpeng
* @version 1.0
* @date 2024/7/24
*/
@Getter
@Setter
@Builder
@ToString
@EqualsAndHashCode(callSuper = true)
@TableName("saas_pgroup_permission_relation_operate_log")
public class SaasPgroupPermissionRelationOperateLog extends BaseEntity<SaasPgroupPermissionRelationOperateLog> {
/**
* 操作类型
* @see cn.axzo.tyr.client.common.enums.PermissionRelationOperateLogTypeEnum
*/
private String type;
/**
* 请求ID
*/
private String traceId;
/**
* 请求参数数据
*/
private String requestData;
/**
* 操作后数据
*/
private String operateData;
/**
* 创建者
*/
private Long createBy;
}

View File

@ -0,0 +1,11 @@
package cn.axzo.tyr.server.repository.mapper;
import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelationOperateLog;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SaasPgroupPermissionRelationOperateLogMapper extends BaseMapper<SaasPgroupPermissionRelationOperateLog> {
}

View File

@ -0,0 +1,15 @@
package cn.axzo.tyr.server.service;
import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelationOperateLog;
import java.util.List;
/**
* @author likunpeng
* @version 1.0
* @date 2024/7/24
*/
public interface SaasPgroupPermissionRelationOperateLogService {
void batchSave(List<SaasPgroupPermissionRelationOperateLog> logs);
}

View File

@ -2,6 +2,7 @@ package cn.axzo.tyr.server.service;
import cn.axzo.foundation.page.PageResp;
import cn.axzo.tyr.client.model.req.PagePgroupPermissionRelationReq;
import cn.axzo.tyr.client.model.vo.SaveOrUpdateRoleVO;
import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation;
import com.baomidou.mybatisplus.extension.service.IService;
import lombok.AllArgsConstructor;
@ -41,6 +42,16 @@ public interface SaasPgroupPermissionRelationService extends IService<SaasPgroup
* 关联类型0saas_feature,1:saas_feature_resource
*/
private Integer type;
/**
* 操作人ID
*/
private Long operatorId;
/**
* 请求参数
*/
private SaveOrUpdateRoleVO requestData;
}
@Data

View File

@ -5,28 +5,30 @@ import cn.axzo.basics.common.constant.enums.DeleteEnum;
import cn.axzo.basics.common.util.TreeUtil;
import cn.axzo.pokonyan.config.mybatisplus.BaseEntity;
import cn.axzo.tyr.client.common.enums.FeatureResourceType;
import cn.axzo.tyr.client.common.enums.PermissionRelationOperateLogTypeEnum;
import cn.axzo.tyr.client.model.req.GetFeatureResourceTreeReq;
import cn.axzo.tyr.client.model.req.ResourceSyncReq;
import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode;
import cn.axzo.tyr.server.inner.feign.BaseFeatureResourceApi;
import cn.axzo.tyr.server.model.SaasPgroupPermissionRelationOperateLogOperateDO;
import cn.axzo.tyr.server.repository.dao.SaasFeatureResourceDao;
import cn.axzo.tyr.server.repository.dao.SaasPageElementFeatureResourceRelationDao;
import cn.axzo.tyr.server.repository.dao.SaasPgroupPermissionRelationDao;
import cn.axzo.tyr.server.repository.dao.SaasPgroupRoleRelationDao;
import cn.axzo.tyr.server.repository.dao.SaasRoleDao;
import cn.axzo.tyr.server.repository.entity.SaasFeatureResource;
import cn.axzo.tyr.server.repository.entity.SaasPageElementFeatureResourceRelation;
import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation;
import cn.axzo.tyr.server.repository.entity.SaasPgroupRoleRelation;
import cn.axzo.tyr.server.repository.entity.SaasRole;
import cn.axzo.tyr.server.repository.entity.*;
import cn.axzo.tyr.server.service.FeatureResourceSyncService;
import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationOperateLogService;
import cn.axzo.tyr.server.util.RpcInternalUtil;
import cn.azxo.framework.common.constatns.Constants;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.MDC;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
@ -70,6 +72,8 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic
private final SaasPageElementFeatureResourceRelationDao saasPageElementFeatureResourceRelationDao;
private final SaasPgroupPermissionRelationOperateLogService saasPgroupPermissionRelationOperateLogService;
@Qualifier("asyncExecutor")
@Autowired
private ExecutorService asyncExecutor;
@ -248,6 +252,9 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic
saasPgroupPermissionRelationDao.removeByFeatureIdAndGroupIds(featureResource.getId(), existPermissionRelations.stream().map(SaasPgroupPermissionRelation::getGroupId).collect(Collectors.toList()), operatorId);
}
// 记录操作日志
saveOperateLog(featureResource, roleCodes, operatorId);
if (CollectionUtils.isEmpty(roleCodes)) {
return;
}
@ -336,4 +343,19 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic
return featureRoleMap;
}
private void saveOperateLog(SaasFeatureResource featureResource, List<String> roleCodes, Long operatorId) {
SaasPgroupPermissionRelationOperateLogOperateDO operateAfter = SaasPgroupPermissionRelationOperateLogOperateDO.builder()
.featureId(featureResource.getId())
.roleCodes(roleCodes)
.build();
SaasPgroupPermissionRelationOperateLog operateLog = SaasPgroupPermissionRelationOperateLog.builder()
.type(PermissionRelationOperateLogTypeEnum.SYNC.getValue())
.createBy(operatorId)
.traceId(MDC.get(Constants.CTX_LOG_ID_MDC))
.operateData(JSONObject.toJSONString(operateAfter))
.build();
saasPgroupPermissionRelationOperateLogService.batchSave(Lists.newArrayList(operateLog));
}
}

View File

@ -6,6 +6,7 @@ import cn.axzo.foundation.dao.support.converter.PageConverter;
import cn.axzo.foundation.dao.support.mysql.QueryWrapperHelper;
import cn.axzo.framework.domain.page.PageResp;
import cn.axzo.pokonyan.config.mybatisplus.BaseEntity;
import cn.axzo.tyr.client.common.enums.PermissionRelationOperateLogTypeEnum;
import cn.axzo.tyr.client.common.enums.RoleResourceTypeEnum;
import cn.axzo.tyr.client.common.enums.RoleTypeEnum;
import cn.axzo.tyr.client.model.enums.IdentityType;
@ -37,10 +38,7 @@ import cn.axzo.tyr.client.model.vo.SaasRoleCategoryVO;
import cn.axzo.tyr.client.model.vo.SaasRoleGroupCodeVO;
import cn.axzo.tyr.client.model.vo.SaasRoleVO;
import cn.axzo.tyr.client.model.vo.SaveOrUpdateRoleVO;
import cn.axzo.tyr.server.model.ResourcePermission;
import cn.axzo.tyr.server.model.ResourcePermissionQueryDTO;
import cn.axzo.tyr.server.model.RoleFeatureRelation;
import cn.axzo.tyr.server.model.RoleWithFeature;
import cn.axzo.tyr.server.model.*;
import cn.axzo.tyr.server.repository.dao.SaasFeatureDao;
import cn.axzo.tyr.server.repository.dao.SaasPermissionGroupDao;
import cn.axzo.tyr.server.repository.dao.SaasPgroupPermissionRelationDao;
@ -49,24 +47,10 @@ import cn.axzo.tyr.server.repository.dao.SaasRoleDao;
import cn.axzo.tyr.server.repository.dao.SaasRoleGroupDao;
import cn.axzo.tyr.server.repository.dao.SaasRoleGroupRelationDao;
import cn.axzo.tyr.server.repository.dao.SaasRoleUserRelationDao;
import cn.axzo.tyr.server.repository.entity.SaasFeature;
import cn.axzo.tyr.server.repository.entity.SaasFeatureResource;
import cn.axzo.tyr.server.repository.entity.SaasPermissionGroup;
import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation;
import cn.axzo.tyr.server.repository.entity.SaasPgroupRoleRelation;
import cn.axzo.tyr.server.repository.entity.SaasRole;
import cn.axzo.tyr.server.repository.entity.SaasRoleGroup;
import cn.axzo.tyr.server.repository.entity.SaasRoleGroupRelation;
import cn.axzo.tyr.server.repository.entity.SaasRoleUserRelation;
import cn.axzo.tyr.server.repository.entity.SaasRoleWithUser;
import cn.axzo.tyr.server.repository.entity.*;
import cn.axzo.tyr.server.repository.mapper.SaasRoleMapper;
import cn.axzo.tyr.server.service.PermissionGroupService;
import cn.axzo.tyr.server.service.RoleService;
import cn.axzo.tyr.server.service.SaasFeatureResourceService;
import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationService;
import cn.axzo.tyr.server.service.SaasRoleGroupRelationService;
import cn.axzo.tyr.server.service.SaasRoleGroupService;
import cn.axzo.tyr.server.service.SaasRoleUserRelationService;
import cn.axzo.tyr.server.service.*;
import cn.azxo.framework.common.constatns.Constants;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
@ -74,6 +58,7 @@ import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.lang.Pair;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@ -90,6 +75,7 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.MDC;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
@ -163,6 +149,8 @@ public class RoleServiceImpl extends ServiceImpl<SaasRoleMapper, SaasRole>
SaasFeatureResourceService saasFeatureResourceService;
@Autowired
private SaasRoleUserRelationService saasRoleUserRelationService;
@Autowired
private SaasPgroupPermissionRelationOperateLogService saasPgroupPermissionRelationOperateLogService;
@Value("${groupLeader.code:projectTeamGPLeader}")
private String groupLeaderCode;
@ -447,6 +435,8 @@ public class RoleServiceImpl extends ServiceImpl<SaasRoleMapper, SaasRole>
.groupIds(Lists.newArrayList(saasPermissionGroup.getId()))
.relations(pgpRelations)
.type(NEW_FEATURE)
.operatorId(saveOrUpdateRole.getOperatorId())
.requestData(saveOrUpdateRole)
.build();
saasPgroupPermissionRelationService.saveOrUpdate(upsertPermissionRelationParam);
}
@ -1304,6 +1294,8 @@ public class RoleServiceImpl extends ServiceImpl<SaasRoleMapper, SaasRole>
saasFeatureResourceService.updateFeatureAuthType(item.getFeatureId(), item.getAuthType());
if (CollectionUtil.isEmpty(item.getRoleIds()) || item.getAuthType() == 0) {
saasPgroupPermissionRelationDao.removeByPermissionPointIds(Collections.singletonList(item.getFeatureId()));
// 记录操作日志
saveOperateLog(item.getFeatureId(), operatorId, req);
} else {
List<Long> existGroupIds = saasPgroupPermissionRelationDao.queryByFeatureIds(Collections.singletonList(item.getFeatureId()))
.stream().map(SaasPgroupPermissionRelation::getGroupId).collect(Collectors.toList());
@ -1312,7 +1304,8 @@ public class RoleServiceImpl extends ServiceImpl<SaasRoleMapper, SaasRole>
.stream().map(SaasPgroupRoleRelation::getGroupId).collect(Collectors.toList());
List<Long> insertGroupIds = groupIds.stream().filter(role -> !existGroupIds.contains(role)).collect(Collectors.toList());
List<Long> deleteGroupIds = existGroupIds.stream().filter(role -> !groupIds.contains(role)).collect(Collectors.toList());
// 记录操作日志
saveOperateLog(item.getFeatureId(), operatorId, groupIds, req);
// 新增的
if (CollectionUtils.isNotEmpty(insertGroupIds)) {
List<SaasPgroupPermissionRelation> insertRelation = new ArrayList<>();
@ -1500,6 +1493,37 @@ public class RoleServiceImpl extends ServiceImpl<SaasRoleMapper, SaasRole>
Collectors.toList())));
}
private void saveOperateLog(Long featureId, Long operatorId, List<FeatureRoleRelationReq.RelationRoleSettings> req) {
SaasPgroupPermissionRelationOperateLogOperateDO operateAfter = SaasPgroupPermissionRelationOperateLogOperateDO.builder()
.featureId(featureId)
.build();
SaasPgroupPermissionRelationOperateLog operateLog = SaasPgroupPermissionRelationOperateLog.builder()
.type(PermissionRelationOperateLogTypeEnum.OMS_FEATURE_RESOURCE_BIND_ROLE.getValue())
.createBy(operatorId)
.traceId(MDC.get(Constants.CTX_LOG_ID_MDC))
.requestData(Objects.isNull(req) ? null : JSONObject.toJSONString(req))
.operateData(JSONObject.toJSONString(operateAfter))
.build();
saasPgroupPermissionRelationOperateLogService.batchSave(Lists.newArrayList(operateLog));
}
private void saveOperateLog(Long featureId, Long operatorId, List<Long> afterGroupIds, List<FeatureRoleRelationReq.RelationRoleSettings> req) {
SaasPgroupPermissionRelationOperateLogOperateDO operateAfter = SaasPgroupPermissionRelationOperateLogOperateDO.builder()
.featureId(featureId)
.groupIds(afterGroupIds)
.build();
SaasPgroupPermissionRelationOperateLog operateLog = SaasPgroupPermissionRelationOperateLog.builder()
.type(PermissionRelationOperateLogTypeEnum.OMS_FEATURE_RESOURCE_BIND_ROLE.getValue())
.createBy(operatorId)
.traceId(MDC.get(Constants.CTX_LOG_ID_MDC))
.requestData(Objects.isNull(req) ? null : JSONObject.toJSONString(req))
.operateData(JSONObject.toJSONString(operateAfter))
.build();
saasPgroupPermissionRelationOperateLogService.batchSave(Lists.newArrayList(operateLog));
}
@Data
@Builder
@NoArgsConstructor

View File

@ -0,0 +1,33 @@
package cn.axzo.tyr.server.service.impl;
import cn.axzo.tyr.server.repository.dao.SaasPgroupPermissionRelationOperateLogDao;
import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelationOperateLog;
import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationOperateLogService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author likunpeng
* @version 1.0
* @date 2024/7/24
*/
@Slf4j
@Service
@AllArgsConstructor
public class SaasPgroupPermissionRelationOperateLogServiceImpl implements SaasPgroupPermissionRelationOperateLogService {
private final SaasPgroupPermissionRelationOperateLogDao saasPgroupPermissionRelationOperateLogDao;
@Override
public void batchSave(List<SaasPgroupPermissionRelationOperateLog> logs) {
if (CollectionUtils.isEmpty(logs)) {
return;
}
saasPgroupPermissionRelationOperateLogDao.saveBatch(logs);
}
}

View File

@ -6,12 +6,19 @@ import cn.axzo.foundation.dao.support.mysql.QueryWrapperHelper;
import cn.axzo.foundation.page.PageResp;
import cn.axzo.framework.auth.domain.TerminalInfo;
import cn.axzo.tyr.client.common.enums.FeatureResourceType;
import cn.axzo.tyr.client.common.enums.PermissionRelationOperateLogTypeEnum;
import cn.axzo.tyr.client.model.req.PagePgroupPermissionRelationReq;
import cn.axzo.tyr.client.model.vo.SaveOrUpdateRoleVO;
import cn.axzo.tyr.server.model.SaasPgroupPermissionRelationOperateLogOperateDO;
import cn.axzo.tyr.server.repository.dao.SaasPgroupPermissionRelationDao;
import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation;
import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelationOperateLog;
import cn.axzo.tyr.server.repository.mapper.SaasPgroupPermissionRelationMapper;
import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationOperateLogService;
import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationService;
import cn.azxo.framework.common.constatns.Constants;
import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@ -19,14 +26,12 @@ import com.google.common.collect.Lists;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.slf4j.MDC;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@ -39,6 +44,7 @@ public class SaasPgroupPermissionRelationServiceImpl
extends ServiceImpl<SaasPgroupPermissionRelationMapper, SaasPgroupPermissionRelation>
implements SaasPgroupPermissionRelationService {
private final SaasPgroupPermissionRelationDao saasPgroupPermissionRelationDao;
private final SaasPgroupPermissionRelationOperateLogService saasPgroupPermissionRelationOperateLogService;
@Override
@Transactional(rollbackFor = Exception.class)
@ -71,6 +77,9 @@ public class SaasPgroupPermissionRelationServiceImpl
if (CollectionUtils.isNotEmpty(deleteList)) {
saasPgroupPermissionRelationDao.removeByIds(deleteList.stream().map(SaasPgroupPermissionRelation::getId).sorted().collect(Collectors.toList()));
}
// 记录操作日志
saveOperateLog(param.getOperatorId(), param.getRequestData(), relations);
}
@Override
@ -113,4 +122,32 @@ public class SaasPgroupPermissionRelationServiceImpl
}
this.removeByIds(param.getIds());
}
private void saveOperateLog(Long operatorId, SaveOrUpdateRoleVO requestData, List<SaasPgroupPermissionRelation> newRelations) {
if (Objects.isNull(operatorId)) {
return;
}
Map<Long, List<Long>> newFeatureResourceIdMap = newRelations.stream()
.collect(Collectors.groupingBy(SaasPgroupPermissionRelation::getFeatureId,
Collectors.mapping(SaasPgroupPermissionRelation::getGroupId, Collectors.toList())));
List<SaasPgroupPermissionRelationOperateLog> operateLogs = Lists.newArrayList();
newFeatureResourceIdMap.entrySet().forEach(e -> {
Long featureId = e.getKey();
SaasPgroupPermissionRelationOperateLogOperateDO operateAfter = SaasPgroupPermissionRelationOperateLogOperateDO.builder()
.featureId(featureId)
.groupIds(e.getValue())
.build();
SaasPgroupPermissionRelationOperateLog operateLog = SaasPgroupPermissionRelationOperateLog.builder()
.type(PermissionRelationOperateLogTypeEnum.OMS_ROLE_BIND_FEATURE_RESOURCE.getValue())
.createBy(operatorId)
.traceId(MDC.get(Constants.CTX_LOG_ID_MDC))
.requestData(Objects.isNull(requestData) ? null : JSONObject.toJSONString(requestData))
.operateData(JSONObject.toJSONString(operateAfter))
.build();
operateLogs.add(operateLog);
});
saasPgroupPermissionRelationOperateLogService.batchSave(operateLogs);
}
}