Commit 06774a7a0b49f34dbf9fe38520347468a5670346
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 | 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 | 9 | import org.springframework.boot.context.properties.EnableConfigurationProperties; |
| 6 | 10 | import org.springframework.context.annotation.Bean; |
| 7 | 11 | import org.springframework.context.annotation.Configuration; |
| 8 | 12 | import org.springframework.scheduling.annotation.EnableScheduling; |
| 9 | 13 | |
| 14 | +/** | |
| 15 | + * 错误码配置类 | |
| 16 | + */ | |
| 10 | 17 | @Configuration |
| 11 | 18 | @EnableConfigurationProperties(ErrorCodeProperties.class) |
| 12 | 19 | @EnableScheduling // 开启调度任务的功能,因为 ErrorCodeRemoteLoader 通过定时刷新错误码 |
| 13 | 20 | public class ErrorCodeAutoConfiguration { |
| 14 | 21 | |
| 15 | 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 | 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 | 36 | \ No newline at end of file |
| 37 | +} | ... | ... |
src/main/java/cn/iocoder/dashboard/framework/errorcode/config/ErrorCodeProperties.java
| 1 | 1 | package cn.iocoder.dashboard.framework.errorcode.config; |
| 2 | 2 | |
| 3 | -import lombok.Getter; | |
| 4 | -import lombok.Setter; | |
| 3 | +import lombok.Data; | |
| 5 | 4 | import org.springframework.boot.context.properties.ConfigurationProperties; |
| 6 | 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 | 14 | @ConfigurationProperties("yudao.error-code") |
| 15 | +@Data | |
| 11 | 16 | @Validated |
| 12 | -@Getter | |
| 13 | -@Setter | |
| 14 | 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 | 23 | private String constantsClass; |
| 25 | -} | |
| 26 | 24 | \ No newline at end of file |
| 25 | + | |
| 26 | +} | ... | ... |
src/main/java/cn/iocoder/dashboard/framework/errorcode/core/ErrorCodeRemoteLoader.java deleted
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 | 3 | import lombok.Data; |
| 4 | 4 | import lombok.experimental.Accessors; |
| 5 | 5 | |
| 6 | 6 | import javax.validation.constraints.NotEmpty; |
| 7 | 7 | import javax.validation.constraints.NotNull; |
| 8 | -import java.io.Serializable; | |
| 9 | 8 | |
| 10 | 9 | /** |
| 11 | 10 | * 错误码自动生成 DTO |
| 11 | + * | |
| 12 | + * @author dylan | |
| 12 | 13 | */ |
| 13 | 14 | @Data |
| 14 | 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 | 26 | @NotNull(message = "错误码编码不能为空") |
| ... | ... | @@ -24,10 +30,5 @@ public class ErrorCodeAutoGenerateDTO implements Serializable { |
| 24 | 30 | */ |
| 25 | 31 | @NotEmpty(message = "错误码错误提示不能为空") |
| 26 | 32 | private String message; |
| 27 | - /** | |
| 28 | - * 错误码分组 | |
| 29 | - */ | |
| 30 | - @NotNull(message = "错误码分组不能为空") | |
| 31 | - private String group; | |
| 32 | 33 | |
| 33 | -} | |
| 34 | 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 | 6 | * @author dylan |
| 5 | 7 | */ |
| 6 | 8 | public interface ErrorCodeAutoGenerator { |
| ... | ... | @@ -9,4 +11,5 @@ public interface ErrorCodeAutoGenerator { |
| 9 | 11 | * 将配置类到错误码写入数据库 |
| 10 | 12 | */ |
| 11 | 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 | 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 | 6 | import lombok.RequiredArgsConstructor; |
| 8 | 7 | import lombok.extern.slf4j.Slf4j; |
| 9 | 8 | import org.springframework.boot.context.event.ApplicationReadyEvent; |
| ... | ... | @@ -11,11 +10,16 @@ import org.springframework.context.event.EventListener; |
| 11 | 10 | import org.springframework.scheduling.annotation.Async; |
| 12 | 11 | import org.springframework.util.StringUtils; |
| 13 | 12 | |
| 14 | -import javax.annotation.Resource; | |
| 15 | 13 | import java.util.ArrayList; |
| 16 | 14 | import java.util.Arrays; |
| 17 | 15 | import java.util.List; |
| 18 | 16 | |
| 17 | +/** | |
| 18 | + * ErrorCodeAutoGenerator 的实现类 | |
| 19 | + * 目的是,扫描指定的 {@link #errorCodeConstantsClass} 类,写入到 system 的数据库中 | |
| 20 | + * | |
| 21 | + * @author dylan | |
| 22 | + */ | |
| 19 | 23 | @RequiredArgsConstructor |
| 20 | 24 | @Slf4j |
| 21 | 25 | 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 | 40 | @Override |
| 41 | 41 | @EventListener(ApplicationReadyEvent.class) |
| 42 | 42 | @Async // 异步,保证项目的启动过程,毕竟非关键流程 |
| 43 | 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 | 65 | // 校验 errorCodeConstantsClass 参数 |
| 45 | 66 | if (!StringUtils.hasText(errorCodeConstantsClass)) { |
| 46 | 67 | log.info("[execute][未配置 yudao.error-code.constants-class 配置项,不进行自动写入到当前服务中]"); |
| 47 | - return; | |
| 68 | + return null; | |
| 48 | 69 | } |
| 49 | - Class errorCodeConstantsClazz; | |
| 50 | 70 | try { |
| 51 | - errorCodeConstantsClazz = Class.forName(errorCodeConstantsClass); | |
| 71 | + return Class.forName(errorCodeConstantsClass); | |
| 52 | 72 | } catch (ClassNotFoundException e) { |
| 53 | 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 | 85 | Arrays.stream(errorCodeConstantsClazz.getFields()).forEach(field -> { |
| 60 | 86 | if (field.getType() != ErrorCode.class) { |
| 61 | 87 | return; |
| 62 | 88 | } |
| 63 | 89 | try { |
| 64 | 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 | 93 | } catch (IllegalAccessException e) { |
| 68 | 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 | 2 | |
| 3 | 3 | import cn.iocoder.dashboard.common.pojo.CommonResult; |
| 4 | 4 | import cn.iocoder.dashboard.common.pojo.PageResult; |
| 5 | -import cn.iocoder.dashboard.modules.system.controller.errorcode.dto.ErrorCodeAutoGenerateDTO; | |
| 6 | 5 | import cn.iocoder.dashboard.modules.system.controller.errorcode.dto.ErrorCodeCreateDTO; |
| 7 | 6 | import cn.iocoder.dashboard.modules.system.controller.errorcode.dto.ErrorCodePageDTO; |
| 8 | 7 | import cn.iocoder.dashboard.modules.system.controller.errorcode.dto.ErrorCodeUpdateDTO; |
| 9 | 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 | 10 | import io.swagger.annotations.Api; |
| 12 | 11 | import io.swagger.annotations.ApiOperation; |
| 13 | -import org.springframework.beans.propertyeditors.CustomDateEditor; | |
| 14 | -import org.springframework.web.bind.ServletRequestDataBinder; | |
| 15 | 12 | import org.springframework.web.bind.annotation.*; |
| 16 | 13 | |
| 17 | 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 | 15 | import java.util.List; |
| 23 | 16 | |
| 24 | 17 | import static cn.iocoder.dashboard.common.pojo.CommonResult.success; |
| ... | ... | @@ -29,34 +22,7 @@ import static cn.iocoder.dashboard.common.pojo.CommonResult.success; |
| 29 | 22 | public class ErrorCodeController { |
| 30 | 23 | |
| 31 | 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 | 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 | 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 | 3 | import io.swagger.annotations.ApiModel; |
| 6 | 4 | import io.swagger.annotations.ApiModelProperty; |
| 7 | 5 | import lombok.Data; |
| 8 | -import lombok.experimental.Accessors; | |
| 9 | 6 | |
| 10 | 7 | import javax.validation.constraints.NotEmpty; |
| 11 | 8 | import javax.validation.constraints.NotNull; |
| 12 | -import java.io.Serializable; | |
| 13 | 9 | |
| 14 | 10 | @ApiModel("错误码更新 DTO") |
| 15 | 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 | 1 | package cn.iocoder.dashboard.modules.system.convert.errorcode; |
| 2 | 2 | |
| 3 | 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 | 6 | import cn.iocoder.dashboard.modules.system.controller.errorcode.dto.ErrorCodeCreateDTO; |
| 6 | 7 | import cn.iocoder.dashboard.modules.system.controller.errorcode.dto.ErrorCodeUpdateDTO; |
| 7 | 8 | import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.ErrorCodeVO; |
| ... | ... | @@ -14,13 +15,10 @@ import org.mapstruct.factory.Mappers; |
| 14 | 15 | |
| 15 | 16 | import java.util.List; |
| 16 | 17 | |
| 17 | -/** | |
| 18 | - * @author dylan | |
| 19 | - */ | |
| 20 | 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 | 23 | ErrorCodeVO convert (ErrorCodeDO bean); |
| 26 | 24 | |
| ... | ... | @@ -33,7 +31,8 @@ public interface ErrorCodeConvert { |
| 33 | 31 | |
| 34 | 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 | 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 | 6 | import com.baomidou.mybatisplus.annotation.TableName; |
| 6 | 7 | import lombok.Data; |
| 7 | 8 | import lombok.EqualsAndHashCode; |
| 8 | -import lombok.experimental.Accessors; | |
| 9 | +import lombok.ToString; | |
| 9 | 10 | |
| 11 | +@TableName(value = "sys_error_code") | |
| 10 | 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 | 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 | 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 | 15 | |
| 16 | 16 | @Mapper |
| 17 | 17 | public interface ErrorCodeMapper extends BaseMapper<ErrorCodeDO> { |
| 18 | + | |
| 18 | 19 | default IPage<ErrorCodeDO> selectPage(ErrorCodePageDTO pageDTO) { |
| 19 | 20 | return selectPage(new Page<>(pageDTO.getPageNo(), pageDTO.getPageSize()), |
| 20 | 21 | new QueryWrapperX<ErrorCodeDO>().likeIfPresent("`group`", pageDTO.getGroup()) |
| ... | ... | @@ -29,8 +30,9 @@ public interface ErrorCodeMapper extends BaseMapper<ErrorCodeDO> { |
| 29 | 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 | 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 | 1 | package cn.iocoder.dashboard.modules.system.enums.errorcode; |
| 2 | 2 | |
| 3 | 3 | import cn.iocoder.dashboard.common.core.IntArrayValuable; |
| 4 | +import lombok.AllArgsConstructor; | |
| 5 | +import lombok.Getter; | |
| 4 | 6 | |
| 5 | 7 | import java.util.Arrays; |
| 6 | 8 | |
| 7 | 9 | /** |
| 10 | + * 错误码的类型枚举 | |
| 11 | + * | |
| 8 | 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 | 24 | */ |
| 20 | 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 | 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 | 34 | @Override |
| 35 | 35 | public int[] array() { |
| 36 | 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 | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | 4 | import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil; |
| 5 | -import cn.iocoder.dashboard.common.pojo.CommonResult; | |
| 6 | 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 | 8 | import cn.iocoder.dashboard.modules.system.controller.errorcode.dto.ErrorCodeCreateDTO; |
| 9 | 9 | import cn.iocoder.dashboard.modules.system.controller.errorcode.dto.ErrorCodePageDTO; |
| 10 | 10 | import cn.iocoder.dashboard.modules.system.controller.errorcode.dto.ErrorCodeUpdateDTO; |
| 11 | 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 | 13 | import cn.iocoder.dashboard.modules.system.dal.dataobject.errorcode.ErrorCodeDO; |
| 14 | 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 | 17 | import com.baomidou.mybatisplus.core.metadata.IPage; |
| 18 | 18 | import lombok.extern.slf4j.Slf4j; |
| 19 | -import org.springframework.beans.factory.annotation.Autowired; | |
| 20 | 19 | import org.springframework.stereotype.Service; |
| 21 | 20 | import org.springframework.transaction.annotation.Transactional; |
| 22 | 21 | import org.springframework.validation.annotation.Validated; |
| 23 | 22 | |
| 24 | -import javax.validation.Valid; | |
| 23 | +import javax.annotation.Resource; | |
| 25 | 24 | import java.util.Date; |
| 26 | 25 | import java.util.List; |
| 27 | 26 | import java.util.Map; |
| 28 | 27 | |
| 29 | 28 | import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.ERROR_CODE_DUPLICATE; |
| 30 | 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 | 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 | 47 | * @param createDTO 创建错误码 DTO |
| 48 | 48 | * @return 错误码 |
| 49 | 49 | */ |
| 50 | - public ErrorCodeVO createErrorCode(@Valid ErrorCodeCreateDTO createDTO) { | |
| 50 | + public ErrorCodeVO createErrorCode(ErrorCodeCreateDTO createDTO) { | |
| 51 | 51 | checkDuplicateErrorCode(createDTO.getCode(), null); |
| 52 | 52 | // 插入到数据库 |
| 53 | - ErrorCodeDO errorCodeDO = ErrorCodeConvert.INSTANCE.convert(createDTO); | |
| 53 | + ErrorCodeDO errorCodeDO = SysErrorCodeConvert.INSTANCE.convert(createDTO); | |
| 54 | 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 | 61 | * |
| 62 | 62 | * @param updateDTO 更新错误码 DTO |
| 63 | 63 | */ |
| 64 | - public void updateErrorCode(@Valid ErrorCodeUpdateDTO updateDTO) { | |
| 64 | + public void updateErrorCode(ErrorCodeUpdateDTO updateDTO) { | |
| 65 | 65 | checkDuplicateErrorCode(updateDTO.getCode(), updateDTO.getId()); |
| 66 | 66 | // 校验更新的错误码是否存在 |
| 67 | 67 | if (errorCodeMapper.selectById(updateDTO.getId()) == null) { |
| 68 | 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 | 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 | 94 | */ |
| 140 | 95 | public ErrorCodeVO getErrorCode(Integer errorCodeId) { |
| 141 | 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 | 105 | */ |
| 151 | 106 | public List<ErrorCodeVO> listErrorCodes(List<Integer> errorCodeIds) { |
| 152 | 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 | 116 | */ |
| 162 | 117 | public PageResult<ErrorCodeVO> pageErrorCode(ErrorCodePageDTO pageDTO) { |
| 163 | 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 | 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 | } | ... | ... |