浏览代码

增加群组用户学生身份自动加入

Eric 3 年之前
父节点
当前提交
d5d25f5796

+ 25 - 0
cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/config/AppGlobalServiceConfig.java

@@ -0,0 +1,25 @@
+package com.yonge.cooleshow.auth.config;
+
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 应用全局功能配置
+ *
+ * Created by Eric.Shang on 2022/9/28.
+ */
+@Data
+@RefreshScope
+@Configuration
+@ConfigurationProperties(prefix = "app")
+public class AppGlobalServiceConfig {
+
+    /**
+     * 用户加入群组功能
+     */
+    @Value("group.member.join:true")
+    private Boolean groupMemberJoin;
+}

+ 8 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImGroupService.java

@@ -71,5 +71,13 @@ public interface ImGroupService extends IService<ImGroup> {
 
     //退群
     void quit(String groupId,Long userId) throws Exception;
+
+    /**
+     * 用户群组信息
+     * @param groupId 群组ID
+     * @param userId 用户ID
+     * @return ImGroup
+     */
+    ImGroup findGroupInfoById(String groupId, Long userId);
 }
 

+ 66 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImGroupServiceImpl.java

@@ -1,6 +1,9 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.collect.Lists;
+import com.yonge.cooleshow.auth.config.AppGlobalServiceConfig;
 import com.yonge.cooleshow.biz.dal.config.RongCloudConfig;
 import com.yonge.cooleshow.biz.dal.dao.CourseScheduleStudentPaymentDao;
 import com.yonge.cooleshow.biz.dal.dao.ImGroupDao;
@@ -10,21 +13,35 @@ import com.yonge.cooleshow.biz.dal.dto.ImGroupSearchDto;
 import com.yonge.cooleshow.biz.dal.entity.CourseGroup;
 import com.yonge.cooleshow.biz.dal.entity.ImGroup;
 import com.yonge.cooleshow.biz.dal.entity.ImGroupMember;
+import com.yonge.cooleshow.biz.dal.entity.Teacher;
 import com.yonge.cooleshow.biz.dal.enums.ImGroupMemberRoleType;
 import com.yonge.cooleshow.biz.dal.enums.ImGroupType;
-import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.service.CourseGroupService;
+import com.yonge.cooleshow.biz.dal.service.ImGroupMemberService;
+import com.yonge.cooleshow.biz.dal.service.ImGroupService;
+import com.yonge.cooleshow.biz.dal.service.ImUserFriendService;
+import com.yonge.cooleshow.biz.dal.service.SysUserService;
+import com.yonge.cooleshow.biz.dal.service.TeacherService;
 import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.base.util.ThreadPool;
 import io.rong.models.Result;
 import io.rong.models.group.GroupMember;
 import io.rong.models.group.GroupModel;
 import org.apache.commons.collections.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.util.*;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.UUID;
 
 /**
  * 即时通讯群组(ImGroup)表服务实现类
@@ -47,8 +64,14 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
     private ImGroupMemberAuditDao imGroupMemberAuditDao;
     @Resource
     private SysUserService sysUserService;
+    @Autowired
+    private ImGroupService imGroupService;
+    @Autowired
+    private TeacherService teacherService;
     @Resource
     private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
+    @Autowired
+    private AppGlobalServiceConfig appGlobalServiceConfig;
 
     @Override
     public ImGroupDao getDao() {
@@ -194,5 +217,46 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
             throw new BizException("退出群聊失败,请联系管理员");
         }
     }
+
+    /**
+     * 用户群组信息
+     *
+     * @param groupId 群组ID
+     * @param userId  用户ID
+     * @return ImGroup
+     */
+    @Override
+    public ImGroup findGroupInfoById(String groupId, Long userId) {
+
+        ImGroup group = imGroupService.getById(groupId);
+
+        // 异步执行自动加入群组功能
+        ThreadPool.getExecutor().submit(() -> {
+            try {
+
+                if (Objects.nonNull(group) && appGlobalServiceConfig.getGroupMemberJoin()) {
+
+                    // 若用户群组存在,判定用户是否拥有老师身份,自动加入群组
+                    int count = teacherService.count(Wrappers.<Teacher>lambdaQuery()
+                            .eq(Teacher::getUserId, userId));
+
+                    // 用户是否已加入该群组
+                    int groupMembers = imGroupMemberService.count(Wrappers.<ImGroupMember>lambdaQuery()
+                            .eq(ImGroupMember::getGroupId, groupId).eq(ImGroupMember::getUserId, userId));
+
+                    if (count > 0 && groupMembers > 0) {
+
+                        // 自动加入该群组
+                        imGroupMemberService.join(Lists.newArrayList(new GroupMember(userId.toString(), groupId, null)), groupId);
+                    }
+                }
+
+            } catch (Exception e) {
+                log.error("findGroupInfoById groupId={}, userId={}", group, userId, e);
+            }
+        });
+
+        return group;
+    }
 }
 

+ 112 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/im/ImUserFriendVO.java

@@ -0,0 +1,112 @@
+package com.yonge.cooleshow.biz.dal.vo.im;
+
+import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.biz.dal.enums.ImGroupMemberRoleType;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.Optional;
+
+/**
+ * Created by Eric.Shang on 2022/9/28.
+ */
+public class ImUserFriendVO {
+
+    /**
+     * 用户好友信息
+     */
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class ImUserFriend implements Serializable {
+
+        @ApiModelProperty(value = "主键;")
+        private Long id;
+
+        @ApiModelProperty(value = "当前用户编号")
+        private Long userId;
+
+        @ApiModelProperty(value = "好友编号")
+        private String friendId;
+
+        @ApiModelProperty(value = "融云好友编号")
+        private String imFriendId;
+
+        @ApiModelProperty(value = "好友头像")
+        private String friendAvatar;
+
+        @ApiModelProperty(value = "好友昵称")
+        private String friendNickname;
+
+        @ApiModelProperty(value = "备注")
+        private String memo;
+
+        @ApiModelProperty(value = "创建时间;")
+        private Date createTime;
+
+        @ApiModelProperty(value = "修改时间;")
+        private Date updateTime;
+
+        public static ImUserFriend from(String recv) {
+
+            return JSON.parseObject(recv, ImUserFriend.class);
+        }
+
+        public String getFriendId() {
+
+            return Optional.ofNullable(getImFriendId()).orElse(friendId);
+        }
+    }
+
+    /**
+     * 群组成员信息
+     */
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class ImGroupMember implements Serializable {
+
+        @ApiModelProperty(value = "主键;")
+        private Long id;
+
+        @ApiModelProperty(value = "群编号;")
+        private String groupId;
+
+        @ApiModelProperty(value = "用户编号;")
+        private String userId;
+
+        @ApiModelProperty(value = "昵称;")
+        private String nickname;
+
+        @ApiModelProperty(value = "用户头像;")
+        private String avatar;
+
+        @ApiModelProperty(value = "是否是管理员")
+        private Boolean isAdmin;
+
+        @ApiModelProperty(value = "群角色TEACHER老师、STUDENT学生")
+        private ImGroupMemberRoleType roleType;
+
+        @ApiModelProperty(value = "创建时间;")
+        private Date createTime;
+
+        @ApiModelProperty(value = "修改时间;")
+        private Date updateTime;
+
+        @ApiModelProperty(value = "IM用户ID")
+        private String imUserId;
+
+        public static ImGroupMember from(String recv) {
+
+            return JSON.parseObject(recv, ImGroupMember.class);
+        }
+
+        public String getUserId() {
+            return Optional.ofNullable(getImUserId()).orElse(userId);
+        }
+    }
+}

+ 19 - 2
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/ImGroupController.java

@@ -1,6 +1,8 @@
 package com.yonge.cooleshow.student.controller;
 
 
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.ImGroupResultDto;
 import com.yonge.cooleshow.biz.dal.dto.ImGroupSearchDto;
 import com.yonge.cooleshow.biz.dal.entity.ImGroup;
@@ -13,9 +15,14 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.validation.BindingResult;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import javax.validation.Valid;
@@ -38,11 +45,21 @@ public class ImGroupController extends BaseController {
     private ImGroupService imGroupService;
     @Resource
     private SysUserService sysUserService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
 
     @ApiOperation("获取群详情")
     @PostMapping(value = "/getDetail/{groupId}")
     public HttpResponseResult<ImGroup> getDetail(@ApiParam(value = "群编号", required = true) @PathVariable("groupId") String groupId) throws Exception {
-        ImGroup group = imGroupService.getById(groupId);
+
+        // 获取用户ID
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null  || sysUser.getId() == null) {
+            return failed("用户信息获取失败");
+        }
+
+        ImGroup group = imGroupService.findGroupInfoById(groupId, sysUser.getId());
+        // ImGroup group = imGroupService.getById(groupId);
         if (group == null) {
             return failed(HttpStatus.NO_CONTENT, "群组不存在");
         }

+ 9 - 2
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/ImGroupMemberController.java

@@ -1,11 +1,13 @@
 package com.yonge.cooleshow.student.controller;
 
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.yonge.cooleshow.biz.dal.entity.ImGroupMember;
 import com.yonge.cooleshow.biz.dal.enums.MK;
 import com.yonge.cooleshow.biz.dal.service.ImGroupMemberService;
+import com.yonge.cooleshow.biz.dal.vo.im.ImUserFriendVO;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.exception.BizException;
@@ -47,7 +49,7 @@ public class ImGroupMemberController extends BaseController {
     })
     @ApiOperation("获取好友详情")
     @PostMapping(value = "/getUserDetail")
-    public HttpResponseResult<ImGroupMember> getUserDetail(@RequestBody Map<String,Object> params) {
+    public HttpResponseResult<ImUserFriendVO.ImGroupMember> getUserDetail(@RequestBody Map<String,Object> params) {
         if(Objects.isNull(params.get("groupId")) || Objects.isNull(params.get("userId"))){
             throw new BizException("参数校验失败");
         }
@@ -59,7 +61,12 @@ public class ImGroupMemberController extends BaseController {
             return failed("无效的用户ID");
         }
 
-        return succeed(imGroupMemberService.getUserDetail(userId, params.get("groupId").toString()));
+        ImGroupMember groupMember = imGroupMemberService.getUserDetail(userId, params.get("groupId").toString());
+        if (Objects.isNull(groupMember)) {
+            return failed("用户无当前群组权限");
+        }
+
+        return succeed(ImUserFriendVO.ImGroupMember.from(JSON.toJSONString(groupMember)));
     }
 
 

+ 9 - 2
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/ImUserFriendController.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.student.controller;
 
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
@@ -8,6 +9,7 @@ import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.entity.ImUserFriend;
 import com.yonge.cooleshow.biz.dal.enums.MK;
 import com.yonge.cooleshow.biz.dal.service.ImUserFriendService;
+import com.yonge.cooleshow.biz.dal.vo.im.ImUserFriendVO;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import io.swagger.annotations.*;
@@ -54,14 +56,19 @@ public class ImUserFriendController extends BaseController {
 
     @ApiOperation("获取好友详情")
     @PostMapping(value = "/getDetail/{userId}")
-    public HttpResponseResult<ImUserFriend> getDetail(@ApiParam(value = "用户编号", required = true) @PathVariable("userId") String userId) {
+    public HttpResponseResult<ImUserFriendVO.ImUserFriend> getDetail(@ApiParam(value = "用户编号", required = true) @PathVariable("userId") String userId) {
 
         String ret = userId.split(":")[0];
         if (!ret.matches(MK.EXP_INT)) {
             return failed("无效的用户ID");
         }
 
-        return succeed(imUserFriendService.getDetail(userId));
+        ImUserFriend userFriend = imUserFriendService.getDetail(userId);
+        if (Objects.isNull(userFriend)) {
+            return failed("当前好友不存在");
+        }
+
+        return succeed(ImUserFriendVO.ImUserFriend.from(JSON.toJSONString(userFriend)));
     }
 }
 

+ 9 - 4
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/ImGroupMemberController.java

@@ -1,13 +1,13 @@
 package com.yonge.cooleshow.teacher.controller;
 
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.yonge.cooleshow.biz.dal.entity.ImGroupMember;
-import com.yonge.cooleshow.biz.dal.entity.ImUserFriend;
 import com.yonge.cooleshow.biz.dal.enums.MK;
 import com.yonge.cooleshow.biz.dal.service.ImGroupMemberService;
+import com.yonge.cooleshow.biz.dal.vo.im.ImUserFriendVO;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.exception.BizException;
@@ -48,7 +48,7 @@ public class ImGroupMemberController extends BaseController {
     })
     @ApiOperation("获取好友详情")
     @PostMapping(value = "/getUserDetail")
-    public HttpResponseResult<ImGroupMember> getUserDetail(@RequestBody Map<String,Object> params) {
+    public HttpResponseResult<ImUserFriendVO.ImGroupMember> getUserDetail(@RequestBody Map<String,Object> params) {
         if(Objects.isNull(params.get("groupId")) || Objects.isNull(params.get("userId"))){
             throw new BizException("参数校验失败");
         }
@@ -60,7 +60,12 @@ public class ImGroupMemberController extends BaseController {
             return failed("无效的用户ID");
         }
 
-        return succeed(imGroupMemberService.getUserDetail(userId, params.get("groupId").toString()));
+        ImGroupMember groupMember = imGroupMemberService.getUserDetail(userId, params.get("groupId").toString());
+        if (Objects.isNull(groupMember)) {
+            return failed("用户无当前群组权限");
+        }
+
+        return succeed(ImUserFriendVO.ImGroupMember.from(JSON.toJSONString(groupMember)));
     }
 
     @ApiImplicitParams({

+ 9 - 2
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/ImUserFriendController.java

@@ -1,12 +1,14 @@
 package com.yonge.cooleshow.teacher.controller;
 
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.yonge.cooleshow.biz.dal.entity.ImUserFriend;
 import com.yonge.cooleshow.biz.dal.enums.MK;
 import com.yonge.cooleshow.biz.dal.service.ImUserFriendService;
 import com.yonge.cooleshow.biz.dal.service.SysUserService;
+import com.yonge.cooleshow.biz.dal.vo.im.ImUserFriendVO;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import io.swagger.annotations.*;
@@ -54,14 +56,19 @@ public class ImUserFriendController extends BaseController {
 
     @ApiOperation("获取好友详情")
     @PostMapping(value = "/getDetail/{userId}")
-    public HttpResponseResult<ImUserFriend> getDetail(@ApiParam(value = "用户编号", required = true) @PathVariable("userId") String userId) {
+    public HttpResponseResult<ImUserFriendVO.ImUserFriend> getDetail(@ApiParam(value = "用户编号", required = true) @PathVariable("userId") String userId) {
 
         String ret = userId.split(":")[0];
         if (!ret.matches(MK.EXP_INT)) {
             return failed("无效的用户ID");
         }
 
-        return succeed(imUserFriendService.getDetail(userId));
+        ImUserFriend userFriend = imUserFriendService.getDetail(userId);
+        if (Objects.isNull(userFriend)) {
+            return failed("当前好友不存在");
+        }
+
+        return succeed(ImUserFriendVO.ImUserFriend.from(JSON.toJSONString(userFriend)));
     }
 
 }