Activiti工作流入门详细介绍

actitviti的流程模板代码:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
  <process id="leave" name="请假申请流程" isExecutable="true">
    <startEvent id="sid-5EEA900F-0F1D-499B-BA66-30DADC9CD8E2"/>
    <userTask id="sid-32B567BD-68E2-4C0F-AEEB-80338270CE8E" name="发起请假申请" activiti:assignee="${applyuserid}" activiti:formKey="leaveapply/addleave">
      <extensionElements>
        <modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
      </extensionElements>
    </userTask>
    <sequenceFlow id="sid-E9D6F517-856D-4077-80B9-16A6971DB528" sourceRef="sid-5EEA900F-0F1D-499B-BA66-30DADC9CD8E2" targetRef="sid-32B567BD-68E2-4C0F-AEEB-80338270CE8E"/>
    <userTask id="sid-994F89FB-0F9E-4024-9E0B-821FE7B9AB60" name="部门领导审批" activiti:assignee="${deptleader}" activiti:formKey="leaveapply/deptleadercheck">
      <extensionElements>
        <modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
      </extensionElements>
    </userTask>
    <sequenceFlow id="sid-0F2504FD-7D90-48EB-85C1-AEAB40047390" sourceRef="sid-32B567BD-68E2-4C0F-AEEB-80338270CE8E" targetRef="sid-994F89FB-0F9E-4024-9E0B-821FE7B9AB60"/>
    <exclusiveGateway id="sid-B02EBCEA-0016-4C35-83B9-A103F8808EC8"/>
    <sequenceFlow id="sid-BFA7036B-51BE-4787-A165-7AF3FCE49361" sourceRef="sid-994F89FB-0F9E-4024-9E0B-821FE7B9AB60" targetRef="sid-B02EBCEA-0016-4C35-83B9-A103F8808EC8"/>
    <userTask id="sid-BE11B8AF-30E2-4963-8056-1AF14F17CA56" name="人事审批" activiti:assignee="${hr}" activiti:formKey="leaveapply/hrcheck">
      <extensionElements>
        <modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
      </extensionElements>
    </userTask>
    <exclusiveGateway id="sid-4EA1DD49-5C77-4C64-8657-7D34C7A0B1B0"/>
    <sequenceFlow id="sid-87DA23D3-43DA-4492-8DC8-866C4A9E32FA" sourceRef="sid-BE11B8AF-30E2-4963-8056-1AF14F17CA56" targetRef="sid-4EA1DD49-5C77-4C64-8657-7D34C7A0B1B0"/>
    <userTask id="sid-3B7AE84D-8E18-4E2B-827A-38BAC6A28D60" name="销假" activiti:assignee="${applyuserid}" activiti:formKey="leaveapply/destroyapply">
      <extensionElements>
        <modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
      </extensionElements>
    </userTask>
    <userTask id="sid-28AD8AD1-8617-44F9-AF11-12EFB1853E1F" name="调整申请" activiti:assignee="${applyuserid}" activiti:formKey="leaveapply/modifyapply">
      <extensionElements>
        <modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
      </extensionElements>
    </userTask>
    <exclusiveGateway id="sid-89BA94EB-ECBB-4B0E-967E-C21F0EE59AA0"/>
    <endEvent id="sid-5871A30C-A72F-437D-9006-D314434BBCD2"/>
    <sequenceFlow id="sid-78BF6DEB-A7CB-420E-99D7-E5351969DAA7" sourceRef="sid-3B7AE84D-8E18-4E2B-827A-38BAC6A28D60" targetRef="sid-5871A30C-A72F-437D-9006-D314434BBCD2">
      <conditionExpression>${reapply=='false'}</conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="sid-1B2F7856-A741-4F41-B27D-4EAE9AD6C657" sourceRef="sid-28AD8AD1-8617-44F9-AF11-12EFB1853E1F" targetRef="sid-89BA94EB-ECBB-4B0E-967E-C21F0EE59AA0"/>
    <sequenceFlow id="sid-93838384-4700-4EC5-A9A5-44C353E70C28" name="结束流程" sourceRef="sid-89BA94EB-ECBB-4B0E-967E-C21F0EE59AA0" targetRef="sid-5871A30C-A72F-437D-9006-D314434BBCD2">
      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${reapply=='false'}]]></conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="sid-ADC522CC-806D-4820-874F-B8A398332EF4" name="重新申请" sourceRef="sid-89BA94EB-ECBB-4B0E-967E-C21F0EE59AA0" targetRef="sid-994F89FB-0F9E-4024-9E0B-821FE7B9AB60">
      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${reapply=='true'}]]></conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="sid-2EBFBA73-9507-4289-983A-C61FC9722040" name="拒绝" sourceRef="sid-4EA1DD49-5C77-4C64-8657-7D34C7A0B1B0" targetRef="sid-28AD8AD1-8617-44F9-AF11-12EFB1853E1F">
      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${hrapprove=='false'}]]></conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="sid-AFDEA16D-DF44-419E-9FC8-B1EEB9A5CECE" name="同意" sourceRef="sid-4EA1DD49-5C77-4C64-8657-7D34C7A0B1B0" targetRef="sid-3B7AE84D-8E18-4E2B-827A-38BAC6A28D60">
      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${hrapprove=='true'}]]></conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="sid-CC811C39-345A-427B-9C00-E4C86EF094A7" name="同意" sourceRef="sid-B02EBCEA-0016-4C35-83B9-A103F8808EC8" targetRef="sid-BE11B8AF-30E2-4963-8056-1AF14F17CA56">
      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${deptleaderapprove=='true'}]]></conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="sid-AA2ABA70-1B8F-4B1F-AF80-E9A7D5357005" name="拒绝" sourceRef="sid-B02EBCEA-0016-4C35-83B9-A103F8808EC8" targetRef="sid-28AD8AD1-8617-44F9-AF11-12EFB1853E1F">
      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${deptleaderapprove=='false'}]]></conditionExpression>
    </sequenceFlow>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_leave">
    <bpmndi:BPMNPlane bpmnElement="leave" id="BPMNPlane_leave">
      <bpmndi:BPMNShape bpmnElement="sid-5EEA900F-0F1D-499B-BA66-30DADC9CD8E2" id="BPMNShape_sid-5EEA900F-0F1D-499B-BA66-30DADC9CD8E2">
        <omgdc:Bounds height="30.0" width="29.999999999999964" x="44.99999932944775" y="385.000008940696"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-32B567BD-68E2-4C0F-AEEB-80338270CE8E" id="BPMNShape_sid-32B567BD-68E2-4C0F-AEEB-80338270CE8E">
        <omgdc:Bounds height="80.0" width="99.99999999999997" x="194.9999970942736" y="360.00000178813895"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-994F89FB-0F9E-4024-9E0B-821FE7B9AB60" id="BPMNShape_sid-994F89FB-0F9E-4024-9E0B-821FE7B9AB60">
        <omgdc:Bounds height="80.0" width="100.0" x="374.9999944120646" y="359.999994635582"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-B02EBCEA-0016-4C35-83B9-A103F8808EC8" id="BPMNShape_sid-B02EBCEA-0016-4C35-83B9-A103F8808EC8">
        <omgdc:Bounds height="40.0" width="40.0" x="597.1999758869416" y="380.0000313520414"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-BE11B8AF-30E2-4963-8056-1AF14F17CA56" id="BPMNShape_sid-BE11B8AF-30E2-4963-8056-1AF14F17CA56">
        <omgdc:Bounds height="80.0" width="100.0" x="689.9999796599154" y="360.000002160668"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-4EA1DD49-5C77-4C64-8657-7D34C7A0B1B0" id="BPMNShape_sid-4EA1DD49-5C77-4C64-8657-7D34C7A0B1B0">
        <omgdc:Bounds height="40.0" width="40.0" x="827.1999758869415" y="380.0000313520414"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-3B7AE84D-8E18-4E2B-827A-38BAC6A28D60" id="BPMNShape_sid-3B7AE84D-8E18-4E2B-827A-38BAC6A28D60">
        <omgdc:Bounds height="80.0" width="100.0" x="912.1999513834733" y="360.000024199484"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-28AD8AD1-8617-44F9-AF11-12EFB1853E1F" id="BPMNShape_sid-28AD8AD1-8617-44F9-AF11-12EFB1853E1F">
        <omgdc:Bounds height="80.00000000000006" width="100.0" x="567.1999676585209" y="473.0000286847332"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-89BA94EB-ECBB-4B0E-967E-C21F0EE59AA0" id="BPMNShape_sid-89BA94EB-ECBB-4B0E-967E-C21F0EE59AA0">
        <omgdc:Bounds height="40.0" width="40.0" x="597.1999612182395" y="608.9999800771479"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-5871A30C-A72F-437D-9006-D314434BBCD2" id="BPMNShape_sid-5871A30C-A72F-437D-9006-D314434BBCD2">
        <omgdc:Bounds height="28.0" width="28.0" x="948.1999508470315" y="614.9999691247954"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="sid-78BF6DEB-A7CB-420E-99D7-E5351969DAA7" id="BPMNEdge_sid-78BF6DEB-A7CB-420E-99D7-E5351969DAA7">
        <omgdi:waypoint x="962.1999512897717" y="440.000024199484"/>
        <omgdi:waypoint x="962.199950879827" y="614.9999691247954"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-E9D6F517-856D-4077-80B9-16A6971DB528" id="BPMNEdge_sid-E9D6F517-856D-4077-80B9-16A6971DB528">
        <omgdi:waypoint x="74.9999993294477" y="400.0000083607589"/>
        <omgdi:waypoint x="194.9999970942736" y="400.0000037212625"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-AFDEA16D-DF44-419E-9FC8-B1EEB9A5CECE" id="BPMNEdge_sid-AFDEA16D-DF44-419E-9FC8-B1EEB9A5CECE">
        <omgdi:waypoint x="866.7833104355084" y="400.41669680347445"/>
        <omgdi:waypoint x="912.1999513834733" y="400.2183679809517"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-AA2ABA70-1B8F-4B1F-AF80-E9A7D5357005" id="BPMNEdge_sid-AA2ABA70-1B8F-4B1F-AF80-E9A7D5357005">
        <omgdi:waypoint x="617.6151530542255" y="419.58485418475743"/>
        <omgdi:waypoint x="617.3777483661745" y="473.0000286847332"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-1B2F7856-A741-4F41-B27D-4EAE9AD6C657" id="BPMNEdge_sid-1B2F7856-A741-4F41-B27D-4EAE9AD6C657">
        <omgdi:waypoint x="617.371639338635" y="553.0000286847333"/>
        <omgdi:waypoint x="617.6137554007444" y="609.4137742596528"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-93838384-4700-4EC5-A9A5-44C353E70C28" id="BPMNEdge_sid-93838384-4700-4EC5-A9A5-44C353E70C28">
        <omgdi:waypoint x="636.7275781039476" y="629.4723631914399"/>
        <omgdi:waypoint x="948.1999655931581" y="629.0202888524309"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-BFA7036B-51BE-4787-A165-7AF3FCE49361" id="BPMNEdge_sid-BFA7036B-51BE-4787-A165-7AF3FCE49361">
        <omgdi:waypoint x="474.9999944120646" y="400.12973951480626"/>
        <omgdi:waypoint x="597.6479429150188" y="400.4479983801185"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-CC811C39-345A-427B-9C00-E4C86EF094A7" id="BPMNEdge_sid-CC811C39-345A-427B-9C00-E4C86EF094A7">
        <omgdi:waypoint x="636.77797717281" y="400.4220300661731"/>
        <omgdi:waypoint x="689.9999796599154" y="400.20442946072825"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-87DA23D3-43DA-4492-8DC8-866C4A9E32FA" id="BPMNEdge_sid-87DA23D3-43DA-4492-8DC8-866C4A9E32FA">
        <omgdi:waypoint x="789.9999796599154" y="400.23214199766454"/>
        <omgdi:waypoint x="827.6066868300135" y="400.4067422951134"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-2EBFBA73-9507-4289-983A-C61FC9722040" id="BPMNEdge_sid-2EBFBA73-9507-4289-983A-C61FC9722040">
        <omgdi:waypoint x="847.6999758869415" y="419.5000313520414"/>
        <omgdi:waypoint x="847.6999758869415" y="513.0000286847333"/>
        <omgdi:waypoint x="667.1999676585209" y="513.0000286847333"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-ADC522CC-806D-4820-874F-B8A398332EF4" id="BPMNEdge_sid-ADC522CC-806D-4820-874F-B8A398332EF4">
        <omgdi:waypoint x="597.6999612182395" y="629.4999800771479"/>
        <omgdi:waypoint x="424.9999944120646" y="629.4999800771479"/>
        <omgdi:waypoint x="424.9999944120646" y="439.999994635582"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-0F2504FD-7D90-48EB-85C1-AEAB40047390" id="BPMNEdge_sid-0F2504FD-7D90-48EB-85C1-AEAB40047390">
        <omgdi:waypoint x="294.99999709427357" y="399.99999980131753"/>
        <omgdi:waypoint x="374.9999944120646" y="399.99999662240344"/>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

 模板要放到resources/process目录下管理

流程模板图:

 

元素说明:

  • startEvent: 启动流程的起始点。
  • sequenceFlow: 显示活动执行的顺序。
  • userTask: 由用户执行的任务。
  • exclusiveGateway: 根据条件指导流程的分支和汇聚。
  • endEventa: 标志流程的结束点。
  • assignee="{approvrld}": 指示该任务的执行者是由变量 ${approveld} 所指定的用户或角色。在实际执行流程时,${approveId}变量会被具体的用户或角色标识符替换,这样流程引擎就知道应该将任务分配给哪个用户来执行。

具体流程说明: 

  • 项目经理审批阶段。
  • 根据项目经理的审批结果,可能会有调整申请的机会。
  • 人事部进行最终审批。
  • 根据人事部的决定,流程要么结束,要么进入调整、重新申请或撤销的状态。

七大接口说明:

  • RepositoryService:提供管理流程部署和流API。(瑞跑死腿)
  • (RuntimeService:提供运行时流程实例进行管理与控制API。润time)
  • TaskService:提供流程任务管理API。(它死克)
  • IdentityService:提供对流程用户数据进行管理的API,包括用户组、用户及用户–组关系。                                   (艾丹特忒)
  • ManagementService:提供对流程引擎进行管理和维护的服务。(卖嫩值门特)
  • HistoryService:提供流程的历史数据进行操作API。(海思吹)
  • FormService:提供表单服务。  

application.yml文件activiti配置:

spring:
  activiti:
    #    flase:       默认值。activiti在启动时,会对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常。(生产环境常用)
    #    true:        activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建。(开发时常用)
    #    create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表)。(单元测试常用)
    #    drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎)。
    # todo 首次设置为true,将会创建所需要的表
    database-schema-update: true  #数据库更新策略
    # 自动部署验证设置:true-开启(默认)、false-关闭
    # todo 首次设置为true,将会部署process/下所有流程
    check-process-definitions: true
    #    指定activiti流程描述文件的前缀(即路径)
    process-definition-location-prefix: classpath*:process/
    # suffix 是一个String数组,表示描述文件的默认后缀名,默认以上两种。
    # process-definition-location-suffixes:
    # - **.bpmn
    # - **.bpmn20.xml
    #保存历史数据级别设置为full最高级别,便于历史数据的追溯
    #    none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。
    #    activity:级别高于none,保存流程实例与流程行为,其他数据不保存。
    #    audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。
    #    full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。
    history-level: full
    db-history-used: true

Springboot启动类注解添加 activiti的SecurityAutiConfigguration.class

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.activiti.spring.boot.SecurityAutoConfiguration;



/**
 * 启动程序
 *
 */
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, SecurityAutoConfiguration.class})
@MapperScan(basePackages = {"com.admin"})
public class SpringbootApplication {


    public static void main(String[] args) {
        SpringApplication.run(SpringbootApplication.class, args);

    }
}

请假实体类

@Data
@TableName("leave_apply")
public class LeaveApply  {

    Private String id;
    /**
     * 流程id
     */
    private String instanceId;
    /**
     * 请假人
     */

    private String userId;

    /**
     * 请假人名称
     */
    private String userName;


    /**
     * 类型
     */
    //请假类型:0-事假,1-年假,2-病假,3-丧假,4-产假
    private String type;

    //状态
    private String status;

    @TableField(exist = false)
    private String statusTo;
    /**
     * 原因
     */
    private String reason;


    /**
     * 起始时间
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date realityStartTime;

    /**
     * 结束时间
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date realityEndTime;


    @TableField(exist = false)
    private String taskId;

    //同意或者拒绝
    @TableField(exist = false)
    private String determine;


    //审批意见
    @TableField(exist = false)
    private String appText;
}

 

启动开始申请流程

  @Override
    public Integer insert(LeaveApply entity) {
        entity.setId(IdWorker.getId());
        // 发起请假流程
        identityService.setAuthenticatedUserId(entity.getUserId());
        //设置需要审批人的id,这里可以根据框架去调整(框架获取申请人上级经理和人事id)
        HashMap<String, Object> variables = new HashMap<>();
        variables.put("applyuserid", UserUtils.getUserId());
        variables.put("deptleader", "1819252813305397250");
        variables.put("hr", "1820272152821288961");
        runtimeService.startProcessInstanceByKey("leave", String.valueOf(entity.getId()), variables);
        // 自动完成第一个任务     Business 背斯嫩死
        Task autoTask = taskService.createTaskQuery().processDefinitionKey("leave").processInstanceBusinessKey(String.valueOf(entity.getId())).singleResult();
        taskService.addComment(autoTask.getId(), autoTask.getProcessInstanceId(), entity.getReason());
        entity.setInstanceId(autoTask.getProcessInstanceId());
        taskService.complete(autoTask.getId());
        entity.setStatus("经理审批中");
        return baseMapper.insert(entity);
    }

分页显示所有流程

 public String leavePage(Page<LeaveApply> page, LeaveApply entity) {

        Page<LeaveApply> leave = leaveApplyService.page(page, entity);
        if (StringUtil.isNotEmpty(leave.getRecords())) {

            leave.getRecords().forEach(x -> {
                //根据流程id查询与流程实例关联的任务
                Task tasks = taskService.createTaskQuery().processInstanceId(x.getInstanceId()).singleResult();
                if (StringUtil.isNotEmpty(tasks)) {
                    //taskid用户分页后对数据操作的唯一流程任务id
                    x.setTaskId(tasks.getId());
                }
            });
        }

        return ValueUtil.toJson(leave);
    }

 

经理人事审批代码

public String save(@RequestBody LeaveApply entity) throws IOException {
        // 获取 ProcessEngine 实例
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 获取 TaskService 实例
        TaskService taskService = processEngine.getTaskService();
        // 设置要处理的任务ID(需要替换为实际的待审批任务ID)
        String taskId = entity.getTaskId();

        // 设置审批参数
        String approvalComment = entity.getAppText();
        // 添加审批意见
        taskService.addComment(taskId, entity.getInstanceId(), entity.getAppText());
        // 创建一个包含流程变量的 Map
        Map<String, Object> variables = new HashMap<>();

        //管理员 拒绝审批流程(根据框架进行调整,可以获取当前登录用户的角色是经理还是hr进行审批)
        if (UserUtils.getUserId().equals("1819252813305397250") && "false".equals(entity.getDetermine())) {
            variables.put("deptleaderapprove", entity.getDetermine());
            taskService.complete(taskId, variables);
//            taskService.addComment(entity.getTaskId(), entity.getInstanceId(), "同意2323232审批");
            entity.setStatus("经理拒绝审批");
        }

        //管理员 同意审批流程
        if (UserUtils.getUserId().equals("1819252813305397250") && "true".equals(entity.getDetermine())) {
            entity.setStatus("人事审批中");
            // 设置审批结果变量
            variables.put("deptleaderapprove", entity.getDetermine());
            taskService.complete(taskId, variables);

        }
        //人事  拒绝审批流程
        if (UserUtils.getUserId().equals("1820272152821288961") && "false".equals(entity.getDetermine())) {
            entity.setStatus("人事拒绝审批");
            // 设置审批结果变量
            variables.put("hrapprove", entity.getDetermine());
            taskService.complete(taskId, variables);
        }
        // 完成审批任务
        //人事 同意审批流程
        if (UserUtils.getUserId().equals("1820272152821288961") && "true".equals(entity.getDetermine())) {
            entity.setStatus("审批结束");
            //加入人事同意流程,则自动完成整个流程
            variables.put("hrapprove", entity.getDetermine());
            taskService.complete(taskId, variables);

            variables.put("reapply", "false");
            // 设置审批结果变量
            Task tasks = taskService.createTaskQuery().processInstanceId(entity.getInstanceId()).singleResult();
            taskService.complete(tasks.getId(), variables);
//            runtimeService.deleteProcessInstance(entity.getInstanceId(), "手动结束最后一个流程实例");

        }
        if ("驳回后经理审批".equals(entity.getStatus())) {
            entity.setStatus("驳回后人事审批");
        }
        leaveApplyService.updateById(entity);

        return ValueUtil.toJson();
    }

流程整体操作记录(审核详细信息)

 public String selelctMessageByTaskId(@PathVariable String taskId) {

        // 创建流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        HistoryService historyService = processEngine.getHistoryService();

        List<HistoricTaskInstance> tasks = historyService.createHistoricTaskInstanceQuery().processInstanceId(taskId).orderByHistoricTaskInstanceStartTime().desc().list();

        List<FolwData> folwDataList = new ArrayList<>();

        for (HistoricTaskInstance task : tasks) {
            System.out.println("任务ID: " + task.getId());
            System.out.println("任务名称: " + task.getName());
            System.out.println("执行人: " + task.getAssignee());
            System.out.println("开始时间: " + task.getStartTime());
            System.out.println("结束时间: " + task.getEndTime());
            FolwData folwData = new FolwData();
            folwData.setId(task.getId());
            folwData.setName(task.getName());
            folwData.setStartTime(task.getStartTime());
            folwData.setEndTime(task.getEndTime());
            folwData.setAssignee(task.getAssignee());
            //这里是审批信息单独保存到act_hi_comment表里的,不知道怎么查,就用sql语句查出来了
            String byId = actHiCommentService.selectByTaskId(task.getId());
            if (com.basic.common.util.basic.StringUtil.isNotEmpty(byId)) {
                System.out.println("审批信息: " + byId);
                folwData.setMessage(byId);
            }
            folwDataList.add(folwData);
        }
        return ValueUtil.toJson(folwDataList);
    }

被驳回会继续申请

 public String update(@RequestBody LeaveApply entity) {
        HashMap<String, Object> variables = new HashMap<>();
        variables.put("applyuserid", UserUtils.getUserId());
        if (!"经理审批中".equals(entity.getStatus())) {
            entity.setStatus("驳回后经理审批");
        }
        variables.put("reapply", "true");
        taskService.addComment(entity.getTaskId(), entity.getInstanceId(), entity.getReason());
        // 添加审批意见
        taskService.complete(entity.getTaskId(), variables);
        leaveApplyService.updateById(entity);
        return ValueUtil.toJson();
    }

驳回后不想继续申请,删除流程

 public String removeById(String id,String taskId) {
        //结束流程
        HashMap<String, Object> variables = new HashMap<>();
        variables.put("reapply", "false");
        taskService.complete(taskId, variables);
        leaveApplyService.removeById(id);
        return ValueUtil.toJson();
    }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值