Ver Fonte

更新wukongAPi和新增webhook回调接口支持

DESKTOP-VAEGFGM\zqc há 11 meses atrás
pai
commit
93b2a2ae6a
18 ficheiros alterados com 842 adições e 4 exclusões
  1. 24 4
      menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/controller/app/WuKongWebhookController.java
  2. 51 0
      menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/controller/app/base/wukong/ImHeaderReqVo.java
  3. 104 0
      menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/controller/app/base/wukong/ImMessageSendReqVo.java
  4. 33 0
      menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/controller/app/base/wukong/ImUserDeviceQuitReqVo.java
  5. 37 0
      menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/controller/app/base/wukong/MessageSendbatchRespVo.java
  6. 47 0
      menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/controller/app/base/wukong/UserMsgPageReqVO.java
  7. 62 0
      menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/controller/app/base/wukong/UserMsgRespVO.java
  8. 48 0
      menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/controller/app/base/wukong/UserMsgSaveReqVO.java
  9. 29 0
      menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/controller/app/base/wukong/UserOnlinePageReqVO.java
  10. 38 0
      menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/controller/app/base/wukong/UserOnlineRespVO.java
  11. 30 0
      menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/controller/app/base/wukong/UserOnlineSaveReqVO.java
  12. 75 0
      menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/dal/dataobject/UserMsgDO.java
  13. 49 0
      menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/dal/dataobject/UserOnlineDO.java
  14. 36 0
      menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/dal/mysql/UserMsgMapper.java
  15. 30 0
      menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/dal/mysql/UserOnlineMapper.java
  16. 49 0
      menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/service/wukong/WuKongApiService.java
  17. 10 0
      menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/service/wukong/WukongWebhookService.java
  18. 90 0
      menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/service/wukong/WukongWebhookServiceImpl.java

+ 24 - 4
menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/controller/app/WuKongWebhookController.java

@@ -1,19 +1,39 @@
 package com.citu.module.menduner.im.controller.app;
 
+import com.alibaba.fastjson.JSON;
 import com.citu.framework.common.pojo.CommonResult;
+import com.citu.module.menduner.im.service.wukong.WukongWebhookService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.security.PermitAll;
+import java.util.List;
 import java.util.Map;
 
 @RestController
 public class WuKongWebhookController {
 
 
-//    @PostMapping("/wukong/webhook")
-//    public CommonResult wukongWebhook(@RequestParam("event")String event, @RequestParam Map reqVo){
-//
-//    }
+    WukongWebhookService service;
 
+    /**
+     * 悟空 web hook 回调
+     * @param event
+     * @param reqVo
+     * @return
+     */
+    @PermitAll
+    @PostMapping("/im/wukong/webhook")
+    public CommonResult wukongWebhook(@RequestParam("event")String event, @RequestBody String reqVo){
+            return service.wukongWebhook(event, reqVo);
+    }
+
+
+    @Autowired
+    public void setService(WukongWebhookService service) {
+        this.service = service;
+    }
 }

+ 51 - 0
menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/controller/app/base/wukong/ImHeaderReqVo.java

@@ -0,0 +1,51 @@
+package com.citu.module.menduner.im.controller.app.base.wukong;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class ImHeaderReqVo {
+
+
+    /**
+     * 是否不存储消息 0.存储 1.不存储
+     */
+    @JsonProperty("no_persist")
+    private Integer noPersist;
+
+    /**
+     * 是否显示红点计数,0.不显示 1.显示
+     */
+    @JsonProperty("red_dot")
+    private Integer redDot;
+
+
+    /**
+     *  是否是写扩散,这里一般是0,只有cmd消息才是1
+     */
+    @JsonProperty("sync_once")
+    private Integer syncOnce;
+
+
+    public Integer getNoPersist() {
+        return noPersist;
+    }
+
+    public void setNoPersist(Integer noPersist) {
+        this.noPersist = noPersist;
+    }
+
+    public Integer getRedDot() {
+        return redDot;
+    }
+
+    public void setRedDot(Integer redDot) {
+        this.redDot = redDot;
+    }
+
+    public Integer getSyncOnce() {
+        return syncOnce;
+    }
+
+    public void setSyncOnce(Integer syncOnce) {
+        this.syncOnce = syncOnce;
+    }
+}

+ 104 - 0
menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/controller/app/base/wukong/ImMessageSendReqVo.java

@@ -0,0 +1,104 @@
+package com.citu.module.menduner.im.controller.app.base.wukong;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.List;
+
+public class ImMessageSendReqVo {
+    private ImHeaderReqVo header;
+
+
+    /**
+     * 发送者uid
+     */
+    @JsonProperty("from_uid")
+    private String fromUid;
+
+
+    /**
+     * 消息内容,base64编码
+     */
+    private String payload;
+
+
+    /**
+     * 接收者的uid,分批指定,每次建议 1000-10000之间,视系统情况而定
+     */
+    private List<String> subscribers;
+
+
+    /**
+     * 流式消息编号,如果是流式消息,需要指定,否则为空
+     */
+    @JsonProperty("stream_no")
+    private String streamNo;
+
+    /**
+     * 接收频道ID 如果channel_type=1 channel_id为个人uid 如果channel_type=2 channel_id为群id
+     */
+    @JsonProperty("channel_id")
+    private  String channelId;
+
+    /**
+     * 接收频道类型  1.个人频道 2.群聊频道
+     */
+    @JsonProperty("channel_type")
+    private Integer channelType;
+
+
+    public ImHeaderReqVo getHeader() {
+        return header;
+    }
+
+    public void setHeader(ImHeaderReqVo header) {
+        this.header = header;
+    }
+
+    public String getFromUid() {
+        return fromUid;
+    }
+
+    public void setFromUid(String fromUid) {
+        this.fromUid = fromUid;
+    }
+
+    public String getPayload() {
+        return payload;
+    }
+
+    public void setPayload(String payload) {
+        this.payload = payload;
+    }
+
+    public List<String> getSubscribers() {
+        return subscribers;
+    }
+
+    public void setSubscribers(List<String> subscribers) {
+        this.subscribers = subscribers;
+    }
+
+    public String getStreamNo() {
+        return streamNo;
+    }
+
+    public void setStreamNo(String streamNo) {
+        this.streamNo = streamNo;
+    }
+
+    public String getChannelId() {
+        return channelId;
+    }
+
+    public void setChannelId(String channelId) {
+        this.channelId = channelId;
+    }
+
+    public Integer getChannelType() {
+        return channelType;
+    }
+
+    public void setChannelType(Integer channelType) {
+        this.channelType = channelType;
+    }
+}

+ 33 - 0
menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/controller/app/base/wukong/ImUserDeviceQuitReqVo.java

@@ -0,0 +1,33 @@
+package com.citu.module.menduner.im.controller.app.base.wukong;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class ImUserDeviceQuitReqVo {
+
+    /**
+     * 需要踢出的用户uid
+     */
+    private String uid;
+
+    /**
+     * 需要踢出的设备标记 -1: 当前用户下所有设备 0: 当前用户下的app 1: 当前用户下的web 2: 当前用户下的pc
+     */
+    @JsonProperty("device_flag")
+    private Integer deviceFag;
+
+    public String getUid() {
+        return uid;
+    }
+
+    public void setUid(String uid) {
+        this.uid = uid;
+    }
+
+    public Integer getDeviceFag() {
+        return deviceFag;
+    }
+
+    public void setDeviceFag(Integer deviceFag) {
+        this.deviceFag = deviceFag;
+    }
+}

+ 37 - 0
menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/controller/app/base/wukong/MessageSendbatchRespVo.java

@@ -0,0 +1,37 @@
+package com.citu.module.menduner.im.controller.app.base.wukong;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.List;
+
+public class MessageSendbatchRespVo {
+
+    /**
+     * 回发送失败的用户列表
+     */
+    @JsonProperty("fail_uids")
+    private List<String> failUids;
+
+
+    /**
+     * 发送失败用户列表对应的失败原因列表,与fail_uids一一对应
+     */
+    private List<String> reason;
+
+
+    public List<String> getFailUids() {
+        return failUids;
+    }
+
+    public void setFailUids(List<String> failUids) {
+        this.failUids = failUids;
+    }
+
+    public List<String> getReason() {
+        return reason;
+    }
+
+    public void setReason(List<String> reason) {
+        this.reason = reason;
+    }
+}

+ 47 - 0
menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/controller/app/base/wukong/UserMsgPageReqVO.java

@@ -0,0 +1,47 @@
+package com.citu.module.menduner.im.controller.app.base.wukong;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import com.citu.framework.common.pojo.PageParam;
+
+@Schema(description = "管理后台 - im聊天记录分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class UserMsgPageReqVO extends PageParam {
+
+    @Schema(description = "服务端的消息ID(全局唯一)", example = "25023")
+    private Integer messageId;
+
+    @Schema(description = "字符串类型服务端的消息ID(全局唯一)")
+    private String messageIdStr;
+
+    @Schema(description = "客户端消息唯一编号")
+    private Integer clientMsgNo;
+
+    @Schema(description = "消息序列号 (用户唯一,有序递增)")
+    private String messageSeq;
+
+    @Schema(description = "发送者UID", example = "17682")
+    private Integer fromUid;
+
+    @Schema(description = "频道ID", example = "12640")
+    private Integer channelId;
+
+    @Schema(description = "频道类型", example = "2")
+    private String channelType;
+
+    @Schema(description = "服务器消息时间戳(10位,到秒)")
+    private Long timestamp;
+
+    @Schema(description = "base64消息内容")
+    private String payload;
+
+    @Schema(description = "消息头")
+    private String header;
+
+    @Schema(description = "设置")
+    private String setting;
+
+}

+ 62 - 0
menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/controller/app/base/wukong/UserMsgRespVO.java

@@ -0,0 +1,62 @@
+package com.citu.module.menduner.im.controller.app.base.wukong;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import java.util.*;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - im聊天记录 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class UserMsgRespVO {
+
+    @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "9844")
+    @ExcelProperty("主键")
+    private Long imUserMsgId;
+
+    @Schema(description = "服务端的消息ID(全局唯一)", example = "25023")
+    @ExcelProperty("服务端的消息ID(全局唯一)")
+    private Integer messageId;
+
+    @Schema(description = "字符串类型服务端的消息ID(全局唯一)")
+    @ExcelProperty("字符串类型服务端的消息ID(全局唯一)")
+    private String messageIdStr;
+
+    @Schema(description = "客户端消息唯一编号")
+    @ExcelProperty("客户端消息唯一编号")
+    private Integer clientMsgNo;
+
+    @Schema(description = "消息序列号 (用户唯一,有序递增)")
+    @ExcelProperty("消息序列号 (用户唯一,有序递增)")
+    private String messageSeq;
+
+    @Schema(description = "发送者UID", example = "17682")
+    @ExcelProperty("发送者UID")
+    private Integer fromUid;
+
+    @Schema(description = "频道ID", example = "12640")
+    @ExcelProperty("频道ID")
+    private Integer channelId;
+
+    @Schema(description = "频道类型", example = "2")
+    @ExcelProperty("频道类型")
+    private String channelType;
+
+    @Schema(description = "服务器消息时间戳(10位,到秒)")
+    @ExcelProperty("服务器消息时间戳(10位,到秒)")
+    private Long timestamp;
+
+    @Schema(description = "base64消息内容")
+    @ExcelProperty("base64消息内容")
+    private String payload;
+
+    @Schema(description = "消息头")
+    @ExcelProperty("消息头")
+    private String header;
+
+    @Schema(description = "设置")
+    @ExcelProperty("设置")
+    private String setting;
+
+}

+ 48 - 0
menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/controller/app/base/wukong/UserMsgSaveReqVO.java

@@ -0,0 +1,48 @@
+package com.citu.module.menduner.im.controller.app.base.wukong;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import javax.validation.constraints.*;
+
+@Schema(description = "管理后台 - im聊天记录新增/修改 Request VO")
+@Data
+public class UserMsgSaveReqVO {
+
+    @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "9844")
+    private Long imUserMsgId;
+
+    @Schema(description = "服务端的消息ID(全局唯一)", example = "25023")
+    private Integer messageId;
+
+    @Schema(description = "字符串类型服务端的消息ID(全局唯一)")
+    private String messageIdStr;
+
+    @Schema(description = "客户端消息唯一编号")
+    private Integer clientMsgNo;
+
+    @Schema(description = "消息序列号 (用户唯一,有序递增)")
+    private String messageSeq;
+
+    @Schema(description = "发送者UID", example = "17682")
+    private Integer fromUid;
+
+    @Schema(description = "频道ID", example = "12640")
+    private Integer channelId;
+
+    @Schema(description = "频道类型", example = "2")
+    private String channelType;
+
+    @Schema(description = "服务器消息时间戳(10位,到秒)")
+    private Long timestamp;
+
+    @Schema(description = "base64消息内容")
+    private String payload;
+
+    @Schema(description = "消息头")
+    private String header;
+
+    @Schema(description = "设置")
+    private String setting;
+
+}

+ 29 - 0
menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/controller/app/base/wukong/UserOnlinePageReqVO.java

@@ -0,0 +1,29 @@
+package com.citu.module.menduner.im.controller.app.base.wukong;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import com.citu.framework.common.pojo.PageParam;
+
+@Schema(description = "管理后台 - im在线状态分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class UserOnlinePageReqVO extends PageParam {
+
+    @Schema(description = "设备标识 0.app 1.web")
+    private Integer deviceCategory;
+
+    @Schema(description = "在线状态 0.离线 1.在线", example = "1")
+    private Integer onlineStatus;
+
+    @Schema(description = "客户端id", example = "10024")
+    private String clientId;
+
+    @Schema(description = "当前设备在线数量")
+    private Integer onlineNum;
+
+    @Schema(description = "所有设备累计在线数量")
+    private String totalOnlineNum;
+
+}

+ 38 - 0
menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/controller/app/base/wukong/UserOnlineRespVO.java

@@ -0,0 +1,38 @@
+package com.citu.module.menduner.im.controller.app.base.wukong;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import java.util.*;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - im在线状态 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class UserOnlineRespVO {
+
+    @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1071")
+    @ExcelProperty("主键")
+    private Long imUserOnlineId;
+
+    @Schema(description = "设备标识 0.app 1.web")
+    @ExcelProperty("设备标识 0.app 1.web")
+    private Integer deviceCategory;
+
+    @Schema(description = "在线状态 0.离线 1.在线", example = "1")
+    @ExcelProperty("在线状态 0.离线 1.在线")
+    private Integer onlineStatus;
+
+    @Schema(description = "客户端id", example = "10024")
+    @ExcelProperty("客户端id")
+    private String clientId;
+
+    @Schema(description = "当前设备在线数量")
+    @ExcelProperty("当前设备在线数量")
+    private Integer onlineNum;
+
+    @Schema(description = "所有设备累计在线数量")
+    @ExcelProperty("所有设备累计在线数量")
+    private String totalOnlineNum;
+
+}

+ 30 - 0
menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/controller/app/base/wukong/UserOnlineSaveReqVO.java

@@ -0,0 +1,30 @@
+package com.citu.module.menduner.im.controller.app.base.wukong;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import javax.validation.constraints.*;
+
+@Schema(description = "管理后台 - im在线状态新增/修改 Request VO")
+@Data
+public class UserOnlineSaveReqVO {
+
+    @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1071")
+    private Long imUserOnlineId;
+
+    @Schema(description = "设备标识 0.app 1.web")
+    private Integer deviceCategory;
+
+    @Schema(description = "在线状态 0.离线 1.在线", example = "1")
+    private Integer onlineStatus;
+
+    @Schema(description = "客户端id", example = "10024")
+    private String clientId;
+
+    @Schema(description = "当前设备在线数量")
+    private Integer onlineNum;
+
+    @Schema(description = "所有设备累计在线数量")
+    private String totalOnlineNum;
+
+}

+ 75 - 0
menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/dal/dataobject/UserMsgDO.java

@@ -0,0 +1,75 @@
+package com.citu.module.menduner.im.dal.dataobject;
+
+import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
+import lombok.*;
+import java.util.*;
+import com.baomidou.mybatisplus.annotation.*;
+import com.citu.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * im聊天记录 DO
+ *
+ * @author 辞图科技
+ */
+@TableName(value = "im_user_msg",autoResultMap = true)
+@KeySequence("im_user_msg_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserMsgDO extends BaseDO {
+
+    /**
+     * 主键
+     */
+    @TableId
+    private Long imUserMsgId;
+    /**
+     * 服务端的消息ID(全局唯一)
+     */
+    private Integer messageId;
+    /**
+     * 字符串类型服务端的消息ID(全局唯一)
+     */
+    private String messageIdStr;
+    /**
+     * 客户端消息唯一编号
+     */
+    private Integer clientMsgNo;
+    /**
+     * 消息序列号 (用户唯一,有序递增)
+     */
+    private String messageSeq;
+    /**
+     * 发送者UID
+     */
+    private Integer fromUid;
+    /**
+     * 频道ID
+     */
+    private Integer channelId;
+    /**
+     * 频道类型
+     */
+    private String channelType;
+    /**
+     * 服务器消息时间戳(10位,到秒)
+     */
+    private Long timestamp;
+    /**
+     * base64消息内容
+     */
+    private String payload;
+    /**
+     * 消息头
+     */
+    @TableField(typeHandler = JacksonTypeHandler.class)
+    private Map header;
+    /**
+     * 设置
+     */
+    private String setting;
+
+}

+ 49 - 0
menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/dal/dataobject/UserOnlineDO.java

@@ -0,0 +1,49 @@
+package com.citu.module.menduner.im.dal.dataobject;
+
+import lombok.*;
+import java.util.*;
+import com.baomidou.mybatisplus.annotation.*;
+import com.citu.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * im在线状态 DO
+ *
+ * @author 辞图科技
+ */
+@TableName("im_user_online")
+@KeySequence("im_user_online_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserOnlineDO extends BaseDO {
+
+    /**
+     * 主键
+     */
+    @TableId
+    private Long imUserOnlineId;
+    /**
+     * 设备标识 0.app 1.web
+     */
+    private Integer deviceCategory;
+    /**
+     * 在线状态 0.离线 1.在线
+     */
+    private Integer onlineStatus;
+    /**
+     * 客户端id
+     */
+    private String clientId;
+    /**
+     * 当前设备在线数量
+     */
+    private Integer onlineNum;
+    /**
+     * 所有设备累计在线数量
+     */
+    private String totalOnlineNum;
+
+}

+ 36 - 0
menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/dal/mysql/UserMsgMapper.java

@@ -0,0 +1,36 @@
+package com.citu.module.menduner.im.dal.mysql;
+
+import java.util.*;
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.citu.framework.mybatis.core.mapper.BaseMapperX;
+import com.citu.module.menduner.im.controller.app.base.wukong.UserMsgPageReqVO;
+import com.citu.module.menduner.im.dal.dataobject.UserMsgDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * im聊天记录 Mapper
+ *
+ * @author 辞图科技
+ */
+@Mapper
+public interface UserMsgMapper extends BaseMapperX<UserMsgDO> {
+
+    default PageResult<UserMsgDO> selectPage(UserMsgPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<UserMsgDO>()
+                .eqIfPresent(UserMsgDO::getMessageId, reqVO.getMessageId())
+                .eqIfPresent(UserMsgDO::getMessageIdStr, reqVO.getMessageIdStr())
+                .eqIfPresent(UserMsgDO::getClientMsgNo, reqVO.getClientMsgNo())
+                .eqIfPresent(UserMsgDO::getMessageSeq, reqVO.getMessageSeq())
+                .eqIfPresent(UserMsgDO::getFromUid, reqVO.getFromUid())
+                .eqIfPresent(UserMsgDO::getChannelId, reqVO.getChannelId())
+                .eqIfPresent(UserMsgDO::getChannelType, reqVO.getChannelType())
+                .eqIfPresent(UserMsgDO::getTimestamp, reqVO.getTimestamp())
+                .eqIfPresent(UserMsgDO::getPayload, reqVO.getPayload())
+                .eqIfPresent(UserMsgDO::getHeader, reqVO.getHeader())
+                .eqIfPresent(UserMsgDO::getSetting, reqVO.getSetting())
+                .orderByDesc(UserMsgDO::getImUserMsgId));
+    }
+
+}

+ 30 - 0
menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/dal/mysql/UserOnlineMapper.java

@@ -0,0 +1,30 @@
+package com.citu.module.menduner.im.dal.mysql;
+
+import java.util.*;
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.citu.framework.mybatis.core.mapper.BaseMapperX;
+import com.citu.module.menduner.im.controller.app.base.wukong.UserOnlinePageReqVO;
+import com.citu.module.menduner.im.dal.dataobject.UserOnlineDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * im在线状态 Mapper
+ *
+ * @author 辞图科技
+ */
+@Mapper
+public interface UserOnlineMapper extends BaseMapperX<UserOnlineDO> {
+
+    default PageResult<UserOnlineDO> selectPage(UserOnlinePageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<UserOnlineDO>()
+                .eqIfPresent(UserOnlineDO::getDeviceCategory, reqVO.getDeviceCategory())
+                .eqIfPresent(UserOnlineDO::getOnlineStatus, reqVO.getOnlineStatus())
+                .eqIfPresent(UserOnlineDO::getClientId, reqVO.getClientId())
+                .eqIfPresent(UserOnlineDO::getOnlineNum, reqVO.getOnlineNum())
+                .eqIfPresent(UserOnlineDO::getTotalOnlineNum, reqVO.getTotalOnlineNum())
+                .orderByDesc(UserOnlineDO::getImUserOnlineId));
+    }
+
+}

+ 49 - 0
menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/service/wukong/WuKongApiService.java

@@ -34,4 +34,53 @@ public interface WuKongApiService {
     public WukongApiResp   conversationsSetUnread(@RequestBody ConversationsUnreadReqVo reqVo);
 
 
+    /**
+     * 添加系统账号
+     */
+    @PostMapping("/user/systemuids_add")
+    public WukongApiResp   userSystemUidsAdd(@RequestBody List<String> uids);
+
+
+    /**
+     * 移除系统账号
+     */
+    @PostMapping("/user/systemuids_remove")
+    public WukongApiResp   userSystemUidsRemove(@RequestBody List<String> uids);
+
+
+    /**
+     *  踢出用户的设备登录
+     *      将用户的设备踢出登录,(可以实现类似微信的 app 可以踢出 pc 登录)
+     * @param reqVo
+     * @return
+     */
+    @PostMapping("/user/device_quit")
+    public WukongApiResp   userDeviceQuid(@RequestBody ImUserDeviceQuitReqVo reqVo);
+
+
+
+
+    /**
+     *  发送消息
+     *   服务端调用发送消息接口可以主要用来发送系统类的消息,比如群成员进群通知,消息撤回通知等等
+     * @param reqVo
+     * @return
+     */
+    @PostMapping("/message/send")
+    public WukongApiResp   userSend(@RequestBody ImMessageSendReqVo reqVo);
+
+
+    /**
+     *   批量发送消息
+     *   服务端调用发送消息接口可以主要用来发送系统类的消息,比如群成员进群通知,消息撤回通知等等
+     * @param reqVo
+     * @return
+     */
+    @PostMapping("/message/sendbatch")
+    public MessageSendbatchRespVo   userSendbatch(@RequestBody ImMessageSendReqVo reqVo);
+
+
+
+
+
 }

+ 10 - 0
menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/service/wukong/WukongWebhookService.java

@@ -0,0 +1,10 @@
+package com.citu.module.menduner.im.service.wukong;
+
+import com.citu.framework.common.pojo.CommonResult;
+
+import java.util.List;
+import java.util.Map;
+
+public interface WukongWebhookService {
+    CommonResult wukongWebhook(String event,String reqVo);
+}

+ 90 - 0
menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/service/wukong/WukongWebhookServiceImpl.java

@@ -0,0 +1,90 @@
+package com.citu.module.menduner.im.service.wukong;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.fastjson.JSON;
+import com.citu.framework.common.pojo.CommonResult;
+import com.citu.module.menduner.im.dal.dataobject.UserMsgDO;
+import com.citu.module.menduner.im.dal.mysql.UserMsgMapper;
+import com.citu.module.menduner.im.dal.mysql.UserOnlineMapper;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableMultimap;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class WukongWebhookServiceImpl implements WukongWebhookService{
+
+    UserMsgMapper userMsgMapper;
+
+    UserOnlineMapper userOnlineMapper;
+
+
+    private final Map<String,EventHandle> eventHandleMap = new HashMap<>(ImmutableMap.of("msg.notify", new UserMsgEventHandle(),"user.onlinestatus",new UserOnlineEventHandle()));
+
+    @Override
+    public CommonResult wukongWebhook(String event, String reqVo) {
+        EventHandle eventHandle = eventHandleMap.get(event);
+        if(null != eventHandle){
+            log.debug("处理webhook事件");
+            eventHandle.handle(reqVo);
+        }
+        return CommonResult.success("");
+    }
+
+
+
+
+
+    interface EventHandle{
+
+
+        void handle(String  reqVo);
+    }
+
+
+
+    class UserMsgEventHandle implements EventHandle{
+
+        @Override
+        public void handle(String reqVo) {
+            List<Map> msg =new ArrayList<>();
+
+            if(reqVo.startsWith("[")){
+                msg = JSON.parseArray(reqVo, Map.class);
+            }else {
+                msg.add(JSON.parseObject(reqVo, Map.class));
+            }
+
+            List<UserMsgDO> userMsgDOs =new ArrayList<>(msg.size()+1);
+            for (Map map : msg) {
+                userMsgDOs.add( BeanUtil.mapToBean(map, UserMsgDO.class, true));
+            }
+            userMsgMapper.insertBatch(userMsgDOs);
+        }
+    }
+
+
+    class UserOnlineEventHandle implements EventHandle{
+
+        @Override
+        public void handle(String reqVo) {
+            log.info("收到用户上下线通知,{}", reqVo);
+        }
+    }
+
+    @Autowired
+    public void setUserMsgMapper(UserMsgMapper userMsgMapper) {
+        this.userMsgMapper = userMsgMapper;
+    }
+    @Autowired
+    public void setUserOnlineMapper(UserOnlineMapper userOnlineMapper) {
+        this.userOnlineMapper = userOnlineMapper;
+    }
+}