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();
}