Bläddra i källkod

Merge branch 'dev_v1.3.6_20221014' into online

Eric 2 år sedan
förälder
incheckning
fa28ec6aa0

+ 18 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TeacherController.java

@@ -5,6 +5,7 @@ import com.yonge.cooleshow.admin.io.request.TeacherBindingUserVo;
 import com.yonge.cooleshow.admin.io.request.coupon.CouponIssueVo;
 import com.yonge.cooleshow.biz.dal.queryInfo.TeacherBindingUserQueryInfo;
 import com.yonge.cooleshow.biz.dal.queryInfo.TeacherQueryInfo;
+import com.yonge.cooleshow.biz.dal.service.ImGroupService;
 import com.yonge.cooleshow.biz.dal.service.UserBindingTeacherService;
 import com.yonge.cooleshow.biz.dal.vo.userBindingTeacher.UserBindingCourseWrapper;
 import com.yonge.cooleshow.biz.dal.vo.userBindingTeacher.UserBindingTeacherWrapper;
@@ -37,6 +38,7 @@ import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -91,6 +93,9 @@ public class TeacherController extends BaseController {
     @Autowired
     private UserBindingTeacherService userBindingTeacherService;
 
+    @Autowired
+    private ImGroupService imGroupService;
+
     /**
      * 查询单条
      */
@@ -333,4 +338,17 @@ public class TeacherController extends BaseController {
 
         return succeed(PageUtil.getPageInfo(pages, responses));
     }
+
+
+    /**
+     * 老师粉丝信息查询
+     * @return HttpResponseResult<PageInfo<MyFens>>
+     */
+    @ApiOperation(value = "旧数据创建粉丝群接口")
+    @PutMapping(value = "/createFansImGroup")
+    public HttpResponseResult createFansImGroup() throws Exception {
+
+        imGroupService.setTeacherFansGroup();
+        return succeed();
+    }
 }

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageTypeEnum.java

@@ -60,6 +60,7 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     STUDENT_EVALUATE_TEACHER_PRACTICE("学员对老师评价"),
     WITHDRAWAL_SUCCESS("结算成功"),
     STUDENT_JOIN_FANSGROUP("学员申请加入粉丝群"),
+    STUDENT_AUTOJOIN_FANSGROUP("学员自动加入粉丝群"),
 
     VIP_BUY_SUCCESS("会员购买成功"),
     SMS_VIP_BUY_SUCCESS("会员购买成功(短信)"),

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

@@ -71,5 +71,11 @@ public interface ImGroupService extends IService<ImGroup> {
 
     //退群
     void quit(String groupId,Long userId) throws Exception;
+
+    /**
+     * 旧数据创建粉丝群
+     */
+    void setTeacherFansGroup() throws Exception;
+
 }
 

+ 95 - 1
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.extension.service.impl.ServiceImpl;
+import com.google.common.collect.Lists;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.config.RongCloudConfig;
 import com.yonge.cooleshow.biz.dal.dao.CourseScheduleStudentPaymentDao;
 import com.yonge.cooleshow.biz.dal.dao.ImGroupDao;
@@ -13,18 +16,40 @@ import com.yonge.cooleshow.biz.dal.entity.ImGroupMember;
 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.entity.StudentStar;
+import com.yonge.cooleshow.biz.dal.entity.Teacher;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.ImGroupMemberRoleType;
+import com.yonge.cooleshow.biz.dal.enums.ImGroupType;
+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.StudentStarService;
+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.text.MessageFormat;
+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;
+import java.util.stream.Collectors;
 
 /**
  * 即时通讯群组(ImGroup)表服务实现类
@@ -50,6 +75,15 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
     @Resource
     private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
 
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private StudentStarService studentStarService;
+
+    @Autowired
+    private TeacherService teacherService;
+
     @Override
     public ImGroupDao getDao() {
         return this.baseMapper;
@@ -194,5 +228,65 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
             throw new BizException("退出群聊失败,请联系管理员");
         }
     }
+
+    @Override
+    public void setTeacherFansGroup() throws Exception {
+        // 查询所有认证老师
+        List<Teacher> teacherList = teacherService.lambdaQuery().eq(Teacher::getEntryFlag, 1).list();
+
+        // 遍历给老师创建粉丝群
+
+        for (Teacher teacher : teacherList) {
+
+            // 已经有群的不操作
+            Integer count = this.lambdaQuery()
+                                .eq(ImGroup::getCreateBy, teacher.getUserId())
+                                .eq(ImGroup::getAutoPassFlag, true)
+                                .eq(ImGroup::getType, ImGroupType.FAN)
+                                .count();
+            if (count > 0) {
+                continue;
+            }
+
+            // 老师用户信息
+            SysUser sysUser = sysUserFeignService.queryUserById(teacher.getUserId());
+            if (sysUser == null) {
+                continue;
+            }
+
+
+            // 查询老师的粉丝,添加到群
+            List<StudentStar> list = studentStarService.lambdaQuery()
+                                                       .eq(StudentStar::getTeacherId, teacher.getUserId())
+                                                       .list();
+            Set<Long> studentIdList = list.stream().map(StudentStar::getStudentId).collect(Collectors.toSet());
+
+
+            //创建群聊
+            ImGroup imGroup = new ImGroup();
+            imGroup.setCreateBy(teacher.getUserId());
+            imGroup.setAutoPassFlag(true);
+            imGroup.setMemberNum(studentIdList.size() + 1);
+            imGroup.setName(sysUser.getUsername() + "的粉丝群");
+            imGroup.setType(ImGroupType.FAN);
+            imGroup.setCreateTime(new Date());
+            imGroup.setUpdateTime(new Date());
+            imGroup.setCreateBy(teacher.getUserId());
+            String imGroupId = UUID.randomUUID() + imGroup.getType().getCode();
+            imGroup.setId(imGroupId);
+            this.baseMapper.insert(imGroup);
+            List<GroupMember> groupMembers = imGroupMemberService.initGroupMember(imGroupId, imGroup.getCreateBy(), true, ImGroupMemberRoleType.TEACHER);
+            if (!CollectionUtils.isEmpty(studentIdList)) {
+                groupMembers.addAll(imGroupMemberService.initGroupMembers(imGroupId, studentIdList, ImGroupMemberRoleType.STUDENT));
+            }
+            //创建融云群
+            this.rtcCreate(sysUser.getId(), imGroupId, imGroup.getName());
+            //加入融云群
+            imGroupMemberService.join(groupMembers, imGroupId);
+
+        }
+
+    }
+
 }
 

+ 77 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentStarServiceImpl.java

@@ -2,12 +2,25 @@ 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.Maps;
+import com.yonge.cooleshow.biz.dal.entity.ImGroup;
 import com.yonge.cooleshow.biz.dal.entity.StudentTotal;
+import com.yonge.cooleshow.biz.dal.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.entity.TeacherTotal;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.ImGroupMemberRoleType;
+import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
+import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
+import com.yonge.cooleshow.biz.dal.service.ImGroupMemberService;
+import com.yonge.cooleshow.biz.dal.service.ImGroupService;
 import com.yonge.cooleshow.biz.dal.service.StudentTotalService;
 import com.yonge.cooleshow.biz.dal.service.TeacherTotalService;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import com.yonge.toolset.base.util.ThreadPool;
+import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
+import io.rong.models.group.GroupMember;
+import lombok.extern.slf4j.Slf4j;
 import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -15,7 +28,11 @@ import com.yonge.cooleshow.biz.dal.entity.StudentStar;
 import com.yonge.cooleshow.biz.dal.dao.StudentStarDao;
 import com.yonge.cooleshow.biz.dal.service.StudentStarService;
 
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 
+@Slf4j
 @Service
 public class StudentStarServiceImpl extends ServiceImpl<StudentStarDao, StudentStar> implements StudentStarService {
     @Autowired
@@ -24,6 +41,14 @@ public class StudentStarServiceImpl extends ServiceImpl<StudentStarDao, StudentS
     private StudentTotalService studentTotalService;
     @Autowired
     private TeacherTotalService teacherTotalService;
+    @Autowired
+    private ImGroupMemberService imGroupMemberService;
+    @Autowired
+    private ImGroupService imGroupService;
+    @Autowired
+    private SysUserMapper sysUserMapper;
+    @Autowired
+    private SysMessageServiceImpl sysMessageService;
 
     @Override
     public StudentStar getByStudentIdAndTeacherId(Long studentId, Long teacherId) {
@@ -42,6 +67,10 @@ public class StudentStarServiceImpl extends ServiceImpl<StudentStarDao, StudentS
             save(studentStar);
             studentTotal.setStarTeacherNum(studentTotal.getStarTeacherNum() + 1);
             teacherTotal.setFansNum(teacherTotal.getFansNum() + 1);
+
+            // 关注老师,自动加入老师粉丝群
+            studentAutoJoinTeacherFansGroup(studentId, teacherId);
+
         } else if (YesOrNoEnum.NO.equals(starStatus) && null != studentStar) {
             remove(Wrappers.<StudentStar>lambdaQuery()
                     .eq(StudentStar::getStudentId, studentId)
@@ -54,4 +83,52 @@ public class StudentStarServiceImpl extends ServiceImpl<StudentStarDao, StudentS
         teacherTotalService.updateTotalCache(teacherTotal);
         return HttpResponseResult.succeed(true);
     }
+
+    /**
+     * 学生关注老师,自动加入粉丝群
+     * @param studentId 学生ID
+     * @param teacherId 老师ID
+     */
+    private void studentAutoJoinTeacherFansGroup(Long studentId, Long teacherId) {
+        ThreadPool.getExecutor().submit(() -> {
+
+            try {
+
+                // 查询老师粉丝群
+                ImGroup imGroup = imGroupService.lambdaQuery()
+                        .eq(ImGroup::getCreateBy, teacherId)
+                        .eq(ImGroup::getAutoPassFlag, true)
+                        .one();
+
+                if (Objects.nonNull(imGroup)) {
+
+                    //处理本地群成员
+                    List<GroupMember> groupMembers = imGroupMemberService.initGroupMember(imGroup.getId(),
+                            studentId, false, ImGroupMemberRoleType.STUDENT);
+                    //同步群成员数量
+                    imGroupService.getDao().updateMemberNum(imGroup.getId());
+
+                    //加入融云群
+                    imGroupMemberService.join(groupMembers, imGroup.getId());
+
+                    // 发送通知消息
+                    SysUser student = sysUserMapper.selectById(studentId);
+
+                    if (Objects.nonNull(student)) {
+
+                        Map<Long, String> receivers = Maps.newHashMap();
+                        receivers.put(student.getId(), student.getPhone());
+
+                        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_AUTOJOIN_FANSGROUP,
+                                receivers, null, 0, null, ClientEnum.STUDENT.getCode(), imGroup.getName());
+                    }
+
+                }
+
+            } catch (Exception e) {
+                log.error("StudentStar studentId={}, teacherId={}", studentId, teacherId);
+            }
+
+        });
+    }
 }

+ 28 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherAuthEntryRecordServiceImpl.java

@@ -10,6 +10,7 @@ import com.yonge.cooleshow.biz.dal.dao.TeacherDao;
 import com.yonge.cooleshow.biz.dal.dto.req.AuthOperaReq;
 import com.yonge.cooleshow.biz.dal.dto.req.TeacherApplyDetailReq;
 import com.yonge.cooleshow.biz.dal.dto.search.AuthEntryRecordSearch;
+import com.yonge.cooleshow.biz.dal.entity.ImGroup;
 import com.yonge.cooleshow.biz.dal.entity.Teacher;
 import com.yonge.cooleshow.biz.dal.entity.TeacherStyleVideo;
 import com.yonge.cooleshow.biz.dal.enums.*;
@@ -22,6 +23,7 @@ import com.yonge.cooleshow.common.enums.UserFirstTimeTypeEnum;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.string.StringPool;
 import com.yonge.toolset.base.util.StringUtil;
+import com.yonge.toolset.base.util.ThreadPool;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import com.yonge.toolset.utils.string.ValueUtil;
 import org.slf4j.Logger;
@@ -35,6 +37,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
+import java.text.MessageFormat;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -54,6 +57,8 @@ public class TeacherAuthEntryRecordServiceImpl extends ServiceImpl<TeacherAuthEn
 
     @Autowired
     private TeacherService teacherService;
+    @Autowired
+    private ImGroupService imGroupService;
 
     @Override
     public TeacherAuthEntryRecordVo detail(Long id) {
@@ -114,6 +119,8 @@ public class TeacherAuthEntryRecordServiceImpl extends ServiceImpl<TeacherAuthEn
                 //记录达人认证时间
                 userFirstTimeService.recordTime(build.getUserId(), ClientEnum.TEACHER, UserFirstTimeTypeEnum.ENTRY);
 
+                // 老师达人认证成功,自动创建粉丝群
+                teacherAutoCreateFansGroup(teacher);
             }
             if (null == teacher.getEntryFlag() || YesOrNoEnum.NO.equals(teacher.getEntryFlag())) {
                 teacher.setEntryFlag(authOperaReq.getPass() ? YesOrNoEnum.YES : YesOrNoEnum.NO);
@@ -136,6 +143,27 @@ public class TeacherAuthEntryRecordServiceImpl extends ServiceImpl<TeacherAuthEn
         return HttpResponseResult.succeed(true);
     }
 
+    /**
+     * 老师达人认证通过,自动创建粉丝群
+     * @param teacher TeacherVo
+     */
+    private void teacherAutoCreateFansGroup(TeacherVo teacher) {
+        ThreadPool.getExecutor().submit(() -> {
+
+            try {
+                ImGroup imGroup = new ImGroup();
+                imGroup.setName(MessageFormat.format("{0}的粉丝群", teacher.getUsername()));
+                imGroup.setIntroduce("");
+                imGroup.setAutoPassFlag(true);
+                imGroup.setCreateBy(teacher.getUserId());
+
+                imGroupService.create(imGroup);
+            } catch (Exception e) {
+                log.error("doAuth teacherId={}", teacher.getUserId(), e);
+            }
+        });
+    }
+
     private void setTag(AuthOperaReq authOperaReq, TeacherAuthEntryRecord build, TeacherVo teacher) {
         if (authOperaReq.getPass()) {
             if (!StringUtil.isEmpty(teacher.getTeacherCertificate())) {