Commit 9c2243419b2974f27c99679bc1f29203a062490a

Authored by YunaiV
2 parents d4b1acb1 7d1946d9

Merge branch 'master-jdk17' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into develop

Showing 215 changed files with 1367 additions and 743 deletions
... ... @@ -32,7 +32,7 @@
32 32 <url>https://github.com/YunaiV/ruoyi-vue-pro</url>
33 33  
34 34 <properties>
35   - <revision>2.6.1-SNAPSHOT</revision>
  35 + <revision>2025.08-SNAPSHOT</revision>
36 36 <!-- Maven 相关 -->
37 37 <java.version>17</java.version>
38 38 <maven.compiler.source>${java.version}</maven.compiler.source>
... ...
yudao-dependencies/pom.xml
... ... @@ -14,7 +14,7 @@
14 14 <url>https://github.com/YunaiV/ruoyi-vue-pro</url>
15 15  
16 16 <properties>
17   - <revision>2.6.1-SNAPSHOT</revision>
  17 + <revision>2025.08-SNAPSHOT</revision>
18 18 <flatten-maven-plugin.version>1.6.0</flatten-maven-plugin.version>
19 19 <!-- 统一依赖管理 -->
20 20 <spring.boot.version>3.4.5</spring.boot.version>
... ... @@ -24,9 +24,9 @@
24 24 <!-- DB 相关 -->
25 25 <druid.version>1.2.24</druid.version>
26 26 <mybatis.version>3.5.19</mybatis.version>
27   - <mybatis-plus.version>3.5.10.1</mybatis-plus.version>
  27 + <mybatis-plus.version>3.5.12</mybatis-plus.version>
  28 + <mybatis-plus-join.version>1.5.4</mybatis-plus-join.version>
28 29 <dynamic-datasource.version>4.3.1</dynamic-datasource.version>
29   - <mybatis-plus-join.version>1.4.13</mybatis-plus-join.version>
30 30 <easy-trans.version>3.0.6</easy-trans.version>
31 31 <redisson.version>3.41.0</redisson.version>
32 32 <dm8.jdbc.version>8.1.3.140</dm8.jdbc.version>
... ... @@ -54,7 +54,7 @@
54 54 <mapstruct.version>1.6.3</mapstruct.version>
55 55 <hutool-5.version>5.8.35</hutool-5.version>
56 56 <hutool-6.version>6.0.0-M19</hutool-6.version>
57   - <easyexcel.version>4.0.3</easyexcel.version>
  57 + <fastexcel.version>1.2.0</fastexcel.version>
58 58 <velocity.version>2.4.1</velocity.version>
59 59 <fastjson.version>1.2.83</fastjson.version>
60 60 <guava.version>33.4.8-jre</guava.version>
... ... @@ -69,8 +69,6 @@
69 69 <pf4j-spring.version>0.9.0</pf4j-spring.version>
70 70 <vertx.version>4.5.13</vertx.version>
71 71 <!-- 三方云服务相关 -->
72   - <commons-io.version>2.17.0</commons-io.version>
73   - <commons-compress.version>1.27.1</commons-compress.version>
74 72 <awssdk.version>2.30.14</awssdk.version>
75 73 <justauth.version>1.16.7</justauth.version>
76 74 <justauth-starter.version>1.4.0</justauth-starter.version>
... ... @@ -480,20 +478,11 @@
480 478 </dependency>
481 479  
482 480 <dependency>
483   - <groupId>com.alibaba</groupId>
484   - <artifactId>easyexcel</artifactId>
485   - <version>${easyexcel.version}</version>
486   - </dependency>
487   - <dependency>
488   - <groupId>commons-io</groupId>
489   - <artifactId>commons-io</artifactId>
490   - <version>${commons-io.version}</version>
491   - </dependency>
492   - <dependency>
493   - <groupId>org.apache.commons</groupId>
494   - <artifactId>commons-compress</artifactId>
495   - <version>${commons-compress.version}</version>
  481 + <groupId>cn.idev.excel</groupId>
  482 + <artifactId>fastexcel</artifactId>
  483 + <version>${fastexcel.version}</version>
496 484 </dependency>
  485 +
497 486 <dependency>
498 487 <groupId>org.apache.tika</groupId>
499 488 <artifactId>tika-core</artifactId> <!-- 文件类型的识别 -->
... ...
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/pojo/CommonResult.java
... ... @@ -26,15 +26,15 @@ public class CommonResult&lt;T&gt; implements Serializable {
26 26 */
27 27 private Integer code;
28 28 /**
29   - * 返回数据
30   - */
31   - private T data;
32   - /**
33 29 * 错误提示,用户可阅读
34 30 *
35 31 * @see ErrorCode#getMsg() ()
36 32 */
37 33 private String msg;
  34 + /**
  35 + * 返回数据
  36 + */
  37 + private T data;
38 38  
39 39 /**
40 40 * 将传入的 result 对象,转换成另外一个泛型结果的对象
... ...
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/pojo/PageResult.java
... ... @@ -11,12 +11,12 @@ import java.util.List;
11 11 @Data
12 12 public final class PageResult<T> implements Serializable {
13 13  
14   - @Schema(description = "数据", requiredMode = Schema.RequiredMode.REQUIRED)
15   - private List<T> list;
16   -
17 14 @Schema(description = "总量", requiredMode = Schema.RequiredMode.REQUIRED)
18 15 private Long total;
19 16  
  17 + @Schema(description = "数据", requiredMode = Schema.RequiredMode.REQUIRED)
  18 + private List<T> list;
  19 +
20 20 public PageResult() {
21 21 }
22 22  
... ...
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/cache/CacheUtils.java
... ... @@ -15,6 +15,13 @@ import java.util.concurrent.Executors;
15 15 public class CacheUtils {
16 16  
17 17 /**
  18 + * 异步刷新的 LoadingCache 最大缓存数量
  19 + *
  20 + * @see <a href="">本地缓存 CacheUtils 工具类建议</a>
  21 + */
  22 + private static final Integer CACHE_MAX_SIZE = 10000;
  23 +
  24 + /**
18 25 * 构建异步刷新的 LoadingCache 对象
19 26 *
20 27 * 注意:如果你的缓存和 ThreadLocal 有关系,要么自己处理 ThreadLocal 的传递,要么使用 {@link #buildCache(Duration, CacheLoader)} 方法
... ... @@ -29,6 +36,7 @@ public class CacheUtils {
29 36 */
30 37 public static <K, V> LoadingCache<K, V> buildAsyncReloadingCache(Duration duration, CacheLoader<K, V> loader) {
31 38 return CacheBuilder.newBuilder()
  39 + .maximumSize(CACHE_MAX_SIZE)
32 40 // 只阻塞当前数据加载线程,其他线程返回旧值
33 41 .refreshAfterWrite(duration)
34 42 // 通过 asyncReloading 实现全异步加载,包括 refreshAfterWrite 被阻塞的加载线程
... ... @@ -43,7 +51,11 @@ public class CacheUtils {
43 51 * @return LoadingCache 对象
44 52 */
45 53 public static <K, V> LoadingCache<K, V> buildCache(Duration duration, CacheLoader<K, V> loader) {
46   - return CacheBuilder.newBuilder().refreshAfterWrite(duration).build(loader);
  54 + return CacheBuilder.newBuilder()
  55 + .maximumSize(CACHE_MAX_SIZE)
  56 + // 只阻塞当前数据加载线程,其他线程返回旧值
  57 + .refreshAfterWrite(duration)
  58 + .build(loader);
47 59 }
48 60  
49 61 }
... ...
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/DateUtils.java
... ... @@ -74,30 +74,30 @@ public class DateUtils {
74 74 * 创建指定时间
75 75 *
76 76 * @param year 年
77   - * @param mouth 月
  77 + * @param month 月
78 78 * @param day 日
79 79 * @return 指定时间
80 80 */
81   - public static Date buildTime(int year, int mouth, int day) {
82   - return buildTime(year, mouth, day, 0, 0, 0);
  81 + public static Date buildTime(int year, int month, int day) {
  82 + return buildTime(year, month, day, 0, 0, 0);
83 83 }
84 84  
85 85 /**
86 86 * 创建指定时间
87 87 *
88 88 * @param year 年
89   - * @param mouth 月
  89 + * @param month 月
90 90 * @param day 日
91 91 * @param hour 小时
92 92 * @param minute 分钟
93 93 * @param second 秒
94 94 * @return 指定时间
95 95 */
96   - public static Date buildTime(int year, int mouth, int day,
  96 + public static Date buildTime(int year, int month, int day,
97 97 int hour, int minute, int second) {
98 98 Calendar calendar = Calendar.getInstance();
99 99 calendar.set(Calendar.YEAR, year);
100   - calendar.set(Calendar.MONTH, mouth - 1);
  100 + calendar.set(Calendar.MONTH, month - 1);
101 101 calendar.set(Calendar.DAY_OF_MONTH, day);
102 102 calendar.set(Calendar.HOUR_OF_DAY, hour);
103 103 calendar.set(Calendar.MINUTE, minute);
... ...
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/LocalDateTimeUtils.java
... ... @@ -69,17 +69,17 @@ public class LocalDateTimeUtils {
69 69 * 创建指定时间
70 70 *
71 71 * @param year 年
72   - * @param mouth 月
  72 + * @param month 月
73 73 * @param day 日
74 74 * @return 指定时间
75 75 */
76   - public static LocalDateTime buildTime(int year, int mouth, int day) {
77   - return LocalDateTime.of(year, mouth, day, 0, 0, 0);
  76 + public static LocalDateTime buildTime(int year, int month, int day) {
  77 + return LocalDateTime.of(year, month, day, 0, 0, 0);
78 78 }
79 79  
80   - public static LocalDateTime[] buildBetweenTime(int year1, int mouth1, int day1,
81   - int year2, int mouth2, int day2) {
82   - return new LocalDateTime[]{buildTime(year1, mouth1, day1), buildTime(year2, mouth2, day2)};
  80 + public static LocalDateTime[] buildBetweenTime(int year1, int month1, int day1,
  81 + int year2, int month2, int day2) {
  82 + return new LocalDateTime[]{buildTime(year1, month1, day1), buildTime(year2, month2, day2)};
83 83 }
84 84  
85 85 /**
... ...
yudao-framework/yudao-spring-boot-starter-biz-data-permission/src/main/java/cn/iocoder/yudao/framework/datapermission/config/YudaoDeptDataPermissionAutoConfiguration.java
... ... @@ -18,7 +18,7 @@ import java.util.List;
18 18 */
19 19 @AutoConfiguration
20 20 @ConditionalOnClass(LoginUser.class)
21   -@ConditionalOnBean(value = {PermissionCommonApi.class, DeptDataPermissionRuleCustomizer.class})
  21 +@ConditionalOnBean(value = {DeptDataPermissionRuleCustomizer.class})
22 22 public class YudaoDeptDataPermissionAutoConfiguration {
23 23  
24 24 @Bean
... ...
yudao-framework/yudao-spring-boot-starter-excel/pom.xml
... ... @@ -42,18 +42,19 @@
42 42  
43 43 <!-- 工具类相关 -->
44 44 <dependency>
45   - <groupId>com.alibaba</groupId>
46   - <artifactId>easyexcel</artifactId>
  45 + <groupId>cn.idev.excel</groupId>
  46 + <artifactId>fastexcel</artifactId>
47 47 </dependency>
48 48  
49 49 <dependency>
50   - <groupId>com.google.guava</groupId>
51   - <artifactId>guava</artifactId>
  50 + <groupId>jakarta.validation</groupId>
  51 + <artifactId>jakarta.validation-api</artifactId>
  52 + <scope>provided</scope>
52 53 </dependency>
53 54  
54 55 <dependency>
55   - <groupId>org.apache.commons</groupId>
56   - <artifactId>commons-compress</artifactId> <!-- 解决 https://github.com/alibaba/easyexcel/issues/3954 问题 -->
  56 + <groupId>com.google.guava</groupId>
  57 + <artifactId>guava</artifactId>
57 58 </dependency>
58 59  
59 60 <dependency>
... ...
yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/dict/core/DictFrameworkUtils.java
... ... @@ -76,4 +76,9 @@ public class DictFrameworkUtils {
76 76 return dictData!= null ? dictData.getValue(): null;
77 77 }
78 78  
  79 + @SneakyThrows
  80 + public static List<String> getDictDataValueList(String dictType) {
  81 + List<DictDataRespDTO> dictDatas = GET_DICT_DATA_CACHE.get(dictType);
  82 + return convertList(dictDatas, DictDataRespDTO::getValue);
  83 + }
79 84 }
... ...
yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/dict/validation/InDict.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.dict.validation;
  2 +
  3 +import jakarta.validation.Constraint;
  4 +import jakarta.validation.Payload;
  5 +
  6 +import java.lang.annotation.Documented;
  7 +import java.lang.annotation.ElementType;
  8 +import java.lang.annotation.Retention;
  9 +import java.lang.annotation.RetentionPolicy;
  10 +import java.lang.annotation.Target;
  11 +
  12 +@Target({
  13 + ElementType.METHOD,
  14 + ElementType.FIELD,
  15 + ElementType.ANNOTATION_TYPE,
  16 + ElementType.CONSTRUCTOR,
  17 + ElementType.PARAMETER,
  18 + ElementType.TYPE_USE
  19 +})
  20 +@Retention(RetentionPolicy.RUNTIME)
  21 +@Documented
  22 +@Constraint(
  23 + validatedBy = {InDictValidator.class, InDictCollectionValidator.class}
  24 +)
  25 +public @interface InDict {
  26 +
  27 + /**
  28 + * 数据字典 type
  29 + */
  30 + String type();
  31 +
  32 + String message() default "必须在指定范围 {value}";
  33 +
  34 + Class<?>[] groups() default {};
  35 +
  36 + Class<? extends Payload>[] payload() default {};
  37 +
  38 +}
... ...
yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/dict/validation/InDictCollectionValidator.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.dict.validation;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.iocoder.yudao.framework.dict.core.DictFrameworkUtils;
  5 +import jakarta.validation.ConstraintValidator;
  6 +import jakarta.validation.ConstraintValidatorContext;
  7 +
  8 +import java.util.Collection;
  9 +import java.util.List;
  10 +
  11 +public class InDictCollectionValidator implements ConstraintValidator<InDict, Collection<?>> {
  12 +
  13 + private String dictType;
  14 +
  15 + @Override
  16 + public void initialize(InDict annotation) {
  17 + this.dictType = annotation.type();
  18 + }
  19 +
  20 + @Override
  21 + public boolean isValid(Collection<?> list, ConstraintValidatorContext context) {
  22 + // 为空时,默认不校验,即认为通过
  23 + if (CollUtil.isEmpty(list)) {
  24 + return true;
  25 + }
  26 + // 校验全部通过
  27 + List<String> dbValues = DictFrameworkUtils.getDictDataValueList(dictType);
  28 + boolean match = list.stream().allMatch(v -> dbValues.stream()
  29 + .anyMatch(dbValue -> dbValue.equalsIgnoreCase(v.toString())));
  30 + if (match) {
  31 + return true;
  32 + }
  33 +
  34 + // 校验不通过,自定义提示语句
  35 + context.disableDefaultConstraintViolation(); // 禁用默认的 message 的值
  36 + context.buildConstraintViolationWithTemplate(
  37 + context.getDefaultConstraintMessageTemplate().replaceAll("\\{value}", dbValues.toString())
  38 + ).addConstraintViolation(); // 重新添加错误提示语句
  39 + return false;
  40 + }
  41 +
  42 +}
  43 +
... ...
yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/dict/validation/InDictValidator.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.dict.validation;
  2 +
  3 +import cn.hutool.core.util.StrUtil;
  4 +import cn.iocoder.yudao.framework.dict.core.DictFrameworkUtils;
  5 +import jakarta.validation.ConstraintValidator;
  6 +import jakarta.validation.ConstraintValidatorContext;
  7 +
  8 +import java.util.List;
  9 +
  10 +public class InDictValidator implements ConstraintValidator<InDict, Object> {
  11 +
  12 + private String dictType;
  13 +
  14 + @Override
  15 + public void initialize(InDict annotation) {
  16 + this.dictType = annotation.type();
  17 + }
  18 +
  19 + @Override
  20 + public boolean isValid(Object value, ConstraintValidatorContext context) {
  21 + // 为空时,默认不校验,即认为通过
  22 + if (value == null) {
  23 + return true;
  24 + }
  25 + // 校验通过
  26 + final List<String> values = DictFrameworkUtils.getDictDataValueList(dictType);
  27 + boolean match = values.stream().anyMatch(v -> StrUtil.equalsIgnoreCase(v, value.toString()));
  28 + if (match) {
  29 + return true;
  30 + }
  31 +
  32 + // 校验不通过,自定义提示语句
  33 + context.disableDefaultConstraintViolation(); // 禁用默认的 message 的值
  34 + context.buildConstraintViolationWithTemplate(
  35 + context.getDefaultConstraintMessageTemplate().replaceAll("\\{value}", values.toString())
  36 + ).addConstraintViolation(); // 重新添加错误提示语句
  37 + return false;
  38 + }
  39 +
  40 +}
  41 +
... ...
yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/convert/AreaConvert.java
... ... @@ -3,11 +3,11 @@ package cn.iocoder.yudao.framework.excel.core.convert;
3 3 import cn.hutool.core.convert.Convert;
4 4 import cn.iocoder.yudao.framework.ip.core.Area;
5 5 import cn.iocoder.yudao.framework.ip.core.utils.AreaUtils;
6   -import com.alibaba.excel.converters.Converter;
7   -import com.alibaba.excel.enums.CellDataTypeEnum;
8   -import com.alibaba.excel.metadata.GlobalConfiguration;
9   -import com.alibaba.excel.metadata.data.ReadCellData;
10   -import com.alibaba.excel.metadata.property.ExcelContentProperty;
  6 +import cn.idev.excel.converters.Converter;
  7 +import cn.idev.excel.enums.CellDataTypeEnum;
  8 +import cn.idev.excel.metadata.GlobalConfiguration;
  9 +import cn.idev.excel.metadata.data.ReadCellData;
  10 +import cn.idev.excel.metadata.property.ExcelContentProperty;
11 11 import lombok.extern.slf4j.Slf4j;
12 12  
13 13 /**
... ...
yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/convert/DictConvert.java
... ... @@ -3,12 +3,12 @@ package cn.iocoder.yudao.framework.excel.core.convert;
3 3 import cn.hutool.core.convert.Convert;
4 4 import cn.iocoder.yudao.framework.dict.core.DictFrameworkUtils;
5 5 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
6   -import com.alibaba.excel.converters.Converter;
7   -import com.alibaba.excel.enums.CellDataTypeEnum;
8   -import com.alibaba.excel.metadata.GlobalConfiguration;
9   -import com.alibaba.excel.metadata.data.ReadCellData;
10   -import com.alibaba.excel.metadata.data.WriteCellData;
11   -import com.alibaba.excel.metadata.property.ExcelContentProperty;
  6 +import cn.idev.excel.converters.Converter;
  7 +import cn.idev.excel.enums.CellDataTypeEnum;
  8 +import cn.idev.excel.metadata.GlobalConfiguration;
  9 +import cn.idev.excel.metadata.data.ReadCellData;
  10 +import cn.idev.excel.metadata.data.WriteCellData;
  11 +import cn.idev.excel.metadata.property.ExcelContentProperty;
12 12 import lombok.extern.slf4j.Slf4j;
13 13  
14 14 /**
... ...
yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/convert/JsonConvert.java
1 1 package cn.iocoder.yudao.framework.excel.core.convert;
2 2  
3 3 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
4   -import com.alibaba.excel.converters.Converter;
5   -import com.alibaba.excel.enums.CellDataTypeEnum;
6   -import com.alibaba.excel.metadata.GlobalConfiguration;
7   -import com.alibaba.excel.metadata.data.WriteCellData;
8   -import com.alibaba.excel.metadata.property.ExcelContentProperty;
  4 +import cn.idev.excel.converters.Converter;
  5 +import cn.idev.excel.enums.CellDataTypeEnum;
  6 +import cn.idev.excel.metadata.GlobalConfiguration;
  7 +import cn.idev.excel.metadata.data.WriteCellData;
  8 +import cn.idev.excel.metadata.property.ExcelContentProperty;
9 9  
10 10 /**
11 11 * Excel Json 转换器
... ...
yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/convert/MoneyConvert.java
1 1 package cn.iocoder.yudao.framework.excel.core.convert;
2 2  
3   -import com.alibaba.excel.converters.Converter;
4   -import com.alibaba.excel.enums.CellDataTypeEnum;
5   -import com.alibaba.excel.metadata.GlobalConfiguration;
6   -import com.alibaba.excel.metadata.data.WriteCellData;
7   -import com.alibaba.excel.metadata.property.ExcelContentProperty;
  3 +import cn.idev.excel.converters.Converter;
  4 +import cn.idev.excel.enums.CellDataTypeEnum;
  5 +import cn.idev.excel.metadata.GlobalConfiguration;
  6 +import cn.idev.excel.metadata.data.WriteCellData;
  7 +import cn.idev.excel.metadata.property.ExcelContentProperty;
8 8  
9 9 import java.math.BigDecimal;
10 10 import java.math.RoundingMode;
... ...
yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/handler/ColumnWidthMatchStyleStrategy.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.excel.core.handler;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.idev.excel.enums.CellDataTypeEnum;
  5 +import cn.idev.excel.metadata.Head;
  6 +import cn.idev.excel.metadata.data.WriteCellData;
  7 +import cn.idev.excel.util.MapUtils;
  8 +import cn.idev.excel.write.metadata.holder.WriteSheetHolder;
  9 +import cn.idev.excel.write.style.column.AbstractColumnWidthStyleStrategy;
  10 +import cn.idev.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
  11 +import org.apache.poi.ss.usermodel.Cell;
  12 +
  13 +import java.util.HashMap;
  14 +import java.util.List;
  15 +import java.util.Map;
  16 +
  17 +/**
  18 + * Excel 自适应列宽处理器
  19 + *
  20 + * 相比 {@link LongestMatchColumnWidthStyleStrategy} 来说,额外处理了 DATE 类型!
  21 + *
  22 + * @see <a href="https://github.com/YunaiV/yudao-cloud/pull/196/">添加自适应列宽处理器,并替换默认列宽策略</a>
  23 + * @author hmb
  24 + */
  25 +public class ColumnWidthMatchStyleStrategy extends AbstractColumnWidthStyleStrategy {
  26 +
  27 + private static final int MAX_COLUMN_WIDTH = 255;
  28 +
  29 + private final Map<Integer, Map<Integer, Integer>> cache = MapUtils.newHashMapWithExpectedSize(8);
  30 +
  31 + @Override
  32 + protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<WriteCellData<?>> cellDataList, Cell cell,
  33 + Head head, Integer relativeRowIndex, Boolean isHead) {
  34 + boolean needSetWidth = isHead || CollUtil.isNotEmpty(cellDataList);
  35 + if (!needSetWidth) {
  36 + return;
  37 + }
  38 + Map<Integer, Integer> maxColumnWidthMap = cache.computeIfAbsent(writeSheetHolder.getSheetNo(),
  39 + key -> new HashMap<>(16));
  40 + Integer columnWidth = dataLength(cellDataList, cell, isHead);
  41 + if (columnWidth < 0) {
  42 + return;
  43 + }
  44 + if (columnWidth > MAX_COLUMN_WIDTH) {
  45 + columnWidth = MAX_COLUMN_WIDTH;
  46 + }
  47 + Integer maxColumnWidth = maxColumnWidthMap.get(cell.getColumnIndex());
  48 + if (maxColumnWidth == null || columnWidth > maxColumnWidth) {
  49 + maxColumnWidthMap.put(cell.getColumnIndex(), columnWidth);
  50 + writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), columnWidth * 256);
  51 + }
  52 + }
  53 +
  54 + @SuppressWarnings("EnhancedSwitchMigration")
  55 + private Integer dataLength(List<WriteCellData<?>> cellDataList, Cell cell, Boolean isHead) {
  56 + if (isHead) {
  57 + return cell.getStringCellValue().getBytes().length;
  58 + }
  59 + WriteCellData<?> cellData = cellDataList.get(0);
  60 + CellDataTypeEnum type = cellData.getType();
  61 + if (type == null) {
  62 + return -1;
  63 + }
  64 + switch (type) {
  65 + case STRING:
  66 + return cellData.getStringValue().getBytes().length;
  67 + case BOOLEAN:
  68 + return cellData.getBooleanValue().toString().getBytes().length;
  69 + case NUMBER:
  70 + return cellData.getNumberValue().toString().getBytes().length;
  71 + case DATE:
  72 + return cellData.getDateValue().toString().getBytes().length;
  73 + default:
  74 + return -1;
  75 + }
  76 + }
  77 +
  78 +}
0 79 \ No newline at end of file
... ...
yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/handler/SelectSheetWriteHandler.java
... ... @@ -3,7 +3,6 @@ package cn.iocoder.yudao.framework.excel.core.handler;
3 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.hutool.core.lang.Assert;
5 5 import cn.hutool.core.util.ObjectUtil;
6   -import cn.hutool.core.util.ReflectUtil;
7 6 import cn.hutool.core.util.StrUtil;
8 7 import cn.hutool.extra.spring.SpringUtil;
9 8 import cn.hutool.poi.excel.ExcelUtil;
... ... @@ -11,12 +10,12 @@ import cn.iocoder.yudao.framework.common.core.KeyValue;
11 10 import cn.iocoder.yudao.framework.dict.core.DictFrameworkUtils;
12 11 import cn.iocoder.yudao.framework.excel.core.annotations.ExcelColumnSelect;
13 12 import cn.iocoder.yudao.framework.excel.core.function.ExcelColumnSelectFunction;
14   -import com.alibaba.excel.annotation.ExcelIgnore;
15   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
16   -import com.alibaba.excel.annotation.ExcelProperty;
17   -import com.alibaba.excel.write.handler.SheetWriteHandler;
18   -import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
19   -import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
  13 +import cn.idev.excel.annotation.ExcelIgnore;
  14 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  15 +import cn.idev.excel.annotation.ExcelProperty;
  16 +import cn.idev.excel.write.handler.SheetWriteHandler;
  17 +import cn.idev.excel.write.metadata.holder.WriteSheetHolder;
  18 +import cn.idev.excel.write.metadata.holder.WriteWorkbookHolder;
20 19 import lombok.extern.slf4j.Slf4j;
21 20 import org.apache.poi.hssf.usermodel.HSSFDataValidation;
22 21 import org.apache.poi.ss.usermodel.*;
... ... @@ -87,7 +86,7 @@ public class SelectSheetWriteHandler implements SheetWriteHandler {
87 86  
88 87 /**
89 88 * 判断字段是否是静态的、最终的、 transient 的
90   - * 原因:EasyExcel 默认是忽略 static final 或 transient 的字段,所以需要判断
  89 + * 原因:FastExcel 默认是忽略 static final 或 transient 的字段,所以需要判断
91 90 *
92 91 * @param field 字段
93 92 * @return 是否是静态的、最终的、transient 的
... ... @@ -185,4 +184,4 @@ public class SelectSheetWriteHandler implements SheetWriteHandler {
185 184 writeSheetHolder.getSheet().addValidationData(validation);
186 185 }
187 186  
188   -}
189 187 \ No newline at end of file
  188 +}
... ...
yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/ExcelUtils.java
1 1 package cn.iocoder.yudao.framework.excel.core.util;
2 2  
  3 +import cn.idev.excel.FastExcelFactory;
  4 +import cn.idev.excel.converters.longconverter.LongStringConverter;
3 5 import cn.iocoder.yudao.framework.common.util.http.HttpUtils;
  6 +import cn.iocoder.yudao.framework.excel.core.handler.ColumnWidthMatchStyleStrategy;
4 7 import cn.iocoder.yudao.framework.excel.core.handler.SelectSheetWriteHandler;
5   -import com.alibaba.excel.EasyExcel;
6   -import com.alibaba.excel.converters.longconverter.LongStringConverter;
7   -import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
8 8 import jakarta.servlet.http.HttpServletResponse;
9 9 import org.springframework.web.multipart.MultipartFile;
10 10  
... ... @@ -32,9 +32,9 @@ public class ExcelUtils {
32 32 public static <T> void write(HttpServletResponse response, String filename, String sheetName,
33 33 Class<T> head, List<T> data) throws IOException {
34 34 // 输出 Excel
35   - EasyExcel.write(response.getOutputStream(), head)
  35 + FastExcelFactory.write(response.getOutputStream(), head)
36 36 .autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理
37   - .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 基于 column 长度,自动适配。最大 255 宽度
  37 + .registerWriteHandler(new ColumnWidthMatchStyleStrategy()) // 基于 column 长度,自动适配。最大 255 宽度
38 38 .registerWriteHandler(new SelectSheetWriteHandler(head)) // 基于固定 sheet 实现下拉框
39 39 .registerConverter(new LongStringConverter()) // 避免 Long 类型丢失精度
40 40 .sheet(sheetName).doWrite(data);
... ... @@ -44,7 +44,7 @@ public class ExcelUtils {
44 44 }
45 45  
46 46 public static <T> List<T> read(MultipartFile file, Class<T> head) throws IOException {
47   - return EasyExcel.read(file.getInputStream(), head, null)
  47 + return FastExcelFactory.read(file.getInputStream(), head, null)
48 48 .autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理
49 49 .doReadAllSync();
50 50 }
... ...
yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/package-info.java
1 1 /**
2   - * 基于 EasyExcel 实现 Excel 相关的操作
  2 + * 基于 FastExcel 实现 Excel 相关的操作
3 3 */
4 4 package cn.iocoder.yudao.framework.excel;
... ...
yudao-framework/yudao-spring-boot-starter-monitor/pom.xml
... ... @@ -44,29 +44,35 @@
44 44 <dependency>
45 45 <groupId>io.opentracing</groupId>
46 46 <artifactId>opentracing-util</artifactId>
  47 + <optional>true</optional>
47 48 </dependency>
48 49 <dependency>
49 50 <groupId>org.apache.skywalking</groupId>
50 51 <artifactId>apm-toolkit-trace</artifactId>
  52 + <optional>true</optional>
51 53 </dependency>
52 54 <dependency>
53 55 <groupId>org.apache.skywalking</groupId>
54 56 <artifactId>apm-toolkit-logback-1.x</artifactId>
  57 + <optional>true</optional>
55 58 </dependency>
56 59 <dependency>
57 60 <groupId>org.apache.skywalking</groupId>
58 61 <artifactId>apm-toolkit-opentracing</artifactId>
  62 + <optional>true</optional>
59 63 </dependency>
60 64  
61 65 <!-- Micrometer 对 Prometheus 的支持 -->
62 66 <dependency>
63 67 <groupId>io.micrometer</groupId>
64 68 <artifactId>micrometer-registry-prometheus</artifactId>
  69 + <optional>true</optional>
65 70 </dependency>
66 71  
67 72 <dependency>
68 73 <groupId>de.codecentric</groupId>
69   - <artifactId>spring-boot-admin-starter-client</artifactId> <!-- 实现 Spring Boot Admin Server 服务端 -->
  74 + <artifactId>spring-boot-admin-starter-client</artifactId> <!-- 实现 Spring Boot Admin Client 客户端 -->
  75 + <optional>true</optional>
70 76 </dependency>
71 77 </dependencies>
72 78  
... ...
yudao-framework/yudao-spring-boot-starter-monitor/src/main/java/cn/iocoder/yudao/framework/tracer/config/YudaoTracerAutoConfiguration.java
... ... @@ -3,6 +3,9 @@ package cn.iocoder.yudao.framework.tracer.config;
3 3 import cn.iocoder.yudao.framework.common.enums.WebFilterOrderEnum;
4 4 import cn.iocoder.yudao.framework.tracer.core.aop.BizTraceAspect;
5 5 import cn.iocoder.yudao.framework.tracer.core.filter.TraceFilter;
  6 +import io.opentracing.Tracer;
  7 +import io.opentracing.util.GlobalTracer;
  8 +import org.apache.skywalking.apm.toolkit.opentracing.SkywalkingTracer;
6 9 import org.springframework.boot.autoconfigure.AutoConfiguration;
7 10 import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
8 11 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
... ... @@ -16,30 +19,32 @@ import org.springframework.context.annotation.Bean;
16 19 * @author mashu
17 20 */
18 21 @AutoConfiguration
19   -@ConditionalOnClass({BizTraceAspect.class})
  22 +@ConditionalOnClass(name = {
  23 + "org.apache.skywalking.apm.toolkit.opentracing.SkywalkingTracer",
  24 + "io.opentracing.Tracer"
  25 +})
20 26 @EnableConfigurationProperties(TracerProperties.class)
21 27 @ConditionalOnProperty(prefix = "yudao.tracer", value = "enable", matchIfMissing = true)
22 28 public class YudaoTracerAutoConfiguration {
23 29  
24   - // TODO @芋艿:重要。目前 opentracing 版本存在冲突,要么保证 skywalking,要么保证阿里云短信 sdk
25   -// @Bean
26   -// public TracerProperties bizTracerProperties() {
27   -// return new TracerProperties();
28   -// }
29   -//
30   -// @Bean
31   -// public BizTraceAspect bizTracingAop() {
32   -// return new BizTraceAspect(tracer());
33   -// }
34   -//
35   -// @Bean
36   -// public Tracer tracer() {
37   -// // 创建 SkywalkingTracer 对象
38   -// SkywalkingTracer tracer = new SkywalkingTracer();
39   -// // 设置为 GlobalTracer 的追踪器
40   -// GlobalTracer.register(tracer);
41   -// return tracer;
42   -// }
  30 + @Bean
  31 + public TracerProperties bizTracerProperties() {
  32 + return new TracerProperties();
  33 + }
  34 +
  35 + @Bean
  36 + public BizTraceAspect bizTracingAop() {
  37 + return new BizTraceAspect(tracer());
  38 + }
  39 +
  40 + @Bean
  41 + public Tracer tracer() {
  42 + // 创建 SkywalkingTracer 对象
  43 + SkywalkingTracer tracer = new SkywalkingTracer();
  44 + // 设置为 GlobalTracer 的追踪器
  45 + GlobalTracer.registerIfAbsent(tracer);
  46 + return tracer;
  47 + }
43 48  
44 49 /**
45 50 * 创建 TraceFilter 过滤器,响应 header 设置 traceId
... ...
yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/query/MPJLambdaWrapperX.java
... ... @@ -118,7 +118,6 @@ public class MPJLambdaWrapperX&lt;T&gt; extends MPJLambdaWrapper&lt;T&gt; {
118 118  
119 119 @Override
120 120 public <X> MPJLambdaWrapperX<T> orderByDesc(SFunction<X, ?> column) {
121   - //noinspection unchecked
122 121 super.orderByDesc(true, column);
123 122 return this;
124 123 }
... ... @@ -208,7 +207,7 @@ public class MPJLambdaWrapperX&lt;T&gt; extends MPJLambdaWrapper&lt;T&gt; {
208 207 }
209 208  
210 209 @Override
211   - public <S, X> MPJLambdaWrapperX<T> selectCount(SFunction<S, ?> column, String alias) {
  210 + public <S> MPJLambdaWrapperX<T> selectCount(SFunction<S, ?> column, String alias) {
212 211 super.selectCount(column, alias);
213 212 return this;
214 213 }
... ... @@ -226,7 +225,7 @@ public class MPJLambdaWrapperX&lt;T&gt; extends MPJLambdaWrapper&lt;T&gt; {
226 225 }
227 226  
228 227 @Override
229   - public <S, X> MPJLambdaWrapperX<T> selectSum(SFunction<S, ?> column, String alias) {
  228 + public <S> MPJLambdaWrapperX<T> selectSum(SFunction<S, ?> column, String alias) {
230 229 super.selectSum(column, alias);
231 230 return this;
232 231 }
... ... @@ -244,7 +243,7 @@ public class MPJLambdaWrapperX&lt;T&gt; extends MPJLambdaWrapper&lt;T&gt; {
244 243 }
245 244  
246 245 @Override
247   - public <S, X> MPJLambdaWrapperX<T> selectMax(SFunction<S, ?> column, String alias) {
  246 + public <S> MPJLambdaWrapperX<T> selectMax(SFunction<S, ?> column, String alias) {
248 247 super.selectMax(column, alias);
249 248 return this;
250 249 }
... ... @@ -262,7 +261,7 @@ public class MPJLambdaWrapperX&lt;T&gt; extends MPJLambdaWrapper&lt;T&gt; {
262 261 }
263 262  
264 263 @Override
265   - public <S, X> MPJLambdaWrapperX<T> selectMin(SFunction<S, ?> column, String alias) {
  264 + public <S> MPJLambdaWrapperX<T> selectMin(SFunction<S, ?> column, String alias) {
266 265 super.selectMin(column, alias);
267 266 return this;
268 267 }
... ... @@ -280,7 +279,7 @@ public class MPJLambdaWrapperX&lt;T&gt; extends MPJLambdaWrapper&lt;T&gt; {
280 279 }
281 280  
282 281 @Override
283   - public <S, X> MPJLambdaWrapperX<T> selectAvg(SFunction<S, ?> column, String alias) {
  282 + public <S> MPJLambdaWrapperX<T> selectAvg(SFunction<S, ?> column, String alias) {
284 283 super.selectAvg(column, alias);
285 284 return this;
286 285 }
... ... @@ -298,7 +297,7 @@ public class MPJLambdaWrapperX&lt;T&gt; extends MPJLambdaWrapper&lt;T&gt; {
298 297 }
299 298  
300 299 @Override
301   - public <S, X> MPJLambdaWrapperX<T> selectLen(SFunction<S, ?> column, String alias) {
  300 + public <S> MPJLambdaWrapperX<T> selectLen(SFunction<S, ?> column, String alias) {
302 301 super.selectLen(column, alias);
303 302 return this;
304 303 }
... ...
yudao-framework/yudao-spring-boot-starter-web/pom.xml
... ... @@ -53,7 +53,13 @@
53 53 <scope>provided</scope> <!-- 设置为 provided,主要是 GlobalExceptionHandler 使用 -->
54 54 </dependency>
55 55  
56   - <!-- xss -->
  56 + <!-- 工具类相关 -->
  57 + <dependency>
  58 + <groupId>com.google.guava</groupId>
  59 + <artifactId>guava</artifactId>
  60 + <scope>provided</scope> <!-- 设置为 provided,只有工具类需要使用到 -->
  61 + </dependency>
  62 +
57 63 <dependency>
58 64 <groupId>org.jsoup</groupId>
59 65 <artifactId>jsoup</artifactId>
... ...
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/filter/CacheRequestBodyFilter.java
1 1 package cn.iocoder.yudao.framework.web.core.filter;
2 2  
  3 +import cn.hutool.core.util.StrUtil;
3 4 import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
4 5 import org.springframework.web.filter.OncePerRequestFilter;
5 6  
... ... @@ -16,6 +17,14 @@ import java.io.IOException;
16 17 */
17 18 public class CacheRequestBodyFilter extends OncePerRequestFilter {
18 19  
  20 + /**
  21 + * 需要排除的 URI
  22 + *
  23 + * 1. 排除 Spring Boot Admin 相关请求,避免客户端连接中断导致的异常。
  24 + * 例如说:<a href="https://github.com/YunaiV/ruoyi-vue-pro/issues/795">795 ISSUE</a>
  25 + */
  26 + private static final String[] IGNORE_URIS = {"/admin/", "/actuator/"};
  27 +
19 28 @Override
20 29 protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
21 30 throws IOException, ServletException {
... ... @@ -24,7 +33,13 @@ public class CacheRequestBodyFilter extends OncePerRequestFilter {
24 33  
25 34 @Override
26 35 protected boolean shouldNotFilter(HttpServletRequest request) {
27   - // 只处理 json 请求内容
  36 + // 1. 校验是否为排除的 URL
  37 + String requestURI = request.getRequestURI();
  38 + if (StrUtil.startWithAny(requestURI, IGNORE_URIS)) {
  39 + return true;
  40 + }
  41 +
  42 + // 2. 只处理 json 请求内容
28 43 return !ServletUtils.isJsonRequest(request);
29 44 }
30 45  
... ...
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/handler/GlobalExceptionHandler.java
... ... @@ -5,7 +5,6 @@ import cn.hutool.core.exceptions.ExceptionUtil;
5 5 import cn.hutool.core.map.MapUtil;
6 6 import cn.hutool.core.util.ObjUtil;
7 7 import cn.hutool.core.util.StrUtil;
8   -import cn.hutool.extra.servlet.JakartaServletUtil;
9 8 import cn.iocoder.yudao.framework.common.biz.infra.logger.ApiErrorLogCommonApi;
10 9 import cn.iocoder.yudao.framework.common.biz.infra.logger.dto.ApiErrorLogCreateReqDTO;
11 10 import cn.iocoder.yudao.framework.common.exception.ServiceException;
... ... @@ -17,6 +16,7 @@ import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils;
17 16 import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
18 17 import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
19 18 import com.fasterxml.jackson.databind.exc.InvalidFormatException;
  19 +import com.google.common.util.concurrent.UncheckedExecutionException;
20 20 import jakarta.servlet.http.HttpServletRequest;
21 21 import jakarta.validation.ConstraintViolation;
22 22 import jakarta.validation.ConstraintViolationException;
... ... @@ -111,6 +111,9 @@ public class GlobalExceptionHandler {
111 111 if (ex instanceof AccessDeniedException) {
112 112 return accessDeniedExceptionHandler(request, (AccessDeniedException) ex);
113 113 }
  114 + if (ex instanceof UncheckedExecutionException && ex.getCause() != ex) {
  115 + return allExceptionHandler(request, ex.getCause());
  116 + }
114 117 return defaultExceptionHandler(request, ex);
115 118 }
116 119  
... ... @@ -267,6 +270,16 @@ public class GlobalExceptionHandler {
267 270 }
268 271  
269 272 /**
  273 + * 处理 Guava UncheckedExecutionException
  274 + *
  275 + * 例如说,缓存加载报错,可见 <a href="https://t.zsxq.com/UszdH">https://t.zsxq.com/UszdH</a>
  276 + */
  277 + @ExceptionHandler(value = UncheckedExecutionException.class)
  278 + public CommonResult<?> uncheckedExecutionExceptionHandler(HttpServletRequest req, UncheckedExecutionException ex) {
  279 + return allExceptionHandler(req, ex.getCause());
  280 + }
  281 +
  282 + /**
270 283 * 处理业务异常 ServiceException
271 284 *
272 285 * 例如说,商品库存不足,用户手机号已存在。
... ... @@ -344,12 +357,12 @@ public class GlobalExceptionHandler {
344 357 errorLog.setApplicationName(applicationName);
345 358 errorLog.setRequestUrl(request.getRequestURI());
346 359 Map<String, Object> requestParams = MapUtil.<String, Object>builder()
347   - .put("query", JakartaServletUtil.getParamMap(request))
348   - .put("body", JakartaServletUtil.getBody(request)).build();
  360 + .put("query", ServletUtils.getParamMap(request))
  361 + .put("body", ServletUtils.getBody(request)).build();
349 362 errorLog.setRequestParams(JsonUtils.toJsonString(requestParams));
350 363 errorLog.setRequestMethod(request.getMethod());
351 364 errorLog.setUserAgent(ServletUtils.getUserAgent(request));
352   - errorLog.setUserIp(JakartaServletUtil.getClientIP(request));
  365 + errorLog.setUserIp(ServletUtils.getClientIP(request));
353 366 errorLog.setExceptionTime(LocalDateTime.now());
354 367 }
355 368  
... ...
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/xss/config/YudaoXssAutoConfiguration.java
... ... @@ -5,7 +5,6 @@ import cn.iocoder.yudao.framework.xss.core.clean.JsoupXssCleaner;
5 5 import cn.iocoder.yudao.framework.xss.core.clean.XssCleaner;
6 6 import cn.iocoder.yudao.framework.xss.core.filter.XssFilter;
7 7 import cn.iocoder.yudao.framework.xss.core.json.XssStringJsonDeserializer;
8   -import com.fasterxml.jackson.databind.ObjectMapper;
9 8 import org.springframework.boot.autoconfigure.AutoConfiguration;
10 9 import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
11 10 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
... ... @@ -42,13 +41,13 @@ public class YudaoXssAutoConfiguration implements WebMvcConfigurer {
42 41 */
43 42 @Bean
44 43 @ConditionalOnMissingBean(name = "xssJacksonCustomizer")
45   - @ConditionalOnBean(ObjectMapper.class)
46 44 @ConditionalOnProperty(value = "yudao.xss.enable", havingValue = "true")
47 45 public Jackson2ObjectMapperBuilderCustomizer xssJacksonCustomizer(XssProperties properties,
48 46 PathMatcher pathMatcher,
49 47 XssCleaner xssCleaner) {
50 48 // 在反序列化时进行 xss 过滤,可以替换使用 XssStringJsonSerializer,在序列化时进行处理
51   - return builder -> builder.deserializerByType(String.class, new XssStringJsonDeserializer(properties, pathMatcher, xssCleaner));
  49 + return builder ->
  50 + builder.deserializerByType(String.class, new XssStringJsonDeserializer(properties, pathMatcher, xssCleaner));
52 51 }
53 52  
54 53 /**
... ...
yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/AiChatConversationController.java
... ... @@ -12,6 +12,7 @@ import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatCo
12 12 import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatConversationDO;
13 13 import cn.iocoder.yudao.module.ai.service.chat.AiChatConversationService;
14 14 import cn.iocoder.yudao.module.ai.service.chat.AiChatMessageService;
  15 +import com.fhs.core.trans.anno.TransMethodResult;
15 16 import io.swagger.v3.oas.annotations.Operation;
16 17 import io.swagger.v3.oas.annotations.Parameter;
17 18 import io.swagger.v3.oas.annotations.tags.Tag;
... ... @@ -54,6 +55,7 @@ public class AiChatConversationController {
54 55  
55 56 @GetMapping("/my-list")
56 57 @Operation(summary = "获得【我的】聊天对话列表")
  58 + @TransMethodResult
57 59 public CommonResult<List<AiChatConversationRespVO>> getChatConversationMyList() {
58 60 List<AiChatConversationDO> list = chatConversationService.getChatConversationListByUserId(getLoginUserId());
59 61 return success(BeanUtils.toBean(list, AiChatConversationRespVO.class));
... ... @@ -62,6 +64,7 @@ public class AiChatConversationController {
62 64 @GetMapping("/get-my")
63 65 @Operation(summary = "获得【我的】聊天对话")
64 66 @Parameter(name = "id", required = true, description = "对话编号", example = "1024")
  67 + @TransMethodResult
65 68 public CommonResult<AiChatConversationRespVO> getChatConversationMy(@RequestParam("id") Long id) {
66 69 AiChatConversationDO conversation = chatConversationService.getChatConversation(id);
67 70 if (conversation != null && ObjUtil.notEqual(conversation.getUserId(), getLoginUserId())) {
... ... @@ -90,6 +93,7 @@ public class AiChatConversationController {
90 93 @GetMapping("/page")
91 94 @Operation(summary = "获得对话分页", description = "用于【对话管理】菜单")
92 95 @PreAuthorize("@ss.hasPermission('ai:chat-conversation:query')")
  96 + @TransMethodResult
93 97 public CommonResult<PageResult<AiChatConversationRespVO>> getChatConversationPage(AiChatConversationPageReqVO pageReqVO) {
94 98 PageResult<AiChatConversationDO> pageResult = chatConversationService.getChatConversationPage(pageReqVO);
95 99 if (CollUtil.isEmpty(pageResult.getList())) {
... ...
yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/model/AiChatRoleController.java
... ... @@ -10,6 +10,7 @@ import cn.iocoder.yudao.module.ai.controller.admin.model.vo.chatRole.AiChatRoleS
10 10 import cn.iocoder.yudao.module.ai.controller.admin.model.vo.chatRole.AiChatRoleSaveReqVO;
11 11 import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO;
12 12 import cn.iocoder.yudao.module.ai.service.model.AiChatRoleService;
  13 +import com.fhs.core.trans.anno.TransMethodResult;
13 14 import io.swagger.v3.oas.annotations.Operation;
14 15 import io.swagger.v3.oas.annotations.Parameter;
15 16 import io.swagger.v3.oas.annotations.tags.Tag;
... ... @@ -35,6 +36,7 @@ public class AiChatRoleController {
35 36  
36 37 @GetMapping("/my-page")
37 38 @Operation(summary = "获得【我的】聊天角色分页")
  39 + @TransMethodResult
38 40 public CommonResult<PageResult<AiChatRoleRespVO>> getChatRoleMyPage(@Valid AiChatRolePageReqVO pageReqVO) {
39 41 PageResult<AiChatRoleDO> pageResult = chatRoleService.getChatRoleMyPage(pageReqVO, getLoginUserId());
40 42 return success(BeanUtils.toBean(pageResult, AiChatRoleRespVO.class));
... ... @@ -43,6 +45,7 @@ public class AiChatRoleController {
43 45 @GetMapping("/get-my")
44 46 @Operation(summary = "获得【我的】聊天角色")
45 47 @Parameter(name = "id", description = "编号", required = true, example = "1024")
  48 + @TransMethodResult
46 49 public CommonResult<AiChatRoleRespVO> getChatRoleMy(@RequestParam("id") Long id) {
47 50 AiChatRoleDO chatRole = chatRoleService.getChatRole(id);
48 51 if (ObjUtil.notEqual(chatRole.getUserId(), getLoginUserId())) {
... ... @@ -108,6 +111,7 @@ public class AiChatRoleController {
108 111 @Operation(summary = "获得聊天角色")
109 112 @Parameter(name = "id", description = "编号", required = true, example = "1024")
110 113 @PreAuthorize("@ss.hasPermission('ai:chat-role:query')")
  114 + @TransMethodResult
111 115 public CommonResult<AiChatRoleRespVO> getChatRole(@RequestParam("id") Long id) {
112 116 AiChatRoleDO chatRole = chatRoleService.getChatRole(id);
113 117 return success(BeanUtils.toBean(chatRole, AiChatRoleRespVO.class));
... ...
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/expression/BpmProcessExpressionRespVO.java
1 1 package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.expression;
2 2  
3   -import com.alibaba.excel.annotation.ExcelProperty;
  3 +import cn.idev.excel.annotation.ExcelProperty;
4 4 import io.swagger.v3.oas.annotations.media.Schema;
5 5 import lombok.Data;
6 6  
... ... @@ -27,4 +27,4 @@ public class BpmProcessExpressionRespVO {
27 27 @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
28 28 private LocalDateTime createTime;
29 29  
30   -}
31 30 \ No newline at end of file
  31 +}
... ...
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java
... ... @@ -40,7 +40,7 @@ public interface ErrorCodeConstants {
40 40 ErrorCode PROCESS_INSTANCE_START_USER_SELECT_ASSIGNEES_NOT_EXISTS = new ErrorCode(1_009_004_004, "任务({})的候选人({})不存在");
41 41 ErrorCode PROCESS_INSTANCE_START_USER_CAN_START = new ErrorCode(1_009_004_005, "发起流程失败,你没有权限发起该流程");
42 42 ErrorCode PROCESS_INSTANCE_CANCEL_FAIL_NOT_ALLOW = new ErrorCode(1_009_004_005, "流程取消失败,该流程不允许取消");
43   - ErrorCode PROCESS_INSTANCE_HTTP_TRIGGER_CALL_ERROR = new ErrorCode(1_009_004_006, "流程 Http 触发器请求调用失败");
  43 + ErrorCode PROCESS_INSTANCE_HTTP_CALL_ERROR = new ErrorCode(1_009_004_006, "流程 Http 请求调用失败");
44 44 ErrorCode PROCESS_INSTANCE_APPROVE_USER_SELECT_ASSIGNEES_NOT_CONFIG = new ErrorCode(1_009_004_007, "下一个任务({})的审批人未配置");
45 45 ErrorCode PROCESS_INSTANCE_CANCEL_CHILD_FAIL_NOT_ALLOW = new ErrorCode(1_009_004_008, "子流程取消失败,子流程不允许取消");
46 46  
... ... @@ -58,7 +58,6 @@ public interface ErrorCodeConstants {
58 58 ErrorCode TASK_SIGN_DELETE_NO_PARENT = new ErrorCode(1_009_005_012, "任务减签失败,被减签的任务必须是通过加签生成的任务");
59 59 ErrorCode TASK_TRANSFER_FAIL_USER_REPEAT = new ErrorCode(1_009_005_013, "任务转办失败,转办人和当前审批人为同一人");
60 60 ErrorCode TASK_TRANSFER_FAIL_USER_NOT_EXISTS = new ErrorCode(1_009_005_014, "任务转办失败,转办人不存在");
61   - ErrorCode TASK_CREATE_FAIL_NO_CANDIDATE_USER = new ErrorCode(1_009_006_003, "操作失败,原因:找不到任务的审批人!");
62 61 ErrorCode TASK_SIGNATURE_NOT_EXISTS = new ErrorCode(1_009_005_015, "签名不能为空!");
63 62 ErrorCode TASK_REASON_REQUIRE = new ErrorCode(1_009_005_016, "审批意见不能为空!");
64 63 ErrorCode TASK_WITHDRAW_FAIL_PROCESS_NOT_RUNNING = new ErrorCode(1_009_005_017, "撤回失败,流程实例未运行!");
... ...
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmParallelMultiInstanceBehavior.java
... ... @@ -7,44 +7,35 @@ import cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.BpmTaskCand
7 7 import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils;
8 8 import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils;
9 9 import lombok.Setter;
10   -import org.flowable.bpmn.model.Activity;
11   -import org.flowable.bpmn.model.CallActivity;
12   -import org.flowable.bpmn.model.FlowElement;
13   -import org.flowable.bpmn.model.UserTask;
  10 +import org.flowable.bpmn.model.*;
14 11 import org.flowable.engine.delegate.DelegateExecution;
15 12 import org.flowable.engine.impl.bpmn.behavior.AbstractBpmnActivityBehavior;
16   -import org.flowable.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior;
  13 +import org.flowable.engine.impl.bpmn.behavior.SequentialMultiInstanceBehavior;
  14 +import org.flowable.engine.impl.persistence.entity.ExecutionEntity;
17 15  
18 16 import java.util.List;
19 17 import java.util.Set;
20 18  
21 19 /**
22   - * 自定义的【并行】的【多个】流程任务的 assignee 负责人的分配
23   - * 第一步,基于分配规则,计算出分配任务的【多个】候选人们。
24   - * 第二步,将【多个】任务候选人们,设置到 DelegateExecution 的 collectionVariable 变量中,以便 BpmUserTaskActivityBehavior 使用它
  20 + * 自定义的【串行】的【多个】流程任务的 assignee 负责人的分配
25 21 *
26   - * @author kemengkai
27   - * @since 2022-04-21 16:57
  22 + * 本质上,实现和 {@link BpmParallelMultiInstanceBehavior} 一样,只是继承的类不一样
  23 + *
  24 + * @author 芋道源码
28 25 */
29 26 @Setter
30   -public class BpmParallelMultiInstanceBehavior extends ParallelMultiInstanceBehavior {
  27 +public class BpmSequentialMultiInstanceBehavior extends SequentialMultiInstanceBehavior {
31 28  
32 29 private BpmTaskCandidateInvoker taskCandidateInvoker;
33 30  
34   - public BpmParallelMultiInstanceBehavior(Activity activity,
35   - AbstractBpmnActivityBehavior innerActivityBehavior) {
  31 + public BpmSequentialMultiInstanceBehavior(Activity activity, AbstractBpmnActivityBehavior innerActivityBehavior) {
36 32 super(activity, innerActivityBehavior);
37 33 }
38 34  
39 35 /**
40   - * 重写该方法,主要实现两个功能:
41   - * 1. 忽略原有的 collectionVariable、collectionElementVariable 表达式,而是采用自己定义的
42   - * 2. 获得任务的处理人,并设置到 collectionVariable 中,用于 BpmUserTaskActivityBehavior 从中可以获取任务的处理人
43   - *
44   - * 注意,多个任务实例,每个任务实例对应一个处理人,所以返回的数量就是任务处理人的数量
  36 + * 逻辑和 {@link BpmParallelMultiInstanceBehavior#resolveNrOfInstances(DelegateExecution)} 类似
45 37 *
46   - * @param execution 执行任务
47   - * @return 数量
  38 + * 差异的点:是在【第二步】的时候,需要返回 LinkedHashSet 集合!因为它需要有序!
48 39 */
49 40 @Override
50 41 protected int resolveNrOfInstances(DelegateExecution execution) {
... ... @@ -58,8 +49,9 @@ public class BpmParallelMultiInstanceBehavior extends ParallelMultiInstanceBehav
58 49 super.collectionElementVariable = FlowableUtils.formatExecutionCollectionElementVariable(execution.getCurrentActivityId());
59 50  
60 51 // 第二步,获取任务的所有处理人
  52 + // 不使用 execution.getVariable 原因:目前依次审批任务回退后 collectionVariable 变量没有清理, 如果重新进入该任务不会重新分配审批人
61 53 @SuppressWarnings("unchecked")
62   - Set<Long> assigneeUserIds = (Set<Long>) execution.getVariable(super.collectionVariable, Set.class);
  54 + Set<Long> assigneeUserIds = (Set<Long>) execution.getVariableLocal(super.collectionVariable, Set.class);
63 55 if (assigneeUserIds == null) {
64 56 assigneeUserIds = taskCandidateInvoker.calculateUsersByTask(execution);
65 57 if (CollUtil.isEmpty(assigneeUserIds)) {
... ... @@ -88,4 +80,19 @@ public class BpmParallelMultiInstanceBehavior extends ParallelMultiInstanceBehav
88 80 return super.resolveNrOfInstances(execution);
89 81 }
90 82  
  83 + @Override
  84 + protected void executeOriginalBehavior(DelegateExecution execution, ExecutionEntity multiInstanceRootExecution, int loopCounter) {
  85 + // 参见 https://t.zsxq.com/53Meo 情况
  86 + if (execution.getCurrentFlowElement() instanceof CallActivity
  87 + || execution.getCurrentFlowElement() instanceof SubProcess) {
  88 + super.executeOriginalBehavior(execution, multiInstanceRootExecution, loopCounter);
  89 + return;
  90 + }
  91 + // 参见 https://gitee.com/zhijiantianya/yudao-cloud/issues/IC239F
  92 + super.collectionExpression = null;
  93 + super.collectionVariable = FlowableUtils.formatExecutionCollectionVariable(execution.getCurrentActivityId());
  94 + super.collectionElementVariable = FlowableUtils.formatExecutionCollectionElementVariable(execution.getCurrentActivityId());
  95 + super.executeOriginalBehavior(execution, multiInstanceRootExecution, loopCounter);
  96 + }
  97 +
91 98 }
... ...
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmHttpRequestUtils.java
... ... @@ -6,15 +6,15 @@ import cn.iocoder.yudao.framework.common.core.KeyValue;
6 6 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
7 7 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
8 8 import cn.iocoder.yudao.framework.common.util.spring.SpringUtils;
  9 +import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
  10 +import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
9 11 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO;
10 12 import cn.iocoder.yudao.module.bpm.enums.definition.BpmHttpRequestParamTypeEnum;
11 13 import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
12 14 import com.fasterxml.jackson.core.type.TypeReference;
13 15 import lombok.extern.slf4j.Slf4j;
14 16 import org.flowable.engine.runtime.ProcessInstance;
15   -import org.springframework.http.HttpEntity;
16   -import org.springframework.http.HttpMethod;
17   -import org.springframework.http.ResponseEntity;
  17 +import org.springframework.http.*;
18 18 import org.springframework.util.LinkedMultiValueMap;
19 19 import org.springframework.util.MultiValueMap;
20 20 import org.springframework.web.client.RestClientException;
... ... @@ -26,7 +26,7 @@ import java.util.Map;
26 26  
27 27 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
28 28 import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.HEADER_TENANT_ID;
29   -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_INSTANCE_HTTP_TRIGGER_CALL_ERROR;
  29 +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_INSTANCE_HTTP_CALL_ERROR;
30 30  
31 31 /**
32 32 * 工作流发起 HTTP 请求工具类
... ... @@ -42,7 +42,6 @@ public class BpmHttpRequestUtils {
42 42 List<BpmSimpleModelNodeVO.HttpRequestParam> bodyParams,
43 43 Boolean handleResponse,
44 44 List<KeyValue<String, String>> response) {
45   - RestTemplate restTemplate = SpringUtils.getBean(RestTemplate.class);
46 45 BpmProcessInstanceService processInstanceService = SpringUtils.getBean(BpmProcessInstanceService.class);
47 46  
48 47 // 1.1 设置请求头
... ... @@ -51,6 +50,7 @@ public class BpmHttpRequestUtils {
51 50 MultiValueMap<String, String> body = buildHttpBody(processInstance, bodyParams);
52 51  
53 52 // 2. 发起请求
  53 + RestTemplate restTemplate = SpringUtils.getBean(RestTemplate.class);
54 54 ResponseEntity<String> responseEntity = sendHttpRequest(url, headers, body, restTemplate);
55 55  
56 56 // 3. 处理返回
... ... @@ -78,27 +78,55 @@ public class BpmHttpRequestUtils {
78 78 }
79 79 }
80 80  
  81 + public static void executeBpmHttpRequest(BpmProcessInstanceStatusEvent event,
  82 + String url) {
  83 + // 1.1 设置请求头
  84 + HttpHeaders headers = new HttpHeaders();
  85 + headers.setContentType(MediaType.APPLICATION_JSON);
  86 + if (TenantContextHolder.getTenantId() != null) {
  87 + headers.add(HEADER_TENANT_ID, String.valueOf(TenantContextHolder.getTenantId()));
  88 + } else {
  89 + BpmProcessInstanceService processInstanceService = SpringUtils.getBean(BpmProcessInstanceService.class);
  90 + ProcessInstance processInstance = processInstanceService.getProcessInstance(event.getId());
  91 + if (processInstance != null) {
  92 + headers.add(HEADER_TENANT_ID, String.valueOf(TenantContextHolder.getTenantId()));
  93 + }
  94 + }
  95 + // 1.2 设置请求体
  96 +// MultiValueMap<String, String> body = new LinkedMultiValueMap<>();
  97 +// body.add("id", event.getId());
  98 +// body.add("processDefinitionKey", event.getProcessDefinitionKey());
  99 +// body.add("status", event.getStatus().toString());
  100 +// if (StrUtil.isNotEmpty(event.getBusinessKey())) {
  101 +// body.add("businessKey", event.getBusinessKey());
  102 +// }
  103 +
  104 + // 2. 发起请求
  105 + RestTemplate restTemplate = SpringUtils.getBean(RestTemplate.class);
  106 + sendHttpRequest(url, headers, event, restTemplate);
  107 + }
  108 +
81 109 public static ResponseEntity<String> sendHttpRequest(String url,
82 110 MultiValueMap<String, String> headers,
83   - MultiValueMap<String, String> body,
  111 + Object body,
84 112 RestTemplate restTemplate) {
85   - HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(body, headers);
  113 + HttpEntity<Object> requestEntity = new HttpEntity<>(body, headers);
86 114 ResponseEntity<String> responseEntity;
87 115 try {
88 116 responseEntity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class);
89   - log.info("[sendHttpRequest][HTTP 触发器,请求头:{},请求体:{},响应结果:{}]", headers, body, responseEntity);
  117 + log.info("[sendHttpRequest][HTTP 请求,请求头:{},请求体:{},响应结果:{}]", headers, body, responseEntity);
90 118 } catch (RestClientException e) {
91   - log.error("[sendHttpRequest][HTTP 触发器,请求头:{},请求体:{},请求出错:{}]", headers, body, e.getMessage());
92   - throw exception(PROCESS_INSTANCE_HTTP_TRIGGER_CALL_ERROR);
  119 + log.error("[sendHttpRequest][HTTP 请求,请求头:{},请求体:{},请求出错:{}]", headers, body, e.getMessage());
  120 + throw exception(PROCESS_INSTANCE_HTTP_CALL_ERROR);
93 121 }
94 122 return responseEntity;
95 123 }
96 124  
97 125 public static MultiValueMap<String, String> buildHttpHeaders(ProcessInstance processInstance,
98 126 List<BpmSimpleModelNodeVO.HttpRequestParam> headerSettings) {
99   - Map<String, Object> processVariables = processInstance.getProcessVariables();
100 127 MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
101 128 headers.add(HEADER_TENANT_ID, processInstance.getTenantId());
  129 + Map<String, Object> processVariables = processInstance.getProcessVariables();
102 130 addHttpRequestParam(headers, headerSettings, processVariables);
103 131 return headers;
104 132 }
... ...
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java
... ... @@ -67,7 +67,6 @@ import java.util.*;
67 67  
68 68 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
69 69 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
70   -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
71 70 import static cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmApprovalDetailRespVO.ActivityNode;
72 71 import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
73 72 import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants.START_USER_NODE_ID;
... ... @@ -221,11 +220,6 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
221 220 List<ActivityNode> simulateActivityNodes = getSimulateApproveNodeList(startUserId, bpmnModel,
222 221 processDefinitionInfo,
223 222 processVariables, activities);
224   - // 3.3 如果是发起动作,activityId 为开始节点,不校验审批人自选节点
225   - if (ObjUtil.equals(reqVO.getActivityId(), BpmnModelConstants.START_USER_NODE_ID)) {
226   - simulateActivityNodes.removeIf(node ->
227   - BpmTaskCandidateStrategyEnum.APPROVE_USER_SELECT.getStrategy().equals(node.getCandidateStrategy()));
228   - }
229 223  
230 224 // 4. 拼接最终数据
231 225 return buildApprovalDetail(reqVO, bpmnModel, processDefinition, processDefinitionInfo, historicProcessInstance,
... ... @@ -415,7 +409,9 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
415 409 endActivities.forEach(activity -> {
416 410 // StartEvent:只处理 BPMN 的场景。因为,SIMPLE 情况下,已经有 START_USER_NODE 节点
417 411 if (ELEMENT_EVENT_START.equals(activity.getActivityType())
418   - && BpmModelTypeEnum.BPMN.getType().equals(processDefinitionInfo.getModelType())) {
  412 + && BpmModelTypeEnum.BPMN.getType().equals(processDefinitionInfo.getModelType())
  413 + && !CollUtil.contains(activities, // 特殊:如果已经存在用户手动创建的 START_USER_NODE_ID 节点,则忽略 StartEvent
  414 + historicActivity -> historicActivity.getActivityId().equals(START_USER_NODE_ID))) {
419 415 ActivityNodeTask startTask = new ActivityNodeTask().setId(BpmnModelConstants.START_USER_NODE_ID)
420 416 .setAssignee(startUserId).setStatus(BpmTaskStatusEnum.APPROVE.getStatus());
421 417 ActivityNode startNode = new ActivityNode().setId(startTask.getId())
... ... @@ -555,7 +551,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
555 551 // 情况一:BPMN 设计器
556 552 if (Objects.equals(BpmModelTypeEnum.BPMN.getType(), processDefinitionInfo.getModelType())) {
557 553 List<FlowElement> flowElements = BpmnModelUtils.simulateProcess(bpmnModel, processVariables);
558   - return convertList(flowElements, flowElement -> buildNotRunApproveNodeForBpmn(startUserId, bpmnModel,
  554 + return convertList(flowElements, flowElement -> buildNotRunApproveNodeForBpmn(
  555 + startUserId, bpmnModel, flowElements,
559 556 processDefinitionInfo, processVariables, flowElement, runActivityIds));
560 557 }
561 558 // 情况二:SIMPLE 设计器
... ... @@ -563,7 +560,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
563 560 BpmSimpleModelNodeVO simpleModel = JsonUtils.parseObject(processDefinitionInfo.getSimpleModel(),
564 561 BpmSimpleModelNodeVO.class);
565 562 List<BpmSimpleModelNodeVO> simpleNodes = SimpleModelUtils.simulateProcess(simpleModel, processVariables);
566   - return convertList(simpleNodes, simpleNode -> buildNotRunApproveNodeForSimple(startUserId, bpmnModel,
  563 + return convertList(simpleNodes, simpleNode -> buildNotRunApproveNodeForSimple(
  564 + startUserId, bpmnModel,
567 565 processDefinitionInfo, processVariables, simpleNode, runActivityIds));
568 566 }
569 567 throw new IllegalArgumentException("未知设计器类型:" + processDefinitionInfo.getModelType());
... ... @@ -618,8 +616,9 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
618 616 return null;
619 617 }
620 618  
621   - private ActivityNode buildNotRunApproveNodeForBpmn(Long startUserId, BpmnModel bpmnModel,
622   - BpmProcessDefinitionInfoDO processDefinitionInfo, Map<String, Object> processVariables,
  619 + private ActivityNode buildNotRunApproveNodeForBpmn(Long startUserId, BpmnModel bpmnModel, List<FlowElement> flowElements,
  620 + BpmProcessDefinitionInfoDO processDefinitionInfo,
  621 + Map<String, Object> processVariables,
623 622 FlowElement node, Set<String> runActivityIds) {
624 623 if (runActivityIds.contains(node.getId())) {
625 624 return null;
... ... @@ -634,6 +633,10 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
634 633  
635 634 // 1. 开始节点
636 635 if (node instanceof StartEvent) {
  636 + if (CollUtil.contains(flowElements, // 特殊:如果已经存在用户手动创建的 START_USER_NODE_ID 节点,则忽略 StartEvent
  637 + flowElement -> flowElement.getId().equals(START_USER_NODE_ID))) {
  638 + return null;
  639 + }
637 640 return activityNode.setName(BpmSimpleModelNodeTypeEnum.START_USER_NODE.getName())
638 641 .setNodeType(BpmSimpleModelNodeTypeEnum.START_USER_NODE.getType());
639 642 }
... ...
yudao-module-bpm/src/test/java/cn/iocoder/yudao/module/bpm/service/category/BpmCategoryServiceImplTest.java
... ... @@ -8,9 +8,11 @@ import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.category.BpmCa
8 8 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
9 9 import cn.iocoder.yudao.module.bpm.dal.mysql.category.BpmCategoryMapper;
10 10 import cn.iocoder.yudao.module.bpm.service.definition.BpmCategoryServiceImpl;
  11 +import cn.iocoder.yudao.module.bpm.service.definition.BpmModelService;
11 12 import jakarta.annotation.Resource;
12 13 import org.junit.jupiter.api.Test;
13 14 import org.springframework.context.annotation.Import;
  15 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
14 16  
15 17 import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
16 18 import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildTime;
... ... @@ -32,6 +34,9 @@ public class BpmCategoryServiceImplTest extends BaseDbUnitTest {
32 34 @Resource
33 35 private BpmCategoryServiceImpl categoryService;
34 36  
  37 + @MockitoBean
  38 + private BpmModelService modelService;
  39 +
35 40 @Resource
36 41 private BpmCategoryMapper categoryMapper;
37 42  
... ...
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessRespVO.java
1 1 package cn.iocoder.yudao.module.crm.controller.admin.business.vo.business;
2 2  
3   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
4   -import com.alibaba.excel.annotation.ExcelProperty;
  3 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  4 +import cn.idev.excel.annotation.ExcelProperty;
5 5 import io.swagger.v3.oas.annotations.media.Schema;
6 6 import lombok.AllArgsConstructor;
7 7 import lombok.Data;
... ...
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/clue/vo/CrmClueRespVO.java
... ... @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.crm.controller.admin.clue.vo;
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5 5 import cn.iocoder.yudao.module.infra.enums.DictTypeConstants;
6   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
7   -import com.alibaba.excel.annotation.ExcelProperty;
  6 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  7 +import cn.idev.excel.annotation.ExcelProperty;
8 8 import io.swagger.v3.oas.annotations.media.Schema;
9 9 import lombok.Data;
10 10 import lombok.ToString;
... ...
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactRespVO.java
... ... @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.crm.controller.admin.contact.vo;
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5 5 import cn.iocoder.yudao.module.infra.enums.DictTypeConstants;
6   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
7   -import com.alibaba.excel.annotation.ExcelProperty;
  6 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  7 +import cn.idev.excel.annotation.ExcelProperty;
8 8 import io.swagger.v3.oas.annotations.media.Schema;
9 9 import lombok.Data;
10 10 import lombok.ToString;
... ...
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/contract/CrmContractRespVO.java
1 1 package cn.iocoder.yudao.module.crm.controller.admin.contract.vo.contract;
2 2  
3   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
4   -import com.alibaba.excel.annotation.ExcelProperty;
  3 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  4 +import cn.idev.excel.annotation.ExcelProperty;
5 5 import io.swagger.v3.oas.annotations.media.Schema;
6 6 import lombok.AllArgsConstructor;
7 7 import lombok.Data;
... ...
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/customer/CrmCustomerImportExcelVO.java
... ... @@ -5,7 +5,7 @@ import cn.iocoder.yudao.framework.excel.core.annotations.ExcelColumnSelect;
5 5 import cn.iocoder.yudao.framework.excel.core.convert.AreaConvert;
6 6 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
7 7 import cn.iocoder.yudao.module.crm.framework.excel.core.AreaExcelColumnSelectFunction;
8   -import com.alibaba.excel.annotation.ExcelProperty;
  8 +import cn.idev.excel.annotation.ExcelProperty;
9 9 import lombok.AllArgsConstructor;
10 10 import lombok.Builder;
11 11 import lombok.Data;
... ...
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/customer/CrmCustomerRespVO.java
... ... @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.crm.controller.admin.customer.vo.customer;
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5 5 import cn.iocoder.yudao.module.infra.enums.DictTypeConstants;
6   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
7   -import com.alibaba.excel.annotation.ExcelProperty;
  6 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  7 +import cn.idev.excel.annotation.ExcelProperty;
8 8 import io.swagger.v3.oas.annotations.media.Schema;
9 9 import lombok.Data;
10 10  
... ...
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/followup/vo/CrmFollowUpRecordRespVO.java
... ... @@ -2,8 +2,8 @@ package cn.iocoder.yudao.module.crm.controller.admin.followup.vo;
2 2  
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessRespVO;
5   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
6   -import com.alibaba.excel.annotation.ExcelProperty;
  5 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  6 +import cn.idev.excel.annotation.ExcelProperty;
7 7 import io.swagger.v3.oas.annotations.media.Schema;
8 8 import lombok.Data;
9 9  
... ... @@ -61,4 +61,4 @@ public class CrmFollowUpRecordRespVO {
61 61 @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
62 62 private LocalDateTime createTime;
63 63  
64   -}
65 64 \ No newline at end of file
  65 +}
... ...
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/operatelog/vo/CrmOperateLogRespVO.java
1 1 package cn.iocoder.yudao.module.crm.controller.admin.operatelog.vo;
2 2  
3   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
  3 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
4 4 import io.swagger.v3.oas.annotations.media.Schema;
5 5 import lombok.Data;
6 6  
... ...
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/CrmProductController.java
... ... @@ -14,6 +14,7 @@ import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductDO;
14 14 import cn.iocoder.yudao.module.crm.enums.product.CrmProductStatusEnum;
15 15 import cn.iocoder.yudao.module.crm.service.product.CrmProductService;
16 16 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
  17 +import com.fhs.core.trans.anno.TransMethodResult;
17 18 import io.swagger.v3.oas.annotations.Operation;
18 19 import io.swagger.v3.oas.annotations.Parameter;
19 20 import io.swagger.v3.oas.annotations.tags.Tag;
... ... @@ -70,6 +71,7 @@ public class CrmProductController {
70 71 @Operation(summary = "获得产品")
71 72 @Parameter(name = "id", description = "编号", required = true, example = "1024")
72 73 @PreAuthorize("@ss.hasPermission('crm:product:query')")
  74 + @TransMethodResult
73 75 public CommonResult<CrmProductRespVO> getProduct(@RequestParam("id") Long id) {
74 76 CrmProductDO product = productService.getProduct(id);
75 77 return success(BeanUtils.toBean(product, CrmProductRespVO.class));
... ... @@ -86,6 +88,7 @@ public class CrmProductController {
86 88 @GetMapping("/page")
87 89 @Operation(summary = "获得产品分页")
88 90 @PreAuthorize("@ss.hasPermission('crm:product:query')")
  91 + @TransMethodResult
89 92 public CommonResult<PageResult<CrmProductRespVO>> getProductPage(@Valid CrmProductPageReqVO pageVO) {
90 93 PageResult<CrmProductDO> pageResult = productService.getProductPage(pageVO);
91 94 return success(BeanUtils.toBean(pageResult, CrmProductRespVO.class));
... ...
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/category/CrmProductCategoryListReqVO.java
1 1 package cn.iocoder.yudao.module.crm.controller.admin.product.vo.category;
2 2  
3   -import com.alibaba.excel.annotation.ExcelProperty;
  3 +import cn.idev.excel.annotation.ExcelProperty;
4 4 import io.swagger.v3.oas.annotations.media.Schema;
5 5 import lombok.Data;
6 6  
... ...
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/product/CrmProductRespVO.java
... ... @@ -4,8 +4,8 @@ import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5 5 import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductCategoryDO;
6 6 import cn.iocoder.yudao.module.crm.enums.DictTypeConstants;
7   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
8   -import com.alibaba.excel.annotation.ExcelProperty;
  7 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  8 +import cn.idev.excel.annotation.ExcelProperty;
9 9 import com.fhs.core.trans.anno.Trans;
10 10 import com.fhs.core.trans.constant.TransType;
11 11 import com.fhs.core.trans.vo.VO;
... ...
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/plan/CrmReceivablePlanRespVO.java
1 1 package cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.plan;
2 2  
3 3 import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.receivable.CrmReceivableRespVO;
4   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
5   -import com.alibaba.excel.annotation.ExcelProperty;
  4 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  5 +import cn.idev.excel.annotation.ExcelProperty;
6 6 import io.swagger.v3.oas.annotations.media.Schema;
7 7 import lombok.Data;
8 8  
... ...
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/receivable/CrmReceivableRespVO.java
... ... @@ -4,8 +4,8 @@ import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5 5 import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.contract.CrmContractRespVO;
6 6 import cn.iocoder.yudao.module.crm.enums.DictTypeConstants;
7   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
8   -import com.alibaba.excel.annotation.ExcelProperty;
  7 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  8 +import cn.idev.excel.annotation.ExcelProperty;
9 9 import io.swagger.v3.oas.annotations.media.Schema;
10 10 import lombok.Data;
11 11  
... ...
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactServiceImpl.java
... ... @@ -159,10 +159,10 @@ public class CrmContactServiceImpl implements CrmContactService {
159 159 // 2. 删除联系人
160 160 contactMapper.deleteById(id);
161 161  
162   - // 4.1 删除数据权限
163   - permissionService.deletePermission(CrmBizTypeEnum.CRM_CONTACT.getType(), id);
164   - // 4.2 删除商机关联
  162 + // 4.1 删除商机关联
165 163 contactBusinessService.deleteContactBusinessByContactId(id);
  164 + // 4.2 删除数据权限
  165 + permissionService.deletePermission(CrmBizTypeEnum.CRM_CONTACT.getType(), id);
166 166  
167 167 // 记录操作日志上下文
168 168 LogRecordContext.putVariable("contactName", contact.getName());
... ...
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/util/CrmPermissionUtils.java
... ... @@ -2,11 +2,11 @@ package cn.iocoder.yudao.module.crm.util;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.hutool.extra.spring.SpringUtil;
  5 +import cn.iocoder.yudao.framework.common.biz.system.permission.PermissionCommonApi;
5 6 import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
6 7 import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
7 8 import cn.iocoder.yudao.module.crm.enums.common.CrmSceneTypeEnum;
8 9 import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
9   -import cn.iocoder.yudao.module.system.api.permission.PermissionApi;
10 10 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
11 11 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
12 12 import cn.iocoder.yudao.module.system.enums.permission.RoleCodeEnum;
... ... @@ -32,7 +32,7 @@ public class CrmPermissionUtils {
32 32 * @return 是/否
33 33 */
34 34 public static boolean isCrmAdmin() {
35   - PermissionApi permissionApi = SpringUtil.getBean(PermissionApi.class);
  35 + PermissionCommonApi permissionApi = SpringUtil.getBean(PermissionCommonApi.class);
36 36 return permissionApi.hasAnyRoles(getLoginUserId(), RoleCodeEnum.CRM_ADMIN.getCode());
37 37 }
38 38  
... ...
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/finance/vo/account/ErpAccountRespVO.java
... ... @@ -2,8 +2,8 @@ package cn.iocoder.yudao.module.erp.controller.admin.finance.vo.account;
2 2  
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.module.system.enums.DictTypeConstants;
5   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
6   -import com.alibaba.excel.annotation.ExcelProperty;
  5 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  6 +import cn.idev.excel.annotation.ExcelProperty;
7 7 import io.swagger.v3.oas.annotations.media.Schema;
8 8 import lombok.Data;
9 9  
... ... @@ -47,4 +47,4 @@ public class ErpAccountRespVO {
47 47 @ExcelProperty("创建时间")
48 48 private LocalDateTime createTime;
49 49  
50   -}
51 50 \ No newline at end of file
  51 +}
... ...
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/finance/vo/payment/ErpFinancePaymentRespVO.java
1 1 package cn.iocoder.yudao.module.erp.controller.admin.finance.vo.payment;
2 2  
3   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
4   -import com.alibaba.excel.annotation.ExcelProperty;
  3 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  4 +import cn.idev.excel.annotation.ExcelProperty;
5 5 import io.swagger.v3.oas.annotations.media.Schema;
6 6 import jakarta.validation.constraints.NotNull;
7 7 import lombok.Data;
... ... @@ -96,4 +96,4 @@ public class ErpFinancePaymentRespVO {
96 96  
97 97 }
98 98  
99   -}
100 99 \ No newline at end of file
  100 +}
... ...
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/finance/vo/receipt/ErpFinanceReceiptRespVO.java
1 1 package cn.iocoder.yudao.module.erp.controller.admin.finance.vo.receipt;
2 2  
3   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
4   -import com.alibaba.excel.annotation.ExcelProperty;
  3 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  4 +import cn.idev.excel.annotation.ExcelProperty;
5 5 import io.swagger.v3.oas.annotations.media.Schema;
6 6 import jakarta.validation.constraints.NotNull;
7 7 import lombok.Data;
... ... @@ -96,4 +96,4 @@ public class ErpFinanceReceiptRespVO {
96 96  
97 97 }
98 98  
99   -}
100 99 \ No newline at end of file
  100 +}
... ...
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/category/ErpProductCategoryRespVO.java
... ... @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.erp.controller.admin.product.vo.category;
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5 5 import cn.iocoder.yudao.module.system.enums.DictTypeConstants;
6   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
7   -import com.alibaba.excel.annotation.ExcelProperty;
  6 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  7 +import cn.idev.excel.annotation.ExcelProperty;
8 8 import io.swagger.v3.oas.annotations.media.Schema;
9 9 import lombok.Data;
10 10  
... ... @@ -44,4 +44,4 @@ public class ErpProductCategoryRespVO {
44 44 @ExcelProperty("创建时间")
45 45 private LocalDateTime createTime;
46 46  
47   -}
48 47 \ No newline at end of file
  48 +}
... ...
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/product/ErpProductRespVO.java
1 1 package cn.iocoder.yudao.module.erp.controller.admin.product.vo.product;
2 2  
3   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
4   -import com.alibaba.excel.annotation.ExcelProperty;
  3 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  4 +import cn.idev.excel.annotation.ExcelProperty;
5 5 import io.swagger.v3.oas.annotations.media.Schema;
6 6 import lombok.Data;
7 7  
... ... @@ -73,4 +73,4 @@ public class ErpProductRespVO {
73 73 @ExcelProperty("创建时间")
74 74 private LocalDateTime createTime;
75 75  
76   -}
77 76 \ No newline at end of file
  77 +}
... ...
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/unit/ErpProductUnitRespVO.java
... ... @@ -2,8 +2,8 @@ package cn.iocoder.yudao.module.erp.controller.admin.product.vo.unit;
2 2  
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.module.system.enums.DictTypeConstants;
5   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
6   -import com.alibaba.excel.annotation.ExcelProperty;
  5 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  6 +import cn.idev.excel.annotation.ExcelProperty;
7 7 import io.swagger.v3.oas.annotations.media.Schema;
8 8 import lombok.Data;
9 9  
... ... @@ -31,4 +31,4 @@ public class ErpProductUnitRespVO {
31 31 @ExcelProperty("创建时间")
32 32 private LocalDateTime createTime;
33 33  
34   -}
35 34 \ No newline at end of file
  35 +}
... ...
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/in/ErpPurchaseInRespVO.java
1 1 package cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.in;
2 2  
3   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
4   -import com.alibaba.excel.annotation.ExcelProperty;
  3 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  4 +import cn.idev.excel.annotation.ExcelProperty;
5 5 import io.swagger.v3.oas.annotations.media.Schema;
6 6 import jakarta.validation.constraints.NotNull;
7 7 import lombok.Data;
... ... @@ -142,4 +142,4 @@ public class ErpPurchaseInRespVO {
142 142  
143 143 }
144 144  
145   -}
146 145 \ No newline at end of file
  146 +}
... ...
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/order/ErpPurchaseOrderRespVO.java
1 1 package cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.order;
2 2  
3   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
4   -import com.alibaba.excel.annotation.ExcelProperty;
  3 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  4 +import cn.idev.excel.annotation.ExcelProperty;
5 5 import io.swagger.v3.oas.annotations.media.Schema;
6 6 import jakarta.validation.constraints.NotNull;
7 7 import lombok.Data;
... ... @@ -149,4 +149,4 @@ public class ErpPurchaseOrderRespVO {
149 149  
150 150 }
151 151  
152   -}
153 152 \ No newline at end of file
  153 +}
... ...
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/returns/ErpPurchaseReturnRespVO.java
1 1 package cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.returns;
2 2  
3   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
4   -import com.alibaba.excel.annotation.ExcelProperty;
  3 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  4 +import cn.idev.excel.annotation.ExcelProperty;
5 5 import io.swagger.v3.oas.annotations.media.Schema;
6 6 import jakarta.validation.constraints.NotNull;
7 7 import lombok.Data;
... ... @@ -142,4 +142,4 @@ public class ErpPurchaseReturnRespVO {
142 142  
143 143 }
144 144  
145   -}
146 145 \ No newline at end of file
  146 +}
... ...
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/supplier/ErpSupplierRespVO.java
... ... @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.supplier;
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5 5 import cn.iocoder.yudao.module.system.enums.DictTypeConstants;
6   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
7   -import com.alibaba.excel.annotation.ExcelProperty;
  6 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  7 +import cn.idev.excel.annotation.ExcelProperty;
8 8 import io.swagger.v3.oas.annotations.media.Schema;
9 9 import lombok.Data;
10 10  
... ... @@ -81,4 +81,4 @@ public class ErpSupplierRespVO {
81 81 @ExcelProperty("创建时间")
82 82 private LocalDateTime createTime;
83 83  
84   -}
85 84 \ No newline at end of file
  85 +}
... ...
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/vo/customer/ErpCustomerRespVO.java
... ... @@ -2,12 +2,9 @@ package cn.iocoder.yudao.module.erp.controller.admin.sale.vo.customer;
2 2  
3 3 import io.swagger.v3.oas.annotations.media.Schema;
4 4 import lombok.*;
5   -import java.util.*;
6   -import java.util.*;
7 5 import java.math.BigDecimal;
8   -import org.springframework.format.annotation.DateTimeFormat;
9 6 import java.time.LocalDateTime;
10   -import com.alibaba.excel.annotation.*;
  7 +import cn.idev.excel.annotation.*;
11 8 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
12 9 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
13 10  
... ... @@ -81,4 +78,4 @@ public class ErpCustomerRespVO {
81 78 @ExcelProperty("创建时间")
82 79 private LocalDateTime createTime;
83 80  
84   -}
85 81 \ No newline at end of file
  82 +}
... ...
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/vo/order/ErpSaleOrderRespVO.java
1 1 package cn.iocoder.yudao.module.erp.controller.admin.sale.vo.order;
2 2  
3   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
4   -import com.alibaba.excel.annotation.ExcelProperty;
  3 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  4 +import cn.idev.excel.annotation.ExcelProperty;
5 5 import io.swagger.v3.oas.annotations.media.Schema;
6 6 import jakarta.validation.constraints.NotNull;
7 7 import lombok.Data;
... ... @@ -152,4 +152,4 @@ public class ErpSaleOrderRespVO {
152 152  
153 153 }
154 154  
155   -}
156 155 \ No newline at end of file
  156 +}
... ...
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/vo/out/ErpSaleOutRespVO.java
1 1 package cn.iocoder.yudao.module.erp.controller.admin.sale.vo.out;
2 2  
3   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
4   -import com.alibaba.excel.annotation.ExcelProperty;
  3 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  4 +import cn.idev.excel.annotation.ExcelProperty;
5 5 import io.swagger.v3.oas.annotations.media.Schema;
6 6 import jakarta.validation.constraints.NotNull;
7 7 import lombok.Data;
... ... @@ -145,4 +145,4 @@ public class ErpSaleOutRespVO {
145 145  
146 146 }
147 147  
148   -}
149 148 \ No newline at end of file
  149 +}
... ...
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/vo/returns/ErpSaleReturnRespVO.java
1 1 package cn.iocoder.yudao.module.erp.controller.admin.sale.vo.returns;
2 2  
3   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
4   -import com.alibaba.excel.annotation.ExcelProperty;
  3 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  4 +import cn.idev.excel.annotation.ExcelProperty;
5 5 import io.swagger.v3.oas.annotations.media.Schema;
6 6 import jakarta.validation.constraints.NotNull;
7 7 import lombok.Data;
... ... @@ -145,4 +145,4 @@ public class ErpSaleReturnRespVO {
145 145  
146 146 }
147 147  
148   -}
149 148 \ No newline at end of file
  149 +}
... ...
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/check/ErpStockCheckRespVO.java
... ... @@ -2,8 +2,8 @@ package cn.iocoder.yudao.module.erp.controller.admin.stock.vo.check;
2 2  
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
6   -import com.alibaba.excel.annotation.ExcelProperty;
  5 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  6 +import cn.idev.excel.annotation.ExcelProperty;
7 7 import io.swagger.v3.oas.annotations.media.Schema;
8 8 import jakarta.validation.constraints.NotNull;
9 9 import lombok.Data;
... ... @@ -108,4 +108,4 @@ public class ErpStockCheckRespVO {
108 108  
109 109 }
110 110  
111   -}
112 111 \ No newline at end of file
  112 +}
... ...
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/in/ErpStockInRespVO.java
... ... @@ -2,8 +2,8 @@ package cn.iocoder.yudao.module.erp.controller.admin.stock.vo.in;
2 2  
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
6   -import com.alibaba.excel.annotation.ExcelProperty;
  5 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  6 +import cn.idev.excel.annotation.ExcelProperty;
7 7 import io.swagger.v3.oas.annotations.media.Schema;
8 8 import lombok.Data;
9 9  
... ... @@ -107,4 +107,4 @@ public class ErpStockInRespVO {
107 107  
108 108 }
109 109  
110   -}
111 110 \ No newline at end of file
  111 +}
... ...
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/move/ErpStockMoveRespVO.java
... ... @@ -2,8 +2,8 @@ package cn.iocoder.yudao.module.erp.controller.admin.stock.vo.move;
2 2  
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
6   -import com.alibaba.excel.annotation.ExcelProperty;
  5 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  6 +import cn.idev.excel.annotation.ExcelProperty;
7 7 import io.swagger.v3.oas.annotations.media.Schema;
8 8 import lombok.Data;
9 9  
... ... @@ -104,4 +104,4 @@ public class ErpStockMoveRespVO {
104 104  
105 105 }
106 106  
107   -}
108 107 \ No newline at end of file
  108 +}
... ...
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/out/ErpStockOutRespVO.java
... ... @@ -2,8 +2,8 @@ package cn.iocoder.yudao.module.erp.controller.admin.stock.vo.out;
2 2  
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
6   -import com.alibaba.excel.annotation.ExcelProperty;
  5 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  6 +import cn.idev.excel.annotation.ExcelProperty;
7 7 import io.swagger.v3.oas.annotations.media.Schema;
8 8 import lombok.Data;
9 9  
... ... @@ -107,4 +107,4 @@ public class ErpStockOutRespVO {
107 107  
108 108 }
109 109  
110   -}
111 110 \ No newline at end of file
  111 +}
... ...
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/record/ErpStockRecordRespVO.java
... ... @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.erp.controller.admin.stock.vo.record;
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5 5 import cn.iocoder.yudao.module.erp.enums.DictTypeConstants;
6   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
7   -import com.alibaba.excel.annotation.ExcelProperty;
  6 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  7 +import cn.idev.excel.annotation.ExcelProperty;
8 8 import io.swagger.v3.oas.annotations.media.Schema;
9 9 import lombok.Data;
10 10  
... ... @@ -84,4 +84,4 @@ public class ErpStockRecordRespVO {
84 84 @ExcelProperty("创建人")
85 85 private String creatorName;
86 86  
87   -}
88 87 \ No newline at end of file
  88 +}
... ...
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/stock/ErpStockRespVO.java
1 1 package cn.iocoder.yudao.module.erp.controller.admin.stock.vo.stock;
2 2  
3   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
4   -import com.alibaba.excel.annotation.ExcelProperty;
  3 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  4 +import cn.idev.excel.annotation.ExcelProperty;
5 5 import io.swagger.v3.oas.annotations.media.Schema;
6 6 import lombok.Data;
7 7  
... ... @@ -46,4 +46,4 @@ public class ErpStockRespVO {
46 46 @ExcelProperty("仓库名称")
47 47 private String warehouseName;
48 48  
49   -}
50 49 \ No newline at end of file
  50 +}
... ...
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/warehouse/ErpWarehouseRespVO.java
... ... @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.erp.controller.admin.stock.vo.warehouse;
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5 5 import cn.iocoder.yudao.module.system.enums.DictTypeConstants;
6   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
7   -import com.alibaba.excel.annotation.ExcelProperty;
  6 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  7 +import cn.idev.excel.annotation.ExcelProperty;
8 8 import io.swagger.v3.oas.annotations.media.Schema;
9 9 import lombok.Data;
10 10  
... ... @@ -61,4 +61,4 @@ public class ErpWarehouseRespVO {
61 61 @ExcelProperty("创建时间")
62 62 private LocalDateTime createTime;
63 63  
64   -}
65 64 \ No newline at end of file
  65 +}
... ...
yudao-module-infra/pom.xml
... ... @@ -92,6 +92,7 @@
92 92 <dependency>
93 93 <groupId>de.codecentric</groupId>
94 94 <artifactId>spring-boot-admin-starter-server</artifactId> <!-- 实现 Spring Boot Admin Server 服务端 -->
  95 + <optional>true</optional>
95 96 </dependency>
96 97  
97 98 <!-- 三方云服务相关 -->
... ...
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/api/websocket/WebSocketSenderApiImpl.java
1 1 package cn.iocoder.yudao.module.infra.api.websocket;
2 2  
3 3 import cn.iocoder.yudao.framework.websocket.core.sender.WebSocketMessageSender;
  4 +import org.springframework.beans.factory.annotation.Autowired;
4 5 import org.springframework.stereotype.Component;
5 6  
6   -import jakarta.annotation.Resource;
7   -
8 7 /**
9 8 * WebSocket 发送器的 API 实现类
10 9 *
... ... @@ -13,7 +12,8 @@ import jakarta.annotation.Resource;
13 12 @Component
14 13 public class WebSocketSenderApiImpl implements WebSocketSenderApi {
15 14  
16   - @Resource
  15 + @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection")
  16 + @Autowired(required = false) // 由于 yudao.websocket.enable 配置项,可以关闭 WebSocket 的功能,所以这里只能不强制注入
17 17 private WebSocketMessageSender webSocketMessageSender;
18 18  
19 19 @Override
... ...
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigRespVO.java
... ... @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.infra.controller.admin.config.vo;
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5 5 import cn.iocoder.yudao.module.infra.enums.DictTypeConstants;
6   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
7   -import com.alibaba.excel.annotation.ExcelProperty;
  6 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  7 +import cn.idev.excel.annotation.ExcelProperty;
8 8 import io.swagger.v3.oas.annotations.media.Schema;
9 9 import lombok.Data;
10 10  
... ...
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/demo/demo01/vo/Demo01ContactRespVO.java
... ... @@ -2,8 +2,8 @@ package cn.iocoder.yudao.module.infra.controller.admin.demo.demo01.vo;
2 2  
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
6   -import com.alibaba.excel.annotation.ExcelProperty;
  5 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  6 +import cn.idev.excel.annotation.ExcelProperty;
7 7 import io.swagger.v3.oas.annotations.media.Schema;
8 8 import lombok.Data;
9 9  
... ... @@ -43,4 +43,4 @@ public class Demo01ContactRespVO {
43 43 @ExcelProperty("创建时间")
44 44 private LocalDateTime createTime;
45 45  
46   -}
47 46 \ No newline at end of file
  47 +}
... ...
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/demo/demo02/vo/Demo02CategoryRespVO.java
1 1 package cn.iocoder.yudao.module.infra.controller.admin.demo.demo02.vo;
2 2  
3   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
4   -import com.alibaba.excel.annotation.ExcelProperty;
  3 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  4 +import cn.idev.excel.annotation.ExcelProperty;
5 5 import io.swagger.v3.oas.annotations.media.Schema;
6 6 import lombok.Data;
7 7  
... ... @@ -28,4 +28,4 @@ public class Demo02CategoryRespVO {
28 28 @ExcelProperty("创建时间")
29 29 private LocalDateTime createTime;
30 30  
31   -}
32 31 \ No newline at end of file
  32 +}
... ...
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/demo/demo03/erp/vo/Demo03StudentErpRespVO.java
... ... @@ -2,8 +2,8 @@ package cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.erp.vo;
2 2  
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
6   -import com.alibaba.excel.annotation.ExcelProperty;
  5 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  6 +import cn.idev.excel.annotation.ExcelProperty;
7 7 import io.swagger.v3.oas.annotations.media.Schema;
8 8 import lombok.Data;
9 9  
... ... @@ -39,4 +39,4 @@ public class Demo03StudentErpRespVO {
39 39 @ExcelProperty("创建时间")
40 40 private LocalDateTime createTime;
41 41  
42   -}
43 42 \ No newline at end of file
  43 +}
... ...
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/demo/demo03/inner/vo/Demo03StudentInnerRespVO.java
... ... @@ -2,8 +2,8 @@ package cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.inner.vo;
2 2  
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
6   -import com.alibaba.excel.annotation.ExcelProperty;
  5 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  6 +import cn.idev.excel.annotation.ExcelProperty;
7 7 import io.swagger.v3.oas.annotations.media.Schema;
8 8 import lombok.Data;
9 9  
... ... @@ -39,4 +39,4 @@ public class Demo03StudentInnerRespVO {
39 39 @ExcelProperty("创建时间")
40 40 private LocalDateTime createTime;
41 41  
42   -}
43 42 \ No newline at end of file
  43 +}
... ...
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/demo/demo03/normal/vo/Demo03StudentNormalRespVO.java
... ... @@ -2,8 +2,8 @@ package cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.normal.vo;
2 2  
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
6   -import com.alibaba.excel.annotation.ExcelProperty;
  5 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  6 +import cn.idev.excel.annotation.ExcelProperty;
7 7 import io.swagger.v3.oas.annotations.media.Schema;
8 8 import lombok.Data;
9 9  
... ... @@ -39,4 +39,4 @@ public class Demo03StudentNormalRespVO {
39 39 @ExcelProperty("创建时间")
40 40 private LocalDateTime createTime;
41 41  
42   -}
43 42 \ No newline at end of file
  43 +}
... ...
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/FileController.java
... ... @@ -43,7 +43,7 @@ public class FileController {
43 43  
44 44 @PostMapping("/upload")
45 45 @Operation(summary = "上传文件", description = "模式一:后端上传文件")
46   - public CommonResult<String> uploadFile(FileUploadReqVO uploadReqVO) throws Exception {
  46 + public CommonResult<String> uploadFile(@Valid FileUploadReqVO uploadReqVO) throws Exception {
47 47 MultipartFile file = uploadReqVO.getFile();
48 48 byte[] content = IoUtil.readBytes(file.getInputStream());
49 49 return success(fileService.createFile(content, file.getOriginalFilename(),
... ...
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/job/JobRespVO.java
... ... @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.infra.controller.admin.job.vo.job;
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5 5 import cn.iocoder.yudao.module.infra.enums.DictTypeConstants;
6   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
7   -import com.alibaba.excel.annotation.ExcelProperty;
  6 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  7 +import cn.idev.excel.annotation.ExcelProperty;
8 8 import io.swagger.v3.oas.annotations.media.Schema;
9 9 import jakarta.validation.constraints.NotNull;
10 10 import lombok.Data;
... ...
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/vo/log/JobLogRespVO.java
... ... @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.infra.controller.admin.job.vo.log;
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5 5 import cn.iocoder.yudao.module.infra.enums.DictTypeConstants;
6   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
7   -import com.alibaba.excel.annotation.ExcelProperty;
  6 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  7 +import cn.idev.excel.annotation.ExcelProperty;
8 8 import io.swagger.v3.oas.annotations.media.Schema;
9 9 import lombok.Data;
10 10  
... ...
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogRespVO.java
... ... @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog;
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5 5 import cn.iocoder.yudao.module.infra.enums.DictTypeConstants;
6   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
7   -import com.alibaba.excel.annotation.ExcelProperty;
  6 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  7 +import cn.idev.excel.annotation.ExcelProperty;
8 8 import io.swagger.v3.oas.annotations.media.Schema;
9 9 import lombok.Data;
10 10  
... ...
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogRespVO.java
... ... @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog;
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5 5 import cn.iocoder.yudao.module.infra.enums.DictTypeConstants;
6   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
7   -import com.alibaba.excel.annotation.ExcelProperty;
  6 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  7 +import cn.idev.excel.annotation.ExcelProperty;
8 8 import io.swagger.v3.oas.annotations.media.Schema;
9 9 import lombok.Data;
10 10  
... ...
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java
... ... @@ -139,85 +139,85 @@ public class CodegenEngine {
139 139 vue3FilePath("api/${table.moduleName}/${table.businessName}/index.ts"))
140 140 // VUE3_VBEN2_ANTD_SCHEMA
141 141 .put(CodegenFrontTypeEnum.VUE3_VBEN2_ANTD_SCHEMA.getType(), vue3VbenTemplatePath("views/data.ts"),
142   - vue3FilePath("views/${table.moduleName}/${table.businessName}/${classNameVar}.data.ts"))
  142 + vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/${classNameVar}.data.ts"))
143 143 .put(CodegenFrontTypeEnum.VUE3_VBEN2_ANTD_SCHEMA.getType(), vue3VbenTemplatePath("views/index.vue"),
144   - vue3FilePath("views/${table.moduleName}/${table.businessName}/index.vue"))
  144 + vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/index.vue"))
145 145 .put(CodegenFrontTypeEnum.VUE3_VBEN2_ANTD_SCHEMA.getType(), vue3VbenTemplatePath("views/form.vue"),
146   - vue3FilePath("views/${table.moduleName}/${table.businessName}/${simpleClassName}Modal.vue"))
  146 + vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/${simpleClassName}Modal.vue"))
147 147 .put(CodegenFrontTypeEnum.VUE3_VBEN2_ANTD_SCHEMA.getType(), vue3VbenTemplatePath("api/api.ts"),
148   - vue3FilePath("api/${table.moduleName}/${table.businessName}/index.ts"))
  148 + vue3VbenFilePath("api/${table.moduleName}/${table.businessName}/index.ts"))
149 149 // VUE3_VBEN5_ANTD_SCHEMA
150 150 .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/data.ts"),
151   - vue3FilePath("views/${table.moduleName}/${table.businessName}/data.ts"))
  151 + vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/data.ts"))
152 152 .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/index.vue"),
153   - vue3FilePath("views/${table.moduleName}/${table.businessName}/index.vue"))
  153 + vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/index.vue"))
154 154 .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/form.vue"),
155   - vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/form.vue"))
  155 + vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/form.vue"))
156 156 .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("api/api.ts"),
157   - vue3FilePath("api/${table.moduleName}/${table.businessName}/index.ts"))
  157 + vue3VbenFilePath("api/${table.moduleName}/${table.businessName}/index.ts"))
158 158 .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/modules/form_sub_normal.vue"), // 特殊:主子表专属逻辑
159   - vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue"))
  159 + vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue"))
160 160 .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/modules/form_sub_inner.vue"), // 特殊:主子表专属逻辑
161   - vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue"))
  161 + vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue"))
162 162 .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/modules/form_sub_erp.vue"), // 特殊:主子表专属逻辑
163   - vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue"))
  163 + vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue"))
164 164 .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/modules/list_sub_inner.vue"), // 特殊:主子表专属逻辑
165   - vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue"))
  165 + vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue"))
166 166 .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/modules/list_sub_erp.vue"), // 特殊:主子表专属逻辑
167   - vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue"))
  167 + vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue"))
168 168 // VUE3_VBEN5_ANTD
169 169 .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_GENERAL.getType(), vue3Vben5AntdGeneralTemplatePath("views/index.vue"),
170   - vue3FilePath("views/${table.moduleName}/${table.businessName}/index.vue"))
  170 + vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/index.vue"))
171 171 .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_GENERAL.getType(), vue3Vben5AntdGeneralTemplatePath("views/form.vue"),
172   - vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/form.vue"))
  172 + vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/form.vue"))
173 173 .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_GENERAL.getType(), vue3Vben5AntdGeneralTemplatePath("api/api.ts"),
174   - vue3FilePath("api/${table.moduleName}/${table.businessName}/index.ts"))
  174 + vue3VbenFilePath("api/${table.moduleName}/${table.businessName}/index.ts"))
175 175 .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_GENERAL.getType(), vue3Vben5AntdGeneralTemplatePath("views/modules/form_sub_normal.vue"), // 特殊:主子表专属逻辑
176   - vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue"))
  176 + vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue"))
177 177 .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_GENERAL.getType(), vue3Vben5AntdGeneralTemplatePath("views/modules/form_sub_inner.vue"), // 特殊:主子表专属逻辑
178   - vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue"))
  178 + vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue"))
179 179 .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_GENERAL.getType(), vue3Vben5AntdGeneralTemplatePath("views/modules/form_sub_erp.vue"), // 特殊:主子表专属逻辑
180   - vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue"))
  180 + vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue"))
181 181 .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_GENERAL.getType(), vue3Vben5AntdGeneralTemplatePath("views/modules/list_sub_inner.vue"), // 特殊:主子表专属逻辑
182   - vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue"))
  182 + vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue"))
183 183 .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_GENERAL.getType(), vue3Vben5AntdGeneralTemplatePath("views/modules/list_sub_erp.vue"), // 特殊:主子表专属逻辑
184   - vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue"))
  184 + vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue"))
185 185 // VUE3_VBEN5_EP_SCHEMA
186 186 .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_SCHEMA.getType(), vue3Vben5EpSchemaTemplatePath("views/data.ts"),
187   - vue3FilePath("views/${table.moduleName}/${table.businessName}/data.ts"))
  187 + vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/data.ts"))
188 188 .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_SCHEMA.getType(), vue3Vben5EpSchemaTemplatePath("views/index.vue"),
189   - vue3FilePath("views/${table.moduleName}/${table.businessName}/index.vue"))
  189 + vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/index.vue"))
190 190 .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_SCHEMA.getType(), vue3Vben5EpSchemaTemplatePath("views/form.vue"),
191   - vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/form.vue"))
  191 + vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/form.vue"))
192 192 .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_SCHEMA.getType(), vue3Vben5EpSchemaTemplatePath("api/api.ts"),
193   - vue3FilePath("api/${table.moduleName}/${table.businessName}/index.ts"))
  193 + vue3VbenFilePath("api/${table.moduleName}/${table.businessName}/index.ts"))
194 194 .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_SCHEMA.getType(), vue3Vben5EpSchemaTemplatePath("views/modules/form_sub_normal.vue"), // 特殊:主子表专属逻辑
195   - vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue"))
  195 + vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue"))
196 196 .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_SCHEMA.getType(), vue3Vben5EpSchemaTemplatePath("views/modules/form_sub_inner.vue"), // 特殊:主子表专属逻辑
197   - vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue"))
  197 + vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue"))
198 198 .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_SCHEMA.getType(), vue3Vben5EpSchemaTemplatePath("views/modules/form_sub_erp.vue"), // 特殊:主子表专属逻辑
199   - vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue"))
  199 + vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue"))
200 200 .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_SCHEMA.getType(), vue3Vben5EpSchemaTemplatePath("views/modules/list_sub_inner.vue"), // 特殊:主子表专属逻辑
201   - vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue"))
  201 + vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue"))
202 202 .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_SCHEMA.getType(), vue3Vben5EpSchemaTemplatePath("views/modules/list_sub_erp.vue"), // 特殊:主子表专属逻辑
203   - vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue"))
  203 + vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue"))
204 204 // VUE3_VBEN5_EP
205 205 .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_GENERAL.getType(), vue3Vben5EpGeneralTemplatePath("views/index.vue"),
206   - vue3FilePath("views/${table.moduleName}/${table.businessName}/index.vue"))
  206 + vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/index.vue"))
207 207 .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_GENERAL.getType(), vue3Vben5EpGeneralTemplatePath("views/form.vue"),
208   - vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/form.vue"))
  208 + vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/form.vue"))
209 209 .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_GENERAL.getType(), vue3Vben5EpGeneralTemplatePath("api/api.ts"),
210   - vue3FilePath("api/${table.moduleName}/${table.businessName}/index.ts"))
  210 + vue3VbenFilePath("api/${table.moduleName}/${table.businessName}/index.ts"))
211 211 .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_GENERAL.getType(), vue3Vben5EpGeneralTemplatePath("views/modules/form_sub_normal.vue"), // 特殊:主子表专属逻辑
212   - vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue"))
  212 + vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue"))
213 213 .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_GENERAL.getType(), vue3Vben5EpGeneralTemplatePath("views/modules/form_sub_inner.vue"), // 特殊:主子表专属逻辑
214   - vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue"))
  214 + vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue"))
215 215 .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_GENERAL.getType(), vue3Vben5EpGeneralTemplatePath("views/modules/form_sub_erp.vue"), // 特殊:主子表专属逻辑
216   - vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue"))
  216 + vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue"))
217 217 .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_GENERAL.getType(), vue3Vben5EpGeneralTemplatePath("views/modules/list_sub_inner.vue"), // 特殊:主子表专属逻辑
218   - vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue"))
  218 + vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue"))
219 219 .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_GENERAL.getType(), vue3Vben5EpGeneralTemplatePath("views/modules/list_sub_erp.vue"), // 特殊:主子表专属逻辑
220   - vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue"))
  220 + vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue"))
221 221 .build();
222 222  
223 223 @Resource
... ... @@ -614,6 +614,11 @@ public class CodegenEngine {
614 614 "src/" + path;
615 615 }
616 616  
  617 + private static String vue3VbenFilePath(String path) {
  618 + return "yudao-ui-${sceneEnum.basePackage}-vben/" + // 顶级目录
  619 + "src/" + path;
  620 + }
  621 +
617 622 private static String vue3VbenTemplatePath(String path) {
618 623 return "codegen/vue3_vben/" + path + ".vm";
619 624 }
... ...
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiErrorLogServiceImpl.java
... ... @@ -40,11 +40,16 @@ public class ApiErrorLogServiceImpl implements ApiErrorLogService {
40 40 ApiErrorLogDO apiErrorLog = BeanUtils.toBean(createDTO, ApiErrorLogDO.class)
41 41 .setProcessStatus(ApiErrorLogProcessStatusEnum.INIT.getStatus());
42 42 apiErrorLog.setRequestParams(StrUtils.maxLength(apiErrorLog.getRequestParams(), REQUEST_PARAMS_MAX_LENGTH));
43   - if (TenantContextHolder.getTenantId() != null) {
44   - apiErrorLogMapper.insert(apiErrorLog);
45   - } else {
46   - // 极端情况下,上下文中没有租户时,此时忽略租户上下文,避免插入失败!
47   - TenantUtils.executeIgnore(() -> apiErrorLogMapper.insert(apiErrorLog));
  43 + try {
  44 + if (TenantContextHolder.getTenantId() != null) {
  45 + apiErrorLogMapper.insert(apiErrorLog);
  46 + } else {
  47 + // 极端情况下,上下文中没有租户时,此时忽略租户上下文,避免插入失败!
  48 + TenantUtils.executeIgnore(() -> apiErrorLogMapper.insert(apiErrorLog));
  49 + }
  50 + } catch (Exception ex) {
  51 + // 兜底处理,目前只有 yudao-cloud 会发生:https://gitee.com/yudaocode/yudao-cloud-mini/issues/IC1O0A
  52 + log.error("[createApiErrorLog][记录时({}) 发生异常]", createDTO, ex);
48 53 }
49 54 }
50 55  
... ...
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/websocket/DemoWebSocketMessageListener.java
... ... @@ -6,11 +6,10 @@ import cn.iocoder.yudao.framework.websocket.core.sender.WebSocketMessageSender;
6 6 import cn.iocoder.yudao.framework.websocket.core.util.WebSocketFrameworkUtils;
7 7 import cn.iocoder.yudao.module.infra.websocket.message.DemoReceiveMessage;
8 8 import cn.iocoder.yudao.module.infra.websocket.message.DemoSendMessage;
  9 +import org.springframework.beans.factory.annotation.Autowired;
9 10 import org.springframework.stereotype.Component;
10 11 import org.springframework.web.socket.WebSocketSession;
11 12  
12   -import jakarta.annotation.Resource;
13   -
14 13 /**
15 14 * WebSocket 示例:单发消息
16 15 *
... ... @@ -19,7 +18,8 @@ import jakarta.annotation.Resource;
19 18 @Component
20 19 public class DemoWebSocketMessageListener implements WebSocketMessageListener<DemoSendMessage> {
21 20  
22   - @Resource
  21 + @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection")
  22 + @Autowired(required = false) // 由于 yudao.websocket.enable 配置项,可以关闭 WebSocket 的功能,所以这里只能不强制注入
23 23 private WebSocketMessageSender webSocketMessageSender;
24 24  
25 25 @Override
... ...
yudao-module-infra/src/main/resources/codegen/java/controller/vo/respVO.vm
... ... @@ -19,7 +19,7 @@ import java.time.LocalDateTime;
19 19 #end
20 20 #end
21 21 ## 处理 Excel 导出
22   -import com.alibaba.excel.annotation.*;
  22 +import cn.idev.excel.annotation.*;
23 23 #foreach ($column in $columns)
24 24 #if ("$!column.dictType" != "")## 有设置数据字典
25 25 import ${DictFormatClassName};
... ... @@ -50,4 +50,4 @@ public class ${sceneEnum.prefixClass}${table.className}RespVO {
50 50  
51 51 #end
52 52 #end
53   -}
54 53 \ No newline at end of file
  54 +}
... ...
yudao-module-infra/src/main/resources/codegen/java/dal/do.vm
... ... @@ -15,7 +15,7 @@ import ${BaseDOClassName};
15 15 ## 处理 Excel 导出 + Schema 注解(仅 DO 模式)
16 16 #if ($voType == 20)
17 17 import io.swagger.v3.oas.annotations.media.Schema;
18   -import com.alibaba.excel.annotation.*;
  18 +import cn.idev.excel.annotation.*;
19 19 #foreach ($column in $columns)
20 20 #if ("$!column.dictType" != "")## 有设置数据字典
21 21 import ${DictFormatClassName};
... ... @@ -100,4 +100,4 @@ public class ${table.className}DO extends BaseDO {
100 100 #end
101 101 #end
102 102  
103   -}
104 103 \ No newline at end of file
  104 +}
... ...
yudao-module-infra/src/main/resources/codegen/java/test/serviceTest.vm
... ... @@ -2,7 +2,6 @@ package ${basePackage}.module.${table.moduleName}.service.${table.businessName};
2 2  
3 3 import org.junit.jupiter.api.Disabled;
4 4 import org.junit.jupiter.api.Test;
5   -import org.springframework.boot.test.mock.mockito.MockBean;
6 5  
7 6 import ${jakartaPackage}.annotation.Resource;
8 7  
... ...
yudao-module-infra/src/main/resources/codegen/vue3/views/components/list_sub_erp.vue.vm
... ... @@ -138,6 +138,7 @@ watch(
138 138 () => props.${subJoinColumn.javaField},
139 139 (val: number) => {
140 140 if (!val) {
  141 + list.value = [] // 清空列表
141 142 return
142 143 }
143 144 queryParams.${subJoinColumn.javaField} = val
... ...
yudao-module-infra/src/main/resources/codegen/vue3/views/index.vue.vm
... ... @@ -353,6 +353,7 @@ const handleDelete = async (id: number) =&gt; {
353 353 // 发起删除
354 354 await ${simpleClassName}Api.delete${simpleClassName}(id)
355 355 message.success(t('common.delSuccess'))
  356 + currentRow.value = {}
356 357 // 刷新列表
357 358 await getList()
358 359 } catch {}
... ...
yudao-module-infra/src/test/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImplTest.java
... ... @@ -24,8 +24,8 @@ import com.baomidou.mybatisplus.generator.config.po.TableField;
24 24 import com.baomidou.mybatisplus.generator.config.po.TableInfo;
25 25 import jakarta.annotation.Resource;
26 26 import org.junit.jupiter.api.Test;
27   -import org.springframework.boot.test.mock.mockito.MockBean;
28 27 import org.springframework.context.annotation.Import;
  28 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
29 29  
30 30 import java.util.Arrays;
31 31 import java.util.Collections;
... ... @@ -60,15 +60,15 @@ public class CodegenServiceImplTest extends BaseDbUnitTest {
60 60 @Resource
61 61 private CodegenColumnMapper codegenColumnMapper;
62 62  
63   - @MockBean
  63 + @MockitoBean
64 64 private DatabaseTableService databaseTableService;
65 65  
66   - @MockBean
  66 + @MockitoBean
67 67 private CodegenBuilder codegenBuilder;
68   - @MockBean
  68 + @MockitoBean
69 69 private CodegenEngine codegenEngine;
70 70  
71   - @MockBean
  71 + @MockitoBean
72 72 private CodegenProperties codegenProperties;
73 73  
74 74 @Test
... ...
yudao-module-infra/src/test/java/cn/iocoder/yudao/module/infra/service/db/DataSourceConfigServiceImplTest.java
... ... @@ -11,14 +11,14 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.db.DataSourceConfigDO;
11 11 import cn.iocoder.yudao.module.infra.dal.mysql.db.DataSourceConfigMapper;
12 12 import com.baomidou.dynamic.datasource.creator.DataSourceProperty;
13 13 import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
  14 +import jakarta.annotation.Resource;
14 15 import org.junit.jupiter.api.BeforeEach;
15 16 import org.junit.jupiter.api.Test;
16 17 import org.mockito.MockedStatic;
17 18 import org.mockito.stubbing.Answer;
18   -import org.springframework.boot.test.mock.mockito.MockBean;
19 19 import org.springframework.context.annotation.Import;
  20 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
20 21  
21   -import jakarta.annotation.Resource;
22 22 import java.util.List;
23 23  
24 24 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
... ... @@ -46,10 +46,10 @@ public class DataSourceConfigServiceImplTest extends BaseDbUnitTest {
46 46 @Resource
47 47 private DataSourceConfigMapper dataSourceConfigMapper;
48 48  
49   - @MockBean
  49 + @MockitoBean
50 50 private AES aes;
51 51  
52   - @MockBean
  52 + @MockitoBean
53 53 private DynamicDataSourceProperties dynamicDataSourceProperties;
54 54  
55 55 @BeforeEach
... ...
yudao-module-infra/src/test/java/cn/iocoder/yudao/module/infra/service/db/DatabaseTableServiceImplTest.java
... ... @@ -5,12 +5,12 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.db.DataSourceConfigDO;
5 5 import com.baomidou.mybatisplus.generator.config.po.TableField;
6 6 import com.baomidou.mybatisplus.generator.config.po.TableInfo;
7 7 import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
  8 +import jakarta.annotation.Resource;
8 9 import org.apache.ibatis.type.JdbcType;
9 10 import org.junit.jupiter.api.Test;
10   -import org.springframework.boot.test.mock.mockito.MockBean;
11 11 import org.springframework.context.annotation.Import;
  12 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
12 13  
13   -import jakarta.annotation.Resource;
14 14 import java.util.List;
15 15  
16 16 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId;
... ... @@ -24,7 +24,7 @@ public class DatabaseTableServiceImplTest extends BaseDbUnitTest {
24 24 @Resource
25 25 private DatabaseTableServiceImpl databaseTableService;
26 26  
27   - @MockBean
  27 + @MockitoBean
28 28 private DataSourceConfigService dataSourceConfigService;
29 29  
30 30 @Test
... ...
yudao-module-infra/src/test/java/cn/iocoder/yudao/module/infra/service/file/FileConfigServiceImplTest.java
... ... @@ -4,24 +4,24 @@ import cn.hutool.core.date.DatePattern;
4 4 import cn.hutool.core.date.LocalDateTimeUtil;
5 5 import cn.hutool.core.map.MapUtil;
6 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  7 +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
  8 +import cn.iocoder.yudao.module.infra.controller.admin.file.vo.config.FileConfigPageReqVO;
  9 +import cn.iocoder.yudao.module.infra.controller.admin.file.vo.config.FileConfigSaveReqVO;
  10 +import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileConfigDO;
  11 +import cn.iocoder.yudao.module.infra.dal.mysql.file.FileConfigMapper;
7 12 import cn.iocoder.yudao.module.infra.framework.file.core.client.FileClient;
8 13 import cn.iocoder.yudao.module.infra.framework.file.core.client.FileClientConfig;
9 14 import cn.iocoder.yudao.module.infra.framework.file.core.client.FileClientFactory;
10 15 import cn.iocoder.yudao.module.infra.framework.file.core.client.local.LocalFileClient;
11 16 import cn.iocoder.yudao.module.infra.framework.file.core.client.local.LocalFileClientConfig;
12 17 import cn.iocoder.yudao.module.infra.framework.file.core.enums.FileStorageEnum;
13   -import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
14   -import cn.iocoder.yudao.module.infra.controller.admin.file.vo.config.FileConfigPageReqVO;
15   -import cn.iocoder.yudao.module.infra.controller.admin.file.vo.config.FileConfigSaveReqVO;
16   -import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileConfigDO;
17   -import cn.iocoder.yudao.module.infra.dal.mysql.file.FileConfigMapper;
  18 +import jakarta.annotation.Resource;
  19 +import jakarta.validation.Validator;
18 20 import lombok.Data;
19 21 import org.junit.jupiter.api.Test;
20   -import org.springframework.boot.test.mock.mockito.MockBean;
21 22 import org.springframework.context.annotation.Import;
  23 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
22 24  
23   -import jakarta.annotation.Resource;
24   -import jakarta.validation.Validator;
25 25 import java.io.Serializable;
26 26 import java.time.LocalDateTime;
27 27 import java.util.Map;
... ... @@ -53,9 +53,9 @@ public class FileConfigServiceImplTest extends BaseDbUnitTest {
53 53 @Resource
54 54 private FileConfigMapper fileConfigMapper;
55 55  
56   - @MockBean
  56 + @MockitoBean
57 57 private Validator validator;
58   - @MockBean
  58 + @MockitoBean
59 59 private FileClientFactory fileClientFactory;
60 60  
61 61 @Test
... ...
yudao-module-infra/src/test/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImplTest.java
... ... @@ -12,8 +12,8 @@ import cn.iocoder.yudao.module.infra.framework.file.core.client.FileClient;
12 12 import jakarta.annotation.Resource;
13 13 import org.junit.jupiter.api.BeforeEach;
14 14 import org.junit.jupiter.api.Test;
15   -import org.springframework.boot.test.mock.mockito.MockBean;
16 15 import org.springframework.context.annotation.Import;
  16 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
17 17  
18 18 import java.time.LocalDateTime;
19 19 import java.util.concurrent.atomic.AtomicReference;
... ... @@ -35,7 +35,7 @@ public class FileServiceImplTest extends BaseDbUnitTest {
35 35 @Resource
36 36 private FileMapper fileMapper;
37 37  
38   - @MockBean
  38 + @MockitoBean
39 39 private FileConfigService fileConfigService;
40 40  
41 41 @BeforeEach
... ...
yudao-module-infra/src/test/java/cn/iocoder/yudao/module/infra/service/job/JobServiceImplTest.java
... ... @@ -10,13 +10,12 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.job.JobDO;
10 10 import cn.iocoder.yudao.module.infra.dal.mysql.job.JobMapper;
11 11 import cn.iocoder.yudao.module.infra.enums.job.JobStatusEnum;
12 12 import cn.iocoder.yudao.module.infra.job.job.JobLogCleanJob;
  13 +import jakarta.annotation.Resource;
13 14 import org.junit.jupiter.api.Test;
14 15 import org.mockito.MockedStatic;
15 16 import org.quartz.SchedulerException;
16   -import org.springframework.boot.test.mock.mockito.MockBean;
17 17 import org.springframework.context.annotation.Import;
18   -
19   -import jakarta.annotation.Resource;
  18 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
20 19  
21 20 import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
22 21 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
... ... @@ -36,10 +35,10 @@ public class JobServiceImplTest extends BaseDbUnitTest {
36 35 private JobServiceImpl jobService;
37 36 @Resource
38 37 private JobMapper jobMapper;
39   - @MockBean
  38 + @MockitoBean
40 39 private SchedulerManager schedulerManager;
41 40  
42   - @MockBean
  41 + @MockitoBean
43 42 private JobLogCleanJob jobLogCleanJob;
44 43  
45 44 @Test
... ...
yudao-module-infra/src/test/resources/codegen/windows10/vue2_master_erp/java/InfraStudentRespVO
... ... @@ -6,7 +6,7 @@ import java.util.*;
6 6 import java.util.*;
7 7 import org.springframework.format.annotation.DateTimeFormat;
8 8 import java.time.LocalDateTime;
9   -import com.alibaba.excel.annotation.*;
  9 +import cn.idev.excel.annotation.*;
10 10 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
11 11 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
12 12  
... ... @@ -57,4 +57,4 @@ public class InfraStudentRespVO {
57 57 @ExcelProperty("创建时间")
58 58 private LocalDateTime createTime;
59 59  
60   -}
61 60 \ No newline at end of file
  61 +}
... ...
yudao-module-infra/src/test/resources/codegen/windows10/vue2_master_erp/java/InfraStudentServiceImplTest
... ... @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.infra.service.demo;
2 2  
3 3 import org.junit.jupiter.api.Disabled;
4 4 import org.junit.jupiter.api.Test;
5   -import org.springframework.boot.test.mock.mockito.MockBean;
6 5  
7 6 import javax.annotation.Resource;
8 7  
... ...
yudao-module-infra/src/test/resources/codegen/windows10/vue2_master_inner/java/InfraStudentRespVO
... ... @@ -6,7 +6,7 @@ import java.util.*;
6 6 import java.util.*;
7 7 import org.springframework.format.annotation.DateTimeFormat;
8 8 import java.time.LocalDateTime;
9   -import com.alibaba.excel.annotation.*;
  9 +import cn.idev.excel.annotation.*;
10 10 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
11 11 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
12 12  
... ... @@ -57,4 +57,4 @@ public class InfraStudentRespVO {
57 57 @ExcelProperty("创建时间")
58 58 private LocalDateTime createTime;
59 59  
60   -}
61 60 \ No newline at end of file
  61 +}
... ...
yudao-module-infra/src/test/resources/codegen/windows10/vue2_master_inner/java/InfraStudentServiceImplTest
... ... @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.infra.service.demo;
2 2  
3 3 import org.junit.jupiter.api.Disabled;
4 4 import org.junit.jupiter.api.Test;
5   -import org.springframework.boot.test.mock.mockito.MockBean;
6 5  
7 6 import javax.annotation.Resource;
8 7  
... ...
yudao-module-infra/src/test/resources/codegen/windows10/vue2_master_normal/java/InfraStudentRespVO
... ... @@ -6,7 +6,7 @@ import java.util.*;
6 6 import java.util.*;
7 7 import org.springframework.format.annotation.DateTimeFormat;
8 8 import java.time.LocalDateTime;
9   -import com.alibaba.excel.annotation.*;
  9 +import cn.idev.excel.annotation.*;
10 10 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
11 11 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
12 12  
... ... @@ -57,4 +57,4 @@ public class InfraStudentRespVO {
57 57 @ExcelProperty("创建时间")
58 58 private LocalDateTime createTime;
59 59  
60   -}
61 60 \ No newline at end of file
  61 +}
... ...
yudao-module-infra/src/test/resources/codegen/windows10/vue2_master_normal/java/InfraStudentServiceImplTest
... ... @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.infra.service.demo;
2 2  
3 3 import org.junit.jupiter.api.Disabled;
4 4 import org.junit.jupiter.api.Test;
5   -import org.springframework.boot.test.mock.mockito.MockBean;
6 5  
7 6 import javax.annotation.Resource;
8 7  
... ...
yudao-module-infra/src/test/resources/codegen/windows10/vue2_one/java/InfraStudentRespVO
... ... @@ -6,7 +6,7 @@ import java.util.*;
6 6 import java.util.*;
7 7 import org.springframework.format.annotation.DateTimeFormat;
8 8 import java.time.LocalDateTime;
9   -import com.alibaba.excel.annotation.*;
  9 +import cn.idev.excel.annotation.*;
10 10 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
11 11 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
12 12  
... ... @@ -57,4 +57,4 @@ public class InfraStudentRespVO {
57 57 @ExcelProperty("创建时间")
58 58 private LocalDateTime createTime;
59 59  
60   -}
61 60 \ No newline at end of file
  61 +}
... ...
yudao-module-infra/src/test/resources/codegen/windows10/vue2_one/java/InfraStudentServiceImplTest
... ... @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.infra.service.demo;
2 2  
3 3 import org.junit.jupiter.api.Disabled;
4 4 import org.junit.jupiter.api.Test;
5   -import org.springframework.boot.test.mock.mockito.MockBean;
6 5  
7 6 import javax.annotation.Resource;
8 7  
... ...
yudao-module-infra/src/test/resources/codegen/windows10/vue2_tree/java/InfraCategoryRespVO
... ... @@ -4,7 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
4 4 import lombok.*;
5 5 import java.util.*;
6 6 import java.util.*;
7   -import com.alibaba.excel.annotation.*;
  7 +import cn.idev.excel.annotation.*;
8 8  
9 9 @Schema(description = "管理后台 - 分类 Response VO")
10 10 @Data
... ... @@ -23,4 +23,4 @@ public class InfraCategoryRespVO {
23 23 @ExcelProperty("父编号")
24 24 private Long parentId;
25 25  
26   -}
27 26 \ No newline at end of file
  27 +}
... ...
yudao-module-infra/src/test/resources/codegen/windows10/vue2_tree/java/InfraCategoryServiceImplTest
... ... @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.infra.service.demo;
2 2  
3 3 import org.junit.jupiter.api.Disabled;
4 4 import org.junit.jupiter.api.Test;
5   -import org.springframework.boot.test.mock.mockito.MockBean;
6 5  
7 6 import javax.annotation.Resource;
8 7  
... ...
yudao-module-infra/src/test/resources/codegen/windows10/vue3_master_erp/java/InfraStudentRespVO
... ... @@ -6,7 +6,7 @@ import java.util.*;
6 6 import java.util.*;
7 7 import org.springframework.format.annotation.DateTimeFormat;
8 8 import java.time.LocalDateTime;
9   -import com.alibaba.excel.annotation.*;
  9 +import cn.idev.excel.annotation.*;
10 10 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
11 11 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
12 12  
... ... @@ -57,4 +57,4 @@ public class InfraStudentRespVO {
57 57 @ExcelProperty("创建时间")
58 58 private LocalDateTime createTime;
59 59  
60   -}
61 60 \ No newline at end of file
  61 +}
... ...
yudao-module-infra/src/test/resources/codegen/windows10/vue3_master_erp/java/InfraStudentServiceImplTest
... ... @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.infra.service.demo;
2 2  
3 3 import org.junit.jupiter.api.Disabled;
4 4 import org.junit.jupiter.api.Test;
5   -import org.springframework.boot.test.mock.mockito.MockBean;
6 5  
7 6 import javax.annotation.Resource;
8 7  
... ...
yudao-module-infra/src/test/resources/codegen/windows10/vue3_master_inner/java/InfraStudentRespVO
... ... @@ -6,7 +6,7 @@ import java.util.*;
6 6 import java.util.*;
7 7 import org.springframework.format.annotation.DateTimeFormat;
8 8 import java.time.LocalDateTime;
9   -import com.alibaba.excel.annotation.*;
  9 +import cn.idev.excel.annotation.*;
10 10 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
11 11 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
12 12  
... ... @@ -57,4 +57,4 @@ public class InfraStudentRespVO {
57 57 @ExcelProperty("创建时间")
58 58 private LocalDateTime createTime;
59 59  
60   -}
61 60 \ No newline at end of file
  61 +}
... ...
yudao-module-infra/src/test/resources/codegen/windows10/vue3_master_inner/java/InfraStudentServiceImplTest
... ... @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.infra.service.demo;
2 2  
3 3 import org.junit.jupiter.api.Disabled;
4 4 import org.junit.jupiter.api.Test;
5   -import org.springframework.boot.test.mock.mockito.MockBean;
6 5  
7 6 import javax.annotation.Resource;
8 7  
... ...
yudao-module-infra/src/test/resources/codegen/windows10/vue3_master_normal/java/InfraStudentRespVO
... ... @@ -6,7 +6,7 @@ import java.util.*;
6 6 import java.util.*;
7 7 import org.springframework.format.annotation.DateTimeFormat;
8 8 import java.time.LocalDateTime;
9   -import com.alibaba.excel.annotation.*;
  9 +import cn.idev.excel.annotation.*;
10 10 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
11 11 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
12 12  
... ... @@ -57,4 +57,4 @@ public class InfraStudentRespVO {
57 57 @ExcelProperty("创建时间")
58 58 private LocalDateTime createTime;
59 59  
60   -}
61 60 \ No newline at end of file
  61 +}
... ...
yudao-module-infra/src/test/resources/codegen/windows10/vue3_master_normal/java/InfraStudentServiceImplTest
... ... @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.infra.service.demo;
2 2  
3 3 import org.junit.jupiter.api.Disabled;
4 4 import org.junit.jupiter.api.Test;
5   -import org.springframework.boot.test.mock.mockito.MockBean;
6 5  
7 6 import javax.annotation.Resource;
8 7  
... ...
yudao-module-infra/src/test/resources/codegen/windows10/vue3_one/java/InfraStudentRespVO
... ... @@ -6,7 +6,7 @@ import java.util.*;
6 6 import java.util.*;
7 7 import org.springframework.format.annotation.DateTimeFormat;
8 8 import java.time.LocalDateTime;
9   -import com.alibaba.excel.annotation.*;
  9 +import cn.idev.excel.annotation.*;
10 10 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
11 11 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
12 12  
... ... @@ -57,4 +57,4 @@ public class InfraStudentRespVO {
57 57 @ExcelProperty("创建时间")
58 58 private LocalDateTime createTime;
59 59  
60   -}
61 60 \ No newline at end of file
  61 +}
... ...
yudao-module-infra/src/test/resources/codegen/windows10/vue3_one/java/InfraStudentServiceImplTest
... ... @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.infra.service.demo;
2 2  
3 3 import org.junit.jupiter.api.Disabled;
4 4 import org.junit.jupiter.api.Test;
5   -import org.springframework.boot.test.mock.mockito.MockBean;
6 5  
7 6 import javax.annotation.Resource;
8 7  
... ...
yudao-module-infra/src/test/resources/codegen/windows10/vue3_tree/java/InfraCategoryRespVO
... ... @@ -4,7 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
4 4 import lombok.*;
5 5 import java.util.*;
6 6 import java.util.*;
7   -import com.alibaba.excel.annotation.*;
  7 +import cn.idev.excel.annotation.*;
8 8  
9 9 @Schema(description = "管理后台 - 分类 Response VO")
10 10 @Data
... ... @@ -23,4 +23,4 @@ public class InfraCategoryRespVO {
23 23 @ExcelProperty("父编号")
24 24 private Long parentId;
25 25  
26   -}
27 26 \ No newline at end of file
  27 +}
... ...
yudao-module-infra/src/test/resources/codegen/windows10/vue3_tree/java/InfraCategoryServiceImplTest
... ... @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.infra.service.demo;
2 2  
3 3 import org.junit.jupiter.api.Disabled;
4 4 import org.junit.jupiter.api.Test;
5   -import org.springframework.boot.test.mock.mockito.MockBean;
6 5  
7 6 import javax.annotation.Resource;
8 7  
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/device/IotDeviceImportExcelVO.java
1 1 package cn.iocoder.yudao.module.iot.controller.admin.device.vo.device;
2 2  
3   -import com.alibaba.excel.annotation.ExcelProperty;
  3 +import cn.idev.excel.annotation.ExcelProperty;
4 4 import io.swagger.v3.oas.annotations.media.Schema;
5 5 import jakarta.validation.constraints.NotEmpty;
6 6 import lombok.AllArgsConstructor;
... ... @@ -34,4 +34,4 @@ public class IotDeviceImportExcelVO {
34 34 @ExcelProperty("设备分组")
35 35 private String groupNames;
36 36  
37   -}
38 37 \ No newline at end of file
  38 +}
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/device/IotDeviceMqttConnectionParamsRespVO.java
1 1 package cn.iocoder.yudao.module.iot.controller.admin.device.vo.device;
2 2  
3   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
4   -import com.alibaba.excel.annotation.ExcelProperty;
  3 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  4 +import cn.idev.excel.annotation.ExcelProperty;
5 5 import io.swagger.v3.oas.annotations.media.Schema;
6 6 import lombok.Data;
7 7  
... ... @@ -22,4 +22,4 @@ public class IotDeviceMqttConnectionParamsRespVO {
22 22 @ExcelProperty("MQTT 密码")
23 23 private String mqttPassword;
24 24  
25   -}
26 25 \ No newline at end of file
  26 +}
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/device/IotDeviceRespVO.java
... ... @@ -2,8 +2,8 @@ package cn.iocoder.yudao.module.iot.controller.admin.device.vo.device;
2 2  
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
6   -import com.alibaba.excel.annotation.ExcelProperty;
  5 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  6 +import cn.idev.excel.annotation.ExcelProperty;
7 7 import io.swagger.v3.oas.annotations.media.Schema;
8 8 import lombok.Data;
9 9  
... ... @@ -90,4 +90,4 @@ public class IotDeviceRespVO {
90 90 @ExcelProperty("创建时间")
91 91 private LocalDateTime createTime;
92 92  
93   -}
94 93 \ No newline at end of file
  94 +}
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/ota/IotOtaFirmwareController.java
... ... @@ -9,6 +9,7 @@ import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware.IotOtaFirmwa
9 9 import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware.IotOtaFirmwareUpdateReqVO;
10 10 import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaFirmwareDO;
11 11 import cn.iocoder.yudao.module.iot.service.ota.IotOtaFirmwareService;
  12 +import com.fhs.core.trans.anno.TransMethodResult;
12 13 import io.swagger.v3.oas.annotations.Operation;
13 14 import io.swagger.v3.oas.annotations.tags.Tag;
14 15 import jakarta.annotation.Resource;
... ... @@ -46,6 +47,7 @@ public class IotOtaFirmwareController {
46 47 @GetMapping("/get")
47 48 @Operation(summary = "获得 OTA 固件")
48 49 @PreAuthorize("@ss.hasPermission('iot:ota-firmware:query')")
  50 + @TransMethodResult
49 51 public CommonResult<IotOtaFirmwareRespVO> getOtaFirmware(@RequestParam("id") Long id) {
50 52 IotOtaFirmwareDO otaFirmware = otaFirmwareService.getOtaFirmware(id);
51 53 return success(BeanUtils.toBean(otaFirmware, IotOtaFirmwareRespVO.class));
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/ota/IotOtaUpgradeRecordController.java
... ... @@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.upgrade.record.IotOta
7 7 import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.upgrade.record.IotOtaUpgradeRecordRespVO;
8 8 import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaUpgradeRecordDO;
9 9 import cn.iocoder.yudao.module.iot.service.ota.IotOtaUpgradeRecordService;
  10 +import com.fhs.core.trans.anno.TransMethodResult;
10 11 import io.swagger.v3.oas.annotations.Operation;
11 12 import io.swagger.v3.oas.annotations.Parameter;
12 13 import io.swagger.v3.oas.annotations.tags.Tag;
... ... @@ -48,6 +49,7 @@ public class IotOtaUpgradeRecordController {
48 49 @GetMapping("/page")
49 50 @Operation(summary = "获得升级记录分页")
50 51 @PreAuthorize("@ss.hasPermission('iot:ota-upgrade-record:query')")
  52 + @TransMethodResult
51 53 public CommonResult<PageResult<IotOtaUpgradeRecordRespVO>> getUpgradeRecordPage(
52 54 @Valid IotOtaUpgradeRecordPageReqVO pageReqVO) {
53 55 PageResult<IotOtaUpgradeRecordDO> pageResult = upgradeRecordService.getUpgradeRecordPage(pageReqVO);
... ... @@ -58,6 +60,7 @@ public class IotOtaUpgradeRecordController {
58 60 @Operation(summary = "获得升级记录")
59 61 @PreAuthorize("@ss.hasPermission('iot:ota-upgrade-record:query')")
60 62 @Parameter(name = "id", description = "升级记录编号", required = true, example = "1024")
  63 + @TransMethodResult
61 64 public CommonResult<IotOtaUpgradeRecordRespVO> getUpgradeRecord(@RequestParam("id") Long id) {
62 65 IotOtaUpgradeRecordDO upgradeRecord = upgradeRecordService.getUpgradeRecord(id);
63 66 return success(BeanUtils.toBean(upgradeRecord, IotOtaUpgradeRecordRespVO.class));
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/product/vo/product/IotProductRespVO.java
... ... @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.iot.controller.admin.product.vo.product;
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5 5 import cn.iocoder.yudao.module.iot.enums.DictTypeConstants;
6   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
7   -import com.alibaba.excel.annotation.ExcelProperty;
  6 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  7 +import cn.idev.excel.annotation.ExcelProperty;
8 8 import io.swagger.v3.oas.annotations.media.Schema;
9 9 import lombok.Data;
10 10  
... ... @@ -84,4 +84,4 @@ public class IotProductRespVO {
84 84 @ExcelProperty("创建时间")
85 85 private LocalDateTime createTime;
86 86  
87   -}
88 87 \ No newline at end of file
  88 +}
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/vo/IotThingModelRespVO.java
... ... @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.vo;
3 3 import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.ThingModelEvent;
4 4 import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.ThingModelProperty;
5 5 import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.ThingModelService;
6   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
7   -import com.alibaba.excel.annotation.ExcelProperty;
  6 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  7 +import cn.idev.excel.annotation.ExcelProperty;
8 8 import io.swagger.v3.oas.annotations.media.Schema;
9 9 import lombok.Data;
10 10  
... ... @@ -51,4 +51,4 @@ public class IotThingModelRespVO {
51 51 @ExcelProperty("创建时间")
52 52 private LocalDateTime createTime;
53 53  
54   -}
55 54 \ No newline at end of file
  55 +}
... ...
yudao-module-mall/yudao-module-product/src/main/java/cn/iocoder/yudao/module/product/controller/admin/history/vo/ProductBrowseHistoryRespVO.java
1 1 package cn.iocoder.yudao.module.product.controller.admin.history.vo;
2 2  
3   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
  3 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
4 4 import io.swagger.v3.oas.annotations.media.Schema;
5 5 import lombok.Data;
6 6  
... ...
yudao-module-mall/yudao-module-product/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/ProductSpuRespVO.java
... ... @@ -4,8 +4,8 @@ import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5 5 import cn.iocoder.yudao.framework.excel.core.convert.MoneyConvert;
6 6 import cn.iocoder.yudao.module.product.enums.DictTypeConstants;
7   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
8   -import com.alibaba.excel.annotation.ExcelProperty;
  7 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  8 +import cn.idev.excel.annotation.ExcelProperty;
9 9 import io.swagger.v3.oas.annotations.media.Schema;
10 10 import lombok.Data;
11 11  
... ...
yudao-module-mall/yudao-module-product/src/test/java/cn/iocoder/yudao/module/product/service/comment/ProductCommentServiceImplTest.java
... ... @@ -18,9 +18,9 @@ import cn.iocoder.yudao.module.product.service.spu.ProductSpuService;
18 18 import jakarta.annotation.Resource;
19 19 import org.junit.jupiter.api.Disabled;
20 20 import org.junit.jupiter.api.Test;
21   -import org.springframework.boot.test.mock.mockito.MockBean;
22 21 import org.springframework.context.annotation.Import;
23 22 import org.springframework.context.annotation.Lazy;
  23 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
24 24  
25 25 import java.time.LocalDateTime;
26 26 import java.util.Date;
... ... @@ -48,9 +48,9 @@ public class ProductCommentServiceImplTest extends BaseDbUnitTest {
48 48 @Lazy
49 49 private ProductCommentServiceImpl productCommentService;
50 50  
51   - @MockBean
  51 + @MockitoBean
52 52 private ProductSpuService productSpuService;
53   - @MockBean
  53 + @MockitoBean
54 54 private ProductSkuService productSkuService;
55 55  
56 56 public String generateNo() {
... ...
yudao-module-mall/yudao-module-product/src/test/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceTest.java
... ... @@ -10,12 +10,12 @@ import cn.iocoder.yudao.module.product.dal.mysql.sku.ProductSkuMapper;
10 10 import cn.iocoder.yudao.module.product.service.property.ProductPropertyService;
11 11 import cn.iocoder.yudao.module.product.service.property.ProductPropertyValueService;
12 12 import cn.iocoder.yudao.module.product.service.spu.ProductSpuService;
  13 +import jakarta.annotation.Resource;
13 14 import org.junit.jupiter.api.Disabled;
14 15 import org.junit.jupiter.api.Test;
15   -import org.springframework.boot.test.mock.mockito.MockBean;
16 16 import org.springframework.context.annotation.Import;
  17 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
17 18  
18   -import jakarta.annotation.Resource;
19 19 import java.util.Arrays;
20 20 import java.util.List;
21 21  
... ... @@ -44,11 +44,11 @@ public class ProductSkuServiceTest extends BaseDbUnitTest {
44 44 @Resource
45 45 private ProductSkuMapper productSkuMapper;
46 46  
47   - @MockBean
  47 + @MockitoBean
48 48 private ProductSpuService productSpuService;
49   - @MockBean
  49 + @MockitoBean
50 50 private ProductPropertyService productPropertyService;
51   - @MockBean
  51 + @MockitoBean
52 52 private ProductPropertyValueService productPropertyValueService;
53 53  
54 54 public Long generateId() {
... ...
yudao-module-mall/yudao-module-product/src/test/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImplTest.java
... ... @@ -22,8 +22,8 @@ import jakarta.annotation.Resource;
22 22 import org.junit.jupiter.api.Assertions;
23 23 import org.junit.jupiter.api.Disabled;
24 24 import org.junit.jupiter.api.Test;
25   -import org.springframework.boot.test.mock.mockito.MockBean;
26 25 import org.springframework.context.annotation.Import;
  26 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
27 27  
28 28 import java.math.RoundingMode;
29 29 import java.util.ArrayList;
... ... @@ -58,15 +58,15 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest {
58 58 @Resource
59 59 private ProductSpuMapper productSpuMapper;
60 60  
61   - @MockBean
  61 + @MockitoBean
62 62 private ProductSkuServiceImpl productSkuService;
63   - @MockBean
  63 + @MockitoBean
64 64 private ProductCategoryServiceImpl categoryService;
65   - @MockBean
  65 + @MockitoBean
66 66 private ProductBrandServiceImpl brandService;
67   - @MockBean
  67 + @MockitoBean
68 68 private ProductPropertyService productPropertyService;
69   - @MockBean
  69 + @MockitoBean
70 70 private ProductPropertyValueService productPropertyValueService;
71 71  
72 72 public String generateNo() {
... ...
yudao-module-mall/yudao-module-promotion/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/kefu/vo/message/KeFuMessageRespVO.java
... ... @@ -4,7 +4,6 @@ import io.swagger.v3.oas.annotations.media.Schema;
4 4 import lombok.*;
5 5  
6 6 import java.time.LocalDateTime;
7   -import com.alibaba.excel.annotation.*;
8 7  
9 8 @Schema(description = "管理后台 - 客服消息 Response VO")
10 9 @Data
... ... @@ -42,4 +41,4 @@ public class KeFuMessageRespVO {
42 41 @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
43 42 private LocalDateTime createTime;
44 43  
45   -}
46 44 \ No newline at end of file
  45 +}
... ...
yudao-module-mall/yudao-module-promotion/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/point/vo/activity/PointActivityRespVO.java
1 1 package cn.iocoder.yudao.module.promotion.controller.admin.point.vo.activity;
2 2  
3 3 import cn.iocoder.yudao.module.promotion.controller.admin.point.vo.product.PointProductRespVO;
4   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
5   -import com.alibaba.excel.annotation.ExcelProperty;
  4 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  5 +import cn.idev.excel.annotation.ExcelProperty;
6 6 import io.swagger.v3.oas.annotations.media.Schema;
7 7 import lombok.Data;
8 8  
... ... @@ -69,4 +69,4 @@ public class PointActivityRespVO {
69 69 @Schema(description = "兑换金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "15860")
70 70 private Integer price;
71 71  
72   -}
73 72 \ No newline at end of file
  73 +}
... ...
yudao-module-mall/yudao-module-promotion/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/point/vo/product/PointProductRespVO.java
1 1 package cn.iocoder.yudao.module.promotion.controller.admin.point.vo.product;
2 2  
3   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
  3 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
4 4 import io.swagger.v3.oas.annotations.media.Schema;
5 5 import lombok.Data;
6 6  
... ... @@ -36,4 +36,4 @@ public class PointProductRespVO {
36 36 @Schema(description = "积分商城商品状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
37 37 private Integer activityStatus;
38 38  
39   -}
40 39 \ No newline at end of file
  40 +}
... ...
yudao-module-mall/yudao-module-promotion/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/point/vo/AppPointActivityRespVO.java
1 1 package cn.iocoder.yudao.module.promotion.controller.app.point.vo;
2 2  
3   -import com.alibaba.excel.annotation.ExcelProperty;
  3 +import cn.idev.excel.annotation.ExcelProperty;
4 4 import io.swagger.v3.oas.annotations.media.Schema;
5 5 import lombok.Data;
6 6  
... ...
yudao-module-mall/yudao-module-promotion/src/main/java/cn/iocoder/yudao/module/promotion/service/point/PointActivityServiceImpl.java
... ... @@ -222,6 +222,7 @@ public class PointActivityServiceImpl implements PointActivityService {
222 222 if (spu == null) {
223 223 throw exception(SPU_NOT_EXISTS);
224 224 }
  225 + products.forEach(product -> product.setSpuId(spuId));
225 226  
226 227 // 2. 校验商品 sku 都存在
227 228 List<ProductSkuRespDTO> skus = productSkuApi.getSkuListBySpuId(singletonList(spuId));
... ...
yudao-module-mall/yudao-module-statistics/src/main/java/cn/iocoder/yudao/module/statistics/controller/admin/product/vo/ProductStatisticsRespVO.java
1 1 package cn.iocoder.yudao.module.statistics.controller.admin.product.vo;
2 2  
3   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
4   -import com.alibaba.excel.annotation.ExcelProperty;
  3 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  4 +import cn.idev.excel.annotation.ExcelProperty;
5 5 import com.fasterxml.jackson.annotation.JsonFormat;
6 6 import io.swagger.v3.oas.annotations.media.Schema;
7 7 import lombok.Data;
... ... @@ -78,4 +78,4 @@ public class ProductStatisticsRespVO {
78 78 @Schema(description = "访客支付转化率(百分比)", requiredMode = Schema.RequiredMode.REQUIRED, example = "15")
79 79 private Integer browseConvertPercent;
80 80  
81   -}
82 81 \ No newline at end of file
  82 +}
... ...
yudao-module-mall/yudao-module-statistics/src/main/java/cn/iocoder/yudao/module/statistics/controller/admin/trade/vo/TradeTrendSummaryExcelVO.java
1 1 package cn.iocoder.yudao.module.statistics.controller.admin.trade.vo;
2 2  
3 3 import cn.iocoder.yudao.framework.excel.core.convert.MoneyConvert;
4   -import com.alibaba.excel.annotation.ExcelProperty;
5   -import com.alibaba.excel.annotation.format.DateTimeFormat;
  4 +import cn.idev.excel.annotation.ExcelProperty;
  5 +import cn.idev.excel.annotation.format.DateTimeFormat;
6 6 import lombok.Data;
7 7  
8 8 import java.time.LocalDate;
... ...
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/express/DeliveryExpressExcelVO.java
... ... @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.express;
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5 5 import cn.iocoder.yudao.module.system.enums.DictTypeConstants;
6   -import com.alibaba.excel.annotation.ExcelProperty;
  6 +import cn.idev.excel.annotation.ExcelProperty;
7 7 import lombok.Data;
8 8  
9 9 import java.time.LocalDateTime;
... ...
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/convert/aftersale/AfterSaleConvert.java
... ... @@ -43,7 +43,7 @@ public interface AfterSaleConvert {
43 43 @Mapping(source = "afterSale.id", target = "merchantRefundId"),
44 44 @Mapping(source = "afterSale.applyReason", target = "reason"),
45 45 @Mapping(source = "afterSale.refundPrice", target = "price"),
46   - @Mapping(source = "orderProperties.payAppKey", target = "appKey")
  46 + @Mapping(source = "orderProperties.payAppKey", target = "appKey"),
47 47 })
48 48 PayRefundCreateReqDTO convert(String userIp, AfterSaleDO afterSale, TradeOrderProperties orderProperties);
49 49  
... ...
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/convert/order/TradeOrderConvert.java
... ... @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.trade.convert.order;
2 2  
3 3 import cn.hutool.core.util.BooleanUtil;
4 4 import cn.hutool.core.util.StrUtil;
  5 +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
5 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 7 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
7 8 import cn.iocoder.yudao.framework.common.util.string.StrUtils;
... ... @@ -101,7 +102,8 @@ public interface TradeOrderConvert {
101 102 default PayOrderCreateReqDTO convert(TradeOrderDO order, List<TradeOrderItemDO> orderItems,
102 103 TradeOrderProperties orderProperties) {
103 104 PayOrderCreateReqDTO createReqDTO = new PayOrderCreateReqDTO()
104   - .setAppKey(orderProperties.getPayAppKey()).setUserIp(order.getUserIp());
  105 + .setAppKey(orderProperties.getPayAppKey()).setUserIp(order.getUserIp())
  106 + .setUserId(order.getUserId()).setUserType(UserTypeEnum.MEMBER.getValue());
105 107 // 商户相关字段
106 108 createReqDTO.setMerchantOrderId(String.valueOf(order.getId()));
107 109 String subject = orderItems.get(0).getSpuName();
... ...
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/dto/kd100/Kd100ExpressQueryRespDTO.java
... ... @@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.kd100;
2 2  
3 3 import com.fasterxml.jackson.annotation.JsonFormat;
4 4 import com.fasterxml.jackson.annotation.JsonProperty;
  5 +import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
  6 +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
5 7 import lombok.Data;
6 8  
7 9 import java.time.LocalDateTime;
... ... @@ -59,8 +61,8 @@ public class Kd100ExpressQueryRespDTO {
59 61 * 轨迹发生时间
60 62 */
61 63 @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT)
  64 + @JsonDeserialize(using = LocalDateTimeDeserializer.class)
62 65 private LocalDateTime time;
63   -
64 66 /**
65 67 * 轨迹描述
66 68 */
... ...
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/aftersale/AfterSaleServiceImpl.java
... ... @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.trade.service.aftersale;
3 3 import cn.hutool.core.map.MapUtil;
4 4 import cn.hutool.core.util.ObjectUtil;
5 5 import cn.hutool.core.util.StrUtil;
  6 +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
6 7 import cn.iocoder.yudao.framework.common.pojo.PageResult;
7 8 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
8 9 import cn.iocoder.yudao.module.pay.api.refund.PayRefundApi;
... ... @@ -362,6 +363,7 @@ public class AfterSaleServiceImpl implements AfterSaleService {
362 363 private void createPayRefund(String userIp, AfterSaleDO afterSale) {
363 364 // 创建退款单
364 365 PayRefundCreateReqDTO createReqDTO = AfterSaleConvert.INSTANCE.convert(userIp, afterSale, tradeOrderProperties)
  366 + .setUserId(afterSale.getUserId()).setUserType(UserTypeEnum.MEMBER.getValue())
365 367 .setReason(StrUtil.format("退款【{}】", afterSale.getSpuName()));
366 368 Long payRefundId = payRefundApi.createRefund(createReqDTO);
367 369  
... ...
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageWithdrawServiceImpl.java
... ... @@ -151,6 +151,7 @@ public class BrokerageWithdrawServiceImpl implements BrokerageWithdrawService {
151 151 .setAppKey(tradeOrderProperties.getPayAppKey()).setChannelCode(channelCode)
152 152 .setMerchantTransferId(withdraw.getId().toString()).setSubject("佣金提现").setPrice(withdraw.getPrice())
153 153 .setUserAccount(userAccount).setUserName(userName).setUserIp(getClientIP())
  154 + .setUserId(withdraw.getUserId()).setUserType(UserTypeEnum.MEMBER.getValue()) // 用户信息
154 155 .setChannelExtras(channelExtras);
155 156 // 1.3 发起请求
156 157 PayTransferCreateRespDTO transferRespDTO = payTransferApi.createTransfer(transferReqDTO);
... ...
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java
... ... @@ -952,6 +952,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
952 952 payRefundApi.createRefund(new PayRefundCreateReqDTO()
953 953 .setAppKey(tradeOrderProperties.getPayAppKey()) // 支付应用
954 954 .setUserIp(NetUtil.getLocalhostStr()) // 使用本机 IP,因为是服务器发起退款的
  955 + .setUserId(order.getUserId()).setUserType(UserTypeEnum.MEMBER.getValue()) // 用户信息
955 956 .setMerchantOrderId(String.valueOf(order.getId())) // 支付单号
956 957 // 特殊:因为订单支持 AfterSale 单个售后退款,也支持整单退款,所以需要通过 order- 进行下区分
957 958 // 具体可见 AfterSaleController 的 updateAfterSaleRefunded 方法
... ...
yudao-module-mall/yudao-module-trade/src/test/java/cn/iocoder/yudao/module/trade/service/aftersale/AfterSaleServiceTest.java
... ... @@ -20,12 +20,12 @@ import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum;
20 20 import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties;
21 21 import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService;
22 22 import cn.iocoder.yudao.module.trade.service.order.TradeOrderUpdateService;
  23 +import jakarta.annotation.Resource;
23 24 import org.junit.jupiter.api.Disabled;
24 25 import org.junit.jupiter.api.Test;
25   -import org.springframework.boot.test.mock.mockito.MockBean;
26 26 import org.springframework.context.annotation.Import;
  27 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
27 28  
28   -import jakarta.annotation.Resource;
29 29 import java.time.LocalDateTime;
30 30  
31 31 import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildTime;
... ... @@ -54,15 +54,15 @@ public class AfterSaleServiceTest extends BaseDbUnitTest {
54 54 @Resource
55 55 private AfterSaleLogMapper tradeAfterSaleLogMapper;
56 56  
57   - @MockBean
  57 + @MockitoBean
58 58 private TradeOrderUpdateService tradeOrderUpdateService;
59 59 @Resource
60 60 private TradeOrderQueryService tradeOrderQueryService;
61 61  
62   - @MockBean
  62 + @MockitoBean
63 63 private PayRefundApi payRefundApi;
64 64  
65   - @MockBean
  65 + @MockitoBean
66 66 private TradeOrderProperties tradeOrderProperties;
67 67  
68 68 @Test
... ...
yudao-module-mall/yudao-module-trade/src/test/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordServiceImplTest.java
... ... @@ -7,12 +7,12 @@ import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.record.Broker
7 7 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageRecordDO;
8 8 import cn.iocoder.yudao.module.trade.dal.mysql.brokerage.BrokerageRecordMapper;
9 9 import cn.iocoder.yudao.module.trade.service.config.TradeConfigService;
  10 +import jakarta.annotation.Resource;
10 11 import org.junit.jupiter.api.Disabled;
11 12 import org.junit.jupiter.api.Test;
12   -import org.springframework.boot.test.mock.mockito.MockBean;
13 13 import org.springframework.context.annotation.Import;
  14 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
14 15  
15   -import jakarta.annotation.Resource;
16 16 import java.math.RoundingMode;
17 17  
18 18 import static cn.hutool.core.util.RandomUtil.randomEle;
... ... @@ -39,9 +39,9 @@ public class BrokerageRecordServiceImplTest extends BaseDbUnitTest {
39 39 @Resource
40 40 private BrokerageRecordMapper brokerageRecordMapper;
41 41  
42   - @MockBean
  42 + @MockitoBean
43 43 private TradeConfigService tradeConfigService;
44   - @MockBean
  44 + @MockitoBean
45 45 private BrokerageUserService brokerageUserService;
46 46  
47 47 @Test
... ...
yudao-module-mall/yudao-module-trade/src/test/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageWithdrawServiceImplTest.java
... ... @@ -11,8 +11,8 @@ import jakarta.annotation.Resource;
11 11 import jakarta.validation.Validator;
12 12 import org.junit.jupiter.api.Disabled;
13 13 import org.junit.jupiter.api.Test;
14   -import org.springframework.boot.test.mock.mockito.MockBean;
15 14 import org.springframework.context.annotation.Import;
  15 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
16 16  
17 17 import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
18 18 import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
... ... @@ -36,14 +36,14 @@ public class BrokerageWithdrawServiceImplTest extends BaseDbUnitTest {
36 36 @Resource
37 37 private BrokerageWithdrawMapper brokerageWithdrawMapper;
38 38  
39   - @MockBean
  39 + @MockitoBean
40 40 private BrokerageRecordService brokerageRecordService;
41   - @MockBean
  41 + @MockitoBean
42 42 private BrokerageUserService brokerageUserService;
43   - @MockBean
  43 + @MockitoBean
44 44 private TradeConfigService tradeConfigService;
45 45  
46   - @MockBean
  46 + @MockitoBean
47 47 private NotifyMessageSendApi notifyMessageSendApi;
48 48  
49 49 @Resource
... ...
yudao-module-mall/yudao-module-trade/src/test/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceTest.java
... ... @@ -35,8 +35,8 @@ import jakarta.annotation.Resource;
35 35 import org.junit.jupiter.api.BeforeEach;
36 36 import org.junit.jupiter.api.Disabled;
37 37 import org.junit.jupiter.api.Test;
38   -import org.springframework.boot.test.mock.mockito.MockBean;
39 38 import org.springframework.context.annotation.Import;
  39 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
40 40  
41 41 import java.time.Duration;
42 42  
... ... @@ -67,34 +67,34 @@ public class TradeOrderUpdateServiceTest extends BaseDbUnitTest {
67 67 @Resource
68 68 private TradeOrderItemMapper tradeOrderItemMapper;
69 69  
70   - @MockBean
  70 + @MockitoBean
71 71 private MemberUserApi memberUserApi;
72   - @MockBean
  72 + @MockitoBean
73 73 private ProductSpuApi productSpuApi;
74   - @MockBean
  74 + @MockitoBean
75 75 private ProductSkuApi productSkuApi;
76   - @MockBean
  76 + @MockitoBean
77 77 private ProductCommentApi productCommentApi;
78   - // @MockBean
  78 + // @MockitoBean
79 79 // private PriceApi priceApi;
80   - @MockBean
  80 + @MockitoBean
81 81 private PayOrderApi payOrderApi;
82   - @MockBean
  82 + @MockitoBean
83 83 private MemberAddressApi addressApi;
84   - @MockBean
  84 + @MockitoBean
85 85 private CouponApi couponApi;
86 86  
87   - @MockBean
  87 + @MockitoBean
88 88 private TradeOrderProperties tradeOrderProperties;
89   - @MockBean
  89 + @MockitoBean
90 90 private TradeNoRedisDAO tradeNoRedisDAO;
91   - @MockBean
  91 + @MockitoBean
92 92 private TradeOrderHandler tradeOrderHandler;
93   - @MockBean
  93 + @MockitoBean
94 94 private TradePriceCalculator tradePriceCalculator;
95   - @MockBean
  95 + @MockitoBean
96 96 private NotifyMessageSendApi notifyMessageSendApi;
97   - @MockBean
  97 + @MockitoBean
98 98 private DeliveryExpressService deliveryExpressService;
99 99  
100 100 @BeforeEach
... ...
yudao-module-member/src/test/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceTest.java
1 1 package cn.iocoder.yudao.module.member.service.auth;
2 2  
  3 +import cn.iocoder.yudao.framework.common.biz.system.oauth2.OAuth2TokenCommonApi;
3 4 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 5 import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils;
5 6 import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration;
... ... @@ -8,14 +9,13 @@ import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
8 9 import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper;
9 10 import cn.iocoder.yudao.module.member.service.user.MemberUserService;
10 11 import cn.iocoder.yudao.module.system.api.logger.LoginLogApi;
11   -import cn.iocoder.yudao.framework.common.biz.system.oauth2.OAuth2TokenCommonApi;
12 12 import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi;
13 13 import cn.iocoder.yudao.module.system.api.social.SocialUserApi;
14   -import org.springframework.boot.test.mock.mockito.MockBean;
  14 +import jakarta.annotation.Resource;
15 15 import org.springframework.context.annotation.Import;
16 16 import org.springframework.security.crypto.password.PasswordEncoder;
  17 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
17 18  
18   -import jakarta.annotation.Resource;
19 19 import java.util.function.Consumer;
20 20  
21 21 import static cn.hutool.core.util.RandomUtil.randomEle;
... ... @@ -36,17 +36,17 @@ public class MemberAuthServiceTest extends BaseDbAndRedisUnitTest {
36 36 @Resource
37 37 private MemberAuthServiceImpl authService;
38 38  
39   - @MockBean
  39 + @MockitoBean
40 40 private MemberUserService userService;
41   - @MockBean
  41 + @MockitoBean
42 42 private SmsCodeApi smsCodeApi;
43   - @MockBean
  43 + @MockitoBean
44 44 private LoginLogApi loginLogApi;
45   - @MockBean
  45 + @MockitoBean
46 46 private OAuth2TokenCommonApi oauth2TokenApi;
47   - @MockBean
  47 + @MockitoBean
48 48 private SocialUserApi socialUserApi;
49   - @MockBean
  49 + @MockitoBean
50 50 private PasswordEncoder passwordEncoder;
51 51  
52 52 @Resource
... ...
yudao-module-member/src/test/java/cn/iocoder/yudao/module/member/service/group/MemberGroupServiceImplTest.java
... ... @@ -9,11 +9,10 @@ import cn.iocoder.yudao.module.member.controller.admin.group.vo.MemberGroupUpdat
9 9 import cn.iocoder.yudao.module.member.dal.dataobject.group.MemberGroupDO;
10 10 import cn.iocoder.yudao.module.member.dal.mysql.group.MemberGroupMapper;
11 11 import cn.iocoder.yudao.module.member.service.user.MemberUserService;
  12 +import jakarta.annotation.Resource;
12 13 import org.junit.jupiter.api.Test;
13   -import org.springframework.boot.test.mock.mockito.MockBean;
14 14 import org.springframework.context.annotation.Import;
15   -
16   -import jakarta.annotation.Resource;
  15 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
17 16  
18 17 import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
19 18 import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildTime;
... ... @@ -42,7 +41,7 @@ public class MemberGroupServiceImplTest extends BaseDbUnitTest {
42 41 @Resource
43 42 private MemberGroupMapper groupMapper;
44 43  
45   - @MockBean
  44 + @MockitoBean
46 45 private MemberUserService memberUserService;
47 46  
48 47 @Test
... ...
yudao-module-member/src/test/java/cn/iocoder/yudao/module/member/service/level/MemberLevelServiceImplTest.java
... ... @@ -9,11 +9,11 @@ import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLeve
9 9 import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
10 10 import cn.iocoder.yudao.module.member.dal.mysql.level.MemberLevelMapper;
11 11 import cn.iocoder.yudao.module.member.service.user.MemberUserService;
  12 +import jakarta.annotation.Resource;
12 13 import org.junit.jupiter.api.Test;
13   -import org.springframework.boot.test.mock.mockito.MockBean;
14 14 import org.springframework.context.annotation.Import;
  15 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
15 16  
16   -import jakarta.annotation.Resource;
17 17 import java.util.List;
18 18 import java.util.function.Consumer;
19 19  
... ... @@ -40,11 +40,11 @@ public class MemberLevelServiceImplTest extends BaseDbUnitTest {
40 40 @Resource
41 41 private MemberLevelMapper memberlevelMapper;
42 42  
43   - @MockBean
  43 + @MockitoBean
44 44 private MemberLevelRecordService memberLevelRecordService;
45   - @MockBean
  45 + @MockitoBean
46 46 private MemberExperienceRecordService memberExperienceRecordService;
47   - @MockBean
  47 + @MockitoBean
48 48 private MemberUserService memberUserService;
49 49  
50 50 @Test
... ...
yudao-module-member/src/test/java/cn/iocoder/yudao/module/member/service/tag/MemberTagServiceImplTest.java
... ... @@ -8,11 +8,10 @@ import cn.iocoder.yudao.module.member.controller.admin.tag.vo.MemberTagUpdateReq
8 8 import cn.iocoder.yudao.module.member.dal.dataobject.tag.MemberTagDO;
9 9 import cn.iocoder.yudao.module.member.dal.mysql.tag.MemberTagMapper;
10 10 import cn.iocoder.yudao.module.member.service.user.MemberUserService;
  11 +import jakarta.annotation.Resource;
11 12 import org.junit.jupiter.api.Test;
12   -import org.springframework.boot.test.mock.mockito.MockBean;
13 13 import org.springframework.context.annotation.Import;
14   -
15   -import jakarta.annotation.Resource;
  14 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
16 15  
17 16 import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
18 17 import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildTime;
... ... @@ -39,7 +38,7 @@ public class MemberTagServiceImplTest extends BaseDbUnitTest {
39 38 @Resource
40 39 private MemberTagMapper tagMapper;
41 40  
42   - @MockBean
  41 + @MockitoBean
43 42 private MemberUserService memberUserService;
44 43  
45 44 @Test
... ...
yudao-module-member/src/test/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImplTest.java
... ... @@ -13,10 +13,10 @@ import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi;
13 13 import jakarta.annotation.Resource;
14 14 import org.junit.jupiter.api.Disabled;
15 15 import org.junit.jupiter.api.Test;
16   -import org.springframework.boot.test.mock.mockito.MockBean;
17 16 import org.springframework.context.annotation.Import;
18 17 import org.springframework.data.redis.core.StringRedisTemplate;
19 18 import org.springframework.security.crypto.password.PasswordEncoder;
  19 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
20 20  
21 21 import java.util.function.Consumer;
22 22  
... ... @@ -44,13 +44,13 @@ public class MemberUserServiceImplTest extends BaseDbAndRedisUnitTest {
44 44 @Resource
45 45 private MemberUserMapper userMapper;
46 46  
47   - @MockBean
  47 + @MockitoBean
48 48 private MemberAuthServiceImpl authService;
49 49  
50   - @MockBean
  50 + @MockitoBean
51 51 private PasswordEncoder passwordEncoder;
52 52  
53   - @MockBean
  53 + @MockitoBean
54 54 private SmsCodeApi smsCodeApi;
55 55  
56 56 // TODO 芋艿:后续重构这个单测
... ...
yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/api/order/dto/PayOrderCreateReqDTO.java
1 1 package cn.iocoder.yudao.module.pay.api.order.dto;
2 2  
  3 +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
  4 +import cn.iocoder.yudao.framework.common.validation.InEnum;
3 5 import jakarta.validation.constraints.DecimalMin;
4 6 import jakarta.validation.constraints.NotEmpty;
5 7 import jakarta.validation.constraints.NotNull;
... ... @@ -22,12 +24,23 @@ public class PayOrderCreateReqDTO implements Serializable {
22 24 */
23 25 @NotNull(message = "应用标识不能为空")
24 26 private String appKey;
  27 +
25 28 /**
26 29 * 用户 IP
27 30 */
28 31 @NotEmpty(message = "用户 IP 不能为空")
29 32 private String userIp;
30 33  
  34 + /**
  35 + * 用户编号
  36 + */
  37 + private Long userId;
  38 + /**
  39 + * 用户类型
  40 + */
  41 + @InEnum(UserTypeEnum.class)
  42 + private Integer userType;
  43 +
31 44 // ========== 商户相关字段 ==========
32 45  
33 46 /**
... ...
yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/api/refund/dto/PayRefundCreateReqDTO.java
1 1 package cn.iocoder.yudao.module.pay.api.refund.dto;
2 2  
  3 +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
  4 +import cn.iocoder.yudao.framework.common.validation.InEnum;
3 5 import jakarta.validation.constraints.Min;
4 6 import jakarta.validation.constraints.NotEmpty;
5 7 import jakarta.validation.constraints.NotNull;
... ... @@ -19,12 +21,23 @@ public class PayRefundCreateReqDTO {
19 21 */
20 22 @NotNull(message = "应用标识不能为空")
21 23 private String appKey;
  24 +
22 25 /**
23 26 * 用户 IP
24 27 */
25 28 @NotEmpty(message = "用户 IP 不能为空")
26 29 private String userIp;
27 30  
  31 + /**
  32 + * 用户编号
  33 + */
  34 + private Long userId;
  35 + /**
  36 + * 用户类型
  37 + */
  38 + @InEnum(UserTypeEnum.class)
  39 + private Integer userType;
  40 +
28 41 // ========== 商户相关字段 ==========
29 42 /**
30 43 * 商户订单编号
... ...
yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/api/transfer/dto/PayTransferCreateReqDTO.java
1 1 package cn.iocoder.yudao.module.pay.api.transfer.dto;
2 2  
3 3 import cn.hutool.core.util.StrUtil;
  4 +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
4 5 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
  6 +import cn.iocoder.yudao.framework.common.validation.InEnum;
5 7 import jakarta.validation.constraints.Min;
6 8 import jakarta.validation.constraints.NotEmpty;
7 9 import jakarta.validation.constraints.NotNull;
... ... @@ -27,22 +29,22 @@ public class PayTransferCreateReqDTO {
27 29 private String appKey;
28 30  
29 31 /**
30   - * 转账渠道
  32 + * 用户 IP
31 33 */
32   - @NotEmpty(message = "转账渠道不能为空")
33   - private String channelCode;
  34 + @NotEmpty(message = "用户 IP 不能为空")
  35 + private String userIp;
34 36  
35 37 /**
36   - * 转账渠道的额外参数
  38 + * 用户编号
37 39 */
38   - private Map<String, String> channelExtras;
39   -
  40 + private Long userId;
40 41 /**
41   - * 用户 IP
  42 + * 用户类型
42 43 */
43   - @NotEmpty(message = "用户 IP 不能为空")
44   - private String userIp;
  44 + @InEnum(UserTypeEnum.class)
  45 + private Integer userType;
45 46  
  47 + // ========== 商户相关字段 ==========
46 48 /**
47 49 * 商户转账单编号
48 50 */
... ... @@ -76,6 +78,17 @@ public class PayTransferCreateReqDTO {
76 78 private String userName;
77 79  
78 80 /**
  81 + * 转账渠道
  82 + */
  83 + @NotEmpty(message = "转账渠道不能为空")
  84 + private String channelCode;
  85 +
  86 + /**
  87 + * 转账渠道的额外参数
  88 + */
  89 + private Map<String, String> channelExtras;
  90 +
  91 + /**
79 92 * 【微信】现金营销场景
80 93 *
81 94 * @param activityName 活动名称
... ...
yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/demo/PayDemoWithdrawController.java
... ... @@ -19,6 +19,7 @@ import org.springframework.validation.annotation.Validated;
19 19 import org.springframework.web.bind.annotation.*;
20 20  
21 21 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  22 +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
22 23  
23 24 @Tag(name = "管理后台 - 示例提现订单") // 目的:演示转账功能
24 25 @RestController
... ... @@ -40,7 +41,7 @@ public class PayDemoWithdrawController {
40 41 @Operation(summary = "提现单转账")
41 42 @Parameter(name = "id", required = true, description = "提现单编号", example = "1024")
42 43 public CommonResult<Long> transferDemoWithdraw(@RequestParam("id") Long id) {
43   - Long payTransferId = demoWithdrawService.transferDemoWithdraw(id);
  44 + Long payTransferId = demoWithdrawService.transferDemoWithdraw(id, getLoginUserId());
44 45 return success(payTransferId);
45 46 }
46 47  
... ...
yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo/PayOrderExcelVO.java
... ... @@ -4,7 +4,7 @@ import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5 5 import cn.iocoder.yudao.framework.excel.core.convert.MoneyConvert;
6 6 import cn.iocoder.yudao.module.pay.enums.DictTypeConstants;
7   -import com.alibaba.excel.annotation.ExcelProperty;
  7 +import cn.idev.excel.annotation.ExcelProperty;
8 8 import lombok.Data;
9 9  
10 10 import java.time.LocalDateTime;
... ...
yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundExcelVO.java
... ... @@ -4,7 +4,7 @@ import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5 5 import cn.iocoder.yudao.framework.excel.core.convert.MoneyConvert;
6 6 import cn.iocoder.yudao.module.pay.enums.DictTypeConstants;
7   -import com.alibaba.excel.annotation.ExcelProperty;
  7 +import cn.idev.excel.annotation.ExcelProperty;
8 8 import lombok.Data;
9 9  
10 10 import java.time.LocalDateTime;
... ...
yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/transfer/vo/PayTransferRespVO.java
... ... @@ -5,8 +5,8 @@ import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5 5 import cn.iocoder.yudao.framework.excel.core.convert.MoneyConvert;
6 6 import cn.iocoder.yudao.module.pay.enums.DictTypeConstants;
7 7  
8   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
9   -import com.alibaba.excel.annotation.ExcelProperty;
  8 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  9 +import cn.idev.excel.annotation.ExcelProperty;
10 10 import io.swagger.v3.oas.annotations.media.Schema;
11 11 import lombok.*;
12 12 import java.time.LocalDateTime;
... ...
yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/controller/app/order/AppPayOrderController.java
1 1 package cn.iocoder.yudao.module.pay.controller.app.order;
2 2  
  3 +import cn.hutool.core.util.ObjUtil;
3 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
5 6 import cn.iocoder.yudao.module.pay.controller.admin.order.vo.PayOrderRespVO;
6 7 import cn.iocoder.yudao.module.pay.controller.admin.order.vo.PayOrderSubmitRespVO;
7 8 import cn.iocoder.yudao.module.pay.controller.app.order.vo.AppPayOrderSubmitReqVO;
8 9 import cn.iocoder.yudao.module.pay.controller.app.order.vo.AppPayOrderSubmitRespVO;
9   -import cn.iocoder.yudao.module.pay.convert.order.PayOrderConvert;
10 10 import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderDO;
11 11 import cn.iocoder.yudao.module.pay.dal.dataobject.wallet.PayWalletDO;
12 12 import cn.iocoder.yudao.module.pay.enums.PayChannelEnum;
... ... @@ -52,6 +52,15 @@ public class AppPayOrderController {
52 52 public CommonResult<PayOrderRespVO> getOrder(@RequestParam("id") Long id,
53 53 @RequestParam(value = "sync", required = false) Boolean sync) {
54 54 PayOrderDO order = payOrderService.getOrder(id);
  55 + if (order== null) {
  56 + return success(null);
  57 + }
  58 + // 重要:校验订单是否是当前用户,避免越权
  59 + if (order.getUserId() != null // 特殊:早期订单未存储 userId,所以忽略
  60 + && ObjUtil.notEqual(order.getUserId(), getLoginUserId())) {
  61 + return success(null);
  62 + }
  63 +
55 64 // sync 仅在等待支付
56 65 if (Boolean.TRUE.equals(sync) && PayOrderStatusEnum.isWaiting(order.getStatus())) {
57 66 payOrderService.syncOrderQuietly(order.getId());
... ... @@ -75,7 +84,7 @@ public class AppPayOrderController {
75 84  
76 85 // 2. 提交支付
77 86 PayOrderSubmitRespVO respVO = payOrderService.submitOrder(reqVO, getClientIP());
78   - return success(PayOrderConvert.INSTANCE.convert3(respVO));
  87 + return success(BeanUtils.toBean(respVO, AppPayOrderSubmitRespVO.class));
79 88 }
80 89  
81 90 }
... ...
yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/convert/order/PayOrderConvert.java
... ... @@ -3,14 +3,13 @@ package cn.iocoder.yudao.module.pay.convert.order;
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
5 5 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
6   -import cn.iocoder.yudao.module.pay.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO;
7 6 import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderCreateReqDTO;
8 7 import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderRespDTO;
9 8 import cn.iocoder.yudao.module.pay.controller.admin.order.vo.*;
10   -import cn.iocoder.yudao.module.pay.controller.app.order.vo.AppPayOrderSubmitRespVO;
11 9 import cn.iocoder.yudao.module.pay.dal.dataobject.app.PayAppDO;
12 10 import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderDO;
13 11 import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderExtensionDO;
  12 +import cn.iocoder.yudao.module.pay.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO;
14 13 import org.mapstruct.Mapper;
15 14 import org.mapstruct.Mapping;
16 15 import org.mapstruct.factory.Mappers;
... ... @@ -69,6 +68,4 @@ public interface PayOrderConvert {
69 68 @Mapping(source = "order.status", target = "status")
70 69 PayOrderSubmitRespVO convert(PayOrderDO order, cn.iocoder.yudao.module.pay.framework.pay.core.client.dto.order.PayOrderRespDTO respDTO);
71 70  
72   - AppPayOrderSubmitRespVO convert3(PayOrderSubmitRespVO bean);
73   -
74 71 }
... ...
yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/order/PayOrderDO.java
... ... @@ -49,6 +49,15 @@ public class PayOrderDO extends BaseDO {
49 49 */
50 50 private String channelCode;
51 51  
  52 + /**
  53 + * 用户编号
  54 + */
  55 + private Long userId;
  56 + /**
  57 + * 用户类型
  58 + */
  59 + private Integer userType;
  60 +
52 61 // ========== 商户相关字段 ==========
53 62  
54 63 /**
... ...
yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/refund/PayRefundDO.java
... ... @@ -77,6 +77,15 @@ public class PayRefundDO extends BaseDO {
77 77 */
78 78 private String orderNo;
79 79  
  80 + /**
  81 + * 用户编号
  82 + */
  83 + private Long userId;
  84 + /**
  85 + * 用户类型
  86 + */
  87 + private Integer userType;
  88 +
80 89 // ========== 商户相关字段 ==========
81 90 /**
82 91 * 商户订单编号
... ...
yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/transfer/PayTransferDO.java
... ... @@ -30,7 +30,6 @@ public class PayTransferDO extends BaseDO {
30 30 */
31 31 @TableId
32 32 private Long id;
33   -
34 33 /**
35 34 * 转账单号
36 35 */
... ... @@ -42,14 +41,12 @@ public class PayTransferDO extends BaseDO {
42 41 * 关联 {@link PayAppDO#getId()}
43 42 */
44 43 private Long appId;
45   -
46 44 /**
47 45 * 转账渠道编号
48 46 *
49 47 * 关联 {@link PayChannelDO#getId()}
50 48 */
51 49 private Long channelId;
52   -
53 50 /**
54 51 * 转账渠道编码
55 52 *
... ... @@ -57,6 +54,15 @@ public class PayTransferDO extends BaseDO {
57 54 */
58 55 private String channelCode;
59 56  
  57 + /**
  58 + * 用户编号
  59 + */
  60 + private Long userId;
  61 + /**
  62 + * 用户类型
  63 + */
  64 + private Integer userType;
  65 +
60 66 // ========== 商户相关字段 ==========
61 67 /**
62 68 * 商户转账单编号
... ...
yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/service/demo/PayDemoOrderServiceImpl.java
... ... @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.pay.service.demo;
3 3 import cn.hutool.core.lang.Assert;
4 4 import cn.hutool.core.util.ObjUtil;
5 5 import cn.hutool.core.util.ObjectUtil;
  6 +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
6 7 import cn.iocoder.yudao.framework.common.pojo.PageParam;
7 8 import cn.iocoder.yudao.framework.common.pojo.PageResult;
8 9 import cn.iocoder.yudao.module.pay.api.order.PayOrderApi;
... ... @@ -90,6 +91,7 @@ public class PayDemoOrderServiceImpl implements PayDemoOrderService {
90 91 // 2.1 创建支付单
91 92 Long payOrderId = payOrderApi.createOrder(new PayOrderCreateReqDTO()
92 93 .setAppKey(PAY_APP_KEY).setUserIp(getClientIP()) // 支付应用
  94 + .setUserId(userId).setUserType(UserTypeEnum.ADMIN.getValue()) // 用户信息
93 95 .setMerchantOrderId(demoOrder.getId().toString()) // 业务的订单编号
94 96 .setSubject(spuName).setBody("").setPrice(price) // 价格信息
95 97 .setExpireTime(addTime(Duration.ofHours(2L)))); // 支付的过期时间
... ... @@ -189,6 +191,7 @@ public class PayDemoOrderServiceImpl implements PayDemoOrderService {
189 191 // 2.2 创建退款单
190 192 Long payRefundId = payRefundApi.createRefund(new PayRefundCreateReqDTO()
191 193 .setAppKey(PAY_APP_KEY).setUserIp(getClientIP()) // 支付应用
  194 + .setUserId(order.getUserId()).setUserType(UserTypeEnum.ADMIN.getValue()) // 用户信息
192 195 .setMerchantOrderId(String.valueOf(order.getId())) // 支付单号
193 196 .setMerchantRefundId(refundId)
194 197 .setReason("想退钱").setPrice(order.getPrice()));// 价格信息
... ...
yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/service/demo/PayDemoWithdrawService.java
... ... @@ -26,9 +26,10 @@ public interface PayDemoWithdrawService {
26 26 * 提现单转账
27 27 *
28 28 * @param id 提现单编号
  29 + * @param userId 用户编号
29 30 * @return 转账编号
30 31 */
31   - Long transferDemoWithdraw(Long id);
  32 + Long transferDemoWithdraw(Long id, Long userId);
32 33  
33 34 /**
34 35 * 获得示例提现单分页
... ...
yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/service/demo/PayDemoWithdrawServiceImpl.java
... ... @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.pay.service.demo;
2 2  
3 3 import cn.hutool.core.lang.Assert;
4 4 import cn.hutool.core.util.ObjectUtil;
  5 +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
5 6 import cn.iocoder.yudao.framework.common.pojo.PageParam;
6 7 import cn.iocoder.yudao.framework.common.pojo.PageResult;
7 8 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
... ... @@ -60,7 +61,7 @@ public class PayDemoWithdrawServiceImpl implements PayDemoWithdrawService {
60 61 }
61 62  
62 63 @Override
63   - public Long transferDemoWithdraw(Long id) {
  64 + public Long transferDemoWithdraw(Long id, Long userId) {
64 65 // 1.1 校验提现单
65 66 PayDemoWithdrawDO withdraw = validateDemoWithdrawCanTransfer(id);
66 67 // 1.2 特殊:如果是转账失败的情况,需要充值下
... ... @@ -76,6 +77,7 @@ public class PayDemoWithdrawServiceImpl implements PayDemoWithdrawService {
76 77 // 2.1 创建支付单
77 78 PayTransferCreateReqDTO transferReqDTO = new PayTransferCreateReqDTO()
78 79 .setAppKey(PAY_APP_KEY).setChannelCode(withdraw.getTransferChannelCode()).setUserIp(getClientIP()) // 支付应用
  80 + .setUserId(userId).setUserType(UserTypeEnum.ADMIN.getValue()) // 用户信息
79 81 .setMerchantTransferId(String.valueOf(withdraw.getId())) // 业务的订单编号
80 82 .setSubject(withdraw.getSubject()).setPrice(withdraw.getPrice()) // 价格信息
81 83 .setUserAccount(withdraw.getUserAccount()).setUserName(withdraw.getUserName()); // 收款信息
... ...
yudao-module-pay/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java
... ... @@ -64,8 +64,6 @@ public class PayWalletRechargeServiceImpl implements PayWalletRechargeService {
64 64 private PayWalletService payWalletService;
65 65 @Resource
66 66 private PayOrderService payOrderService;
67   -// @Resource
68   -// private PayRefundService payRefundService;
69 67 @Resource
70 68 private PayWalletRechargePackageService payWalletRechargePackageService;
71 69  
... ... @@ -99,6 +97,7 @@ public class PayWalletRechargeServiceImpl implements PayWalletRechargeService {
99 97 // 2.1 创建支付单
100 98 Long payOrderId = payOrderService.createOrder(new PayOrderCreateReqDTO()
101 99 .setAppKey(payProperties.getWalletPayAppKey()).setUserIp(userIp)
  100 + .setUserId(userId).setUserType(userType) // 用户信息
102 101 .setMerchantOrderId(recharge.getId().toString()) // 业务的订单编号
103 102 .setSubject(WALLET_RECHARGE_ORDER_SUBJECT).setBody("")
104 103 .setPrice(recharge.getPayPrice())
... ... @@ -209,6 +208,7 @@ public class PayWalletRechargeServiceImpl implements PayWalletRechargeService {
209 208 String refundId = walletRechargeId + "-refund";
210 209 Long payRefundId = payRefundApi.createRefund(new PayRefundCreateReqDTO()
211 210 .setAppKey(payProperties.getWalletPayAppKey()).setUserIp(userIp)
  211 + .setUserId(wallet.getUserId()).setUserType(wallet.getUserType()) // 用户信息
212 212 .setMerchantOrderId(walletRechargeId)
213 213 .setMerchantRefundId(refundId)
214 214 .setReason("想退钱").setPrice(walletRecharge.getPayPrice()));
... ...
yudao-module-pay/src/test/java/cn/iocoder/yudao/module/pay/service/app/PayAppServiceTest.java
... ... @@ -11,12 +11,12 @@ import cn.iocoder.yudao.module.pay.dal.dataobject.app.PayAppDO;
11 11 import cn.iocoder.yudao.module.pay.dal.mysql.app.PayAppMapper;
12 12 import cn.iocoder.yudao.module.pay.service.order.PayOrderService;
13 13 import cn.iocoder.yudao.module.pay.service.refund.PayRefundService;
  14 +import jakarta.annotation.Resource;
14 15 import org.junit.jupiter.api.Disabled;
15 16 import org.junit.jupiter.api.Test;
16   -import org.springframework.boot.test.mock.mockito.MockBean;
17 17 import org.springframework.context.annotation.Import;
  18 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
18 19  
19   -import jakarta.annotation.Resource;
20 20 import java.util.Map;
21 21  
22 22 import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
... ... @@ -46,9 +46,9 @@ public class PayAppServiceTest extends BaseDbUnitTest {
46 46 @Resource
47 47 private PayAppMapper appMapper;
48 48  
49   - @MockBean
  49 + @MockitoBean
50 50 private PayOrderService orderService;
51   - @MockBean
  51 + @MockitoBean
52 52 private PayRefundService refundService;
53 53  
54 54 @Test
... ...
yudao-module-pay/src/test/java/cn/iocoder/yudao/module/pay/service/channel/PayChannelServiceTest.java
... ... @@ -2,23 +2,23 @@ package cn.iocoder.yudao.module.pay.service.channel;
2 2  
3 3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 4 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
5   -import cn.iocoder.yudao.module.pay.enums.PayChannelEnum;
6   -import cn.iocoder.yudao.module.pay.framework.pay.core.client.PayClient;
7   -import cn.iocoder.yudao.module.pay.framework.pay.core.client.PayClientFactory;
8   -import cn.iocoder.yudao.module.pay.framework.pay.core.client.impl.alipay.AlipayPayClientConfig;
9   -import cn.iocoder.yudao.module.pay.framework.pay.core.client.impl.weixin.WxPayClientConfig;
10 5 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
11 6 import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelCreateReqVO;
12 7 import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelUpdateReqVO;
13 8 import cn.iocoder.yudao.module.pay.dal.dataobject.channel.PayChannelDO;
14 9 import cn.iocoder.yudao.module.pay.dal.mysql.channel.PayChannelMapper;
  10 +import cn.iocoder.yudao.module.pay.enums.PayChannelEnum;
  11 +import cn.iocoder.yudao.module.pay.framework.pay.core.client.PayClient;
  12 +import cn.iocoder.yudao.module.pay.framework.pay.core.client.PayClientFactory;
  13 +import cn.iocoder.yudao.module.pay.framework.pay.core.client.impl.alipay.AlipayPayClientConfig;
  14 +import cn.iocoder.yudao.module.pay.framework.pay.core.client.impl.weixin.WxPayClientConfig;
15 15 import com.alibaba.fastjson.JSON;
  16 +import jakarta.annotation.Resource;
  17 +import jakarta.validation.Validator;
16 18 import org.junit.jupiter.api.Test;
17   -import org.springframework.boot.test.mock.mockito.MockBean;
18 19 import org.springframework.context.annotation.Import;
  20 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
19 21  
20   -import jakarta.annotation.Resource;
21   -import jakarta.validation.Validator;
22 22 import java.util.Collections;
23 23 import java.util.List;
24 24  
... ... @@ -28,7 +28,8 @@ import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
28 28 import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.*;
29 29 import static org.junit.jupiter.api.Assertions.*;
30 30 import static org.mockito.ArgumentMatchers.eq;
31   -import static org.mockito.Mockito.*;
  31 +import static org.mockito.Mockito.mock;
  32 +import static org.mockito.Mockito.when;
32 33  
33 34 @Import({PayChannelServiceImpl.class})
34 35 public class PayChannelServiceTest extends BaseDbUnitTest {
... ... @@ -39,9 +40,9 @@ public class PayChannelServiceTest extends BaseDbUnitTest {
39 40 @Resource
40 41 private PayChannelMapper channelMapper;
41 42  
42   - @MockBean
  43 + @MockitoBean
43 44 private PayClientFactory payClientFactory;
44   - @MockBean
  45 + @MockitoBean
45 46 private Validator validator;
46 47  
47 48 @Test
... ...
yudao-module-pay/src/test/java/cn/iocoder/yudao/module/pay/service/notify/PayNotifyServiceTest.java
... ... @@ -18,15 +18,15 @@ import cn.iocoder.yudao.module.pay.framework.job.config.PayJobConfiguration;
18 18 import cn.iocoder.yudao.module.pay.service.order.PayOrderService;
19 19 import cn.iocoder.yudao.module.pay.service.refund.PayRefundService;
20 20 import cn.iocoder.yudao.module.pay.service.refund.PayRefundServiceImpl;
  21 +import jakarta.annotation.Resource;
21 22 import org.junit.jupiter.api.Disabled;
22 23 import org.junit.jupiter.api.Test;
23 24 import org.mockito.MockedStatic;
24 25 import org.redisson.api.RLock;
25 26 import org.redisson.api.RedissonClient;
26   -import org.springframework.boot.test.mock.mockito.MockBean;
27 27 import org.springframework.context.annotation.Import;
  28 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
28 29  
29   -import jakarta.annotation.Resource;
30 30 import java.time.Duration;
31 31 import java.util.List;
32 32  
... ... @@ -54,9 +54,9 @@ public class PayNotifyServiceTest extends BaseDbUnitTest {
54 54 @Resource
55 55 private PayNotifyServiceImpl notifyService;
56 56  
57   - @MockBean
  57 + @MockitoBean
58 58 private PayOrderService orderService;
59   - @MockBean
  59 + @MockitoBean
60 60 private PayRefundService refundService;
61 61  
62 62 @Resource
... ... @@ -64,7 +64,7 @@ public class PayNotifyServiceTest extends BaseDbUnitTest {
64 64 @Resource
65 65 private PayNotifyLogMapper notifyLogMapper;
66 66  
67   - @MockBean
  67 + @MockitoBean
68 68 private RedissonClient redissonClient;
69 69  
70 70 @Test
... ...
yudao-module-pay/src/test/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceTest.java
... ... @@ -2,10 +2,6 @@ package cn.iocoder.yudao.module.pay.service.order;
2 2  
3 3 import cn.hutool.extra.spring.SpringUtil;
4 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5   -import cn.iocoder.yudao.module.pay.enums.PayChannelEnum;
6   -import cn.iocoder.yudao.module.pay.framework.pay.core.client.PayClient;
7   -import cn.iocoder.yudao.module.pay.framework.pay.core.client.dto.order.PayOrderRespDTO;
8   -import cn.iocoder.yudao.module.pay.framework.pay.core.enums.PayOrderDisplayModeEnum;
9 5 import cn.iocoder.yudao.framework.test.core.ut.BaseDbAndRedisUnitTest;
10 6 import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderCreateReqDTO;
11 7 import cn.iocoder.yudao.module.pay.controller.admin.order.vo.PayOrderExportReqVO;
... ... @@ -19,9 +15,13 @@ import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderExtensionDO;
19 15 import cn.iocoder.yudao.module.pay.dal.mysql.order.PayOrderExtensionMapper;
20 16 import cn.iocoder.yudao.module.pay.dal.mysql.order.PayOrderMapper;
21 17 import cn.iocoder.yudao.module.pay.dal.redis.no.PayNoRedisDAO;
  18 +import cn.iocoder.yudao.module.pay.enums.PayChannelEnum;
22 19 import cn.iocoder.yudao.module.pay.enums.notify.PayNotifyTypeEnum;
23 20 import cn.iocoder.yudao.module.pay.enums.order.PayOrderStatusEnum;
24 21 import cn.iocoder.yudao.module.pay.framework.pay.config.PayProperties;
  22 +import cn.iocoder.yudao.module.pay.framework.pay.core.client.PayClient;
  23 +import cn.iocoder.yudao.module.pay.framework.pay.core.client.dto.order.PayOrderRespDTO;
  24 +import cn.iocoder.yudao.module.pay.framework.pay.core.enums.PayOrderDisplayModeEnum;
25 25 import cn.iocoder.yudao.module.pay.service.app.PayAppService;
26 26 import cn.iocoder.yudao.module.pay.service.channel.PayChannelService;
27 27 import cn.iocoder.yudao.module.pay.service.notify.PayNotifyService;
... ... @@ -29,8 +29,8 @@ import jakarta.annotation.Resource;
29 29 import org.junit.jupiter.api.BeforeEach;
30 30 import org.junit.jupiter.api.Test;
31 31 import org.mockito.MockedStatic;
32   -import org.springframework.boot.test.mock.mockito.MockBean;
33 32 import org.springframework.context.annotation.Import;
  33 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
34 34  
35 35 import java.time.Duration;
36 36 import java.time.LocalDateTime;
... ... @@ -65,13 +65,13 @@ public class PayOrderServiceTest extends BaseDbAndRedisUnitTest {
65 65 @Resource
66 66 private PayOrderExtensionMapper orderExtensionMapper;
67 67  
68   - @MockBean
  68 + @MockitoBean
69 69 private PayProperties properties;
70   - @MockBean
  70 + @MockitoBean
71 71 private PayAppService appService;
72   - @MockBean
  72 + @MockitoBean
73 73 private PayChannelService channelService;
74   - @MockBean
  74 + @MockitoBean
75 75 private PayNotifyService notifyService;
76 76  
77 77 @BeforeEach
... ...
yudao-module-pay/src/test/java/cn/iocoder/yudao/module/pay/service/refund/PayRefundServiceTest.java
... ... @@ -2,10 +2,6 @@ package cn.iocoder.yudao.module.pay.service.refund;
2 2  
3 3 import cn.hutool.extra.spring.SpringUtil;
4 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5   -import cn.iocoder.yudao.module.pay.enums.PayChannelEnum;
6   -import cn.iocoder.yudao.module.pay.framework.pay.core.client.PayClient;
7   -import cn.iocoder.yudao.module.pay.framework.pay.core.client.dto.refund.PayRefundRespDTO;
8   -import cn.iocoder.yudao.module.pay.framework.pay.core.client.dto.refund.PayRefundUnifiedReqDTO;
9 5 import cn.iocoder.yudao.framework.test.core.ut.BaseDbAndRedisUnitTest;
10 6 import cn.iocoder.yudao.module.pay.api.refund.dto.PayRefundCreateReqDTO;
11 7 import cn.iocoder.yudao.module.pay.controller.admin.refund.vo.PayRefundExportReqVO;
... ... @@ -16,21 +12,25 @@ import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderDO;
16 12 import cn.iocoder.yudao.module.pay.dal.dataobject.refund.PayRefundDO;
17 13 import cn.iocoder.yudao.module.pay.dal.mysql.refund.PayRefundMapper;
18 14 import cn.iocoder.yudao.module.pay.dal.redis.no.PayNoRedisDAO;
  15 +import cn.iocoder.yudao.module.pay.enums.PayChannelEnum;
19 16 import cn.iocoder.yudao.module.pay.enums.notify.PayNotifyTypeEnum;
20 17 import cn.iocoder.yudao.module.pay.enums.order.PayOrderStatusEnum;
21 18 import cn.iocoder.yudao.module.pay.enums.refund.PayRefundStatusEnum;
22 19 import cn.iocoder.yudao.module.pay.framework.pay.config.PayProperties;
  20 +import cn.iocoder.yudao.module.pay.framework.pay.core.client.PayClient;
  21 +import cn.iocoder.yudao.module.pay.framework.pay.core.client.dto.refund.PayRefundRespDTO;
  22 +import cn.iocoder.yudao.module.pay.framework.pay.core.client.dto.refund.PayRefundUnifiedReqDTO;
23 23 import cn.iocoder.yudao.module.pay.service.app.PayAppService;
24 24 import cn.iocoder.yudao.module.pay.service.channel.PayChannelService;
25 25 import cn.iocoder.yudao.module.pay.service.notify.PayNotifyService;
26 26 import cn.iocoder.yudao.module.pay.service.order.PayOrderService;
  27 +import jakarta.annotation.Resource;
27 28 import org.junit.jupiter.api.BeforeEach;
28 29 import org.junit.jupiter.api.Test;
29 30 import org.mockito.MockedStatic;
30   -import org.springframework.boot.test.mock.mockito.MockBean;
31 31 import org.springframework.context.annotation.Import;
  32 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
32 33  
33   -import jakarta.annotation.Resource;
34 34 import java.util.List;
35 35  
36 36 import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
... ... @@ -62,15 +62,15 @@ public class PayRefundServiceTest extends BaseDbAndRedisUnitTest {
62 62 @Resource
63 63 private PayRefundMapper refundMapper;
64 64  
65   - @MockBean
  65 + @MockitoBean
66 66 private PayProperties payProperties;
67   - @MockBean
  67 + @MockitoBean
68 68 private PayOrderService orderService;
69   - @MockBean
  69 + @MockitoBean
70 70 private PayAppService appService;
71   - @MockBean
  71 + @MockitoBean
72 72 private PayChannelService channelService;
73   - @MockBean
  73 + @MockitoBean
74 74 private PayNotifyService notifyService;
75 75  
76 76 @BeforeEach
... ...
yudao-module-pay/src/test/resources/sql/clean.sql
... ... @@ -3,5 +3,6 @@ DELETE FROM pay_channel;
3 3 DELETE FROM pay_order;
4 4 DELETE FROM pay_order_extension;
5 5 DELETE FROM pay_refund;
  6 +DELETE FROM pay_transfer;
6 7 DELETE FROM pay_notify_task;
7 8 DELETE FROM pay_notify_log;
... ...
yudao-module-pay/src/test/resources/sql/create_tables.sql
... ... @@ -45,6 +45,8 @@ CREATE TABLE IF NOT EXISTS `pay_order` (
45 45 `channel_fee_price` bigint(20) DEFAULT 0,
46 46 `status` tinyint(4) NOT NULL,
47 47 `user_ip` varchar(50) NOT NULL,
  48 + `user_id` bigint(20) DEFAULT NULL,
  49 + `user_type` tinyint(4) DEFAULT NULL,
48 50 `expire_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
49 51 `success_time` datetime(0) DEFAULT CURRENT_TIMESTAMP,
50 52 `notify_time` datetime(0) DEFAULT CURRENT_TIMESTAMP,
... ... @@ -97,6 +99,8 @@ CREATE TABLE IF NOT EXISTS `pay_refund` (
97 99 `refund_price` bigint(20) NOT NULL,
98 100 `reason` varchar(256) NOT NULL,
99 101 `user_ip` varchar(50) NULL DEFAULT NULL,
  102 + `user_id` bigint(20) NULL DEFAULT NULL,
  103 + `user_type` tinyint(4) NULL DEFAULT NULL,
100 104 `channel_order_no` varchar(64) NOT NULL,
101 105 `channel_refund_no` varchar(64) NULL DEFAULT NULL,
102 106 `success_time` datetime(0) NULL DEFAULT NULL,
... ... @@ -145,3 +149,32 @@ CREATE TABLE IF NOT EXISTS `pay_notify_log` (
145 149 `deleted` bit(1) NOT NULL DEFAULT FALSE,
146 150 PRIMARY KEY ("id")
147 151 ) COMMENT = '支付通知日志';
  152 +
  153 +CREATE TABLE IF NOT EXISTS `pay_transfer` (
  154 + "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY,
  155 + `no` varchar(64) NOT NULL,
  156 + `app_id` bigint(20) NOT NULL,
  157 + `channel_id` bigint(20) NOT NULL,
  158 + `channel_code` varchar(32) NOT NULL,
  159 + `user_id` bigint(20) NULL DEFAULT NULL,
  160 + `user_type` tinyint(4) NULL DEFAULT NULL,
  161 + `merchant_transfer_id` varchar(64) NOT NULL,
  162 + `price` bigint(20) NOT NULL,
  163 + `subject` varchar(256) NOT NULL,
  164 + `user_account` varchar(256) NOT NULL,
  165 + `user_name` varchar(64) NULL DEFAULT NULL,
  166 + `status` tinyint(4) NOT NULL,
  167 + `notify_url` varchar(1024) NULL DEFAULT NULL,
  168 + `channel_transfer_no` varchar(64) NULL DEFAULT NULL,
  169 + `success_time` datetime(0) NULL DEFAULT NULL,
  170 + `channel_error_code` varchar(128) NULL DEFAULT NULL,
  171 + `channel_error_msg` varchar(256) NULL DEFAULT NULL,
  172 + `channel_notify_data` varchar(1024) NULL DEFAULT NULL,
  173 + `channel_extras` varchar(1024) NULL DEFAULT NULL,
  174 + `creator` varchar(64) NULL DEFAULT '',
  175 + `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP,
  176 + `updater` varchar(64) NULL DEFAULT '',
  177 + `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  178 + `deleted` bit(1) NOT NULL DEFAULT FALSE,
  179 + PRIMARY KEY ("id")
  180 +) COMMENT = '转账单';
... ...
yudao-module-report/src/test/java/cn/iocoder/yudao/module/report/service/goview/GoViewDataServiceImplTest.java
... ... @@ -2,14 +2,14 @@ package cn.iocoder.yudao.module.report.service.goview;
2 2  
3 3 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
4 4 import cn.iocoder.yudao.module.report.controller.admin.goview.vo.data.GoViewDataRespVO;
  5 +import jakarta.annotation.Resource;
5 6 import org.junit.jupiter.api.Test;
6   -import org.springframework.boot.test.mock.mockito.MockBean;
7 7 import org.springframework.context.annotation.Import;
8 8 import org.springframework.jdbc.core.JdbcTemplate;
9 9 import org.springframework.jdbc.support.rowset.SqlRowSet;
10 10 import org.springframework.jdbc.support.rowset.SqlRowSetMetaData;
  11 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
11 12  
12   -import jakarta.annotation.Resource;
13 13 import java.util.Arrays;
14 14  
15 15 import static org.junit.jupiter.api.Assertions.assertEquals;
... ... @@ -23,7 +23,7 @@ public class GoViewDataServiceImplTest extends BaseDbUnitTest {
23 23 @Resource
24 24 private GoViewDataServiceImpl goViewDataService;
25 25  
26   - @MockBean
  26 + @MockitoBean
27 27 private JdbcTemplate jdbcTemplate;
28 28  
29 29 @Test
... ...
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostRespVO.java
... ... @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.system.controller.admin.dept.vo.post;
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5 5 import cn.iocoder.yudao.module.system.enums.DictTypeConstants;
6   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
7   -import com.alibaba.excel.annotation.ExcelProperty;
  6 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  7 +import cn.idev.excel.annotation.ExcelProperty;
8 8 import io.swagger.v3.oas.annotations.media.Schema;
9 9 import lombok.Data;
10 10  
... ...
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/post/PostSimpleRespVO.java
1 1 package cn.iocoder.yudao.module.system.controller.admin.dept.vo.post;
2 2  
3   -import com.alibaba.excel.annotation.ExcelProperty;
  3 +import cn.idev.excel.annotation.ExcelProperty;
4 4 import io.swagger.v3.oas.annotations.media.Schema;
5 5 import lombok.Data;
6 6  
... ...
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataRespVO.java
... ... @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.system.controller.admin.dict.vo.data;
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5 5 import cn.iocoder.yudao.module.system.enums.DictTypeConstants;
6   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
7   -import com.alibaba.excel.annotation.ExcelProperty;
  6 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  7 +import cn.idev.excel.annotation.ExcelProperty;
8 8 import io.swagger.v3.oas.annotations.media.Schema;
9 9 import lombok.Data;
10 10  
... ...
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/type/DictTypeRespVO.java
... ... @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.system.controller.admin.dict.vo.type;
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5 5 import cn.iocoder.yudao.module.system.enums.DictTypeConstants;
6   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
7   -import com.alibaba.excel.annotation.ExcelProperty;
  6 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  7 +import cn.idev.excel.annotation.ExcelProperty;
8 8 import io.swagger.v3.oas.annotations.media.Schema;
9 9 import lombok.Data;
10 10  
... ...
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/OperateLogController.java
... ... @@ -11,6 +11,7 @@ import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.Oper
11 11 import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogRespVO;
12 12 import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO;
13 13 import cn.iocoder.yudao.module.system.service.logger.OperateLogService;
  14 +import com.fhs.core.trans.anno.TransMethodResult;
14 15 import io.swagger.v3.oas.annotations.Operation;
15 16 import io.swagger.v3.oas.annotations.tags.Tag;
16 17 import jakarta.annotation.Resource;
... ... @@ -40,6 +41,7 @@ public class OperateLogController {
40 41 @GetMapping("/page")
41 42 @Operation(summary = "查看操作日志分页列表")
42 43 @PreAuthorize("@ss.hasPermission('system:operate-log:query')")
  44 + @TransMethodResult
43 45 public CommonResult<PageResult<OperateLogRespVO>> pageOperateLog(@Valid OperateLogPageReqVO pageReqVO) {
44 46 PageResult<OperateLogDO> pageResult = operateLogService.getOperateLogPage(pageReqVO);
45 47 return success(BeanUtils.toBean(pageResult, OperateLogRespVO.class));
... ...
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/loginlog/LoginLogRespVO.java
... ... @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.system.controller.admin.logger.vo.loginlog;
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5 5 import cn.iocoder.yudao.module.system.enums.DictTypeConstants;
6   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
7   -import com.alibaba.excel.annotation.ExcelProperty;
  6 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  7 +import cn.idev.excel.annotation.ExcelProperty;
8 8 import io.swagger.v3.oas.annotations.media.Schema;
9 9 import lombok.Data;
10 10  
... ...
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/vo/operatelog/OperateLogRespVO.java
1 1 package cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog;
2 2  
3 3 import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
4   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
5   -import com.alibaba.excel.annotation.ExcelProperty;
  4 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  5 +import cn.idev.excel.annotation.ExcelProperty;
6 6 import com.fhs.core.trans.anno.Trans;
7 7 import com.fhs.core.trans.constant.TransType;
8 8 import com.fhs.core.trans.vo.VO;
... ...
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/vo/role/RoleRespVO.java
... ... @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.system.controller.admin.permission.vo.role;
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5 5 import cn.iocoder.yudao.module.system.enums.DictTypeConstants;
6   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
7   -import com.alibaba.excel.annotation.ExcelProperty;
  6 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  7 +import cn.idev.excel.annotation.ExcelProperty;
8 8 import io.swagger.v3.oas.annotations.media.Schema;
9 9 import jakarta.validation.constraints.NotBlank;
10 10 import lombok.Data;
... ...
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/SmsLogRespVO.java
... ... @@ -4,8 +4,8 @@ import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5 5 import cn.iocoder.yudao.framework.excel.core.convert.JsonConvert;
6 6 import cn.iocoder.yudao.module.system.enums.DictTypeConstants;
7   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
8   -import com.alibaba.excel.annotation.ExcelProperty;
  7 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  8 +import cn.idev.excel.annotation.ExcelProperty;
9 9 import io.swagger.v3.oas.annotations.media.Schema;
10 10 import lombok.Data;
11 11  
... ...
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/template/SmsTemplateRespVO.java
... ... @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.system.controller.admin.sms.vo.template;
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5 5 import cn.iocoder.yudao.module.system.enums.DictTypeConstants;
6   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
7   -import com.alibaba.excel.annotation.ExcelProperty;
  6 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  7 +import cn.idev.excel.annotation.ExcelProperty;
8 8 import io.swagger.v3.oas.annotations.media.Schema;
9 9 import lombok.Data;
10 10  
... ...
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/tenant/TenantRespVO.java
... ... @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant;
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5 5 import cn.iocoder.yudao.module.system.enums.DictTypeConstants;
6   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
7   -import com.alibaba.excel.annotation.ExcelProperty;
  6 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  7 +import cn.idev.excel.annotation.ExcelProperty;
8 8 import io.swagger.v3.oas.annotations.media.Schema;
9 9 import lombok.Data;
10 10  
... ...
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserImportExcelVO.java
... ... @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.system.controller.admin.user.vo.user;
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5 5 import cn.iocoder.yudao.module.system.enums.DictTypeConstants;
6   -import com.alibaba.excel.annotation.ExcelProperty;
  6 +import cn.idev.excel.annotation.ExcelProperty;
7 7 import lombok.AllArgsConstructor;
8 8 import lombok.Builder;
9 9 import lombok.Data;
... ...
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserRespVO.java
... ... @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.system.controller.admin.user.vo.user;
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
5 5 import cn.iocoder.yudao.module.system.enums.DictTypeConstants;
6   -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
7   -import com.alibaba.excel.annotation.ExcelProperty;
  6 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  7 +import cn.idev.excel.annotation.ExcelProperty;
8 8 import io.swagger.v3.oas.annotations.media.Schema;
9 9 import lombok.Data;
10 10  
... ...
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserUpdateStatusReqVO.java
... ... @@ -2,10 +2,11 @@ package cn.iocoder.yudao.module.system.controller.admin.user.vo.user;
2 2  
3 3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 4 import cn.iocoder.yudao.framework.common.validation.InEnum;
  5 +import cn.iocoder.yudao.framework.dict.validation.InDict;
  6 +import cn.iocoder.yudao.module.system.enums.DictTypeConstants;
5 7 import io.swagger.v3.oas.annotations.media.Schema;
6   -import lombok.Data;
7   -
8 8 import jakarta.validation.constraints.NotNull;
  9 +import lombok.Data;
9 10  
10 11 @Schema(description = "管理后台 - 用户更新状态 Request VO")
11 12 @Data
... ... @@ -18,6 +19,7 @@ public class UserUpdateStatusReqVO {
18 19 @Schema(description = "状态,见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
19 20 @NotNull(message = "状态不能为空")
20 21 @InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}")
  22 + @InDict(type = DictTypeConstants.COMMON_STATUS)
21 23 private Integer status;
22 24  
23 25 }
... ...
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/framework/captcha/core/PictureWordCaptchaServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.system.framework.captcha.core;
  2 +
  3 +import com.anji.captcha.model.common.RepCodeEnum;
  4 +import com.anji.captcha.model.common.ResponseModel;
  5 +import com.anji.captcha.model.vo.CaptchaVO;
  6 +import com.anji.captcha.service.impl.AbstractCaptchaService;
  7 +import com.anji.captcha.service.impl.CaptchaServiceFactory;
  8 +import com.anji.captcha.util.AESUtil;
  9 +import com.anji.captcha.util.ImageUtils;
  10 +import com.anji.captcha.util.RandomUtils;
  11 +import org.apache.commons.lang3.StringUtils;
  12 +import cn.hutool.core.util.RandomUtil;
  13 +
  14 +import java.awt.*;
  15 +import java.awt.geom.AffineTransform;
  16 +import java.awt.image.BufferedImage;
  17 +import java.util.Properties;
  18 +
  19 +/**
  20 + * 图片文字验证码
  21 + *
  22 + * @author Tsui
  23 + * @since 2025/7/23 20:44
  24 + */
  25 +public class PictureWordCaptchaServiceImpl extends AbstractCaptchaService {
  26 +
  27 + /**
  28 + * 验证码的基础字符
  29 + */
  30 + private static final String CHARACTERS = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789";
  31 + /**
  32 + * 验证码长度
  33 + */
  34 + private static final Integer LENGTH = 4;
  35 +
  36 + private static final int WIDTH = 120;
  37 + private static final int HEIGHT = 40;
  38 + private static final int LINES = 10;
  39 +
  40 + @Override
  41 + public void init(Properties config) {
  42 + super.init(config);
  43 + }
  44 +
  45 + @Override
  46 + public void destroy(Properties config) {
  47 + logger.info("start-clear-history-data-{}", captchaType());
  48 + }
  49 +
  50 + @Override
  51 + public String captchaType() {
  52 + return "pictureWord";
  53 + }
  54 +
  55 + @Override
  56 + public ResponseModel get(CaptchaVO captchaVO) {
  57 + String text = generateRandomText(LENGTH);
  58 + CaptchaVO imageData = getImageData(text);
  59 + // pointJson 不传到前端,只做后端校验,测试时放开
  60 +// imageData.setPointJson(text);
  61 + return ResponseModel.successData(imageData);
  62 + }
  63 +
  64 + @Override
  65 + public ResponseModel check(CaptchaVO captchaVO) {
  66 + ResponseModel r = super.check(captchaVO);
  67 + if (!validatedReq(r)) {
  68 + return r;
  69 + }
  70 +
  71 + // 取出验证码
  72 + String codeKey = String.format(REDIS_CAPTCHA_KEY, captchaVO.getToken());
  73 + if (!CaptchaServiceFactory.getCache(cacheType).exists(codeKey)) {
  74 + return ResponseModel.errorMsg(RepCodeEnum.API_CAPTCHA_INVALID);
  75 + }
  76 + // 正确的验证码
  77 + String codeValue = CaptchaServiceFactory.getCache(cacheType).get(codeKey);
  78 + String code = getCodeByCodeValue(codeValue);
  79 + String secretKey = getSecretKeyByCodeValue(codeValue);
  80 + // 验证码只用一次,即刻失效
  81 + CaptchaServiceFactory.getCache(cacheType).delete(codeKey);
  82 +
  83 + // 用户输入的验证码(CaptchaVO 中 没有预留字段,暂时用 pointJson 无需加解密)
  84 + String userCode = captchaVO.getPointJson();
  85 + if (!StringUtils.equalsIgnoreCase(code, userCode)) {
  86 + afterValidateFail(captchaVO);
  87 + return ResponseModel.errorMsg(RepCodeEnum.API_CAPTCHA_COORDINATE_ERROR);
  88 + }
  89 +
  90 + // 校验成功,将信息存入缓存
  91 + String value;
  92 + try {
  93 + value = AESUtil.aesEncrypt(captchaVO.getToken().concat("---").concat(userCode), secretKey);
  94 + } catch (Exception e) {
  95 + logger.error("AES 加密失败", e);
  96 + afterValidateFail(captchaVO);
  97 + return ResponseModel.errorMsg(e.getMessage());
  98 + }
  99 + String secondKey = String.format(REDIS_SECOND_CAPTCHA_KEY, value);
  100 + CaptchaServiceFactory.getCache(cacheType).set(secondKey, captchaVO.getToken(), EXPIRESIN_THREE);
  101 + captchaVO.setResult(true);
  102 + captchaVO.resetClientFlag();
  103 + return ResponseModel.successData(captchaVO);
  104 + }
  105 +
  106 + @Override
  107 + public ResponseModel verification(CaptchaVO captchaVO) {
  108 + ResponseModel r = super.verification(captchaVO);
  109 + if (!validatedReq(r)) {
  110 + return r;
  111 + }
  112 + try {
  113 + String codeKey = String.format(REDIS_SECOND_CAPTCHA_KEY, captchaVO.getCaptchaVerification());
  114 + if (!CaptchaServiceFactory.getCache(cacheType).exists(codeKey)) {
  115 + return ResponseModel.errorMsg(RepCodeEnum.API_CAPTCHA_INVALID);
  116 + }
  117 + // 二次校验取值后,即刻失效
  118 + CaptchaServiceFactory.getCache(cacheType).delete(codeKey);
  119 + } catch (Exception e) {
  120 + logger.error("验证码解析失败", e);
  121 + return ResponseModel.errorMsg(e.getMessage());
  122 + }
  123 + return ResponseModel.success();
  124 + }
  125 +
  126 +
  127 + private CaptchaVO getImageData(String text) {
  128 + CaptchaVO dataVO = new CaptchaVO();
  129 + BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
  130 + Graphics2D g = image.createGraphics();
  131 +
  132 + // 设置背景色
  133 + g.setColor(getRandomColor(200, 250));
  134 + g.fillRect(0, 0, WIDTH, HEIGHT);
  135 + // 绘制干扰线
  136 + for (int i = 0; i < LINES; i++) {
  137 + g.setColor(getRandomColor(100, 200));
  138 + int x1 = RandomUtil.randomInt(WIDTH);
  139 + int y1 = RandomUtil.randomInt(HEIGHT);
  140 + int x2 = RandomUtil.randomInt(WIDTH);
  141 + int y2 = RandomUtil.randomInt(HEIGHT);
  142 + g.drawLine(x1, y1, x2, y2);
  143 + }
  144 + // 设置字体
  145 + g.setFont(new Font("Arial", Font.BOLD, 24));
  146 + // 绘制验证码文本
  147 + for (int i = 0; i < text.length(); i++) {
  148 + g.setColor(getRandomColor(20, 130));
  149 + // 文字旋转
  150 + AffineTransform affineTransform = new AffineTransform();
  151 + int x = 20 + i * 20;
  152 + int y = 24 + RandomUtil.randomInt(8);
  153 + // 旋转范围 -45 ~ 45
  154 + affineTransform.setToRotation(Math.toRadians(RandomUtil.randomInt(-45, 45)), x, y);
  155 + g.setTransform(affineTransform);
  156 + g.drawString(text.charAt(i) + "", x, y);
  157 + }
  158 + // 添加噪点
  159 + for (int i = 0; i < 100; i++) {
  160 + int x = RandomUtil.randomInt(WIDTH);
  161 + int y = RandomUtil.randomInt(HEIGHT);
  162 + image.setRGB(x, y, getRandomColor(0, 255).getRGB());
  163 + }
  164 + g.dispose();
  165 +
  166 + String secretKey = null;
  167 + if (captchaAesStatus) {
  168 + secretKey = AESUtil.getKey();
  169 + }
  170 + dataVO.setSecretKey(secretKey);
  171 +
  172 + dataVO.setOriginalImageBase64(ImageUtils.getImageToBase64Str(image).replaceAll("\r|\n", ""));
  173 + dataVO.setToken(RandomUtils.getUUID());
  174 +// dataVO.setSecretKey(secretKey);
  175 + // 将坐标信息存入 redis 中
  176 + String codeKey = String.format(REDIS_CAPTCHA_KEY, dataVO.getToken());
  177 + CaptchaServiceFactory.getCache(cacheType).set(codeKey, getCodeValue(text, secretKey), EXPIRESIN_SECONDS);
  178 + return dataVO;
  179 + }
  180 +
  181 + private String getCodeValue(String text, String secretKey) {
  182 + return text + "," + secretKey;
  183 + }
  184 +
  185 + private String getCodeByCodeValue(String codeValue) {
  186 + return codeValue.split(",")[0];
  187 + }
  188 +
  189 + private String getSecretKeyByCodeValue(String codeValue) {
  190 + return codeValue.split(",")[1];
  191 + }
  192 +
  193 + private Color getRandomColor(int min, int max) {
  194 + int minVal = Math.min(min, max);
  195 + int maxVal = Math.max(min, max);
  196 + int r = RandomUtil.randomInt(minVal, maxVal);
  197 + int g = RandomUtil.randomInt(minVal, maxVal);
  198 + int b = RandomUtil.randomInt(minVal, maxVal);
  199 + return new Color(r, g, b);
  200 + }
  201 +
  202 + /**
  203 + * 生成指定长度的随机字符串
  204 + *
  205 + * @param length 长度
  206 + * @return {@link String}
  207 + */
  208 + public static String generateRandomText(int length) {
  209 + return RandomUtil.randomString(CHARACTERS, length);
  210 + }
  211 +
  212 +}
0 213 \ No newline at end of file
... ...
yudao-module-system/src/main/resources/META-INF/services/com.anji.captcha.service.CaptchaService 0 → 100644
  1 +cn.iocoder.yudao.module.system.framework.captcha.core.PictureWordCaptchaServiceImpl
0 2 \ No newline at end of file
... ...
yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImplTest.java
... ... @@ -26,8 +26,8 @@ import jakarta.validation.Validation;
26 26 import jakarta.validation.Validator;
27 27 import org.junit.jupiter.api.BeforeEach;
28 28 import org.junit.jupiter.api.Test;
29   -import org.springframework.boot.test.mock.mockito.MockBean;
30 29 import org.springframework.context.annotation.Import;
  30 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
31 31  
32 32 import static cn.hutool.core.util.RandomUtil.randomEle;
33 33 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
... ... @@ -45,21 +45,21 @@ public class AdminAuthServiceImplTest extends BaseDbUnitTest {
45 45 @Resource
46 46 private AdminAuthServiceImpl authService;
47 47  
48   - @MockBean
  48 + @MockitoBean
49 49 private AdminUserService userService;
50   - @MockBean
  50 + @MockitoBean
51 51 private CaptchaService captchaService;
52   - @MockBean
  52 + @MockitoBean
53 53 private LoginLogService loginLogService;
54   - @MockBean
  54 + @MockitoBean
55 55 private SocialUserService socialUserService;
56   - @MockBean
  56 + @MockitoBean
57 57 private SmsCodeApi smsCodeApi;
58   - @MockBean
  58 + @MockitoBean
59 59 private OAuth2TokenService oauth2TokenService;
60   - @MockBean
  60 + @MockitoBean
61 61 private MemberService memberService;
62   - @MockBean
  62 + @MockitoBean
63 63 private Validator validator;
64 64  
65 65 @BeforeEach
... ...
yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImplTest.java
... ... @@ -9,11 +9,11 @@ import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataSave
9 9 import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO;
10 10 import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictTypeDO;
11 11 import cn.iocoder.yudao.module.system.dal.mysql.dict.DictDataMapper;
  12 +import jakarta.annotation.Resource;
12 13 import org.junit.jupiter.api.Test;
13   -import org.springframework.boot.test.mock.mockito.MockBean;
14 14 import org.springframework.context.annotation.Import;
  15 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
15 16  
16   -import jakarta.annotation.Resource;
17 17 import java.util.List;
18 18 import java.util.function.Consumer;
19 19  
... ... @@ -35,7 +35,7 @@ public class DictDataServiceImplTest extends BaseDbUnitTest {
35 35  
36 36 @Resource
37 37 private DictDataMapper dictDataMapper;
38   - @MockBean
  38 + @MockitoBean
39 39 private DictTypeService dictTypeService;
40 40  
41 41 @Test
... ...
yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/dict/DictTypeServiceImplTest.java
... ... @@ -8,11 +8,11 @@ import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.DictTypePage
8 8 import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.DictTypeSaveReqVO;
9 9 import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictTypeDO;
10 10 import cn.iocoder.yudao.module.system.dal.mysql.dict.DictTypeMapper;
  11 +import jakarta.annotation.Resource;
11 12 import org.junit.jupiter.api.Test;
12   -import org.springframework.boot.test.mock.mockito.MockBean;
13 13 import org.springframework.context.annotation.Import;
  14 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
14 15  
15   -import jakarta.annotation.Resource;
16 16 import java.util.List;
17 17 import java.util.function.Consumer;
18 18  
... ... @@ -36,7 +36,7 @@ public class DictTypeServiceImplTest extends BaseDbUnitTest {
36 36  
37 37 @Resource
38 38 private DictTypeMapper dictTypeMapper;
39   - @MockBean
  39 + @MockitoBean
40 40 private DictDataService dictDataService;
41 41  
42 42 @Test
... ...
yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/mail/MailAccountServiceImplTest.java
... ... @@ -6,11 +6,11 @@ import cn.iocoder.yudao.module.system.controller.admin.mail.vo.account.MailAccou
6 6 import cn.iocoder.yudao.module.system.controller.admin.mail.vo.account.MailAccountSaveReqVO;
7 7 import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailAccountDO;
8 8 import cn.iocoder.yudao.module.system.dal.mysql.mail.MailAccountMapper;
  9 +import jakarta.annotation.Resource;
9 10 import org.junit.jupiter.api.Test;
10   -import org.springframework.boot.test.mock.mockito.MockBean;
11 11 import org.springframework.context.annotation.Import;
  12 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
12 13  
13   -import jakarta.annotation.Resource;
14 14 import java.util.List;
15 15  
16 16 import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
... ... @@ -36,7 +36,7 @@ public class MailAccountServiceImplTest extends BaseDbUnitTest {
36 36 @Resource
37 37 private MailAccountMapper mailAccountMapper;
38 38  
39   - @MockBean
  39 + @MockitoBean
40 40 private MailTemplateService mailTemplateService;
41 41  
42 42 @Test
... ...
yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/oauth2/OAuth2ApproveServiceImplTest.java
... ... @@ -8,21 +8,23 @@ import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
8 8 import cn.iocoder.yudao.module.system.dal.dataobject.oauth2.OAuth2ApproveDO;
9 9 import cn.iocoder.yudao.module.system.dal.dataobject.oauth2.OAuth2ClientDO;
10 10 import cn.iocoder.yudao.module.system.dal.mysql.oauth2.OAuth2ApproveMapper;
  11 +import jakarta.annotation.Resource;
11 12 import org.assertj.core.util.Lists;
12 13 import org.junit.jupiter.api.Test;
13   -import org.springframework.boot.test.mock.mockito.MockBean;
14 14 import org.springframework.context.annotation.Import;
  15 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
15 16  
16   -import jakarta.annotation.Resource;
17 17 import java.time.LocalDateTime;
18 18 import java.time.ZoneId;
19 19 import java.time.temporal.ChronoUnit;
20   -import java.util.*;
  20 +import java.util.LinkedHashMap;
  21 +import java.util.List;
  22 +import java.util.Map;
21 23  
22 24 import static cn.hutool.core.util.RandomUtil.*;
23 25 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
24   -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString;
25 26 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
  27 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString;
26 28 import static org.junit.jupiter.api.Assertions.*;
27 29 import static org.mockito.ArgumentMatchers.eq;
28 30 import static org.mockito.Mockito.when;
... ... @@ -41,7 +43,7 @@ public class OAuth2ApproveServiceImplTest extends BaseDbUnitTest {
41 43 @Resource
42 44 private OAuth2ApproveMapper oauth2ApproveMapper;
43 45  
44   - @MockBean
  46 + @MockitoBean
45 47 private OAuth2ClientService oauth2ClientService;
46 48  
47 49 @Test
... ...
yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/oauth2/OAuth2TokenServiceImplTest.java
... ... @@ -19,8 +19,8 @@ import cn.iocoder.yudao.module.system.service.user.AdminUserService;
19 19 import jakarta.annotation.Resource;
20 20 import org.assertj.core.util.Lists;
21 21 import org.junit.jupiter.api.Test;
22   -import org.springframework.boot.test.mock.mockito.MockBean;
23 22 import org.springframework.context.annotation.Import;
  23 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
24 24  
25 25 import java.time.LocalDateTime;
26 26 import java.util.List;
... ... @@ -52,9 +52,9 @@ public class OAuth2TokenServiceImplTest extends BaseDbAndRedisUnitTest {
52 52 @Resource
53 53 private OAuth2AccessTokenRedisDAO oauth2AccessTokenRedisDAO;
54 54  
55   - @MockBean
  55 + @MockitoBean
56 56 private OAuth2ClientService oauth2ClientService;
57   - @MockBean
  57 + @MockitoBean
58 58 private AdminUserService adminUserService;
59 59  
60 60 @Test
... ...
yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImplTest.java
... ... @@ -8,11 +8,11 @@ import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO;
8 8 import cn.iocoder.yudao.module.system.dal.mysql.permission.MenuMapper;
9 9 import cn.iocoder.yudao.module.system.enums.permission.MenuTypeEnum;
10 10 import cn.iocoder.yudao.module.system.service.tenant.TenantService;
  11 +import jakarta.annotation.Resource;
11 12 import org.junit.jupiter.api.Test;
12   -import org.springframework.boot.test.mock.mockito.MockBean;
13 13 import org.springframework.context.annotation.Import;
  14 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
14 15  
15   -import jakarta.annotation.Resource;
16 16 import java.util.Collection;
17 17 import java.util.Collections;
18 18 import java.util.List;
... ... @@ -40,9 +40,9 @@ public class MenuServiceImplTest extends BaseDbUnitTest {
40 40 @Resource
41 41 private MenuMapper menuMapper;
42 42  
43   - @MockBean
  43 + @MockitoBean
44 44 private PermissionService permissionService;
45   - @MockBean
  45 + @MockitoBean
46 46 private TenantService tenantService;
47 47  
48 48 @Test
... ...
yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceTest.java
... ... @@ -2,9 +2,9 @@ package cn.iocoder.yudao.module.system.service.permission;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.hutool.extra.spring.SpringUtil;
  5 +import cn.iocoder.yudao.framework.common.biz.system.permission.dto.DeptDataPermissionRespDTO;
5 6 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
6 7 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
7   -import cn.iocoder.yudao.framework.common.biz.system.permission.dto.DeptDataPermissionRespDTO;
8 8 import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
9 9 import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO;
10 10 import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO;
... ... @@ -16,12 +16,12 @@ import cn.iocoder.yudao.module.system.dal.mysql.permission.UserRoleMapper;
16 16 import cn.iocoder.yudao.module.system.enums.permission.DataScopeEnum;
17 17 import cn.iocoder.yudao.module.system.service.dept.DeptService;
18 18 import cn.iocoder.yudao.module.system.service.user.AdminUserService;
  19 +import jakarta.annotation.Resource;
19 20 import org.junit.jupiter.api.Test;
20 21 import org.mockito.MockedStatic;
21   -import org.springframework.boot.test.mock.mockito.MockBean;
22 22 import org.springframework.context.annotation.Import;
  23 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
23 24  
24   -import jakarta.annotation.Resource;
25 25 import java.util.Collection;
26 26 import java.util.List;
27 27 import java.util.Set;
... ... @@ -48,13 +48,13 @@ public class PermissionServiceTest extends BaseDbUnitTest {
48 48 @Resource
49 49 private UserRoleMapper userRoleMapper;
50 50  
51   - @MockBean
  51 + @MockitoBean
52 52 private RoleService roleService;
53   - @MockBean
  53 + @MockitoBean
54 54 private MenuService menuService;
55   - @MockBean
  55 + @MockitoBean
56 56 private DeptService deptService;
57   - @MockBean
  57 + @MockitoBean
58 58 private AdminUserService userService;
59 59  
60 60 @Test
... ...
yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImplTest.java
... ... @@ -10,12 +10,12 @@ import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO;
10 10 import cn.iocoder.yudao.module.system.dal.mysql.permission.RoleMapper;
11 11 import cn.iocoder.yudao.module.system.enums.permission.DataScopeEnum;
12 12 import cn.iocoder.yudao.module.system.enums.permission.RoleTypeEnum;
  13 +import jakarta.annotation.Resource;
13 14 import org.junit.jupiter.api.Test;
14 15 import org.mockito.MockedStatic;
15   -import org.springframework.boot.test.mock.mockito.MockBean;
16 16 import org.springframework.context.annotation.Import;
  17 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
17 18  
18   -import jakarta.annotation.Resource;
19 19 import java.util.Collection;
20 20 import java.util.List;
21 21 import java.util.Set;
... ... @@ -44,7 +44,7 @@ public class RoleServiceImplTest extends BaseDbUnitTest {
44 44 @Resource
45 45 private RoleMapper roleMapper;
46 46  
47   - @MockBean
  47 + @MockitoBean
48 48 private PermissionService permissionService;
49 49  
50 50 @Test
... ...
yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelServiceTest.java
... ... @@ -3,19 +3,19 @@ package cn.iocoder.yudao.module.system.service.sms;
3 3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
6   -import cn.iocoder.yudao.module.system.framework.sms.core.client.SmsClient;
7   -import cn.iocoder.yudao.module.system.framework.sms.core.client.SmsClientFactory;
8   -import cn.iocoder.yudao.module.system.framework.sms.core.property.SmsChannelProperties;
9 6 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
10 7 import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelPageReqVO;
11 8 import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelSaveReqVO;
12 9 import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsChannelDO;
13 10 import cn.iocoder.yudao.module.system.dal.mysql.sms.SmsChannelMapper;
  11 +import cn.iocoder.yudao.module.system.framework.sms.core.client.SmsClient;
  12 +import cn.iocoder.yudao.module.system.framework.sms.core.client.SmsClientFactory;
  13 +import cn.iocoder.yudao.module.system.framework.sms.core.property.SmsChannelProperties;
  14 +import jakarta.annotation.Resource;
14 15 import org.junit.jupiter.api.Test;
15   -import org.springframework.boot.test.mock.mockito.MockBean;
16 16 import org.springframework.context.annotation.Import;
  17 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
17 18  
18   -import jakarta.annotation.Resource;
19 19 import java.util.List;
20 20  
21 21 import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
... ... @@ -28,7 +28,8 @@ import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.SMS_CHANNE
28 28 import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.SMS_CHANNEL_NOT_EXISTS;
29 29 import static org.junit.jupiter.api.Assertions.*;
30 30 import static org.mockito.ArgumentMatchers.eq;
31   -import static org.mockito.Mockito.*;
  31 +import static org.mockito.Mockito.mock;
  32 +import static org.mockito.Mockito.when;
32 33  
33 34 @Import(SmsChannelServiceImpl.class)
34 35 public class SmsChannelServiceTest extends BaseDbUnitTest {
... ... @@ -39,9 +40,9 @@ public class SmsChannelServiceTest extends BaseDbUnitTest {
39 40 @Resource
40 41 private SmsChannelMapper smsChannelMapper;
41 42  
42   - @MockBean
  43 + @MockitoBean
43 44 private SmsClientFactory smsClientFactory;
44   - @MockBean
  45 + @MockitoBean
45 46 private SmsTemplateService smsTemplateService;
46 47  
47 48 @Test
... ...
yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeServiceImplTest.java
... ... @@ -12,8 +12,8 @@ import cn.iocoder.yudao.module.system.framework.sms.config.SmsCodeProperties;
12 12 import jakarta.annotation.Resource;
13 13 import org.junit.jupiter.api.BeforeEach;
14 14 import org.junit.jupiter.api.Test;
15   -import org.springframework.boot.test.mock.mockito.MockBean;
16 15 import org.springframework.context.annotation.Import;
  16 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
17 17  
18 18 import java.time.Duration;
19 19 import java.time.LocalDateTime;
... ... @@ -38,9 +38,9 @@ public class SmsCodeServiceImplTest extends BaseDbUnitTest {
38 38 @Resource
39 39 private SmsCodeMapper smsCodeMapper;
40 40  
41   - @MockBean
  41 + @MockitoBean
42 42 private SmsCodeProperties smsCodeProperties;
43   - @MockBean
  43 + @MockitoBean
44 44 private SmsSendService smsSendService;
45 45  
46 46 @BeforeEach
... ...
yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceImplTest.java
... ... @@ -5,9 +5,6 @@ import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
5 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 6 import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils;
7 7 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
8   -import cn.iocoder.yudao.module.system.framework.sms.core.client.SmsClient;
9   -import cn.iocoder.yudao.module.system.framework.sms.core.client.dto.SmsTemplateRespDTO;
10   -import cn.iocoder.yudao.module.system.framework.sms.core.enums.SmsTemplateAuditStatusEnum;
11 8 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
12 9 import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplatePageReqVO;
13 10 import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateSaveReqVO;
... ... @@ -15,12 +12,15 @@ import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsChannelDO;
15 12 import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsTemplateDO;
16 13 import cn.iocoder.yudao.module.system.dal.mysql.sms.SmsTemplateMapper;
17 14 import cn.iocoder.yudao.module.system.enums.sms.SmsTemplateTypeEnum;
  15 +import cn.iocoder.yudao.module.system.framework.sms.core.client.SmsClient;
  16 +import cn.iocoder.yudao.module.system.framework.sms.core.client.dto.SmsTemplateRespDTO;
  17 +import cn.iocoder.yudao.module.system.framework.sms.core.enums.SmsTemplateAuditStatusEnum;
18 18 import com.google.common.collect.Lists;
  19 +import jakarta.annotation.Resource;
19 20 import org.junit.jupiter.api.Test;
20   -import org.springframework.boot.test.mock.mockito.MockBean;
21 21 import org.springframework.context.annotation.Import;
  22 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
22 23  
23   -import jakarta.annotation.Resource;
24 24 import java.util.List;
25 25 import java.util.Map;
26 26 import java.util.function.Consumer;
... ... @@ -45,9 +45,9 @@ public class SmsTemplateServiceImplTest extends BaseDbUnitTest {
45 45 @Resource
46 46 private SmsTemplateMapper smsTemplateMapper;
47 47  
48   - @MockBean
  48 + @MockitoBean
49 49 private SmsChannelService smsChannelService;
50   - @MockBean
  50 + @MockitoBean
51 51 private SmsClient smsClient;
52 52  
53 53 @Test
... ...
yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImplTest.java
... ... @@ -28,9 +28,9 @@ import me.zhyd.oauth.request.AuthRequest;
28 28 import me.zhyd.oauth.utils.AuthStateUtils;
29 29 import org.junit.jupiter.api.Test;
30 30 import org.mockito.MockedStatic;
31   -import org.springframework.boot.test.mock.mockito.MockBean;
32 31 import org.springframework.context.annotation.Import;
33 32 import org.springframework.data.redis.core.StringRedisTemplate;
  33 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
34 34  
35 35 import static cn.hutool.core.util.RandomUtil.randomEle;
36 36 import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
... ... @@ -55,18 +55,18 @@ public class SocialClientServiceImplTest extends BaseDbUnitTest {
55 55 @Resource
56 56 private SocialClientMapper socialClientMapper;
57 57  
58   - @MockBean
  58 + @MockitoBean
59 59 private AuthRequestFactory authRequestFactory;
60 60  
61   - @MockBean
  61 + @MockitoBean
62 62 private WxMpService wxMpService;
63   - @MockBean
  63 + @MockitoBean
64 64 private WxMpProperties wxMpProperties;
65   - @MockBean
  65 + @MockitoBean
66 66 private StringRedisTemplate stringRedisTemplate;
67   - @MockBean
  67 + @MockitoBean
68 68 private WxMaService wxMaService;
69   - @MockBean
  69 + @MockitoBean
70 70 private WxMaProperties wxMaProperties;
71 71  
72 72 @Test
... ...
yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/social/SocialUserServiceImplTest.java
... ... @@ -14,8 +14,8 @@ import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum;
14 14 import jakarta.annotation.Resource;
15 15 import me.zhyd.oauth.model.AuthUser;
16 16 import org.junit.jupiter.api.Test;
17   -import org.springframework.boot.test.mock.mockito.MockBean;
18 17 import org.springframework.context.annotation.Import;
  18 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
19 19  
20 20 import java.util.List;
21 21  
... ... @@ -50,7 +50,7 @@ public class SocialUserServiceImplTest extends BaseDbUnitTest {
50 50 @Resource
51 51 private SocialUserBindMapper socialUserBindMapper;
52 52  
53   - @MockBean
  53 + @MockitoBean
54 54 private SocialClientService socialClientService;
55 55  
56 56 @Test
... ...
yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/tenant/TenantPackageServiceImplTest.java
... ... @@ -8,11 +8,11 @@ import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.packages.Tenant
8 8 import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantDO;
9 9 import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantPackageDO;
10 10 import cn.iocoder.yudao.module.system.dal.mysql.tenant.TenantPackageMapper;
  11 +import jakarta.annotation.Resource;
11 12 import org.junit.jupiter.api.Test;
12   -import org.springframework.boot.test.mock.mockito.MockBean;
13 13 import org.springframework.context.annotation.Import;
  14 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
14 15  
15   -import jakarta.annotation.Resource;
16 16 import java.util.List;
17 17  
18 18 import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
... ... @@ -42,7 +42,7 @@ public class TenantPackageServiceImplTest extends BaseDbUnitTest {
42 42 @Resource
43 43 private TenantPackageMapper tenantPackageMapper;
44 44  
45   - @MockBean
  45 + @MockitoBean
46 46 private TenantService tenantService;
47 47  
48 48 @Test
... ...
yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceImplTest.java
... ... @@ -20,12 +20,12 @@ import cn.iocoder.yudao.module.system.service.permission.RoleService;
20 20 import cn.iocoder.yudao.module.system.service.tenant.handler.TenantInfoHandler;
21 21 import cn.iocoder.yudao.module.system.service.tenant.handler.TenantMenuHandler;
22 22 import cn.iocoder.yudao.module.system.service.user.AdminUserService;
  23 +import jakarta.annotation.Resource;
23 24 import org.junit.jupiter.api.BeforeEach;
24 25 import org.junit.jupiter.api.Test;
25   -import org.springframework.boot.test.mock.mockito.MockBean;
26 26 import org.springframework.context.annotation.Import;
  27 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
27 28  
28   -import jakarta.annotation.Resource;
29 29 import java.time.LocalDateTime;
30 30 import java.util.Arrays;
31 31 import java.util.Collections;
... ... @@ -60,17 +60,17 @@ public class TenantServiceImplTest extends BaseDbUnitTest {
60 60 @Resource
61 61 private TenantMapper tenantMapper;
62 62  
63   - @MockBean
  63 + @MockitoBean
64 64 private TenantProperties tenantProperties;
65   - @MockBean
  65 + @MockitoBean
66 66 private TenantPackageService tenantPackageService;
67   - @MockBean
  67 + @MockitoBean
68 68 private AdminUserService userService;
69   - @MockBean
  69 + @MockitoBean
70 70 private RoleService roleService;
71   - @MockBean
  71 + @MockitoBean
72 72 private MenuService menuService;
73   - @MockBean
  73 + @MockitoBean
74 74 private PermissionService permissionService;
75 75  
76 76 @BeforeEach
... ...
yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java
... ... @@ -31,9 +31,9 @@ import jakarta.annotation.Resource;
31 31 import org.junit.jupiter.api.BeforeEach;
32 32 import org.junit.jupiter.api.Test;
33 33 import org.mockito.stubbing.Answer;
34   -import org.springframework.boot.test.mock.mockito.MockBean;
35 34 import org.springframework.context.annotation.Import;
36 35 import org.springframework.security.crypto.password.PasswordEncoder;
  36 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
37 37  
38 38 import java.util.Collection;
39 39 import java.util.List;
... ... @@ -68,19 +68,19 @@ public class AdminUserServiceImplTest extends BaseDbUnitTest {
68 68 @Resource
69 69 private UserPostMapper userPostMapper;
70 70  
71   - @MockBean
  71 + @MockitoBean
72 72 private DeptService deptService;
73   - @MockBean
  73 + @MockitoBean
74 74 private PostService postService;
75   - @MockBean
  75 + @MockitoBean
76 76 private PermissionService permissionService;
77   - @MockBean
  77 + @MockitoBean
78 78 private PasswordEncoder passwordEncoder;
79   - @MockBean
  79 + @MockitoBean
80 80 private TenantService tenantService;
81   - @MockBean
  81 + @MockitoBean
82 82 private FileApi fileApi;
83   - @MockBean
  83 + @MockitoBean
84 84 private ConfigApi configApi;
85 85  
86 86 @BeforeEach
... ...
yudao-server/src/main/resources/application-dev.yaml
... ... @@ -5,6 +5,7 @@ server:
5 5  
6 6 spring:
7 7 autoconfigure:
  8 + # noinspection SpringBootApplicationYaml
8 9 exclude:
9 10 - org.springframework.ai.vectorstore.qdrant.autoconfigure.QdrantVectorStoreAutoConfiguration # 禁用 AI 模块的 Qdrant,手动创建
10 11 - org.springframework.ai.vectorstore.milvus.autoconfigure.MilvusVectorStoreAutoConfiguration # 禁用 AI 模块的 Milvus,手动创建
... ... @@ -33,14 +34,16 @@ spring:
33 34 initial-size: 5 # 初始连接数
34 35 min-idle: 10 # 最小连接池数量
35 36 max-active: 20 # 最大连接池数量
36   - max-wait: 600000 # 配置获取连接等待超时的时间,单位:毫秒
37   - time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒
38   - min-evictable-idle-time-millis: 300000 # 配置一个连接在池中最小生存的时间,单位:毫秒
39   - max-evictable-idle-time-millis: 900000 # 配置一个连接在池中最大生存的时间,单位:毫秒
40   - validation-query: SELECT 1 # 配置检测连接是否有效
  37 + max-wait: 60000 # 配置获取连接等待超时的时间,单位:毫秒(1 分钟)
  38 + time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒(1 分钟)
  39 + min-evictable-idle-time-millis: 600000 # 配置一个连接在池中最小生存的时间,单位:毫秒(10 分钟)
  40 + max-evictable-idle-time-millis: 1800000 # 配置一个连接在池中最大生存的时间,单位:毫秒(30 分钟)
  41 + validation-query: SELECT 1 FROM DUAL # 配置检测连接是否有效
41 42 test-while-idle: true
42 43 test-on-borrow: false
43 44 test-on-return: false
  45 + pool-prepared-statements: true # 是否开启 PreparedStatement 缓存
  46 + max-pool-prepared-statement-per-connection-size: 20 # 每个连接缓存的 PreparedStatement 数量
44 47 primary: master
45 48 datasource:
46 49 master:
... ...
yudao-server/src/main/resources/application-local.yaml
... ... @@ -7,9 +7,6 @@ spring:
7 7 # noinspection SpringBootApplicationYaml
8 8 exclude:
9 9 - org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # 默认 local 环境,不开启 Quartz 的自动配置
10   - - de.codecentric.boot.admin.server.config.AdminServerAutoConfiguration # 禁用 Spring Boot Admin 的 Server 的自动配置
11   - - de.codecentric.boot.admin.server.ui.config.AdminServerUiAutoConfiguration # 禁用 Spring Boot Admin 的 Server UI 的自动配置
12   - - de.codecentric.boot.admin.client.config.SpringBootAdminClientAutoConfiguration # 禁用 Spring Boot Admin 的 Client 的自动配置
13 10 - org.springframework.ai.vectorstore.qdrant.autoconfigure.QdrantVectorStoreAutoConfiguration # 禁用 AI 模块的 Qdrant,手动创建
14 11 - org.springframework.ai.vectorstore.milvus.autoconfigure.MilvusVectorStoreAutoConfiguration # 禁用 AI 模块的 Milvus,手动创建
15 12 # 数据源配置项
... ... @@ -37,14 +34,16 @@ spring:
37 34 initial-size: 1 # 初始连接数
38 35 min-idle: 1 # 最小连接池数量
39 36 max-active: 20 # 最大连接池数量
40   - max-wait: 600000 # 配置获取连接等待超时的时间,单位:毫秒
41   - time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒
42   - min-evictable-idle-time-millis: 300000 # 配置一个连接在池中最小生存的时间,单位:毫秒
43   - max-evictable-idle-time-millis: 900000 # 配置一个连接在池中最大生存的时间,单位:毫秒
  37 + max-wait: 60000 # 配置获取连接等待超时的时间,单位:毫秒(1 分钟)
  38 + time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒(1 分钟)
  39 + min-evictable-idle-time-millis: 600000 # 配置一个连接在池中最小生存的时间,单位:毫秒(10 分钟)
  40 + max-evictable-idle-time-millis: 1800000 # 配置一个连接在池中最大生存的时间,单位:毫秒(30 分钟)
44 41 validation-query: SELECT 1 FROM DUAL # 配置检测连接是否有效
45 42 test-while-idle: true
46 43 test-on-borrow: false
47 44 test-on-return: false
  45 + pool-prepared-statements: true # 是否开启 PreparedStatement 缓存
  46 + max-pool-prepared-statement-per-connection-size: 20 # 每个连接缓存的 PreparedStatement 数量
48 47 primary: master
49 48 datasource:
50 49 master:
... ...
yudao-server/src/main/resources/application.yaml
... ... @@ -96,7 +96,7 @@ spring:
96 96  
97 97 # VO 转换(数据翻译)相关
98 98 easy-trans:
99   - is-enable-global: true # 启用全局翻译(拦截所有 SpringMVC ResponseBody 进行自动翻译 )。如果对于性能要求很高可关闭此配置,或通过 @IgnoreTrans 忽略某个接口
  99 + is-enable-global: false # 【默认禁用,对性能确认压力大】启用全局翻译(拦截所有 SpringMVC ResponseBody 进行自动翻译 )。如果对于性能要求很高可关闭此配置,或通过 @IgnoreTrans 忽略某个接口
100 100  
101 101 --- #################### 验证码相关配置 ####################
102 102  
... ... @@ -107,7 +107,7 @@ aj:
107 107 cache-type: redis # 缓存 local/redis...
108 108 cache-number: 1000 # local 缓存的阈值,达到这个值,清除缓存
109 109 timing-clear: 180 # local定时清除过期缓存(单位秒),设置为0代表不执行
110   - type: blockPuzzle # 验证码类型 default两种都实例化。 blockPuzzle 滑块拼图 clickWord 文字点选
  110 + type: blockPuzzle # 验证码类型 default 三种都实例化。blockPuzzle 滑块拼图、clickWord 文字点选、pictureWord 文本输入
111 111 water-mark: 芋道源码 # 右下角水印文字(我的水印),可使用 https://tool.chinaz.com/tools/unicode.aspx 中文转 Unicode,Linux 可能需要转 unicode
112 112 interference-options: 0 # 滑动干扰项(0/1/2)
113 113 req-frequency-limit-enable: false # 接口请求次数一分钟限制是否开启 true|false
... ...
yudao-server/src/main/resources/logback-spring.xml
1 1 <configuration>
2   - <!-- 引用 Spring Boot 的 logback 基础配置 -->
3   - <include resource="org/springframework/boot/logging/logback/defaults.xml" />
4   - <!-- 变量 yudao.info.base-package,基础业务包 -->
5   - <springProperty scope="context" name="yudao.info.base-package" source="yudao.info.base-package"/>
6   - <!-- 格式化输出:%d 表示日期,%X{tid} SkWalking 链路追踪编号,%thread 表示线程名,%-5level:级别从左显示 5 个字符宽度,%msg:日志消息,%n是换行符 -->
7   - <property name="PATTERN_DEFAULT" value="%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} | %highlight(${LOG_LEVEL_PATTERN:-%5p} ${PID:- }) | %boldYellow(%thread [%tid]) %boldGreen(%-40.40logger{39}) | %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
  2 + <!-- 参考 org/springframework/boot/logging/logback/defaults.xml 配置,优化 CONSOLE_LOG_PATTERN、FILE_LOG_PATTERN -->
  3 + <!-- 格式化输出:%d 表示日期,%thread 表示线程名,%-5level:级别从左显示 5 个字符宽度,%msg:日志消息,%n是换行符 -->
  4 + <!-- CONSOLE_LOG_PATTERN 相比 FILE_LOG_PATTERN 多了 highlight、cyan 等高亮 -->
  5 + <property name="CONSOLE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{50}:%L) - %msg%n"/>
  6 + <property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n"/>
8 7  
9 8 <!-- 控制台 Appender -->
10 9 <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">     
11   - <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
12   - <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
13   - <pattern>${PATTERN_DEFAULT}</pattern>
14   - </layout>
  10 + <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
  11 + <pattern>${CONSOLE_LOG_PATTERN}</pattern>
15 12 </encoder>
16 13 </appender>
17 14  
18 15 <!-- 文件 Appender -->
19 16 <!-- 参考 Spring Boot 的 file-appender.xml 编写 -->
20 17 <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
21   - <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
22   - <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
23   - <pattern>${PATTERN_DEFAULT}</pattern>
24   - </layout>
  18 + <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
  19 + <pattern>${FILE_LOG_PATTERN}</pattern>
25 20 </encoder>
26 21 <!-- 日志文件名 -->
27 22 <file>${LOG_FILE}</file>
  23 + <!-- 滚动策略:基于【每天 + 大小】创建日志文件 -->
28 24 <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
29   - <!-- 滚动后的日志文件名 -->
30   - <fileNamePattern>${LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN:-${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz}</fileNamePattern>
31   - <!-- 启动服务时,是否清理历史日志,一般不建议清理 -->
32   - <cleanHistoryOnStart>${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}</cleanHistoryOnStart>
33   - <!-- 日志文件,到达多少容量,进行滚动 -->
34   - <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB}</maxFileSize>
35   - <!-- 日志文件的总大小,0 表示不限制 -->
36   - <totalSizeCap>${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}</totalSizeCap>
37   - <!-- 日志文件的保留天数 -->
38   - <maxHistory>${LOGBACK_ROLLINGPOLICY_MAX_HISTORY:-30}</maxHistory>
  25 + <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 日志文件输出的文件名 -->
  26 + <maxHistory>30</maxHistory> <!-- 日志文件的保留天数 -->
  27 + <maxFileSize>10MB</maxFileSize> <!-- 日志文件,到达多少容量,进行滚动 -->
39 28 </rollingPolicy>
40 29 </appender>
41 30 <!-- 异步写入日志,提升性能 -->
42 31 <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
43   - <!-- 不丢失日志。默认的,如果队列的 80% 已满,则会丢弃 TRACT、DEBUG、INFO 级别的日志 -->
44   - <discardingThreshold>0</discardingThreshold>
45   - <!-- 更改默认的队列的深度,该值会影响性能。默认值为 256 -->
46   - <queueSize>256</queueSize>
  32 + <discardingThreshold>0</discardingThreshold> <!-- 不丢失日志。默认的,如果队列的 80% 已满,则会丢弃 TRACT、DEBUG、INFO 级别的日志 -->
  33 + <queueSize>512</queueSize> <!-- 更改默认的队列的深度,该值会影响性能。默认值为 256 -->
47 34 <appender-ref ref="FILE"/>
48 35 </appender>
49 36  
50   - <!-- SkyWalking GRPC 日志收集,实现日志中心。注意:SkyWalking 8.4.0 版本开始支持 -->
51   - <appender name="GRPC" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
  37 + <!-- SkyWalking Appender:GRPC 日志收集,实现日志中心 -->
  38 + <!--
  39 + <appender name="SKYWALKING" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
52 40 <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
53 41 <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
54   - <pattern>${PATTERN_DEFAULT}</pattern>
  42 + <pattern>[%tid] ${FILE_LOG_PATTERN}</pattern>
55 43 </layout>
56 44 </encoder>
57 45 </appender>
  46 + -->
58 47  
59   - <!-- 本地环境 -->
60   - <springProfile name="local">
61   - <root level="INFO">
62   - <appender-ref ref="STDOUT"/>
63   - <appender-ref ref="GRPC"/> <!-- 本地环境下,如果不想接入 SkyWalking 日志服务,可以注释掉本行 -->
64   - <appender-ref ref="ASYNC"/> <!-- 本地环境下,如果不想打印日志,可以注释掉本行 -->
65   - </root>
66   - </springProfile>
67   - <!-- 其它环境 -->
68   - <springProfile name="dev,test,stage,prod,default">
69   - <root level="INFO">
70   - <appender-ref ref="STDOUT"/>
71   - <appender-ref ref="ASYNC"/>
72   - <appender-ref ref="GRPC"/>
73   - </root>
74   - </springProfile>
  48 + <root level="INFO">
  49 + <appender-ref ref="STDOUT"/>
  50 + <!-- 本地环境下,如果不想【FILE】打印日志,可以注释掉本行 -->
  51 + <appender-ref ref="ASYNC"/>
  52 + <!-- 如果想接入【SkyWalking 日志服务】,可以取消注释掉本行 -->
  53 + <!-- <appender-ref ref="SKYWALKING"/> -->
  54 + </root>
75 55  
76 56 </configuration>
... ...