Commit 06774a7a0b49f34dbf9fe38520347468a5670346

Authored by YunaiV
1 parent 54e26d9e

调整 errorCode 模块的自动生成逻辑

Showing 19 changed files with 379 additions and 306 deletions
src/main/java/cn/iocoder/dashboard/framework/errorcode/config/ErrorCodeAutoConfiguration.java
1 package cn.iocoder.dashboard.framework.errorcode.config; 1 package cn.iocoder.dashboard.framework.errorcode.config;
2 2
3 -import cn.iocoder.dashboard.modules.system.service.errorcode.ErrorCodeRemoteLoaderImpl;  
4 -import cn.iocoder.dashboard.modules.system.service.errorcode.ErrorCodeAutoGeneratorImpl; 3 +import cn.iocoder.dashboard.framework.errorcode.core.generator.ErrorCodeAutoGenerator;
  4 +import cn.iocoder.dashboard.framework.errorcode.core.loader.ErrorCodeLoader;
  5 +import cn.iocoder.dashboard.framework.errorcode.core.service.ErrorCodeFrameworkService;
  6 +import cn.iocoder.dashboard.framework.errorcode.core.loader.ErrorCodeLoaderImpl;
  7 +import cn.iocoder.dashboard.framework.errorcode.core.generator.ErrorCodeAutoGeneratorImpl;
  8 +import org.springframework.beans.factory.annotation.Value;
5 import org.springframework.boot.context.properties.EnableConfigurationProperties; 9 import org.springframework.boot.context.properties.EnableConfigurationProperties;
6 import org.springframework.context.annotation.Bean; 10 import org.springframework.context.annotation.Bean;
7 import org.springframework.context.annotation.Configuration; 11 import org.springframework.context.annotation.Configuration;
8 import org.springframework.scheduling.annotation.EnableScheduling; 12 import org.springframework.scheduling.annotation.EnableScheduling;
9 13
  14 +/**
  15 + * 错误码配置类
  16 + */
10 @Configuration 17 @Configuration
11 @EnableConfigurationProperties(ErrorCodeProperties.class) 18 @EnableConfigurationProperties(ErrorCodeProperties.class)
12 @EnableScheduling // 开启调度任务的功能,因为 ErrorCodeRemoteLoader 通过定时刷新错误码 19 @EnableScheduling // 开启调度任务的功能,因为 ErrorCodeRemoteLoader 通过定时刷新错误码
13 public class ErrorCodeAutoConfiguration { 20 public class ErrorCodeAutoConfiguration {
14 21
15 @Bean 22 @Bean
16 - public ErrorCodeAutoGeneratorImpl errorCodeAutoGenerator(ErrorCodeProperties errorCodeProperties) {  
17 - return new ErrorCodeAutoGeneratorImpl(errorCodeProperties.getGroup())  
18 - .setErrorCodeConstantsClass(errorCodeProperties.getConstantsClass()); 23 + public ErrorCodeAutoGenerator errorCodeAutoGenerator(@Value("${spring.application.name}") String applicationName,
  24 + ErrorCodeProperties errorCodeProperties,
  25 + ErrorCodeFrameworkService errorCodeFrameworkService) {
  26 + return new ErrorCodeAutoGeneratorImpl(applicationName, errorCodeProperties.getConstantsClass(),
  27 + errorCodeFrameworkService);
19 } 28 }
20 29
21 @Bean 30 @Bean
22 - public ErrorCodeRemoteLoaderImpl errorCodeRemoteLoader(ErrorCodeProperties errorCodeProperties) {  
23 - return new ErrorCodeRemoteLoaderImpl(errorCodeProperties.getGroup()); 31 + public ErrorCodeLoader errorCodeLoader(@Value("${spring.application.name}") String applicationName,
  32 + ErrorCodeFrameworkService errorCodeFrameworkService) {
  33 + return new ErrorCodeLoaderImpl(applicationName, errorCodeFrameworkService);
24 } 34 }
25 35
26 -}  
27 \ No newline at end of file 36 \ No newline at end of file
  37 +}
src/main/java/cn/iocoder/dashboard/framework/errorcode/config/ErrorCodeProperties.java
1 package cn.iocoder.dashboard.framework.errorcode.config; 1 package cn.iocoder.dashboard.framework.errorcode.config;
2 2
3 -import lombok.Getter;  
4 -import lombok.Setter; 3 +import lombok.Data;
5 import org.springframework.boot.context.properties.ConfigurationProperties; 4 import org.springframework.boot.context.properties.ConfigurationProperties;
6 import org.springframework.validation.annotation.Validated; 5 import org.springframework.validation.annotation.Validated;
7 6
8 -import javax.validation.constraints.NotNull; 7 +import javax.validation.constraints.NotEmpty;
9 8
  9 +/**
  10 + * 错误码的配置属性类
  11 + *
  12 + * @author dlyan
  13 + */
10 @ConfigurationProperties("yudao.error-code") 14 @ConfigurationProperties("yudao.error-code")
  15 +@Data
11 @Validated 16 @Validated
12 -@Getter  
13 -@Setter  
14 public class ErrorCodeProperties { 17 public class ErrorCodeProperties {
15 18
16 /** 19 /**
17 - * 应用分组  
18 - */  
19 - @NotNull(message = "应用分组不能为空,请设置 yudao.error-code.group 配置项,推荐直接使用 spring.application.name 配置项")  
20 - private String group;  
21 - /**  
22 * 错误码枚举类 20 * 错误码枚举类
23 */ 21 */
  22 + @NotEmpty(message = "错误码枚举类不能为空")
24 private String constantsClass; 23 private String constantsClass;
25 -}  
26 \ No newline at end of file 24 \ No newline at end of file
  25 +
  26 +}
src/main/java/cn/iocoder/dashboard/framework/errorcode/core/ErrorCodeRemoteLoader.java deleted
1 -package cn.iocoder.dashboard.framework.errorcode.core;  
2 -  
3 -public interface ErrorCodeRemoteLoader {  
4 -  
5 - /**  
6 - * 全量加载 ErrorCode 错误码  
7 - */  
8 - void loadErrorCodes();  
9 -  
10 - /**  
11 - * 增量加载 ErrorCode 错误码  
12 - */  
13 - void refreshErrorCodes();  
14 -}  
src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/dto/ErrorCodeAutoGenerateDTO.java renamed to src/main/java/cn/iocoder/dashboard/framework/errorcode/core/dto/ErrorCodeAutoGenerateReqDTO.java
1 -package cn.iocoder.dashboard.modules.system.controller.errorcode.dto; 1 +package cn.iocoder.dashboard.framework.errorcode.core.dto;
2 2
3 import lombok.Data; 3 import lombok.Data;
4 import lombok.experimental.Accessors; 4 import lombok.experimental.Accessors;
5 5
6 import javax.validation.constraints.NotEmpty; 6 import javax.validation.constraints.NotEmpty;
7 import javax.validation.constraints.NotNull; 7 import javax.validation.constraints.NotNull;
8 -import java.io.Serializable;  
9 8
10 /** 9 /**
11 * 错误码自动生成 DTO 10 * 错误码自动生成 DTO
  11 + *
  12 + * @author dylan
12 */ 13 */
13 @Data 14 @Data
14 @Accessors(chain = true) 15 @Accessors(chain = true)
15 -public class ErrorCodeAutoGenerateDTO implements Serializable { 16 +public class ErrorCodeAutoGenerateReqDTO {
16 17
17 /** 18 /**
  19 + * 应用名
  20 + */
  21 + @NotNull(message = "应用名不能为空")
  22 + private String applicationName;
  23 + /**
18 * 错误码编码 24 * 错误码编码
19 */ 25 */
20 @NotNull(message = "错误码编码不能为空") 26 @NotNull(message = "错误码编码不能为空")
@@ -24,10 +30,5 @@ public class ErrorCodeAutoGenerateDTO implements Serializable { @@ -24,10 +30,5 @@ public class ErrorCodeAutoGenerateDTO implements Serializable {
24 */ 30 */
25 @NotEmpty(message = "错误码错误提示不能为空") 31 @NotEmpty(message = "错误码错误提示不能为空")
26 private String message; 32 private String message;
27 - /**  
28 - * 错误码分组  
29 - */  
30 - @NotNull(message = "错误码分组不能为空")  
31 - private String group;  
32 33
33 -}  
34 \ No newline at end of file 34 \ No newline at end of file
  35 +}
src/main/java/cn/iocoder/dashboard/framework/errorcode/core/dto/ErrorCodeRespDTO.java 0 → 100644
  1 +package cn.iocoder.dashboard.framework.errorcode.core.dto;
  2 +
  3 +import lombok.Data;
  4 +
  5 +import java.util.Date;
  6 +
  7 +/**
  8 + * 错误码的 Response DTO
  9 + *
  10 + * @author 芋道源码
  11 + */
  12 +@Data
  13 +public class ErrorCodeRespDTO {
  14 +
  15 + /**
  16 + * 错误码编码
  17 + */
  18 + private Integer code;
  19 + /**
  20 + * 错误码错误提示
  21 + */
  22 + private String message;
  23 + /**
  24 + * 更新时间
  25 + */
  26 + private Date updateTime;
  27 +
  28 +}
src/main/java/cn/iocoder/dashboard/framework/errorcode/core/ErrorCodeAutoGenerator.java renamed to src/main/java/cn/iocoder/dashboard/framework/errorcode/core/generator/ErrorCodeAutoGenerator.java
1 -package cn.iocoder.dashboard.framework.errorcode.core; 1 +package cn.iocoder.dashboard.framework.errorcode.core.generator;
2 2
3 /** 3 /**
  4 + * 错误码的自动生成器
  5 + *
4 * @author dylan 6 * @author dylan
5 */ 7 */
6 public interface ErrorCodeAutoGenerator { 8 public interface ErrorCodeAutoGenerator {
@@ -9,4 +11,5 @@ public interface ErrorCodeAutoGenerator { @@ -9,4 +11,5 @@ public interface ErrorCodeAutoGenerator {
9 * 将配置类到错误码写入数据库 11 * 将配置类到错误码写入数据库
10 */ 12 */
11 void execute(); 13 void execute();
  14 +
12 } 15 }
src/main/java/cn/iocoder/dashboard/modules/system/service/errorcode/ErrorCodeAutoGeneratorImpl.java renamed to src/main/java/cn/iocoder/dashboard/framework/errorcode/core/generator/ErrorCodeAutoGeneratorImpl.java
1 -package cn.iocoder.dashboard.modules.system.service.errorcode; 1 +package cn.iocoder.dashboard.framework.errorcode.core.generator;
2 2
3 import cn.iocoder.dashboard.common.exception.ErrorCode; 3 import cn.iocoder.dashboard.common.exception.ErrorCode;
4 -import cn.iocoder.dashboard.common.pojo.CommonResult;  
5 -import cn.iocoder.dashboard.framework.errorcode.core.ErrorCodeAutoGenerator;  
6 -import cn.iocoder.dashboard.modules.system.controller.errorcode.dto.ErrorCodeAutoGenerateDTO; 4 +import cn.iocoder.dashboard.framework.errorcode.core.dto.ErrorCodeAutoGenerateReqDTO;
  5 +import cn.iocoder.dashboard.framework.errorcode.core.service.ErrorCodeFrameworkService;
7 import lombok.RequiredArgsConstructor; 6 import lombok.RequiredArgsConstructor;
8 import lombok.extern.slf4j.Slf4j; 7 import lombok.extern.slf4j.Slf4j;
9 import org.springframework.boot.context.event.ApplicationReadyEvent; 8 import org.springframework.boot.context.event.ApplicationReadyEvent;
@@ -11,11 +10,16 @@ import org.springframework.context.event.EventListener; @@ -11,11 +10,16 @@ import org.springframework.context.event.EventListener;
11 import org.springframework.scheduling.annotation.Async; 10 import org.springframework.scheduling.annotation.Async;
12 import org.springframework.util.StringUtils; 11 import org.springframework.util.StringUtils;
13 12
14 -import javax.annotation.Resource;  
15 import java.util.ArrayList; 13 import java.util.ArrayList;
16 import java.util.Arrays; 14 import java.util.Arrays;
17 import java.util.List; 15 import java.util.List;
18 16
  17 +/**
  18 + * ErrorCodeAutoGenerator 的实现类
  19 + * 目的是,扫描指定的 {@link #errorCodeConstantsClass} 类,写入到 system 的数据库中
  20 + *
  21 + * @author dylan
  22 + */
19 @RequiredArgsConstructor 23 @RequiredArgsConstructor
20 @Slf4j 24 @Slf4j
21 public class ErrorCodeAutoGeneratorImpl implements ErrorCodeAutoGenerator { 25 public class ErrorCodeAutoGeneratorImpl implements ErrorCodeAutoGenerator {
@@ -23,58 +27,75 @@ public class ErrorCodeAutoGeneratorImpl implements ErrorCodeAutoGenerator { @@ -23,58 +27,75 @@ public class ErrorCodeAutoGeneratorImpl implements ErrorCodeAutoGenerator {
23 /** 27 /**
24 * 应用分组 28 * 应用分组
25 */ 29 */
26 - private final String group; 30 + private final String applicationName;
27 /** 31 /**
28 * 错误码枚举类 32 * 错误码枚举类
29 */ 33 */
30 - private String errorCodeConstantsClass;  
31 -  
32 - @Resource  
33 - private ErrorCodeService errorCodeService;  
34 -  
35 - public ErrorCodeAutoGeneratorImpl setErrorCodeConstantsClass(String errorCodeConstantsClass) {  
36 - this.errorCodeConstantsClass = errorCodeConstantsClass;  
37 - return this;  
38 - } 34 + private final String errorCodeConstantsClass;
  35 + /**
  36 + * 错误码 Service
  37 + */
  38 + private final ErrorCodeFrameworkService errorCodeService;
39 39
40 @Override 40 @Override
41 @EventListener(ApplicationReadyEvent.class) 41 @EventListener(ApplicationReadyEvent.class)
42 @Async // 异步,保证项目的启动过程,毕竟非关键流程 42 @Async // 异步,保证项目的启动过程,毕竟非关键流程
43 public void execute() { 43 public void execute() {
  44 + // 第一步,获得错误码类
  45 + Class<?> errorCodeConstantsClazz = parseErrorCodeConstantsClass();
  46 + if (errorCodeConstantsClazz == null) {
  47 + return;
  48 + }
  49 +
  50 + // 第二步,获得错误码数组
  51 + List<ErrorCodeAutoGenerateReqDTO> autoGenerateDTOs = parseErrorCode(errorCodeConstantsClazz);
  52 + log.info("[execute][解析到错误码数量为 ({}) 个]", autoGenerateDTOs.size());
  53 +
  54 + // 第三步,写入到 system 的数据库
  55 + errorCodeService.autoGenerateErrorCodes(autoGenerateDTOs);
  56 + log.info("[execute][写入到 system 组件完成]");
  57 + }
  58 +
  59 + /**
  60 + * 解析 errorCodeConstantsClass 变量,获得错误码类
  61 + *
  62 + * @return 错误码类
  63 + */
  64 + private Class<?> parseErrorCodeConstantsClass() {
44 // 校验 errorCodeConstantsClass 参数 65 // 校验 errorCodeConstantsClass 参数
45 if (!StringUtils.hasText(errorCodeConstantsClass)) { 66 if (!StringUtils.hasText(errorCodeConstantsClass)) {
46 log.info("[execute][未配置 yudao.error-code.constants-class 配置项,不进行自动写入到当前服务中]"); 67 log.info("[execute][未配置 yudao.error-code.constants-class 配置项,不进行自动写入到当前服务中]");
47 - return; 68 + return null;
48 } 69 }
49 - Class errorCodeConstantsClazz;  
50 try { 70 try {
51 - errorCodeConstantsClazz = Class.forName(errorCodeConstantsClass); 71 + return Class.forName(errorCodeConstantsClass);
52 } catch (ClassNotFoundException e) { 72 } catch (ClassNotFoundException e) {
53 log.error("[execute][配置的 ({}) 找不到对应的类]", errorCodeConstantsClass); 73 log.error("[execute][配置的 ({}) 找不到对应的类]", errorCodeConstantsClass);
54 - return; 74 + return null;
55 } 75 }
56 - // 写入 system-service 服务  
57 - log.info("[execute][自动将 ({}) 类的错误码,准备写入到当前服务]", errorCodeConstantsClass);  
58 - List<ErrorCodeAutoGenerateDTO> autoGenerateDTOs = new ArrayList<>(); 76 + }
  77 +
  78 + /**
  79 + * 解析错误码类,获得错误码数组
  80 + *
  81 + * @return 错误码数组
  82 + */
  83 + private List<ErrorCodeAutoGenerateReqDTO> parseErrorCode(Class<?> errorCodeConstantsClazz) {
  84 + List<ErrorCodeAutoGenerateReqDTO> autoGenerateDTOs = new ArrayList<>();
59 Arrays.stream(errorCodeConstantsClazz.getFields()).forEach(field -> { 85 Arrays.stream(errorCodeConstantsClazz.getFields()).forEach(field -> {
60 if (field.getType() != ErrorCode.class) { 86 if (field.getType() != ErrorCode.class) {
61 return; 87 return;
62 } 88 }
63 try { 89 try {
64 ErrorCode errorCode = (ErrorCode) field.get(errorCodeConstantsClazz); 90 ErrorCode errorCode = (ErrorCode) field.get(errorCodeConstantsClazz);
65 - autoGenerateDTOs.add(new ErrorCodeAutoGenerateDTO().setGroup(group)  
66 - .setCode(errorCode.getCode()).setMessage(errorCode.getMessage())); 91 + autoGenerateDTOs.add(new ErrorCodeAutoGenerateReqDTO().setApplicationName(applicationName)
  92 + .setCode(errorCode.getCode()).setMessage(errorCode.getMsg()));
67 } catch (IllegalAccessException e) { 93 } catch (IllegalAccessException e) {
68 throw new RuntimeException(e); 94 throw new RuntimeException(e);
69 } 95 }
70 }); 96 });
71 - CommonResult<Boolean> autoGenerateErrorCodesResult = errorCodeService.autoGenerateErrorCodes1(autoGenerateDTOs);  
72 - if (autoGenerateErrorCodesResult.isSuccess()) {  
73 - log.info("[execute][自动将 ({}) 类的错误码,成功写入到当前服务]", errorCodeConstantsClass);  
74 - } else {  
75 - log.error("[execute][自动将 ({}) 类的错误码,失败写入到当前服务,原因为 ({}/{})]", errorCodeConstantsClass,  
76 - autoGenerateErrorCodesResult.getCode(), autoGenerateErrorCodesResult.getMsg());  
77 - } 97 + return autoGenerateDTOs;
78 } 98 }
79 99
80 } 100 }
  101 +
src/main/java/cn/iocoder/dashboard/framework/errorcode/core/loader/ErrorCodeLoader.java 0 → 100644
  1 +package cn.iocoder.dashboard.framework.errorcode.core.loader;
  2 +
  3 +import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil;
  4 +
  5 +/**
  6 + * 错误码加载器
  7 + *
  8 + * 注意,错误码最终加载到 {@link cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil} 的 MESSAGES 变量中!
  9 + *
  10 + * @author dlyan
  11 + */
  12 +public interface ErrorCodeLoader {
  13 +
  14 + /**
  15 + * 添加错误码
  16 + *
  17 + * @param code 错误码的编号
  18 + * @param msg 错误码的提示
  19 + */
  20 + default void putErrorCode(Integer code, String msg) {
  21 + ServiceExceptionUtil.put(code, msg);
  22 + }
  23 +
  24 +}
src/main/java/cn/iocoder/dashboard/framework/errorcode/core/loader/ErrorCodeLoaderImpl.java 0 → 100644
  1 +package cn.iocoder.dashboard.framework.errorcode.core.loader;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.iocoder.dashboard.framework.errorcode.core.dto.ErrorCodeRespDTO;
  5 +import cn.iocoder.dashboard.framework.errorcode.core.service.ErrorCodeFrameworkService;
  6 +import cn.iocoder.dashboard.util.date.DateUtils;
  7 +import lombok.RequiredArgsConstructor;
  8 +import lombok.extern.slf4j.Slf4j;
  9 +import org.springframework.boot.context.event.ApplicationReadyEvent;
  10 +import org.springframework.context.event.EventListener;
  11 +import org.springframework.scheduling.annotation.Scheduled;
  12 +
  13 +import java.util.Date;
  14 +import java.util.List;
  15 +
  16 +/**
  17 + * ErrorCodeLoader 的实现类,从 system 的数据库中,加载错误码。
  18 + *
  19 + * 考虑到错误码会刷新,所以按照 {@link #REFRESH_ERROR_CODE_PERIOD} 频率,增量加载错误码。
  20 + *
  21 + * @author dlyan
  22 + */
  23 +@RequiredArgsConstructor
  24 +@Slf4j
  25 +public class ErrorCodeLoaderImpl implements ErrorCodeLoader {
  26 +
  27 + /**
  28 + * 刷新错误码的频率,单位:毫秒
  29 + */
  30 + private static final int REFRESH_ERROR_CODE_PERIOD = 60 * 1000;
  31 +
  32 + /**
  33 + * 应用分组
  34 + */
  35 + private final String applicationName;
  36 + /**
  37 + * 错误码 Service
  38 + */
  39 + private final ErrorCodeFrameworkService errorCodeService;
  40 +
  41 + /**
  42 + * 缓存错误码的最大更新时间,用于后续的增量轮询,判断是否有更新
  43 + */
  44 + private Date maxUpdateTime;
  45 +
  46 + @EventListener(ApplicationReadyEvent.class)
  47 + public void loadErrorCodes() {
  48 + this.loadErrorCodes0();
  49 + }
  50 +
  51 + @Scheduled(fixedDelay = REFRESH_ERROR_CODE_PERIOD, initialDelay = REFRESH_ERROR_CODE_PERIOD)
  52 + public void refreshErrorCodes() {
  53 + this.loadErrorCodes0();
  54 + }
  55 +
  56 + private void loadErrorCodes0() {
  57 + // 加载错误码
  58 + List<ErrorCodeRespDTO> errorCodeRespDTOs = errorCodeService.getErrorCodeList(applicationName, maxUpdateTime);
  59 + if (CollUtil.isEmpty(errorCodeRespDTOs)) {
  60 + return;
  61 + }
  62 + log.info("[loadErrorCodes0][加载到 ({}) 个错误码]", errorCodeRespDTOs.size());
  63 +
  64 + // 刷新错误码的缓存
  65 + errorCodeRespDTOs.forEach(errorCodeRespDTO -> {
  66 + // 写入到错误码的缓存
  67 + putErrorCode(errorCodeRespDTO.getCode(), errorCodeRespDTO.getMessage());
  68 + // 记录下更新时间,方便增量更新
  69 + maxUpdateTime = DateUtils.max(maxUpdateTime, errorCodeRespDTO.getUpdateTime());
  70 + });
  71 + }
  72 +
  73 +}
src/main/java/cn/iocoder/dashboard/framework/errorcode/core/service/ErrorCodeFrameworkService.java 0 → 100644
  1 +package cn.iocoder.dashboard.framework.errorcode.core.service;
  2 +
  3 +import cn.iocoder.dashboard.framework.errorcode.core.dto.ErrorCodeAutoGenerateReqDTO;
  4 +import cn.iocoder.dashboard.framework.errorcode.core.dto.ErrorCodeRespDTO;
  5 +
  6 +import javax.validation.Valid;
  7 +import java.util.Date;
  8 +import java.util.List;
  9 +
  10 +/**
  11 + * 错误码 Framework Service 接口
  12 + *
  13 + * @author 芋道源码
  14 + */
  15 +public interface ErrorCodeFrameworkService {
  16 +
  17 + /**
  18 + * 自动创建错误码
  19 + *
  20 + * @param autoGenerateDTOs 错误码信息
  21 + */
  22 + void autoGenerateErrorCodes(@Valid List<ErrorCodeAutoGenerateReqDTO> autoGenerateDTOs);
  23 +
  24 + /**
  25 + * 增量获得错误码数组
  26 + *
  27 + * 如果 minUpdateTime 为空时,则获取所有错误码
  28 + *
  29 + * @param applicationName 应用名
  30 + * @param minUpdateTime 最小更新时间
  31 + * @return 错误码数组
  32 + */
  33 + List<ErrorCodeRespDTO> getErrorCodeList(String applicationName, Date minUpdateTime);
  34 +
  35 +}
src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/ErrorCodeController.java
@@ -2,23 +2,16 @@ package cn.iocoder.dashboard.modules.system.controller.errorcode; @@ -2,23 +2,16 @@ package cn.iocoder.dashboard.modules.system.controller.errorcode;
2 2
3 import cn.iocoder.dashboard.common.pojo.CommonResult; 3 import cn.iocoder.dashboard.common.pojo.CommonResult;
4 import cn.iocoder.dashboard.common.pojo.PageResult; 4 import cn.iocoder.dashboard.common.pojo.PageResult;
5 -import cn.iocoder.dashboard.modules.system.controller.errorcode.dto.ErrorCodeAutoGenerateDTO;  
6 import cn.iocoder.dashboard.modules.system.controller.errorcode.dto.ErrorCodeCreateDTO; 5 import cn.iocoder.dashboard.modules.system.controller.errorcode.dto.ErrorCodeCreateDTO;
7 import cn.iocoder.dashboard.modules.system.controller.errorcode.dto.ErrorCodePageDTO; 6 import cn.iocoder.dashboard.modules.system.controller.errorcode.dto.ErrorCodePageDTO;
8 import cn.iocoder.dashboard.modules.system.controller.errorcode.dto.ErrorCodeUpdateDTO; 7 import cn.iocoder.dashboard.modules.system.controller.errorcode.dto.ErrorCodeUpdateDTO;
9 import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.ErrorCodeVO; 8 import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.ErrorCodeVO;
10 -import cn.iocoder.dashboard.modules.system.service.errorcode.ErrorCodeService; 9 +import cn.iocoder.dashboard.modules.system.service.errorcode.impl.ErrorCodeServiceImpl;
11 import io.swagger.annotations.Api; 10 import io.swagger.annotations.Api;
12 import io.swagger.annotations.ApiOperation; 11 import io.swagger.annotations.ApiOperation;
13 -import org.springframework.beans.propertyeditors.CustomDateEditor;  
14 -import org.springframework.web.bind.ServletRequestDataBinder;  
15 import org.springframework.web.bind.annotation.*; 12 import org.springframework.web.bind.annotation.*;
16 13
17 import javax.annotation.Resource; 14 import javax.annotation.Resource;
18 -import javax.servlet.http.HttpServletRequest;  
19 -import javax.validation.constraints.NotNull;  
20 -import java.text.SimpleDateFormat;  
21 -import java.util.Date;  
22 import java.util.List; 15 import java.util.List;
23 16
24 import static cn.iocoder.dashboard.common.pojo.CommonResult.success; 17 import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
@@ -29,34 +22,7 @@ import static cn.iocoder.dashboard.common.pojo.CommonResult.success; @@ -29,34 +22,7 @@ import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
29 public class ErrorCodeController { 22 public class ErrorCodeController {
30 23
31 @Resource 24 @Resource
32 - private ErrorCodeService errorCodeService;  
33 -  
34 - /**  
35 - * 获得指定分组下的错误码列表  
36 - *  
37 - * @param group 错误码分组  
38 - * @param minUpdateTime 最小更新时间,允许为空。  
39 - * 通过该参数,我们可以增量获取超过 minUpdateTime 时间的错误码  
40 - * @return 错误码列表  
41 - */  
42 - @ApiOperation("获取指定分组下的状态码")  
43 - @GetMapping("/list-group")  
44 - public CommonResult<List<ErrorCodeVO>> listErrorCodes(@NotNull(message = "错误码分组不能为空") String group, Date minUpdateTime) {  
45 - return success(errorCodeService.listErrorCodes(group, minUpdateTime));  
46 - }  
47 -  
48 - /**  
49 - * 自动生成错误码  
50 - *  
51 - * @param autoGenerateDTOs 自动生成信息 DTO  
52 - */  
53 - @ApiOperation("自动生成错误码")  
54 - @PostMapping("/generate")  
55 - public CommonResult<Boolean> autoGenerateErrorCodes(@RequestBody List<ErrorCodeAutoGenerateDTO> autoGenerateDTOs) {  
56 - errorCodeService.autoGenerateErrorCodes(autoGenerateDTOs);  
57 - return success(Boolean.TRUE);  
58 - }  
59 - 25 + private ErrorCodeServiceImpl errorCodeService;
60 26
61 /** 27 /**
62 * 创建错误码 28 * 创建错误码
@@ -130,11 +96,4 @@ public class ErrorCodeController { @@ -130,11 +96,4 @@ public class ErrorCodeController {
130 return success(errorCodeService.pageErrorCode(pageDTO)); 96 return success(errorCodeService.pageErrorCode(pageDTO));
131 } 97 }
132 98
133 - @InitBinder  
134 - protected void init(HttpServletRequest request, ServletRequestDataBinder binder) {  
135 - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
136 - dateFormat.setLenient(false);  
137 - binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));  
138 - }  
139 -  
140 } 99 }
src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/dto/ErrorCodeUpdateDTO.java
1 package cn.iocoder.dashboard.modules.system.controller.errorcode.dto; 1 package cn.iocoder.dashboard.modules.system.controller.errorcode.dto;
2 2
3 -import cn.iocoder.dashboard.framework.validator.InEnum;  
4 -import cn.iocoder.dashboard.modules.system.enums.errorcode.ErrorCodeTypeEnum;  
5 import io.swagger.annotations.ApiModel; 3 import io.swagger.annotations.ApiModel;
6 import io.swagger.annotations.ApiModelProperty; 4 import io.swagger.annotations.ApiModelProperty;
7 import lombok.Data; 5 import lombok.Data;
8 -import lombok.experimental.Accessors;  
9 6
10 import javax.validation.constraints.NotEmpty; 7 import javax.validation.constraints.NotEmpty;
11 import javax.validation.constraints.NotNull; 8 import javax.validation.constraints.NotNull;
12 -import java.io.Serializable;  
13 9
14 @ApiModel("错误码更新 DTO") 10 @ApiModel("错误码更新 DTO")
15 @Data 11 @Data
src/main/java/cn/iocoder/dashboard/modules/system/convert/errorcode/ErrorCodeConvert.java renamed to src/main/java/cn/iocoder/dashboard/modules/system/convert/errorcode/SysErrorCodeConvert.java
1 package cn.iocoder.dashboard.modules.system.convert.errorcode; 1 package cn.iocoder.dashboard.modules.system.convert.errorcode;
2 2
3 import cn.iocoder.dashboard.common.pojo.PageResult; 3 import cn.iocoder.dashboard.common.pojo.PageResult;
4 -import cn.iocoder.dashboard.modules.system.controller.errorcode.dto.ErrorCodeAutoGenerateDTO; 4 +import cn.iocoder.dashboard.framework.errorcode.core.dto.ErrorCodeAutoGenerateReqDTO;
  5 +import cn.iocoder.dashboard.framework.errorcode.core.dto.ErrorCodeRespDTO;
5 import cn.iocoder.dashboard.modules.system.controller.errorcode.dto.ErrorCodeCreateDTO; 6 import cn.iocoder.dashboard.modules.system.controller.errorcode.dto.ErrorCodeCreateDTO;
6 import cn.iocoder.dashboard.modules.system.controller.errorcode.dto.ErrorCodeUpdateDTO; 7 import cn.iocoder.dashboard.modules.system.controller.errorcode.dto.ErrorCodeUpdateDTO;
7 import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.ErrorCodeVO; 8 import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.ErrorCodeVO;
@@ -14,13 +15,10 @@ import org.mapstruct.factory.Mappers; @@ -14,13 +15,10 @@ import org.mapstruct.factory.Mappers;
14 15
15 import java.util.List; 16 import java.util.List;
16 17
17 -/**  
18 - * @author dylan  
19 - */  
20 @Mapper(unmappedSourcePolicy = ReportingPolicy.IGNORE) 18 @Mapper(unmappedSourcePolicy = ReportingPolicy.IGNORE)
21 -public interface ErrorCodeConvert { 19 +public interface SysErrorCodeConvert {
22 20
23 - ErrorCodeConvert INSTANCE = Mappers.getMapper(ErrorCodeConvert.class); 21 + SysErrorCodeConvert INSTANCE = Mappers.getMapper(SysErrorCodeConvert.class);
24 22
25 ErrorCodeVO convert (ErrorCodeDO bean); 23 ErrorCodeVO convert (ErrorCodeDO bean);
26 24
@@ -33,7 +31,8 @@ public interface ErrorCodeConvert { @@ -33,7 +31,8 @@ public interface ErrorCodeConvert {
33 31
34 ErrorCodeDO convert (ErrorCodeUpdateDTO bean); 32 ErrorCodeDO convert (ErrorCodeUpdateDTO bean);
35 33
36 - ErrorCodeDO convert(ErrorCodeAutoGenerateDTO bean); 34 + ErrorCodeDO convert(ErrorCodeAutoGenerateReqDTO bean);
37 35
  36 + List<ErrorCodeRespDTO> convertList02(List<ErrorCodeDO> list);
38 37
39 } 38 }
src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/errorcode/ErrorCodeDO.java
1 package cn.iocoder.dashboard.modules.system.dal.dataobject.errorcode; 1 package cn.iocoder.dashboard.modules.system.dal.dataobject.errorcode;
2 2
3 -import cn.iocoder.dashboard.modules.system.enums.errorcode.ErrorCodeTypeEnum;  
4 -import com.baomidou.mybatisplus.annotation.TableField; 3 +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO;
  4 +import cn.iocoder.dashboard.modules.system.enums.errorcode.SysErrorCodeTypeEnum;
  5 +import com.baomidou.mybatisplus.annotation.TableId;
5 import com.baomidou.mybatisplus.annotation.TableName; 6 import com.baomidou.mybatisplus.annotation.TableName;
6 import lombok.Data; 7 import lombok.Data;
7 import lombok.EqualsAndHashCode; 8 import lombok.EqualsAndHashCode;
8 -import lombok.experimental.Accessors; 9 +import lombok.ToString;
9 10
  11 +@TableName(value = "sys_error_code")
10 @Data 12 @Data
11 -@TableName(value = "system_error_code")  
12 -@EqualsAndHashCode()  
13 -@Accessors(chain = true)  
14 -public class ErrorCodeDO { 13 +@EqualsAndHashCode(callSuper = true)
  14 +@ToString(callSuper = true)
  15 +public class ErrorCodeDO extends BaseDO {
15 16
16 /** 17 /**
17 * 错误码编号 18 * 错误码编号
18 */ 19 */
  20 + @TableId
19 private Integer id; 21 private Integer id;
20 /** 22 /**
21 - * 错误码编码 23 + * 错误码类型
  24 + *
  25 + * 枚举 {@link SysErrorCodeTypeEnum}
22 */ 26 */
23 - private Integer code; 27 + private Integer type;
24 /** 28 /**
25 - * 错误码错误提示 29 + * 应用名
26 */ 30 */
27 - private String message; 31 + private String applicationName;
28 /** 32 /**
29 - * 错误码类型  
30 - *  
31 - * 外键 {@link ErrorCodeTypeEnum} 33 + * 错误码编码
32 */ 34 */
33 - private Integer type; 35 + private Integer code;
34 /** 36 /**
35 - * 错误码分组  
36 - *  
37 - * 一般情况下,可以采用应用名 37 + * 错误码错误提示
38 */ 38 */
39 - @TableField("`group`") // 避免和数据库关键字冲突  
40 - private String group; 39 + private String message;
41 /** 40 /**
42 * 错误码备注 41 * 错误码备注
43 */ 42 */
44 private String memo; 43 private String memo;
  44 +
45 } 45 }
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/errorcode/ErrorCodeMapper.java
@@ -15,6 +15,7 @@ import java.util.List; @@ -15,6 +15,7 @@ import java.util.List;
15 15
16 @Mapper 16 @Mapper
17 public interface ErrorCodeMapper extends BaseMapper<ErrorCodeDO> { 17 public interface ErrorCodeMapper extends BaseMapper<ErrorCodeDO> {
  18 +
18 default IPage<ErrorCodeDO> selectPage(ErrorCodePageDTO pageDTO) { 19 default IPage<ErrorCodeDO> selectPage(ErrorCodePageDTO pageDTO) {
19 return selectPage(new Page<>(pageDTO.getPageNo(), pageDTO.getPageSize()), 20 return selectPage(new Page<>(pageDTO.getPageNo(), pageDTO.getPageSize()),
20 new QueryWrapperX<ErrorCodeDO>().likeIfPresent("`group`", pageDTO.getGroup()) 21 new QueryWrapperX<ErrorCodeDO>().likeIfPresent("`group`", pageDTO.getGroup())
@@ -29,8 +30,9 @@ public interface ErrorCodeMapper extends BaseMapper&lt;ErrorCodeDO&gt; { @@ -29,8 +30,9 @@ public interface ErrorCodeMapper extends BaseMapper&lt;ErrorCodeDO&gt; {
29 return selectOne(new QueryWrapper<ErrorCodeDO>().eq("code", code)); 30 return selectOne(new QueryWrapper<ErrorCodeDO>().eq("code", code));
30 } 31 }
31 32
32 - default List<ErrorCodeDO> selectListByGroup(String group, Date minUpdateTime) {  
33 - return selectList(new QueryWrapperX<ErrorCodeDO>().eq("`group`", group) 33 + default List<ErrorCodeDO> selectListByApplicationNameAndUpdateTimeGt(String applicationName, Date minUpdateTime) {
  34 + return selectList(new QueryWrapperX<ErrorCodeDO>().eq("application_name", applicationName)
34 .gtIfPresent("update_time", minUpdateTime)); 35 .gtIfPresent("update_time", minUpdateTime));
35 } 36 }
  37 +
36 } 38 }
src/main/java/cn/iocoder/dashboard/modules/system/enums/errorcode/ErrorCodeTypeEnum.java renamed to src/main/java/cn/iocoder/dashboard/modules/system/enums/errorcode/SysErrorCodeTypeEnum.java
1 package cn.iocoder.dashboard.modules.system.enums.errorcode; 1 package cn.iocoder.dashboard.modules.system.enums.errorcode;
2 2
3 import cn.iocoder.dashboard.common.core.IntArrayValuable; 3 import cn.iocoder.dashboard.common.core.IntArrayValuable;
  4 +import lombok.AllArgsConstructor;
  5 +import lombok.Getter;
4 6
5 import java.util.Arrays; 7 import java.util.Arrays;
6 8
7 /** 9 /**
  10 + * 错误码的类型枚举
  11 + *
8 * @author dylan 12 * @author dylan
9 */ 13 */
10 -  
11 -public enum ErrorCodeTypeEnum implements IntArrayValuable { 14 +@AllArgsConstructor
  15 +@Getter
  16 +public enum SysErrorCodeTypeEnum implements IntArrayValuable {
12 17
13 /** 18 /**
14 * 自动生成 19 * 自动生成
@@ -19,20 +24,16 @@ public enum ErrorCodeTypeEnum implements IntArrayValuable { @@ -19,20 +24,16 @@ public enum ErrorCodeTypeEnum implements IntArrayValuable {
19 */ 24 */
20 MANUAL_OPERATION(2); 25 MANUAL_OPERATION(2);
21 26
22 - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ErrorCodeTypeEnum::getType).toArray(); 27 + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(SysErrorCodeTypeEnum::getType).toArray();
23 28
  29 + /**
  30 + * 类型
  31 + */
24 private final Integer type; 32 private final Integer type;
25 33
26 - ErrorCodeTypeEnum(Integer type) {  
27 - this.type = type;  
28 - }  
29 -  
30 - public Integer getType() {  
31 - return type;  
32 - }  
33 -  
34 @Override 34 @Override
35 public int[] array() { 35 public int[] array() {
36 return ARRAYS; 36 return ARRAYS;
37 } 37 }
  38 +
38 } 39 }
src/main/java/cn/iocoder/dashboard/modules/system/service/errorcode/ErrorCodeRemoteLoaderImpl.java deleted
1 -package cn.iocoder.dashboard.modules.system.service.errorcode;  
2 -  
3 -import cn.hutool.core.collection.CollUtil;  
4 -import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil;  
5 -import cn.iocoder.dashboard.common.pojo.CommonResult;  
6 -import cn.iocoder.dashboard.framework.errorcode.core.ErrorCodeRemoteLoader;  
7 -import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.ErrorCodeVO;  
8 -import cn.iocoder.dashboard.util.date.DateUtils;  
9 -import lombok.extern.slf4j.Slf4j;  
10 -import org.springframework.boot.context.event.ApplicationReadyEvent;  
11 -import org.springframework.context.event.EventListener;  
12 -import org.springframework.scheduling.annotation.Scheduled;  
13 -  
14 -import javax.annotation.Resource;  
15 -import java.util.Date;  
16 -import java.util.List;  
17 -  
18 -@Slf4j  
19 -public class ErrorCodeRemoteLoaderImpl implements ErrorCodeRemoteLoader {  
20 -  
21 - private static final int REFRESH_ERROR_CODE_PERIOD = 60 * 1000;  
22 -  
23 - /**  
24 - * 应用分组  
25 - */  
26 - private final String group;  
27 -  
28 - @Resource  
29 - private ErrorCodeService errorCodeService;  
30 -  
31 - private Date maxUpdateTime;  
32 -  
33 - public ErrorCodeRemoteLoaderImpl(String group) {  
34 - this.group = group;  
35 - }  
36 -  
37 - @Override  
38 - @EventListener(ApplicationReadyEvent.class)  
39 - public void loadErrorCodes() {  
40 - // 从 ErrorCodeRpc 全量加载 ErrorCode 错误码  
41 - CommonResult<List<ErrorCodeVO>> listErrorCodesResult = errorCodeService.listErrorCodes1(group, null);  
42 - listErrorCodesResult.checkError();  
43 - log.info("[loadErrorCodes][从 group({}) 全量加载到 {} 个 ErrorCode 错误码]", group, listErrorCodesResult.getData().size());  
44 - // 写入到 ServiceExceptionUtil 到  
45 - listErrorCodesResult.getData().forEach(errorCodeVO -> {  
46 - ServiceExceptionUtil.put(errorCodeVO.getCode(), errorCodeVO.getMessage());  
47 - // 记录下更新时间,方便增量更新  
48 - maxUpdateTime = DateUtils.max(maxUpdateTime, errorCodeVO.getUpdateTime());  
49 - });  
50 - }  
51 -  
52 - @Override  
53 - @Scheduled(fixedDelay = REFRESH_ERROR_CODE_PERIOD, initialDelay = REFRESH_ERROR_CODE_PERIOD)  
54 - public void refreshErrorCodes() {  
55 - // 从 ErrorCodeRpc 增量加载 ErrorCode 错误码  
56 - // TODO 优化点:假设删除错误码的配置,会存在问题;  
57 - CommonResult<List<ErrorCodeVO>> listErrorCodesResult = errorCodeService.listErrorCodes1(group, maxUpdateTime);  
58 - listErrorCodesResult.checkError();  
59 - if (CollUtil.isEmpty(listErrorCodesResult.getData())) {  
60 - return;  
61 - }  
62 - log.info("[refreshErrorCodes][从 group({}) 增量加载到 {} 个 ErrorCode 错误码]", group, listErrorCodesResult.getData().size());  
63 - // 写入到 ServiceExceptionUtil 到  
64 - listErrorCodesResult.getData().forEach(errorCodeVO -> {  
65 - ServiceExceptionUtil.put(errorCodeVO.getCode(), errorCodeVO.getMessage());  
66 - // 记录下更新时间,方便增量更新  
67 - maxUpdateTime = DateUtils.max(maxUpdateTime, errorCodeVO.getUpdateTime());  
68 - });  
69 - }  
70 -  
71 -}  
src/main/java/cn/iocoder/dashboard/modules/system/service/errorcode/SysErrorCodeService.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.service.errorcode;
  2 +
  3 +import cn.iocoder.dashboard.framework.errorcode.core.service.ErrorCodeFrameworkService;
  4 +
  5 +/**
  6 + * 错误码 Service 接口
  7 + *
  8 + * @author 芋道源码
  9 + */
  10 +public interface SysErrorCodeService extends ErrorCodeFrameworkService {
  11 +
  12 +}
src/main/java/cn/iocoder/dashboard/modules/system/service/errorcode/ErrorCodeService.java renamed to src/main/java/cn/iocoder/dashboard/modules/system/service/errorcode/impl/ErrorCodeServiceImpl.java
1 -package cn.iocoder.dashboard.modules.system.service.errorcode; 1 +package cn.iocoder.dashboard.modules.system.service.errorcode.impl;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil; 4 import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil;
5 -import cn.iocoder.dashboard.common.pojo.CommonResult;  
6 import cn.iocoder.dashboard.common.pojo.PageResult; 5 import cn.iocoder.dashboard.common.pojo.PageResult;
7 -import cn.iocoder.dashboard.modules.system.controller.errorcode.dto.ErrorCodeAutoGenerateDTO; 6 +import cn.iocoder.dashboard.framework.errorcode.core.dto.ErrorCodeAutoGenerateReqDTO;
  7 +import cn.iocoder.dashboard.framework.errorcode.core.dto.ErrorCodeRespDTO;
8 import cn.iocoder.dashboard.modules.system.controller.errorcode.dto.ErrorCodeCreateDTO; 8 import cn.iocoder.dashboard.modules.system.controller.errorcode.dto.ErrorCodeCreateDTO;
9 import cn.iocoder.dashboard.modules.system.controller.errorcode.dto.ErrorCodePageDTO; 9 import cn.iocoder.dashboard.modules.system.controller.errorcode.dto.ErrorCodePageDTO;
10 import cn.iocoder.dashboard.modules.system.controller.errorcode.dto.ErrorCodeUpdateDTO; 10 import cn.iocoder.dashboard.modules.system.controller.errorcode.dto.ErrorCodeUpdateDTO;
11 import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.ErrorCodeVO; 11 import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.ErrorCodeVO;
12 -import cn.iocoder.dashboard.modules.system.convert.errorcode.ErrorCodeConvert; 12 +import cn.iocoder.dashboard.modules.system.convert.errorcode.SysErrorCodeConvert;
13 import cn.iocoder.dashboard.modules.system.dal.dataobject.errorcode.ErrorCodeDO; 13 import cn.iocoder.dashboard.modules.system.dal.dataobject.errorcode.ErrorCodeDO;
14 import cn.iocoder.dashboard.modules.system.dal.mysql.errorcode.ErrorCodeMapper; 14 import cn.iocoder.dashboard.modules.system.dal.mysql.errorcode.ErrorCodeMapper;
15 -import cn.iocoder.dashboard.modules.system.enums.errorcode.ErrorCodeTypeEnum;  
16 -import cn.iocoder.dashboard.util.collection.CollectionUtils; 15 +import cn.iocoder.dashboard.modules.system.enums.errorcode.SysErrorCodeTypeEnum;
  16 +import cn.iocoder.dashboard.modules.system.service.errorcode.SysErrorCodeService;
17 import com.baomidou.mybatisplus.core.metadata.IPage; 17 import com.baomidou.mybatisplus.core.metadata.IPage;
18 import lombok.extern.slf4j.Slf4j; 18 import lombok.extern.slf4j.Slf4j;
19 -import org.springframework.beans.factory.annotation.Autowired;  
20 import org.springframework.stereotype.Service; 19 import org.springframework.stereotype.Service;
21 import org.springframework.transaction.annotation.Transactional; 20 import org.springframework.transaction.annotation.Transactional;
22 import org.springframework.validation.annotation.Validated; 21 import org.springframework.validation.annotation.Validated;
23 22
24 -import javax.validation.Valid; 23 +import javax.annotation.Resource;
25 import java.util.Date; 24 import java.util.Date;
26 import java.util.List; 25 import java.util.List;
27 import java.util.Map; 26 import java.util.Map;
28 27
29 import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.ERROR_CODE_DUPLICATE; 28 import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.ERROR_CODE_DUPLICATE;
30 import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.ERROR_CODE_NOT_EXISTS; 29 import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.ERROR_CODE_NOT_EXISTS;
31 -import static cn.iocoder.dashboard.common.pojo.CommonResult.success; 30 +import static cn.iocoder.dashboard.util.collection.CollectionUtils.convertMap;
  31 +import static cn.iocoder.dashboard.util.collection.CollectionUtils.convertSet;
32 32
33 /** 33 /**
34 - * 错误码 Service 34 + * 错误码 Service 实现类
35 */ 35 */
36 -@Slf4j  
37 -@Validated  
38 @Service 36 @Service
39 -public class ErrorCodeService { 37 +@Validated
  38 +@Slf4j
  39 +public class ErrorCodeServiceImpl implements SysErrorCodeService {
40 40
41 - @Autowired  
42 - ErrorCodeMapper errorCodeMapper; 41 + @Resource
  42 + private ErrorCodeMapper errorCodeMapper;
43 43
44 /** 44 /**
45 * 创建错误码 45 * 创建错误码
@@ -47,13 +47,13 @@ public class ErrorCodeService { @@ -47,13 +47,13 @@ public class ErrorCodeService {
47 * @param createDTO 创建错误码 DTO 47 * @param createDTO 创建错误码 DTO
48 * @return 错误码 48 * @return 错误码
49 */ 49 */
50 - public ErrorCodeVO createErrorCode(@Valid ErrorCodeCreateDTO createDTO) { 50 + public ErrorCodeVO createErrorCode(ErrorCodeCreateDTO createDTO) {
51 checkDuplicateErrorCode(createDTO.getCode(), null); 51 checkDuplicateErrorCode(createDTO.getCode(), null);
52 // 插入到数据库 52 // 插入到数据库
53 - ErrorCodeDO errorCodeDO = ErrorCodeConvert.INSTANCE.convert(createDTO); 53 + ErrorCodeDO errorCodeDO = SysErrorCodeConvert.INSTANCE.convert(createDTO);
54 errorCodeMapper.insert(errorCodeDO); 54 errorCodeMapper.insert(errorCodeDO);
55 // 返回 55 // 返回
56 - return ErrorCodeConvert.INSTANCE.convert(errorCodeDO); 56 + return SysErrorCodeConvert.INSTANCE.convert(errorCodeDO);
57 } 57 }
58 58
59 /** 59 /**
@@ -61,62 +61,17 @@ public class ErrorCodeService { @@ -61,62 +61,17 @@ public class ErrorCodeService {
61 * 61 *
62 * @param updateDTO 更新错误码 DTO 62 * @param updateDTO 更新错误码 DTO
63 */ 63 */
64 - public void updateErrorCode(@Valid ErrorCodeUpdateDTO updateDTO) { 64 + public void updateErrorCode(ErrorCodeUpdateDTO updateDTO) {
65 checkDuplicateErrorCode(updateDTO.getCode(), updateDTO.getId()); 65 checkDuplicateErrorCode(updateDTO.getCode(), updateDTO.getId());
66 // 校验更新的错误码是否存在 66 // 校验更新的错误码是否存在
67 if (errorCodeMapper.selectById(updateDTO.getId()) == null) { 67 if (errorCodeMapper.selectById(updateDTO.getId()) == null) {
68 throw ServiceExceptionUtil.exception(ERROR_CODE_NOT_EXISTS); 68 throw ServiceExceptionUtil.exception(ERROR_CODE_NOT_EXISTS);
69 } 69 }
70 // 更新到数据库 70 // 更新到数据库
71 - ErrorCodeDO updateObject = ErrorCodeConvert.INSTANCE.convert(updateDTO); 71 + ErrorCodeDO updateObject = SysErrorCodeConvert.INSTANCE.convert(updateDTO);
72 errorCodeMapper.updateById(updateObject); 72 errorCodeMapper.updateById(updateObject);
73 } 73 }
74 74
75 - @Transactional  
76 - public void autoGenerateErrorCodes(@Valid List<ErrorCodeAutoGenerateDTO> autoGenerateDTOs) {  
77 - if (CollUtil.isEmpty(autoGenerateDTOs)) {  
78 - return;  
79 - }  
80 - List<ErrorCodeDO> errorCodeDOs = errorCodeMapper.selectListByCodes(  
81 - CollectionUtils.convertSet(autoGenerateDTOs, ErrorCodeAutoGenerateDTO::getCode));  
82 - Map<Integer, ErrorCodeDO> errorCodeDOMap = CollectionUtils.convertMap(errorCodeDOs, ErrorCodeDO::getCode);  
83 - // 遍历 autoGenerateBOs 数组,逐个插入或更新。考虑到每次量级不大,就不走批量了  
84 - autoGenerateDTOs.forEach(autoGenerateDTO -> {  
85 - ErrorCodeDO errorCodeDO = errorCodeDOMap.get(autoGenerateDTO.getCode());  
86 - // 不存在,则进行新增  
87 - if (errorCodeDO == null) {  
88 - errorCodeDO = ErrorCodeConvert.INSTANCE.convert(autoGenerateDTO)  
89 - .setType(ErrorCodeTypeEnum.AUTO_GENERATION.getType());  
90 - errorCodeMapper.insert(errorCodeDO);  
91 - return;  
92 - }  
93 - // 存在,则进行更新。更新有三个前置条件:  
94 - // 条件 1. 只更新自动生成的错误码,即 Type 为 ErrorCodeTypeEnum.AUTO_GENERATION  
95 - if (!ErrorCodeTypeEnum.AUTO_GENERATION.getType().equals(errorCodeDO.getType())) {  
96 - return;  
97 - }  
98 - // 条件 2. 分组 group 必须匹配,避免存在错误码冲突的情况  
99 - if (!autoGenerateDTO.getGroup().equals(errorCodeDO.getGroup())) {  
100 - log.error("[autoGenerateErrorCodes][自动创建({}/{}) 错误码失败,数据库中已经存在({}/{})]",  
101 - autoGenerateDTO.getCode(), autoGenerateDTO.getGroup(),  
102 - errorCodeDO.getCode(), errorCodeDO.getGroup());  
103 - return;  
104 - }  
105 - // 条件 3. 错误提示语存在差异  
106 - if (autoGenerateDTO.getMessage().equals(errorCodeDO.getMessage())) {  
107 - return;  
108 - }  
109 - // 最终匹配,进行更新  
110 - errorCodeMapper.updateById(new ErrorCodeDO().setId(errorCodeDO.getId()).setMessage(autoGenerateDTO.getMessage()));  
111 - });  
112 - }  
113 -  
114 - public CommonResult<Boolean> autoGenerateErrorCodes1(@Valid List<ErrorCodeAutoGenerateDTO> autoGenerateDTOs) {  
115 - autoGenerateErrorCodes(autoGenerateDTOs);  
116 - return success(Boolean.TRUE);  
117 - }  
118 -  
119 -  
120 /** 75 /**
121 * 删除错误码 76 * 删除错误码
122 * 77 *
@@ -139,7 +94,7 @@ public class ErrorCodeService { @@ -139,7 +94,7 @@ public class ErrorCodeService {
139 */ 94 */
140 public ErrorCodeVO getErrorCode(Integer errorCodeId) { 95 public ErrorCodeVO getErrorCode(Integer errorCodeId) {
141 ErrorCodeDO errorCodeDO = errorCodeMapper.selectById(errorCodeId); 96 ErrorCodeDO errorCodeDO = errorCodeMapper.selectById(errorCodeId);
142 - return ErrorCodeConvert.INSTANCE.convert(errorCodeDO); 97 + return SysErrorCodeConvert.INSTANCE.convert(errorCodeDO);
143 } 98 }
144 99
145 /** 100 /**
@@ -150,7 +105,7 @@ public class ErrorCodeService { @@ -150,7 +105,7 @@ public class ErrorCodeService {
150 */ 105 */
151 public List<ErrorCodeVO> listErrorCodes(List<Integer> errorCodeIds) { 106 public List<ErrorCodeVO> listErrorCodes(List<Integer> errorCodeIds) {
152 List<ErrorCodeDO> errorCodeDOs = errorCodeMapper.selectBatchIds(errorCodeIds); 107 List<ErrorCodeDO> errorCodeDOs = errorCodeMapper.selectBatchIds(errorCodeIds);
153 - return ErrorCodeConvert.INSTANCE.convertList(errorCodeDOs); 108 + return SysErrorCodeConvert.INSTANCE.convertList(errorCodeDOs);
154 } 109 }
155 110
156 /** 111 /**
@@ -161,7 +116,7 @@ public class ErrorCodeService { @@ -161,7 +116,7 @@ public class ErrorCodeService {
161 */ 116 */
162 public PageResult<ErrorCodeVO> pageErrorCode(ErrorCodePageDTO pageDTO) { 117 public PageResult<ErrorCodeVO> pageErrorCode(ErrorCodePageDTO pageDTO) {
163 IPage<ErrorCodeDO> errorCodeDOPage = errorCodeMapper.selectPage(pageDTO); 118 IPage<ErrorCodeDO> errorCodeDOPage = errorCodeMapper.selectPage(pageDTO);
164 - return ErrorCodeConvert.INSTANCE.convertPage(errorCodeDOPage); 119 + return SysErrorCodeConvert.INSTANCE.convertPage(errorCodeDOPage);
165 } 120 }
166 121
167 /** 122 /**
@@ -186,14 +141,53 @@ public class ErrorCodeService { @@ -186,14 +141,53 @@ public class ErrorCodeService {
186 } 141 }
187 } 142 }
188 143
189 - public List<ErrorCodeVO> listErrorCodes(String group, Date minUpdateTime) {  
190 - List<ErrorCodeDO> errorCodeDOs = errorCodeMapper.selectListByGroup(group, minUpdateTime);  
191 - return ErrorCodeConvert.INSTANCE.convertList(errorCodeDOs); 144 + @Override
  145 + @Transactional
  146 + public void autoGenerateErrorCodes(List<ErrorCodeAutoGenerateReqDTO> autoGenerateDTOs) {
  147 + if (CollUtil.isEmpty(autoGenerateDTOs)) {
  148 + return;
  149 + }
  150 + // 获得错误码
  151 + List<ErrorCodeDO> errorCodeDOs = errorCodeMapper.selectListByCodes(
  152 + convertSet(autoGenerateDTOs, ErrorCodeAutoGenerateReqDTO::getCode));
  153 + Map<Integer, ErrorCodeDO> errorCodeDOMap = convertMap(errorCodeDOs, ErrorCodeDO::getCode);
  154 +
  155 + // 遍历 autoGenerateBOs 数组,逐个插入或更新。考虑到每次量级不大,就不走批量了
  156 + autoGenerateDTOs.forEach(autoGenerateDTO -> {
  157 + ErrorCodeDO errorCodeDO = errorCodeDOMap.get(autoGenerateDTO.getCode());
  158 + // 不存在,则进行新增
  159 + if (errorCodeDO == null) {
  160 + errorCodeDO = SysErrorCodeConvert.INSTANCE.convert(autoGenerateDTO)
  161 + .setType(SysErrorCodeTypeEnum.AUTO_GENERATION.getType());
  162 + errorCodeMapper.insert(errorCodeDO);
  163 + return;
  164 + }
  165 + // 存在,则进行更新。更新有三个前置条件:
  166 + // 条件 1. 只更新自动生成的错误码,即 Type 为 ErrorCodeTypeEnum.AUTO_GENERATION
  167 + if (!SysErrorCodeTypeEnum.AUTO_GENERATION.getType().equals(errorCodeDO.getType())) {
  168 + return;
  169 + }
  170 + // 条件 2. 分组 group 必须匹配,避免存在错误码冲突的情况
  171 + if (!autoGenerateDTO.getApplicationName().equals(errorCodeDO.getApplicationName())) {
  172 + log.error("[autoGenerateErrorCodes][自动创建({}/{}) 错误码失败,数据库中已经存在({}/{})]",
  173 + autoGenerateDTO.getCode(), autoGenerateDTO.getApplicationName(),
  174 + errorCodeDO.getCode(), errorCodeDO.getApplicationName());
  175 + return;
  176 + }
  177 + // 条件 3. 错误提示语存在差异
  178 + if (autoGenerateDTO.getMessage().equals(errorCodeDO.getMessage())) {
  179 + return;
  180 + }
  181 + // 最终匹配,进行更新
  182 + errorCodeMapper.updateById(new ErrorCodeDO().setId(errorCodeDO.getId()).setMessage(autoGenerateDTO.getMessage()));
  183 + });
192 } 184 }
193 185
194 - public CommonResult<List<ErrorCodeVO>> listErrorCodes1(String group, Date minUpdateTime) {  
195 - List<ErrorCodeDO> errorCodeDOs = errorCodeMapper.selectListByGroup(group, minUpdateTime);  
196 - return success(ErrorCodeConvert.INSTANCE.convertList(errorCodeDOs)); 186 + @Override
  187 + public List<ErrorCodeRespDTO> getErrorCodeList(String applicationName, Date minUpdateTime) {
  188 + List<ErrorCodeDO> errorCodeDOs = errorCodeMapper.selectListByApplicationNameAndUpdateTimeGt(
  189 + applicationName, minUpdateTime);
  190 + return SysErrorCodeConvert.INSTANCE.convertList02(errorCodeDOs);
197 } 191 }
198 192
199 } 193 }