分享一个 不错的 轻量型且功能强大的开源工作流项目 Elsa-core
转载请注明出处: https://www.cnblogs.com/Qbit/p/13871837.html
关于该项目的其他介绍请百度其他文章介绍
目前官方手册和文档还很不完善,研究了几天踩了不少坑,特此留下笔记。
Recive HTTP Request
首先是 Recive HTTP Request 它是最常用的 一个Activity, 可以接收一个POST 或者 GET以及其他常用的 请求方法 , 勾选下方的 Read Content 将从请求的Body获取提交信息,常用的方式是使用一个 POST 方法接收 JSON数据
另外需要注意的是,在工作流的任何位置都可以 放置一个 Recive HTTP Request ,工作流运行到此处时会挂起等待新的请求。
那么就产生一个问题,它的Path 是不可编码的,我们如何区分不同工作流实例的请求呢?请往下看
Correlate
该活动用于将你的业务文档关联,比如 申请单的主键
SetVariable
用于设置流程变量,我们使用一个Recive HTTP Request 接收一个请求后使用 SetVariable 活动保存接收到的数据 ,这里可用的动态表达式包括 Liquid 和 JavaScript,当然也可以直接使用第一个选项 用纯文本
可用的Javascript 内置 函数
input(name)
variable(name)
lastResult()
correlationId()
currentCulture()
newGuid()
需要注意的是 这里的表达式 不支持未声明直接调用
另外:注意 数组变量在保存后将被 解析为 JArray, 它不再是 js 的 Arry, 所以没有 push 方法, 你需要调用 Add()
如 初始化变量时直接使用[]:
myArray=[];
在后续的活动中想要往 myArray 中添加对象然后更新此对象需要再添加一个同名的 Set Variable 活动,然后脚本部分这么写:
myArray.Add(obj); return myArray;
同样的,由于它不是Js对象,你需要调用它的 ToString() 方法将其解析成字符串 再使用JSON.parse 转换为js对象
就像下面这样:
return JSON.stringify({ requestId: correlationId(), approveResult: ApproveLog.approveAction.Value, logs: JSON.parse(ApproveLogList.ToString()) })
请求的实例关联
在流程中的 Recive Http Request 活动 , 如果我们存在多个审批中的文档,需要使用Correlate 活动将其区分,在客户端发送审批请求时需要附带一个 X-Correlation-Id 到你的请求头中,为其赋值为 你的 CorrelationId (也就是申请单主键)
源代码见:https://github.com/elsa-workflows/elsa-core/blob/cc94472301d876cc500326a253f9468c248e6d34/src/activities/Elsa.Activities.Http/RequestHandlers/Handlers/TriggerRequestHandler.cs#L49
如果后台收到此请求,Elsa会从进行中的实例中找到使用 这个 ID 的实例,并继续运行
以下是一个二级审批的工作流
使用 PostMan 进行测试
{ "submitType": "Monthly", "clientUrl": "http://xxxx", "sender": { "userName": "zhangsan", "email": "x" }, "requestId": 3, "approvers": [ { "userName": "ZhangSan1", "email": "x" }, { "userName": "ZhangSan2", "email": "x" } ], "apiBaseUrl": "http://localhost:44388/" }
审批请求:
别忘了在请求头附加 X-Correlation-Id ,也就是启动工作流时发送的 requestId
{ "userName":"ZhangSan1", "remark":"通过啦?","approveAction":true}