页面树结构
转至元数据结尾
转至元数据起始

1.背景介绍

基于DWF开发工具设计的流程模版,在实例化后能够在DWF中运行。流程执行进度往往需要及时通知办理人。这时我们考虑与市面上常见的应用集成,例如与常见办公工具钉钉集成,实现流程活动的及时通知及外链直达。典型场景是:在提交任务以后,发送钉钉消息通知。收到钉钉消息的办理人,直接点击消息链接即可一键跳转至任务表单进行操作。

2.技术路线

DWF为了解决这样实际的业务需求,工作流引擎在执行过程中,调用流程模版中的开始节点的起始脚本(发起工作流实例后调用)、人工节点的前处理脚本(人工任务被激活后调用)和后处理脚本(提交人工任务时调用)、结束节点的结束脚本(流程被终止或完成时调用),利用代码将工作流引擎进行扩展。操作中可以调用第三方应用(钉钉)Api,从而实现工作流引擎与钉钉的集成。

流程操作默认只支持后端脚本操作(从全局操作模块引用),操作的动作为implement类型。包括工作流相关的内置对象:wfTask(流程活动实例)、wfEngine(流程引擎实例)、wfProcess(流程实例)等。在流程操作中调用restful API实现解决方案里特定的任务。接下来介绍如何利用后端脚本操作实现从DWF向钉钉发送消息以及如果通过外链直达回到DWF。

2.1 从DWF向钉钉发送消息

若想实现从DWF向钉钉钉发送消息,需要做好以下准备工作:

完成以上准备工作后,可以在DWF功能模型-全局操作处新增后端操作。实现方式为implement方式,后端脚本。

图1-创建全局操作

脚本内容可以利用DWF后端脚本关键字this.restTemplate调用钉钉服务端API,参考脚本开发任务快速指导手册钉钉开发文档

2.2 外链直达回到DWF

上面讲解了如何通过DWF向钉钉发送消息。在工作流引擎中,办理人收到通知消息后,需要快速直达任务表单进行操作。DWF提供了外链直达功能,可是实现上述业务需求。

App端分享链接地址的表现形式:http://[服务器IP]:[端口]/app-web/[实体类]/[表单英文名]?displayType=[状态]&token=&appName=&appId=&IndexOpr&query=

直达参数解释如下:

  • displayType:必填,表单打开的状态。包括create、edit和visit,这些参数和表单实例状态对应。
  • token:可选,用户令牌,用户单点登录的验证。当用户未填写token时,链接跳转登录页面获取有效token后跳转分享页面。
  • appName:可选,应用通道英文名。登录app后自动切换到的应用通道英文名,默认应用填default。
  • appId:可选,应用通道ID。登录app后自动切换到的应用通道ID。当appId和appName同时填写时,分享页面右上角会出现“返回应用”按钮,支持一键跳转至应用端。
  • indexOpr:可选,默认表单。登录app后的默认打开的表单,若应用modeler端已经定制了默认操作则按照modeler端定制打开默认操作。
    • 默认操作书写格式:一级模块英文名-模块操作英文名(“-”连接)
  • query:可选,表单过滤条件。按照过滤条件对多对象控件进行过滤。
    • 过滤条件书写格式:与过滤条件生成器输出的格式相同,例如and obj.assetName = '搅拌机'

3. 举例

现在我们以工单创建时通知指定用户为例,介绍流程模版的设计及流程操作的脚本设置。

首先在功能模型-全局操作处新增一个全局操作——“钉钉OApi“,通过implement实现后端脚本。脚本业务逻辑为

  • 获取钉钉授权token
  • 设置外链直达连接的link消息给钉钉用户
  • DWF脚本引擎调用钉钉发送消息通知接口实现消息通知

脚本整理如下:

//钉钉开发平台地址:https://ding-doc.dingtalk.com/doc#/bgb96b/ok9au2
//dwf后端脚本
//钉钉认证服务接口
var get_response = this.restTemplate.getForEntity("https://oapi.dingtalk.com/gettoken?appkey=dingm5nyeakbbajexizp&appsecret=zp_SON2tM4__dOBBNQ1be1Lfoje4smd7L9beRkFV7omL518DyXNXw3O01JFhl5EP",java.util.Map.class); //java.lang.String.class,java.util.Map.class
//api请求返回
var get_response_body = get_response.getBody();
this.logger.info("body: "+ get_response_body);
//获取到钉钉中token(钉钉超级用户的token)
var token= get_response_body.get("access_token");
//根据手机号获取userId
var post_response=this.restTemplate.getForEntity("https://oapi.dingtalk.com/user/get_by_mobile?access_token="+token+"&mobile=13910022962",java.util.Map.class)
var post_response_body= post_response.getBody();
var userId = post_response_body.get("userid");

//新请求的body参数
var request_body = {
    "agent_id":"335383708",  /*企业钉钉id*/
    "userid_list": userId/*发动给钉钉用户类表,多个用户用","分割*/
    "msg":{
         "msgtype": "link",/*钉钉消息类型*/
         "link": {
        "messageUrl": "http://166.111.7.145:18180/app-web/forms/WorkOrder/SingleWO?displayType=\"visit\"&token=Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiIsImV4cCI6MTU5MTIzODYwOX0.KkLNpMjbGzn2H33nmLyzL3-Xs8GCWGBrjeELQZAOMqwdymHsZtFJ0qGcDMnepKGaOWFdXltsVLF93R46RNZiRA",/*DWF外链直达分享连接*/
        "picUrl":"@lALPDf0ivBfr1rTNAgDNAgA",/*钉钉接收到消息的log图片钉钉中的url*/
        "title": "工单创建",
        "text": "测试"
       }
    }
}
//发送分享url到钉钉的请求
var post_response = this.restTemplate.postForEntity(
    "https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2?access_token="+token ,
    request_body, Map.class);
this.logger.info("post_response------"+post_response);

流程操作创建完毕后,进入流程模型-流程建模页面,创建一个流程模版,如下图所示。为人工任务节点1绑定一个后处理操作“钉钉OApi“。

图2-编辑流程模版

流程建模完毕后,发布流程模版。可在应用端通过”查看流程模版“插件查看已发布的流程模版。当人工任务1提交后,工作流引擎会调用后处理脚本执行后端脚本逻辑。从DWF向钉钉发送通知。通知效果如下图所示。

图3-DWF发送给钉钉用户通知

最后消息收件人可直接点击卡片实现从钉钉跳回DWF系统,如下图所示。

图4-外链直达DWF页面

  • 无标签