模板结构
简单来说,该模板由预设的流程图变量、流程图、配置文件(Config.xlsx 文件)组织而成。
流程图变量
该模板内预设了多个流程图变量,并遵守了一定的命名约定:
- 添加主流程图变量时,可遵守命名约定:g_ +结构类型缩写+变量名(首字母大写)
- 添加子流程图变量时,可遵守命名约定:in/out + 变量名(首字母大写)
主流程图变量
g_dicConfigData——配置数据(字典),即读取本地的配置文件Config.xlsx中的数据(可自行扩展自定义配置数据),然后当做全局的公共配置在全局流程图中使用(子流程需要输入赋值才可使用);在“配置初始化”流程块中使用该变量并赋值,在其他流程块、子流程中也被使用到。
g_dicTransactionItem——事务项(默认值为Null),该模板运行时是用相同的步骤循环处理事务项,事务项之间有相同的的结构而值不同,比如循环处理多个结构相同的表格文件,而其中的一个表格文件即为一个事务项;在“获取新数据”流程块中使用该变量并赋值,并传递到“执行流程”子流程中使用。
g_iRetryNumber——反复重试数,一般默认为3,如处理某事务项时发生异常,可以重试处理步骤,但不能超过反复重试数;在“配置初始化”、“重试计数”流程块中使用该变量并赋值。
g_iCount——重试计数器,初始值为0,事务项处理失败后重试一次则累加计数,若大于等于g_iRetryNumber,则清零,即为0;在“配置初始化”、“重试计数”流程块中使用该变量并赋值。
g_bRetryStatus —— 重试状态,默认为False,“重试”判断组件会去检查当前事务项的重试状态,若为True,则分支条件成立并指向“流程执行”子流程组件,当前事务项开始重试;若为False,则分支条件不成立并指向“获取新数据”流程块组件,开始新事务的执行。
g_bFirstRun——初次运行,默认为True;在“配置初始化”、“获取新数据”流程块中使用该变量并赋值。
子流程图变量
inTransactionItem——用来接收主流程输入的事务项,并在子流程内部使用。
inConfig——用来接收主流程输入的公共配置,并在子流程内部使用。
BusinessException——子流程全局自定义业务异常,结合Try/Catch块使用,可区别于“异常虚线”和系统变量($BlockInput)的使用方法。
Try
Log.Info("已开始执行事务流程!")
//todo something
Catch Exception
BusinessException = Exception
Log.Error("执行[执行流程] 失败:"&CStr(Exception))
End Try
流程图
该模板,包含2层流程图,一层主流程图,由“流程开始”、6个“流程块”、3个“判断”、1个“子流程”及“结束”组件组织而成的流程图,一层子流程图,由“流程开始”、1个“流程块”组件组织而成的流程图; 主流程图
主流程图
此节下文将对上图“主流程图”进行说明。
- 配置初始化 在该流程块的“源代码”视图下,顶部注释已列出整体步骤说明:初始化流程图变量、设置全局日志级别、加载Config.xlsx文件中的配置信息、自定义扩展。
此流程块是主流程执行的第一步,“声明前置”、 “初始化”这类常见的实践都集中在此,重点操作是为主流程全局的公共配置数据进行赋值(即读取本地或远程的配置数据并赋值给流程图变量g_dicConfigData),同时这些公共配置数据须当作输入值传入“执行流程”子流程中;当此流程块内部发生异常时(未自行Try/Catch处理),如本地配置文件(Config.xlsx)丢失了,流程会走向“异常处理”流程块,最终进入“流程结束”流程块而停止整个流程执行。
目标程序初始化 定义为事务流程的依赖环境起点,确保公共配置数据中告知的目标应用软件处于起点(预备执行)状态,当“执行流程”子流程中发生异常时(未自行Try/Catch处理),在重试机制下会回到此起点,从而确保事务重试是可行的,当然若此流程块内部发生异常(未自行Try/Catch处理), 流程会走向“异常处理”流程块。
首次运行 读取流程图变量g_bFirstRun的值进行判断,即判断流程中的整体循环是否为首次运行,若为真,流程指向“获取新数据”流程块组件,去获取新的事务项;若为假,流程指向“重试”判断组件,对当前事务项进行重试逻辑判断。
重试 读取流程图变量g_bRetryStatus的值进行判断,即判断当前事务项是否需要重试,若为真,流程指向“执行流程”子流程并继续运行;若为假,流程指向“获取新数据”流程块并继续运行,用此“判断”组件实现跳过失败的事务项,继续新的事务项执行。
获取新数据 从指定的事务来源获取新的数据,即事务项;事务来源可以是Commander中指定的数据队列、指定Excel表格中的特定行、指定数据库中的指定字段数据、指定邮箱收件箱中的特定邮件、指定可返回相同结构数据的WebAPI或其他等等;若能获取到新的事务项,则要赋值给流程图变量g_dicTransactionItem,同时新事务项会当作输入值传入“执行流程”子流程中;若获取不到新的事务项,即“g_dicTransactionItem = Null”状态,流程经“有数据”组件判断后,会指向“流程结束”流程块。 事务项本质是一个“字典”,如有一个流程场景,有多个账户每天需要进入同一个系统下载报表数据,下载步骤是相同的,仅各登录的账户密码不同,这时这些账户信息可以集中在一起(已确保安全),当作事务源,假如其中的一个事务项为:
{"UserName" : "UiBot", "Pwd" : "!@#QaWSZ2021qeWRrer2Dq2w4oL"}
则获取到这个事务项后,给流程图变量g_dicTransactionItem进行赋值:
g_dicTransactionItem = {"UserName" : "UiBot", "Pwd" : "!@#QaWSZ2020"}
该流程块内,仅预制了2条命令: “g_bFirstRun = False”和“g_dicTransactionItem = Null”
这里需要特殊说明,以上2条命令不能删除,否则就会破坏“模板”的运行逻辑,同时新的事务项获取后,给流程图变量g_dicTransactionItem赋值时,顺序一定是在以上2条命令之下。
有数据 读取条件表达式“(Not IsNull(g_dicTransactionItem))”的值进行判断,即判断是否已经获取到了新的事务项,若为真,流程指向“执行流程”子流程并继续运行;若为假,流程指向“流程结束”流程块,最后优雅的结束整个流程。
执行流程 在该模板中,具体的业务操作步骤都被约定在此子流程中进行,比如用户登录、主页导航、报表查询及下载等业务自动化逻辑,这也是模板中需要UiBot开发者投入最多精力的地方。
此子流程定义了2个输入值参数:inTransactionItem、inConfig,分别由主流程图变量g_dicTransactionItem、g_dicConfigData赋值传入。 若此子流程内发生异常时(未被Try/Catch块处理),流程会由“异常虚线”指向“重试计数”流程块继续运行,对当前事务项执行重试逻辑(默认重试3次,3次都不成功则跳到新的事务项继续运行流程)。
- 异常处理 用来统一处理涉及流程中3个关键流程块内发生的异常,若“配置初始化”、“目标程序初始化”、“获取新数据”流程块内发生异常,异常信息可在本流程块内通过系统变量($BlockInput)获取,这也代表着RPA的依赖环境(前置条件)没有达到要求或者环境自身遭到破坏,流程无法继续执行。
流程块和子流程内发生异常时,若未被Try/Catch块处理,可在“异常虚线”指向的流程块内通过系统变量($BlockInput)获取异常信息;当需要对流程块内的单条或多条命令自行处理异常时,才建议使用Try/Catch块。
本流程块内没有预设对异常信息的处理,而这类问题的修复或者解决需要人工介入才行,如要把异常情况通知到RPA维护管理人员,UiBot开发者可结合使用“HTTP”、“SMTP/POP”、“Outlook”等模块内的命令而实现。
重试计数 若流程运行至“执行流程”子流程且其内部发生异常时(未自行Try/Catch处理),流程会指向本流程块继续运行,即对流程图变量g_iCount进行递增,也就是事务项重试的计数器,若“g_iCount >= g_iRetryNumber”,则计数器清零,即g_iCount重新赋值为0,g_bRetryStatus重新赋值为False,为下一个事务项发生异常进行重试时重新计数;在此流程块内,可结合“上传屏幕截图”命令(需要企业版)对当前屏幕截图和上传,记录异常现场,方便在Commander中进行分析和调查。
流程结束 此模板的运行,最终都会汇集到此流程块,当前预设了记录UiBot版本信息、流程运行时长这2个常规信息,然后指向“结束”组件,完整的结束流程;UiBot开发者可在本流程块内扩展一些流程结束时的统计工作,或者一些其他输出,以应对具体的RPA场景要求。
子流程图
此节下文将对上图“子流程图”进行说明。
- 流程块 此流程块是预设的原始“流程块”,仅简单的示例怎么获取传入的事务项、公共配置中的数据,具体的业务自动化操作需要UiBot开发者自行扩展实现。
Dim configField1 = ""
Dim configField2 = ""
Dim itemField1 = ""
Dim itemField2 = ""
Try
Log.Info("已开始执行事务流程!")
Rem 在这里开始具体的RPA业务操作
configField1 = inConfig["key1"]
configField2 = inConfig["key2"]
itemField1 = inTransactionItem["itemA"]
itemField2 = inTransactionItem["itemB"]
//todo something
Catch Exception
BusinessException = Exception
Log.Error("执行[执行流程] 失败:"&CStr(Exception))
End Try
配置文件
以“企业级流程模板”方式创建流程后,在流程的res/Data目录下的可找到配置文件Config.xlsx——包含3个工作表(全局设置、常量设置、本地参数),并已经预设了若干个配置项,可根据项目情况自行添加。
在流程的res目录中的文件,会在流程发布时自动打包到bot文件中,若Config.xlsx文件想在本地独立控制和维护,可移动到res目录之外,比如C:\Data\Config.xlsx,这时要对“配置初始化”流程块对应的文档读取操作进行修改:
Excel.OpenExcel("C:\\Data\\Config.xlsx",True,"Excel","","")
该配置文件虽然依赖常见的办公软件Excel/WPS,但在流程的维护阶段可方便业务人员自行调整设置值,可以减少维护人员的投入。
配置文件中的3个工作表,存在约定好的格式,由名称、值、描述组成,如要调整格式,模板中也要对应调整,名称建议以英文名词命名。
- 全局设置 预设CommanderQueueName、LogLevel,对应Commander中的数据队列名称和全局日志级别;通常数据队列用来当做事务源,UiBot开发者可根据实际情况填写设置值。
- 常量设置 预设MaxRetryNumber、ExScreenshotsFolderPath,对应该模板中对事务项处理时最大重试数和流程发生异常时对当前屏幕进行截图后的保存路径,UiBot开发者可根据实际情况填写设置值;在处理事务项时,如需要记录一些与业务内部分析和审核有关的日志信息,通常这些日志信息具备相同的前缀部分,此时建议把前缀部分外置到“常量设置”中,也便于调整和维护。
- 本地参数 预设appsName、UKeySetupPath,对应目标程序进程名称和目标程序安装路径,UiBot开发者可根据实际情况填写设置值。
总结
对企业级流程模板的基本结构了解后,会发现侧重在事务性流程的自动化场景中使用;由“获取新数据”循环获取新的事务项,事务项之间彼此独立,以事务级别的方式处理异常和管理日志记录,从而提供有关每个已处理事务项的更详细信息,也更容易重试或最终跳过失败的事务。
若直接运行该模板,会发现很快就运行结束,因“获取新数据”流程块中并没有预制事务源,当前事务项的状态为“g_dicTransactionItem = Null”,所以流程指向“流程结束”流程块,最后就结束了整个流程。
主流程(主流程图)主要作用是加载全局配置、循环提供事务项、循环调用子流程处理事务项,及控制每个事务项执行失败后按配置要求进行重试;子流程(子流程图)的作用是接收数据(公共配置、事务项)并执行具体的流程步骤,且本身具备独立运行能力。
另外,此模板的结构说明已作为pdf文件内置在RPA Creator应用中————《UiBot企业级流程模板-使用指南.pdf》。