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 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
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 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&lt;ErrorCodeDO&gt; {
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 }
... ...