0


若依框架SpringBoot+Activiti工作流的使用

使用简介:本技术点主要是针对类审批的业务流程的建模,可以有:任务发布(即流程开始)到一级一级的审批到最终结束(即流程结束)一整套完备的模型

1、idea下载activiti插件

  1. ider以前版本下载actiBPM,但是新版ider这个插件已经被淘汰,已经被下面这个替代

2、单独起一个activiti服务

3、添加依赖在activiti服务中:

<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、添加配置

我这里的服务结构:

a、activiti.cfg.xml的配置(直接粘,需要修改为自己的数据库):

<?**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">

** **

  • *<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="*****"/> ****
  •   *<property name="databaseSchemaUpdate" value="true"/>
    
    </bean> </beans>

配置讲解:

b、添加log4j的配置(无需修改,直接粘):

# 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

  1. 创建流程图文件:

在创建好的文件中任意位置右键,选择 View BPMN Diagram,打开可视化界面(流程定义的界面

任意右键选择定义流程:

解决图片乱码问题

1.打开 IDEA 安装路径,找到如下的安装目录

追加一条命令: -Dfile.encoding=UTF-8
如下所示

至此activiti的准备工作结束,一下是代码部分:

一、demo代码示例:
public class TestCreateTable {
/**
** * ***生成 activiti的数据库表*

  • ****/**
  • @Test
    public void testCreateDbTable() {
    **//使用classpath**
    下的activiti.cfg.xml中的配置创建*processEngine

** //如果使用默认则需要上面activiti.cfg.xml**配置

  •   *ProcessEngine processEngine = ProcessEngines.**getDefaultProcessEngine**();
      System.**out**.println(processEngine);
    

    }

    **//**部署

  • @Test
    public void test01() {
    //1
    、创建*ProcessEngine

  •   *ProcessEngine processEngine = ProcessEngines.**getDefaultProcessEngine**();
      **//2****、得到****RepositoryService****实例**
    
  •   *RepositoryService repositoryService = processEngine.getRepositoryService();
      **//3****、使用****RepositoryService****进行部署**
    
  •   *Deployment deploy = repositoryService.createDeployment().addClasspathResource("bpmn/chuchai.bpmn20.xml")
             .addClasspathResource("bpmn/diagram.png")
             .name("团购申请v1.0")
             .deploy();
      **//4****、输出部署信息**
    
  •   *System.**out**.println("部署id:"+deploy.getId());
      System.**out**.println("部署的任务名称:"+deploy.getName());
    

    }

    **//**启动流程

  • @Test
    public void testDeploy() {
    **//1.创建ProcessEngine**
    对象*

  •   *ProcessEngine processEngine = ProcessEngines.**getDefaultProcessEngine**();
      **//****创建****TaskService**
    
  •   *TaskService taskService = processEngine.getTaskService();
    
      Map<String, Object> variables = new HashMap<>();
      **//****张三就是在****bpmn****中****Assignee****配置的参数**
    
  •   *variables.put("张三", "aaa");
      **//3.****创建流程实例  流程定义的****key****需要知道**** holiday**
    
  •   *ProcessInstance processInstance = ProcessEngines.**getDefaultProcessEngine**()
             .getRuntimeService()
             .startProcessInstanceByKey("chuchai", variables);
      Task tmp = taskService.createTaskQuery()
             .processInstanceId(processInstance.getProcessInstanceId()).singleResult();
      tmp.setAssignee("张三");
      **//****完成此节点。由下一节点审批。完成后****act_ru_task****会创建一条由下节点审批的数据**
    
  •   *taskService.complete(tmp.getId(),variables);
      **//4.****输出实例的相关信息**
    
  •   *System.**out**.println( "流程部署ID:" + processInstance.getDeploymentId() );
      System.**out**.println( "流程定义ID:" + processInstance.getProcessDefinitionId());
      System.**out**.println( "流程实例ID:" + processInstance.getId() );
      System.**out**.println( "活动ID:" + processInstance.getActivityId() );
    

    }

    @Test
    **//**查询任务

  • *public void test(){
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    **//创建TaskService**

  •   *TaskService taskService = processEngine.getTaskService();
      **//****根据流程****key ****和 任务负责人 查询任务**
    
  •   *List<Task> list = taskService.createTaskQuery()
             .processDefinitionKey("chuchai") **//****流程****Key**
    
  •           *.taskAssignee("张三")**//****只查询该任务负责人的任务**
    
  •           *.list();
    
      for (Task task : list) {
          System.**out**.println("流程实例id:" + task.getProcessInstanceId());
         System.out.println("任务id:" + task.getId());
         System.out.println("任务负责人:" + task.getAssignee());
         System.out.println("任务名称:" + task.getName());
     }
    

    }

    **//**审批流程

  • @Test
    public void test1(){
    **//1.创建ProcessEngine**
    对象*

  •   *ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
      **//****创建****TaskService**
    
  •   *TaskService taskService = processEngine.getTaskService();
      **//****根据角色信息获取自己的待办**
    
  •   *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(),"部门经理同意");
              **//****完成此次审批。由下节点审批**
    
  •           *taskService.complete(item.getId(), variables);
         }
     }
    

    }

    **// **结束流程

  • @Test
    public void test02() {
    **//1.创建ProcessEngine**
    对象*

  •   *ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
      **//        ****创建****TaskService**
    
  •   *TaskService taskService = processEngine.getTaskService();
      **//act_re_execution id**
    
  •   *String taskId = "42503";
      **//        ****任务负责人**
    
  •   *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("完成任务");
     }
    

    }

}

二、项目代码示例:controller层代码(这里是运用到项目中的代码)

@RestController
@RequestMapping("/activiti")
@Slf4j
public class ActivitiController {

@Autowired
private IActivitiService iActivitiService;
**//****生成****25****张表**
  • *@GetMapping
    public Result getTables(){
    log.info("开始生成表................................................................");
    Result result = iActivitiService.getTable();
    return result;
    }

    **//**流程部署

  • *@GetMapping("/bushu")
    public Result bushu(){
    log.info("部署 ");

  •   *return Result.**success**("ok");
    

    }

    **//**查询个人待执行的任务

  • *@GetMapping("/list")
    public Result list(){
    log.info("查询个人待执行的任务");
    Result result = iActivitiService.list();
    return result;
    }

    **//**结束

  • *@GetMapping("/complete")
    public Result complete(){
    log.info("结束");
    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****中的配置创建****processEngine**

** //如果使用默认则需要上面activiti.cfg.xml**配置

  •   *ProcessEngine processEngine = ProcessEngines.**getDefaultProcessEngine**();
      return Result.**success**("生成表成功");
    

    }

    @Override
    public Result bushu() {
    //1、创建ProcessEngine

  •   *ProcessEngine processEngine = ProcessEngines.**getDefaultProcessEngine**();
      **//2****、得到****RepositoryService****实例**
    
  •   *RepositoryService repositoryService = processEngine.getRepositoryService();
      **//3****、使用****RepositoryService****进行部署**
    
  •   *Deployment deploy = repositoryService.createDeployment().addClasspathResource("activiti/groupactiviti.bpmn20.xml")
             .addClasspathResource("activiti/groupactiviti.png")
             .name("团购申请审批")
             .deploy();
      **//4****、输出部署信息**
    
  •   ***log**.info("部署id:"+deploy.getId());
      **log**.info("部署的任务名称:"+deploy.getName());
    
      **//5****、启动流程定义       根据流程定义的****id****启动流程****                           key:act_re_procdef****中的****KEY**
    

** //创建TaskService**

  •   *TaskService taskService = processEngine.getTaskService();
    
      Map<String, Object> variables = new HashMap<>();
      String username = SecurityUtils.**getLoginUser**().getSysUser().getUserName();
    

// String username = "admin";
** //user就是在bpmnAssignee**配置的参数

  •   *variables.put("admin", username);
      **//3.****创建流程实例  流程定义的****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");
      **//****完成此节点。由下一节点审批。完成后****act_ru_task****会创建一条由下节点审批的数据**
    
  •   *taskService.complete(tmp.getId(),variables);
      **//4.****输出实例的相关信息**
    
  •   ***log**.info("流程部署ID:" + processInstance.getDeploymentId() );
      **log**.info("流程定义ID:" + processInstance.getProcessDefinitionId());
      **log**.info("流程实例ID:" + processInstance.getId());
      **log**.info("活动ID:" + processInstance.getActivityId());
      return Result.**success**(true,"申请已提交");
    

    }

    **//**个人待执行任务

  • *@Override
    public Result list() {
    ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
    TaskService taskService = defaultProcessEngine.getTaskService();
    **// **查询当前登录人的任务 进行完成

  •   *String username= SecurityUtils.**getLoginUser**().getSysUser().getUserName();
      System.**out**.println("当前登录人"+username);
    
  •   *if (username == null){
          throw new CheckedException("当前登录人为空");
     }
      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(),"部门经理已同意");
                  **//****完成此次审批。由下节点审批****  act_hi_taskinst****会修改时间**
    
  •               *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(),"财务已同意");
                  **//****完成此次审批。由下节点审批****  act_hi_taskinst****会修改时间**
    
  •               *taskService.complete(item.getId(), variables);
             }
         }
     }
      return Result.**success**(true,"审核成功");
    

    }

    **// **结束

  • @Override
    public Result complete() {
    **//1.创建ProcessEngine**
    对象*

  •   *ProcessEngine processEngine = ProcessEngines.**getDefaultProcessEngine**();
      **//****创建****TaskService**
    
  •   *TaskService taskService = processEngine.getTaskService();
      **// ****获取当前登录人 判断是****admin****才结束任务**
    
  •   *String username = SecurityUtils.**getLoginUser**().getSysUser().getUserName();
    

// String username = "aaa";

  •   *if (username == null) {
          throw new CheckedException("当前登录人为空");
     }
      if (username.equals("aaa")) {
          **//act_re_execution ****任务****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("完成任务");
         }
     }
      return Result.**success**(true,"审核成功");
    
    }

}

定义远程调用remote供别的服务调用

结构:

  1. ActivitiRemoteFallback代码:

/**
*** activiti**服务降级处理


*** @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("工作流调用失败:{}", cause.getMessage());
    return new ActivitiRemoteService(){

        @Override
        public Result getTables() {
            return null;
       }

        @Override
        public Result bushu() {
            return Result.**error**("远程调用工作流部署失败");
       }

        @Override
        public Result list() {
            return Result.**error**("远程调用工作流审核失败");
       }

        @Override
        public Result complete() {
            return Result.**error**("远程调用工作流结束审核失败");
       }
   };

}
}

  1. ActivitiRemoteService****代码:

/**
*** **用户服务


*** @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();

    **//**查询个人待执行的任务

  • *@GetMapping("/list")
    public Result list();
    **//**结束

  • *@GetMapping("/complete")
    public Result complete();
    }

  1. org.springframework.boot.autoconfigure.AutoConfiguration.imports****配置的代码

最后:在需要使用Activiti的地方直接注入该服务即可

标签: spring boot 后端 java

本文转载自: https://blog.csdn.net/2301_76373453/article/details/131498574
版权归原作者 小陈呀~ 所有, 如有侵权,请联系我们删除。

“若依框架SpringBoot+Activiti工作流的使用”的评论:

还没有评论