Activiti 初级入门项目

Posted blackcatfish

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Activiti 初级入门项目相关的知识,希望对你有一定的参考价值。

刚刚使用了activity做了一个项目,第一次就腆着脸给写出来吧!!!

审批流肯定要创建流程图,再编辑器上装bpm插件  

 

 

 技术图片

 

 装完就可以使用了

技术图片

 

 要创建在resources/processes/新建个文件夹叫processes 不然会报错:

Caused by: java.io.FileNotFoundException: class path resource [processes/] cannot be resolved to URL because it does not exist
    at org.springframework.core.io.ClassPathResource.getURL(ClassPathResource.java:195)
    at org.springframework.core.io.support.PathMatchingResourcePatternResolver.findPathMatchingResources(PathMatchingResourcePatternResolver.java:495)
    at org.springframework.core.io.support.PathMatchingResourcePatternResolver.getResources(PathMatchingResourcePatternResolver.java:296)
    at org.springframework.context.support.AbstractApplicationContext.getResources(AbstractApplicationContext.java:1305)
    at org.springframework.context.support.GenericApplicationContext.getResources(GenericApplicationContext.java:238)
    at org.activiti.spring.boot.AbstractProcessEngineConfiguration.discoverProcessDefinitionResources(AbstractProcessEngineConfiguration.java:80)
    at org.activiti.spring.boot.AbstractProcessEngineAutoConfiguration.baseSpringProcessEngineConfiguration(AbstractProcessEngineAutoConfiguration.java:75)
    at org.activiti.spring.boot.DataSourceProcessEngineAutoConfiguration$DataSourceProcessEngineConfiguration.springProcessEngineConfiguration(DataSourceProcessEngineAutoConfiguration.java:57)
    at org.activiti.spring.boot.DataSourceProcessEngineAutoConfiguration$DataSourceProcessEngineConfiguration$$EnhancerBySpringCGLIB$$baa326a5.CGLIB$springProcessEngineConfiguration$1(<generated>)
    at org.activiti.spring.boot.DataSourceProcessEngineAutoConfiguration$DataSourceProcessEngineConfiguration$$EnhancerBySpringCGLIB$$baa326a5$$FastClassBySpringCGLIB$$cc2270af.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:361)
    at org.activiti.spring.boot.DataSourceProcessEngineAutoConfiguration$DataSourceProcessEngineConfiguration$$EnhancerBySpringCGLIB$$baa326a5.springProcessEngineConfiguration(<generated>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
    ... 86 common frames omitted

Caused by: java.io.FileNotFoundException: class path resource [processes/] cannot be resolved to URL because it does not exist 不存在这个文件夹

解决方法2在配置文件中配置:

在application.properties文件加配置

# spring-activiti

# 自动部署验证设置:true-开启(默认)、false-关闭

spring.activiti.check-process-definitions=false

技术图片

 

 如上流程图就是这么简单 但是这文件可以用文本方式打开代码如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" 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" xmlns:tns="http://www.activiti.org/test" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" expressionLanguage="http://www.w3.org/1999/XPath" id="m1587032668414" name="" targetNamespace="http://www.activiti.org/test" typeLanguage="http://www.w3.org/2001/XMLSchema">
  <process id="apply" isClosed="false" isExecutable="true" name="创建申请" processType="None">
    <startEvent id="_2" name="StartEvent">
      <extensionElements>
        <activiti:executionListener class="com.cmbchina.ccd.itpm.listener.SubmitListener" event="start"/>
      </extensionElements>
    </startEvent>
    <userTask activiti:assignee="${zgsp}" activiti:exclusive="true" id="_7" name="主管审批"/>
    <exclusiveGateway gatewayDirection="Unspecified" id="_9" name="ExclusiveGateway"/>
    <sequenceFlow id="_10" sourceRef="_7" targetRef="_9"/>
    <userTask activiti:assignee="${assignee}" activiti:exclusive="true" id="_11" name="项目管理员审批">
      <multiInstanceLoopCharacteristics activiti:collection="${pmoList}" activiti:elementVariable="assignee" isSequential="false">
        <completionCondition><![CDATA[${nrOfCompletedInstances/nrOfInstances > 0}]]></completionCondition>
      </multiInstanceLoopCharacteristics>
    </userTask>
    <sequenceFlow id="_12" name="通过" sourceRef="_9" targetRef="_11">
      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition==1}]]></conditionExpression>
    </sequenceFlow>
    <userTask activiti:assignee="${xmszgsp}" activiti:exclusive="true" id="_13" name="项目室主管审批"/>
    <exclusiveGateway gatewayDirection="Unspecified" id="_14" name="ExclusiveGateway"/>
    <sequenceFlow id="_16" name="通过" sourceRef="_14" targetRef="_13">
      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition==1}]]></conditionExpression>
    </sequenceFlow>
    <endEvent id="_17" name="EndEvent"/>
    <sequenceFlow id="_22" sourceRef="_2" targetRef="_7"/>
    <sequenceFlow id="_23" sourceRef="_11" targetRef="_14"/>
    <sequenceFlow id="_24" sourceRef="_13" targetRef="_17"/>
    <sequenceFlow id="_25" name="不通过" sourceRef="_14" targetRef="_17">
      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition==0}]]></conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="_26" name="不通过" sourceRef="_9" targetRef="_17">
      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition==0}]]></conditionExpression>
    </sequenceFlow>
  </process>
  <bpmndi:BPMNDiagram documentation="background=#3C3F41;count=1;horizontalcount=1;orientation=0;width=842.4;height=1195.2;imageableWidth=832.4;imageableHeight=1185.2;imageableX=5.0;imageableY=5.0" id="Diagram-_1" name="New Diagram">
    <bpmndi:BPMNPlane bpmnElement="apply">
      <bpmndi:BPMNShape bpmnElement="_2" id="Shape-_2">
        <omgdc:Bounds height="32.0" width="32.0" x="45.0" y="35.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="_7" id="Shape-_7">
        <omgdc:Bounds height="55.0" width="85.0" x="215.0" y="25.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="55.0" width="85.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="_9" id="Shape-_9" isMarkerVisible="false">
        <omgdc:Bounds height="32.0" width="32.0" x="430.0" y="30.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="_11" id="Shape-_11">
        <omgdc:Bounds height="55.0" width="85.0" x="620.0" y="20.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="55.0" width="85.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="_13" id="Shape-_13">
        <omgdc:Bounds height="55.0" width="85.0" x="405.0" y="295.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="55.0" width="85.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="_14" id="Shape-_14" isMarkerVisible="false">
        <omgdc:Bounds height="32.0" width="32.0" x="635.0" y="190.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="_17" id="Shape-_17">
        <omgdc:Bounds height="32.0" width="32.0" x="430.0" y="190.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="_24" id="BPMNEdge__24" sourceElement="_13" targetElement="_17">
        <omgdi:waypoint x="446.0" y="295.0"/>
        <omgdi:waypoint x="446.0" y="222.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="_12" id="BPMNEdge__12" sourceElement="_9" targetElement="_11">
        <omgdi:waypoint x="461.0" y="45.0"/>
        <omgdi:waypoint x="545.0" y="45.0"/>
        <omgdi:waypoint x="620.0" y="45.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="6.0" width="4.0" x="0.0" y="-2.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="_23" id="BPMNEdge__23" sourceElement="_11" targetElement="_14">
        <omgdi:waypoint x="650.0" y="75.0"/>
        <omgdi:waypoint x="650.0" y="130.0"/>
        <omgdi:waypoint x="650.0" y="191.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="_26" id="BPMNEdge__26" sourceElement="_9" targetElement="_17">
        <omgdi:waypoint x="445.0" y="61.0"/>
        <omgdi:waypoint x="445.0" y="126.0"/>
        <omgdi:waypoint x="445.0" y="190.0312805773287"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="-1.0" width="0.0" x="0.0" y="10.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="_25" id="BPMNEdge__25" sourceElement="_14" targetElement="_17">
        <omgdi:waypoint x="636.0" y="205.0"/>
        <omgdi:waypoint x="529.0" y="205.0"/>
        <omgdi:waypoint x="461.9687194226713" y="205.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="_16" id="BPMNEdge__16" sourceElement="_14" targetElement="_13">
        <omgdi:waypoint x="650.0" y="221.0"/>
        <omgdi:waypoint x="650.0" y="313.0"/>
        <omgdi:waypoint x="490.0" y="313.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="_22" id="BPMNEdge__22" sourceElement="_2" targetElement="_7">
        <omgdi:waypoint x="76.96871942267131" y="50.0"/>
        <omgdi:waypoint x="133.0" y="50.0"/>
        <omgdi:waypoint x="215.0" y="50.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="_10" id="BPMNEdge__10" sourceElement="_7" targetElement="_9">
        <omgdi:waypoint x="300.0" y="45.0"/>
        <omgdi:waypoint x="360.0" y="45.0"/>
        <omgdi:waypoint x="431.0" y="45.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

这这里面有牵涉到多个项目管理员审批 一个人通过就是通过了 这属于多实例的一种,当时处理起来我有点不知道怎么处理 所以搜寻了很多的资料 (这可能是我不知道怎么搜索所以花费了不少时间)

最终就用了一句话

<![CDATA[${nrOfCompletedInstances/nrOfInstances > 0}]]>
这里的nrOfCompletedInstances 相当于处理人数nrOfInstances:需要处理的人数
我的需求是只要有一人处理就行 那就商大于0就OK 要是都需要处理 那就是 商恒等于0 哈哈原来这么简单
我这个应该只是工作流中的九牛一毛 里面有很多学问。有机会多多和博友交流
嘻嘻

以上是关于Activiti 初级入门项目的主要内容,如果未能解决你的问题,请参考以下文章

Activiti 入门学习笔记

Activiti 入门学习笔记

2021全网最全Activiti7教程02(Activiti7入门使用-欢迎收藏)

2021全网最全Activiti7教程02(Activiti7入门使用-欢迎收藏)

SpringBoot入门十四,添加Activiti5.22工作流

框架 day55 BOS项目练习(工作流,activiti入门)