Browse Source

Merge remote-tracking branch 'origin/master'

zouxuan 3 years ago
parent
commit
33e2a5328d
100 changed files with 1625 additions and 621 deletions
  1. 2 2
      audio-analysis/src/main/java/com/yonge/netty/server/handler/NettyServerHandler.java
  2. 1 1
      audio-analysis/src/main/resources/logback-spring.xml
  3. 16 2
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/TeacherFeignService.java
  4. 14 4
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/TeacherFeignServiceFallback.java
  5. 1 1
      cooleshow-bbs/src/main/resources/logback-spring.xml
  6. 1 1
      cooleshow-cms/src/main/resources/logback-spring.xml
  7. 4 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/constant/AppConstant.java
  8. 0 6
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/constant/SysConfigConstant.java
  9. 115 112
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/controller/BaseController.java
  10. 1 1
      cooleshow-gateway/gateway-web/src/main/resources/logback-spring.xml
  11. 4 2
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/SmsHomeAdvertiseController.java
  12. 4 1
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderReturnApplyServiceImpl.java
  13. 1 0
      cooleshow-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/enums/OrderCacheEnum.java
  14. 1 1
      cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/UserOrderPaymentMapper.java
  15. 2 0
      cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/UserOrderRefundMapper.java
  16. 11 0
      cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/UserOrderRefund.java
  17. 1 1
      cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/UserOrderPaymentMapper.xml
  18. 25 3
      cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/UserOrderRefundMapper.xml
  19. 17 1
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/component/CancelOrderReceiver.java
  20. 46 4
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderController.java
  21. 28 9
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/PaymentController.java
  22. 2 2
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/UserOrderPaymentService.java
  23. 1 1
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/HomeServiceImpl.java
  24. 58 9
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java
  25. 3 3
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/UserOrderPaymentServiceImpl.java
  26. 1 1
      cooleshow-mall/mall-portal/src/main/resources/config/mybatis/PortalOrderDao.xml
  27. 18 0
      cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/CreateCourseLiveRoomTask.java
  28. 22 0
      cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/DestroyExpiredLiveRoomTask.java
  29. 22 22
      cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/TeacherSalaryTask.java
  30. 3 2
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/UserOrderClient.java
  31. 1 1
      cooleshow-user/user-admin/src/main/resources/logback-spring.xml
  32. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleDao.java
  33. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleRepliedDao.java
  34. 13 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicSheetDao.java
  35. 19 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderRefundReq.java
  36. 26 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MusicAlbumSearch.java
  37. 3 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImRoomMessage.java
  38. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/LiveRoomVideo.java
  39. 13 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicAlbum.java
  40. 23 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/StudentTotal.java
  41. 23 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TeacherTotal.java
  42. 1 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/CourseScheduleEnum.java
  43. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/TeacherSalaryEnum.java
  44. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleService.java
  45. 11 11
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/LiveRoomService.java
  46. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/LiveRoomVideoService.java
  47. 16 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetService.java
  48. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderPaymentService.java
  49. 9 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderRefundService.java
  50. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderService.java
  51. 5 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  52. 93 32
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  53. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/HomeServiceImpl.java
  54. 87 125
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/LiveRoomServiceImpl.java
  55. 14 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/LiveRoomVideoServiceImpl.java
  56. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicAlbumServiceImpl.java
  57. 13 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  58. 3 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java
  59. 49 23
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentTotalServiceImpl.java
  60. 13 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherFreeTimeServiceImpl.java
  61. 8 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java
  62. 45 22
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherTotalServiceImpl.java
  63. 23 35
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserAccountServiceImpl.java
  64. 42 38
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderPaymentServiceImpl.java
  65. 88 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderRefundServiceImpl.java
  66. 31 20
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  67. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserWithdrawalServiceImpl.java
  68. 23 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/AlbumDetailVo.java
  69. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MusicAlbumVo.java
  70. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MusicSheetDetailVo.java
  71. 31 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/StudentHomeVo.java
  72. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/StudentVo.java
  73. 33 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherHomeVo.java
  74. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherVo.java
  75. 36 4
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  76. 6 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleRepliedMapper.xml
  77. 1 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/HomeMapper.xml
  78. 28 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicAlbumMapper.xml
  79. 48 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml
  80. 4 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/StudentMapper.xml
  81. 4 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherAuthMusicianRecordMapper.xml
  82. 2 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  83. 3 3
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherStyleVideoMapper.xml
  84. 34 4
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderMapper.xml
  85. 4 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/VideoLessonGroupMapper.xml
  86. 1 1
      cooleshow-user/user-classroom/src/main/resources/logback-spring.xml
  87. 11 0
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/MusicAlbumController.java
  88. 20 0
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/MusicSheetController.java
  89. 13 0
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/SysMusicCompareRecordController.java
  90. 14 14
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java
  91. 3 3
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderRefundController.java
  92. 1 1
      cooleshow-user/user-student/src/main/resources/logback-spring.xml
  93. 1 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/MusicSheetController.java
  94. 13 19
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherLiveRoomController.java
  95. 56 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherLiveRoomVideoController.java
  96. 14 14
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/UserOrderController.java
  97. 1 2
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/UserWithdrawalController.java
  98. 23 7
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/task/TaskController.java
  99. 1 1
      cooleshow-user/user-teacher/src/main/resources/logback-spring.xml
  100. 28 0
      cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/config/MyOAuth2AuthenticationManager.java

+ 2 - 2
audio-analysis/src/main/java/com/yonge/netty/server/handler/NettyServerHandler.java

@@ -68,8 +68,8 @@ public class NettyServerHandler extends ChannelInboundHandlerAdapter {
 			HttpHeaders httpHeaders = handshakeComplete.requestHeaders();
 			String authHeader = httpHeaders.get("Authorization");
 			
-			// String tokenValue = authHeader.toLowerCase().replace(OAuth2AccessToken.BEARER_TYPE.toLowerCase(), StringUtils.EMPTY).trim();
-			// LOGGER.info("token:[{}]", tokenValue);
+			String tokenValue = authHeader.toLowerCase().replace(OAuth2AccessToken.BEARER_TYPE.toLowerCase(), StringUtils.EMPTY).trim();
+			LOGGER.info("token:[{}]", tokenValue);
 		}
 		super.userEventTriggered(ctx, evt);
 	}

+ 1 - 1
audio-analysis/src/main/resources/logback-spring.xml

@@ -39,7 +39,7 @@
 
 	<!--开发环境:打印控制台 -->
 	<springProfile name="dev">
-		<root level="info">
+		<root level="dev">
 			<appender-ref ref="stdout" />
 			<appender-ref ref="file" />
 		</root>

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

@@ -27,6 +27,20 @@ public interface TeacherFeignService {
     HttpResponseResult<Object> opsCourseGroup();
 
     /**
+     * 定时任务-销毁房间-直播间
+     * 每分钟执行一次
+     */
+    @GetMapping(value = "/task/destroyExpiredLiveRoom")
+    HttpResponseResult<Object> destroyExpiredLiveRoom();
+
+    /**
+     * 定时任务-创建直播间-直播间
+     * 每分钟执行一次
+     */
+    @GetMapping(value = "/task/createCourseLiveRoom")
+    HttpResponseResult<Object> createCourseLiveRoom();
+
+    /**
      * @Description: 课程提醒(每晚9点)
      * @Author: cy
      * @Date: 2022/5/6
@@ -47,6 +61,6 @@ public interface TeacherFeignService {
      * @Author: cy
      * @Date: 2022/5/24
      */
-//    @GetMapping("/task/teacherSalary")
-//    HttpResponseResult<Object> teacherSalary();
+    @GetMapping("/task/teacherSalary")
+    HttpResponseResult<Object> teacherSalary();
 }

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

@@ -18,6 +18,16 @@ public class TeacherFeignServiceFallback implements TeacherFeignService {
     }
 
     @Override
+    public HttpResponseResult<Object> destroyExpiredLiveRoom() {
+        return null;
+    }
+
+    @Override
+    public HttpResponseResult<Object> createCourseLiveRoom() {
+        return null;
+    }
+
+    @Override
     public HttpResponseResult<Object> courseRemind() {
         return null;
     }
@@ -27,8 +37,8 @@ public class TeacherFeignServiceFallback implements TeacherFeignService {
         return null;
     }
 
-//    @Override
-//    public HttpResponseResult<Object> teacherSalary() {
-//        return null;
-//    }
+    @Override
+    public HttpResponseResult<Object> teacherSalary() {
+        return null;
+    }
 }

+ 1 - 1
cooleshow-bbs/src/main/resources/logback-spring.xml

@@ -27,7 +27,7 @@
 		</encoder>
 	</appender>
 
-	<logger name="com.yonge.cooleshow" level="INFO" />
+	<logger name="com.yonge" level="INFO" />
 	<!--本地环境:打印控制台 -->
 	<springProfile name="local">
 		<root level="INFO">

+ 1 - 1
cooleshow-cms/src/main/resources/logback-spring.xml

@@ -27,7 +27,7 @@
 		</encoder>
 	</appender>
 
-	<logger name="com.yonge.cooleshow" level="INFO" />
+	<logger name="com.yonge" level="INFO" />
 
 	<!--本地环境:打印控制台 -->
 	<springProfile name="local">

+ 4 - 0
cooleshow-common/src/main/java/com/yonge/cooleshow/common/constant/AppConstant.java

@@ -59,4 +59,8 @@ public interface AppConstant {
      * 网络教室
      */
     String APPLICATION_CLASSROOM = "classroom";
+    /**
+     * 资源服务
+     */
+    String APPLICATION_RESOURCE = "resource";
 }

+ 0 - 6
cooleshow-common/src/main/java/com/yonge/cooleshow/common/constant/SysConfigConstant.java

@@ -140,12 +140,6 @@ public interface SysConfigConstant {
      * @updateTime 2022/4/20 11:43
      */
     String GOOD_LOGO_PIANO_ROOM = "good_logo_piano_room";
-    /***
-     * 陪练课&直播课老师课程结算日期(天)
-     * @author cy
-     * @updateTime 2022/5/24 10:03
-     */
-    String COURSE_SALARY_SETTLEMENT_DAY = "course_salary_settlement_day";
 
     /**
      * 琴房学员解绑未上课天数

+ 115 - 112
cooleshow-common/src/main/java/com/yonge/cooleshow/common/controller/BaseController.java

@@ -33,91 +33,94 @@ import com.yonge.toolset.utils.http.HttpUtil;
 @ControllerAdvice
 public class BaseController {
 
-	private final static Logger logger = LoggerFactory.getLogger(BaseController.class);
-
-	public static <T> HttpResponseResult<T> succeed(T object) {
-		return getResponseData(true, HttpStatus.OK, object, "");
-	}
-
-	public static <T> HttpResponseResult<T> succeed() {
-		return getResponseData(true, HttpStatus.OK, null, "");
-	}
-
-	public static <T> HttpResponseResult<T> succeedData(T obj) {
-		return getResponseData(true, HttpStatus.OK, obj, "操作成功");
-	}
-
-	public static <T> HttpResponseResult<T> warned(String message) {
-		return failed(HttpStatus.MULTI_STATUS, message);
-	}
-
-	public static <T> HttpResponseResult<T> failed() {
-		return failed("");
-	}
-
-	public static <T> HttpResponseResult<T> failed(String msg) {
-		return failed(HttpStatus.INTERNAL_SERVER_ERROR, msg);
-	}
-
-	public static <T> HttpResponseResult<T> failed(HttpStatus statusCode, String msg) {
-		return getResponseData(false, statusCode, null, msg);
-	}
-	public static <T> HttpResponseResult<T> failed(int code, String msg) {
-		return getResponseData(false, code, null, msg);
-	}
-
-	public static <T> HttpResponseResult<T> status(boolean flag) {
-			return flag ? succeed() : failed("操作失败");
-	}
-
-	public static <T> HttpResponseResult<T> failed(HttpStatus statusCode, T data, String msg) {
-		return getResponseData(false, statusCode, data, msg);
-	}
-
-	private static <T> HttpResponseResult<T> getResponseData(boolean status, HttpStatus statusCode, T data, String message) {
-		HttpResponseResult<T> obj = new HttpResponseResult<T>();
-		obj.setStatus(status);
-		obj.setCode(statusCode.value());
-		obj.setData(data);
-		obj.setMsg(message);
-		return obj;
-	}
-
-	private static <T> HttpResponseResult<T> getResponseData(boolean status, int code, T data, String message) {
-		HttpResponseResult<T> obj = new HttpResponseResult<T>();
-		obj.setStatus(status);
-		obj.setCode(code);
-		obj.setData(data);
-		obj.setMsg(message);
-		return obj;
-	}
-
-	/**
-	 * 处理一般异常
-	 *
-	 * @param ex
-	 * @param request
-	 * @return
-	 */
-	@ExceptionHandler(Exception.class)
-	public HttpResponseResult<String> handleException(Exception ex, HttpServletRequest request) {
-		Throwable e = ExceptionUtils.getRootCause(ex);
-		if (e == null) {
-			e = ex;
-		}
-		logger.error("System Error", ex);
-		// return failed(e.getMessage());
-		if (e instanceof BizException || e instanceof ThirdpartyException) {
-			if(e.getMessage().equals("205")){
-				return failed(HttpStatus.RESET_CONTENT,e.getMessage());
-			}
-			return failed(e.getMessage());
-		} else if (e instanceof AccessDeniedException) {
-			return failed("禁止访问");
-		}else if(e instanceof BindException){
-			String errors = ((BindException) e).getFieldErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining("\n"));
-			return failed(errors);
-		} else if(e instanceof MethodArgumentNotValidException){
+    private final static Logger logger = LoggerFactory.getLogger(BaseController.class);
+
+    public static <T> HttpResponseResult<T> succeed(T object) {
+        return getResponseData(true, HttpStatus.OK, object, "");
+    }
+
+    public static <T> HttpResponseResult<T> succeed() {
+        return getResponseData(true, HttpStatus.OK, null, "");
+    }
+
+    public static <T> HttpResponseResult<T> succeedData(T obj) {
+        return getResponseData(true, HttpStatus.OK, obj, "操作成功");
+    }
+
+    public static <T> HttpResponseResult<T> warned(String message) {
+        return failed(HttpStatus.MULTI_STATUS, message);
+    }
+
+    public static <T> HttpResponseResult<T> failed() {
+        return failed("");
+    }
+
+    public static <T> HttpResponseResult<T> failed(String msg) {
+        return failed(HttpStatus.INTERNAL_SERVER_ERROR, msg);
+    }
+
+    public static <T> HttpResponseResult<T> failed(HttpStatus statusCode, String msg) {
+        return getResponseData(false, statusCode, null, msg);
+    }
+
+    public static <T> HttpResponseResult<T> failed(int code, String msg) {
+        return getResponseData(false, code, null, msg);
+    }
+
+    public static <T> HttpResponseResult<T> status(boolean flag) {
+        return flag ? succeed() : failed("操作失败");
+    }
+
+    public static <T> HttpResponseResult<T> failed(HttpStatus statusCode, T data, String msg) {
+        return getResponseData(false, statusCode, data, msg);
+    }
+
+    private static <T> HttpResponseResult<T> getResponseData(boolean status, HttpStatus statusCode, T data, String message) {
+        HttpResponseResult<T> obj = new HttpResponseResult<T>();
+        obj.setStatus(status);
+        obj.setCode(statusCode.value());
+        obj.setData(data);
+        obj.setMsg(message);
+        return obj;
+    }
+
+    private static <T> HttpResponseResult<T> getResponseData(boolean status, int code, T data, String message) {
+        HttpResponseResult<T> obj = new HttpResponseResult<T>();
+        obj.setStatus(status);
+        obj.setCode(code);
+        obj.setData(data);
+        obj.setMsg(message);
+        return obj;
+    }
+
+    /**
+     * 处理一般异常
+     *
+     * @param ex
+     * @param request
+     * @return
+     */
+    @ExceptionHandler(Exception.class)
+    public HttpResponseResult<String> handleException(Exception ex, HttpServletRequest request) {
+        Throwable e = ExceptionUtils.getRootCause(ex);
+        if (e == null) {
+            e = ex;
+        }
+        logger.error("System Error", ex);
+        // return failed(e.getMessage());
+        if (e instanceof BizException || e instanceof ThirdpartyException) {
+            if (e.getMessage().equals("205")) {
+                return failed(HttpStatus.RESET_CONTENT, e.getMessage());
+            }
+            return failed(e.getMessage());
+        } else if (e instanceof AccessDeniedException) {
+            return failed("禁止访问");
+        } else if (e instanceof IllegalMonitorStateException) {
+            return failed("操作失败");
+        } else if (e instanceof BindException) {
+            String errors = ((BindException) e).getFieldErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining("\n"));
+            return failed(errors);
+        } else if (e instanceof MethodArgumentNotValidException) {
             MethodArgumentNotValidException validException = (MethodArgumentNotValidException) ex;
             String errorMsg = validException.getBindingResult()
                     .getFieldErrors()
@@ -126,34 +129,34 @@ public class BaseController {
                     .collect(Collectors.joining());
             return failed(errorMsg);
         }
-		try {
-			Map<String,Object> paramMap = new HashMap<>(2);
-			JSONObject jsonObject = new JSONObject();
-			jsonObject.put("content","系统繁忙请及时处理: " + request.getRequestURL() + "   " + e);
-			paramMap.put("text",jsonObject.toJSONString());
-			paramMap.put("msgtype","text");
-			Map<String,String> headers = new HashMap<>(1);
-			headers.put("Content-Type","application/json");
-			HttpUtil.postForHttps(dingTalkRobotsSecurityParam(),JSON.toJSONString(paramMap),headers);
-		}catch (Exception exception){
-			logger.error("System Error", exception);
-		}
+        try {
+            Map<String, Object> paramMap = new HashMap<>(2);
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put("content", "系统繁忙请及时处理: " + request.getRequestURL() + "   " + e);
+            paramMap.put("text", jsonObject.toJSONString());
+            paramMap.put("msgtype", "text");
+            Map<String, String> headers = new HashMap<>(1);
+            headers.put("Content-Type", "application/json");
+            HttpUtil.postForHttps(dingTalkRobotsSecurityParam(), JSON.toJSONString(paramMap), headers);
+        } catch (Exception exception) {
+            logger.error("System Error", exception);
+        }
         if (StringUtils.isNotBlank(e.getMessage())) {
             return failed(e.getMessage());
         }
-		return failed("系统繁忙");
-	}
-
-	public String dingTalkRobotsSecurityParam() throws Exception{
-		Long timestamp = System.currentTimeMillis();
-		String secret = "SEC36b17ac2f4e201f962042fb05f4b6b827719bcf9b6bb7b672e61f99c752eb693";
-		String stringToSign = timestamp + "\n" + secret;
-		Mac mac = Mac.getInstance("HmacSHA256");
-		mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));
-		byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
-		String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)),"UTF-8");
-		StringBuffer sb = new StringBuffer("https://api.dingtalk.com/robot/send?access_token=22d7b3b54ea7f1633c640dfdf17083d0731c3757719a84bd333740a8b18eb035&timestamp=");
-		sb.append(timestamp).append("&sign=").append(sign);
-		return sb.toString();
-	}
+        return failed("系统繁忙");
+    }
+
+    public String dingTalkRobotsSecurityParam() throws Exception {
+        Long timestamp = System.currentTimeMillis();
+        String secret = "SEC36b17ac2f4e201f962042fb05f4b6b827719bcf9b6bb7b672e61f99c752eb693";
+        String stringToSign = timestamp + "\n" + secret;
+        Mac mac = Mac.getInstance("HmacSHA256");
+        mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));
+        byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
+        String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8");
+        StringBuffer sb = new StringBuffer("https://api.dingtalk.com/robot/send?access_token=22d7b3b54ea7f1633c640dfdf17083d0731c3757719a84bd333740a8b18eb035&timestamp=");
+        sb.append(timestamp).append("&sign=").append(sign);
+        return sb.toString();
+    }
 }

+ 1 - 1
cooleshow-gateway/gateway-web/src/main/resources/logback-spring.xml

@@ -27,7 +27,7 @@
 		</encoder>
 	</appender>
 
-	<logger name="com.yonge.cooleshow" level="INFO" />
+	<logger name="com.yonge" level="INFO" />
 
 	<!--本地环境:打印控制台 -->
 	<springProfile name="local">

+ 4 - 2
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/SmsHomeAdvertiseController.java

@@ -4,6 +4,7 @@ import com.yonge.cooleshow.mall.common.api.CommonPage;
 import com.yonge.cooleshow.mall.common.api.CommonResult;
 import com.yonge.cooleshow.mbg.model.SmsHomeAdvertise;
 import com.yonge.cooleshow.admin.service.SmsHomeAdvertiseService;
+import com.yonge.toolset.base.util.StringUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -36,8 +37,9 @@ public class SmsHomeAdvertiseController {
     @ApiOperation("删除广告")
     @RequestMapping(value = "/delete", method = RequestMethod.POST)
     @ResponseBody
-    public CommonResult delete(@RequestParam("ids") List<Long> ids) {
-        int count = advertiseService.delete(ids);
+    public CommonResult delete(@RequestParam("ids") String ids) {
+        List<Long> list = StringUtil.toLongList(ids);
+        int count = advertiseService.delete(list);
         if (count > 0)
             return CommonResult.success(count);
         return CommonResult.failed();

+ 4 - 1
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderReturnApplyServiceImpl.java

@@ -77,6 +77,9 @@ public class OmsOrderReturnApplyServiceImpl implements OmsOrderReturnApplyServic
     public int updateStatus(Long id, OmsUpdateStatusParam statusParam) {
         Integer status = statusParam.getStatus();
         OmsOrderReturnApply omsOrderReturnApply = returnApplyMapper.selectByPrimaryKey(id);
+        if (omsOrderReturnApply == null) {
+            throw new BizException("退货订单不存在或被撤销");
+        }
         if (omsOrderReturnApply.getProductPrice().compareTo(statusParam.getReturnAmount()) <0) {
             throw new BizException("退款金额不能大于商品金额");
         }
@@ -147,7 +150,7 @@ public class OmsOrderReturnApplyServiceImpl implements OmsOrderReturnApplyServic
             userOrderRefund.setPayTransNo(userOrderPayment.getTransNo());
             userOrderRefund.setRefundAmt(refundBill.getRefundAmt());
             userOrderRefund.setStatus(TradeStatusEnum.pending.getCode());
-
+            userOrderRefund.setPayOrderNo(userOrderPayment.getOrderNo());
             userOrderRefundMapper.insert(userOrderRefund);
         } else {
             throw new BizException(refundBillBaseResult.getMsg());

+ 1 - 0
cooleshow-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/enums/OrderCacheEnum.java

@@ -16,6 +16,7 @@ public enum OrderCacheEnum {
     LOCK_PAY_ORDER("用户付款锁"),
     LOCK_CHANGE_ACCOUNT("账户变更锁"),
     LOCK_REFUND_ORDER_MALL("商城退款锁"),
+    LOCK_ORDER_NO_MALL("订单号锁"),
 
     ;
     /***

+ 1 - 1
cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/UserOrderPaymentMapper.java

@@ -11,7 +11,7 @@ public interface UserOrderPaymentMapper {
     int insert(UserOrderPayment record);
 
 
-    UserOrderPayment selectByTranNo(String orderNo);
+    UserOrderPayment selectByTranNo(String transNo);
 
     int updateByPrimaryKeySelective(UserOrderPayment userOrderPayment);
 

+ 2 - 0
cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/UserOrderRefundMapper.java

@@ -40,4 +40,6 @@ public interface UserOrderRefundMapper {
     UserOrderRefund selectByTransNo(@Param("transNo") String transNo);
 
     UserOrderRefund selectByRefundNo(@Param("refundOrderNo") String refundOrderNo);
+
+    UserOrderRefund selectByPayOrderNo( @Param("payOrderNo") String payOrderNo);
 }

+ 11 - 0
cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/UserOrderRefund.java

@@ -40,6 +40,9 @@ public class UserOrderRefund {
     @ApiModelProperty(value = "支付流水号")
     private String payTransNo;
 
+    @ApiModelProperty("支付订单号")
+    private String payOrderNo;
+
     /**
      * 交易金额,必须大于0,保留两位小数点,如0.10、100.05等
      */
@@ -76,6 +79,14 @@ public class UserOrderRefund {
     @ApiModelProperty(value = "")
     private Date updateTime;
 
+    public String getPayOrderNo() {
+        return payOrderNo;
+    }
+
+    public void setPayOrderNo(String payOrderNo) {
+        this.payOrderNo = payOrderNo;
+    }
+
     public Long getReturnId() {
         return returnId;
     }

+ 1 - 1
cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/UserOrderPaymentMapper.xml

@@ -246,7 +246,7 @@
     <select id="selectByTranNo" resultMap="BaseResultMap">
         select
         <include refid="Base_Column_List" />
-      from user_order_payment where trans_no_ = #{orderNo} order by id_ desc limit 1
+      from user_order_payment where trans_no_ = #{transNo} order by id_ desc limit 1
     </select>
 
     <select id="selectByOrderNo" resultMap="BaseResultMap">

+ 25 - 3
cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/UserOrderRefundMapper.xml

@@ -9,6 +9,7 @@
     <result column="order_no_" jdbcType="VARCHAR" property="orderNo" />
     <result column="trans_no_" jdbcType="VARCHAR" property="transNo" />
     <result column="pay_trans_no_" jdbcType="VARCHAR" property="payTransNo" />
+    <result column="pay_order_no_" jdbcType="VARCHAR" property="payOrderNo" />
     <result column="refund_amt_" jdbcType="DECIMAL" property="refundAmt" />
     <result column="fee_amt_" jdbcType="DECIMAL" property="feeAmt" />
     <result column="status_" jdbcType="VARCHAR" property="status" />
@@ -80,7 +81,7 @@
   <sql id="Base_Column_List">
     <!--@mbg.generated-->
     id_, order_no_, trans_no_, pay_trans_no_, refund_amt_, fee_amt_, status_, pay_fail_msg_, 
-    arrival_time_, create_time_, update_time_,return_id_
+    arrival_time_, create_time_, update_time_,return_id_,pay_order_no_
   </sql>
   <select id="selectByExample" parameterType="com.yonge.cooleshow.mbg.model.UserOrderRefundExample" resultMap="BaseResultMap">
     <!--@mbg.generated-->
@@ -121,11 +122,11 @@
     insert into user_order_refund (order_no_, trans_no_, pay_trans_no_, 
       refund_amt_, fee_amt_, status_, 
       pay_fail_msg_, arrival_time_, create_time_, 
-      update_time_,return_id_)
+      update_time_,return_id_,pay_order_no_)
     values (#{orderNo,jdbcType=VARCHAR}, #{transNo,jdbcType=VARCHAR}, #{payTransNo,jdbcType=VARCHAR}, 
       #{refundAmt,jdbcType=DECIMAL}, #{feeAmt,jdbcType=DECIMAL}, #{status,jdbcType=VARCHAR}, 
       #{payFailMsg,jdbcType=VARCHAR}, #{arrivalTime,jdbcType=TIMESTAMP}, #{createTime,jdbcType=TIMESTAMP}, 
-      #{updateTime,jdbcType=TIMESTAMP},#{returnId})
+      #{updateTime,jdbcType=TIMESTAMP},#{returnId},#{payOrderNo})
   </insert>
   <insert id="insertSelective" keyColumn="id_" keyProperty="id" parameterType="com.yonge.cooleshow.mbg.model.UserOrderRefund" useGeneratedKeys="true">
     <!--@mbg.generated-->
@@ -164,6 +165,9 @@
       <if test="returnId != null">
         return_id_,
       </if>
+      <if test="payOrderNo != null">
+        pay_order_no_,
+      </if>
     </trim>
     <trim prefix="values (" suffix=")" suffixOverrides=",">
       <if test="orderNo != null">
@@ -199,6 +203,9 @@
       <if test="returnId != null">
         #{returnId},
       </if>
+      <if test="payOrderNo != null">
+        #{payOrderNo},
+      </if>
     </trim>
   </insert>
   <select id="countByExample" parameterType="com.yonge.cooleshow.mbg.model.UserOrderRefundExample" resultType="java.lang.Long">
@@ -248,6 +255,9 @@
       <if test="record.returnId != null">
         return_id_ = #{record.returnId,jdbcType=BIGINT},
       </if>
+      <if test="record.payOrderNo != null">
+        pay_order_no_ = #{record.payOrderNo,jdbcType=BIGINT},
+      </if>
     </set>
     <if test="_parameter != null">
       <include refid="Update_By_Example_Where_Clause" />
@@ -267,6 +277,7 @@
       arrival_time_ = #{record.arrivalTime,jdbcType=TIMESTAMP},
       create_time_ = #{record.createTime,jdbcType=TIMESTAMP},
       return_id_ = #{record.returnId,jdbcType=BIGINT},
+      pay_order_no_ = #{record.payOrderNo},
       update_time_ = #{record.updateTime,jdbcType=TIMESTAMP}
     <if test="_parameter != null">
       <include refid="Update_By_Example_Where_Clause" />
@@ -309,6 +320,9 @@
       <if test="returnId != null">
         return_id_ = #{returnId,jdbcType=BIGINT},
       </if>
+      <if test="payOrderNo != null">
+        pay_order_no_ = #{payOrderNo},
+      </if>
     </set>
     where id_ = #{id,jdbcType=BIGINT}
   </update>
@@ -325,6 +339,7 @@
       arrival_time_ = #{arrivalTime,jdbcType=TIMESTAMP},
       create_time_ = #{createTime,jdbcType=TIMESTAMP},
       return_id_ = #{returnId,jdbcType=BIGINT},
+      pay_order_no_ = #{payOrderNo},
       update_time_ = #{updateTime,jdbcType=TIMESTAMP}
     where id_ = #{id,jdbcType=BIGINT}
   </update>
@@ -342,4 +357,11 @@
     from user_order_refund
     where #{refundOrderNo} = order_no_ limit 1
     </select>
+
+  <select id="selectByPayOrderNo" resultMap="BaseResultMap">
+    select
+    <include refid="Base_Column_List" />
+    from user_order_refund
+    where #{payOrderNo} = pay_order_no_   and status_ = 'succeeded'
+  </select>
 </mapper>

+ 17 - 1
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/component/CancelOrderReceiver.java

@@ -1,7 +1,11 @@
 package com.yonge.cooleshow.portal.component;
 
+import com.yonge.cooleshow.mall.common.enums.OrderCacheEnum;
+import com.yonge.cooleshow.mbg.model.OmsOrder;
 import com.yonge.cooleshow.portal.service.OmsPortalOrderService;
 import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.payment.util.DistributedLock;
+import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.amqp.rabbit.annotation.RabbitHandler;
@@ -9,6 +13,8 @@ import org.springframework.amqp.rabbit.annotation.RabbitListener;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.util.concurrent.TimeUnit;
+
 /**
  * 取消订单消息的消费者
  * Created by macro on 2018/9/14.
@@ -19,10 +25,20 @@ public class CancelOrderReceiver {
     private static Logger logger =LoggerFactory.getLogger(CancelOrderReceiver.class);
     @Autowired
     private OmsPortalOrderService portalOrderService;
+
+    @Autowired
+    private RedissonClient redissonClient;
+
     @RabbitHandler
     public void handle(Long orderId){
         try {
-            portalOrderService.cancelOrder(orderId, "超时取消", null);
+            OmsOrder omsOrder = portalOrderService.getOrderById(orderId);
+
+            DistributedLock.of(redissonClient)
+                           .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(omsOrder.getOrderSn())
+                                   , () -> {
+                                       portalOrderService.cancelOrder(orderId, "超时取消", null);
+                                   }, 60L, TimeUnit.SECONDS);
 
         } catch (BizException e) {
             e.printStackTrace();

+ 46 - 4
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderController.java

@@ -2,15 +2,19 @@ package com.yonge.cooleshow.portal.controller;
 
 import com.yonge.cooleshow.mall.common.api.CommonPage;
 import com.yonge.cooleshow.mall.common.api.CommonResult;
+import com.yonge.cooleshow.mall.common.enums.OrderCacheEnum;
 import com.yonge.cooleshow.mbg.model.OmsOrder;
 import com.yonge.cooleshow.portal.domain.ConfirmOrderResult;
 import com.yonge.cooleshow.portal.domain.OmsOrderDetail;
 import com.yonge.cooleshow.portal.domain.OrderParam;
 import com.yonge.cooleshow.portal.service.OmsPortalOrderService;
+import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.util.StringUtil;
+import com.yonge.toolset.payment.util.DistributedLock;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiOperation;
+import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.util.CollectionUtils;
@@ -18,6 +22,7 @@ import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 /**
  * 订单管理Controller
@@ -30,6 +35,10 @@ public class OmsPortalOrderController {
     @Autowired
     private OmsPortalOrderService portalOrderService;
 
+
+    @Autowired
+    private RedissonClient redissonClient;
+
     @ApiOperation("根据购物车信息生成确认单")
     @RequestMapping(value = "/generateConfirmOrder", method = RequestMethod.POST)
     @ResponseBody
@@ -118,7 +127,16 @@ public class OmsPortalOrderController {
     @RequestMapping(value = "/cancelUserOrder", method = RequestMethod.POST)
     @ResponseBody
     public CommonResult cancelUserOrder(Long orderId) {
-        portalOrderService.cancelOrder(orderId, "用户取消订单", null);
+        OmsOrder omsOrder = portalOrderService.getOrderById(orderId);
+        if (omsOrder == null) {
+            return CommonResult.failed("未找到订单");
+        }
+
+        DistributedLock.of(redissonClient)
+                       .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(omsOrder.getOrderSn())
+                               , () -> {
+                                   portalOrderService.cancelOrder(orderId, "用户取消订单", null);
+                               }, 60L, TimeUnit.SECONDS);
         return CommonResult.success(null);
     }
 
@@ -142,15 +160,39 @@ public class OmsPortalOrderController {
     @RequestMapping(value = "/paySuccess/test", method = RequestMethod.GET)
     @ResponseBody
     public CommonResult paySuccessTest(@RequestParam Long orderId,@RequestParam Integer payType) {
-        Integer count = portalOrderService.paySuccess(orderId,payType);
-        return CommonResult.success(count, "支付成功");
+        OmsOrder omsOrder = portalOrderService.getOrderById(orderId);
+        if (omsOrder == null) {
+            return CommonResult.failed("未找到订单");
+        }
+
+        DistributedLock.of(redissonClient)
+                       .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(omsOrder.getOrderSn())
+                               , () -> {
+                                       if (omsOrder.getStatus() == 0 || omsOrder.getStatus() == 6) {
+                                           portalOrderService.paySuccess(orderId, payType);
+
+                                       } else {
+                                           throw new BizException("订单已支付或已取消");
+                                       }
+                               }, 60L, TimeUnit.SECONDS);
+        return CommonResult.success("支付成功");
     }
 
     @ApiOperation("用户取消订单")
     @GetMapping(value = "/cancelUserOrder/test")
     @ResponseBody
     public CommonResult cancelUserOrderTest(@RequestParam Long orderId) {
-        portalOrderService.cancelOrder(orderId, "用户取消订单", null);
+
+        OmsOrder omsOrder = portalOrderService.getOrderById(orderId);
+        if (omsOrder == null) {
+            return CommonResult.failed("未找到订单");
+        }
+
+        DistributedLock.of(redissonClient)
+                       .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(omsOrder.getOrderSn())
+                               , () -> {
+                                   portalOrderService.cancelOrder(orderId, "用户取消订单", null);
+                               }, 60L, TimeUnit.SECONDS);
         return CommonResult.success(null);
     }
 }

+ 28 - 9
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/PaymentController.java

@@ -78,7 +78,7 @@ public class PaymentController extends BaseController {
         payReq.setUserId(user.getId());
         payReq.setIpAddress(WebUtil.getRemoteIp(request));
 
-        RLock lock = redissonClient.getLock(OrderCacheEnum.LOCK_PAY_ORDER.getRedisKey(user.getId()));
+        RLock lock = redissonClient.getLock(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(payReq.getOrderNo()));
         try {
             boolean b = lock.tryLock(60, TimeUnit.SECONDS);
             if (b) {
@@ -112,7 +112,7 @@ public class PaymentController extends BaseController {
         Payment param = new Payment(OpenEnum.valueOf(userOrderPayment.getOpenType()),
                 PaymentClientEnum.valueOf(userOrderPayment.getPaymentClient()), PayChannelEnum.valueOf(userOrderPayment.getPayChannel()));
         param.setId(userOrderPayment.getTransNo());
-        param.setPaymentNo(userOrderPayment.getTransNo());
+        param.setPaymentNo(userOrderPayment.getAdapayNo());
         BaseResult<Payment> paymentBaseResult = paymentClient.queryPayment(param);
         return HttpResponseResult.status(paymentBaseResult);
     }
@@ -151,13 +151,32 @@ public class PaymentController extends BaseController {
         if (res.getStatus()) {
             PaymentCallBack data = res.getData();
 
-            if (MethodNameEnum.executePayment.equals(data.getMethodName())) {
-                //支付交易
-                orderService.executePaymentCallBack(data);
-            } else if (MethodNameEnum.closePayment.equals(data.getMethodName())) {
-                //关闭订单
-                orderService.closePaymentCallBack(data);
-            } else if (MethodNameEnum.refundPayment.equals(data.getMethodName())) {
+            UserOrderPayment userOrderPayment = userOrderPaymentService.getByAdapayNo(data.getPaymentNo());
+            if (userOrderPayment != null) {
+                RLock lock = redissonClient.getLock(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(userOrderPayment.getOrderNo()));
+                try {
+                    boolean b = lock.tryLock(60, TimeUnit.SECONDS);
+                    if (b) {
+                        if (MethodNameEnum.executePayment.equals(data.getMethodName())) {
+                            //支付交易
+                            orderService.executePaymentCallBack(data);
+                        } else if (MethodNameEnum.closePayment.equals(data.getMethodName())) {
+                            //关闭订单
+                            orderService.closePaymentCallBack(data);
+                        }
+                    } else {
+                        return failed("请求超时");
+                    }
+                }catch (Exception e) {
+                    e.printStackTrace();
+                    return HttpResponseResult.failed("付款失败");
+                } finally {
+                    if (lock.getHoldCount()>0) {
+                        lock.unlock();
+                    }
+                }
+            }
+            if (MethodNameEnum.refundPayment.equals(data.getMethodName())) {
                 //退款
                 portalOrderReturnApplyService.refundPaymentCallBack(data);
             }

+ 2 - 2
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/UserOrderPaymentService.java

@@ -19,10 +19,10 @@ public interface UserOrderPaymentService {
     /**
      *  根据订单查询
      *
-     * @param orderNo 订单id
+     * @param paymentId 交易流水号
      * @return
      */
-    UserOrderPayment getByTranNo(String orderNo);
+    UserOrderPayment getByTranNo(String paymentId);
 
     /**
      * 保存订单记录

+ 1 - 1
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/HomeServiceImpl.java

@@ -96,7 +96,7 @@ public class HomeServiceImpl implements HomeService {
         if (currentMember == null) {
             throw new BizException("请重新登录");
         }
-        example.createCriteria().andDeleteStatusEqualTo(0).andMemberIdEqualTo(currentMember.getId());
+        example.createCriteria().andDeleteStatusEqualTo(0).andMemberIdEqualTo(currentMember.getId()).andHiddenEqualTo(0);
         return cartItemMapper.countByExample(example);
     }
 

+ 58 - 9
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java

@@ -5,6 +5,7 @@ import cn.hutool.core.collection.CollUtil;
 import com.alibaba.fastjson.JSON;
 import com.github.pagehelper.PageHelper;
 import com.yonge.cooleshow.mall.common.api.CommonPage;
+import com.yonge.cooleshow.mall.common.enums.OrderCacheEnum;
 import com.yonge.cooleshow.mall.common.exception.Asserts;
 import com.yonge.cooleshow.mall.common.service.RedisService;
 import com.yonge.cooleshow.mbg.mapper.*;
@@ -24,13 +25,12 @@ import com.yonge.toolset.payment.base.enums.OpenEnum;
 import com.yonge.toolset.payment.base.enums.PayChannelEnum;
 import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
-import com.yonge.toolset.payment.base.model.DeviceInfo;
-import com.yonge.toolset.payment.base.model.DivMember;
-import com.yonge.toolset.payment.base.model.OrderDetil;
-import com.yonge.toolset.payment.base.model.Payment;
+import com.yonge.toolset.payment.base.model.*;
 import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
 import com.yonge.toolset.payment.core.props.PaymentProperties;
 import com.yonge.toolset.payment.core.service.PaymentClient;
+import com.yonge.toolset.payment.util.DistributedLock;
+import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -42,6 +42,7 @@ import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
@@ -96,6 +97,11 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
     @Autowired
     private PmsProductMapper pmsProductMapper;
 
+    @Autowired
+    private UserOrderRefundMapper userOrderRefundMapper;
+
+    @Autowired
+    private RedissonClient redissonClient;
 
     @Autowired
     private PortalProductDao productDao;
@@ -347,11 +353,16 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         }
         for (OmsOrderDetail timeOutOrder : timeOutOrders) {
 
-            if (timeOutOrder.getStatus() == 0) {
-                payingOrderHandle(timeOutOrder);
-            } else if (timeOutOrder.getStatus() == 6) {
-                cancelOrder(timeOutOrder.getId(), "超时取消", null);
-            }
+            DistributedLock.of(redissonClient)
+                           .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(timeOutOrder.getOrderSn())
+                                   , () -> {
+                                       if (timeOutOrder.getStatus() == 0) {
+                                           payingOrderHandle(timeOutOrder);
+                                       } else if (timeOutOrder.getStatus() == 6) {
+                                           cancelOrder(timeOutOrder.getId(), "超时取消", null);
+                                       }
+                                   }, 60L, TimeUnit.SECONDS);
+
         }
         return timeOutOrders.size();
     }
@@ -687,9 +698,47 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             orderSuccess(detail, data, data.getId());
         } else {
             LOG.error("汇付支付回调,订单状态异常。 req is {}", detail.getOrderSn());
+            LOG.warn("支付金额原路退回 {}", detail.getOrderSn());
+            orderRefund(userOrderPayment,data,detail);
         }
     }
 
+    /**
+     * 支付成功,业务退款
+     */
+    private void orderRefund(UserOrderPayment userOrderPayment,PaymentCallBack data,OmsOrder order) {
+        UserOrderRefund userOrderRefund = userOrderRefundMapper.selectByPayOrderNo(userOrderPayment.getOrderNo());
+        if (userOrderRefund != null && userOrderRefund.getStatus().equals("succeeded")) {
+            LOG.warn("支付金额已退回");
+            return;
+        }
+
+        String orderSn = generateOrderSn(order);
+
+        RefundBill refundReq = new RefundBill(OpenEnum.valueOf(userOrderPayment.getOpenType()), PaymentClientEnum.valueOf(userOrderPayment.getPaymentClient()), PayChannelEnum.valueOf(userOrderPayment.getPayChannel()));
+        refundReq.setRefundNo(orderSn);
+        refundReq.setRefundAmt(new BigDecimal(data.getExecutePaymentCallBack().getPayAmt()));
+
+        refundReq.setReason("支付超时,全额退回");
+        refundReq.setPaymentNo(userOrderPayment.getAdapayNo());
+        refundReq.setTradeNo(data.getId());
+        refundReq.setOrderAmt(userOrderPayment.getPayAmt());
+        BaseResult<RefundBill> refundBillBaseResult = paymentClient.refundPayment(refundReq);
+        userOrderRefund = new UserOrderRefund();
+        userOrderRefund.setOrderNo(orderSn);
+        userOrderRefund.setPayTransNo(data.getId());
+        userOrderRefund.setRefundAmt(userOrderPayment.getPayAmt());
+        userOrderRefund.setPayOrderNo(userOrderPayment.getOrderNo());
+        if (refundBillBaseResult.getStatus()) {
+            RefundBill refundBill = refundBillBaseResult.getData();
+            userOrderRefund.setRefundAmt(refundBill.getRefundAmt());
+            userOrderRefund.setStatus(TradeStatusEnum.pending.getCode());
+        } else {
+            userOrderRefund.setStatus(TradeStatusEnum.failed.getCode());
+            userOrderRefund.setPayFailMsg("退款失败:" + refundBillBaseResult.getMsg());
+        }
+        userOrderRefundMapper.insert(userOrderRefund);
+    }
     /***
      * 处理回调-支付失败
      * @author liweifan

+ 3 - 3
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/UserOrderPaymentServiceImpl.java

@@ -34,8 +34,8 @@ public class UserOrderPaymentServiceImpl implements UserOrderPaymentService {
     private PaymentClient paymentClient;
 
     @Override
-    public UserOrderPayment getByTranNo(String orderNo) {
-        return userOrderPaymentMapper.selectByTranNo(orderNo);
+    public UserOrderPayment getByTranNo(String transNo) {
+        return userOrderPaymentMapper.selectByTranNo(transNo);
     }
 
     @Override
@@ -77,7 +77,7 @@ public class UserOrderPaymentServiceImpl implements UserOrderPaymentService {
             }
 
             //发送支付关单请求
-            if (!StringUtil.isEmpty(orderPayment.getTransNo())) {
+            if (!StringUtil.isEmpty(orderPayment.getTransNo()) || !StringUtil.isEmpty(orderPayment.getAdapayNo())) {
                 ClosePayment closePayment = new ClosePayment(OpenEnum.valueOf(orderPayment.getOpenType()),
                         PaymentClientEnum.valueOf(orderPayment.getPaymentClient()),
                         PayChannelEnum.valueOf(orderPayment.getPayChannel()));

+ 1 - 1
cooleshow-mall/mall-portal/src/main/resources/config/mybatis/PortalOrderDao.xml

@@ -45,7 +45,7 @@
         FROM
             oms_order o
             LEFT JOIN oms_order_item ot ON o.id = ot.order_id
-        left join user_order_payment uop on uop.order_no_ = o.order_sn
+        left join user_order_payment uop on uop.order_no_ = o.order_sn and uop.status_ = 'pending'
         WHERE
             (o.status = 6 AND o.create_time &lt; date_add(NOW(), INTERVAL -#{orderMinute} MINUTE))
             or (o.status = 0 and uop.create_time_ &lt; date_add(NOW(), INTERVAL -#{payMinute} MINUTE));

+ 18 - 0
cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/CreateCourseLiveRoomTask.java

@@ -0,0 +1,18 @@
+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;
+
+@Service
+public class CreateCourseLiveRoomTask extends BaseTask {
+    @Autowired
+    private TeacherFeignService teacherFeignService;
+
+    @Override
+    public void execute() throws TaskException {
+        teacherFeignService.createCourseLiveRoom();
+    }
+}

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

@@ -0,0 +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: liweifan
+ * @Data: 2022/4/25 10:30
+ */
+@Service
+public class DestroyExpiredLiveRoomTask extends BaseTask {
+    @Autowired
+    private TeacherFeignService teacherFeignService;
+
+    @Override
+    public void execute() throws TaskException {
+        teacherFeignService.destroyExpiredLiveRoom();
+    }
+}

+ 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();
+    }
+}

+ 3 - 2
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/UserOrderClient.java

@@ -8,7 +8,7 @@ import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
 import com.yonge.cooleshow.biz.dal.service.UserOrderPaymentService;
 import com.yonge.cooleshow.biz.dal.service.UserOrderRefundService;
 import com.yonge.cooleshow.biz.dal.service.UserOrderService;
-import com.yonge.cooleshow.biz.dal.support.DistributedLock;
+import com.yonge.toolset.payment.util.DistributedLock;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
@@ -80,6 +80,7 @@ public class UserOrderClient extends BaseController {
             @PathVariable("payMethod") String payMethod,
             HttpServletRequest request
     ) {
+        //支付回调:openType is ORIGINAL ,paymentClient is STUDENT,payChannel is ali_app,payMethod is executePayment
         log.info("支付回调:openType is {} ,paymentClient is {},payChannel is {},payMethod is {}", openType, client, payChannel, payMethod);
         BaseResult<PaymentCallBack> res = paymentClient.analysisNotice(
                 OpenEnum.valueOf(openType), PaymentClientEnum.valueOf(client),
@@ -95,7 +96,7 @@ public class UserOrderClient extends BaseController {
             }
             try {
                 DistributedLock.of(redissonClient)
-                        .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(userOrderVo.getUserId())
+                        .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(userOrderVo.getOrderNo())
                                 , () -> {
                                     if (MethodNameEnum.executePayment.equals(data.getMethodName())) {
                                         //支付交易

+ 1 - 1
cooleshow-user/user-admin/src/main/resources/logback-spring.xml

@@ -27,7 +27,7 @@
 		</encoder>
 	</appender>
 
-	<logger name="com.yonge.cooleshow" level="INFO" />
+	<logger name="com.yonge" level="INFO" />
 
 	<!--本地环境:打印控制台 -->
 	<springProfile name="local">

+ 4 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleDao.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.PracticeScheduleDto;
+import com.yonge.cooleshow.biz.dal.dto.UserAccountRecordDto;
 import com.yonge.cooleshow.biz.dal.dto.search.HomeworkSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.MyCourseSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.PracticeTeacherSearch;
@@ -231,4 +232,7 @@ public interface CourseScheduleDao extends BaseMapper<CourseSchedule> {
 
     //查琴房课列表
     List<PianoClassVo> queryPianoClass(IPage page,@Param("param") MyCourseSearch search);
+
+    //查询待结算课程
+    List<UserAccountRecordDto> selectWaitCourse(String day);
 }

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleRepliedDao.java

@@ -66,4 +66,6 @@ public interface CourseScheduleRepliedDao extends BaseMapper<CourseScheduleRepli
     CourseRepliedVo selectReplied(CourseScheduleReplied replied);
 
     void insertBatch(List<CourseScheduleStudentVo> list);
+
+    void deleteBatch(List<Long> list);
 }

+ 13 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicSheetDao.java

@@ -136,4 +136,17 @@ public interface MusicSheetDao extends BaseMapper<MusicSheet> {
      * @return
      */
     TeacherAuditMusicSheetVo selectTeacherCount(@Param("userId") Long userId);
+
+    /**
+     * 老师统计
+     * @param userId
+     * @return
+     */
+    List<TeacherTotalVo> queryTeacherTotal(@Param("userId") Long userId);
+    /**
+     * 学生统计
+     * @param userId
+     * @return
+     */
+    List<StudentTotalVo> queryStudentTotal(@Param("userId") Long userId);
 }

+ 19 - 8
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderRefundReq.java

@@ -16,9 +16,9 @@ import java.util.List;
 @ApiModel(value = "OrderRefundReq对象", description = "退款请求")
 public class OrderRefundReq {
 
-    @ApiModelProperty("订单ID ")
-    @NotNull(message = "订单id不能为空")
-    private Long orderId;
+    @ApiModelProperty("订单 ")
+    @NotNull(message = "订单不能为空")
+    private String orderNo;
 
     @ApiModelProperty("订单详情ids ")
     private List<Long> oredrDetilIds;
@@ -26,16 +26,19 @@ public class OrderRefundReq {
     @ApiModelProperty(value = "退款说明 ")
     private String reason;
 
+    @ApiModelProperty(hidden = true)
     private Long userId;
-
+    @ApiModelProperty(hidden = true)
+    private Long orderId;
+    @ApiModelProperty(hidden = true)
     private UserOrderDetailVo oredrDetil;
 
-    public Long getOrderId() {
-        return orderId;
+    public String getOrderNo() {
+        return orderNo;
     }
 
-    public void setOrderId(Long orderId) {
-        this.orderId = orderId;
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
     }
 
     public List<Long> getOredrDetilIds() {
@@ -69,4 +72,12 @@ public class OrderRefundReq {
     public void setOredrDetil(UserOrderDetailVo oredrDetil) {
         this.oredrDetil = oredrDetil;
     }
+
+    public Long getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Long orderId) {
+        this.orderId = orderId;
+    }
 }

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

@@ -43,6 +43,32 @@ public class MusicAlbumSearch extends QueryInfo{
     @ApiModelProperty(value = "平台")
     private String platform;
 
+    @ApiModelProperty("声部id,多个逗号隔开")
+    private String subjectIds;
+
+    @ApiModelProperty(hidden = true)
+    private List<Long> subjectIdList;
+
+
+    public String getSubjectIds() {
+        return subjectIds;
+    }
+
+    public void setSubjectIds(String subjectIds) {
+        this.subjectIds = subjectIds;
+        if (StringUtils.isNotBlank(subjectIds)) {
+            this.subjectIdList = StringUtil.toLongList(subjectIds);
+        }
+    }
+
+    public List<Long> getSubjectIdList() {
+        return subjectIdList;
+    }
+
+    public void setSubjectIdList(List<Long> subjectIdList) {
+        this.subjectIdList = subjectIdList;
+    }
+
     public String getVersion() {
         return version;
     }

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

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

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

@@ -51,7 +51,7 @@ public class LiveRoomVideo implements Serializable {
     private Date endTime;
 
     @TableField("type")
-    @ApiModelProperty(value = "1: 录制开始;2: 录制切片;3: 录制结束;4: 文件上传-融云回调完成;0开始录制  1录制结束 2融云回调完成")
+    @ApiModelProperty(value = "1: 录制开始;2: 录制切片;3: 录制结束;4: 文件上传-融云回调完成")
     private Integer type;
 
     @TableField("created_time_")

+ 13 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicAlbum.java

@@ -39,6 +39,11 @@ public class MusicAlbum extends BaseEntity {
     @ApiModelProperty(value = "专辑标签(多个标签以逗号分开)",required = true)
     private String albumTag;  //专辑标签(多个标签以逗号分开)
 
+	@TableField("subject_id_")
+	@NotBlank(message = "专辑声部不能为空 ")
+	@ApiModelProperty(value = "专辑声部(多个标签以逗号分开)",required = true)
+	private String subjectId;  //专辑标签(多个标签以逗号分开)
+
     @TableField("album_cover_url_")
 	@NotBlank(message = "专辑封面图片不能为空 ")
     @ApiModelProperty(value = "专辑封面图片URL",required = true)
@@ -85,6 +90,14 @@ public class MusicAlbum extends BaseEntity {
 	@ApiModelProperty("假删除标识 0:未删除 1:已删除")
 	private Boolean delFlag;
 
+	public String getSubjectId() {
+		return subjectId;
+	}
+
+	public void setSubjectId(String subjectId) {
+		this.subjectId = subjectId;
+	}
+
 	public MusicAlbum setId(Long id) {
 	    this.id = id;
 	    return this;

+ 23 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/StudentTotal.java

@@ -45,6 +45,13 @@ public class StudentTotal implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date updateTime;
 
+    @ApiModelProperty("专辑数 ")
+    @TableField(value = "music_album_num_")
+    private Integer musicAlbumNum = 0;
+    @ApiModelProperty("曲谱数 ")
+    @TableField(value = "music_sheet_num_")
+    private Integer musicSheetNum = 0;
+
     public Long getUserId() {
         return userId;
     }
@@ -108,4 +115,20 @@ public class StudentTotal implements Serializable {
     public void setUpdateTime(Date updateTime) {
         this.updateTime = updateTime;
     }
+
+    public Integer getMusicAlbumNum() {
+        return musicAlbumNum;
+    }
+
+    public void setMusicAlbumNum(Integer musicAlbumNum) {
+        this.musicAlbumNum = musicAlbumNum;
+    }
+
+    public Integer getMusicSheetNum() {
+        return musicSheetNum;
+    }
+
+    public void setMusicSheetNum(Integer musicSheetNum) {
+        this.musicSheetNum = musicSheetNum;
+    }
 }

+ 23 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TeacherTotal.java

@@ -42,6 +42,14 @@ public class TeacherTotal implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date updateTime;
 
+    @ApiModelProperty("专辑数 ")
+    @TableField(value = "music_album_num_")
+    private Integer musicAlbumNum = 0;
+    @ApiModelProperty("曲谱数 ")
+    @TableField(value = "music_sheet_num_")
+    private Integer musicSheetNum = 0;
+
+
     public Long getUserId() {
         return userId;
     }
@@ -98,4 +106,19 @@ public class TeacherTotal implements Serializable {
         this.updateTime = updateTime;
     }
 
+    public Integer getMusicAlbumNum() {
+        return musicAlbumNum;
+    }
+
+    public void setMusicAlbumNum(Integer musicAlbumNum) {
+        this.musicAlbumNum = musicAlbumNum;
+    }
+
+    public Integer getMusicSheetNum() {
+        return musicSheetNum;
+    }
+
+    public void setMusicSheetNum(Integer musicSheetNum) {
+        this.musicSheetNum = musicSheetNum;
+    }
 }

+ 1 - 7
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/CourseScheduleEnum.java

@@ -42,13 +42,7 @@ public enum CourseScheduleEnum implements BaseEnum<String, CourseScheduleEnum> {
         CourseScheduleEnum[] values = {PRACTICE, LIVE, PIANO_ROOM_CLASS};
         existCourse(values, code, errMsg);
         //返回枚举对象
-        if (code.equals(CourseScheduleEnum.PRACTICE.getCode())) {
-            return CourseScheduleEnum.PRACTICE;
-        } else if (code.equals(CourseScheduleEnum.LIVE.getCode())) {
-            return CourseScheduleEnum.LIVE;
-        } else {
-            return CourseScheduleEnum.PIANO_ROOM_CLASS;
-        }
+        return CourseScheduleEnum.valueOf(code);
     }
 
     /**

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

@@ -8,9 +8,10 @@ import com.yonge.toolset.base.enums.BaseEnum;
  */
 public enum TeacherSalaryEnum implements BaseEnum<String, TeacherSalaryEnum> {
     //未上课-还未开始上课等待上课结束后结算
-    NOT_START("未结算"),
+    NOT_START("未开始"),
     //已结算-已经结算完成
     COMPLETE("已结算"),
+    WAIT("未结算"),
     //已取消-学生发起退款等等其他操作
     CANCEL("已取消");
 

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

@@ -236,6 +236,8 @@ public interface CourseScheduleService extends IService<CourseSchedule> {
 
     void scheduleTask();
 
+    void teacherSalaryTask();
+
     PianoRoomTimeVo selectRemainTime(Long teacherId);
 
     PageInfo<CourseStudentVo> selectStudent(Map<String, Object> param);

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

@@ -2,9 +2,11 @@ package com.yonge.cooleshow.biz.dal.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.dao.LiveRoomDao;
-import com.yonge.cooleshow.biz.dal.entity.*;
-import com.yonge.cooleshow.biz.dal.vo.RoomVo;
-import org.springframework.transaction.annotation.Transactional;
+import com.yonge.cooleshow.biz.dal.entity.ImRoomMessage;
+import com.yonge.cooleshow.biz.dal.entity.ImUserStateSync;
+import com.yonge.cooleshow.biz.dal.entity.LiveRoom;
+import com.yonge.cooleshow.biz.dal.entity.RoomInfoCache;
+import com.yonge.toolset.base.page.PageInfo;
 
 import java.util.List;
 import java.util.Map;
@@ -20,11 +22,14 @@ public interface LiveRoomService extends IService<LiveRoom> {
     LiveRoomDao getDao();
 
     /**
-     * 根据房间uid查询房间信息
+     * 分页查询当前用户关联的房间信息
      *
-     * @param roomUid 房间uid
+     * @param param 参数
+     *              <p>roomType 房间类型  LIVE-直播课  TEMP-临时直播间
+     *              <p>page 页数
+     *              <p>rows 每页数量
      */
-    RoomVo queryRoomInfo(String roomUid);
+    PageInfo<LiveRoom> queryPageRoom(Map<String, Object> param);
 
     /**
      * 校验房间信息,及个人信息
@@ -60,11 +65,6 @@ public interface LiveRoomService extends IService<LiveRoom> {
     void destroyLiveRoom(String roomUId);
 
     /**
-     * 定时任务-清理过期的房间-陪练课
-     */
-    void destroyExpiredPracticeRoom();
-
-    /**
      * 创建临时房间-直播间
      */
     String createTempLiveRoom(Map<String, Object> param);

+ 9 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/LiveRoomVideoService.java

@@ -5,6 +5,8 @@ import com.yonge.cooleshow.biz.dal.dao.LiveRoomVideoDao;
 import com.yonge.cooleshow.biz.dal.entity.LiveRoomVideo;
 import com.yonge.cooleshow.biz.dal.entity.RecordNotify;
 
+import java.util.List;
+
 /**
  * 直播视频记录(LiveRoomVideo)表服务接口
  *
@@ -15,6 +17,13 @@ public interface LiveRoomVideoService extends IService<LiveRoomVideo> {
 
     LiveRoomVideoDao getDao();
 
+    /**
+     * 查询对应房间的录像
+     *
+     * @param roomUid 房间uid
+     */
+    List<LiveRoomVideo> queryVideo(String roomUid);
+
     void recordSync(RecordNotify recordNotify);
 }
 

+ 16 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetService.java

@@ -14,6 +14,7 @@ import com.yonge.cooleshow.biz.dal.vo.*;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.utils.easyexcel.ExcelDataReaderProperty;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -251,4 +252,19 @@ public interface MusicSheetService extends IService<MusicSheet> {
      * @return
      */
     TeacherAuditMusicSheetVo selectTeacherCount(Long userId);
+
+    /**
+     * 老师统计
+     * @author liweifan
+     * @param userId
+     * @return
+     */
+    List<TeacherTotalVo> queryTeacherTotal(Long userId);
+
+    /***
+     * 学生统计
+     * @author liweifan
+     * @param: userId
+     */
+    List<StudentTotalVo> queryStudentTotal(Long userId);
 }

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

@@ -44,7 +44,7 @@ public interface UserOrderPaymentService extends IService<UserOrderPayment> {
      * @updateTime 2022/5/6 14:49
      * @return: com.yonge.cooleshow.biz.dal.entity.UserOrderPayment
      */
-    UserOrderPayment onlyClosePayment(String orderNo, String reason);
+    Boolean onlyClosePayment(String orderNo, String reason);
     /***
      * 关闭付款单
      * @author liweifan
@@ -53,7 +53,7 @@ public interface UserOrderPaymentService extends IService<UserOrderPayment> {
      * @updateTime 2022/5/6 14:49
      * @return: com.yonge.cooleshow.biz.dal.entity.UserOrderPayment
      */
-    UserOrderPayment closePaymentAndReqOpen(String orderNo, String reason);
+    Boolean closePaymentAndReqOpen(String orderNo, String reason);
 
 
     /***

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

@@ -56,7 +56,7 @@ public interface UserOrderRefundService extends IService<UserOrderRefund>  {
     HttpResponseResult<Boolean> doAuth(AuthOperaReq authOperaReq, SysUser user);
 
 	/**
-	 * 系統自動退款
+	 * 系統自動退款(退已完成的订单)
 	 * @param orderNo
 	 * @param reason
 	 * @return
@@ -64,6 +64,14 @@ public interface UserOrderRefundService extends IService<UserOrderRefund>  {
 	HttpResponseResult<UserOrderRefundBill> orderRefund(String orderNo, String reason);
 
 	/**
+	 * 交易失败退款(退已完成的订单)
+	 * @param data
+	 * @param reason
+	 * @return
+	 */
+	HttpResponseResult<UserOrderRefundBill> orderFailRefund(PaymentCallBack data, String orderNo, String reason);
+
+	/**
 	 * 退款回调
 	 * @param data
 	 */

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

@@ -66,7 +66,7 @@ public interface UserOrderService extends IService<UserOrder> {
      * @updateTime 2022/3/31 15:42
      * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<com.yonge.cooleshow.biz.dal.entity.Order>
      */
-    HttpResponseResult<UserOrder> executeOrder(OrderReq orderReq) throws Exception;
+    HttpResponseResult<UserOrder> executeOrder(OrderReq orderReq);
 
     /***
      * 订单付款
@@ -75,7 +75,7 @@ public interface UserOrderService extends IService<UserOrder> {
      * @updateTime 2022/3/31 17:23
      * @return: com.yonge.cooleshow.common.entity.HttpResponseResult
      */
-    HttpResponseResult<OrderPayRes> orderPay(OrderPayReq payReq) throws Exception;
+    HttpResponseResult<OrderPayRes> orderPay(OrderPayReq payReq);
 
     /***
      * 通过业务id查询用户正在交易中的订单

+ 5 - 5
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java

@@ -735,20 +735,20 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
 
         // 课程组 人数 + 1
         courseGroup.setPreStudentNum(courseGroup.getPreStudentNum() + 1);
-
+        //查询课程组课程列表
         List<CourseSchedule> courseList = courseScheduleService.list(Wrappers.<CourseSchedule>lambdaQuery()
                 .eq(CourseSchedule::getCourseGroupId, studentPayment.getCourseGroupId()));
-        //计算课程组单节课价格 取CourseScheduleStudentPayment expectPrice
-        BigDecimal expectPrice = studentPayment.getExpectPrice();
+        //课程总金额
+        BigDecimal totalExpectPrice = WrapperUtil.sumList(studentPaymentList, CourseScheduleStudentPayment::getExpectPrice);
         //查询直播课服务费
         String liveServiceRateStr = sysConfigService.findConfigValue(SysConfigConstant.LIVE_SERVICE_RATE);
         BigDecimal liveServiceRate = new BigDecimal(liveServiceRateStr).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
         //总课酬  1 - (1 * 手续费率)
-        BigDecimal totalRatePrice = expectPrice.subtract(expectPrice.multiply(liveServiceRate)).setScale(2, RoundingMode.HALF_UP);
+        BigDecimal totalRatePrice = totalExpectPrice.subtract(totalExpectPrice.multiply(liveServiceRate)).setScale(2, RoundingMode.HALF_UP);
         //获取每节课的实际课酬 key 课堂数  value 课酬
         Map<Integer, BigDecimal> singerActualCourseSalary = WrapperUtil.getAveragePrice(courseGroup.getCourseNum(), totalRatePrice);
         //获取每节课的预计原课酬 key 课堂数  value 课酬
-        Map<Integer, BigDecimal> singerExpectCourseSalary = WrapperUtil.getAveragePrice(courseGroup.getCourseNum(), expectPrice);
+        Map<Integer, BigDecimal> singerExpectCourseSalary = WrapperUtil.getAveragePrice(courseGroup.getCourseNum(), totalExpectPrice);
         //写入课酬表计算-根据课程组总金额计算分配到每节课的金额
         Date now = new Date();
         List<CourseScheduleTeacherSalary> teacherSalaryList = new ArrayList<>();

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

@@ -22,7 +22,7 @@ import com.yonge.cooleshow.biz.dal.dto.search.PracticeTeacherSearch;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.service.*;
-import com.yonge.cooleshow.biz.dal.support.DistributedLock;
+import com.yonge.toolset.payment.util.DistributedLock;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
 import com.yonge.cooleshow.biz.dal.vo.*;
@@ -51,6 +51,7 @@ import java.math.RoundingMode;
 import java.text.SimpleDateFormat;
 import java.time.Instant;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.time.temporal.ChronoUnit;
 import java.time.temporal.TemporalAdjusters;
 import java.util.*;
@@ -59,6 +60,7 @@ import java.util.function.BiConsumer;
 import java.util.function.BiFunction;
 import java.util.function.Function;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import static com.yonge.cooleshow.biz.dal.support.WrapperUtil.inInterSection;
 
@@ -805,6 +807,10 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         sysConfig.put("liveStartTime", sysConfigService.findConfigValue(SysConfigConstant.PRE_CREATE_LIVE_ROOM_MINUTE));
         //直播结束后,XX分钟关闭房间
         sysConfig.put("liveEndTime", sysConfigService.findConfigValue(SysConfigConstant.DESTROY_EXPIRED_LIVE_ROOM_MINUTE));
+        //提前XX分钟创建/进入琴房课房间时间
+        sysConfig.put("pianoStartTime", sysConfigService.findConfigValue(SysConfigConstant.PRE_CREATE_PIANO_ROOM_MINUTE));
+        //琴房课结束后,XX分钟关闭房间
+        sysConfig.put("pianoEndTime", sysConfigService.findConfigValue(SysConfigConstant.DESTROY_EXPIRED_PIANO_ROOM_MINUTE));
 
         Map map = new HashMap();
         map.put("sysConfig", sysConfig);
@@ -848,6 +854,10 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         sysConfig.put("liveStartTime", sysConfigService.findConfigValue(SysConfigConstant.PRE_CREATE_LIVE_ROOM_MINUTE));
         //直播结束后,XX分钟关闭房间
         sysConfig.put("liveEndTime", sysConfigService.findConfigValue(SysConfigConstant.DESTROY_EXPIRED_LIVE_ROOM_MINUTE));
+        //提前XX分钟创建/进入琴房课房间时间
+        sysConfig.put("pianoStartTime", sysConfigService.findConfigValue(SysConfigConstant.PRE_CREATE_PIANO_ROOM_MINUTE));
+        //琴房课结束后,XX分钟关闭房间
+        sysConfig.put("pianoEndTime", sysConfigService.findConfigValue(SysConfigConstant.DESTROY_EXPIRED_PIANO_ROOM_MINUTE));
 
         Map map = new HashMap();
         map.put("sysConfig", sysConfig);
@@ -1044,7 +1054,9 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         } catch (InterruptedException e) {
             throw new BizException("创建陪练课失败:{}", e.getMessage());
         } finally {
-            lock.unlock();
+            if (lock.isLocked() && lock.isHeldByCurrentThread()) {
+                lock.unlock();
+            }
         }
         return HttpResponseResult.failed();
     }
@@ -1180,7 +1192,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
                 .eq(CourseSchedule::getStatus, CourseScheduleEnum.NOT_START)
                 .eq(CourseSchedule::getType, CourseScheduleEnum.PRACTICE));
         if (ObjectUtil.isEmpty(schedule)) {
-            throw new BizException("无法调整该课程");
+            throw new BizException("无法调整该课程,课程不存在");
         }
 
         //校验系统配置上下课时间
@@ -1189,7 +1201,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         Date s = DateUtil.strToDate(DateUtil.dateToString(classDate) + " " + star + ":00");
         Date e = DateUtil.strToDate(DateUtil.dateToString(classDate) + " " + end + ":00");
         if (startTime.before(s) || endTime.after(e)) {
-            throw new BizException("无法调整该课程");
+            throw new BizException("调整时间必须在{}到{}之间", star, end);
         }
 
         //查询是否有人购买
@@ -1449,6 +1461,10 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         sysConfig.put("liveStartTime", sysConfigService.findConfigValue(SysConfigConstant.PRE_CREATE_LIVE_ROOM_MINUTE));
         //直播结束后,XX分钟关闭房间
         sysConfig.put("liveEndTime", sysConfigService.findConfigValue(SysConfigConstant.DESTROY_EXPIRED_LIVE_ROOM_MINUTE));
+        //提前XX分钟创建/进入琴房课房间时间
+        sysConfig.put("pianoStartTime", sysConfigService.findConfigValue(SysConfigConstant.PRE_CREATE_PIANO_ROOM_MINUTE));
+        //琴房课结束后,XX分钟关闭房间
+        sysConfig.put("pianoEndTime", sysConfigService.findConfigValue(SysConfigConstant.DESTROY_EXPIRED_PIANO_ROOM_MINUTE));
         return sysConfig;
     }
 
@@ -1596,12 +1612,40 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
      */
     @Transactional(rollbackFor = Exception.class)
     public void scheduleTask() {
-        //课程开始(开课时间 ≤ NOW ≤ 结束时间)
-        List<CourseSchedule> courseStart = baseMapper.selectList(Wrappers.<CourseSchedule>lambdaQuery()
+        //查询房间配置时间
+        LocalDateTime liveMinute = LocalDateTime.now().plusMinutes(Long.parseLong(sysConfigService.findConfigValue(SysConfigConstant.PRE_CREATE_LIVE_ROOM_MINUTE)));
+        LocalDateTime practiceMinute = LocalDateTime.now().plusMinutes(Long.parseLong(sysConfigService.findConfigValue(SysConfigConstant.PRE_CREATE_PRACTICE_ROOM_MINUTE)));
+        LocalDateTime pianoMinute = LocalDateTime.now().plusMinutes(Long.parseLong(sysConfigService.findConfigValue(SysConfigConstant.PRE_CREATE_PIANO_ROOM_MINUTE)));
+
+        //课程开始(开课时间 ≤ (NOW + 提前进入房间时间(分)) && NOW ≤ 结束时间)
+        List<CourseSchedule> liveStart = baseMapper.selectList(Wrappers.<CourseSchedule>lambdaQuery()
+                .eq(CourseSchedule::getLock, 0)
+                .eq(CourseSchedule::getStatus, CourseScheduleEnum.NOT_START)
+                .eq(CourseSchedule::getType, CourseScheduleEnum.LIVE)
+                .le(CourseSchedule::getStartTime, liveMinute)
+                .ge(CourseSchedule::getEndTime, LocalDateTime.now()));
+        List<CourseSchedule> practiceStart = baseMapper.selectList(Wrappers.<CourseSchedule>lambdaQuery()
                 .eq(CourseSchedule::getLock, 0)
                 .eq(CourseSchedule::getStatus, CourseScheduleEnum.NOT_START)
-                .le(CourseSchedule::getStartTime, new Date())
-                .ge(CourseSchedule::getEndTime, new Date()));
+                .eq(CourseSchedule::getType, CourseScheduleEnum.PRACTICE)
+                .le(CourseSchedule::getStartTime, practiceMinute)
+                .ge(CourseSchedule::getEndTime, LocalDateTime.now()));
+        List<CourseSchedule> pianoStart = baseMapper.selectList(Wrappers.<CourseSchedule>lambdaQuery()
+                .eq(CourseSchedule::getLock, 0)
+                .eq(CourseSchedule::getStatus, CourseScheduleEnum.NOT_START)
+                .eq(CourseSchedule::getType, CourseScheduleEnum.PIANO_ROOM_CLASS)
+                .le(CourseSchedule::getStartTime, pianoMinute)
+                .ge(CourseSchedule::getEndTime, LocalDateTime.now()));
+        if (CollectionUtils.isEmpty(liveStart)) {
+            liveStart = new ArrayList<>();
+        }
+        if (CollectionUtils.isEmpty(practiceStart)) {
+            practiceStart = new ArrayList<>();
+        }
+        if (CollectionUtils.isEmpty(pianoStart)) {
+            pianoStart = new ArrayList<>();
+        }
+        List<CourseSchedule> courseStart = Stream.of(liveStart, practiceStart, pianoStart).flatMap(Collection::stream).collect(Collectors.toList());
         if (CollectionUtils.isNotEmpty(courseStart)) {
             //课程状态更新为ING
             baseMapper.updateStartTime(courseStart);
@@ -1612,23 +1656,18 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         if (CollectionUtils.isNotEmpty(userList)) {
             List<CourseScheduleStudentVo> practiceList = userList.stream().filter(s -> s.getType().equals(CourseScheduleEnum.PRACTICE.getCode())).collect(Collectors.toList());
             if (CollectionUtils.isNotEmpty(practiceList)) {//陪练课
-                //创建课程评论
-                repliedDao.insertBatch(practiceList);
-
-                //老师课酬状态改为已完成
+                //老师课酬状态改为待结算
                 courseScheduleTeacherSalaryService.update(null, Wrappers.<CourseScheduleTeacherSalary>lambdaUpdate()
-                        .set(CourseScheduleTeacherSalary::getStatus, CourseScheduleEnum.COMPLETE.getCode())
-                        .set(CourseScheduleTeacherSalary::getSettlementTime, new Date())
+                        .set(CourseScheduleTeacherSalary::getStatus, TeacherSalaryEnum.WAIT.getCode())
                         .in(CourseScheduleTeacherSalary::getCourseScheduleId, practiceList.stream().map(CourseScheduleStudentVo::getCourseId).collect(Collectors.toList())));
 
-                //获取教师课酬写入到金额变更表
-                for (CourseScheduleStudentVo practice : practiceList) {
-                    userAccountService.accountChange(
-                            new UserAccountRecordDto(practice.getTeacherId(), practice.getActualSalary()
-                                    , InOrOutEnum.IN, AccountBizTypeEnum.PRACTICE, practice.getCourseId(),
-                                    practice.getGroupName(), practice.getOrderNo())
-                    );
+                //创建课程评论
+                List<Long> ids = practiceList.stream().map(CourseScheduleStudentVo::getCourseId).collect(Collectors.toList());
+                repliedDao.deleteBatch(ids);
+                repliedDao.insertBatch(practiceList);
 
+                //清除缓存
+                for (CourseScheduleStudentVo practice : practiceList) {
                     //清除学生统计缓存
                     redissonClient.getBucket(CacheNameEnum.STUDENT_TOTAL.getRedisKey(practice.getStudentId())).delete();
                     //清除老师统计缓存
@@ -1651,6 +1690,9 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
                         .map(s -> {
                             Integer studentCount = s.getStudentCount();
                             Integer n = (Integer) WrapperUtil.strToFormula(formula, "n", String.valueOf(studentCount + 1));
+                            if (n == null) {
+                                throw new BizException("公式转换失败");
+                            }
                             s.setConsumTime(s.getSingleCourseTime() * n);
                             return s;
                         })
@@ -1696,17 +1738,27 @@ 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_SETTLEMENT_TIME_DAY));
+        //获取n天前日期
+        String day = DateUtil.getDayAgoOrAftString(-settlementDay);
+
+        List<UserAccountRecordDto> list = baseMapper.selectWaitCourse(day);
+        if (CollectionUtils.isNotEmpty(list)) {
+            for (UserAccountRecordDto dto : list) {
+                userAccountService.accountChange(dto);
+            }
+
+            Set<Long> bizIds = list.stream().map(UserAccountRecordDto::getBizId).collect(Collectors.toSet());
+            courseScheduleTeacherSalaryService.update(null, Wrappers.<CourseScheduleTeacherSalary>lambdaUpdate()
+                    .set(CourseScheduleTeacherSalary::getStatus, TeacherSalaryEnum.COMPLETE.getCode())
+                    .set(CourseScheduleTeacherSalary::getSettlementTime, new Date())
+                    .in(CourseScheduleTeacherSalary::getCourseScheduleId, bizIds));
+        }
+
+    }
 
     /**
      * @Description: 查询琴房剩余时长、冻结时长、统计学员人数
@@ -1758,6 +1810,9 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
 
         String formula = sysConfigService.findConfigValue(SysConfigConstant.PIANO_ROOM_TIME_FORMULA);
         Integer n = (Integer) WrapperUtil.strToFormula(formula, "n", String.valueOf(studentIds.size() + 1));//人数计算 公式n*(n-1) n包含老师
+        if (n == null) {
+            throw new BizException("公式转换失败");
+        }
         Integer consumTime = classNum * singleClssTime * n;//消耗时长 课程数*单课时长*人数
 
         List<CourseTimeEntity> timeList = arrangeCourseVo.getTimeList();//选课时间
@@ -1989,6 +2044,9 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
 
         String formula = sysConfigService.findConfigValue(SysConfigConstant.PIANO_ROOM_TIME_FORMULA);
         Integer n = (Integer) WrapperUtil.strToFormula(formula, "n", String.valueOf(studentPaymentList.size() + 1));//人数计算 公式n*(n-1) n包含老师
+        if (n == null) {
+            throw new BizException("公式转换失败");
+        }
         Integer time = schedule.getSingleCourseTime() * n;//消耗时长 课程数*单课时长*人数
 
         PianoRoomTime pianoRoomTime = pianoRoomTimeDao.selectOne(Wrappers.<PianoRoomTime>lambdaQuery().eq(PianoRoomTime::getTeacherId, teacherId));
@@ -2147,6 +2205,9 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         String formula = sysConfigService.findConfigValue(SysConfigConstant.PIANO_ROOM_TIME_FORMULA);
         Integer after = (Integer) WrapperUtil.strToFormula(formula, "n", String.valueOf(studentIds.size() + 1));//变更后
         Integer before = (Integer) WrapperUtil.strToFormula(formula, "n", String.valueOf(paymentList.size() + 1));//变更前
+        if (after == null || before == null) {
+            throw new BizException("公式转换失败");
+        }
         int diffTime = singleCourseTime * (after - before);//人数变更后单课耗时
         if (remainTime - diffTime < 0) {
             throw new BizException("剩余时长不足");

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

@@ -40,6 +40,7 @@ public class HomeServiceImpl implements HomeService {
         userToDoNum.setMusicianNum(null == userToDoNum.getMusicianNum() ? 0 : userToDoNum.getMusicianNum());
         userToDoNum.setMusicNum(null == userToDoNum.getMusicNum() ? 0 : userToDoNum.getMusicNum());
         userToDoNum.setVideoCourseNum(null == userToDoNum.getVideoCourseNum() ? 0 : userToDoNum.getVideoCourseNum());
+        userToDoNum.setStyleNum(null == userToDoNum.getStyleNum()? 0 : userToDoNum.getStyleNum());
         return userToDoNum;
     }
 

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

@@ -1,21 +1,26 @@
 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.plugins.pagination.Page;
 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;
-import com.yonge.cooleshow.biz.dal.dto.UserAccountRecordDto;
 import com.yonge.cooleshow.biz.dal.entity.*;
-import com.yonge.cooleshow.biz.dal.enums.*;
+import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
+import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
+import com.yonge.cooleshow.biz.dal.enums.RoomTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.TeacherSalaryEnum;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.support.IMHelper;
 import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
-import com.yonge.cooleshow.biz.dal.vo.RoomVo;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.toolset.utils.date.DateUtil;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -24,7 +29,6 @@ import org.redisson.api.RMap;
 import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -36,7 +40,8 @@ import java.util.function.Function;
 import java.util.stream.Collectors;
 
 import static com.yonge.cooleshow.biz.dal.constant.LiveRoomConstant.*;
-import static com.yonge.cooleshow.common.constant.SysConfigConstant.*;
+import static com.yonge.cooleshow.common.constant.SysConfigConstant.DESTROY_EXPIRED_LIVE_ROOM_MINUTE;
+import static com.yonge.cooleshow.common.constant.SysConfigConstant.PRE_CREATE_LIVE_ROOM_MINUTE;
 
 /**
  * 直播房间与课程的关系表表(LiveRoom)表服务实现类
@@ -61,8 +66,6 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
     @Autowired
     private SysConfigService sysConfigService;
     @Autowired
-    private UserAccountService userAccountService;
-    @Autowired
     private UserOrderService userOrderService;
     @Autowired
     private CourseScheduleTeacherSalaryService courseScheduleTeacherSalaryService;
@@ -88,23 +91,23 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
     }
 
     /**
-     * 根据房间uid查询房间信息
+     * 分页查询当前用户关联的房间信息
      *
-     * @param roomUid 房间uid
+     * @param param 参数
+     *              <p>roomType 房间类型  LIVE-直播课  TEMP-临时直播间
+     *              <p>page 页数
+     *              <p>rows 每页数量
      */
     @Override
-    public RoomVo queryRoomInfo(String roomUid) {
-        LiveRoom liveRoom = this.getOne(Wrappers.<LiveRoom>lambdaQuery()
-                .eq(LiveRoom::getRoomUid, roomUid));
-        if (liveRoom == null) {
-            throw new BizException("房间不存在");
-        }
-        RoomVo roomVo = new RoomVo();
-        BeanUtils.copyProperties(liveRoom, roomVo);
-        roomVo.setSpeakerName(getSysUser(liveRoom.getSpeakerId()).getRealName());
-        roomVo.setLikeNum(getLike(roomUid));
-        roomVo.setLookNum(getNum.apply(this::getOnlineUserCache, roomUid));
-        return roomVo;
+    public PageInfo<LiveRoom> queryPageRoom(Map<String, Object> param) {
+        String roomType = WrapperUtil.toStr(param, "roomType");
+        Long userId = getSysUser().getId();
+        Page<LiveRoom> pageInfo = PageUtil.getPageInfo(param);
+        IPage<LiveRoom> page = this.page(pageInfo, Wrappers.<LiveRoom>lambdaQuery()
+                .eq(WrapperUtil.StrPredicate.test(roomType), LiveRoom::getType, roomType)
+                .eq(LiveRoom::getSpeakerId, userId)
+        );
+        return PageUtil.pageInfo(page);
     }
 
     /**
@@ -210,12 +213,21 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
     public String createTempLiveRoom(Map<String, Object> param) {
         //查询主讲人信息
         SysUser sysUser = getSysUser();
+        Long teacherId = sysUser.getId();
+        List<LiveRoom> liveRoomList = this.list(Wrappers.<LiveRoom>lambdaQuery()
+                .eq(LiveRoom::getSpeakerId, teacherId)
+                .eq(LiveRoom::getType, RoomTypeEnum.TEMP.getCode())
+                .eq(LiveRoom::getLiveState, 1)
+                .eq(LiveRoom::getRoomState, 0)
+        );
+        if (CollectionUtils.isNotEmpty(liveRoomList)) {
+            throw new BizException("当前有直播间未结束,无需创建直播!");
+        }
         String roomTitle = WrapperUtil.toStr(param, "roomTitle", "房间标题不能为空!");
         String liveRemark = WrapperUtil.toStr(param, "liveRemark", "直播间描述不能为空!");
         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) {
@@ -233,7 +245,7 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
         room.setSpeakerId(teacherId);
         room.setLiveStartTime(liveStartTime);
         room.setLiveEndTime(liveEndTime);
-        room.setLiveState(0);
+        room.setLiveState(1);
         room.setRoomState(0);
         room.setCreatedBy(teacherId);
         room.setCreatedTime(liveStartTime);
@@ -241,7 +253,7 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
         this.save(room);
         log.info("createTempLiveRoom>>>>>>room:{}", room.getRoomUid());
         //去融云创建房间及创建房间缓存信息
-        createLiveRoomInfo(room, sysUser);
+        this.createLiveRoomInfo(room, sysUser);
         return roomUid;
     }
 
@@ -251,15 +263,15 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
     private void createLiveRoomInfo(LiveRoom room) {
         //查询主讲人信息
         SysUser sysUser = getSysUser(room.getSpeakerId());
-        createLiveRoomInfo(room, sysUser);
+        this.createLiveRoomInfo(room, sysUser);
     }
 
     private void createLiveRoomInfo(LiveRoom room, SysUser sysUser) {
         try {
             //生成主讲人信息
-            createRoomInfoCache(room, sysUser);
+            this.createRoomInfoCache(room, sysUser);
             //去融云创建房间
-            createLiveRoom(room.getRoomUid(), room.getRoomTitle());
+            this.createLiveRoom(room.getRoomUid(), room.getRoomTitle());
         } catch (Exception e) {
             throw new BizException("创建直播间失败!", e.getCause());
         }
@@ -327,16 +339,20 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
         List<LiveRoom> list = this.list(Wrappers.<LiveRoom>lambdaQuery()
                 .eq(LiveRoom::getRoomState, 0)
                 .eq(LiveRoom::getLiveState, 1)
-                .eq(LiveRoom::getType, RoomTypeEnum.LIVE.getCode())
                 .le(LiveRoom::getLiveEndTime, now));
         if (CollectionUtils.isEmpty(list)) {
             return;
         }
         list.forEach(room -> {
-            Date expiredDate = DateUtil.addMinutes(room.getLiveEndTime(), Integer.parseInt(expiredMinuteStr));
-            //当前时间 大于(结束播时间 + 设置的过期分钟数)
+            //直播间过期时间
+            Date expiredDate = room.getLiveEndTime();
+            if (room.getType().equals(RoomTypeEnum.LIVE.getCode())) {
+                //如果是直播课,那么结束时间 = 直播间结束时间 + 设置的过期分钟数
+                expiredDate = DateUtil.addMinutes(room.getLiveEndTime(), Integer.parseInt(expiredMinuteStr));
+            }
+            //当前时间 大于 直播间过期时间
             if (now.getTime() >= expiredDate.getTime()) {
-                destroyLiveRoom(room);
+                this.destroyLiveRoom(room);
             }
         });
     }
@@ -350,7 +366,7 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
     @Transactional(rollbackFor = Exception.class)
     public void destroyLiveRoom(String roomUId) {
         LiveRoom liveRoom = this.getOne(Wrappers.<LiveRoom>lambdaQuery().eq(LiveRoom::getRoomUid, roomUId));
-        destroyLiveRoom(liveRoom);
+        this.destroyLiveRoom(liveRoom);
     }
 
     /**
@@ -362,93 +378,39 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
         if (Objects.isNull(room)) {
             return;
         }
-        //查询老师分润表
-        List<CourseScheduleTeacherSalary> salaryList = courseScheduleTeacherSalaryService.list(Wrappers.<CourseScheduleTeacherSalary>lambdaQuery()
-                .eq(CourseScheduleTeacherSalary::getCourseScheduleId, room.getCourseId())
-        );
-        if (CollectionUtils.isEmpty(salaryList)) {
-            return;
-        }
-        salaryList.forEach(salary -> {
-            //查询该学生及课程id 对应的支付订单号
-            CourseScheduleStudentPayment payment = courseScheduleStudentPaymentService.getOne(Wrappers.<CourseScheduleStudentPayment>lambdaQuery()
-                    .eq(CourseScheduleStudentPayment::getCourseId, room.getCourseId())
-                    .eq(CourseScheduleStudentPayment::getUserId, salary.getStudentId())
+        //直播课
+        if (room.getType().equals(RoomTypeEnum.LIVE.getCode())) {
+            //查询老师分润表
+            List<CourseScheduleTeacherSalary> salaryList = courseScheduleTeacherSalaryService.list(Wrappers.<CourseScheduleTeacherSalary>lambdaQuery()
+                    .eq(CourseScheduleTeacherSalary::getCourseScheduleId, room.getCourseId())
             );
-            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);
-            //修改教师课酬状态-已结算
-            salary.setStatus(TeacherSalaryEnum.COMPLETE.getCode());
-            courseScheduleTeacherSalaryService.updateById(salary);
-        });
-        //删除房间
-        ImDestroyLiveRoom(room.getRoomUid());
-    }
-
-    /**
-     * 定时任务-清理过期的房间-陪练课
-     */
-    public void destroyExpiredPracticeRoom() {
-        //查询房间过期时间
-        String expiredMinuteStr = sysConfigService.findConfigValue(PRE_CREATE_PRACTICE_ROOM_MINUTE);
-        if (StringUtils.isEmpty(expiredMinuteStr)) {
-            log.info("roomDestroy>>>> 未查询到配置:{}", PRE_CREATE_PRACTICE_ROOM_MINUTE);
-            return;
-        }
-        Date now = new Date();
-        //查询已经开始并且没有删除及销毁的直播间
-        List<LiveRoom> list = this.list(Wrappers.<LiveRoom>lambdaQuery()
-                .eq(LiveRoom::getRoomState, 0)
-                .eq(LiveRoom::getLiveState, 1)
-                .eq(LiveRoom::getType, RoomTypeEnum.PRACTICE.getCode())
-                .le(LiveRoom::getLiveEndTime, now));
-        if (CollectionUtils.isEmpty(list)) {
-            return;
+            salaryList.forEach(salary -> {
+                //修改教师课酬状态-已结算
+                salary.setStatus(TeacherSalaryEnum.WAIT.getCode());
+                courseScheduleTeacherSalaryService.updateById(salary);
+            });
+        }
+        //修改房间状态
+        room.setLiveState(2);
+        this.updateById(room);
+        String speakerIdStr = room.getSpeakerId().toString();
+        //关闭直播间发送消息
+        ImRoomMessage message = new ImRoomMessage();
+        message.setFromUserId(speakerIdStr);
+        message.setToChatroomId(room.getRoomUid());
+        message.setObjectName(ImRoomMessage.FORCED_OFFLINE);
+        message.setContent(speakerIdStr);
+        try {
+            this.publishRoomMessage(message);
+            log.info("destroyLiveRoom>>>> FORCED_OFFLINE : {}", speakerIdStr);
+        } catch (Exception e) {
+            log.error("destroyLiveRoom>>>>  FORCED_OFFLINE {}", e.getMessage());
         }
-        list.forEach(room -> {
-            Date expiredDate = DateUtil.addMinutes(room.getLiveEndTime(), Integer.parseInt(expiredMinuteStr));
-            //当前时间 大于(结束播时间 + 设置的过期分钟数)
-            if (now.getTime() >= expiredDate.getTime()) {
-                //删除房间
-                ImDestroyLiveRoom(room.getRoomUid());
-                //查询老师分润表
-                CourseScheduleTeacherSalary salary = courseScheduleTeacherSalaryService.getOne(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)) {
-                    return;
-                }
-                //获取教师课酬写入到金额变更表
-                UserAccountRecordDto userAccountRecord = new UserAccountRecordDto();
-                userAccountRecord.setUserId(room.getSpeakerId());
-                userAccountRecord.setInOrOut(InOrOutEnum.IN);
-                userAccountRecord.setBizType(AccountBizTypeEnum.PRACTICE);
-                userAccountRecord.setBizId(room.getCourseId());
-                userAccountRecord.setBizName(room.getRoomTitle());
-                userAccountRecord.setTransAmount(salary.getActualSalary());//扣除手续费后所得金额
-                userAccountRecord.setOrderNo(payment.getOrderNo());
-                userAccountService.accountChange(userAccountRecord);
-            }
-        });
+        //删除房间
+//        this.ImDestroyLiveRoom(room.getRoomUid());
     }
 
     /**
@@ -558,7 +520,7 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
             message.setObjectName(ImRoomMessage.RC_CHATROOM_LEAVE);
             message.setContent(userId);
             try {
-                publishRoomMessage(message);
+                this.publishRoomMessage(message);
                 log.info("opsRoom>>>> looker RC_CHATROOM_LEAVE : {}", userJsonStr);
             } catch (Exception e) {
                 log.error("opsRoom>>>>  looker error RC_CHATROOM_LEAVE {}", e.getMessage());
@@ -593,7 +555,7 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
             }
             //查询老师是否有进入过放假,没有则写老师考勤表的进入时间
             if (Objects.isNull(teacherAttendance)) {
-                setTeacherAttendance(Long.parseLong(userIdStr), roomInfo.getCourseGroupId(), roomInfo.getCourseId());
+                this.setTeacherAttendance(Long.parseLong(userIdStr), roomInfo.getCourseGroupId(), roomInfo.getCourseId());
             }
             roomInfoCache.set(roomInfo);
             log.info("opsRoom>>>> join speakerCache {}", JSONObject.toJSONString(roomInfo));
@@ -667,12 +629,12 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
      * @param roomUid 房间uid
      */
     public RoomInfoCache speakerJoinRoom(String roomUid) {
-        RoomInfoCache roomInfo = speakerCheckRoomInfo(roomUid);
+        RoomInfoCache roomInfo = this.speakerCheckRoomInfo(roomUid);
         Date now = new Date();
         roomInfo.setSpeakerState(0);
         roomInfo.setJoinRoomTime(now);
         //查询老师是否有进入过,没有则写老师考勤表的进入时间
-        setTeacherAttendance(roomInfo.getSpeakerId(), roomInfo.getCourseGroupId(), roomInfo.getCourseId());
+        this.setTeacherAttendance(roomInfo.getSpeakerId(), roomInfo.getCourseGroupId(), roomInfo.getCourseId());
         //记录当前用户对应的房间uid
         redissonClient.getBucket(LIVE_USER_ROOM.replace(USER_ID, roomInfo.getSpeakerId().toString())).set(roomUid, 2L, TimeUnit.DAYS);
         return roomInfo;
@@ -686,12 +648,12 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
      */
     public RoomInfoCache joinRoom(String roomUid, Long userId) {
         //获取进入房间人员信息
-        SysUser sysUser = getSysUser(userId);
+        SysUser sysUser = this.getSysUser(userId);
         //校验信息
-        RoomInfoCache roomInfo = checkStudentRoom(roomUid, sysUser);
+        RoomInfoCache roomInfo = this.checkStudentRoom(roomUid, sysUser);
         Date now = new Date();
         //房间累计用户信息-指只要进入到该房间的用户都要记录
-        RMap<Long, String> roomTotalUser = getTotalUserCache(roomUid);
+        RMap<Long, String> roomTotalUser = this.getTotalUserCache(roomUid);
         //判断是否第一次进房间
         RoomUserInfoCache userInfo;
         if (roomTotalUser.containsKey(userId)) {
@@ -704,7 +666,7 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
             userInfo.setUserName(sysUser.getRealName());
             userInfo.setFirstJoinTime(now);
             //查询学生是否有进入过,没有则写学生考勤表的进入时间
-            setStudentAttendance(userId, roomInfo.getCourseGroupId(), roomInfo.getCourseId());
+            this.setStudentAttendance(userId, roomInfo.getCourseGroupId(), roomInfo.getCourseId());
         }
         userInfo.setDynamicJoinTime(now);
         //用户json信息
@@ -712,7 +674,7 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
         //写入人员缓存
         roomTotalUser.fastPut(userId, userJsonStr);
         //写入在线人员缓存
-        RMap<Long, String> onlineUserCache = getOnlineUserCache(roomUid);
+        RMap<Long, String> onlineUserCache = this.getOnlineUserCache(roomUid);
         onlineUserCache.fastPut(userId, userJsonStr);
         log.info("joinRoom>>>> userInfo: {}", userJsonStr);
         //向直播间发送当前在线人数消息
@@ -833,7 +795,7 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
         message.setContent(sendMap);
         //发送消息
         try {
-            publishRoomMessage(message);
+            this.publishRoomMessage(message);
             log.info("sendOnlineUserCount>>>> message: {}", JSONObject.toJSONString(message));
         } catch (Exception e) {
             log.error("sendOnlineUserCount>>>> error {}", e.getMessage());

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

@@ -15,6 +15,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.Date;
+import java.util.List;
 import java.util.Objects;
 
 /**
@@ -36,6 +37,19 @@ public class LiveRoomVideoServiceImpl extends ServiceImpl<LiveRoomVideoDao, Live
         return this.baseMapper;
     }
 
+    /**
+     * 查询对应房间的录像
+     *
+     * @param roomUid 房间uid
+     */
+    @Override
+    public List<LiveRoomVideo> queryVideo(String roomUid) {
+        return this.list(Wrappers.<LiveRoomVideo>lambdaQuery()
+                .eq(LiveRoomVideo::getRoomUid, roomUid)
+                .eq(LiveRoomVideo::getType, 4)
+        );
+    }
+
     @Override
     public void recordSync(RecordNotify recordNotify) {
         if (recordNotify.getCode().equals(200)) {

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

@@ -94,6 +94,10 @@ public class MusicAlbumServiceImpl extends ServiceImpl<MusicAlbumDao,MusicAlbum>
         albumDetailVo.setAlbumFavoriteCount(musicAlbum.getAlbumFavoriteCount());
         albumDetailVo.setMusicTagNames(musicTagService.getMusicTagNames(StringUtil.toLongList(musicAlbum.getAlbumTag())));
 
+        if(query.getType() == 1) {
+            query.setSubjectIds(musicAlbum.getSubjectId());
+        }
+
         IPage<MusicSheetVo> musicSheetVoIPage = musicSheetService.selectAlbumDetailPage(page,query);
         albumDetailVo.setMusicSheetList(PageUtil.pageInfo(musicSheetVoIPage));
 

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

@@ -158,6 +158,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
         query.setAuditStatus(AuthStatusEnum.PASS);
         query.setState(YesOrNoEnum.YES);
         query.setDelFlag(false);
+        query.setSourceType(SourceTypeEnum.TEACHER);
         // 只查3条
         query.setRows(3);
         IPage<MusicSheetVo> musicSheetVoIPage = selectPage(PageUtil.getPage(query), query);
@@ -215,6 +216,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
                     studentId, detail.getId());
             if (musicSheetPurchaseRecord != null) {
                 detail.setOrderStatus(musicSheetPurchaseRecord.getOrderStatus());
+                detail.setOrderNo(musicSheetPurchaseRecord.getOrderNo());
                 if (OrderStatusEnum.PAID.getCode().equals(musicSheetPurchaseRecord.getOrderStatus().getCode())) {
                     detail.setPlay(YesOrNoEnum.YES);
                 }
@@ -375,6 +377,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
                 .eq(MusicSheet::getCreateBy,sysUser.getId())
                 .eq(MusicSheet::getState,YesOrNoEnum.YES)
                 .eq(MusicSheet::getDelFlag,YesOrNoEnum.NO)
+                .eq(MusicSheet::getSourceType,SourceTypeEnum.TEACHER.getCode())
                 .count();
     }
 
@@ -793,6 +796,16 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
         return baseMapper.selectTeacherCount(userId);
     }
 
+    @Override
+    public List<TeacherTotalVo> queryTeacherTotal(Long userId) {
+        return baseMapper.queryTeacherTotal(userId);
+    }
+
+    @Override
+    public List<StudentTotalVo> queryStudentTotal(Long userId) {
+        return baseMapper.queryStudentTotal(userId);
+    }
+
     private SysUser getSysUser(Long userId) {
         return Optional.ofNullable(userId)
                        .map(sysUserFeignService::queryUserById)

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

@@ -88,6 +88,8 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
         studentHomeVo.setFinshClassHours(null == total.getFinshHours() ? 0 : total.getFinshHours());
         studentHomeVo.setUnfinshClassHours(null == total.getUnfinshHours() ? 0 : total.getUnfinshHours());
         studentHomeVo.setStarTeacherNum(null == total.getStarTeacherNum() ? 0 : total.getStarTeacherNum());
+        studentHomeVo.setMusicAlbumNum(null == total.getMusicAlbumNum() ? 0 : total.getMusicAlbumNum());
+        studentHomeVo.setMusicSheetNum(null == total.getMusicSheetNum() ? 0 : total.getMusicSheetNum());
         return studentHomeVo;
     }
 
@@ -155,7 +157,7 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
             //学生老师增加好友关系
             Set<Long> studentIds = new HashSet<>();
             studentIds.add(studentVo.getUserId());
-            imUserFriendService.saveUserFriend(userId,studentIds);
+            imUserFriendService.saveUserFriend(userId, studentIds);
         }
         resMap.put("now", detail);
         return HttpResponseResult.succeed(resMap);

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

@@ -8,7 +8,9 @@ import com.yonge.cooleshow.biz.dal.dao.StudentDao;
 import com.yonge.cooleshow.biz.dal.dao.StudentStarDao;
 import com.yonge.cooleshow.biz.dal.entity.Student;
 import com.yonge.cooleshow.biz.dal.entity.StudentStar;
+import com.yonge.cooleshow.biz.dal.service.MusicSheetService;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
+import org.redisson.api.RBucket;
 import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -40,6 +42,8 @@ public class StudentTotalServiceImpl extends ServiceImpl<StudentTotalDao, Studen
     private CourseScheduleDao courseScheduleDao;
     @Autowired
     private RedissonClient redissonClient;
+    @Autowired
+    private MusicSheetService musicSheetService;
 
     @Override
     public StudentTotalVo detail(Long id) {
@@ -68,24 +72,34 @@ public class StudentTotalServiceImpl extends ServiceImpl<StudentTotalDao, Studen
         if (!CollectionUtils.isEmpty(studentCourseTotal)) {
             studentCourseMap = studentCourseTotal.stream().collect(Collectors.toMap(StudentTotalVo::getUserId, o -> o));
         }
+
+        //乐谱统计
+        List<StudentTotalVo> studentMusicTotal = musicSheetService.queryStudentTotal(null);
+        Map<Long, StudentTotalVo> studentMusicMap = new HashMap<>();
+        if (!CollectionUtils.isEmpty(studentMusicTotal)) {
+            studentMusicMap = studentMusicTotal.stream().collect(Collectors.toMap(StudentTotalVo::getUserId, o -> o));
+        }
+
         List<StudentTotal> resultList = new ArrayList<>();
         for (Student student : students) {
             StudentTotal studentTotal = new StudentTotal();
             studentTotal.setUserId(student.getUserId());
             StudentTotalVo starTotal = studentStarMap.get(student.getUserId());
-            if (null != starTotal && null != starTotal.getStarTeacherNum()) {
-                studentTotal.setStarTeacherNum(starTotal.getStarTeacherNum());
+            if (null != starTotal) {
+                studentTotal.setStarTeacherNum(null == starTotal.getStarTeacherNum() ? 0 : starTotal.getStarTeacherNum());
             }
             StudentTotalVo courseTotal = studentCourseMap.get(student.getUserId());
             if (null != courseTotal) {
-                if (null != courseTotal.getFinshHours()) {
-                    studentTotal.setFinshHours(courseTotal.getFinshHours());
-                }
-                if (null != courseTotal.getUnfinshHours()) {
-                    studentTotal.setUnfinshHours(courseTotal.getUnfinshHours());
-                }
+                studentTotal.setFinshHours(null == courseTotal.getFinshHours() ? 0 : courseTotal.getFinshHours());
+                studentTotal.setUnfinshHours(null == courseTotal.getUnfinshHours() ? 0 : courseTotal.getUnfinshHours());
             }
-            //todo 缺少累计练习天数 累计练习时长 累计评测次数
+
+            StudentTotalVo musicTotal = studentMusicMap.get(student.getUserId());
+            if (null != musicTotal) {
+                studentTotal.setMusicAlbumNum(null == musicTotal.getMusicAlbumNum() ? 0 : musicTotal.getMusicAlbumNum());
+                studentTotal.setMusicSheetNum(null == musicTotal.getMusicSheetNum() ? 0 : musicTotal.getMusicSheetNum());
+            }
+
             resultList.add(studentTotal);
             redissonClient.getBucket(CacheNameEnum.STUDENT_TOTAL.getRedisKey(studentTotal.getUserId()))
                     .set(studentTotal);
@@ -96,19 +110,22 @@ public class StudentTotalServiceImpl extends ServiceImpl<StudentTotalDao, Studen
 
     @Override
     public StudentTotal getTotalById(Long id) {
-        StudentTotal total = (StudentTotal) redissonClient.getBucket(CacheNameEnum.STUDENT_TOTAL.getRedisKey(id))
-                .get();
-        if (null == total) {
+        RBucket<Object> bucket = redissonClient.getBucket(CacheNameEnum.STUDENT_TOTAL.getRedisKey(id));
+        if (bucket.isExists()) {
+            return (StudentTotal) bucket.get();
+        } else {
             //去数据库查询
-            total = totalStudentTotalById(id);
-            redissonClient.getBucket(CacheNameEnum.STUDENT_TOTAL.getRedisKey(id)).set(total);
+            StudentTotal total = totalStudentTotalById(id);
+            if (null != total) {
+                bucket.set(total);
+            }
+            return total;
         }
-        return total;
     }
 
     @Override
     public void updateTotalCache(StudentTotal studentTotal) {
-        if(null != studentTotal && null != studentTotal.getUserId()){
+        if (null != studentTotal && null != studentTotal.getUserId()) {
             redissonClient.getBucket(CacheNameEnum.STUDENT_TOTAL.getRedisKey(studentTotal.getUserId())).set(studentTotal);
         }
     }
@@ -124,13 +141,23 @@ public class StudentTotalServiceImpl extends ServiceImpl<StudentTotalDao, Studen
         );
         studentTotal.setStarTeacherNum(starTeacherNum);
 
-        List<StudentTotalVo> studentTotalVos = courseScheduleDao.queryStudentTotal(id);
-        if (!CollectionUtils.isEmpty(studentTotalVos)) {
-            StudentTotalVo studentTotalVo = studentTotalVos.get(0);
-            studentTotal.setFinshHours(null == studentTotalVo.getFinshHours() ? 0 : studentTotalVo.getFinshHours());
-            studentTotal.setUnfinshHours(null == studentTotalVo.getUnfinshHours() ? 0 : studentTotalVo.getUnfinshHours());
+        List<StudentTotalVo> studentScheduleTotal = courseScheduleDao.queryStudentTotal(id);
+        if (!CollectionUtils.isEmpty(studentScheduleTotal)) {
+            StudentTotalVo scheduleTotal = studentScheduleTotal.get(0);
+            if (null != scheduleTotal) {
+                studentTotal.setFinshHours(null == scheduleTotal.getFinshHours() ? 0 : scheduleTotal.getFinshHours());
+                studentTotal.setUnfinshHours(null == scheduleTotal.getUnfinshHours() ? 0 : scheduleTotal.getUnfinshHours());
+            }
+        }
+
+        List<StudentTotalVo> studentMuiscTotal = musicSheetService.queryStudentTotal(id);
+        if (!CollectionUtils.isEmpty(studentMuiscTotal)) {
+            StudentTotalVo muiscTotal = studentMuiscTotal.get(0);
+            if (null != muiscTotal) {
+                studentTotal.setMusicAlbumNum(null == muiscTotal.getMusicAlbumNum() ? 0 : muiscTotal.getMusicAlbumNum());
+                studentTotal.setMusicSheetNum(null == muiscTotal.getMusicSheetNum() ? 0 : muiscTotal.getMusicSheetNum());
+            }
         }
-        //todo 缺少累计练习天数 累计练习时长 累计评测次数
 
         redissonClient.getBucket(CacheNameEnum.STUDENT_TOTAL.getRedisKey(studentTotal.getUserId()))
                 .set(studentTotal);
@@ -144,7 +171,6 @@ public class StudentTotalServiceImpl extends ServiceImpl<StudentTotalDao, Studen
         return studentTotal;
     }
 
-
     int batchSize = 100;
 
     /***

+ 13 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherFreeTimeServiceImpl.java

@@ -1,8 +1,10 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import com.alibaba.excel.util.CollectionUtils;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.biz.dal.dao.TeacherFreeTimeDao;
 import com.yonge.cooleshow.biz.dal.dto.PracticeTimesSetting;
@@ -12,6 +14,7 @@ import com.yonge.cooleshow.biz.dal.service.TeacherFreeTimeService;
 import com.yonge.cooleshow.biz.dal.vo.TeacherFreeTimeVo;
 import com.yonge.cooleshow.biz.dal.vo.WeekVo;
 import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.payment.core.entity.SysConfigPayment;
 import com.yonge.toolset.utils.date.DateUtil;
 import jodd.util.StringUtil;
 import org.slf4j.Logger;
@@ -41,9 +44,12 @@ public class TeacherFreeTimeServiceImpl extends ServiceImpl<TeacherFreeTimeDao,
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void upSet(TeacherFreeTime teacherFreeTime) {
-        TeacherFreeTime oldTeacherFreeTime = baseMapper.findOne(teacherFreeTime.getTeacherId(),
-                teacherFreeTime.getCourseMinutes(),
-                teacherFreeTime.getFreeMinutes());
+        Long teacherId = teacherFreeTime.getTeacherId();
+        TeacherFreeTime oldTeacherFreeTime = baseMapper.selectOne(Wrappers.<TeacherFreeTime>lambdaQuery().eq(TeacherFreeTime::getTeacherId, teacherId));
+
+//        TeacherFreeTime oldTeacherFreeTime = baseMapper.findOne(teacherFreeTime.getTeacherId(),
+//                teacherFreeTime.getCourseMinutes(),
+//                teacherFreeTime.getFreeMinutes());
 
         //删除原有设置
         if(Objects.nonNull(oldTeacherFreeTime)){
@@ -51,7 +57,10 @@ public class TeacherFreeTimeServiceImpl extends ServiceImpl<TeacherFreeTimeDao,
             baseMapper.deleteSubjectPrice(oldTeacherFreeTime.getId());
         }
         //将其他配置改为非默认
-        baseMapper.updateDefaultFlag(false,teacherFreeTime.getTeacherId());
+//        List<TeacherFreeTime> checkGapLock = baseMapper.selectList(Wrappers.<TeacherFreeTime>lambdaQuery().eq(TeacherFreeTime::getTeacherId, teacherFreeTime.getTeacherId()));
+//        if (!CollectionUtils.isEmpty(checkGapLock)){
+//            baseMapper.updateDefaultFlag(false,teacherFreeTime.getTeacherId());
+//        }
         baseMapper.insert(teacherFreeTime);
 
         List<TeacherSubjectPrice> priceList= JSONArray.parseArray(teacherFreeTime.getSubjectPrice(), TeacherSubjectPrice.class);

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

@@ -141,10 +141,12 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
         if (null == total) {
             total = new TeacherTotal();
         }
-        teacherHomeVo.setStarGrade((null == total.getStarGrade()) ? 0 : total.getStarGrade().intValue());
-        teacherHomeVo.setFansNum((null == total.getFansNum()) ? 0 : total.getFansNum());
-        teacherHomeVo.setExpTime((null == total.getExpTime()) ? 0 : total.getExpTime());
-        teacherHomeVo.setUnExpTime((null == total.getUnExpTime()) ? 0 : total.getUnExpTime());
+        teacherHomeVo.setStarGrade(null == total.getStarGrade() ? 0 : total.getStarGrade().intValue());
+        teacherHomeVo.setFansNum(null == total.getFansNum() ? 0 : total.getFansNum());
+        teacherHomeVo.setExpTime(null == total.getExpTime() ? 0 : total.getExpTime());
+        teacherHomeVo.setUnExpTime(null == total.getUnExpTime() ? 0 : total.getUnExpTime());
+        teacherHomeVo.setMusicAlbumNum(null == total.getMusicAlbumNum() ? 0 : total.getMusicAlbumNum());
+        teacherHomeVo.setMusicSheetNum(null == total.getMusicSheetNum() ? 0 : total.getMusicSheetNum());
         return HttpResponseResult.succeed(teacherHomeVo);
     }
 
@@ -207,7 +209,7 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
         baseMapper.insert(teacher);
         //插入老师账户表
         UserAccount oldAcc = userAccountService.getById(sysUser.getId());
-        if(null == oldAcc){
+        if (null == oldAcc) {
             UserAccount userAccount = new UserAccount();
             userAccount.setUserId(sysUser.getId());
             userAccountService.save(userAccount);
@@ -327,7 +329,7 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
         } else {
             data.setLiveing(YesOrNoEnum.NO);
         }
-        if(null != studentId){
+        if (null != studentId) {
             StudentStar studentStar = studentStarService.getByStudentIdAndTeacherId(studentId, teacherId);
             if (null == studentStar) {
                 data.setIsStar(YesOrNoEnum.NO);

+ 45 - 22
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherTotalServiceImpl.java

@@ -7,8 +7,10 @@ import com.yonge.cooleshow.biz.dal.dao.CourseScheduleDao;
 import com.yonge.cooleshow.biz.dal.dao.StudentStarDao;
 import com.yonge.cooleshow.biz.dal.dao.TeacherDao;
 import com.yonge.cooleshow.biz.dal.entity.*;
+import com.yonge.cooleshow.biz.dal.service.MusicSheetService;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.cooleshow.biz.dal.service.LiveRoomService;
+import org.redisson.api.RBucket;
 import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -20,10 +22,7 @@ import com.yonge.cooleshow.biz.dal.dao.TeacherTotalDao;
 import com.yonge.cooleshow.biz.dal.service.TeacherTotalService;
 import org.springframework.util.CollectionUtils;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
 
@@ -41,6 +40,8 @@ public class TeacherTotalServiceImpl extends ServiceImpl<TeacherTotalDao, Teache
     private RedissonClient redissonClient;
     @Autowired
     private LiveRoomService liveRoomService;
+    @Autowired
+    private MusicSheetService musicSheetService;
 
     @Override
     public TeacherTotalVo detail(Long id) {
@@ -79,6 +80,13 @@ public class TeacherTotalServiceImpl extends ServiceImpl<TeacherTotalDao, Teache
             liveMap.put(liveRoom.getSpeakerId(), true);
         }
 
+        //查询老师曲谱统计
+        List<TeacherTotalVo> musicTotals = musicSheetService.queryTeacherTotal(null);
+        Map<Long, TeacherTotalVo> teacherMusicMap = new HashMap<>();
+        if (!CollectionUtils.isEmpty(musicTotals)) {
+            teacherMusicMap = musicTotals.stream().collect(Collectors.toMap(TeacherTotalVo::getUserId, o -> o));
+        }
+
         List<TeacherTotal> resultList = new ArrayList<>();
         for (Teacher teacher : teachers) {
             TeacherTotal teacherTotal = new TeacherTotal();
@@ -92,12 +100,8 @@ public class TeacherTotalServiceImpl extends ServiceImpl<TeacherTotalDao, Teache
             TeacherTotalVo courseTotal = teacherCourseMap.get(teacher.getUserId());
             if (null != courseTotal) {
                 //课时数
-                if (null != courseTotal.getExpTime()) {
-                    teacherTotal.setExpTime(courseTotal.getExpTime());
-                }
-                if (null != courseTotal.getUnExpTime()) {
-                    teacherTotal.setUnExpTime(courseTotal.getUnExpTime());
-                }
+                teacherTotal.setExpTime(courseTotal.getExpTime());
+                teacherTotal.setUnExpTime(courseTotal.getUnExpTime());
                 //星级
                 Double starGrade = courseTotal.getStarGrade();
                 if (null != starGrade) {
@@ -108,12 +112,17 @@ public class TeacherTotalServiceImpl extends ServiceImpl<TeacherTotalDao, Teache
             //是否正在直播
             teacherTotal.setLiveFlag(null == liveMap.get(teacher.getUserId()) ? false : true);
 
+            //曲谱统计
+            TeacherTotalVo musicTotal = teacherMusicMap.get(teacher.getUserId());
+            if (null != musicTotal) {
+                teacherTotal.setMusicAlbumNum(musicTotal.getMusicAlbumNum());
+                teacherTotal.setMusicSheetNum(musicTotal.getMusicSheetNum());
+            }
             resultList.add(teacherTotal);
             redissonClient.getBucket(CacheNameEnum.TEACHER_TOTAL.getRedisKey(teacherTotal.getUserId()))
                     .set(teacherTotal);
         }
         //统计信息入库
-        //批量入库
         saveOrUpdateBatch(resultList);
         return resultList;
     }
@@ -175,19 +184,22 @@ public class TeacherTotalServiceImpl extends ServiceImpl<TeacherTotalDao, Teache
 
     @Override
     public TeacherTotal getTotalById(Long id) {
-        TeacherTotal total = (TeacherTotal) redissonClient.getBucket(CacheNameEnum.TEACHER_TOTAL.getRedisKey(id))
-                .get();
-        if (null == total) {
+        RBucket<Object> bucket = redissonClient.getBucket(CacheNameEnum.TEACHER_TOTAL.getRedisKey(id));
+        if (bucket.isExists()) {
+            return (TeacherTotal) bucket.get();
+        } else {
             //去数据库查询
-            total = totalTeacherTotalById(id);
-            redissonClient.getBucket(CacheNameEnum.TEACHER_TOTAL.getRedisKey(id)).set(total);
+            TeacherTotal total = totalTeacherTotalById(id);
+            if(null != total){
+                bucket.set(total);
+            }
+            return total;
         }
-        return total;
     }
 
     @Override
     public void updateTotalCache(TeacherTotal teacherTotal) {
-        if(null != teacherTotal && null != teacherTotal.getUserId()){
+        if (null != teacherTotal && null != teacherTotal.getUserId()) {
             redissonClient.getBucket(CacheNameEnum.TEACHER_TOTAL.getRedisKey(teacherTotal.getUserId())).set(teacherTotal);
         }
     }
@@ -228,18 +240,29 @@ public class TeacherTotalServiceImpl extends ServiceImpl<TeacherTotalDao, Teache
                 .eq(LiveRoom::getRoomState, 0)
                 .eq(LiveRoom::getType, "TEMP"));
 
-        if(CollectionUtils.isEmpty(templist)){
+        if (CollectionUtils.isEmpty(templist)) {
             teacherTotal.setLiveFlag(false);
-        }else {
+        } else {
             teacherTotal.setLiveFlag(true);
         }
+
+        //查询老师曲谱数
+        List<TeacherTotalVo> musicTotals = musicSheetService.queryTeacherTotal(id);
+        if (!CollectionUtils.isEmpty(musicTotals)) {
+            TeacherTotalVo musicTotal = musicTotals.get(0);
+            if (null != musicTotal) {
+                teacherTotal.setMusicAlbumNum(musicTotal.getMusicAlbumNum());
+                teacherTotal.setMusicSheetNum(musicTotal.getMusicSheetNum());
+            }
+        }
+
         redissonClient.getBucket(CacheNameEnum.TEACHER_TOTAL.getRedisKey(teacherTotal.getUserId()))
                 .set(teacherTotal);
 
         TeacherTotal old = getById(id);
-        if(null != old){
+        if (null != old) {
             updateById(teacherTotal);
-        }else{
+        } else {
             save(teacherTotal);
         }
         return teacherTotal;

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

@@ -4,22 +4,20 @@ 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.dao.UserOrderDao;
 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.biz.dal.vo.res.OrderPayRes;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.cooleshow.biz.dal.enums.FrozenTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.UserAccountRecordService;
-import com.yonge.cooleshow.biz.dal.support.DistributedLock;
 import com.yonge.cooleshow.biz.dal.vo.res.AccountTotal;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.exception.BizException;
-import com.yonge.toolset.base.util.StringUtil;
+import com.yonge.toolset.payment.util.DistributedLock;
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
@@ -50,6 +48,7 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
     private RedissonClient redissonClient;
     @Autowired
     private UserOrderService orderService;
+
     @Override
     public UserAccountVo detail(Long id) {
         UserAccountVo detail = baseMapper.detail(id);
@@ -65,23 +64,18 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
     public HttpResponseResult<UserAccountRecord> accountChange(UserAccountRecordDto accountRecordDto) {
         if (null == accountRecordDto.getUserId() || null == accountRecordDto.getTransAmount()
                 || null == accountRecordDto.getInOrOut() || null == accountRecordDto.getBizType()) {
             return HttpResponseResult.failed("缺少参数");
         }
-        String lockName = CacheNameEnum.LOCK_CHANGE_ACCOUNT.getRedisKey(accountRecordDto.getUserId());
 
-        RLock lock = redissonClient.getLock(lockName);
-        if (Objects.isNull(lock)) {
-            log.info("callIfLockCanGet lock is null lockName : {}", lockName);
-            return HttpResponseResult.failed("账户变更失败");
-        }
-        ExecutorService executor = Executors.newCachedThreadPool();
         try {
-            if (lock.tryLock(10L, 60L, TimeUnit.SECONDS)) {
-                return doAccountChange(accountRecordDto);
+            HttpResponseResult<UserAccountRecord> res = DistributedLock.of(redissonClient)
+                    .runIfLockToFunction(CacheNameEnum.LOCK_CHANGE_ACCOUNT.getRedisKey(accountRecordDto.getUserId())
+                            , this::doAccountChange, accountRecordDto, 10L);
+            if (null != res) {
+                return res;
             } else {
                 return HttpResponseResult.failed("账户变更失败");
             }
@@ -89,13 +83,7 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
             return HttpResponseResult.failed(e.getMessage());
         } catch (Exception e) {
             e.printStackTrace();
-            log.error("callIfLockCanGet error lockKey {}", lockName);
-            return HttpResponseResult.failed("账户变更失败");
-        } finally {
-            executor.shutdown();
-            if (lock.getHoldCount() != 0) {
-                lock.unlock();
-            }
+            return HttpResponseResult.failed("付款失败");
         }
     }
 
@@ -146,8 +134,8 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
         return HttpResponseResult.succeed(total);
     }
 
-    private HttpResponseResult<UserAccountRecord> doAccountChange(UserAccountRecordDto accountRecordDto) {
-        UserAccountVo detail = detail(accountRecordDto.getUserId());
+    @Transactional(rollbackFor = Exception.class)
+    HttpResponseResult<UserAccountRecord> doAccountChange(UserAccountRecordDto accountRecordDto) {
         //收入要校验金额
         if (InOrOutEnum.IN.equals(accountRecordDto.getInOrOut())) {
             UserOrder userOrder = orderService.getOne(Wrappers.<UserOrder>lambdaQuery()
@@ -162,30 +150,30 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
                 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());
+        if (accountRecordDto.getErrFlag() == 0) {
+            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());
+            }
         }
 
+        UserAccountVo detail = detail(accountRecordDto.getUserId());
         if (detail.getAmountTotal().doubleValue() < 0
                 || detail.getAmountUsable().doubleValue() < 0 || detail.getAmountFrozen().doubleValue() < 0) {
             throw new BizException("账户变更失败");
         }
+
         if (accountRecordDto.getSaveRecord()) {
             //插入账户变更记录
             accountRecordDto.setAccountId(accountRecordDto.getUserId());
             accountRecordDto.setAccountBalance(detail.getAmountUsable());
-
             userAccountRecordService.save(accountRecordDto);
         }
         return HttpResponseResult.succeed(accountRecordDto);

+ 42 - 38
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderPaymentServiceImpl.java

@@ -7,9 +7,7 @@ import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderPayReq;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
-import com.yonge.cooleshow.biz.dal.service.SysUserContractRecordService;
-import com.yonge.cooleshow.biz.dal.service.SysUserService;
-import com.yonge.cooleshow.biz.dal.service.UserOrderService;
+import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderPayRes;
@@ -34,7 +32,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.yonge.cooleshow.biz.dal.entity.UserOrderPayment;
 import com.yonge.cooleshow.biz.dal.dao.UserOrderPaymentDao;
-import com.yonge.cooleshow.biz.dal.service.UserOrderPaymentService;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
@@ -62,30 +59,24 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
     private SysUserContractRecordService sysUserContractRecordService;
     @Autowired
     private SysUserService userService;
+    @Autowired
+    private UserOrderRefundService orderRefundService;
 
     @Override
     public UserOrderPayment detailByOrderNo(String orderNo, PayChannelEnum payChannel, TradeStatusEnum status) {
-        return baseMapper.selectOne(Wrappers.<UserOrderPayment>lambdaQuery()
-                .eq(UserOrderPayment::getOrderNo, orderNo)
-                .eq(UserOrderPayment::getPayChannel, payChannel)
-                .eq(UserOrderPayment::getStatus, status));
+        return baseMapper.selectOne(Wrappers.<UserOrderPayment>lambdaQuery().eq(UserOrderPayment::getOrderNo, orderNo).eq(UserOrderPayment::getPayChannel, payChannel).eq(UserOrderPayment::getStatus, status));
     }
 
     @Override
     public UserOrderPayment detailByTransNoOrPaymentNo(String transNo, String paymentNo) {
-        return baseMapper.selectOne(Wrappers.<UserOrderPayment>lambdaQuery().and(
-                wrapper -> wrapper.eq(UserOrderPayment::getTransNo, transNo)
-                        .or().eq(UserOrderPayment::getPaymentNo, paymentNo)
-        ));
+        return baseMapper.selectOne(Wrappers.<UserOrderPayment>lambdaQuery().and(wrapper -> wrapper.eq(UserOrderPayment::getTransNo, transNo).or().eq(UserOrderPayment::getPaymentNo, paymentNo)));
     }
 
     @Override
-    public UserOrderPayment onlyClosePayment(String orderNo, String reason) {
-        UserOrderPayment orderPayment = baseMapper.selectOne(Wrappers.<UserOrderPayment>lambdaQuery()
-                .eq(UserOrderPayment::getOrderNo, orderNo)
-                .eq(UserOrderPayment::getStatus, TradeStatusEnum.pending));
+    public Boolean onlyClosePayment(String orderNo, String reason) {
+        UserOrderPayment orderPayment = baseMapper.selectOne(Wrappers.<UserOrderPayment>lambdaQuery().eq(UserOrderPayment::getOrderNo, orderNo).eq(UserOrderPayment::getStatus, TradeStatusEnum.pending));
         if (null == orderPayment) {
-            return orderPayment;
+            return true;
         }
 
         //更新付款单
@@ -94,21 +85,25 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
         orderPayment.setUpdateTime(new Date());
 
         updateById(orderPayment);
-        return orderPayment;
+        return true;
     }
 
 
     @Override
-    public UserOrderPayment closePaymentAndReqOpen(String orderNo, String reason) {
-        UserOrderPayment orderPayment = onlyClosePayment(orderNo, reason);
+    public Boolean closePaymentAndReqOpen(String orderNo, String reason) {
+        UserOrderPayment orderPayment = baseMapper.selectOne(Wrappers.<UserOrderPayment>lambdaQuery().eq(UserOrderPayment::getOrderNo, orderNo).eq(UserOrderPayment::getStatus, TradeStatusEnum.pending));
         if (null == orderPayment) {
-            return orderPayment;
+            return true;
         }
+
+        //更新付款单
+        orderPayment.setStatus(TradeStatusEnum.close);
+        orderPayment.setPayFailMsg(StringUtil.isEmpty(reason) ? "交易取消" : reason);
+        orderPayment.setUpdateTime(new Date());
+
         //发送支付关单请求
-        if (!StringUtil.isEmpty(orderPayment.getTransNo())
-                || !StringUtil.isEmpty(orderPayment.getPaymentNo())) {
-            ClosePayment param = new ClosePayment(orderPayment.getOpenType(),
-                    PaymentClientEnum.valueOf(orderPayment.getPaymentClient()), orderPayment.getPayChannel());
+        if (!StringUtil.isEmpty(orderPayment.getTransNo()) || !StringUtil.isEmpty(orderPayment.getPaymentNo())) {
+            ClosePayment param = new ClosePayment(orderPayment.getOpenType(), PaymentClientEnum.valueOf(orderPayment.getPaymentClient()), orderPayment.getPayChannel());
             param.setId(orderPayment.getTransNo());
             param.setPaymentNo(orderPayment.getPaymentNo());
             param.setReason(reason);
@@ -130,7 +125,8 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
                 e.printStackTrace();
             }
         }
-        return orderPayment;
+        updateById(orderPayment);
+        return true;
     }
 
 
@@ -203,21 +199,22 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
     @Override
     public void executePaymentCallBack(PaymentCallBack data) {
         UserOrderVo userOrderVo = userOrderService.getUserOrderByPaymentNoOrTransNo(data.getPaymentNo(), data.getId());
-        if (OrderStatusEnum.WAIT_PAY.equals(userOrderVo.getStatus())
-                || OrderStatusEnum.PAYING.equals(userOrderVo.getStatus())) {
+        if (OrderStatusEnum.WAIT_PAY.equals(userOrderVo.getStatus()) || OrderStatusEnum.PAYING.equals(userOrderVo.getStatus())) {
             if (TradeStatusEnum.succeeded.equals(data.getStatus())) {//支付成功
                 paymentSucceededHandle(data);
             } else if (TradeStatusEnum.failed.equals(data.getStatus())) {//支付失败
                 paymentFailedHandle(data, data.getErrMsg());
             }
+        }else if (!userOrderVo.getStatus().equals(OrderStatusEnum.PAID)) {
+            //原路退还
+            orderRefundService.orderFailRefund(data, userOrderVo.getOrderNo(), "订单已超时,金额原路退回");
         }
     }
 
     @Override
     public void closePaymentCallBack(PaymentCallBack data) {
         UserOrderVo userOrderVo = userOrderService.getUserOrderByPaymentNoOrTransNo(data.getPaymentNo(), data.getId());
-        if (OrderStatusEnum.WAIT_PAY.equals(userOrderVo.getStatus())
-                || OrderStatusEnum.PAYING.equals(userOrderVo.getStatus())) {
+        if (OrderStatusEnum.WAIT_PAY.equals(userOrderVo.getStatus()) || OrderStatusEnum.PAYING.equals(userOrderVo.getStatus())) {
             if (TradeStatusEnum.succeeded.equals(data.getStatus())) {//关单成功
                 paymentCloseSucceededHandle(data);
             } else if (TradeStatusEnum.failed.equals(data.getStatus())) {//关单失败
@@ -243,9 +240,7 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
         orderPayment.setOrderNo(payment.getOrderNo());
         orderPayment.setPaymentNo(payment.getPaymentNo());
         orderPayment.setTransNo(payment.getId());
-        orderPayment.setPayAmt(
-                new BigDecimal(payment.getPayAmt()).setScale(2, RoundingMode.HALF_UP)
-        );
+        orderPayment.setPayAmt(new BigDecimal(payment.getPayAmt()).setScale(2, RoundingMode.HALF_UP));
         orderPayment.setPayInfo(payment.getPayInfo());
         orderPayment.setStatus(TradeStatusEnum.pending);
 
@@ -274,9 +269,11 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
             log.error("支付回调,订单未找到。 req is {}", JSONObject.toJSONString(data));
             return;
         }
-        if (detail.getStatus().equals(OrderStatusEnum.WAIT_PAY)
-                || detail.getStatus().equals(OrderStatusEnum.PAYING)) {
+        if (detail.getStatus().equals(OrderStatusEnum.WAIT_PAY) || detail.getStatus().equals(OrderStatusEnum.PAYING)) {
             userOrderService.orderSuccess(detail, data);
+        } else if (!detail.getStatus().equals(OrderStatusEnum.PAID)) {
+            //原路退还
+            orderRefundService.orderFailRefund(data, detail.getOrderNo(), "订单已超时,金额原路退回");
         }
 
         //处理支付完成签署协议
@@ -310,11 +307,10 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
             log.error("支付回调,订单未找到。 req is {}", JSONObject.toJSONString(data));
             return;
         }
-        if (detail.getStatus().equals(OrderStatusEnum.WAIT_PAY)
-                || detail.getStatus().equals(OrderStatusEnum.PAYING)) {
+        if (detail.getStatus().equals(OrderStatusEnum.WAIT_PAY) || detail.getStatus().equals(OrderStatusEnum.PAYING)) {
             userOrderService.doOrderCancel(detail, OrderStatusEnum.FAIL, "支付回调失败:" + errMsg);
             //关闭付款单
-            onlyClosePayment(detail.getOrderNo(), "支付回调失败:" + errMsg);
+            closePaymentAndReqOpen(detail.getOrderNo(), "支付回调失败:" + errMsg);
         }
     }
 
@@ -332,6 +328,14 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
         orderPayment.setCloseStatus(TradeStatusEnum.succeeded);
         orderPayment.setUpdateTime(new Date());
         updateById(orderPayment);
+
+        //若当前关单回调是当前订单付款单,则可以关单
+        UserOrderVo detail = userOrderService.getUserOrderByPaymentNoOrTransNo(data.getPaymentNo(), data.getId());
+        if (null != detail && OrderStatusEnum.PAYING.equals(detail.getStatus())
+                && orderPayment.getPaymentNo().equals(detail.getPaymentNo())) {
+            //关闭订单
+            userOrderService.doOrderCancel(detail, OrderStatusEnum.CLOSE, "订单取消");
+        }
     }
 
     /***

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

@@ -107,7 +107,7 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
     @Override
     @Transactional(rollbackFor = Exception.class)
     public HttpResponseResult<Boolean> orderRefund(OrderRefundReq refundReq) {
-        UserOrderVo detail = orderService.detail(refundReq.getOrderId());
+        UserOrderVo detail = orderService.detail(refundReq.getOrderNo(), refundReq.getUserId());
         if (null == detail || CollectionUtils.isEmpty(detail.getOrderDetailList())) {
             return HttpResponseResult.failed("未找到订单信息");
         }
@@ -117,13 +117,14 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
         if (StringUtil.isEmpty(detail.getTransNo()) && StringUtil.isEmpty(detail.getPaymentNo())) {
             return HttpResponseResult.failed("未找到订单付款信息");
         }
+        refundReq.setOrderId(detail.getId());
         UserOrderPayment orderPayment = orderPaymentService.detailByTransNoOrPaymentNo(detail.getTransNo(), detail.getPaymentNo());
         if (null == orderPayment || !TradeStatusEnum.succeeded.equals(orderPayment.getStatus())) {
             return HttpResponseResult.failed("订单付款状态异常");
         }
         if (CollectionUtils.isEmpty(refundReq.getOredrDetilIds())) {
             //查询订单下未退款的所有详情订单
-            List<UserOrderDetail> orderDetails = baseMapper.selectOrderRefundDetils(refundReq.getOrderId());
+            List<UserOrderDetail> orderDetails = baseMapper.selectOrderRefundDetils(detail.getId());
 
             refundReq.setOredrDetilIds(orderDetails.stream().map(UserOrderDetail::getId).collect(Collectors.toList()));
         }
@@ -290,6 +291,91 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
         return doOrderRefund(orderRefunds);
     }
 
+    @Override
+    public HttpResponseResult<UserOrderRefundBill> orderFailRefund(PaymentCallBack data, String orderNo, String reason) {
+        UserOrderPayment orderPayment = orderPaymentService.detailByTransNoOrPaymentNo(data.getId(), data.getPaymentNo());
+        if (null == orderPayment) {
+            return HttpResponseResult.failed("未找到付款单");
+        }
+        //订单完成
+        UserOrderVo detail = orderService.detail(orderPayment.getOrderNo(), null);
+        if (null == detail) {
+            return HttpResponseResult.failed("未找到订单");
+        }
+        //退款的详情id
+        List<Long> detilIds = new ArrayList<>();
+
+        OrderRefundReq orderRefundReq = new OrderRefundReq();
+        orderRefundReq.setOrderId(detail.getId());
+        orderRefundReq.setUserId(detail.getUserId());
+        orderRefundReq.setReason(reason);
+        //退款金额
+        BigDecimal actualPrice = BigDecimal.ZERO;
+        for (UserOrderDetailVo vo : detail.getOrderDetailList()) {
+            detilIds.add(vo.getId());
+            actualPrice = actualPrice.add(vo.getActualPrice());
+        }
+        String join = StringUtil.join(detilIds, ",");
+
+        List<UserOrderRefund> list = list(Wrappers.<UserOrderRefund>lambdaQuery().eq(UserOrderRefund::getOrderNo, detail.getOrderNo()));
+        if (!CollectionUtils.isEmpty(list)) {
+            return HttpResponseResult.failed("已经存在退款单");
+        }
+
+        UserOrderRefund orderRefunds = new UserOrderRefund();
+        orderRefunds.setUserId(detail.getUserId());
+        orderRefunds.setOrderId(detail.getId());
+        orderRefunds.setOrderNo(detail.getOrderNo());
+        orderRefunds.setOredrDetilIds(join);
+        orderRefunds.setStatus(AuthStatusEnum.PASS);
+        orderRefunds.setApplyAmount(actualPrice);
+        orderRefunds.setReason(reason);
+        save(orderRefunds);
+
+        for (UserOrderDetailVo vo : detail.getOrderDetailList()) {
+            List<Long> collect = detilIds.stream().filter(o -> o.equals(vo.getId())).collect(Collectors.toList());
+            if (CollectionUtils.isNotEmpty(collect)) {
+                Consumer<UserOrderDetailVo> refundAfterConsumer = refundAfter.get(vo.getGoodType());
+                if (!Objects.isNull(refundAfterConsumer)) {
+                    refundAfterConsumer.accept(vo);
+                }
+            }
+        }
+
+        RefundBill refundBill = new RefundBill(orderPayment.getOpenType(),
+                PaymentClientEnum.valueOf(orderPayment.getPaymentClient()), orderPayment.getPayChannel());
+        refundBill.setTradeNo(data.getId());
+        refundBill.setPaymentNo(data.getPaymentNo());
+
+        //单号生成
+        Long billNo = idGeneratorService.generatorId("billNo");
+        refundBill.setRefundNo(billNo.toString());
+
+        refundBill.setOrderAmt(orderPayment.getPayAmt());
+        refundBill.setRefundAmt(orderPayment.getPayAmt());
+        refundBill.setReason(reason);
+
+        BaseResult<RefundBill> refundBillBaseResult = paymentClient.refundPayment(refundBill);
+        log.info("退款返回: {} ", JSONObject.toJSONString(refundBillBaseResult));
+
+        //入退款单表
+        UserOrderRefundBill orderRefundBill = new UserOrderRefundBill();
+        orderRefundBill.setRefundId(orderRefunds.getId());
+        orderRefundBill.setBillNo(billNo.toString());
+        orderRefundBill.setRefundAmt(orderRefunds.getActualAmount());
+        if (refundBillBaseResult.getStatus()) {
+            orderRefundBill.setTransNo(refundBillBaseResult.getData().getId());
+            orderRefundBill.setStatus(TradeStatusEnum.pending);
+        } else {
+            orderRefundBill.setStatus(TradeStatusEnum.failed);
+            orderRefundBill.setPayFailMsg(refundBillBaseResult.getMsg());
+        }
+
+        refundBillService.save(orderRefundBill);
+        updateById(orderRefunds);
+        return HttpResponseResult.succeed(orderRefundBill);
+    }
+
 
     @Override
     @Transactional(rollbackFor = Exception.class)

+ 31 - 20
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java

@@ -4,7 +4,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.biz.dal.enums.*;
-import com.yonge.cooleshow.biz.dal.support.DistributedLock;
+import com.yonge.toolset.payment.util.DistributedLock;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderPayReq;
@@ -192,9 +192,11 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
                 && !OrderStatusEnum.PAYING.equals(detail.getStatus())) {
             return HttpResponseResult.failed("订单已关闭");
         }
-        orderPaymentService.closePaymentAndReqOpen(payReq.getOrderNo(), "用户取消订单");
-        //关闭订单
-        doOrderCancel(detail, OrderStatusEnum.CLOSE, StringUtil.isEmpty(payReq.getReason()) ? "用户取消订单" : payReq.getReason());
+        Boolean close = orderPaymentService.closePaymentAndReqOpen(payReq.getOrderNo(), "用户取消订单");
+        if (close) {
+            //关闭订单
+            doOrderCancel(detail, OrderStatusEnum.CLOSE, StringUtil.isEmpty(payReq.getReason()) ? "用户取消订单" : payReq.getReason());
+        }
         return HttpResponseResult.succeed(true);
     }
 
@@ -250,7 +252,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public HttpResponseResult<UserOrder> executeOrder(OrderReq orderReq) throws Exception {
+    public HttpResponseResult<UserOrder> executeOrder(OrderReq orderReq) {
         long start = System.currentTimeMillis();
         log.info("订单[创建订单] Req:{}", JSONObject.toJSONString(orderReq));
         //订单号生成
@@ -271,7 +273,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             OrderCreateRes createRes = createResult.getData();
             if (!createResult.getStatus() || null == createRes || !createRes.getRes()) {
                 log.info("订单[创建订单] Res:{}", JSONObject.toJSONString(createResult));
-                return HttpResponseResult.failed("订单商品信息获取失败");
+                return HttpResponseResult.failed(StringUtil.isEmpty(createResult.getMsg()) ? "订单商品信息获取失败" : createResult.getMsg());
             }
             createRes.setGoodType(info.getGoodType());
             //todo 优惠券优惠金额,暂时为0
@@ -306,7 +308,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public HttpResponseResult<OrderPayRes> orderPay(OrderPayReq payReq) throws Exception {
+    public HttpResponseResult<OrderPayRes> orderPay(OrderPayReq payReq) {
         //查询订单
         UserOrderVo detail = detail(payReq.getOrderNo(), payReq.getUserId());
         if (null == detail || !payReq.getUserId().equals(detail.getUserId())) {
@@ -350,18 +352,18 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         for (UserOrderVo orderVo : waitPayOrderList) {
             //取消订单要获取锁,防止在轮询取消时,用户修改订单状态
             boolean b = DistributedLock.of(redissonClient)
-                    .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(orderVo.getUserId())
+                    .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(orderVo.getOrderNo())
                             , () -> pollingCancelOrder(orderVo.getOrderNo()), 60L, TimeUnit.SECONDS);
         }
 
         search.setStatus(OrderStatusEnum.PAYING.getCode());
         search.setEndTime(LocalDateTime.now().minusMinutes(120));
         //查询待支付中订单
-        List<UserOrderVo> payingOrderList = baseMapper.selectAllList(search);
+        List<UserOrderVo> payingOrderList = baseMapper.selectPendingList(search);
         for (UserOrderVo orderVo : payingOrderList) {
             //取消订单要获取锁,防止在轮询取消时,用户修改订单状态
             boolean b = DistributedLock.of(redissonClient)
-                    .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(orderVo.getUserId())
+                    .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(orderVo.getOrderNo())
                             , () -> pollingCancelOrder(orderVo.getOrderNo()), 60L, TimeUnit.SECONDS);
         }
     }
@@ -377,7 +379,10 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             return;
         }
         UserOrderPayment userOrderPayment = orderPaymentService.detailByTransNoOrPaymentNo(detail.getTransNo(), detail.getPaymentNo());
-        if (null != userOrderPayment && TradeStatusEnum.pending.equals(userOrderPayment.getStatus())) {
+        if (null == userOrderPayment) {
+            //关闭订单
+            doOrderCancel(detail, OrderStatusEnum.CLOSE, "订单超时");
+        } else if (TradeStatusEnum.pending.equals(userOrderPayment.getStatus())) {
             Payment param = new Payment(detail.getOpenType(),
                     PaymentClientEnum.valueOf(userOrderPayment.getPaymentClient()), detail.getPayChannel());
             param.setId(detail.getTransNo());
@@ -385,16 +390,18 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             BaseResult<Payment> res = paymentClient.queryPayment(param);
             //支付成功
             if (res.getStatus() && TradeStatusEnum.succeeded.getCode().equals(res.getData().getStatus())
-                    && (OrderStatusEnum.WAIT_PAY.equals(detail.getStatus()) || OrderStatusEnum.PAYING.equals(detail.getStatus()))
-            ) {
+                    && (OrderStatusEnum.WAIT_PAY.equals(detail.getStatus()) || OrderStatusEnum.PAYING.equals(detail.getStatus()))) {
+                //订单已经完成,则完成订单
                 orderSuccess(detail);
-                return;
+            } else {
+                //关闭订单付款单
+                Boolean close = orderPaymentService.closePaymentAndReqOpen(orderNo, "订单超时");
+                if (close) {
+                    //关闭订单
+                    doOrderCancel(detail, OrderStatusEnum.CLOSE, "订单超时");
+                }
             }
         }
-        //关闭订单
-        doOrderCancel(detail, OrderStatusEnum.CLOSE, "订单超时");
-        //关闭订单付款单
-        orderPaymentService.closePaymentAndReqOpen(orderNo, "订单超时");
     }
 
     private HttpResponseResult<OrderPayRes> doOrderPay(OrderPayReq payReq, UserOrderVo detail) throws Exception {
@@ -418,7 +425,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
      * @updateTime 2022/3/31 16:15
      * @return: com.yonge.cooleshow.biz.dal.entity.Order
      */
-    private UserOrderVo insertOrder(OrderReq orderReq) throws Exception {
+    private UserOrderVo insertOrder(OrderReq orderReq) {
         UserOrder userOrder = new UserOrder();
 
         userOrder.setOrderNo(orderReq.getOrderNo());
@@ -504,7 +511,11 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             throw new BizException("创建订单失败");
         }
         UserOrderVo vo = new UserOrderVo();
-        BeanUtils.copyProperties(vo, userOrder);
+        try {
+            BeanUtils.copyProperties(vo, userOrder);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
         vo.setOrderDetailList(orderDetailList);
         return vo;
     }

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

@@ -11,7 +11,7 @@ import com.yonge.cooleshow.biz.dal.entity.UserWithdrawalCallback;
 import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.sdk.WithdrawSdk;
 import com.yonge.cooleshow.biz.dal.service.*;
-import com.yonge.cooleshow.biz.dal.support.DistributedLock;
+import com.yonge.toolset.payment.util.DistributedLock;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.biz.dal.dao.UserBankCardDao;
 import com.yonge.cooleshow.biz.dal.dto.UserAccountRecordDto;

+ 23 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/AlbumDetailVo.java

@@ -38,6 +38,12 @@ public class AlbumDetailVo {
     @ApiModelProperty("教材标签")
     private String musicTagNames;
 
+    @ApiModelProperty("专辑声部id")
+    private String subjectId;
+
+    @ApiModelProperty("声部")
+    private String subjectNames;
+
     @ApiModelProperty("曲目数量")
     private Integer musicSheetCount;
 
@@ -50,6 +56,23 @@ public class AlbumDetailVo {
     @ApiModelProperty("相关专辑")
     private List<MusicAlbumVo> relatedMusicAlbum;
 
+
+    public String getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(String subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public String getSubjectNames() {
+        return subjectNames;
+    }
+
+    public void setSubjectNames(String subjectNames) {
+        this.subjectNames = subjectNames;
+    }
+
     public List<MusicAlbumVo> getHotMusicAlbum() {
         return hotMusicAlbum;
     }

+ 10 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MusicAlbumVo.java

@@ -20,6 +20,16 @@ public class MusicAlbumVo extends MusicAlbum {
     @ApiModelProperty("收藏数量")
     private Integer albumFavoriteCount;
 
+    @ApiModelProperty("专辑声部")
+    private String subjectNames;
+
+    public String getSubjectNames() {
+        return subjectNames;
+    }
+
+    public void setSubjectNames(String subjectNames) {
+        this.subjectNames = subjectNames;
+    }
 
     public String getMusicTagNames() {
         return musicTagNames;

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MusicSheetDetailVo.java

@@ -25,6 +25,9 @@ public class MusicSheetDetailVo extends MusicSheet {
     @ApiModelProperty("订单状态(WAIT_PAY:待支付;PAYING:支付中,PAID:已付款)")
     private OrderStatusEnum orderStatus;
 
+    @ApiModelProperty("支付订单号")
+    private String orderNo;
+
     @ApiModelProperty("上传老师名称")
     private String userName;
 
@@ -43,6 +46,14 @@ public class MusicSheetDetailVo extends MusicSheet {
     @ApiModelProperty("审核理由")
     private String reason;
 
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
+
     public String getReason() {
         return reason;
     }

+ 31 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/StudentHomeVo.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.vo;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.yonge.cooleshow.biz.dal.entity.Student;
 import com.yonge.cooleshow.biz.dal.enums.GenderEnum;
 import com.yonge.cooleshow.biz.dal.enums.YesOrNoEnum;
@@ -48,6 +49,12 @@ public class StudentHomeVo extends Student {
     private Date birthdate;
     @ApiModelProperty(value = "是否实名 0否 1是")
     private YesOrNoEnum isReal;
+    @ApiModelProperty(value = "学生 STUDENT 老师 TEACHER 系统用户 SYSTEM")
+    private String userType;
+    @ApiModelProperty("专辑数 ")
+    private Integer musicAlbumNum;
+    @ApiModelProperty("曲谱数 ")
+    private Integer musicSheetNum;
 
     public String getHeardUrl() {
         return heardUrl;
@@ -176,4 +183,28 @@ public class StudentHomeVo extends Student {
     public void setIsReal(YesOrNoEnum isReal) {
         this.isReal = isReal;
     }
+
+    public String getUserType() {
+        return userType;
+    }
+
+    public void setUserType(String userType) {
+        this.userType = userType;
+    }
+
+    public Integer getMusicAlbumNum() {
+        return musicAlbumNum;
+    }
+
+    public void setMusicAlbumNum(Integer musicAlbumNum) {
+        this.musicAlbumNum = musicAlbumNum;
+    }
+
+    public Integer getMusicSheetNum() {
+        return musicSheetNum;
+    }
+
+    public void setMusicSheetNum(Integer musicSheetNum) {
+        this.musicSheetNum = musicSheetNum;
+    }
 }

+ 10 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/StudentVo.java

@@ -42,6 +42,8 @@ public class StudentVo extends Student {
     private YesOrNoEnum isVip;
     @ApiModelProperty(value = "声部名称(支持多个,用逗号分隔) ")
     private String subjectName;
+    @ApiModelProperty(value = "学生 STUDENT 老师 TEACHER 系统用户 STSTEM")
+    private String userType;
 
     public String getAvatar() {
         return avatar;
@@ -138,4 +140,12 @@ public class StudentVo extends Student {
     public void setSubjectName(String subjectName) {
         this.subjectName = subjectName;
     }
+
+    public String getUserType() {
+        return userType;
+    }
+
+    public void setUserType(String userType) {
+        this.userType = userType;
+    }
 }

+ 33 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherHomeVo.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.vo;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.yonge.cooleshow.biz.dal.entity.Teacher;
 import com.yonge.cooleshow.biz.dal.entity.TeacherStyleVideo;
@@ -33,6 +34,12 @@ public class TeacherHomeVo extends Teacher implements Serializable {
     private Integer expTime;
     @ApiModelProperty("未上课时")
     private Integer unExpTime;
+
+    @ApiModelProperty("专辑数 ")
+    private Integer musicAlbumNum;
+    @ApiModelProperty("曲谱数 ")
+    private Integer musicSheetNum;
+
     @ApiModelProperty(value = "声部名称(支持多个,用逗号分隔) ")
     private String subjectName;
     @ApiModelProperty(value = "性别 0女 1男")
@@ -65,6 +72,8 @@ public class TeacherHomeVo extends Teacher implements Serializable {
     private YesOrNoEnum isStar;
     @ApiModelProperty(value = "老师风采视频")
     private List<TeacherStyleVideo> styleVideo;
+    @ApiModelProperty(value = "学生 STUDENT 老师 TEACHER 系统用户 STSTEM")
+    private String userType;
 
     public String getHeardUrl() {
         return heardUrl;
@@ -233,4 +242,28 @@ public class TeacherHomeVo extends Teacher implements Serializable {
     public void setIsStar(YesOrNoEnum isStar) {
         this.isStar = isStar;
     }
+
+    public String getUserType() {
+        return userType;
+    }
+
+    public void setUserType(String userType) {
+        this.userType = userType;
+    }
+
+    public Integer getMusicAlbumNum() {
+        return musicAlbumNum;
+    }
+
+    public void setMusicAlbumNum(Integer musicAlbumNum) {
+        this.musicAlbumNum = musicAlbumNum;
+    }
+
+    public Integer getMusicSheetNum() {
+        return musicSheetNum;
+    }
+
+    public void setMusicSheetNum(Integer musicSheetNum) {
+        this.musicSheetNum = musicSheetNum;
+    }
 }

+ 10 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherVo.java

@@ -52,6 +52,8 @@ public class TeacherVo extends Teacher {
     private String teacherType;
     @ApiModelProperty(value = "老师风采视频")
     private List<TeacherStyleVideo> styleVideo;
+    @ApiModelProperty(value = "学生 STUDENT 老师 TEACHER 系统用户 STSTEM")
+    private String userType;
 
     public String getAvatar() {
         return avatar;
@@ -164,4 +166,12 @@ public class TeacherVo extends Teacher {
     public void setTeacherType(String teacherType) {
         this.teacherType = teacherType;
     }
+
+    public String getUserType() {
+        return userType;
+    }
+
+    public void setUserType(String userType) {
+        this.userType = userType;
+    }
 }

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

@@ -85,12 +85,11 @@
             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_ in ('PRACTICE','PIANO_ROOM_CLASS')
-        <where>
+        left join course_schedule b on a.course_id_ = b.id_
+        where b.lock_ = 0 and b.type_ in ('PRACTICE','PIANO_ROOM_CLASS')
             <if test="userId != null and userId != ''">
                 and t.user_id_ = #{userId}
             </if>
-        </where>
         group by t.user_id_
     </select>
 
@@ -675,7 +674,7 @@
         select count(1)
         from course_schedule cs
         left join course_group cg on cs.course_group_id_ = cg.id_
-        where cs.teacher_id_ = #{userId} and cs.status_ = 'NOT_START' and cg.status_ = 'ING'
+        where cs.teacher_id_ = #{userId} and cs.status_ in ('NOT_START','ING') and cg.status_ = 'ING'
         and YEARWEEK(date_format(cs.class_date_,'%Y-%m-%d'),7) = YEARWEEK(now(),7)
     </select>
 
@@ -877,4 +876,37 @@
             <![CDATA[ AND s.class_date_ <= #{param.endDate} ]]>
         </if>
     </select>
+    <select id="selectWaitCourse" resultType="com.yonge.cooleshow.biz.dal.dto.UserAccountRecordDto">
+        SELECT DISTINCT
+            ts.teacher_id_ AS userId,
+            ts.actual_salary_ AS transAmount,
+            ts.course_group_type_ AS bizType,
+            ts.course_schedule_id_ AS bizId,
+            lr.room_title_ AS bizName,
+            'IN' AS inOrOut,
+            sp.order_no_ AS orderNo,
+            ts.update_time_ AS updateTime
+        FROM course_schedule_teacher_salary ts
+        LEFT JOIN live_room lr ON ts.course_schedule_id_ = lr.course_id_
+        LEFT JOIN course_schedule_student_payment sp ON ts.course_schedule_id_ = sp.course_id_
+        WHERE ts.course_group_type_ = 'LIVE'
+        AND ts.status_ = 'WAIT'
+        <![CDATA[ AND DATE_FORMAT(ts.update_time_,'%Y-%m-%d') <= #{day}]]>
+        UNION
+        SELECT DISTINCT
+            ts.teacher_id_ AS userId,
+            ts.actual_salary_ AS transAmount,
+            ts.course_group_type_ AS bizType,
+            ts.course_schedule_id_ AS bizId,
+            g.name_ AS bizName,
+            'IN' AS inOrOut,
+            sp.order_no_ AS orderNo,
+            ts.update_time_ AS updateTime
+        FROM course_schedule_teacher_salary ts
+        LEFT JOIN course_group g ON ts.course_group_id_ = g.id_
+        LEFT JOIN course_schedule_student_payment sp ON ts.course_schedule_id_ = sp.course_id_
+        WHERE ts.course_group_type_ = 'PRACTICE'
+        AND ts.status_ = 'WAIT'
+        <![CDATA[ AND DATE_FORMAT(ts.update_time_,'%Y-%m-%d') <= #{day}]]>
+    </select>
 </mapper>

+ 6 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleRepliedMapper.xml

@@ -82,6 +82,12 @@
             (#{item.studentId},#{item.courseId},#{item.type},#{item.courseGroupId})
         </foreach>
     </insert>
+    <delete id="deleteBatch" parameterType="java.util.List">
+        DELETE FROM course_schedule_replied WHERE course_schedule_id_ IN
+        <foreach collection="list" item="item" index="index" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+    </delete>
 
     <select id="detail" resultType="com.yonge.cooleshow.biz.dal.vo.CourseScheduleRepliedVo">
         SELECT

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

@@ -8,7 +8,7 @@
 			(select count(1) from teacher_auth_musician_record where teacher_auth_status_ = 'DOING') as musicianNum,
         	(select count(1) from music_sheet where del_flag_ = 0 and audit_status_ = 'DOING') as musicNum,
         	(select count(1) from video_lesson_auth_record where audit_status_ = 'DOING') as videoCourseNum,
-			(select count(1) from teacher_style_video where auth_status_ = 'DOING') as styleNum
+			(select count(1) from teacher_style_video where del_flag_ = 0 and auth_status_ = 'DOING') as styleNum
         from dual
 	</select>
 

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

@@ -7,6 +7,7 @@
         <result column="album_name_" jdbcType="VARCHAR" property="albumName"/>
         <result column="album_desc_" jdbcType="VARCHAR" property="albumDesc"/>
         <result column="album_tag_" jdbcType="VARCHAR" property="albumTag"/>
+        <result column="subject_id_" jdbcType="VARCHAR" property="subjectId"/>
         <result column="album_cover_url_" jdbcType="VARCHAR" property="albumCoverUrl"/>
         <result column="album_status_" jdbcType="TINYINT" property="albumStatus"/>
         <result column="sort_number_" jdbcType="INTEGER" property="sortNumber"/>
@@ -24,6 +25,7 @@
         t.album_name_,
         t.album_desc_,
         t.album_tag_,
+        t.subject_id_,
         t.album_cover_url_,
         t.album_status_,
         t.sort_number_,
@@ -40,6 +42,8 @@
         select <include refid="Base_Column_List"/>
         ,(select group_concat(mt.name_) from music_tag mt
             where find_in_set(mt.id_,t.album_tag_) and mt.del_flag_ = 0 and mt.state_ = 1) as musicTagNames
+        ,(select group_concat(s.name_) from subject s
+        where find_in_set(s.id_,t.subject_id_) and s.del_flag_ = 0 ) as subjectNames
         , t1.num as musicSheetCount
         ,t2.num as albumFavoriteCount
         from music_album t
@@ -57,6 +61,12 @@
                     find_in_set(#{item},t.album_tag_)
                 </foreach>
             </if>
+            <if test="query.subjectIdList != null and query.subjectIdList.size() != 0">
+                and
+                <foreach collection="query.subjectIdList"  open="(" close=")"  separator="or" item="item">
+                    find_in_set(#{item},t.subject_id_)
+                </foreach>
+            </if>
             <if test="query.albumStatus != null">
                 and t.album_status_ = #{query.albumStatus}
             </if>
@@ -80,6 +90,8 @@
         select <include refid="Base_Column_List"/>
         ,(select group_concat(mt.name_) from music_tag mt
         where find_in_set(mt.id_,t.album_tag_) and mt.del_flag_ = 0 and mt.state_ = 1) as musicTagNames
+        ,(select group_concat(s.name_) from subject s
+        where find_in_set(s.id_,t.subject_id_) and s.del_flag_ = 0 ) as subjectNames
         from music_album t
         left join album_favorite af2 on af2.album_id_ = t.id_
         <where>
@@ -97,7 +109,12 @@
                     find_in_set(#{item},t.album_tag_)
                 </foreach>
             </if>
-
+            <if test="query.subjectIdList != null and query.subjectIdList.size() != 0">
+                and
+                <foreach collection="query.subjectIdList"  open="(" close=")"  separator="or" item="item">
+                    find_in_set(#{item},t.subject_id_)
+                </foreach>
+            </if>
             <if test="query.auditVersion != null">
                 and t.audit_version_ = #{query.auditVersion}
             </if>
@@ -141,6 +158,8 @@
         select <include refid="Base_Column_List"/>
         ,(select group_concat(mt.name_) from music_tag mt
         where find_in_set(mt.id_,t.album_tag_) and mt.del_flag_ = 0 and mt.state_ = 1) as musicTagNames
+        ,(select group_concat(s.name_) from subject s
+        where find_in_set(s.id_,t.subject_id_) and s.del_flag_ = 0 ) as subjectNames
         , t1.num as musicSheetCount
         ,t2.num as albumFavoriteCount
         from music_album t
@@ -153,6 +172,8 @@
         select <include refid="Base_Column_List"/>
         ,(select group_concat(mt.name_) from music_tag mt
         where find_in_set(mt.id_,t.album_tag_) and mt.del_flag_ = 0 and mt.state_ = 1) as musicTagNames
+        ,(select group_concat(s.name_) from subject s
+        where find_in_set(s.id_,t.subject_id_) and s.del_flag_ = 0 ) as subjectNames
         ,if( t1.num>0,t1.num,0) as musicSheetCount
         ,if(t2.num >0,t2.num,0) as albumFavoriteCount
         from music_album t
@@ -174,6 +195,12 @@
                     find_in_set(#{item},t.album_tag_)
                 </foreach>
             </if>
+            <if test="query.subjectIdList != null and query.subjectIdList.size() != 0">
+                and
+                <foreach collection="query.subjectIdList"  open="(" close=")"  separator="or" item="item">
+                    find_in_set(#{item},t.subject_id_)
+                </foreach>
+            </if>
             <if test="query.albumStatus != null">
                 and t.album_status_ = #{query.albumStatus}
             </if>

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

@@ -483,7 +483,7 @@
         select count(1)
         from music_sheet
         where user_id_ = #{userId}
-        and state_ = 1 and audit_status_ = 'PASS' and del_flag_ = 0
+        and state_ = 1 and audit_status_ = 'PASS' and del_flag_ = 0 and source_type_ = 'TEACHER'
     </select>
 
     <select id="selectMusicNum" resultType="com.yonge.cooleshow.biz.dal.vo.HomeMusicSheetVo">
@@ -529,4 +529,51 @@
         where t.user_id_ = #{userId}
 
     </select>
+
+    <select id="queryStudentTotal" resultType="com.yonge.cooleshow.biz.dal.vo.StudentTotalVo">
+        select
+            t.user_id_ as userId,
+            a.musicAlbumNum,
+            b.musicSheetNum
+        from teacher t
+        left join (
+            select
+                user_id_, count(1) as musicAlbumNum
+            from album_favorite
+            <where>
+                <if test="null != userId">
+                    and user_id_ = #{userId}
+                </if>
+            </where>
+            group by user_id_
+        ) a on t.user_id_ = a.user_id_
+        left join (
+            select
+                user_id_, count(1) as musicSheetNum
+            from music_favorite
+            <where>
+                <if test="null != userId">
+                    and user_id_ = #{userId}
+                </if>
+            </where>
+            group by user_id_
+        ) b on t.user_id_ = b.user_id_
+    </select>
+
+    <select id="queryTeacherTotal" resultType="com.yonge.cooleshow.biz.dal.vo.TeacherTotalVo">
+        select
+            t.user_id_ as userId,
+            a.musicSheetNum as musicSheetNum
+        from student t
+        left join (
+            select
+                user_id_, count(1) as musicSheetNum
+            from music_sheet
+            where source_type_ = 'TEACHER' and state_ = 1 and audit_status_ = 'PASS' and del_flag_ = 0
+            <if test="null != userId">
+                and user_id_ = #{userId}
+            </if>
+            group by user_id_
+        ) a on t.user_id_ = a.user_id_
+    </select>
 </mapper>

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

@@ -45,7 +45,8 @@
             (!isnull(membership_end_time_) and membership_end_time_ > now()) as isVip,
             (
             SELECT GROUP_CONCAT(name_) FROM subject WHERE FIND_IN_SET(id_,t.subject_id_)
-            ) as subjectName
+            ) as subjectName,
+            u.user_type_ as userType
         FROM student t
         left join sys_user u on t.user_id_ = u.id_
         where t.user_id_ = #{userId}
@@ -65,7 +66,8 @@
             (!isnull(membership_end_time_) and membership_end_time_ > now()) as isVip,
             (
                 SELECT GROUP_CONCAT(name_) FROM subject WHERE FIND_IN_SET(id_,t.subject_id_)
-            ) as subjectName
+            ) as subjectName,
+            u.user_type_ as userType
         FROM student t
         left join sys_user u on t.user_id_ = u.id_
         where u.phone_ = #{phone}

+ 4 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherAuthMusicianRecordMapper.xml

@@ -27,6 +27,7 @@
             <include refid="baseColumns"/>,
             ifnull(u.real_name_,u.username_) as realName,
             u.id_card_no_ as idCardNo,
+            u.phone_ as phone,
             (
                 SELECT u.username_ FROM sys_user u WHERE u.id_ = t.verify_user_id_
             ) as verifyUser
@@ -34,6 +35,9 @@
             , te.introduction_ as "introduction"
             , te.graduate_school_ as "graduateSchool"
             , te.subject_ as "subject"
+            ,(
+                SELECT GROUP_CONCAT(name_) FROM subject WHERE FIND_IN_SET(id_,te.subject_id_)
+            ) as subjectName
             , te.grad_certificate_ as "gradCertificate"
             , te.degree_certificate_ as "degreeCertificate"
             , te.teacher_certificate_ as "teacherCertificate"

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

@@ -120,7 +120,8 @@
             (case when isnull(b.user_id_) then 0 else 1 end) as isBank,
             (
                 SELECT GROUP_CONCAT(name_) FROM subject WHERE FIND_IN_SET(id_,t.subject_id_)
-            ) as subjectName
+            ) as subjectName,
+            u.user_type_ as userType
         FROM teacher t
         left join sys_user u on t.user_id_ = u.id_
         left join (

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

@@ -53,7 +53,7 @@
 		FROM teacher_style_video t
 		left join sys_user u on t.user_id_ = u.id_
 		left join sys_user v on t.verify_user_id_ = v.id_
-		where (t.del_flag_ = 0 or t.auth_status_ != 'DOING')
+		where t.del_flag_ = 0
 		<if test="null != param.search and '' != param.search">
 			AND (
 			t.user_id_ LIKE CONCAT('%', #{param.search}, '%') or
@@ -105,7 +105,7 @@
 		LEFT JOIN teacher a on t.user_id_ = a.user_id_
 		LEFT JOIN sys_user u on t.user_id_ = u.id_
 		LEFT JOIN teacher_total ta on t.user_id_ = ta.user_id_
-		where t.del_flag_ = '0' and t.auth_status_ = 'PASS'
+		where t.del_flag_ = 0 and t.auth_status_ = 'PASS'
 		<if test="param.username != null and param.username != ''">
 			AND u.username_ LIKE CONCAT('%', #{param.username}, '%')
 		</if>
@@ -115,7 +115,7 @@
 		<if test="param.auditVersion != null">
 			and #{param.auditVersion} = t.audit_version_
 		</if>
-		order by ta.live_flag_ desc,(ta.fans_num_ * 0.3 + t.browse_ * 0.3 + ta.exp_time_) desc
+		order by ta.live_flag_ desc,(ta.fans_num_ * 0.3 + t.browse_ * 0.3 + ta.exp_time_ * 0.4) desc
 	</select>
 
 	<update id="addVideoBrowse">

+ 34 - 4
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderMapper.xml

@@ -169,10 +169,21 @@
         SELECT
             <include refid="baseColumns"/>
         FROM user_order t
+        left join user_order_payment p on t.order_no_ = p.order_no_ and (p.status_ = 'pending' or p.status_ = 'succeeded')
         <where>
             <if test="null != param.status and '' != param.status">
                 AND t.status_ = #{param.status}
             </if>
+            <if test="param.startTime != null">
+                AND (
+                    (p.id_ is null and t.create_time_ &gt;= #{param.startTime}) or (p.id_ is not null and p.create_time_ &gt;= #{param.startTime})
+                )
+            </if>
+            <if test="param.endTime != null">
+                AND (
+                    (p.id_ is null and t.create_time_ &lt; #{param.endTime}) or (p.id_ is not null and p.create_time_ &lt; #{param.endTime})
+                )
+            </if>
         </where>
         order by t.create_time_
     </select>
@@ -225,16 +236,35 @@
     </select>
     <select id="getUserOrderByPaymentNoOrTransNo" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderVo">
         SELECT
-            <include refid="baseColumns"/>
+            <include refid="baseColumns"/>,
+            p.open_type_ as openType,
+            p.payment_client_ as paymentClient,
+            p.pay_channel_ as payChannel,
+            p.trans_no_ as transNo,
+            p.payment_no_ as paymentNo
         FROM user_order t
-        left join user_order_payment p on t.order_no_ = p.order_no_
+        left join user_order_payment p on t.order_no_ = p.order_no_ and (p.status_ = 'pending' or p.status_ = 'succeeded')
         <where>
             <choose>
                 <when test="paymentNo != null and paymentNo != ''">
-                    and p.payment_no_ = #{paymentNo}
+                    and (
+                        exists (select 1 from user_order_payment p1 where t.order_no_ = p1.order_no_ and  p1.payment_no_ = #{paymentNo}) or
+                        exists (
+                                select 1 from user_order_refund b1
+                                left join user_order_refund_bill b2 on b1.id_ = b2.refund_id_
+                                where t.order_no_ = b1.order_no_ and b2.bill_no_ = #{paymentNo}
+                        )
+                    )
                 </when>
                 <otherwise>
-                    and p.trans_no_ = #{transNo}
+                    and (
+                        exists (select 1 from user_order_payment p1 where p1.trans_no_ = #{transNo}) or
+                        exists (
+                                select 1 from user_order_refund b1
+                                left join user_order_refund_bill b2 on b1.id_ = b2.refund_id_
+                                where t.order_no_ = b1.order_no_ and b2.trans_no_ = #{transNo}
+                        )
+                    )
                 </otherwise>
             </choose>
         </where>

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

@@ -259,7 +259,10 @@
 				AND g.teacher_id_ = #{param.teacherId}
 			</if>
 			<if test="param.auditVersion != null">
-				and g.audit_version_ = #{param.auditVersion}
+				AND g.audit_version_ = #{param.auditVersion}
+			</if>
+			<if test="param.lessonSubject != null">
+				AND s.id_ = #{param.lessonSubject}
 			</if>
 		</where>
 		ORDER BY g.create_time_ DESC

+ 1 - 1
cooleshow-user/user-classroom/src/main/resources/logback-spring.xml

@@ -27,7 +27,7 @@
 		</encoder>
 	</appender>
 
-	<logger name="com.yonge.cooleshow" level="INFO" />
+	<logger name="com.yonge" level="INFO" />
 	<!--本地环境:打印控制台 -->
 	<springProfile name="local">
 		<root level="INFO">

+ 11 - 0
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/MusicAlbumController.java

@@ -6,9 +6,11 @@ import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumDetailSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicAlbumSearch;
+import com.yonge.cooleshow.biz.dal.entity.Student;
 import com.yonge.cooleshow.biz.dal.enums.YesOrNoEnum;
 import com.yonge.cooleshow.biz.dal.service.AppVersionInfoService;
 import com.yonge.cooleshow.biz.dal.service.MusicAlbumService;
+import com.yonge.cooleshow.biz.dal.service.StudentService;
 import com.yonge.cooleshow.biz.dal.vo.AlbumDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.MusicAlbumVo;
 import com.yonge.cooleshow.common.controller.BaseController;
@@ -41,6 +43,9 @@ public class MusicAlbumController extends BaseController {
 	private MusicAlbumService musicAlbumService;
 
     @Autowired
+    private StudentService studentService;
+
+    @Autowired
     private AppVersionInfoService appVersionInfoService;
 
     @ApiOperation(value = "分页查询", httpMethod="POST", consumes="application/json", produces="application/json")
@@ -51,10 +56,16 @@ public class MusicAlbumController extends BaseController {
             return failed("用户信息获取失败");
         }
 
+        Student student = studentService.getById(sysUser.getId());
+        if (student == null) {
+            return failed("用户信息获取失败");
+        }
+
         // 检查app版本
         query.setAuditVersion(appVersionInfoService.getAppAuditVersion(query.getPlatform(),query.getVersion()));
 
 
+        query.setSubjectIds(student.getSubjectId());
         query.setAlbumStatus(YesOrNoEnum.YES);
         query.setSortBy(1);
         IPage<MusicAlbumVo> iPage = musicAlbumService.selectStudentPage(PageUtil.getPage(query),query);

+ 20 - 0
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/MusicSheetController.java

@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.dto.RealnameAuthReq;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.entity.Student;
+import com.yonge.cooleshow.biz.dal.service.StudentService;
 import com.yonge.cooleshow.common.enums.SysUserType;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicSheetSearch;
@@ -50,6 +52,10 @@ public class MusicSheetController extends BaseController {
     @Autowired
     private AppVersionInfoService appVersionInfoService;
 
+    @Autowired
+    private StudentService studentService;
+
+
     /**
      * 查询单条
      */
@@ -70,10 +76,16 @@ public class MusicSheetController extends BaseController {
         if (sysUser == null  || sysUser.getId() == null) {
             return failed("用户信息获取失败");
         }
+        Student student = studentService.getById(sysUser.getId());
+        if (student == null) {
+            return failed("用户信息获取失败");
+        }
         // 检查app版本
         query.setAuditVersion(appVersionInfoService.getAppAuditVersion(query.getPlatform(),query.getVersion()));
 
 
+        query.setSubjectIds(student.getSubjectId());
+
         // 学生 只能看通过审核 并且 启用的 曲目
         query.setState(YesOrNoEnum.YES);
         query.setAuditStatus(AuthStatusEnum.PASS);
@@ -91,6 +103,11 @@ public class MusicSheetController extends BaseController {
             return failed("用户信息获取失败");
         }
 
+        Student student = studentService.getById(sysUser.getId());
+        if (student == null) {
+            return failed("用户信息获取失败");
+        }
+
         // 检查app版本
         YesOrNoEnum appAuditVersion = appVersionInfoService.getAppAuditVersion(query.getPlatform(), query.getVersion());
         // 学生 只能看通过审核 并且 启用的 曲目
@@ -98,6 +115,8 @@ public class MusicSheetController extends BaseController {
         query.setAuditVersion(appAuditVersion);
         query.setAuditStatus(AuthStatusEnum.PASS);
         query.setStudentId(sysUser.getId());
+
+        query.setSubjectIds(student.getSubjectId());
         query.setRows(query.getSheetRow());
         IPage<MusicSheetVo> musicSheetVoIPage = musicSheetService.selectStudentPage(PageUtil.getPage(query), query);
 
@@ -108,6 +127,7 @@ public class MusicSheetController extends BaseController {
         musicAlbumSearch.setAuditVersion(appAuditVersion);
         musicAlbumSearch.setAlbumTagIds(query.getMusicTagIds());
         musicAlbumSearch.setPage(query.getPage());
+        musicAlbumSearch.setSubjectIds(student.getSubjectId());
         musicAlbumSearch.setRows(query.getAlbumRow());
         IPage<MusicAlbumVo> musicAlbumVoIPage = musicAlbumService.selectPage(PageUtil.getPage(musicAlbumSearch), musicAlbumSearch);
 

+ 13 - 0
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/SysMusicCompareRecordController.java

@@ -3,9 +3,14 @@ package com.yonge.cooleshow.student.controller;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
 import java.util.Objects;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -67,6 +72,14 @@ public class SysMusicCompareRecordController extends BaseController {
             return failed("获取用户信息失败");
         }
         queryInfo.setUserId(sysUser.getId());
+        if (StringUtils.isEmpty(queryInfo.getStartTime())) {
+            return failed("时间不能为空");
+        }
+        LocalDate localDate = LocalDate.parse(queryInfo.getStartTime() + "-01",
+                                              DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        queryInfo.setStartTime(localDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+        LocalDate endDate = localDate.plusDays(localDate.getMonth().length(localDate.isLeapYear()) -1);
+        queryInfo.setEndTime(endDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
         return succeed(sysMusicCompareRecordService.studentTrainData(queryInfo));
     }
 

+ 14 - 14
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java

@@ -10,7 +10,7 @@ import com.yonge.cooleshow.biz.dal.entity.UserOrder;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.UserOrderService;
-import com.yonge.cooleshow.biz.dal.support.DistributedLock;
+import com.yonge.toolset.payment.util.DistributedLock;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderPayRes;
@@ -67,16 +67,16 @@ public class UserOrderController extends BaseController {
 
         try {
             HttpResponseResult<UserOrder> res = DistributedLock.of(redissonClient)
-                    .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())
-                            , () -> userOrderService.executeOrder(orderReq), 60L, TimeUnit.SECONDS);
-            if(null != res){
+                    .runIfLockToFunction(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())
+                            , userOrderService::executeOrder, orderReq, 10l);
+            if (null != res) {
                 return res;
-            }else{
+            } else {
                 return HttpResponseResult.failed("下单失败");
             }
         } catch (BizException e) {
             return HttpResponseResult.failed(e.getMessage());
-        }  catch (Exception e) {
+        } catch (Exception e) {
             e.printStackTrace();
             return HttpResponseResult.failed("下单失败");
         }
@@ -98,11 +98,11 @@ public class UserOrderController extends BaseController {
 
         try {
             HttpResponseResult<OrderPayRes> res = DistributedLock.of(redissonClient)
-                    .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())
-                            , () -> userOrderService.orderPay(payReq), 60L, TimeUnit.SECONDS);
-            if(null != res){
+                    .runIfLockToFunction(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())
+                            , userOrderService::orderPay, payReq, 10L);
+            if (null != res) {
                 return res;
-            }else{
+            } else {
                 return HttpResponseResult.failed("付款失败");
             }
         } catch (BizException e) {
@@ -158,11 +158,11 @@ public class UserOrderController extends BaseController {
 
         try {
             HttpResponseResult<Boolean> res = DistributedLock.of(redissonClient)
-                    .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())
-                            , () -> userOrderService.orderCancel(payReq), 60L, TimeUnit.SECONDS);
-            if(null != res){
+                    .runIfLockToFunction(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(payReq.getOrderNo())
+                            , userOrderService::orderCancel, payReq, 10L);
+            if (null != res) {
                 return res;
-            }else{
+            } else {
                 return HttpResponseResult.failed("取消订单失败");
             }
         } catch (BizException e) {

+ 3 - 3
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderRefundController.java

@@ -7,7 +7,7 @@ import com.yonge.cooleshow.biz.dal.dto.req.OrderRefundReq;
 import com.yonge.cooleshow.biz.dal.dto.search.UserOrderRefundSearch;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.cooleshow.biz.dal.service.UserOrderRefundService;
-import com.yonge.cooleshow.biz.dal.support.DistributedLock;
+import com.yonge.toolset.payment.util.DistributedLock;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderRefundVo;
 import com.yonge.cooleshow.common.controller.BaseController;
@@ -73,8 +73,8 @@ public class UserOrderRefundController extends BaseController {
 
         try {
             HttpResponseResult<Boolean> res = DistributedLock.of(redissonClient)
-                    .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())
-                            , () -> userOrderRefundService.orderRefund(refundReq), 60L, TimeUnit.SECONDS);
+                    .runIfLockToFunction(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(refundReq.getOrderNo())
+                            , userOrderRefundService::orderRefund, refundReq, 10L);
             if (null != res) {
                 return res;
             } else {

+ 1 - 1
cooleshow-user/user-student/src/main/resources/logback-spring.xml

@@ -27,7 +27,7 @@
 		</encoder>
 	</appender>
 
-	<logger name="com.yonge.cooleshow" level="INFO" />
+	<logger name="com.yonge" level="INFO" />
 
 	<!--本地环境:打印控制台 -->
 	<springProfile name="local">

+ 1 - 0
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/MusicSheetController.java

@@ -121,6 +121,7 @@ public class MusicSheetController extends BaseController {
         if (query.getAuditStatus() != null && AuthStatusEnum.PASS.getCode().equals(query.getAuditStatus().getCode())) {
             query.setState(YesOrNoEnum.YES);
         }
+        query.setSourceType(SourceTypeEnum.TEACHER);
 
         IPage<MusicSheetVo> musicSheetVoIPage = musicSheetService.selectPage(PageUtil.getPage(query), query);
         return succeed(PageUtil.pageInfo(musicSheetVoIPage));

+ 13 - 19
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherLiveRoomController.java

@@ -1,12 +1,13 @@
 package com.yonge.cooleshow.teacher.controller;
 
-
 import com.alibaba.fastjson.JSONObject;
 import com.yonge.cooleshow.biz.dal.entity.ImUserStateSync;
+import com.yonge.cooleshow.biz.dal.entity.LiveRoom;
 import com.yonge.cooleshow.biz.dal.entity.RoomInfoCache;
 import com.yonge.cooleshow.biz.dal.service.LiveRoomService;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.base.page.PageInfo;
 import io.swagger.annotations.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -33,6 +34,17 @@ public class TeacherLiveRoomController extends BaseController {
     @Resource
     private LiveRoomService liveRoomService;
 
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "roomType", dataType = "String", value = "房间类型  LIVE-直播课  TEMP-临时直播间"),
+            @ApiImplicitParam(name = "page", dataType = "Integer", value = "页数"),
+            @ApiImplicitParam(name = "rows", dataType = "Integer", value = "每页数量"),
+    })
+    @ApiOperation("分页查询当前用户关联的房间信息")
+    @PostMapping("/queryPageRoom")
+    public HttpResponseResult<PageInfo<LiveRoom>> queryPageRoom(@RequestBody Map<String, Object> param) {
+        return succeed(liveRoomService.queryPageRoom(param));
+    }
+
     /**
      * 根据房间uid查询房间信息
      *
@@ -68,24 +80,6 @@ public class TeacherLiveRoomController extends BaseController {
         return succeed(liveRoomService.speakerJoinRoom(roomUid));
     }
 
-    @ApiOperation("定时任务-创建房间-直播间")
-    @GetMapping("/createCourseLiveRoom")
-    public void createCourseLiveRoom() {
-        liveRoomService.createCourseLiveRoom();
-    }
-
-    @ApiOperation("定时任务-销毁房间-直播间")
-    @GetMapping("/destroyExpiredLiveRoom")
-    public void destroyExpiredLiveRoom() {
-        liveRoomService.destroyExpiredLiveRoom();
-    }
-
-    @ApiOperation("定时任务-销毁房间-直播间-陪练课")
-    @GetMapping("/destroyExpiredPracticeRoom")
-    public void destroyExpiredPracticeRoom() {
-        liveRoomService.destroyExpiredPracticeRoom();
-    }
-
     @ApiOperation("手动关闭直播间")
     @GetMapping("/destroyLiveRoom")
     public HttpResponseResult<Object> destroyLiveRoom(@ApiParam(value = "房间uid", required = true) String roomUid) {

+ 56 - 0
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherLiveRoomVideoController.java

@@ -0,0 +1,56 @@
+package com.yonge.cooleshow.teacher.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.yonge.cooleshow.biz.dal.entity.LiveRoomVideo;
+import com.yonge.cooleshow.biz.dal.entity.RecordNotify;
+import com.yonge.cooleshow.biz.dal.service.LiveRoomVideoService;
+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.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * 直播视频记录(LiveRoomVideo)表控制层
+ *
+ * @author hgw
+ * @since 2022-03-18 15:41:17
+ */
+@Api(tags = "直播视频记录")
+@RestController
+@RequestMapping("/liveRoomVideo")
+public class TeacherLiveRoomVideoController extends BaseController {
+
+    private final static Logger log = LoggerFactory.getLogger(TeacherLiveRoomVideoController.class);
+
+    /**
+     * 服务对象
+     */
+    @Resource
+    private LiveRoomVideoService liveRoomVideoService;
+
+    @ApiOperation("查询直播回放")
+    @GetMapping("/queryVideo")
+    public HttpResponseResult<List<LiveRoomVideo>> queryVideo(@ApiParam(value = "房间uid", required = true) String roomUid) {
+        return succeed(liveRoomVideoService.queryVideo(roomUid));
+    }
+
+    @ApiOperation("录制结果回调")
+    @RequestMapping(value = "/recordSync")
+    public void recordSync(@RequestBody String body) {
+        log.info("recordSync body:{}", body);
+        RecordNotify recordNotify = JSONObject.parseObject(body, RecordNotify.class);
+        liveRoomVideoService.recordSync(recordNotify);
+    }
+
+}
+

+ 14 - 14
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/UserOrderController.java

@@ -9,7 +9,7 @@ import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
 import com.yonge.cooleshow.biz.dal.entity.UserOrder;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.cooleshow.biz.dal.service.UserOrderService;
-import com.yonge.cooleshow.biz.dal.support.DistributedLock;
+import com.yonge.toolset.payment.util.DistributedLock;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderPayRes;
@@ -69,16 +69,16 @@ public class UserOrderController extends BaseController {
 
         try {
             HttpResponseResult<UserOrder> res = DistributedLock.of(redissonClient)
-                    .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())
-                            , () -> userOrderService.executeOrder(orderReq), 60L, TimeUnit.SECONDS);
-            if(null != res){
+                    .runIfLockToFunction(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())
+                            , userOrderService::executeOrder, orderReq, 10L);
+            if (null != res) {
                 return res;
-            }else{
+            } else {
                 return HttpResponseResult.failed("下单失败");
             }
         } catch (BizException e) {
             return HttpResponseResult.failed(e.getMessage());
-        }  catch (Exception e) {
+        } catch (Exception e) {
             e.printStackTrace();
             return HttpResponseResult.failed("下单失败");
         }
@@ -100,11 +100,11 @@ public class UserOrderController extends BaseController {
 
         try {
             HttpResponseResult<OrderPayRes> res = DistributedLock.of(redissonClient)
-                    .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())
-                            , () -> userOrderService.orderPay(payReq), 60L, TimeUnit.SECONDS);
-            if(null != res){
+                    .runIfLockToFunction(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())
+                            , userOrderService::orderPay, payReq, 10L);
+            if (null != res) {
                 return res;
-            }else{
+            } else {
                 return HttpResponseResult.failed("付款失败");
             }
         } catch (BizException e) {
@@ -133,11 +133,11 @@ public class UserOrderController extends BaseController {
 
         try {
             HttpResponseResult<Boolean> res = DistributedLock.of(redissonClient)
-                    .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())
-                            , () -> userOrderService.orderCancel(payReq), 60L, TimeUnit.SECONDS);
-            if(null != res){
+                    .runIfLockToFunction(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())
+                            , userOrderService::orderCancel, payReq, 10L);
+            if (null != res) {
                 return res;
-            }else{
+            } else {
                 return HttpResponseResult.failed("取消订单失败");
             }
         } catch (BizException e) {

+ 1 - 2
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/UserWithdrawalController.java

@@ -5,9 +5,8 @@ import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.req.WithdrawalReq;
 import com.yonge.cooleshow.biz.dal.dto.search.TeacherWithdrawalSearch;
-import com.yonge.cooleshow.biz.dal.entity.UserOrder;
 import com.yonge.cooleshow.biz.dal.service.UserWithdrawalService;
-import com.yonge.cooleshow.biz.dal.support.DistributedLock;
+import com.yonge.toolset.payment.util.DistributedLock;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.vo.UserWithdrawalVo;

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

@@ -3,10 +3,11 @@ package com.yonge.cooleshow.teacher.task;
 import com.yonge.cooleshow.biz.dal.entity.TeacherTotal;
 import com.yonge.cooleshow.biz.dal.service.CourseGroupService;
 import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
+import com.yonge.cooleshow.biz.dal.service.LiveRoomService;
 import com.yonge.cooleshow.biz.dal.service.TeacherTotalService;
 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 org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -29,6 +30,9 @@ public class TaskController extends BaseController {
     private CourseGroupService courseGroupService;
     @Autowired
     private CourseScheduleService scheduleService;
+    @Autowired
+    private LiveRoomService liveRoomService;
+
 
     /***
      * 查询所有老师统计数据
@@ -46,11 +50,23 @@ public class TaskController extends BaseController {
      * <p>定时将符合结束售卖日期的在售卖中的直播课课程组修改为取消或者成课状态状态-每隔10分钟执行一次
      */
     @GetMapping("/opsCourseGroup")
-    public HttpResponseResult<Object> opsCourseGroup(){
+    public HttpResponseResult<Object> opsCourseGroup() {
         courseGroupService.opsCourseGroup();
         return HttpResponseResult.succeed();
     }
 
+    @ApiOperation("定时任务-销毁房间-直播间")
+    @GetMapping("/destroyExpiredLiveRoom")
+    public void destroyExpiredLiveRoom() {
+        liveRoomService.destroyExpiredLiveRoom();
+    }
+
+    @ApiOperation("定时任务-创建房间-直播间")
+    @GetMapping("/createCourseLiveRoom")
+    public void createCourseLiveRoom() {
+        liveRoomService.createCourseLiveRoom();
+    }
+
     @GetMapping("/getRedisValueByKey")
     public HttpResponseResult<Object> getRedisValueByKey(String key) {
         return succeed(teacherTotalService.getRedisValueByKey(key));
@@ -68,9 +84,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();
+    }
 }

+ 1 - 1
cooleshow-user/user-teacher/src/main/resources/logback-spring.xml

@@ -27,7 +27,7 @@
 		</encoder>
 	</appender>
 
-	<logger name="com.yonge.cooleshow" level="INFO" />
+	<logger name="com.yonge" level="INFO" />
 	<!--本地环境:打印控制台 -->
 	<springProfile name="local">
 		<root level="INFO">

+ 28 - 0
cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/config/MyOAuth2AuthenticationManager.java

@@ -0,0 +1,28 @@
+package com.yonge.cooleshow.website.config;
+
+import org.springframework.security.authentication.AnonymousAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.core.authority.AuthorityUtils;
+import org.springframework.security.oauth2.common.exceptions.InvalidTokenException;
+import org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationManager;
+
+import java.util.UUID;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-06-30
+ */
+public class MyOAuth2AuthenticationManager extends OAuth2AuthenticationManager {
+
+    @Override
+    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
+        try {
+            return super.authenticate(authentication);
+        } catch (AuthenticationException | InvalidTokenException e) {
+            return new AnonymousAuthenticationToken(UUID.randomUUID().toString(), "anonymousUser", AuthorityUtils.createAuthorityList("ROLE_ANONYMOUS"));
+        }
+    }
+}

Some files were not shown because too many files changed in this diff