Compare commits

...

30 Commits

Author SHA1 Message Date
chenbowen
d5a1e5c157 Merge branch 'dev' into test 2025-11-13 21:41:13 +08:00
chenbowen
53a0293b7c Merge remote-tracking branch 'base-version/main' into dev 2025-11-13 21:40:08 +08:00
chenbowen
af7f103a38 调整后台返回部门id与公司id类型为 string 2025-11-13 21:39:27 +08:00
chenbowen
2280d29fb6 调整后台返回部门id与公司id类型为 string 2025-11-13 21:16:08 +08:00
chenbowen
71e63519ae 调整后台返回部门id与公司id类型为 string 2025-11-13 21:10:38 +08:00
chenbowen
c8dca75943 Merge branch 'dev' into test 2025-11-13 18:45:33 +08:00
chenbowen
2eb09ff35d Merge remote-tracking branch 'base-version/main' into dev 2025-11-13 18:45:11 +08:00
chenbowen
c1f12dfe5e 1. 修复 userinfo 过多导致的用户登录失败错误 2025-11-13 18:44:28 +08:00
wencai he
428c9a60b1 Merge branch 'dev' into 'test'
Dev

See merge request jygk/dsc!3
2025-11-13 09:44:31 +00:00
hewencai
4efa894c8f Merge remote-tracking branch 'origin/dev' into dev 2025-11-13 17:32:31 +08:00
hewencai
f02745454d 修改门户管理图片显示逻辑 2025-11-13 17:32:30 +08:00
qianshijiang
d9fa921fda 添加异步任务工具类 2025-11-13 14:59:11 +08:00
chenbowen
b6951a4c6b 1. infra 模块扩展为两个实例 2025-11-13 11:22:18 +08:00
chenbowen
3e5a0a4845 1. 缩减 dsc 服务占用资源 2025-11-13 11:11:22 +08:00
wencai he
49a54e2199 Merge branch 'dev' into 'test'
feat:新增门户管理功能

See merge request jygk/dsc!2
2025-11-13 02:29:50 +00:00
hewencai
e00086c6e8 feat:新增门户管理功能 2025-11-13 10:28:19 +08:00
chenbowen
9c99750dd8 1. zt-module-report 不在进行部署 2025-11-13 09:14:50 +08:00
chenbowen
bd56cb0405 Merge branch 'dev' into test 2025-11-12 22:26:02 +08:00
chenbowen
c399bdf720 Merge remote-tracking branch 'base-version/main' into dev 2025-11-12 22:25:46 +08:00
chenbowen
1a34cbc678 1. 验证码接口 url 不校验租户 2025-11-12 22:23:58 +08:00
chenbowen
81fb8eea8f Merge branch 'dev' into test 2025-11-11 17:16:15 +08:00
chenbowen
8423775582 Merge remote-tracking branch 'base-version/main' into dev 2025-11-11 17:15:55 +08:00
chenbowen
aa159638b9 1. 只要标记了业务接口,就需要全量的拦截,不再区分 url 2025-11-11 17:14:31 +08:00
wencai he
2c4f46b6de Merge branch 'dev' into 'test'
Dev

See merge request jygk/dsc!1
2025-11-10 08:06:35 +00:00
hewencai
03c76b071a Merge remote-tracking branch 'origin/dev' into dev 2025-11-10 10:41:48 +08:00
hewencai
a6b87f01a7 add:增加seata和doc4j依赖 2025-11-10 10:41:08 +08:00
chenbowen
3312ed328d 1. dsc bpm deploy 单独进行发布 2025-11-07 12:58:59 +08:00
chenbowen
7d74ff7acc Merge branch 'dev' into test 2025-11-07 12:46:18 +08:00
chenbowen
b7f07ba8da Merge remote-tracking branch 'base-version/main' into dev 2025-11-07 12:45:49 +08:00
chenbowen
3c19722cbd 1. 调整附件临时 url 过期时间为 24 小时 2025-11-07 12:37:49 +08:00
27 changed files with 1188 additions and 211 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -32,6 +32,8 @@
<spring.boot.version>3.4.5</spring.boot.version> <spring.boot.version>3.4.5</spring.boot.version>
<spring.cloud.version>2024.0.1</spring.cloud.version> <spring.cloud.version>2024.0.1</spring.cloud.version>
<spring.cloud.alibaba.version>2023.0.3.2</spring.cloud.alibaba.version> <spring.cloud.alibaba.version>2023.0.3.2</spring.cloud.alibaba.version>
<!-- 分布式事务相关 -->
<seata.version>2.4.0</seata.version>
<!-- Web 相关 --> <!-- Web 相关 -->
<springdoc.version>2.8.3</springdoc.version> <springdoc.version>2.8.3</springdoc.version>
<knife4j.version>4.6.0</knife4j.version> <knife4j.version>4.6.0</knife4j.version>
@@ -86,6 +88,8 @@
<netty.version>4.1.116.Final</netty.version> <netty.version>4.1.116.Final</netty.version>
<mqtt.version>1.2.5</mqtt.version> <mqtt.version>1.2.5</mqtt.version>
<pf4j-spring.version>0.9.0</pf4j-spring.version> <pf4j-spring.version>0.9.0</pf4j-spring.version>
<docx4j.version>11.4.7</docx4j.version>
<docx4j-jaxb.version>11.4.7</docx4j-jaxb.version>
<!-- 规则引擎 --> <!-- 规则引擎 -->
<liteflow.version>2.15.1</liteflow.version> <liteflow.version>2.15.1</liteflow.version>
<vertx.version>4.5.13</vertx.version> <vertx.version>4.5.13</vertx.version>
@@ -131,6 +135,20 @@
<scope>import</scope> <scope>import</scope>
</dependency> </dependency>
<!-- 分布式事务Seata -->
<!-- 显式覆盖 Spring Cloud Alibaba BOM 中的 Seata 1.8.0,升级到 2.4.0 以支持达梦数据库 -->
<!-- 注意Seata 2.2.0+ 改为使用 org.apache.seata groupId -->
<dependency>
<groupId>org.apache.seata</groupId>
<artifactId>seata-all</artifactId>
<version>${seata.version}</version>
</dependency>
<dependency>
<groupId>org.apache.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>${seata.version}</version>
</dependency>
<!-- 业务组件 --> <!-- 业务组件 -->
<dependency> <dependency>
<groupId>io.github.mouzt</groupId> <groupId>io.github.mouzt</groupId>
@@ -706,6 +724,17 @@
<artifactId>org.eclipse.paho.client.mqttv3</artifactId> <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>${mqtt.version}</version> <version>${mqtt.version}</version>
</dependency> </dependency>
<!-- docx4j - Word文档处理 -->
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-JAXB-ReferenceImpl</artifactId>
<version>${docx4j-jaxb.version}</version>
</dependency>
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-core</artifactId>
<version>${docx4j.version}</version>
</dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>

View File

@@ -11,7 +11,7 @@ public class CompanyDeptInfo {
/** /**
* 公司Id * 公司Id
*/ */
private Long companyId; private String companyId;
/** /**
* 公司名称 * 公司名称
*/ */
@@ -19,7 +19,7 @@ public class CompanyDeptInfo {
/** /**
* 部门Id * 部门Id
*/ */
private Long deptId; private String deptId;
/** /**
* 部门名称 * 部门名称
*/ */

View File

@@ -81,36 +81,40 @@ public class AsyncLatchUtils {
System.out.println("主流程开始,准备分发异步任务..."); System.out.println("主流程开始,准备分发异步任务...");
System.out.println("主线程id:" + Thread.currentThread().getId());
// 2. 提交多个异步任务 // 2. 提交多个异步任务
// 任务一:获取用户信息 // 任务一:获取用户信息
AsyncLatchUtils.submitTask(executorService, () -> { AsyncLatchUtils.submitTask(executorService, () -> {
try { try {
System.out.println("任务一子线程id:" + Thread.currentThread().getId());
System.out.println("开始获取用户信息..."); System.out.println("开始获取用户信息...");
Thread.sleep(1000); // 模拟耗时 Thread.sleep(1000); // 模拟耗时
System.out.println("获取用户信息成功!"); System.out.println("获取用户信息成功!");
} catch (InterruptedException e) { } catch (InterruptedException e) {
Thread.currentThread().interrupt(); Thread.currentThread().interrupt();
} }
}); });
// 任务二:获取订单信息 // 任务二:获取订单信息
AsyncLatchUtils.submitTask(executorService, () -> { AsyncLatchUtils.submitTask(executorService, () -> {
try { try {
System.out.println("任务二子线程id:" + Thread.currentThread().getId());
System.out.println("开始获取订单信息..."); System.out.println("开始获取订单信息...");
Thread.sleep(1500); // 模拟耗时 Thread.sleep(1500); // 模拟耗时
System.out.println("获取订单信息成功!"); System.out.println("获取订单信息成功!");
} catch (InterruptedException e) { } catch (InterruptedException e) {
Thread.currentThread().interrupt(); Thread.currentThread().interrupt();
} }
}); });
// 任务三:获取商品信息 // 任务三:获取商品信息
AsyncLatchUtils.submitTask(executorService, () -> { AsyncLatchUtils.submitTask(executorService, () -> {
try { try {
System.out.println("任务三子线程id:" + Thread.currentThread().getId());
System.out.println("开始获取商品信息..."); System.out.println("开始获取商品信息...");
Thread.sleep(500); // 模拟耗时 Thread.sleep(500); // 模拟耗时
System.out.println("获取商品信息成功!"); System.out.println("获取商品信息成功!");
} catch (InterruptedException e) { } catch (InterruptedException e) {
Thread.currentThread().interrupt(); Thread.currentThread().interrupt();
} }
}); });
@@ -118,12 +122,12 @@ public class AsyncLatchUtils {
System.out.println("所有异步任务已提交,主线程开始等待..."); System.out.println("所有异步任务已提交,主线程开始等待...");
// 3. 等待所有任务完成最长等待5秒 // 3. 等待所有任务完成最长等待5秒
boolean allTasksCompleted = AsyncLatchUtils.waitFor(5, TimeUnit.SECONDS); boolean allTasksCompleted = AsyncLatchUtils.waitFor(5, TimeUnit.SECONDS);
// 4. 根据等待结果继续主流程 // 4. 根据等待结果继续主流程
if (allTasksCompleted) { if (allTasksCompleted) {
System.out.println("所有异步任务执行成功,主流程继续..."); System.out.println("所有异步任务执行成功,主流程继续...");
} else { } else {
System.err.println("有任务执行超时,主流程中断!"); System.err.println("有任务执行超时,主流程中断!");
} }

View File

@@ -19,11 +19,11 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
public class ZtBusinessAutoConfiguration implements WebMvcConfigurer { public class ZtBusinessAutoConfiguration implements WebMvcConfigurer {
@Override @Override
public void addInterceptors(InterceptorRegistry registry) { public void addInterceptors(InterceptorRegistry registry) {
// 拦截增删改和 set 相关的 url // 拦截所有 url统一进行业务与文件上传请求头校验
registry.addInterceptor(new BusinessHeaderInterceptor()) registry.addInterceptor(new BusinessHeaderInterceptor())
.addPathPatterns("/**/add**", "/**/create**", "/**/update**", "/**/edit**", "/**/set**"); .addPathPatterns("/**");
registry.addInterceptor(new FileUploadHeaderInterceptor()) registry.addInterceptor(new FileUploadHeaderInterceptor())
.addPathPatterns("/**/add**", "/**/create**", "/**/update**", "/**/edit**", "/**/set**"); .addPathPatterns("/**");
} }
@Bean @Bean

View File

@@ -107,11 +107,11 @@ class BusinessHeaderInterceptorTest {
// 构造 loginUser包含多个公司部门 // 构造 loginUser包含多个公司部门
CompanyDeptInfo deptInfo1 = new CompanyDeptInfo(); CompanyDeptInfo deptInfo1 = new CompanyDeptInfo();
deptInfo1.setCompanyId(1L); deptInfo1.setCompanyId(String.valueOf(1L));
deptInfo1.setDeptId(2L); deptInfo1.setDeptId(String.valueOf(2L));
CompanyDeptInfo deptInfo2 = new CompanyDeptInfo(); CompanyDeptInfo deptInfo2 = new CompanyDeptInfo();
deptInfo2.setCompanyId(2L); deptInfo2.setCompanyId(String.valueOf(2L));
deptInfo2.setDeptId(3L); deptInfo2.setDeptId(String.valueOf(3L));
Set<CompanyDeptInfo> deptSet = new HashSet<>(); Set<CompanyDeptInfo> deptSet = new HashSet<>();
deptSet.add(deptInfo1); deptSet.add(deptInfo1);
deptSet.add(deptInfo2); deptSet.add(deptInfo2);
@@ -141,8 +141,8 @@ class BusinessHeaderInterceptorTest {
// 构造 loginUser只有一个公司且公司下只有一个部门 // 构造 loginUser只有一个公司且公司下只有一个部门
CompanyDeptInfo deptInfo = new CompanyDeptInfo(); CompanyDeptInfo deptInfo = new CompanyDeptInfo();
deptInfo.setCompanyId(100L); deptInfo.setCompanyId(String.valueOf(100L));
deptInfo.setDeptId(200L); deptInfo.setDeptId(String.valueOf(200L));
Set<CompanyDeptInfo> deptSet = new HashSet<>(); Set<CompanyDeptInfo> deptSet = new HashSet<>();
deptSet.add(deptInfo); deptSet.add(deptInfo);
LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setId(1L) LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setId(1L)
@@ -155,9 +155,9 @@ class BusinessHeaderInterceptorTest {
setLoginUserForTest(loginUser); setLoginUserForTest(loginUser);
boolean result = interceptor.preHandle(request, response, handlerMethod); boolean result = interceptor.preHandle(request, response, handlerMethod);
assertFalse(result); assertTrue(result);
// 可选:verify(request).setAttribute("visit-company-id", String.valueOf(deptInfo.getCompanyId())); verify(request).setAttribute(eq("visit-company-id"), eq(deptInfo.getCompanyId()));
// 可选:verify(request).setAttribute("visit-dept-id", String.valueOf(deptInfo.getDeptId())); verify(request).setAttribute(eq("visit-dept-id"), eq(deptInfo.getDeptId()));
} }
/** /**
@@ -172,11 +172,11 @@ class BusinessHeaderInterceptorTest {
// 构造 loginUser多个公司部门 // 构造 loginUser多个公司部门
CompanyDeptInfo deptInfo1 = new CompanyDeptInfo(); CompanyDeptInfo deptInfo1 = new CompanyDeptInfo();
deptInfo1.setCompanyId(1L); deptInfo1.setCompanyId(String.valueOf(1L));
deptInfo1.setDeptId(2L); deptInfo1.setDeptId(String.valueOf(2L));
CompanyDeptInfo deptInfo2 = new CompanyDeptInfo(); CompanyDeptInfo deptInfo2 = new CompanyDeptInfo();
deptInfo2.setCompanyId(2L); deptInfo2.setCompanyId(String.valueOf(2L));
deptInfo2.setDeptId(3L); deptInfo2.setDeptId(String.valueOf(3L));
Set<CompanyDeptInfo> deptSet = new HashSet<>(); Set<CompanyDeptInfo> deptSet = new HashSet<>();
deptSet.add(deptInfo1); deptSet.add(deptInfo1);
deptSet.add(deptInfo2); deptSet.add(deptInfo2);
@@ -207,11 +207,11 @@ class BusinessHeaderInterceptorTest {
// 构造 loginUser只有其他公司部门 // 构造 loginUser只有其他公司部门
CompanyDeptInfo deptInfo1 = new CompanyDeptInfo(); CompanyDeptInfo deptInfo1 = new CompanyDeptInfo();
deptInfo1.setCompanyId(1L); deptInfo1.setCompanyId(String.valueOf(1L));
deptInfo1.setDeptId(2L); deptInfo1.setDeptId(String.valueOf(2L));
CompanyDeptInfo deptInfo2 = new CompanyDeptInfo(); CompanyDeptInfo deptInfo2 = new CompanyDeptInfo();
deptInfo2.setCompanyId(2L); deptInfo2.setCompanyId(String.valueOf(2L));
deptInfo2.setDeptId(3L); deptInfo2.setDeptId(String.valueOf(3L));
Set<CompanyDeptInfo> deptSet = new HashSet<>(); Set<CompanyDeptInfo> deptSet = new HashSet<>();
deptSet.add(deptInfo1); deptSet.add(deptInfo1);
deptSet.add(deptInfo2); deptSet.add(deptInfo2);

View File

@@ -29,6 +29,9 @@ import java.time.Duration;
* @author ZT * @author ZT
*/ */
public class S3FileClient extends AbstractFileClient<S3FileClientConfig> { public class S3FileClient extends AbstractFileClient<S3FileClientConfig> {
private static final Duration DEFAULT_PRESIGNED_EXPIRATION = Duration.ofHours(24);
private static final String PRESIGN_EXPIRE_SECONDS_PROPERTY = "zt.file.download-expire-seconds";
/** /**
* 生成临时下载地址(预签名下载 URL * 生成临时下载地址(预签名下载 URL
* @param path 文件路径 * @param path 文件路径
@@ -37,17 +40,7 @@ public class S3FileClient extends AbstractFileClient<S3FileClientConfig> {
*/ */
@Override @Override
public String getPresignedDownloadUrl(String path, Duration expiration) { public String getPresignedDownloadUrl(String path, Duration expiration) {
Duration realExpiration = expiration; Duration realExpiration = expiration != null ? expiration : resolveDefaultExpiration();
if (realExpiration == null) {
long expireSeconds = 30; // 默认 30 秒
try {
String val = SpringUtils.getProperty("zt.file.download-expire-seconds");
if (val != null && !val.isEmpty()) {
expireSeconds = Long.parseLong(val);
}
} catch (Exception ignored) {}
realExpiration = Duration.ofSeconds(expireSeconds);
}
if (path == null){ if (path == null){
return StringUtils.EMPTY; return StringUtils.EMPTY;
} }
@@ -135,10 +128,25 @@ public class S3FileClient extends AbstractFileClient<S3FileClientConfig> {
@Override @Override
public FilePresignedUrlRespDTO getPresignedObjectUrl(String path) { public FilePresignedUrlRespDTO getPresignedObjectUrl(String path) {
Duration expiration = Duration.ofHours(24); Duration expiration = resolveDefaultExpiration();
return new FilePresignedUrlRespDTO(getPresignedUrl(path, expiration), config.getDomain() + "/" + path); return new FilePresignedUrlRespDTO(getPresignedUrl(path, expiration), config.getDomain() + "/" + path);
} }
private Duration resolveDefaultExpiration() {
String propertyValue = SpringUtils.getProperty(PRESIGN_EXPIRE_SECONDS_PROPERTY);
if (StringUtils.isNotEmpty(propertyValue)) {
try {
long seconds = Long.parseLong(propertyValue);
if (seconds > 0) {
return Duration.ofSeconds(seconds);
}
} catch (NumberFormatException ignored) {
// ignore invalid config values and fall back to default
}
}
return DEFAULT_PRESIGNED_EXPIRATION;
}
/** /**
* 生成动态的预签名上传 URL * 生成动态的预签名上传 URL
* *

View File

@@ -148,6 +148,8 @@ zt:
key: "0123456789abcdef0123456789abcdef" key: "0123456789abcdef0123456789abcdef"
# 附件预览 # 附件预览
kkfile: "http://172.16.46.63:30012/onlinePreview?url=" kkfile: "http://172.16.46.63:30012/onlinePreview?url="
file:
download-expire-seconds: 86400 # 对象存储预签名地址默认有效期(秒)
info: info:
version: 1.0.0 version: 1.0.0
base-package: com.zt.plat.module.infra base-package: com.zt.plat.module.infra

View File

@@ -212,4 +212,7 @@ public interface ErrorCodeConstants {
// ========== 系统序列号记录 1-002-032-000 ========== // ========== 系统序列号记录 1-002-032-000 ==========
ErrorCode SEQUENCE_RECORD_NOT_EXISTS = new ErrorCode(1_002_032_000, "系统序列号记录不存在"); ErrorCode SEQUENCE_RECORD_NOT_EXISTS = new ErrorCode(1_002_032_000, "系统序列号记录不存在");
// ========== 门户网站 1-002-033-000 ==========
ErrorCode PORTAL_NOT_EXISTS = new ErrorCode(1_002_033_000, "门户不存在");
} }

Some files were not shown because too many files have changed in this diff Show More