基于SpringBoot2.x使用Activiti创建一个简易的请假流程

基于SpringBoot2.x使用Activiti创建一个简易的请假流程

2023年8月1日发(作者:)

基于SpringBoot2.x使⽤Activiti创建⼀个简易的请假流程⽂章⽬录

1 摘要⼯作流是需要和业务结合起来,才能够发挥其作⽤。本⽂将介绍基于 Spring Boot 2、Activiti 6 创建⼀个简易的请假流程。2 准备⼯作(1)(2)(3)(4)3 请假流程图流程图:bpmn ⽂件:./activiti-workflow/src/main/resources/processes/student_leave_

<

< initiator-can-complete modeler="/modeler"> assignee="${teacher}">initiator-can-complete modeler="/modeler"> assignee="${student}">3 核⼼代码3.1 数据库表学⽣请假流程的数据库表./doc/sql/activiti_leave_/*==============================================================*//* DBMS name: MySQL 5.0 *//* Created on: 2020/7/13 16:53:12 *//*==============================================================*/drop table if exists leave_info;/*==============================================================*//* Table: leave_info *//*==============================================================*/create table leave_info( id varchar(40) not null comment '编号', student_name varchar(30) comment '学⽣姓名', student_id varchar(40) comment '学⽣编号', leave_reason varchar(100) comment '请假原因', leave_duration int comment '请假时长(单位:天)', primary key (id))ENGINE = INNODB DEFAULTCHARSET = UTF8;alter table leave_info comment '请假信息';3.2 流程管理⼯具类关于流程的部署与使⽤,作者的思路是这样的:对于⼀张流程图,在⼀个系统中只部署⼀次,后边每次都是启动这个流程的实例,这样可以避免重复部署同⼀个流程,在查询代理⼈流程任务时,也能避免冲突。流程引擎使⽤单例模式创建,因为创建流程引擎是⼀个耗时耗资源的重量级操作。./activiti-workflow/src/main/java/com/ljq/demo/springboot/activiti/common/util/ckage ;import il;import tions;import tionUtil;import tiDeployDao;import icTaskInstanceVO;import ;import sEngine;import sEngines;import rvice;import icTaskInstance;import ment;import sInstance;import t;import ;import ist;import ;import ;/** * @Description: Activiti

流程管理 * @Author: * @Date: 2020/7/9 */public class ActivitiManager { private static volatile ProcessEngine processEngine; /** *

启动流程 * * @param processFile * @param processKey * @param deployDao * @param businessKey * @param variable * @return */ public static ProcessInstance startProcess(String processFile, String processKey, ActivitiDeployDao deployDao, String businessKey,Map variable) { //

判断是否部署过 int count = eployed(processFile); if (count < 1) { deployProcess(processFile); } //

初始化流程引擎,并且启动流程 ProcessInstance instance = init().getRuntimeService().startProcessInstanceByKey(processKey,businessKey,variable); return instance; } /** *

查询单个流程的历史记录 * * @param processKey * @param businessKey * @return */ public static List queryHistoryTask(String processKey, String businessKey) { List historicTaskInstanceList = init().getHistoryService() .createHistoricTaskInstanceQuery() .createHistoricTaskInstanceQuery() .processDefinitionKey(processKey) .processInstanceBusinessKey(businessKey) .list(); List taskInstanceVOList = new ArrayList<>(); ().forEach(taskInstance -> { HistoricTaskInstanceVO taskInstanceVO = new HistoricTaskInstanceVO(); operties(taskInstance, taskInstanceVO, ().ignoreError().ignoreNullValue()); List commentList = init().getTaskService().getTaskComments(()); if (mpty(commentList)) { ment((0).getFullMessage()); } (taskInstanceVO); }); return taskInstanceVOList; } /** *

查询流程实例 * * @param processKey * @param businessKey * @return */ public static ProcessInstance queryProcessInstance(String processKey,String businessKey) { ProcessInstance processInstance = init().getRuntimeService() .createProcessInstanceQuery() .processDefinitionKey(processKey) .processInstanceBusinessKey(businessKey) .singleResult(); return processInstance; } /** *

查询当前代理⼈在当前流程中待办理任务(列表) * * @param processKey * @param assignee * @return */ public static List queryTaskList(String processKey, String assignee) { List taskList = init().getTaskService() .createTaskQuery() .processDefinitionKey(processKey) .taskAssignee(assignee) .list(); List taskVOList = new ArrayList<>(); ().forEach(task -> { TaskVO taskVO = new TaskVO(); operties(task, taskVO); (taskVO); }); return taskVOList; } /** *

完成当前节点任务 * * @param taskId * @param processInstanceId * @param comment */ public static void complete(String taskId, String processInstanceId, String comment) { TaskService taskService = init().getTaskService(); ment(taskId, processInstanceId, comment); te(taskId); } /** /** *

删除流程实例(包括流程历史) * * @param processInstanceId * @param deleteReason */ public static void deleteProcessInstance(String processInstanceId, String deleteReason) { init().getRuntimeService().deleteProcessInstance(processInstanceId, deleteReason); } /** *

初始化 */ private static ProcessEngine init() { if (processEngine == null) { synchronized () { if (processEngine == null) { processEngine = aultProcessEngine(); n("初始化流程引擎"); } } } return processEngine; } /** *

部署流程 * * @param processFile * @return */ private static Deployment deployProcess(String processFile) { Deployment deployment = init().getRepositoryService() .createDeployment() .addClasspathResource(processFile) .deploy(); return deployment; }}3.3 流程的使⽤流程的使⽤主要是在业务层(Service 层)学⽣请假流程的业务层实现类:./activiti-workflow/src/main/java/com/ljq/demo/springboot/activiti/service/impl/(1) 学⽣发起⼀个请假申请(启动流程) /** *

新增(单条) * * @param leaveInfoAddParam * @return * @throws Exception */ @Override @Transactional(propagation = ED, rollbackFor = {}) public ApiResult add(LeaveInfoAddParam leaveInfoAddParam) throws Exception { //

请求参数获取 LeaveInfoEntity leaveInfoParam = new LeaveInfoEntity(); operties(leaveInfoAddParam, leaveInfoParam, () .ignoreNullValue().ignoreError()); String id = (); (id); //

保存 (leaveInfoParam); //

指定节点办理⼈ Map variable = new HashMap<>(16); ("student", dentId()); ("teacher", cherId()); ("teacherName", "张三丰"); ProcessInstance instance = rocess(T_LEAVE_PROCESS_FILE, T_LEAVE_PROCESS_KEY, deployDao, id, variable); return s(id); }(2) 查询请假详情(请假流程历史记录) /** *

查询详情(单条) * * @param leaveInfoInfoParam * @return * @throws Exception */ @Override public ApiResult info(LeaveInfoInfoParam leaveInfoInfoParam) throws Exception { //

查询 LeaveInfoEntity leaveInfoDB = bject(()); if ((leaveInfoDB)) { return s(); } List historicTaskInstanceVOList = ActivitiManager .queryHistoryTask(T_LEAVE_PROCESS_KEY, ()); Map extraDataMap = new HashMap<>(16); ("history", historicTaskInstanceVOList); return s(leaveInfoDB, extraDataMap); }(3) 查询待审批列表(根据代理⼈查询待执⾏流程任务) /** *

查询待审批列表 * * @param jobListParam * @return * @throws Exception */ @Override public ApiResult jobList(LeaveInfoJobListParam jobListParam) throws Exception { List taskVOList = askList(T_LEAVE_PROCESS_KEY, rId()); return s(taskVOList); }(4) 完成审批(完成任务节点)根据不同的⽤户,完成任务的节点也不相同,对于学⽣⽽⾔,完成审批即为「提交请假请求」,对于⽼师⽽⾔,即为「审批通过」 /** *

完成审批 * * @param approvalParam * @return * @throws Exception */ @Transactional(propagation = ED, rollbackFor = {}) @Override public ApiResult approval(LeaveInfoApprovalParam approvalParam) throws Exception { List taskVOList = askList(T_LEAVE_PROCESS_KEY, rId()); if (().filter(task -> ((), kId())) .findFirst().isPresent()) { te(kId(), cessInstanceId(), ment()); } else { return e(_INFO_WORKFLOW_TASK_NOT_EXIST); } return s(); }(5) 删除请假信息(删除流程实例,包含历史记录) /** *

删除(单条) * * @param leaveInfoDeleteParam * @return * @throws Exception */ @Override @Transactional(propagation = ED, rollbackFor = {}) public ApiResult delete(LeaveInfoDeleteParam leaveInfoDeleteParam) throws Exception { LeaveInfoEntity leaveInfoDB = bject(()); if ((leaveInfoDB) || !(dentId(), rId())) { return e(_INFO_NOT_EXIST); } //

查询请假流程实例 ProcessInstance processInstance = rocessInstance(T_LEAVE_PROCESS_KEY, ()); //

删除请假流程实例 ProcessInstance((), eteReason()); //

删除请假信息 (leaveInfoDB); return s(); }⾄此,⼀个简单的请假流程已经实现了。更多的使⽤细节,可参考项⽬源码。4 推荐参考资料5 Github 源码个⼈公众号:404Code,分享半个互联⽹⼈的技术与思考,感兴趣的可以关注.

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1690874692a452330.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信