Pārlūkot izejas kodu

Merge remote-tracking branch 'origin/master_saas' into master_saas

zouxuan 2 gadi atpakaļ
vecāks
revīzija
8591fb6bd8

+ 9 - 13
.idea/httpRequests/http-requests-log.http

@@ -1,3 +1,12 @@
+GET http://127.0.0.1:9001/open/sysConfig/queryByParamName?paramName=wechat_appid
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+<> 2023-05-17T183050.200.json
+
+###
+
 POST http://127.0.0.1:8005/imLiveBroadcastRoomMember/queryRoomMember
 Content-Type: application/json
 Authorization: bearer 70c30cec-f77c-4871-beaa-ce4b5224bf3e
@@ -595,16 +604,3 @@ Accept-Encoding: br,deflate,gzip,x-gzip
 
 ###
 
-POST http://127.0.0.1:8001/smsLogin?clientId=EDUCATION&clientSecret=EDUCATION&deviceNum=&phone=15907121011&smsCode=666666
-Content-Type: application/x-www-form-urlencoded
-Content-Length: 2
-Proxy-Connection: Keep-Alive
-User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
-Accept-Encoding: br,deflate,gzip,x-gzip
-
-{}
-
-<> 2023-05-09T162057.200.json
-
-###
-

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/StudentWrapper.java

@@ -180,6 +180,10 @@ public class StudentWrapper {
         @ApiModelProperty(value = "手机号")
         private String phone;
 
+        @ApiModelProperty(value = "分部id")
+        private Integer organId;
+
+
         @ApiModelProperty(value = "年级")
         private String currentGrade;
 

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ImGroupService.java

@@ -8,6 +8,7 @@ import com.ym.mec.biz.dal.entity.ImGroup;
 import com.ym.mec.biz.dal.enums.school.ESchoolStaffType;
 import com.ym.mec.biz.dal.wrapper.ImGroupWrapper;
 import com.ym.mec.common.service.BaseService;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 
@@ -116,6 +117,14 @@ public interface ImGroupService extends BaseService<String, ImGroup> {
     void addSchoolStaffGroup(Long schoolId, Integer userId,String name,String avatar, ESchoolStaffType leader) throws Exception;
 
     /**
+     * 群主移交
+     * @param userId 用户id
+     * @param imGroupId     群组id
+     */
+    @Transactional(rollbackFor = Exception.class)
+    Boolean  groupChangeOwner(Integer userId, String imGroupId) throws Exception;
+
+    /**
      * 加群
      *
      * @param musicGroupIds 群组ID

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

@@ -103,6 +103,13 @@ public interface ImLiveBroadcastRoomService extends IService<ImLiveBroadcastRoom
     RoomUserInfoVo getVisitorCredentials(String roomUid, String fingerprint);
 
     /**
+     * 游客微信身份
+     * @param code 授权码
+     * @return 用户openId
+     */
+    String visitorFingerprint(String code);
+
+    /**
      * 直播间访问用户信息
      * @param userId 用户编号
      * @param roomUid 直播间编号

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java

@@ -411,6 +411,13 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
     // 按分部强制开始为腾讯服务提供
     String TENCENT_RTC_SERVICE_PROVIDER = "tencent_rtc_service_provider";
 
+    // 微信公众号appid
+    String WECHAT_APPID = "wechat_appid";
+
+    // 微信公众号secret
+    String WECHAT_SECRET = "wechat_secret";
+
+
     static void checkActivityDate(String startTimeStr, String endTimeStr) {
         if(StringUtils.isEmpty(startTimeStr) || StringUtils.isEmpty(startTimeStr)){
             return;

+ 11 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupServiceImpl.java

@@ -398,18 +398,25 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
      * @param userId 用户id
      * @param imGroupId     群组id
      */
-    private void groupChangeOwner(Integer userId, String imGroupId) throws Exception {
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean groupChangeOwner(Integer userId, String imGroupId) throws Exception {
 
         String serviceProvider = sysConfigService.findByParamName(SysConfigService.IM_SERVICE_PROVIDER).getParanValue();
 
         ImPluginService imPluginService =imPluginContext.getPluginService(serviceProvider);
 
         ImGroupMember imGroupMember = imGroupMemberDao.getAdmin(imGroupId);
-        imPluginService.changeGroupOwner(imGroupId, userId.toString(),imGroupMember.getUserId().toString());
-        imGroupMember.setIsAdmin(false);
-        imGroupMemberDao.update(imGroupMember);
+        Integer adminId = userId;
+        if (Objects.nonNull(imGroupMember)) {
+            adminId = imGroupMember.getUserId();
+            imGroupMember.setIsAdmin(false);
+            imGroupMemberDao.update(imGroupMember);
+        }
+        imPluginService.changeGroupOwner(imGroupId, userId.toString(),adminId.toString());
 
         imGroupMemberDao.updateAdmin(imGroupId, userId);
+        return true;
     }
 
     /**

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

@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.google.common.collect.Lists;
+import com.microsvc.toolkit.common.json.ali.AliJSONMap;
 import com.microsvc.toolkit.middleware.live.LivePluginContext;
 import com.microsvc.toolkit.middleware.live.LivePluginService;
 import com.microsvc.toolkit.middleware.live.impl.RongCloudLivePlugin;
@@ -56,7 +57,10 @@ import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.excel.POIUtil;
+import com.ym.mec.util.http.HttpUtil;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.jetbrains.annotations.NotNull;
@@ -1656,6 +1660,53 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     }
 
     /**
+     * 游客微信身份
+     *
+     * @param code 授权码
+     * @return 用户openId
+     */
+    @Override
+    public String visitorFingerprint(String code) {
+
+        // 微信公众号appId
+        String appId = sysConfigDao.findConfigValue(SysConfigService.WECHAT_APPID);
+        // 微信公众号secret
+        String secret = sysConfigDao.findConfigValue(SysConfigService.WECHAT_SECRET);
+
+        if (StringUtils.isAnyBlank(appId, secret, code)) {
+            // 若微信未配置,产生64位随机数
+            return RandomStringUtils.random(64);
+        }
+
+        try {
+            // 获取用户OpenId接口
+            String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code";
+
+            // 封装请求参数
+            url = MessageFormat.format(url, appId, secret, code);
+
+            String wxMpOAuth2AccessTokenUrl = HttpUtil.get(url, null);
+            log.info("请求微信授权接口的参数:{}", wxMpOAuth2AccessTokenUrl);
+            if (StringUtils.isEmpty(wxMpOAuth2AccessTokenUrl)) {
+                throw new BizException("授权失败,请重新授权");
+            }
+            Map<String, Object> weChatRes = AliJSONMap.tomap(wxMpOAuth2AccessTokenUrl);
+
+            if (!weChatRes.containsKey("openid")) {
+                log.error("获取微信openId失败:[{}]", JSON.toJSONString(weChatRes));
+                throw new BizException("授权失败,请重新授权");
+            }
+
+            return MapUtils.getString(weChatRes, "openid", "");
+
+        } catch (Exception e) {
+            log.error("获取微信openId失败:[{}]", e.getMessage(), e);
+            throw new BizException("授权失败,请重新授权");
+        }
+
+    }
+
+    /**
      * 获取直播间游客信息
      * @param userId 游客编号
      * @param imLiveBroadcastRoomVo ImLiveBroadcastRoomVo

+ 6 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImSendGroupMessageServiceImpl.java

@@ -50,10 +50,12 @@ public class ImSendGroupMessageServiceImpl extends BaseServiceImpl<Long, ImSendG
 	@Transactional(rollbackFor = Exception.class)
 	public void sendGroupMessage(ImSendGroupMessage messageDto) throws Exception {
 		SysUser user = Optional.ofNullable(sysUserFeignService.queryUserInfo()).orElseThrow(() -> new BizException("用户不存在"));
-		String[] split = messageDto.getTargetIds().split(",");
-		if(split.length > 10){
-			throw new BizException("单次目标用户(群组)不可超过10");
-		}
+        if (StringUtils.isNotBlank(messageDto.getTargetIds())) {
+            String[] split = messageDto.getTargetIds().split(",");
+            if (split.length > 10) {
+                throw new BizException("单次目标用户(群组)不可超过10");
+            }
+        }
 		messageDto.setSenderId(user.getId().toString());
 		messageDto.setOperator(user.getRealName());
 		if(Objects.isNull(messageDto.getSendTime())){

+ 4 - 6
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImUserFriendServiceImpl.java

@@ -196,7 +196,7 @@ public class ImUserFriendServiceImpl extends BaseServiceImpl<Long, ImUserFriend>
 
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
         // 更新学校端乐团主管的群好友列表
-        if (musicGroup.getCooperationOrganId() != null) {
+        if (musicGroup != null && musicGroup.getCooperationOrganId() != null) {
             // 获取乐团主管
             List<SchoolStaff> schoolStaffs = schoolStaffMapper.getByCoopIdAndType(musicGroup.getCooperationOrganId(), ESchoolStaffType.ORCHESTRA_LEADER);
 
@@ -204,7 +204,7 @@ public class ImUserFriendServiceImpl extends BaseServiceImpl<Long, ImUserFriend>
                 SchoolStaff schoolStaff = schoolStaffs.get(0);
                 // 群组ID集合
                 List<String> imGroupIds = new ArrayList<>();
-                imGroupIds.add(musicGroupId);
+//                imGroupIds.add(musicGroupId);
                 if (CollectionUtils.isNotEmpty(classGroups)) {
                     imGroupIds.addAll(classGroups.stream().map(o -> o.getId().toString()).collect(Collectors.toList()));
                 }
@@ -218,11 +218,9 @@ public class ImUserFriendServiceImpl extends BaseServiceImpl<Long, ImUserFriend>
                     userFriends(imUserFriends, musicGroup.getName(), staffUserId, userIds);
                 }
             }
-
-        }
-        // 更新学校端好友列表
-        if (musicGroup.getCooperationOrganId() != null) {
+            // 更新学校端好友列表
             imUserFriends.addAll(schoolStaffFriend(musicGroup.getCooperationOrganId()));
+
         }
 
 

+ 25 - 18
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SchoolStaffServiceImpl.java

@@ -33,6 +33,9 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.text.MessageFormat;
 import java.util.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
@@ -226,30 +229,34 @@ public class SchoolStaffServiceImpl extends ServiceImpl<SchoolStaffMapper, Schoo
             throw new BizException("加入群组失败");
         }
 
-        // 乐团领队添加到所有乐团群
-        List<MusicGroup> musicGroups = cooperationOrganService.musicGroupPage(schoolStaff.getSchoolId().intValue());
+         CompletableFuture.runAsync( () -> {
 
-        // 创建学校im好友
-        imUserFriendService.refreshSchoolStaffFriend(schoolStaff.getSchoolId().intValue());
-        // 创建乐团im好友
-        for (MusicGroup musicGroup : musicGroups) {
-            imUserFriendService.refreshGroupImUserFriend(musicGroup.getId(),null);
-        }
+             // 创建学校im好友
+             imUserFriendService.refreshSchoolStaffFriend(schoolStaff.getSchoolId().intValue());
+             if (schoolStaff.getUserType().equals(ESchoolStaffType.ORCHESTRA_LEADER)) {
 
-        // id 集合
-        List<String> musicGroupIds = musicGroups.stream().map(o -> o.getId()).collect(Collectors.toList());
+                 // 乐团领队添加到所有乐团群
+                 List<MusicGroup> musicGroups = cooperationOrganService.musicGroupPage(schoolStaff.getSchoolId().intValue());
+                 // 创建班级im好友
+                 for (MusicGroup musicGroup : musicGroups) {
+                     imUserFriendService.refreshGroupImUserFriend(musicGroup.getId(),null);
+                 }
 
-        // 班级群
-        List<ClassGroup> classGroups = classGroupService.getClassGroupByMusicIds(musicGroupIds);
+                 // id 集合
+                 List<String> musicGroupIds = musicGroups.stream().map(MusicGroup::getId).collect(Collectors.toList());
 
-        // ID集合
-        List<String> classGroupIds = classGroups.stream().map(o -> o.getId().toString()).collect(Collectors.toList());
-        List<String> imGroupIds = new ArrayList<>();
-        imGroupIds.addAll(classGroupIds);
-        imGroupIds.addAll(musicGroupIds);
+                 // 班级群
+                 List<ClassGroup> classGroups = classGroupService.getClassGroupByMusicIds(musicGroupIds);
 
-        imGroupService.addImGroup(imGroupIds,user,schoolStaff.getUserType());
+                 // ID集合
+                 List<String> classGroupIds = classGroups.stream().map(o -> o.getId().toString()).collect(Collectors.toList());
+                 List<String> imGroupIds = new ArrayList<>();
+                 imGroupIds.addAll(classGroupIds);
+        //        imGroupIds.addAll(musicGroupIds);
 
+                 imGroupService.addImGroup(imGroupIds,user,schoolStaff.getUserType());
+             }
+         });
 
         // 删除缓存锁
         redissonClient.getBucket(submitLockKey).delete();

+ 6 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java

@@ -94,6 +94,9 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
     private StudentMemberUpdateLogDao studentMemberUpdateLogDao;
 
     @Autowired
+    private CooperationOrganService cooperationOrganService;
+
+    @Autowired
     private StudentPlusMapper studentPlusMapper;
 
     @Autowired
@@ -1404,6 +1407,9 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
         if (studentRegister == null) {
             return studentDetail;
         }
+        // 学校分部
+        CooperationOrgan cooperationOrgan = cooperationOrganService.get(queryInfo.getCooperationOrganId());
+        studentDetail.setOrganId(cooperationOrgan.getOrganId());
 
 
         SysUser sysUser = sysUserFeignService.queryUserById(studentDetail.getStudentId());

+ 17 - 14
mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java

@@ -231,20 +231,23 @@ public class RoomServiceImpl implements RoomService {
         RoleEnum roleEnum;
 
         // 获取RTC服务提供方
-        String rtcServiceProvider = Optional.ofNullable(sysConfigDao.findConfigValue(SysConfigService.RTC_SERVICE_PROVIDER))
-                .orElse(RongCloudRTCPlugin.PLUGIN_NAME);
+        if (StringUtils.isBlank(courseSchedule.getServiceProvider())) {
 
-        // 按分部强制开始腾讯网络教室
-        {
-            List<Integer> collect = Arrays.stream(Optional.ofNullable(sysConfigDao.findConfigValue(SysConfigService.TENCENT_RTC_SERVICE_PROVIDER)).orElse("").split(","))
-                    .map(Integer::parseInt).distinct().collect(Collectors.toList());
+            String rtcServiceProvider = Optional.ofNullable(sysConfigDao.findConfigValue(SysConfigService.RTC_SERVICE_PROVIDER))
+                    .orElse(RongCloudRTCPlugin.PLUGIN_NAME);
+
+            // 按分部强制开始腾讯网络教室
+            {
+                List<Integer> collect = Arrays.stream(Optional.ofNullable(sysConfigDao.findConfigValue(SysConfigService.TENCENT_RTC_SERVICE_PROVIDER)).orElse("").split(","))
+                        .filter(StringUtils::isNotBlank)
+                        .map(Integer::parseInt).distinct().collect(Collectors.toList());
 
-            if (collect.contains(courseSchedule.getOrganId())) {
-                // 强制开启腾讯网络教室
-                rtcServiceProvider = TencentCloudRTCPlugin.PLUGIN_NAME;
+                if (collect.contains(courseSchedule.getOrganId())) {
+                    // 强制开启腾讯网络教室
+                    rtcServiceProvider = TencentCloudRTCPlugin.PLUGIN_NAME;
+                }
             }
-        }
-        if (StringUtils.isBlank(courseSchedule.getServiceProvider())) {
+
             courseSchedule.setServiceProvider(rtcServiceProvider);
         }
 
@@ -270,7 +273,7 @@ public class RoomServiceImpl implements RoomService {
                 userName = sysUser.getUsername();
 
                 // 学生加入房间,判定老师是否已开启全员静音
-                if (TencentCloudRTCPlugin.PLUGIN_NAME.equals(rtcServiceProvider)) {
+                if (TencentCloudRTCPlugin.PLUGIN_NAME.equals(courseSchedule.getServiceProvider())) {
                     microphone = !muteAll;
                 }
             }
@@ -302,7 +305,7 @@ public class RoomServiceImpl implements RoomService {
             throw new BizException("主讲老师不存在");
         }
 
-        RTCRoomPluginService pluginService = rtcRoomPluginContext.getPluginService(rtcServiceProvider);
+        RTCRoomPluginService pluginService = rtcRoomPluginContext.getPluginService(courseSchedule.getServiceProvider());
         if (TencentCloudRTCPlugin.PLUGIN_NAME.equals(pluginService.pluginName())) {
             // 腾讯云RTC
             // 用户IM帐号创建
@@ -402,7 +405,7 @@ public class RoomServiceImpl implements RoomService {
             roomResult.setMembers(roomMemberList, midiMap, examSongMap, scheduleStudentMusicScores);
 
             // 全员静音状态开启
-            if (muteAll) {
+            if (muteAll && TencentCloudRTCPlugin.PLUGIN_NAME.equals(courseSchedule.getServiceProvider())) {
                 for (RoomResult.MemberResult item : roomResult.getMembers()) {
                     // 重置学生用户当前静音状态
                     if (RoleStudent.getValue() == item.getRole()) {

+ 11 - 0
mec-student/src/main/java/com/ym/mec/student/controller/open/OpenLiveBroadcastRoomController.java

@@ -38,6 +38,17 @@ public class OpenLiveBroadcastRoomController extends BaseController {
     @Resource
     private ImLiveBroadcastRoomService imLiveBroadcastRoomService;
 
+    @ApiOperation("直播间游客微信身份")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "code", value = "微信身份code", required = true, dataType = "String"),
+    })
+    @GetMapping("/visitorFingerprint")
+    public HttpResponseResult<String> visitorFingerprint(@RequestParam String code) {
+
+        // 游客访问直播间凭据信息
+        return succeed(imLiveBroadcastRoomService.visitorFingerprint(code));
+    }
+
     @ApiOperation("直播间游客访问凭据")
     @ApiImplicitParams({
             @ApiImplicitParam(name = "roomUid", value = "直播间编号", required = true, dataType = "String"),

+ 37 - 0
mec-student/src/main/java/com/ym/mec/student/controller/open/OpenSysConfigController.java

@@ -0,0 +1,37 @@
+package com.ym.mec.student.controller.open;
+
+import com.ym.mec.biz.dal.entity.SysConfig;
+import com.ym.mec.biz.service.SysConfigService;
+import com.ym.mec.common.controller.BaseController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/** 
+ * 系统配置控制层
+ */
+@RestController
+@Api(tags = "系统参数设置")
+@RequestMapping(value = "open/sysConfig")
+public class OpenSysConfigController extends BaseController {
+
+	@Autowired
+	private SysConfigService sysConfigService;
+
+	@ApiOperation(value = "查询参数")
+	@GetMapping(value = "queryByParamName")
+	public Object queryByParamName(String paramName) {
+		if(StringUtils.isBlank(paramName)){
+			return failed("参数不能为空");
+		}
+		return succeed(sysConfigService.findByParamName(paramName));
+	}
+}

+ 9 - 0
mec-web/src/main/java/com/ym/mec/web/controller/ImGroupController.java

@@ -161,6 +161,15 @@ public class ImGroupController extends BaseController {
 		return succeed(imGroupMemberService.quit(imGroupId,userIds));
 	}
 
+    @ApiOperation(" 移交群主")
+    @PostMapping(value = "/groupChangeOwner")
+    @AuditLogAnnotation(operateName = "移交群主",interfaceURL = "imGroup/groupChangeOwner")
+    @ApiImplicitParams({ @ApiImplicitParam(name = "imGroupId", value = "群编号", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "userId", value = "用户编号", required = true, dataType = "integer")})
+    public Object groupChangeOwner(String imGroupId, Integer userId) throws Exception {
+        return succeed(imGroupService.groupChangeOwner(userId,imGroupId));
+    }
+
 	@ApiOperation("解散群")
 	@PostMapping(value = "/dismissGroup")
 	@AuditLogAnnotation(operateName = "解散群",interfaceURL = "imGroup/dismissGroup")

+ 1 - 1
mec-web/src/main/java/com/ym/mec/web/controller/StudentManageController.java

@@ -457,7 +457,7 @@ public class StudentManageController extends BaseController {
     @ApiOperation(value = "学校端-学员详情")
     @PostMapping("/userDetail")
     public HttpResponseResult<StudentWrapper.StudentDetail> userDetail(@RequestBody StudentWrapper.StudentQuery queryInfo,@RequestHeader Integer coopId) {
-        if (queryInfo.getStudentId() == null || queryInfo.getMusicGroupId() == null) {
+        if (queryInfo.getStudentId() == null) {
             return failed("参数错误");
         }