varList;
+ //业务扩展信息开始
+ /**
+ * 业务编码
+ */
+ private String businessCode;
+
+ /**
+ * 业务标题
+ */
+ private String businessTitle;
+ //业务扩展信息结束
+
+ private String projectName;
}
diff --git a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/NodeExtVo.java b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/NodeExtVo.java
new file mode 100644
index 00000000..5fb3380b
--- /dev/null
+++ b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/NodeExtVo.java
@@ -0,0 +1,45 @@
+package org.dromara.workflow.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Node 扩展属性解析结果 VO
+ *
+ * 用于封装从扩展属性 JSON 中解析出的各类信息,包括按钮权限、抄送对象和自定义参数。
+ *
+ * @author AprilWind
+ */
+@Data
+public class NodeExtVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 按钮权限列表
+ *
+ * 根据扩展属性中 ButtonPermissionEnum 类型的数据生成,每个元素表示一个按钮及其是否勾选。
+ */
+ private List buttonPermissions;
+
+ /**
+ * 抄送对象 ID 集合
+ *
+ * 根据扩展属性中 CopySettingEnum 类型的数据生成,存储需要抄送的对象 ID
+ */
+ private Set copySettings;
+
+ /**
+ * 自定义参数 Map
+ *
+ * 根据扩展属性中 VariablesEnum 类型的数据生成,存储 key=value 格式的自定义参数
+ */
+ private Map variables;
+
+}
diff --git a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java
index 47886d72..84cbda68 100644
--- a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java
+++ b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java
@@ -1,5 +1,6 @@
package org.dromara.workflow.domain.vo;
+
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;
@@ -31,6 +32,12 @@ public class TestLeaveVo implements Serializable {
@ExcelProperty(value = "主键")
private Long id;
+ /**
+ * 申请编号
+ */
+ @ExcelProperty(value = "申请编号")
+ private String applyCode;
+
/**
* 请假类型
*/
diff --git a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java
index c465271c..f36fed22 100644
--- a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java
+++ b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java
@@ -1,9 +1,9 @@
package org.dromara.workflow.handler;
import lombok.extern.slf4j.Slf4j;
-import org.dromara.common.core.domain.event.ProcessTaskEvent;
import org.dromara.common.core.domain.event.ProcessDeleteEvent;
import org.dromara.common.core.domain.event.ProcessEvent;
+import org.dromara.common.core.domain.event.ProcessTaskEvent;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.warm.flow.core.entity.Instance;
@@ -24,7 +24,7 @@ import java.util.Map;
public class FlowProcessEventHandler {
/**
- * 总体流程监听(例如: 草稿,撤销,退回,作废,终止,已完成,单任务完成等)
+ * 总体流程监听(例如: 草稿,撤销,退回,作废,终止,已完成等)
*
* @param flowCode 流程定义编码
* @param instance 实例数据
@@ -39,6 +39,7 @@ public class FlowProcessEventHandler {
ProcessEvent processEvent = new ProcessEvent();
processEvent.setTenantId(tenantId);
processEvent.setFlowCode(flowCode);
+ processEvent.setInstanceId(instance.getId());
processEvent.setBusinessId(instance.getBusinessId());
processEvent.setNodeType(instance.getNodeType());
processEvent.setNodeCode(instance.getNodeCode());
@@ -55,20 +56,23 @@ public class FlowProcessEventHandler {
* @param flowCode 流程定义编码
* @param instance 实例数据
* @param taskId 任务id
+ * @param params 上一个任务的办理参数
*/
- public void processTaskHandler(String flowCode, Instance instance, Long taskId) {
+ public void processTaskHandler(String flowCode, Instance instance, Long taskId, Map params) {
String tenantId = TenantHelper.getTenantId();
log.info("【流程任务事件发布】租户ID: {}, 流程编码: {}, 业务ID: {}, 节点类型: {}, 节点编码: {}, 节点名称: {}, 任务ID: {}",
tenantId, flowCode, instance.getBusinessId(), instance.getNodeType(), instance.getNodeCode(), instance.getNodeName(), taskId);
ProcessTaskEvent processTaskEvent = new ProcessTaskEvent();
processTaskEvent.setTenantId(tenantId);
processTaskEvent.setFlowCode(flowCode);
+ processTaskEvent.setInstanceId(instance.getId());
processTaskEvent.setBusinessId(instance.getBusinessId());
processTaskEvent.setNodeType(instance.getNodeType());
processTaskEvent.setNodeCode(instance.getNodeCode());
processTaskEvent.setNodeName(instance.getNodeName());
processTaskEvent.setTaskId(taskId);
processTaskEvent.setStatus(instance.getFlowStatus());
+ processTaskEvent.setParams(params);
SpringUtils.context().publishEvent(processTaskEvent);
}
diff --git a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java
index f9ede15c..b5aec3de 100644
--- a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java
+++ b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java
@@ -1,13 +1,17 @@
package org.dromara.workflow.handler;
import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.convert.Convert;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.domain.dto.UserDTO;
+import org.dromara.common.core.utils.StreamUtils;
+import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.warm.flow.core.dto.FlowParams;
import org.dromara.warm.flow.core.handler.PermissionHandler;
import org.dromara.workflow.common.ConditionalOnEnable;
-import org.dromara.workflow.service.IFlwCommonService;
+import org.dromara.workflow.service.IFlwTaskAssigneeService;
import org.springframework.stereotype.Component;
import java.util.Collections;
@@ -24,7 +28,7 @@ import java.util.List;
@Slf4j
public class WorkflowPermissionHandler implements PermissionHandler {
- private final IFlwCommonService flwCommonService;
+ private final IFlwTaskAssigneeService flwTaskAssigneeService;
/**
* 办理人权限标识,比如用户,角色,部门等,用于校验是否有权限办理任务
@@ -51,9 +55,11 @@ public class WorkflowPermissionHandler implements PermissionHandler {
*/
@Override
public List convertPermissions(List permissions) {
- if (CollUtil.isNotEmpty(permissions)) {
- permissions = flwCommonService.buildUser(permissions);
+ if (CollUtil.isEmpty(permissions)) {
+ return permissions;
}
- return permissions;
+ String storageIds = CollUtil.join(permissions, StringUtils.SEPARATOR);
+ List users = flwTaskAssigneeService.fetchUsersByStorageIds(storageIds,null);
+ return StreamUtils.toList(users, userDTO -> Convert.toStr(userDTO.getUserId()));
}
}
diff --git a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java
index 7aa19ce1..f0855331 100644
--- a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java
+++ b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java
@@ -2,6 +2,8 @@ package org.dromara.workflow.listener;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.lang.TypeReference;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
@@ -11,6 +13,7 @@ import org.dromara.common.core.domain.dto.UserDTO;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.enums.BusinessStatusEnum;
import org.dromara.common.core.service.UserService;
+import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.warm.flow.core.FlowEngine;
import org.dromara.warm.flow.core.dto.FlowParams;
@@ -28,11 +31,9 @@ import org.dromara.workflow.common.ConditionalOnEnable;
import org.dromara.workflow.common.constant.FlowConstant;
import org.dromara.workflow.common.enums.TaskStatusEnum;
import org.dromara.workflow.domain.bo.FlowCopyBo;
+import org.dromara.workflow.domain.vo.NodeExtVo;
import org.dromara.workflow.handler.FlowProcessEventHandler;
-import org.dromara.workflow.service.IFlwCommonService;
-import org.dromara.workflow.service.IFlwInstanceService;
-import org.dromara.workflow.service.IFlwTaskAssigneeService;
-import org.dromara.workflow.service.IFlwTaskService;
+import org.dromara.workflow.service.*;
import org.springframework.stereotype.Component;
import java.util.*;
@@ -56,7 +57,8 @@ public class WorkflowGlobalListener implements GlobalListener {
private final InsService insService;
private final IFlwTaskAssigneeService flwTaskAssigneeService;
private final UserService userService;
-
+ private final IFlwInstanceService flwInstanceService;
+ private final IFlwNodeExtService nodeExtService;
// 需要分专业的角色
@@ -76,42 +78,6 @@ public class WorkflowGlobalListener implements GlobalListener {
*/
@Override
public void create(ListenerVariable listenerVariable) {
- log.info("全局创建监听器开始执行......");
-
- // 获取相关变量
-// List nextTasks = listenerVariable.getNextTasks();
-// Definition definition = listenerVariable.getDefinition();
-// Map variable = listenerVariable.getVariable();
-//
-// for (Task flowTask : nextTasks) {
-// String nodeCode = flowTask.getNodeCode();
-//
-//
-// // 查询节点信息
-// FlowNode byNodeCode = flwTaskService.getByNodeCode(nodeCode, definition.getId());
-//
-// // 获取原来的办理人信息
-// List originalPermissionList = flowTask.getPermissionList();
-// log.info("节点 {} 原来的办理人信息: {}", nodeCode, originalPermissionList);
-// String permissionFlag = byNodeCode.getPermissionFlag();
-// try {
-// if(permissionFlag.contains("role")){
-// permissionFlag = permissionFlag.replace("@@", ",");
-//
-// String flowCode = definition.getFlowCode();
-// String projectId = flowCode.split("_")[0];
-//
-// List userDTOS = flwTaskAssigneeService.fetchUsersByStorageIds(permissionFlag, Long.valueOf(projectId));
-// variable.put("userList", userDTOS.stream().map(UserDTO::getUserId).map(String::valueOf).collect(Collectors.toList()));
-// flowTask.setPermissionList(userDTOS.stream().map(UserDTO::getUserId).map(String::valueOf).collect(Collectors.toList()));
-// }
-//
-// }catch (Exception e) {
-// log.error("设置失败: {}", e.getMessage());
-// }
-// }
-
- log.info("全局创建监听器执行结束......");
}
@@ -123,7 +89,25 @@ public class WorkflowGlobalListener implements GlobalListener {
*/
@Override
public void start(ListenerVariable listenerVariable) {
-
+ String ext = listenerVariable.getNode().getExt();
+ if (StringUtils.isNotBlank(ext)) {
+ Map variable = listenerVariable.getVariable();
+ NodeExtVo nodeExt = nodeExtService.parseNodeExt(ext, variable);
+ Set copyList = nodeExt.getCopySettings();
+ if (CollUtil.isNotEmpty(copyList)) {
+ List list = StreamUtils.toList(copyList, x -> {
+ FlowCopyBo bo = new FlowCopyBo();
+ Long id = Convert.toLong(x);
+ bo.setUserId(id);
+ bo.setUserName(userService.selectUserNameById(id));
+ return bo;
+ });
+ variable.put(FlowConstant.FLOW_COPY_LIST, list);
+ }
+ if (CollUtil.isNotEmpty(nodeExt.getVariables())) {
+ variable.putAll(nodeExt.getVariables());
+ }
+ }
}
/**
@@ -223,6 +207,7 @@ public class WorkflowGlobalListener implements GlobalListener {
Instance instance = listenerVariable.getInstance();
Definition definition = listenerVariable.getDefinition();
Task task = listenerVariable.getTask();
+ List nextTasks = listenerVariable.getNextTasks();
Map params = new HashMap<>();
FlowParams flowParams = listenerVariable.getFlowParams();
Map variable = new HashMap<>();
@@ -245,52 +230,61 @@ public class WorkflowGlobalListener implements GlobalListener {
if (StringUtils.isNotBlank(status)) {
flowProcessEventHandler.processHandler(definition.getFlowCode(), instance, status, params, false);
}
+ if (!BusinessStatusEnum.initialState(instance.getFlowStatus())) {
+ if (task != null && CollUtil.isNotEmpty(nextTasks) && nextTasks.size() == 1
+ && flwCommonService.applyNodeCode(definition.getId()).equals(nextTasks.get(0).getNodeCode())) {
+ // 如果为画线指定驳回 线条指定为驳回 驳回得节点为申请人节点 则修改流程状态为退回
+ flowProcessEventHandler.processHandler(definition.getFlowCode(), instance, BusinessStatusEnum.BACK.getStatus(), params, false);
+ // 修改流程实例状态
+ instance.setFlowStatus(BusinessStatusEnum.BACK.getStatus());
+ FlowEngine.insService().updateById(instance);
+ }
+ }
}
//发布任务事件
- if (task != null) {
- flowProcessEventHandler.processTaskHandler(definition.getFlowCode(), instance, task.getId());
+ if (CollUtil.isNotEmpty(nextTasks)) {
+ for (Task nextTask : nextTasks) {
+ flowProcessEventHandler.processTaskHandler(definition.getFlowCode(), instance, nextTask.getId(), params);
+ }
}
if (ObjectUtil.isNull(flowParams)) {
return;
}
- //给处理人发消息重新统计数据
+ // 只有办理或者退回的时候才执行消息通知和抄送
+ if (!TaskStatusEnum.isPassOrBack(flowParams.getHisStatus())) {
+ return;
+ }
+ if (ObjectUtil.isNull(variable)) {
+ return;
+ }
+ if (variable.containsKey(FlowConstant.FLOW_COPY_LIST)) {
+ List flowCopyList = MapUtil.get(variable, FlowConstant.FLOW_COPY_LIST, new TypeReference<>() {
+ });
+ // 添加抄送人
+ flwTaskService.setCopy(task, flowCopyList);
+ //发送抄送消息
+ flwCommonService.sendCopyMessage(definition.getFlowName(), definition.getFlowCode(), flowCopyList);
+ }
+ if (variable.containsKey(FlowConstant.MESSAGE_TYPE)) {
+ List messageType = MapUtil.get(variable, FlowConstant.MESSAGE_TYPE, new TypeReference<>() {
+ });
+ String notice = MapUtil.getStr(variable, FlowConstant.MESSAGE_NOTICE);
+ flwCommonService.sendMessage(definition.getFlowName(), instance.getId(), messageType, notice);
+ }
+ FlowEngine.insService().removeVariables(instance.getId(),
+ FlowConstant.FLOW_COPY_LIST,
+ FlowConstant.MESSAGE_TYPE,
+ FlowConstant.MESSAGE_NOTICE,
+ FlowConstant.SUBMIT
+ );
+ //给处理人发消息重新统计数据
if (task != null) {
flwCommonService.sendCountMessage(task);
}
- // 只有办理或者退回的时候才执行消息通知和抄送
- if (TaskStatusEnum.PASS.getStatus().equals(flowParams.getHisStatus())
- || TaskStatusEnum.BACK.getStatus().equals(flowParams.getHisStatus())) {
- if (variable != null) {
- if (variable.containsKey(FlowConstant.FLOW_COPY_LIST)) {
- List flowCopyList = (List) variable.get(FlowConstant.FLOW_COPY_LIST);
- // 添加抄送人
- flwTaskService.setCopy(task, flowCopyList);
- //发送抄送消息
- flwCommonService.sendCopyMessage(definition.getFlowName(), definition.getFlowCode(), flowCopyList);
- }
- if (variable.containsKey(FlowConstant.MESSAGE_TYPE)) {
- List messageType = (List) variable.get(FlowConstant.MESSAGE_TYPE);
- String notice = (String) variable.get(FlowConstant.MESSAGE_NOTICE);
- // 消息通知
- if (CollUtil.isNotEmpty(messageType)) {
- flwCommonService.sendMessage(definition.getFlowName(),definition.getFlowCode(), instance.getId(), messageType, notice);
- }
- }
- FlowInstance ins = new FlowInstance();
- Map variableMap = instance.getVariableMap();
- variableMap.remove(FlowConstant.FLOW_COPY_LIST);
- variableMap.remove(FlowConstant.MESSAGE_TYPE);
- variableMap.remove(FlowConstant.MESSAGE_NOTICE);
- variableMap.remove(FlowConstant.SUBMIT);
- ins.setId(instance.getId());
- ins.setVariable(FlowEngine.jsonConvert.objToStr(variableMap));
- insService.updateById(ins);
- }
- }
- }
+ }
/**
* 根据流程实例确定最终状态
*
@@ -304,11 +298,10 @@ public class WorkflowGlobalListener implements GlobalListener {
return flowStatus;
} else {
Long instanceId = instance.getId();
- List flowTasks = flwTaskService.selectByInstId(instanceId);
- if (CollUtil.isEmpty(flowTasks)) {
+ if (flwTaskService.isTaskEnd(instanceId)) {
String status = BusinessStatusEnum.FINISH.getStatus();
// 更新流程状态为已完成
- instanceService.updateStatus(instanceId, status);
+ flwInstanceService.updateStatus(instanceId, status);
log.info("流程已结束,状态更新为: {}", status);
return status;
}
diff --git a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwCategoryMapper.java b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwCategoryMapper.java
index 4a59f258..c7a3d264 100644
--- a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwCategoryMapper.java
+++ b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwCategoryMapper.java
@@ -1,8 +1,6 @@
package org.dromara.workflow.mapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import org.dromara.common.mybatis.annotation.DataColumn;
-import org.dromara.common.mybatis.annotation.DataPermission;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.common.mybatis.helper.DataBaseHelper;
import org.dromara.workflow.domain.FlowCategory;
@@ -20,19 +18,6 @@ import java.util.stream.Stream;
*/
public interface FlwCategoryMapper extends BaseMapperPlus {
- /**
- * 统计指定流程分类ID的分类数量
- *
- * @param categoryId 流程分类ID
- * @return 该流程分类ID的分类数量
- */
- @DataPermission({
- @DataColumn(key = "deptName", value = "createDept")
- })
- default long countCategoryById(Long categoryId) {
- return this.selectCount(new LambdaQueryWrapper().eq(FlowCategory::getCategoryId, categoryId));
- }
-
/**
* 根据父流程分类ID查询其所有子流程分类的列表
*
diff --git a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceBizExtMapper.java b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceBizExtMapper.java
new file mode 100644
index 00000000..e11613cf
--- /dev/null
+++ b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceBizExtMapper.java
@@ -0,0 +1,61 @@
+package org.dromara.workflow.mapper;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.workflow.domain.FlowInstanceBizExt;
+
+import java.util.List;
+
+/**
+ * 流程实例业务扩展Mapper接口
+ *
+ * @author may
+ * @date 2025-08-05
+ */
+public interface FlwInstanceBizExtMapper extends BaseMapperPlus {
+
+ /**
+ * 根据 instanceId 保存或更新流程实例业务扩展
+ *
+ * @param entity 流程实例业务扩展实体
+ * @return 操作是否成功
+ */
+ default int saveOrUpdateByInstanceId(FlowInstanceBizExt entity) {
+ // 查询是否存在
+ FlowInstanceBizExt exist = this.selectOne(new LambdaQueryWrapper()
+ .eq(FlowInstanceBizExt::getInstanceId, entity.getInstanceId()));
+
+ if (ObjectUtil.isNotNull(exist)) {
+ // 存在就带上主键更新
+ entity.setId(exist.getId());
+ return updateById(entity);
+ } else {
+ // 不存在就插入
+ return insert(entity);
+ }
+ }
+
+ /**
+ * 按照流程实例ID删除单个流程实例业务扩展
+ *
+ * @param instanceId 流程实例ID
+ * @return 删除的行数
+ */
+ default int deleteByInstId(Long instanceId) {
+ return this.delete(new LambdaQueryWrapper()
+ .eq(FlowInstanceBizExt::getInstanceId, instanceId));
+ }
+
+ /**
+ * 按照流程实例ID批量删除流程实例业务扩展
+ *
+ * @param instanceIds 流程实例ID列表
+ * @return 删除的行数
+ */
+ default int deleteByInstIds(List instanceIds) {
+ return this.delete(new LambdaQueryWrapper()
+ .in(FlowInstanceBizExt::getInstanceId, instanceIds));
+ }
+
+}
diff --git a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwSpelMapper.java b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwSpelMapper.java
new file mode 100644
index 00000000..4cba7eeb
--- /dev/null
+++ b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwSpelMapper.java
@@ -0,0 +1,15 @@
+package org.dromara.workflow.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.workflow.domain.FlowSpel;
+import org.dromara.workflow.domain.vo.FlowSpelVo;
+
+/**
+ * 流程spel达式定义Mapper接口
+ *
+ * @author Michelle.Chung
+ * @date 2025-07-04
+ */
+public interface FlwSpelMapper extends BaseMapperPlus {
+
+}
diff --git a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java
index 8068e4c8..2b28c056 100644
--- a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java
+++ b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java
@@ -19,7 +19,6 @@ import java.util.List;
* @date 2024-03-02
*/
public interface FlwTaskMapper {
-
/**
* 获取待办信息
*
@@ -28,23 +27,6 @@ public interface FlwTaskMapper {
* @return 结果
*/
Page getListRunTask(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper);
- Page getListRunTaskDefinitionIds(@Param("page") Page page, @Param("definitionIds") List definitionIds, @Param(Constants.WRAPPER) Wrapper queryWrapper);
-
- /**
- * 不分页版
- * @param definitionIds
- * @param queryWrapper
- * @return
- */
- List getListRunTaskDefinitionInfo(@Param("definitionIds") List definitionIds, @Param(Constants.WRAPPER) Wrapper queryWrapper);
-
- /**
- * 获取待办信息
- *
- * @param queryWrapper 条件
- * @return 结果
- */
- List getListRunTask(@Param(Constants.WRAPPER) Wrapper queryWrapper);
/**
* 获取已办
@@ -54,7 +36,6 @@ public interface FlwTaskMapper {
* @return 结果
*/
Page getListFinishTask(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper);
- Page getListFinishDefinitionIdsTask(@Param("page") Page page,@Param("definitionIds") List definitionIds, @Param(Constants.WRAPPER) Wrapper queryWrapper);
/**
* 查询当前用户的抄送
@@ -65,9 +46,24 @@ public interface FlwTaskMapper {
*/
Page getTaskCopyByPage(@Param("page") Page page, @Param(Constants.WRAPPER) QueryWrapper queryWrapper);
+
+
+
+
+
Page getTaskCopyDefinitionIdsByPage(@Param("page") Page page,@Param("definitionIds") List definitionIds, @Param(Constants.WRAPPER) QueryWrapper queryWrapper);
void copyRead(@Param("flowUserId") Long flowUserId);
+ /**
+ * 不分页版
+ * @param definitionIds
+ * @param queryWrapper
+ * @return
+ */
+ List getListRunTaskDefinitionInfo(@Param("definitionIds") List definitionIds, @Param(Constants.WRAPPER) Wrapper queryWrapper);
+ Page getListFinishDefinitionIdsTask(@Param("page") Page page,@Param("definitionIds") List definitionIds, @Param(Constants.WRAPPER) Wrapper queryWrapper);
+
+ Page getListRunTaskDefinitionIds(@Param("page") Page page, @Param("definitionIds") List definitionIds, @Param(Constants.WRAPPER) Wrapper queryWrapper);
}
diff --git a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/rule/SpelRuleComponent.java b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/rule/SpelRuleComponent.java
new file mode 100644
index 00000000..7498db56
--- /dev/null
+++ b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/rule/SpelRuleComponent.java
@@ -0,0 +1,38 @@
+package org.dromara.workflow.rule;
+
+import cn.hutool.core.util.ObjectUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.exception.ServiceException;
+import org.dromara.common.core.service.DeptService;
+import org.dromara.workflow.common.ConditionalOnEnable;
+import org.springframework.stereotype.Component;
+
+/**
+ * spel表达式规则组件
+ *
+ * 通过该组件统一管理流程定义中的spel表达式
+ *
+ *
+ * @author Michelle.Chung
+ */
+@ConditionalOnEnable
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class SpelRuleComponent {
+
+ private final DeptService deptService;
+
+ /**
+ * 通过发起人部门id获取部门负责人
+ */
+ public Long selectDeptLeaderById(Long initiatorDeptId) {
+ Long leaderId = deptService.selectDeptLeaderById(initiatorDeptId);
+ if (ObjectUtil.isNull(leaderId)) {
+ throw new ServiceException("当前部门未设置负责人,请联系管理员操作。");
+ }
+ return leaderId;
+ }
+
+}
diff --git a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCategoryService.java b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCategoryService.java
index 91f173d4..f66882b8 100644
--- a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCategoryService.java
+++ b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCategoryService.java
@@ -45,13 +45,6 @@ public interface IFlwCategoryService {
*/
List> selectCategoryTreeList(FlowCategoryBo category);
- /**
- * 校验流程分类是否有数据权限
- *
- * @param categoryId 流程分类ID
- */
- void checkCategoryDataScope(Long categoryId);
-
/**
* 校验流程分类名称是否唯一
*
diff --git a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCommonService.java b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCommonService.java
index e9df5cf6..2f8c6957 100644
--- a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCommonService.java
+++ b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCommonService.java
@@ -1,5 +1,6 @@
package org.dromara.workflow.service;
+import org.dromara.common.core.domain.dto.UserDTO;
import org.dromara.warm.flow.core.entity.Task;
import org.dromara.workflow.domain.bo.FlowCopyBo;
@@ -12,14 +13,6 @@ import java.util.List;
*/
public interface IFlwCommonService {
- /**
- * 构建工作流用户
- *
- * @param permissionList 办理用户
- * @return 用户
- */
- List buildUser(List permissionList);
-
/**
* 发送消息
*
@@ -47,4 +40,27 @@ public interface IFlwCommonService {
* @return 申请人节点编码
*/
String applyNodeCode(Long definitionId);
+
+
+ /**
+ * 发送消息
+ *
+ * @param messageType 消息类型
+ * @param message 消息内容
+ * @param subject 邮件标题
+ * @param userList 接收用户
+ */
+ void sendMessage(List messageType, String message, String subject, List userList);
+
+
+ /**
+ * 发送消息
+ *
+ * @param flowName 流程定义名称
+ * @param instId 实例id
+ * @param messageType 消息类型
+ * @param message 消息内容,为空则发送默认配置的消息内容
+ */
+ void sendMessage(String flowName, Long instId, List messageType, String message);
+
}
diff --git a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java
index 6076260c..54743b72 100644
--- a/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java
+++ b/xinnengyuan/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java
@@ -3,7 +3,7 @@ package org.dromara.workflow.service;
import jakarta.servlet.http.HttpServletResponse;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
-import org.dromara.workflow.domain.bo.FlowDefinitionBo;
+import org.dromara.warm.flow.orm.entity.FlowDefinition;
import org.dromara.workflow.domain.vo.FlowDefinitionVo;
import org.springframework.web.multipart.MultipartFile;
@@ -20,20 +20,20 @@ public interface IFlwDefinitionService {
/**
* 查询流程定义列表
*
- * @param flowDefinitionBo 参数
- * @param pageQuery 分页
+ * @param flowDefinition 参数
+ * @param pageQuery 分页
* @return 返回分页列表
*/
- TableDataInfo queryList(FlowDefinitionBo flowDefinitionBo, PageQuery pageQuery);
+ TableDataInfo