**简要描述：** 

- 接口调用说明
   模块对接自定义申请按钮效果如下：
![](http://192.168.7.199:4999/server/index.php?s=/api/attachment/visitFile/sign/79bca139c01a225bbe44dcf0f13563ef)
如图支持在IM消息中加入相关处理按钮
其中忽略提醒和标记处理是根据后台传过去的按钮生成的

**按钮点击事件说明**
 发送消息之后，在消息上点击按钮支持两种模式；
 1 直接请求消息中心的http接口，然后消息中心调用业务模块的dubbo接口（dubbo接口由消息中心统一定义，对接模块实现相关逻辑）。
 2 点击之后打开业务模块提供的组件，业务模块在自己的组件里面实现业务逻辑，处理完成之后，调用消息中心的dubbo接口处理后续操作(比如隐藏按钮，修改消息内容，标记已读，标记已处理等)。
 组件对接参考文档 http://192.168.0.135/web/#/26/5420
 
 注意，部分场景下按钮对应的功能处理完成之后需要隐藏按钮时，仍然需要请求消息中心的dubbo接口隐藏按钮。  比如 消息发出去之后，用户在企业微信上处理了相关事项，也需要调用消息中心接口将im消息中的按钮隐藏了。


###1、 发送消息时候逻辑处理
 **1.1、调用消息中心接口基础上加了一个按钮参数参数** 

```//消息发送接口
com.weaver.mc.api.entity.im.ImComponentEntity
消息发送接口增加了按钮参数：
com.weaver.mc.api.entity.BaseMessageEntity#buttons
 private List<ImComponentEntity> buttons;
```
**1.2、ImComponentEntity参数说明**

```
    /**
     * 按钮标识，由业务模块决定按钮的类型，如果按钮直接通过调用dubbo接口，再业务模块实现的dubbo接口中会传递过去。 如果打开事项组件，将会传递给组件。
     */
    private String buttonFlag;
    /**
     * 按鈕处理类型 1点击按钮直接调用http地址，2 点击时，根据moduleFlag,commponmentName调用页面组件
     */
    private int type;
    /**
     * 按钮名称国际化id（用im模块生成 前端）
     */
    private long i18nId;
    /**
     * 背景颜色
     */
    private String bgColor;
	 @ApiModelProperty("按钮字体颜色")
    private String fontColor;
	 @ApiModelProperty("按钮名称，传递名称之后，i18nId无效")
    private String name;
    /**
     * 按钮自定义参数，调用Http地址时，消息中心通过dubbo接口将此参数传递给业务模块；使用组件时，此参数将传递到组件
     */
    private Map<String, String> param;   
    /**
     * 组件模块标识
     */
    private String moduleFlag;
    /**
     * 组件名称
     */
    private String componmentName;
	@ApiModelProperty("是否支持云桥按钮")
private boolean supportCloudBridge;



```
参数说明

  


|参数名|必填|类型|说明|
|:-----  |:-----|-----                           |
|buttonFlag |是|string |由各个模块自定义该参数用于标识按钮，按钮点击的时候候会回传给业务模块做对应的业务逻辑处理    |
|type |是|  int |按鈕处理类型 type=1点击按钮直接调用消息中心http地址消息中心会回调各个业务模块rpc接口，type=2 点击时，根据moduleFlag,commponmentName调用页面组件（用于IM前端点击按钮具体跳转） |
|i18nId|否 | long  |按钮名称国家化ID需要找IM郭泽要或者用im模块生成（前端） |
|name|否| string  |按钮名称，传递名称之后，i18nId无效 |
|bgColor |否|string  |按钮的背景颜色  |
|fontColor |否|string  |按钮字体颜色  |
|param |否|Map<String, String>  | 按钮自定义参数，调用Http地址时，消息中心通过dubbo接口将此参数传递给业务模块；使用组件时，此参数将传递到组件 |
|moduleFlag|否|string|前端项目模块标识|
|componmentName|否|string|当type为2的时候需要传入前端暴露出来的组件名称用于前端调用|
|supportCloudBridge|否|boolean|是否支持云桥（type为2的时候不生效）|
以待办模块为例：
```
   private void setApplyButtons(SendMessageEntity smg, MyWaitProcessPo po) {
        List<ImComponentEntity> buttons = Lists.newArrayList();
        ImComponentEntity imComponentEntity = new ImComponentEntity();
        //该参数IM回调的时候会传给业务模块 用于区分当前点击的哪个按钮 各个业务模块自己定义值
        imComponentEntity.setButtonFlag("01");
        imComponentEntity.setType(2);
        imComponentEntity.setBgColor("#5D9CEC");
        Map<String, String> map = Maps.newHashMap();
        map.put("waitId", po.getId() + "");
        if (ValidateUtil.isNotEmpty(po.getEntityId())) {
            map.put("entityId", po.getEntityId() + "");

        }
        imComponentEntity.setComponmentName("MsgWaitCard");
        imComponentEntity.setModuleFlag("@weapp/my");
        imComponentEntity.setParam(map);
        //标记完成
        imComponentEntity.setI18nId(151870L);
        buttons.add(imComponentEntity);
        //忽略提醒
        ImComponentEntity imComponentEntity1 = new ImComponentEntity();
        imComponentEntity1.setButtonFlag("02");
        Map<String, String> map1 = Maps.newHashMap();
        map1.put("waitId", po.getId() + "");
        if (ValidateUtil.isNotEmpty(po.getEntityId())) {
            map1.put("entityId", po.getEntityId() + "");
        }
        imComponentEntity1.setBgColor("#ebebeb");
        imComponentEntity1.setType(1);
        imComponentEntity1.setParam(map1);
        //忽略提醒
        imComponentEntity1.setI18nId(151871L);
        buttons.add(imComponentEntity1);
        smg.setButtons(buttons);

    }
```
###2、 点击按钮回调业务模块逻辑
 **2.1、当按钮type为1时候** 
 业务模块需要实现消息中心提供的rpc接口 rpc接口需要添加group分组具体处理：
 
```
@Service("my_ImExecuteRest")
public class MyImExecuteRestImpl implements ImExecuteRest {
    @Override
    public WeaResult<ImExecuteResult> execute(ImExecuteEntity req) {
        String flag = req.getButtonFlag();
        if (ValidateUtil.isEmpty(flag)) {
            return WeaResult.fail("buttonFlag can not be null");
        }
        ImExecuteResult imExecuteResult = new ImExecuteResult();
        if ("02".equals(flag)) {
            //如果是02代表忽略提醒 需要隐藏掉按钮即可
            List<Integer> statues = Lists.newArrayList();
            statues.add(1);
           // statues.add(4);
            statues.add(2);
            statues.add(3);
            imExecuteResult.setStatues(statues);
            imExecuteResult.setText(new Date().toString());
        }
        return WeaResult.success(imExecuteResult);
    }
```
 
  **2.1、当按钮type为2时候** 
  当调用了业务模块处理了相关业务逻辑后需要调用消息中心接口如例：
 ```
 @Autowired
private AsyncSystemMessageRest asyncSystemMessageRest;
ExecuteButtonMsgReq req = new ExecuteButtonMsgReq();
                    req.setModule(MessageModule.WAIT);
                    req.setEvent(MessageEvent.NOTIFY);
                    req.setOperator(operator);
                    req.setMsgId(msgId);
                    List<Integer> statues = Lists.newArrayList();
                    statues.add(1);
                    statues.add(3);
                    statues.add(2);
                    //statues.add(4);
                    req.setText(new Date().toString());
                    req.setStatues(statues);
                    if (log.isDebugEnabled()) {
                        log.debug("结束待办调用消息接口开始，入参为:{}", FastJsonUtil.objecToString(req));
                    }
                    WeaResult<Boolean> weaResult = asyncSystemMessageRest.executeButtonMsg(req);
```
  入参：com.weaver.mc.api.entity.ExecuteButtonMsgReq
  ```java
 /**
     * 消息id，调用发送接口返回的data
     */
    private long msgId;
    /**
     * 模块
     */
    private MessageModule module;


    /**
     * 处理人
     */
    private UserEntity operator;

 /**
     * 执行状态数据，1 代表隐藏按钮，2 标记已读，3 标记已处理，4修改消息
     */
    private List<Integer> statues;
    /**
     * statues包含4时，才会使用
     */
    private Entity entity;

    private I18nEntity i18n;

    private String text = "";
```
参数说明

  


|参数名|必填|类型|说明|
|:-----  |:-----|-----                           |
|msgId |是|long |消息ID    |
|module |是|  MessageModule |模块 |
|operator|是 | UserEntity  |处理人 |
|statues |是| List<Integer>   |1 代表隐藏按钮，2 标记已读，3 标记已处理，4修改消息  |
|entity |否|Entity  | 修改事项时候传入 |
|text|否|string|修改时候传入|

###其他：总体逻辑处理流程
（1）按钮type为1:业务模块发起消息中心调用（新增按钮参数）——>消息中心调用IM发送参数——>IM获取按钮参数（按钮类型为1）——>调用消息中心http接口——>消息中心回调业务模块rpc接口（com.weaver.mc.api.rest.ImExecuteRest）——>业务模块根据消息中      心回传的参数做对应业务逻辑处理（会回传buttonFlag）—>业务模块返回（com.weaver.mc.api.entity.im.ImExecuteResult）——>消息中心根据返回参数调用IM接口做具体处理;
(2)  按钮类型为2：业务模块发起消息中心调用（新增按钮参数）——>消息中心调用IM发送参数——>IM获取按钮参数（按钮类型为2）——>IM打开业务模块组件——>业务组件直接调用自己模块的接口——>业务模块逻辑处理—>业务模块调用消息中心接口      	  	(com.weaver.mc.api.async.AsyncSystemMessageRest#executeButtonMsg)——>消息中心根据返回参数调用IM以及云桥接口做具体处理;**流程图如下：**
![](https://im.weaver.com.cn/server/index.php?s=/api/attachment/visitFile&sign=8880a78f932843c9c6713de823411330)

###注意
只有待办消息才支持消息处理因此发送消息的时候需要把com.weaver.mc.api.entity.SendMessageEntity#todo参数设置为true

https://front2.yunteams.cn/mobile/em/visitElement?type=1&id=1689658727230010064&ot=1&isTest=1&app=@weapp/hrm&n=HrmAddFriendCheck  app测试地址
