浏览代码

回调处理

liujunchi 2 年之前
父节点
当前提交
66dca4c3f2

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImLiveBroadcastRoomMemberDao.java

@@ -22,5 +22,25 @@ public interface ImLiveBroadcastRoomMemberDao extends BaseMapper<ImLiveBroadcast
 
     IPage<ImLiveBroadcastRoomMemberVo> queryMemberPage(Page<ImLiveBroadcastRoomMemberVo> page, @Param("param") Map<String, Object> param);
 
+    /**
+     * 设置在线状态
+     *
+     * @param userIds      用户id
+     * @param groupId      房间编号
+     * @param onlineStatus 状态
+     */
+    void updateOnlineStatus(@Param("userIds") List<Long> userIds, @Param("groupId") String groupId, @Param(
+        "onlineStatus") Integer onlineStatus);
+    /**
+     * 设置直播状态
+     *
+     * @param userIds      用户id
+     * @param groupId      房间编号
+     * @param liveRoomStatus 状态
+     */
+    void updateLiveRoomStatus(@Param("userIds") List<Long> userIds, @Param("groupId") String groupId, @Param(
+        "liveRoomStatus") Integer liveRoomStatus);
+
+    List<ImLiveBroadcastRoomMember> queryMember(@Param("userIds") List<Long> userIds, @Param("groupId") String groupId);
 }
 

+ 16 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TencentData.java

@@ -26,6 +26,12 @@ public class TencentData {
     @NoArgsConstructor
     @Data
     public static class CallbackAfterMemberExit {
+
+
+        private String clientIP;
+
+        private String optPlatform;
+
         // 回调命令
         private ETencentImCallbackCommand callbackCommand;
         // 群组 ID
@@ -82,6 +88,13 @@ public class TencentData {
     @NoArgsConstructor
     @Data
     public static class CallbackOnMemberStateChange {
+
+        // 客户端平台,对应不同的平台类型,可能的取值有:
+        // RESTAPI(使用 REST API 发送请求)、Web(使用 Web SDK 发送请求)、
+        // Android、iOS、Windows、Mac、iPad、Unknown(使用未知类型的设备发送请求)
+        private String clientIP;
+
+        private String optPlatform;
         // 回调命令
         private ETencentImCallbackCommand callbackCommand;
         // 群组 ID
@@ -122,6 +135,9 @@ public class TencentData {
     @Data
     public static class CallbackAfterNewMemberJoin {
 
+        private String clientIP;
+
+        private String optPlatform;
         // 回调命令
         private ETencentImCallbackCommand callbackCommand;
         // 群组 ID

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ETencentImCallbackCommand.java

@@ -8,7 +8,7 @@ package com.ym.mec.biz.dal.enums;
  */
 public enum ETencentImCallbackCommand {
 
-    STATE_STATECHANGE("State.StateChange", "用户状态变更"),
+    // STATE_STATECHANGE("State.StateChange", "用户状态变更"),
     GROUP_CALLBACKAFTERMEMBEREXIT("Group.CallbackAfterMemberExit", "群成员离开之后回调"),
     GROUP_CALLBACKAFTERNEWMEMBERJOIN("Group.CallbackAfterNewMemberJoin", "新成员入群之后回调"),
     GROUP_CALLBACKONMEMBERSTATECHANGE("Group.CallbackOnMemberStateChange", "直播群成员在线状态回调"),

+ 16 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ImLiveBroadcastRoomService.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.ym.mec.biz.dal.dto.ImLiveBroadcastRoomDto;
 import com.ym.mec.biz.dal.dto.LiveRoomStatus;
 import com.ym.mec.biz.dal.dto.RoomReservationUserSearch;
+import com.ym.mec.biz.dal.dto.TencentData;
 import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoom;
 import com.ym.mec.biz.dal.page.LiveRoomGoodsOrderQueryInfo;
 import com.ym.mec.biz.dal.vo.BaseRoomUserVo;
@@ -135,5 +136,20 @@ public interface ImLiveBroadcastRoomService extends IService<ImLiveBroadcastRoom
      * @return
      */
     Boolean updateRoomStatus(LiveRoomStatus status);
+
+    /**
+     * 直播群成员在线状态回调处理
+     *
+     */
+    void callbackOnMemberStateChange(TencentData.CallbackOnMemberStateChange callbackOnMemberStateChange);
+    /**
+     * 群成员离开之后回调
+     */
+    void callbackAfterMemberExit(TencentData.CallbackAfterMemberExit callbackAfterMemberExit);
+
+    /**
+     * 新成员入群之后回调
+     */
+    void callbackAfterNewMemberJoin(TencentData.CallbackAfterNewMemberJoin callbackAfterNewMemberJoin);
 }
 

+ 126 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java

@@ -17,11 +17,13 @@ import com.microsvc.toolkit.middleware.live.message.RTCRoom;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.ImLiveBroadcastRoomDao;
+import com.ym.mec.biz.dal.dao.ImLiveBroadcastRoomMemberDao;
 import com.ym.mec.biz.dal.dao.LiveGoodsMapperDao;
 import com.ym.mec.biz.dal.dao.SysConfigDao;
 import com.ym.mec.biz.dal.dto.ImLiveBroadcastRoomDto;
 import com.ym.mec.biz.dal.dto.LiveRoomStatus;
 import com.ym.mec.biz.dal.dto.RoomReservationUserSearch;
+import com.ym.mec.biz.dal.dto.TencentData;
 import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoom;
 import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoomData;
 import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoomMember;
@@ -63,6 +65,8 @@ import java.io.IOException;
 import java.io.OutputStream;
 import java.io.Serializable;
 import java.text.MessageFormat;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.TimeUnit;
@@ -92,6 +96,8 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     @Autowired
     private ImLiveBroadcastRoomMemberService liveBroadcastRoomMemberService;
     @Autowired
+    private ImLiveBroadcastRoomMemberDao liveBroadcastRoomMemberDao;
+    @Autowired
     private ImLiveBroadcastRoomDataService liveBroadcastRoomDataService;
     @Autowired
     private LiveGoodsMapperDao liveGoodsMapperDao;
@@ -1627,6 +1633,126 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
 
 
     /**
+     * 直播群成员在线状态回调处理
+     *
+     * @param callbackOnMemberStateChange
+     */
+    @Override
+    @Transactional
+    public void callbackOnMemberStateChange(TencentData.CallbackOnMemberStateChange callbackOnMemberStateChange) {
+
+        if (callbackOnMemberStateChange == null) {
+            return;
+        }
+
+        Integer onlineStatus = callbackOnMemberStateChange.getEventType().equals("Online")?1:0;
+
+        // 用户id
+        if (CollectionUtils.isEmpty(callbackOnMemberStateChange.getMemberList())) {
+            return;
+        }
+        List<Long> userIds = callbackOnMemberStateChange.getMemberList()
+                                                        .stream()
+                                                        .map(o -> Long.parseLong(o.getMemberAccount()))
+                                                        .collect(Collectors.toList());
+
+
+        List<ImLiveBroadcastRoomMember> imLiveBroadcastRoomMembers = liveBroadcastRoomMemberDao.queryMember(userIds,
+                                                                                                            callbackOnMemberStateChange.getGroupId());
+
+        // 根据用户id分组
+        Map<Integer, ImLiveBroadcastRoomMember> userMap = imLiveBroadcastRoomMembers.stream()
+                                                                                    .collect(Collectors.toMap(ImLiveBroadcastRoomMember::getUserId,o ->o, (k1, k2) -> k1));
+
+        List<ImUserState> imUserStates = new ArrayList<>();
+        for (Long userId : userIds) {
+            Integer liveRoomStatus = userMap.getOrDefault(userId.intValue(), new ImLiveBroadcastRoomMember())
+                                           .getLiveRoomStatus();
+            ImUserState imUserState = new ImUserState();
+            imUserState.setUserid(userId.toString());
+            imUserState.setStatus(onlineStatus == 1 && liveRoomStatus == 1?"0":"1");
+            imUserState.setOs(callbackOnMemberStateChange.getOptPlatform());
+            imUserState.setTime(new Date().getTime());
+            imUserState.setClientIp(callbackOnMemberStateChange.getClientIP());
+            imUserStates.add(imUserState);
+        }
+        opsRoom(imUserStates);
+        liveBroadcastRoomMemberDao.updateOnlineStatus(userIds, callbackOnMemberStateChange.getGroupId(),onlineStatus);
+    }
+
+    @Override
+    public void callbackAfterMemberExit(TencentData.CallbackAfterMemberExit callbackAfterMemberExit) {
+        if (callbackAfterMemberExit == null) {
+            return;
+        }
+
+        Integer liveRoomStatus = 0;
+
+        // 用户id
+        if (CollectionUtils.isEmpty(callbackAfterMemberExit.getExitMemberList())) {
+            return;
+        }
+        List<Long> userIds = callbackAfterMemberExit.getExitMemberList()
+                                                        .stream()
+                                                        .map(o -> Long.parseLong(o.getMemberAccount()))
+                                                        .collect(Collectors.toList());
+
+
+        List<ImUserState> imUserStates = new ArrayList<>();
+        for (Long userId : userIds) {
+            ImUserState imUserState = new ImUserState();
+            imUserState.setUserid(userId.toString());
+            imUserState.setStatus("3");
+            imUserState.setOs(callbackAfterMemberExit.getOptPlatform());
+            imUserState.setTime(callbackAfterMemberExit.getEventTime().atZone(ZoneId.systemDefault()).toEpochSecond());
+            imUserState.setClientIp(callbackAfterMemberExit.getClientIP());
+            imUserStates.add(imUserState);
+        }
+        opsRoom(imUserStates);
+        liveBroadcastRoomMemberDao.updateLiveRoomStatus(userIds, callbackAfterMemberExit.getGroupId(),liveRoomStatus);
+    }
+
+    @Override
+    public void callbackAfterNewMemberJoin(TencentData.CallbackAfterNewMemberJoin callbackAfterNewMemberJoin) {
+        if (callbackAfterNewMemberJoin == null) {
+            return;
+        }
+
+        Integer liveRoomStatus = 1;
+
+        // 用户id
+        if (CollectionUtils.isEmpty(callbackAfterNewMemberJoin.getNewMemberList())) {
+            return;
+        }
+        List<Long> userIds = callbackAfterNewMemberJoin.getNewMemberList()
+                                                    .stream()
+                                                    .map(o -> Long.parseLong(o.getMemberAccount()))
+                                                    .collect(Collectors.toList());
+
+
+        List<ImLiveBroadcastRoomMember> imLiveBroadcastRoomMembers = liveBroadcastRoomMemberDao.queryMember(userIds,
+                                                                                    callbackAfterNewMemberJoin.getGroupId());
+
+        // 根据用户id分组
+        Map<Integer, ImLiveBroadcastRoomMember> userMap = imLiveBroadcastRoomMembers.stream()
+                .collect(Collectors.toMap(ImLiveBroadcastRoomMember::getUserId,o ->o, (k1, k2) -> k1));
+
+        List<ImUserState> imUserStates = new ArrayList<>();
+        for (Long userId : userIds) {
+            ImUserState imUserState = new ImUserState();
+            imUserState.setUserid(userId.toString());
+            imUserState.setStatus(userMap.getOrDefault(userId.intValue(), new ImLiveBroadcastRoomMember()).getOnlineStatus() == 1 ? "0" : "1");
+            imUserState.setOs(callbackAfterNewMemberJoin.getOptPlatform());
+            imUserState.setTime(callbackAfterNewMemberJoin.getEventTime().atZone(ZoneId.systemDefault()).toEpochSecond());
+            imUserState.setClientIp(callbackAfterNewMemberJoin.getClientIP());
+            imUserStates.add(imUserState);
+        }
+        opsRoom(imUserStates);
+        liveBroadcastRoomMemberDao.updateLiveRoomStatus(userIds, callbackAfterNewMemberJoin.getGroupId(),liveRoomStatus);
+    }
+
+
+    /**
      * 查询直播间所有用户信息
      *
      * @param roomUid 直播间uid

+ 18 - 0
mec-biz/src/main/resources/config/mybatis/ImLiveBroadcastRoomMemberMapper.xml

@@ -56,4 +56,22 @@
         group by a.user_id_
     </select>
 
+    <update id="updateOnlineStatus">
+        update im_live_broadcast_room_member
+        set online_status_ = #{onlineStatus}
+        where room_uid_ = #{groupId} and user_id_ in <foreach collection="userIds" item="userId" open="(" separator="," close=")">#{userId}</foreach>
+    </update>
+
+    <update id="updateLiveRoomStatus">
+        update im_live_broadcast_room_member
+        set live_room_status_ = #{onlineStatus}
+        where room_uid_ = #{groupId} and user_id_ in <foreach collection="userIds" item="userId" open="(" separator="," close=")">#{userId}</foreach>
+
+    </update>
+
+    <select id="queryMember" resultType="com.ym.mec.biz.dal.entity.ImLiveBroadcastRoomMember">
+        select * from im_live_broadcast_room_member
+        where room_uid_ = #{groupId} and user_id_ in <foreach collection="userIds" item="userId" open="(" separator="," close=")">#{userId}</foreach>
+
+    </select>
 </mapper>

+ 1 - 30
mec-im/src/main/java/com/ym/controller/LiveRoomController.java

@@ -101,34 +101,5 @@ public class LiveRoomController {
     public void syncChatRoomStatus(@RequestBody String body) {
         log.info("syncChatRoomStatus body:{}", body);
     }
-    //
-    // 换到 com.ym.mec.web.controller.ImLiveBroadcastRoomController.tencentImCallback
-    // @ApiOperation("腾讯im 回调接口")
-    // @PostMapping(value = "/tencentImCallback")
-    // public TencentImCallbackResult tencentImCallback(@RequestBody String body, HttpServletRequest request) {
-    //     log.info("tencentImCallback body:{}", body);
-    //
-    //     log.info("tencentImCallback request param:{}", JSON.toJSONString(request.getParameterMap()));
-    //
-    //
-    //     if(request.getParameter("CallbackCommand").equals(ETencentImCallbackCommand.GROUP_CALLBACKONMEMBERSTATECHANGE.name())) {
-    //         TencentData.CallbackOnMemberStateChange callbackOnMemberStateChange = TencentData.CallbackOnMemberStateChange.toObject(
-    //             body);
-    //
-    //         log.debug("callbackOnMemberStateChange: {}", callbackOnMemberStateChange);
-    //     } else if(request.getParameter("CallbackCommand").equals(ETencentImCallbackCommand.GROUP_CALLBACKAFTERMEMBEREXIT.name())) {
-    //         TencentData.CallbackAfterMemberExit callbackAfterMemberExit = TencentData.CallbackAfterMemberExit.toObject(
-    //             body);
-    //
-    //         log.debug("CallbackAfterMemberExit: {}", callbackAfterMemberExit);
-    //     }  else if(request.getParameter("CallbackCommand").equals(ETencentImCallbackCommand.GROUP_CALLBACKAFTERNEWMEMBERJOIN.name())) {
-    //         TencentData.CallbackAfterNewMemberJoin callbackAfterNewMemberJoin = TencentData.CallbackAfterNewMemberJoin.toObject(
-    //             body);
-    //
-    //         log.debug("CallbackAfterNewMemberJoin: {}", callbackAfterNewMemberJoin);
-    //     }
-    //
-    //
-    //     return new TencentImCallbackResult();
-    // }
+
 }

+ 50 - 0
mec-im/src/main/java/com/ym/controller/UserController.java

@@ -1,16 +1,22 @@
 package com.ym.controller;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.ym.common.BaseResponse;
+import com.ym.mec.biz.dal.dto.TencentData;
+import com.ym.mec.biz.dal.dto.TencentImCallbackResult;
+import com.ym.mec.biz.dal.enums.ETencentImCallbackCommand;
 import com.ym.mec.biz.service.ImLiveBroadcastRoomService;
 import com.ym.mec.common.entity.ImUserState;
 import com.ym.service.UserService;
 import io.rong.models.user.UserModel;
+import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.List;
 
 @RestController
@@ -43,4 +49,48 @@ public class UserController {
         imLiveBroadcastRoomService.opsRoom(userState);
         return new BaseResponse<>();
     }
+
+
+    @ApiOperation("腾讯im 回调接口")
+    @PostMapping(value = "/tencentImCallback")
+    public TencentImCallbackResult tencentImCallback(@RequestBody String body, HttpServletRequest request) {
+        log.info("tencentImCallback body:{}", body);
+
+        log.info("tencentImCallback request param:{}", JSON.toJSONString(request.getParameterMap()));
+
+        String clientIP = request.getParameter("ClientIP");
+        String optPlatform = request.getParameter("OptPlatform");
+
+
+        if(request.getParameter("CallbackCommand").equals(ETencentImCallbackCommand.GROUP_CALLBACKONMEMBERSTATECHANGE.name())) {
+            TencentData.CallbackOnMemberStateChange callbackOnMemberStateChange = TencentData.CallbackOnMemberStateChange.toObject(
+                body);
+
+            log.debug("callbackOnMemberStateChange: {}", callbackOnMemberStateChange);
+            callbackOnMemberStateChange.setClientIP(clientIP);
+            callbackOnMemberStateChange.setOptPlatform(optPlatform);
+            imLiveBroadcastRoomService.callbackOnMemberStateChange(callbackOnMemberStateChange);
+
+
+        } else if(request.getParameter("CallbackCommand").equals(ETencentImCallbackCommand.GROUP_CALLBACKAFTERMEMBEREXIT.name())) {
+            TencentData.CallbackAfterMemberExit callbackAfterMemberExit = TencentData.CallbackAfterMemberExit.toObject(
+                body);
+
+            log.debug("callbackAfterMemberExit: {}", callbackAfterMemberExit);
+            callbackAfterMemberExit.setClientIP(clientIP);
+            callbackAfterMemberExit.setOptPlatform(optPlatform);
+            imLiveBroadcastRoomService.callbackAfterMemberExit(callbackAfterMemberExit);
+        }  else if(request.getParameter("CallbackCommand").equals(ETencentImCallbackCommand.GROUP_CALLBACKAFTERNEWMEMBERJOIN.name())) {
+            TencentData.CallbackAfterNewMemberJoin callbackAfterNewMemberJoin = TencentData.CallbackAfterNewMemberJoin.toObject(
+                body);
+
+            log.debug("CallbackAfterNewMemberJoin: {}", callbackAfterNewMemberJoin);
+            callbackAfterNewMemberJoin.setClientIP(clientIP);
+            callbackAfterNewMemberJoin.setOptPlatform(optPlatform);
+            imLiveBroadcastRoomService.callbackAfterNewMemberJoin(callbackAfterNewMemberJoin);
+        }
+
+
+        return new TencentImCallbackResult();
+    }
 }

+ 0 - 30
mec-web/src/main/java/com/ym/mec/web/controller/ImLiveBroadcastRoomController.java

@@ -241,35 +241,5 @@ public class ImLiveBroadcastRoomController extends BaseController {
     public HttpResponseResult<PageInfo<LiveRoomGoodsOrderVo>> queryLiveRoomGoodsOrderList(LiveRoomGoodsOrderQueryInfo queryInfo) {
         return succeed(imLiveBroadcastRoomService.queryLiveRoomGoodsOrderList(queryInfo));
     }
-
-
-    @ApiOperation("腾讯im 回调接口")
-    @PostMapping(value = "/tencentImCallback")
-    public TencentImCallbackResult tencentImCallback(@RequestBody String body, HttpServletRequest request) {
-        log.info("tencentImCallback body:{}", body);
-
-        log.info("tencentImCallback request param:{}", JSON.toJSONString(request.getParameterMap()));
-
-
-        if(request.getParameter("CallbackCommand").equals(ETencentImCallbackCommand.GROUP_CALLBACKONMEMBERSTATECHANGE.name())) {
-            TencentData.CallbackOnMemberStateChange callbackOnMemberStateChange = TencentData.CallbackOnMemberStateChange.toObject(
-                body);
-
-            log.debug("callbackOnMemberStateChange: {}", callbackOnMemberStateChange);
-        } else if(request.getParameter("CallbackCommand").equals(ETencentImCallbackCommand.GROUP_CALLBACKAFTERMEMBEREXIT.name())) {
-            TencentData.CallbackAfterMemberExit callbackAfterMemberExit = TencentData.CallbackAfterMemberExit.toObject(
-                body);
-
-            log.debug("CallbackAfterMemberExit: {}", callbackAfterMemberExit);
-        }  else if(request.getParameter("CallbackCommand").equals(ETencentImCallbackCommand.GROUP_CALLBACKAFTERNEWMEMBERJOIN.name())) {
-            TencentData.CallbackAfterNewMemberJoin callbackAfterNewMemberJoin = TencentData.CallbackAfterNewMemberJoin.toObject(
-                body);
-
-            log.debug("CallbackAfterNewMemberJoin: {}", callbackAfterNewMemberJoin);
-        }
-
-
-        return new TencentImCallbackResult();
-    }
 }