优化

pull/82/head^2
awenes 2024-04-04 21:58:17 +08:00
parent 855ebeb82e
commit b9f4599f3b
4 changed files with 107 additions and 86 deletions

View File

@ -21,9 +21,10 @@ import java.io.Serial;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
import org.hibernate.annotations.JdbcTypeCode;
import org.hibernate.annotations.SQLDelete; import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Type;
import org.hibernate.annotations.Where; import org.hibernate.annotations.Where;
import org.hibernate.type.SqlTypes;
import cn.topiam.employee.audit.enums.EventStatus; import cn.topiam.employee.audit.enums.EventStatus;
import cn.topiam.employee.audit.event.type.EventType; import cn.topiam.employee.audit.event.type.EventType;
@ -36,7 +37,6 @@ import lombok.Setter;
import lombok.ToString; import lombok.ToString;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import io.hypersistence.utils.hibernate.type.json.JsonType;
import jakarta.persistence.Column; import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;
import jakarta.persistence.Table; import jakarta.persistence.Table;
@ -63,6 +63,12 @@ public class AuditEntity extends LogicDeleteEntity<Long> {
@Serial @Serial
private static final long serialVersionUID = -3119319193111206582L; private static final long serialVersionUID = -3119319193111206582L;
public static final String EVENT_TYPE_FIELD_NAME = "eventType";
public static final String ACTOR_ID_FIELD_NAME = "actorId";
public static final String EVENT_TIME_FIELD_NAME = "eventTime";
/** /**
* Request Id * Request Id
*/ */
@ -78,21 +84,21 @@ public class AuditEntity extends LogicDeleteEntity<Long> {
/** /**
* *
*/ */
@Type(JsonType.class) @JdbcTypeCode(SqlTypes.JSON)
@Column(name = "target_") @Column(name = "target_")
private List<Target> targets; private List<Target> targets;
/** /**
* UserAgent * UserAgent
*/ */
@Type(JsonType.class) @JdbcTypeCode(SqlTypes.JSON)
@Column(name = "user_agent") @Column(name = "user_agent")
private UserAgent userAgent; private UserAgent userAgent;
/** /**
* *
*/ */
@Type(JsonType.class) @JdbcTypeCode(SqlTypes.JSON)
@Column(name = "geo_location") @Column(name = "geo_location")
private GeoLocation geoLocation; private GeoLocation geoLocation;

View File

@ -20,8 +20,8 @@ package cn.topiam.employee.audit.repository;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Optional; import java.util.Optional;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query; import org.springframework.data.jpa.repository.Query;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
import org.springframework.data.repository.query.Param; import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
@ -36,7 +36,7 @@ import cn.topiam.employee.support.repository.LogicDeleteRepository;
*/ */
@Repository @Repository
public interface AuditRepository extends LogicDeleteRepository<AuditEntity, Long>, public interface AuditRepository extends LogicDeleteRepository<AuditEntity, Long>,
QuerydslPredicateExecutor<AuditEntity>, AuditCustomizedRepository { AuditCustomizedRepository, JpaSpecificationExecutor<AuditEntity> {
/** /**
* *

View File

@ -23,16 +23,13 @@ import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import com.querydsl.core.types.ExpressionUtils;
import com.querydsl.core.types.Predicate;
import cn.topiam.employee.audit.controller.pojo.AuditListQuery; import cn.topiam.employee.audit.controller.pojo.AuditListQuery;
import cn.topiam.employee.audit.controller.pojo.AuditListResult; import cn.topiam.employee.audit.controller.pojo.AuditListResult;
import cn.topiam.employee.audit.entity.AuditEntity; import cn.topiam.employee.audit.entity.AuditEntity;
import cn.topiam.employee.audit.entity.QAuditEntity;
import cn.topiam.employee.audit.entity.Target; import cn.topiam.employee.audit.entity.Target;
import cn.topiam.employee.audit.enums.TargetType; import cn.topiam.employee.audit.enums.TargetType;
import cn.topiam.employee.common.entity.account.OrganizationEntity; import cn.topiam.employee.common.entity.account.OrganizationEntity;
@ -49,13 +46,17 @@ import cn.topiam.employee.common.repository.account.UserRepository;
import cn.topiam.employee.common.repository.app.AppRepository; import cn.topiam.employee.common.repository.app.AppRepository;
import cn.topiam.employee.common.repository.authentication.IdentityProviderRepository; import cn.topiam.employee.common.repository.authentication.IdentityProviderRepository;
import cn.topiam.employee.common.repository.identitysource.IdentitySourceRepository; import cn.topiam.employee.common.repository.identitysource.IdentitySourceRepository;
import cn.topiam.employee.common.repository.setting.*; import cn.topiam.employee.common.repository.setting.AdministratorRepository;
import cn.topiam.employee.common.repository.setting.MailTemplateRepository;
import cn.topiam.employee.support.context.ApplicationContextHelp; import cn.topiam.employee.support.context.ApplicationContextHelp;
import cn.topiam.employee.support.repository.page.domain.Page; import cn.topiam.employee.support.repository.page.domain.Page;
import cn.topiam.employee.support.repository.page.domain.PageModel; import cn.topiam.employee.support.repository.page.domain.PageModel;
import cn.topiam.employee.support.security.userdetails.UserType; import cn.topiam.employee.support.security.userdetails.UserType;
import cn.topiam.employee.support.security.util.SecurityUtils; import cn.topiam.employee.support.security.util.SecurityUtils;
import jakarta.persistence.criteria.Order;
import jakarta.persistence.criteria.Predicate;
/** /**
* *
* *
@ -129,8 +130,7 @@ public interface AuditDataConverter {
if (UserType.USER.equals(actorType)) { if (UserType.USER.equals(actorType)) {
UserRepository repository = ApplicationContextHelp.getBean(UserRepository.class); UserRepository repository = ApplicationContextHelp.getBean(UserRepository.class);
UserEntity user = repository.findById(Long.valueOf(actorId)).orElse(new UserEntity()); UserEntity user = repository.findById(Long.valueOf(actorId)).orElse(new UserEntity());
return org.apache.commons.lang3.StringUtils.defaultString(user.getFullName(), return Objects.toString(user.getFullName(), user.getUsername());
user.getUsername());
} }
if (UserType.ADMIN.equals(actorType)) { if (UserType.ADMIN.equals(actorType)) {
AdministratorRepository repository = ApplicationContextHelp AdministratorRepository repository = ApplicationContextHelp
@ -148,10 +148,11 @@ public interface AuditDataConverter {
* @param query {@link AuditListQuery} * @param query {@link AuditListQuery}
* @return {@link Predicate} * @return {@link Predicate}
*/ */
default Predicate auditListRequestConvertToPredicate(AuditListQuery query) { default Specification<AuditEntity> auditListRequestConvertToSpecification(AuditListQuery query,
QAuditEntity auditEntity = QAuditEntity.auditEntity; PageModel page) {
Predicate predicate = ExpressionUtils.and(auditEntity.isNotNull(), return (root, criteriaQuery, criteriaBuilder) -> {
auditEntity.deleted.eq(Boolean.FALSE)); ArrayList<Predicate> predicates = new ArrayList<>();
ArrayList<Order> orders = new ArrayList<>();
UserType userType = SecurityUtils.getCurrentUser().getUserType(); UserType userType = SecurityUtils.getCurrentUser().getUserType();
// 登录角色 管理员 // 登录角色 管理员
if (UserType.ADMIN.equals(userType)) { if (UserType.ADMIN.equals(userType)) {
@ -174,41 +175,55 @@ public interface AuditDataConverter {
actorId = optional.get().getId().toString(); actorId = optional.get().getId().toString();
} }
} }
predicate = ExpressionUtils.and(predicate, auditEntity.actorId.eq(actorId)); if (StringUtils.hasText(actorId)) {
predicates.add(criteriaBuilder.equal(root.get("actorId"), actorId));
}
} }
// 用户类型 // 用户类型
if (UserType.USER.getType().equals(query.getUserType())) { if (UserType.USER.getType().equals(query.getUserType())) {
predicate = ExpressionUtils.and(predicate, auditEntity.actorType.eq(UserType.USER)); predicates.add(criteriaBuilder.equal(root.get("actorType"), UserType.USER));
} }
if (UserType.ADMIN.getType().equals(query.getUserType())) { if (UserType.ADMIN.getType().equals(query.getUserType())) {
predicate = ExpressionUtils.and(predicate, predicates.add(criteriaBuilder.equal(root.get("actorType"), UserType.ADMIN));
auditEntity.actorType.eq(UserType.ADMIN));
} }
} }
// 登录角色 管理员 // 登录角色 用户
if (UserType.USER.equals(userType)) { if (UserType.USER.equals(userType)) {
predicate = ExpressionUtils.and(predicate, predicates.add(criteriaBuilder.equal(root.get("actorId"),
auditEntity.actorId.eq(SecurityUtils.getCurrentUser().getId())); SecurityUtils.getCurrentUser().getId()));
// 用户类型 // 用户类型
predicate = ExpressionUtils.and(predicate, auditEntity.actorType.eq(UserType.USER)); predicates.add(criteriaBuilder.equal(root.get("actorType"), UserType.USER));
} }
// 事件类型 // 事件类型
if (!CollectionUtils.isEmpty(query.getEventType())) { if (!CollectionUtils.isEmpty(query.getEventType())) {
predicate = ExpressionUtils.and(predicate, predicates
auditEntity.eventType.in(query.getEventType())); .add(criteriaBuilder.in(root.get("eventType")).value(query.getEventType()));
} }
// 事件状态 // 事件状态
if (Objects.nonNull(query.getEventStatus())) { if (Objects.nonNull(query.getEventStatus())) {
predicate = ExpressionUtils.and(predicate, predicates
auditEntity.eventStatus.in(query.getEventStatus())); .add(criteriaBuilder.equal(root.get("eventStatus"), query.getEventStatus()));
} }
// 事件时间 // 事件时间
if (!Objects.isNull(query.getStartEventTime()) if (!Objects.isNull(query.getStartEventTime())
&& !Objects.isNull(query.getEndEventTime())) { && !Objects.isNull(query.getEndEventTime())) {
predicate = ExpressionUtils.and(predicate, predicates.add(criteriaBuilder.between(root.get("eventTime"),
auditEntity.eventTime.between(query.getStartEventTime(), query.getEndEventTime())); query.getStartEventTime(), query.getEndEventTime()));
} }
return predicate; //默认desc
criteriaQuery.orderBy(criteriaBuilder.desc(root.get("eventTime")));
for (PageModel.Sort sort : page.getSorts()) {
if (org.apache.commons.lang3.StringUtils.equals(sort.getSorter(),
SORT_EVENT_TIME)) {
if (sort.getAsc()) {
orders.add(criteriaBuilder.asc(root.get("eventTime")));
}
}
}
criteriaQuery.orderBy(orders);
criteriaQuery.where(criteriaBuilder.and(predicates.toArray(new Predicate[0])));
return criteriaQuery.getRestriction();
};
} }
/** /**
@ -227,7 +242,7 @@ public interface AuditDataConverter {
Optional<UserEntity> user = userRepository.findByIdContainsDeleted(Long.valueOf(id)); Optional<UserEntity> user = userRepository.findByIdContainsDeleted(Long.valueOf(id));
if (user.isPresent()) { if (user.isPresent()) {
UserEntity entity = user.get(); UserEntity entity = user.get();
name = org.apache.commons.lang3.StringUtils.defaultString(entity.getFullName(), name = Objects.toString(entity.getFullName(),
entity.getUsername()); entity.getUsername());
} }
} }