经过了长时间的学习和探索,对activiti的工作流有了初步的认识,也积累下了些许经验分享给大家

不足之处以及建议欢迎指正~

开发环境:activiti5.22.0    springboot1.5.4

流程设计使用的是集成的activiti流程设计器

部署流程

 /***    发布模型为流程实例*/@ApiOperation(value = "发布模型为流程定义")@PostMapping("{id}/deployment")public R deploy(@PathVariable("id") String id) throws Exception {//获取模型RepositoryService repositoryService = processEngine.getRepositoryService();Model modelData = repositoryService.getModel(id);byte[] bytes = repositoryService.getModelEditorSource(modelData.getId());if (bytes == null) {return R.error("模型数据为空,请先设计流程并成功保存,再进行发布。");}JsonNode modelNode = new ObjectMapper().readTree(bytes);BpmnModel model = new BpmnJsonConverter().convertToBpmnModel(modelNode);if (model.getProcesses().size() == 0) {return R.error("数据模型不符要求,请至少设计一条主线流程。");}byte[] bpmnBytes = new BpmnXMLConverter().convertToXML(model);//发布流程String processName = modelData.getName() + ".bpmn20.xml";DeploymentBuilder deploymentBuilder = repositoryService.createDeployment().name(modelData.getName()).addString(processName, new String(bpmnBytes, "UTF-8"));Deployment deployment = deploymentBuilder.deploy();modelData.setDeploymentId(deployment.getId());repositoryService.saveModel(modelData);return R.ok();}

获取工作流流程模型列表(带分页):

 /***    获取流程model列表(分页)*/@RequestMapping(value = "/list", method = RequestMethod.POST)public TableResultResponse<Model> list(@RequestParam Map<String, Object> params) {int page = Integer.parseInt((String) params.get("page"));int limit = Integer.parseInt((String) params.get("limit"));Page<Object> result = PageHelper.startPage(page, limit);List<Model> list = repositoryService.createModelQuery().orderByCreateTime().desc().list();return new TableResultResponse<Model>(result.getTotal(), list);}

删除流程模型:

  /***   删除模型*/@DeleteMapping("{id}")@ApiOperation(value = "删除模型")public Object deleteModel(@PathVariable("id") String id) {RepositoryService repositoryService = processEngine.getRepositoryService();repositoryService.deleteModel(id);//删除模型repositoryService.deleteDeployment(id, true);//如果存在运行中的流程,级联删除设置为truereturn R.ok();}

工作流运行

    public R startProcess() {String processDefinitionKey = "获取流程设计的key";ProcessInstance instance = null;//判断是否存在流程部署List<ProcessDefinition> list = processEngine.getRepositoryService().createProcessDefinitionQuery().processDefinitionKey(processDefinitionKey)//根据流程定义的key查询.list();if(list != null && list.size() > 0) {//启动流程实例(指定下级经办人)Map<String, Object> variables = new HashMap<String, Object>();variables.put("user", "获取下级经办人");instance = processEngine.getRuntimeService().startProcessInstanceByKey(processDefinitionKey, variables);} else {//流程未部署,或其他情况return R.ok("流程未部署,请检查流程定义").put("code", 500);}if(instance != null) {//流程启动成功System.out.println("流程实例id=" + instance.getProcessInstanceId());System.out.println("流程实例name=" + instance.getName());return R.ok().put("data", "流程启动成功");} else {return R.ok("未获取到流程实例,请检查是否发布!").put("code", 500);}}

流程启动的时候,可以动态指定下级经办人,或者不指定下级经办人而在流程设计中设置好,直接启动流程即可:

processEngine.getRuntimeService().startProcessInstanceByKey(processDefinitionKey);

流程删除

 /***    删除流程实例* @param processInstanceId*/@RequestMapping(value = "/deleteWf/{processInstanceId}", method = RequestMethod.DELETE)public void delete(@PathVariable("processInstanceId") String processInstanceId){runtimeService.deleteProcessInstance(processInstanceId, "删除流程实例原因");}

根据用户获取待办任务列表,或任务个数(接口中的userID为实际业务中assignee设置的为人员id)

 /***    根据用户ID获取用户待办任务个数*/public int taskCountByUserID(String userID) {int count = count = count + taskService.createTaskQuery().taskAssignee(userID).list().size();return count;}/***   根据用户ID获取用户待办任务列表*/public List<Task> taskList(String userID) {//查询个人任务列表List<Task> taskList = taskService.createTaskQuery().taskAssignee(userID).list();return taskList;}

审批

 @RequestMapping(value = "/complete/{taskID}", method = RequestMethod.GET)@ApiOperation("审批通过,添加信息")public R copmlete(@PathVariable("taskID") String taskID) {//查询是否有正在审批任务Task task = taskService.createTaskQuery().taskId(taskID).singleResult();if(task != null) {//完成审批任务taskService.complete(taskID);//如果需要传递参数的话   task.getProcessInstanceId()获取processInstanceId//runtimeService.setVariable(processInstanceId, "变量名", 参数);全局变量//taskService.setVariableLocal(taskID, "变量名", 参数);局部变量,该task下//添加批注的方法//taskService.addComment(taskID, processInstanceId, "批注信息"); }return R.ok("审批成功");}

驳回的流程设计需要节点的流转,设置好条件进行判断流转方向

会签(多实例)的设计,在该业务中设计的是多实例并行任务

将多实例任务设置为Parallel并行,设置参数变量,可以通过监听器将会签人员集合传递进来,也可以在上级节点指定参数传递

public class CompleteListener implements TaskListener {/*** */private static final long serialVersionUID = 1L;@Overridepublic void notify(DelegateTask delegateTask) {List<String> assigneeList = new ArrayList<String>();assigneeList.add("部门一");assigneeList.add("部门二");delegateTask.setVariable("assigneeList", assigneeList);}}

添加监听器设置会签人员集合

历史记录表的应用:

act_hi_actinst:历史节点信息表,审批节点的历史记录,可以获取历史活动节点的信息

act_hi_comment:历史审批记录表,可以获取审批批注信息

act_hi_procinst:历史流程实例表,可以获取历史流程实例的运行记录如是否结束,开始时间,结束时间等

act_hi_taskinst:历史任务信息表,可以获取历史任务的审批记录信息,审批人,审批时间

act_hi_varinst:历史流程变量表,可以获取历史流程实例下的流程变量信息,如存放的审批信息等

问题汇总

1. 获取审批批注信息问题

开发过程中,添加审批批注成功,但是部署生成环境是CentOS,发现存在获取乱码的情况

//获取批注信息
List<Comment> comments = processEngine.getTaskService().getTaskComments(historicActivityInstance.getTaskId());

Comment对象提供的api获取的是FULL_MSG_字段的blob类型文件信息,存在乱码现象,其中一种解决方式:

定义新的MyCommentEntity接收对象获取message信息

    List<MyCommentEntity> myCommentEntities = new ArrayList<MyCommentEntity>();if(comments != null && comments.size() > 0) {//创建我们自己的list集合//为每一个查询到接口实现类复制属性到我们自己的类中,解析为前端JSON数据for(Comment comment :comments){//创建我们自己的类MyCommentEntity myCommentEntity = new MyCommentEntity();//属性复制,源属性为commentEntity, 目标属性为myCommentEntityBeanUtils.copyProperties(comment, myCommentEntity);//添加我们自己的类myCommentEntities.add(myCommentEntity);}//get批注信息即可//list.get(0).getMessage();}

MyCommentEntity实体类:

@Getter
@Setter
public class MyCommentEntity {private String id;private String userId;//用户名,对应的是act_hi_comment表的USER_ID_字段private Date date;private String taskId;//任务idprivate String processInstanceId;//流程定义idprivate String message;//审批信息private String fullMessage;}

activiti工作流探索-学习笔记相关推荐

  1. 【笔记整理】Activiti工作流的学习笔记

    Activiti基础篇 1.什么是工作流 1.1 工作流简介 工作流(Workflow),就是通过计算机对业务流程自动化执行管理.它主要解决的是"使在多个参与者之间按照某种预定义的规则自动进 ...

  2. Activiti工作流框架学习笔记(一)

    工作流的概念 先看下面两张图: 对以上两张图进行说明: 假设这两张图就是华谊兄弟的请假流程图 图的组成部分: 人物:范冰冰.冯小刚.王中军 事件(动作):请假.批准.不批准 通过以上分析我们就可以抽象 ...

  3. Android开发艺术探索学习笔记 第二章IPC

    最近将之前工作做本地的学习笔记上传一下 这里是Android艺术开发探索的前三章内容 文章目录 1. android的多进程模式 2. IPC基础概念介绍 2.1 Serializable 2.2Pa ...

  4. html调用js函数_Java Web初学者探索学习笔记10—网络API的js数据接口调用解决方案...

    声明:本学习笔记内容均为小蔡蜀黍亲自整理和原创,如需借引,请注明出处! 1. 时间戳转化为时间 1.1 时间转换函数准备 1.2 时间函数的具体使用 2. 远程js函数调用 调用的js为天天基金网的实 ...

  5. Activiti工作流框架学习(一)环境的搭建和数据表的了解

    一.什么是工作流 工作流(Workflow),就是"业务过程的部分或整体在计算机应用环境下的自动化",它主要解决的是"使在多个参与者之间按照某种预定义的规则传递文档.信息 ...

  6. 达摩院视觉AI训练营-视觉AI技术应用探索-学习笔记

    视觉生产技术目录 一.视觉生产定义 定义: 分类: 通用基础框架 五个关键维度 二.精细理解-寻微入里 分割抠图-难点: 分割抠图-解题思路: 分割抠图-模型框架: 分割抠图-人像抠图拓展: 分割抠图 ...

  7. Python数据分析与挖掘第三章数据探索学习笔记

    一.数据质量分析: **意义:**数据质量分析是数据准备过程中重要的一环,是数据预处理的前提,也是数据挖掘分析结论有效性和准确性的基础. **主要任务:**检查原始数据中是否存在脏数据. **脏数据: ...

  8. ajax如何提交多表单的值_Java Web初学者探索学习笔记7—矛盾解决方案:表单标签验证与ajax提交...

    这段时间前端开发过程中,关于<form>表单下的输入框信息验证和数据提交问题出现矛盾. 问题描述: 表单下利用<input type="text" pattern ...

  9. 学习笔记之-Activiti7工作流引擎,概述,环境搭建,类关系图,使用Activiti BPMN visualizer,流程变量,组任务 网关,Activiti整合Spring SpringBoot

    本篇学习笔记是观看黑马程序员Activiti7视频而得 Activiti7 一.工作流介绍 1.1 概念 工作流(Workflow),就是通过计算机对业务流程自动化执行管理.它主要解决的是" ...

最新文章

  1. IOS开发基础知识--碎片45
  2. 机器学习中防止过拟合的处理方法
  3. Linux基本命令之ls
  4. LINQ系列:LINQ to SQL Exists/In/Any/All/Contains
  5. java的character用法_Java中Character类的使用方法
  6. 如何加大jvm的内存和tomcat的内存
  7. wince6-Error: failed PB timebomb check
  8. Intellij IDEA 14.x 菜单项中Compile、Make和Build的区别
  9. Linux运维六:用户管理及用户权限设置
  10. android 编程输入系统时间,基于android和PC的时间事件记录实践
  11. pix4d操作流程_Pix4d_mapper中文版操作手册.pdf
  12. 如何在Linux中安装/挂载CD-ROM
  13. Spring实战——FileSystemResource
  14. Uniswap进化之路
  15. Nature:阐明肿瘤代谢的脆弱性
  16. 在github上建立自己的网站
  17. win7系统计算机找不到u盘启动,联想f12后没有u盘启动怎么办_联想f12没有usb启动项如何解决-win7之家...
  18. cpu空载50度_单线程性能提升超50%!Arm新款服务器CPU要靠单核打天下?
  19. HDU 4513 吉哥系列故事――完美队形II(Manacher)
  20. hdu1512 Monkey King

热门文章

  1. 胡莱三国2服务器维护,《胡莱三国2》扫图挖宝独门秘籍
  2. 2022第8届广州民宿文化产业博览会
  3. android 百叶窗动画,Android 百叶窗折叠效果
  4. 华为EulerOS release 2.0(SP8)aarch64(arm架构)更新yum源操作
  5. Java微信支付——公众号支付JSAPI
  6. 初级程序员闲暇之余,应该如何提升自我?
  7. 习题5.2 从键盘输入n个数,求这n个数中的最大数与最小数并输出。
  8. 硬核卡牌链游Era7,必看全新评测与攻略
  9. 基于java网上童装销售系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
  10. collision domain - 冲突域