Quellcode durchsuchen

feat: export user+type only allow 1 running with annotation

dengjia vor 5 Tagen
Ursprung
Commit
2f495c9a10

+ 6 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/constant/enums/ExportType.java

@@ -1,5 +1,7 @@
 package com.qunzhixinxi.hnqz.admin.api.constant.enums;
 
+import com.qunzhixinxi.hnqz.admin.api.constant.CacheConstants;
+
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 
@@ -24,4 +26,8 @@ public enum ExportType {
 	 * 描述
 	 */
 	private final String description;
+
+	public static String getAsyncExportCache(ExportType exportType, Integer userId) {
+        return String.format(CacheConstants.ASYNC_EXPORT_CACHE, exportType.getType(), userId);
+    }
 }

+ 20 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/aspect/ExportGuard.java

@@ -0,0 +1,20 @@
+
+package com.qunzhixinxi.hnqz.admin.aspect;
+
+import java.lang.annotation.*;
+
+/**
+ * @author hnqz
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface ExportGuard {
+
+	/**
+	 * enum ExportType
+	 * @return {String}
+	 */
+	String type();
+
+}

+ 50 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/aspect/ExportGuardAspect.java

@@ -0,0 +1,50 @@
+
+package com.qunzhixinxi.hnqz.admin.aspect;
+
+import com.qunzhixinxi.hnqz.admin.api.constant.enums.ExportType;
+import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
+
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+
+import cn.hutool.extra.spring.SpringUtil;
+import lombok.AllArgsConstructor;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+
+/**
+ *
+ */
+@Slf4j
+@Aspect
+@AllArgsConstructor
+@Component
+public class ExportGuardAspect {
+
+	@SneakyThrows
+	@Around("@annotation(exportGuard)")
+	public Object around(ProceedingJoinPoint point, ExportGuard exportGuard) {
+		ExportType exportType = ExportType.valueOf(exportGuard.type());
+		if (point.getArgs().length < 1) {
+			throw new RuntimeException("第一个参数必须是用户对象");
+		}
+		HnqzUser user = (HnqzUser) point.getArgs()[0];
+		if (user == null) {
+			throw new RuntimeException("第一个参数必须是用户对象");
+		}
+		String key = ExportType.getAsyncExportCache(exportType, user.getId());
+		// RedisTemplateConfig
+		@SuppressWarnings("unchecked")
+		RedisTemplate<String, Object> redisTemplate = (RedisTemplate<String, Object>) SpringUtil.getBean("redisTemplate");
+		String status = (String) redisTemplate.opsForValue().get(key);
+		if ("GENERATING".equals(status)) {
+			throw new RuntimeException("导出正在生成中,请稍后再试");
+		}
+		
+		return point.proceed();
+	}
+
+}

+ 8 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/user/SysUserExportController.java

@@ -6,11 +6,14 @@ import com.qunzhixinxi.hnqz.admin.api.dto.SysUserDTO;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmReportOpt;
 import com.qunzhixinxi.hnqz.admin.api.model.excel.SysUserExcelModel;
 import com.qunzhixinxi.hnqz.admin.service.SysCommonExportService;
+import com.qunzhixinxi.hnqz.admin.aspect.ExportGuard;
 import com.qunzhixinxi.hnqz.admin.service.SysUserExportService;
 import com.qunzhixinxi.hnqz.common.core.util.R;
 import com.qunzhixinxi.hnqz.common.log.annotation.SysLog;
 import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
 import com.qunzhixinxi.hnqz.common.security.util.SecurityUtils;
+
+import cn.hutool.core.util.ArrayUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -44,7 +47,11 @@ public class SysUserExportController {
 	@SysLog("导出用户信息")
 	@PostMapping("/export-user")
 	public R<Boolean> exportUser(@RequestBody SysUserDTO.OnList query) {
-		return R.ok(userExportService.asyncExport(SecurityUtils.getUser(), SecurityUtils.getRoles(), query));
+		HnqzUser user = SecurityUtils.getUser();
+		if (!ArrayUtil.contains(user.getRoles(), 50)) { // 事业部系统管理员
+			throw new RuntimeException("没有导出人员权限");
+		}
+		return R.ok(userExportService.asyncExport(user, SecurityUtils.getRoles(), query));
 	}
 
 	/**

+ 2 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysUserExportServiceImpl.java

@@ -19,6 +19,7 @@ import com.qunzhixinxi.hnqz.admin.api.entity.SysUserCertificate;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysUserRole;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmReportOpt;
 import com.qunzhixinxi.hnqz.admin.api.model.excel.SysUserExcelModel;
+import com.qunzhixinxi.hnqz.admin.aspect.ExportGuard;
 import com.qunzhixinxi.hnqz.admin.config.UpmsConfig;
 import com.qunzhixinxi.hnqz.admin.controller.user.SysUserController;
 import com.qunzhixinxi.hnqz.admin.event.UserExportEvent;
@@ -96,6 +97,7 @@ public class SysUserExportServiceImpl implements SysUserExportService {
 	 * @return {@link Boolean } 是否成功
 	 */
 	@Override
+	@ExportGuard(type = "USER")
 	public Boolean asyncExport(HnqzUser user, List<Integer> roles, SysUserDTO.OnList query) {
 		return retryTemplate.execute(retryContext -> {
 			log.info("人员异步导出第{}次重试", retryContext.getRetryCount());