commit
09766f2245
@ -16,18 +16,22 @@ import java.util.Arrays;
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum BusinessStatusEnum {
|
||||
|
||||
/**
|
||||
* 已撤销
|
||||
*/
|
||||
CANCEL("cancel", "已撤销"),
|
||||
|
||||
/**
|
||||
* 草稿
|
||||
*/
|
||||
DRAFT("draft", "草稿"),
|
||||
|
||||
/**
|
||||
* 待审核
|
||||
*/
|
||||
WAITING("waiting", "待审核"),
|
||||
|
||||
/**
|
||||
* 已完成
|
||||
*/
|
||||
@ -36,10 +40,12 @@ public enum BusinessStatusEnum {
|
||||
* 已作废
|
||||
*/
|
||||
INVALID("invalid", "已作废"),
|
||||
|
||||
/**
|
||||
* 已退回
|
||||
*/
|
||||
BACK("back", "已退回"),
|
||||
|
||||
/**
|
||||
* 已终止
|
||||
*/
|
||||
@ -71,6 +77,16 @@ public enum BusinessStatusEnum {
|
||||
.orElse(StrUtil.EMPTY);
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断是否为指定的状态之一:草稿、已撤销或已退回
|
||||
*
|
||||
* @param status 要检查的状态
|
||||
* @return 如果状态为草稿、已撤销或已退回之一,则返回 true;否则返回 false
|
||||
*/
|
||||
public static boolean isDraftOrCancelOrBack(String status) {
|
||||
return DRAFT.status.equals(status) || CANCEL.status.equals(status) || BACK.status.equals(status);
|
||||
}
|
||||
|
||||
/**
|
||||
* 启动流程校验
|
||||
*
|
||||
|
@ -88,6 +88,13 @@ public class LoginHelper {
|
||||
return Convert.toLong(getExtra(USER_KEY));
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取用户id
|
||||
*/
|
||||
public static String getUserIdStr() {
|
||||
return Convert.toStr(getExtra(USER_KEY));
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取用户账户
|
||||
*/
|
||||
|
@ -3,9 +3,10 @@ package org.dromara.workflow.common.enums;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 任务状态枚举
|
||||
@ -15,10 +16,12 @@ import java.util.Arrays;
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum FormTypeEnum {
|
||||
|
||||
/**
|
||||
* 自定义表单
|
||||
*/
|
||||
STATIC("static", "自定义表单"),
|
||||
|
||||
/**
|
||||
* 动态表单
|
||||
*/
|
||||
@ -34,21 +37,18 @@ public enum FormTypeEnum {
|
||||
*/
|
||||
private final String desc;
|
||||
|
||||
private static final Map<String, String> TYPE_DESC_MAP = Arrays.stream(values())
|
||||
.collect(Collectors.toConcurrentMap(FormTypeEnum::getType, FormTypeEnum::getDesc));
|
||||
|
||||
/**
|
||||
* 表单类型
|
||||
*
|
||||
* @param formType 表单类型
|
||||
*/
|
||||
public static String findByType(String formType) {
|
||||
if (StringUtils.isBlank(formType)) {
|
||||
return StrUtil.EMPTY;
|
||||
}
|
||||
|
||||
return Arrays.stream(FormTypeEnum.values())
|
||||
.filter(statusEnum -> statusEnum.getType().equals(formType))
|
||||
.findFirst()
|
||||
.map(FormTypeEnum::getDesc)
|
||||
.orElse(StrUtil.EMPTY);
|
||||
// 从缓存中直接获取描述
|
||||
return TYPE_DESC_MAP.getOrDefault(formType, StrUtil.EMPTY);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -3,8 +3,10 @@ package org.dromara.workflow.common.enums;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 消息类型枚举
|
||||
@ -14,14 +16,17 @@ import java.util.concurrent.ConcurrentHashMap;
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum MessageTypeEnum {
|
||||
|
||||
/**
|
||||
* 站内信
|
||||
*/
|
||||
SYSTEM_MESSAGE("1", "站内信"),
|
||||
|
||||
/**
|
||||
* 邮箱
|
||||
*/
|
||||
EMAIL_MESSAGE("2", "邮箱"),
|
||||
|
||||
/**
|
||||
* 短信
|
||||
*/
|
||||
@ -31,21 +36,18 @@ public enum MessageTypeEnum {
|
||||
|
||||
private final String desc;
|
||||
|
||||
private final static Map<String, MessageTypeEnum> MESSAGE_TYPE_ENUM_MAP = new ConcurrentHashMap<>(MessageTypeEnum.values().length);
|
||||
|
||||
static {
|
||||
for (MessageTypeEnum messageType : MessageTypeEnum.values()) {
|
||||
MESSAGE_TYPE_ENUM_MAP.put(messageType.code, messageType);
|
||||
}
|
||||
}
|
||||
private static final Map<String, MessageTypeEnum> MESSAGE_TYPE_ENUM_MAP = Arrays.stream(values())
|
||||
.collect(Collectors.toConcurrentMap(MessageTypeEnum::getCode, Function.identity()));
|
||||
|
||||
/**
|
||||
* 根据消息类型 code 获取 MessageTypeEnum
|
||||
*
|
||||
* @param code 消息类型code
|
||||
* @return MessageTypeEnum
|
||||
*/
|
||||
public static MessageTypeEnum getByCode(String code) {
|
||||
return MESSAGE_TYPE_ENUM_MAP.get(code);
|
||||
return MESSAGE_TYPE_ENUM_MAP.getOrDefault(code, null);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -3,9 +3,10 @@ package org.dromara.workflow.common.enums;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 任务状态枚举
|
||||
@ -15,50 +16,62 @@ import java.util.Arrays;
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum TaskStatusEnum {
|
||||
|
||||
/**
|
||||
* 撤销
|
||||
*/
|
||||
CANCEL("cancel", "撤销"),
|
||||
|
||||
/**
|
||||
* 通过
|
||||
*/
|
||||
PASS("pass", "通过"),
|
||||
|
||||
/**
|
||||
* 待审核
|
||||
*/
|
||||
WAITING("waiting", "待审核"),
|
||||
|
||||
/**
|
||||
* 作废
|
||||
*/
|
||||
INVALID("invalid", "作废"),
|
||||
|
||||
/**
|
||||
* 退回
|
||||
*/
|
||||
BACK("back", "退回"),
|
||||
|
||||
/**
|
||||
* 终止
|
||||
*/
|
||||
TERMINATION("termination", "终止"),
|
||||
|
||||
/**
|
||||
* 转办
|
||||
*/
|
||||
TRANSFER("transfer", "转办"),
|
||||
|
||||
/**
|
||||
* 委托
|
||||
*/
|
||||
PENDING("pending", "委托"),
|
||||
|
||||
/**
|
||||
* 抄送
|
||||
*/
|
||||
COPY("copy", "抄送"),
|
||||
|
||||
/**
|
||||
* 加签
|
||||
*/
|
||||
SIGN("sign", "加签"),
|
||||
|
||||
/**
|
||||
* 减签
|
||||
*/
|
||||
SIGN_OFF("sign_off", "减签"),
|
||||
|
||||
/**
|
||||
* 超时
|
||||
*/
|
||||
@ -74,21 +87,18 @@ public enum TaskStatusEnum {
|
||||
*/
|
||||
private final String desc;
|
||||
|
||||
private static final Map<String, String> STATUS_DESC_MAP = Arrays.stream(values())
|
||||
.collect(Collectors.toConcurrentMap(TaskStatusEnum::getStatus, TaskStatusEnum::getDesc));
|
||||
|
||||
/**
|
||||
* 任务业务状态
|
||||
*
|
||||
* @param status 状态
|
||||
*/
|
||||
public static String findByStatus(String status) {
|
||||
if (StringUtils.isBlank(status)) {
|
||||
return StrUtil.EMPTY;
|
||||
}
|
||||
|
||||
return Arrays.stream(TaskStatusEnum.values())
|
||||
.filter(statusEnum -> statusEnum.getStatus().equals(status))
|
||||
.findFirst()
|
||||
.map(TaskStatusEnum::getDesc)
|
||||
.orElse(StrUtil.EMPTY);
|
||||
// 从缓存中直接获取描述
|
||||
return STATUS_DESC_MAP.getOrDefault(status, StrUtil.EMPTY);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -173,7 +173,7 @@ public class FlwTaskController extends BaseController {
|
||||
public R<Void> delegateTask(@Validated({AddGroup.class}) @RequestBody DelegateBo bo) {
|
||||
return toAjax(taskService.depute(
|
||||
bo.getTaskId(),
|
||||
String.valueOf(LoginHelper.getUserId()),
|
||||
LoginHelper.getUserIdStr(),
|
||||
WorkflowUtils.permissionList(),
|
||||
Collections.singletonList(bo.getUserId()),
|
||||
bo.getMessage()));
|
||||
@ -190,7 +190,7 @@ public class FlwTaskController extends BaseController {
|
||||
public R<Void> transferTask(@Validated({AddGroup.class}) @RequestBody TransferBo bo) {
|
||||
return toAjax(taskService.transfer(
|
||||
bo.getTaskId(),
|
||||
String.valueOf(LoginHelper.getUserId()),
|
||||
LoginHelper.getUserIdStr(),
|
||||
WorkflowUtils.permissionList(),
|
||||
Collections.singletonList(bo.getUserId()),
|
||||
bo.getMessage()));
|
||||
@ -207,7 +207,7 @@ public class FlwTaskController extends BaseController {
|
||||
public R<Void> addSignature(@Validated({AddGroup.class}) @RequestBody AddSignatureBo bo) {
|
||||
return toAjax(taskService.addSignature(
|
||||
bo.getTaskId(),
|
||||
String.valueOf(LoginHelper.getUserId()),
|
||||
LoginHelper.getUserIdStr(),
|
||||
WorkflowUtils.permissionList(),
|
||||
bo.getUserIds(),
|
||||
bo.getMessage()));
|
||||
@ -224,7 +224,7 @@ public class FlwTaskController extends BaseController {
|
||||
public R<Void> reductionSignature(@Validated({AddGroup.class}) @RequestBody ReductionSignatureBo bo) {
|
||||
return toAjax(taskService.reductionSignature(
|
||||
bo.getTaskId(),
|
||||
String.valueOf(LoginHelper.getUserId()),
|
||||
LoginHelper.getUserIdStr(),
|
||||
WorkflowUtils.permissionList(),
|
||||
bo.getUserIds(),
|
||||
bo.getMessage()));
|
||||
@ -246,7 +246,7 @@ public class FlwTaskController extends BaseController {
|
||||
.setPermissionFlag(WorkflowUtils.permissionList())
|
||||
.setCooperateType(CooperateType.APPROVAL.getKey())
|
||||
.setMessage("修改任务办理人")
|
||||
.setCurUser(String.valueOf(LoginHelper.getUserId()))
|
||||
.setCurUser(LoginHelper.getUserIdStr())
|
||||
.setIgnore(false);
|
||||
return toAjax(taskService.updateHandler(modifyHandler));
|
||||
}
|
||||
|
@ -1,6 +1,5 @@
|
||||
package org.dromara.workflow.domain.bo;
|
||||
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Data;
|
||||
import org.dromara.common.core.validate.AddGroup;
|
||||
|
@ -6,7 +6,6 @@ import org.dromara.common.core.validate.AddGroup;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 委派任务请求对象
|
||||
|
@ -37,5 +37,8 @@ public class FlowInstanceBo implements Serializable {
|
||||
*/
|
||||
private Long instanceId;
|
||||
|
||||
/**
|
||||
* 权限列表
|
||||
*/
|
||||
private List<String> permissionList;
|
||||
}
|
||||
|
@ -38,5 +38,8 @@ public class FlowTaskBo implements Serializable {
|
||||
*/
|
||||
private Long instanceId;
|
||||
|
||||
/**
|
||||
* 权限列表
|
||||
*/
|
||||
private List<String> permissionList;
|
||||
}
|
||||
|
@ -13,6 +13,7 @@ import org.apache.ibatis.annotations.Param;
|
||||
* @date 2024-03-02
|
||||
*/
|
||||
public interface FlwDefMapper {
|
||||
|
||||
/**
|
||||
* 流程实例信息
|
||||
*
|
||||
@ -20,7 +21,6 @@ public interface FlwDefMapper {
|
||||
* @param queryWrapper 条件
|
||||
* @return 结果
|
||||
*/
|
||||
Page<FlowDefinition> page(@Param("page") Page<FlowDefinition> page, @Param(Constants.WRAPPER) Wrapper<FlowDefinition> queryWrapper);
|
||||
|
||||
Page<FlowDefinition> page(@Param("page") Page<FlowDefinition> page,
|
||||
@Param(Constants.WRAPPER) Wrapper<FlowDefinition> queryWrapper);
|
||||
}
|
||||
|
@ -14,6 +14,7 @@ import org.dromara.workflow.domain.vo.FlowInstanceVo;
|
||||
* @date 2024-03-02
|
||||
*/
|
||||
public interface FlwInstanceMapper {
|
||||
|
||||
/**
|
||||
* 流程实例信息
|
||||
*
|
||||
@ -21,7 +22,6 @@ public interface FlwInstanceMapper {
|
||||
* @param queryWrapper 条件
|
||||
* @return 结果
|
||||
*/
|
||||
Page<FlowInstanceVo> page(@Param("page") Page<FlowInstanceVo> page, @Param(Constants.WRAPPER) Wrapper<FlowInstanceBo> queryWrapper);
|
||||
|
||||
Page<FlowInstanceVo> page(@Param("page") Page<FlowInstanceVo> page,
|
||||
@Param(Constants.WRAPPER) Wrapper<FlowInstanceBo> queryWrapper);
|
||||
}
|
||||
|
@ -17,6 +17,7 @@ import org.dromara.workflow.domain.vo.FlowTaskVo;
|
||||
* @date 2024-03-02
|
||||
*/
|
||||
public interface FlwTaskMapper {
|
||||
|
||||
/**
|
||||
* 获取待办信息
|
||||
*
|
||||
@ -24,8 +25,7 @@ public interface FlwTaskMapper {
|
||||
* @param queryWrapper 条件
|
||||
* @return 结果
|
||||
*/
|
||||
Page<FlowTaskVo> getTaskWaitByPage(@Param("page") Page<FlowTaskVo> page,
|
||||
@Param(Constants.WRAPPER) Wrapper<FlowTaskBo> queryWrapper);
|
||||
Page<FlowTaskVo> getTaskWaitByPage(@Param("page") Page<FlowTaskVo> page, @Param(Constants.WRAPPER) Wrapper<FlowTaskBo> queryWrapper);
|
||||
|
||||
/**
|
||||
* 获取已办
|
||||
@ -34,8 +34,7 @@ public interface FlwTaskMapper {
|
||||
* @param queryWrapper 条件
|
||||
* @return 结果
|
||||
*/
|
||||
Page<FlowHisTaskVo> getTaskFinishByPage(@Param("page") Page<FlowTaskVo> page,
|
||||
@Param(Constants.WRAPPER) Wrapper<FlowTaskBo> queryWrapper);
|
||||
Page<FlowHisTaskVo> getTaskFinishByPage(@Param("page") Page<FlowTaskVo> page, @Param(Constants.WRAPPER) Wrapper<FlowTaskBo> queryWrapper);
|
||||
|
||||
/**
|
||||
* 查询当前用户的抄送
|
||||
@ -44,6 +43,5 @@ public interface FlwTaskMapper {
|
||||
* @param queryWrapper 条件
|
||||
* @return 结果
|
||||
*/
|
||||
Page<FlowTaskVo> getTaskCopyByPage(@Param("page") Page<FlowTaskVo> page,
|
||||
@Param(Constants.WRAPPER) QueryWrapper<FlowTaskBo> queryWrapper);
|
||||
Page<FlowTaskVo> getTaskCopyByPage(@Param("page") Page<FlowTaskVo> page, @Param(Constants.WRAPPER) QueryWrapper<FlowTaskBo> queryWrapper);
|
||||
}
|
||||
|
@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.warm.flow.core.entity.Definition;
|
||||
import com.warm.flow.core.enums.PublishStatus;
|
||||
import com.warm.flow.core.service.DefService;
|
||||
import com.warm.flow.orm.entity.FlowDefinition;
|
||||
import com.warm.flow.orm.mapper.FlowDefinitionMapper;
|
||||
@ -26,7 +25,6 @@ import org.springframework.stereotype.Service;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
|
@ -31,7 +31,9 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
import org.dromara.common.satoken.utils.LoginHelper;
|
||||
import org.dromara.workflow.common.enums.TaskStatusEnum;
|
||||
import org.dromara.workflow.domain.bo.*;
|
||||
import org.dromara.workflow.domain.vo.*;
|
||||
import org.dromara.workflow.domain.vo.FlowHisTaskVo;
|
||||
import org.dromara.workflow.domain.vo.FlowTaskVo;
|
||||
import org.dromara.workflow.domain.vo.WfDefinitionConfigVo;
|
||||
import org.dromara.workflow.handler.FlowProcessEventHandler;
|
||||
import org.dromara.workflow.mapper.FlwTaskMapper;
|
||||
import org.dromara.workflow.service.IFlwInstanceService;
|
||||
@ -44,7 +46,8 @@ import org.springframework.transaction.annotation.Transactional;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static org.dromara.workflow.common.constant.FlowConstant.*;
|
||||
import static org.dromara.workflow.common.constant.FlowConstant.BUSINESS_KEY;
|
||||
import static org.dromara.workflow.common.constant.FlowConstant.INITIATOR;
|
||||
|
||||
/**
|
||||
* 任务 服务层实现
|
||||
@ -76,36 +79,35 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Map<String, Object> startWorkFlow(StartProcessBo startProcessBo) {
|
||||
Map<String, Object> map = new HashMap<>(16);
|
||||
if (StringUtils.isBlank(startProcessBo.getBusinessKey())) {
|
||||
String businessKey = startProcessBo.getBusinessKey();
|
||||
String userId = LoginHelper.getUserIdStr();
|
||||
if (StringUtils.isBlank(businessKey)) {
|
||||
throw new ServiceException("启动工作流时必须包含业务ID");
|
||||
}
|
||||
// 启动流程实例(提交申请)
|
||||
Map<String, Object> variables = startProcessBo.getVariables();
|
||||
// 流程发起人
|
||||
variables.put(INITIATOR, (String.valueOf(LoginHelper.getUserId())));
|
||||
variables.put(INITIATOR, userId);
|
||||
// 业务id
|
||||
variables.put(BUSINESS_KEY, startProcessBo.getBusinessKey());
|
||||
variables.put(BUSINESS_KEY, businessKey);
|
||||
WfDefinitionConfigVo wfDefinitionConfigVo = wfDefinitionConfigService.getByTableNameLastVersion(startProcessBo.getTableName());
|
||||
if (wfDefinitionConfigVo == null) {
|
||||
throw new ServiceException("请到流程定义绑定业务表名与流程KEY!");
|
||||
}
|
||||
|
||||
FlowInstance flowInstance = iFlwInstanceService.instanceByBusinessId(startProcessBo.getBusinessKey());
|
||||
FlowInstance flowInstance = iFlwInstanceService.instanceByBusinessId(businessKey);
|
||||
if (flowInstance != null) {
|
||||
List<Task> taskList = taskService.list(new FlowTask().setInstanceId(flowInstance.getId()));
|
||||
map.put("processInstanceId", taskList.get(0).getInstanceId());
|
||||
map.put("taskId", taskList.get(0).getId());
|
||||
return map;
|
||||
return buildMap(taskList.get(0).getInstanceId(), taskList.get(0).getId());
|
||||
}
|
||||
FlowParams flowParams = new FlowParams();
|
||||
flowParams.flowCode(wfDefinitionConfigVo.getProcessKey());
|
||||
flowParams.variable(startProcessBo.getVariables());
|
||||
flowParams.setHandler(String.valueOf(LoginHelper.getUserId()));
|
||||
flowParams.setHandler(userId);
|
||||
flowParams.flowStatus(BusinessStatusEnum.DRAFT.getStatus());
|
||||
Instance instance;
|
||||
try {
|
||||
instance = insService.start(startProcessBo.getBusinessKey(), flowParams);
|
||||
instance = insService.start(businessKey, flowParams);
|
||||
} catch (Exception e) {
|
||||
throw new ServiceException(e.getMessage());
|
||||
}
|
||||
@ -114,9 +116,18 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
||||
if (taskList.size() > 1) {
|
||||
throw new ServiceException("请检查流程第一个环节是否为申请人!");
|
||||
}
|
||||
map.put("processInstanceId", instance.getId());
|
||||
map.put("taskId", taskList.get(0).getId());
|
||||
return map;
|
||||
return buildMap(instance.getId(), taskList.get(0).getId());
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建一个包含给定 `processInstanceId` 和 `taskId` 的 Map
|
||||
*
|
||||
* @param instanceId 流程实例的 ID
|
||||
* @param taskId 任务的 ID
|
||||
* @return 返回一个包含 `processInstanceId` 和 `taskId` 的不可变 Map
|
||||
*/
|
||||
private Map<String, Object> buildMap(Object instanceId, Object taskId) {
|
||||
return Map.of("processInstanceId", instanceId, "taskId", taskId);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -128,35 +139,46 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public boolean completeTask(CompleteTaskBo completeTaskBo) {
|
||||
try {
|
||||
String userId = String.valueOf(LoginHelper.getUserId());
|
||||
// 获取当前用户ID作为任务处理人
|
||||
String userId = LoginHelper.getUserIdStr();
|
||||
|
||||
// 获取任务ID并查询对应的流程任务和实例信息
|
||||
Long taskId = completeTaskBo.getTaskId();
|
||||
FlowTask flowTask = flowTaskMapper.selectById(taskId);
|
||||
Instance ins = insService.getById(flowTask.getInstanceId());
|
||||
//流程定义
|
||||
|
||||
// 获取流程定义信息
|
||||
Definition definition = defService.getById(flowTask.getDefinitionId());
|
||||
//流程提交监听
|
||||
if (BusinessStatusEnum.DRAFT.getStatus().equals(ins.getFlowStatus()) || BusinessStatusEnum.CANCEL.getStatus().equals(ins.getFlowStatus())
|
||||
|| BusinessStatusEnum.BACK.getStatus().equals(ins.getFlowStatus())) {
|
||||
|
||||
// 检查流程状态是否为草稿、已撤销或已退回状态,若是则执行流程提交监听
|
||||
if (BusinessStatusEnum.isDraftOrCancelOrBack(ins.getFlowStatus())) {
|
||||
flowProcessEventHandler.processHandler(definition.getFlowCode(), ins.getBusinessId(), ins.getFlowStatus(), true);
|
||||
}
|
||||
//办理任务监听
|
||||
flowProcessEventHandler.processTaskHandler(definition.getFlowCode(), flowTask.getNodeCode(),
|
||||
taskId.toString(), ins.getBusinessId());
|
||||
|
||||
// 办理任务监听,记录任务执行信息
|
||||
flowProcessEventHandler.processTaskHandler(definition.getFlowCode(), flowTask.getNodeCode(), taskId.toString(), ins.getBusinessId());
|
||||
|
||||
// 构建流程参数,包括变量、跳转类型、消息、处理人、权限等信息
|
||||
FlowParams flowParams = new FlowParams();
|
||||
flowParams.variable(completeTaskBo.getVariables());
|
||||
flowParams.skipType(SkipType.PASS.getKey());
|
||||
flowParams.message(completeTaskBo.getMessage());
|
||||
flowParams.handler(userId);
|
||||
flowParams.permissionFlag(WorkflowUtils.permissionList());
|
||||
flowParams.flowStatus(BusinessStatusEnum.WAITING.getStatus())
|
||||
.hisStatus(TaskStatusEnum.PASS.getStatus());
|
||||
flowParams.flowStatus(BusinessStatusEnum.WAITING.getStatus()).hisStatus(TaskStatusEnum.PASS.getStatus());
|
||||
|
||||
// 执行任务跳转,并根据返回的处理人设置下一步处理人
|
||||
setHandler(taskService.skip(taskId, flowParams));
|
||||
|
||||
// 更新实例状态为待审核状态
|
||||
iFlwInstanceService.updateStatus(ins.getId(), BusinessStatusEnum.WAITING.getStatus());
|
||||
//判断是否流程结束
|
||||
Instance instance = insService.getById(ins.getId());
|
||||
// 重新获取实例信息,检查流程是否已结束
|
||||
if (FlowStatus.isFinished(instance.getFlowStatus())) {
|
||||
// 若流程已结束,更新状态为已完成
|
||||
iFlwInstanceService.updateStatus(instance.getId(), BusinessStatusEnum.FINISH.getStatus());
|
||||
//流程结束执行监听
|
||||
// 流程结束监听,处理结束后的业务逻辑
|
||||
flowProcessEventHandler.processHandler(definition.getFlowCode(), instance.getBusinessId(),
|
||||
BusinessStatusEnum.FINISH.getStatus(), false);
|
||||
}
|
||||
@ -174,19 +196,22 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
||||
*/
|
||||
private void setHandler(Instance instance) {
|
||||
if (instance != null) {
|
||||
// 根据流程实例ID查询所有关联的任务
|
||||
List<FlowTask> flowTasks = flowTaskMapper.selectList(new LambdaQueryWrapper<>(FlowTask.class)
|
||||
.eq(FlowTask::getInstanceId, instance.getId()));
|
||||
|
||||
// 遍历任务列表,处理每个任务的办理人
|
||||
for (FlowTask flowTask : flowTasks) {
|
||||
// 获取与当前任务关联的用户列表
|
||||
List<User> userList = userService.getByAssociateds(Collections.singletonList(flowTask.getId()));
|
||||
if (CollUtil.isNotEmpty(userList)) {
|
||||
Set<User> users = WorkflowUtils.getUser(userList);
|
||||
if (CollUtil.isNotEmpty(users)) {
|
||||
userService.deleteByTaskIds(Collections.singletonList(flowTask.getId()));
|
||||
for (User user : users) {
|
||||
user.setAssociated(flowTask.getId());
|
||||
}
|
||||
userService.saveBatch(new ArrayList<>(users));
|
||||
}
|
||||
// 通过工具方法过滤和获取有效用户
|
||||
Set<User> users = WorkflowUtils.getUser(userList);
|
||||
if (CollUtil.isNotEmpty(users)) {
|
||||
// 删除现有的任务办理人记录,确保后续数据清理和更新
|
||||
userService.deleteByTaskIds(Collections.singletonList(flowTask.getId()));
|
||||
// 将新的办理人关联到任务ID,并批量保存新的办理人列表
|
||||
users.forEach(user -> user.setAssociated(flowTask.getId()));
|
||||
userService.saveBatch(new ArrayList<>(users));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -235,6 +260,14 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
||||
return TableDataInfo.build(page);
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建待处理任务分页对象
|
||||
*
|
||||
* @param pageQuery 分页查询对象
|
||||
* @param queryWrapper 查询条件封装对象
|
||||
* @param flowTaskBo 流程任务业务对象
|
||||
* @return 分页后的待处理任务列表
|
||||
*/
|
||||
private Page<FlowTaskVo> buildTaskWaitingPage(PageQuery pageQuery, QueryWrapper<FlowTaskBo> queryWrapper, FlowTaskBo flowTaskBo) {
|
||||
commonCondition(queryWrapper, flowTaskBo);
|
||||
Page<FlowTaskVo> page = flwTaskMapper.getTaskWaitByPage(pageQuery.build(), queryWrapper);
|
||||
@ -281,14 +314,21 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
||||
return TableDataInfo.build(page);
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建已完成任务分页对象
|
||||
*
|
||||
* @param pageQuery 分页查询对象
|
||||
* @param queryWrapper 查询条件封装对象
|
||||
* @param flowTaskBo 流程任务业务对象
|
||||
* @return 分页后的已完成任务列表
|
||||
*/
|
||||
private Page<FlowHisTaskVo> buildTaskFinishPage(PageQuery pageQuery, QueryWrapper<FlowTaskBo> queryWrapper, FlowTaskBo flowTaskBo) {
|
||||
commonCondition(queryWrapper, flowTaskBo);
|
||||
Page<FlowHisTaskVo> page = flwTaskMapper.getTaskFinishByPage(pageQuery.build(), queryWrapper);
|
||||
List<FlowHisTaskVo> records = page.getRecords();
|
||||
// 如果有任务记录,为每条记录设置流程状态名称
|
||||
if (CollUtil.isNotEmpty(records)) {
|
||||
for (FlowHisTaskVo data : records) {
|
||||
data.setFlowStatusName(FlowStatus.getValueByKey(data.getFlowStatus()));
|
||||
}
|
||||
records.forEach(data -> data.setFlowStatusName(FlowStatus.getValueByKey(data.getFlowStatus())));
|
||||
}
|
||||
return page;
|
||||
}
|
||||
@ -316,7 +356,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
||||
@Override
|
||||
public boolean backProcess(BackProcessBo bo) {
|
||||
try {
|
||||
String userId = String.valueOf(LoginHelper.getUserId());
|
||||
String userId = LoginHelper.getUserIdStr();
|
||||
Long taskId = bo.getTaskId();
|
||||
List<FlowTask> flowTasks = flowTaskMapper.selectList(new LambdaQueryWrapper<>(FlowTask.class).eq(FlowTask::getId, taskId));
|
||||
if (CollUtil.isEmpty(flowTasks)) {
|
||||
@ -387,7 +427,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
||||
//流程定义
|
||||
Definition definition = defService.getById(flowTask.getDefinitionId());
|
||||
FlowParams flowParams = new FlowParams();
|
||||
flowParams.handler(String.valueOf(LoginHelper.getUserId()));
|
||||
flowParams.handler(LoginHelper.getUserIdStr());
|
||||
flowParams.message(bo.getComment());
|
||||
flowParams.permissionFlag(WorkflowUtils.permissionList());
|
||||
flowParams.flowStatus(BusinessStatusEnum.TERMINATION.getStatus())
|
||||
|
@ -31,10 +31,9 @@ public class WorkflowUtils {
|
||||
*/
|
||||
public static List<String> permissionList() {
|
||||
List<RoleDTO> roles = LoginHelper.getLoginUser().getRoles();
|
||||
Long userId = LoginHelper.getUserId();
|
||||
Long deptId = LoginHelper.getDeptId();
|
||||
List<String> permissionList = StreamUtils.toList(roles, role -> "role:" + role.getRoleId());
|
||||
permissionList.add(String.valueOf(userId));
|
||||
permissionList.add(LoginHelper.getUserIdStr());
|
||||
permissionList.add("dept:" + deptId);
|
||||
return permissionList;
|
||||
}
|
||||
@ -46,36 +45,30 @@ public class WorkflowUtils {
|
||||
* @return 用户
|
||||
*/
|
||||
public static List<UserDTO> getHandlerUser(List<User> userList) {
|
||||
List<UserDTO> userDTOList = new ArrayList<>();
|
||||
if (CollUtil.isNotEmpty(userList)) {
|
||||
UserService userService = SpringUtils.getBean(UserService.class);
|
||||
List<Long> userIds = new ArrayList<>();
|
||||
List<Long> roleIds = new ArrayList<>();
|
||||
List<Long> deptIds = new ArrayList<>();
|
||||
for (User user : userList) {
|
||||
if (user.getProcessedBy().startsWith("user:")) {
|
||||
userIds.add(Long.valueOf(StringUtils.substringAfter(user.getProcessedBy(), StrUtil.C_COLON)));
|
||||
} else if (user.getProcessedBy().startsWith("role:")) {
|
||||
roleIds.add(Long.valueOf(StringUtils.substringAfter(user.getProcessedBy(), StrUtil.C_COLON)));
|
||||
} else if (user.getProcessedBy().startsWith("dept:")) {
|
||||
deptIds.add(Long.valueOf(StringUtils.substringAfter(user.getProcessedBy(), StrUtil.C_COLON)));
|
||||
} else {
|
||||
userIds.add(Long.valueOf(user.getProcessedBy()));
|
||||
}
|
||||
}
|
||||
List<UserDTO> users = userService.selectListByIds(userIds);
|
||||
if (CollUtil.isNotEmpty(users)) {
|
||||
userDTOList.addAll(users);
|
||||
}
|
||||
List<UserDTO> roleUsers = userService.selectUsersByRoleIds(roleIds);
|
||||
if (CollUtil.isNotEmpty(roleUsers)) {
|
||||
userDTOList.addAll(roleUsers);
|
||||
}
|
||||
List<UserDTO> deptUsers = userService.selectUsersByDeptIds(deptIds);
|
||||
if (CollUtil.isNotEmpty(deptUsers)) {
|
||||
userDTOList.addAll(deptUsers);
|
||||
if (CollUtil.isEmpty(userList)) {
|
||||
return List.of();
|
||||
}
|
||||
UserService userService = SpringUtils.getBean(UserService.class);
|
||||
List<Long> userIds = new ArrayList<>();
|
||||
List<Long> roleIds = new ArrayList<>();
|
||||
List<Long> deptIds = new ArrayList<>();
|
||||
for (User user : userList) {
|
||||
String processedBy = user.getProcessedBy();
|
||||
Long id = Long.valueOf(StringUtils.substringAfter(processedBy, StrUtil.C_COLON));
|
||||
if (processedBy.startsWith("user:")) {
|
||||
userIds.add(id);
|
||||
} else if (processedBy.startsWith("role:")) {
|
||||
roleIds.add(id);
|
||||
} else if (processedBy.startsWith("dept:")) {
|
||||
deptIds.add(id);
|
||||
} else {
|
||||
userIds.add(Long.valueOf(processedBy));
|
||||
}
|
||||
}
|
||||
// 合并不同类型用户
|
||||
List<UserDTO> userDTOList = new ArrayList<>(userService.selectListByIds(userIds));
|
||||
userDTOList.addAll(userService.selectUsersByRoleIds(roleIds));
|
||||
userDTOList.addAll(userService.selectUsersByDeptIds(deptIds));
|
||||
return userDTOList;
|
||||
}
|
||||
|
||||
@ -86,42 +79,51 @@ public class WorkflowUtils {
|
||||
* @return 用户
|
||||
*/
|
||||
public static Set<User> getUser(List<User> userList) {
|
||||
if (CollUtil.isEmpty(userList)) {
|
||||
return Set.of();
|
||||
}
|
||||
Set<User> list = new HashSet<>();
|
||||
if (CollUtil.isNotEmpty(userList)) {
|
||||
UserService userService = SpringUtils.getBean(UserService.class);
|
||||
for (User user : userList) {
|
||||
if (user.getProcessedBy().startsWith("user:")) {
|
||||
Long userId = Long.valueOf(StringUtils.substringAfter(user.getProcessedBy(), StrUtil.C_COLON));
|
||||
List<UserDTO> users = userService.selectListByIds(List.of(userId));
|
||||
if (CollUtil.isNotEmpty(users)) {
|
||||
FlowUser u = new FlowUser();
|
||||
u.setType(user.getType());
|
||||
u.setProcessedBy(String.valueOf(StreamUtils.toList(users, UserDTO::getUserId).get(0)));
|
||||
list.add(u);
|
||||
}
|
||||
}
|
||||
if (user.getProcessedBy().startsWith("role:")) {
|
||||
Long roleId = Long.valueOf(StringUtils.substringAfter(user.getProcessedBy(), StrUtil.C_COLON));
|
||||
List<UserDTO> roleUsers = userService.selectUsersByRoleIds(List.of(roleId));
|
||||
for (UserDTO roleUser : roleUsers) {
|
||||
FlowUser u = new FlowUser();
|
||||
u.setType(user.getType());
|
||||
u.setProcessedBy(String.valueOf(roleUser.getUserId()));
|
||||
list.add(u);
|
||||
}
|
||||
}
|
||||
if (user.getProcessedBy().startsWith("dept:")) {
|
||||
Long deptId = Long.valueOf(StringUtils.substringAfter(user.getProcessedBy(), StrUtil.C_COLON));
|
||||
List<UserDTO> deptUsers = userService.selectUsersByDeptIds(List.of(deptId));
|
||||
for (UserDTO deptUser : deptUsers) {
|
||||
FlowUser u = new FlowUser();
|
||||
u.setType(user.getType());
|
||||
u.setProcessedBy(String.valueOf(deptUser.getUserId()));
|
||||
list.add(u);
|
||||
}
|
||||
}
|
||||
UserService userService = SpringUtils.getBean(UserService.class);
|
||||
for (User user : userList) {
|
||||
// 根据 processedBy 前缀判断处理人类型,分别获取用户列表
|
||||
List<UserDTO> users = getAssociatedUsers(userService, user);
|
||||
// 转换为 FlowUser 并添加到结果集合
|
||||
if (CollUtil.isNotEmpty(users)) {
|
||||
users.forEach(dto -> {
|
||||
FlowUser flowUser = new FlowUser();
|
||||
flowUser.setType(user.getType());
|
||||
flowUser.setProcessedBy(String.valueOf(dto.getUserId()));
|
||||
list.add(flowUser);
|
||||
});
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据用户的 `processedBy` 前缀(user、role、dept)获取关联的用户列表
|
||||
*
|
||||
* @param userService 用户服务,用于从数据库中查询用户信息
|
||||
* @param user 办理用户实例,通过 `processedBy` 字段识别处理人类型
|
||||
* @return 返回符合条件的用户DTO列表,如果未找到匹配的前缀则返回空列表
|
||||
*/
|
||||
private static List<UserDTO> getAssociatedUsers(UserService userService, User user) {
|
||||
String processedBy = user.getProcessedBy();
|
||||
// 提取 processedBy 字段中 ":" 后的部分作为ID
|
||||
Long id = Long.valueOf(StringUtils.substringAfter(processedBy, StrUtil.C_COLON));
|
||||
|
||||
if (processedBy.startsWith("user:")) {
|
||||
// 如果前缀为 "user:",根据用户ID查询
|
||||
return userService.selectListByIds(List.of(id));
|
||||
} else if (processedBy.startsWith("role:")) {
|
||||
// 如果前缀为 "role:",根据角色ID查询用户
|
||||
return userService.selectUsersByRoleIds(List.of(id));
|
||||
} else if (processedBy.startsWith("dept:")) {
|
||||
// 如果前缀为 "dept:",根据部门ID查询用户
|
||||
return userService.selectUsersByDeptIds(List.of(id));
|
||||
}
|
||||
// 未匹配任何前缀,返回空列表
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user