package com.ruoyi.flowable.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Lists;
import com.ruoyi.flowable.common.constant.ProcessConstants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.flowable.common.enums.FlowComment;
import com.ruoyi.common.exception.CustomException;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.flowable.domain.dto.FlowCommentDto;
import com.ruoyi.flowable.domain.dto.FlowNextDto;
import com.ruoyi.flowable.domain.dto.FlowTaskDto;
import com.ruoyi.flowable.domain.dto.FlowViewerDto;
import com.ruoyi.flowable.domain.vo.FlowTaskVo;
import com.ruoyi.flowable.factory.FlowServiceFactory;
import com.ruoyi.flowable.flow.CustomProcessDiagramGenerator;
import com.ruoyi.flowable.flow.FindNextNodeUtil;
import com.ruoyi.flowable.flow.FlowableUtils;
import com.ruoyi.flowable.service.IFlowTaskService;
import com.ruoyi.flowable.service.ISysDeployFormService;
import com.ruoyi.system.domain.SysForm;
import com.ruoyi.system.service.ISysRoleService;
import com.ruoyi.system.service.ISysUserService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.flowable.bpmn.model.Process;
import org.flowable.bpmn.model.*;
import org.flowable.common.engine.api.FlowableException;
import org.flowable.common.engine.api.FlowableObjectNotFoundException;
import org.flowable.common.engine.impl.identity.Authentication;
import org.flowable.engine.ProcessEngineConfiguration;
import org.flowable.engine.history.HistoricActivityInstance;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.history.HistoricProcessInstanceQuery;
import org.flowable.engine.repository.ProcessDefinition;
import org.flowable.engine.runtime.Execution;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.engine.task.Comment;
import org.flowable.identitylink.api.history.HistoricIdentityLink;
import org.flowable.image.ProcessDiagramGenerator;
import org.flowable.task.api.DelegationState;
import org.flowable.task.api.Task;
import org.flowable.task.api.TaskQuery;
import org.flowable.task.api.history.HistoricTaskInstance;
import org.flowable.task.api.history.HistoricTaskInstanceQuery;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.io.InputStream;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;
/**
* @author XuanXuan
* @date 2021-04-03
**/
@Service
@Slf4j
public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTaskService {
@Resource
private ISysUserService sysUserService;
@Resource
private ISysRoleService sysRoleService;
@Resource
private ISysDeployFormService sysInstanceFormService;
/**
* 完成任务
*
* @param taskVo 请求实体参数
*/
@Transactional(rollbackFor = Exception.class)
@Override
public AjaxResult complete(FlowTaskVo taskVo) {
Task task = taskService.createTaskQuery().taskId(taskVo.getTaskId()).singleResult();
if (Objects.isNull(task)) {
return AjaxResult.error("任务不存在");
}
if (DelegationState.PENDING.equals(task.getDelegationState())) {
taskService.addComment(taskVo.getTaskId(), taskVo.getInstanceId(), FlowComment.DELEGATE.getType(), taskVo.getComment());
taskService.resolveTask(taskVo.getTaskId(), taskVo.getValues());
} else {
taskService.addComment(taskVo.getTaskId(), taskVo.getInstanceId(), FlowComment.NORMAL.getType(), taskVo.getComment());
Long userId = SecurityUtils.getLoginUser().getUser().getUserId();
taskService.setAssignee(taskVo.getTaskId(), userId.toString());
taskService.complete(taskVo.getTaskId(), taskVo.getValues());
}
return AjaxResult.success();
}
/**
* 驳回任务
*
* @param flowTaskVo
*/
@Override
public void taskReject(FlowTaskVo flowTaskVo) {
if (taskService.createTaskQuery().taskId(flowTaskVo.getTaskId()).singleResult().isSuspended()) {
throw new CustomException("任务处于挂起状态");
}
// 当前任务 task
Task task = taskService.createTaskQuery().taskId(flowTaskVo.getTaskId()).singleResult();
// 获取流程定义信息
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(task.getProcessDefinitionId()).singleResult();
// 获取所有节点信息
Process process = repositoryService.getBpmnModel(processDefinition.getId()).getProcesses().get(0);
// 获取全部节点列表,包含子节点
Collection<FlowElement> allElements = FlowableUtils.getAllElements(process.getFlowElements(), null);
// 获取当前任务节点元素
FlowElement source = null;
if (allElements != null) {
for (FlowElement flowElement : allElements) {
// 类型为用户节点
if (flowElement.getId().equals(task.getTaskDefinitionKey())) {
// 获取节点信息
source = flowElement;
}
}
}
// 目的获取所有跳转到的节点 targetIds
// 获取当前节点的所有父级用户任务节点
// 深度优先算法思想:延边迭代深入
List<UserTask> parentUserTaskList = FlowableUtils.iteratorFindParentUserTasks(source, null, null);
if (parentUserTaskList == null || parentUserTaskList.size() == 0) {
throw new CustomException("当前节点为初始任务节点,不能驳回");
}
// 获取活动 ID 即节点 Key
List<String> parentUserTaskKeyList = new ArrayList<>();
parentUserTaskList.forEach(item -> parentUserTaskKeyList.add(item.getId()));
// 获取全部历史节点活动实例,即已经走过的节点历史,数据采用开始时间升序
List<HistoricTaskInstance> historicTaskInstanceList = historyService.createHistoricTaskInstanceQuery().processInstanceId(task.getProcessInstanceId()).orderByHistoricTaskInstanceStartTime().asc().list();
// 数据清洗,将回滚导致的脏数据清洗掉
List<String> lastHistoricTaskInstanceList = FlowableUtils.historicTaskInstanceClean(allElements, historicTaskInstanceList);
// 此时历史任务实例为倒序,获取最后走的节点
List<String> targetIds = new ArrayList<>();
// 循环结束标识,遇到当前目标节点的次数
int number = 0;
StringBuilder parentHistoricTaskKey = new StringBuilder();
for (String historicTaskInstanceKey : lastHistoricTaskInstanceList) {
// 当会签时候会出现特殊的,连续都是同一个节点历史数据的情况,这种时候跳过
if (parentHistoricTaskKey.toString().equals(historicTaskInstanceKey)) {
continue;
}
parentHistoricTaskKey = new StringBuilder(historicTaskInstanceKey);
if (historicTaskInstanceKey.equals(task.getTaskDefinitionKey())) {
number++;
}
// 在数据清洗后,历史节点就是唯一一条从起始到当前节点的历史记录,理论上每个点只会出现一次
// 在流程中如果出现循环,那么每次循环中间的点也只会出现一次,再出现就是下次循环
// number == 1,第一次遇到当前节点
// number == 2,第二次遇到,代表最后一次的循环范围
if (n
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
高校教师综合信息管理系统源码 技术选型:SpringBoot + Vue前后端分离,提高开发效率 功能模块: RBAC(基于角色的访问控制)权限管理模型+数据看板+ 定制查询/自定义查询 + 教师信息管理 + 系统管理 + flowable工作流等 教师信息管理又分为:教师基本信息管理 + 教师科研信息管理 + 教师教务信息管理 系统管理分为:用户管理 + 角色管理 + 部门管理 +菜单管理 + 数据字典管理 + 岗位管理 流程管理:流程部署 + 表单配置 任务管理:我的流程 + 待办任务 + 已办任务 系统工具:代码自动生成 + 表单构建 + Swagger接口文档
资源推荐
资源详情
资源评论
收起资源包目录
SpringBoot + Vue前后端分离的高校教师综合信息管理系统源码.zip (1033个子文件)
run.bat 218B
package.bat 153B
package.bat 141B
build.bat 109B
run-web.bat 99B
clean.bat 92B
editor.main.css 68KB
.env.development 164B
若依环境使用手册.docx 418KB
.editorconfig 514B
.eslintignore 298B
401.gif 160KB
.gitignore 629B
.gitignore 256B
index.html 5KB
favicon.ico 9KB
FlowTaskServiceImpl.java 44KB
ExcelUtil.java 35KB
FlowableUtils.java 31KB
Convert.java 25KB
HTMLFilter.java 19KB
TCommon.java 19KB
CustomProcessDiagramGenerator.java 17KB
GenTableServiceImpl.java 15KB
CustomProcessDiagramCanvas.java 15KB
UUID.java 15KB
ReflectUtils.java 14KB
TEssay.java 14KB
SysUserServiceImpl.java 13KB
VelocityUtils.java 13KB
TBook.java 13KB
SysMenuServiceImpl.java 12KB
TAward.java 12KB
TProject.java 11KB
StringUtils.java 11KB
FlowDefinitionServiceImpl.java 10KB
TCopyright.java 10KB
FindNextNodeUtil.java 9KB
TeacherController.java 9KB
SysDeptServiceImpl.java 9KB
Base64.java 9KB
HttpUtils.java 9KB
SysUserController.java 8KB
SysRoleServiceImpl.java 8KB
GenUtils.java 8KB
TTrain.java 8KB
LogAspect.java 8KB
TWork.java 8KB
TeacherServiceImpl.java 8KB
GenTableColumn.java 8KB
GenTable.java 8KB
Teacher.java 7KB
GenController.java 7KB
SysUserVo.java 7KB
Degree.java 7KB
FileUploadUtils.java 7KB
SysUser.java 7KB
TA01.java 7KB
FlowTaskController.java 7KB
VerifyCodeUtils.java 7KB
FlowDefinitionController.java 7KB
SysJobServiceImpl.java 7KB
TAuthor.java 6KB
TCopyrightAuthor.java 6KB
TBookAuthor.java 6KB
SysRoleController.java 6KB
TFile.java 6KB
Server.java 6KB
TDataInfo.java 6KB
TeacherMapper.java 6KB
TEssayAuthor.java 6KB
SysDeptController.java 6KB
SecurityConfig.java 6KB
TokenService.java 6KB
TProjectAuthor.java 6KB
SysMenuController.java 6KB
TAwardAuthor.java 6KB
RedisCache.java 6KB
IpUtils.java 6KB
JobInvokeUtil.java 5KB
FileUtils.java 5KB
SysDictTypeServiceImpl.java 5KB
SysConfigServiceImpl.java 5KB
SysRole.java 5KB
MyBatisConfig.java 5KB
DataScopeAspect.java 5KB
SysMenu.java 5KB
SysOperLog.java 5KB
SurveyAnswerServiceImpl.java 5KB
SysProfileController.java 5KB
PermissionService.java 5KB
DruidConfig.java 5KB
TestController.java 5KB
DictUtils.java 5KB
SysJobController.java 5KB
ITeacherService.java 5KB
SysConfigController.java 5KB
SysJob.java 5KB
TAssessment.java 5KB
TEvaluate.java 4KB
共 1033 条
- 1
- 2
- 3
- 4
- 5
- 6
- 11
「已注销」
- 粉丝: 839
- 资源: 3602
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页