Springboot集成Activiti7案例--采购流程审批

  1. Springboot集成Activiti7
    1)引入依赖

    <!--springboot与activiti7整合的starter-->
            <dependency>
                <groupId>org.activiti</groupId>
                <artifactId>activiti-spring-boot-starter</artifactId>
                <version>7.10.0</version>
            </dependency>
    

    2)属性配置

    	spring:
    		 #日志的相关配置
    	  activiti:
    	    #是否让activiti自动创建所有的历史表
    	    history-level: full
    	    #是否需要使用历史表,默认false不使用,而配置true是使用历史表
    	    db-history-used: true
    	    #流程自动部署,关闭,需要手动部署流程 服务启动的时候自动检查resources目录下的bpmn文件 如果为true自动部署流程
    	    check-process-definitions: false
    	    #关闭启动服务自动框架部署
    	    deployment-mode: never-fail
    

    3)在MySQL中创建一个新的数据库,准备一个引导类,然后启动项目,activiti会自动创建表结构。
    在这里插入图片描述

  2. bpmn-js画流程图,导出diagram.bpmn文件

    • 排他网关(Exclusive Gateway):也称为XOR网关或基于数据的排他网关,用于在流程中创建决策点。当执行到达排他网关时,所有出口顺序流会按照它们定义的顺序进行计算。条件计算为true的顺序流会被选择用于继续流程。
      在这里插入图片描述
  3. 调用activiti提供的api,实现部署流程、创建流程实例、执行任务:

    • 流程定义ProcessDefinition是以BPMN文件定义的一个工作流程,是一组工作规范;
    • 流程实例ProcessInstance则是指一个具体的业务流程。例如某个员工发起一次请假,就会实例化一个请假的流程实例,并且每个不同的流程实例之间是互不影响的。

    1)RepositoryService:用于部署流程定义,可以添加、删除、查询和管理流程定义。

     @Autowired
    private RepositoryService repositoryService;
      @Test
        public void deployProcess() {
            String fileName = "bpmn/diagram.bpmn";
            //定义流程
            Deployment deployment = repositoryService.createDeployment()
                    .addClasspathResource(fileName)
                    .name("Process_1")
                    .deploy();//部署流程
        }
    

    2)RuntimeService:用于启动、查询和管理正在运行的流程实例。

    @Autowired
    private RuntimeService runtimeService;
     @Test
        public void initProcessInstanceWithArgs() {
            //流程变量
            Map<String,Object> variables = new HashMap<String,Object>();
            variables.put("assingee0","采购员");
            variables.put("assingee1","经理");
            variables.put("assingee2","财务专员");
            variables.put("assingee3","财务主管");
            //启动流程实例
            ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(
                    "Process_1",
                    "business_key_01",
                    variables);
            System.out.println("流程实例ID: " + processInstance.getProcessDefinitionId());
        }
    

    3)TaskService:用于查询和管理当前用户可以操作的任务,以及完成任务。

    • 采购员填写申请
     @Autowired
        private TaskService taskService;
     //查询我的代办任务
    @Test
    public void getTasksByAssignee() {
    
        String assingee = "采购员";
        String businessKey = "business_key_01";
        Task task = taskService.createTaskQuery()
                .processDefinitionKey("Process_1") //流程Key
                .taskAssignee(assingee)  //要查询的负责人
                .processInstanceBusinessKey(businessKey)
                .singleResult();
        System.out.println("Id: " + task.getId());
        System.out.println("Name: " + task.getName());
        System.out.println("Assignee: " + task.getAssignee());
    }
    
    //执行任务
    @Test
    public void completeTask() {
        String assingee = "采购员";
        String businessKey = "business_key_01";
        //根据流程key 和 任务的负责人 查询任务
        //返回一个任务对象
        Task task = taskService.createTaskQuery()
                .processDefinitionKey("Process_1") //流程Key
                .taskAssignee(assingee)  //要查询的负责人
                .processInstanceBusinessKey(businessKey)
                .singleResult();
        if (task == null) {
            System.out.println(assingee + ",没有任务可以执行...");
        } else {
            //执行任务
            // 把采购员填写的购买申请单中的数据,作为流程变量,设置到流程中
            Map<String, Object> variables = new HashMap<>();
            variables.put("userName", "采购员");
            variables.put("startDate", "2024-1-1");
            variables.put("money", "100000");
            variables.put("info", "购买器材");
            //完成任务
            taskService.complete(task.getId(), variables);
            System.out.println("完成任务");
        }
    }
    
    • 经理审批同意,根据金额(大于10000由财务主管审批,小于等于则由财务专员审批)继续审批,最后审批通过即该流程结束。
    @Test
        public void testAgree(){
            Authentication authentication = new UsernamePasswordAuthenticationToken("经理","123456");
            SecurityContextHolder.getContext().setAuthentication(authentication);
            Task task = taskService.createTaskQuery()
                    .processDefinitionKey("Process_1")
                    .taskAssignee("经理")
                    .processInstanceBusinessKey("business_key_01").singleResult();
            if(null != task){
                Map<String,Object> variables = new HashMap<>();
                variables.put("approvalStatus","同意");
                variables.put("approvalNote","财务审核");
    
                taskService.complete(task.getId(),variables);
                System.out.println("任务完成...");
            }
        }
    
    • 审批不同意,该流程结束
     @Test
        public void testRejectTask() {
            Task task = taskService.createTaskQuery()
                    .processDefinitionKey("Process_1") //流程Key
                    .taskAssignee("经理")  //要查询的负责人
                    .processInstanceBusinessKey("business_key_02")
                    .singleResult();
    
            String reason = "金额太大,不同意";
            Map<String, Object> variables = new HashMap<>();
            variables.put("approvalStatus", "不同意");
            variables.put("approvalNode", reason);
    
            //记录流程变量
            runtimeService.setVariables(task.getProcessInstanceId(), variables);
            //添加流程变量,删除流程实例,表示任务被拒绝
            runtimeService.deleteProcessInstance(task.getProcessInstanceId(), reason);
    

    4)HistoryService:用于查询历史数据,例如已完成的流程实例、已删除的流程实例、用户任务等。
    在这里插入图片描述

    	@Autowired
        private HistoryService historyService;
        @Test
        public void getHistoryList(){
            HistoricTaskInstanceQuery instanceQuery = historyService.createHistoricTaskInstanceQuery()
                    .includeProcessVariables()
                    .orderByHistoricTaskInstanceEndTime().desc()
                    .finished()
                    .taskAssignee("采购员");
            List<HistoricTaskInstance> list = instanceQuery.list();
            for (HistoricTaskInstance history : list) {
                System.out.println("Id: " + history.getId());
                System.out.println("ProcessInstanceId: " + history.getProcessInstanceId());
                System.out.println("StartTime: " + history.getStartTime());
                System.out.println("Name: " + history.getName());
                Map<String, Object> processVariables = history.getProcessVariables();
                System.out.println(processVariables.get("money").toString());
            }
        }
    
  • 27
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值