REQ-2821: 添加一些日志

This commit is contained in:
yanglin 2024-08-05 18:09:58 +08:00
parent 02452cf587
commit b21d2971eb
22 changed files with 468 additions and 39 deletions

View File

@ -28,6 +28,11 @@ public enum PermissionRelationOperateLogSceneEnum {
*/
OMS_ROLE_BIND_FEATURE_RESOURCE("OMS_ROLE_BIND_FEATURE_RESOURCE", "oms后台更新角色绑定的资源"),
/**
* []oms后台更新角色绑定资源绑定的
*/
OLD_OMS_ROLE_BIND_FEATURE("OLD_OMS_ROLE_BIND_FEATURE", "[老]oms后台更新角色绑定的资源"),
/**
* oms后台更新资源绑定的页面元素
*/
@ -38,6 +43,31 @@ public enum PermissionRelationOperateLogSceneEnum {
*/
OMS_PRODUCT_BIND_FEATURE_RESOURCE("OMS_PRODUCT_BIND_FEATURE_RESOURCE", "oms后台更新产品榜的资源"),
/**
* []oms后台更新产品权限点
*/
OLD_OMS_PRODUCT__UPDATE("OLD_OMS_PRODUCT__UPDATE", "[老]oms后台更新产品"),
/**
* []oms后台更新产品权限点
*/
OLD_OMS_PRODUCT_PERMISSION_POINT__UPDATE("OLD_OMS_PRODUCT_PERMISSION_POINT__UPDATE", "[老]oms后台更新产品权限点"),
/**
* []角色分组
*/
OLD_OMS_ROLE_GROUP__SAVE_OR_UPDATE("OLD_OMS_ROLE_GROUP__SAVE_OR_UPDATE", "[老]角色分组新增/更新"),
/**
* []权限点删除
*/
OLD_OMS_SAAS_FEATURE__DELETE("OLD_OMS_SAAS_FEATURE__DELETE", "[老]权限点删除"),
/**
* []权限点新增/更新
*/
OLD_OMS_SAAS_FEATURE__INSERT_OR_UPDATE("OLD_OMS_SAAS_FEATURE__INSERT_OR_UPDATE", "[老]权限点新增/更新"),
/**
* oms后台添加API
*/

View File

@ -1,6 +1,7 @@
package cn.axzo.tyr.client.feign;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.tyr.client.model.permission.DeletePermissionPointRequest;
import cn.axzo.tyr.client.model.permission.PermissionPointDTO;
import cn.axzo.tyr.client.model.permission.PermissionPointListQueryRequest;
import cn.axzo.tyr.client.model.permission.PermissionPointMoveRequest;
@ -16,6 +17,7 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import javax.validation.Valid;
import java.util.List;
/**
@ -48,6 +50,10 @@ public interface PermissionPointApi {
@PostMapping(value = "/api/v1/permissionPoint/delete/{permissionId}")
ApiResult<List<String>> deletePermissionPoint(@PathVariable Long permissionId);
/** 删除权限点 **/
@PostMapping(value = "/api/v1/permissionPoint/delete/v2/deletePermissionPoint")
ApiResult<List<String>> deletePermissionPointV2(@Valid @RequestBody DeletePermissionPointRequest request);
/** 位置移动 **/
@PostMapping(value = "/api/v1/permissionPoint/move")

View File

@ -2,7 +2,16 @@ package cn.axzo.tyr.client.feign;
import cn.axzo.framework.domain.web.result.ApiPageResult;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.tyr.client.model.product.*;
import cn.axzo.tyr.client.model.product.OldUpdateFeatureRelationRequestV2;
import cn.axzo.tyr.client.model.product.ProductAddReq;
import cn.axzo.tyr.client.model.product.ProductDetailReq;
import cn.axzo.tyr.client.model.product.ProductFeatureRelationSearchReq;
import cn.axzo.tyr.client.model.product.ProductFeatureRelationUpdateReq;
import cn.axzo.tyr.client.model.product.ProductFeatureRelationVO;
import cn.axzo.tyr.client.model.product.ProductSearchListReq;
import cn.axzo.tyr.client.model.product.ProductSearchPageReq;
import cn.axzo.tyr.client.model.product.ProductUpdateReq;
import cn.axzo.tyr.client.model.product.ProductVO;
import cn.axzo.tyr.client.model.req.ProductSaveReq;
import cn.axzo.tyr.client.model.req.UpdateProductStatusReq;
import cn.axzo.tyr.client.model.res.GovernmentTerminalResp;
@ -102,6 +111,16 @@ public interface ProductApi {
@PostMapping("api/auth/product/feature/relation/update")
ApiResult<Boolean> updateFeatureRelation(@Validated @RequestBody List<ProductFeatureRelationUpdateReq> req);
/**
* 更新产品与权限点的关联关系
* <p/>携带操作人员信息
*
* @param req {@link ProductFeatureRelationUpdateReq}
* @return
*/
@PostMapping("api/auth/product/feature/relation/v2/update")
ApiResult<Boolean> updateFeatureRelationV2(@Validated @RequestBody OldUpdateFeatureRelationRequestV2 req);
/**
* 查询指定工作台关联的服务包下的产品权限点
*

View File

@ -0,0 +1,19 @@
package cn.axzo.tyr.client.model.permission;
import cn.axzo.tyr.client.model.vo.OperatorRequest;
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotNull;
/**
* @author yanglin
*/
@Setter
@Getter
public class DeletePermissionPointRequest extends OperatorRequest {
@NotNull
private Long permissionId;
}

View File

@ -1,5 +1,6 @@
package cn.axzo.tyr.client.model.permission;
import cn.axzo.tyr.client.model.vo.Operator;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@ -160,6 +161,12 @@ public class PermissionPointDTO {
/** 业务编码 **/
private String businessNo;
private Operator operator;
public Operator determineOperator() {
return operator == null ? Operator.absent() : operator;
}
public Long mergeFitOuTypeBit() {
if (this.fitOuTypeList == null || this.fitOuTypeList.isEmpty()) {
return null;

View File

@ -0,0 +1,25 @@
package cn.axzo.tyr.client.model.product;
import cn.axzo.tyr.client.model.vo.OperatorRequest;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author yanglin
*/
@Setter
@Getter
public class OldUpdateFeatureRelationRequestV2 extends OperatorRequest {
private List<ProductFeatureRelationUpdateReq> relations;
private Map<String, Object> externalLogs = new ConcurrentHashMap<>();
public void addExternalLogThreadSafe(String key, Object value) {
externalLogs.put(key, value);
}
}

View File

@ -1,5 +1,6 @@
package cn.axzo.tyr.client.model.product;
import cn.axzo.tyr.client.model.vo.Operator;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -69,4 +70,9 @@ public class ProductUpdateReq {
*/
private List<Integer> ouTypes;
private Operator operator;
public Operator determineOperator() {
return operator == null ? Operator.absent() : operator;
}
}

View File

@ -1,6 +1,5 @@
package cn.axzo.tyr.client.model.req;
import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -10,7 +9,6 @@ import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.List;
/**
* 创建新路由请求
@ -36,6 +34,8 @@ public class PermissionOperateLogReq implements Serializable {
@NotBlank(message = "场景不能为空")
private String scene;
private String operatorName;
private String sceneId;
private Object requestData;

View File

@ -0,0 +1,42 @@
package cn.axzo.tyr.client.model.vo;
import cn.axzo.framework.auth.domain.ContextInfo;
import cn.axzo.framework.auth.domain.ContextInfoHolder;
import cn.axzo.framework.auth.domain.UserInfo;
import lombok.Data;
/**
* @author yanglin
*/
@Data
public class Operator {
private String realName;
private Long personId;
/**
* For a gateway like yoke
*/
public static Operator fromAuthContext() {
ContextInfo ctx = ContextInfoHolder.get();
if (ctx == null) {
return absent();
}
UserInfo userInfo = ctx.getUserInfo();
if (userInfo == null) {
return absent();
}
Operator operator = new Operator();
operator.setRealName(userInfo.getRealName());
operator.setPersonId(userInfo.getPersonId());
return operator;
}
public static Operator absent() {
Operator operator = new Operator();
operator.setRealName("");
operator.setPersonId(0L);
return operator;
}
}

View File

@ -0,0 +1,18 @@
package cn.axzo.tyr.client.model.vo;
import lombok.Getter;
import lombok.Setter;
/**
* @author yanglin
*/
@Setter
@Getter
public class OperatorRequest {
private Operator operator;
public Operator determineOperator() {
return operator == null ? Operator.absent() : operator;
}
}

View File

@ -70,4 +70,10 @@ public class SaasRoleGroupVO {
* 上级分组id
*/
private Long parentId;
private Operator operator;
public Operator determineOperator() {
return operator == null ? Operator.absent() : operator;
}
}

View File

@ -2,6 +2,7 @@ package cn.axzo.tyr.server.controller.permission;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.tyr.client.feign.PermissionPointApi;
import cn.axzo.tyr.client.model.permission.DeletePermissionPointRequest;
import cn.axzo.tyr.client.model.permission.PermissionPointDTO;
import cn.axzo.tyr.client.model.permission.PermissionPointListQueryRequest;
import cn.axzo.tyr.client.model.permission.PermissionPointMoveRequest;
@ -59,6 +60,9 @@ public class PermissionPointController implements PermissionPointApi {
return ApiResult.ok(permissionPointService.delete(permissionId));
}
@Override public ApiResult<List<String>> deletePermissionPointV2(DeletePermissionPointRequest request) {
return ApiResult.ok(permissionPointService.deleteV2(request));
}
@Override
public ApiResult<Void> move(PermissionPointMoveRequest request) {

View File

@ -3,7 +3,16 @@ package cn.axzo.tyr.server.controller.product;
import cn.axzo.framework.domain.web.result.ApiPageResult;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.tyr.client.feign.ProductApi;
import cn.axzo.tyr.client.model.product.*;
import cn.axzo.tyr.client.model.product.OldUpdateFeatureRelationRequestV2;
import cn.axzo.tyr.client.model.product.ProductAddReq;
import cn.axzo.tyr.client.model.product.ProductDetailReq;
import cn.axzo.tyr.client.model.product.ProductFeatureRelationSearchReq;
import cn.axzo.tyr.client.model.product.ProductFeatureRelationUpdateReq;
import cn.axzo.tyr.client.model.product.ProductFeatureRelationVO;
import cn.axzo.tyr.client.model.product.ProductSearchListReq;
import cn.axzo.tyr.client.model.product.ProductSearchPageReq;
import cn.axzo.tyr.client.model.product.ProductUpdateReq;
import cn.axzo.tyr.client.model.product.ProductVO;
import cn.axzo.tyr.client.model.req.ProductSaveReq;
import cn.axzo.tyr.client.model.req.UpdateProductStatusReq;
import cn.axzo.tyr.client.model.res.GovernmentTerminalResp;
@ -127,6 +136,14 @@ public class ProductController implements ProductApi {
return productFeatureRelationService.updateFeatureRelation(req);
}
@Override
public ApiResult<Boolean> updateFeatureRelationV2(OldUpdateFeatureRelationRequestV2 req) {
if(CollectionUtils.isEmpty(req.getRelations())) {
return ApiResult.ok(false);
}
permissionCacheService.markTempDisable(PermissionCacheKey.builder().disableAll(true).build());
return productFeatureRelationService.updateFeatureRelationV2(req);
}
@Override
public ApiResult<Map<Long, List<ProductFeatureRelationVO>>> queryProductFeatureRelationByWorkspace(Set<Long> workspaceIds) {

View File

@ -2,6 +2,8 @@ package cn.axzo.tyr.server.repository.mapper;
import cn.axzo.tyr.server.repository.entity.SaasFeature;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
/**
@ -19,4 +21,6 @@ public interface SaasFeatureMapper extends BaseMapper<SaasFeature> {
"WHERE path LIKE CONCAT(#{pathPrefix},'%') ")
void updateChildrenPath(Long updater, String pathPrefix, String newPathPrefix);
@Select("SELECT * FROM saas_feature WHERE id = #{id}")
SaasFeature getByIdDeleteAware(@Param("id") Long id);
}

View File

@ -1,5 +1,6 @@
package cn.axzo.tyr.server.service;
import cn.axzo.tyr.client.model.permission.DeletePermissionPointRequest;
import cn.axzo.tyr.client.model.permission.PermissionPointDTO;
import cn.axzo.tyr.client.model.permission.PermissionPointListQueryRequest;
import cn.axzo.tyr.client.model.permission.PermissionPointMoveRequest;
@ -42,6 +43,9 @@ public interface PermissionPointService {
/** 删除权限点 返回business_no **/
List<String> delete(Long permissionId);
/** 删除权限点 返回business_no **/
List<String> deleteV2(DeletePermissionPointRequest request);
/** 位置移动-父级和排序 **/
void move(PermissionPointMoveRequest request);

View File

@ -2,6 +2,7 @@ package cn.axzo.tyr.server.service;
import cn.axzo.foundation.page.PageResp;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.tyr.client.model.product.OldUpdateFeatureRelationRequestV2;
import cn.axzo.tyr.client.model.product.ProductFeatureRelationSearchReq;
import cn.axzo.tyr.client.model.product.ProductFeatureRelationUpdateReq;
import cn.axzo.tyr.client.model.product.ProductFeatureRelationVO;
@ -25,6 +26,8 @@ public interface ProductFeatureRelationService extends IService<SaasProductModul
ApiResult<Boolean> updateFeatureRelation(List<ProductFeatureRelationUpdateReq> req);
ApiResult<Boolean> updateFeatureRelationV2(OldUpdateFeatureRelationRequestV2 request);
/**
* 更新产品功能权限关系仅支持saas_feature_resource功能点
*

View File

@ -1,49 +1,65 @@
package cn.axzo.tyr.server.service.impl;
import static cn.axzo.tyr.client.model.enums.FeatureType.BUTTON;
import static cn.axzo.tyr.client.model.enums.FeatureType.MODULE;
import static cn.axzo.tyr.server.common.constants.PermissionConstant.*;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import cn.axzo.tyr.client.model.enums.FeatureDataType;
import cn.axzo.tyr.client.model.req.QueryPermissionByIdsReq;
import cn.axzo.tyr.client.model.res.SimplePermissionPointResp;
import cn.hutool.core.date.StopWatch;
import cn.hutool.core.lang.Opt;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import cn.axzo.basics.common.BeanMapper;
import cn.axzo.basics.common.util.StopWatchUtil;
import cn.axzo.basics.common.util.TreeUtil;
import cn.axzo.framework.domain.web.code.BaseCode;
import cn.axzo.tyr.client.common.enums.PermissionRelationOperateLogSceneEnum;
import cn.axzo.tyr.client.model.dict.request.BasicDictNodeReq;
import cn.axzo.tyr.client.model.dict.request.BasicDictQueryReq;
import cn.axzo.tyr.client.model.dict.response.BasicDictNodeResp;
import cn.axzo.tyr.client.model.dict.response.BasicDictTreeResp;
import cn.axzo.tyr.client.model.enums.DictTypeFiledEnum;
import cn.axzo.tyr.client.model.enums.DictWorkSpaceTypeEnum;
import cn.axzo.tyr.client.model.enums.FeatureDataType;
import cn.axzo.tyr.client.model.enums.FeatureType;
import cn.axzo.tyr.client.model.permission.*;
import cn.axzo.tyr.client.model.permission.DeletePermissionPointRequest;
import cn.axzo.tyr.client.model.permission.PermissionPointDTO;
import cn.axzo.tyr.client.model.permission.PermissionPointListQueryRequest;
import cn.axzo.tyr.client.model.permission.PermissionPointMoveRequest;
import cn.axzo.tyr.client.model.permission.PermissionPointTreeNode;
import cn.axzo.tyr.client.model.permission.PermissionPointTreeQueryReq;
import cn.axzo.tyr.client.model.permission.PermissionPointVO;
import cn.axzo.tyr.client.model.req.PermissionOperateLogReq;
import cn.axzo.tyr.client.model.req.QueryPermissionByIdsReq;
import cn.axzo.tyr.client.model.res.SimplePermissionPointResp;
import cn.axzo.tyr.server.common.util.Throws;
import cn.axzo.tyr.server.repository.dao.SaasFeatureDao;
import cn.axzo.tyr.server.repository.dao.SaasPgroupPermissionRelationDao;
import cn.axzo.tyr.server.repository.dao.SaasProductModuleFeatureRelationDao;
import cn.axzo.tyr.server.repository.entity.SaasFeature;
import cn.axzo.tyr.server.repository.mapper.SaasFeatureMapper;
import cn.axzo.tyr.server.service.PermissionPointService;
import cn.axzo.tyr.server.service.SaasBasicDictService;
import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationOperateLogService;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionTemplate;
import static cn.axzo.tyr.server.util.RpcInternalUtil.checkAndGetData;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import static cn.axzo.tyr.client.model.enums.FeatureType.BUTTON;
import static cn.axzo.tyr.client.model.enums.FeatureType.MODULE;
import static cn.axzo.tyr.server.common.constants.PermissionConstant.FEATURE_BIZ_NO_PREFIX;
import static cn.axzo.tyr.server.common.constants.PermissionConstant.FEATURE_PATH_DELIMITER;
import static cn.axzo.tyr.server.common.constants.PermissionConstant.FEATURE_TOP_BIZ_NO;
import static cn.axzo.tyr.server.common.constants.PermissionConstant.FEATURE_TOP_PATH;
/**
* 权限点服务实现
@ -57,10 +73,13 @@ import static cn.axzo.tyr.server.util.RpcInternalUtil.checkAndGetData;
@Service
public class PermissionPointServiceImpl implements PermissionPointService {
private final SaasFeatureMapper saasFeatureMapper;
private final SaasFeatureDao saasFeatureDao;
private final SaasBasicDictService saasBasicDictService;
private final SaasPgroupPermissionRelationDao saasPgroupPermissionRelationDao;
private final SaasProductModuleFeatureRelationDao saasProductModuleFeatureRelationDao;
private final SaasPgroupPermissionRelationOperateLogService saasPgroupPermissionRelationOperateLogService;
private final TransactionTemplate transactionTemplate;
@Override
public List<PermissionPointTreeNode> listTreeNodes(PermissionPointTreeQueryReq request) {
@ -333,6 +352,11 @@ public class PermissionPointServiceImpl implements PermissionPointService {
this.saasFeatureDao.updateById(saasFeature);
//返回一些要用的数据
dto.setBusinessNo(feature.getBusinessNo());
try {
saveOperateLogForInsertOrUpdate(dto, feature.getId());
} catch (Exception e) {
log.warn("error save operate log", e);
}
return dto;
}
@ -367,9 +391,27 @@ public class PermissionPointServiceImpl implements PermissionPointService {
dto.setBusinessNo(saasFeature.getBusinessNo());
//调整排序 - 兼容处理老数据数据规范化
changeSort(saasFeature, saasFeature.getSort());
try {
saveOperateLogForInsertOrUpdate(dto, saasFeature.getId());
} catch (Exception e) {
log.warn("error save operate log", e);
}
return dto;
}
private void saveOperateLogForInsertOrUpdate(PermissionPointDTO request, Long permissionId) {
SaasFeature feature = saasFeatureDao.getById(permissionId);
PermissionOperateLogReq log = new PermissionOperateLogReq();
log.setTableName(SaasPgroupPermissionRelationOperateLogServiceImpl.TABLE_NAME_SAAS_FEATURE);
log.setScene(PermissionRelationOperateLogSceneEnum.OLD_OMS_SAAS_FEATURE__INSERT_OR_UPDATE.getValue());
log.setSceneId(permissionId + "");
log.setOperatorId(request.determineOperator().getPersonId());
log.setOperatorName(request.determineOperator().getRealName());
log.setRequestData(request);
log.setOperateData(feature);
saasPgroupPermissionRelationOperateLogService.save(log);
}
private void checkParentType(FeatureType featureType, SaasFeature parent) {
//检查父级元素类型
switch (featureType) {
@ -398,9 +440,21 @@ public class PermissionPointServiceImpl implements PermissionPointService {
}
}
@Transactional(rollbackFor = Throwable.class)
@Override
public List<String> delete(Long permissionPointId) {
@SuppressWarnings({
"SpringTransactionalMethodCallsInspection",
"It's good, we use transaction template"
})
public List<String> delete(Long permissionId) {
DeletePermissionPointRequest request = new DeletePermissionPointRequest();
request.setPermissionId(permissionId);
return transactionTemplate.execute(unused -> deleteV2(request));
}
@Override
@Transactional(rollbackFor = Throwable.class)
public List<String> deleteV2(DeletePermissionPointRequest request) {
Long permissionPointId = request.getPermissionId();
List<Long> delIds = new ArrayList<>();
List<String> bizNoList = new ArrayList<>();
SaasFeature feature = getAndCheck(permissionPointId);
@ -426,9 +480,27 @@ public class PermissionPointServiceImpl implements PermissionPointService {
//删除关联数据
this.saasPgroupPermissionRelationDao.removeByPermissionPointIds(delIds);
this.saasProductModuleFeatureRelationDao.removeByPermissionPointIds(delIds);
try {
// 记这条主记录的日志就够了
saveOperateLogForDelete(request);
} catch (Exception e) {
log.warn("error save operate log", e);
}
return bizNoList;
}
private void saveOperateLogForDelete(DeletePermissionPointRequest request) {
SaasFeature deletedFeature = saasFeatureMapper.getByIdDeleteAware(request.getPermissionId());
PermissionOperateLogReq log = new PermissionOperateLogReq();
log.setTableName(SaasPgroupPermissionRelationOperateLogServiceImpl.TABLE_NAME_SAAS_FEATURE);
log.setScene(PermissionRelationOperateLogSceneEnum.OLD_OMS_SAAS_FEATURE__DELETE.getValue());
log.setSceneId(request.getPermissionId() + "");
log.setOperatorId(request.determineOperator().getPersonId());
log.setOperatorName(request.determineOperator().getRealName());
log.setRequestData(request);
log.setOperateData(deletedFeature);
saasPgroupPermissionRelationOperateLogService.save(log);
}
@Override
public void move(PermissionPointMoveRequest request) {

View File

@ -10,11 +10,14 @@ import cn.axzo.thrones.client.saas.ServicePkgClient;
import cn.axzo.thrones.client.saas.entity.serivicepgkproduct.ServicePkgProduct;
import cn.axzo.thrones.client.saas.entity.servicepkg.ServicePkgDetailRes;
import cn.axzo.tyr.client.common.enums.FeatureResourceType;
import cn.axzo.tyr.client.common.enums.PermissionRelationOperateLogSceneEnum;
import cn.axzo.tyr.client.model.product.OldUpdateFeatureRelationRequestV2;
import cn.axzo.tyr.client.model.product.ProductFeatureRelationSearchReq;
import cn.axzo.tyr.client.model.product.ProductFeatureRelationUpdateReq;
import cn.axzo.tyr.client.model.product.ProductFeatureRelationVO;
import cn.axzo.tyr.client.model.req.FeatureIdPair;
import cn.axzo.tyr.client.model.req.PageProductFeatureRelationReq;
import cn.axzo.tyr.client.model.req.PermissionOperateLogReq;
import cn.axzo.tyr.server.repository.dao.ProductModuleDao;
import cn.axzo.tyr.server.repository.dao.SaasFeatureDao;
import cn.axzo.tyr.server.repository.dao.SaasFeatureResourceDao;
@ -25,6 +28,7 @@ import cn.axzo.tyr.server.repository.entity.SaasFeatureResource;
import cn.axzo.tyr.server.repository.entity.SaasProductModuleFeatureRelation;
import cn.axzo.tyr.server.repository.mapper.SaasProductModuleFeatureRelationMapper;
import cn.axzo.tyr.server.service.ProductFeatureRelationService;
import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationOperateLogService;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.StopWatch;
import cn.hutool.core.util.StrUtil;
@ -51,6 +55,7 @@ import java.util.function.Function;
import java.util.stream.Collectors;
import static cn.axzo.tyr.server.util.RpcInternalUtil.checkAndGetData;
import static java.util.stream.Collectors.joining;
/**
* 产品与权限点的 Service 接口实现
@ -68,6 +73,7 @@ public class ProductFeatureRelationServiceImpl extends ServiceImpl<SaasProductMo
private final SaasFeatureDao saasFeatureDao;
private final ProductModuleDao productModuleDao;
private final SaasFeatureResourceDao saasFeatureResourceDao;
private final SaasPgroupPermissionRelationOperateLogService saasPgroupPermissionRelationOperateLogService;
@Override
public ApiResult<List<ProductFeatureRelationVO>> featureList(ProductFeatureRelationSearchReq req) {
@ -83,6 +89,19 @@ public class ProductFeatureRelationServiceImpl extends ServiceImpl<SaasProductMo
@Override
@Transactional(rollbackFor = Exception.class)
public ApiResult<Boolean> updateFeatureRelation(List<ProductFeatureRelationUpdateReq> req) {
OldUpdateFeatureRelationRequestV2 requestV2 = new OldUpdateFeatureRelationRequestV2();
requestV2.setRelations(req);
requestV2.setOperator(null);
return updateFeatureRelationV2(requestV2);
}
@Override
@Transactional(rollbackFor = Exception.class)
public ApiResult<Boolean> updateFeatureRelationV2(OldUpdateFeatureRelationRequestV2 request) {
if (CollectionUtils.isEmpty(request.getRelations())) {
return ApiResult.ok(false);
}
List<ProductFeatureRelationUpdateReq> req = request.getRelations();
List<Long> productIds = req.stream().map(ProductFeatureRelationUpdateReq::getProductModuleId).distinct().collect(Collectors.toList());
if (!CollectionUtils.isEmpty(productIds)) {
saasProductModuleFeatureRelationDao.remove(new LambdaQueryWrapper<SaasProductModuleFeatureRelation>()
@ -99,9 +118,38 @@ public class ProductFeatureRelationServiceImpl extends ServiceImpl<SaasProductMo
saveList.add(relation);
}));
saasProductModuleFeatureRelationDao.saveBatch(saveList);
// !! save logs
try {
saveOperateLogForUpdateFeatureRelationV2(request, req, saveList);
} catch (Exception e) {
log.warn("保存审计日志失败", e);
}
return ApiResult.ok(true);
}
private void saveOperateLogForUpdateFeatureRelationV2(
OldUpdateFeatureRelationRequestV2 request,
List<ProductFeatureRelationUpdateReq> req,
List<SaasProductModuleFeatureRelation> saveList) {
String productModuleIds = saveList.stream()
.map(BaseEntity::getId)
.distinct()
.map(String::valueOf)
.collect(joining(","));
productModuleIds = org.apache.commons.lang3.StringUtils.truncate(productModuleIds, 254);
PermissionOperateLogReq log = new PermissionOperateLogReq();
log.setTableName(SaasPgroupPermissionRelationOperateLogServiceImpl.TABLE_NAME_PRODUCT_MODULE_FEATURE_RELATION);
log.setScene(PermissionRelationOperateLogSceneEnum.OLD_OMS_PRODUCT_PERMISSION_POINT__UPDATE.getValue());
log.setSceneId(productModuleIds);
log.setOperatorId(request.determineOperator().getPersonId());
log.setOperatorName(request.determineOperator().getRealName());
log.setRequestData(request);
log.setOperateData(saveList);
saasPgroupPermissionRelationOperateLogService.save(log);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateFeatureResourceRelation(List<ProductFeatureRelationUpdateReq> req, int relationType) {

View File

@ -15,20 +15,31 @@ import cn.axzo.tyr.client.model.dict.request.BasicDictQueryReq;
import cn.axzo.tyr.client.model.dict.response.BasicDictNodeResp;
import cn.axzo.tyr.client.model.enums.ProductModuleCategoryEnum;
import cn.axzo.tyr.client.model.enums.WorkspaceTypeCodeEnum;
import cn.axzo.tyr.client.model.product.*;
import cn.axzo.tyr.client.model.product.ProductAddReq;
import cn.axzo.tyr.client.model.product.ProductFeatureRelationSearchReq;
import cn.axzo.tyr.client.model.product.ProductFeatureRelationUpdateReq;
import cn.axzo.tyr.client.model.product.ProductFeatureRelationVO;
import cn.axzo.tyr.client.model.product.ProductSearchListReq;
import cn.axzo.tyr.client.model.product.ProductSearchPageReq;
import cn.axzo.tyr.client.model.product.ProductUpdateReq;
import cn.axzo.tyr.client.model.product.ProductVO;
import cn.axzo.tyr.client.model.req.PermissionOperateLogReq;
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.ProductModuleDao;
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.*;
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.SaasPgroupPermissionRelationOperateLogService;
import cn.axzo.tyr.server.util.RpcInternalUtil;
import cn.azxo.framework.common.constatns.Constants;
import cn.hutool.core.collection.CollectionUtil;
@ -46,7 +57,14 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.util.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
@ -181,9 +199,26 @@ public class ProductServiceImpl implements ProductService {
productModule.setOuType(org.apache.commons.lang3.StringUtils.join(req.getOuTypes(),","));
}
productModuleDao.updateById(productModule);
try {
saveOperateLogForUpdateProduct(req, productModule);
} catch (Exception e) {
log.warn("保存更新产品日志失败", e);
}
return ApiResult.ok(BeanMapper.copyBeanIgnoreNull(productModule, ProductVO.class));
}
private void saveOperateLogForUpdateProduct(ProductUpdateReq req, ProductModule productModule) {
PermissionOperateLogReq log = new PermissionOperateLogReq();
log.setTableName(SaasPgroupPermissionRelationOperateLogServiceImpl.TABLE_NAME_PRODUCT);
log.setScene(PermissionRelationOperateLogSceneEnum.OLD_OMS_PRODUCT__UPDATE.getValue());
log.setSceneId(productModule.getId() + "");
log.setOperatorId(req.determineOperator().getPersonId());
log.setOperatorName(req.determineOperator().getRealName());
log.setRequestData(req);
log.setOperateData(productModule);
saasPgroupPermissionRelationOperateLogService.save(log);
}
@Override
public ApiResult<ProductVO> delete(Long id) {
ProductModule productModule = productModuleDao.getById(id);

View File

@ -399,6 +399,37 @@ public class RoleServiceImpl extends ServiceImpl<SaasRoleMapper, SaasRole>
.type(OLD_FEATURE)
.build();
saasPgroupPermissionRelationService.saveOrUpdate(upsertPermissionRelationParam);
try {
saveOperateLog4RoleBindFeature(saveOrUpdateRole);
} catch (Exception e) {
log.warn("save operate log error", e);
}
}
private void saveOperateLog4RoleBindFeature(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.OLD_OMS_ROLE_BIND_FEATURE.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));
}
/**

View File

@ -5,14 +5,11 @@ 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;
@ -23,6 +20,7 @@ import com.google.common.collect.Lists;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.MDC;
import org.springframework.stereotype.Service;
@ -45,6 +43,9 @@ public class SaasPgroupPermissionRelationOperateLogServiceImpl implements SaasPg
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";
public static final String TABLE_NAME_PRODUCT_MODULE_FEATURE_RELATION = "saas_product_module_feature_relation";
public static final String TABLE_NAME_SAAS_ROLE_GROUP = "saas_role_group";
public static final String TABLE_NAME_SAAS_FEATURE = "saas_feature";
private final SaasPgroupPermissionRelationOperateLogDao saasPgroupPermissionRelationOperateLogDao;
private final SaasRoleUserRelationDao roleUserRelationDao;
@ -80,15 +81,25 @@ public class SaasPgroupPermissionRelationOperateLogServiceImpl implements SaasPg
@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);
String operatorName = req.getOperatorName();
// 如果没有传操作人姓名查询用户信息
if (StringUtils.isBlank(operatorName) && req.getOperatorId() != 0 && req.getOperatorId() > 0) {
List<PersonProfileDto> personProfileDtos = RpcInternalUtil.rpcListProcessor(() -> userProfileServiceApi.getPersonProfiles(Lists.newArrayList(req.getOperatorId())), "查询用户信息", req.getOperatorId()).getData();
PersonProfileDto operator = CollectionUtils.isEmpty(personProfileDtos) ? null : personProfileDtos.get(0);
if (operator != null) {
operatorName = operator.getRealName();
}
}
if (StringUtils.isBlank(operatorName)) {
operatorName = "unknown";
}
SaasPgroupPermissionRelationOperateLog operateLog = SaasPgroupPermissionRelationOperateLog.builder()
.tableName(req.getTableName())
.scene(req.getScene())
.sceneId(req.getSceneId())
.createBy(req.getOperatorId())
.createByName(Objects.isNull(operator) ? "" : operator.getRealName())
.createByName(operatorName)
.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)

View File

@ -2,12 +2,14 @@ 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.foundation.exception.Axssert;
import cn.axzo.foundation.dao.support.converter.PageConverter;
import cn.axzo.foundation.dao.support.mysql.QueryWrapperHelper;
import cn.axzo.foundation.exception.Axssert;
import cn.axzo.foundation.page.PageResp;
import cn.axzo.tyr.client.common.enums.PermissionRelationOperateLogSceneEnum;
import cn.axzo.tyr.client.model.req.ListSaasRoleGroupParam;
import cn.axzo.tyr.client.model.req.PageSaasRoleGroupParam;
import cn.axzo.tyr.client.model.req.PermissionOperateLogReq;
import cn.axzo.tyr.client.model.req.QuerySaasRoleGroupReq;
import cn.axzo.tyr.client.model.res.SaasRoleGroupDTO;
import cn.axzo.tyr.client.model.res.SaasRoleRes;
@ -18,6 +20,7 @@ import cn.axzo.tyr.server.repository.entity.SaasRoleGroup;
import cn.axzo.tyr.server.repository.entity.SaasRoleGroupRelation;
import cn.axzo.tyr.server.repository.mapper.SaasRoleGroupMapper;
import cn.axzo.tyr.server.service.RoleService;
import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationOperateLogService;
import cn.axzo.tyr.server.service.SaasRoleGroupRelationService;
import cn.axzo.tyr.server.service.SaasRoleGroupService;
import cn.hutool.core.bean.BeanUtil;
@ -58,6 +61,7 @@ public class SaasRoleGroupServiceImpl extends ServiceImpl<SaasRoleGroupMapper, S
private final SaasRoleGroupRelationDao saasRoleGroupRelationDao;
private final SaasRoleGroupRelationService saasRoleGroupRelationService;
private final RoleService roleService;
private final SaasPgroupPermissionRelationOperateLogService saasPgroupPermissionRelationOperateLogService;
@Override
public List<SaasRoleGroupVO> getList(QuerySaasRoleGroupReq req) {
@ -129,9 +133,27 @@ public class SaasRoleGroupServiceImpl extends ServiceImpl<SaasRoleGroupMapper, S
public Long saveOrUpdate(SaasRoleGroupVO req) {
SaasRoleGroup saasRoleGroup = validAndBuildGroup(req);
saasRoleGroupDao.saveOrUpdate(saasRoleGroup);
try {
saveOperateLogForRoleGroup(req);
} catch (Exception e) {
log.warn("error save operate log", e);
}
return saasRoleGroup.getId();
}
private void saveOperateLogForRoleGroup(SaasRoleGroupVO req) {
PermissionOperateLogReq log = new PermissionOperateLogReq();
log.setTableName(SaasPgroupPermissionRelationOperateLogServiceImpl.TABLE_NAME_SAAS_ROLE_GROUP);
log.setScene(PermissionRelationOperateLogSceneEnum.OLD_OMS_ROLE_GROUP__SAVE_OR_UPDATE.getValue());
log.setSceneId(req.getId() + "");
log.setOperatorId(req.determineOperator().getPersonId());
log.setOperatorName(req.determineOperator().getRealName());
log.setRequestData(req);
SaasRoleGroup updateToDateRoleGroup = saasRoleGroupDao.getById(req.getId());
log.setOperateData(updateToDateRoleGroup);
saasPgroupPermissionRelationOperateLogService.save(log);
}
/**
* 只有当分组下面角色为空合分组下没有其他分组时才能删除
* @param ids