Activiti学习心得

1.流程定义id : 就是指向特定的流程,版本,和一个随机数. 就是指向了某一个流程的确定版本
2.流程实例id : 就是一个流程被创建之后,会生成一个id. 就是指向了一个具体的流程
3.流程任务id : 就是一个正在执行的任务,流程进行到任何一步都会生成一个id, 就是记录了一个流程实例执行到了哪一步;谁是执行人
4.活动id:      就是执行流程过程中,记录了流程所处的活动位置(这个活动位置可能并不是任务);

请假流程:
    ----->填写一张请假单,保存到leavesheet表中,可以增删改查
    
    部署流程----->编写一个流程bpmn,保存到activiti的相关表中,真正的bpmn文件内容是保存在:act_ge_bytearray表中;
                @Test
                public void deploy(){
                    //取得流程引擎对象
                    //ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();
                    //获取仓库服务 :管理流程定义
                    RepositoryService repositoryService = processEngine.getRepositoryService();
                    Deployment deploy = repositoryService.createDeployment()//创建一个部署的构建器
                    .addClasspathResource("diagrams/LeaveBill.bpmn")//从类路径中添加资源,一次只能添加一个资源
                    .addClasspathResource("diagrams/LeaveBill.png")//从类路径中添加资源,一次只能添加一个资源
                    .name("请求单流程")//设置部署的名称
                    .category("办公类别")//设置部署的类别
                    .deploy();
                    
                    System.out.println("部署的id"+deploy.getId());
                    System.out.println("部署的名称"+deploy.getName());
                    
                }
    开启任务----->提交到流程,使用"流程引擎"获得"运行时服务",使用"运行时服务"开启流程实例:
                String processDefiKey="leaveBill";
                //取运行时服务
                RuntimeService runtimeService = processEngine.getRuntimeService();
                //取得流程实例
                ProcessInstance pi = runtimeService.startProcessInstanceByKey(processDefiKey);//通过流程定义的key 来执行流程
    查询任务----->此时,在activiti的23张表中相关表中就产生了数据,每个用户可以根据用户名来查询自己的任务(list):
                //任务的办理人
                String assignee="王五";
                //取得任务服务
                TaskService taskService = processEngine.getTaskService();
                //创建一个任务查询对象
                TaskQuery taskQuery = taskService.createTaskQuery();
                //办理人的任务列表
                List<Task> list = taskQuery.taskAssignee(assignee)//指定办理人
                .list();
    完成任务-----> 每个人都可以根据 任务id来完成任务:    
                    //执行任务
                @Test
                public void compileTask(){
                    String taskId="502";
                    //taskId:任务id
                    processEngine.getTaskService().complete(taskId);
                    System.out.println("当前任务执行完毕");
                }
    
    任务流转----->每个人完成了任务,流程引擎会查询 act_ge_bytearray 表中的bpmn文件,查找下一个节点,并将节信息更新到"运行任务表";
    
    
    
关于流程变量:
    1.有两种服务可以设置流程变量:
        //TaskService taskService = processEngine.getTaskService();
        //RuntimeService runtimeService = processEngine.getRuntimeService();
        
    2.每个服务都有三种设置流程变量的方式:
        1.通过 runtimeService 来设置流程变量
                     * exxcutionId: 执行对象
                     * variableName:变量名
                     * values:变量值
                     */
            //        runtimeService.getVariableLocalVariable(exxcutionId, variableName, values);
            //        runtimeService.setVariableLocal(executionId, variableName, values);
                    //设置本执行对象的变量 ,该变量的作用域只在当前的execution对象
            //        runtimeService.setVariables(exxcutionId, variables); 
                      //可以设置多个变量  放在 Map<key,value>  Map<String,Object>
        2. 通过TaskService来设置流程变量
                     * taskId:任务id
                     */
            //        taskService.setVariable(taskId, variableName, values);
            //        taskService.setVariableLocal(taskId, variableName, values);
                    设置本执行对象的变量 ,该变量的作用域只在当前的execution对象
            //        taskService.setVariables(taskId, variables); //设置的是Map<key,values>
                    
    3. 流程变量设置的两个特殊时机(1.流程启动时; 2.任务完成时;):
        
        3. 当流程开始执行的时候,设置变量参数
                     * processDefiKey: 流程定义的key
                     * variables: 设置多个变量  Map<key,values>
                     */
            //        processEngine.getRuntimeService()
            //        .startProcessInstanceByKey(processDefiKey, variables)
                    
        
        4. 当执行任务时候,可以设置流程变量
                     * taskId:任务id
                     * variables: 设置多个变量  Map<key,values>
                     */
            //        processEngine.getTaskService().complete(taskId, variables);
        
    4. 获取流程变量的两种服务:    
        
         5. 通过RuntimeService取变量值
                     * exxcutionId: 执行对象
                     * 
                     */
            //        runtimeService.getVariable(exxcutionId, variableName);//取变量
            //        runtimeService.getVariableLocal(exxcutionId, variableName);//取本执行对象的某个变量
            //        runtimeService.getVariables(variablesName);//取当前执行对象的所有变量
        
        6. 通过TaskService取变量值
                     * TaskId: 执行对象
                     * 
                     */
            //        taskService.getVariable(taskId, variableName);//取变量
            //        taskService.getVariableLocal(taskId, variableName);//取本执行对象的某个变量
            //        taskService.getVariables(taskId);//取当前执行对象的所有变量
                    
关于用TaskService设置的流程变量: Variable和VariableLocal的区别:
    setVariable 是执行对象的公用变量,每一个任务对象都可以获得并修改其值;属于公共变量;
    setVariableLocal 是当前任务的私用变量,只对当前任务可用;其他任务对象可以有同名变量,用任务id区别;
    
    getVariable 是获取公有变量; 也可以获得当前私有变量(因为getVariable方法执行时要传入任务id,所以当前任务的私有变量
        它可以拿到)
    getVariableLocal 是获取私有变量,没法获得公共变量;    
    
    上边都是逻辑理解,但本质上是这样的:
        当使用TaskService来设置变量时,
            它的流程id(例如1301),执行id(例如1301)都是确定的:
            当使用setVariable,它是直接存储了一个变量,
                    使用: 流程id(例如1301)+执行id(例如1301)+变量名 来确定
            当使用setVariableLocal, 它是直接存储一个变量,同时存储一个任务id(例如1304),所以这个变量用:
                    使用: 流程id(例如1301)+执行id(例如1301)+任务id(例如1304)+变量名 来确定
                    
        当使用TaskService来获取变量时,
            它的流程id(例如1301),执行id(例如1301)都是确定的:
            当使用getVariable,它是直接存储了一个变量,
                    使用: 流程id(例如1301)+执行id(例如1301)+变量名 来确定
            当使用getVariableLocal, 它是直接存储一个变量,同时存储一个任务id(例如1304),所以这个变量用:
                    使用: 流程id(例如1301)+执行id(例如1301)+任务id(例如1304)+变量名 来确定
                                
        所以 当使用getVariable来获得变量时,是可以获得 setVariableLocal方法定义的变量;
        
请假流程分析:
    1.前端页面: (modelid----指向了---->js类------>指向了一个业务类)
        1.在模块菜单表中配置模块,前端就有了模块按钮 (与modelID绑定)
        2.在操作表中配置按钮, 前端就有了按钮(通过modelid 与js中的特定方法绑定)
        3.在tab_col表中配置列,在grid表中就显示响应的列;
    2.后端
        js--->调action--->...
    
    3.请假流程分析:
        ---->在操作表中配置 "流程提交" 按钮,并与js中submit()方法绑定
        ---->点击提交按钮,读取请假表中的数据填充 "流程变量" 并complete()任务;
        ---->下一个节点执行人进入请假模块界面,会查询到当前流到他的任务, 在后端配置"审核" 按钮;
            并且在后端 my_act_flow 表中配置 "审核菜单" 中的按钮: "批准", "发回修改", "取消流程"等选项;
            同时给这些按钮配置相应的值: 用来填充决定流程走向的 "流程变量"; 当点击"审核"按钮时,会调用js类
            中的 "审核方法" ,该方法会调用action到数据库中查询 my_act_task 表,获得数据给弹窗生成提供支持,
            同时还会查询 my_act_flow 表,来给弹窗添加 流程转向按钮; 我们点击提交以后, 会调用complete()方法,
            任务流转;
         ---->后边的节点任务流转同上;
        ---->
    
    现在流程要增加节点:
        1.首先要重新画流程图;
        2.这样前端在提交
        
        我们假设没有指定任务执行人 asignee没有赋值,默认所有人都可以看到所有的grid数据,然后给有权限的人分配
        "审核" 按钮的权限,那么可以审核的人就可以在grid中选中一条申请,打开审核窗口,就会依据这条申请信息
        
        
        

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值