mirror of
https://github.com/dromara/RuoYi-Vue-Plus.git
synced 2025-10-20 08:53:48 +08:00
Compare commits
5 Commits
b50904c6ff
...
a2c238d466
Author | SHA1 | Date | |
---|---|---|---|
|
a2c238d466 | ||
|
d89f147c54 | ||
|
53cf1b2013 | ||
|
564ab331d7 | ||
|
a690ece164 |
2
pom.xml
2
pom.xml
@@ -35,7 +35,7 @@
|
||||
<mapstruct-plus.version>1.4.6</mapstruct-plus.version>
|
||||
<mapstruct-plus.lombok.version>0.2.0</mapstruct-plus.lombok.version>
|
||||
<lombok.version>1.18.36</lombok.version>
|
||||
<bouncycastle.version>1.76</bouncycastle.version>
|
||||
<bouncycastle.version>1.80</bouncycastle.version>
|
||||
<justauth.version>1.16.7</justauth.version>
|
||||
<!-- 离线IP地址定位库 -->
|
||||
<ip2region.version>2.7.0</ip2region.version>
|
||||
|
@@ -85,7 +85,8 @@ public class PlusSaTokenDao implements SaTokenDao {
|
||||
@Override
|
||||
public long getTimeout(String key) {
|
||||
long timeout = RedisUtils.getTimeToLive(key);
|
||||
return timeout < 0 ? timeout : timeout / 1000;
|
||||
// 加1的目的 解决sa-token使用秒 redis是毫秒导致1秒的精度问题 手动补偿
|
||||
return timeout < 0 ? timeout : timeout / 1000 + 1;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -152,7 +153,8 @@ public class PlusSaTokenDao implements SaTokenDao {
|
||||
@Override
|
||||
public long getObjectTimeout(String key) {
|
||||
long timeout = RedisUtils.getTimeToLive(key);
|
||||
return timeout < 0 ? timeout : timeout / 1000;
|
||||
// 加1的目的 解决sa-token使用秒 redis是毫秒导致1秒的精度问题 手动补偿
|
||||
return timeout < 0 ? timeout : timeout / 1000 + 1;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -1,28 +0,0 @@
|
||||
package org.dromara.workflow.domain.vo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 流程变量
|
||||
*
|
||||
* @author may
|
||||
*/
|
||||
@Data
|
||||
public class FlowVariableVo implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 变量key
|
||||
*/
|
||||
private String key;
|
||||
|
||||
/**
|
||||
* 变量值
|
||||
*/
|
||||
private String value;
|
||||
}
|
@@ -6,6 +6,7 @@ import org.dromara.common.core.domain.event.ProcessDeleteEvent;
|
||||
import org.dromara.common.core.domain.event.ProcessEvent;
|
||||
import org.dromara.common.core.utils.SpringUtils;
|
||||
import org.dromara.common.tenant.helper.TenantHelper;
|
||||
import org.dromara.warm.flow.core.entity.Instance;
|
||||
import org.dromara.workflow.common.ConditionalOnEnable;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@@ -26,28 +27,22 @@ public class FlowProcessEventHandler {
|
||||
* 总体流程监听(例如: 草稿,撤销,退回,作废,终止,已完成,单任务完成等)
|
||||
*
|
||||
* @param flowCode 流程定义编码
|
||||
* @param businessId 业务id
|
||||
* @param nodeType 节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)
|
||||
* @param nodeCode 流程节点编码
|
||||
* @param nodeName 流程节点名称
|
||||
* @param instance 实例数据
|
||||
* @param status 流程状态
|
||||
* @param params 办理参数
|
||||
* @param submit 当为true时为申请人节点办理
|
||||
*/
|
||||
public void processHandler(String flowCode, String businessId, Integer nodeType, String nodeCode, String nodeName,
|
||||
String status, Map<String, Object> params, boolean submit) {
|
||||
|
||||
public void processHandler(String flowCode, Instance instance, String status, Map<String, Object> params, boolean submit) {
|
||||
String tenantId = TenantHelper.getTenantId();
|
||||
log.info("【流程事件发布】租户ID: {}, 流程编码: {}, 业务ID: {}, 状态: {}, 节点类型: {}, 节点编码: {}, 节点名称: {}, 是否申请人节点: {}, 参数: {}",
|
||||
tenantId, flowCode, businessId, status, nodeType, nodeCode, nodeName, submit, params);
|
||||
|
||||
log.info("【流程事件发布】租户ID: {}, 流程编码: {}, 业务ID: {}, 流程状态: {}, 节点类型: {}, 节点编码: {}, 节点名称: {}, 是否申请人节点: {}, 参数: {}",
|
||||
tenantId, flowCode, instance.getBusinessId(), status, instance.getNodeType(), instance.getNodeCode(), instance.getNodeName(), submit, params);
|
||||
ProcessEvent processEvent = new ProcessEvent();
|
||||
processEvent.setTenantId(tenantId);
|
||||
processEvent.setFlowCode(flowCode);
|
||||
processEvent.setBusinessId(businessId);
|
||||
processEvent.setNodeType(nodeType);
|
||||
processEvent.setNodeCode(nodeCode);
|
||||
processEvent.setNodeName(nodeName);
|
||||
processEvent.setBusinessId(instance.getBusinessId());
|
||||
processEvent.setNodeType(instance.getNodeType());
|
||||
processEvent.setNodeCode(instance.getNodeCode());
|
||||
processEvent.setNodeName(instance.getNodeName());
|
||||
processEvent.setStatus(status);
|
||||
processEvent.setParams(params);
|
||||
processEvent.setSubmit(submit);
|
||||
@@ -58,24 +53,21 @@ public class FlowProcessEventHandler {
|
||||
* 执行创建任务监听
|
||||
*
|
||||
* @param flowCode 流程定义编码
|
||||
* @param nodeType 节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)
|
||||
* @param nodeCode 流程节点编码
|
||||
* @param nodeName 流程节点名称
|
||||
* @param instance 实例数据
|
||||
* @param taskId 任务id
|
||||
* @param businessId 业务id
|
||||
*/
|
||||
public void processCreateTaskHandler(String flowCode, Integer nodeType, String nodeCode, String nodeName, Long taskId, String businessId) {
|
||||
public void processCreateTaskHandler(String flowCode, Instance instance, Long taskId) {
|
||||
String tenantId = TenantHelper.getTenantId();
|
||||
log.info("发布流程任务事件, 租户ID: {}, 流程编码: {}, 节点类型: {}, 节点编码: {}, 节点名称: {}, 任务ID: {}, 业务ID: {}",
|
||||
tenantId, flowCode, nodeType, nodeCode, nodeName, taskId, businessId);
|
||||
log.info("【流程任务事件发布】租户ID: {}, 流程编码: {}, 业务ID: {}, 节点类型: {}, 节点编码: {}, 节点名称: {}, 任务ID: {}",
|
||||
tenantId, flowCode, instance.getBusinessId(), instance.getNodeType(), instance.getNodeCode(), instance.getNodeName(), taskId);
|
||||
ProcessCreateTaskEvent processCreateTaskEvent = new ProcessCreateTaskEvent();
|
||||
processCreateTaskEvent.setTenantId(tenantId);
|
||||
processCreateTaskEvent.setFlowCode(flowCode);
|
||||
processCreateTaskEvent.setNodeType(nodeType);
|
||||
processCreateTaskEvent.setNodeCode(nodeCode);
|
||||
processCreateTaskEvent.setNodeName(nodeName);
|
||||
processCreateTaskEvent.setBusinessId(instance.getBusinessId());
|
||||
processCreateTaskEvent.setNodeType(instance.getNodeType());
|
||||
processCreateTaskEvent.setNodeCode(instance.getNodeCode());
|
||||
processCreateTaskEvent.setNodeName(instance.getNodeName());
|
||||
processCreateTaskEvent.setTaskId(taskId);
|
||||
processCreateTaskEvent.setBusinessId(businessId);
|
||||
SpringUtils.context().publishEvent(processCreateTaskEvent);
|
||||
}
|
||||
|
||||
@@ -87,7 +79,7 @@ public class FlowProcessEventHandler {
|
||||
*/
|
||||
public void processDeleteHandler(String flowCode, String businessId) {
|
||||
String tenantId = TenantHelper.getTenantId();
|
||||
log.info("发布删除流程事件, 租户ID: {}, 流程编码: {}, 业务ID: {}", tenantId, flowCode, businessId);
|
||||
log.info("【流程删除事件发布】租户ID: {}, 流程编码: {}, 业务ID: {}", tenantId, flowCode, businessId);
|
||||
ProcessDeleteEvent processDeleteEvent = new ProcessDeleteEvent();
|
||||
processDeleteEvent.setTenantId(tenantId);
|
||||
processDeleteEvent.setFlowCode(flowCode);
|
||||
|
@@ -47,13 +47,10 @@ public class WorkflowGlobalListener implements GlobalListener {
|
||||
public void create(ListenerVariable listenerVariable) {
|
||||
Instance instance = listenerVariable.getInstance();
|
||||
Definition definition = listenerVariable.getDefinition();
|
||||
String businessId = instance.getBusinessId();
|
||||
String flowStatus = instance.getFlowStatus();
|
||||
Task task = listenerVariable.getTask();
|
||||
if (task != null && BusinessStatusEnum.WAITING.getStatus().equals(flowStatus)) {
|
||||
if (task != null && BusinessStatusEnum.WAITING.getStatus().equals(instance.getFlowStatus())) {
|
||||
// 判断流程状态(发布审批中事件)
|
||||
flowProcessEventHandler.processCreateTaskHandler(definition.getFlowCode(), task.getNodeType(),
|
||||
task.getNodeCode(), task.getNodeName(), task.getId(), businessId);
|
||||
flowProcessEventHandler.processCreateTaskHandler(definition.getFlowCode(), instance, task.getId());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -97,8 +94,7 @@ public class WorkflowGlobalListener implements GlobalListener {
|
||||
// 判断流程状态(发布:撤销,退回,作废,终止,已完成事件)
|
||||
String status = determineFlowStatus(instance);
|
||||
if (StringUtils.isNotBlank(status)) {
|
||||
flowProcessEventHandler.processHandler(definition.getFlowCode(), instance.getBusinessId(), instance.getNodeType(),
|
||||
instance.getNodeCode(), instance.getNodeName(), status, params, false);
|
||||
flowProcessEventHandler.processHandler(definition.getFlowCode(), instance, status, params, false);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -198,12 +198,12 @@ public class FlwCommonServiceImpl implements IFlwCommonService {
|
||||
}
|
||||
for (FlowTask task : list) {
|
||||
List<UserDTO> userList = flwTaskService.currentTaskAllUser(task.getId());
|
||||
FlowParams flowParams = FlowParams.build();
|
||||
flowParams.nodeCode(targetNodeCode);
|
||||
flowParams.message(message);
|
||||
flowParams.skipType(SkipType.PASS.getKey());
|
||||
flowParams.flowStatus(flowStatus).hisStatus(flowHisStatus);
|
||||
flowParams.ignore(true);
|
||||
FlowParams flowParams = FlowParams.build()
|
||||
.nodeCode(targetNodeCode)
|
||||
.message(message)
|
||||
.skipType(SkipType.PASS.getKey())
|
||||
.flowStatus(flowStatus).hisStatus(flowHisStatus)
|
||||
.ignore(true);
|
||||
//解决会签没权限问题
|
||||
if (CollUtil.isNotEmpty(userList)) {
|
||||
flowParams.handler(userList.get(0).getUserId().toString());
|
||||
|
@@ -42,7 +42,6 @@ import org.dromara.workflow.domain.bo.FlowInstanceBo;
|
||||
import org.dromara.workflow.domain.bo.FlowInvalidBo;
|
||||
import org.dromara.workflow.domain.vo.FlowHisTaskVo;
|
||||
import org.dromara.workflow.domain.vo.FlowInstanceVo;
|
||||
import org.dromara.workflow.domain.vo.FlowVariableVo;
|
||||
import org.dromara.workflow.handler.FlowProcessEventHandler;
|
||||
import org.dromara.workflow.mapper.FlwCategoryMapper;
|
||||
import org.dromara.workflow.mapper.FlwInstanceMapper;
|
||||
@@ -346,21 +345,12 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
|
||||
*/
|
||||
@Override
|
||||
public Map<String, Object> instanceVariable(Long instanceId) {
|
||||
Map<String, Object> map = new HashMap<>();
|
||||
FlowInstance flowInstance = flowInstanceMapper.selectById(instanceId);
|
||||
Map<String, Object> variableMap = flowInstance.getVariableMap();
|
||||
List<FlowVariableVo> list = new ArrayList<>();
|
||||
if (CollUtil.isNotEmpty(variableMap)) {
|
||||
for (Map.Entry<String, Object> entry : variableMap.entrySet()) {
|
||||
FlowVariableVo flowVariableVo = new FlowVariableVo();
|
||||
flowVariableVo.setKey(entry.getKey());
|
||||
flowVariableVo.setValue(entry.getValue().toString());
|
||||
list.add(flowVariableVo);
|
||||
}
|
||||
}
|
||||
map.put("variableList", list);
|
||||
map.put("variable", flowInstance.getVariable());
|
||||
return map;
|
||||
Map<String, Object> variableMap = Optional.ofNullable(flowInstance.getVariableMap()).orElse(Collections.emptyMap());
|
||||
List<Map<String, Object>> variableList = variableMap.entrySet().stream()
|
||||
.map(entry -> Map.of("key", entry.getKey(), "value", entry.getValue()))
|
||||
.toList();
|
||||
return Map.of("variableList", variableList, "variable", flowInstance.getVariable());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -437,11 +427,11 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
|
||||
}
|
||||
List<FlowTask> flowTaskList = flwTaskService.selectByInstId(bo.getId());
|
||||
for (FlowTask flowTask : flowTaskList) {
|
||||
FlowParams flowParams = new FlowParams();
|
||||
flowParams.message(bo.getComment());
|
||||
flowParams.flowStatus(BusinessStatusEnum.INVALID.getStatus())
|
||||
.hisStatus(TaskStatusEnum.INVALID.getStatus());
|
||||
flowParams.ignore(true);
|
||||
FlowParams flowParams = FlowParams.build()
|
||||
.message(bo.getComment())
|
||||
.flowStatus(BusinessStatusEnum.INVALID.getStatus())
|
||||
.hisStatus(TaskStatusEnum.INVALID.getStatus())
|
||||
.ignore(true);
|
||||
taskService.termination(flowTask.getId(), flowParams);
|
||||
}
|
||||
return true;
|
||||
|
@@ -117,10 +117,10 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
||||
dto.setTaskId(taskList.get(0).getId());
|
||||
return dto;
|
||||
}
|
||||
FlowParams flowParams = new FlowParams();
|
||||
flowParams.flowCode(startProcessBo.getFlowCode());
|
||||
flowParams.variable(startProcessBo.getVariables());
|
||||
flowParams.flowStatus(BusinessStatusEnum.DRAFT.getStatus());
|
||||
FlowParams flowParams = FlowParams.build()
|
||||
.flowCode(startProcessBo.getFlowCode())
|
||||
.variable(startProcessBo.getVariables())
|
||||
.flowStatus(BusinessStatusEnum.DRAFT.getStatus());
|
||||
Instance instance;
|
||||
try {
|
||||
instance = insService.start(businessId, flowParams);
|
||||
@@ -162,8 +162,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
||||
Definition definition = defService.getById(flowTask.getDefinitionId());
|
||||
// 检查流程状态是否为草稿、已撤销或已退回状态,若是则执行流程提交监听
|
||||
if (BusinessStatusEnum.isDraftOrCancelOrBack(ins.getFlowStatus())) {
|
||||
flowProcessEventHandler.processHandler(definition.getFlowCode(), ins.getBusinessId(), ins.getNodeType(),
|
||||
ins.getNodeCode(), ins.getNodeName(), ins.getFlowStatus(), null, true);
|
||||
flowProcessEventHandler.processHandler(definition.getFlowCode(), ins, ins.getFlowStatus(), null, true);
|
||||
}
|
||||
// 设置弹窗处理人
|
||||
Map<String, Object> assigneeMap = setPopAssigneeMap(completeTaskBo.getAssigneeMap(), ins.getVariableMap());
|
||||
@@ -171,13 +170,13 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
||||
completeTaskBo.getVariables().putAll(assigneeMap);
|
||||
}
|
||||
// 构建流程参数,包括变量、跳转类型、消息、处理人、权限等信息
|
||||
FlowParams flowParams = new FlowParams();
|
||||
flowParams.variable(completeTaskBo.getVariables());
|
||||
flowParams.skipType(SkipType.PASS.getKey());
|
||||
flowParams.message(completeTaskBo.getMessage());
|
||||
flowParams.flowStatus(BusinessStatusEnum.WAITING.getStatus()).hisStatus(TaskStatusEnum.PASS.getStatus());
|
||||
|
||||
flowParams.hisTaskExt(completeTaskBo.getFileId());
|
||||
FlowParams flowParams = FlowParams.build()
|
||||
.variable(completeTaskBo.getVariables())
|
||||
.skipType(SkipType.PASS.getKey())
|
||||
.message(completeTaskBo.getMessage())
|
||||
.flowStatus(BusinessStatusEnum.WAITING.getStatus())
|
||||
.hisStatus(TaskStatusEnum.PASS.getStatus())
|
||||
.hisTaskExt(completeTaskBo.getFileId());
|
||||
// 执行任务跳转,并根据返回的处理人设置下一步处理人
|
||||
Instance instance = taskService.skip(taskId, flowParams);
|
||||
this.setHandler(instance, flowTask, flowCopyList);
|
||||
@@ -311,10 +310,10 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
||||
task.setId(taskId);
|
||||
task.setNodeName("【抄送】" + task.getNodeName());
|
||||
Date updateTime = new Date(flowHisTask.getUpdateTime().getTime() - 1000);
|
||||
FlowParams flowParams = FlowParams.build();
|
||||
flowParams.skipType(SkipType.NONE.getKey());
|
||||
flowParams.hisStatus(TaskStatusEnum.COPY.getStatus());
|
||||
flowParams.message("【抄送给】" + StreamUtils.join(flowCopyList, FlowCopyBo::getUserName));
|
||||
FlowParams flowParams = FlowParams.build()
|
||||
.skipType(SkipType.NONE.getKey())
|
||||
.hisStatus(TaskStatusEnum.COPY.getStatus())
|
||||
.message("【抄送给】" + StreamUtils.join(flowCopyList, FlowCopyBo::getUserName));
|
||||
HisTask hisTask = hisTaskService.setSkipHisTask(task, flowNode, flowParams);
|
||||
hisTask.setCreateTime(updateTime);
|
||||
hisTask.setUpdateTime(updateTime);
|
||||
@@ -457,13 +456,13 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
||||
Long definitionId = task.getDefinitionId();
|
||||
Definition definition = defService.getById(definitionId);
|
||||
String applyNodeCode = flwCommonService.applyNodeCode(definitionId);
|
||||
FlowParams flowParams = FlowParams.build();
|
||||
flowParams.nodeCode(bo.getNodeCode());
|
||||
flowParams.message(message);
|
||||
flowParams.skipType(SkipType.REJECT.getKey());
|
||||
flowParams.flowStatus(applyNodeCode.equals(bo.getNodeCode()) ? TaskStatusEnum.BACK.getStatus() : TaskStatusEnum.WAITING.getStatus())
|
||||
.hisStatus(TaskStatusEnum.BACK.getStatus());
|
||||
flowParams.hisTaskExt(bo.getFileId());
|
||||
FlowParams flowParams = FlowParams.build()
|
||||
.nodeCode(bo.getNodeCode())
|
||||
.message(message)
|
||||
.skipType(SkipType.REJECT.getKey())
|
||||
.flowStatus(applyNodeCode.equals(bo.getNodeCode()) ? TaskStatusEnum.BACK.getStatus() : TaskStatusEnum.WAITING.getStatus())
|
||||
.hisStatus(TaskStatusEnum.BACK.getStatus())
|
||||
.hisTaskExt(bo.getFileId());
|
||||
taskService.skip(task.getId(), flowParams);
|
||||
|
||||
Instance instance = insService.getById(inst.getId());
|
||||
@@ -520,9 +519,9 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
||||
if (ObjectUtil.isNotNull(instance)) {
|
||||
BusinessStatusEnum.checkInvalidStatus(instance.getFlowStatus());
|
||||
}
|
||||
FlowParams flowParams = new FlowParams();
|
||||
flowParams.message(bo.getComment());
|
||||
flowParams.flowStatus(BusinessStatusEnum.TERMINATION.getStatus())
|
||||
FlowParams flowParams = FlowParams.build()
|
||||
.message(bo.getComment())
|
||||
.flowStatus(BusinessStatusEnum.TERMINATION.getStatus())
|
||||
.hisStatus(TaskStatusEnum.TERMINATION.getStatus());
|
||||
taskService.termination(taskId, flowParams);
|
||||
return true;
|
||||
@@ -663,8 +662,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public boolean taskOperation(TaskOperationBo bo, String taskOperation) {
|
||||
FlowParams flowParams = new FlowParams();
|
||||
flowParams.message(bo.getMessage());
|
||||
FlowParams flowParams = FlowParams.build()
|
||||
.message(bo.getMessage());
|
||||
if (LoginHelper.isSuperAdmin() || LoginHelper.isTenantAdmin()) {
|
||||
flowParams.ignore(true);
|
||||
}
|
||||
|
Reference in New Issue
Block a user