mirror of
https://gitee.com/hhyykk/ipms-sjy.git
synced 2025-02-13 00:54:59 +08:00
Merge branch 'master-jdk21' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into develop
# Conflicts: # yudao-server/src/main/resources/application-local.yaml
This commit is contained in:
commit
290f45dd6e
@ -51,7 +51,7 @@
|
|||||||
<mapstruct.version>1.5.5.Final</mapstruct.version>
|
<mapstruct.version>1.5.5.Final</mapstruct.version>
|
||||||
<hutool-5.version>5.8.23</hutool-5.version>
|
<hutool-5.version>5.8.23</hutool-5.version>
|
||||||
<hutool-6.version>6.0.0-M8</hutool-6.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>
|
<velocity.version>2.3</velocity.version>
|
||||||
<screw.version>1.0.5</screw.version>
|
<screw.version>1.0.5</screw.version>
|
||||||
<fastjson.version>1.2.83</fastjson.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>
|
<aliyun-java-sdk-dysmsapi.version>2.2.1</aliyun-java-sdk-dysmsapi.version>
|
||||||
<tencentcloud-sdk-java.version>3.1.880</tencentcloud-sdk-java.version>
|
<tencentcloud-sdk-java.version>3.1.880</tencentcloud-sdk-java.version>
|
||||||
<justauth.version>2.0.5</justauth.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>
|
<xercesImpl.version>2.12.2</xercesImpl.version>
|
||||||
<weixin-java.version>4.5.7.B</weixin-java.version>
|
<weixin-java.version>4.5.7.B</weixin-java.version>
|
||||||
<ureport2.version>2.2.9</ureport2.version>
|
<ureport2.version>2.2.9</ureport2.version>
|
||||||
@ -651,7 +651,7 @@
|
|||||||
<!-- 积木报表-->
|
<!-- 积木报表-->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.jeecgframework.jimureport</groupId>
|
<groupId>org.jeecgframework.jimureport</groupId>
|
||||||
<artifactId>jimureport-spring-boot-starter</artifactId>
|
<artifactId>jimureport-spring-boot3-starter</artifactId>
|
||||||
<version>${jimureport.version}</version>
|
<version>${jimureport.version}</version>
|
||||||
<exclusions>
|
<exclusions>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
|
@ -1,10 +1,12 @@
|
|||||||
package cn.iocoder.yudao.framework.common.util.cache;
|
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.CacheBuilder;
|
||||||
import com.google.common.cache.CacheLoader;
|
import com.google.common.cache.CacheLoader;
|
||||||
import com.google.common.cache.LoadingCache;
|
import com.google.common.cache.LoadingCache;
|
||||||
|
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
|
import java.util.concurrent.Executor;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -15,11 +17,13 @@ import java.util.concurrent.Executors;
|
|||||||
public class CacheUtils {
|
public class CacheUtils {
|
||||||
|
|
||||||
public static <K, V> LoadingCache<K, V> buildAsyncReloadingCache(Duration duration, CacheLoader<K, V> loader) {
|
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()
|
return CacheBuilder.newBuilder()
|
||||||
// 只阻塞当前数据加载线程,其他线程返回旧值
|
// 只阻塞当前数据加载线程,其他线程返回旧值
|
||||||
.refreshAfterWrite(duration)
|
.refreshAfterWrite(duration)
|
||||||
// 通过 asyncReloading 实现全异步加载,包括 refreshAfterWrite 被阻塞的加载线程
|
// 通过 asyncReloading 实现全异步加载,包括 refreshAfterWrite 被阻塞的加载线程
|
||||||
.build(CacheLoader.asyncReloading(loader, Executors.newCachedThreadPool())); // TODO 芋艿:可能要思考下,未来要不要做成可配置
|
.build(CacheLoader.asyncReloading(loader, executor));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -490,6 +490,37 @@ id,name,type,parentId
|
|||||||
441700,阳江市,3,440000
|
441700,阳江市,3,440000
|
||||||
441800,清远市,3,440000
|
441800,清远市,3,440000
|
||||||
441900,东莞市,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
|
442000,中山市,3,440000
|
||||||
445100,潮州市,3,440000
|
445100,潮州市,3,440000
|
||||||
445200,揭阳市,3,440000
|
445200,揭阳市,3,440000
|
||||||
|
|
@ -41,6 +41,7 @@ public abstract class AbstractSmsClient implements SmsClient {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
log.info("[refresh][配置({})发生变化,重新初始化]", properties);
|
log.info("[refresh][配置({})发生变化,重新初始化]", properties);
|
||||||
|
this.properties = properties;
|
||||||
// 初始化
|
// 初始化
|
||||||
this.init();
|
this.init();
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package cn.iocoder.yudao.framework.tenant.core.context;
|
package cn.iocoder.yudao.framework.tenant.core.context;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
import cn.iocoder.yudao.framework.common.enums.DocumentEnum;
|
import cn.iocoder.yudao.framework.common.enums.DocumentEnum;
|
||||||
import com.alibaba.ttl.TransmittableThreadLocal;
|
import com.alibaba.ttl.TransmittableThreadLocal;
|
||||||
|
|
||||||
@ -21,7 +22,7 @@ public class TenantContextHolder {
|
|||||||
private static final ThreadLocal<Boolean> IGNORE = new TransmittableThreadLocal<>();
|
private static final ThreadLocal<Boolean> IGNORE = new TransmittableThreadLocal<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得租户编号。
|
* 获得租户编号
|
||||||
*
|
*
|
||||||
* @return 租户编号
|
* @return 租户编号
|
||||||
*/
|
*/
|
||||||
@ -29,6 +30,16 @@ public class TenantContextHolder {
|
|||||||
return TENANT_ID.get();
|
return TENANT_ID.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得租户编号 String
|
||||||
|
*
|
||||||
|
* @return 租户编号
|
||||||
|
*/
|
||||||
|
public static String getTenantIdStr() {
|
||||||
|
Long tenantId = getTenantId();
|
||||||
|
return StrUtil.toStringOrNull(tenantId);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得租户编号。如果不存在,则抛出 NullPointerException 异常
|
* 获得租户编号。如果不存在,则抛出 NullPointerException 异常
|
||||||
*
|
*
|
||||||
|
@ -1,12 +1,14 @@
|
|||||||
package cn.iocoder.yudao.framework.excel.core.util;
|
package cn.iocoder.yudao.framework.excel.core.util;
|
||||||
|
|
||||||
import com.alibaba.excel.EasyExcel;
|
import com.alibaba.excel.EasyExcel;
|
||||||
|
import com.alibaba.excel.converters.longconverter.LongStringConverter;
|
||||||
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
|
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.URLEncoder;
|
import java.net.URLEncoder;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -33,9 +35,10 @@ public class ExcelUtils {
|
|||||||
EasyExcel.write(response.getOutputStream(), head)
|
EasyExcel.write(response.getOutputStream(), head)
|
||||||
.autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理
|
.autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理
|
||||||
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 基于 column 长度,自动适配。最大 255 宽度
|
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 基于 column 长度,自动适配。最大 255 宽度
|
||||||
|
.registerConverter(new LongStringConverter()) // 避免 Long 类型丢失精度
|
||||||
.sheet(sheetName).doWrite(data);
|
.sheet(sheetName).doWrite(data);
|
||||||
// 设置 header 和 contentType。写在最后的原因是,避免报错时,响应 contentType 已经被修改了
|
// 设置 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");
|
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -81,7 +81,7 @@ public class S3FileClient extends AbstractFileClient<S3FileClientConfig> {
|
|||||||
}
|
}
|
||||||
// 腾讯云必须有 region,否则会报错
|
// 腾讯云必须有 region,否则会报错
|
||||||
if (config.getEndpoint().contains(ENDPOINT_TENCENT)) {
|
if (config.getEndpoint().contains(ENDPOINT_TENCENT)) {
|
||||||
return StrUtil.subAfter(config.getEndpoint(), ".cos.", false)
|
return StrUtil.subAfter(config.getEndpoint(), "cos.", false)
|
||||||
.replaceAll("." + ENDPOINT_TENCENT, ""); // 去除 Endpoint
|
.replaceAll("." + ENDPOINT_TENCENT, ""); // 去除 Endpoint
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
@ -3,6 +3,7 @@ package cn.iocoder.yudao.framework.flowable.config;
|
|||||||
import cn.iocoder.yudao.framework.common.enums.WebFilterOrderEnum;
|
import cn.iocoder.yudao.framework.common.enums.WebFilterOrderEnum;
|
||||||
import cn.iocoder.yudao.framework.flowable.core.web.FlowableWebFilter;
|
import cn.iocoder.yudao.framework.flowable.core.web.FlowableWebFilter;
|
||||||
import org.springframework.boot.autoconfigure.AutoConfiguration;
|
import org.springframework.boot.autoconfigure.AutoConfiguration;
|
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||||
import org.springframework.boot.web.servlet.FilterRegistrationBean;
|
import org.springframework.boot.web.servlet.FilterRegistrationBean;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.core.task.AsyncListenableTaskExecutor;
|
import org.springframework.core.task.AsyncListenableTaskExecutor;
|
||||||
@ -17,6 +18,7 @@ public class YudaoFlowableConfiguration {
|
|||||||
* 如果不创建,会导致项目启动时,Flowable 报错的问题
|
* 如果不创建,会导致项目启动时,Flowable 报错的问题
|
||||||
*/
|
*/
|
||||||
@Bean
|
@Bean
|
||||||
|
@ConditionalOnMissingBean
|
||||||
public AsyncListenableTaskExecutor taskExecutor() {
|
public AsyncListenableTaskExecutor taskExecutor() {
|
||||||
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
|
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
|
||||||
executor.setCorePoolSize(8);
|
executor.setCorePoolSize(8);
|
||||||
@ -40,4 +42,5 @@ public class YudaoFlowableConfiguration {
|
|||||||
registrationBean.setOrder(WebFilterOrderEnum.FLOWABLE_FILTER);
|
registrationBean.setOrder(WebFilterOrderEnum.FLOWABLE_FILTER);
|
||||||
return registrationBean;
|
return registrationBean;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -65,6 +65,12 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.baomidou</groupId>
|
<groupId>com.baomidou</groupId>
|
||||||
<artifactId>dynamic-datasource-spring-boot3-starter</artifactId> <!-- 多数据源 -->
|
<artifactId>dynamic-datasource-spring-boot3-starter</artifactId> <!-- 多数据源 -->
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-undertow</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
|
@ -136,8 +136,8 @@ public interface BaseMapperX<T> extends MPJBaseMapper<T> {
|
|||||||
*
|
*
|
||||||
* @param entities 实体们
|
* @param entities 实体们
|
||||||
*/
|
*/
|
||||||
default void insertBatch(Collection<T> entities) {
|
default Boolean insertBatch(Collection<T> entities) {
|
||||||
Db.saveBatch(entities);
|
return Db.saveBatch(entities);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -146,28 +146,28 @@ public interface BaseMapperX<T> extends MPJBaseMapper<T> {
|
|||||||
* @param entities 实体们
|
* @param entities 实体们
|
||||||
* @param size 插入数量 Db.saveBatch 默认为 1000
|
* @param size 插入数量 Db.saveBatch 默认为 1000
|
||||||
*/
|
*/
|
||||||
default void insertBatch(Collection<T> entities, int size) {
|
default Boolean insertBatch(Collection<T> entities, int size) {
|
||||||
Db.saveBatch(entities, size);
|
return Db.saveBatch(entities, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
default void updateBatch(T update) {
|
default int updateBatch(T update) {
|
||||||
update(update, new QueryWrapper<>());
|
return update(update, new QueryWrapper<>());
|
||||||
}
|
}
|
||||||
|
|
||||||
default void updateBatch(Collection<T> entities) {
|
default Boolean updateBatch(Collection<T> entities) {
|
||||||
Db.updateBatchById(entities);
|
return Db.updateBatchById(entities);
|
||||||
}
|
}
|
||||||
|
|
||||||
default void updateBatch(Collection<T> entities, int size) {
|
default Boolean updateBatch(Collection<T> entities, int size) {
|
||||||
Db.updateBatchById(entities, size);
|
return Db.updateBatchById(entities, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
default void insertOrUpdate(T entity) {
|
default Boolean insertOrUpdate(T entity) {
|
||||||
Db.saveOrUpdate(entity);
|
return Db.saveOrUpdate(entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
default void insertOrUpdateBatch(Collection<T> collection) {
|
default Boolean insertOrUpdateBatch(Collection<T> collection) {
|
||||||
Db.saveOrUpdateBatch(collection);
|
return Db.saveOrUpdateBatch(collection);
|
||||||
}
|
}
|
||||||
|
|
||||||
default int delete(String field, String value) {
|
default int delete(String field, String value) {
|
||||||
|
@ -66,7 +66,7 @@ public class WebSocketSessionManagerImpl implements WebSocketSessionManager {
|
|||||||
@Override
|
@Override
|
||||||
public void removeSession(WebSocketSession session) {
|
public void removeSession(WebSocketSession session) {
|
||||||
// 移除从 idSessions 中
|
// 移除从 idSessions 中
|
||||||
idSessions.remove(session.getId(), session);
|
idSessions.remove(session.getId());
|
||||||
// 移除从 idSessions 中
|
// 移除从 idSessions 中
|
||||||
LoginUser user = WebSocketFrameworkUtils.getLoginUser(session);
|
LoginUser user = WebSocketFrameworkUtils.getLoginUser(session);
|
||||||
if (user == null) {
|
if (user == null) {
|
||||||
|
@ -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.json.JsonUtils;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.PageUtils;
|
import cn.iocoder.yudao.framework.common.util.object.PageUtils;
|
||||||
import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils;
|
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.controller.admin.definition.vo.model.*;
|
||||||
import cn.iocoder.yudao.module.bpm.convert.definition.BpmModelConvert;
|
import cn.iocoder.yudao.module.bpm.convert.definition.BpmModelConvert;
|
||||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
|
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
|
||||||
@ -71,7 +72,8 @@ public class BpmModelServiceImpl implements BpmModelService {
|
|||||||
modelQuery.modelCategory(pageVO.getCategory());
|
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());
|
.listPage(PageUtils.getStart(pageVO), pageVO.getPageSize());
|
||||||
|
|
||||||
// 获得 Form Map
|
// 获得 Form Map
|
||||||
@ -107,6 +109,7 @@ public class BpmModelServiceImpl implements BpmModelService {
|
|||||||
// 创建流程定义
|
// 创建流程定义
|
||||||
Model model = repositoryService.newModel();
|
Model model = repositoryService.newModel();
|
||||||
BpmModelConvert.INSTANCE.copy(model, createReqVO);
|
BpmModelConvert.INSTANCE.copy(model, createReqVO);
|
||||||
|
model.setTenantId(TenantContextHolder.getTenantIdStr());
|
||||||
// 保存流程定义
|
// 保存流程定义
|
||||||
repositoryService.saveModel(model);
|
repositoryService.saveModel(model);
|
||||||
// 保存 BPMN XML
|
// 保存 BPMN XML
|
||||||
|
@ -6,6 +6,8 @@ import cn.hutool.core.util.StrUtil;
|
|||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.PageUtils;
|
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.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.BpmProcessDefinitionListReqVO;
|
||||||
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageItemRespVO;
|
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageItemRespVO;
|
||||||
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageReqVO;
|
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()
|
Deployment deploy = repositoryService.createDeployment()
|
||||||
.key(createReqDTO.getKey()).name(createReqDTO.getName()).category(createReqDTO.getCategory())
|
.key(createReqDTO.getKey()).name(createReqDTO.getName()).category(createReqDTO.getCategory())
|
||||||
.addBytes(createReqDTO.getKey() + BPMN_FILE_SUFFIX, createReqDTO.getBpmnBytes())
|
.addBytes(createReqDTO.getKey() + BPMN_FILE_SUFFIX, createReqDTO.getBpmnBytes())
|
||||||
|
.tenantId(TenantContextHolder.getTenantIdStr())
|
||||||
.deploy();
|
.deploy();
|
||||||
|
|
||||||
// 设置 ProcessDefinition 的 category 分类
|
// 设置 ProcessDefinition 的 category 分类
|
||||||
@ -234,6 +237,7 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
|
|||||||
definitionQuery.active();
|
definitionQuery.active();
|
||||||
}
|
}
|
||||||
// 执行查询
|
// 执行查询
|
||||||
|
definitionQuery.processDefinitionTenantId(TenantContextHolder.getTenantIdStr());
|
||||||
List<ProcessDefinition> processDefinitions = definitionQuery.list();
|
List<ProcessDefinition> processDefinitions = definitionQuery.list();
|
||||||
if (CollUtil.isEmpty(processDefinitions)) {
|
if (CollUtil.isEmpty(processDefinitions)) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
|
File diff suppressed because one or more lines are too long
@ -1 +0,0 @@
|
|||||||
package cn.iocoder.yudao.module.bpm.service.task;
|
|
@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.infra.controller.admin.file;
|
|||||||
|
|
||||||
import cn.hutool.core.io.IoUtil;
|
import cn.hutool.core.io.IoUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
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.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
@ -70,6 +71,8 @@ public class FileController {
|
|||||||
if (StrUtil.isEmpty(path)) {
|
if (StrUtil.isEmpty(path)) {
|
||||||
throw new IllegalArgumentException("结尾的 path 路径必须传递");
|
throw new IllegalArgumentException("结尾的 path 路径必须传递");
|
||||||
}
|
}
|
||||||
|
// 解码,解决中文路径的问题 https://gitee.com/zhijiantianya/ruoyi-vue-pro/pulls/807/
|
||||||
|
path = URLUtil.decode(path);
|
||||||
|
|
||||||
// 读取内容
|
// 读取内容
|
||||||
byte[] content = fileService.getFileContent(configId, path);
|
byte[] content = fileService.getFileContent(configId, path);
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName};
|
package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName};
|
||||||
|
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
import javax.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
#if ($sceneEnum.scene == 1)import org.springframework.security.access.prepost.PreAuthorize;#end
|
#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.Parameter;
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
|
|
||||||
import javax.validation.constraints.*;
|
import jakarta.validation.constraints.*;
|
||||||
import javax.validation.*;
|
import jakarta.validation.*;
|
||||||
import javax.servlet.http.*;
|
import jakarta.servlet.http.*;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePac
|
|||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import lombok.*;
|
import lombok.*;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import javax.validation.constraints.*;
|
import jakarta.validation.constraints.*;
|
||||||
## 处理 BigDecimal 字段的引入
|
## 处理 BigDecimal 字段的引入
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
#foreach ($column in $columns)
|
#foreach ($column in $columns)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package ${basePackage}.module.${table.moduleName}.service.${table.businessName};
|
package ${basePackage}.module.${table.moduleName}.service.${table.businessName};
|
||||||
|
|
||||||
import java.util.*;
|
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}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*;
|
||||||
import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO;
|
import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO;
|
||||||
## 特殊:主子表专属逻辑
|
## 特殊:主子表专属逻辑
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package ${basePackage}.module.${table.moduleName}.service.${table.businessName};
|
package ${basePackage}.module.${table.moduleName}.service.${table.businessName};
|
||||||
|
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import javax.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ import org.junit.jupiter.api.Disabled;
|
|||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.springframework.boot.test.mock.mockito.MockBean;
|
import org.springframework.boot.test.mock.mockito.MockBean;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
|
|
||||||
import ${baseFrameworkPackage}.test.core.ut.BaseDbUnitTest;
|
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 ${basePackage}.module.${table.moduleName}.dal.mysql.${table.businessName}.${table.className}Mapper;
|
||||||
import ${PageResultClassName};
|
import ${PageResultClassName};
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import org.springframework.context.annotation.Import;
|
import org.springframework.context.annotation.Import;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
@ -24,10 +24,10 @@ public interface PayOrderExtensionMapper extends BaseMapperX<PayOrderExtensionDO
|
|||||||
return selectList(PayOrderExtensionDO::getOrderId, orderId);
|
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>()
|
return selectList(new LambdaQueryWrapper<PayOrderExtensionDO>()
|
||||||
.eq(PayOrderExtensionDO::getStatus, status)
|
.eq(PayOrderExtensionDO::getStatus, status)
|
||||||
.ge(PayOrderExtensionDO::getCreateTime, minCreateTime));
|
.le(PayOrderExtensionDO::getCreateTime, minCreateTime));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -232,7 +232,7 @@ public class PayDemoOrderServiceImpl implements PayDemoOrderService {
|
|||||||
throw exception(DEMO_ORDER_NOT_FOUND);
|
throw exception(DEMO_ORDER_NOT_FOUND);
|
||||||
}
|
}
|
||||||
// 1.2 校验退款订单匹配
|
// 1.2 校验退款订单匹配
|
||||||
if (Objects.equals(order.getPayOrderId(), payRefundId)) {
|
if (Objects.equals(order.getPayRefundId(), payRefundId)) {
|
||||||
log.error("[validateDemoOrderCanRefunded][order({}) 退款单不匹配({}),请进行处理!order 数据是:{}]",
|
log.error("[validateDemoOrderCanRefunded][order({}) 退款单不匹配({}),请进行处理!order 数据是:{}]",
|
||||||
id, payRefundId, toJsonString(order));
|
id, payRefundId, toJsonString(order));
|
||||||
throw exception(DEMO_ORDER_REFUND_FAIL_REFUND_ORDER_ID_ERROR);
|
throw exception(DEMO_ORDER_REFUND_FAIL_REFUND_ORDER_ID_ERROR);
|
||||||
|
@ -448,8 +448,8 @@ public class PayOrderServiceImpl implements PayOrderService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int syncOrder(LocalDateTime minCreateTime) {
|
public int syncOrder(LocalDateTime minCreateTime) {
|
||||||
// 1. 查询指定创建时间内的待支付订单
|
// 1. 查询指定创建时间前的待支付订单
|
||||||
List<PayOrderExtensionDO> orderExtensions = orderExtensionMapper.selectListByStatusAndCreateTimeGe(
|
List<PayOrderExtensionDO> orderExtensions = orderExtensionMapper.selectListByStatusAndCreateTimeLe(
|
||||||
PayOrderStatusEnum.WAITING.getStatus(), minCreateTime);
|
PayOrderStatusEnum.WAITING.getStatus(), minCreateTime);
|
||||||
if (CollUtil.isEmpty(orderExtensions)) {
|
if (CollUtil.isEmpty(orderExtensions)) {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -66,7 +66,7 @@
|
|||||||
<!-- 积木报表-->
|
<!-- 积木报表-->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.jeecgframework.jimureport</groupId>
|
<groupId>org.jeecgframework.jimureport</groupId>
|
||||||
<artifactId>jimureport-spring-boot-starter</artifactId>
|
<artifactId>jimureport-spring-boot3-starter</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!-- 单独依赖升级版本,解决低版本validator失败问题 -->
|
<!-- 单独依赖升级版本,解决低版本validator失败问题 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
|
@ -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.framework.web.core.util.WebFrameworkUtils;
|
||||||
import cn.iocoder.yudao.module.system.api.oauth2.OAuth2TokenApi;
|
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.oauth2.dto.OAuth2AccessTokenCheckRespDTO;
|
||||||
|
import cn.iocoder.yudao.module.system.api.permission.RoleApi;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.jeecg.modules.jmreport.api.JmReportTokenServiceI;
|
import org.jeecg.modules.jmreport.api.JmReportTokenServiceI;
|
||||||
import org.springframework.http.HttpHeaders;
|
import org.springframework.http.HttpHeaders;
|
||||||
@ -128,4 +129,20 @@ public class JmReportTokenServiceImpl implements JmReportTokenServiceI {
|
|||||||
return user;
|
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());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,29 +1,25 @@
|
|||||||
package cn.iocoder.yudao.module.report.framework.ureport.config;
|
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.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.Configuration;
|
||||||
import org.springframework.context.annotation.ImportResource;
|
import org.springframework.context.annotation.ImportResource;
|
||||||
import org.springframework.context.annotation.PropertySource;
|
import org.springframework.context.annotation.PropertySource;
|
||||||
|
|
||||||
import jakarta.servlet.Servlet;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* UReport2 配置类
|
* UReport2 配置类
|
||||||
*
|
*
|
||||||
* @author 赤焰
|
* @author 赤焰
|
||||||
*/
|
*/
|
||||||
@Configuration
|
// @Configuration TODO 芋艿:JDK21 暂时不支持 UReport2,原因是 Spring Boot 3 的 javax 替换成 jakarta 了
|
||||||
@ImportResource({"classpath:ureport-console-context.xml"})
|
@ImportResource({"classpath:ureport-console-context.xml"})
|
||||||
@PropertySource(value = {"classpath:ureport.properties"}) // TODO @赤焰:这个可以搞到 application.yaml 里么?
|
@PropertySource(value = {"classpath:ureport.properties"}) // TODO @赤焰:这个可以搞到 application.yaml 里么?
|
||||||
@EnableConfigurationProperties({UReportProperties.class})
|
@EnableConfigurationProperties({UReportProperties.class})
|
||||||
public class UReportConfiguration {
|
public class UReportConfiguration {
|
||||||
|
|
||||||
@Bean
|
// TODO 芋艿:JDK21 暂时不支持 UReport2,原因是 Spring Boot 3 的 javax 替换成 jakarta 了
|
||||||
public ServletRegistrationBean<Servlet> uReportRegistrationBean() {
|
// @Bean
|
||||||
return new ServletRegistrationBean<>(new UReportServlet(), "/ureport/*");
|
// public ServletRegistrationBean<Servlet> uReportRegistrationBean() {
|
||||||
}
|
// return new ServletRegistrationBean<>(new UReportServlet(), "/ureport/*");
|
||||||
|
// }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@ import static cn.iocoder.yudao.module.report.enums.ErrorCodeConstants.UREPORT_DA
|
|||||||
* @author 赤焰
|
* @author 赤焰
|
||||||
*/
|
*/
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Component
|
//@Component
|
||||||
public class UReportDataSource implements BuildinDatasource {
|
public class UReportDataSource implements BuildinDatasource {
|
||||||
|
|
||||||
private static final String NAME = "UReportDataSource";
|
private static final String NAME = "UReportDataSource";
|
||||||
|
@ -29,7 +29,7 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.
|
|||||||
* @author 赤焰
|
* @author 赤焰
|
||||||
*/
|
*/
|
||||||
// TODO @赤焰:这个 bean 的注解,交给 UReportConfiguration 搞
|
// TODO @赤焰:这个 bean 的注解,交给 UReportConfiguration 搞
|
||||||
@Component
|
//@Component
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Setter
|
@Setter
|
||||||
public class UReportDatabaseProvider implements ReportProvider {
|
public class UReportDatabaseProvider implements ReportProvider {
|
||||||
|
@ -5,9 +5,6 @@ server:
|
|||||||
|
|
||||||
spring:
|
spring:
|
||||||
# 数据源配置项
|
# 数据源配置项
|
||||||
autoconfigure:
|
|
||||||
exclude:
|
|
||||||
- org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration # 排除积木报表带来的 MongoDB 的自动配置
|
|
||||||
datasource:
|
datasource:
|
||||||
druid: # Druid 【监控】相关的全局配置
|
druid: # Druid 【监控】相关的全局配置
|
||||||
web-stat-filter:
|
web-stat-filter:
|
||||||
|
@ -7,7 +7,6 @@ spring:
|
|||||||
# 数据源配置项
|
# 数据源配置项
|
||||||
autoconfigure:
|
autoconfigure:
|
||||||
exclude:
|
exclude:
|
||||||
- org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration # 排除积木报表带来的 MongoDB 的自动配置
|
|
||||||
- org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # 默认 local 环境,不开启 Quartz 的自动配置
|
- org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # 默认 local 环境,不开启 Quartz 的自动配置
|
||||||
- de.codecentric.boot.admin.server.config.AdminServerAutoConfiguration # 禁用 Spring Boot Admin 的 Server 的自动配置
|
- de.codecentric.boot.admin.server.config.AdminServerAutoConfiguration # 禁用 Spring Boot Admin 的 Server 的自动配置
|
||||||
- de.codecentric.boot.admin.server.ui.config.AdminServerUiAutoConfiguration # 禁用 Spring Boot Admin 的 Server UI 的自动配置
|
- 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.promotion.dal.mysql: debug
|
||||||
cn.iocoder.yudao.module.statistics.dal.mysql: debug
|
cn.iocoder.yudao.module.statistics.dal.mysql: debug
|
||||||
cn.iocoder.yudao.module.crm.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
|
debug: false
|
||||||
|
|
||||||
|
@ -264,9 +264,9 @@ yudao:
|
|||||||
debug: false
|
debug: false
|
||||||
|
|
||||||
# 积木报表配置
|
# 积木报表配置
|
||||||
minidao :
|
jeecg:
|
||||||
base-package: org.jeecg.modules.jmreport.desreport.dao*
|
jmreport:
|
||||||
db-type: mysql
|
saas-mode: tenant
|
||||||
|
|
||||||
# UReport 配置
|
# UReport 配置
|
||||||
ureport:
|
ureport:
|
||||||
|
Loading…
Reference in New Issue
Block a user