mirror of
https://github.com/YunaiV/ruoyi-vue-pro.git
synced 2026-04-19 13:38:39 +00:00
Merge branch 'master-jdk17' of https://gitee.com/zhijiantianya/ruoyi-vue-pro
# Conflicts: # yudao-dependencies/pom.xml
This commit is contained in:
@@ -75,8 +75,8 @@
|
|||||||
<awssdk.version>2.30.14</awssdk.version>
|
<awssdk.version>2.30.14</awssdk.version>
|
||||||
<justauth.version>1.16.7</justauth.version>
|
<justauth.version>1.16.7</justauth.version>
|
||||||
<justauth-starter.version>1.4.0</justauth-starter.version>
|
<justauth-starter.version>1.4.0</justauth-starter.version>
|
||||||
<jimureport.version>2.1.0</jimureport.version>
|
<jimureport.version>2.1.1</jimureport.version>
|
||||||
<jimubi.version>1.9.5</jimubi.version>
|
<jimubi.version>2.1.0</jimubi.version>
|
||||||
<weixin-java.version>4.7.7-20250808.182223</weixin-java.version>
|
<weixin-java.version>4.7.7-20250808.182223</weixin-java.version>
|
||||||
<!-- 专属于 JDK8 安全漏洞升级 -->
|
<!-- 专属于 JDK8 安全漏洞升级 -->
|
||||||
<logback.version>1.2.13</logback.version> <!-- 无法使用 1.3.X 版本,启动会报错 -->
|
<logback.version>1.2.13</logback.version> <!-- 无法使用 1.3.X 版本,启动会报错 -->
|
||||||
@@ -628,6 +628,10 @@
|
|||||||
<groupId>com.github.jsqlparser</groupId>
|
<groupId>com.github.jsqlparser</groupId>
|
||||||
<artifactId>jsqlparser</artifactId>
|
<artifactId>jsqlparser</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>cn.hutool</groupId>
|
||||||
|
<artifactId>hutool-core</artifactId>
|
||||||
|
</exclusion>
|
||||||
</exclusions>
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ import cn.iocoder.yudao.module.ai.service.model.AiChatRoleService;
|
|||||||
import cn.iocoder.yudao.module.ai.service.model.AiModelService;
|
import cn.iocoder.yudao.module.ai.service.model.AiModelService;
|
||||||
import cn.iocoder.yudao.module.ai.service.model.AiToolService;
|
import cn.iocoder.yudao.module.ai.service.model.AiToolService;
|
||||||
import cn.iocoder.yudao.module.ai.util.AiUtils;
|
import cn.iocoder.yudao.module.ai.util.AiUtils;
|
||||||
import cn.iocoder.yudao.module.infra.framework.file.core.utils.FileTypeUtils;
|
import cn.iocoder.yudao.module.ai.util.FileTypeUtils;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
import io.modelcontextprotocol.client.McpSyncClient;
|
import io.modelcontextprotocol.client.McpSyncClient;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
|
|||||||
@@ -0,0 +1,37 @@
|
|||||||
|
package cn.iocoder.yudao.module.ai.util;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.tika.Tika;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件类型 Utils
|
||||||
|
*
|
||||||
|
* @author 芋道源码
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
public class FileTypeUtils {
|
||||||
|
|
||||||
|
private static final Tika TIKA = new Tika();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 已知文件名,获取文件类型,在某些情况下比通过字节数组准确,例如使用 jar 文件时,通过名字更为准确
|
||||||
|
*
|
||||||
|
* @param name 文件名
|
||||||
|
* @return mineType 无法识别时会返回“application/octet-stream”
|
||||||
|
*/
|
||||||
|
public static String getMineType(String name) {
|
||||||
|
return TIKA.detect(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断是否是图片
|
||||||
|
*
|
||||||
|
* @param mineType 类型
|
||||||
|
* @return 是否是图片
|
||||||
|
*/
|
||||||
|
public static boolean isImage(String mineType) {
|
||||||
|
return StrUtil.startWith(mineType, "image/");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -19,6 +19,7 @@ public enum BpmReasonEnum {
|
|||||||
CANCEL_PROCESS_INSTANCE_BY_START_USER("用户主动取消流程,原因:{}"), // 场景:用户主动取消流程
|
CANCEL_PROCESS_INSTANCE_BY_START_USER("用户主动取消流程,原因:{}"), // 场景:用户主动取消流程
|
||||||
CANCEL_PROCESS_INSTANCE_BY_ADMIN("管理员【{}】取消流程,原因:{}"), // 场景:管理员取消流程
|
CANCEL_PROCESS_INSTANCE_BY_ADMIN("管理员【{}】取消流程,原因:{}"), // 场景:管理员取消流程
|
||||||
CANCEL_CHILD_PROCESS_INSTANCE_BY_MAIN_PROCESS("子流程自动取消,原因:主流程已取消"),
|
CANCEL_CHILD_PROCESS_INSTANCE_BY_MAIN_PROCESS("子流程自动取消,原因:主流程已取消"),
|
||||||
|
REJECT_CHILD_PROCESS("子流程审批不通过"),
|
||||||
|
|
||||||
// ========== 流程任务的独有原因 ==========
|
// ========== 流程任务的独有原因 ==========
|
||||||
|
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ import org.flowable.engine.history.HistoricActivityInstance;
|
|||||||
import org.flowable.engine.history.HistoricProcessInstance;
|
import org.flowable.engine.history.HistoricProcessInstance;
|
||||||
import org.flowable.engine.history.HistoricProcessInstanceQuery;
|
import org.flowable.engine.history.HistoricProcessInstanceQuery;
|
||||||
import org.flowable.engine.repository.ProcessDefinition;
|
import org.flowable.engine.repository.ProcessDefinition;
|
||||||
|
import org.flowable.engine.runtime.Execution;
|
||||||
import org.flowable.engine.runtime.ProcessInstance;
|
import org.flowable.engine.runtime.ProcessInstance;
|
||||||
import org.flowable.engine.runtime.ProcessInstanceBuilder;
|
import org.flowable.engine.runtime.ProcessInstanceBuilder;
|
||||||
import org.flowable.task.api.Task;
|
import org.flowable.task.api.Task;
|
||||||
@@ -69,6 +70,7 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU
|
|||||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
|
||||||
import static cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmApprovalDetailRespVO.ActivityNode;
|
import static cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmApprovalDetailRespVO.ActivityNode;
|
||||||
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
|
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
|
||||||
|
import static cn.iocoder.yudao.module.bpm.enums.task.BpmReasonEnum.REJECT_CHILD_PROCESS;
|
||||||
import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants.START_USER_NODE_ID;
|
import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants.START_USER_NODE_ID;
|
||||||
import static cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils.parseNodeType;
|
import static cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils.parseNodeType;
|
||||||
import static java.util.Arrays.asList;
|
import static java.util.Arrays.asList;
|
||||||
@@ -949,6 +951,29 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
|
|||||||
status);
|
status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 1.3 如果子流程拒绝,设置其父流程也为拒绝状态,且结束父流程
|
||||||
|
// 相关问题链接:https://t.zsxq.com/kZhyb
|
||||||
|
if (Objects.equals(status, BpmProcessInstanceStatusEnum.REJECT.getStatus())
|
||||||
|
&& StrUtil.isNotBlank(instance.getSuperExecutionId())) {
|
||||||
|
// 1.3.1 获取父流程实例 并标记为不通过
|
||||||
|
Execution execution = runtimeService.createExecutionQuery().executionId(instance.getSuperExecutionId()).singleResult();
|
||||||
|
ProcessInstance parentProcessInstance = getProcessInstance(execution.getProcessInstanceId());
|
||||||
|
updateProcessInstanceReject(parentProcessInstance, REJECT_CHILD_PROCESS.getReason());
|
||||||
|
|
||||||
|
// 1.3.2 结束父流程。需要在子流程结束事务提交后执行
|
||||||
|
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void afterCompletion(int transactionStatus) {
|
||||||
|
// 回滚情况,直接返回
|
||||||
|
if (ObjectUtil.equal(transactionStatus, TransactionSynchronization.STATUS_ROLLED_BACK)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
taskService.moveTaskToEnd(parentProcessInstance.getId(),REJECT_CHILD_PROCESS.getReason());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// 2. 发送对应的消息通知
|
// 2. 发送对应的消息通知
|
||||||
if (Objects.equals(status, BpmProcessInstanceStatusEnum.APPROVE.getStatus())) {
|
if (Objects.equals(status, BpmProcessInstanceStatusEnum.APPROVE.getStatus())) {
|
||||||
messageService.sendMessageWhenProcessInstanceApprove(
|
messageService.sendMessageWhenProcessInstanceApprove(
|
||||||
@@ -996,17 +1021,18 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
|
|||||||
if (ObjUtil.notEqual(instance.getName(), name)) {
|
if (ObjUtil.notEqual(instance.getName(), name)) {
|
||||||
runtimeService.setProcessInstanceName(instance.getProcessInstanceId(), name);
|
runtimeService.setProcessInstanceName(instance.getProcessInstanceId(), name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 流程前置通知:需要在流程启动后(事务提交后),保证 variables 已设置
|
||||||
|
// 相关问题链接:https://t.zsxq.com/DF7Kq
|
||||||
|
if (ObjUtil.isNull(processDefinitionInfo.getProcessBeforeTriggerSetting())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
BpmModelMetaInfoVO.HttpRequestSetting setting = processDefinitionInfo.getProcessBeforeTriggerSetting();
|
||||||
|
BpmHttpRequestUtils.executeBpmHttpRequest(instance,
|
||||||
|
setting.getUrl(), setting.getHeader(), setting.getBody(), true, setting.getResponse());
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// 流程前置通知
|
|
||||||
if (ObjUtil.isNull(processDefinitionInfo.getProcessBeforeTriggerSetting())) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
BpmModelMetaInfoVO.HttpRequestSetting setting = processDefinitionInfo.getProcessBeforeTriggerSetting();
|
|
||||||
BpmHttpRequestUtils.executeBpmHttpRequest(instance,
|
|
||||||
setting.getUrl(), setting.getHeader(), setting.getBody(), true, setting.getResponse());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -804,7 +804,8 @@ public class BpmTaskServiceImpl implements BpmTaskService {
|
|||||||
.setTargetTaskDefinitionKey(returnTaskId).setReason(reqVO.getReason()));
|
.setTargetTaskDefinitionKey(returnTaskId).setReason(reqVO.getReason()));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// 3.2 情况二:直接结束,审批不通过
|
|
||||||
|
// 3.2 情况二: 标记流程为不通过并结束流程
|
||||||
processInstanceService.updateProcessInstanceReject(instance, reqVO.getReason()); // 标记不通过
|
processInstanceService.updateProcessInstanceReject(instance, reqVO.getReason()); // 标记不通过
|
||||||
moveTaskToEnd(task.getProcessInstanceId(), BpmCommentTypeEnum.REJECT.formatComment(reqVO.getReason())); // 结束流程
|
moveTaskToEnd(task.getProcessInstanceId(), BpmCommentTypeEnum.REJECT.formatComment(reqVO.getReason())); // 结束流程
|
||||||
}
|
}
|
||||||
@@ -986,6 +987,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void moveTaskToEnd(String processInstanceId, String reason) {
|
public void moveTaskToEnd(String processInstanceId, String reason) {
|
||||||
List<Task> taskList = getRunningTaskListByProcessInstanceId(processInstanceId, null, null);
|
List<Task> taskList = getRunningTaskListByProcessInstanceId(processInstanceId, null, null);
|
||||||
if (CollUtil.isEmpty(taskList)) {
|
if (CollUtil.isEmpty(taskList)) {
|
||||||
|
|||||||
@@ -198,13 +198,13 @@ spring:
|
|||||||
rerank: false # 是否开启“通义千问”的 Rerank 模型,填写 dashscope 开启
|
rerank: false # 是否开启“通义千问”的 Rerank 模型,填写 dashscope 开启
|
||||||
mcp:
|
mcp:
|
||||||
server:
|
server:
|
||||||
enabled: true
|
enabled: false
|
||||||
name: yudao-mcp-server
|
name: yudao-mcp-server
|
||||||
version: 1.0.0
|
version: 1.0.0
|
||||||
instructions: 一个 MCP 示例服务
|
instructions: 一个 MCP 示例服务
|
||||||
sse-endpoint: /sse
|
sse-endpoint: /sse
|
||||||
client:
|
client:
|
||||||
enabled: true
|
enabled: false
|
||||||
name: mcp
|
name: mcp
|
||||||
sse:
|
sse:
|
||||||
connections:
|
connections:
|
||||||
|
|||||||
Reference in New Issue
Block a user