浏览代码

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

# Conflicts:
#	mec-biz/src/main/java/com/ym/mec/biz/service/impl/MemberRankSettingServiceImpl.java
zouxuan 3 年之前
父节点
当前提交
5e583bb94c
共有 39 个文件被更改,包括 964 次插入774 次删除
  1. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImLiveBroadcastRoomDao.java
  2. 31 31
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupDao.java
  3. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TempLiveTeacherCardDao.java
  4. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseScheduleEndDto.java
  5. 0 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysCoupon.java
  6. 7 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/SysUserRoleEnum.java
  7. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/ImLiveBroadcastRoomService.java
  8. 588 588
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  9. 12 12
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java
  10. 124 51
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java
  11. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveRoomReservationServiceImpl.java
  12. 39 23
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MemberRankSettingServiceImpl.java
  13. 4 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  14. 0 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysCouponCodeServiceImpl.java
  15. 3 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TempBuyFreeLiveTheoryCourseServiceImpl.java
  16. 3 15
      mec-biz/src/main/resources/config/mybatis/ImGroupNoticeMapper.xml
  17. 0 1
      mec-biz/src/main/resources/config/mybatis/ImLiveBroadcastRoomMapper.xml
  18. 1 1
      mec-biz/src/main/resources/config/mybatis/ImLiveRoomBlackMapper.xml
  19. 3 0
      mec-biz/src/main/resources/config/mybatis/ImLiveRoomReservationMapper.xml
  20. 5 5
      mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml
  21. 3 2
      mec-biz/src/main/resources/config/mybatis/SysCouponIssueRecordMapper.xml
  22. 1 1
      mec-biz/src/main/resources/config/mybatis/SysCouponMapper.xml
  23. 20 0
      mec-biz/src/main/resources/config/mybatis/TempLiveTeacherCardMapper.xml
  24. 10 0
      mec-client-api/src/main/java/com/ym/mec/im/ImFeignService.java
  25. 6 0
      mec-client-api/src/main/java/com/ym/mec/im/fallback/ImFeignServiceFallback.java
  26. 1 1
      mec-im/src/main/java/com/ym/config/ResourceServerConfig.java
  27. 5 0
      mec-im/src/main/java/com/ym/controller/LiveRoomController.java
  28. 17 0
      mec-im/src/main/java/com/ym/mec/im/IMHelper.java
  29. 2 0
      mec-im/src/main/java/com/ym/pojo/IMApiResultInfo.java
  30. 15 0
      mec-im/src/main/java/com/ym/pojo/IMUserOnlineInfo.java
  31. 30 9
      mec-im/src/main/java/com/ym/service/Impl/LiveRoomServiceImpl.java
  32. 2 0
      mec-im/src/main/java/com/ym/service/LiveRoomService.java
  33. 1 0
      mec-student/src/main/java/com/ym/mec/student/controller/StudentOrderController.java
  34. 14 6
      mec-student/src/main/java/com/ym/mec/student/controller/TempLiveActivityController.java
  35. 1 1
      mec-util/src/main/java/com/ym/mec/util/file/FileUtil.java
  36. 3 6
      mec-web/src/main/java/com/ym/mec/web/controller/ImLiveBroadcastRoomController.java
  37. 1 5
      mec-web/src/main/java/com/ym/mec/web/controller/SysMusicScoreController.java
  38. 1 0
      mec-web/src/main/java/com/ym/mec/web/controller/education/ImGroupNoticeController.java
  39. 1 1
      mec-web/src/main/resources/columnMapper.ini

+ 2 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImLiveBroadcastRoomDao.java

@@ -7,9 +7,9 @@ import com.ym.mec.biz.dal.dto.RoomReservationUserSearch;
 import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoom;
 import com.ym.mec.biz.dal.vo.BaseRoomUserVo;
 import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomVo;
-import com.ym.mec.biz.dal.vo.LiveRoomGoodsOrderVo;
 import com.ym.mec.biz.dal.vo.RoomReservationUserVo;
 import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.biz.dal.vo.LiveRoomGoodsOrderVo;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -39,7 +39,7 @@ public interface ImLiveBroadcastRoomDao extends BaseMapper<ImLiveBroadcastRoom>
      * @return
      */
     IPage<RoomReservationUserVo> queryRoomUser(@Param("page") IPage<RoomReservationUserVo> page,
-                                               @Param("query") RoomReservationUserSearch query);
+                                                  @Param("query") RoomReservationUserSearch query);
 
     String querySchoolIds(@Param("organIds") String organIds);
 

+ 31 - 31
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupDao.java

@@ -23,7 +23,7 @@ import java.util.Set;
 public interface MusicGroupDao extends BaseDAO<String, MusicGroup> {
 
     MusicGroup getLocked(String id);
-    
+
     /**
      * 查询乐团基本信息
      * @param id
@@ -451,16 +451,16 @@ public interface MusicGroupDao extends BaseDAO<String, MusicGroup> {
      * @return
      */
     List<MusicMemberDto> queryMusicMemberList(Map<String, Object> params);
-    
-	int updateIsShowRecordOfStudent(@Param("musicGroupId") String musicGroupId, @Param("isShowRecordOfStudent") Boolean isShowRecordOfStudent);
-
-	/**
-	 * @describe 查询乐团相关学员数量
-	 * @author Joburgess
-	 * @date 2021/8/12 0012
-	 * @param params:
-	 * @return java.util.List<java.lang.String>
-	 */
+
+    int updateIsShowRecordOfStudent(@Param("musicGroupId") String musicGroupId, @Param("isShowRecordOfStudent") Boolean isShowRecordOfStudent);
+
+    /**
+     * @describe 查询乐团相关学员数量
+     * @author Joburgess
+     * @date 2021/8/12 0012
+     * @param params:
+     * @return java.util.List<java.lang.String>
+     */
     List<TeacherMusicStudentOverViewDto> queryTeacherMusicStudentOverView(@Param("musicGroupIds") List<String> musicGroupIds);
 
     /**
@@ -471,40 +471,40 @@ public interface MusicGroupDao extends BaseDAO<String, MusicGroup> {
     List<Map<Integer, String>> queryNormalGroupName(@Param("studentIds") List<Integer> studentIds);
 
     /**
-    * @description: 乐团剩余时长未排课
+     * @description: 乐团剩余时长未排课
      * @param organIds
      * @param tenantId
-    * @return java.util.List<java.lang.String>
-    * @author zx
-    * @date 2022/3/3 15:15 
-    */
+     * @return java.util.List<java.lang.String>
+     * @author zx
+     * @date 2022/3/3 15:15
+     */
     List<String> queryHasSubCourseTimes(@Param("organIds") String organIds, @Param("tenantId") Integer tenantId);
 
     /**
-    * @description: 获取课程时间消耗异常的学员数
+     * @description: 获取课程时间消耗异常的学员数
      * @param params
-    * @return int
-    * @author zx
-    * @date 2022/3/4 11:22
-    */
+     * @return int
+     * @author zx
+     * @date 2022/3/4 11:22
+     */
     Integer countHasFreeCourseTimes(Map<String, Object> params);
 
     /**
-    * @description: 获取课程时间消耗异常的学员
+     * @description: 获取课程时间消耗异常的学员
      * @param params
-    * @return java.util.List<com.ym.mec.biz.dal.dto.HasFreeCourseTimesDto>
-    * @author zx
-    * @date 2022/3/4 11:40
-    */
+     * @return java.util.List<com.ym.mec.biz.dal.dto.HasFreeCourseTimesDto>
+     * @author zx
+     * @date 2022/3/4 11:40
+     */
     List<HasFreeCourseTimesDto> queryHasFreeCourseTimes(Map<String, Object> params);
 
     /**
-    * @description: 获取首页退学学员数量
+     * @description: 获取首页退学学员数量
      * @param queryInfo
-    * @return java.lang.Integer
-    * @author zx
-    * @date 2022/3/17 16:20
-    */
+     * @return java.lang.Integer
+     * @author zx
+     * @date 2022/3/17 16:20
+     */
     Integer countQuitNum(@Param("queryInfo") IndexDataQueryInfo queryInfo);
 
     //乐团统计数据导出

+ 5 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TempLiveTeacherCardDao.java

@@ -17,4 +17,9 @@ public interface TempLiveTeacherCardDao extends BaseDAO<Integer, TempLiveTeacher
 
     List<Subject> querySubjectOption();
 
+    //0 没有购买商品 1 购买商品后没有加入群聊 2 已经加入群聊
+    Integer getJoinStstus(@Param("userId") Integer userId, @Param("goodsId") Integer goodsId);
+
+    //查询学生加入的群聊所在的声部
+    String getJoinSubject(@Param("userId") Integer userId, @Param("goodsId") Integer goodsId);
 }

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseScheduleEndDto.java

@@ -45,7 +45,7 @@ public class CourseScheduleEndDto extends CourseSchedule {
     private String settlementTime;
 
     private PracticeGroup practiceGroup;
-    
+
     private String isComplaints;
 
     private boolean beMerged;

+ 0 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysCoupon.java

@@ -3,9 +3,7 @@ package com.ym.mec.biz.dal.entity;
 import com.ym.mec.biz.dal.enums.CouponTypeEnum;
 import com.ym.mec.biz.dal.enums.EffectiveTypeEnum;
 import com.ym.mec.common.entity.BaseEntity;
-
 import io.swagger.annotations.ApiModelProperty;
-
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
 import javax.validation.constraints.Max;
@@ -101,7 +99,6 @@ public class SysCoupon extends BaseEntity implements Serializable{
 		this.useCondition = useCondition;
 	}
 
-
 	public Integer getId() {
 		return id;
 	}

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

@@ -4,7 +4,13 @@ import com.ym.mec.common.enums.BaseEnum;
 
 //分部经理,乐团主管,维修技师
 public enum SysUserRoleEnum implements BaseEnum<String,SysUserRoleEnum> {
-    ORGAN_MANAGER,EDUCATION,REPAIR,JOIN_TEACHER,HRBP;
+    ORGAN_MANAGER,EDUCATION,REPAIR,JOIN_TEACHER,HRBP,INSTRUCTOR,
+    SUPERVISE,LECTURER,FINANCE_MANAGER,TEST_ENGINEER,BAND_GUIDE,PRODUCT_MANAGER,
+    FRONT_DEVELOPMENT,DESIGNER,ENGINEER,ORGAN_FINANCE,SOFTWARE_TEST,NET_PROMOTION,
+    HR_DIRECTOR,ACCOUNT_SUPERVISOR, CHAIRMAN_ASSISTANT,
+    MALL_OPERATION,TEACH_SUPERVISOR,OFFICE_ADMIN,DEPUTY_DIRECTOR,
+    PIANO_TEACHER,CHRISTIAN, VICE_PRESIDENT,TEACH_RESEARCHERS, TEACH_DIRECTOR,WAREHOUS_SUPERVIOSR,
+    AFTER_SALES,DEVELOP_DIRECTOR, EXECUTIVE,OPERATE_COMMISSIONER, FUND_SUPERVISOR,MANAGER, CEO,CHAIRMAN,ORDER_GOOD;
 
     @Override
     public String getCode() {

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

@@ -7,8 +7,8 @@ import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoom;
 import com.ym.mec.biz.dal.page.LiveRoomGoodsOrderQueryInfo;
 import com.ym.mec.biz.dal.vo.BaseRoomUserVo;
 import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomVo;
-import com.ym.mec.biz.dal.vo.LiveRoomGoodsOrderVo;
 import com.ym.mec.biz.dal.vo.RoomReservationUserVo;
+import com.ym.mec.biz.dal.vo.LiveRoomGoodsOrderVo;
 import com.ym.mec.common.entity.ImUserState;
 import com.ym.mec.common.page.PageInfo;
 

文件差异内容过多而无法显示
+ 588 - 588
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java


+ 12 - 12
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java

@@ -84,8 +84,8 @@ public class ExportServiceImpl implements ExportService {
     private CourseScheduleService courseScheduleService;
     @Autowired
     private StudentService studentService;
-	@Autowired
-	private TenantConfigService tenantConfigService;
+    @Autowired
+    private TenantConfigService tenantConfigService;
     @Autowired
     private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
     @Autowired
@@ -1615,7 +1615,7 @@ public class ExportServiceImpl implements ExportService {
             List<CooperationOrgan> cooperationOrgans = cooperationOrganDao.getCooperationOrganByIds(cooperationOrganIds);
             cooperationOrganMap = cooperationOrgans.stream().collect(Collectors.toMap(CooperationOrgan::getId, CooperationOrgan::getName));
         }
-        
+
         //获取机构费率
         Integer tenantId = (Integer) params.get("tenantId");
         TenantConfig tenantConfig = tenantConfigService.queryByTenantId(tenantId);
@@ -2168,8 +2168,8 @@ public class ExportServiceImpl implements ExportService {
             } else if (row.getGroupType().equals(GroupType.SPORADIC)) {
                 //考级报名
                 if (row.getType().equals(OrderTypeEnum.DEGREE_REGISTRATION)) {
-                	
-                	if(StringUtils.isNotBlank(row.getMemo())){
+
+                    if(StringUtils.isNotBlank(row.getMemo())){
                         String[] feeTypes = row.getMemo().split(";");
                         List<String> feeTypeList = Arrays.asList(feeTypes);
                         for (String feeTypeStr : feeTypeList) {
@@ -2189,7 +2189,7 @@ public class ExportServiceImpl implements ExportService {
                                 row.setTheoryCourseFee(typeFee);
                             }
                         }
-                	}
+                    }
                     row.setDegreeFee(row.getActualAmount().subtract(row.getVipCourseFee()).subtract(row.getPracticeCourseFee()).subtract(row.getTheoryCourseFee()));
                 } else {
                     if (row.getChargeType() != null && SporadicChargeTypeEnum.LEVEL.getCode().equals(row.getChargeType())) {
@@ -2322,7 +2322,7 @@ public class ExportServiceImpl implements ExportService {
             List<CooperationOrgan> cooperationOrgans = cooperationOrganDao.getCooperationOrganByIds(cooperationOrganIds);
             cooperationOrganMap = cooperationOrgans.stream().collect(Collectors.toMap(CooperationOrgan::getId, CooperationOrgan::getName));
         }
-        
+
         //获取机构费率
         Integer tenantId = (Integer) params.get("tenantId");
         TenantConfig tenantConfig = tenantConfigService.queryByTenantId(tenantId);
@@ -2347,10 +2347,10 @@ public class ExportServiceImpl implements ExportService {
         if(musicGroupIds != null && musicGroupIds.size() > 0){
             musicGroupNameMap = MapUtil.convertIntegerMap(musicGroupDao.queryMusicGroupNameMap(musicGroupIds));
         }
-        
+
         Map<String,BigDecimal> serviceChargeMap = new HashMap<String, BigDecimal>();
         Map<String,Integer> orderCountMap = new HashMap<String, Integer>();
-        
+
         for (StudentPaymentOrderExportDto row : studentPaymentOrderExportDtos) {
             if (row.getActualAmount() == null) {
                 row.setActualAmount(BigDecimal.ZERO);
@@ -2369,7 +2369,7 @@ public class ExportServiceImpl implements ExportService {
             BigDecimal totalFee = BigDecimal.ZERO;
             if (row.getPaymentChannel() != null && row.getPaymentChannel().equals("ADAPAY")) {
                 FeeFlagNumDto countFeeFlagNum = studentPaymentRouteOrderDao.getCountFeeFlagNum(row.getOrderNo());
-                
+
                 Integer times = orderCountMap.get(row.getOrderNo());
 				if (times == null) {
 					times = 1;
@@ -2377,9 +2377,9 @@ public class ExportServiceImpl implements ExportService {
 					++times;
 				}
             	orderCountMap.put(row.getOrderNo(), times);
-            	
+
             	currentFee = row.getServiceFee();
-                
+
             	//兼容2022年之前的数据
 				if (currentFee == null || (currentFee.floatValue() == 0 && row.getCreateTime().before(DateUtil.stringToDate("2022-01-01 00:00:00")))) {
 					transferFee = serviceChargeMap.get(row.getOrderNo());

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

@@ -92,24 +92,28 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     public static final String ROOM_UID = "${roomUid}";
 
     //直播间累计用户信息-指只要进入到该房间的用户都要记录
-    public static final String LIVE_ROOM_TOTAL_USER_LIST = "IM:LIVE_ROOM_TOTAL_USER_LIST:" + ROOM_UID;
+    public static final String LIVE_ROOM_TOTAL_USER_LIST = String.join(":", "IM:LIVE_ROOM_TOTAL_USER_LIST", ROOM_UID);
     //直播间在线用户信息
-    public static final String LIVE_ROOM_ONLINE_USER_LIST = "IM:LIVE_ROOM_ONLINE_USER_LIST:" + ROOM_UID;
-    //主讲人信息
-    public static final String LIVE_SPEAKER_INFO = "IM:LIVE_SPEAKER_INFO:" + USER_ID;
-    //用户对应的直播间Uid
-    public static final String LIVE_USER_ROOM = "IM:LIVE_ROOM_USER:" + USER_ID;
-    //记录人员最后变更的状态消息时间
-    public static final String LIVE_USER_STATE_TIME = "IM:LIVE_USER_STATE_TIME:" + USER_ID;
+    public static final String LIVE_ROOM_ONLINE_USER_LIST = String.join(":", "IM:LIVE_ROOM_ONLINE_USER_LIST", ROOM_UID);
+    //当前房间主讲人心跳
+    public static final String LIVE_ROOM_SPEAKER_HEART_BEAT = String.join(":", "IM:LIVE_ROOM_SPEAKER_HEART_BEAT", ROOM_UID);
     //房间点赞数
-    public static final String LIVE_ROOM_LIKE = "IM:LIVE_ROOM_LIKE:" + ROOM_UID;
+    public static final String LIVE_ROOM_LIKE = String.join(":", "IM:LIVE_ROOM_LIKE", ROOM_UID);
     //计算人员观看时长锁
-    public static final String LIVE_LOOK_LOCK = "IM:LIVE_LOOK_LOCK:" + ROOM_UID;
+    public static final String LIVE_LOOK_LOCK = String.join(":", "IM:LIVE_LOOK_LOCK", ROOM_UID);
+    //用户对应的直播间Uid
+    public static final String LIVE_USER_ROOM = String.join(":", "IM:LIVE_ROOM_USER", USER_ID);
+    //记录人员最后变更的状态消息时间
+    public static final String LIVE_USER_STATE_TIME = String.join(":", "IM:LIVE_USER_STATE_TIME", USER_ID);
+    //主讲人信息
+    public static final String LIVE_SPEAKER_INFO = String.join(":", "IM:LIVE_SPEAKER_INFO", ROOM_UID, USER_ID);
+    //主讲人最近一次加入房间的clientIp
+    public static final String LIVE_SPEAKER_LAST_CLIENT_IP = String.join(":", "IM:LIVE_SPEAKER_LAST_CLIENT_IP", ROOM_UID, USER_ID);
     //直播提前开始时间
     public static final int PRE_LIVE_TIME_MINUTE = 30;
 
     /**
-     * 进入直播间检查数据
+     * 进入直播间检查数据-现在只有学生端用
      *
      * @param roomUid 房间uid
      * @param userId  用户id
@@ -123,14 +127,23 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         } else {
             sysUser = getSysUser(userId);
         }
+        osType = Optional.ofNullable(osType).orElse(1);
         return queryRoomAndCheck(roomUid, sysUser, osType);
     }
 
     public ImLiveBroadcastRoomVo queryRoomAndCheck(String roomUid, SysUser sysUser, Integer osType) {
+        Optional<ImLiveBroadcastRoomVo> optional;
+        //如果是学生端,则需要检查是否有权限进入
+        if (osType == 1) {
+            Map<String, Object> param = new HashMap<>();
+            param.put("roomUid", roomUid);
+            optional = Optional.of(param).map(this::getImLiveBroadcastRoomVo);
+            optional.orElseThrow(() -> new BizException("您无法观看该直播"));
+        } else {
+            optional = Optional.ofNullable(roomUid).map(this::queryRoomInfo);
+            optional.orElseThrow(() -> new BizException("直播间不存在"));
+        }
         //直播间信息校验
-        Optional<ImLiveBroadcastRoomVo> optional = Optional.ofNullable(roomUid)
-                .map(this::queryRoomInfo);
-        optional.orElseThrow(() -> new BizException("直播间不存在"));
         optional.filter(r -> r.getTenantId().equals(sysUser.getTenantId()))
                 .orElseThrow(() -> new BizException("您不是该直播机构人员,不可观看!"));
         optional.filter(r -> r.getRoomState() != 1).orElseThrow(() -> new BizException("直播间不存在"));
@@ -198,14 +211,17 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         param.put("tenantId", TenantContextHolder.getTenantId());
         //查询该人员分部  及 分部下包含的学校(合作单位)
         SysUser sysUser = getSysUser();
+        //分部
+        String organIds;
         //如果是超管就查询当前机构所有的直播间
         if (sysUser.getTenantId() == -1 || sysUser.getIsSuperAdmin()) {
             param.put("allRoom", 1);
         } else {
             Employee employee = employeeService.get(sysUser.getId());
             if (Objects.nonNull(employee) && Objects.nonNull(employee.getOrganIdList())) {
-                param.put("organIds", employee.getOrganIdList());
-                String schoolIds = baseMapper.querySchoolIds(employee.getOrganIdList());
+                organIds = employee.getOrganIdList();
+                param.put("organIds", organIds);
+                String schoolIds = baseMapper.querySchoolIds(organIds);
                 if (StringUtils.isNotBlank(schoolIds)) {
                     param.put("schoolIds", schoolIds);
                 }
@@ -389,6 +405,10 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         param.put("tenantId", TenantContextHolder.getTenantId());
         param.put("popularize", 1);
         param.put("liveState", 1);
+        return getImLiveBroadcastRoomVo(param);
+    }
+
+    private ImLiveBroadcastRoomVo getImLiveBroadcastRoomVo(Map<String, Object> param) {
         PageInfo<ImLiveBroadcastRoomVo> pageInfo = imLiveRoomReservationService.queryPageStudent(param);
         List<ImLiveBroadcastRoomVo> list = pageInfo.getRows();
         if (CollectionUtils.isNotEmpty(list)) {
@@ -435,9 +455,27 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             return;
         }
         //获取直播间主讲人信息
-        RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, room.getSpeakerId().toString()));
+        RBucket<RoomSpeakerInfo> speakerCache = getRoomSpeakerInfoCache(room.getRoomUid(), room.getSpeakerId().toString());
         if (speakerCache.isExists()) {
             RoomSpeakerInfo speakerInfo = speakerCache.get();
+            //查询用户是否在线
+            if (imFeignService.checkOnline(speakerInfo.getSpeakerId().toString())) {
+                log.info("roomDestroy destroyExpiredLiveRoom  is online >>>> roomId:{} speakerId:{}", room.getId(), speakerInfo.getSpeakerId());
+                return;
+            }
+            //校验房间心跳是否过期没续租
+            RBucket<Date> lastRoomHeartbeatCache = redissonClient.getBucket(LIVE_ROOM_SPEAKER_HEART_BEAT.replace(ROOM_UID, room.getRoomUid()));
+            if (lastRoomHeartbeatCache.isExists()) {
+                //获取最后一次房间心跳时间
+                Date lastDate = lastRoomHeartbeatCache.get();
+                //房间心跳过期时间 = 将房间心跳时间+过期分钟
+                Date lastRoomDateExpired = DateUtil.addMinutes(lastDate, expiredMinute);
+                //当前时间 小于 房间心跳过期时间 则不销毁
+                if (now.getTime() <= lastRoomDateExpired.getTime()) {
+                    log.info("roomDestroy destroyExpiredLiveRoom  last room heartbeat  >>>> roomId:{} speakerId:{}", room.getId(), speakerInfo.getSpeakerId());
+                    return;
+                }
+            }
             //1.主播没有进入房间,则直接销毁房间
             if (Objects.isNull(speakerInfo.getJoinRoomTime())) {
                 log.info("roomDestroy not joinRoom >>>> cache : {}", JSONObject.toJSONString(test(room.getRoomUid())));
@@ -525,7 +563,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             imFeignService.publishRoomMsg(message);
             log.info("roomDestroy>>>> FORCED_OFFLINE {}", JSONObject.toJSONString(message));
             //销毁直播间
-            imFeignService.destroyLiveRoom(roomUid);
+//            imFeignService.destroyLiveRoom(roomUid);
             log.info("roomDestroy>>>> destroyLiveRoom {}", JSONObject.toJSONString(message));
         } catch (Exception e) {
             log.error("roomDestroy>>>> errorMsg{}", e.getMessage(), e.getCause());
@@ -565,7 +603,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         }
         int speakerLiveTime = 0;
         //获取直播间主讲人信息 写入im_live_broadcast_room_data
-        RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, speakerId.toString()));
+        RBucket<RoomSpeakerInfo> speakerCache = getRoomSpeakerInfoCache(roomUid, speakerId.toString());
         if (speakerCache.isExists()) {
             ImLiveBroadcastRoomData liveData = new ImLiveBroadcastRoomData();
             RoomSpeakerInfo speakerInfo = speakerCache.get();
@@ -613,6 +651,8 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     @Override
     public void syncLike(String roomUid, Integer likeNum) {
         redissonClient.getBucket(LIVE_ROOM_LIKE.replace(ROOM_UID, roomUid)).set(likeNum);
+        //增加房间心跳
+        redissonClient.getBucket(LIVE_ROOM_SPEAKER_HEART_BEAT.replace(ROOM_UID, roomUid)).set(new Date());
     }
 
     /**
@@ -645,20 +685,20 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             }
             //将最新的时间写入缓存
             userStateTimeCache.set(userStateTime, 5L, TimeUnit.MINUTES);
+            //获取当前用户所在房间的uid
+            RBucket<String> userRoom = redissonClient.getBucket(LIVE_USER_ROOM.replace(USER_ID, userid));
+            if (!userRoom.isExists()) {
+                return;
+            }
+            String roomUid = userRoom.get();
             //查询userId是不是主讲人 ,如果是主讲人则返回
-            if (isSpeaker(user, now, userid)) {
+            if (isSpeaker(user, now, userid, roomUid)) {
                 return;
             }
             //这里开始只处理观看者的数据,观看者只接受退出消息 status=0 是进入房间
             if (user.getStatus().equals("0")) {
                 return;
             }
-            //获取当前用户所在房间的uid
-            RBucket<String> userRoom = redissonClient.getBucket(LIVE_USER_ROOM.replace(USER_ID, userid));
-            if (!userRoom.isExists()) {
-                return;
-            }
-            String roomUid = userRoom.get();
             Integer userId = Integer.valueOf(userid);
 
             //从房间累计用户信息中查询该用户的信息
@@ -738,19 +778,34 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
      *
      * @return true 是主讲人 false 不是主讲人
      */
-    private boolean isSpeaker(ImUserState user, Date now, String userid) {
-        RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, userid));
+    private boolean isSpeaker(ImUserState user, Date now, String userid, String roomUid) {
+        RBucket<RoomSpeakerInfo> speakerCache = getRoomSpeakerInfoCache(roomUid, userid);
         if (!speakerCache.isExists()) {
             return false;
         }
         RoomSpeakerInfo speakerInfo = speakerCache.get();
+        //最后一次进入房间的clientIp
+        RBucket<String> lastClientIp = redissonClient.getBucket(LIVE_SPEAKER_LAST_CLIENT_IP.replace(ROOM_UID, roomUid).replace(USER_ID, userid));
         //主讲人进入房间
         if (user.getStatus().equals("0")) {
             speakerInfo.setJoinRoomTime(now);
             log.info("opsRoom>>>> join speakerCache {}", JSONObject.toJSONString(speakerInfo));
             speakerCache.set(speakerInfo);
+            //将本次进入房间的clientIp添加到主讲人最后一次clientIp缓存中
+            if (StringUtils.isNotBlank(user.getClientIp())) {
+                lastClientIp.set(user.getClientIp());
+            }
             return true;
         }
+        //校验本次退出直播间的clientIp 是不是上次进入房间的clientIp
+        if (StringUtils.isNotBlank(user.getClientIp())) {
+            if (lastClientIp.isExists()) {
+                //如果是上次进入房间的clientIp和本次退出房间的clientIp不相同,则直接忽略
+                if (!user.getClientIp().equals(lastClientIp.get())) {
+                    return true;
+                }
+            }
+        }
         //主讲人退出房间关闭录像
         closeLive(speakerInfo);
         speakerInfo.setExitRoomTime(now);
@@ -773,15 +828,17 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         }
         Date now = new Date();
         //获取直播间信息
-        RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, userId.toString()));
+        RBucket<RoomSpeakerInfo> speakerCache = getRoomSpeakerInfoCache(roomUid, userId.toString());
         if (!speakerCache.isExists()) {
             //没有主讲人信息则生成一个
             createSpeakerInfo(this.getById(roomVo.getId()), sysUser);
-            speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, userId.toString()));
+            speakerCache = getRoomSpeakerInfoCache(roomUid, userId.toString());
         }
         RoomSpeakerInfo speakerInfo = speakerCache.get();
         speakerInfo.setJoinRoomTime(now);
         speakerCache.set(speakerInfo);
+        //记录用户当前房间uid
+        redissonClient.getBucket(LIVE_USER_ROOM.replace(USER_ID, userId.toString())).set(roomUid, 12L, TimeUnit.HOURS);
         return roomVo;
     }
 
@@ -815,7 +872,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             userInfo.setTotalViewTime(0);
         }
         //查询主讲人信息
-        RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, imLiveBroadcastRoomVo.getSpeakerId().toString()));
+        RBucket<RoomSpeakerInfo> speakerCache = getRoomSpeakerInfoCache(roomUid, imLiveBroadcastRoomVo.getSpeakerId().toString());
         if (speakerCache.isExists()) {
             //如果用户进来时主讲人已经开启直播则修改学生观看时间
             Integer state = speakerCache.get().getState();
@@ -841,7 +898,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
      */
     public void startLive(String roomUid, Integer userId) {
         //查询房间信息
-        RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, userId.toString()));
+        RBucket<RoomSpeakerInfo> speakerCache = getRoomSpeakerInfoCache(roomUid, userId.toString());
         if (!speakerCache.isExists()) {
             return;
         }
@@ -877,7 +934,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
      */
     public void closeLive(String roomUid, Integer userId) {
         //查询房间主播信息
-        RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, userId.toString()));
+        RBucket<RoomSpeakerInfo> speakerCache = getRoomSpeakerInfoCache(roomUid, userId.toString());
         if (!speakerCache.isExists()) {
             return;
         }
@@ -948,7 +1005,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
                 if (onlineUserInfoExists && onlineUserInfo.containsKey(id)) {
                     if (type.equals(1)) {
                         //开启直播后对当前在房间的用户写入观看时间
-                        userInfo.setDynamicLookTime(new Date());
+                        userInfo.setDynamicLookTime(now);
                     } else if (type.equals(2)) {
                         userInfo.setTotalViewTime(getLookMinutes(userInfo.getDynamicLookTime(), now, userInfo.getTotalViewTime()));
                         userInfo.setDynamicLookTime(null);
@@ -1036,7 +1093,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             speakerInfo.setWhetherVideo(1);
         }
         //写入主讲人信息
-        redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, room.getSpeakerId().toString())).set(speakerInfo);
+        getRoomSpeakerInfoCache(room.getRoomUid(), room.getSpeakerId().toString()).set(speakerInfo);
 
         //生成0点赞
         redissonClient.getBucket(LIVE_ROOM_LIKE.replace(ROOM_UID, room.getRoomUid())).set(0);
@@ -1097,6 +1154,26 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     public Map<String, Object> test(String roomUid) {
         //test
         Map<String, Object> result = new HashMap<>();
+        //校验房间心跳是否过期没续租
+        RBucket<Date> lastRoomHeartbeatCache = redissonClient.getBucket(LIVE_ROOM_SPEAKER_HEART_BEAT.replace(ROOM_UID, roomUid));
+        if (lastRoomHeartbeatCache.isExists()) {
+            result.put("房间心跳", DateUtil.dateToString(lastRoomHeartbeatCache.get(), DateUtil.EXPANDED_DATE_TIME_FORMAT));
+        } else {
+            result.put("房间心跳", "房间心跳不存在");
+        }
+        String userId = "";
+        try {
+            String[] split = roomUid.split("-");
+            userId = split[1];
+        } catch (Exception ignored) {
+        }
+        //获取主讲人信息
+        RBucket<RoomSpeakerInfo> speakerCache = getRoomSpeakerInfoCache(roomUid, userId);
+        if (speakerCache.isExists()) {
+            result.put("主讲人信息", speakerCache.get());
+        } else {
+            result.put("主讲人信息", "主讲人信息不存在");
+        }
         //点赞数
         Object like = redissonClient.getBucket(LIVE_ROOM_LIKE.replace(ROOM_UID, roomUid)).get();
         if (Objects.isNull(like)) {
@@ -1113,29 +1190,15 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         if (CollectionUtils.isNotEmpty(totalUserInfo)) {
             if (CollectionUtils.isNotEmpty(inRoomUserInfo)) {
                 look = inRoomUserInfo.size();
-                result.put("正在观看的人员信息", inRoomUserInfo);
+//                result.put("正在观看的人员信息", inRoomUserInfo);
             } else {
                 result.put("正在观看的人员信息", "没有正在观看的人员数据");
             }
             totalLook = totalUserInfo.size();
-            result.put("总人员数据", totalUserInfo);
+//            result.put("总人员数据", totalUserInfo);
         } else {
             result.put("总人员数据", "没有人员数据");
         }
-        String userId = "";
-        try {
-            String[] split = roomUid.split("-");
-            userId = split[1];
-        } catch (Exception ignored) {
-        }
-
-        //获取主讲人信息
-        RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, userId));
-        if (speakerCache.isExists()) {
-            result.put("主讲人信息", speakerCache.get());
-        } else {
-            result.put("主讲人信息", "主讲人信息不存在");
-        }
         result.put("总观看人数", totalLook);
         result.put("实时观看数", look);
         return result;
@@ -1254,6 +1317,16 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         return redissonClient.getMap(LIVE_ROOM_TOTAL_USER_LIST.replace(ROOM_UID, roomUid));
     }
 
+    /**
+     * 获取房间主讲人消息
+     *
+     * @param roomUid 房间uid
+     * @param userId  用户id
+     */
+    private RBucket<RoomSpeakerInfo> getRoomSpeakerInfoCache(String roomUid, String userId) {
+        return redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, userId).replace(ROOM_UID, roomUid));
+    }
+
     private RoomUserInfoVo getUserInfo(Integer userId) {
         RoomUserInfoVo userInfo = new RoomUserInfoVo();
         userInfo.setUserId(userId);

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveRoomReservationServiceImpl.java

@@ -98,6 +98,7 @@ public class ImLiveRoomReservationServiceImpl extends ServiceImpl<ImLiveRoomRese
         if (Objects.nonNull(student) && Objects.nonNull(student.getCooperationOrganId())) {
             param.put("schoolId", student.getCooperationOrganId());
         }
+        //乐团
         String teamIds = baseMapper.queryMusicGroupIds(user.getId());
         if (StringUtils.isNotBlank(teamIds)) {
             param.put("teamIds", teamIds);

+ 39 - 23
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MemberRankSettingServiceImpl.java

@@ -243,7 +243,8 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
         String activeConfig = sysConfigDao.findConfigValue("cloud_teacher_active_config");
         List<Cloud2022ActivityDto> cloud2022ActivityDtos = JSONArray.parseArray(activeConfig, Cloud2022ActivityDto.class);
         List<Cloud2022ActivityDto> activityDtos = cloud2022ActivityDtos.stream().
-                filter(e -> Arrays.stream(e.getOrganId().split(",")).collect(Collectors.toList()).contains(sysUser.getOrganId().toString())).collect(Collectors.toList());
+                filter(e -> Arrays.stream(e.getOrganId().split(",")).collect(Collectors.toList()).
+                        contains(sysUser.getOrganId().toString())).collect(Collectors.toList());
         if(CollectionUtils.isEmpty(activityDtos)){
             throw new BizException("当前分部暂未开通活动");
         }
@@ -251,7 +252,7 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
         Integer activityId = null;
         //判断当前商品是否可以购买(库存、上架状态、是否购买过)
         //如果是云教练商品,那么只能购买一次、如果是免费直播课,那么每次上架只能买一次,总共只能买2次
-        if(memberPayParamDto.getLiveGoodsId() == 1){
+        if(memberPayParamDto.getLiveGoodsId() == 1 || memberPayParamDto.getLiveGoodsId() == 5){
             //判断用户是否已存在订单
             List<StudentPaymentOrder> memberIngOrders = studentPaymentOrderService.queryByCondition(GroupType.LIVE_BUY,null,student.getUserId(), DealStatusEnum.ING,OrderTypeEnum.LIVE_BUY);
             if (CollectionUtils.isNotEmpty(memberIngOrders)) {
@@ -262,8 +263,12 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
                 //还原库存
                 liveGoodsService.addGoodsStock(memberPayParamDto.getLiveGoodsId(),memberPayParamDto.getLiveId());
             }
+            if(memberPayParamDto.getLiveGoodsId() == 1){
+                activityId = Integer.parseInt(activityDtos.get(0).getActivityId());
+            }else {
+                activityId = Integer.parseInt(activityDtos.get(1).getActivityId());
+            }
             //是否还有购买资格
-            activityId = Integer.parseInt(activityDtos.get(0).getActivityId());
             VipGroupActivity vipGroupActivity = Optional.ofNullable(vipGroupActivityDao.get(activityId)).orElseThrow(()-> new BizException("活动不存在"));
             if(vipGroupActivity.getStudentMaxUsedTimes() != -1){
                 //获取活动购买次数
@@ -318,6 +323,8 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
         studentPaymentOrder.setActivityId(activityId.toString());
         studentPaymentOrder.setActivityBuyNum(1);
         studentPaymentOrder.setMusicGroupId(memberPayParamDto.getLiveId());
+        //保存商品编号
+        studentPaymentOrder.setClassGroupId(memberPayParamDto.getLiveGoodsId());
         Map<String, Object> result = getMap(memberPayParamDto.getAmount(), memberPayParamDto.getUseBalancePayment(),studentPaymentOrder);
         return BaseController.succeed(result);
     }
@@ -336,9 +343,12 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
             succeed.setMsg("当前分部暂未开通活动");
             return succeed;
         }
-        if(memberPayParamDto.getLiveGoodsId() == 1){
+        if(memberPayParamDto.getLiveGoodsId() == 1 || memberPayParamDto.getLiveGoodsId() == 5){
             //是否还有购买资格
             Integer activityId = Integer.parseInt(activityDtos.get(0).getActivityId());
+            if(memberPayParamDto.getLiveGoodsId() == 5){
+                activityId = Integer.parseInt(activityDtos.get(1).getActivityId());
+            }
             VipGroupActivity vipGroupActivity = Optional.ofNullable(vipGroupActivityDao.get(activityId)).orElseThrow(()-> new BizException("活动不存在"));
             if(vipGroupActivity.getStudentMaxUsedTimes() != -1){
                 //获取活动购买次数
@@ -646,20 +656,24 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
             activityUserMapper.setUserId(studentPaymentOrder.getUserId());
             activityUserMapper.setActivityId(activity.getId());
             activityUserMapper.setActualPrice(BigDecimal.ZERO);
-            activityUserMapper.setGivePracticeFlag(1);
             activityUserMapper.setReturnFee(false);
+            //如果是买的商品1那么赠送陪练课和训练营
+            if(Objects.equals(studentPaymentOrder.getClassGroupId(),1)){
+                //赠送陪练课
+                activityUserMapper.setGivePracticeFlag(1);
+                //赠送训练营
+                TempLittleArtistTrainingCampUserRelation tempLittleArtistTrainingCamp = new TempLittleArtistTrainingCampUserRelation();
+                tempLittleArtistTrainingCamp.setUserId(studentPaymentOrder.getUserId());
+                tempLittleArtistTrainingCamp.setState("NOT_APPLY");
+                tempLittleArtistTrainingCamp.setCreateTime(nowDate);
+                tempLittleArtistTrainingCampUserRelationDao.insert(tempLittleArtistTrainingCamp);
+            }
             activityUserMapperDao.insert(activityUserMapper);
-            //赠送训练营
-            TempLittleArtistTrainingCampUserRelation tempLittleArtistTrainingCamp = new TempLittleArtistTrainingCampUserRelation();
-            tempLittleArtistTrainingCamp.setUserId(studentPaymentOrder.getUserId());
-            tempLittleArtistTrainingCamp.setState("NOT_APPLY");
-            tempLittleArtistTrainingCamp.setCreateTime(nowDate);
-            tempLittleArtistTrainingCampUserRelationDao.insert(tempLittleArtistTrainingCamp);
             //生成订单详情
             StudentPaymentOrderDetail studentPaymentOrderDetail = new StudentPaymentOrderDetail();
             studentPaymentOrderDetail.setPaymentOrderId(studentPaymentOrder.getId());
             studentPaymentOrderDetail.setType(OrderDetailTypeEnum.CLOUD_TEACHER);
-            studentPaymentOrderDetail.setGoodsIdList("1");
+            studentPaymentOrderDetail.setGoodsIdList(studentPaymentOrder.getClassGroupId().toString());
             studentPaymentOrderDetail.setPrice(studentPaymentOrder.getExpectAmount());
             studentPaymentOrderDetail.setRemitFee(studentPaymentOrder.getCouponRemitFee());
             studentPaymentOrderDetail.setTenantId(studentPaymentOrder.getTenantId());
@@ -667,17 +681,19 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
             studentPaymentOrderDetail.setUpdateTime(nowDate);
             studentPaymentOrderDetailDao.insert(studentPaymentOrderDetail);
 
-            Map<Integer, String> phoneMaps = MapUtil.convertMybatisMap(teacherDao.queryPhoneByIds(userId.toString()));
-            String baseApiUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
-            StringBuffer pushUrl = new StringBuffer(baseApiUrl).append("/#/artistRegistration");
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.GOOD_HABITS_TRAINING_CAMP_EXPERIENCE_QUALIFICATION_SMS,phoneMaps,
-                    null,0,"",null, HttpUtil.getSortUrl(pushUrl.toString()));
-
-            StringBuffer notifyUrl = new StringBuffer("8?").append(baseApiUrl).append("/#/artistRegistration");
-            Map<Integer, String> userIdMaps = new HashMap<>(1);
-            userIdMaps.put(userId, userId.toString());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.GOOD_HABITS_TRAINING_CAMP_EXPERIENCE_QUALIFICATION_PUSH,userIdMaps,
-                    null,0,notifyUrl.toString(),"STUDENT");
+            if(Objects.equals(studentPaymentOrder.getClassGroupId(),1)) {
+                Map<Integer, String> phoneMaps = MapUtil.convertMybatisMap(teacherDao.queryPhoneByIds(userId.toString()));
+                String baseApiUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
+                StringBuffer pushUrl = new StringBuffer(baseApiUrl).append("/#/artistRegistration");
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.GOOD_HABITS_TRAINING_CAMP_EXPERIENCE_QUALIFICATION_SMS, phoneMaps,
+                        null, 0, "", null, HttpUtil.getSortUrl(pushUrl.toString()));
+
+                StringBuffer notifyUrl = new StringBuffer("8?").append(baseApiUrl).append("/#/artistRegistration");
+                Map<Integer, String> userIdMaps = new HashMap<>(1);
+                userIdMaps.put(userId, userId.toString());
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.GOOD_HABITS_TRAINING_CAMP_EXPERIENCE_QUALIFICATION_PUSH, userIdMaps,
+                        null, 0, notifyUrl.toString(), "STUDENT");
+            }
         }
         // 插入交易明细
         sysUserCashAccountDetailService.saveSysUserCashAccountDetail(studentPaymentOrder, "直播购买云教练");

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

@@ -209,10 +209,10 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Integer batchUpdateSubject(Integer userId, Integer subId, String musicGroupId) throws Exception {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("获取用户信息失败");
-        }
+//        SysUser sysUser = sysUserFeignService.queryUserInfo();
+//        if (sysUser == null) {
+//            throw new BizException("获取用户信息失败");
+//        }
         //获取当前学员的当前声部
         StudentRegistration studentRegistration = studentRegistrationDao.queryByUserIdAndMusicGroupId(userId, musicGroupId);
         if (studentRegistration == null) {

+ 0 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysCouponCodeServiceImpl.java

@@ -142,7 +142,6 @@ public class SysCouponCodeServiceImpl extends BaseServiceImpl<Long, SysCouponCod
         return sysCoupon;
     }
 
-
     private void checkUser(Integer userId, SysCoupon sysCoupon) {
         SysUser sysUser = sysUserFeignService.queryUserById(userId);
         if (StringUtils.isBlank(sysCoupon.getUseCondition())) {
@@ -159,7 +158,6 @@ public class SysCouponCodeServiceImpl extends BaseServiceImpl<Long, SysCouponCod
         }
     }
 
-
     private void opsCoupon(Integer userId, SysCouponCode sysCouponCode, Integer couponId, Integer exchangeNum, SysCoupon sysCoupon) {
         Integer tenantId = TenantContextHolder.getTenantId();
         Date now = new Date();

+ 3 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TempBuyFreeLiveTheoryCourseServiceImpl.java

@@ -106,7 +106,9 @@ public class TempBuyFreeLiveTheoryCourseServiceImpl extends BaseServiceImpl<Inte
             }
             TempBuyFreeLiveTheoryCourse course = tempBuyFreeLiveTheoryCourseDao.get(temp.getId());
             LevelEnum byName = LevelEnum.getByName(temp.getRecommendLevel());
-            course.setRecommendLevel(byName.getCode());
+            if(null != byName){
+                course.setRecommendLevel(byName.getCode());
+            }
             tempBuyFreeLiveTheoryCourseDao.update(course);
         }
         return null;

+ 3 - 15
mec-biz/src/main/resources/config/mybatis/ImGroupNoticeMapper.xml

@@ -37,12 +37,8 @@
 	
 	<!-- 向数据库增加一条记录 -->
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.ImGroupNotice" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
-		<!--
-		<selectKey resultClass="int" keyProperty="id" > 
-		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL 
-		</selectKey>
-		-->
-		INSERT INTO im_group_notice (id_,im_group_id_,title_,content_,is_top_,is_sent_to_new_member_,create_time_,update_time_,del_flag_,operator_id_,tenant_id_) VALUES(#{id},#{imGroupId},#{title},#{content},#{isTop},#{isSentToNewMember},#{createTime},#{updateTime},#{delFlag},#{operatorId},#{tenantId})
+		INSERT INTO im_group_notice (im_group_id_,title_,content_,is_top_,is_sent_to_new_member_,create_time_,update_time_,del_flag_,operator_id_,tenant_id_)
+		VALUES(#{imGroupId},#{title},#{content},#{isTop},#{isSentToNewMember},NOW(),NOW(),#{delFlag},#{operatorId},#{tenantId})
 	</insert>
 	
 	<!-- 根据主键查询一条记录 -->
@@ -60,24 +56,16 @@
 		<if test="isSentToNewMember != null">
 		is_sent_to_new_member_ = #{isSentToNewMember},
 		</if>
-		<if test="id != null">
-		id_ = #{id},
-		</if>
 		<if test="imGroupId != null">
 		im_group_id_ = #{imGroupId},
 		</if>
 		<if test="title != null">
 		title_ = #{title},
 		</if>
-		<if test="updateTime != null">
-		update_time_ = #{updateTime},
-		</if>
 		<if test="content != null">
 		content_ = #{content},
 		</if>
-		<if test="createTime != null">
-		create_time_ = #{createTime},
-		</if>
+		update_time_ = NOW()
 		</set> WHERE id_ = #{id} and tenant_id_ = #{tenantId}
 	</update>
 	

+ 0 - 1
mec-biz/src/main/resources/config/mybatis/ImLiveBroadcastRoomMapper.xml

@@ -197,7 +197,6 @@
     </select>
 
     <select id="queryRoomUser" resultType="com.ym.mec.biz.dal.vo.RoomReservationUserVo">
-
         select
         su.id_ as userId
         ,su.username_ as username

+ 1 - 1
mec-biz/src/main/resources/config/mybatis/ImLiveRoomBlackMapper.xml

@@ -25,7 +25,7 @@
     </insert>
 
     <select id="queryStudent" parameterType="object" resultType="com.ym.mec.auth.api.entity.SysUser">
-        select distinct id_        as id,
+        select id_        as id,
         username_  as username,
         real_name_ as realName,
         phone_     as phone

+ 3 - 0
mec-biz/src/main/resources/config/mybatis/ImLiveRoomReservationMapper.xml

@@ -89,6 +89,9 @@
             <if test="param.popularize != null">
                 and a.popularize_ = #{param.popularize}
             </if>
+            <if test="param.roomUid != null">
+                and a.room_uid_ = #{param.roomUid}
+            </if>
         </where>
     </select>
 

+ 5 - 5
mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml

@@ -50,7 +50,7 @@
         <result column="tenant_id_" property="tenantId"/>
         <result column="is_give_accessories_" property="isGiveAccessories"/>
     </resultMap>
-    
+
     <resultMap type="com.ym.mec.biz.dal.dto.MusicGroupBasicDto" id="MusicGroupBasicDto" extends="MusicGroup">
     	<result column="organ_name_" property="organName"/>
         <result column="school_name_" property="schoolName"/>
@@ -77,7 +77,7 @@
         WHERE id_ = #{id} for
         update
     </select>
-    
+
     <select id="queryBasicInfo" resultMap="MusicGroupBasicDto">
         SELECT mg.*,o.name_ organ_name_,s.name_ school_name_ ,co.name_ cooperation_organ_name_,ct.name_ charge_type_name_,
         u1.real_name_ edu_teacher_name_,u2.real_name_ teans_teacher_name_,u2.phone_ teans_teacher_phone_,
@@ -241,7 +241,7 @@
         </set>
         WHERE id_ = #{id}
     </update>
-    
+
     <update id="batchUpdateEdu">
         UPDATE music_group
         SET educational_teacher_id_ = #{educationUserId}
@@ -968,7 +968,7 @@
             </if>
         </where>
     </sql>
-    
+
     <update id="updateIsShowRecordOfStudent" parameterType="map">
     	update music_group set is_show_record_of_student_ = #{isShowRecordOfStudent},update_time_ = now() where id_ = #{musicGroupId}
     </update>
@@ -1156,7 +1156,7 @@
 
     <select id="findMusicByCourseIds" resultMap="MusicGroupBasicDto">
         select
-               t.id_,b.organ_id_ as cooperation_organ_id_,b.name_ as cooperation_organ_name_
+        t.id_,b.organ_id_ as cooperation_organ_id_,b.name_ as cooperation_organ_name_
         from course_schedule t
         left join music_group a on t.music_group_id_ = a.id_
         left join cooperation_organ b on a.cooperation_organ_id_ = b.id_

+ 3 - 2
mec-biz/src/main/resources/config/mybatis/SysCouponIssueRecordMapper.xml

@@ -164,8 +164,8 @@
              WHERE usage_status_  <![CDATA[ <> ]]> 2 AND user_id_ = #{userId}
              GROUP BY coupon_id_) AS b
             ON a.id_ = b.coupon_id_
-        join
-        (select organ_id_ from sys_user where id_ = #{userId}) c
+            join
+                (select organ_id_ from sys_user where id_ = #{userId}) c
         WHERE issuance_type_ = 0
           AND status_ = 1
           AND tenant_id_ = #{tenantId}
@@ -178,6 +178,7 @@
         and (find_in_set(c.organ_id_,JSON_UNQUOTE(json_extract(a.use_condition_,'$.organId')))
         or JSON_UNQUOTE(json_extract(a.use_condition_,'$.organId')) is null
         or JSON_UNQUOTE(json_extract(a.use_condition_,'$.organId')) = "")
+
     </select>
 
 </mapper>

+ 1 - 1
mec-biz/src/main/resources/config/mybatis/SysCouponMapper.xml

@@ -30,7 +30,7 @@
 		<result column="create_time_" property="createTime" />
 		<result column="update_time_" property="updateTime" />
         <result column="tenant_id_" property="tenantId"/>
-		<result column="use_condition_" property="useCondition"/>
+        <result column="use_condition_" property="useCondition"/>
 	</resultMap>
 
 	<!-- 根据主键查询一条记录 -->

+ 20 - 0
mec-biz/src/main/resources/config/mybatis/TempLiveTeacherCardMapper.xml

@@ -149,4 +149,24 @@
         )
         order by t.id_
     </select>
+
+    <select id="getJoinStstus" resultType="java.lang.Integer">
+        select case when
+            (
+                select count(1) from temp_buy_free_live_theory_course
+                where user_id_ = #{userId} and live_goods_id_ = #{goodsId}
+            ) = 0 then 0
+            when (
+                select count(1) from temp_live_teacher_card a
+                left join im_group_member b on a.im_group_id_ = b.im_group_id_
+                where a.live_goods_id_ = #{goodsId} and b.user_id_ = #{userId}
+            ) = 0 then 1 else 2 end
+        from dual
+    </select>
+    <select id="getJoinSubject" resultType="java.lang.String">
+        select subject_id_ from temp_live_teacher_card a
+        left join im_group_member b on a.im_group_id_ = b.im_group_id_
+        where a.live_goods_id_ = #{goodsId} and b.user_id_ = #{userId}
+        limit 1;
+    </select>
 </mapper>

+ 10 - 0
mec-client-api/src/main/java/com/ym/mec/im/ImFeignService.java

@@ -188,4 +188,14 @@ public interface ImFeignService {
     @PostMapping(value = "/liveRoom/userExistInRoom")
     boolean userExistInRoom(@RequestParam("chatroomId") String chatroomId, @RequestParam("userId") String userId);
 
+    /**
+     * 查询用户是否在线
+     * 注意:断网时,用户状态返回可能不准确
+     *
+     * @param userId 要查询的用户 ID(必传)
+     * @return 在线状态,true 在线,false 不在线
+     */
+    @PostMapping(value = "/liveRoom/checkOnline")
+    boolean checkOnline(@RequestParam("userId") String userId);
+
 }

+ 6 - 0
mec-client-api/src/main/java/com/ym/mec/im/fallback/ImFeignServiceFallback.java

@@ -24,6 +24,7 @@ public class ImFeignServiceFallback implements ImFeignService {
     public Object groupCreate(GroupModel groupModel) {
         return null;
     }
+
     @Override
     public Object groupUpdate(GroupModel groupModel) {
         return null;
@@ -109,4 +110,9 @@ public class ImFeignServiceFallback implements ImFeignService {
         return false;
     }
 
+    @Override
+    public boolean checkOnline(String userId) {
+        return false;
+    }
+
 }

+ 1 - 1
mec-im/src/main/java/com/ym/config/ResourceServerConfig.java

@@ -15,7 +15,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
                         "/room/statusImMsg", "/group/batchDismiss", "/private/send", "/group/send",
                         "/group/dismiss", "/room/statusImMsg", "/history/get", "/user/statusImUser", "/liveRoom/recordSync",
                         "/liveRoom/publishRoomMsg", "/liveRoom/destroy", "/liveRoom/create", "/liveRoom/startRecord",
-                        "/liveRoom/stopRecord", "/liveRoom/userExistInRoom")
+                        "/liveRoom/stopRecord", "/liveRoom/userExistInRoom","/liveRoom/checkOnline")
                 .permitAll().anyRequest().authenticated().and().csrf().disable();
     }
 }

+ 5 - 0
mec-im/src/main/java/com/ym/controller/LiveRoomController.java

@@ -69,4 +69,9 @@ public class LiveRoomController {
         return liveRoomService.userExistInRoom(chatroomId, userId);
     }
 
+    @ApiOperation("查询用户是否在聊天室")
+    @PostMapping(value = "/checkOnline")
+    public boolean checkOnline(String userId) {
+        return liveRoomService.checkOnline(userId);
+    }
 }

+ 17 - 0
mec-im/src/main/java/com/ym/mec/im/IMHelper.java

@@ -6,6 +6,7 @@ import com.ym.mec.common.entity.BaseMessage;
 import com.ym.mec.common.exception.BizException;
 import com.ym.pojo.IMApiResultInfo;
 import com.ym.pojo.IMTokenInfo;
+import com.ym.pojo.IMUserOnlineInfo;
 import io.rong.util.GsonUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
@@ -473,4 +474,20 @@ public class IMHelper {
         return (IMApiResultInfo) GsonUtil.fromJson(httpHelper.returnResult(conn), IMApiResultInfo.class);
     }
 
+    /**
+     * 查询用户是否在线
+     * 注意:断网时,用户状态返回可能不准确
+     *
+     * @param userId 要查询的用户 ID(必传)
+     */
+    public IMUserOnlineInfo checkOnline(String userId) throws Exception {
+        String body = "&userId=" + URLEncoder.encode(userId, UTF8);
+        if (body.indexOf("&") == 0) {
+            body = body.substring(1);
+        }
+        HttpURLConnection conn = httpHelper.createIMPostHttpConnection("/user/checkOnline.json", "application/x-www-form-urlencoded");
+        httpHelper.setBodyParameter(body, conn);
+        return (IMUserOnlineInfo) GsonUtil.fromJson(httpHelper.returnResult(conn), IMUserOnlineInfo.class);
+    }
+
 }

+ 2 - 0
mec-im/src/main/java/com/ym/pojo/IMApiResultInfo.java

@@ -13,6 +13,8 @@ public class IMApiResultInfo {
     String errorMessage;
     //人员是否存在 true 存在  false 不存在
     Boolean isInChrm;
+    //在线状态,1为在线,0为不在线。
+    String status;
 
     public boolean isSuccess() {
         return code == 200;

+ 15 - 0
mec-im/src/main/java/com/ym/pojo/IMUserOnlineInfo.java

@@ -0,0 +1,15 @@
+package com.ym.pojo;
+
+import lombok.Data;
+
+@Data
+public class IMUserOnlineInfo {
+    // 返回码,200 为正常。
+    Integer code;
+    //在线状态,1为在线,0为不在线。
+    String status;
+
+    public boolean isSuccess() {
+        return code == 200;
+    }
+}

+ 30 - 9
mec-im/src/main/java/com/ym/service/Impl/LiveRoomServiceImpl.java

@@ -9,6 +9,7 @@ import com.ym.mec.common.entity.ImRoomMessage;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.im.IMHelper;
 import com.ym.pojo.IMApiResultInfo;
+import com.ym.pojo.IMUserOnlineInfo;
 import com.ym.pojo.RecordConfig;
 import com.ym.pojo.RecordNotify;
 import com.ym.service.LiveRoomService;
@@ -121,17 +122,14 @@ public class LiveRoomServiceImpl implements LiveRoomService {
             log.error("直播视频录制失败:resultInfo : {} ", returnResult);
         }
         String recordId = resultObject.getString("recordId");
-        ImLiveRoomVideo video = imLiveRoomVideoService.getOne(new QueryWrapper<ImLiveRoomVideo>()
-                .eq("room_uid_", roomId)
-                .eq("record_id_", recordId)
-                .eq("type", 0));
+        ImLiveRoomVideo video = imLiveRoomVideoService.getOne(new QueryWrapper<ImLiveRoomVideo>().eq("room_uid_", roomId).eq("record_id_", recordId).eq("type", 0));
         if (Objects.nonNull(video)) {
             return;
         }
-        imLiveRoomVideoService.save(initImLiveRoomVideo(roomId, recordId,new Date()));
+        imLiveRoomVideoService.save(initImLiveRoomVideo(roomId, recordId, new Date()));
     }
 
-    private ImLiveRoomVideo initImLiveRoomVideo(String roomId, String recordId,Date now) {
+    private ImLiveRoomVideo initImLiveRoomVideo(String roomId, String recordId, Date now) {
         ImLiveRoomVideo video = new ImLiveRoomVideo();
         video.setRoomUid(roomId);
         video.setRecordId(recordId);
@@ -163,8 +161,8 @@ public class LiveRoomServiceImpl implements LiveRoomService {
                 try {
                     Date now = new Date();
                     //获取最后一次录制视频
-                    ImLiveRoomVideo video = imLiveRoomVideoService.getDao().getLastRecord(roomId,recordNotify.getRecordId());
-                    if(Objects.isNull(video)){
+                    ImLiveRoomVideo video = imLiveRoomVideoService.getDao().getLastRecord(roomId, recordNotify.getRecordId());
+                    if (Objects.isNull(video)) {
                         log.error("获取录制视频失败:roomId : {} ,recordId:{}", roomId, recordNotify.getRecordId());
                         return;
                     }
@@ -177,7 +175,7 @@ public class LiveRoomServiceImpl implements LiveRoomService {
                         imLiveRoomVideo.setType(2);
                         imLiveRoomVideoService.save(imLiveRoomVideo);
                         return;
-                    }else {
+                    } else {
                         video.setEndTime(now);
                         video.setType(2);
                         video.setUrl(fileUrl);
@@ -216,6 +214,29 @@ public class LiveRoomServiceImpl implements LiveRoomService {
         return resultInfo.isSuccess() && resultInfo.getIsInChrm();
     }
 
+    /**
+     * 查询用户是否在线
+     * 注意:断网时,用户状态返回可能不准确
+     *
+     * @param userId 要查询的用户 ID(必传)
+     * @return true 在线,false 不在线
+     */
+    public boolean checkOnline(String userId) {
+        log.info("checkOnline userId : {}", userId);
+        IMUserOnlineInfo resultInfo;
+        try {
+            resultInfo = imHelper.checkOnline(userId);
+        } catch (Exception e) {
+            return false;
+        }
+        if (!resultInfo.isSuccess()) {
+            log.error("checkOnline userId : {}", userId);
+            return false;
+        }
+        log.info("checkOnline userId : {}  resultInfo code:{} status: {}", userId, resultInfo.getCode(), resultInfo.getStatus());
+        return Objects.equals("1", resultInfo.getStatus());
+    }
+
     public String getRoomSessionId(String roomId) {
         RBucket<String> bucket = redissonClient.getBucket("sessionId:" + roomId);
         if (bucket.isExists()) {

+ 2 - 0
mec-im/src/main/java/com/ym/service/LiveRoomService.java

@@ -45,4 +45,6 @@ public interface LiveRoomService {
 
     boolean userExistInRoom(String chatroomId, String userId);
 
+    boolean checkOnline(String userId);
+
 }

+ 1 - 0
mec-student/src/main/java/com/ym/mec/student/controller/StudentOrderController.java

@@ -275,6 +275,7 @@ public class StudentOrderController extends BaseController {
             }
         } else if (orderByOrderNo.getGroupType().equals(GroupType.LIVE_BUY)) {
             orderDetail.put("detail", vipGroupActivityDao.queryByIds(orderByOrderNo.getActivityId()));
+            orderDetail.put("goodsId",orderByOrderNo.getClassGroupId());
         }
         return succeed(orderDetail);
     }

+ 14 - 6
mec-student/src/main/java/com/ym/mec/student/controller/TempLiveActivityController.java

@@ -44,18 +44,26 @@ public class TempLiveActivityController extends BaseController {
     private TempLiveTeacherCardDao tempLiveTeacherCardDao;
 
     @ApiOperation("查询声部")
-    @PostMapping(value = "/querySubjectOption",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
-    public HttpResponseResult<Map<String,Object>> querySubjectOption() {
+    @PostMapping(value = "/querySubjectOption", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public HttpResponseResult<Map<String, Object>> querySubjectOption() {
         SysUser user = sysUserFeignService.queryUserInfo();
         if (user == null || user.getId() == null) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
-        Map<String,Object> res = new HashMap<>();
+        Map<String, Object> res = new HashMap<>();
         List<Subject> options = tempLiveTeacherCardDao.querySubjectOption();
-        res.put("options",options);
+        res.put("options", options);
 
         Student student = studentService.get(user.getId());
-        res.put("subjectId",student.getSubjectIdList());
+        res.put("subjectId", student.getSubjectIdList());
+
+        Integer goodsId = 4;
+        Integer ststus = tempLiveTeacherCardDao.getJoinStstus(user.getId(), goodsId);
+        res.put("ststus", ststus);
+
+        String joinSubjectId = tempLiveTeacherCardDao.getJoinSubject(user.getId(),goodsId);
+        res.put("joinSubjectId", joinSubjectId);
+
         return succeed(res);
     }
 
@@ -67,7 +75,7 @@ public class TempLiveActivityController extends BaseController {
             )
     })
     @ApiOperation("查询声部上课老师名片信息列表")
-    @PostMapping(value = "/listTeacherCard",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    @PostMapping(value = "/listTeacherCard", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
     public HttpResponseResult<List<TempLiveTeacherCard>> listTeacherCard(@ApiIgnore @RequestBody TempLiveTeacherCard param) {
         SysUser user = sysUserFeignService.queryUserInfo();
         if (user == null || user.getId() == null) {

+ 1 - 1
mec-util/src/main/java/com/ym/mec/util/file/FileUtil.java

@@ -13,7 +13,7 @@ public class FileUtil {
     public static String getFileExpandByPath(String filePath) {
         int i = filePath.lastIndexOf(".");
         if (i > 0) {
-            return filePath.substring(+1);
+            return filePath.substring(i+1);
         }
         return "";
     }

+ 3 - 6
mec-web/src/main/java/com/ym/mec/web/controller/ImLiveBroadcastRoomController.java

@@ -1,9 +1,8 @@
 package com.ym.mec.web.controller;
 
-
 import com.ym.mec.biz.dal.dto.ImLiveBroadcastRoomDto;
-import com.ym.mec.biz.dal.page.LiveRoomGoodsOrderQueryInfo;
 import com.ym.mec.biz.dal.dto.RoomReservationUserSearch;
+import com.ym.mec.biz.dal.page.LiveRoomGoodsOrderQueryInfo;
 import com.ym.mec.biz.dal.vo.BaseRoomUserVo;
 import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomVo;
 import com.ym.mec.biz.dal.vo.LiveRoomGoodsOrderVo;
@@ -13,7 +12,6 @@ import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.ImUserState;
 import com.ym.mec.common.page.PageInfo;
-import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.page.WrapperUtil;
 import io.swagger.annotations.*;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -56,7 +54,6 @@ public class ImLiveBroadcastRoomController extends BaseController {
         return succeed(imLiveBroadcastRoomService.queryPage(param));
     }
 
-
     @ApiOperation("直播间预约人员信息")
     @PostMapping("/query/roomUser")
     public HttpResponseResult<PageInfo<RoomReservationUserVo>> queryRoomUser(@RequestBody @Valid RoomReservationUserSearch query) {
@@ -67,7 +64,7 @@ public class ImLiveBroadcastRoomController extends BaseController {
     @GetMapping("/queryRoom")
     public HttpResponseResult<ImLiveBroadcastRoomVo> queryRoomAndCheck(@ApiParam(value = "房间uid", required = true) String roomUid,
                                                                        @ApiParam(value = "用户id", required = true) Integer userId) {
-        return succeed(imLiveBroadcastRoomService.queryRoomAndCheck(roomUid, userId, 0));
+        return succeed(imLiveBroadcastRoomService.queryRoomAndCheck(roomUid, userId, null));
     }
 
     @ApiOperation("查询房间信息")
@@ -214,7 +211,7 @@ public class ImLiveBroadcastRoomController extends BaseController {
 
     @ApiOperation("查询直播间商品订单列表")
     @GetMapping("/queryLiveRoomGoodsOrderList")
-    public HttpResponseResult<PageInfo<LiveRoomGoodsOrderVo>> queryLiveRoomGoodsOrderList(LiveRoomGoodsOrderQueryInfo queryInfo){
+    public HttpResponseResult<PageInfo<LiveRoomGoodsOrderVo>> queryLiveRoomGoodsOrderList(LiveRoomGoodsOrderQueryInfo queryInfo) {
         return succeed(imLiveBroadcastRoomService.queryLiveRoomGoodsOrderList(queryInfo));
     }
 }

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

@@ -9,11 +9,7 @@ import java.util.List;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.GetMapping;
-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 org.springframework.web.bind.annotation.*;
 
 import com.ym.mec.biz.dal.dao.SysMusicScoreCategoriesDao;
 import com.ym.mec.biz.dal.dto.MusicScoreDto;

+ 1 - 0
mec-web/src/main/java/com/ym/mec/web/controller/education/ImGroupNoticeController.java

@@ -37,6 +37,7 @@ public class ImGroupNoticeController extends BaseController {
         if(sysUser == null){
             return failed("获取用户信息失败");
         }
+        imGroupNotice.setOperatorId(sysUser.getId().longValue());
         return succeed(imGroupNoticeService.insert(imGroupNotice));
     }
 

+ 1 - 1
mec-web/src/main/resources/columnMapper.ini

@@ -67,7 +67,7 @@
 ID = id
 用户ID = userId
 购买学生姓名 = studentName
-老师推荐级别(初级/中级/高级) = recommendLevel
+老师推荐级别(一级/二级/三级) = recommendLevel
 
 [直播临时活动上课老师名片导入模板]
 声部id = subjectId

部分文件因为文件数量过多而无法显示