Переглянути джерело

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

# Conflicts:
#	yudao-server/src/main/resources/application-local.yaml
YunaiV 1 рік тому
батько
коміт
290f45dd6e
32 змінених файлів з 137 додано та 59 видалено
  1. 3 3
      yudao-dependencies/pom.xml
  2. 5 1
      yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/cache/CacheUtils.java
  3. 32 1
      yudao-framework/yudao-spring-boot-starter-biz-ip/src/main/resources/area.csv
  4. 1 0
      yudao-framework/yudao-spring-boot-starter-biz-sms/src/main/java/cn/iocoder/yudao/framework/sms/core/client/impl/AbstractSmsClient.java
  5. 12 1
      yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/core/context/TenantContextHolder.java
  6. 4 1
      yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/ExcelUtils.java
  7. 1 1
      yudao-framework/yudao-spring-boot-starter-file/src/main/java/cn/iocoder/yudao/framework/file/core/client/s3/S3FileClient.java
  8. 3 0
      yudao-framework/yudao-spring-boot-starter-flowable/src/main/java/cn/iocoder/yudao/framework/flowable/config/YudaoFlowableConfiguration.java
  9. 6 0
      yudao-framework/yudao-spring-boot-starter-mybatis/pom.xml
  10. 14 14
      yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/mapper/BaseMapperX.java
  11. 1 1
      yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/session/WebSocketSessionManagerImpl.java
  12. 4 1
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java
  13. 4 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionServiceImpl.java
  14. 0 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java
  15. 0 1
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/package-info.java
  16. 3 0
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/FileController.java
  17. 4 4
      yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/java/controller/controller.vm
  18. 1 1
      yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/java/controller/vo/saveReqVO.vm
  19. 1 1
      yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/java/service/service.vm
  20. 1 1
      yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/java/service/serviceImpl.vm
  21. 2 2
      yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/java/test/serviceTest.vm
  22. 2 2
      yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/order/PayOrderExtensionMapper.java
  23. 1 1
      yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/demo/PayDemoOrderServiceImpl.java
  24. 2 2
      yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceImpl.java
  25. 1 1
      yudao-module-report/yudao-module-report-biz/pom.xml
  26. 17 0
      yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/jmreport/core/service/JmReportTokenServiceImpl.java
  27. 6 10
      yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/config/UReportConfiguration.java
  28. 1 1
      yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/core/UReportDataSource.java
  29. 1 1
      yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/core/UReportDatabaseProvider.java
  30. 0 3
      yudao-server/src/main/resources/application-dev.yaml
  31. 1 1
      yudao-server/src/main/resources/application-local.yaml
  32. 3 3
      yudao-server/src/main/resources/application.yaml

+ 3 - 3
yudao-dependencies/pom.xml

@@ -51,7 +51,7 @@
         <mapstruct.version>1.5.5.Final</mapstruct.version>
         <hutool-5.version>5.8.23</hutool-5.version>
         <hutool-6.version>6.0.0-M8</hutool-6.version>
-        <easyexcel.verion>3.3.2</easyexcel.verion>
+        <easyexcel.verion>3.3.3</easyexcel.verion>
         <velocity.version>2.3</velocity.version>
         <screw.version>1.0.5</screw.version>
         <fastjson.version>1.2.83</fastjson.version>
@@ -72,7 +72,7 @@
         <aliyun-java-sdk-dysmsapi.version>2.2.1</aliyun-java-sdk-dysmsapi.version>
         <tencentcloud-sdk-java.version>3.1.880</tencentcloud-sdk-java.version>
         <justauth.version>2.0.5</justauth.version>
-        <jimureport.version>1.6.1</jimureport.version>
+        <jimureport.version>1.6.6-beta2</jimureport.version>
         <xercesImpl.version>2.12.2</xercesImpl.version>
         <weixin-java.version>4.5.7.B</weixin-java.version>
         <ureport2.version>2.2.9</ureport2.version>
@@ -651,7 +651,7 @@
             <!-- 积木报表-->
             <dependency>
                 <groupId>org.jeecgframework.jimureport</groupId>
-                <artifactId>jimureport-spring-boot-starter</artifactId>
+                <artifactId>jimureport-spring-boot3-starter</artifactId>
                 <version>${jimureport.version}</version>
                 <exclusions>
                     <exclusion>

+ 5 - 1
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/cache/CacheUtils.java

@@ -1,10 +1,12 @@
 package cn.iocoder.yudao.framework.common.util.cache;
 
+import com.alibaba.ttl.threadpool.TtlExecutors;
 import com.google.common.cache.CacheBuilder;
 import com.google.common.cache.CacheLoader;
 import com.google.common.cache.LoadingCache;
 
 import java.time.Duration;
+import java.util.concurrent.Executor;
 import java.util.concurrent.Executors;
 
 /**
@@ -15,11 +17,13 @@ import java.util.concurrent.Executors;
 public class CacheUtils {
 
     public static <K, V> LoadingCache<K, V> buildAsyncReloadingCache(Duration duration, CacheLoader<K, V> loader) {
+        Executor executor = Executors.newCachedThreadPool(  // TODO 芋艿:可能要思考下,未来要不要做成可配置
+                TtlExecutors.getDefaultDisableInheritableThreadFactory()); // TTL 保证 ThreadLocal 可以透传
         return CacheBuilder.newBuilder()
                 // 只阻塞当前数据加载线程,其他线程返回旧值
                 .refreshAfterWrite(duration)
                 // 通过 asyncReloading 实现全异步加载,包括 refreshAfterWrite 被阻塞的加载线程
-                .build(CacheLoader.asyncReloading(loader, Executors.newCachedThreadPool())); // TODO 芋艿:可能要思考下,未来要不要做成可配置
+                .build(CacheLoader.asyncReloading(loader, executor));
     }
 
 }

+ 32 - 1
yudao-framework/yudao-spring-boot-starter-biz-ip/src/main/resources/area.csv

@@ -490,6 +490,37 @@ id,name,type,parentId
 441700,阳江市,3,440000
 441800,清远市,3,440000
 441900,东莞市,3,440000
+441901,莞城区,4,441900
+441902,南城区,4,441900
+441904,万江区,4,441900
+441905,石碣镇,4,441900
+441906,石龙镇,4,441900
+441907,茶山镇,4,441900
+441908,石排镇,4,441900
+441909,企石镇,4,441900
+441910,横沥镇,4,441900
+441911,桥头镇,4,441900
+441912,谢岗镇,4,441900
+441913,东坑镇,4,441900
+441914,常平镇,4,441900
+441915,寮步镇,4,441900
+441916,大朗镇,4,441900
+441917,麻涌镇,4,441900
+441918,中堂镇,4,441900
+441919,高埗镇,4,441900
+441920,樟木头镇,4,441900
+441921,大岭山镇,4,441900
+441922,望牛墩镇,4,441900
+441923,黄江镇,4,441900
+441924,洪梅镇,4,441900
+441925,清溪镇,4,441900
+441926,沙田镇,4,441900
+441927,道滘镇,4,441900
+441928,塘厦镇,4,441900
+441929,虎门镇,4,441900
+441930,厚街镇,4,441900
+441931,凤岗镇,4,441900
+441932,长安镇,4,441900
 442000,中山市,3,440000
 445100,潮州市,3,440000
 445200,揭阳市,3,440000
@@ -3605,4 +3636,4 @@ id,name,type,parentId
 659008,可克达拉市,4,659000
 659009,昆玉市,4,659000
 659010,胡杨河市,4,659000
-659011,新星市,4,659000
+659011,新星市,4,659000

+ 1 - 0
yudao-framework/yudao-spring-boot-starter-biz-sms/src/main/java/cn/iocoder/yudao/framework/sms/core/client/impl/AbstractSmsClient.java

@@ -41,6 +41,7 @@ public abstract class AbstractSmsClient implements SmsClient {
             return;
         }
         log.info("[refresh][配置({})发生变化,重新初始化]", properties);
+        this.properties = properties;
         // 初始化
         this.init();
     }

+ 12 - 1
yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/core/context/TenantContextHolder.java

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.framework.tenant.core.context;
 
+import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.enums.DocumentEnum;
 import com.alibaba.ttl.TransmittableThreadLocal;
 
@@ -21,7 +22,7 @@ public class TenantContextHolder {
     private static final ThreadLocal<Boolean> IGNORE = new TransmittableThreadLocal<>();
 
     /**
-     * 获得租户编号
+     * 获得租户编号
      *
      * @return 租户编号
      */
@@ -29,6 +30,16 @@ public class TenantContextHolder {
         return TENANT_ID.get();
     }
 
+    /**
+     * 获得租户编号 String
+     *
+     * @return 租户编号
+     */
+    public static String getTenantIdStr() {
+        Long tenantId = getTenantId();
+        return StrUtil.toStringOrNull(tenantId);
+    }
+
     /**
      * 获得租户编号。如果不存在,则抛出 NullPointerException 异常
      *

+ 4 - 1
yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/ExcelUtils.java

@@ -1,12 +1,14 @@
 package cn.iocoder.yudao.framework.excel.core.util;
 
 import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.converters.longconverter.LongStringConverter;
 import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
 import org.springframework.web.multipart.MultipartFile;
 
 import jakarta.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 import java.util.List;
 
 /**
@@ -33,9 +35,10 @@ public class ExcelUtils {
         EasyExcel.write(response.getOutputStream(), head)
                 .autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理
                 .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 基于 column 长度,自动适配。最大 255 宽度
+                .registerConverter(new LongStringConverter()) // 避免 Long 类型丢失精度
                 .sheet(sheetName).doWrite(data);
         // 设置 header 和 contentType。写在最后的原因是,避免报错时,响应 contentType 已经被修改了
-        response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
+        response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, StandardCharsets.UTF_8));
         response.setContentType("application/vnd.ms-excel;charset=UTF-8");
     }
 

+ 1 - 1
yudao-framework/yudao-spring-boot-starter-file/src/main/java/cn/iocoder/yudao/framework/file/core/client/s3/S3FileClient.java

@@ -81,7 +81,7 @@ public class S3FileClient extends AbstractFileClient<S3FileClientConfig> {
         }
         // 腾讯云必须有 region,否则会报错
         if (config.getEndpoint().contains(ENDPOINT_TENCENT)) {
-            return StrUtil.subAfter(config.getEndpoint(), ".cos.", false)
+            return StrUtil.subAfter(config.getEndpoint(), "cos.", false)
                     .replaceAll("." + ENDPOINT_TENCENT, ""); // 去除 Endpoint
         }
         return null;

+ 3 - 0
yudao-framework/yudao-spring-boot-starter-flowable/src/main/java/cn/iocoder/yudao/framework/flowable/config/YudaoFlowableConfiguration.java

@@ -3,6 +3,7 @@ package cn.iocoder.yudao.framework.flowable.config;
 import cn.iocoder.yudao.framework.common.enums.WebFilterOrderEnum;
 import cn.iocoder.yudao.framework.flowable.core.web.FlowableWebFilter;
 import org.springframework.boot.autoconfigure.AutoConfiguration;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.web.servlet.FilterRegistrationBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.core.task.AsyncListenableTaskExecutor;
@@ -17,6 +18,7 @@ public class YudaoFlowableConfiguration {
      * 如果不创建,会导致项目启动时,Flowable 报错的问题
      */
     @Bean
+    @ConditionalOnMissingBean
     public AsyncListenableTaskExecutor taskExecutor() {
         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
         executor.setCorePoolSize(8);
@@ -40,4 +42,5 @@ public class YudaoFlowableConfiguration {
         registrationBean.setOrder(WebFilterOrderEnum.FLOWABLE_FILTER);
         return registrationBean;
     }
+
 }

+ 6 - 0
yudao-framework/yudao-spring-boot-starter-mybatis/pom.xml

@@ -65,6 +65,12 @@
         <dependency>
             <groupId>com.baomidou</groupId>
             <artifactId>dynamic-datasource-spring-boot3-starter</artifactId> <!-- 多数据源 -->
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-undertow</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
 
         <dependency>

+ 14 - 14
yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/mapper/BaseMapperX.java

@@ -136,8 +136,8 @@ public interface BaseMapperX<T> extends MPJBaseMapper<T> {
      *
      * @param entities 实体们
      */
-    default void insertBatch(Collection<T> entities) {
-        Db.saveBatch(entities);
+    default Boolean insertBatch(Collection<T> entities) {
+        return Db.saveBatch(entities);
     }
 
     /**
@@ -146,28 +146,28 @@ public interface BaseMapperX<T> extends MPJBaseMapper<T> {
      * @param entities 实体们
      * @param size     插入数量 Db.saveBatch 默认为 1000
      */
-    default void insertBatch(Collection<T> entities, int size) {
-        Db.saveBatch(entities, size);
+    default Boolean insertBatch(Collection<T> entities, int size) {
+        return Db.saveBatch(entities, size);
     }
 
-    default void updateBatch(T update) {
-        update(update, new QueryWrapper<>());
+    default int updateBatch(T update) {
+        return update(update, new QueryWrapper<>());
     }
 
-    default void updateBatch(Collection<T> entities) {
-        Db.updateBatchById(entities);
+    default Boolean updateBatch(Collection<T> entities) {
+        return Db.updateBatchById(entities);
     }
 
-    default void updateBatch(Collection<T> entities, int size) {
-        Db.updateBatchById(entities, size);
+    default Boolean updateBatch(Collection<T> entities, int size) {
+        return Db.updateBatchById(entities, size);
     }
 
-    default void insertOrUpdate(T entity) {
-        Db.saveOrUpdate(entity);
+    default Boolean insertOrUpdate(T entity) {
+        return  Db.saveOrUpdate(entity);
     }
 
-    default void insertOrUpdateBatch(Collection<T> collection) {
-        Db.saveOrUpdateBatch(collection);
+    default Boolean insertOrUpdateBatch(Collection<T> collection) {
+        return Db.saveOrUpdateBatch(collection);
     }
 
     default int delete(String field, String value) {

+ 1 - 1
yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/session/WebSocketSessionManagerImpl.java

@@ -66,7 +66,7 @@ public class WebSocketSessionManagerImpl implements WebSocketSessionManager {
     @Override
     public void removeSession(WebSocketSession session) {
         // 移除从 idSessions 中
-        idSessions.remove(session.getId(), session);
+        idSessions.remove(session.getId());
         // 移除从 idSessions 中
         LoginUser user = WebSocketFrameworkUtils.getLoginUser(session);
         if (user == null) {

+ 4 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java

@@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
 import cn.iocoder.yudao.framework.common.util.object.PageUtils;
 import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils;
+import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.*;
 import cn.iocoder.yudao.module.bpm.convert.definition.BpmModelConvert;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
@@ -71,7 +72,8 @@ public class BpmModelServiceImpl implements BpmModelService {
             modelQuery.modelCategory(pageVO.getCategory());
         }
         // 执行查询
-        List<Model> models = modelQuery.orderByCreateTime().desc()
+        List<Model> models = modelQuery.modelTenantId(TenantContextHolder.getTenantIdStr())
+                .orderByCreateTime().desc()
                 .listPage(PageUtils.getStart(pageVO), pageVO.getPageSize());
 
         // 获得 Form Map
@@ -107,6 +109,7 @@ public class BpmModelServiceImpl implements BpmModelService {
         // 创建流程定义
         Model model = repositoryService.newModel();
         BpmModelConvert.INSTANCE.copy(model, createReqVO);
+        model.setTenantId(TenantContextHolder.getTenantIdStr());
         // 保存流程定义
         repositoryService.saveModel(model);
         // 保存 BPMN XML

+ 4 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionServiceImpl.java

@@ -6,6 +6,8 @@ import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.PageUtils;
 import cn.iocoder.yudao.framework.flowable.core.util.BpmnModelUtils;
+import cn.iocoder.yudao.framework.flowable.core.util.FlowableUtils;
+import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionListReqVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageItemRespVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageReqVO;
@@ -124,6 +126,7 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
         Deployment deploy = repositoryService.createDeployment()
                 .key(createReqDTO.getKey()).name(createReqDTO.getName()).category(createReqDTO.getCategory())
                 .addBytes(createReqDTO.getKey() + BPMN_FILE_SUFFIX, createReqDTO.getBpmnBytes())
+                .tenantId(TenantContextHolder.getTenantIdStr())
                 .deploy();
 
         // 设置 ProcessDefinition 的 category 分类
@@ -234,6 +237,7 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
             definitionQuery.active();
         }
         // 执行查询
+        definitionQuery.processDefinitionTenantId(TenantContextHolder.getTenantIdStr());
         List<ProcessDefinition> processDefinitions = definitionQuery.list();
         if (CollUtil.isEmpty(processDefinitions)) {
             return Collections.emptyList();

Різницю між файлами не показано, бо вона завелика
+ 0 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java


+ 0 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/package-info.java

@@ -1 +0,0 @@
-package cn.iocoder.yudao.module.bpm.service.task;

+ 3 - 0
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/FileController.java

@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.infra.controller.admin.file;
 
 import cn.hutool.core.io.IoUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.core.util.URLUtil;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
@@ -70,6 +71,8 @@ public class FileController {
         if (StrUtil.isEmpty(path)) {
             throw new IllegalArgumentException("结尾的 path 路径必须传递");
         }
+        // 解码,解决中文路径的问题 https://gitee.com/zhijiantianya/ruoyi-vue-pro/pulls/807/
+        path = URLUtil.decode(path);
 
         // 读取内容
         byte[] content = fileService.getFileContent(configId, path);

+ 4 - 4
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/java/controller/controller.vm

@@ -1,7 +1,7 @@
 package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName};
 
 import org.springframework.web.bind.annotation.*;
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
 import org.springframework.validation.annotation.Validated;
 #if ($sceneEnum.scene == 1)import org.springframework.security.access.prepost.PreAuthorize;#end
 
@@ -9,9 +9,9 @@ import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.Operation;
 
-import javax.validation.constraints.*;
-import javax.validation.*;
-import javax.servlet.http.*;
+import jakarta.validation.constraints.*;
+import jakarta.validation.*;
+import jakarta.servlet.http.*;
 import java.util.*;
 import java.io.IOException;
 

+ 1 - 1
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/java/controller/vo/saveReqVO.vm

@@ -3,7 +3,7 @@ package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePac
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 import java.util.*;
-import javax.validation.constraints.*;
+import jakarta.validation.constraints.*;
 ## 处理 BigDecimal 字段的引入
 import java.util.*;
 #foreach ($column in $columns)

+ 1 - 1
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/java/service/service.vm

@@ -1,7 +1,7 @@
 package ${basePackage}.module.${table.moduleName}.service.${table.businessName};
 
 import java.util.*;
-import javax.validation.*;
+import jakarta.validation.*;
 import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*;
 import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO;
 ## 特殊:主子表专属逻辑

+ 1 - 1
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/java/service/serviceImpl.vm

@@ -1,7 +1,7 @@
 package ${basePackage}.module.${table.moduleName}.service.${table.businessName};
 
 import org.springframework.stereotype.Service;
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.transaction.annotation.Transactional;
 

+ 2 - 2
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/java/test/serviceTest.vm

@@ -4,7 +4,7 @@ import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.mock.mockito.MockBean;
 
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
 
 import ${baseFrameworkPackage}.test.core.ut.BaseDbUnitTest;
 
@@ -13,7 +13,7 @@ import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.business
 import ${basePackage}.module.${table.moduleName}.dal.mysql.${table.businessName}.${table.className}Mapper;
 import ${PageResultClassName};
 
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
 import org.springframework.context.annotation.Import;
 import java.util.*;
 import java.time.LocalDateTime;

+ 2 - 2
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/order/PayOrderExtensionMapper.java

@@ -24,10 +24,10 @@ public interface PayOrderExtensionMapper extends BaseMapperX<PayOrderExtensionDO
         return selectList(PayOrderExtensionDO::getOrderId, orderId);
     }
 
-    default List<PayOrderExtensionDO> selectListByStatusAndCreateTimeGe(Integer status, LocalDateTime minCreateTime) {
+    default List<PayOrderExtensionDO> selectListByStatusAndCreateTimeLe(Integer status, LocalDateTime minCreateTime) {
         return selectList(new LambdaQueryWrapper<PayOrderExtensionDO>()
                 .eq(PayOrderExtensionDO::getStatus, status)
-                .ge(PayOrderExtensionDO::getCreateTime, minCreateTime));
+                .le(PayOrderExtensionDO::getCreateTime, minCreateTime));
     }
 
 }

+ 1 - 1
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/demo/PayDemoOrderServiceImpl.java

@@ -232,7 +232,7 @@ public class PayDemoOrderServiceImpl implements PayDemoOrderService {
             throw exception(DEMO_ORDER_NOT_FOUND);
         }
         // 1.2 校验退款订单匹配
-        if (Objects.equals(order.getPayOrderId(), payRefundId)) {
+        if (Objects.equals(order.getPayRefundId(), payRefundId)) {
             log.error("[validateDemoOrderCanRefunded][order({}) 退款单不匹配({}),请进行处理!order 数据是:{}]",
                     id, payRefundId, toJsonString(order));
             throw exception(DEMO_ORDER_REFUND_FAIL_REFUND_ORDER_ID_ERROR);

+ 2 - 2
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceImpl.java

@@ -448,8 +448,8 @@ public class PayOrderServiceImpl implements PayOrderService {
 
     @Override
     public int syncOrder(LocalDateTime minCreateTime) {
-        // 1. 查询指定创建时间的待支付订单
-        List<PayOrderExtensionDO> orderExtensions = orderExtensionMapper.selectListByStatusAndCreateTimeGe(
+        // 1. 查询指定创建时间的待支付订单
+        List<PayOrderExtensionDO> orderExtensions = orderExtensionMapper.selectListByStatusAndCreateTimeLe(
                 PayOrderStatusEnum.WAITING.getStatus(), minCreateTime);
         if (CollUtil.isEmpty(orderExtensions)) {
             return 0;

+ 1 - 1
yudao-module-report/yudao-module-report-biz/pom.xml

@@ -66,7 +66,7 @@
         <!-- 积木报表-->
         <dependency>
             <groupId>org.jeecgframework.jimureport</groupId>
-            <artifactId>jimureport-spring-boot-starter</artifactId>
+            <artifactId>jimureport-spring-boot3-starter</artifactId>
         </dependency>
         <!-- 单独依赖升级版本,解决低版本validator失败问题 -->
         <dependency>

+ 17 - 0
yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/jmreport/core/service/JmReportTokenServiceImpl.java

@@ -11,6 +11,7 @@ import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
 import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
 import cn.iocoder.yudao.module.system.api.oauth2.OAuth2TokenApi;
 import cn.iocoder.yudao.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO;
+import cn.iocoder.yudao.module.system.api.permission.RoleApi;
 import lombok.RequiredArgsConstructor;
 import org.jeecg.modules.jmreport.api.JmReportTokenServiceI;
 import org.springframework.http.HttpHeaders;
@@ -128,4 +129,20 @@ public class JmReportTokenServiceImpl implements JmReportTokenServiceI {
         return user;
     }
 
+    @Override
+    public String[] getRoles(String s) {
+        // 暂时不用实现,因为不用 JmReport 的角色
+        return null;
+    }
+
+    @Override
+    public String getTenantId() {
+        // 补充说明:不能直接通过 TenantContext 获取,因为 jimu 报表前端请求时,没有带上 tenant-id Header
+        LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
+        if (loginUser == null) {
+            return null;
+        }
+        return StrUtil.toStringOrNull(loginUser.getTenantId());
+    }
+
 }

+ 6 - 10
yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/config/UReportConfiguration.java

@@ -1,29 +1,25 @@
 package cn.iocoder.yudao.module.report.framework.ureport.config;
 
-import com.bstek.ureport.console.UReportServlet;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.boot.web.servlet.ServletRegistrationBean;
-import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.ImportResource;
 import org.springframework.context.annotation.PropertySource;
 
-import jakarta.servlet.Servlet;
-
 /**
  * UReport2 配置类
  *
  * @author 赤焰
  */
-@Configuration
+// @Configuration TODO 芋艿:JDK21 暂时不支持 UReport2,原因是 Spring Boot 3 的 javax 替换成 jakarta 了
 @ImportResource({"classpath:ureport-console-context.xml"})
 @PropertySource(value = {"classpath:ureport.properties"}) // TODO @赤焰:这个可以搞到 application.yaml 里么?
 @EnableConfigurationProperties({UReportProperties.class})
 public class UReportConfiguration {
 
-    @Bean
-    public ServletRegistrationBean<Servlet> uReportRegistrationBean() {
-        return new ServletRegistrationBean<>(new UReportServlet(), "/ureport/*");
-    }
+//    TODO 芋艿:JDK21 暂时不支持 UReport2,原因是 Spring Boot 3 的 javax 替换成 jakarta 了
+//    @Bean
+//    public ServletRegistrationBean<Servlet> uReportRegistrationBean() {
+//        return new ServletRegistrationBean<>(new UReportServlet(), "/ureport/*");
+//    }
 
 }

+ 1 - 1
yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/core/UReportDataSource.java

@@ -18,7 +18,7 @@ import static cn.iocoder.yudao.module.report.enums.ErrorCodeConstants.UREPORT_DA
  * @author 赤焰
  */
 @Slf4j
-@Component
+//@Component
 public class UReportDataSource implements BuildinDatasource {
 
 	private static final String NAME = "UReportDataSource";

+ 1 - 1
yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/core/UReportDatabaseProvider.java

@@ -29,7 +29,7 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.
  * @author 赤焰
  */
 // TODO @赤焰:这个 bean 的注解,交给 UReportConfiguration 搞
-@Component
+//@Component
 @Slf4j
 @Setter
 public class UReportDatabaseProvider implements ReportProvider {

+ 0 - 3
yudao-server/src/main/resources/application-dev.yaml

@@ -5,9 +5,6 @@ server:
 
 spring:
   # 数据源配置项
-  autoconfigure:
-    exclude:
-      - org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration # 排除积木报表带来的 MongoDB 的自动配置
   datasource:
     druid: # Druid 【监控】相关的全局配置
       web-stat-filter:

+ 1 - 1
yudao-server/src/main/resources/application-local.yaml

@@ -7,7 +7,6 @@ spring:
   # 数据源配置项
   autoconfigure:
     exclude:
-      - org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration # 排除积木报表带来的 MongoDB 的自动配置
       - org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # 默认 local 环境,不开启 Quartz 的自动配置
       - de.codecentric.boot.admin.server.config.AdminServerAutoConfiguration # 禁用 Spring Boot Admin 的 Server 的自动配置
       - de.codecentric.boot.admin.server.ui.config.AdminServerUiAutoConfiguration # 禁用 Spring Boot Admin 的 Server UI 的自动配置
@@ -189,6 +188,7 @@ logging:
     cn.iocoder.yudao.module.promotion.dal.mysql: debug
     cn.iocoder.yudao.module.statistics.dal.mysql: debug
     cn.iocoder.yudao.module.crm.dal.mysql: debug
+    org.springframework.context.support.PostProcessorRegistrationDelegate: ERROR # TODO 芋艿:先禁用,Spring Boot 3.X 存在部分错误的 WARN 提示
 
 debug: false
 

+ 3 - 3
yudao-server/src/main/resources/application.yaml

@@ -264,9 +264,9 @@ yudao:
 debug: false
 
 # 积木报表配置
-minidao :
-  base-package: org.jeecg.modules.jmreport.desreport.dao*
-  db-type: mysql
+jeecg:
+  jmreport:
+    saas-mode: tenant
 
 # UReport 配置
 ureport:

Деякі файли не було показано, через те що забагато файлів було змінено