activiti工作流 php,码云社 | 砺锋科技-SpringBoot整合Activiti工作流(附源码) - 用代码改变世界...

依赖:

新建springBoot项目时勾选activiti,或者在已建立的springBoot项目添加以下依赖:    org.activiti    activiti-spring-boot-starter-basic    6.0.0

配置:

数据源和activiti配置:server:  port: 8081spring:  datasource:    url: jdbc:mysql://localhost:3306/act5?useSSL=true    driver-class-name: com.mysql.jdbc.Driver    username: root    password: root  # activiti default configuration  activiti:    database-schema-update: true    check-process-definitions: true    process-definition-location-prefix: classpath:/processes/#    process-definition-location-suffixes:#      - **.bpmn#      - **.bpmn20.xml    history-level: full

在activiti的默认配置中,process-definition-location-prefix 是指定activiti流程描述文件的前缀(即路径),启动时,activiti就会去寻找此路径下的流程描述文件,并且自动部署;suffix 是一个String数组,表示描述文件的默认后缀名,默认以上两种。

springMVC配置:package com.yawn.config;import org.springframework.context.annotation.Configuration;import org.springframework.format.FormatterRegistry;import org.springframework.http.HttpStatus;import org.springframework.web.servlet.config.annotation.*;/** * Created by yawn on 2017/8/5. */@EnableWebMvc@Configurationpublic class MvcConfig extends WebMvcConfigurerAdapter{    @Override    public void addResourceHandlers(ResourceHandlerRegistry registry){        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");        registry.addResourceHandler("/templates/**").addResourceLocations("classpath:/templates/");        super.addResourceHandlers(registry);    }    @Override    public void addViewControllers(ViewControllerRegistry registry){        registry.addViewController("/index");        registry.addViewController("/user");        registry.addRedirectViewController("/","/templates/login.html");//        registry.addStatusController("/403", HttpStatus.FORBIDDEN);        super.addViewControllers(registry);    }}

这里配置静态资源和直接访问的页面:在本示例项目中,添加了thymeleaf依赖解析视图,主要采用异步方式获取数据,通过angularJS进行前端数据的处理和展示。

使用activiti:

配置了数据源和activiti后,启动项目,activiti 的各个服务组件就已经被加入到spring容器中了,所以就可以直接注入使用了。如果在未自动配置的spring环境中,可以使用通过指定bean的init-method来配置activiti的服务组件。

案例:

以以下请假流程为例:

d0192373d952f52049636a5399d7ace3.png

1. 开始流程并“申请请假”(员工)private static final String PROCESS_DEFINE_KEY = "vacationProcess";    public Object startVac(String userName, Vacation vac) {        identityService.setAuthenticatedUserId(userName);        // 开始流程        ProcessInstance vacationInstance = runtimeService.startProcessInstanceByKey(PROCESS_DEFINE_KEY);        // 查询当前任务        Task currentTask = taskService.createTaskQuery().processInstanceId(vacationInstance.getId()).singleResult();        // 申明任务        taskService.claim(currentTask.getId(), userName);        Map vars = new HashMap<>(4);        vars.put("applyUser", userName);        vars.put("days", vac.getDays());        vars.put("reason", vac.getReason());        // 完成任务        taskService.complete(currentTask.getId(), vars);        return true;    }

在此方法中,Vaction 是申请时的具体信息,在完成“申请请假”任务时,可以将这些信息设置成参数。

2. 审批请假(老板)

(1)查询需要自己审批的请假public Object myAudit(String userName) {        List taskList = taskService.createTaskQuery().taskCandidateUser(userName)                .orderByTaskCreateTime().desc().list();//        / 多此一举 taskList中包含了以下内容(用户的任务中包含了所在用户组的任务)//        Group group = identityService.createGroupQuery().groupMember(userName).singleResult();//        List list = taskService.createTaskQuery().taskCandidateGroup(group.getId()).list();//        taskList.addAll(list);        List vacTaskList = new ArrayList<>();        for (Task task : taskList) {            VacTask vacTask = new VacTask();            vacTask.setId(task.getId());            vacTask.setName(task.getName());            vacTask.setCreateTime(task.getCreateTime());            String instanceId = task.getProcessInstanceId();            ProcessInstance instance = runtimeService.createProcessInstanceQuery().processInstanceId(instanceId).singleResult();            Vacation vac = getVac(instance);            vacTask.setVac(vac);            vacTaskList.add(vacTask);        }        return vacTaskList;    }    private Vacation getVac(ProcessInstance instance) {        Integer days = runtimeService.getVariable(instance.getId(), "days", Integer.class);        String reason = runtimeService.getVariable(instance.getId(), "reason", String.class);        Vacation vac = new Vacation();        vac.setApplyUser(instance.getStartUserId());        vac.setDays(days);        vac.setReason(reason);        Date startTime = instance.getStartTime(); // activiti 6 才有        vac.setApplyTime(startTime);        vac.setApplyStatus(instance.isEnded() ? "申请结束" : "等待审批");        return vac;    }

package com.yawn.entity;import java.util.Date;/** * @author Created by yawn on 2018-01-09 14:31 */public class VacTask{    private String id;    private String name;    private Vacation vac;    private Date createTime;    // getter setter ...}

老板查询自己当前需要审批的任务,并且将任务和参数设置到一个VacTask对象,用于页面的展示。

0a3696de55840cbdf72585345c353717.png

TOOBUG(开发工程师)-本文作者

一个毫无志向的程序员,我就是我,不是toobug

263

0

2019-12-20 10:17

本文暂无评论,快来抢沙发!

评论

904e12226f21641d6a84d713e9455148.png

CODESEEDING(码云社)一家致力于程序员成长、以内容为核心、以提问为引导的多元化成长社区。我们在线上为技术爱好者提供了一个优质的交流氛围环境,在线下同样和众多高校联合开办了技术沙龙品牌。

020-85534346

关注我们

访问移动H5版

官方微信公众号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值