目录 |
---|
1.HCM机器人所在位置
token已无效化处理
系统设置 → > 基础服务 →> 机器人设置
2.HCM机器人存在背景
HCM机器人可实现链式任务调度,在页面上想看到进度条的任务调度,想实现云函数的逻辑但是又不会写云函数,想仅仅通过配置即可达到云函数的效果。
一般业务上使用场景就是:1)在元数据中配置按钮,按钮里面有固定参数传到机器人中执行,来实现业务逻辑 。(按钮包括同步调动和异步调用方式(WS))
2)通过机器人设置中点击执行机器人进行执行预置好的逻辑任务HCM机器人可实现连式任务调度,在页面上想看到进度条的任务调度,想实现云函数的逻辑但是又不会写云函数,想仅仅通过配置即可达到云函数的效果,
3.HCM机器人 特点
特点:
1.其特点在于 对于单个机器人 任务有顺序执行, 单条链路执行不可分叉,不可同步
2.针对于单个任务 有高级用法 迭代模式循环迭代模式/同步模式队列模式
3.开始执行前可预置一些参数 这些参数统一放在参数池context中 这些参数统一放在上下文context中 可供下次任务执行使用
4.每次任务执行可从 参数池获取 上下文获取 参数使用, 在任务结束时可放入新的参数
5.任务在特定的情况可跳过
6.任务报错可设置继续执行,可设置中断,报错信息可放到参数池,供下引用任务报错可设置继续执行,可设置中断,报错信息可放到上下文,供下引用
7.参数池 上下文 包含哪些参数? 1.传入的params, 2.机器人脚本里面的context, 3.self.context (这里面可就丰富了 当前登录人信息,权限,公司信息,等等)
4.配置 说明
命名一个机器人,基础服务-机器人设置-点击新增
我们重点描述 脚本怎么配置
备注:唯一key值,一般 执行同步任务的机器人用到的是名称做为唯一标识,异步WS任务绑定机器人的id作为唯一标识,即shortcut_id。
1、action 配置
1)异步actions配置如下:
注意⚠️ action的key为CALC,api为:hcm.shortcut.exec ,shortcut_id:17 17为设置好的机器人的id,异步的绑定的是机器人id
下面按钮含义:将选中list的所有数据等同于node_ids变量传给id等于17的机器人的上下文中做处理
代码块 | ||||||
---|---|---|---|---|---|---|
| ||||||
{ "actions": [{ "actionkey": "SHORTCUTexec", "conditionaction": "MULTI_ITEMCALC", "labelcondition": "test1MULTI_ITEM", "keylabel": "test1", "optionsapi": { "hcm.shortcut.exec", "nameparams": "机器人脚本示例", #机器人名称用于确定使用的是那个机器人 "params": "=function(params){let _ret={items:params=(context)=>{return {shortcut_id:17,params:{'node_ids':ITEMS()}}}" }] } |
2)同步actions配置如下:
注意⚠️ action的key为SHORTCUT,name:机器人脚本示例 机器人脚本示例为名称叫 机器人脚本示例的机器人,同步的绑定的是机器人的名称
下面按钮含义:将选中list的所有数据等同于node_ids变量传给名称等于机器人脚本示例的机器人做上下文中参数处理
代码块 | ||||||
---|---|---|---|---|---|---|
| ||||||
{ "actions": [ { .selected.map(v=>v.id)};return _ret}" #params 将作为参数加入到参数池 } }] }"key": "exec2", "action": "SHORTCUT", "condition": "MULTI_ITEM", "label": "test2", "options": { "name": "机器人脚本示例", "params": "=function(){return {'node_ids':ITEMS()}}" } }] } |
具体按钮参考地址:https://inspur6.hcmcloud.cn/#/common_model_list?model=TestModel
参数名 | 类型 | 说明 |
---|---|---|
shortcut_id | int | HCM机器人ID |
params | dict | 传入参数 |
name | str | 机器人名称 |
stages | list | 任务list,里面包含了多个任务的详细信息,每个任务对应一个dict |
以上我们说明了 机器人在元数据按钮的配置方式, 包括同步和异步两个示例都可使用,那么接下来将对 内部机器人的脚本进行说明。
2、脚本配置参数
参数说明:
脚本配置参数路径 | 类型 | 说明 | |
---|---|---|---|
stages | list | 任务list,里面包含了多个任务的详细信息,每个任务对应一个dict | |
context | dict | 脚本预制上下文 | |
return | list | 返回值字典 | |
stages.meta | dict | 单个任务接口信息 | 需要 name (接口名称)和 param (接口参数)在Message引擎下 有to(目标人ID,缺省发给自己) 和context(消息内容) 两个参数 |
stages.name | str | 单个任务名称 会在执行过程中提示任务执行情况 | |
stages.engine | str | 任务接口引擎 | OpenAPI:本系统接口。 RemoteAPI:外系统接口 使用这个引擎 stages.meta 里面需要有url 和token Shortcut:调用其他的HCM机器人,在这里stages.meta.name 是其他机器人的名称, Message:发送消息 这个引擎下stages.meta |
stages.output | dict | 本任务执行结束输出的内容 | 包含两个参数message 页面消息提示 ,context 类型为dict (本任务结束将一些参数放入上下文中) |
stages.iterator | 表达式/可迭代对象 | 根据迭代对象 循环执行 | ITER_V 特定写法stages.iterator 单元值 ITER_I 特定写法stages.iterator 单元值 的index 比如list 的index |
stages.parallel | 表达式/可迭代对象 | 根据迭代对象 循环执行加入队列 | ITER_V 特定写法stages.iterator 单元值 ITER_I 特定写法stages.iterator 单元值 的index 比如list 的index |
stages.queue | str | 只有定义了stages.parallel 才有用到意思是在什么队列执行缺省shortcut队列 | |
stages.error | dict | 任务执行失败需要的操作 | 包含两个参数 ignore 执行失败 是否跳过,跳过就继续执行下面的任务,不跳过整个将结束,没有这个参数也将直接结束 context 是将一些参数 放入上下文中 在这里 err 为报错堆栈信息 固定写法 |
stages.condition | 表达式/boolean | 是否跳过此任务 | |
output | stages下meta返回值 | context 上下文 message 输出执行消息 | 例子:"output": { "context": { "info": "=ret" } ret为固定变量,即stages下meta的返回值,此配置代表将返回值给到环境变量中,下一个任务可以调用使用 |
配置举例一:
需求:选中自定义模型TestModel下的数据,将该条TestModel模型下note备注字段编辑成: 已完成{}的查验
1、在list层配置调取机器人按钮:
代码块 |
---|
{
"key": "exec2",
"action": "SHORTCUT",
"condition": "MULTI_ITEM",
"label": "test2",
"options": {
"name": "机器人脚本示例",
"params": "=function(){return {'node_ids':ITEMS()}}"
}
} |
此时调用了名称为:机器人脚本示例的机器人,将参数node_ids传入机器人中
2、新增一个机器人脚本示例的机器人
机器人设置-新增
3、设置对应脚本
代码块 |
---|
{
"stages": [{
"meta": {
"name": "hcm.model.edit",
"param": {
"id_": "=ITER_V['id']",
"info": {
"note": "='已完成{}的查验'.format(str(ITER_V.get('employee',{}).get('name')))"
},
"model": "TestModel"
}
},
"name": "机器人脚本示例",
"engine": "OpenAPI",
"iterator": "=node_ids"
}]
} |
配置解读:
1、首先机器人格式是一个json,json里面包含stages,stages对应一个个任务。
2、任务里有几个参数:1、engine:因为我们调取内部的api,所以engine对应的是OPenAPI
2、name:任务名称
3、meta:包含单个任务的执行信息
"name":"hcm.model.edit" #调用api名字,
"param":{ "id_": "=ITER_V['id']", "info": { "note": "='已完成{}的查验'.format(str(ITER_V.get('employee',{}).get('name')))" }, "model": "TestModel" } #调用api参数
4、iterator: 因为选中的数据是多条,需要多条数据的迭代编辑,需要设置迭代的内容即迭代list。因为我们上一步自定义按钮将选中的数据放在node_ids参数中,
所以配置 "iterator": "=node_ids"
4、执行效果:
配置举例二:
机器人设计规则:
1)取外部inspur6环境下车厘子的信息
2)取不到把错误信息填入到SyncOuterRecord模型日志下,能取到返回人员id信息
3)调用之前定义的机器人脚本示例 机器人脚本
4)利用机器人发消息配置给系统发送消息
5)机器人最后返回人员id
注意:上下文传递信息主要写在output中
代码块 | ||||||
---|---|---|---|---|---|---|
| ||||||
{ "return": { "keyid": "exec"x_ID" }, "stages": [{ "meta": { "actionurl": "CALC""https://inspur6.hcmcloud.cn", "conditionname": "ITEMhcm.model.list", "labelparam": "test2", { "apimodel": "hcm.shortcut.execEmployee", "paramsfilter_dict": "=(context)=>{return {shortcut_id:3,params:{'a':1}}}" #shortcut_id 作为确定是那个机器人也可以换成name,这样也可以确定机器人,内部的params将作为参数加入到参数池 { } |
...
shortcut_id
...
params
...
stages
...
以上我们说明了 机器人在元数据的配置, 两个示例都可使用,那么接下来将对 机器人脚本进行说明
代码块 | ||||||
---|---|---|---|---|---|---|
| ||||||
{ "returnname": { "车厘子" "x_mobile": "=x_mobile" } }, "stagestoken": [{ "hcm0af7a67123aa3352d74b3434596b1443sdf" }, "metaname": { "取外部数据", "urlengine": "https://lizhongjie.hcmcloud.cnRemoteAPI", "nameoutput": "hcm.model.list",{ "paramcontext": { "modelx_ID": "Employee", =ret['list'][0]['id']" "filter_dict": {}, "message": "='共{}条记录'.format(ret['count'])" "name": "李中杰" } }, { "meta": { } }"name": "hcm.model.get", "tokenparam": "hcmf214e3bb9830f574a89e52c476b58c7c56cade3d"{ }, "nameid_": "取外部数据=x_ID", "enginemodel": "RemoteAPIEmployee", "output": { } "context": { }, "name": "查看本系统是否有该数据", "x_IDerror": "=ret['list'][0]['id']" { "ignore": }true, "messagecontext": "='共{}条记录'.format(ret['count'])" } }, { "is_error": true, "meta": { "nameget_mobile_error": "hcm.model.get",=err" "param": {} }, "id_engine": "=x_IDOpenAPI", "output": { "modelcontext": "Employee"{ } }"is_error": false, "name": "查看本系统是否有该数据", "erroremployee_id": {"=ret['list'][0]['id']" "ignore": true}, "contextmessage": { "='共{}条记录'.format(ret['count'])" } }, { "is_errormeta": true,{ "get_mobile_error"name": "=err"hcm.model.create", }"param": { }, "engineinfo": "OpenAPI", { "output": { "name": "机器人测试日志", "context": { "is_errortype": false2, "employee_id "content": "=ret['list'][0]['id']"{ }, "messageget_mobile_error": "='共{}条记录'.format(ret['count']str(get_mobile_error)" } }, { } "meta": { "name": "hcm.model.create" }, "parammodel": {"SyncOuterRecord" "info": {} }, "name": "机器人测试日志记录日志", "engine": "OpenAPI", "typeoutput": 2{}, "condition": "=is_error" }, { "contentmeta": { "name": "机器人脚本示例", "get_mobile_errorparam": "=str(get_mobile_error)" { "node_ids": [{ } "id": }402186251, "modelemployee": "SyncOuterRecord"{ } }, "name": "记录日志梁天华", "engine": "OpenAPI", "output": {}, } "condition": "=is_error" }] }, { } "meta": { }, "name": "HCM机器人迭代模式调用其他机器人", "paramengine": {} "Shortcut" }, { "namemeta": "调用其他机器人", { "engine": "Shortcutto": 1508957, }, { "metasender": {1508957, "contextcontent": "本次HCM机器人演示成功" }, "name": "发送消息", "engine": "Message" }], "context": {} } |
配置地址:https://inspur6.hcmcloud.cn/#/pc/setting/setting.hcm_shortcut?page_index=1&page_size=20
配置举例三:
机器人设计规则:
1)将语种代码项下的描述编辑成:描述:xx
代码块 | ||||||
---|---|---|---|---|---|---|
| ||||||
{ "stages": [{ "meta": { "name": "hcm.model.list", "param": { "model": "common_basic_item_data.语种", "page_size": 999 } }, "name": "部署元数据", "engine": "OpenAPI", "output": { "context": { "basic_item_info": "=ret['list']" }, "message": "='共获取{}条数据'.format(len(ret['list']))" } }, { "meta": { "name": "hcm.model.edit", "param": { "id_": "=ITER_V['id']", "info": { "description": "='第二次描述,{}'.format(ITER_V['name'])" }, "model": "common_basic_item_data.语种" } }, "name": "循环编辑代码项", "engine": "OpenAPI", "output": { "message": "='编辑代码项{}完成'.format(ret['name'])" }, "iterator": "=basic_item_info" }] } |
机器人异步模式:
代码块 | ||||||
---|---|---|---|---|---|---|
| ||||||
{ "stages": [{ "meta": { "name": "hcm.model.list", "param": { "model": "common_basic_item_data.语种", "page_size": 999 } }, "name": "部署元数据", "engine": "OpenAPI", "output": { "context": { "basic_item_info": "=ret['list']" }, "message": "='共获取{}条数据'.format(len(ret['list']))" } }, { "meta": { "name": "hcm.model.edit", "param": { "id_": "=ITER_V['id']", "info": { "description": "='第一次{}'.format(ITER_V['name'])" }, "model": "common_basic_item_data.语种" } }, "name": "循环编辑代码项", "queue": "syn", "engine": "OpenAPI", "output": { "message": "='编辑代码项{}完成'.format(ret['name'])" }, "parallel": "=basic_item_info" }] } |