mirror of
https://github.com/dromara/RuoYi-Vue-Plus.git
synced 2025-10-14 22:13:43 +08:00
Compare commits
4 Commits
3749e7e724
...
9df837f047
Author | SHA1 | Date | |
---|---|---|---|
|
9df837f047 | ||
|
d6758dc47b | ||
|
5a8dc8e1cf | ||
|
eac7f1b4e2 |
4
pom.xml
4
pom.xml
@@ -48,8 +48,8 @@
|
||||
<fastjson.version>1.2.83</fastjson.version>
|
||||
<!-- 面向运行时的D-ORM依赖 -->
|
||||
<anyline.version>8.7.2-20250101</anyline.version>
|
||||
<!--工作流配置-->
|
||||
<warm-flow.version>1.6.10</warm-flow.version>
|
||||
<!-- 工作流配置 -->
|
||||
<warm-flow.version>1.7.0</warm-flow.version>
|
||||
|
||||
<!-- 插件版本 -->
|
||||
<maven-jar-plugin.version>3.2.2</maven-jar-plugin.version>
|
||||
|
@@ -3,6 +3,7 @@ package org.dromara.common.core.service;
|
||||
import org.dromara.common.core.domain.dto.UserDTO;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 通用 用户服务
|
||||
@@ -91,4 +92,36 @@ public interface UserService {
|
||||
*/
|
||||
List<UserDTO> selectUsersByPostIds(List<Long> postIds);
|
||||
|
||||
/**
|
||||
* 根据用户 ID 列表查询用户名称映射关系
|
||||
*
|
||||
* @param userIds 用户 ID 列表
|
||||
* @return Map,其中 key 为用户 ID,value 为对应的用户名称
|
||||
*/
|
||||
Map<Long, String> selectUserNamesByIds(List<Long> userIds);
|
||||
|
||||
/**
|
||||
* 根据角色 ID 列表查询角色名称映射关系
|
||||
*
|
||||
* @param roleIds 角色 ID 列表
|
||||
* @return Map,其中 key 为角色 ID,value 为对应的角色名称
|
||||
*/
|
||||
Map<Long, String> selectRoleNamesByIds(List<Long> roleIds);
|
||||
|
||||
/**
|
||||
* 根据部门 ID 列表查询部门名称映射关系
|
||||
*
|
||||
* @param deptIds 部门 ID 列表
|
||||
* @return Map,其中 key 为部门 ID,value 为对应的部门名称
|
||||
*/
|
||||
Map<Long, String> selectDeptNamesByIds(List<Long> deptIds);
|
||||
|
||||
/**
|
||||
* 根据岗位 ID 列表查询岗位名称映射关系
|
||||
*
|
||||
* @param postIds 岗位 ID 列表
|
||||
* @return Map,其中 key 为岗位 ID,value 为对应的岗位名称
|
||||
*/
|
||||
Map<Long, String> selectPostNamesByIds(List<Long> postIds);
|
||||
|
||||
}
|
||||
|
@@ -108,7 +108,7 @@ public class EncryptUtils {
|
||||
}
|
||||
|
||||
/**
|
||||
* sm4加密
|
||||
* SM4加密(Base64编码)
|
||||
*
|
||||
* @param data 待加密数据
|
||||
* @param password 秘钥字符串
|
||||
@@ -127,11 +127,11 @@ public class EncryptUtils {
|
||||
}
|
||||
|
||||
/**
|
||||
* sm4加密
|
||||
* SM4加密(Hex编码)
|
||||
*
|
||||
* @param data 待加密数据
|
||||
* @param password 秘钥字符串
|
||||
* @return 加密后字符串, 采用Base64编码
|
||||
* @return 加密后字符串, 采用Hex编码
|
||||
*/
|
||||
public static String encryptBySm4Hex(String data, String password) {
|
||||
if (StrUtil.isBlank(password)) {
|
||||
@@ -148,7 +148,7 @@ public class EncryptUtils {
|
||||
/**
|
||||
* sm4解密
|
||||
*
|
||||
* @param data 待解密数据
|
||||
* @param data 待解密数据(可以是Base64或Hex编码)
|
||||
* @param password 秘钥字符串
|
||||
* @return 解密后字符串
|
||||
*/
|
||||
|
@@ -35,10 +35,8 @@ import org.springframework.cache.annotation.Cacheable;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 用户 业务层处理
|
||||
@@ -720,4 +718,80 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
|
||||
return selectListByIds(new ArrayList<>(userIds));
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据用户 ID 列表查询用户名称映射关系
|
||||
*
|
||||
* @param userIds 用户 ID 列表
|
||||
* @return Map,其中 key 为用户 ID,value 为对应的用户名称
|
||||
*/
|
||||
@Override
|
||||
public Map<Long, String> selectUserNamesByIds(List<Long> userIds) {
|
||||
if (CollUtil.isEmpty(userIds)) {
|
||||
return Collections.emptyMap();
|
||||
}
|
||||
return baseMapper.selectList(
|
||||
new LambdaQueryWrapper<SysUser>()
|
||||
.select(SysUser::getUserId, SysUser::getNickName)
|
||||
.in(SysUser::getUserId, userIds)
|
||||
).stream()
|
||||
.collect(Collectors.toMap(SysUser::getUserId, SysUser::getNickName));
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据角色 ID 列表查询角色名称映射关系
|
||||
*
|
||||
* @param roleIds 角色 ID 列表
|
||||
* @return Map,其中 key 为角色 ID,value 为对应的角色名称
|
||||
*/
|
||||
@Override
|
||||
public Map<Long, String> selectRoleNamesByIds(List<Long> roleIds) {
|
||||
if (CollUtil.isEmpty(roleIds)) {
|
||||
return Collections.emptyMap();
|
||||
}
|
||||
return roleMapper.selectList(
|
||||
new LambdaQueryWrapper<SysRole>()
|
||||
.select(SysRole::getRoleId, SysRole::getRoleName)
|
||||
.in(SysRole::getRoleId, roleIds)
|
||||
).stream()
|
||||
.collect(Collectors.toMap(SysRole::getRoleId, SysRole::getRoleName));
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据部门 ID 列表查询部门名称映射关系
|
||||
*
|
||||
* @param deptIds 部门 ID 列表
|
||||
* @return Map,其中 key 为部门 ID,value 为对应的部门名称
|
||||
*/
|
||||
@Override
|
||||
public Map<Long, String> selectDeptNamesByIds(List<Long> deptIds) {
|
||||
if (CollUtil.isEmpty(deptIds)) {
|
||||
return Collections.emptyMap();
|
||||
}
|
||||
return deptMapper.selectList(
|
||||
new LambdaQueryWrapper<SysDept>()
|
||||
.select(SysDept::getDeptId, SysDept::getDeptName)
|
||||
.in(SysDept::getDeptId, deptIds)
|
||||
).stream()
|
||||
.collect(Collectors.toMap(SysDept::getDeptId, SysDept::getDeptName));
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据岗位 ID 列表查询岗位名称映射关系
|
||||
*
|
||||
* @param postIds 岗位 ID 列表
|
||||
* @return Map,其中 key 为岗位 ID,value 为对应的岗位名称
|
||||
*/
|
||||
@Override
|
||||
public Map<Long, String> selectPostNamesByIds(List<Long> postIds) {
|
||||
if (CollUtil.isEmpty(postIds)) {
|
||||
return Collections.emptyMap();
|
||||
}
|
||||
return postMapper.selectList(
|
||||
new LambdaQueryWrapper<SysPost>()
|
||||
.select(SysPost::getPostId, SysPost::getPostName)
|
||||
.in(SysPost::getPostId, postIds)
|
||||
).stream()
|
||||
.collect(Collectors.toMap(SysPost::getPostId, SysPost::getPostName));
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -1,9 +1,11 @@
|
||||
package org.dromara.workflow.service;
|
||||
|
||||
import org.dromara.warm.flow.core.entity.Instance;
|
||||
import org.dromara.warm.flow.core.entity.User;
|
||||
import org.dromara.warm.flow.core.service.UserService;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
@@ -48,17 +50,6 @@ public interface IFlwCommonService {
|
||||
*/
|
||||
void sendMessage(String flowName, Long instId, List<String> messageType, String message);
|
||||
|
||||
/**
|
||||
* 驳回
|
||||
*
|
||||
* @param message 审批意见
|
||||
* @param instanceId 流程实例id
|
||||
* @param targetNodeCode 目标节点
|
||||
* @param flowStatus 流程状态
|
||||
* @param flowHisStatus 节点操作状态
|
||||
*/
|
||||
void backTask(String message, Long instanceId, String targetNodeCode, String flowStatus, String flowHisStatus);
|
||||
|
||||
/**
|
||||
* 申请人节点编码
|
||||
*
|
||||
@@ -68,9 +59,10 @@ public interface IFlwCommonService {
|
||||
String applyNodeCode(Long definitionId);
|
||||
|
||||
/**
|
||||
* 删除运行中的任务
|
||||
* 合并变量
|
||||
*
|
||||
* @param taskIds 任务id
|
||||
* @param instance 流程实例
|
||||
* @param variable 变量
|
||||
*/
|
||||
void deleteRunTask(List<Long> taskIds);
|
||||
void mergeVariable(Instance instance, Map<String, Object> variable);
|
||||
}
|
||||
|
@@ -13,10 +13,21 @@ public interface IFlwTaskAssigneeService {
|
||||
|
||||
/**
|
||||
* 根据存储标识符(storageId)解析分配类型和ID,并获取对应的用户列表
|
||||
* 支持单个标识(例如 "user:123" 或 "456"),格式非法将返回空列表
|
||||
*
|
||||
* @param storageId 包含分配类型和ID的字符串(例如 "user:123" 或 "role:456")
|
||||
* @return 与分配类型和ID匹配的用户列表,如果格式无效则返回空列表
|
||||
* @param storageId 包含分配类型和ID的字符串
|
||||
* @return 匹配的用户列表,格式非法返回空列表
|
||||
*/
|
||||
List<UserDTO> fetchUsersByStorageId(String storageId);
|
||||
|
||||
/**
|
||||
* 批量解析多个存储标识符(storageIds),按类型分类并合并查询用户列表
|
||||
* 输入格式支持多个以逗号分隔的标识(如 "user:123,role:456,789")
|
||||
* 会自动去重返回结果,非法格式的标识将被忽略
|
||||
*
|
||||
* @param storageIds 多个存储标识符字符串(逗号分隔)
|
||||
* @return 合并后的用户列表,去重后返回,非法格式的标识将被跳过
|
||||
*/
|
||||
List<UserDTO> fetchUsersByStorageIds(String storageIds);
|
||||
|
||||
}
|
||||
|
@@ -2,7 +2,6 @@ package org.dromara.workflow.service.impl;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.common.core.domain.dto.UserDTO;
|
||||
@@ -12,22 +11,17 @@ import org.dromara.common.core.utils.StringUtils;
|
||||
import org.dromara.common.mail.utils.MailUtils;
|
||||
import org.dromara.common.sse.dto.SseMessageDto;
|
||||
import org.dromara.common.sse.utils.SseMessageUtils;
|
||||
import org.dromara.warm.flow.core.constant.ExceptionCons;
|
||||
import org.dromara.warm.flow.core.dto.FlowParams;
|
||||
import org.dromara.warm.flow.core.FlowEngine;
|
||||
import org.dromara.warm.flow.core.entity.Instance;
|
||||
import org.dromara.warm.flow.core.entity.Node;
|
||||
import org.dromara.warm.flow.core.entity.Task;
|
||||
import org.dromara.warm.flow.core.entity.User;
|
||||
import org.dromara.warm.flow.core.enums.NodeType;
|
||||
import org.dromara.warm.flow.core.enums.SkipType;
|
||||
import org.dromara.warm.flow.core.service.NodeService;
|
||||
import org.dromara.warm.flow.core.service.TaskService;
|
||||
import org.dromara.warm.flow.core.service.UserService;
|
||||
import org.dromara.warm.flow.core.utils.AssertUtil;
|
||||
import org.dromara.warm.flow.orm.entity.FlowNode;
|
||||
import org.dromara.warm.flow.core.utils.MapUtil;
|
||||
import org.dromara.warm.flow.orm.entity.FlowTask;
|
||||
import org.dromara.warm.flow.orm.entity.FlowUser;
|
||||
import org.dromara.warm.flow.orm.mapper.FlowNodeMapper;
|
||||
import org.dromara.warm.flow.orm.mapper.FlowTaskMapper;
|
||||
import org.dromara.workflow.common.ConditionalOnEnable;
|
||||
import org.dromara.workflow.common.enums.MessageTypeEnum;
|
||||
import org.dromara.workflow.common.enums.TaskAssigneeType;
|
||||
@@ -50,11 +44,7 @@ import java.util.stream.Collectors;
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
public class FlwCommonServiceImpl implements IFlwCommonService {
|
||||
|
||||
private final FlowNodeMapper flowNodeMapper;
|
||||
private final FlowTaskMapper flowTaskMapper;
|
||||
private final UserService userService;
|
||||
private final TaskService taskService;
|
||||
private final NodeService nodeService;
|
||||
|
||||
/**
|
||||
@@ -177,42 +167,6 @@ public class FlwCommonServiceImpl implements IFlwCommonService {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 驳回
|
||||
*
|
||||
* @param message 审批意见
|
||||
* @param instanceId 流程实例id
|
||||
* @param targetNodeCode 目标节点
|
||||
* @param flowStatus 流程状态
|
||||
* @param flowHisStatus 节点操作状态
|
||||
*/
|
||||
@Override
|
||||
public void backTask(String message, Long instanceId, String targetNodeCode, String flowStatus, String flowHisStatus) {
|
||||
IFlwTaskService flwTaskService = SpringUtils.getBean(IFlwTaskService.class);
|
||||
List<FlowTask> list = flwTaskService.selectByInstId(instanceId);
|
||||
if (CollUtil.isNotEmpty(list)) {
|
||||
List<FlowTask> tasks = StreamUtils.filter(list, e -> e.getNodeCode().equals(targetNodeCode));
|
||||
if (list.size() == tasks.size()) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
for (FlowTask task : list) {
|
||||
List<UserDTO> userList = flwTaskService.currentTaskAllUser(task.getId());
|
||||
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());
|
||||
}
|
||||
taskService.skip(task.getId(), flowParams);
|
||||
}
|
||||
//解决会签多人审批问题
|
||||
backTask(message, instanceId, targetNodeCode, flowStatus, flowHisStatus);
|
||||
}
|
||||
|
||||
/**
|
||||
* 申请人节点编码
|
||||
@@ -222,26 +176,18 @@ public class FlwCommonServiceImpl implements IFlwCommonService {
|
||||
*/
|
||||
@Override
|
||||
public String applyNodeCode(Long definitionId) {
|
||||
//获取已发布的流程节点
|
||||
List<FlowNode> flowNodes = flowNodeMapper.selectList(new LambdaQueryWrapper<FlowNode>().eq(FlowNode::getDefinitionId, definitionId));
|
||||
AssertUtil.isTrue(CollUtil.isEmpty(flowNodes), ExceptionCons.NOT_PUBLISH_NODE);
|
||||
Node startNode = flowNodes.stream().filter(t -> NodeType.isStart(t.getNodeType())).findFirst().orElse(null);
|
||||
AssertUtil.isNull(startNode, ExceptionCons.LOST_START_NODE);
|
||||
Node startNode = nodeService.getStartNode(definitionId);
|
||||
Node nextNode = nodeService.getNextNode(definitionId, startNode.getNodeCode(), null, SkipType.PASS.getKey());
|
||||
return nextNode.getNodeCode();
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除运行中的任务
|
||||
*
|
||||
* @param taskIds 任务id
|
||||
*/
|
||||
@Override
|
||||
public void deleteRunTask(List<Long> taskIds) {
|
||||
if (CollUtil.isEmpty(taskIds)) {
|
||||
return;
|
||||
public void mergeVariable(Instance instance, Map<String, Object> variable) {
|
||||
if (MapUtil.isNotEmpty(variable)) {
|
||||
String variableStr = instance.getVariable();
|
||||
Map<String, Object> deserialize = FlowEngine.jsonConvert.strToMap(variableStr);
|
||||
deserialize.putAll(variable);
|
||||
instance.setVariable(FlowEngine.jsonConvert.objToStr(deserialize));
|
||||
}
|
||||
userService.deleteByTaskIds(taskIds);
|
||||
flowTaskMapper.deleteByIds(taskIds);
|
||||
}
|
||||
}
|
||||
|
@@ -19,13 +19,13 @@ import org.dromara.common.core.utils.StringUtils;
|
||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
import org.dromara.common.satoken.utils.LoginHelper;
|
||||
import org.dromara.warm.flow.core.FlowEngine;
|
||||
import org.dromara.warm.flow.core.constant.ExceptionCons;
|
||||
import org.dromara.warm.flow.core.dto.FlowParams;
|
||||
import org.dromara.warm.flow.core.entity.Definition;
|
||||
import org.dromara.warm.flow.core.entity.Instance;
|
||||
import org.dromara.warm.flow.core.entity.Task;
|
||||
import org.dromara.warm.flow.core.enums.NodeType;
|
||||
import org.dromara.warm.flow.core.enums.SkipType;
|
||||
import org.dromara.warm.flow.core.service.ChartService;
|
||||
import org.dromara.warm.flow.core.service.DefService;
|
||||
import org.dromara.warm.flow.core.service.InsService;
|
||||
@@ -185,7 +185,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public boolean deleteByBusinessIds(List<Long> businessIds) {
|
||||
List<FlowInstance> flowInstances = flowInstanceMapper.selectList(new LambdaQueryWrapper<FlowInstance>().in(FlowInstance::getBusinessId, StreamUtils.toList(businessIds,Convert::toStr)));
|
||||
List<FlowInstance> flowInstances = flowInstanceMapper.selectList(new LambdaQueryWrapper<FlowInstance>().in(FlowInstance::getBusinessId, StreamUtils.toList(businessIds, Convert::toStr)));
|
||||
if (CollUtil.isEmpty(flowInstances)) {
|
||||
log.warn("未找到对应的流程实例信息,无法执行删除操作。");
|
||||
return false;
|
||||
@@ -244,19 +244,16 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
|
||||
throw new ServiceException(ExceptionCons.NOT_FOUNT_DEF);
|
||||
}
|
||||
String message = bo.getMessage();
|
||||
String userIdStr = LoginHelper.getUserIdStr();
|
||||
BusinessStatusEnum.checkCancelStatus(instance.getFlowStatus());
|
||||
String applyNodeCode = flwCommonService.applyNodeCode(definition.getId());
|
||||
//撤销
|
||||
flwCommonService.backTask(message, instance.getId(), applyNodeCode, BusinessStatusEnum.CANCEL.getStatus(), BusinessStatusEnum.CANCEL.getStatus());
|
||||
//判断或签节点是否有多个,只保留一个
|
||||
List<Task> currentTaskList = taskService.list(FlowEngine.newTask().setInstanceId(instance.getId()));
|
||||
if (CollUtil.isNotEmpty(currentTaskList)) {
|
||||
if (currentTaskList.size() > 1) {
|
||||
currentTaskList.remove(0);
|
||||
flwCommonService.deleteRunTask(StreamUtils.toList(currentTaskList, Task::getId));
|
||||
}
|
||||
}
|
||||
|
||||
FlowParams flowParams = FlowParams.build()
|
||||
.message(message)
|
||||
.skipType(SkipType.PASS.getKey())
|
||||
.flowStatus(BusinessStatusEnum.CANCEL.getStatus())
|
||||
.hisStatus(BusinessStatusEnum.CANCEL.getStatus())
|
||||
.handler(userIdStr)
|
||||
.ignore(true);
|
||||
taskService.revoke(instance.getId(), flowParams);
|
||||
} catch (Exception e) {
|
||||
log.error("撤销失败: {}", e.getMessage(), e);
|
||||
throw new ServiceException(e.getMessage());
|
||||
@@ -363,7 +360,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
|
||||
public void setVariable(Long instanceId, Map<String, Object> variable) {
|
||||
Instance instance = insService.getById(instanceId);
|
||||
if (instance != null) {
|
||||
taskService.mergeVariable(instance, variable);
|
||||
flwCommonService.mergeVariable(instance, variable);
|
||||
insService.updateById(instance);
|
||||
}
|
||||
}
|
||||
|
@@ -2,6 +2,7 @@ package org.dromara.workflow.service.impl;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.lang.Pair;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@@ -10,7 +11,6 @@ import org.dromara.common.core.domain.dto.TaskAssigneeDTO;
|
||||
import org.dromara.common.core.domain.dto.UserDTO;
|
||||
import org.dromara.common.core.domain.model.TaskAssigneeBody;
|
||||
import org.dromara.common.core.enums.FormatsType;
|
||||
import org.dromara.common.core.exception.ServiceException;
|
||||
import org.dromara.common.core.service.DeptService;
|
||||
import org.dromara.common.core.service.TaskAssigneeService;
|
||||
import org.dromara.common.core.service.UserService;
|
||||
@@ -20,6 +20,7 @@ import org.dromara.warm.flow.ui.dto.HandlerFunDto;
|
||||
import org.dromara.warm.flow.ui.dto.HandlerQuery;
|
||||
import org.dromara.warm.flow.ui.dto.TreeFunDto;
|
||||
import org.dromara.warm.flow.ui.service.HandlerSelectService;
|
||||
import org.dromara.warm.flow.ui.vo.HandlerFeedBackVo;
|
||||
import org.dromara.warm.flow.ui.vo.HandlerSelectVo;
|
||||
import org.dromara.workflow.common.ConditionalOnEnable;
|
||||
import org.dromara.workflow.common.enums.TaskAssigneeEnum;
|
||||
@@ -74,6 +75,49 @@ public class FlwTaskAssigneeServiceImpl implements IFlwTaskAssigneeService, Hand
|
||||
return getHandlerSelectVo(buildHandlerData(dto, type), buildDeptTree(depts));
|
||||
}
|
||||
|
||||
/**
|
||||
* 办理人权限名称回显
|
||||
*
|
||||
* @param storageIds 入库主键集合
|
||||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
public List<HandlerFeedBackVo> handlerFeedback(List<String> storageIds) {
|
||||
if (CollUtil.isEmpty(storageIds)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
// 解析并归类 ID,同时记录原始顺序和对应解析结果
|
||||
Map<TaskAssigneeEnum, List<Long>> typeIdMap = new EnumMap<>(TaskAssigneeEnum.class);
|
||||
Map<String, Pair<TaskAssigneeEnum, Long>> parsedMap = new LinkedHashMap<>();
|
||||
for (String storageId : storageIds) {
|
||||
Pair<TaskAssigneeEnum, Long> parsed = this.parseStorageId(storageId);
|
||||
parsedMap.put(storageId, parsed);
|
||||
if (parsed != null) {
|
||||
typeIdMap.computeIfAbsent(parsed.getKey(), k -> new ArrayList<>()).add(parsed.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
// 查询所有类型对应的 ID 名称映射
|
||||
Map<TaskAssigneeEnum, Map<Long, String>> nameMap = new EnumMap<>(TaskAssigneeEnum.class);
|
||||
typeIdMap.forEach((type, ids) -> nameMap.put(type, this.getNamesByType(type, ids)));
|
||||
|
||||
// 组装返回结果,保持原始顺序
|
||||
return parsedMap.entrySet().stream()
|
||||
.map(entry -> {
|
||||
String storageId = entry.getKey();
|
||||
Pair<TaskAssigneeEnum, Long> parsed = entry.getValue();
|
||||
String handlerName = "格式错误";
|
||||
if (parsed != null) {
|
||||
Map<Long, String> nameMapping = nameMap.getOrDefault(parsed.getKey(), Collections.emptyMap());
|
||||
handlerName = nameMapping.getOrDefault(parsed.getValue(), "未知名称");
|
||||
}
|
||||
HandlerFeedBackVo backVo = new HandlerFeedBackVo();
|
||||
backVo.setStorageId(storageId);
|
||||
backVo.setHandlerName(handlerName);
|
||||
return backVo;
|
||||
}).toList();
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据任务办理类型查询对应的数据
|
||||
*/
|
||||
@@ -83,7 +127,6 @@ public class FlwTaskAssigneeServiceImpl implements IFlwTaskAssigneeService, Hand
|
||||
case ROLE -> taskAssigneeService.selectRolesByTaskAssigneeList(taskQuery);
|
||||
case DEPT -> taskAssigneeService.selectDeptsByTaskAssigneeList(taskQuery);
|
||||
case POST -> taskAssigneeService.selectPostsByTaskAssigneeList(taskQuery);
|
||||
default -> throw new ServiceException("Unsupported handler type");
|
||||
};
|
||||
}
|
||||
|
||||
@@ -124,33 +167,41 @@ public class FlwTaskAssigneeServiceImpl implements IFlwTaskAssigneeService, Hand
|
||||
|
||||
/**
|
||||
* 根据存储标识符(storageId)解析分配类型和ID,并获取对应的用户列表
|
||||
* 支持单个标识(例如 "user:123" 或 "456"),格式非法将返回空列表
|
||||
*
|
||||
* @param storageId 包含分配类型和ID的字符串(例如 "user:123" 或 "role:456")
|
||||
* @return 与分配类型和ID匹配的用户列表,如果格式无效则返回空列表
|
||||
* @param storageId 包含分配类型和ID的字符串
|
||||
* @return 匹配的用户列表,格式非法返回空列表
|
||||
*/
|
||||
@Override
|
||||
public List<UserDTO> fetchUsersByStorageId(String storageId) {
|
||||
List<UserDTO> list = new ArrayList<>();
|
||||
Map<TaskAssigneeEnum, List<Long>> typeIdMap = new EnumMap<>(TaskAssigneeEnum.class);
|
||||
for (String str : storageId.split(StrUtil.COMMA)) {
|
||||
String[] parts = str.split(StrUtil.COLON, 2);
|
||||
TaskAssigneeEnum type;
|
||||
Long id;
|
||||
if (parts.length < 2) {
|
||||
// 无前缀时默认是用户类型
|
||||
type = TaskAssigneeEnum.USER;
|
||||
id = Long.valueOf(parts[0]);
|
||||
} else {
|
||||
// 根据前缀解析类型(如 "role:123" -> ROLE 类型)
|
||||
type = TaskAssigneeEnum.fromCode(parts[0] + StrUtil.COLON);
|
||||
id = Long.valueOf(parts[1]);
|
||||
}
|
||||
typeIdMap.computeIfAbsent(type, k -> new ArrayList<>()).add(id);
|
||||
Pair<TaskAssigneeEnum, Long> parsed = this.parseStorageId(storageId);
|
||||
if (parsed == null) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
typeIdMap.entrySet().stream()
|
||||
.filter(entry -> CollUtil.isNotEmpty(entry.getValue()))
|
||||
.forEach(entry -> list.addAll(getUsersByType(entry.getKey(), entry.getValue())));
|
||||
return list.stream().distinct().toList();
|
||||
return this.getUsersByType(parsed.getKey(), Collections.singletonList(parsed.getValue()));
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量解析多个存储标识符(storageIds),按类型分类并合并查询用户列表
|
||||
* 输入格式支持多个以逗号分隔的标识(如 "user:123,role:456,789")
|
||||
* 会自动去重返回结果,非法格式的标识将被忽略
|
||||
*
|
||||
* @param storageIds 多个存储标识符字符串(逗号分隔)
|
||||
* @return 合并后的用户列表,去重后返回,非法格式的标识将被跳过
|
||||
*/
|
||||
@Override
|
||||
public List<UserDTO> fetchUsersByStorageIds(String storageIds) {
|
||||
Map<TaskAssigneeEnum, List<Long>> typeIdMap = new EnumMap<>(TaskAssigneeEnum.class);
|
||||
for (String storageId : storageIds.split(StrUtil.COMMA)) {
|
||||
Pair<TaskAssigneeEnum, Long> parsed = this.parseStorageId(storageId);
|
||||
if (parsed != null) {
|
||||
typeIdMap.computeIfAbsent(parsed.getKey(), k -> new ArrayList<>()).add(parsed.getValue());
|
||||
}
|
||||
}
|
||||
return typeIdMap.entrySet().stream()
|
||||
.flatMap(entry -> this.getUsersByType(entry.getKey(), entry.getValue()).stream())
|
||||
.distinct()
|
||||
.toList();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -172,4 +223,41 @@ public class FlwTaskAssigneeServiceImpl implements IFlwTaskAssigneeService, Hand
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据任务分配类型和对应 ID 列表,批量查询名称映射关系
|
||||
*
|
||||
* @param type 分配类型(用户、角色、部门、岗位)
|
||||
* @param ids ID 列表(如用户ID、角色ID等)
|
||||
* @return 返回 Map,其中 key 为 ID,value 为对应的名称
|
||||
*/
|
||||
private Map<Long, String> getNamesByType(TaskAssigneeEnum type, List<Long> ids) {
|
||||
return switch (type) {
|
||||
case USER -> userService.selectUserNamesByIds(ids);
|
||||
case ROLE -> userService.selectRoleNamesByIds(ids);
|
||||
case DEPT -> userService.selectDeptNamesByIds(ids);
|
||||
case POST -> userService.selectPostNamesByIds(ids);
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析 storageId 字符串,返回类型和ID的组合
|
||||
*
|
||||
* @param storageId 例如 "user:123" 或 "456"
|
||||
* @return Pair(TaskAssigneeEnum, Long),如果格式非法返回 null
|
||||
*/
|
||||
private Pair<TaskAssigneeEnum, Long> parseStorageId(String storageId) {
|
||||
try {
|
||||
String[] parts = storageId.split(StrUtil.COLON, 2);
|
||||
if (parts.length < 2) {
|
||||
return Pair.of(TaskAssigneeEnum.USER, Long.valueOf(parts[0]));
|
||||
} else {
|
||||
TaskAssigneeEnum type = TaskAssigneeEnum.fromCode(parts[0] + StrUtil.COLON);
|
||||
return Pair.of(type, Long.valueOf(parts[1]));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.warn("解析 storageId 失败,格式非法:{},错误信息:{}", storageId, e.getMessage());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -112,7 +112,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
||||
if (ObjectUtil.isNotNull(flowInstance)) {
|
||||
BusinessStatusEnum.checkStartStatus(flowInstance.getFlowStatus());
|
||||
List<Task> taskList = taskService.list(new FlowTask().setInstanceId(flowInstance.getId()));
|
||||
taskService.mergeVariable(flowInstance, variables);
|
||||
flwCommonService.mergeVariable(flowInstance, variables);
|
||||
insService.updateById(flowInstance);
|
||||
StartProcessReturnDTO dto = new StartProcessReturnDTO();
|
||||
dto.setProcessInstanceId(taskList.get(0).getInstanceId());
|
||||
@@ -217,7 +217,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
||||
variableMap.remove(task.getNodeCode());
|
||||
}
|
||||
}
|
||||
taskService.mergeVariable(inst, variableMap);
|
||||
flwCommonService.mergeVariable(inst, variableMap);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -594,7 +594,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
||||
nextFlowNodes = StreamUtils.filter(nextFlowNodes, node -> NodeType.BETWEEN.getKey().equals(node.getNodeType()));
|
||||
if (CollUtil.isNotEmpty(nextNodeList)) {
|
||||
// 构建以下节点数据
|
||||
List<Task> buildNextTaskList = StreamUtils.toList(nextNodeList, node -> taskService.addTask(node, instance, definition, null));
|
||||
List<Task> buildNextTaskList = StreamUtils.toList(nextNodeList, node -> taskService.addTask(node, instance, definition, FlowParams.build()));
|
||||
// 办理人变量替换
|
||||
ExpressionUtil.evalVariable(buildNextTaskList, mergeVariable);
|
||||
for (FlowNode flowNode : nextFlowNodes) {
|
||||
|
@@ -1,3 +1,6 @@
|
||||
-- ----------------------------
|
||||
-- 0、warm-flow-all.sql,地址:https://gitee.com/dromara/warm-flow/blob/master/sql/oracle/oracle-wram-flow-all.sql
|
||||
-- ----------------------------
|
||||
create table FLOW_DEFINITION
|
||||
(
|
||||
ID NUMBER(20) not null,
|
||||
@@ -18,7 +21,8 @@ create table FLOW_DEFINITION
|
||||
TENANT_ID VARCHAR2(40)
|
||||
);
|
||||
|
||||
alter table FLOW_DEFINITION add constraint PK_FLOW_DEFINITION primary key (ID);
|
||||
alter table FLOW_DEFINITION
|
||||
add constraint PK_FLOW_DEFINITION primary key (ID);
|
||||
|
||||
comment on table FLOW_DEFINITION is '流程定义表';
|
||||
comment on column FLOW_DEFINITION.ID is '主键id';
|
||||
@@ -63,7 +67,8 @@ create table FLOW_NODE
|
||||
PERMISSION_FLAG VARCHAR2(200)
|
||||
);
|
||||
|
||||
alter table FLOW_NODE add constraint PK_FLOW_NODE primary key (ID);
|
||||
alter table FLOW_NODE
|
||||
add constraint PK_FLOW_NODE primary key (ID);
|
||||
|
||||
comment on table FLOW_NODE is '流程节点表';
|
||||
comment on column FLOW_NODE.ID is '主键id';
|
||||
@@ -106,7 +111,8 @@ create table FLOW_SKIP
|
||||
TENANT_ID VARCHAR2(40)
|
||||
);
|
||||
|
||||
alter table FLOW_SKIP add constraint PK_FLOW_SKIP primary key (ID);
|
||||
alter table FLOW_SKIP
|
||||
add constraint PK_FLOW_SKIP primary key (ID);
|
||||
|
||||
comment on table FLOW_SKIP is '节点跳转关联表';
|
||||
comment on column FLOW_SKIP.ID is '主键id';
|
||||
@@ -144,7 +150,8 @@ create table FLOW_INSTANCE
|
||||
TENANT_ID VARCHAR2(40)
|
||||
);
|
||||
|
||||
alter table FLOW_INSTANCE add constraint PK_FLOW_INSTANCE primary key (ID);
|
||||
alter table FLOW_INSTANCE
|
||||
add constraint PK_FLOW_INSTANCE primary key (ID);
|
||||
|
||||
comment on table FLOW_INSTANCE is '流程实例表';
|
||||
comment on column FLOW_INSTANCE.ID is '主键id';
|
||||
@@ -154,7 +161,7 @@ comment on column FLOW_INSTANCE.NODE_TYPE is '开始节点类型 (0开始节点
|
||||
comment on column FLOW_INSTANCE.NODE_CODE is '开始节点编码';
|
||||
comment on column FLOW_INSTANCE.NODE_NAME is '开始节点名称';
|
||||
comment on column FLOW_INSTANCE.VARIABLE is '任务变量';
|
||||
comment on column FLOW_INSTANCE.FLOW_STATUS is '流程状态(0待提交 1审批中 2 审批通过 3自动通过 4终止 5作废 6撤销 7取回 8已完成 9已退回 10失效)';
|
||||
comment on column FLOW_INSTANCE.FLOW_STATUS is '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)';
|
||||
comment on column FLOW_INSTANCE.ACTIVITY_STATUS is '流程激活状态(0挂起 1激活)';
|
||||
comment on column FLOW_INSTANCE.DEF_JSON is '流程定义json';
|
||||
comment on column FLOW_INSTANCE.CREATE_BY is '创建者';
|
||||
@@ -172,6 +179,7 @@ create table FLOW_TASK
|
||||
NODE_CODE VARCHAR2(100),
|
||||
NODE_NAME VARCHAR2(100),
|
||||
NODE_TYPE NUMBER(1),
|
||||
FLOW_STATUS VARCHAR2(20),
|
||||
FORM_CUSTOM VARCHAR2(1) default 'N',
|
||||
FORM_PATH VARCHAR2(100),
|
||||
CREATE_TIME DATE,
|
||||
@@ -180,7 +188,8 @@ create table FLOW_TASK
|
||||
TENANT_ID VARCHAR2(40)
|
||||
);
|
||||
|
||||
alter table FLOW_TASK add constraint PK_FLOW_TASK primary key (ID);
|
||||
alter table FLOW_TASK
|
||||
add constraint PK_FLOW_TASK primary key (ID);
|
||||
|
||||
comment on table FLOW_TASK is '待办任务表';
|
||||
comment on column FLOW_TASK.ID is '主键id';
|
||||
@@ -189,6 +198,7 @@ comment on column FLOW_TASK.INSTANCE_ID is '对应flow_instance表的id';
|
||||
comment on column FLOW_TASK.NODE_CODE is '节点编码';
|
||||
comment on column FLOW_TASK.NODE_NAME is '节点名称';
|
||||
comment on column FLOW_TASK.NODE_TYPE is '节点类型 (0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)';
|
||||
comment on column FLOW_TASK.FLOW_STATUS is '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)';
|
||||
comment on column FLOW_TASK.FORM_CUSTOM is '审批表单是否自定义 (Y是 N否)';
|
||||
comment on column FLOW_TASK.FORM_PATH is '审批表单路径';
|
||||
comment on column FLOW_TASK.CREATE_TIME is '创建时间';
|
||||
@@ -224,7 +234,8 @@ create table FLOW_HIS_TASK
|
||||
|
||||
);
|
||||
|
||||
alter table FLOW_HIS_TASK add constraint PK_FLOW_HIS_TASK primary key (ID);
|
||||
alter table FLOW_HIS_TASK
|
||||
add constraint PK_FLOW_HIS_TASK primary key (ID);
|
||||
|
||||
comment on table FLOW_HIS_TASK is '历史任务记录表';
|
||||
comment on column FLOW_HIS_TASK.ID is '主键id';
|
||||
@@ -237,7 +248,7 @@ comment on column FLOW_HIS_TASK.NODE_TYPE is '开始节点类型 (0开始节点
|
||||
comment on column FLOW_HIS_TASK.TARGET_NODE_CODE is '目标节点编码';
|
||||
comment on column FLOW_HIS_TASK.TARGET_NODE_NAME is '目标节点名称';
|
||||
comment on column FLOW_HIS_TASK.SKIP_TYPE is '流转类型(PASS通过 REJECT退回 NONE无动作)';
|
||||
comment on column FLOW_HIS_TASK.FLOW_STATUS is '流程状态(1审批中 2 审批通过 9已退回 10失效)';
|
||||
comment on column FLOW_HIS_TASK.FLOW_STATUS is '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)';
|
||||
comment on column FLOW_HIS_TASK.FORM_CUSTOM is '审批表单是否自定义 (Y是 N否)';
|
||||
comment on column FLOW_HIS_TASK.FORM_PATH is '审批表单路径';
|
||||
comment on column FLOW_HIS_TASK.MESSAGE is '审批意见';
|
||||
@@ -264,7 +275,8 @@ create table FLOW_USER
|
||||
TENANT_ID VARCHAR2(40)
|
||||
);
|
||||
|
||||
alter table FLOW_USER add constraint PK_FLOW_USER primary key (ID);
|
||||
alter table FLOW_USER
|
||||
add constraint PK_FLOW_USER primary key (ID);
|
||||
|
||||
comment on table FLOW_USER is '待办任务表';
|
||||
comment on column FLOW_USER.ID is '主键id';
|
||||
|
@@ -154,7 +154,7 @@ COMMENT ON COLUMN flow_instance.node_type IS '节点类型(0开始节点 1中
|
||||
COMMENT ON COLUMN flow_instance.node_code IS '流程节点编码';
|
||||
COMMENT ON COLUMN flow_instance.node_name IS '流程节点名称';
|
||||
COMMENT ON COLUMN flow_instance.variable IS '任务变量';
|
||||
COMMENT ON COLUMN flow_instance.flow_status IS '流程状态(0待提交 1审批中 2 审批通过 3自动通过 4终止 5作废 6撤销 7取回 8已完成 9已退回 10失效)';
|
||||
COMMENT ON COLUMN flow_instance.flow_status IS '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)';
|
||||
COMMENT ON COLUMN flow_instance.activity_status IS '流程激活状态(0挂起 1激活)';
|
||||
COMMENT ON COLUMN flow_instance.def_json IS '流程定义json';
|
||||
COMMENT ON COLUMN flow_instance.create_by IS '创建者';
|
||||
@@ -172,6 +172,7 @@ CREATE TABLE flow_task
|
||||
node_code varchar(100) NOT NULL, -- 节点编码
|
||||
node_name varchar(100) NULL, -- 节点名称
|
||||
node_type int2 NOT NULL, -- 节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)
|
||||
flow_status varchar(20) NOT NULL, -- 流程状态(0待提交 1审批中 2 审批通过 8已完成 9已退回 10失效)
|
||||
form_custom bpchar(1) NULL DEFAULT 'N':: character varying, -- 审批表单是否自定义(Y是 N否)
|
||||
form_path varchar(100) NULL, -- 审批表单路径
|
||||
create_time timestamp NULL, -- 创建时间
|
||||
@@ -188,6 +189,7 @@ COMMENT ON COLUMN flow_task.instance_id IS '对应flow_instance表的id';
|
||||
COMMENT ON COLUMN flow_task.node_code IS '节点编码';
|
||||
COMMENT ON COLUMN flow_task.node_name IS '节点名称';
|
||||
COMMENT ON COLUMN flow_task.node_type IS '节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)';
|
||||
COMMENT ON COLUMN flow_task.flow_status IS '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)';
|
||||
COMMENT ON COLUMN flow_task.form_custom IS '审批表单是否自定义(Y是 N否)';
|
||||
COMMENT ON COLUMN flow_task.form_path IS '审批表单路径';
|
||||
COMMENT ON COLUMN flow_task.create_time IS '创建时间';
|
||||
@@ -201,8 +203,8 @@ CREATE TABLE flow_his_task
|
||||
definition_id int8 NOT NULL, -- 对应flow_definition表的id
|
||||
instance_id int8 NOT NULL, -- 对应flow_instance表的id
|
||||
task_id int8 NOT NULL, -- 对应flow_task表的id
|
||||
node_code varchar(200) NULL, -- 开始节点编码
|
||||
node_name varchar(200) NULL, -- 开始节点名称
|
||||
node_code varchar(100) NULL, -- 开始节点编码
|
||||
node_name varchar(100) NULL, -- 开始节点名称
|
||||
node_type int2 NULL, -- 开始节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)
|
||||
target_node_code varchar(200) NULL, -- 目标节点编码
|
||||
target_node_name varchar(200) NULL, -- 结束节点名称
|
||||
@@ -237,7 +239,7 @@ COMMENT ON COLUMN flow_his_task.approver IS '审批者';
|
||||
COMMENT ON COLUMN flow_his_task.cooperate_type IS '协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签)';
|
||||
COMMENT ON COLUMN flow_his_task.collaborator IS '协作人';
|
||||
COMMENT ON COLUMN flow_his_task.skip_type IS '流转类型(PASS通过 REJECT退回 NONE无动作)';
|
||||
COMMENT ON COLUMN flow_his_task.flow_status IS '流程状态(1审批中 2 审批通过 9已退回 10失效)';
|
||||
COMMENT ON COLUMN flow_his_task.flow_status IS '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)';
|
||||
COMMENT ON COLUMN flow_his_task.form_custom IS '审批表单是否自定义(Y是 N否)';
|
||||
COMMENT ON COLUMN flow_his_task.form_path IS '审批表单路径';
|
||||
COMMENT ON COLUMN flow_his_task.message IS '审批意见';
|
||||
|
@@ -3,7 +3,7 @@
|
||||
-- ----------------------------
|
||||
CREATE TABLE `flow_definition`
|
||||
(
|
||||
`id` bigint unsigned NOT NULL COMMENT '主键id',
|
||||
`id` bigint NOT NULL COMMENT '主键id',
|
||||
`flow_code` varchar(40) NOT NULL COMMENT '流程编码',
|
||||
`flow_name` varchar(100) NOT NULL COMMENT '流程名称',
|
||||
`category` varchar(100) DEFAULT NULL COMMENT '流程类别',
|
||||
@@ -50,7 +50,7 @@ CREATE TABLE `flow_node`
|
||||
|
||||
CREATE TABLE `flow_skip`
|
||||
(
|
||||
`id` bigint unsigned NOT NULL COMMENT '主键id',
|
||||
`id` bigint NOT NULL COMMENT '主键id',
|
||||
`definition_id` bigint NOT NULL COMMENT '流程定义id',
|
||||
`now_node_code` varchar(100) NOT NULL COMMENT '当前流程节点的编码',
|
||||
`now_node_type` tinyint(1) DEFAULT NULL COMMENT '当前节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)',
|
||||
@@ -76,7 +76,7 @@ CREATE TABLE `flow_instance`
|
||||
`node_code` varchar(40) NOT NULL COMMENT '流程节点编码',
|
||||
`node_name` varchar(100) DEFAULT NULL COMMENT '流程节点名称',
|
||||
`variable` text COMMENT '任务变量',
|
||||
`flow_status` varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2 审批通过 3自动通过 4终止 5作废 6撤销 7取回 8已完成 9已退回 10失效)',
|
||||
`flow_status` varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)',
|
||||
`activity_status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '流程激活状态(0挂起 1激活)',
|
||||
`def_json` text COMMENT '流程定义json',
|
||||
`create_by` varchar(64) DEFAULT '' COMMENT '创建者',
|
||||
@@ -96,6 +96,7 @@ CREATE TABLE `flow_task`
|
||||
`node_code` varchar(100) NOT NULL COMMENT '节点编码',
|
||||
`node_name` varchar(100) DEFAULT NULL COMMENT '节点名称',
|
||||
`node_type` tinyint(1) NOT NULL COMMENT '节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)',
|
||||
`flow_status` varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)',
|
||||
`form_custom` char(1) DEFAULT 'N' COMMENT '审批表单是否自定义(Y是 N否)',
|
||||
`form_path` varchar(100) DEFAULT NULL COMMENT '审批表单路径',
|
||||
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
|
||||
@@ -107,7 +108,7 @@ CREATE TABLE `flow_task`
|
||||
|
||||
CREATE TABLE `flow_his_task`
|
||||
(
|
||||
`id` bigint(20) unsigned NOT NULL COMMENT '主键id',
|
||||
`id` bigint(20) NOT NULL COMMENT '主键id',
|
||||
`definition_id` bigint(20) NOT NULL COMMENT '对应flow_definition表的id',
|
||||
`instance_id` bigint(20) NOT NULL COMMENT '对应flow_instance表的id',
|
||||
`task_id` bigint(20) NOT NULL COMMENT '对应flow_task表的id',
|
||||
@@ -120,7 +121,7 @@ CREATE TABLE `flow_his_task`
|
||||
`cooperate_type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签)',
|
||||
`collaborator` varchar(40) DEFAULT NULL COMMENT '协作人',
|
||||
`skip_type` varchar(10) NOT NULL COMMENT '流转类型(PASS通过 REJECT退回 NONE无动作)',
|
||||
`flow_status` varchar(20) NOT NULL COMMENT '流程状态(1审批中 2 审批通过 9已退回 10失效)',
|
||||
`flow_status` varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)',
|
||||
`form_custom` char(1) DEFAULT 'N' COMMENT '审批表单是否自定义(Y是 N否)',
|
||||
`form_path` varchar(100) DEFAULT NULL COMMENT '审批表单路径',
|
||||
`message` varchar(500) DEFAULT NULL COMMENT '审批意见',
|
||||
@@ -136,7 +137,7 @@ CREATE TABLE `flow_his_task`
|
||||
|
||||
CREATE TABLE `flow_user`
|
||||
(
|
||||
`id` bigint unsigned NOT NULL COMMENT '主键id',
|
||||
`id` bigint NOT NULL COMMENT '主键id',
|
||||
`type` char(1) NOT NULL COMMENT '人员类型(1待办任务的审批人权限 2待办任务的转办人权限 3待办任务的委托人权限)',
|
||||
`processed_by` varchar(80) DEFAULT NULL COMMENT '权限人',
|
||||
`associated` bigint NOT NULL COMMENT '任务表id',
|
||||
|
@@ -1,3 +1,6 @@
|
||||
-- ----------------------------
|
||||
-- 0、warm-flow-all.sql,地址:https://gitee.com/dromara/warm-flow/blob/master/sql/sqlserver/sqlserver.sql
|
||||
-- ----------------------------
|
||||
CREATE TABLE flow_definition (
|
||||
id bigint NOT NULL,
|
||||
flow_code nvarchar(40) NOT NULL,
|
||||
@@ -523,7 +526,7 @@ EXEC sp_addextendedproperty
|
||||
GO
|
||||
|
||||
EXEC sp_addextendedproperty
|
||||
'MS_Description', N'流程状态(0待提交 1审批中 2 审批通过 3自动通过 4终止 5作废 6撤销 7取回 8已完成 9已退回 10失效)',
|
||||
'MS_Description', N'流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)',
|
||||
'SCHEMA', N'dbo',
|
||||
'TABLE', N'flow_instance',
|
||||
'COLUMN', N'flow_status'
|
||||
@@ -598,6 +601,7 @@ CREATE TABLE flow_task (
|
||||
node_code nvarchar(100) NOT NULL,
|
||||
node_name nvarchar(100) NULL,
|
||||
node_type tinyint NOT NULL,
|
||||
flow_status nvarchar(20) NOT NULL,
|
||||
form_custom nchar(1) DEFAULT('N') NULL,
|
||||
form_path nvarchar(100) NULL,
|
||||
create_time datetime2(7) NULL,
|
||||
@@ -653,6 +657,13 @@ EXEC sp_addextendedproperty
|
||||
'COLUMN', N'node_type'
|
||||
GO
|
||||
|
||||
EXEC sp_addextendedproperty
|
||||
'MS_Description', N'流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)',
|
||||
'SCHEMA', N'dbo',
|
||||
'TABLE', N'flow_task',
|
||||
'COLUMN', N'flow_status'
|
||||
GO
|
||||
|
||||
EXEC sp_addextendedproperty
|
||||
'MS_Description', N'审批表单是否自定义(Y是 N否)',
|
||||
'SCHEMA', N'dbo',
|
||||
@@ -824,7 +835,7 @@ EXEC sp_addextendedproperty
|
||||
GO
|
||||
|
||||
EXEC sp_addextendedproperty
|
||||
'MS_Description', N'流程状态(1审批中 2 审批通过 9已退回 10失效)',
|
||||
'MS_Description', N'流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)',
|
||||
'SCHEMA', N'dbo',
|
||||
'TABLE', N'flow_his_task',
|
||||
'COLUMN', N'flow_status'
|
||||
|
8
script/sql/update/update_5.3.1-5.3.2.sql
Normal file
8
script/sql/update/update_5.3.1-5.3.2.sql
Normal file
@@ -0,0 +1,8 @@
|
||||
ALTER TABLE `flow_task`
|
||||
ADD COLUMN `flow_status` varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)' AFTER `node_type`;
|
||||
|
||||
ALTER TABLE `flow_instance`
|
||||
MODIFY COLUMN `flow_status` varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)' AFTER `variable`;
|
||||
|
||||
ALTER TABLE `flow_his_task`
|
||||
MODIFY COLUMN `flow_status` varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)' AFTER `skip_type`
|
Reference in New Issue
Block a user