Activiti7 代码创建流程定义及生成bpmn及svg文件

1. 实现流程

使用代码创建一个如下图的流程定义:

2. 实现代码

2.1 创建项目

创建项目 Activiti03SpringBootGeneratorDemo

在 resources 目录下新建文件夹 bpmn

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.zsoft</groupId>
    <artifactId>act-springboot</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Activiti03SpringBootDemo</name>
    <description>Activiti03SpringBootDemo</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <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>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- 添加的依赖包 -->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring-boot-starter</artifactId>
            <version>7.0.0.Beta2</version>
        </dependency>
        <!-- 生成 bpmn 文件 -->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-bpmn-layout</artifactId>
            <version>7.0.0.Beta2</version>
        </dependency>
        <!-- 生成 svg 图片 -->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-image-generator</artifactId>
            <version>7.0.0.Beta2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.22</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.22</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

2.2 配置文件

resources/application.properties

# 配置 Spring 的数据源
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://10.2.179.225:3306/activiti?characterEncoding=utf-8&nullCatalogMeansCurrent=true&serverTimezone=UTC
spring.datasource.username=activiti
spring.datasource.password=activiti

# Activiti 的配置
spring.activiti.database-schema-update=true
spring.activiti.db-history-used=true
spring.activiti.history-level=full
spring.activiti.check-process-definitions=false

2.3 SpringSecurity 配置类

main/java/com.zsoft.actspringboot.config/SpringSecurityConfiguration.java

package com.zsoft.actspringboot.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

@Configuration
public class SpringSecurityConfiguration {
    private Logger logger = LoggerFactory.getLogger(SpringSecurityConfiguration.class);
    @Bean
    public UserDetailsService myUserDetailsService() {
        // 基于内存存储用户,测试时候可以使用此方式
        InMemoryUserDetailsManager inMemoryUserDetailsManager = new InMemoryUserDetailsManager();
        //这里添加用户,后面处理流程时用到的任务负责人,需要添加在这里
        String[][] usersGroupsAndRoles = {
                {"zhangsan", "password", "ROLE_ACTIVITI_USER", "GROUP_activitiTeam"},
                {"lishi", "password", "ROLE_ACTIVITI_USER", "GROUP_activitiTeam"},
                {"wangwu", "password", "ROLE_ACTIVITI_USER", "GROUP_activitiTeam"},
                {"zhaoliu", "password", "ROLE_ACTIVITI_USER", "GROUP_otherTeam"},
                {"renshi1", "password", "ROLE_ACTIVITI_USER", "GROUP_otherTeam"},
                {"renshi2", "password", "ROLE_ACTIVITI_USER", "GROUP_otherTeam"},
                {"system", "password", "ROLE_ACTIVITI_USER"},
                {"admin", "password", "ROLE_ACTIVITI_ADMIN"},
        };

        for (String[] user : usersGroupsAndRoles) {
            List<String> authoritiesStrings = Arrays.asList(Arrays.copyOfRange(user, 2, user.length));
            logger.info("> Registering new user: " + user[0] + " with the following Authorities[" + authoritiesStrings + "]");
            inMemoryUserDetailsManager.createUser(new User(user[0], passwordEncoder().encode(user[1]),
                    authoritiesStrings.stream().map(s -> new SimpleGrantedAuthority(s)).collect(Collectors.toList())));
        }

        return inMemoryUserDetailsManager;
    }
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

2.4 新建出差申请单的 POJO 对象

java/com.zsoft.actspringboot.pojo/Evection.java

package com.zsoft.actspringboot.pojo;

import lombok.Data;

import java.io.Serializable;
import java.util.Date;

/**
 * 出差申请单的 POJO 对象
 * 必须序列化,实现 Serializable 接口
 */
@Data
public class Evection implements Serializable {

    private Long id;

    private String evectionName;

    /**
     * 出差的天数
     */
    private double num;

    private Date beginDate;
    private Date endDate;
    private String destination;
    private String reason;
}

2.5 SpringSecurity 工具类

java/com.zsoft.actspringboot/utils/SecurityUtil.java

package com.zsoft.actspringboot.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.context.SecurityContextImpl;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.stereotype.Component;

import java.util.Collection;

@Component
public class SecurityUtil {
    private Logger logger = LoggerFactory.getLogger(SecurityUtil.class);

    @Autowired
    @Qualifier("myUserDetailsService")
    private UserDetailsService userDetailsService;

    public void logInAs(String username) {
        UserDetails user = userDetailsService.loadUserByUsername(username);

        if (user == null) {
            throw new IllegalStateException("User " + username + " doesn't exist, please provide a valid user");
        }
        logger.info("> Logged in as: " + username);

        SecurityContextHolder.setContext(
                new SecurityContextImpl(
                        new Authentication() {
                            @Override
                            public Collection<? extends GrantedAuthority> getAuthorities() {
                                return user.getAuthorities();
                            }

                            @Override
                            public Object getCredentials() {
                                return user.getPassword();
                            }

                            @Override
                            public Object getDetails() {
                                return user;
                            }

                            @Override
                            public Object getPrincipal() {
                                return user;
                            }

                            @Override
                            public boolean isAuthenticated() {
                                return true;
                            }

                            @Override
                            public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException {
                            }

                            @Override
                            public String getName() {
                                return user.getUsername();
                            }
                        }));
        org.activiti.engine.impl.identity.Authentication.setAuthenticatedUserId(username);
    }
}

2.6 启动类

java/com.zsoft.actspringboot/Activiti03SpringBootDemoApplication.java

package com.zsoft.actspringboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Activiti03SpringBootDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(Activiti03SpringBootDemoApplication.class, args);
    }

}

2.7 测试类

test/java/com.zsoft.actspringboot/Activiti03SpringBootGenerateTests.java

@SpringBootTest
class Activiti03SpringBootGenerateTests {

    final String PROCESSID = "evection-generate";
    final String PROCESSNAME = "出差申请单-动态生成";

    @Autowired
    private TaskRuntime taskRuntime;
    @Autowired
    private RepositoryService repositoryService;
    @Autowired
    private RuntimeService runtimeService;
    
    。。。
}

下面的测试方法都是写在这个类中的;

2.7.1 创建初始化表

数据库为新建的 activiti 库,因此要先将 Activiti 默认的表自动建出来

/**
 * 创建初始化表
 */
@Test
void contextLoads() {
    System.out.println(taskRuntime);
}

运行,在 activiti 库中会自动创建出 25 张表;

2.7.2 创建流程定义及部署

/**
 * 创建流程定义及部署
 */
@Test
public void generateProcess() {

    System.out.println("--------- start ---------");
    BpmnModel bpmnModel = new BpmnModel();
    Process process = new Process();
    bpmnModel.addProcess(process);
    process.setId(PROCESSID);
    process.setName(PROCESSNAME);

    // 添加开始节点
    process.addFlowElement(generateStartEvent());

    // 添加用户节点
    process.addFlowElement(generateUserTask("task1", "填写申请单", "", "", "activitiTeam"));
    process.addFlowElement(generateUserTask("task2", "技术经理", "zhangsan", "", ""));
    process.addFlowElement(generateUserTask("task3", "人事经理", "", "renshi1,renshi2", ""));
    process.addFlowElement(generateUserTask("task4", "项目经理", "lisi", "", ""));
    process.addFlowElement(generateUserTask("task5", "总经理", "wangwu", "", ""));

    // 添加包含网关
    process.addFlowElement(generateInclusiveGateway("inclusiveGateway1"));
    process.addFlowElement(generateInclusiveGateway("inclusiveGateway2"));

    // 添加排他网关
    process.addFlowElement(generateExclusiveGateway("exclusiveGateway1"));

    // 添加结束节点
    process.addFlowElement(generateEndEvent());

    // 设置连接线
    process.addFlowElement(generateSequenceFlow("startEvent", "task1", "", ""));

    process.addFlowElement(generateSequenceFlow("task1", "inclusiveGateway1", "", ""));
    process.addFlowElement(generateSequenceFlow("inclusiveGateway1", "task2", "大于等于3天", "${evection.num>=3}"));
    process.addFlowElement(generateSequenceFlow("inclusiveGateway1", "task3", "", ""));
    process.addFlowElement(generateSequenceFlow("inclusiveGateway1", "task4", "小于3天", "${evection.num<3}"));

    process.addFlowElement(generateSequenceFlow("task2", "inclusiveGateway2", "", ""));
    process.addFlowElement(generateSequenceFlow("task3", "inclusiveGateway2", "", ""));
    process.addFlowElement(generateSequenceFlow("task4", "inclusiveGateway2", "", ""));

    process.addFlowElement(generateSequenceFlow("inclusiveGateway2", "exclusiveGateway1", "", ""));
    process.addFlowElement(generateSequenceFlow("exclusiveGateway1", "task5", "大于等于3天", "${evection.num>=3}"));
    process.addFlowElement(generateSequenceFlow("exclusiveGateway1", "endEvent", "小于3天", "${evection.num<3}"));
    process.addFlowElement(generateSequenceFlow("task5", "endEvent", "", ""));

    new BpmnAutoLayout(bpmnModel).execute();

    // 部署流程
    Deployment deploy = repositoryService.createDeployment().addBpmnModel(PROCESSID + ".bpmn", bpmnModel).name(PROCESSNAME).deploy();

    System.out.println("流程名称:" + deploy.getName());
    System.out.println("流程定义ID:" + deploy.getId());
}

/**
 * 生成开始节点
 * @return
 */
private StartEvent generateStartEvent() {
    StartEvent startEvent = new StartEvent();
    startEvent.setId("startEvent");
    return startEvent;
}

/**
 * 生成任务节点
 * 不填的项传 ""
 * @return
 */
private UserTask generateUserTask(String id, String name, String assignee, String candidateUsers, String candidateGroups) {
    List<String> candidateUserList = new ArrayList<>();
    String[] users = candidateUsers.split(",");
    for (String user : users) {
        candidateUserList.add(user);
    }

    List<String> candidateGroupList = new ArrayList<>();
    String[] groups = candidateGroups.split(",");
    for (String group : groups) {
        candidateGroupList.add(group);
    }

    UserTask userTask = new UserTask();
    userTask.setId(id);
    userTask.setName(name);
    userTask.setAssignee(assignee);
    userTask.setCandidateUsers(candidateUserList);
    userTask.setCandidateGroups(candidateGroupList);

    return userTask;
}

/**
 * 创建包含网关
 * @param id
 * @return
 */
private InclusiveGateway generateInclusiveGateway(String id) {
    InclusiveGateway inclusiveGateway = new InclusiveGateway();
    inclusiveGateway.setId(id);
    return inclusiveGateway;
}

/**
 * 创建排他网关
 * @param id
 * @return
 */
private ExclusiveGateway generateExclusiveGateway(String id) {
    ExclusiveGateway exclusiveGateway = new ExclusiveGateway();
    exclusiveGateway.setId(id);
    return exclusiveGateway;
}

/**
 * 创建连接线
 * @param from
 * @param to
 * @param name
 * @param conditionExpression
 * @return
 */
private SequenceFlow generateSequenceFlow(String from, String to, String name, String conditionExpression) {
    SequenceFlow sequenceFlow = new SequenceFlow();
    sequenceFlow.setSourceRef(from);
    sequenceFlow.setTargetRef(to);
    sequenceFlow.setName(name);
    if(StringUtils.isNotEmpty(conditionExpression)) {
        sequenceFlow.setConditionExpression(conditionExpression);
    }

    return sequenceFlow;
}

/**
 * 创建结束节点
 * @return
 */
private EndEvent generateEndEvent() {
    EndEvent endEvent = new EndEvent();
    endEvent.setId("endEvent");
    return endEvent;
}

运行,输出:

流程名称:出差申请单-动态生成
流程定义ID:8703bb0b-1f95-11ed-b9f8-e884a5ae27f6

查看流程定义表 ACT_RE_PROCDEF

MySQL [activiti]> select * from ACT_RE_PROCDEF\G;                                                                                                                    
*************************** 1. row ***************************                                                                                                       
                    ID_: evection-generate:1:87217c3d-1f95-11ed-b9f8-e884a5ae27f6                                                                                    
                   REV_: 1                                                                                                                                           
              CATEGORY_: http://www.activiti.org/test                                                                                                                
                  NAME_: 出 差 申 请 单 -动 态 生 成                                                                                                                          
                   KEY_: evection-generate                                                                                                                           
               VERSION_: 1                                                                                                                                           
         DEPLOYMENT_ID_: 8703bb0b-1f95-11ed-b9f8-e884a5ae27f6                                                                                                        
         RESOURCE_NAME_: evection-generate.bpmn                                                                                                                      
    DGRM_RESOURCE_NAME_: NULL                                                                                                                                        
           DESCRIPTION_: NULL                                                                                                                                        
    HAS_START_FORM_KEY_: 0                                                                                                                                           
HAS_GRAPHICAL_NOTATION_: 1                                                                                                                                           
      SUSPENSION_STATE_: 1                                                                                                                                           
             TENANT_ID_:                                                                                                                                             
        ENGINE_VERSION_: NULL                                                                                                                                        
1 row in set (0.00 sec)   

查看部署表 ACT_RE_DEPLOYMENT

MySQL [activiti]> select * from ACT_RE_DEPLOYMENT;                                                                                                                   
+--------------------------------------+------------------------------+-----------+------+------------+-------------------------+-----------------+                  
| ID_                                  | NAME_                        | CATEGORY_ | KEY_ | TENANT_ID_ | DEPLOY_TIME_            | ENGINE_VERSION_ |                  
+--------------------------------------+------------------------------+-----------+------+------------+-------------------------+-----------------+                  
| 8703bb0b-1f95-11ed-b9f8-e884a5ae27f6 | 出 差 申 请 单 -动 态 生 成           | NULL      | NULL |            | 2022-08-19 08:04:19.411 | NULL            |                  
+--------------------------------------+------------------------------+-----------+------+------------+-------------------------+-----------------+                  
1 row in set (0.00 sec)   

2.7.3 启动流程

/**
 * 启动流程
 */
@Test
public void test01() {
    Evection evection = new Evection();
    evection.setNum(4d);
    Map<String, Object> map = new HashMap<>();
    map.put("evection", evection);

    ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(PROCESSID, map);

    System.out.println("流程实例名称:" + processInstance.getName());
    System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId());
}

执行,输出:

流程实例名称:null
流程定义ID:evection-generate:1:87217c3d-1f95-11ed-b9f8-e884a5ae27f6

查询任务表 ACT_RU_TASK,待执行的任务是 “填写申请单” 任务

MySQL [activiti]> select * from ACT_RU_TASK\G;                                                                                                                       
*************************** 1. row ***************************                                                                                                       
              ID_: b304b1fd-1f99-11ed-ac8e-e884a5ae27f6                                                                                                              
             REV_: 1                                                                                                                                                 
    EXECUTION_ID_: b2fe977a-1f99-11ed-ac8e-e884a5ae27f6                                                                                                              
    PROC_INST_ID_: b2fce9c4-1f99-11ed-ac8e-e884a5ae27f6                                                                                                              
     PROC_DEF_ID_: evection-generate:1:87217c3d-1f95-11ed-b9f8-e884a5ae27f6                                                                                          
            NAME_: 填 写 申 请 单                                                                                                                                         
  PARENT_TASK_ID_: NULL                                                                                                                                              
     DESCRIPTION_: NULL                                                                                                                                              
    TASK_DEF_KEY_: task1                                                                                                                                             
           OWNER_: NULL                                                                                                                                              
        ASSIGNEE_: NULL                                                                                                                                              
      DELEGATION_: NULL                                                                                                                                              
        PRIORITY_: 50                                                                                                                                                
     CREATE_TIME_: 2022-08-19 08:34:11.195                                                                                                                           
        DUE_DATE_: NULL                                                                                                                                              
        CATEGORY_: NULL                                                                                                                                              
SUSPENSION_STATE_: 1                                                                                                                                                 
       TENANT_ID_:                                                                                                                                                   
        FORM_KEY_: NULL                                                                                                                                              
      CLAIM_TIME_: NULL                                                                                                                                              
1 row in set (0.01 sec)   

查询流程执行表 ACT_RU_EXECUTION

MySQL [activiti]> select * from ACT_RU_EXECUTION\G;                                                                                                                  
*************************** 1. row ***************************                                                                                                       
                  ID_: b2fce9c4-1f99-11ed-ac8e-e884a5ae27f6                                                                                                          
                 REV_: 1                                                                                                                                             
        PROC_INST_ID_: b2fce9c4-1f99-11ed-ac8e-e884a5ae27f6                                                                                                          
        BUSINESS_KEY_: NULL                                                                                                                                          
           PARENT_ID_: NULL                                                                                                                                          
         PROC_DEF_ID_: evection-generate:1:87217c3d-1f95-11ed-b9f8-e884a5ae27f6                                                                                      
          SUPER_EXEC_: NULL                                                                                                                                          
   ROOT_PROC_INST_ID_: b2fce9c4-1f99-11ed-ac8e-e884a5ae27f6                                                                                                          
              ACT_ID_: NULL                                                                                                                                          
           IS_ACTIVE_: 1                                                                                                                                             
       IS_CONCURRENT_: 0                                                                                                                                             
            IS_SCOPE_: 1                                                                                                                                             
      IS_EVENT_SCOPE_: 0                                                                                                                                             
          IS_MI_ROOT_: 0                                                                                                                                             
    SUSPENSION_STATE_: 1                                                                                                                                             
    CACHED_ENT_STATE_: NULL                                                                                                                                          
           TENANT_ID_:                                                                                                                                               
                NAME_: NULL                                                                                                                                          
          START_TIME_: 2022-08-19 08:34:11.173                                                                                                                       
       START_USER_ID_: NULL                                                                                                                                          
           LOCK_TIME_: NULL                                                                                                                                          
    IS_COUNT_ENABLED_: 0                                                                                                                                             
    EVT_SUBSCR_COUNT_: 0                                                                                                                                             
          TASK_COUNT_: 0                                                                                                                                             
           JOB_COUNT_: 0                                                                                                                                             
     TIMER_JOB_COUNT_: 0                                                                                                                                             
      SUSP_JOB_COUNT_: 0                                                                                                                                             
DEADLETTER_JOB_COUNT_: 0                                                                                                                                             
           VAR_COUNT_: 0                                                                                                                                             
       ID_LINK_COUNT_: 0                                                                                                                                             
*************************** 2. row ***************************                                                                                                       
                  ID_: b2fe977a-1f99-11ed-ac8e-e884a5ae27f6                                                                                                          
                 REV_: 1                                                                                                                                             
        PROC_INST_ID_: b2fce9c4-1f99-11ed-ac8e-e884a5ae27f6                                                                                                          
        BUSINESS_KEY_: NULL                                                                                                                                          
           PARENT_ID_: b2fce9c4-1f99-11ed-ac8e-e884a5ae27f6                                                                                                          
         PROC_DEF_ID_: evection-generate:1:87217c3d-1f95-11ed-b9f8-e884a5ae27f6                                                                                      
          SUPER_EXEC_: NULL                                                                                                                                          
   ROOT_PROC_INST_ID_: b2fce9c4-1f99-11ed-ac8e-e884a5ae27f6                                                                                                          
              ACT_ID_: task1                                                                                                                                         
           IS_ACTIVE_: 1                                                                                                                                             
       IS_CONCURRENT_: 0                                                                                                                                             
            IS_SCOPE_: 0                                                                                                                                             
      IS_EVENT_SCOPE_: 0                                                                                                                                             
          IS_MI_ROOT_: 0                                                                                                                                             
    SUSPENSION_STATE_: 1                                                                                                                                             
    CACHED_ENT_STATE_: NULL                                                                                                                                          
           TENANT_ID_:                                                                                                                                               
                NAME_: NULL                                                                                                                                          
          START_TIME_: 2022-08-19 08:34:11.184                                                                                                                       
       START_USER_ID_: NULL                                                                                                                                          
           LOCK_TIME_: NULL                                                                                                                                          
    IS_COUNT_ENABLED_: 0                                                                                                                                             
    EVT_SUBSCR_COUNT_: 0                                                                                                                                             
          TASK_COUNT_: 0                                                                                                                                             
           JOB_COUNT_: 0                                                                                                                                             
     TIMER_JOB_COUNT_: 0                                                                                                                                             
      SUSP_JOB_COUNT_: 0                                                                                                                                             
DEADLETTER_JOB_COUNT_: 0                                                                                                                                             
           VAR_COUNT_: 0                                                                                                                                             
       ID_LINK_COUNT_: 0                                                                                                                                             
2 rows in set (0.00 sec)  

2.7.4 生成 bpmn 文件

因为是使用代码定义的流程,因此如果需要 bmpn 文件时可以通过下面代码将已定义的流程转为 bpmn 文件

/**
 * 生成 bpmn 文件
 */
@Test
public void test02 () throws IOException {
    // 生成 bpmn 文件
    InputStream inputStream = repositoryService.getResourceAsStream("8703bb0b-1f95-11ed-b9f8-e884a5ae27f6", PROCESSID + ".bpmn");
    FileUtils.copyInputStreamToFile(inputStream, new File("src/main/resources/bpmn/" + PROCESSID + ".bpmn"));
}

运行后,在 resources/bpmn 文件夹下生成 evection-generate.bpmn 文件;

2.7.5 生成 svg 文件

之前从 bpmn20.xml 生成的都是 png 图片文件,但 activiti-image-generator 7 的版本生成 png 的图片无法打开,可以生成 svg 图片,或者采用 5.19.0.2 版本的 activiti-image-generator 生成 png 图片;

/**
 * 生成 svg 图片文件
 * activiti-image-generator 7 的版本生成 png 的图片无法打开,可以生成 svg 图片,或者采用 5.19.0.2 版本的 activiti-image-generator 生成 png 图片
 */
@Test
public void test03() throws IOException{
    ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
            .processDefinitionKey(PROCESSID).singleResult();

    BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId());
    if(bpmnModel != null && bpmnModel.getLocationMap().size() > 0){
        DefaultProcessDiagramGenerator ge = new DefaultProcessDiagramGenerator();

        InputStream inputStream = ge.generateDiagram(bpmnModel, runtimeService.getActiveActivityIds(processInstance.getId()), new ArrayList<>(), "宋体", "宋体", null, false);

        FileUtils.copyInputStreamToFile(inputStream, new File("src/main/resources/bpmn/" + PROCESSID + ".svg"));
    } else {
        System.out.println("bpmnModel 为空!");
    }
}

执行后在 resources/bpmn 文件夹下会生成 evection-generate.svg 文件

文件内容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.0//EN'
          'http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd'>
<svg xmlns:xlink="http://www.w3.org/1999/xlink" style="fill-opacity:1; color-rendering:auto; color-interpolation:auto; text-rendering:auto; stroke:black; stroke-linecap:square; stroke-miterlimit:10; shape-rendering:auto; stroke-opacity:1; fill:black; stroke-dasharray:none; font-weight:normal; stroke-width:1; font-family:'Dialog'; font-style:normal; stroke-linejoin:miter; font-size:12px; stroke-dashoffset:0; image-rendering:auto;" width="840" height="390" xmlns="http://www.w3.org/2000/svg"
><!--Generated by the Batik Graphics2D SVG Generator--><defs id="genericDefs"
  /><g
  ><g style="fill:rgb(255,255,255); fill-opacity:0; stroke-opacity:0; stroke:rgb(255,255,255);"
    ><rect x="0" width="840" height="390" y="0" style="stroke:none;"
    /></g
    ><g style="font-size:11px; fill:white; text-rendering:optimizeLegibility; font-family:'宋体'; stroke:white; font-weight:bold;" id="startEvent"
    ><circle r="15" style="stroke:none;" cx="15" cy="190"
      /><circle r="15" style="fill:none; stroke:rgb(88,88,88);" cx="15" cy="190"
      /><line x1="30" x2="80" y1="190" style="fill:none; stroke:rgb(88,88,88);" y2="190"
    /></g
    ><g transform="matrix(0,-1,1,0,80,190)" style="font-size:11px; fill:rgb(88,88,88); text-rendering:optimizeLegibility; font-family:'宋体'; stroke:rgb(88,88,88); font-weight:bold;"
    ><polygon style="stroke:none;" points=" 0 0 -5 -10 5 -10"
    /></g
    ><g style="font-size:11px; fill:rgb(249,249,249); text-rendering:optimizeLegibility; font-family:'宋体'; stroke:rgb(249,249,249); font-weight:bold;" id="task1"
    ><rect x="80" y="160" width="100" style="stroke:none;" rx="3" ry="3" height="60"
      /><rect x="80" y="160" width="100" style="fill:none; stroke:rgb(187,187,187);" rx="3" ry="3" height="60"
      /><path d="M106.0781 194.5781 Q106.0781 194.0625 105.9844 192.7812 L107.625 193.7188 L107.6562 193.7188 L107.75 192.6094 L106.5469 192.6094 Q106.5469 192.6094 105.7188 192.9531 L105.125 192.3438 L107.7969 192.3438 Q107.8281 191.7031 107.8281 190.6406 L109.7344 191.3594 L109.4375 191.625 L109.3438 192.3438 L109.9375 192.3438 L110.9531 191.3281 L112.2344 192.6094 L109.3125 192.6094 L109.2188 193.7188 L109.5156 193.7188 L110.1719 192.8906 L111.4531 193.8125 L111.1562 194.0625 L111.1562 198.3281 L111.1562 198.3281 L111.2188 197.3125 L112.4844 198.5781 L106.0781 198.5781 Q106.0781 198.5781 105.25 198.9219 L104.6562 198.3281 L106.0781 198.3281 L106.0781 194.5781 ZM107.625 193.9844 L107.625 194.7969 L109.5938 194.7969 L109.5938 193.9844 L107.625 193.9844 ZM107.625 195.0625 L107.625 195.9531 L109.5938 195.9531 L109.5938 195.0625 L107.625 195.0625 ZM107.625 196.2188 L107.625 197.125 L109.5938 197.125 L109.5938 196.2188 L107.625 196.2188 ZM107.625 197.375 L107.625 198.3281 L109.5938 198.3281 L109.5938 197.375 L107.625 197.375 ZM107.2969 198.125 L108.5781 199.4844 Q108.1875 199.5312 107.5 200 Q106.7656 200.4688 104.7812 201.3594 L104.4375 200.9062 Q106.1562 199.875 107.2969 198.125 ZM108.6875 199.0156 L108.9688 198.5781 Q110.9375 199.3125 111.5391 199.6094 Q112.1406 199.9062 112.1406 200.4375 Q112.1406 200.5625 112.0781 200.8203 Q112.0156 201.0781 110.9219 201.0781 Q110.8438 201.0781 110.5781 200.6875 Q110.2031 200.0938 108.6875 199.0156 ZM104.7812 197.4062 L106.3906 196.8906 L106.5625 197.3281 Q103.3281 198.6719 102.4844 199.9531 L101.5156 198.3281 Q102.4219 198.1094 103.2812 197.8438 L103.2812 194.2344 L103.0156 194.2344 Q103.0156 194.2344 102.1875 194.6094 L101.6094 193.9844 L103.2812 193.9844 L103.2812 192.2656 Q103.2812 191.875 103.1875 190.625 L105.1875 191.625 L104.8438 191.9219 L104.8438 193.9844 L104.8438 193.9844 L105.3125 193.0312 L106.5625 194.2344 L104.7812 194.2344 L104.7812 197.4062 ZM120.9766 193.375 L121.5391 192.1406 L115.8359 192.1406 Q115.9297 192.9531 115.7344 193.1641 Q115.5391 193.375 115.3438 193.4219 Q115.1484 193.4688 114.0234 193.4688 Q113.8984 193.4688 113.8125 193.4219 Q113.7266 193.375 113.7266 193.3438 Q113.7266 193.1719 113.9766 192.8594 Q114.3203 192.3906 114.5391 191.3594 L115.7578 191.3594 L115.7891 191.875 L121.4922 191.875 L122.3516 190.7656 L123.7891 192.1406 Q123.0547 192.1719 121.7891 193.9219 L120.9766 193.375 ZM117.3047 194.5781 Q117.2109 195.0625 116.9922 196.1719 L121.2891 196.1719 L122.0078 195.1875 L123.3203 196.2969 L122.9297 196.5625 Q122.6328 199.9062 122.2031 200.3828 Q121.7734 200.8594 120.0859 201.1562 Q120.0859 200.2969 118.6641 200 L118.6641 199.6562 Q120.3984 199.875 120.9453 199.9062 Q120.9453 199.9062 120.9453 199.8047 Q120.9453 199.7031 121.0703 198.9062 Q121.1953 198.1094 121.3203 196.4375 L117.0391 196.4375 L116.1953 197.2812 L115.1016 196.2188 L115.3984 195.9531 Q115.7891 193.8594 115.8828 192.3594 L117.8203 193.2031 L117.4766 193.4688 Q117.3828 193.9375 117.3359 194.3281 L120.5547 194.3281 L121.6172 193.2656 L122.9297 194.5781 L117.3047 194.5781 ZM113.3359 198.1875 L119.0547 198.1875 L120.1484 197.0938 L121.5078 198.4531 L114.6641 198.4531 Q114.6641 198.4531 113.9297 198.7969 L113.3359 198.1875 ZM126.0156 192.0156 L127.7031 193 L129.4531 193 Q129.4531 191.9688 129.375 190.5781 L131.3906 191.3594 L131.0469 191.7031 L131.0469 193 L132.6719 193 L133.2812 192 L134.7031 193.0781 L134.3594 193.375 L134.3594 196.2656 Q134.3594 197.1562 134.4062 198.0156 L132.75 198.6875 L132.75 197.5938 L131.0469 197.5938 L131.0469 199.3906 Q131.0469 200.1719 131.0938 200.8125 L129.375 201.5781 Q129.4531 200.1719 129.4531 199.6328 Q129.4531 199.0938 129.4531 197.5938 L127.7031 197.5938 L127.7031 198.1875 L126.0312 198.875 Q126.0938 196.9062 126.0938 195.4453 Q126.0938 193.9844 126.0156 192.0156 ZM127.7031 193.25 L127.7031 195.1406 L129.4531 195.1406 L129.4531 193.25 L127.7031 193.25 ZM131.0469 193.25 L131.0469 195.1406 L132.75 195.1406 L132.75 193.25 L131.0469 193.25 ZM127.7031 195.4062 L127.7031 197.3281 L129.4531 197.3281 L129.4531 195.4062 L127.7031 195.4062 ZM131.0469 195.4062 L131.0469 197.3281 L132.75 197.3281 L132.75 195.4062 L131.0469 195.4062 ZM142.3359 192.4375 Q142.3359 191.5312 142.2422 190.5156 L144.2891 191.4062 L143.9453 191.7031 L143.9453 192.4375 L144.6953 192.4375 L145.8359 191.375 L147.0391 192.6875 L143.9453 192.6875 L143.9453 193.5938 L144.1797 193.5938 L145.2891 192.5781 L146.4297 193.8594 L143.9453 193.8594 L143.9453 194.9219 L144.9609 194.9219 L146.0859 193.875 L147.2891 195.1875 L140.3672 195.1875 Q140.3672 195.1875 139.7266 195.5312 L139.1641 194.9219 L142.3359 194.9219 L142.3359 193.8594 L141.3516 193.8594 Q141.3516 193.8594 140.7422 194.2031 L140.1484 193.5938 L142.3359 193.5938 L142.3359 192.6875 L140.7109 192.6875 Q140.7109 192.6875 140.0859 193.0625 L139.5078 192.4375 L142.3359 192.4375 ZM142.0859 196.2969 L142.0859 197.1562 L144.3516 197.1562 L144.3516 196.2969 L142.0859 196.2969 ZM142.0859 197.4219 L142.0859 198.4062 L144.3516 198.4062 L144.3516 197.4219 L142.0859 197.4219 ZM140.4609 195.0781 L142.0547 196.0469 L144.2734 196.0469 L144.8359 195.1562 L146.2109 196.1719 L145.9141 196.4375 L145.9141 199.9062 Q145.9609 200.7344 143.9766 201.3281 Q143.9766 200.4688 142.8047 200.2188 L142.8047 199.9844 Q144.5391 200.0938 144.5391 200.0938 Q144.5391 200.0938 144.3516 199.7031 L144.3516 198.6719 L142.0859 198.6719 L142.0859 200.7812 L140.4609 201.5781 Q140.5391 199.7812 140.5391 198.2812 Q140.5391 196.7812 140.4609 195.0781 ZM137.2734 191.4062 L137.8672 190.9688 Q139.1641 191.8281 139.4062 192.1562 Q139.6484 192.4844 139.5625 192.7812 Q139.4766 193.0781 139.3047 193.2031 L139.0859 193.3438 Q137.9141 193.3438 137.8672 192.8594 Q137.7891 192.2656 137.2734 191.4062 ZM136.1484 194.7188 L137.6953 194.7188 L138.4141 193.8125 L139.7734 194.8438 L139.2266 195.1406 L139.2266 198.3438 L140.4453 197.0781 L141.0547 197.6719 Q139.8516 199.0938 138.7891 200.9688 L137.6172 199.5625 Q137.7891 199.3125 137.7891 198.9688 L137.7891 194.9688 L137.3516 194.9688 Q137.3516 194.9688 136.7422 195.3125 L136.1484 194.7188 ZM151.1562 193.4688 L151.1562 194.8906 L152.4844 194.8906 L152.4844 193.4688 L151.1562 193.4688 ZM154.0781 193.4688 L154.0781 194.8906 L155.5312 194.8906 L155.5312 193.4688 L154.0781 193.4688 ZM151.1562 195.1406 L151.1562 196.6094 L152.4844 196.6094 L152.4844 195.1406 L151.1562 195.1406 ZM154.0781 195.1406 L154.0781 196.6094 L155.5312 196.6094 L155.5312 195.1406 L154.0781 195.1406 ZM150.5469 191.1406 L150.875 190.6094 Q152.2344 191.3594 152.6875 191.7266 Q153.1406 192.0938 153.1172 192.3906 Q153.0938 192.6875 152.9453 192.8438 Q152.7969 193 151.75 193 Q151.5781 193 151.4062 192.4844 Q151.1406 191.8281 150.5469 191.1406 ZM154.0781 198.4531 Q154.0781 200.2188 154.125 200.7812 L152.4219 201.5156 Q152.4844 199.5625 152.4844 198.4531 L149.8281 198.4531 L148.375 198.6562 L147.9219 198.1875 L152.4844 198.1875 L152.4844 196.8594 L151.1562 196.8594 L151.1562 197.375 L149.4844 198.0625 Q149.5625 196.4375 149.5625 195.2344 Q149.5625 194.0312 149.4844 192.2812 L151.2031 193.2031 L153.4688 193.2031 Q153.7656 192.7344 154.0859 192.0703 Q154.4062 191.4062 154.7188 190.3438 L156.4062 191.5781 Q156.0625 191.7031 155.6484 192.1328 Q155.2344 192.5625 154.7188 193.2031 L155.4375 193.2031 L156.1875 192.3906 L157.4688 193.3438 L157.0938 193.6406 Q157.0938 196.2656 157.125 197.0781 L155.5312 197.75 L155.5312 196.8594 L154.0781 196.8594 L154.0781 198.1875 L156.2969 198.1875 L157.4844 197 L158.9375 198.4531 L154.0781 198.4531 Z" style="fill:black; stroke:none;"
      /><g style="fill:black; stroke:black;" transform="translate(85,165)"
      ><path style="fill:#d1b575;stroke:none;" d="m 1,17 16,0 0,-1.7778 -5.333332,-3.5555 0,-1.7778 c 1.244444,0 1.244444,-2.3111 1.244444,-2.3111 l 0,-3.0222 C 12.555557,0.8221 9.0000001,1.0001 9.0000001,1.0001 c 0,0 -3.5555556,-0.178 -3.9111111,3.5555 l 0,3.0222 c 0,0 0,2.3111 1.2444443,2.3111 l 0,1.7778 L 1,15.2222 1,17 17,17" anchors="top left"
      /></g
      ><rect x="80" y="160" width="100" style="fill:none; stroke:red; stroke-width:3;" rx="10" ry="10" height="60"
      /><line x1="180" x2="230" y1="190" style="fill:none; stroke:rgb(88,88,88);" y2="190"
    /></g
    ><g transform="matrix(0,-1,1,0,230,190)" style="font-size:11px; fill:rgb(88,88,88); text-rendering:optimizeLegibility; font-family:'宋体'; stroke:rgb(88,88,88); font-weight:bold;"
    ><polygon style="stroke:none;" points=" 0 0 -5 -10 5 -10"
    /></g
    ><g style="font-size:11px; fill:rgb(249,249,249); text-rendering:optimizeLegibility; font-family:'宋体'; stroke:rgb(249,249,249); font-weight:bold;" id="task2"
    ><rect x="320" y="0" width="100" style="stroke:none;" rx="3" ry="3" height="60"
      /><rect x="320" y="0" width="100" style="fill:none; stroke:rgb(187,187,187);" rx="3" ry="3" height="60"
      /><path d="M357.6719 35.75 L357.2812 35.9531 Q356.5469 37.9844 355.5625 38.9688 Q356.1719 39.4844 356.9609 39.8281 Q357.75 40.1719 358.5312 40.2188 L358.5312 40.3906 Q357.8438 40.5625 357.6094 41.25 Q355.25 40.4375 354.5938 39.7656 Q353.5938 40.5156 350.4844 41.2344 L350.3125 40.8594 Q352.3281 40.2188 353.8281 38.875 Q352.9688 37.6719 352.5469 36.0156 L352.2969 36.0781 L351.7656 35.5312 L353.9219 35.5312 L353.9219 33.7188 L353.625 33.7188 L352.3125 33.9844 L351.8125 33.4688 L353.9219 33.4688 Q353.9219 31.9219 353.8438 30.5781 L355.9531 31.4844 L355.5156 31.8281 L355.5156 33.4688 L356.0625 33.4688 L357.0625 32.4688 L358.3594 33.7188 L355.5156 33.7188 L355.5156 35.5312 L355.6406 35.5312 L356.5156 34.6562 L357.6719 35.75 ZM353.7656 35.7812 Q354.3125 37.5 354.6875 37.9531 Q355.2031 37.375 355.6875 35.7812 L353.7656 35.7812 ZM347.5156 36.6094 Q347.8125 36.6094 349.5 35.9531 L349.5 33.7188 L349.3281 33.7188 L347.9531 33.9688 L347.4688 33.4688 L349.5 33.4688 Q349.5 32.1406 349.4219 30.4688 L351.4844 31.4844 L351.0938 31.75 L351.0938 33.4688 L351.0938 33.4688 L351.6094 32.5156 L352.8594 33.7188 L351.0156 33.7188 L351.0156 35.4688 L352.4531 34.875 L352.7344 35.3594 L351.0938 36.2188 L351.0938 40.0469 Q351.0469 40.7344 349.0938 41.375 Q349.2344 40.5625 347.8594 40.0469 L347.8594 39.7188 Q349.5938 40 349.5625 40 Q349.5312 40 349.5312 39.6094 L349.5312 36.9688 Q349.25 37.0781 348.5 38.0938 L347.5156 36.6094 ZM365.4297 31.75 L365.7109 31.3594 Q367.6328 32 368 32.2422 Q368.3672 32.4844 368.3672 32.8281 Q368.3672 33 368.2422 33.2734 Q368.1172 33.5469 367.0234 33.5469 Q366.8984 33.5469 366.7266 33.1719 Q366.3828 32.5625 365.4297 31.75 ZM363.7578 33.9844 Q363.7578 32.7344 363.6953 30.5781 L365.8828 31.5312 L365.3984 31.8281 L365.3984 33.9844 L367.3672 33.9844 L368.4922 32.8594 L369.9141 34.2344 L365.7891 34.2344 Q366.9922 37.8438 370.0859 38.8438 L370.0859 39.0156 Q369.2266 39.0938 368.8047 40.0781 Q365.2578 37.5938 364.5703 34.2344 L364.9766 34.2344 Q364.9766 40 365.4453 40.7812 L363.6953 41.5938 Q363.7578 38.875 363.7578 36.0156 Q362.9922 38.3281 359.5078 40.3594 L359.1172 39.8281 Q361.7422 37.8438 363.3672 34.2344 L360.6641 34.2344 Q360.6641 34.2344 359.8516 34.6094 L359.2422 33.9844 L363.7578 33.9844 ZM379.75 32.3125 Q379.1562 33.125 378.5156 33.9375 Q379.9219 34.5 380.5234 34.8438 Q381.125 35.1875 381.1953 35.5312 Q381.2656 35.875 381.1562 36.0234 Q381.0469 36.1719 379.9531 36.1719 Q379.7812 36.1719 379.4844 35.75 Q379.0625 35.1406 378.0156 34.5156 Q377.9531 34.5781 377.2031 35.1406 Q376.4531 35.7031 374.1719 36.6562 L374.0781 36.0938 Q375.4844 35.3125 376.3906 34.4141 Q377.2969 33.5156 378.0625 32.1406 L376.1406 32.1406 Q376.1406 32.1406 375.3125 32.4844 L374.7188 31.875 L378.1094 31.875 L379.0469 30.9688 L380.1875 32.0938 L379.75 32.3125 ZM374.9375 36.9062 L378.7188 36.9062 L379.75 35.875 L380.9531 37.1562 L378.4688 37.1562 L378.4688 40.0938 L379.4844 40.0938 L380.5 39.0469 L381.7344 40.3438 L375.2344 40.3438 Q375.2344 40.3438 374.4062 40.6719 L373.8125 40.0938 L376.8594 40.0938 L376.8594 37.1562 L376.3438 37.1562 Q376.3438 37.1562 375.5156 37.5312 L374.9375 36.9062 ZM372.6719 37.2344 L375.4688 36.75 L375.5938 37.0781 Q374.7656 37.2969 373.9297 37.5703 Q373.0938 37.8438 371.8281 38.7188 L371.0156 37.4219 Q371.4531 37.2969 372.0781 36.5859 Q372.7031 35.875 373.1875 35.125 Q373.1875 35.125 372.9297 35.1953 Q372.6719 35.2656 371.3281 36.0938 L370.7188 34.7969 Q371.2344 34.6719 371.9453 33.3828 Q372.6562 32.0938 373 30.6406 L374.7656 31.75 L374.3906 32 Q373.1875 33.9844 372.3125 34.75 L373.4688 34.6719 Q374.0312 33.8125 374.5469 32.4531 L376.1875 33.6875 L375.7188 33.8594 Q374.3438 35.8281 372.6719 37.2344 ZM371.4531 40.8438 L370.7656 39.5625 Q372.875 39.1875 375.7344 38.4844 L375.8906 38.875 Q375.1094 39.1406 373.8906 39.5703 Q372.6719 40 371.4531 40.8438 ZM382.3672 39.0156 Q383.6484 38.6719 384.1328 38.5 L384.1328 35.6094 L383.9141 35.6094 Q383.9141 35.6094 383.1016 35.9844 L382.4922 35.3594 L384.1328 35.3594 L384.1328 32.7344 L383.8203 32.7344 Q383.8203 32.7344 382.9922 33.0781 L382.4141 32.4844 L385.1172 32.4844 L386.1328 31.4688 L387.3672 32.7344 L385.6797 32.7344 L385.6797 35.3594 L385.6797 35.3594 L386.1328 34.3438 L387.3672 35.6094 L385.6016 35.6094 L385.6016 38.0312 L387.3047 37.4219 L387.4922 37.8906 Q385.8516 38.625 384.2266 39.4375 L383.2734 40.375 L382.3672 39.0156 ZM386.6016 37.3125 Q386.6641 35.5312 386.6641 34.2422 Q386.6641 32.9531 386.5859 30.875 L388.1797 31.9688 L390.7422 31.9688 L391.3984 31.0938 L392.6953 32.0938 L392.3516 32.3438 L392.3516 34.375 Q392.3516 35.75 392.3828 36.5156 L390.8359 37.2812 L390.8359 36.2656 L390.2891 36.2656 L390.2891 38.1094 L390.5234 38.1094 L391.5391 37.0938 L392.7734 38.3594 L390.2891 38.3594 L390.2891 40.125 L391.0859 40.125 L392.1641 39.0469 L393.4141 40.3906 L386.5703 40.3906 Q386.5703 40.3906 385.7266 40.7188 L385.1641 40.125 L388.7734 40.125 L388.7734 38.3594 L387.8203 38.3594 Q387.8203 38.3594 387.0078 38.7344 L386.3984 38.1094 L388.7734 38.1094 L388.7734 36.2656 L388.1797 36.2656 L388.1797 36.6875 L386.6016 37.3125 ZM388.1797 32.2188 L388.1797 33.9375 L388.7734 33.9375 L388.7734 32.2188 L388.1797 32.2188 ZM390.2891 32.2188 L390.2891 33.9375 L390.8359 33.9375 L390.8359 32.2188 L390.2891 32.2188 ZM388.1797 34.2031 L388.1797 36 L388.7734 36 L388.7734 34.2031 L388.1797 34.2031 ZM390.2891 34.2031 L390.2891 36 L390.8359 36 L390.8359 34.2031 L390.2891 34.2031 Z" style="fill:black; stroke:none;"
      /><g style="fill:black; stroke:black;" transform="translate(325,5)"
      ><path style="fill:#d1b575;stroke:none;" d="m 1,17 16,0 0,-1.7778 -5.333332,-3.5555 0,-1.7778 c 1.244444,0 1.244444,-2.3111 1.244444,-2.3111 l 0,-3.0222 C 12.555557,0.8221 9.0000001,1.0001 9.0000001,1.0001 c 0,0 -3.5555556,-0.178 -3.9111111,3.5555 l 0,3.0222 c 0,0 0,2.3111 1.2444443,2.3111 l 0,1.7778 L 1,15.2222 1,17 17,17" anchors="top left"
      /></g
      ><line x1="420" x2="432" y1="30" style="fill:none; stroke:rgb(88,88,88);" y2="30"
      /><line x1="432" x2="432" y1="30" style="fill:none; stroke:rgb(88,88,88);" y2="192"
      /><line x1="432" x2="470" y1="192" style="fill:none; stroke:rgb(88,88,88);" y2="192"
    /></g
    ><g transform="matrix(0,-1,1,0,470,192)" style="font-size:11px; fill:rgb(88,88,88); text-rendering:optimizeLegibility; font-family:'宋体'; stroke:rgb(88,88,88); font-weight:bold;"
    ><polygon style="stroke:none;" points=" 0 0 -5 -10 5 -10"
    /></g
    ><g style="font-size:11px; fill:rgb(249,249,249); text-rendering:optimizeLegibility; font-family:'宋体'; stroke:rgb(249,249,249); font-weight:bold;" id="task3"
    ><rect x="320" y="160" width="100" style="stroke:none;" rx="3" ry="3" height="60"
      /><rect x="320" y="160" width="100" style="fill:none; stroke:rgb(187,187,187);" rx="3" ry="3" height="60"
      /><path d="M351.75 190.6875 L354.0625 191.6562 L353.625 192.0469 Q353.8906 194.3281 354.5156 195.9141 Q355.1406 197.5 356.1875 198.6016 Q357.2344 199.7031 358.5312 199.9062 L358.5312 200.125 Q357.6719 200.1719 357.0156 201.2188 Q355.1719 199.9062 354.4141 198.8125 Q353.6562 197.7188 353.1875 196.4766 Q352.7188 195.2344 352.5938 193.9844 Q352.5938 195.0938 352.5312 196.4922 Q352.4688 197.8906 351.4375 199.0312 Q350.4062 200.1719 347.8281 201.2812 L347.5156 200.8125 Q349.3281 199.7031 350.25 198.3906 Q351.1719 197.0781 351.4922 195.0781 Q351.8125 193.0781 351.75 190.6875 ZM368.2422 198.3281 Q368.2422 198.5312 368.2891 199.2188 L366.6328 199.8906 L366.6328 198.9219 L365.3984 198.9219 L365.3984 199.9531 Q365.4453 200.7344 363.4297 201.3906 Q363.3672 200.4688 361.9922 200.125 L361.9922 199.75 Q363.8203 200.0312 363.8125 200.0312 Q363.8047 200.0312 363.8047 199.4844 L363.8047 198.9219 L361.7891 198.9219 Q361.7891 198.9219 360.9609 199.2656 L360.3672 198.6719 L363.8047 198.6719 L363.8047 197.5469 L360.4453 197.5469 Q360.4453 197.5469 359.6172 197.8906 L359.0391 197.2969 L363.8047 197.2969 L363.8047 196.2656 L361.8203 196.2656 Q361.8203 196.2656 360.9766 196.6094 L360.4141 196 L363.8047 196 L363.8047 195.0938 L362.6172 195.0938 L362.6172 195.3594 L360.9766 195.9531 Q361.0547 194.8906 361.0547 194.4609 Q361.0547 194.0312 360.9766 192.7812 L362.6484 193.4219 L363.8047 193.4219 L363.8047 192.5156 L360.7891 192.5156 Q360.7891 192.5156 359.9609 192.8906 L359.3828 192.2656 L363.8047 192.2656 Q363.8047 191.4844 363.7109 190.4844 L365.7891 191.4531 L365.3984 191.75 L365.3984 192.2656 L367.3203 192.2656 L368.4766 191.1406 L369.8672 192.5156 L365.3984 192.5156 L365.3984 193.4219 L366.6016 193.4219 L367.3516 192.5625 L368.5859 193.5469 L368.2422 193.8125 Q368.2422 194.6719 368.2891 195.1406 L366.6328 195.8906 L366.6328 195.0938 L365.3984 195.0938 L365.3984 196 L366.5547 196 L367.2734 195.125 L368.6328 196.125 L368.2422 196.3906 L368.2422 197.2969 L368.2422 197.2969 L368.7109 196.1875 L370.0859 197.5469 L368.2422 197.5469 L368.2422 198.3281 ZM362.6172 193.6875 L362.6172 194.8438 L363.8047 194.8438 L363.8047 193.6875 L362.6172 193.6875 ZM365.3984 193.6875 L365.3984 194.8438 L366.6328 194.8438 L366.6328 193.6875 L365.3984 193.6875 ZM365.3984 196.2656 L365.3984 197.2969 L366.6328 197.2969 L366.6328 196.2656 L365.3984 196.2656 ZM365.3984 197.5469 L365.3984 198.6719 L366.6328 198.6719 L366.6328 197.5469 L365.3984 197.5469 ZM379.75 192.3125 Q379.1562 193.125 378.5156 193.9375 Q379.9219 194.5 380.5234 194.8438 Q381.125 195.1875 381.1953 195.5312 Q381.2656 195.875 381.1562 196.0234 Q381.0469 196.1719 379.9531 196.1719 Q379.7812 196.1719 379.4844 195.75 Q379.0625 195.1406 378.0156 194.5156 Q377.9531 194.5781 377.2031 195.1406 Q376.4531 195.7031 374.1719 196.6562 L374.0781 196.0938 Q375.4844 195.3125 376.3906 194.4141 Q377.2969 193.5156 378.0625 192.1406 L376.1406 192.1406 Q376.1406 192.1406 375.3125 192.4844 L374.7188 191.875 L378.1094 191.875 L379.0469 190.9688 L380.1875 192.0938 L379.75 192.3125 ZM374.9375 196.9062 L378.7188 196.9062 L379.75 195.875 L380.9531 197.1562 L378.4688 197.1562 L378.4688 200.0938 L379.4844 200.0938 L380.5 199.0469 L381.7344 200.3438 L375.2344 200.3438 Q375.2344 200.3438 374.4062 200.6719 L373.8125 200.0938 L376.8594 200.0938 L376.8594 197.1562 L376.3438 197.1562 Q376.3438 197.1562 375.5156 197.5312 L374.9375 196.9062 ZM372.6719 197.2344 L375.4688 196.75 L375.5938 197.0781 Q374.7656 197.2969 373.9297 197.5703 Q373.0938 197.8438 371.8281 198.7188 L371.0156 197.4219 Q371.4531 197.2969 372.0781 196.5859 Q372.7031 195.875 373.1875 195.125 Q373.1875 195.125 372.9297 195.1953 Q372.6719 195.2656 371.3281 196.0938 L370.7188 194.7969 Q371.2344 194.6719 371.9453 193.3828 Q372.6562 192.0938 373 190.6406 L374.7656 191.75 L374.3906 192 Q373.1875 193.9844 372.3125 194.75 L373.4688 194.6719 Q374.0312 193.8125 374.5469 192.4531 L376.1875 193.6875 L375.7188 193.8594 Q374.3438 195.8281 372.6719 197.2344 ZM371.4531 200.8438 L370.7656 199.5625 Q372.875 199.1875 375.7344 198.4844 L375.8906 198.875 Q375.1094 199.1406 373.8906 199.5703 Q372.6719 200 371.4531 200.8438 ZM382.3672 199.0156 Q383.6484 198.6719 384.1328 198.5 L384.1328 195.6094 L383.9141 195.6094 Q383.9141 195.6094 383.1016 195.9844 L382.4922 195.3594 L384.1328 195.3594 L384.1328 192.7344 L383.8203 192.7344 Q383.8203 192.7344 382.9922 193.0781 L382.4141 192.4844 L385.1172 192.4844 L386.1328 191.4688 L387.3672 192.7344 L385.6797 192.7344 L385.6797 195.3594 L385.6797 195.3594 L386.1328 194.3438 L387.3672 195.6094 L385.6016 195.6094 L385.6016 198.0312 L387.3047 197.4219 L387.4922 197.8906 Q385.8516 198.625 384.2266 199.4375 L383.2734 200.375 L382.3672 199.0156 ZM386.6016 197.3125 Q386.6641 195.5312 386.6641 194.2422 Q386.6641 192.9531 386.5859 190.875 L388.1797 191.9688 L390.7422 191.9688 L391.3984 191.0938 L392.6953 192.0938 L392.3516 192.3438 L392.3516 194.375 Q392.3516 195.75 392.3828 196.5156 L390.8359 197.2812 L390.8359 196.2656 L390.2891 196.2656 L390.2891 198.1094 L390.5234 198.1094 L391.5391 197.0938 L392.7734 198.3594 L390.2891 198.3594 L390.2891 200.125 L391.0859 200.125 L392.1641 199.0469 L393.4141 200.3906 L386.5703 200.3906 Q386.5703 200.3906 385.7266 200.7188 L385.1641 200.125 L388.7734 200.125 L388.7734 198.3594 L387.8203 198.3594 Q387.8203 198.3594 387.0078 198.7344 L386.3984 198.1094 L388.7734 198.1094 L388.7734 196.2656 L388.1797 196.2656 L388.1797 196.6875 L386.6016 197.3125 ZM388.1797 192.2188 L388.1797 193.9375 L388.7734 193.9375 L388.7734 192.2188 L388.1797 192.2188 ZM390.2891 192.2188 L390.2891 193.9375 L390.8359 193.9375 L390.8359 192.2188 L390.2891 192.2188 ZM388.1797 194.2031 L388.1797 196 L388.7734 196 L388.7734 194.2031 L388.1797 194.2031 ZM390.2891 194.2031 L390.2891 196 L390.8359 196 L390.8359 194.2031 L390.2891 194.2031 Z" style="fill:black; stroke:none;"
      /><g style="fill:black; stroke:black;" transform="translate(325,165)"
      ><path style="fill:#d1b575;stroke:none;" d="m 1,17 16,0 0,-1.7778 -5.333332,-3.5555 0,-1.7778 c 1.244444,0 1.244444,-2.3111 1.244444,-2.3111 l 0,-3.0222 C 12.555557,0.8221 9.0000001,1.0001 9.0000001,1.0001 c 0,0 -3.5555556,-0.178 -3.9111111,3.5555 l 0,3.0222 c 0,0 0,2.3111 1.2444443,2.3111 l 0,1.7778 L 1,15.2222 1,17 17,17" anchors="top left"
      /></g
      ><line x1="420" x2="432" y1="190" style="fill:none; stroke:rgb(88,88,88);" y2="190"
      /><line x1="432" x2="432" y1="190" style="fill:none; stroke:rgb(88,88,88);" y2="192"
      /><line x1="432" x2="470" y1="192" style="fill:none; stroke:rgb(88,88,88);" y2="192"
    /></g
    ><g transform="matrix(0,-1,1,0,470,192)" style="font-size:11px; fill:rgb(88,88,88); text-rendering:optimizeLegibility; font-family:'宋体'; stroke:rgb(88,88,88); font-weight:bold;"
    ><polygon style="stroke:none;" points=" 0 0 -5 -10 5 -10"
    /></g
    ><g style="font-size:11px; fill:rgb(249,249,249); text-rendering:optimizeLegibility; font-family:'宋体'; stroke:rgb(249,249,249); font-weight:bold;" id="task4"
    ><rect x="320" y="320" width="100" style="stroke:none;" rx="3" ry="3" height="60"
      /><rect x="320" y="320" width="100" style="fill:none; stroke:rgb(187,187,187);" rx="3" ry="3" height="60"
      /><path d="M350.8438 357.3281 L352.4844 356.7656 L352.7344 357.2031 Q350.0625 358.3594 349.6328 358.6406 Q349.2031 358.9219 348.5938 359.9062 L347.6094 358.2812 Q348.0781 358.1875 349.3594 357.7656 L349.3594 352.9531 L349.0156 352.9531 Q349.0156 352.9531 348.1719 353.2969 L347.6094 352.6875 L350.4844 352.6875 L351.5938 351.6719 L352.7344 352.9531 L350.8438 352.9531 L350.8438 357.3281 ZM351.9531 359.25 Q352.0312 357.4688 352.0312 355.9844 Q352.0312 354.5 351.9531 352.6406 L353.5938 353.5469 L353.5938 353.5469 Q353.75 352.3438 353.7969 351.875 L352.5938 351.875 Q352.5938 351.875 351.7656 352.2188 L351.1719 351.625 L355.9844 351.625 L357.1094 350.5625 L358.3125 351.875 L355.5625 351.875 Q355.3125 352.3125 354.7969 353.5469 L355.8906 353.5469 L356.7031 352.6719 L357.9688 353.6875 L357.5781 353.9375 L357.5781 356.5625 Q357.5781 357.2969 357.625 358.0625 L356.0312 359 L356.0312 353.8125 L353.5938 353.8125 L353.5938 358.1875 L351.9531 359.25 ZM355.9531 355.0156 L355.6094 355.3594 Q355.6094 357.6719 355.2422 358.5547 Q354.875 359.4375 354.0625 360.0391 Q353.25 360.6406 350.875 361.2969 L350.6094 360.9531 Q352.625 360.0469 353.1875 359.2734 Q353.75 358.5 353.8984 357.3594 Q354.0469 356.2188 353.9375 354.0625 L355.9531 355.0156 ZM354.9375 357.8594 Q357.4531 359.1875 357.7969 359.4609 Q358.1406 359.7344 358.1406 360.125 Q358.1406 360.3438 358.0547 360.625 Q357.9688 360.9062 356.9219 360.9062 Q356.7969 360.9062 356.625 360.6094 Q356.2812 360.0938 355.8516 359.5938 Q355.4219 359.0938 354.5625 358.3594 L354.9375 357.8594 ZM362.8203 357.0781 L362.8203 359.4375 L366.4297 359.4375 L366.4297 357.0781 L362.8203 357.0781 ZM361.1016 361.5156 Q361.1797 359.3906 361.1797 356.4062 Q361.1797 353.4219 361.1016 350.7812 L362.8203 351.9688 L366.3359 351.9688 L367.0234 351 L368.4922 352.0938 L368.0703 352.3906 L368.0703 358.75 Q368.0703 360.0469 368.1172 360.5625 L366.4297 361.4062 L366.4297 359.7031 L362.8203 359.7031 L362.8203 360.5625 L361.1016 361.5156 ZM362.8203 352.2188 L362.8203 354.4062 L366.4297 354.4062 L366.4297 352.2188 L362.8203 352.2188 ZM362.8203 354.6719 L362.8203 356.8125 L366.4297 356.8125 L366.4297 354.6719 L362.8203 354.6719 ZM379.75 352.3125 Q379.1562 353.125 378.5156 353.9375 Q379.9219 354.5 380.5234 354.8438 Q381.125 355.1875 381.1953 355.5312 Q381.2656 355.875 381.1562 356.0234 Q381.0469 356.1719 379.9531 356.1719 Q379.7812 356.1719 379.4844 355.75 Q379.0625 355.1406 378.0156 354.5156 Q377.9531 354.5781 377.2031 355.1406 Q376.4531 355.7031 374.1719 356.6562 L374.0781 356.0938 Q375.4844 355.3125 376.3906 354.4141 Q377.2969 353.5156 378.0625 352.1406 L376.1406 352.1406 Q376.1406 352.1406 375.3125 352.4844 L374.7188 351.875 L378.1094 351.875 L379.0469 350.9688 L380.1875 352.0938 L379.75 352.3125 ZM374.9375 356.9062 L378.7188 356.9062 L379.75 355.875 L380.9531 357.1562 L378.4688 357.1562 L378.4688 360.0938 L379.4844 360.0938 L380.5 359.0469 L381.7344 360.3438 L375.2344 360.3438 Q375.2344 360.3438 374.4062 360.6719 L373.8125 360.0938 L376.8594 360.0938 L376.8594 357.1562 L376.3438 357.1562 Q376.3438 357.1562 375.5156 357.5312 L374.9375 356.9062 ZM372.6719 357.2344 L375.4688 356.75 L375.5938 357.0781 Q374.7656 357.2969 373.9297 357.5703 Q373.0938 357.8438 371.8281 358.7188 L371.0156 357.4219 Q371.4531 357.2969 372.0781 356.5859 Q372.7031 355.875 373.1875 355.125 Q373.1875 355.125 372.9297 355.1953 Q372.6719 355.2656 371.3281 356.0938 L370.7188 354.7969 Q371.2344 354.6719 371.9453 353.3828 Q372.6562 352.0938 373 350.6406 L374.7656 351.75 L374.3906 352 Q373.1875 353.9844 372.3125 354.75 L373.4688 354.6719 Q374.0312 353.8125 374.5469 352.4531 L376.1875 353.6875 L375.7188 353.8594 Q374.3438 355.8281 372.6719 357.2344 ZM371.4531 360.8438 L370.7656 359.5625 Q372.875 359.1875 375.7344 358.4844 L375.8906 358.875 Q375.1094 359.1406 373.8906 359.5703 Q372.6719 360 371.4531 360.8438 ZM382.3672 359.0156 Q383.6484 358.6719 384.1328 358.5 L384.1328 355.6094 L383.9141 355.6094 Q383.9141 355.6094 383.1016 355.9844 L382.4922 355.3594 L384.1328 355.3594 L384.1328 352.7344 L383.8203 352.7344 Q383.8203 352.7344 382.9922 353.0781 L382.4141 352.4844 L385.1172 352.4844 L386.1328 351.4688 L387.3672 352.7344 L385.6797 352.7344 L385.6797 355.3594 L385.6797 355.3594 L386.1328 354.3438 L387.3672 355.6094 L385.6016 355.6094 L385.6016 358.0312 L387.3047 357.4219 L387.4922 357.8906 Q385.8516 358.625 384.2266 359.4375 L383.2734 360.375 L382.3672 359.0156 ZM386.6016 357.3125 Q386.6641 355.5312 386.6641 354.2422 Q386.6641 352.9531 386.5859 350.875 L388.1797 351.9688 L390.7422 351.9688 L391.3984 351.0938 L392.6953 352.0938 L392.3516 352.3438 L392.3516 354.375 Q392.3516 355.75 392.3828 356.5156 L390.8359 357.2812 L390.8359 356.2656 L390.2891 356.2656 L390.2891 358.1094 L390.5234 358.1094 L391.5391 357.0938 L392.7734 358.3594 L390.2891 358.3594 L390.2891 360.125 L391.0859 360.125 L392.1641 359.0469 L393.4141 360.3906 L386.5703 360.3906 Q386.5703 360.3906 385.7266 360.7188 L385.1641 360.125 L388.7734 360.125 L388.7734 358.3594 L387.8203 358.3594 Q387.8203 358.3594 387.0078 358.7344 L386.3984 358.1094 L388.7734 358.1094 L388.7734 356.2656 L388.1797 356.2656 L388.1797 356.6875 L386.6016 357.3125 ZM388.1797 352.2188 L388.1797 353.9375 L388.7734 353.9375 L388.7734 352.2188 L388.1797 352.2188 ZM390.2891 352.2188 L390.2891 353.9375 L390.8359 353.9375 L390.8359 352.2188 L390.2891 352.2188 ZM388.1797 354.2031 L388.1797 356 L388.7734 356 L388.7734 354.2031 L388.1797 354.2031 ZM390.2891 354.2031 L390.2891 356 L390.8359 356 L390.8359 354.2031 L390.2891 354.2031 Z" style="fill:black; stroke:none;"
      /><g style="fill:black; stroke:black;" transform="translate(325,325)"
      ><path style="fill:#d1b575;stroke:none;" d="m 1,17 16,0 0,-1.7778 -5.333332,-3.5555 0,-1.7778 c 1.244444,0 1.244444,-2.3111 1.244444,-2.3111 l 0,-3.0222 C 12.555557,0.8221 9.0000001,1.0001 9.0000001,1.0001 c 0,0 -3.5555556,-0.178 -3.9111111,3.5555 l 0,3.0222 c 0,0 0,2.3111 1.2444443,2.3111 l 0,1.7778 L 1,15.2222 1,17 17,17" anchors="top left"
      /></g
      ><line x1="420" x2="432" y1="350" style="fill:none; stroke:rgb(88,88,88);" y2="350"
      /><line x1="432" x2="432" y1="350" style="fill:none; stroke:rgb(88,88,88);" y2="192"
      /><line x1="432" x2="470" y1="192" style="fill:none; stroke:rgb(88,88,88);" y2="192"
    /></g
    ><g transform="matrix(0,-1,1,0,470,192)" style="font-size:11px; fill:rgb(88,88,88); text-rendering:optimizeLegibility; font-family:'宋体'; stroke:rgb(88,88,88); font-weight:bold;"
    ><polygon style="stroke:none;" points=" 0 0 -5 -10 5 -10"
    /></g
    ><g style="font-size:11px; fill:rgb(249,249,249); text-rendering:optimizeLegibility; font-family:'宋体'; stroke:rgb(249,249,249); font-weight:bold;" id="task5"
    ><rect x="650" y="110" width="100" style="stroke:none;" rx="3" ry="3" height="60"
      /><rect x="650" y="110" width="100" style="fill:none; stroke:rgb(187,187,187);" rx="3" ry="3" height="60"
      /><path d="M686.1562 146.8906 L688.2188 147.9375 L687.875 148.1875 L687.875 149.5312 Q687.875 150 688.2969 150.0469 L689.9688 150.0469 Q690.3438 150 690.4531 149.5703 Q690.5625 149.1406 690.6094 148.1875 L691.7812 148.1875 Q691.8281 149.0469 691.8906 149.4375 Q691.9531 149.8281 692.3438 149.9062 Q692.0312 150.5625 690.3438 150.5625 L687.125 150.5625 Q686.1875 150.5625 686.2656 149.7031 Q686.2656 147.9375 686.1562 146.8906 ZM687.5156 146.9531 L687.7969 146.4219 Q689.625 147.3281 689.9297 147.5859 Q690.2344 147.8438 690.2344 148.1094 Q690.2344 148.3281 690.1016 148.5625 Q689.9688 148.7969 688.8906 148.7969 Q688.7656 148.7969 688.5938 148.4062 Q688.3281 147.8125 687.5156 146.9531 ZM691 147.7656 L691.2812 147.3125 Q692.8906 147.9844 693.3906 148.2812 Q693.8906 148.5781 693.9766 148.8984 Q694.0625 149.2188 693.9062 149.4766 Q693.75 149.7344 692.625 149.7344 Q692.4531 149.7344 692.2812 149.3125 Q691.9844 148.6719 691 147.7656 ZM684.9844 147.7656 L686.1562 147.7656 Q686.0625 149.0938 685.8672 149.4844 Q685.6719 149.875 684.9531 150.0078 Q684.2344 150.1406 683.9844 149.9609 Q683.7344 149.7812 683.7344 149.7031 Q683.7344 149.5312 684.125 149.1875 Q684.6406 148.75 684.9844 147.7656 ZM686.9219 140.9375 Q688.125 141.6562 688.4688 142.0234 Q688.8125 142.3906 688.7266 142.7344 Q688.6406 143.0781 688.4688 143.2109 Q688.2969 143.3438 687.25 143.3438 Q687.125 143.3438 687.0469 142.8594 Q686.9062 142.2656 686.3125 141.3125 L686.9219 140.9375 ZM685.5156 147.5469 Q685.5781 146.1719 685.5781 145.1875 Q685.5781 144.2031 685.5 142.7656 L687.1875 143.6406 L688.8438 143.6406 Q689.625 142.2188 690.125 140.4219 L691.8594 141.6562 L691.4375 141.7969 Q690.7031 142.8281 690.1094 143.6406 L690.8281 143.6406 L691.4531 142.7188 L692.8125 143.7188 L692.4688 144.0312 Q692.4688 146.1719 692.5156 146.8594 L690.8594 147.5312 L690.8594 146.6406 L687.1875 146.6406 L687.1875 146.9844 L685.5156 147.5469 ZM687.1875 143.8906 L687.1875 146.3906 L690.8594 146.3906 L690.8594 143.8906 L687.1875 143.8906 ZM704.1484 142.3125 Q703.5547 143.125 702.9141 143.9375 Q704.3203 144.5 704.9219 144.8438 Q705.5234 145.1875 705.5938 145.5312 Q705.6641 145.875 705.5547 146.0234 Q705.4453 146.1719 704.3516 146.1719 Q704.1797 146.1719 703.8828 145.75 Q703.4609 145.1406 702.4141 144.5156 Q702.3516 144.5781 701.6016 145.1406 Q700.8516 145.7031 698.5703 146.6562 L698.4766 146.0938 Q699.8828 145.3125 700.7891 144.4141 Q701.6953 143.5156 702.4609 142.1406 L700.5391 142.1406 Q700.5391 142.1406 699.7109 142.4844 L699.1172 141.875 L702.5078 141.875 L703.4453 140.9688 L704.5859 142.0938 L704.1484 142.3125 ZM699.3359 146.9062 L703.1172 146.9062 L704.1484 145.875 L705.3516 147.1562 L702.8672 147.1562 L702.8672 150.0938 L703.8828 150.0938 L704.8984 149.0469 L706.1328 150.3438 L699.6328 150.3438 Q699.6328 150.3438 698.8047 150.6719 L698.2109 150.0938 L701.2578 150.0938 L701.2578 147.1562 L700.7422 147.1562 Q700.7422 147.1562 699.9141 147.5312 L699.3359 146.9062 ZM697.0703 147.2344 L699.8672 146.75 L699.9922 147.0781 Q699.1641 147.2969 698.3281 147.5703 Q697.4922 147.8438 696.2266 148.7188 L695.4141 147.4219 Q695.8516 147.2969 696.4766 146.5859 Q697.1016 145.875 697.5859 145.125 Q697.5859 145.125 697.3281 145.1953 Q697.0703 145.2656 695.7266 146.0938 L695.1172 144.7969 Q695.6328 144.6719 696.3438 143.3828 Q697.0547 142.0938 697.3984 140.6406 L699.1641 141.75 L698.7891 142 Q697.5859 143.9844 696.7109 144.75 L697.8672 144.6719 Q698.4297 143.8125 698.9453 142.4531 L700.5859 143.6875 L700.1172 143.8594 Q698.7422 145.8281 697.0703 147.2344 ZM695.8516 150.8438 L695.1641 149.5625 Q697.2734 149.1875 700.1328 148.4844 L700.2891 148.875 Q699.5078 149.1406 698.2891 149.5703 Q697.0703 150 695.8516 150.8438 ZM706.7656 149.0156 Q708.0469 148.6719 708.5312 148.5 L708.5312 145.6094 L708.3125 145.6094 Q708.3125 145.6094 707.5 145.9844 L706.8906 145.3594 L708.5312 145.3594 L708.5312 142.7344 L708.2188 142.7344 Q708.2188 142.7344 707.3906 143.0781 L706.8125 142.4844 L709.5156 142.4844 L710.5312 141.4688 L711.7656 142.7344 L710.0781 142.7344 L710.0781 145.3594 L710.0781 145.3594 L710.5312 144.3438 L711.7656 145.6094 L710 145.6094 L710 148.0312 L711.7031 147.4219 L711.8906 147.8906 Q710.25 148.625 708.625 149.4375 L707.6719 150.375 L706.7656 149.0156 ZM711 147.3125 Q711.0625 145.5312 711.0625 144.2422 Q711.0625 142.9531 710.9844 140.875 L712.5781 141.9688 L715.1406 141.9688 L715.7969 141.0938 L717.0938 142.0938 L716.75 142.3438 L716.75 144.375 Q716.75 145.75 716.7812 146.5156 L715.2344 147.2812 L715.2344 146.2656 L714.6875 146.2656 L714.6875 148.1094 L714.9219 148.1094 L715.9375 147.0938 L717.1719 148.3594 L714.6875 148.3594 L714.6875 150.125 L715.4844 150.125 L716.5625 149.0469 L717.8125 150.3906 L710.9688 150.3906 Q710.9688 150.3906 710.125 150.7188 L709.5625 150.125 L713.1719 150.125 L713.1719 148.3594 L712.2188 148.3594 Q712.2188 148.3594 711.4062 148.7344 L710.7969 148.1094 L713.1719 148.1094 L713.1719 146.2656 L712.5781 146.2656 L712.5781 146.6875 L711 147.3125 ZM712.5781 142.2188 L712.5781 143.9375 L713.1719 143.9375 L713.1719 142.2188 L712.5781 142.2188 ZM714.6875 142.2188 L714.6875 143.9375 L715.2344 143.9375 L715.2344 142.2188 L714.6875 142.2188 ZM712.5781 144.2031 L712.5781 146 L713.1719 146 L713.1719 144.2031 L712.5781 144.2031 ZM714.6875 144.2031 L714.6875 146 L715.2344 146 L715.2344 144.2031 L714.6875 144.2031 Z" style="fill:black; stroke:none;"
      /><g style="fill:black; stroke:black;" transform="translate(655,115)"
      ><path style="fill:#d1b575;stroke:none;" d="m 1,17 16,0 0,-1.7778 -5.333332,-3.5555 0,-1.7778 c 1.244444,0 1.244444,-2.3111 1.244444,-2.3111 l 0,-3.0222 C 12.555557,0.8221 9.0000001,1.0001 9.0000001,1.0001 c 0,0 -3.5555556,-0.178 -3.9111111,3.5555 l 0,3.0222 c 0,0 0,2.3111 1.2444443,2.3111 l 0,1.7778 L 1,15.2222 1,17 17,17" anchors="top left"
      /></g
      ><line x1="750" x2="762" y1="140" style="fill:none; stroke:rgb(88,88,88);" y2="140"
      /><line x1="762" x2="762" y1="140" style="fill:none; stroke:rgb(88,88,88);" y2="205"
      /><line x1="762" x2="800" y1="205" style="fill:none; stroke:rgb(88,88,88);" y2="205"
    /></g
    ><g transform="matrix(0,-1,1,0,800,205)" style="font-size:11px; fill:rgb(88,88,88); text-rendering:optimizeLegibility; font-family:'宋体'; stroke:rgb(88,88,88); font-weight:bold;"
    ><polygon style="stroke:none;" points=" 0 0 -5 -10 5 -10"
    /></g
    ><g id="inclusiveGateway1" style="text-rendering:optimizeLegibility; font-size:11px; font-weight:bold; font-family:'宋体';"
    ><polygon style="fill:none;" points=" 230 190 250 210 270 190 250 170"
      /><circle r="10" style="fill:none; stroke-width:3;" cx="250" cy="190"
      /><line x1="265" x2="282" y1="185" style="fill:none; stroke:rgb(88,88,88);" y2="180"
      /><line x1="282" x2="282" y1="180" style="fill:none; stroke:rgb(88,88,88);" y2="30"
      /><line x1="282" x2="320" y1="30" style="fill:none; stroke:rgb(88,88,88);" y2="30"
    /></g
    ><g transform="matrix(0,-1,1,0,320,30)" style="font-size:11px; fill:rgb(88,88,88); text-rendering:optimizeLegibility; font-family:'宋体'; stroke:rgb(88,88,88); font-weight:bold;"
    ><polygon style="stroke:none;" points=" 0 0 -5 -10 5 -10"
    /></g
    ><g style="fill:rgb(88,88,88); text-rendering:optimizeLegibility; font-size:11px; font-weight:bold; font-family:'宋体'; stroke:rgb(88,88,88);"
    ><line y2="190" style="fill:none;" x1="270" x2="320" y1="190"
    /></g
    ><g transform="matrix(0,-1,1,0,320,190)" style="font-size:11px; fill:rgb(88,88,88); text-rendering:optimizeLegibility; font-family:'宋体'; stroke:rgb(88,88,88); font-weight:bold;"
    ><polygon style="stroke:none;" points=" 0 0 -5 -10 5 -10"
    /></g
    ><g style="fill:rgb(88,88,88); text-rendering:optimizeLegibility; font-size:11px; font-weight:bold; font-family:'宋体'; stroke:rgb(88,88,88);"
    ><line y2="200" style="fill:none;" x1="265" x2="282" y1="195"
      /><line y2="350" style="fill:none;" x1="282" x2="282" y1="200"
      /><line y2="350" style="fill:none;" x1="282" x2="320" y1="350"
    /></g
    ><g transform="matrix(0,-1,1,0,320,350)" style="font-size:11px; fill:rgb(88,88,88); text-rendering:optimizeLegibility; font-family:'宋体'; stroke:rgb(88,88,88); font-weight:bold;"
    ><polygon style="stroke:none;" points=" 0 0 -5 -10 5 -10"
    /></g
    ><g id="inclusiveGateway2" style="text-rendering:optimizeLegibility; font-size:11px; font-weight:bold; font-family:'宋体';"
    ><polygon style="fill:none;" points=" 470 192 490 212 510 192 490 172"
      /><circle r="10" style="fill:none; stroke-width:3;" cx="490" cy="192"
      /><line x1="510" x2="522" y1="192" style="fill:none; stroke:rgb(88,88,88);" y2="192"
      /><line x1="522" x2="522" y1="192" style="fill:none; stroke:rgb(88,88,88);" y2="200"
      /><line x1="522" x2="560" y1="200" style="fill:none; stroke:rgb(88,88,88);" y2="200"
    /></g
    ><g transform="matrix(0,-1,1,0,560,200)" style="font-size:11px; fill:rgb(88,88,88); text-rendering:optimizeLegibility; font-family:'宋体'; stroke:rgb(88,88,88); font-weight:bold;"
    ><polygon style="stroke:none;" points=" 0 0 -5 -10 5 -10"
    /></g
    ><g id="exclusiveGateway1" style="text-rendering:optimizeLegibility; font-size:11px; font-weight:bold; font-family:'宋体';"
    ><polygon style="fill:none;" points=" 560 200 580 220 600 200 580 180"
      /><line x1="573" x2="587" y1="193" style="fill:none; stroke-width:3;" y2="207"
      /><line x1="573" x2="587" y1="207" style="fill:none; stroke-width:3;" y2="193"
      /><line x1="596" x2="612" y1="196" style="fill:none; stroke:rgb(88,88,88);" y2="192"
      /><line x1="612" x2="612" y1="192" style="fill:none; stroke:rgb(88,88,88);" y2="140"
      /><line x1="612" x2="650" y1="140" style="fill:none; stroke:rgb(88,88,88);" y2="140"
    /></g
    ><g transform="matrix(0,-1,1,0,650,140)" style="font-size:11px; fill:rgb(88,88,88); text-rendering:optimizeLegibility; font-family:'宋体'; stroke:rgb(88,88,88); font-weight:bold;"
    ><polygon style="stroke:none;" points=" 0 0 -5 -10 5 -10"
    /></g
    ><g style="fill:rgb(88,88,88); text-rendering:optimizeLegibility; font-size:11px; font-weight:bold; font-family:'宋体'; stroke:rgb(88,88,88);"
    ><line y2="207" style="fill:none;" x1="596" x2="612" y1="204"
      /><line y2="205" style="fill:none;" x1="612" x2="612" y1="207"
      /><line y2="205" style="fill:none;" x1="612" x2="800" y1="205"
    /></g
    ><g transform="matrix(0,-1,1,0,800,205)" style="font-size:11px; fill:rgb(88,88,88); text-rendering:optimizeLegibility; font-family:'宋体'; stroke:rgb(88,88,88); font-weight:bold;"
    ><polygon style="stroke:none;" points=" 0 0 -5 -10 5 -10"
    /></g
    ><g style="font-size:11px; fill:white; text-rendering:optimizeLegibility; font-family:'宋体'; stroke:white; font-weight:bold;" id="endEvent"
    ><circle r="15" style="stroke:none;" cx="815" cy="205"
      /><circle style="fill:none; stroke-width:3; stroke:rgb(88,88,88);" r="15" cx="815" cy="205"
    /></g
  ></g
></svg
>

图像显示:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值