Camunda 整合Springboot 实战篇

发布于:2024-07-03 ⋅ 阅读:(20) ⋅ 点赞:(0)

1.导入依赖

 <dependency>
            <groupId>org.camunda.bpm.springboot</groupId>
            <artifactId>camunda-bpm-spring-boot-starter</artifactId>
            <version>7.18.0</version>
        </dependency>
        <dependency>
            <groupId>org.camunda.bpm.springboot</groupId>
            <artifactId>camunda-bpm-spring-boot-starter-rest</artifactId>
            <version>7.18.0</version>
        </dependency>
        <dependency>
            <groupId>org.camunda.bpm.springboot</groupId>
            <artifactId>camunda-bpm-spring-boot-starter-webapp</artifactId>
            <version>7.18.0</version>
        </dependency>

去官网找对应的版本适配,这里举个例子

application.yml

server:
  port: 8019
# camunda登录信息配置
camunda:
  bpm:
    admin-user:
      id: admin  #用户名
      password: 123456  #密码
      firstName: jiang #名字
    filter:
      create: All tasks
    deployment-resource-pattern:
      - classpath:bpmn/*.bpmn
    database:
      type: mysql
      schema-update: true
    auto-deployment-enabled: false #是否自动部署 resource 下的 bpmn 文件

# mysql连接信息
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://192.168.52.132:3307/camunda?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true
    username: root
    password: root
    type: com.mysql.cj.jdbc.MysqlDataSource

运行项目,项目会自动写入数据库里,建表 

 

 2.创建bpmn文件

不会的小伙伴看上一节,使用工具创建

 3.bpmn部署

工作流程图

注释,要不然每次重启项目都部署一份 

server:
  port: 8019
# camunda登录信息配置
camunda:
  bpm:
    admin-user:
      id: admin  #用户名
      password: 123456  #密码
      firstName: jiang #名字
#    filter:
#      create: All tasks
#    deployment-resource-pattern:
#      - classpath:bpmn/*.bpmn
    database:
      type: mysql
      schema-update: true
    auto-deployment-enabled: false #是否自动部署 resource 下的 bpmn 文件

# mysql连接信息
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://192.168.52.132:3307/camunda?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true
    username: root
    password: root
    type: com.mysql.cj.jdbc.MysqlDataSource

 部署API

    @Autowired
    private RepositoryService repositoryService;//部署用的对象


    @GetMapping("/deploy")
    public String deploy() {
        Deployment deploy = repositoryService.createDeployment()
                .name("部署的第一个流程")//部署名称
                .addClasspathResource("bpmn/process.bpmn")//绑定需要部署的流程文件
                .deploy();//部署流程
        String id = deploy.getId();
        String name = deploy.getName();
        Date deploymentTime = deploy.getDeploymentTime();
        String source = deploy.getSource();
        String tenantId = deploy.getTenantId();

        log.info("流程部署成功: id={},name={},deploymentTime={},source={},tenantId={}", id, name, deploymentTime, source, tenantId);

        return id+":"+name;
    }

对应三张表

  1.  ACT_RE_DEPLOYMENT
  2. ACT_RE_PROCDEF
  3. ACT_GE_BYTEARRAY

启动流程


    @Autowired
    private RuntimeService runtimeService;//流程启动的对象

    /**
     * 启动流程的案例
     *
     * @return
     */
    @GetMapping("/start")
    public String startFlow() {
        // 部署流程
        ProcessInstance processInstance = runtimeService.startProcessInstanceById("my-project-process:3:3a63ba11-3922-11ef-ba3c-005056c00008");
        // 部署的流程实例的相关信息
        String id = processInstance.getId();
        String processInstanceId = processInstance.getProcessInstanceId();
        String rootProcessInstanceId = processInstance.getRootProcessInstanceId();
        String processDefinitionId = processInstance.getProcessDefinitionId();
        String tenantId = processInstance.getTenantId();
        String caseInstanceId = processInstance.getCaseInstanceId();
//id=226a591f-3926-11ef-9404-005056c00008,processInstanceId=226a591f-3926-11ef-9404-005056c00008,rootProcessInstanceId=226a591f-3926-11ef-9404-005056c00008,processDefinitionId=my-project-process:3:3a63ba11-3922-11ef-ba3c-005056c00008,tenantId=null,caseInstanceId=null
        log.info("流程启动成功: id={},processInstanceId={},rootProcessInstanceId={},processDefinitionId={},tenantId={},caseInstanceId={}", id, processInstanceId,
                rootProcessInstanceId, processDefinitionId, tenantId, caseInstanceId);
        return id;
    }

数据库生成一个待审批对象

 

生成实例ID 待审批数据

 在这个表里历史记录流程任务

手动审批过后,数据就被清除了

 流程实例历史记录表

查询任务

 


    @Autowired
    private TaskService taskService;
    /**
     * 查询任务
     * 代办
     *
     * 流程定义ID:processDefinition:我们部署流程的时候会产生对应的 流程定义ID,每个部署流程,会产生一个流程定义ID re 部署时
     * 流程实例ID: processInstance :我们流程启动实例的时候,会产生一个流程实例ID;ru 运行时
     *
     *
     * @return
     */
    @GetMapping("/queryTask/{processInstanceId}")
    public String queryTask(@PathVariable("processInstanceId") String processInstanceId){
        List<Task> list = taskService.createTaskQuery()
                .processInstanceId(processInstanceId).list();
        List<Task> list1 = taskService.createTaskQuery()
                .list();

        List<Task> list2 = taskService.createTaskQuery()
                .listPage(0,5);//分页

        TaskQuery admin = taskService.createTaskQuery()
                .taskAssignee("admin");//用户的ID;查询该用户的代办任务
        List<Task> list3 = admin.list();
        log.info("admin一共有{}个代办任务",list3.size());
        int size = list1.size();
        for (Task task : list) {
            String assignee = task.getAssignee();
            String id = task.getId();
            String name = task.getName();
            log.info("查询实例ID:assignee={},id={},name={}",assignee,id,name);
        }
        log.info("一共{}代办任务",size);
        return list.get(0).getId();

    }

 完成任务

 /**
     * 完成任务
     * @param processInstanceId
     */
    @GetMapping("/complete/{processInstanceId}")
    public void completeTask(@PathVariable("processInstanceId") String processInstanceId){
        //  根据实例ID查询到任务
        Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult();
        boolean suspended = task.isSuspended();//判断任务是否被冻结,暂停 以后用到的
        System.out.println(suspended);
        if (task!=null){
           taskService.complete(task.getId());//两个参数的,后面时流程变量,也就是传参的
            System.out.println("任务审批完成");
        }


    }