标签:

消息渠道、扩展

需求背景:

金蝶标准产品预置七种渠道---短信、邮件、云之家、钉钉、企业微信、welink、生态云之家。能满足大部分用户的消息推送需求,若用户使用其他第三方移动办公软件,比如泛微OA,蓝凌OA,则需要对消息渠道进行二次扩展开发,以满足自身需求。

实现方案:

开发准备

在渠道二次开发之前,开发人员需要考虑三方面问题:

1:人员同步

推送待办以及消息到泛微OA等第三方系统,需要以第三方系统的人员为基础,故此,泛微企业人员信息如何同步至苍穹系统,并如何存储双方人员映射关系是一个基本问题。

 

标准的原厂方案:

(1) 同步功能,标准产品中在[基础服务]-[人员]菜单中,同步功能所需的参数放在[配置工具]-[系统参数]菜单中。

image.png

image.png


同步主要逻辑是,通过泛微提供的组织人员接口,获取到人员信息,并以两个系统中人员的焦点(比如手机号、邮箱账号)作为比较条件,建立两个系统的人员映射关系,并存储至苍穹系统中。

同步功能需要兼容多次同步新增人员的需求。

 

(2) 苍穹与钉钉等第三方系统人员映射关系存储于t_bas_immapping表,二开扩展渠道也可以参考该做法。

字段

编码

类型

描述


FID

Bigint(20)


映射类型ID

FIMTYPEID

Bigint(20)

0~100为原厂预留,扩展渠道第三方需要>100

苍穹人员ID

FUSERID

Bigint(20)

t_sec_use表中ID

第三方系统人员ID

FOPENID

Varchar(80)


 

2:待办&链接消息单点登录苍穹

泛微的链接消息以及待办任务,在点击之后,需要链接到苍穹处理页面,为了方便用户使用,需要处理泛微消息的单点登录问题。

目前的方案一般是在链接消息的url上拼接参数,苍穹登录模块加装增加处理逻辑,链接由nginx转交之后,由登录模块识别并自动登录到苍穹目标单据,用户执行后续操作。

(1) 单点登录苍穹可参考

https://vip.kingdee.com/article/50880639125272576

(2) 渠道解析类中createtodo() sendMessage()方法中获取todoInfo和messageInfo的链接,并根据登录要求加以改造。

3:渠道api预研

预研泛微提供的对外消息&待办接口,重点可以查看一下几个HttpAPI:

(这里说的是第三方泛微的api,不是苍穹的)

1. 普通消息推送接口,推送文本消息和链接消息;

2. 待办创建接口,创建泛微待办任务;

3. 待办状态更新接口,待办变已办任务;

4. 待办删除接口,删除待办;

用户可以根据自己需求,结合泛微提供的接口,抽取苍穹所需的泛微参数配置信息比如企业ID等。

渠道开发过程

泛微渠道开发

(1) 消息渠道开发

image.png

泛微渠道可以消息渠道新增功能,选择”其他”,填写实现类,完成功能渠道界面配置工作。

此外,二开同事若是需要将泛微的必要参数抽象到配置界面上,用户也可以通过扩展msg_channels表单,达到元数据二次开发的需求;也可以在实现类代码中将泛微参数固定在代码中,减少工作量。

 image.png

(2) 代码开发

泛微渠道实现类代码开发,在该类中实现创建待办、处理待办、删除待办、推送消息等相关逻辑内容,渠道实现类需要继承kd.bos.workflow.engine.msg.handler.AbstractMessageServiceHandler抽象类,并复写抽象类中若干必要方法。

具体逻辑可以参考原厂标准云之家渠道解析类YunzhijiaServiceHandler.java

image.png

以下为复写关键方法说明:

(A) createTodo方法:

public void   createToDo(MessageContext ctx, ToDoInfo info){

1.     流程节点任务,创建待办;

2.     todoInfo&messageContext中包含了绝大部分场景中待办所需参数数据;

3.     在该方法中调用泛微接口,推送待办任务;

4.     标准产品中没有记录待办日志,二开根据需求决定是否将待办日志落库处理,数据库表以及落库方式没有要求;

5.     在方法的逻辑执行过程中,若是出现异常,请向上抛出,系统会根据异常,自动重试再次推送待办;

6.     对于待办链接的改造可以在该方法中进行;

}

(B)  dealTodo方法:

public void   dealToDo(MessageContext   ctx, ToDoInfo info){

1. 流程处理待办任务;

2. 在该方法中调用泛微接口,推送待办处理请求;

}

(C)  deleteTodo方法:

public void   deleteTodo(MessageContext   ctx, ToDoInfo info){

1.     删除待办任务方法;

2.     转交任务、任务的处理都会调用该方法,删除掉泛微方的待办;

3.     工作流中撤回,或多人收到任务,其中一人审批,删除其他人的待办,会调用该方法

4.     在该方法中调用泛微接口,发起删除泛微待办请求;  

}

(D) checkTodo方法:

public void   checkTodo(MessageContext   ctx, ToDoInfo info){

    1.校验第三方待办处理情况,一般不复写该方法;

}

(E)  sendMessage方法:

public void   sendMessage(MessageContext ctx, MessageInfo message) {

1.     工作流的任务类消息,比如传阅、协办消息、节点消息、催办消息等都会推送到该方法中,业务调用消息中心接口推送的消息同理也会推送到该接口中;

2.     发送报警、预警、通知消息,调用该方法;

3.     ctx=null, 对于流程类消息,可以在messageInfo.getParam()方法中获取到ctx数据;

4.     调用泛微推送消息接口,推送泛微消息;

5.     若是调用接口部分请求失败,请向上抛出异常,异常方式可以参考原厂逻辑,系统会自动重试再次推送消息;

6.     对于链接消息中URL的改造可以在该方法中进行

}

(F)  deleteProcessInstance方法:

public void   deleteProcessInstance(MessageContext ctx, Long proceInstanceId){

       1.若第三方系统中有流程,苍穹删除流程的动作会推送到该方法汇总,若第三方系统中没有流程相关,则无需复写该方法;

}

(G) completeProcessInstance方法:

public void   completeProcessInstance(MessageContext   ctx, Long proceInstanceId){

1.     若第三方系统中有流程,苍穹流程结束动作会推送到该方法汇总,若第三方系统中没有流程相关,则无需复写该方法;

}

 

关于扩展渠道几点说明

(1) 由于苍穹与第三方系统之间,通过网络关联,由于网略不稳定性等因素,可能导致消息推送失败,此时,可以在sendMessage方法中抛出异常,该异常被上游功能捕获,失败消息记录到消息日志列表中,等待重试机制重试;

image.png

(2) 待办创建、处理、删除若是遇到调用接口失败的情况,请抛出异常给上游逻辑,触发重试机制;

image.png

(3) 第三方系统中待办请重视待办ID的唯一性问题,苍穹中多人处理的任务,taskId是一样的,针对有的第三方系统,可以拼接人员Id做唯一性处理。