华为云用户手册

  • 记录更新 “记录更新”图元用于更新平台对象的实例记录,类似于数据库中的UPDATE命令。系统提供了以下两种模式,更新对象实例记录: 对象模式:需要先单击,在“对象变量”中定义一个对象变量或对象变量数组,并将该对象变量或对象变量数组拖拽到“变量”输入框中,即可根据对象变量中的记录ID将对象变量更新到数据库中,更新的值来源于对象变量中的值。如下图所示,根据对象变量数组“account”中的记录ID,将对象变量中的值更新到数据库中。 条件模式:需要指定对象并在条件中设置指定对象部分字段的值,在赋值中设置需要更新的目标字段及更新值,最后根据条件查找符合条件的对象记录并将赋值中的值更新到数据库中。
  • 调用脚本 当流程到达“调用脚本”任务时,系统自动执行脚本,执行完成后继续执行后续路线。 使用该图元时,需要选择具体调用的脚本,配置输入输出参数。 图9 调用脚本配置页面 工作流中只允许调用当前应用工程下的资源(例如脚本、服务编排),即调用脚本中可供选择的脚本和该工作流都处于同一应用下。 例如,工作流A中需要调用脚本B,请确保A和B处于同一应用中。若需要调用的资源不在同一应用中,请在工作流A所在的应用中新建脚本B,或选择“使用已有脚本”导入脚本B。再在工作流A中,使用“调用脚本”图元调用该脚本。 图10 使用已有脚本
  • 记录查询 “记录查询”图元用于根据条件查询平台对象的实例记录,类似于数据库中的SELECT命令。系统提供了以下两种模式,查询对象实例记录: 对象模式:需要先单击,在“对象变量”中定义一个对象变量或者对象变量数组,将该对象变量或对象变量数组拖拽到“变量”输入框中,并设置条件以及选择排序方式,即可实现根据条件和排序方式,将查询结果保存在对象变量中。例如,如下图所示,根据条件查询对象数据,并将查询结果保存在对象变量数组“account”中。 图7 对象模式查询 条件模式:需要指定对象并在条件中设置指定对象部分字段的值,根据条件查询符合条件的对象记录,并赋值到设置的变量上。 图8 条件模式查询 对象:查询的具体对象名。 剔重:若查询记录有重复值,是否需要删掉重复记录只保留一条记录。 条件:选中对象后,该条件区域“字段”列会出现该对象的字段。单击“新增行”,可设置查询数据的条件。 在“字段”中选择要进行判断的对象字段,在“比较符”中选择相应的比较符,“值”则可从全局上下文拖拽变量或者直接输入“{!变量名}”。 排序字段/顺序:使查询结果根据某个字段进行升序或者降序排序。 记录行的偏移量:分页,跳过前n条记录,从第n+1条记录开始。 记录行的最大数目:分页,每页最多显示的记录数。 记录的总行数存入变量:限定查询出来的总记录数,存入变量中。 (输出)源/目标:输出的结果。其中,“源”为需要查询的字段,查询结果需要保存到设置的变量中,“目标”为设置的变量。 无记录时配置空值:当根据条件查询无记录时,则变量为空值。
  • 记录删除 “记录删除”图元能够删除平台对象的实例记录,类似于数据库中的DELETE命令。系统提供了以下两种模式,删除对象实例记录: 对象模式:需要先单击,在“对象变量”中定义一个对象变量或者对象变量数组,并将该对象变量或对象变量数组拖拽到“变量”输入框中,使用该对象变量或对象变量数组的记录ID删除对应的对象记录。 条件模式:需要指定对象并在条件中设置指定对象部分字段的值,根据条件删除符合条件的对象记录。
  • 用户任务 用户任务用来表示,业务流程中由用户参与完成的工作。当引擎处理到该节点时,给指定的用户(参与者)或者一组用户(如某泳道的工作队列)创建待处理的任务项,等待用户的处理。 用户任务配置:在用户任务配置界面,配置任务接收人和活动界面。 图1 用户任务配置页面 任务标题:显示在任务界面的标题。 任务描述:显示在任务界面的任务描述。 优先级:该任务的优先级。 渲染类型:用户处理的界面,可以是标准页面、标准表单或高级页面。当配置为标准表单时,需要配置用户可执行的动作(例如同意或拒绝)。 类型:待处理任务的用户类型。 当前泳道:可配置为“当前泳道角色的任意成员”或者“当前泳道中的上一个任务被分配的人员”。 流程发起人的主管:当配置为该类型时,需要配置“部门经理层级”。 名称和表达式:当配置为该类型时,需要配置“参与者”。 基于规则:当配置为该类型时,需要配置具体的“规则”。 参与者:当类型为“名称和表达式”时,该参数才会显示。参与者类型可以是“用户”、“组”或者“表达式”。当“参与者”配置为“表达式”时,实际是一个变量。在“取值”中,可设置变量的值,变量值支持以下几种: 用户的用户名或用户ID,其中用户名前需要加“user:”前缀。 业务用户的用户名或业务用户ID,其中业务用户名前需要加“puser:”前缀。 公共组名称或者公共组ID,其中公共组名称前需要加“group:”前缀。 角色名称或者角色ID,其中角色名称前需要加“role:”前缀。 例如,分配任务接受者为用户名为“PortalUser1”的业务用户、用户名为“User1”的用户、用户ID为“10XX000000XXXXXXX”的用户、公共组名称为“group1”和角色名称为“role1”的合集,则取值为“"puser:PortalUser1,user:User1,10XX000000XXXXXXX,group:group1,role:role1"”。多个取值之间用英文逗号“,”分隔,取值外加英文双引号。 规则:接收人满足的规则。类型为“基于规则”时,该参数才会显示。 审批类型:审批的类型。 若选择了“或签:任一个分配人均可审批”,则只需要接收人中的某一用户完成了审批,即可推动任务流程,走向下一个任务。 若选择了“会签:每个分配人都需要审批”,则需要接收人中的用户群体满足您设置的审批条件才可推动任务流程,走向下一个任务。 如果审批人中包含群组,则群组中任意一人审批即认为该群组已经审批。当审批类型为“会签:每个分配人都需要审批”时,该参数才会显示。 勾选,表示如果审批人中包含群组,则群组中任意一人第一个审批即认为该群组已经审批,不需要其他用户再进行审批,该群组只算一个有效审批人数。 不勾,选表示如果审批人中包含群组,则群组中每个人都需要审批,都计算在有效审批人数内。 投票结果门槛:该参数取值表示百分比,如果达到设置的百分比,审批结果中最高的得票结果将覆盖 “$BP.TaskOutcome”系统变量,即将执行最高得票的审批结果。 默认结果:审批百分比(已审批的人数/总的有效审批人数)未达到“投票结果门槛”百分比时,默认的审批结果。当审批类型为“会签:每个分配人都需要审批”时,该参数才会显示。 结果触发方式:当审批类型为“会签:每个分配人都需要审批”时,该参数才会显示。 当最小百分比满足时,立即触发投票结果。 等待所有投票完成,触发投票结果。 候选动作:设定一些候选的动作为默认审批结果。 当存在以下动作时立即终止任务:当存设定的某个或者某些动作时立即终止任务。 自动审批:该用户任务是否自动审批。 流程触发人自动通过:通过接收人“类型”和“参与者”已设置用户任务的接收人后,若勾选自动审批中“流程触发人自动通过”,接收人正好是流程触发人时,该用户任务会被自动审批。 已审批过该流程的审批人自动通过:通过接收人“类型”和“参与者”已设置用户任务的接收人后,若勾选自动审批中“已审批过该流程的审批人自动通过”,接收人在当前工作流实例中已审批过其他用户任务,则该用户任务会被自动审批。 当前自动审批功能,只支持接收人为某一用户,可使用表达式的形式指派某一具体用户,使用自动审批功能。 自动审批时默认选择的动作:勾选自动审批时,可设置自动审批默认选择的动作。 动作配置:为该用户任务配置前置或者后置动作。 图2 动作配置 前置动作:流程执行该用户任务前执行的动作。 触发条件:触发该动作的条件表达式。 动作类型:动作的类型。 通知经理:发邮件通知经理。当选择该类型时,需要配置“邮件模板”。 通知分配人:发邮件通知任务分配人。当选择该类型时,需要配置“邮件模板”。 调用服务编排:调用服务编排。当选择该类型时,需要配置具体的服务编排以及输入参数。 调用脚本:调用脚本。当选择该类型时,需要配置具体的脚本。 发送事件:发送某一事件。当选择该类型时,需要配置具体的事件。 转移:将该用户任务转移给其他用户或者工作队列的用户处理。当选择该类型时,需要配置“接收者类型”以及“接收者”。 设置状态:设置该用户任务的状态。当选择该类型时,需要配置具体的状态。 完成任务:完成某一任务,超期会自动完成任务。 后置动作:流程执行该用户任务后,执行的动作。请参考“前置动作”进行配置。 数据映射:对该用户任务的输入输出参数,进行数据映射。 图3 数据映射 SLA:为用户任务设置定时器,时间逾期可增加紧急程度并执行相应动作。 图4 启用SLA定期器 开始时间:定时器的开始时间。 任务创建后 由变量指定:通过指定时间变量,来确定开始时间。 由表达式指定:开始时间支持表达式,例如支持特定时间的相对时间,设置为“STRING2TIME('yyyy-MM-dd hh:mm:ss.S', {!variable1})”。动态指定时间的相对时间,设置为“TIMEADD({!$Flow.CurrentDateTime}, 100)”。 目标期限:任务在目标期限内且即将过期时,满足触发条件后触发一个指定的动作。 截止限期:任务过期,满足触发条件后触发一个指定的动作。 紧急程度:定时器的紧急程度。 动作:时间逾期后执行的相应动作。单击“添加”新增动作。 触发条件:触发该动作的条件表达式。 动作类型:动作的类型。 通知经理:发邮件通知经理。当选择该类型时,需要配置“邮件模板”。 通知分配人:发邮件通知任务分配人。当选择该类型时,需要配置“邮件模板”。 调用服务编排:调用服务编排。当选择该类型时,需要配置具体的服务编排以及输入参数。 调用脚本:调用脚本。当选择该类型时,需要配置具体的脚本。 发送事件:发送某一事件。当选择该类型时,需要配置具体的事件。 转移:将该用户任务转移给其他用户或者工作队列的用户处理。当选择该类型时,需要配置“接收者类型”以及“接收者”。 设置状态:设置该用户任务的状态。当选择该类型时,需要配置具体的状态。 完成任务:完成某一任务,超期会自动完成任务。
  • 另存版本后进行定制 此处以“LoanRequest”为例进行说明,基于基线“1.0.1”版本另存一个“1.0.2”的定制版本。 参考如何登录新版应用设计器中操作,登录新版应用设计器。 在左侧导航栏中,选择“流程”。 单击工作流“LoanRequest”后的“编辑”,进入工作流设计页面。 单击页面上方的,禁用该工作流。 禁用后,单击,进入另存为页面。 “类型”选择“新版本”,设置标签和名称,单击“保存”。 选择“新实例”,是将原工作流重新另存并命名,新保存后为另一个工作流,与选择“新版本”场景不同,适用于新建的工作流,基础工作流仍可使用。 图1 另存为新版本 在“1.0.2”版本工作流设计页面,进行定制修改。 修改后,单击页面上方的,保存工作流。 单击,运行工作流,检查工作流运行结果是否符合预期。 符合预期后,单击页面上方的,启用新版本工作流。
  • 脚本启动 在脚本代码中,导入工作流的脚本库,通过下面脚本代码方式启动。 import * as bp from "bp";//......(其他代码)const client = bp.newInstanceClient(); client.start(工作流名称, 工作流版本号, 工作流中定义的变量); 脚本样例如下: import * as bp from 'bp';let client = bp.newInstanceClient();let res = client.start("test", "1.0.1", { "foo": 1, "bar": 3}); 输出样例如下: { "interviewId": "002N000000FdtN6xwgjI", "screen": { "allowBack": false, "allowFinish": true, "allowNext": true, "allowPause": false, "helpText": "", "label": "input phone number", "name": "inputphonenumber", "pausedText": "", "screenFields": [ { "dataType": "text", "defaultValue": "135xxxxxxxx", "fieldType": "InputField", "helpText": "", "isRequired": false, "label": "phone number", "name": "phoneNumber" } ] }
  • 在工作流设计页面启动工作流 参考如何登录新版应用设计器中操作,登录新版应用设计器。 在左侧导航栏中,选择“流程”。 单击对应工作流后的,选择“编辑”。 在工作流设计页面,单击页面上方的,启动该工作流。 在工作流设计页面,可以通过如下两者方式启动。 自定义:将工作流的“开始”图元的开始类型设置为“自定义”启动,不指定事件的起因,即不需要指定触发条件,主要用于接口调用进行启动。 表单:使用表单或页面,启动工作流。选择该项时,需要配置具体的表单、标准页面或高级页面。
  • 接口启动 通过调用工作流的Rest接口“http://AstroZero对外提供的默认域名/u-route/baas/bp/v2.0”,进行启动。 接口URI:POST AstroZero域名/u-route/baas/bp/v2.0/runtime/instances 表1 请求参数 参数 是否必选 参数类型 描述 name 是 String 工作流的名称,在界面处创建工作流时配置的名称。 version 否 String 工作流版本号,为可选参数,因为一个工作流可以存在多个版本。如不带版本号表示运行当前启用的版本。 variables 否 Object 工作流元数据中定义的变量,包括自定义变量和系统变量, key-value形式,key为变量名字,value为变量的值。如果需要在启动工作流前设置工作流的变量,可以填写该参数。如需启动时设置变量,可以在variables中设置系统变量$Flow.BusinessKey;如需设置BP title,可以设置系统变量$Flow.Title。 表2 响应参数 参数 参数类型 描述 resCode String 返回码,如果返回“0”代表请求成功。 resMsg String 返回消息,如果成功状态,通常会返回“Success”,其他情况会返回具体的错误信息。 result Object 在成功请求时会有内容,返回启动工作流之后,工作流实例的运行信息。 例如,创建并启动了一个工作流,工作流名称为“createCloudOK_NEW”,版本号为“1.0.1”,带有4个启动参数。 请求示例 POST AstroZero域名/u-route/baas/bp/v2.0/runtime/instances { "name":"createCloudOK_NEW", "version":"1.0.1", "variables":{ "name":"sun", "memorySize":"15", "storageSize":"15", "expiryDate":"2018-12-12" }} 响应示例 { "resCode":"0", "resMsg":"Success", "result":{ "name":"bpName1", "version":"1.0.1", "id":"002N000000Sy2NphoRbU", "processDefID":"001L000000S8Yi3xG9Gi", "interviewLabel":"BP Label 1", "nextElem":"subProcess", "isTest":true, "state":"Dispatched", "bpStatus":"New", "urgency":0, "taskOutcome":"", "businessKey":"002N000000Sy2NphoRbU", "startTime":"2019-08-27 10:53:04", "endTime":"", "Ext1":"", "Ext2":"", "Ext3":"", "Ext4":"", "Ext5":"", "Ext6":"", "Ext7":0, "Ext8":0, "suspended":false, "isClosed":false }}
  • 在标准页面中与工作流交互 在标准页面的自定义事件中,内置了一些交互的API: 获取变量:context.$工作流.loadVariables(): Promise 提交任务、流程: context.$工作流.submitTask(variables: {[key: string]: any}): Promise 修改变量: context.$工作流.putVariables(variables: {[key: string]: any}): Promise 图2 在标准页面的事件代码中与工作流交互
  • 排他网关 排他网关用来在流程中,实现一组分支的唯一决策。系统将按照“条件顺序”评估流出网关的分支,流程会执行第一个连线条件被评估为true(当多个条件为true时,将执行第一个决策)的分支,并且不再继续评估下面的分支。如果所有分支条件决策都为false且该网关定义了一个默认的连线,那么该默认分支将被执行。如果没有可到达的分支,抛出异常,流程被中断,在工作流设计上应避免这种情况发生。 图1 排他网关配置页面 图2 分支连线配置
  • 工作流开发流程 创建一个工作流的主要流程,如图3所示。 图3 工作流开发流程 如下是开发工作流的主要步骤,可根据以下步骤快速开发工作流。如何创建一个端到端的工作流,请参见简易出差审批应用开发。 表2 开发工作流步骤 步骤序号 相关术语 描述 操作 1 创建工作流 新建:创建空白工作流。 导入既有:将同一租户或平台中已有的工作流以导入的方式创建工作流,方便用户快速继承已有工作流的配置,增加效率。 基于模板:系统预置了一些典型场景的工作流模板,可基于这些模板,快速创建工作流。目前系统内置的模板有以下几类: 通用:基础审批流、多步骤审批流和并行审批流。 HR:请假申请、出差申请、绩效管理、试用期确认和工作交接。 金融:贷款申请、ERP信用提升和商业计划申请。 项目:进度管理、版本管理和发布管理。 根据需要选择不同的方式,创建工作流。 若业务场景贴合已有模板,建议选择“基于模板”来快速创建工作流。快速创建后,只需要创建泳道中配置的工作队列即可使用工作流。 2 (可选)工作流的开始类型 工作流的开始类型,可以从“Star”开始图元下进行配置。开始种类包括如下两种: 自定义:默认为“自定义”,即不指定事件的起因,即不需要指定触发条件,主要用于接口调用进行启动。 表单:使用表单或页面启动工作流。选择该项时,需要配置具体的表单、标准页面或高级页面。 一般选择“自定义”,当工作流由表单或者页面启动时,选择“表单”类型。 选中“Star”开始图元,设置开始类型,一般选择“自定义”。当工作流由表单或者页面启动时,选择“表单”类型。 3 创建或配置工作流变量 创建对象或全局结构体。 在全局上下文中,根据实际情况进行创建。 4 定义泳道并选择图元 一条泳道代表工作流的流程处理中的一种用户角色。 工作流中每个泳道都和队列一一对应。处于不同泳道的图元,分别归属不同的队列中的用户去处理。当图元由系统处理时,泳道中不用配置队列。 工作流编辑器提供了一些图元,作为编排工作流使用。 在工作流开发页面,单击“Add Lane”,添加泳道。根据场景定义泳道。 根据逻辑设计,从工作流编辑器面板区域,拖拽相应类型下的图元至画布中。 5 配置图元 在泳道中,选中图元后,即可根据需要在右侧属性配置区,进行配置。 可以根据需要选择图元,进行配置。 如果使用了“规则”图元,需要提前创建好决策表。 如果使用了“用户任务”图元,且任务界面要用到标准表单,建议提前创建好标准表单。 6 连接图元并指定图元的逻辑关系 根据实际业务场景,需要确定工作流中用到的图元和逻辑顺序。根据逻辑实现,需要在拖入并配置好所有图元后,将图元按照逻辑顺序有序的连接起来。在执行工作流时,系统会根据连线顺序有序执行图元任务,从而实现整个流程运转。 根据逻辑设计有序连接各图元。 7 (可选)配置运行态界面布局 在配置完整个工作流图元及流程后,还可根据需要选择性的配置工作流运行态界面布局。 -
  • 初识工作流 在新版应用设计器中,单击左侧导航栏中的“流程”。单击“工作流”后面的“+”,设置工作流的标签和名称后,单击“添加”,即可进入工作流设计界面。 图1 添加工作流 工作流设计界面由上方按钮区域、左侧面板图元区域、中间画布工作区域和右侧属性配置区域四部分组成。 图2 工作流设计界面 表1 工作流设计界面说明 序号 分类 功能说明 1 按钮区域 功能按钮区域,包括启用(或者禁用)、保存、另存为新版本或者新工作流、运行、操作回退、撤销回退、启用流跟踪器以及切换版本的操作。支持快捷键操作,即可脱离鼠标直接用键盘操作。 2 面板图元区域 工作流的组成图元,详细介绍请参见工作流图元。 3 画布工作区域 工作流设计操作区域,在该区域可对工作流进行具体流程设计、组件放置。 选中图元或者泳道按“Delete”,可进行删除操作。 4 属性配置区域 整个工作流、泳道(Lane)或图元属性设置区域。 当选择工作流中图元时,右侧配置区域为该图元的属性设置区域。 当选择工作流中空白区域时,右侧配置区域为该工作流的设置区域。 当选择泳道左侧标签时,右侧配置区域为该泳道的属性设置区域。
  • 背景信息 根据图元的不同使用场景,工作流图元可以分为以下三类: 事件(Events):驱动流程流转的事件图元,用来表明工作流的生命周期中发生的事件,例如开始、捕获信号等。 网关(Gateways):根据条件,分发的网关图元。网关用来控制流程的执行流向,可理解为决策、判断。 活动(Activities):提供用户交互或系统调用的图元,是工作流的核心图元,可理解为节点或步骤,例如调用脚本、用户需要做的任务。 图1 工作流组成图元
  • 抛出信号 当工作流执行到达“抛出信号”事件时,引擎向系统内部发出一个事件,事件发出后流程沿后续路线继续执行。抛出的信号,可以被“捕获信号”订阅处理。 使用该图元时,需要配置抛出的具体事件,并需要在“输入参数”配置事件参数。 图3 抛出信号的“事件配置”页面 事件:请选择待发送的事件。 分区字段:从事件中选择一个自定义参数用作分区字段,根据该字段值进行路由,相同的值将路由到同一个分区。如果不指定,则默认随机路由到不同分区,从而提升并发处理性能。 目标/源:配置事件的数据,即为事件自定义参数赋值,将“源”取值赋值到“目标”中。
  • 规则6:SELECT语句中聚集函数必须增加别名 SELECT语句中,聚合函数必须使用别名方式存储查询结果,以免因聚合函数返回的结果不一致,导致存在兼容性问题。 错误代码示例 import * as db from 'db';let errorDemo = db.sql().exec("select count(*) from object_demo where object_name = 'HuaWei'") 正确代码示例 import * as db from 'db';let correctDemo = db.sql().exec("select count(*) as count from object_demo where object_name = 'HuaWei'") 推荐代码示例 ***聚合函数示例 ****select count(*) as count_res,select max(*) as max_res,select min(*) as min_res,select avg(*) as avg_res,select sum(*) as sum_res
  • 规则7:SELECT语句中严禁使用“select from...”形式查询语句 严禁使用“select ...”形式查询语句,请指出select的具体字段。 错误代码示例 import * as db from 'db';let errorDemo = db.sql().exec("select from object_demo where object_name = 'test'") 正确代码示例 import * as db from 'db';let correctDemo = db.sql().exec("select id, object_type from object_demo where object_name = 'test'")
  • 创建定时任务 参考如何登录新版应用设计器中操作,登录新版应用设计器。 在“开始”页面,单击“新建定时任务”。 图1 新建定时任务 配置定时任务,单击“保存”。 例如,创建一个定时任务“OfferingOffline”,用于实现从2021-11-25开始,每天零点自动将过期商品下架。其中,将过期商品下架的功能由“OfferingOffline”脚本实现。在创建定时任务之前,需要先开发实现定时任务功能的脚本。如何开发脚本,请参见脚本开发。 图2 配置定时任务 表1 定时任务参数说明 参数 说明 名称 定时任务名称。 例如:OfferingOffline 类型 选择定时任务执行的类型,支持脚本或服务编排。 例如:脚本 服务编排/脚本 选择定时任务执行的脚本或服务编排。 例如:选择已启用的脚本“OfferingOffline”。 输入参数 输入脚本或服务编排的输入参数。 任务首次执行时间 首次执行脚本或服务编排的时间。 例如:2021-11-25 00:00:00 执行次数 定时任务执行次数。 仅执行一次。 按设置的频率执行多次。 例如:按设置的频率执行多次 执行周期 “执行次数”配置为“按设置的频率执行多次”时,需要设置。 例如:1 执行周期单位 “执行次数”配置为“按设置的频率执行多次”时,需要设置执行任务时间的间隔单位。 例如:天 描述 定时任务的描述信息,建议描述其用途。
  • 规则8:SELECT语句中拼接的参数值请谨慎使用入参变量 SELECT语句中,拼接的参数值请谨慎使用入参变量,以免引起SQL注入的风险。 错误代码示例 import * as db from 'db';let errorDemo = "select id,name from object_demo where id = ";errorDemo += input.parameter let errorDemoResult = db.sql().exec(errorDemo) 其中,“input.parameter”为脚本入参。 正确代码示例 import * as db from 'db';let correctDemo = "select id,name from object_demo where id = ?";let correctDemoResult = db.sql().exec(correctDemo, { params: [input.parameter] }) 其中,“input.parameter”为脚本入参。
  • 规则10:SELECT语句中谨慎使用order by SELECT语句中,请谨慎使用order by。如果需要使用order by,请为排序字段增加索引,以提高查询效率。如果无法增加索引,需要关注是否存在查询性能低下的风险。 错误代码示例 import * as db from 'db';let errorDemo = db.sql().exec("select object_name from object_demo where object_id = 'HuaWei' Orde by createdDate") 表“object_demo”中的“createdDate”,并没有创建索引。 正确代码示例 import * as db from 'db';let correctDemo = db.sql().exec("select object_name from object_demo where id = 'HuaWei' Order by createdDate") “object_demo”中的“createdDate”,创建了索引。
  • 规则4:SELECT语句中查询字段不在表的索引库中 如果SELECT语句where条件中,查询字段并未创建索引,请判断该字段是否需要创建索引,以提高代码查询效率。 错误代码示例 import * as db from 'db';let errorDemo = db.sql().exec("select object_name from object_demo where object_id = ?") 表“object_demo”中的“object_id”并没有创建索引。 正确代码示例 import * as db from 'db';let correctDemo = db.sql().exec("select object_name from object_demo where id = ?") 表“object_demo”中的“id”创建了索引。
  • 场景说明 根据对象的数据,生成资源列表数据,用于前台数据呈现,启用本脚本后,可实现数据导入模板使用。 创建脚本前,需要先创建脚本中操作的对象ApprovedResource,其字段如表1所示。 表1 对象说明 字段标签 字段名称 字段类型 取值 读写权限 含义 ownerId ownerId 文本 长度:255 全选 资源拥有者ID ResourceName ResourceName 文本 长度:255 全选 资源名称 Type Type 选项列表 枚举值如下: File Folder 全选 资源类型 SubmitDate SubmitDate 日期/时间 不涉及 全选 资源提交时间 ApproveDate ApproveDate 日期/时间 不涉及 全选 资源审批时间 Status Status 选项列表 枚举值如下: Waiting Submitted Approved 全选 审批状态
  • 编辑脚本 参考如何登录新版应用设计器中操作,登录新版应用设计器。 在左侧导航栏中,选择“逻辑”。 单击脚本后的,选择“编辑”,进入脚本详情页面。 单击对应参数后的,可编辑该参数。 表1 脚本参数说明 参数 参数说明 单击该按钮,可进入脚本的编辑器页签。 如果脚本有多个版本,则进入处于启用状态的脚本编辑器页面。 如果多个版本都未启用,则进入最近版本的脚本编辑器页面。 名称 脚本的名称,在创建脚本时配置的名称。 是否启用 脚本是否已启用。 勾选:表示已启用。 不勾选:表示禁用。 归属APP 该脚本属于哪个应用。 版本 脚本的版本号。 方法名 脚本的方法名。 可见性 脚本是否可见。 允许覆盖 控制该资源是否可以被定制为新版本,或者是否可以被Addon应用导入,若已存在于Addon应用中,是否允许被另存为新版本。 默认允许,当配置为不允许时,说明如下: 在该应用中基于该资源定制新版本时,会报错“XXX不允许定制新版本,请检查基本属性并确认该资产是否允许覆盖”。 Addon应用里不允许导入该资源。 如果已导入到Addon应用中,无法定制新版本。 描述 脚本的描述信息,建议设置为脚本的作用。 创建人 脚本创建人。 创建时间 脚本创建时间。 最近修改人 最近一次修改脚本的用户名。 最后修改时间 最近一次修改脚本的时间。 输入参数 显示脚本的输入参数,包括参数名、参数类型、是否为集合和描述信息。 如果脚本有多个版本,则显示处于启用状态脚本的参数。 如果多个版本都未启用,则显示最近版本脚本的参数。 输出参数 显示脚本的输出参数,包括参数名、参数类型、是否为集合和描述信息。 如果脚本有多个版本,则显示处于启用状态脚本的参数。 如果多个版本都未启用,则显示最近版本脚本的参数。 版本 显示脚本的所有版本。
  • 操作步骤 参考如何登录新版应用设计器中操作,登录新版应用设计器。 在左侧导航栏中,选择“逻辑”。 单击编排后的,进入添加服务编排页面。 按照下图,创建服务编排GetResourveListFlow,单击“添加”。 图1 创建服务编排 创建该服务编排的入参和出参变量。 由于该服务编排封装的是“ResourceListScript”脚本,所以该服务编排的入参和出参的字段类型和字段名与“ResourceListScript”脚本保持一致。 表5 服务编排变量 变量类型 参数名 Data Type Input/Output Type 普通变量Variable ownerId text Input Only limit number Input Only offset number Input Only totalCount number Output Only 结构体变量Struct resource struct Output Only 在服务编排设计页面右侧,选择,在私有结构体页面单击“新增”。 创建输出参数结构体类型变量“resource”前,首先需要创建私有结构体类型。 图2 添加私有结构体类型 设置页面参数。 在“基本信息”中,输入结构体名字、描述信息。 在“结构体成员”中,设置自定义成员变量,包括设置成员变量的名称、数据类型、是否必填、是否是集合、描述信息等。单击“新增”,可增加成员变量。成员变量需要和“ResourceListScript”脚本中定义的出参“resource”成员变量(参见表4)保持一致。 创建私有结构体后,即可创建私有结构体变量。 图3 配置私有结构体 在服务编排设计页面右侧,选择,在全局上下文页面,单击“对象变量”后的。 图4 单击对象变量后的加号 选择“私有结构体”,设置页面参数。 图5 配置私有结构体变量 表6 私有结构体变量参数说明 参数 参数说明 名称 结构体的变量名称,与“ResourceListScript”脚本中定义的出参命名保持一致。 本示例设置为resource。 私有结构体 结构体变量类型。 本示例选择刚创建的结构体类型名称“resourcestruct”。 默认值 变量的默认取值。 本示例不用配置。 描述 变量的描述说明,建议设置为该变量的作用。 是否为数组 是否为数组型变量,即集合变量。 本示例请勾选。 在服务编排设计页面右侧,选择,在全局上下文页面,单击“变量”后的。 单击新增变量后的“...”,选择“设置”。 图6 设置变量 配置普通变量“ownerId”。 图7 配置变量 表7 普通变量参数说明 参数 参数说明 名称 新建变量的名称。 本示例设置为ownerId。 数据类型 变量的数据类型。 默认值 变量的默认取值。 本示例不用配置。 描述 新增变量的描述说明,建议设置为变量的作用。 是否为数组 是否为数组型变量即集合变量。 本示例不用勾选。 参考上述操作,创建表5中其他普通变量。 在服务编排设计页面右侧,选择,按照表5从全局上下文页面中拖拽参数到相应的入参和出参区域,设置服务编排的入参和出参。 图8 设置服务编排的入参和出参 拖拽“基本”下的“脚本”图元至画布中。 单击,如图9所示,设置页面参数。 将服务编排中的变量赋值给脚本中的输入参数,脚本中的输出参数赋值给服务编排中的变量。 图9 配置脚本 表8 脚本配置参数说明 参数 参数说明 脚本 调用的脚本名称,选择“命名空间_ResourceListScript”。 只有在启用状态下同一应用工程内的脚本,才能被服务编排调用。 输入参数/目标 脚本的输入参数名称,直接在下拉框中选择。 输入参数/源 服务编排中的变量,为目标赋值。 请从“全局上下文”中,拖拽之前创建的服务编排输入变量。 输出参数/源 脚本的输出参数名称,直接在下拉框中选择。 输出参数/目标 服务编排中的变量,脚本中的输出参数赋值给服务编排中的变量,请从“全局上下文”中拖拽之前创建的服务编排输出变量。 若有多个输入参数或输出参数,请单击“新增行”,进行添加。 连接所有元素。 单击页面上方的,保存服务编排。
  • 调试过程 单击页面上方的,输入参数后单击“运行”,运行服务编排。 在“输入参数”中,输入如下参数: { "ownerId":"123", "limit":3, "offset":1} 检查输出页签的结果,是否符合预期。 输出如下: { "interviewId": "002N000000P4ApgMJOM4", "outputs": { "resource": [ { "ownerId": "123", "resourceName": "Folder01", "status": "Waiting", "type": "Folder" }, { "ownerId": "123", "resourceName": "File02", "status": "Waiting", "type": "File" }, { "ownerId": "123", "resourceName": "Folder02", "status": "Waiting", "type": "Folder" } ], "totalCount": 100 }} 单击服务编排设计页面右上方的“跟踪”,打开“日志跟踪器”页面。 在“日志跟踪器”页面中,可查看服务编排执行的每一步的详细信息。 图10 查看跟踪日志 单击页面上方的,启用服务编排。
  • 前提条件 已创建名为“Approved Resource”的Object,用于存储资源数据,该对象中需要包含如下字段。 表2 Approved Resource对象说明 字段标签 字段名称(系统自动生成) 字段类型 取值 读写权限 是否加入界面布局 含义 ownerId ownerId__CST 文本 长度:255 全选 不勾选 资源拥有者ID ResourceName ResourceName__CST 文本 长度:255 全选 不勾选 资源名称 Type Type__CST 选项列表 枚举值如下: File Folder 全选 不勾选 资源类型 SubmitDate SubmitDate__CST 日期/时间 不涉及 全选 不勾选 资源提交时间 ApproveDate ApproveDate__CST 日期/时间 不涉及 全选 不勾选 资源审批时间 Status Status__CST 选项列表 枚举值如下: Waiting Submitted Approved 全选 不勾选 审批状态 已创建场景描述中的脚本。该脚本根据对象的数据生成资源列表数据,用于前台数据呈现。示例脚本为“ResourceListScript.zip”,单击下载链接可获取该脚本包。该脚本中定义的入参和出参说明,如表3和表4所示。 表3 入参说明 参数 参数类型 说明 ownerId string 资源拥有者ID。 limit number 每页展示的资源条数。 offset number 每页展示第一条资源的偏移量,即从offset+1条资源开始展示。 表4 出参说明 参数 参数类型 说明 resource struct 返回资源数组集合。 approveDate:审批时间,若该记录已审批则返回审批时间。 ownerId:资源拥有者ID。 resourceName:资源名称。 status:资源状态。 Waiting:记录未提交。 Submitted:记录已提交未审批。 Approved:记录已审批。 submitDate:资源提交时间。 type:资源类型。 totalCount number 资源总数(固定100)。
  • 使用说明 在如下两个场景,可以基于已有脚本,创建新脚本: 场景1:在已有脚本基础上新建版本。 因业务需要,脚本要实现的能力变化,此时可以基于原有脚本修改,并保存为脚本的新版本。在此场景下,原有脚本作为老版本自动失效。 场景2:在已有脚本基础上新建脚本。 需要开发的新脚本与已有的某个脚本类似,此时可以基于原有脚本修改,再保存为新的脚本名称。在此场景下,原有脚本仍然有效。新脚本和老脚本也没有关联关系,各自独立。
  • 创建空白脚本 参考如何登录新版应用设计器中操作,登录新版应用设计器。 在左侧导航栏中,选择“逻辑”。 单击脚本后的,进入新增脚本页面。 选择“创建一个新脚本”,设置脚本名称(如httpTest),单击“添加”,进入脚本编辑器页面。 图1 新增httpTest脚本 在脚本编辑器中,将以下脚本代码粘贴到代码编辑区。 import * as http from 'http' // 导入http库let client = http.newClient() // 实例化let resp = client.get("https://www.huawei.com/")// 请求网址console.log(resp.headers) // 打印返回headers 单击页面上方的,保存脚本。 运行测试脚本。 单击编辑器上方的,执行脚本。 在页面底部单击测试窗口右上角的,返回消息头信息。 { Age: [ '10309' ], Cache-Control: [ 'no-store' ], Content-Type: [ 'text/html; charset=utf-8' ], Date: [ 'Thu, 01 Dec 2022 03:41:39 GMT' ], Expires: [ 'Wed, 30 Nov 2022 22:01:57 GMT' ], Pragma: [ 'no-cache' ], Processtime: [ '0.049' ], Server: [ 'PAAS-WEB' ], Set-Cookie: [ 'HMF_CI=596020aa4dbe4b6***42343ba04a; Expires=Sat, 31-Dec-22 03:41:39 GMT; Path=/' ], Strict-Transport-Security: [ 'max-age=31536000' ], Ws-S2h-Acc-Level: [ '1' ], X-Content-Type-Options: [ 'nosniff' ], X-Download-Options: [ 'noopen' ], X-Frame-Options: [ 'SAMEORIGIN' ], X-Powered-By: [ 'ASP.NET' ], X-Via: [ '1.1 PSjsczsxga60:2 (Cdn Cache Server V2.0), 1.1 uzhoudianxin101:13 (Cdn Cache Server V2.0), 1.1 wdx18:10 (Cdn Cache Server V2.0)' ], X-Ws-Request-Id: [ '63882273_wdx18_41265-37840' ], X-Xss-Protection: [ '1; mode=block' ] } 以上步骤已完成了一个简单脚本的编写,如果后续其他脚本、服务编排、编译打包等需要继续使用该脚本,则必须单击页面上方的,启用该脚本。如果未启用,其他组件无法查询到该脚本,查询时会报错该脚本不存在或未启用。 后续在新版本功能中如果需要更新该脚本,可单击编辑器上方的,选择“新建版本”,在新建的版本中更改脚本并保存、测试及启用。单击编辑器上方的,选择对比版本,可将当前版本与历史版本进行比对。
  • 调试服务编排 在服务编排设计器中,选中需要设置断点的图元,单击鼠标右键选择“设置断点”。 设置断点后,选中图元,单击鼠标右键选择“禁用断点”或者“移除断点”,可禁用或移除断点。 目前不支持在等待Wait图元及等待图元之后的所有图元,设置断点。 图3 设置断点 单击服务编排设计器上方的,开始调试服务编排。 在弹出的输入参数页面进行配置,单击“运行”。 如果有输入参数,请输入入参,再单击“运行”。如果该服务编排没有输入参数,请直接单击“运行”。 在服务编排编辑器左侧,可看到调试页面,单击,可执行到下一断点,单击,可停止调试,查看执行到某一断点的参数变化是否符合预期。 图4 调试页面 左侧调试页面参数说明: 变量:展示执行到当前断点,服务编排中的变量取值情况,包括全局变量、某图元的输入输出变量等。 调用堆栈:执行到当前断点时,出现的调用堆栈。 正在调试:正在调试的服务编排名。当执行到子服务编排时,该处显示当前子服务编排名。 断点:展示设置的所有断点,选中某一断点,单击鼠标右键可出现“移除断点”、“移除所有断点”、“启用所有断点”或“禁用所有断点”。也可以单击该区域某一断点,进行启用或禁用该断点。 单击服务编排设计器页面右上方的“跟踪”,打开“跟踪器”页面。 在弹出的页面,可查看服务编排执行的每一步的详细信息。 图5 查看详情信息 关闭跟踪器页签,单击,至执行完最后一个断点,调试结束。 重新设计问题图元及前后逻辑,再次运行服务编排,直至结果符合预期。 单击服务编排设计器页面上方的,启用服务编排。 调试服务编排符合预期后,需要启用服务编排。启用后,服务编排才能在系统中使用。
  • 运行服务编排 在服务编排设计器中,单击页面上方的,保存服务编排。 保存后,系统会对服务编排进行编译。如果有报错或者警告,请单击“确定”,在服务编排编辑器页面修改服务编排。修改后再次保存,直至无报错和警告。 保存成功后,单击页面上方的,运行服务编排。 在弹出的输入参数页面进行配置,单击“运行”。 如果有输入参数,请输入参数后,再单击“运行”。如果该服务编排没有输入参数,可直接单击“运行”。 表1 基本信息参数说明 参数 参数说明 请求头参数 请求消息头的参数配置,“键”为参数名,“值”为参数取值。 单击“请求头参数”前的,会显示映射区域“键”和“值”。若需要多个请求头参数,请单击“添加行”。 responseType('arraybuffer') 表示返回响应的类型。勾选时,表示返回响应是一个包含二进制数据的JavaScript ArrayBuffer。 输入参数 填写该服务编排运行实例的输入参数及取值。 检查输出页签的调试结果,是否符合预期。 图1 调试结果 表2 输出页签 调试结果 取值 查看日志 单击该按钮,可弹出“日志跟踪器”,显示该服务编排实例的运行日志。 结果 调试结果。 成功 '参数名'的值'%!v(BADINDEX)'无效或格式非法 输出 该服务编排的输出内容,检查输出是否和预期一致。 若输出结果符合预期,单击服务编排设计器页面上方的,启用服务编排。 若发现输出结果不符合预期,单击服务编排设计器页面右上方的“跟踪”,打开“跟踪器”页面,查看详细信息。 在“跟踪器”页面,查看服务编排执行的每一步的详细信息。检查哪一步的输出不符合预期,并按照调试服务编排进行调试。 图2 日志跟踪器
共100000条