Merge branch 'hotfix/20240724-log' into 'master'

Hotfix/20240724 log

See merge request universal/infrastructure/backend/tyr!89
This commit is contained in:
李龙 2024-07-25 11:04:04 +00:00
commit d333091bbc
22 changed files with 938 additions and 56 deletions

View File

@ -0,0 +1,66 @@
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 PermissionRelationOperateLogSceneEnum {
/**
* oms同步
*/
OMS_SYNC("OMS_SYNC", "oms同步"),
/**
* oms后台更新资源绑定的角色
*/
OMS_FEATURE_RESOURCE_BIND_ROLE("OMS_FEATURE_RESOURCE_BIND_ROLE", "oms后台更新资源绑定的角色"),
/**
* oms后台更新角色绑定资源绑定的
*/
OMS_ROLE_BIND_FEATURE_RESOURCE("OMS_ROLE_BIND_FEATURE_RESOURCE", "oms后台更新角色绑定的资源"),
/**
* oms后台更新资源绑定的页面元素
*/
OMS_FEATURE_RESOURCE_BIND_ELEMENT("OMS_FEATURE_RESOURCE_BIND_ELEMENT", "oms后台更新资源绑定的页面元素"),
/**
* oms后台更新产品榜的资源
*/
OMS_PRODUCT_BIND_FEATURE_RESOURCE("OMS_PRODUCT_BIND_FEATURE_RESOURCE", "oms后台更新产品榜的资源"),
/**
* oms后台添加API
*/
OMS_API_INSERT("OMS_API_INSERT", "oms后台添加API"),
/**
* oms后台更新API
*/
OMS_API_UPDATE("OMS_API_UPDATE", "oms后台更新API"),
/**
* oms后台删除API
*/
OMS_API_DELETE("OMS_API_DELETE", "oms后台删除API"),
/**
* oms后台同步API
*/
OMS_API_SYNC("OMS_API_SYNC", "oms后台同步API"),
;
@EnumValue
private final String value;
private final String desc;
}

View File

@ -0,0 +1,22 @@
package cn.axzo.tyr.client.feign;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.tyr.client.model.req.PermissionOperateLogReq;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import javax.validation.Valid;
/**
* @author likunpeng
* @version 1.0
* @date 2024/7/25
*/
@FeignClient(name = "tyr", url = "${axzo.service.tyr:http://tyr:8080}")
public interface PermissionOperateLogApi {
/** API关联操作日志记录 **/
@PostMapping("/api/permissionOperateLog/save")
ApiResult<Void> save(@RequestBody @Valid PermissionOperateLogReq req);
}

View File

@ -0,0 +1,44 @@
package cn.axzo.tyr.client.model.req;
import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.List;
/**
* 创建新路由请求
*
* @version V1.0
* @author: ZhanSiHu
* @date: 2023/9/11 10:33
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PermissionOperateLogReq implements Serializable {
@NotBlank(message = "表名不能为空")
private String tableName;
@NotNull(message = "操作人ID不能为空")
@Min(value = 1, message = "操作人ID有误")
private Long operatorId;
@NotBlank(message = "场景不能为空")
private String scene;
private String sceneId;
private Object requestData;
private Object operateData;
}

View File

@ -29,4 +29,6 @@ public class ResourceSyncReq {
/** 操作人personId **/
@NotNull(message = "操作人ID不能为空")
private Long operatorId;
private String traceId;
}

View File

@ -0,0 +1,76 @@
package cn.axzo.tyr.server.config;
import cn.axzo.framework.auth.config.FeignContextInfoInterceptor;
import cn.axzo.framework.auth.domain.*;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Objects;
/**
* @author chenwenjian
* @version 1.0
* @date 2024/6/19 12:44
*/
@Slf4j
@Component
public class ContextInfoFillInterceptor implements HandlerInterceptor {
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
ContextInfoHolder.clear();
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String lite = request.getHeader(FeignContextInfoInterceptor.LITE);
if (StrUtil.isNotBlank(lite)) {
try {
ContextInfo.LiteSaasContext liteSaasContext = JSONUtil.toBean(lite, ContextInfo.LiteSaasContext.class);
String serverName = request.getHeader(FeignContextInfoInterceptor.SERVICE_NAME);
if (Objects.nonNull(liteSaasContext)) {
ContextInfo contextInfo = new ContextInfo();
contextInfo.setWorkspaceId(liteSaasContext.getWorkspaceId());
contextInfo.setWorkspaceType(liteSaasContext.getWorkspaceType());
contextInfo.setOuId(liteSaasContext.getOuId());
contextInfo.setOuType(liteSaasContext.getOuType());
contextInfo.setSaasTenantId(liteSaasContext.getSaasTennantId());
UserInfo userInfo = new UserInfo();
userInfo.setIdentityId(liteSaasContext.getIdentityId());
userInfo.setIdentityType(liteSaasContext.getIdentityType());
userInfo.setPersonId(liteSaasContext.getPersonId());
userInfo.setAcntId(liteSaasContext.getAcntId());
userInfo.setRealName(liteSaasContext.getRealName());
contextInfo.setUserInfo(userInfo);
TerminalInfo terminalInfo = new TerminalInfo(liteSaasContext.getTerminal());
contextInfo.setTerminalInfo(terminalInfo);
SystemAndDeviceInfo systemAndDeviceInfo = new SystemAndDeviceInfo();
systemAndDeviceInfo.setIpAddress(liteSaasContext.getIpAddress());
contextInfo.setSystemAndDeviceInfo(systemAndDeviceInfo);
ContextInfoHolder.set(contextInfo);
log.info("ContextInfo parsing success! server: {}, contextInfo: {}", StrUtil.isNotBlank(serverName) ? serverName : "unknown", lite);
}
} catch (Exception e) {
log.warn("ContextInfo parsing failure! {}", e.getMessage());
}
return true;
}
log.warn("Can not get LiteSaasContext!");
return true;
}
}

View File

@ -0,0 +1,25 @@
package cn.axzo.tyr.server.config;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* @author chenwenjian
* @version 1.0
* @date 2024/6/19 13:17
*/
@Configuration
@RequiredArgsConstructor
public class WebConfig implements WebMvcConfigurer {
private final ContextInfoFillInterceptor contextInfoFillInterceptor;
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(contextInfoFillInterceptor)
.addPathPatterns("/**");
}
}

View File

@ -0,0 +1,28 @@
package cn.axzo.tyr.server.controller.permission;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.tyr.client.feign.PermissionOperateLogApi;
import cn.axzo.tyr.client.model.req.PermissionOperateLogReq;
import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationOperateLogService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RestController;
/**
* @author likunpeng
* @version 1.0
* @date 2024/7/25
*/
@Slf4j
@RestController
@RequiredArgsConstructor
public class PermissionOperateLogController implements PermissionOperateLogApi {
private final SaasPgroupPermissionRelationOperateLogService saasPgroupPermissionRelationOperateLogService;
@Override
public ApiResult<Void> save(PermissionOperateLogReq req) {
saasPgroupPermissionRelationOperateLogService.save(req);
return ApiResult.ok();
}
}

View File

@ -0,0 +1,33 @@
package cn.axzo.tyr.server.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author likunpeng
* @version 1.0
* @date 2024/7/25
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BasicRoleDO {
/**
* 角色ID
*/
private Long roleId;
/**
* 角色code
*/
private String roleCode;
/**
* 角色名字
*/
private String roleName;
}

View File

@ -0,0 +1,30 @@
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 RelationOperateLogProductBindResourceDO {
/**
* 资源编码
*/
private List<String> uniCodes;
/**
* 产品ID
*/
private Long productId;
}

View File

@ -0,0 +1,30 @@
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 RelationOperateLogResourceBindElementDO {
/**
* 资源编码
*/
private String uniCode;
/**
* 页面元素code列表
*/
private List<String> featureCodes;
}

View File

@ -0,0 +1,30 @@
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 RelationOperateLogResourceBindRoleDO {
/**
* 资源编码
*/
private String uniCode;
/**
* 角色code列表
*/
private List<String> roleCodes;
}

View File

@ -0,0 +1,30 @@
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 RelationOperateLogRoleBindResourceDO {
/**
* 资源编码
*/
private List<String> uniCodes;
/**
* 角色code
*/
private String roleCode;
}

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,66 @@
package cn.axzo.tyr.server.repository.entity;
import cn.axzo.pokonyan.config.mybatisplus.BaseEntity;
import cn.axzo.tyr.client.common.enums.PermissionRelationOperateLogSceneEnum;
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> {
/**
* 操作关联的表名
*/
private String tableName;
/**
* 操作场景
* @see PermissionRelationOperateLogSceneEnum
*/
private String scene;
/**
* 操作场景ID
*/
private String sceneId;
/**
* 请求ID
*/
private String traceId;
/**
* 请求参数数据
*/
private String requestData;
/**
* 操作后数据
*/
private String operateData;
/**
* 创建者
*/
private Long createBy;
/**
* 操作人名
*/
private String createByName;
/**
* 操作人角色
*/
private String createByRole;
}

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,21 @@
package cn.axzo.tyr.server.service;
import cn.axzo.tyr.client.model.req.PermissionOperateLogReq;
import cn.axzo.tyr.server.model.BasicRoleDO;
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);
List<BasicRoleDO> getPersonBasicRoles(Long personId);
void save(PermissionOperateLogReq req);
}

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

@ -3,30 +3,34 @@ package cn.axzo.tyr.server.service.impl;
import cn.axzo.basics.common.BeanMapper;
import cn.axzo.basics.common.constant.enums.DeleteEnum;
import cn.axzo.basics.common.util.TreeUtil;
import cn.axzo.basics.profiles.api.UserProfileServiceApi;
import cn.axzo.basics.profiles.dto.basic.PersonProfileDto;
import cn.axzo.pokonyan.config.mybatisplus.BaseEntity;
import cn.axzo.tyr.client.common.enums.FeatureResourceType;
import cn.axzo.tyr.client.common.enums.PermissionRelationOperateLogSceneEnum;
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.RelationOperateLogResourceBindRoleDO;
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 +74,9 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic
private final SaasPageElementFeatureResourceRelationDao saasPageElementFeatureResourceRelationDao;
private final SaasPgroupPermissionRelationOperateLogService saasPgroupPermissionRelationOperateLogService;
private final UserProfileServiceApi userProfileServiceApi;
@Qualifier("asyncExecutor")
@Autowired
private ExecutorService asyncExecutor;
@ -109,6 +116,7 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic
@Override
public void syncFromBase(ResourceSyncReq req) {
req.setTraceId(MDC.get(Constants.CTX_LOG_ID_MDC));
if (req.getIds().size() > 1) {
//超过一个异步处理
CompletableFuture.runAsync(() -> doSyncFromBase(req), asyncExecutor).whenComplete((t, ex) -> saasFeatureResourceCacheService.clearCache());
@ -119,6 +127,7 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic
}
private void doSyncFromBase(ResourceSyncReq req) {
List<RelationOperateLogResourceBindRoleDO> operateDos = Lists.newCopyOnWriteArrayList();
//TODO:@Zhan 并发处理同一个parent下同批查询
//处理数据缓存避免同级节点上级重复处理 - 上级code查询
final Map<Long, String> codeCache = new ConcurrentHashMap<>();
@ -127,7 +136,14 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic
//获取基准环境配置数据:同步某个ID的数据 需要同步处理它所有上级及下级组件
List<FeatureResourceTreeNode> syncList = RpcInternalUtil.rpcProcessor(() -> baseFeatureResourceApi.getSyncTreeById(id),
"get base sync tree by id", id).getData();
syncResourceProcess(syncList, codeCache, req.getOperatorId());
syncResourceProcess(syncList, codeCache, req.getOperatorId(), operateDos);
}
// 记录操作日志
try {
saveOperateLog(req, operateDos);
} catch (Exception e) {
log.warn("save operate log error", e);
}
}
@ -161,7 +177,7 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic
return featureResourceIdCodeMap;
}
private void syncResourceProcess(List<FeatureResourceTreeNode> syncList, Map<Long, String> codeCache, Long operatorId) {
private void syncResourceProcess(List<FeatureResourceTreeNode> syncList, Map<Long, String> codeCache, Long operatorId, List<RelationOperateLogResourceBindRoleDO> operateDos) {
for (FeatureResourceTreeNode treeNode : syncList) {
if (codeCache.containsKey(treeNode.getId())) {
@ -169,7 +185,7 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic
log.info("already sync resource:{}", treeNode.getId());
//递归子节点
if (CollectionUtils.isNotEmpty(treeNode.getChildren())) {
syncResourceProcess(treeNode.getChildren(), codeCache, operatorId);
syncResourceProcess(treeNode.getChildren(), codeCache, operatorId, operateDos);
}
continue;
}
@ -204,11 +220,14 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic
}
// 处理资源关联的权限
doFeatureResourceRole(baseResource, treeNode.getRoleCodes(), operatorId);
RelationOperateLogResourceBindRoleDO logResourceBindRoleDO = doFeatureResourceRole(baseResource, treeNode.getRoleCodes(), operatorId);
if (Objects.nonNull(logResourceBindRoleDO)) {
operateDos.add(logResourceBindRoleDO);
}
//递归子节点
if (CollectionUtils.isNotEmpty(treeNode.getChildren())) {
syncResourceProcess(treeNode.getChildren(), codeCache, operatorId);
syncResourceProcess(treeNode.getChildren(), codeCache, operatorId, operateDos);
}
}
}
@ -232,9 +251,9 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic
}
}
private void doFeatureResourceRole(SaasFeatureResource featureResource, List<String> roleCodes, Long operatorId) {
private RelationOperateLogResourceBindRoleDO doFeatureResourceRole(SaasFeatureResource featureResource, List<String> roleCodes, Long operatorId) {
if (Objects.isNull(featureResource)) {
return;
return null;
}
// 先清除资源绑定的角色 @20240723 产品武艳华要求资源绑定的角色以PRE角色为准
@ -248,8 +267,13 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic
saasPgroupPermissionRelationDao.removeByFeatureIdAndGroupIds(featureResource.getId(), existPermissionRelations.stream().map(SaasPgroupPermissionRelation::getGroupId).collect(Collectors.toList()), operatorId);
}
// 操作日志
RelationOperateLogResourceBindRoleDO logResourceBindRoleDO = RelationOperateLogResourceBindRoleDO.builder()
.uniCode(featureResource.getUniCode())
.build();
if (CollectionUtils.isEmpty(roleCodes)) {
return;
return logResourceBindRoleDO;
}
// List<String> existRoleCodes = getFeatureResourceRoleCodeMap(Lists.newArrayList(featureResource.getId()))
@ -264,10 +288,11 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic
List<SaasRole> saasRoles = saasRoleDao.listByRoleCodes(roleCodes);
if (CollectionUtils.isEmpty(saasRoles)) {
return;
return logResourceBindRoleDO;
}
List<Long> groupIds = saasPgroupRoleRelationDao.findByRoleIds(saasRoles.stream().map(BaseEntity::getId).collect(Collectors.toList()))
.stream().map(SaasPgroupRoleRelation::getGroupId).collect(Collectors.toList());
List<SaasPgroupRoleRelation> saasPgroupRoleRelations = saasPgroupRoleRelationDao.findByRoleIds(saasRoles.stream().map(BaseEntity::getId).collect(Collectors.toList()));
List<Long> groupIds = saasPgroupRoleRelations.stream().map(SaasPgroupRoleRelation::getGroupId).collect(Collectors.toList());
List<Long> existRoleIds = saasPgroupRoleRelations.stream().map(SaasPgroupRoleRelation::getRoleId).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(groupIds)) {
List<SaasPgroupPermissionRelation> insertRelation = groupIds.stream()
.map(groupId -> {
@ -282,7 +307,10 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic
})
.collect(Collectors.toList());
saasPgroupPermissionRelationDao.saveBatch(insertRelation);
logResourceBindRoleDO.setRoleCodes(saasRoles.stream().filter(e -> existRoleIds.contains(e.getId())).map(SaasRole::getRoleCode).collect(Collectors.toList()));
}
return logResourceBindRoleDO;
}
private Map<Long, List<String>> getFeatureResourceRoleCodeMap(List<Long> allFeatureResourceIds) {
@ -336,4 +364,22 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic
return featureRoleMap;
}
private void saveOperateLog(ResourceSyncReq req, List<RelationOperateLogResourceBindRoleDO> operateDos) {
List<PersonProfileDto> personProfileDtos = RpcInternalUtil.rpcListProcessor(() -> userProfileServiceApi.getPersonProfiles(Lists.newArrayList(req.getOperatorId())), "查询用户信息", req.getOperatorId()).getData();
PersonProfileDto operator = CollectionUtils.isEmpty(personProfileDtos) ? null : personProfileDtos.get(0);
SaasPgroupPermissionRelationOperateLog operateLog = SaasPgroupPermissionRelationOperateLog.builder()
.tableName(SaasPgroupPermissionRelationOperateLogServiceImpl.TABLE_NAME_FEATURE_RESOURCE)
.scene(PermissionRelationOperateLogSceneEnum.OMS_SYNC.getValue())
.createBy(req.getOperatorId())
.createByName(Objects.isNull(operator) ? "" : operator.getRealName())
.traceId(req.getTraceId())
.requestData(JSONObject.toJSONString(req))
.operateData(JSONObject.toJSONString(operateDos))
.createByRole(JSONObject.toJSONString(saasPgroupPermissionRelationOperateLogService.getPersonBasicRoles(req.getOperatorId())))
.build();
saasPgroupPermissionRelationOperateLogService.batchSave(Lists.newArrayList(operateLog));
}
}

View File

@ -2,11 +2,14 @@ package cn.axzo.tyr.server.service.impl;
import cn.axzo.basics.common.BeanMapper;
import cn.axzo.basics.common.util.AssertUtil;
import cn.axzo.basics.profiles.api.UserProfileServiceApi;
import cn.axzo.basics.profiles.dto.basic.PersonProfileDto;
import cn.axzo.framework.auth.domain.TerminalInfo;
import cn.axzo.framework.domain.page.PageResp;
import cn.axzo.framework.domain.web.result.ApiPageResult;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.pokonyan.config.mybatisplus.BaseEntity;
import cn.axzo.tyr.client.common.enums.PermissionRelationOperateLogSceneEnum;
import cn.axzo.tyr.client.common.enums.ProductModuleFeatureRelationTypeEnum;
import cn.axzo.tyr.client.model.dict.request.BasicDictQueryReq;
import cn.axzo.tyr.client.model.dict.response.BasicDictNodeResp;
@ -17,15 +20,19 @@ import cn.axzo.tyr.client.model.req.ProductSaveReq;
import cn.axzo.tyr.client.model.req.UpdateProductStatusReq;
import cn.axzo.tyr.client.model.res.GovernmentTerminalResp;
import cn.axzo.tyr.client.model.res.WorkspaceProductResp;
import cn.axzo.tyr.server.model.RelationOperateLogProductBindResourceDO;
import cn.axzo.tyr.server.model.RelationOperateLogResourceBindElementDO;
import cn.axzo.tyr.server.repository.dao.SaasFeatureResourceDao;
import cn.axzo.tyr.server.repository.entity.ProductModule;
import cn.axzo.tyr.server.repository.dao.ProductModuleDao;
import cn.axzo.tyr.server.repository.entity.SaasFeatureResource;
import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelationOperateLog;
import cn.axzo.tyr.server.repository.entity.SaasProductModuleFeatureRelation;
import cn.axzo.tyr.server.service.ProductFeatureRelationService;
import cn.axzo.tyr.server.service.ProductService;
import cn.axzo.tyr.server.service.SaasBasicDictService;
import cn.axzo.tyr.server.service.SaasFeatureResourceService;
import cn.axzo.tyr.server.service.*;
import cn.axzo.tyr.server.util.RpcInternalUtil;
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.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
@ -34,6 +41,7 @@ import com.google.common.collect.Sets;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.slf4j.MDC;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
@ -56,6 +64,9 @@ public class ProductServiceImpl implements ProductService {
private final ProductFeatureRelationService productFeatureRelationService;
private final SaasFeatureResourceService saasFeatureResourceService;
private final SaasBasicDictService saasBasicDictService;
private final UserProfileServiceApi userProfileServiceApi;
private final SaasPgroupPermissionRelationOperateLogService saasPgroupPermissionRelationOperateLogService;
private final SaasFeatureResourceDao saasFeatureResourceDao;
@Override
public ApiResult<List<ProductVO>> list(ProductSearchListReq req) {
@ -227,9 +238,15 @@ public class ProductServiceImpl implements ProductService {
}
// 保存商品权限信息
if (WorkspaceTypeCodeEnum.GOVERNMENT.getCode().equals(productModule.getDictWorkspaceTypeCode())) {
saveGovernmentFeatureResource(productModule.getId(), productModule.getDictWorkspaceTypeId(), productModule.getDictWorkspaceTypeCode(), req.getFeatureScope().getGovernmentFeatureResourceIds());
saveGovernmentFeatureResource(productModule.getId(), productModule.getDictWorkspaceTypeId(), productModule.getDictWorkspaceTypeCode(), req.getFeatureScope().getGovernmentFeatureResourceIds(), req);
} else {
saveNonGaFeatureResource(productModule.getId(), req.getFeatureScope().getRelations());
// 保存操作日志
try {
saveOperateLog4NonGaProduct(req, productModule.getId());
} catch (Exception e) {
log.warn("save operate log error", e);
}
}
return ApiResult.ok(productModule.getId());
}
@ -347,7 +364,7 @@ public class ProductServiceImpl implements ProductService {
/**
* 保存政务端产品功能权限
*/
private void saveGovernmentFeatureResource(Long productId, Long dictWorkspaceTypeId, String dictWorkspaceTypeCode, List<Long> rootFeatureIds) {
private void saveGovernmentFeatureResource(Long productId, Long dictWorkspaceTypeId, String dictWorkspaceTypeCode, List<Long> rootFeatureIds, ProductSaveReq request) {
List<SaasFeatureResource> saasFeatureResources = saasFeatureResourceService.listByParentIdAndTerminalAndIds(null, null, rootFeatureIds);
AssertUtil.notEmpty(saasFeatureResources, "功能范围选择端不能为空");
saasFeatureResources.forEach(e -> {
@ -365,6 +382,13 @@ public class ProductServiceImpl implements ProductService {
req.getFeatureIds().addAll(featureIds);
req.setFeatureRelationType(ProductModuleFeatureRelationTypeEnum.FEATURE_RESOURCE.getCode());
productFeatureRelationService.updateFeatureResourceRelation(Collections.singletonList(req), ProductModuleFeatureRelationTypeEnum.FEATURE_RESOURCE.getCode());
// 保存操作日志
try {
saveOperateLog4GovernmentProduct(request, productId, frs);
} catch (Exception e) {
log.warn("save operate log error", e);
}
}
/**
@ -458,4 +482,53 @@ public class ProductServiceImpl implements ProductService {
.build()).collect(Collectors.toList()) : Collections.emptyList())
.build()).orElse(null);
}
private void saveOperateLog4GovernmentProduct(ProductSaveReq req, Long productId, List<SaasFeatureResource> featureResources) {
List<PersonProfileDto> personProfileDtos = RpcInternalUtil.rpcListProcessor(() -> userProfileServiceApi.getPersonProfiles(Lists.newArrayList(req.getOperator())), "查询用户信息", req.getOperator()).getData();
PersonProfileDto operator = CollectionUtils.isEmpty(personProfileDtos) ? null : personProfileDtos.get(0);
RelationOperateLogProductBindResourceDO operateAfter = RelationOperateLogProductBindResourceDO.builder()
.productId(productId)
.uniCodes(CollectionUtils.emptyIfNull(featureResources).stream().map(SaasFeatureResource::getUniCode).collect(Collectors.toList()))
.build();
SaasPgroupPermissionRelationOperateLog operateLog = SaasPgroupPermissionRelationOperateLog.builder()
.tableName(SaasPgroupPermissionRelationOperateLogServiceImpl.TABLE_NAME_PRODUCT)
.scene(PermissionRelationOperateLogSceneEnum.OMS_PRODUCT_BIND_FEATURE_RESOURCE.getValue())
.sceneId(productId.toString())
.createBy(req.getOperator())
.createByName(Objects.isNull(operator) ? "" : operator.getRealName())
.traceId(MDC.get(Constants.CTX_LOG_ID_MDC))
.requestData(JSONObject.toJSONString(req))
.operateData(JSONObject.toJSONString(Lists.newArrayList(operateAfter)))
.createByRole(JSONObject.toJSONString(saasPgroupPermissionRelationOperateLogService.getPersonBasicRoles(req.getOperator())))
.build();
saasPgroupPermissionRelationOperateLogService.batchSave(Lists.newArrayList(operateLog));
}
private void saveOperateLog4NonGaProduct(ProductSaveReq req, Long productId) {
List<PersonProfileDto> personProfileDtos = RpcInternalUtil.rpcListProcessor(() -> userProfileServiceApi.getPersonProfiles(Lists.newArrayList(req.getOperator())), "查询用户信息", req.getOperator()).getData();
PersonProfileDto operator = CollectionUtils.isEmpty(personProfileDtos) ? null : personProfileDtos.get(0);
List<SaasFeatureResource> featureResources = Lists.newArrayList();
if (CollectionUtils.isNotEmpty(req.getFeatureScope().getRelations())) {
Set<Long> allFeatureResourceIds = req.getFeatureScope().getRelations().stream().map(ProductSaveReq.ProductFeatureRelation::getFeatureIds).filter(CollectionUtils::isNotEmpty).flatMap(Set::stream).collect(Collectors.toSet());
featureResources = saasFeatureResourceDao.lambdaQuery().in(BaseEntity::getId, allFeatureResourceIds).list();
}
RelationOperateLogProductBindResourceDO operateAfter = RelationOperateLogProductBindResourceDO.builder()
.productId(productId)
.uniCodes(featureResources.stream().map(SaasFeatureResource::getUniCode).collect(Collectors.toList()))
.build();
SaasPgroupPermissionRelationOperateLog operateLog = SaasPgroupPermissionRelationOperateLog.builder()
.tableName(SaasPgroupPermissionRelationOperateLogServiceImpl.TABLE_NAME_PRODUCT)
.scene(PermissionRelationOperateLogSceneEnum.OMS_PRODUCT_BIND_FEATURE_RESOURCE.getValue())
.sceneId(productId.toString())
.createBy(req.getOperator())
.createByName(Objects.isNull(operator) ? "" : operator.getRealName())
.traceId(MDC.get(Constants.CTX_LOG_ID_MDC))
.requestData(JSONObject.toJSONString(req))
.operateData(JSONObject.toJSONString(Lists.newArrayList(operateAfter)))
.createByRole(JSONObject.toJSONString(saasPgroupPermissionRelationOperateLogService.getPersonBasicRoles(req.getOperator())))
.build();
saasPgroupPermissionRelationOperateLogService.batchSave(Lists.newArrayList(operateLog));
}
}

View File

@ -2,10 +2,13 @@ package cn.axzo.tyr.server.service.impl;
import cn.axzo.basics.common.constant.enums.TableIsDeleteEnum;
import cn.axzo.basics.common.exception.ServiceException;
import cn.axzo.basics.profiles.api.UserProfileServiceApi;
import cn.axzo.basics.profiles.dto.basic.PersonProfileDto;
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.PermissionRelationOperateLogSceneEnum;
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,36 +40,13 @@ 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.repository.dao.SaasFeatureDao;
import cn.axzo.tyr.server.repository.dao.SaasPermissionGroupDao;
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.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.model.*;
import cn.axzo.tyr.server.repository.dao.*;
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.axzo.tyr.server.util.RpcInternalUtil;
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 +54,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 +71,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 +145,12 @@ public class RoleServiceImpl extends ServiceImpl<SaasRoleMapper, SaasRole>
SaasFeatureResourceService saasFeatureResourceService;
@Autowired
private SaasRoleUserRelationService saasRoleUserRelationService;
@Autowired
private SaasPgroupPermissionRelationOperateLogService saasPgroupPermissionRelationOperateLogService;
@Autowired
private UserProfileServiceApi userProfileServiceApi;
@Autowired
private SaasFeatureResourceDao saasFeatureResourceDao;
@Value("${groupLeader.code:projectTeamGPLeader}")
private String groupLeaderCode;
@ -447,8 +435,17 @@ 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);
// 记录操作日志
try {
saveOperateLog4RoleBindFeatureResource(saveOrUpdateRole);
} catch (Exception e) {
log.warn("save operate log error", e);
}
}
@Override
@ -1304,6 +1301,12 @@ 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()));
// 记录操作日志
try {
saveOperateLog(item.getFeatureId(), operatorId, req);
} catch (Exception e) {
log.warn("save operate log error", e);
}
} else {
List<Long> existGroupIds = saasPgroupPermissionRelationDao.queryByFeatureIds(Collections.singletonList(item.getFeatureId()))
.stream().map(SaasPgroupPermissionRelation::getGroupId).collect(Collectors.toList());
@ -1312,7 +1315,12 @@ 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());
// 记录操作日志
try {
saveOperateLog(item.getFeatureId(), operatorId, item.getRoleIds(), req);
} catch (Exception e) {
log.warn("save operate log error", e);
}
// 新增的
if (CollectionUtils.isNotEmpty(insertGroupIds)) {
List<SaasPgroupPermissionRelation> insertRelation = new ArrayList<>();
@ -1500,6 +1508,86 @@ public class RoleServiceImpl extends ServiceImpl<SaasRoleMapper, SaasRole>
Collectors.toList())));
}
private void saveOperateLog(Long featureId, Long operatorId, List<FeatureRoleRelationReq.RelationRoleSettings> req) {
SaasFeatureResource saasFeatureResource = saasFeatureResourceService.featureResourceById(featureId);
if (Objects.isNull(saasFeatureResource)) {
return;
}
List<PersonProfileDto> personProfileDtos = RpcInternalUtil.rpcListProcessor(() -> userProfileServiceApi.getPersonProfiles(Lists.newArrayList(operatorId)), "查询用户信息", operatorId).getData();
PersonProfileDto operator = org.apache.commons.collections4.CollectionUtils.isEmpty(personProfileDtos) ? null : personProfileDtos.get(0);
RelationOperateLogResourceBindRoleDO operateAfter = RelationOperateLogResourceBindRoleDO.builder()
.uniCode(saasFeatureResource.getUniCode())
.build();
SaasPgroupPermissionRelationOperateLog operateLog = SaasPgroupPermissionRelationOperateLog.builder()
.tableName(SaasPgroupPermissionRelationOperateLogServiceImpl.TABLE_NAME_FEATURE_RESOURCE)
.scene(PermissionRelationOperateLogSceneEnum.OMS_FEATURE_RESOURCE_BIND_ROLE.getValue())
.sceneId(saasFeatureResource.getUniCode())
.createBy(operatorId)
.createByName(Objects.isNull(operator) ? "" : operator.getRealName())
.traceId(MDC.get(Constants.CTX_LOG_ID_MDC))
.requestData(Objects.isNull(req) ? null : JSONObject.toJSONString(req))
.operateData(JSONObject.toJSONString(Lists.newArrayList(operateAfter)))
.createByRole(JSONObject.toJSONString(saasPgroupPermissionRelationOperateLogService.getPersonBasicRoles(operatorId)))
.build();
saasPgroupPermissionRelationOperateLogService.batchSave(Lists.newArrayList(operateLog));
}
private void saveOperateLog(Long featureId, Long operatorId, List<Long> roleIds, List<FeatureRoleRelationReq.RelationRoleSettings> req) {
SaasFeatureResource saasFeatureResource = saasFeatureResourceService.featureResourceById(featureId);
if (Objects.isNull(saasFeatureResource)) {
return;
}
List<PersonProfileDto> personProfileDtos = RpcInternalUtil.rpcListProcessor(() -> userProfileServiceApi.getPersonProfiles(Lists.newArrayList(operatorId)), "查询用户信息", operatorId).getData();
PersonProfileDto operator = org.apache.commons.collections4.CollectionUtils.isEmpty(personProfileDtos) ? null : personProfileDtos.get(0);
List<SaasRole> saasRoles = saasRoleDao.lambdaQuery().in(BaseEntity::getId, roleIds).list();
RelationOperateLogResourceBindRoleDO operateAfter = RelationOperateLogResourceBindRoleDO.builder()
.uniCode(saasFeatureResource.getUniCode())
.roleCodes(saasRoles.stream().map(SaasRole::getRoleCode).collect(Collectors.toList()))
.build();
SaasPgroupPermissionRelationOperateLog operateLog = SaasPgroupPermissionRelationOperateLog.builder()
.tableName(SaasPgroupPermissionRelationOperateLogServiceImpl.TABLE_NAME_FEATURE_RESOURCE)
.scene(PermissionRelationOperateLogSceneEnum.OMS_FEATURE_RESOURCE_BIND_ROLE.getValue())
.sceneId(saasFeatureResource.getUniCode())
.createBy(operatorId)
.createByName(Objects.isNull(operator) ? "" : operator.getRealName())
.traceId(MDC.get(Constants.CTX_LOG_ID_MDC))
.requestData(Objects.isNull(req) ? null : JSONObject.toJSONString(req))
.operateData(JSONObject.toJSONString(Lists.newArrayList(operateAfter)))
.createByRole(JSONObject.toJSONString(saasPgroupPermissionRelationOperateLogService.getPersonBasicRoles(operatorId)))
.build();
saasPgroupPermissionRelationOperateLogService.batchSave(Lists.newArrayList(operateLog));
}
private void saveOperateLog4RoleBindFeatureResource(SaveOrUpdateRoleVO saveOrUpdateRole) {
SaasRole saasRole = saasRoleDao.getById(saveOrUpdateRole.getId());
List<String> uniCodes = null;
if (CollectionUtils.isNotEmpty(saveOrUpdateRole.getPermissionIds())) {
uniCodes = saasFeatureResourceDao.lambdaQuery().in(BaseEntity::getId, saveOrUpdateRole.getPermissionIds()).list().stream().map(SaasFeatureResource::getUniCode).collect(Collectors.toList());
}
RelationOperateLogRoleBindResourceDO operateAfter = RelationOperateLogRoleBindResourceDO.builder()
.uniCodes(uniCodes)
.roleCode(saasRole.getRoleCode())
.build();
SaasPgroupPermissionRelationOperateLog operateLog = SaasPgroupPermissionRelationOperateLog.builder()
.tableName(SaasPgroupPermissionRelationOperateLogServiceImpl.TABLE_NAME_ROLE)
.scene(PermissionRelationOperateLogSceneEnum.OMS_ROLE_BIND_FEATURE_RESOURCE.getValue())
.sceneId(saasRole.getRoleCode())
.createBy(saveOrUpdateRole.getOperatorId())
.createByName(saveOrUpdateRole.getOperatorName())
.traceId(MDC.get(Constants.CTX_LOG_ID_MDC))
.requestData(Objects.isNull(saveOrUpdateRole) ? null : JSONObject.toJSONString(saveOrUpdateRole))
.operateData(JSONObject.toJSONString(Lists.newArrayList(operateAfter)))
.createByRole(JSONObject.toJSONString(saasPgroupPermissionRelationOperateLogService.getPersonBasicRoles(saveOrUpdateRole.getOperatorId())))
.build();
saasPgroupPermissionRelationOperateLogService.batchSave(Lists.newArrayList(operateLog));
}
@Data
@Builder
@NoArgsConstructor

View File

@ -3,26 +3,32 @@ package cn.axzo.tyr.server.service.impl;
import cn.axzo.basics.common.BeanMapper;
import cn.axzo.basics.common.util.AssertUtil;
import cn.axzo.basics.common.util.StopWatchUtil;
import cn.axzo.basics.profiles.api.UserProfileServiceApi;
import cn.axzo.basics.profiles.dto.basic.PersonProfileDto;
import cn.axzo.framework.domain.page.PageResp;
import cn.axzo.pokonyan.config.mybatisplus.BaseEntity;
import cn.axzo.tyr.client.common.enums.FeatureResourceType;
import cn.axzo.tyr.client.common.enums.PageElementFeatureResourceRelationTypeEnum;
import cn.axzo.tyr.client.common.enums.PageElementTypeEnum;
import cn.axzo.tyr.client.common.enums.PermissionRelationOperateLogSceneEnum;
import cn.axzo.tyr.client.model.req.*;
import cn.axzo.tyr.client.model.res.GetUserHasPermissionPageElementResp;
import cn.axzo.tyr.client.model.res.IdentityAuthRes;
import cn.axzo.tyr.client.model.res.PageElementBasicDTO;
import cn.axzo.tyr.client.model.res.PageElementResp;
import cn.axzo.tyr.server.model.RelationOperateLogResourceBindElementDO;
import cn.axzo.tyr.server.model.RelationOperateLogResourceBindRoleDO;
import cn.axzo.tyr.server.repository.dao.SaasFeatureResourceDao;
import cn.axzo.tyr.server.repository.dao.SaasPageElementDao;
import cn.axzo.tyr.server.repository.dao.SaasPageElementFeatureResourceRelationDao;
import cn.axzo.tyr.server.repository.entity.SaasFeatureResource;
import cn.axzo.tyr.server.repository.entity.SaasPageElement;
import cn.axzo.tyr.server.repository.entity.SaasPageElementFeatureResourceRelation;
import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation;
import cn.axzo.tyr.server.repository.entity.*;
import cn.axzo.tyr.server.service.SaasPageElementService;
import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationOperateLogService;
import cn.axzo.tyr.server.service.TyrSaasAuthService;
import cn.axzo.tyr.server.util.RpcInternalUtil;
import cn.azxo.framework.common.constatns.Constants;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Lists;
@ -31,6 +37,7 @@ 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.beans.factory.annotation.Value;
@ -59,6 +66,8 @@ public class SaasPageElementServiceImpl implements SaasPageElementService {
private final SaasPageElementFeatureResourceRelationDao saasPageElementFeatureResourceRelationDao;
private final SaasFeatureResourceDao saasFeatureResourceDao;
private final TyrSaasAuthService tyrSaasAuthService;
private final SaasPgroupPermissionRelationOperateLogService saasPgroupPermissionRelationOperateLogService;
private final UserProfileServiceApi userProfileServiceApi;
@Qualifier("asyncExecutor")
@Autowired
@ -163,6 +172,13 @@ public class SaasPageElementServiceImpl implements SaasPageElementService {
.build()).collect(Collectors.toList());
saasPageElementFeatureResourceRelationDao.saveBatch(relations);
}
// 保存操作日志
try {
saveOperateLog(modifyPageElementRelation);
} catch (Exception e) {
log.warn("save operate log error", e);
}
}
@Override
@ -386,4 +402,27 @@ public class SaasPageElementServiceImpl implements SaasPageElementService {
.and(w -> pageResources.forEach(p -> w.or().likeRight(SaasFeatureResource::getPath, p.getPath())))
.list();
}
private void saveOperateLog(ModifyPageElementRelationDTO relation) {
List<PersonProfileDto> personProfileDtos = RpcInternalUtil.rpcListProcessor(() -> userProfileServiceApi.getPersonProfiles(Lists.newArrayList(relation.getOperatorId())), "查询用户信息", relation.getOperatorId()).getData();
PersonProfileDto operator = org.apache.commons.collections4.CollectionUtils.isEmpty(personProfileDtos) ? null : personProfileDtos.get(0);
RelationOperateLogResourceBindElementDO operateAfter = RelationOperateLogResourceBindElementDO.builder()
.uniCode(relation.getFeatureResourceUniCode())
.featureCodes(relation.getPageElementCodes())
.build();
SaasPgroupPermissionRelationOperateLog operateLog = SaasPgroupPermissionRelationOperateLog.builder()
.tableName(SaasPgroupPermissionRelationOperateLogServiceImpl.TABLE_NAME_PAGE_ELEMENT)
.scene(PermissionRelationOperateLogSceneEnum.OMS_FEATURE_RESOURCE_BIND_ELEMENT.getValue())
.sceneId(relation.getFeatureResourceUniCode())
.createBy(relation.getOperatorId())
.createByName(Objects.isNull(operator) ? "" : operator.getRealName())
.traceId(MDC.get(Constants.CTX_LOG_ID_MDC))
.requestData(JSONObject.toJSONString(relation))
.operateData(JSONObject.toJSONString(Lists.newArrayList(operateAfter)))
.createByRole(JSONObject.toJSONString(saasPgroupPermissionRelationOperateLogService.getPersonBasicRoles(relation.getOperatorId())))
.build();
saasPgroupPermissionRelationOperateLogService.batchSave(Lists.newArrayList(operateLog));
}
}

View File

@ -0,0 +1,99 @@
package cn.axzo.tyr.server.service.impl;
import cn.axzo.basics.profiles.api.UserProfileServiceApi;
import cn.axzo.basics.profiles.dto.basic.PersonProfileDto;
import cn.axzo.framework.auth.domain.ContextInfo;
import cn.axzo.framework.auth.domain.ContextInfoHolder;
import cn.axzo.pokonyan.config.mybatisplus.BaseEntity;
import cn.axzo.tyr.client.common.enums.PermissionRelationOperateLogSceneEnum;
import cn.axzo.tyr.client.model.req.PermissionOperateLogReq;
import cn.axzo.tyr.server.model.BasicRoleDO;
import cn.axzo.tyr.server.model.RelationOperateLogProductBindResourceDO;
import cn.axzo.tyr.server.repository.dao.SaasPgroupPermissionRelationOperateLogDao;
import cn.axzo.tyr.server.repository.dao.SaasRoleDao;
import cn.axzo.tyr.server.repository.dao.SaasRoleUserRelationDao;
import cn.axzo.tyr.server.repository.entity.SaasFeatureResource;
import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelationOperateLog;
import cn.axzo.tyr.server.repository.entity.SaasRoleUserRelation;
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 lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.slf4j.MDC;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* @author likunpeng
* @version 1.0
* @date 2024/7/24
*/
@Slf4j
@Service
@AllArgsConstructor
public class SaasPgroupPermissionRelationOperateLogServiceImpl implements SaasPgroupPermissionRelationOperateLogService {
public static final String TABLE_NAME_FEATURE_RESOURCE = "saas_feature_resource";
public static final String TABLE_NAME_ROLE = "saas_role";
public static final String TABLE_NAME_PAGE_ELEMENT = "saas_page_element";
public static final String TABLE_NAME_PRODUCT = "product_module";
private final SaasPgroupPermissionRelationOperateLogDao saasPgroupPermissionRelationOperateLogDao;
private final SaasRoleUserRelationDao roleUserRelationDao;
private final SaasRoleDao saasRoleDao;
private final UserProfileServiceApi userProfileServiceApi;
@Override
public void batchSave(List<SaasPgroupPermissionRelationOperateLog> logs) {
if (CollectionUtils.isEmpty(logs)) {
return;
}
saasPgroupPermissionRelationOperateLogDao.saveBatch(logs);
}
@Override
public List<BasicRoleDO> getPersonBasicRoles(Long personId) {
if (Objects.isNull(personId)) {
return Collections.emptyList();
}
ContextInfo contextInfo = ContextInfoHolder.get();
if (Objects.isNull(contextInfo)) {
log.warn("no contextInfo, personId:{}", personId);
return Collections.emptyList();
}
List<SaasRoleUserRelation> relations = roleUserRelationDao.queryByPersonId(personId, contextInfo.getWorkspaceId(), contextInfo.getOuId());
if (CollectionUtils.isEmpty(relations)) {
return Collections.emptyList();
}
return saasRoleDao.lambdaQuery().in(BaseEntity::getId, relations.stream().map(SaasRoleUserRelation::getRoleId).collect(Collectors.toList())).list()
.stream().map(e -> BasicRoleDO.builder().roleId(e.getId()).roleCode(e.getRoleCode()).roleName(e.getName()).build()).collect(Collectors.toList());
}
@Override
public void save(PermissionOperateLogReq req) {
List<PersonProfileDto> personProfileDtos = RpcInternalUtil.rpcListProcessor(() -> userProfileServiceApi.getPersonProfiles(Lists.newArrayList(req.getOperatorId())), "查询用户信息", req.getOperatorId()).getData();
PersonProfileDto operator = CollectionUtils.isEmpty(personProfileDtos) ? null : personProfileDtos.get(0);
SaasPgroupPermissionRelationOperateLog operateLog = SaasPgroupPermissionRelationOperateLog.builder()
.tableName(req.getTableName())
.scene(req.getScene())
.sceneId(req.getSceneId())
.createBy(req.getOperatorId())
.createByName(Objects.isNull(operator) ? "" : operator.getRealName())
.traceId(MDC.get(Constants.CTX_LOG_ID_MDC))
.requestData(Objects.nonNull(req.getRequestData()) ? JSONObject.toJSONString(req.getRequestData()) : null)
.operateData(Objects.nonNull(req.getOperateData()) ? JSONObject.toJSONString(req.getOperateData()) : null)
.createByRole(JSONObject.toJSONString(getPersonBasicRoles(req.getOperatorId())))
.build();
batchSave(Lists.newArrayList(operateLog));
}
}