1. @Override
    @Transactional(rollbackFor = Exception.class)
    public int callBack(String processId) {

    //通过流程id查找到当前的任务
    List<Task> tasks= taskService.createTaskQuery()
    .processInstanceId(processId)
    .list();
    //如果为空或者小于等于0则证明没有可查看到的任务
    if (tasks == null||tasks.size()<=0) {
    System.out.println("当前没有任务或者任务已执行完了");
    return -1;
    }
    //查看所有走过的历史任务
    List<HistoricTaskInstance> htlist = historyService.createHistoricTaskInstanceQuery()
    .processInstanceId(processId)
    .finished()
    .list();
    if (htlist == null||htlist.size()<=0) {
    System.out.println("请先提交任务");
    }
    String myTaskId = null;
    HistoricTaskInstance myTask = null;
    //前一个任务节点,也就是提交人 拿到前一个任务
    for (HistoricTaskInstance hti : htlist) {
    //回退到zhangsan也就是任务A,业务中这里就是当前登录的用户名 TODO:从登录名拿
    if (hti.getAssignee().equals("1")) {
    myTaskId = hti.getId();

    myTask = hti;
    break;
    }
    }

    if (myTask == null) {
    System.out.println("这个任务不是你的任务");
    }
    //流程定义id
    String processDefinitionId = myTask.getProcessDefinitionId();

    //整个流程节点对象
    BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);

    //我的节点
    String myActivityId = null;
    //历史节点完成节点
    List<HistoricActivityInstance> haiList =
    historyService
    .createHistoricActivityInstanceQuery()
    .executionId(myTask.getExecutionId())
    .finished()
    .list();
    //拿到我的节点 _3
    for (HistoricActivityInstance hai : haiList) {
    if (myTaskId.equals(hai.getTaskId())) {
    myActivityId = hai.getActivityId();
    break;
    }
    }
    //我的流程节点
    FlowNode myFlowNode =
    (FlowNode) bpmnModel.getMainProcess().getFlowElement(myActivityId);
    //当前执行对象
    Execution execution = runtimeService.createExecutionQuery()
    .executionId(tasks.get(0).getExecutionId()).singleResult();
    //当任务执行节点_4
    String activityId = execution.getActivityId();

    System.out.println(activityId);
    //当前流程节点对象
    FlowNode flowNode = (FlowNode) bpmnModel.getMainProcess()
    .getFlowElement(activityId);

    //记录原活动方向出方向
    List<SequenceFlow> oriSequenceFlows = new ArrayList<SequenceFlow>();
    oriSequenceFlows.addAll(flowNode.getOutgoingFlows());

    //清理活动方向
    flowNode.getOutgoingFlows().clear();

    //建立新方向
    List<SequenceFlow> newSequenceFlowList = new ArrayList<SequenceFlow>();
    SequenceFlow newSequenceFlow = new SequenceFlow();
    newSequenceFlow.setId("newSequenceFlowId");
    newSequenceFlow.setSourceFlowElement(flowNode);
    newSequenceFlow.setTargetFlowElement(myFlowNode);
    newSequenceFlowList.add(newSequenceFlow);
    flowNode.setOutgoingFlows(newSequenceFlowList);
    //设置操作人记录 和备注信息
    Authentication.setAuthenticatedUserId("zhangsan");
    taskService.addComment(tasks.get(0).getId(), tasks.get(0).getProcessInstanceId(), "撤回");
    String taskId= tasks.get(0).getId();
    //完成任务
    if (tasks.size() > 1) {
    //会签撤回
    HashMap<String, Object> variables = new HashMap<>();
    variables.put("pass",true);
    // variables.put("param","y");
    taskService.complete(taskId,variables);
    //恢复原方向
    flowNode.setOutgoingFlows(oriSequenceFlows);
    ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(tasks.get(0).getProcessInstanceId()).singleResult();
    //更新数据库 从新设置state为未提交状态
    Apply apply = new Apply();
    apply.setCode(processInstance.getBusinessKey());
    apply.setState(0);

    return applyService.updateByCode(apply);
    }
    //普通撤回
    taskService.complete(taskId);
    //恢复原方向
    flowNode.setOutgoingFlows(oriSequenceFlows);
    ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(tasks.get(0).getProcessInstanceId()).singleResult();
    //更新数据库 从新设置state为未提交状态
    Apply apply = new Apply();
    apply.setCode(processInstance.getBusinessKey());
    apply.setState(0);

    return applyService.updateByCode(apply);
    }

actviti7撤回操作的更多相关文章

  1. winfrom保存图片,将文件夹中图片放入listview,与撤回操作

    之前那些操作完成对图片的修改之后,就是要保存图片了. 这里保存用到一个SaveFileDialog控件,可以获取用户选择的保存文件的路径. ) { SaveFileDialog saveImageDi ...

  2. git commit撤回操作

    git commit 之后没有push,怎么回撤commit操作呢? $ git reset HEAD~

  3. Python3.5+PyQt5多线程+itchat实现微信防撤回桌面版代码

    weChatThread线程类 之前一直不会python多线程,写这个程序的时候,发现不用多线程会陷入无限未响应状态.于是学了半天python多线程,但是在主函数里写的时候,发现一个问题,Ui主线程和 ...

  4. vim操作(待补充)

    :wq 存盘 + 退出 (:w 存盘, :q 退出) :e 打开新文件 :q 退出 h.j.k.l,分别控制光标左.下.上.右移一格. 按Ctrl+B:屏幕往后移动一页.[常用] 按Ctrl+F:屏幕 ...

  5. unity编辑器扩展_05(删除游戏对象并具有撤回功能)

    代码: [MenuItem("Tools/Delete",false,1)]    static void Delete()    {        GameObject[] go ...

  6. Windows常用快捷操作

    Windows操作系统作为目前最广泛使用的PC端OS,掌握一些快捷键,方便快速在Windows系统下进行操作. 下面收集整理了一些常用的快捷操作: Ctrl + A   全选 Ctrl + C   复 ...

  7. HANA SQL

    约束 注释 你可以给你的 SQL 语句添加注释来增加可读性和可维护性. SQL 语句中注释的分隔如下: l  双连字符“--”.所有在双连字符之后直到行尾的内容都被 SQL 解析器认为是注释. l  ...

  8. 小杨同学git使用记(适合使用过git但是不熟练的童鞋)

    首先声明:这不是一篇git使用手册或者指南,如果要详细的git使用指南,下面是廖雪峰的git教程,可以系统学习廖雪峰的git教程,当然,如果你想马上以一种正确的方式使用git,那么接下来你很快就会学会 ...

  9. CSDN上看到的一篇有关Spring JDBC事务管理的文章(内容比较全) (转)

    JDBC事务管理 Spring提供编程式的事务管理(Programmatic transaction manage- ment)与声明式的事务管理(Declarative transaction ma ...

随机推荐

  1. Linux性能分析利器——火焰图的安装使用

    火焰图(flame graph)是性能分析的利器,通过它可以快速定位性能瓶颈点. perf 命令(performance 的缩写)是 Linux 系统原生提供的性能分析工具,会返回 CPU 正在执行的 ...

  2. Mysql 数据库基本操作

    1.数据库设置密码 [root@db02 scripts]# mysqladmin -uroot password 123 2.使用密码登录 #1.正确的方式(不规范) [root@db02 scri ...

  3. Heap Size 与 Stack Size

    Heap Size:如果没有用到标准库的malloc,就是废物,纯属浪费内存,所以直接设置为0即可: Stack Size :最大的可读写变量的大小即可:

  4. 【数据结构与算法】多种语言(VB、C、C#、JavaScript)系列数据结构算法经典案例教程合集目录

    目录 1. 专栏简介 2. 专栏地址 3. 专栏目录 1. 专栏简介 2. 专栏地址 「 刘一哥与GIS的故事 」之<数据结构与算法> 3. 专栏目录 [经典回放]多种语言系列数据结构算法 ...

  5. 文字闪烁效果 CSS + HTML

    文字闪烁效果 CSS 写在前面 好好学习,天天向上! 效果图 绝美的效果 实现过程 先给没字体添加一些普通的样式,颜色设置为透明 给文字设置一个动画效果,通过text-shadow属性来实现变亮的效果 ...

  6. lambda 函数执行流程 递归注意

  7. ubuntu下 SVN 服务器搭建及使用

    简化篇 http://blog.csdn.net/Eric_lmy/article/details/51942931 详细篇 1.安装Subversion ServerSubversion serve ...

  8. 达梦数据库产品支持技术学习分享_Week2

    本周主要从以下几个方面进行本人对达梦数据库学习的分享,学习进度和学习情况因人而异,仅供参考. 一.文本命令行工具使用的方法(Disql和dmfldr) 二.数据库备份 三.定时作业功能 四.系统表和动 ...

  9. python_request 接口测试线性框架,模块化思想,增加日志打印

    一.大框架 如下为一个简单的线性框架,同时编写common_api 模块,把一个个接口进行封装,案例编写时候只需要直接调用输入参数即可. 二. test_cases 模块具体写法 2.1  commo ...

  10. Spring Cloud系列(四):断路器Hystrix

    上一篇介绍了负载均衡的配置方法,做负载均衡是为了保证高可用性,但是有时候服务提供者挂掉了,比如服务A调用了服务B,服务B又调用了服务C,然后有一天服务C的所有节点都挂掉了,这时服务B就会因为C异常而在 ...