Forráskód Böngészése

Merge remote-tracking branch 'origin/master'

zouxuan 3 éve
szülő
commit
b2845884a6
52 módosított fájl, 765 hozzáadás és 451 törlés
  1. 2 2
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/TeacherFeignService.java
  2. 4 4
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/TeacherFeignServiceFallback.java
  3. 0 2
      cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/entity/SysUser.java
  4. 0 41
      cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/enums/CertificateTypeEnum.java
  5. 1 1
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/dal/dao/SysUserDao.java
  6. 1 1
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/SysUserLoginServiceImpl.java
  7. 6 0
      cooleshow-common/pom.xml
  8. 2 1
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/AccessSource.java
  9. 35 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/CertificateTypeEnum.java
  10. 2 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/ContractTemplateSourceEnum.java
  11. 2 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/ContractTemplateTypeEnum.java
  12. 16 23
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/SysUserType.java
  13. 4 3
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/UserGenderEnum.java
  14. 3 9
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/UserLockFlag.java
  15. 3 10
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/YesOrNoEnum.java
  16. 22 22
      cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/TeacherSalaryTask.java
  17. 11 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/constant/LiveRoomConstant.java
  18. 1 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/LiveRoomDao.java
  19. 7 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserAccountDao.java
  20. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/PianoRoomSettingsSearch.java
  21. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImRoomMessage.java
  22. 3 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/PianoRoomSettings.java
  23. 0 10
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/RoomUserInfoCache.java
  24. 22 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserAccountRecord.java
  25. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrder.java
  26. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderDetail.java
  27. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/RoomTypeEnum.java
  28. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleService.java
  29. 20 11
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/LiveRoomService.java
  30. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderService.java
  31. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ContractServiceImpl.java
  32. 23 12
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  33. 362 206
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/LiveRoomServiceImpl.java
  34. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java
  35. 29 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserAccountServiceImpl.java
  36. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserWithdrawalServiceImpl.java
  37. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/support/IMHelper.java
  38. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserOrderRefundVo.java
  39. 3 3
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  40. 1 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/LiveRoomMapper.xml
  41. 3 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/PianoRoomSettingsMapper.xml
  42. 19 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserAccountMapper.xml
  43. 49 24
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserAccountRecordMapper.xml
  44. 2 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserWithdrawalMapper.xml
  45. 8 34
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/StudentLiveRoomController.java
  46. 2 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/PianoRoomSettingsController.java
  47. 4 3
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherLiveRoomController.java
  48. 5 5
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/task/TaskController.java
  49. 26 0
      cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/MusicSheetController.java
  50. 0 2
      cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/WebSiteController.java
  51. 34 0
      cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/open/OpenWebSiteController.java
  52. 3 1
      toolset/toolset-base/src/main/java/com/yonge/toolset/base/page/QueryInfo.java

+ 2 - 2
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/TeacherFeignService.java

@@ -47,6 +47,6 @@ public interface TeacherFeignService {
      * @Author: cy
      * @Date: 2022/5/24
      */
-    @GetMapping("/task/teacherSalary")
-    HttpResponseResult<Object> teacherSalary();
+//    @GetMapping("/task/teacherSalary")
+//    HttpResponseResult<Object> teacherSalary();
 }

+ 4 - 4
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/TeacherFeignServiceFallback.java

@@ -27,8 +27,8 @@ public class TeacherFeignServiceFallback implements TeacherFeignService {
         return null;
     }
 
-    @Override
-    public HttpResponseResult<Object> teacherSalary() {
-        return null;
-    }
+//    @Override
+//    public HttpResponseResult<Object> teacherSalary() {
+//        return null;
+//    }
 }

+ 0 - 2
cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/entity/SysUser.java

@@ -9,8 +9,6 @@ import java.util.List;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
-import com.yonge.cooleshow.auth.api.enums.YesOrNoEnum;
-
 /**
  * 对应数据库表(sys_user):
  */

+ 0 - 41
cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/enums/CertificateTypeEnum.java

@@ -1,41 +0,0 @@
-package com.yonge.cooleshow.auth.api.enums;
-
-import com.yonge.toolset.base.enums.BaseEnum;
-
-/**
- * @Author Joburgess
- * @Date 2021/1/6 0006
- **/
-public enum CertificateTypeEnum implements BaseEnum<String, CertificateTypeEnum> {
-
-    IDENTITY("IDENTITY", "身份证"),
-    HK_MAC("HK_MAC", "港澳居民往来内地通行证"),
-    TAIWAN("TAIWAN", "台湾居民往来内地通行证"),
-    FOREIGN_PASSPORT("FOREIGN_PASSPORT", "外国护照");
-
-    private String code;
-
-    private String msg;
-
-    CertificateTypeEnum(String code, String msg) {
-        this.code = code;
-        this.msg = msg;
-    }
-
-    @Override
-    public String getCode() {
-        return code;
-    }
-
-    public void setCode(String code) {
-        this.code = code;
-    }
-
-    public String getMsg() {
-        return msg;
-    }
-
-    public void setMsg(String msg) {
-        this.msg = msg;
-    }
-}

+ 1 - 1
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/dal/dao/SysUserDao.java

@@ -8,7 +8,7 @@ import com.yonge.cooleshow.auth.api.dto.RealnameAuthReq;
 import com.yonge.cooleshow.auth.api.dto.SysUserQueryInfo;
 import com.yonge.cooleshow.auth.api.dto.UserSetReq;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
-import com.yonge.cooleshow.auth.api.enums.UserLockFlag;
+import com.yonge.cooleshow.common.enums.UserLockFlag;
 import com.yonge.cooleshow.auth.api.vo.UserSetVo;
 import com.yonge.toolset.mybatis.dal.BaseDAO;
 import com.yonge.cooleshow.common.entity.ImUserModel;

+ 1 - 1
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/SysUserLoginServiceImpl.java

@@ -12,7 +12,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.auth.api.entity.SysUserLogin;
-import com.yonge.cooleshow.auth.api.enums.UserLockFlag;
+import com.yonge.cooleshow.common.enums.UserLockFlag;
 import com.yonge.cooleshow.auth.dal.dao.SysUserDao;
 import com.yonge.cooleshow.auth.dal.dao.SysUserLoginDao;
 import com.yonge.cooleshow.auth.service.SysUserLoginService;

+ 6 - 0
cooleshow-common/pom.xml

@@ -49,5 +49,11 @@
 			<groupId>org.springframework.cloud</groupId>
 			<artifactId>spring-cloud-starter-oauth2</artifactId>
 		</dependency>
+
+		<dependency>
+			<groupId>com.baomidou</groupId>
+			<artifactId>mybatis-plus-annotation</artifactId>
+			<version>3.0.7.1</version>
+		</dependency>
 	</dependencies>
 </project>

+ 2 - 1
cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/AccessSource.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.common.enums;
 
+import com.baomidou.mybatisplus.annotation.EnumValue;
 import com.yonge.toolset.base.enums.BaseEnum;
 
 /**
@@ -10,7 +11,7 @@ import com.yonge.toolset.base.enums.BaseEnum;
 public enum AccessSource implements BaseEnum<Integer, AccessSource> {
 
 	PC(1, "PC端"), MOBILE(2, "移动端"), WX(3, "微信");
-
+	@EnumValue
 	private Integer code;
 
 	private AccessSource(Integer code, String remark) {

+ 35 - 0
cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/CertificateTypeEnum.java

@@ -0,0 +1,35 @@
+package com.yonge.cooleshow.common.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.toolset.base.enums.BaseEnum;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/1/6 0006
+ **/
+public enum CertificateTypeEnum implements BaseEnum<String, CertificateTypeEnum> {
+
+    IDENTITY("身份证"),
+    HK_MAC("港澳居民往来内地通行证"),
+    TAIWAN("台湾居民往来内地通行证"),
+    FOREIGN_PASSPORT("外国护照");
+
+    @EnumValue
+    private String code;
+
+    private String msg;
+
+    CertificateTypeEnum(String msg) {
+        this.code = this.name();
+        this.msg = msg;
+    }
+
+    @Override
+    public String getCode() {
+        return code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+}

+ 2 - 0
cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/ContractTemplateSourceEnum.java

@@ -1,10 +1,12 @@
 package com.yonge.cooleshow.common.enums;
 
+import com.baomidou.mybatisplus.annotation.EnumValue;
 import com.yonge.toolset.base.enums.BaseEnum;
 
 public enum ContractTemplateSourceEnum implements BaseEnum<String, ContractTemplateSourceEnum> {
     PLATFORM("平台协议"), LINGXINPAY("灵薪付");
 
+    @EnumValue
     private String code;
 
     private String desc;

+ 2 - 0
cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/ContractTemplateTypeEnum.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.common.enums;
 
+import com.baomidou.mybatisplus.annotation.EnumValue;
 import com.yonge.toolset.base.enums.BaseEnum;
 
 public enum ContractTemplateTypeEnum implements BaseEnum<String, ContractTemplateTypeEnum> {
@@ -8,6 +9,7 @@ public enum ContractTemplateTypeEnum implements BaseEnum<String, ContractTemplat
     PRODUCT(ContractTemplateSourceEnum.PLATFORM, "产品"),
     WITHDRAW(ContractTemplateSourceEnum.LINGXINPAY, "用户结算");
 
+    @EnumValue
     private String code;
 
     private ContractTemplateSourceEnum source;

+ 16 - 23
cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/SysUserType.java

@@ -1,35 +1,28 @@
 package com.yonge.cooleshow.common.enums;
 
+import com.baomidou.mybatisplus.annotation.EnumValue;
 import com.yonge.toolset.base.enums.BaseEnum;
 import org.apache.commons.lang3.StringUtils;
 
 public enum SysUserType implements BaseEnum<String, SysUserType> {
 
-	STUDENT("学生"), TEACHER("指导老师"), SYSTEM("系统內置");
+    STUDENT("学生"), TEACHER("指导老师"), SYSTEM("系统內置");
+    @EnumValue
+    private String code;
 
-	private String desc;
+    private String desc;
 
-	private SysUserType(String desc) {
-	}
+    SysUserType(String desc) {
+        this.code = this.name();
+        this.desc = desc;
+    }
 
-	@Override
-	public String getCode() {
-		return name();
-	}
+    @Override
+    public String getCode() {
+        return name();
+    }
 
-	public String getDesc() {
-		return desc;
-	}
-
-	public static SysUserType queryByName(String name) {
-		if (StringUtils.isBlank(name)) {
-			return null;
-		}
-		for (SysUserType sysUserType : SysUserType.values()) {
-			if (name.equals(sysUserType.getCode())) {
-				return sysUserType;
-			}
-		}
-		return null;
-	}
+    public String getDesc() {
+        return desc;
+    }
 }

+ 4 - 3
cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/UserGenderEnum.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.common.enums;
 
+import com.baomidou.mybatisplus.annotation.EnumValue;
 import com.yonge.toolset.base.enums.BaseEnum;
 
 /**
@@ -10,12 +11,12 @@ import com.yonge.toolset.base.enums.BaseEnum;
 public enum UserGenderEnum implements BaseEnum<Integer, UserGenderEnum> {
 
 	WOMAN(0, "女"), MAN(1, "男");
-
-	private int code;
+	@EnumValue
+	private Integer code;
 
 	private String description;
 
-	private UserGenderEnum(int code, String description) {
+	UserGenderEnum(int code, String description) {
 		this.code = code;
 		this.description = description;
 	}

+ 3 - 9
cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/enums/UserLockFlag.java → cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/UserLockFlag.java

@@ -1,5 +1,6 @@
-package com.yonge.cooleshow.auth.api.enums;
+package com.yonge.cooleshow.common.enums;
 
+import com.baomidou.mybatisplus.annotation.EnumValue;
 import com.yonge.toolset.base.enums.BaseEnum;
 
 /**
@@ -9,6 +10,7 @@ public enum UserLockFlag implements BaseEnum<Integer, UserLockFlag> {
 
 	NORMAL(0, "正常"), LOCKED(9, "锁定"), CANCELLED(1, "冻结");
 
+	@EnumValue
 	private int code;
 
 	UserLockFlag(int code, String remark) {
@@ -22,18 +24,10 @@ public enum UserLockFlag implements BaseEnum<Integer, UserLockFlag> {
 		return code;
 	}
 
-	public void setCode(int code) {
-		this.code = code;
-	}
-
 	public String getRemark() {
 		return remark;
 	}
 
-	public void setRemark(String remark) {
-		this.remark = remark;
-	}
-
 	public static UserLockFlag codeOf(int code) {
 		for (UserLockFlag userStatus : UserLockFlag.values()) {
 			if (code == userStatus.getCode()) {

+ 3 - 10
cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/enums/YesOrNoEnum.java → cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/YesOrNoEnum.java

@@ -1,11 +1,12 @@
-package com.yonge.cooleshow.auth.api.enums;
+package com.yonge.cooleshow.common.enums;
 
+import com.baomidou.mybatisplus.annotation.EnumValue;
 import com.yonge.toolset.base.enums.BaseEnum;
 
 public enum YesOrNoEnum implements BaseEnum<Integer, YesOrNoEnum> {
     NO(0,"否"),
     YES(1,"是");
-
+    @EnumValue
     private Integer code;
     private String msg;
 
@@ -14,18 +15,10 @@ public enum YesOrNoEnum implements BaseEnum<Integer, YesOrNoEnum> {
         this.msg = msg;
     }
 
-    public void setCode(Integer code) {
-        this.code = code;
-    }
-
     public String getMsg() {
         return msg;
     }
 
-    public void setMsg(String msg) {
-        this.msg = msg;
-    }
-
     @Override
     public Integer getCode() {
         return this.code;

+ 22 - 22
cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/TeacherSalaryTask.java

@@ -1,22 +1,22 @@
-package com.yonge.cooleshow.task.jobs;
-
-import com.yonge.cooleshow.api.feign.TeacherFeignService;
-import com.yonge.cooleshow.task.core.BaseTask;
-import com.yonge.cooleshow.task.core.TaskException;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-/**
- * @Author: cy
- * @Date: 2022/5/24
- */
-@Service
-public class TeacherSalaryTask extends BaseTask {
-    @Autowired
-    private TeacherFeignService teacherFeignService;
-
-    @Override
-    public void execute() throws TaskException {
-        teacherFeignService.teacherSalary();
-    }
-}
+//package com.yonge.cooleshow.task.jobs;
+//
+//import com.yonge.cooleshow.api.feign.TeacherFeignService;
+//import com.yonge.cooleshow.task.core.BaseTask;
+//import com.yonge.cooleshow.task.core.TaskException;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.stereotype.Service;
+//
+///**
+// * @Author: cy
+// * @Date: 2022/5/24
+// */
+//@Service
+//public class TeacherSalaryTask extends BaseTask {
+//    @Autowired
+//    private TeacherFeignService teacherFeignService;
+//
+//    @Override
+//    public void execute() throws TaskException {
+//        teacherFeignService.teacherSalary();
+//    }
+//}

+ 11 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/constant/LiveRoomConstant.java

@@ -14,6 +14,9 @@ public interface LiveRoomConstant {
     //直播间累计用户信息-指只要进入到该房间的用户都要记录
     String LIVE_ROOM_TOTAL_USER_LIST = String.join(":", COOLESHOW, "LIVE_ROOM_TOTAL_USER_LIST", ROOM_UID);
 
+    //直播间在线用户信息
+    String LIVE_ROOM_ONLINE_USER_LIST = String.join(":", COOLESHOW, "LIVE_ROOM_ONLINE_USER_LIST", ROOM_UID);
+
     //用户当前对应的直播间Uid
     String LIVE_USER_ROOM = String.join(":", COOLESHOW, "LIVE_ROOM_USER", USER_ID);
 
@@ -24,5 +27,12 @@ public interface LiveRoomConstant {
     String LIVE_ROOM_INFO = String.join(":", COOLESHOW, "LIVE_ROOM_INFO", ROOM_UID);
 
     //记录老师最后变更的状态消息时间
-    String LIVE_TEACHER_LAST_TIME = String.join(":", COOLESHOW, "LIVE_TEACHER_LAST_TIME", USER_ID);
+    String LIVE_USER_LAST_TIME = String.join(":", COOLESHOW, "LIVE_USER_LAST_TIME", USER_ID);
+
+    //主讲人最近一次加入房间的clientIp
+    String LIVE_USER_LAST_CLIENT_IP = String.join(":", COOLESHOW, "LIVE_USER_LAST_CLIENT_IP", ROOM_UID, USER_ID);
+
+    //当前房间心跳
+    String LIVE_ROOM_HEART_BEAT = String.join(":", COOLESHOW, "LIVE_ROOM_HEART_BEAT", ROOM_UID);
+
 }

+ 1 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/LiveRoomDao.java

@@ -2,7 +2,6 @@ package com.yonge.cooleshow.biz.dal.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.yonge.cooleshow.biz.dal.entity.LiveRoom;
-import com.yonge.cooleshow.biz.dal.vo.RoomVo;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -17,6 +16,6 @@ public interface LiveRoomDao extends BaseMapper<LiveRoom> {
 
     int insertBatch(@Param("entities") List<LiveRoom> entities);
 
-    LiveRoom getliveingRoomBySpeakerId(@Param("speakerId") Long speakerId);
+    LiveRoom getLiveInRoomBySpeakerId(@Param("speakerId") Long speakerId);
 }
 

+ 7 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserAccountDao.java

@@ -5,6 +5,7 @@ import java.util.List;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.biz.dal.dto.UserAccountRecordDto;
 import com.yonge.cooleshow.biz.dal.dto.req.TotalReq;
 import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
 import com.yonge.cooleshow.biz.dal.vo.res.AccountTotal;
@@ -74,4 +75,10 @@ public interface UserAccountDao extends BaseMapper<UserAccount>{
 	 * @return: java.util.List<com.yonge.cooleshow.biz.dal.vo.res.AccountTotal>
 	 */
     List<AccountTotal> accountTotal(@Param("timeType")String timeType,@Param("param")TotalReq totalReq);
+	/**
+	 * 统计本次变更前已经变更的金额
+	 * @param accountRecordDto
+	 * @return
+	 */
+    BigDecimal totalTransAmount(@Param("param") UserAccountRecordDto accountRecordDto);
 }

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/PianoRoomSettingsSearch.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.dto.search;
 
 import com.yonge.toolset.base.page.QueryInfo;
 import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 
 /**
  * @Author: liweifan
@@ -11,4 +12,14 @@ import io.swagger.annotations.ApiModel;
 public class PianoRoomSettingsSearch extends QueryInfo{
 	private static final long serialVersionUID = 1L;
 
+	@ApiModelProperty("状态 0-停用 1-使用 ")
+	private Integer status;
+
+	public Integer getStatus() {
+		return status;
+	}
+
+	public void setStatus(Integer status) {
+		this.status = status;
+	}
 }

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImRoomMessage.java

@@ -8,6 +8,8 @@ public class ImRoomMessage extends BaseMessage {
 
     //objectName 类型-观看者退出房间
     public static final String RC_CHATROOM_LEAVE = "RC:Chatroom:Leave";
+    //objectName 类型-观看者数量-该消息只有主播端接
+    public static final String MEMBER_COUNT = "RC:Chatroom:MemberCountUp";
 
     /**
      * 消息类型

+ 3 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/PianoRoomSettings.java

@@ -30,7 +30,7 @@ public class PianoRoomSettings implements Serializable {
     private String description;
     @ApiModelProperty("状态 0-停用 1-使用 ")
     @TableField(value = "status_")
-    private Byte status;
+    private Integer status;
     @ApiModelProperty("创建人 ")
 	@TableField(value = "create_by_")
     private Long createBy;
@@ -92,11 +92,11 @@ public class PianoRoomSettings implements Serializable {
         this.description = description;
     }
 
-    public Byte getStatus() {
+    public Integer getStatus() {
         return status;
     }
 
-    public void setStatus(Byte status) {
+    public void setStatus(Integer status) {
         this.status = status;
     }
 

+ 0 - 10
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/RoomUserInfoCache.java

@@ -30,9 +30,6 @@ public class RoomUserInfoCache implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date lastOutTime;
 
-    @ApiModelProperty(value = "0:在房间 1:不在房间")
-    private Integer state;
-
     public Long getUserId() {
         return userId;
     }
@@ -73,11 +70,4 @@ public class RoomUserInfoCache implements Serializable {
         this.lastOutTime = lastOutTime;
     }
 
-    public Integer getState() {
-        return state;
-    }
-
-    public void setState(Integer state) {
-        this.state = state;
-    }
 }

+ 22 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserAccountRecord.java

@@ -12,6 +12,7 @@ import io.swagger.annotations.ApiModelProperty;
 import java.io.Serializable;
 import java.util.Date;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.models.auth.In;
 import org.springframework.format.annotation.DateTimeFormat;
 import java.math.BigDecimal;
 
@@ -54,6 +55,12 @@ public class UserAccountRecord implements Serializable {
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
     private Date createTime;
+    @ApiModelProperty("是否异常 ")
+    @TableField(value = "err_flag_")
+    private Integer errFlag = 0;
+    @ApiModelProperty("异常信息 ")
+    @TableField(value = "err_msg_")
+    private String errMsg;
 
     public Long getId() {
         return id;
@@ -135,4 +142,19 @@ public class UserAccountRecord implements Serializable {
         this.createTime = createTime;
     }
 
+    public Integer getErrFlag() {
+        return errFlag;
+    }
+
+    public void setErrFlag(Integer errFlag) {
+        this.errFlag = errFlag;
+    }
+
+    public String getErrMsg() {
+        return errMsg;
+    }
+
+    public void setErrMsg(String errMsg) {
+        this.errMsg = errMsg;
+    }
 }

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrder.java

@@ -35,7 +35,7 @@ public class UserOrder implements Serializable {
     @ApiModelProperty("订单名称 ")
     @TableField(value = "order_name_")
     private String orderName;
-    @ApiModelProperty("订单类型:  VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播")
+    @ApiModelProperty("订单类型: 学生端( VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ) 老师端(PINAO_ROOM、琴房时长)")
     @TableField(value = "order_type_")
     private OrderTypeEnum orderType;
     @ApiModelProperty("订单描述信息 ")

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderDetail.java

@@ -32,7 +32,7 @@ public class UserOrderDetail implements Serializable {
     @ApiModelProperty("卖家id ")
     @TableField(value = "merch_id_")
     private Long merchId;
-    @ApiModelProperty("订单类型:  VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播")
+    @ApiModelProperty("订单类型: 学生端( VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ) 老师端(PINAO_ROOM、琴房时长)")
     @TableField(value = "good_type_")
     private GoodTypeEnum goodType;
     @ApiModelProperty("业务id ")

+ 2 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/RoomTypeEnum.java

@@ -10,9 +10,9 @@ public enum RoomTypeEnum {
     PRACTICE("陪练课"),
     TEMP("临时直播间");
 
-    private String code;
+    private final String code;
 
-    private String msg;
+    private final String msg;
 
     RoomTypeEnum(String msg) {
         this.code = this.name();

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleService.java

@@ -236,7 +236,7 @@ public interface CourseScheduleService extends IService<CourseSchedule> {
 
     void scheduleTask();
 
-    void teacherSalaryTask();
+//    void teacherSalaryTask();
 
     PianoRoomTimeVo selectRemainTime(Long teacherId);
 

+ 20 - 11
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/LiveRoomService.java

@@ -8,9 +8,6 @@ import com.yonge.cooleshow.biz.dal.vo.RoomVo;
 import java.util.List;
 import java.util.Map;
 
-import static com.yonge.cooleshow.biz.dal.constant.LiveRoomConstant.LIVE_ROOM_LIKE;
-import static com.yonge.cooleshow.biz.dal.constant.LiveRoomConstant.ROOM_UID;
-
 /**
  * 直播房间与课程的关系表表(LiveRoom)表服务接口
  *
@@ -29,6 +26,13 @@ public interface LiveRoomService extends IService<LiveRoom> {
     RoomVo queryRoomInfo(String roomUid);
 
     /**
+     * 校验房间信息,及个人信息
+     *
+     * @param roomUid 房间uid
+     */
+    RoomVo studentCheckRoomInfo(String roomUid);
+
+    /**
      * 定时任务创建直播间
      */
     void createCourseLiveRoom();
@@ -65,19 +69,20 @@ public interface LiveRoomService extends IService<LiveRoom> {
     void syncLike(String roomUid, Integer likeNum);
 
     /**
-     * 进入房间
+     * 主讲人-进入房间
      *
      * @param roomUid 房间uid
-     * @param userId  用户id 主讲人或者用户的id
+     * @param userId  主讲人id
      */
-    RoomInfoCache joinRoom(String roomUid, Long userId);
+    RoomInfoCache speakerJoinRoom(String roomUid, Long userId);
 
     /**
-     * 查询在观看直播的用户信息
+     * 观看者-进入房间
      *
-     * @param roomUid 直播间uid
+     * @param roomUid 房间uid
+     * @param userId  观看者id
      */
-    List<RoomUserInfoCache> queryRoomUserInfo(String roomUid);
+    RoomInfoCache joinRoom(String roomUid, Long userId);
 
     /**
      * 发送消息
@@ -91,8 +96,12 @@ public interface LiveRoomService extends IService<LiveRoom> {
      */
     Map<String, Object> test(String roomUid);
 
-
-    LiveRoom getliveingRoomBySpeakerId(Long speakerId);
+    /**
+     * 根据主讲人id查询直播进行中的直播间信息
+     *
+     * @param speakerId 房间uid
+     */
+    LiveRoom getLiveInRoomBySpeakerId(Long speakerId);
 
 }
 

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderService.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.service;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderPayReq;
@@ -165,4 +166,5 @@ public interface UserOrderService extends IService<UserOrder> {
      */
     @Transactional(rollbackFor = Exception.class)
     void orderSuccess(UserOrderVo detail, PaymentCallBack data);
+
 }

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ContractServiceImpl.java

@@ -1,7 +1,7 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.yonge.cooleshow.auth.api.entity.SysUser;
-import com.yonge.cooleshow.auth.api.enums.CertificateTypeEnum;
+import com.yonge.cooleshow.common.enums.CertificateTypeEnum;
 import com.yonge.cooleshow.biz.dal.entity.ContractTemplate;
 import com.yonge.cooleshow.biz.dal.entity.SysUserTsign;
 import com.yonge.cooleshow.biz.dal.service.*;

+ 23 - 12
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java

@@ -1120,6 +1120,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
             CourseSchedule courseSchedule = baseMapper.selectById(courseId);
             Integer minutes = Math.toIntExact(ChronoUnit.MINUTES.between(Instant.ofEpochMilli(courseSchedule.getStartTime().getTime()), Instant.ofEpochMilli(courseSchedule.getEndTime().getTime())));
             endTime = DateUtil.offsetMinute(startTime, minutes);
+            adjustVo.setEndTime(endTime);
         }
 
         //校验时间是否为未来时刻
@@ -1556,7 +1557,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
                 courseScheduleTeacherSalaryService.update(null, Wrappers.<CourseScheduleTeacherSalary>lambdaUpdate()
                         .set(CourseScheduleTeacherSalary::getStatus, CourseScheduleEnum.COMPLETE.getCode())
                         .set(CourseScheduleTeacherSalary::getSettlementTime, new Date())
-                        .in(CourseScheduleTeacherSalary::getCourseGroupId, practiceList.stream().map(CourseScheduleStudentVo::getCourseId).collect(Collectors.toList())));
+                        .in(CourseScheduleTeacherSalary::getCourseScheduleId, practiceList.stream().map(CourseScheduleStudentVo::getCourseId).collect(Collectors.toList())));
 
                 //获取教师课酬写入到金额变更表
                 for (CourseScheduleStudentVo practice : practiceList) {
@@ -1632,17 +1633,17 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
      * @Author: cy
      * @Date: 2022/5/24
      */
-    @Transactional(rollbackFor = Exception.class)
-    public void teacherSalaryTask() {
-        //课程结算日期(天)
-        Integer settlementDay = Integer.valueOf(sysConfigService.findConfigValue(SysConfigConstant.COURSE_SALARY_SETTLEMENT_DAY));
-        //获取n天前日期
-        String day = DateUtil.getDayAgoOrAftString(-settlementDay);
-        //获取小于n天前所有课程id
-        List<Long> idList = baseMapper.selectIdList(day);
-        //更新老师课酬表
-        baseMapper.updateTeacherSalary(idList);
-    }
+//    @Transactional(rollbackFor = Exception.class)
+//    public void teacherSalaryTask() {
+//        //课程结算日期(天)
+//        Integer settlementDay = Integer.valueOf(sysConfigService.findConfigValue(SysConfigConstant.COURSE_SALARY_SETTLEMENT_DAY));
+//        //获取n天前日期
+//        String day = DateUtil.getDayAgoOrAftString(-settlementDay);
+//        //获取小于n天前所有课程id
+//        List<Long> idList = baseMapper.selectIdList(day);
+//        //更新老师课酬表
+//        baseMapper.updateTeacherSalary(idList);
+//    }
 
     /**
      * @Description: 查询琴房剩余时长、冻结时长、统计学员人数
@@ -1970,6 +1971,16 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         courseTime.setEndTime(endTime);
         List<CourseTimeEntity> timeList = Arrays.asList(courseTime);
 
+        //校验系统配置上下课时间
+        String classDate = DateUtil.dateToString(startTime);
+        String star = sysConfigService.findConfigValue(SysConfigConstant.COURSE_START_SETTING);//系统开课时间
+        String end = sysConfigService.findConfigValue(SysConfigConstant.COURSE_END_SETTING);//系统关课时间
+        Date s = DateUtil.strToDate(classDate + " " + star + ":00");
+        Date e = DateUtil.strToDate(classDate + " " + end + ":00");
+        if (startTime.before(s) || endTime.after(e)) {
+            throw new BizException("排课时间区间为{}~{}",star,end);
+        }
+
         if (startTime.before(new Date())) {
             throw new BizException("上课时间必须大于当前时间");
         }

+ 362 - 206
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/LiveRoomServiceImpl.java

@@ -3,6 +3,7 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.beust.jcommander.internal.Lists;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.LiveRoomDao;
@@ -30,6 +31,7 @@ import org.springframework.transaction.annotation.Transactional;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.function.BiFunction;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 import static com.yonge.cooleshow.biz.dal.constant.LiveRoomConstant.*;
@@ -68,8 +70,14 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
     @Autowired
     private TeacherAttendanceService teacherAttendanceService;
 
-    //生成房间UID
-    public static BiFunction<Long, RoomTypeEnum, String> GenRoomUid = (userId, en) -> String.join("-", COOLESHOW, en.getCode(), userId.toString(), new Date().getTime() + "");
+    /**
+     * 生成房间UID
+     *
+     * <p> userId:主讲人id
+     * <p> en :房间类型
+     */
+    private final BiFunction<Long, RoomTypeEnum, String> GenRoomUid = (userId, en) -> String
+            .join("-", COOLESHOW, en.getCode(), userId.toString(), new Date().getTime() + "");
 
     @Override
     public LiveRoomDao getDao() {
@@ -92,11 +100,23 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
         BeanUtils.copyProperties(liveRoom, roomVo);
         roomVo.setSpeakerName(getSysUser(liveRoom.getSpeakerId()).getRealName());
         roomVo.setLikeNum(getLike(roomUid));
-        roomVo.setLookNum(getLooker(roomUid));
+        roomVo.setLookNum(getNum.apply(this::getOnlineUserCache, roomUid));
         return roomVo;
     }
 
     /**
+     * 校验房间信息,及个人信息
+     *
+     * @param roomUid 房间uid
+     */
+    @Override
+    public RoomVo studentCheckRoomInfo(String roomUid) {
+        //校验学生与房间的关系
+        checkStudentRoom(roomUid, getSysUser());
+        return queryRoomInfo(roomUid);
+    }
+
+    /**
      * 定时任务创建直播间
      */
     @Override
@@ -163,27 +183,33 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
     public String createTempLiveRoom(Map<String, Object> param) {
         //查询主讲人信息
         SysUser sysUser = getSysUser();
-        Date now = new Date();
-        //当前时间有课程则不能开启直播
-        checkTempLive(sysUser.getId());
         String roomTitle = WrapperUtil.toStr(param, "roomTitle", "房间标题不能为空!");
         String liveRemark = WrapperUtil.toStr(param, "liveRemark", "直播间描述不能为空!");
-
-        Long id = sysUser.getId();
+        Integer liveTime = WrapperUtil.toInt(param, "liveTime","请选择直播时长!");
+        Date liveStartTime = new Date();
+        Date liveEndTime = DateUtil.addMinutes(liveStartTime, liveTime);
+        Long teacherId = sysUser.getId();
+        //当前时间有课程则不能开启直播
+        boolean check =  courseScheduleService.checkTeacherCourseTime(teacherId,liveStartTime,liveEndTime);
+        if (check) {
+            //如果当前时间和课程时间有交集则不能开启临时直播
+            throw new BizException("当前选择的时间段有课无法开启直播");
+        }
         RoomTypeEnum en = RoomTypeEnum.TEMP;
-        String roomUid = GenRoomUid.apply(id, en);
+        String roomUid = GenRoomUid.apply(teacherId, en);
         LiveRoom room = new LiveRoom();
         room.setCourseGroupId(-1L);
         room.setCourseId(-1L);
         room.setRoomUid(roomUid);
         room.setRoomTitle(roomTitle);
         room.setLiveRemark(liveRemark);
-        room.setSpeakerId(id);
-        room.setLiveStartTime(now);
+        room.setSpeakerId(teacherId);
+        room.setLiveStartTime(liveStartTime);
+        room.setLiveEndTime(liveEndTime);
         room.setLiveState(0);
         room.setRoomState(0);
-        room.setCreatedBy(id);
-        room.setCreatedTime(now);
+        room.setCreatedBy(teacherId);
+        room.setCreatedTime(liveStartTime);
         room.setType(en.getCode());
         this.save(room);
         log.info("createTempLiveRoom>>>>>>room:{}", room.getRoomUid());
@@ -193,27 +219,6 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
     }
 
     /**
-     * 校验开启临时直播间是否会有课程冲突
-     */
-    @SuppressWarnings("unchecked")
-    private void checkTempLive(Long teacherId) {
-        //查询当前未锁的最近的一节课
-        CourseSchedule course = courseScheduleService.getOne(Wrappers.<CourseSchedule>lambdaQuery()
-                .eq(CourseSchedule::getTeacherId, teacherId)
-                .eq(CourseSchedule::getLock, 0)
-                .orderByDesc(CourseSchedule::getStartTime));
-        if (Objects.isNull(course)) {
-            return;
-        }
-        Date now = new Date();
-        Boolean check = WrapperUtil.inInterSection(now, now, course.getStartTime(), course.getEndTime(), false);
-        if (check) {
-            //如果当前时间和课程时间有交集则不能开启临时直播
-            throw new BizException("当前有课无法开启直播");
-        }
-    }
-
-    /**
      * 去融云创建房间及创建房间缓存信息-直播间
      */
     private void createLiveRoomInfo(LiveRoom room) {
@@ -307,30 +312,35 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
                 //删除房间
                 destroyLiveRoom(room.getRoomUid());
                 //查询老师分润表
-                CourseScheduleTeacherSalary salary = courseScheduleTeacherSalaryService.getOne(Wrappers.<CourseScheduleTeacherSalary>lambdaQuery()
+                List<CourseScheduleTeacherSalary> salaryList = courseScheduleTeacherSalaryService.list(Wrappers.<CourseScheduleTeacherSalary>lambdaQuery()
                         .eq(CourseScheduleTeacherSalary::getCourseScheduleId, room.getCourseId())
                 );
-                if (Objects.isNull(salary)) {
-                    return;
-                }
-                //查询该学生及课程id 对应的支付订单号
-                CourseScheduleStudentPayment payment = courseScheduleStudentPaymentService.getOne(Wrappers.<CourseScheduleStudentPayment>lambdaQuery()
-                        .eq(CourseScheduleStudentPayment::getCourseId, room.getCourseId())
-                        .eq(CourseScheduleStudentPayment::getUserId, salary.getStudentId())
-                );
-                if (Objects.isNull(payment)) {
+                if (CollectionUtils.isEmpty(salaryList)) {
                     return;
                 }
-                //获取教师课酬写入到金额变更表
-                UserAccountRecordDto userAccountRecord = new UserAccountRecordDto();
-                userAccountRecord.setUserId(room.getSpeakerId());
-                userAccountRecord.setInOrOut(InOrOutEnum.IN);
-                userAccountRecord.setBizType(AccountBizTypeEnum.LIVE);
-                userAccountRecord.setBizId(room.getCourseId());
-                userAccountRecord.setBizName(room.getRoomTitle());
-                userAccountRecord.setTransAmount(salary.getActualSalary());//扣除手续费后所得金额
-                userAccountRecord.setOrderNo(payment.getOrderNo());
-                userAccountService.accountChange(userAccountRecord);
+                salaryList.forEach(salary -> {
+                    //查询该学生及课程id 对应的支付订单号
+                    CourseScheduleStudentPayment payment = courseScheduleStudentPaymentService.getOne(Wrappers.<CourseScheduleStudentPayment>lambdaQuery()
+                            .eq(CourseScheduleStudentPayment::getCourseId, room.getCourseId())
+                            .eq(CourseScheduleStudentPayment::getUserId, salary.getStudentId())
+                    );
+                    if (Objects.isNull(payment)) {
+                        return;
+                    }
+                    //获取教师课酬写入到金额变更表
+                    UserAccountRecordDto userAccountRecord = new UserAccountRecordDto();
+                    userAccountRecord.setUserId(room.getSpeakerId());
+                    userAccountRecord.setInOrOut(InOrOutEnum.IN);
+                    userAccountRecord.setBizType(AccountBizTypeEnum.LIVE);
+                    userAccountRecord.setBizId(room.getCourseId());
+                    userAccountRecord.setBizName(room.getRoomTitle());
+                    userAccountRecord.setTransAmount(salary.getActualSalary());//扣除手续费后所得金额
+                    userAccountRecord.setOrderNo(payment.getOrderNo());
+                    userAccountService.accountChange(userAccountRecord);
+                    //修改教师课酬状态-已结算
+                    salary.setStatus(TeacherSalaryEnum.COMPLETE.getCode());
+                    courseScheduleTeacherSalaryService.updateById(salary);
+                });
             }
         });
     }
@@ -396,20 +406,17 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
      * @param roomId 房间Uid
      */
     private void destroyLiveRoom(String roomId) {
-        //删除服务器房间
-        List<String> deleteRoomIds = new ArrayList<String>() {{
-            add(roomId);
-        }};
-        IMApiResultInfo resultInfo;
         try {
-            resultInfo = imHelper.deleteChrm(deleteRoomIds);
+            //删除服务器房间
+            List<String> deleteRoomIds = Lists.newArrayList(roomId);
+            IMApiResultInfo resultInfo = imHelper.deleteChrm(deleteRoomIds);
+            if (!resultInfo.isSuccess()) {
+                log.error("destroyLiveRoom error" + resultInfo.getErrorMessage());
+            }
+            log.info("destroyLiveRoom success: {}", roomId);
         } catch (Exception e) {
-            throw new BizException("关闭聊天室失败!" + e.getMessage());
+            log.error("destroyLiveRoom error" + e.getMessage());
         }
-        if (!resultInfo.isSuccess()) {
-            throw new BizException("关闭聊天室失败!" + resultInfo.getErrorMessage());
-        }
-        log.info("destroyLiveRoom success: {}", roomId);
     }
 
     /**
@@ -431,7 +438,7 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
             //获取当前用户状态变更的时间
             long userStateTime = Optional.ofNullable(user.getTime()).orElse(now.getTime());
             String userIdStr = user.getUserid();
-            RBucket<Long> userStateTimeCache = redissonClient.getBucket(LIVE_TEACHER_LAST_TIME.replace(USER_ID, userIdStr));
+            RBucket<Long> userStateTimeCache = redissonClient.getBucket(LIVE_USER_LAST_TIME.replace(USER_ID, userIdStr));
             if (userStateTimeCache.isExists()) {
                 //缓存的时间比当前传入时间大则放弃这条数据
                 long cacheTime = userStateTimeCache.get();
@@ -441,101 +448,156 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
             }
             //将最新的时间写入缓存
             userStateTimeCache.set(userStateTime, 5L, TimeUnit.MINUTES);
-            //直播间号
-            String roomUid;
-            //根据用户id获取用户当前房间号
-            RBucket<String> roomUidCache = redissonClient.getBucket(LIVE_USER_ROOM.replace(USER_ID, userIdStr));
-            if (!roomUidCache.isExists()) {
+            //获取当前用户所在房间的uid
+            RBucket<String> userRoom = redissonClient.getBucket(LIVE_USER_ROOM.replace(USER_ID, userIdStr));
+            if (!userRoom.isExists()) {
                 return;
             }
-            roomUid = roomUidCache.get();
+            String roomUid = userRoom.get();
             //根据房间号获取房间信息
             RBucket<RoomInfoCache> roomInfoCache = redissonClient.getBucket(LIVE_ROOM_INFO.replace(ROOM_UID, roomUid));
             if (!roomInfoCache.isExists()) {
                 return;
             }
             RoomInfoCache roomInfo = roomInfoCache.get();
-            //用户id
-            Long userId = Long.valueOf(userIdStr);
-            //主讲人
+            // 查询userId是不是主讲人 ,如果是主讲人则返回
             if (roomInfo.getSpeakerId().toString().equals(userIdStr)) {
-                //进退房间写老师考勤表
-                TeacherAttendance teacherAttendance = teacherAttendanceService.getOne(Wrappers.<TeacherAttendance>lambdaQuery()
-                        .eq(TeacherAttendance::getTeacherId, userId)
-                        .eq(TeacherAttendance::getCourseScheduleId, roomInfo.getCourseId()));
-                //主讲人进入房间
-                if (user.getStatus().equals("0")) {
-                    roomInfo.setSpeakerState(0);
-                    roomInfo.setJoinRoomTime(now);
-                    log.info("opsRoom>>>> join roomInfo {}", JSONObject.toJSONString(roomInfo));
-                    roomInfoCache.set(roomInfo);
-                    //查询老师是否有进入过,没有则写老师考勤表的进入时间
-                    if (Objects.isNull(teacherAttendance)) {
-                        setTeacherAttendance(userId, roomInfo.getCourseGroupId(), roomInfo.getCourseId());
-                    }
-                    return;
-                }
-                roomInfo.setSpeakerState(1);
-                roomInfo.setExitRoomTime(now);
-                log.info("opsRoom>>>> exit roomInfo {}", JSONObject.toJSONString(roomInfo));
-                roomInfoCache.set(roomInfo);
-                if (Objects.isNull(teacherAttendance)) {
-                    teacherAttendance = new TeacherAttendance();
-                    teacherAttendance.setTeacherId(userId);
-                    teacherAttendance.setCourseGroupType(CourseScheduleEnum.LIVE.getCode());
-                    teacherAttendance.setCourseGroupId(roomInfo.getCourseGroupId());
-                    teacherAttendance.setCourseScheduleId(roomInfo.getCourseId());
-                    teacherAttendance.setSignInTime(now);
-                    teacherAttendance.setSignOutTime(now);
-                    teacherAttendance.setCreateTime(now);
-                    teacherAttendanceService.save(teacherAttendance);
-                } else {
-                    //修改老师考勤表
-                    teacherAttendance.setSignOutTime(now);
-                    teacherAttendance.setUpdateTime(now);
-                    teacherAttendanceService.updateById(teacherAttendance);
-                }
+                opsSpeaker(roomInfoCache, user, now, userIdStr);
                 return;
             }
-            //观看者只需要接收退出房间的消息 status=0进入房间
+            //这里开始只处理观看者的数据,观看者只接受退出消息 status=0 是进入房间
             if (user.getStatus().equals("0")) {
                 return;
             }
+            //用户id
+            Long userId = Long.valueOf(userIdStr);
             //从房间累计用户信息中查询该用户的信息
-            RMap<Long, RoomUserInfoCache> roomTotalUser = redissonClient.getMap(LIVE_ROOM_TOTAL_USER_LIST.replace(ROOM_UID, roomUid));
+            RMap<Long, String> roomTotalUser = getTotalUserCache(roomUid);
             //该房间未查询到用户数据则不处理
             if (!roomTotalUser.isExists() && !roomTotalUser.containsKey(userId)) {
                 return;
             }
-            //查询到用户数据
-            RoomUserInfoCache userInfo = roomTotalUser.get(userId);
-            //用户突然离线 - 那么融云会发送用户离线消息-此刻就发送退出房间消息给主讲人
-            if (user.getStatus().equals("1")) {
-                ImRoomMessage message = new ImRoomMessage();
-                message.setFromUserId(userId.toString());
-                message.setContent(userId.toString());
-                message.setToChatroomId(roomUid);
-                message.setObjectName(ImRoomMessage.RC_CHATROOM_LEAVE);
-                try {
-                    publishRoomMessage(message);
-                } catch (Exception e) {
-                    log.error("opsRoom>>>>  looker leave error {}", e.getMessage());
-                    log.error("opsRoom>>>>  looker leave error sendMessage {} : userInfo : {}", message, JSONObject.toJSONString(userInfo));
-                }
-                log.info("opsRoom>>>> looker leave userInfo : {}", JSONObject.toJSONString(userInfo));
-            }
-            //记录退出时间 并写入缓存
+            //查询用户数据
+            RoomUserInfoCache userInfo = JSONObject.toJavaObject(JSONObject.parseObject(roomTotalUser.get(userId)), RoomUserInfoCache.class);
             userInfo.setLastOutTime(now);
-            userInfo.setState(1);
-            roomTotalUser.fastPut(userId, userInfo);
-            //todo 写学生考勤表
-
-            log.info("opsRoom>>>> looker userInfo: {}", JSONObject.toJSONString(userInfo));
+            String userJsonStr = JSONObject.toJSONString(userInfo);
+            roomTotalUser.fastPut(userId, userJsonStr);
+            //查询在线人员列表
+            RMap<Long, String> onlineUserInfo = getOnlineUserCache(roomUid);
+            if (!onlineUserInfo.isExists()) {
+                return;
+            }
+            //从在线人员列表删除该人员
+            onlineUserInfo.fastRemove(userId);
+            //学员退出 写学生考勤表
+            StudentAttendance studentAttendance = studentAttendanceService.getOne(Wrappers.<StudentAttendance>lambdaQuery()
+                    .eq(StudentAttendance::getStudentId, userId)
+                    .eq(StudentAttendance::getCourseScheduleId, roomInfo.getCourseId()));
+            if (Objects.nonNull(studentAttendance)) {
+                studentAttendance.setSignOutTime(now);
+                studentAttendanceService.updateById(studentAttendance);
+            }
+            //向直播间发送当前在线人数消息
+            this.sendOnlineUserCount(roomUid, userId, onlineUserInfo.size());
+            log.info("opsRoom>>>> looker userInfo: {}", userJsonStr);
+            //用户离开直播间发送退出房间消息给主讲人
+            ImRoomMessage message = new ImRoomMessage();
+            message.setFromUserId(userId.toString());
+            message.setToChatroomId(roomUid);
+            message.setObjectName(ImRoomMessage.RC_CHATROOM_LEAVE);
+            message.setContent(userId);
+            try {
+                publishRoomMessage(message);
+                log.info("opsRoom>>>> looker RC_CHATROOM_LEAVE : {}", userJsonStr);
+            } catch (Exception e) {
+                log.error("opsRoom>>>>  looker error RC_CHATROOM_LEAVE {}", e.getMessage());
+                log.error("opsRoom>>>>  looker error sendMessage {} : RC_CHATROOM_LEAVE : {}", message, userJsonStr);
+            }
         });
 
     }
 
     /**
+     * 主讲人
+     *
+     * @return true 是主讲人 false 不是主讲人
+     */
+    private void opsSpeaker(RBucket<RoomInfoCache> roomInfoCache, ImUserStateSync user, Date now, String userIdStr) {
+        RoomInfoCache roomInfo = roomInfoCache.get();
+        String roomUid = roomInfo.getRoomUid();
+        //进退房间写老师考勤表
+        TeacherAttendance teacherAttendance = teacherAttendanceService.getOne(Wrappers.<TeacherAttendance>lambdaQuery()
+                .eq(TeacherAttendance::getTeacherId, userIdStr)
+                .eq(TeacherAttendance::getCourseScheduleId, roomInfo.getCourseId()));
+
+        //最后一次进入房间的clientIp
+        RBucket<String> lastClientIp = redissonClient.getBucket(LIVE_USER_LAST_CLIENT_IP.replace(ROOM_UID, roomUid).replace(USER_ID, userIdStr));
+        //主讲人进入房间
+        if (user.getStatus().equals("0")) {
+            roomInfo.setSpeakerState(0);
+            roomInfo.setJoinRoomTime(now);
+            //将本次进入房间的clientIp添加到主讲人最后一次clientIp缓存中
+            if (StringUtils.isNotBlank(user.getClientIp())) {
+                lastClientIp.set(user.getClientIp());
+            }
+            //查询老师是否有进入过放假,没有则写老师考勤表的进入时间
+            if (Objects.isNull(teacherAttendance)) {
+                setTeacherAttendance(Long.parseLong(userIdStr), roomInfo.getCourseGroupId(), roomInfo.getCourseId());
+            }
+            roomInfoCache.set(roomInfo);
+            log.info("opsRoom>>>> join speakerCache {}", JSONObject.toJSONString(roomInfo));
+            return;
+        }
+        //退出房间 - 校验本次退出直播间的clientIp 是不是上次进入房间的clientIp
+        if (StringUtils.isNotBlank(user.getClientIp())) {
+            if (lastClientIp.isExists()) {
+                //如果是上次进入房间的clientIp和本次退出房间的clientIp不相同,则直接忽略
+                if (!user.getClientIp().equals(lastClientIp.get())) {
+                    return;
+                }
+            }
+        }
+        //如果退出时间大于进入时间就无需再次退出-直接返回
+        if (compareDate.apply(roomInfo.getExitRoomTime(), roomInfo.getJoinRoomTime())) {
+            return;
+        }
+
+        roomInfo.setSpeakerState(1);
+        roomInfo.setExitRoomTime(now);
+        if (Objects.isNull(teacherAttendance)) {
+            teacherAttendance = new TeacherAttendance();
+            teacherAttendance.setTeacherId(Long.parseLong(userIdStr));
+            teacherAttendance.setCourseGroupType(CourseScheduleEnum.LIVE.getCode());
+            teacherAttendance.setCourseGroupId(roomInfo.getCourseGroupId());
+            teacherAttendance.setCourseScheduleId(roomInfo.getCourseId());
+            teacherAttendance.setSignInTime(now);
+            teacherAttendance.setSignOutTime(now);
+            teacherAttendance.setCreateTime(now);
+            teacherAttendanceService.save(teacherAttendance);
+        } else {
+            //修改老师考勤表
+            teacherAttendance.setSignOutTime(now);
+            teacherAttendance.setUpdateTime(now);
+            teacherAttendanceService.updateById(teacherAttendance);
+        }
+        log.info("opsRoom>>>> exit speakerCache {}", JSONObject.toJSONString(roomInfo));
+        roomInfoCache.set(roomInfo);
+    }
+
+    /**
+     * 对比时间,2个时间一个为空返回false,否则对比时间大小
+     * <p>- date1 时间1
+     * <p>- date2 时间2
+     */
+    private final BiFunction<Date, Date, Boolean> compareDate = (date1, date2) -> {
+        if (Objects.nonNull(date1) && Objects.nonNull(date2)) {
+            return date1.getTime() > date2.getTime();
+        } else {
+            return false;
+        }
+    };
+
+    /**
      * 同步点赞数量
      *
      * @param roomUid 房间uid
@@ -544,51 +606,62 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
     @Override
     public void syncLike(String roomUid, Integer likeNum) {
         redissonClient.getBucket(LIVE_ROOM_LIKE.replace(ROOM_UID, roomUid)).set(likeNum);
+        //增加房间心跳
+        redissonClient.getBucket(LIVE_ROOM_HEART_BEAT.replace(ROOM_UID, roomUid)).set(new Date());
     }
 
     /**
-     * 进入房间
+     * 主讲人-进入房间
      *
      * @param roomUid 房间uid
-     * @param userId  用户id 主讲人或者用户的id
+     * @param userId  主讲人id
      */
-    public RoomInfoCache joinRoom(String roomUid, Long userId) {
+    public RoomInfoCache speakerJoinRoom(String roomUid, Long userId) {
         //校验房间是否存在
         RBucket<RoomInfoCache> roomInfoCache = redissonClient.getBucket(LIVE_ROOM_INFO.replace(ROOM_UID, roomUid));
         if (!roomInfoCache.isExists()) {
             throw new BizException("直播还未开始!");
         }
         RoomInfoCache roomInfo = roomInfoCache.get();
+        Date now = new Date();
+        //校验进入房间的是否是该直播间的主讲人
+        if (!roomInfo.getSpeakerId().equals(userId)) {
+            throw new BizException("您不是该直播间的主讲人!");
+        }
+        roomInfo.setSpeakerState(0);
+        roomInfo.setJoinRoomTime(now);
+        roomInfoCache.set(roomInfo);
+        //查询老师是否有进入过,没有则写老师考勤表的进入时间
+        setTeacherAttendance(userId, roomInfo.getCourseGroupId(), roomInfo.getCourseId());
         roomInfo.setLikeNum(getLike(roomUid));
-        roomInfo.setLookNum(getLooker(roomUid));
-
+        roomInfo.setLookNum(getNum.apply(this::getOnlineUserCache, roomUid));
         //记录当前用户对应的房间uid
         redissonClient.getBucket(LIVE_USER_ROOM.replace(USER_ID, userId.toString())).set(roomUid, 2L, TimeUnit.DAYS);
+        return roomInfo;
+    }
 
+    /**
+     * 观看者-进入房间
+     *
+     * @param roomUid 房间uid
+     * @param userId  用户id 观看者id
+     */
+    public RoomInfoCache joinRoom(String roomUid, Long userId) {
+        //获取进入房间人员信息
+        SysUser sysUser = getSysUser(userId);
+        //校验信息
+        RBucket<RoomInfoCache> roomInfoCache = checkStudentRoom(roomUid, sysUser);
+        RoomInfoCache roomInfo = roomInfoCache.get();
         Date now = new Date();
-        //进入房间的是主讲人
-        if (roomInfo.getSpeakerId().equals(userId)) {
-            roomInfo.setSpeakerState(0);
-            roomInfo.setJoinRoomTime(now);
-            roomInfoCache.set(roomInfo);
-            //查询老师是否有进入过,没有则写老师考勤表的进入时间
-            setTeacherAttendance(userId, roomInfo.getCourseGroupId(), roomInfo.getCourseId());
-            return roomInfo;
-        }
-        //todo 查询是否是临时直播间,临时直播间可以直接进入教师
-        //todo 校验观看者是否可以进入该房间,查询该学员购买成功则有权限进入该房间
-
-
         //房间累计用户信息-指只要进入到该房间的用户都要记录
-        RMap<Long, RoomUserInfoCache> roomTotalUser = redissonClient.getMap(LIVE_ROOM_TOTAL_USER_LIST.replace(ROOM_UID, roomUid));
+        RMap<Long, String> roomTotalUser = getTotalUserCache(roomUid);
         //判断是否第一次进房间
         RoomUserInfoCache userInfo;
         if (roomTotalUser.containsKey(userId)) {
             //多次进入更新动态进入时间
-            userInfo = roomTotalUser.get(userId);
+            userInfo = JSONObject.toJavaObject(JSONObject.parseObject(roomTotalUser.get(userId)), RoomUserInfoCache.class);
         } else {
             //第一次进该房间 写入用户首次进入时间
-            SysUser sysUser = getSysUser(userId);
             userInfo = new RoomUserInfoCache();
             userInfo.setUserId(sysUser.getId());
             userInfo.setUserName(sysUser.getRealName());
@@ -596,13 +669,51 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
             //查询学生是否有进入过,没有则写学生考勤表的进入时间
             setStudentAttendance(userId, roomInfo.getCourseGroupId(), roomInfo.getCourseId());
         }
-        userInfo.setState(0);//0:在房间 1:不在房间
         userInfo.setDynamicJoinTime(now);
-        roomTotalUser.fastPut(userId, userInfo);
-        log.info("joinRoom>>>> userInfo: {}", JSONObject.toJSONString(userInfo));
+        //用户json信息
+        String userJsonStr = JSONObject.toJSONString(userInfo);
+        //写入人员缓存
+        roomTotalUser.fastPut(userId, userJsonStr);
+        //写入在线人员缓存
+        RMap<Long, String> onlineUserCache = getOnlineUserCache(roomUid);
+        onlineUserCache.fastPut(userId, userJsonStr);
+        log.info("joinRoom>>>> userInfo: {}", userJsonStr);
+        //刷新当前房间的点赞及观看人数信息
+        roomInfo.setLikeNum(getLike(roomUid));
+        roomInfo.setLookNum(getNum.apply(this::getOnlineUserCache, roomUid));
+        roomInfoCache.set(roomInfo);
+        //向直播间发送当前在线人数消息
+        this.sendOnlineUserCount(roomUid, userId, onlineUserCache.size());
+        log.info("join sendOnlineUserCount>>>> param is null   roomUid: {}  fromUserId:{}  count:{}", roomUid, userId, onlineUserCache.size());
+        log.info("joinRoom>>>> userInfo: {}", userJsonStr);
+        //记录当前用户对应的房间uid
+        redissonClient.getBucket(LIVE_USER_ROOM.replace(USER_ID, userId.toString())).set(roomUid, 2L, TimeUnit.DAYS);
         return roomInfo;
     }
 
+    //校验学生与房间的关系
+    private RBucket<RoomInfoCache> checkStudentRoom(String roomUid, SysUser sysUser) {
+        //校验房间是否存在
+        RBucket<RoomInfoCache> roomInfoCache = redissonClient.getBucket(LIVE_ROOM_INFO.replace(ROOM_UID, roomUid));
+        if (!roomInfoCache.isExists()) {
+            throw new BizException("直播还未开始!");
+        }
+        RoomInfoCache roomInfo = roomInfoCache.get();
+        //校验观看者是否可以进入该房间,如果是非临时直播间,则校验是否已经买过课
+        if (!roomInfo.getRoomType().equals(RoomTypeEnum.TEMP.getCode())) {
+            // 查询该学员成功购买课程
+            int count = courseScheduleStudentPaymentService.count(Wrappers.<CourseScheduleStudentPayment>lambdaQuery()
+                    .eq(CourseScheduleStudentPayment::getUserId, sysUser.getId())
+                    .eq(CourseScheduleStudentPayment::getCourseId, roomInfo.getCourseId())
+                    .eq(CourseScheduleStudentPayment::getCourseGroupId, roomInfo.getCourseGroupId())
+                    .eq(CourseScheduleStudentPayment::getCourseType, CourseScheduleEnum.LIVE.getCode()));
+            if (count < 0) {
+                throw new BizException("您还未购买课程!");
+            }
+        }
+        return roomInfoCache;
+    }
+
     /**
      * 查询学生是否有进入过,没有则写学生考勤表的进入时间
      *
@@ -611,12 +722,12 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
      * @param courseId      课程id
      */
     private void setStudentAttendance(Long studentId, Long courseGroupId, Long courseId) {
-        Date now = new Date();
         //写学生第一次进入时间
         StudentAttendance studentAttendance = studentAttendanceService.getOne(Wrappers.<StudentAttendance>lambdaQuery()
                 .eq(StudentAttendance::getStudentId, studentId)
                 .eq(StudentAttendance::getCourseScheduleId, courseId));
         if (Objects.isNull(studentAttendance)) {
+            Date now = new Date();
             studentAttendance = new StudentAttendance();
             studentAttendance.setCourseGroupType(CourseScheduleEnum.LIVE.getCode());
             studentAttendance.setCourseGroupId(courseGroupId);
@@ -653,6 +764,36 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
     }
 
     /**
+     * 向直播间发送当前在线人数消息
+     *
+     * @param roomUid    房间uid
+     * @param fromUserId 发送人id
+     * @param count      人数
+     */
+    private void sendOnlineUserCount(String roomUid, Long fromUserId, Integer count) {
+        //校验传入参数,房间uid和发送人id不能为空
+        if (!WrapperUtil.checkObj(roomUid, fromUserId, count)) {
+            log.info(" sendOnlineUserCount>>>> param is null   roomUid: {}  fromUserId:{}  count:{}", roomUid, fromUserId, count);
+            return;
+        }
+        ImRoomMessage message = new ImRoomMessage();
+        message.setObjectName(ImRoomMessage.MEMBER_COUNT);
+        message.setToChatroomId(roomUid);
+        HashMap<String, Integer> sendMap = new HashMap<>();
+        sendMap.put("count", count);
+        message.setFromUserId(fromUserId.toString());
+        message.setContent(sendMap);
+        //发送消息
+        try {
+            publishRoomMessage(message);
+            log.info("sendOnlineUserCount>>>> message: {}", JSONObject.toJSONString(message));
+        } catch (Exception e) {
+            log.error("sendOnlineUserCount>>>> error {}", e.getMessage());
+            log.error("sendOnlineUserCount>>>> sendMessage {} :", JSONObject.toJSONString(message));
+        }
+    }
+
+    /**
      * 发送消息
      *
      * @param message
@@ -689,26 +830,46 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
      *
      * @param roomUid 直播间uid
      */
-    @Override
-    public List<RoomUserInfoCache> queryRoomUserInfo(String roomUid) {
-        List<RoomUserInfoCache> roomUserInfoVos = queryTotalRoomUserInfo(roomUid);
-        return queryRoomUserInfo(roomUserInfoVos);
+    private List<RoomUserInfoCache> getTotalUserInfo(String roomUid) {
+        RMap<Long, String> roomTotalUser = getTotalUserCache(roomUid);
+        return roomTotalUser.values().parallelStream()
+                .map(a -> JSONObject.toJavaObject(JSONObject.parseObject(a), RoomUserInfoCache.class))
+                .collect(Collectors.toList());
     }
 
-    private List<RoomUserInfoCache> queryRoomUserInfo(List<RoomUserInfoCache> totalUserInfo) {
-        return totalUserInfo.stream()
-                .filter(o -> Objects.nonNull(o.getState()) && o.getState() == 0)
-                .collect(Collectors.toList());
+    /**
+     * 获取直播间所有用户信息缓存
+     *
+     * @param roomUid 直播间uid
+     * @return RMap key:userId value:RoomUserInfoCache -> jsonToString
+     */
+    private RMap<Long, String> getTotalUserCache(String roomUid) {
+        return redissonClient.getMap(LIVE_ROOM_TOTAL_USER_LIST.replace(ROOM_UID, roomUid));
     }
 
-    private List<RoomUserInfoCache> queryTotalRoomUserInfo(String roomUid) {
-        RMap<Long, RoomUserInfoCache> roomTotalUser = redissonClient.getMap(LIVE_ROOM_TOTAL_USER_LIST.replace(ROOM_UID, roomUid));
-        return roomTotalUser.values().stream()
-                .filter(Objects::nonNull)
+    /**
+     * 查询在观看直播的用户信息
+     *
+     * @param roomUid 直播间uid
+     */
+    private List<RoomUserInfoCache> getOnlineUserInfo(String roomUid) {
+        RMap<Long, String> roomTotalUser = getOnlineUserCache(roomUid);
+        return roomTotalUser.values().parallelStream()
+                .map(a -> JSONObject.toJavaObject(JSONObject.parseObject(a), RoomUserInfoCache.class))
                 .collect(Collectors.toList());
     }
 
     /**
+     * 获取直播间在线用户信息缓存
+     *
+     * @param roomUid 直播间uid
+     * @return RMap key:userId value:BaseRoomUserVo -> jsonToString
+     */
+    private RMap<Long, String> getOnlineUserCache(String roomUid) {
+        return redissonClient.getMap(LIVE_ROOM_ONLINE_USER_LIST.replace(ROOM_UID, roomUid));
+    }
+
+    /**
      * 获取房间点赞数
      *
      * @param roomUid 房间UId
@@ -724,18 +885,17 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
     }
 
     /**
-     * 获取房间当前观看人数
+     * 获取房间缓存中的用户数量/观看人数
      *
-     * @param roomUid 房间uid
-     * @return 当前观看人数
+     * <p> func:查询用户数量/观看人数的方法
+     * <p> roomUid :房间uid
+     * <p> return :用户数量/观看人数
      */
-    private int getLooker(String roomUid) {
-        List<RoomUserInfoCache> roomUserInfoCaches = queryRoomUserInfo(roomUid);
-        if (CollectionUtils.isEmpty(roomUserInfoCaches)) {
-            return 0;
-        }
-        return roomUserInfoCaches.size();
-    }
+    private final BiFunction<Function<String, RMap<Long, ?>>, String, Integer> getNum = (func, roomUid) -> Optional.of(roomUid)
+            .map(func)
+            .filter(RMap::isExists)
+            .map(RMap::size)
+            .orElse(0);
 
     /**
      * 方便测试观察房间数据的方法
@@ -743,16 +903,6 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
     public Map<String, Object> test(String roomUid) {
         //result
         Map<String, Object> result = new HashMap<>();
-//        Map<String, Object> param = new HashMap<>();
-//        param.put("day", "05");
-//        param.put("month", "06");
-//        param.put("year", "2022");
-//        param.put("teacherId", "174");
-//        param.put("studentId", 164);
-//        List<CourseCalendarEntity> courseTimeEntities = courseScheduleService.createPracticeCourseCalender(param);
-//        List<CourseCalendarEntity> courseTimeEntities = courseScheduleService.createLiveCourseCalendar(param);
-//        result.put("自动生成课时", courseTimeEntities);
-
         //获取房间信息
         RBucket<RoomInfoCache> speakerCache = redissonClient.getBucket(LIVE_ROOM_INFO.replace(ROOM_UID, roomUid));
         if (speakerCache.isExists()) {
@@ -761,6 +911,14 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
             result.put("房间信息", "房间信息不存在");
         }
 
+        //校验房间心跳是否过期没续租
+        RBucket<Date> lastRoomHeartbeatCache = redissonClient.getBucket(LIVE_ROOM_HEART_BEAT.replace(ROOM_UID, roomUid));
+        if (lastRoomHeartbeatCache.isExists()) {
+            result.put("房间心跳", DateUtil.dateToString(lastRoomHeartbeatCache.get(), DateUtil.EXPANDED_DATE_TIME_FORMAT));
+        } else {
+            result.put("房间心跳", "房间心跳不存在");
+        }
+
         //点赞数
         Object like = redissonClient.getBucket(LIVE_ROOM_LIKE.replace(ROOM_UID, roomUid)).get();
         if (Objects.isNull(like)) {
@@ -770,33 +928,31 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
 
         int totalLook = 0;
         int look = 0;
-        List<RoomUserInfoCache> inRoomUserInfo;
 
         //累计总观看的用户数量
-        List<RoomUserInfoCache> totalUserInfo = queryTotalRoomUserInfo(roomUid);
+        List<RoomUserInfoCache> totalUserInfo = getTotalUserInfo(roomUid);
         if (CollectionUtils.isNotEmpty(totalUserInfo)) {
-            //正在房间观看的用户数据
-            inRoomUserInfo = queryRoomUserInfo(totalUserInfo);
-            if (CollectionUtils.isNotEmpty(inRoomUserInfo)) {
-                look = inRoomUserInfo.size();
-                result.put("正在观看的人员信息", inRoomUserInfo);
-            } else {
-                result.put("正在观看的人员信息", "没有正在观看的人员数据");
-            }
             totalLook = totalUserInfo.size();
             result.put("总人员数据", totalUserInfo);
         } else {
             result.put("总人员数据", "没有人员数据");
         }
-
         result.put("总观看人数", totalLook);
+        //正在房间观看的用户数据
+        List<RoomUserInfoCache> onlineUserInfo = getOnlineUserInfo(roomUid);
+        if (CollectionUtils.isNotEmpty(onlineUserInfo)) {
+            look = onlineUserInfo.size();
+            result.put("正在观看的人员信息", onlineUserInfo);
+        } else {
+            result.put("正在观看的人员信息", "没有正在观看的人员数据");
+        }
         result.put("实时观看数", look);
         return result;
     }
 
     @Override
-    public LiveRoom getliveingRoomBySpeakerId(Long speakerId) {
-        return baseMapper.getliveingRoomBySpeakerId(speakerId);
+    public LiveRoom getLiveInRoomBySpeakerId(Long speakerId) {
+        return baseMapper.getLiveInRoomBySpeakerId(speakerId);
     }
 }
 

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java

@@ -315,7 +315,7 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
         if (null == data) {
             return HttpResponseResult.failed("未查询到用户信息");
         }
-        LiveRoom liveRoom = liveRoomService.getliveingRoomBySpeakerId(teacherId);
+        LiveRoom liveRoom = liveRoomService.getLiveInRoomBySpeakerId(teacherId);
         if (null != liveRoom) {
             data.setRoomUid(liveRoom.getRoomUid());
             data.setLiveing(YesOrNoEnum.YES);

+ 29 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserAccountServiceImpl.java

@@ -1,10 +1,16 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.biz.dal.dto.UserAccountRecordDto;
 import com.yonge.cooleshow.biz.dal.dto.req.TotalReq;
 import com.yonge.cooleshow.biz.dal.entity.UserAccountRecord;
+import com.yonge.cooleshow.biz.dal.entity.UserOrder;
+import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
+import com.yonge.cooleshow.biz.dal.service.UserOrderService;
+import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.cooleshow.biz.dal.enums.FrozenTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.UserAccountRecordService;
@@ -13,6 +19,8 @@ import com.yonge.cooleshow.biz.dal.vo.res.AccountTotal;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.exception.BizException;
 import org.redisson.api.RedissonClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.yonge.cooleshow.biz.dal.entity.UserAccount;
@@ -30,10 +38,14 @@ import java.util.concurrent.TimeUnit;
 
 @Service
 public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAccount> implements UserAccountService {
+    private final static Logger log = LoggerFactory.getLogger(UserAccountServiceImpl.class);
+
     @Autowired
     private UserAccountRecordService userAccountRecordService;
     @Autowired
     private RedissonClient redissonClient;
+    @Autowired
+    private UserOrderService orderService;
 
     @Override
     public UserAccountVo detail(Long id) {
@@ -118,18 +130,31 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
 
     private HttpResponseResult<UserAccountRecord> doAccountChange(UserAccountRecordDto accountRecordDto) {
         UserAccountVo detail = detail(accountRecordDto.getUserId());
+        //收入要校验金额
+        if (InOrOutEnum.IN.equals(accountRecordDto.getInOrOut())) {
+            UserOrder userOrder = orderService.getOne(Wrappers.<UserOrder>lambdaQuery()
+                    .eq(UserOrder::getOrderNo, accountRecordDto.getOrderNo()));
+            BigDecimal totalTransAmount = baseMapper.totalTransAmount(accountRecordDto);
+            if (null == totalTransAmount) {
+                totalTransAmount = BigDecimal.ZERO;
+            }
+            //金额校验失败,入账为冻结金额
+            if (null == userOrder || totalTransAmount.add(accountRecordDto.getTransAmount()).compareTo(userOrder.getActualPrice()) > 0) {
+                log.error("账户变更失败,param is " + JSONObject.toJSONString(accountRecordDto));
+                accountRecordDto.setErrFlag(1);
+                accountRecordDto.setErrMsg("账户变更异常,订单入账总金额大于购买金额,订单号:" + accountRecordDto.getOrderNo());
+                accountRecordDto.setFrozenType(FrozenTypeEnum.FROZEN);
+            }
+        }
 
         if (FrozenTypeEnum.FROZEN.equals(accountRecordDto.getFrozenType())) {
             //校验冻结金额
-
             baseMapper.frozenChangeAccount(accountRecordDto.getUserId(), accountRecordDto.getTransAmount(), accountRecordDto.getInOrOut().getCode());
         } else if (FrozenTypeEnum.FROZEN_DEDUCT.equals(accountRecordDto.getFrozenType())) {
             baseMapper.frozenDeductChangeAccount(accountRecordDto.getUserId(), accountRecordDto.getTransAmount(), accountRecordDto.getInOrOut().getCode());
         } else if (FrozenTypeEnum.FROZEN_BACK.equals(accountRecordDto.getFrozenType())) {
             baseMapper.frozenBackChangeAccount(accountRecordDto.getUserId(), accountRecordDto.getTransAmount(), accountRecordDto.getInOrOut().getCode());
         } else {
-
-
             baseMapper.changeAccount(accountRecordDto.getUserId(), accountRecordDto.getTransAmount(), accountRecordDto.getInOrOut().getCode());
         }
 
@@ -141,6 +166,7 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
             //插入账户变更记录
             accountRecordDto.setAccountId(accountRecordDto.getUserId());
             accountRecordDto.setAccountBalance(detail.getAmountUsable());
+
             userAccountRecordService.save(accountRecordDto);
         }
         return HttpResponseResult.succeed(accountRecordDto);

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserWithdrawalServiceImpl.java

@@ -83,7 +83,7 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
     public IPage<UserWithdrawalVo> selectPage(IPage<UserWithdrawalVo> page, TeacherWithdrawalSearch query) {
         List<UserWithdrawalVo> withdrawalVoList = baseMapper.selectPage(page, query);
         withdrawalVoList.forEach(o -> {
-            if(AuthStatusEnum.DOING.equals(o.getAuthStatus())){
+            if(AuthStatusEnum.DOING.equals(o.getAuthStatus()) || TradeStatusEnum.pending.equals(o.getTradeStatus())){
                 o.setWithdrawStatus("DOING");
             }else if(TradeStatusEnum.succeeded.equals(o.getTradeStatus())){
                 o.setWithdrawStatus("SUCCESS");

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/support/IMHelper.java

@@ -429,6 +429,7 @@ public class IMHelper {
         log.info("publish msg: {}", msgStr);
         sb.append("&objectName=").append(URLEncoder.encode(message.getObjectName(), UTF8));
         sb.append("&content=").append(URLEncoder.encode(msgStr, UTF8));
+        sb.append("&isIncludeSender=1");
 
         String body = sb.toString();
         if (body.indexOf("&") == 0) {

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserOrderRefundVo.java

@@ -19,7 +19,7 @@ public class UserOrderRefundVo extends UserOrderRefund{
     @TableField(value = "order_name_")
     private String orderName;
 
-    @ApiModelProperty("订单类型:  VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播")
+    @ApiModelProperty("订单类型: 学生端( VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ) 老师端(PINAO_ROOM、琴房时长)")
     @TableField(value = "order_type_")
     private OrderTypeEnum orderType;
 

+ 3 - 3
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -53,7 +53,7 @@
                 sum(if(a.end_time_ &lt;= now(),1,0)) as expTime,
                 sum(if(a.end_time_ &gt; now(),1,0)) as unExpTime
             from course_schedule a
-            where a.lock_ = 0 and a.type_ = 'PRACTICE'
+            where a.lock_ = 0 and a.type_ in ('PRACTICE','PIANO_ROOM_CLASS')
             <if test="userId != null and userId != ''">
                 and a.teacher_id_ = #{userId}
             </if>
@@ -66,7 +66,7 @@
                 avg (b.score_) as starGrade
             from course_schedule a
             join course_schedule_replied b on a.id_ = b.course_schedule_id_
-            where a.lock_ = 0 and a.type_ = 'PRACTICE' and b.score_ is not null
+            where a.lock_ = 0 and a.type_ in ('PRACTICE','PIANO_ROOM_CLASS') and b.score_ is not null
             <if test="userId != null and userId != ''">
                 and a.teacher_id_ = #{userId}
             </if>
@@ -85,7 +85,7 @@
             sum(if(b.end_time_ &gt; now(),1,0)) as unfinshHours
         from student t
         left join course_schedule_student_payment a on t.user_id_ = a.user_id_
-        left join course_schedule b on a.course_id_ = b.id_ and b.lock_ = 0 and b.type_ = 'PRACTICE'
+        left join course_schedule b on a.course_id_ = b.id_ and b.lock_ = 0 and b.type_ in ('PRACTICE','PIANO_ROOM_CLASS')
         <where>
             <if test="userId != null and userId != ''">
                 and t.user_id_ = #{userId}

+ 1 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/LiveRoomMapper.xml

@@ -40,7 +40,7 @@
         </foreach>
     </insert>
 
-    <select id="getliveingRoomBySpeakerId" resultType="com.yonge.cooleshow.biz.dal.entity.LiveRoom">
+    <select id="getLiveInRoomBySpeakerId" resultType="com.yonge.cooleshow.biz.dal.entity.LiveRoom">
         select * from live_room
         where speaker_id_ = #{speakerId} and live_state_ = 1 and room_state_ = 0
         order by live_start_time_ desc limit 1

+ 3 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/PianoRoomSettingsMapper.xml

@@ -44,6 +44,9 @@
         FROM piano_room_settings t
         LEFT JOIN sys_user u on t.update_by_ = u.id_
         where t.del_flag_ = 0
+        <if test="param.status != null">
+            and t.status_ = #{param.status}
+        </if>
     </sql>
 
     <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.vo.PianoRoomSettingsVo">

+ 19 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserAccountMapper.xml

@@ -138,4 +138,23 @@
         </if>
         order by t.sys_day_ymd_
     </select>
+
+    <select id="totalTransAmount" resultType="java.math.BigDecimal">
+        sleect sum(trans_amount_) from user_cash_account_record
+        <where>
+
+            <if test="param.accountId != null">
+                and account_id_ = #{param.accountId}
+            </if>
+            <if test="param.inOrOut != null">
+                and in_or_out_ = #{param.inOrOut}
+            </if>
+            <if test="param.orderNo != null and param.orderNo != ''">
+                and order_no_ = #{param.orderNo}
+            </if>
+            <if test="param.bizType != null">
+                and biz_type_ = #{param.bizType}
+            </if>
+        </where>
+    </select>
 </mapper>

+ 49 - 24
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserAccountRecordMapper.xml

@@ -10,7 +10,6 @@
         <result column="biz_type_" property="bizType" />
         <result column="biz_id_" property="bizId" />
         <result column="biz_name_" property="bizName" />
-        <result column="order_no_" property="orderNo" />
         <result column="create_time_" property="createTime" />
     </resultMap>
 
@@ -24,15 +23,30 @@
         , t.biz_type_ as bizType
         , t.biz_id_ as bizId
         , t.biz_name_ as bizName
-        , t.order_no_ as orderNo
         , t.create_time_ as createTime
         </sql>
 
     <select id="detail" resultType="com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo">
         SELECT
             <include refid="baseColumns"/>
-        FROM user_cash_account_record t
-        where t.id_ = #{id}
+        FROM (
+            select
+                max(t.id_) as id_,
+                t.account_id_,
+                sum(t.trans_amount_) as trans_amount_,
+                if(t.in_or_out_ = 'OUT', min(t.account_balance_), max(t.account_balance_)) as account_balance_,
+                t.in_or_out_,
+                t.biz_type_,
+                t.biz_id_,
+                t.biz_name_,
+                max(t.create_time_) as create_time_
+            from user_cash_account_record t
+            where exists(
+                select 1 from user_cash_account_record t1
+                where t1.id_ = #{id} and t1.biz_id_ = t.biz_id_ and t1.biz_type_ = t.biz_type_
+            )
+            group by t.account_id_,t.in_or_out_,t.biz_type_,biz_id_,biz_name_
+        ) t
     </select>
 
     <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo">
@@ -41,25 +55,38 @@
             DATE_FORMAT(t.create_time_,'%m-%d') as timeDay,
             a.start_time_ as startTime,
             a.end_time_ as endTime
-        FROM user_cash_account_record t
+        FROM (
+            select
+                max(t.id_) as id_,
+                t.account_id_,
+                sum(t.trans_amount_) as trans_amount_,
+                if(t.in_or_out_ = 'OUT', min(t.account_balance_), max(t.account_balance_)) as account_balance_,
+                t.in_or_out_,
+                t.biz_type_,
+                t.biz_id_,
+                t.biz_name_,
+                max(t.create_time_) as create_time_
+            from user_cash_account_record t
+            <where>
+                <if test="null != param.userId">
+                    AND t.account_id_ = #{param.userId}
+                </if>
+                <if test="null != param.inOrOut">
+                    AND t.in_or_out_ = #{param.inOrOut}
+                </if>
+                <if test="null != param.bizType">
+                    AND t.biz_type_ = #{param.bizType}
+                </if>
+                <if test="param.startTime !=null">
+                    <![CDATA[AND t.create_time_ >= #{param.startTime} ]]>
+                </if>
+                <if test="param.endTime !=null">
+                    <![CDATA[AND t.create_time_ < #{param.endTime} ]]>
+                </if>
+            </where>
+            group by t.account_id_,t.in_or_out_,t.biz_type_,biz_id_,biz_name_
+        ) t
         left join course_schedule a on t.biz_id_ = a.id_ and t.biz_type_ in ('PRACTICE','LIVE')
-        <where>
-            <if test="null != param.userId">
-                AND t.account_id_ = #{param.userId}
-            </if>
-            <if test="null != param.inOrOut">
-                AND t.in_or_out_ = #{param.inOrOut}
-            </if>
-            <if test="null != param.bizType">
-                AND t.biz_type_ = #{param.bizType}
-            </if>
-            <if test="param.startTime !=null">
-                <![CDATA[AND t.create_time_ >= #{param.startTime} ]]>
-            </if>
-            <if test="param.endTime !=null">
-                <![CDATA[AND t.create_time_ < #{param.endTime} ]]>
-            </if>
-        </where>
         order by t.create_time_ desc
     </select>
 
@@ -71,7 +98,6 @@
     </select>
 
     <select id="selectTodayTeacherEarning" resultType="com.yonge.cooleshow.biz.dal.vo.TeacherEarningVo">
-
         select
             su.id_ as teacherId,
             su.phone_ as teacherPhone,
@@ -79,7 +105,6 @@
         from user_cash_account_record ucar
         left join sys_user su on ucar.account_id_ = su.id_
             where ucar.create_time_ > date_format(now(),'%Y-%m-%d')
-
         group by su.id_, su.phone_
     </select>
 </mapper>

+ 2 - 2
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserWithdrawalMapper.xml

@@ -120,10 +120,10 @@
                 AND t.trans_no_ LIKE CONCAT('%', #{transNo}, '%')
             </if>
             <if test="param.startTime !=null">
-                <![CDATA[AND t.create_time_ >= #{param.startTime} ]]>
+                <![CDATA[AND t.auth_time_ >= #{param.startTime} ]]>
             </if>
             <if test="param.endTime !=null">
-                <![CDATA[AND t.create_time_ < #{param.endTime} ]]>
+                <![CDATA[AND t.auth_time_ < #{param.endTime} ]]>
             </if>
         </where>
         order by t.create_time_ desc

+ 8 - 34
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/StudentLiveRoomController.java

@@ -44,22 +44,14 @@ public class StudentLiveRoomController extends BaseController {
         return succeed(liveRoomService.queryRoomInfo(roomUid));
     }
 
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "roomTitle", dataType = "String", value = "房间标题"),
-            @ApiImplicitParam(name = "liveRemark", dataType = "String", value = "直播内容/最多200个字"),
-    })
-    @ApiOperation("创建临时房间-直播间")
-    @PostMapping("/createTempLiveRoom")
-    public HttpResponseResult<String> createTempLiveRoom(@RequestBody Map<String, Object> param) {
-        return succeed(liveRoomService.createTempLiveRoom(param));
-    }
-
-    @ApiOperation("同步点赞数量")
-    @GetMapping("/syncLike")
-    public HttpResponseResult<Object> syncLike(@ApiParam(value = "房间uid", required = true) String roomUid,
-                                       @ApiParam(value = "点赞数", required = true) Integer likeNum) {
-        liveRoomService.syncLike(roomUid, likeNum);
-        return succeed();
+    /**
+     * 校验房间信息,及个人信息
+     *
+     * @param roomUid 房间uid
+     */
+    @GetMapping("/studentCheckRoomInfo")
+    public HttpResponseResult<RoomVo> studentCheckRoomInfo(@RequestParam("roomUid") String roomUid) {
+        return succeed(liveRoomService.studentCheckRoomInfo(roomUid));
     }
 
     @ApiOperation("进入房间")
@@ -68,24 +60,6 @@ public class StudentLiveRoomController extends BaseController {
         return succeed(liveRoomService.joinRoom(roomUid, userId));
     }
 
-    @ApiOperation("定时任务-创建房间-直播间")
-    @GetMapping("/createCourseLiveRoom")
-    public void createCourseLiveRoom() {
-        liveRoomService.createCourseLiveRoom();
-    }
-
-    @ApiOperation("定时任务-销毁房间-直播间")
-    @GetMapping("/destroyExpiredLiveRoom")
-    public void destroyExpiredLiveRoom() {
-        liveRoomService.destroyExpiredLiveRoom();
-    }
-
-    @ApiOperation("定时任务-销毁房间-直播间-陪练课")
-    @GetMapping("/destroyExpiredPracticeRoom")
-    public void destroyExpiredPracticeRoom() {
-        liveRoomService.destroyExpiredPracticeRoom();
-    }
-
     /**
      * 同步融云用户状态变更
      *

+ 2 - 0
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/PianoRoomSettingsController.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.teacher.controller;
 
 import com.yonge.cooleshow.biz.dal.dto.search.PianoRoomSettingsSearch;
+import com.yonge.cooleshow.biz.dal.enums.YesOrNoEnum;
 import com.yonge.cooleshow.biz.dal.service.PianoRoomSettingsService;
 import com.yonge.cooleshow.biz.dal.vo.PianoRoomSettingsVo;
 import com.yonge.cooleshow.common.controller.BaseController;
@@ -32,6 +33,7 @@ public class PianoRoomSettingsController extends BaseController {
     @PostMapping("/list")
     @ApiOperation(value = "查询列表")
     public HttpResponseResult<List<PianoRoomSettingsVo>> list(@RequestBody PianoRoomSettingsSearch query) {
+        query.setStatus(YesOrNoEnum.YES.getCode());
         List<PianoRoomSettingsVo> list = pianoRoomSettingsService.selectList(query);
         return succeed(list);
     }

+ 4 - 3
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherLiveRoomController.java

@@ -47,6 +47,7 @@ public class TeacherLiveRoomController extends BaseController {
     @ApiImplicitParams({
             @ApiImplicitParam(name = "roomTitle", dataType = "String", value = "房间标题"),
             @ApiImplicitParam(name = "liveRemark", dataType = "String", value = "直播内容/最多200个字"),
+            @ApiImplicitParam(name = "liveTime", dataType = "Integer", value = "直播时长"),
     })
     @ApiOperation("创建临时房间-直播间")
     @PostMapping("/createTempLiveRoom")
@@ -63,9 +64,9 @@ public class TeacherLiveRoomController extends BaseController {
     }
 
     @ApiOperation("进入房间")
-    @GetMapping(value = "/joinRoom")
-    public HttpResponseResult<RoomInfoCache> joinRoom(String roomUid, Long userId) {
-        return succeed(liveRoomService.joinRoom(roomUid, userId));
+    @GetMapping(value = "/speakerJoinRoom")
+    public HttpResponseResult<RoomInfoCache> speakerJoinRoom(String roomUid, Long userId) {
+        return succeed(liveRoomService.speakerJoinRoom(roomUid, userId));
     }
 
     @ApiOperation("定时任务-创建房间-直播间")

+ 5 - 5
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/task/TaskController.java

@@ -69,9 +69,9 @@ public class TaskController extends BaseController {
         return HttpResponseResult.succeed();
     }
 
-    @GetMapping("/teacherSalary")
-    public HttpResponseResult<Object> teacherSalary() {
-        scheduleService.teacherSalaryTask();
-        return HttpResponseResult.succeed();
-    }
+//    @GetMapping("/teacherSalary")
+//    public HttpResponseResult<Object> teacherSalary() {
+//        scheduleService.teacherSalaryTask();
+//        return HttpResponseResult.succeed();
+//    }
 }

+ 26 - 0
cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/MusicSheetController.java

@@ -141,4 +141,30 @@ public class MusicSheetController extends BaseController {
         musicSheetService.saveMusicSheet(musicSheetDto,sysUser.getId());
         return succeed("新增曲谱成功");
     }
+
+
+
+    @ApiOperation(value = "修改", httpMethod="POST", consumes="application/json", produces="application/json")
+    @PostMapping(value="/update", consumes="application/json", produces="application/json")
+    public HttpResponseResult<Object> update(@Valid @RequestBody MusicSheetDto musicSheet) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null  || sysUser.getId() == null) {
+            return failed("用户信息获取失败");
+        }
+        if (musicSheet.getId()==null){
+            return failed("缺少ID");
+        }
+
+        musicSheet.setUpdateBy(sysUser.getId());
+        musicSheet.setUpdateTime(new Date());
+        musicSheet.setSubmitAuditTime(new Date());
+        musicSheet.setAuditStatus(AuthStatusEnum.DOING);
+        musicSheet.setUpdateBy(sysUser.getId());
+        musicSheet.setUpdateTime(new Date());
+        if ( musicSheetService.saveMusicSheet(musicSheet,sysUser.getId())){
+            return succeed("修改成功");
+        } else {
+            return failed("修改失败");
+        }
+    }
 }

+ 0 - 2
cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/WebSiteController.java

@@ -27,8 +27,6 @@ import java.util.List;
 @Api(value = "官网", tags = "官网")
 public class WebSiteController extends BaseController {
     @Autowired
-    private TeacherService teacherService;
-    @Autowired
     private SysUserFeignService sysUserFeignService;
 
     @ApiOperation(value = "切换用户类型")

+ 34 - 0
cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/open/OpenWebSiteController.java

@@ -0,0 +1,34 @@
+package com.yonge.cooleshow.website.controller.open;
+
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+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.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/open/openWebsite")
+@Api(value = "官网", tags = "官网")
+public class OpenWebSiteController extends BaseController {
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @ApiOperation(value = "判断注册状态 true 已注册 false 未注册")
+    @GetMapping("/checkRegister")
+    public HttpResponseResult<Boolean> checkRegister(
+            @ApiParam(value = "userType", required = true) @RequestParam("userType") String userType,
+            @ApiParam(value = "phone", required = true) @RequestParam("phone") String phone) {
+        SysUser sysUser = sysUserFeignService.queryUserByMobile(phone);
+        if (null == sysUser || !sysUser.getUserType().contains(userType)) {
+            return HttpResponseResult.succeed(false);
+        }
+        return HttpResponseResult.succeed(true);
+    }
+}

+ 3 - 1
toolset/toolset-base/src/main/java/com/yonge/toolset/base/page/QueryInfo.java

@@ -1,10 +1,12 @@
 package com.yonge.toolset.base.page;
 
 
+import java.io.Serializable;
+
 /**
  * 查询对象基类
  */
-public class QueryInfo {
+public class QueryInfo implements Serializable {
 	/**
 	 * 默认当前页码
 	 */