fix(REQ-2774): 增加产品的操作日志

This commit is contained in:
李昆鹏 2024-07-25 14:56:46 +08:00
parent 2116197ce5
commit 3cd272860d
7 changed files with 139 additions and 11 deletions

View File

@ -33,6 +33,11 @@ public enum PermissionRelationOperateLogSceneEnum {
*/
OMS_FEATURE_RESOURCE_BIND_ELEMENT("OMS_FEATURE_RESOURCE_BIND_ELEMENT", "oms后台更新资源绑定的页面元素"),
/**
* oms后台更新产品榜的资源
*/
OMS_PRODUCT_BIND_FEATURE_RESOURCE("OMS_PRODUCT_BIND_FEATURE_RESOURCE", "oms后台更新产品榜的资源"),
;
@EnumValue

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

@ -140,7 +140,11 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic
}
// 记录操作日志
saveOperateLog(req, operateDos);
try {
saveOperateLog(req, operateDos);
} catch (Exception e) {
log.warn("save operate log error", e);
}
}
@Override

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,51 @@ 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())
.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())
.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

@ -440,7 +440,12 @@ public class RoleServiceImpl extends ServiceImpl<SaasRoleMapper, SaasRole>
.build();
saasPgroupPermissionRelationService.saveOrUpdate(upsertPermissionRelationParam);
saveOperateLog4RoleBindFeatureResource(saveOrUpdateRole);
// 记录操作日志
try {
saveOperateLog4RoleBindFeatureResource(saveOrUpdateRole);
} catch (Exception e) {
log.warn("save operate log error", e);
}
}
@Override
@ -1297,7 +1302,11 @@ public class RoleServiceImpl extends ServiceImpl<SaasRoleMapper, SaasRole>
if (CollectionUtil.isEmpty(item.getRoleIds()) || item.getAuthType() == 0) {
saasPgroupPermissionRelationDao.removeByPermissionPointIds(Collections.singletonList(item.getFeatureId()));
// 记录操作日志
saveOperateLog(item.getFeatureId(), operatorId, req);
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());
@ -1307,7 +1316,11 @@ public class RoleServiceImpl extends ServiceImpl<SaasRoleMapper, SaasRole>
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, item.getRoleIds(), req);
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<>();

View File

@ -174,7 +174,11 @@ public class SaasPageElementServiceImpl implements SaasPageElementService {
}
// 保存操作日志
saveOperateLog(modifyPageElementRelation);
try {
saveOperateLog(modifyPageElementRelation);
} catch (Exception e) {
log.warn("save operate log error", e);
}
}
@Override

View File

@ -34,6 +34,7 @@ public class SaasPgroupPermissionRelationOperateLogServiceImpl implements SaasPg
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;