使用簡(jiǎn)介:本技術(shù)點(diǎn)主要是針對(duì)類審批的業(yè)務(wù)流程的建模,可以有:任務(wù)發(fā)布(即流程開(kāi)始)到一級(jí)一級(jí)的審批到最終結(jié)束(即流程結(jié)束)一整套完備的模型
1、idea下載activiti插件
- ider以前版本下載actiBPM,但是新版ider這個(gè)插件已經(jīng)被淘汰,已經(jīng)被下面這個(gè)替代
?
?
2、單獨(dú)起一個(gè)activiti服務(wù)
3、添加依賴在activiti服務(wù)中:
<dependency>
???<groupId>org.springframework.boot</groupId>
???<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
???<groupId>org.springframework.boot</groupId>
???<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
???<groupId>org.springframework.boot</groupId>
???<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
???<groupId>org.activiti</groupId>
???<artifactId>activiti-spring-boot-starter</artifactId>
???<version>7.0.0.Beta2</version>
</dependency>
<dependency>
???<groupId>org.mybatis.spring.boot</groupId>
???<artifactId>mybatis-spring-boot-starter</artifactId>
???<version>2.0.0</version>
</dependency>
<dependency>
???<groupId>mysql</groupId>
???<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
???<groupId>org.projectlombok</groupId>
???<artifactId>lombok</artifactId>
</dependency>
4、添加配置
我這里的服務(wù)結(jié)構(gòu):
?
a、activiti.cfg.xml的配置(直接粘,需要修改為自己的數(shù)據(jù)庫(kù)):
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
??????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
??????xmlns:context="http://www.springframework.org/schema/context"
??????xmlns:tx="http://www.springframework.org/schema/tx"
??????xsi:schemaLocation="http://www.springframework.org/schema/beans
???????????????????http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/contex
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
???<!-- 默認(rèn)id對(duì)應(yīng)的值 為processEngineConfiguration -->
???<!-- processEngine Activiti的流程引擎 -->
???<bean id="processEngineConfiguration"
?????????class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
???????<property name="jdbcDriver" value="com.mysql.cj.jdbc.Driver"/>
???????<property name="jdbcUrl" value="jdbc:mysql://*****:3306/activiti"/>
???????<property name="jdbcUsername" value="root"/>
???????<property name="jdbcPassword" value="*****"/>
???????<!-- activiti數(shù)據(jù)庫(kù)表處理策略 不存在就創(chuàng)建表-->
???????<property name="databaseSchemaUpdate" value="true"/>
???</bean>
</beans>
配置講解:
?
b、添加log4j的配置(無(wú)需修改,直接粘):
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r[%15.15t] %-5p %30.30c %x - %m\n
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\XX\activiti.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r[%15.15t] %-5p %30.30c %x - %m\n
- 創(chuàng)建流程圖文件:
?
在創(chuàng)建好的文件中任意位置右鍵,選擇 View BPMN Diagram,打開(kāi)可視化界面(流程定義的界面
任意右鍵選擇定義流程:
?
?
?
?
解決圖片亂碼問(wèn)題
1.打開(kāi) IDEA 安裝路徑,找到如下的安裝目錄
追加一條命令: -Dfile.encoding=UTF-8
如下所示
至此activiti的準(zhǔn)備工作結(jié)束,一下是代碼部分:
一、demo代碼示例:
public class TestCreateTable {
???/**
????* 生成 activiti的數(shù)據(jù)庫(kù)表
????*/
???@Test
???public void testCreateDbTable() {
???????//使用classpath下的activiti.cfg.xml中的配置創(chuàng)建processEngine
???????//如果使用默認(rèn)則需要上面activiti.cfg.xml配置
???????ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
???????System.out.println(processEngine);
???}
???//部署
???@Test
???public void test01() {
???????//1、創(chuàng)建ProcessEngine
???????ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
???????//2、得到RepositoryService實(shí)例
???????RepositoryService repositoryService = processEngine.getRepositoryService();
???????//3、使用RepositoryService進(jìn)行部署
???????Deployment deploy = repositoryService.createDeployment().addClasspathResource("bpmn/chuchai.bpmn20.xml")
???????????????.addClasspathResource("bpmn/diagram.png")
???????????????.name("團(tuán)購(gòu)申請(qǐng)v1.0")
???????????????.deploy();
???????//4、輸出部署信息
???????System.out.println("部署id:"+deploy.getId());
???????System.out.println("部署的任務(wù)名稱:"+deploy.getName());
???}
???//啟動(dòng)流程
???@Test
???public void testDeploy() {
???????//1.創(chuàng)建ProcessEngine對(duì)象
???????ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
???????//創(chuàng)建TaskService
???????TaskService taskService = processEngine.getTaskService();
???????Map<String, Object> variables = new HashMap<>();
???????//張三就是在bpmn中Assignee配置的參數(shù)
???????variables.put("張三", "aaa");
???????//3.創(chuàng)建流程實(shí)例 ?流程定義的key需要知道?holiday
???????ProcessInstance processInstance = ProcessEngines.getDefaultProcessEngine()
???????????????.getRuntimeService()
???????????????.startProcessInstanceByKey("chuchai", variables);
???????Task tmp = taskService.createTaskQuery()
???????????????.processInstanceId(processInstance.getProcessInstanceId()).singleResult();
???????tmp.setAssignee("張三");
???????//完成此節(jié)點(diǎn)。由下一節(jié)點(diǎn)審批。完成后act_ru_task會(huì)創(chuàng)建一條由下節(jié)點(diǎn)審批的數(shù)據(jù)
???????taskService.complete(tmp.getId(),variables);
???????//4.輸出實(shí)例的相關(guān)信息
???????System.out.println( "流程部署ID:" + processInstance.getDeploymentId() );
???????System.out.println( "流程定義ID:" + processInstance.getProcessDefinitionId());
???????System.out.println( "流程實(shí)例ID:" + processInstance.getId() );
???????System.out.println( "活動(dòng)ID:" + processInstance.getActivityId() );
???}
???@Test
???//查詢?nèi)蝿?wù)
???public void test(){
???????ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
???????//創(chuàng)建TaskService
???????TaskService taskService = processEngine.getTaskService();
???????//根據(jù)流程key 和 任務(wù)負(fù)責(zé)人 查詢?nèi)蝿?wù)
???????List<Task> list = taskService.createTaskQuery()
???????????????.processDefinitionKey("chuchai") //流程Key
???????????????.taskAssignee("張三")//只查詢?cè)撊蝿?wù)負(fù)責(zé)人的任務(wù)
???????????????.list();
???????for (Task task : list) {
???????????System.out.println("流程實(shí)例id:" + task.getProcessInstanceId());
???????????System.out.println("任務(wù)id:" + task.getId());
???????????System.out.println("任務(wù)負(fù)責(zé)人:" + task.getAssignee());
???????????System.out.println("任務(wù)名稱:" + task.getName());
???????}
???}
???//審批流程
???@Test
???public void test1(){
???????//1.創(chuàng)建ProcessEngine對(duì)象
???????ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
???????//創(chuàng)建TaskService
???????TaskService taskService = processEngine.getTaskService();
???????//根據(jù)角色信息獲取自己的待辦
???????List<Task> T = taskService.createTaskQuery().taskAssignee("zs").list();
???????if(!ObjectUtils.isEmpty(T)) {
???????????for (Task item : T) {
???????????????Map<String, Object> variables = new HashMap<>();
???????????????variables.put("張三", "zs");
???????????????variables.put("isSuccess", true);
???????????????item.setAssignee("李四");
???????????????//增加審批備注
???????????????taskService.addComment(item.getId(),item.getProcessInstanceId(),"部門(mén)經(jīng)理同意");
???????????????//完成此次審批。由下節(jié)點(diǎn)審批
???????????????taskService.complete(item.getId(), variables);
???????????}
???????}
???}
???// 結(jié)束流程
???@Test
???public void test02() {
???????//1.創(chuàng)建ProcessEngine對(duì)象
???????ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
???????// ???????創(chuàng)建TaskService
???????TaskService taskService = processEngine.getTaskService();
???????//act_re_execution id
???????String taskId = "42503";
???????// ???????任務(wù)負(fù)責(zé)人
???????String assingee = "李四";
???????Task task = taskService.createTaskQuery()
???????????????.taskId(taskId)
???????????????.taskAssignee(assingee)
???????????????.singleResult();
???????if (task != null) {
???????????HashMap<String, Object> map = new HashMap<>();
???????????map.put("agree", 1);
???????????taskService.complete(taskId, map);
???????????System.out.println("完成任務(wù)");
???????}
???}
}
二、項(xiàng)目代碼示例:controller層代碼(這里是運(yùn)用到項(xiàng)目中的代碼)
@RestController
@RequestMapping("/activiti")
@Slf4j
public class ActivitiController {
???@Autowired
???private IActivitiService iActivitiService;
???//生成25張表
???@GetMapping
???public Result getTables(){
???????log.info("開(kāi)始生成表................................................................");
???????Result result = iActivitiService.getTable();
???????return result;
???}
???//流程部署
???@GetMapping("/bushu")
???public Result bushu(){
???????log.info("部署?");
? ? ? ?return Result.success("ok");
???}
???//查詢個(gè)人待執(zhí)行的任務(wù)
???@GetMapping("/list")
???public Result list(){
???????log.info("查詢個(gè)人待執(zhí)行的任務(wù)");
???????Result result = iActivitiService.list();
???????return result;
???}
???//結(jié)束
???@GetMapping("/complete")
???public Result complete(){
???????log.info("結(jié)束");
???????Result result = iActivitiService.complete();
???????return result;
???}
}
Service層代碼:
@Service
@Repository
@Slf4j
public class ActivitiServiceImpl implements IActivitiService {
???@Autowired
???public IActivitiMapper iActivitiMapper;
???@Override
???public Result getTable() {
???????//使用classpath下的activiti.cfg.xml中的配置創(chuàng)建processEngine
???????//如果使用默認(rèn)則需要上面activiti.cfg.xml配置
???????ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
???????return Result.success("生成表成功");
???}
???@Override
???public Result bushu() {
???????//1、創(chuàng)建ProcessEngine
???????ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
???????//2、得到RepositoryService實(shí)例
???????RepositoryService repositoryService = processEngine.getRepositoryService();
???????//3、使用RepositoryService進(jìn)行部署
???????Deployment deploy = repositoryService.createDeployment().addClasspathResource("activiti/groupactiviti.bpmn20.xml")
???????????????.addClasspathResource("activiti/groupactiviti.png")
???????????????.name("團(tuán)購(gòu)申請(qǐng)審批")
???????????????.deploy();
???????//4、輸出部署信息
???????log.info("部署id:"+deploy.getId());
???????log.info("部署的任務(wù)名稱:"+deploy.getName());
???????//5、啟動(dòng)流程定義 ??????根據(jù)流程定義的id啟動(dòng)流程???????????????????????????key:act_re_procdef中的KEY
???????//創(chuàng)建TaskService
???????TaskService taskService = processEngine.getTaskService();
???????Map<String, Object> variables = new HashMap<>();
???????String username = SecurityUtils.getLoginUser().getSysUser().getUserName();
// ???????String username = "admin";
???????//user就是在bpmn中Assignee配置的參數(shù)
???????variables.put("admin", username);
???????//3.創(chuàng)建流程實(shí)例 ?流程定義的key需要知道?holiday
???????ProcessInstance processInstance = ProcessEngines.getDefaultProcessEngine()
???????????????.getRuntimeService()
???????????????.startProcessInstanceByKey("groupactiviti", variables);
???????System.out.println(processInstance+"=============================================");
???????Task tmp = taskService.createTaskQuery()
???????????????.processInstanceId(processInstance.getProcessInstanceId()).singleResult();
???????tmp.setAssignee("ry");
???????//完成此節(jié)點(diǎn)。由下一節(jié)點(diǎn)審批。完成后act_ru_task會(huì)創(chuàng)建一條由下節(jié)點(diǎn)審批的數(shù)據(jù)
???????taskService.complete(tmp.getId(),variables);
???????//4.輸出實(shí)例的相關(guān)信息
???????log.info("流程部署ID:" + processInstance.getDeploymentId() );
???????log.info("流程定義ID:" + processInstance.getProcessDefinitionId());
???????log.info("流程實(shí)例ID:" + processInstance.getId());
???????log.info("活動(dòng)ID:" + processInstance.getActivityId());
???????return Result.success(true,"申請(qǐng)已提交");
???}
???//個(gè)人待執(zhí)行任務(wù)
???@Override
???public Result list() {
???????ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
???????TaskService taskService = defaultProcessEngine.getTaskService();
???????// 查詢當(dāng)前登錄人的任務(wù) 進(jìn)行完成
???????String username= SecurityUtils.getLoginUser().getSysUser().getUserName();
???????System.out.println("當(dāng)前登錄人"+username);
???????if (username == null){
???????????throw new CheckedException("當(dāng)前登錄人為空");
???????}
???????List<Task> task = taskService.createTaskQuery()
???????????????.processDefinitionKey("groupactiviti")
???????????????.taskAssignee(username)
???????????????.list();
???????System.out.println("==================="+task);
???????if(!ObjectUtils.isEmpty(task)) {
???????????for (Task item : task) {
???????????????Map<String, Object> variables = new HashMap<>();
???????????????if (username.equals("ry")){
???????????????????variables.put("ry", username);
???????????????????variables.put("isSuccess", true);
???????????????????item.setAssignee("aaa");
???????????????????//增加審批備注
???????????????????taskService.addComment(item.getId(),item.getProcessInstanceId(),"部門(mén)經(jīng)理已同意");
???????????????????//完成此次審批。由下節(jié)點(diǎn)審批??act_hi_taskinst會(huì)修改時(shí)間
???????????????????taskService.complete(item.getId(), variables);
???????????????}
???????????????if (username.equals("aaa")){
???????????????????variables.put("aaa", username);
???????????????????variables.put("isSuccess", true);
???????????????????item.setAssignee("aaa");
???????????????????//增加審批備注
???????????????????taskService.addComment(item.getId(),item.getProcessInstanceId(),"財(cái)務(wù)已同意");
???????????????????//完成此次審批。由下節(jié)點(diǎn)審批??act_hi_taskinst會(huì)修改時(shí)間
???????????????????taskService.complete(item.getId(), variables);
???????????????}
???????????}
???????}
???????return Result.success(true,"審核成功");
???}
???// 結(jié)束
???@Override
???public Result complete() {
???????//1.創(chuàng)建ProcessEngine對(duì)象
???????ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
???????//創(chuàng)建TaskService
???????TaskService taskService = processEngine.getTaskService();
???????// 獲取當(dāng)前登錄人 判斷是admin才結(jié)束任務(wù)
???????String username = SecurityUtils.getLoginUser().getSysUser().getUserName();
// ???????String username = "aaa";
???????if (username == null) {
???????????throw new CheckedException("當(dāng)前登錄人為空");
???????}
???????if (username.equals("aaa")) {
???????????//act_re_execution 任務(wù)id
???????????Task task = taskService.createTaskQuery()
???????????????????.processDefinitionKey("groupactiviti")
???????????????????.taskAssignee(username)
???????????????????.singleResult();
???????????if (task != null) {
???????????????HashMap<String, Object> map = new HashMap<>();
???????????????map.put("agree", 1);
???????????????taskService.complete(task.getId(), map);
???????????????System.out.println("完成任務(wù)");
???????????}
???????}
???????return Result.success(true,"審核成功");
???}
}
定義遠(yuǎn)程調(diào)用remote供別的服務(wù)調(diào)用
結(jié)構(gòu):
- ActivitiRemoteFallback代碼:
/**
* activiti服務(wù)降級(jí)處理
*
* @author?
*/
@Component
public class ActivitiRemoteFallback implements FallbackFactory<ActivitiRemoteService>
{
???private static final Logger log = LoggerFactory.getLogger(ActivitiRemoteFallback.class);
???@Override
???public ActivitiRemoteService create(Throwable cause) {
???????log.error("工作流調(diào)用失敗:{}", cause.getMessage());
???????return new ActivitiRemoteService(){
???????????@Override
???????????public Result getTables() {
???????????????return null;
???????????}
???????????@Override
???????????public Result bushu() {
???????????????return Result.error("遠(yuǎn)程調(diào)用工作流部署失敗");
???????????}
???????????@Override
???????????public Result list() {
???????????????return Result.error("遠(yuǎn)程調(diào)用工作流審核失敗");
???????????}
???????????@Override
???????????public Result complete() {
???????????????return Result.error("遠(yuǎn)程調(diào)用工作流結(jié)束審核失敗");
???????????}
???????};
???}
}
- ActivitiRemoteService代碼:
/**
* 用戶服務(wù)
*
* @author bawei
*/
@FeignClient(contextId = "rctivitiRemoteService",
???????value = ServiceNameConstants.****自己的文件名,
???????fallbackFactory = ActivitiRemoteFallback.class,path = "/activiti")
public interface ActivitiRemoteService {
???//生成25張表
???@GetMapping
???public Result getTables();
???//流程部署
???@GetMapping("/bushu")
???public Result bushu();
???//查詢個(gè)人待執(zhí)行的任務(wù)
???@GetMapping("/list")
???public Result list();
???//結(jié)束
???@GetMapping("/complete")
???public Result complete();
}文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-676801.html
- org.springframework.boot.autoconfigure.AutoConfiguration.imports配置的代碼
最后:在需要使用Activiti的地方直接注入該服務(wù)即可文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-676801.html
到了這里,關(guān)于若依框架SpringBoot+Activiti工作流的使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!