【Flowable 7】学习笔记 01 - 初始化数据库表创建流程(源码)

文章目录

    • 前言
    • 版本说明
    • 配置
    • 1、引擎配置初始化
    • 2、SQL 执行创建表
      • 2.0、创建表概览(创建表数目:38)
      • 2.1、基础组件表创建(以 common 组件为例)
      • 2.2、changelog 组件表创建(基于 liquibase)
      • 2.3、Engine | History 组件表创建
      • 2.4、检查表是否存在

前言

前段时间,RuoYi-Vue-Plus 迎来了 v5.2.0-BETA 版本,其中新增了工作流 Flowable 7

在工作中几乎没有使用过工作流,这一内容是比较陌生的,我在b站上能找到的学习的视频都不算十分满意,大多其实只是讲解如何使用,相关的书(中文版)也比较少,至于原理还是需要自己看源码或者 debug,所以还是需要慢慢学习,接下来如果有空会更新。

本文主要是记录一下初始化建表的流程,作为后续学习参考。可能会有错误的地方,或者是不完善的地方,请见谅。

版本说明

  1. 框架 RuoYi-Vue-Plus 版本:5.2.0-BETAdev 分支)
  2. Flowable 版本:7.0.0

在这里插入图片描述

配置

  1. Flowable 模块:ruoyi-modules/ruoyi-workflow(本文暂不涉及)
  2. 配置:ruoyi-admin/src/main/resources/application.yml
--- #flowable配置
flowable:
  async-executor-activate: false #关闭定时任务JOB
  #  将databaseSchemaUpdate设置为true。当Flowable发现库与数据库表结构不一致时,会自动将数据库表结构升级至新版本。
  database-schema-update: true
  activity-font-name: 宋体
  label-font-name: 宋体
  annotation-font-name: 宋体
  # 关闭各个模块生成表,目前只使用工作流基础表
  idm:
    enabled: false
  cmmn:
    enabled: false
  dmn:
    enabled: false
  app:
    enabled: false

上面的配置中只生成了基础表,其他模块相关表没有生成,所以暂且不关心。结合 AI 简单说明一下各个模块:

  • IDM(Identity Management):身份管理模块,用于管理用户、组织和权限。 它负责处理用户身份验证、授权和用户组管理等任务,以确保系统的安全性和权限控制。

  • CMMN(Case Management Model and Notation):案例管理模块,用于建模和执行复杂的业务案例。 CMMN提供了一种规范的方法来描述业务案例、案例实例和案例任务之间的关系,使得在复杂业务场景下的处理和管理变得更加灵活和可控。

  • DMN(Decision Model and Notation):决策建模与表示模块,用于建模和执行业务决策逻辑。 DMN提供了一种标准的方式来描述决策表、决策规则和决策过程,帮助业务系统更好地实现自动化决策和业务规则管理。

  • APP(Application):应用模块,提供了一个基于Web的用户界面,用于管理和监控流程、任务和案例。 APP模块使得用户能够通过浏览器访问Flowable引擎,进行流程定义、部署、启动、任务处理等操作,从而方便地管理和参与到业务流程中。

1、引擎配置初始化

初始化执行的主要方法:
org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl#init

这个方法用于初始化 Flowable 引擎的配置和各种组件:

  1. initEngineConfigurations():初始化引擎配置。
  2. initConfigurators():初始化配置器。
  3. configuratorsBeforeInit():在初始化之前配置器的初始化。
  4. initClock():初始化时钟。
  5. initObjectMapper():初始化对象映射器。
  6. initProcessDiagramGenerator():初始化流程图生成器。
  7. initCommandContextFactory():初始化命令上下文工厂。
  8. initTransactionContextFactory():初始化事务上下文工厂。
  9. initCommandExecutors():初始化命令执行器。
  10. initIdGenerator():初始化ID生成器。
  11. initHistoryLevel():初始化历史级别。
  12. initFunctionDelegates():初始化函数委托。
  13. initAstFunctionCreators():初始化AST函数创建器。
  14. initDelegateInterceptor():初始化委托拦截器。
  15. initBeans():初始化Beans。
  16. initExpressionManager():初始化表达式管理器。
  17. initMailClients():初始化邮件客户端。
  18. initAgendaFactory():初始化议程工厂。
  19. 根据数据库是否使用,选择性初始化数据源:initDataSource()initNonRelationalDataSource()
  20. 如果使用关系型数据库或者使用模式管理,初始化模式管理器。
  21. 配置变量服务配置和作业服务配置。
  22. initHelpers():初始化助手。
  23. initVariableTypes():初始化变量类型。
  24. initFormEngines():初始化表单引擎。
  25. initFormTypes():初始化表单类型。
  26. initScriptBindingsFactory():初始化脚本绑定工厂。
  27. initScriptingEngines():初始化脚本引擎。
  28. initBusinessCalendarManager():初始化业务日历管理器。
  29. initServices():初始化服务。
  30. initWsdlImporterFactory():初始化WSDL导入器工厂。
  31. initBehaviorFactory():初始化行为工厂。
  32. initListenerFactory():初始化监听器工厂。
  33. initBpmnParser():初始化BPMN解析器。
  34. initProcessDefinitionCache():初始化流程定义缓存。
  35. initProcessDefinitionInfoCache():初始化流程定义信息缓存。
  36. initAppResourceCache():初始化应用资源缓存。
  37. initKnowledgeBaseCache():初始化知识库缓存。
  38. initJobHandlers()initHistoryJobHandlers():初始化作业处理程序和历史作业处理程序。
  39. initTransactionFactory():初始化事务工厂。
  40. 如果使用关系型数据库,初始化SQL会话工厂。
  41. initSessionFactories():初始化会话工厂。
  42. initDataManagers():初始化数据管理器。
  43. initEntityManagers():初始化实体管理器。
  44. initProcessDefinitionDeploymentDeletionManager():初始化流程定义部署删除管理器。
  45. initCandidateManager():初始化候选人管理器。
  46. initVariableAggregator():初始化变量聚合器。
  47. initDependentScopeTypes():初始化依赖范围类型。
  48. initHistoryConfigurationSettings():初始化历史配置设置。
  49. initHistoryManager():初始化历史管理器。
  50. initChangeTenantIdManager():初始化更改租户ID管理器。
  51. initDynamicStateManager():初始化动态状态管理器。
  52. initProcessInstanceMigrationValidationManager():初始化流程实例迁移验证管理器。
  53. initIdentityLinkInterceptor():初始化身份链接拦截器。
  54. initJpa():初始化JPA。
  55. initDeployers():初始化部署器。
  56. initEventHandlers():初始化事件处理程序。
  57. initFailedJobCommandFactory():初始化失败作业命令工厂。
  58. initEventDispatcher():初始化事件分发器。
  59. initProcessValidator():初始化流程验证器。
  60. initFormFieldHandler():初始化表单字段处理程序。
  61. initDatabaseEventLogging():初始化数据库事件日志记录。
  62. initFlowable5CompatibilityHandler():初始化Flowable 5兼容性处理程序。
  63. initVariableServiceConfiguration()initIdentityLinkServiceConfiguration()initEntityLinkServiceConfiguration()initEventSubscriptionServiceConfiguration()initTaskServiceConfiguration()initJobServiceConfiguration()initBatchServiceConfiguration():初始化各种服务配置。
  64. initAsyncTaskInvoker()initAsyncExecutor()initAsyncHistoryExecutor():初始化异步任务调用程序、异步执行器和异步历史执行器。
  65. configuratorsAfterInit():在初始化之后的配置器初始化。
  66. afterInitTaskServiceConfiguration()afterInitEventRegistryEventBusConsumer():在初始化任务服务配置之后和初始化事件注册表事件总线消费者之后的操作。
  67. initHistoryCleaningManager():初始化历史清理管理器。
  68. initLocalizationManagers():初始化本地化管理器。

2、SQL 执行创建表

2.0、创建表概览(创建表数目:38)

序号SQL文件名(生成表数量)创建表名称生成逻辑对应 Manager备注
1.flowable.mysql.create.common.sql(2)ACT_GE_PROPERTY
ACT_GE_BYTEARRAY
CommonDbSchemaManager
2.liquibase.sqlgenerator.SqlGenerator(2)FLW_EV_DATABASECHANGELOGLOCK
FLW_EV_DATABASECHANGELOG
执行方法:
CreateDatabaseChangeLogLockTableGenerator#generateSql
CreateDatabaseChangeLogTableGenerator#generateSql
3.flowable-eventregistry-db-changelog.xml(4)FLW_EVENT_DEPLOYMENT
FLW_EVENT_RESOURCE
FLW_EVENT_DEFINITION
FLW_CHANNEL_DEFINITION
EventDbSchemaManager(包含三个部分 changeSet
4.flowable.mysql.create.identitylink.sql(1)ACT_RU_IDENTITYLINKIdentityLinkDbSchemaManager
5.flowable.mysql.create.identitylink.history.sql(1)ACT_HI_IDENTITYLINKIdentityLinkDbSchemaManager
6.flowable.mysql.create.entitylink.sql(1)ACT_RU_ENTITYLINKEntityLinkDbSchemaManager
7.flowable.mysql.create.entitylink.history.sql(1)ACT_HI_ENTITYLINKEntityLinkDbSchemaManager
8.flowable.mysql.create.eventsubscription.sql(1)ACT_RU_EVENT_SUBSCREventSubscriptionDbSchemaManager
9.flowable.mysql.create.task.sql(1)ACT_RU_TASKTaskDbSchemaManager
10.flowable.mysql.create.task.history.sql(2)ACT_HI_TASKINST
ACT_HI_TSK_LOG
TaskDbSchemaManager
11.flowable.mysql.create.variable.sql(1)ACT_RU_VARIABLEVariableDbSchemaManager
12.flowable.mysql.create.variable.history.sql(1)ACT_HI_VARINSTVariableDbSchemaManager
13.flowable.mysql.create.job.sql(6)ACT_RU_JOB
ACT_RU_TIMER_JOB
ACT_RU_SUSPENDED_JOB
ACT_RU_DEADLETTER_JOB
ACT_RU_HISTORY_JOB
ACT_RU_EXTERNAL_JOB
JobDbSchemaManager
14.flowable.mysql.create.batch.sql(2)FLW_RU_BATCH
FLW_RU_BATCH_PART
BatchDbSchemaManager
15.flowable.mysql.create.engine.sql(7)ACT_RE_DEPLOYMENT
ACT_RE_MODEL
ACT_RU_EXECUTION
ACT_RE_PROCDEF
ACT_EVT_LOG
ACT_PROCDEF_INFO
ACT_RU_ACTINST
ProcessDbSchemaManager
16.flowable.mysql.create.history.sql(5)ACT_HI_PROCINST
ACT_HI_ACTINST
ACT_HI_DETAIL
ACT_HI_COMMENT
ACT_HI_ATTACHMENT
ProcessDbSchemaManager

同样结合 AI 说明一下表前缀:

  1. ACT_RE(Repository)

    • 存储静态信息:这个前缀表示repository,即存储。带有这个前缀的表包含的是静态信息,例如流程定义和流程的资源(如图片、规则等)。
    • 与建模相关的操作:这些表通常是由RepositoryService接口操作,涉及到流程定义的部署、查询和管理等操作。
  2. ACT_RU(Runtime)

    • 存储运行时数据:这个前缀表示runtime,即运行时。带有这个前缀的表存储着流程变量、用户任务、变量、职责(job)等运行时的数据。
    • 流程实例执行期间的数据:Flowable只存储实例执行期间的运行时数据,当流程实例结束时,将删除这些记录。这就保证了这些运行时的表小且快,提高了性能。
  3. ACT_ID(Identity)

    • 管理组织机构信息:这个前缀表示identity,即身份。带有这个前缀的表包含标识的信息,如用户、用户组等组织机构相关的数据。
    • 支持用户身份管理和权限控制:这些表支持用户身份的创建、修改、删除、密码修改、登录等功能,以及用户分组和权限管理。
  4. ACT_HI(History)

    • 存储历史数据:这个前缀表示history,即历史。带有这个前缀的表包含着历史的相关数据,如结束的流程实例、变量、任务等。
    • 审计和报告:这些表用于审计和报告目的,记录了流程实例的历史信息,方便用户查看和分析流程的执行情况。
  5. ACT_GE(General)

    • 通用数据表:这个前缀没有特定的指向,表示general,即通用。带有这个前缀的表被用于各种情况,包含通用的流程定义和流程资源等信息。
    • 系统相关属性:这些表还可能包含系统相关的属性设置,如系统的配置信息等。
  6. FLW(Flowable Work或Engage)

    • 特定于Flowable Work或Engage的表:以FLW_前缀开头的数据库表是特定于Flowable Work或Engage的,这两个产品分别提供了工作流和数字化业务流程服务。
    • 区分核心功能和特定产品功能:这样的命名方式有助于区分Flowable核心功能和特定产品功能相关的数据表。

2.1、基础组件表创建(以 common 组件为例)

common 组件是最早执行生成的,因此以 common 为例进行说明,对应的 manager 是 CommonDbSchemaManager,是 ServiceSqlScriptBasedDbSchemaManager 的扩展。不同的组件有不同的扩展:

在这里插入图片描述

不同的扩展 实现对应执行相关的 sql 文件,命名遵循相关的规范。common 组件对应的 sql 文件:flowable.mysql.create.common.sql

调用链:

  • org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl#init
  • org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl#initSchemaManager
  • org.flowable.common.engine.impl.AbstractEngineConfiguration#initSchemaManager

在这里插入图片描述

  • org.flowable.common.engine.impl.db.LiquibaseBasedSchemaManager#initSchema
  • org.flowable.eventregistry.impl.db.EventDbSchemaManager#schemaUpdate
  • org.flowable.common.engine.impl.db.ServiceSqlScriptBasedDbSchemaManager#schemaUpdate
  • org.flowable.common.engine.impl.db.ServiceSqlScriptBasedDbSchemaManager#schemaCreate
  • org.flowable.common.engine.impl.db.ServiceSqlScriptBasedDbSchemaManager#internalDbSchemaCreate

在这里插入图片描述

sql 文件:

在这里插入图片描述

在这里插入图片描述

  • org.flowable.common.engine.impl.db.AbstractSqlScriptBasedDbSchemaManager#executeSchemaResource

在这里插入图片描述

在这里插入图片描述

创建表:

在这里插入图片描述

日志输出:

在这里插入图片描述

2.2、changelog 组件表创建(基于 liquibase)

在调用 flowable-eventregistry-db-changelog.xml 时,先生成了两个 changelog 表。对应的类:org.flowable.eventregistry.impl.db.EventDbSchemaManager

调用链:

  • org.flowable.common.engine.impl.db.LiquibaseBasedSchemaManager#initSchema
  • org.flowable.common.engine.impl.db.LiquibaseBasedSchemaManager#schemaUpdate
  • ……
  • liquibase.command.core.helpers.DatabaseChangelogCommandStep#run
  • liquibase.command.core.helpers.DatabaseChangelogCommandStep#checkLiquibaseTables

在这里插入图片描述

  • 1:changeLogHistoryService.init();
  • liquibase.changelog.StandardChangeLogHistoryService#init
  • ……
  • liquibase.sqlgenerator.core.CreateDatabaseChangeLogTableGenerator#generateSql
  • 2:LockServiceFactory.getInstance().getLockService(database).init();
  • liquibase.lockservice.StandardLockService#init
  • ……
  • liquibase.sqlgenerator.core.CreateDatabaseChangeLogLockTableGenerator#generateSql
  • ……
  • org.flowable.engine.impl.db.ProcessDbSchemaManager#schemaUpdate (Engine | History 组件表创建)

2.3、Engine | History 组件表创建

sql 文件: flowable.mysql.create.engine.sqlflowable.mysql.create.history.sql

调用链:

  • org.flowable.spring.SpringProcessEngineConfiguration#buildProcessEngine
  • org.flowable.engine.impl.ProcessEngineImpl#ProcessEngineImpl
  • org.flowable.engine.impl.SchemaOperationsProcessEngineBuild#execute
  • org.flowable.engine.impl.db.ProcessDbSchemaManager#schemaUpdate

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.4、检查表是否存在

由于配置 database-schema-updatetrue,应用每次启动,Flowable 都会检查表是否存在以及是否需要更新表。

如果设置为 false,则假定数据库已经是最新状态,不做任何更新。
设置为 validate 时,仅验证 Schema 是否匹配,不执行更新操作。
设置为 update 时,如有需要则更新 Schema。

底层判断逻辑:

  • org.flowable.common.engine.impl.db.ServiceSqlScriptBasedDbSchemaManager#schemaCreate

在这里插入图片描述

在这里插入图片描述

  • org.flowable.common.engine.impl.db.AbstractSqlScriptBasedDbSchemaManager#isTablePresent

  • org.flowable.engine.impl.db.ProcessDbSchemaManager#schemaUpdate
  • org.flowable.common.engine.impl.db.ServiceSqlScriptBasedDbSchemaManager#schemaUpdate

在这里插入图片描述

(完)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/653066.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

swiftui基础组件Image加载图片,以及记载gif动图示例

想要在swiftui中展示图片,可以使用Image这个组件,这个组件可以加载本地图片和网络图片,也可以调整图片大小等设置。先大概看一下Image的方法有哪些可以用。 常用的Image属性 1.调整图像尺寸: 使用 resizable() 方法使图像可调整…

ComfyUI工作流网站

https://openart.ai/home https://comfyworkflows.com/ https://civitai.com/

5G工厂长啥样

5G工厂是一种新型的工业互联网基础设施,利用5G为代表的新一代信息通信技术集成,打造新型工业互联网基础设施。在5G工厂中,自动化和智能化设备广泛使用,高度互联的工厂网络得以实现,远程监控和管理成为可能,…

220V转5V电源芯片,为您的微控制器、继电器和WiFi/蓝牙模块提供动力

220V转5V电源芯片,为您的微控制器、继电器和WiFi/蓝牙模块提供动力标题: 在我们生活的数字化世界中,电源芯片的重要性不容忽视。今天,我们要向您介绍一款适用于各种应用的电源芯片:220V转5V电源芯片。该芯片可从交流电…

Qt 项目(CMake)支持多国语言(2024/05)

目录 1.在工程手动创建languages文件夹2.修改CMakeLists.txt3.在qml上随便添加一下文字内容4.执行CMake 参考:Qt 项目(CMake)设置国际化支持 1.在工程手动创建languages文件夹 2.修改CMakeLists.txt set(TS_FILES"${CMAKE_SOURCE_DIR}/languages/aidi_zh_CN.ts"&qu…

享受当下,还是留待未来?一项fMRI与眼动追踪技术的联合研究

摘要 时间贴现(temporal discount)是指个体对奖励的估计会随着时间流逝而下降的心理现象。具体而言,当获得奖励的时间以日期(日期条件;例如,2023年6月8日)而不是延迟(延迟条件;例如,30天)呈现时,贴现率较低…

(二刷)代码随想录第15天|层序遍历 226.翻转二叉树 101.对称二叉树2

层序遍历 10 102. 二叉树的层序遍历 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 综合代码&#xff1a; class Solution{public List<List<Integer>> resList new ArrayList<List<Integer>>();public List<List<…

springboot项目部署到linux服务器

springboot后端 修改前 修改后 重新生成war包 war上传到linux的tomcat的webapps下 其他环境配置和macOS大差不差 Tomcat安装使用与部署Web项目的三种方法_tomcat部署web项目-CSDN博客

如何高效测试防火墙的NAT64与ALG应用协议转换能力

在本文开始介绍如何去验证防火墙&#xff08;DUT&#xff09;支持NAT64 ALG应用协议转换能力之前&#xff0c;我们先要简单了解2个比较重要的知识点&#xff0c;即&#xff0c;NAT64和ALG这两个家伙到底是什么&#xff1f; 网络世界中的“翻译官” - NAT64技术 简而言之&…

紫光展锐前沿探索 | 满足未来6G多差异化应用场景的技术体系思考

在6G架构/系统设计中&#xff0c;紫光展锐提出了未来6G空口“一体多翼”的技术体系概念&#xff0c;即“Big-Lite Multi-RAT”。本文将详细对该技术体系展开介绍。 “一体多翼”技术体系通过 “体”&#xff08;Big RAT&#xff09;和“翼”&#xff08;Lite RAT&#xff09;的…

Visual Studio中调试信息格式参数:/Z7、/Zi、/ZI参数

一般的调试信息都保存在pdb文件中。 Z7参数表示这些调试信息保存到OBJ目标文件中&#xff0c;这样的好处是不需要单独分发PDB文件给下游。Zi就是把所有的调试信息都保存在pdb文件中&#xff0c;以缩小发布文件的大小。ZI和Zi类似&#xff0c;但是增加了热重载的能力&#xff1…

电火灶是燃气灶吗?这“火”又是怎么回事?

电火灶并非传统的燃气灶&#xff0c;它们在能源使用和工作原理上有着显著的区别。电火灶&#xff0c;又名电焰灶或电燃灶&#xff0c;属于新能源厨房灶具行列&#xff0c;它使用清洁的电能作为唯一能源&#xff0c;而不是依赖天然气或液化气等燃料。 具体来说&#xff0c;电火灶…

本地部署Whisper实现语言转文字

文章目录 本地部署Whisper实现语言转文字1.前置条件2.安装chocolatey3.安装ffmpeg4.安装whisper5.测试用例6.命令行用法7.本地硬件受限&#xff0c;借用hugging face资源进行转译 本地部署Whisper实现语言转文字 1.前置条件 环境windows10 64位 2.安装chocolatey 安装chocol…

力扣刷题--1528. 重新排列字符串【简单】

题目描述 给你一个字符串 s 和一个 长度相同 的整数数组 indices 。 请你重新排列字符串 s &#xff0c;其中第 i 个字符需要移动到 indices[i] 指示的位置。 返回重新排列后的字符串。 示例 1&#xff1a; 输入&#xff1a;s “codeleet”, indices [4,5,6,7,0,2,1,3] 输…

创建你的RedTeam基础架构

随着RedTeaming行业的发展&#xff0c;我们对构建可靠环境的需求也越来越高。至关重要的是要拥有维护健壮的基础架构的能力&#xff0c;该基础架构要保证一旦出现问题就可以重新创建&#xff0c;更重要的是&#xff0c;我们需要确保环境在部署时不会出现问题。 今天&#xff0c…

2024最新版本激活Typora,1.8.10.0版本可用

​实测可用日期为&#xff1a;2024-05-28 目前最新版本 1.8.10.0 也是可以实现激活的 注&#xff1a;免修改注册表、不用修改时间&#xff0c;更不需要破解补丁 01、下载&安装 Typora 文件 从官网下载最新版本的 Typora&#xff0c;并安装 或者阿里云盘&#xff1a; htt…

Linux漏洞SSL/TLS协议信息泄露漏洞(CVE-2016-2183) - 非常危险(7.5分) 解决办法!升级openssl

漏洞情况 详细描述 TLS是安全传输层协议&#xff0c;用于在两个通信应用程序之间提供保密性和数据完整性。 TLS, SSH, IPSec协商及其他产品中使用的IDEA、DES及Triple DES密码或者3DES及 Triple 3DES存在大约四十亿块的生日界&#xff0c;这可使远程攻击者通过Sweet32攻击&…

如何更好进行多媒体展厅设计

1、明确设计目标 在展厅之前要明确设计目标&#xff0c;这包括了展厅的主题、目的和受众等&#xff0c;以及希望通过展厅传达的信息和形象。只有明确了设计目标&#xff0c;才能有针对性地进行设计&#xff0c;确保展厅的效果符合预期。 2、合理规划空间布局 空间布局要合理规划…

Android Service 启动流程

在早些年学习Android的时候&#xff0c;对Service有过总结&#xff0c;但是主要是如何去使用&#xff0c;注意事项&#xff0c;startService和bindService的区别。 Android Service_public int onstartcommand(intent intent, int flags-CSDN博客 但是今天从源码来总结下fram…

六西格玛培训的讲师应该具备哪些能力?

六西格玛培训的讲师作为专业知识的传授者和实践经验的分享者&#xff0c;其能力水平的高低直接决定了培训效果的好坏。那么&#xff0c;一个优秀的六西格玛培训讲师应该具备哪些能力呢&#xff1f;深圳天行健企业管理咨询公司解析如下&#xff1a; 首先&#xff0c;六西格玛培训…