本文介绍了金蝶标准产品消息渠道扩展的需求背景、实现方案及开发过程。金蝶标准产品预置七种渠道,但用户若使用其他第三方移动办公软件(如泛微OA),需进行二次扩展开发。实现方案包括人员信息同步、单点登录处理及渠道API预研。开发过程中需考虑人员同步、待办与链接消息的单点登录、渠道API的调用,并详细说明了泛微渠道开发的具体步骤和代码实现方法,包括创建待办、处理待办、删除待办、推送消息等关键方法的复写说明。同时,还提醒了扩展渠道时需注意的问题,如网络不稳定导致的消息推送失败处理、待办ID的唯一性处理等。
标签:
消息渠道、扩展
需求背景:
金蝶标准产品预置七种渠道---短信、邮件、云之家、钉钉、企业微信、welink、生态云之家。能满足大部分用户的消息推送需求,若用户使用其他第三方移动办公软件,比如泛微OA,蓝凌OA,则需要对消息渠道进行二次扩展开发,以满足自身需求。
实现方案:
开发准备
在渠道二次开发之前,开发人员需要考虑三方面问题:
1:人员同步
推送待办以及消息到泛微OA等第三方系统,需要以第三方系统的人员为基础,故此,泛微企业人员信息如何同步至苍穹系统,并如何存储双方人员映射关系是一个基本问题。
标准的原厂方案:
(1) 同步功能,标准产品中在[基础服务]-[人员]菜单中,同步功能所需的参数放在[配置工具]-[系统参数]菜单中。
同步主要逻辑是,通过泛微提供的组织人员接口,获取到人员信息,并以两个系统中人员的焦点(比如手机号、邮箱账号)作为比较条件,建立两个系统的人员映射关系,并存储至苍穹系统中。
同步功能需要兼容多次同步新增人员的需求。
(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) 消息渠道开发
泛微渠道可以消息渠道新增功能,选择”其他”,填写实现类,完成功能渠道界面配置工作。
此外,二开同事若是需要将泛微的必要参数抽象到配置界面上,用户也可以通过扩展msg_channels表单,达到元数据二次开发的需求;也可以在实现类代码中将泛微参数固定在代码中,减少工作量。
(2) 代码开发
泛微渠道实现类代码开发,在该类中实现创建待办、处理待办、删除待办、推送消息等相关逻辑内容,渠道实现类需要继承kd.bos.workflow.engine.msg.handler.AbstractMessageServiceHandler抽象类,并复写抽象类中若干必要方法。
具体逻辑可以参考原厂标准云之家渠道解析类YunzhijiaServiceHandler.java
以下为复写关键方法说明:
(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方法中抛出异常,该异常被上游功能捕获,失败消息记录到消息日志列表中,等待重试机制重试;
(2) 待办创建、处理、删除若是遇到调用接口失败的情况,请抛出异常给上游逻辑,触发重试机制;
(3) 第三方系统中待办请重视待办ID的唯一性问题,苍穹中多人处理的任务,taskId是一样的,针对有的第三方系统,可以拼接人员Id做唯一性处理。
推荐阅读