소스 검색

Merge remote-tracking branch 'origin/master'

zouxuan 3 년 전
부모
커밋
4fa4d25871
83개의 변경된 파일1702개의 추가작업 그리고 462개의 파일을 삭제
  1. 2 2
      audio-analysis/src/main/java/com/yonge/netty/server/handler/NettyServerHandler.java
  2. 1 0
      audio-analysis/src/main/java/com/yonge/netty/server/service/AudioCompareHandler.java
  3. 12 9
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/provider/PhoneAuthenticationProvider.java
  4. 1 1
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/provider/service/DefaultUserDetailsService.java
  5. 7 1
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/dal/dao/SysUserDao.java
  6. 4 9
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/SysUserServiceImpl.java
  7. 8 0
      cooleshow-auth/auth-server/src/main/resources/config/mybatis/SysUserMapper.xml
  8. 1 2
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/ContractTemplateTypeEnum.java
  9. 3 1
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/OmsOrderReturnApplyController.java
  10. 3 1
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/PaymentController.java
  11. 8 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/MusicSheetController.java
  12. 7 8
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UserWithdrawalController.java
  13. 43 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/convert/AuthStatusConvert.java
  14. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/convert/OrderStatusConvert.java
  15. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/convert/OrderTypeConvert.java
  16. 1 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/convert/TradeStatusConvert.java
  17. 17 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/BannerDao.java
  18. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleDao.java
  19. 6 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserWithdrawalDao.java
  20. 55 65
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/excel/UserWithdrawalExport.java
  21. 28 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseScheduleReplied.java
  22. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicSheet.java
  23. 12 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/PianoRoomSettings.java
  24. 0 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/Subject.java
  25. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/SysMusicCompareRecord.java
  26. 311 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/SysNewsInformation.java
  27. 0 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserBankCard.java
  28. 4 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/CourseScheduleEnum.java
  29. 39 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/sdk/WithdrawSdk.java
  30. 18 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/BannerService.java
  31. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseGroupService.java
  32. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleService.java
  33. 19 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/LiveRoomService.java
  34. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SysUserContractRecordService.java
  35. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserWithdrawalService.java
  36. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/VideoLessonGroupService.java
  37. 31 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/BannerServiceImpl.java
  38. 24 19
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  39. 13 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseHomeworkServiceImpl.java
  40. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseRepliedServiceImpl.java
  41. 73 28
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  42. 117 69
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/LiveRoomServiceImpl.java
  43. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  44. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentCourseHomeworkServiceImpl.java
  45. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java
  46. 30 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/SysMusicCompareRecordServiceImpl.java
  47. 53 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/SysUserContractRecordServiceImpl.java
  48. 9 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java
  49. 24 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserAccountServiceImpl.java
  50. 28 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderPaymentServiceImpl.java
  51. 49 30
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderRefundServiceImpl.java
  52. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  53. 35 16
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserWithdrawalServiceImpl.java
  54. 14 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonGroupServiceImpl.java
  55. 11 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/support/WrapperUtil.java
  56. 47 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseHomeworkDetailVo.java
  57. 22 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/LiveCourseInfoVo.java
  58. 174 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/PianoClassVo.java
  59. 4 4
      cooleshow-user/user-biz/src/main/resources/config/contracts/latest_contract_template.ftl
  60. 21 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/BannerMapper.xml
  61. 4 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseGroupMapper.xml
  62. 7 3
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseHomeworkMapper.xml
  63. 4 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CoursePlanMapper.xml
  64. 46 3
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  65. 2 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleRepliedMapper.xml
  66. 4 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml
  67. 3 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/PianoRoomSettingsMapper.xml
  68. 2 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml
  69. 1 8
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherFreeTimeMapper.xml
  70. 2 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  71. 9 9
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserBindingTeacherMapper.xml
  72. 11 3
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserWithdrawalMapper.xml
  73. 13 0
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/StudentCourseScheduleController.java
  74. 4 15
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/StudentLiveRoomController.java
  75. 3 47
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/SysUserContractRecordController.java
  76. 6 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/MusicSheetController.java
  77. 1 40
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/SysUserContractRecordController.java
  78. 15 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherCourseGroupController.java
  79. 1 1
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherCourseScheduleController.java
  80. 14 8
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherLiveRoomController.java
  81. 40 0
      cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/open/OpenNewsController.java
  82. 30 0
      cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/open/OpenTeacherController.java
  83. 29 6
      cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/open/OpenVideoGroupController.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 - 0
audio-analysis/src/main/java/com/yonge/netty/server/service/AudioCompareHandler.java

@@ -126,6 +126,7 @@ public class AudioCompareHandler implements MessageHandler {
 			channelContext.setHandlerSwitch(false);
 
 			channelContext.getSongMusicXmlMap().put(musicXmlBasicInfo.getExamSongId(), musicXmlBasicInfo);
+
 			channelContext.init(musicXmlBasicInfo.getPlatform(), musicXmlBasicInfo.getHeardLevel(), musicXmlBasicInfo.getSubjectId(),
 					musicXmlBasicInfo.getBeatLength(), audioFormat.getSampleRate(), bufferSize / 2);
 			channelContext.setUser(user);

+ 12 - 9
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/provider/PhoneAuthenticationProvider.java

@@ -49,13 +49,13 @@ public class PhoneAuthenticationProvider extends AbstractAuthenticationProvider
         String smsCode = loginEntity.getSmsCode();
         String phone = loginEntity.getPhone();
         String qrCode = loginEntity.getQrCode();
-        if(StringUtils.isNotEmpty(qrCode) && StringUtils.isEmpty(smsCode)){
+        if (StringUtils.isNotEmpty(qrCode) && StringUtils.isEmpty(smsCode)) {
             // 二维码验证
             boolean b = sysUserService.verifyQrCode(phone, qrCode);
             if (!b) {
                 throw new BadCredentialsException("二维码校验失败");
             }
-        }else{
+        } else {
             // 验证码验证
             boolean b = smsCodeService.verifyValidCode(phone, smsCode, "SMS_VERIFY_CODE_LOGIN");
             if (!b) {
@@ -91,15 +91,17 @@ public class PhoneAuthenticationProvider extends AbstractAuthenticationProvider
             if (StringUtils.isNotBlank(deviceNum)) {
                 sysUserDeviceService.bindDevice(clientId, user.getId(), deviceNum);
             }
-
-            if (!userInfo.getSysUser().getUserType().contains(clientId)
-                    && !userInfo.getSysUser().getUserType().contains(loginUserType)) {
-
-                if (isRegister == false || StringUtils.equals("SYSTEM", clientId)) {
+            if (!userInfo.getSysUser().getUserType().contains(clientId)) {
+                if(StringUtils.equals("SYSTEM", clientId)){
                     throw new LockedException("用户不存在");
-                } else {
-                    user.setUpdateTime(new Date());
+                }
+                if(isRegister == false
+                        && (StringUtils.isEmpty(loginUserType) || !(userInfo.getSysUser().getUserType().contains(loginUserType)))){
+                    throw new LockedException("用户不存在");
+                }
 
+                if(isRegister == true){
+                    user.setUpdateTime(new Date());
                     if (StringUtils.equalsIgnoreCase(loginUserType, "TEACHER")) {
                         user.setUserType(user.getUserType() + "," + loginUserType);
                         sysUserService.saveTeacher(user);
@@ -117,6 +119,7 @@ public class PhoneAuthenticationProvider extends AbstractAuthenticationProvider
                     }
                     sysUserService.update(user);
                 }
+
             }
         }
 

+ 1 - 1
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/provider/service/DefaultUserDetailsService.java

@@ -39,7 +39,7 @@ public class DefaultUserDetailsService implements UserDetailsService {
             return null;
         }
 
-        SysUserInfo userInfo = null;
+        SysUserInfo userInfo;
 
         if (StringUtils.startsWith(username, SecurityConstants.PHONE_PRINCIPAL_PREFIX)) {
             userInfo = sysUserService.queryUserInfoByPhone(StringUtils.substringAfter(username, SecurityConstants.PHONE_PRINCIPAL_PREFIX));

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

@@ -136,7 +136,13 @@ public interface SysUserDao extends BaseDAO<Long, SysUser> {
      * @updateTime 2022/3/22 11:06
      */
     void updatetSetDetail(@Param("param") UserSetReq setReq, @Param("id") Long id);
-
+    /***
+     * 查询用户账户是否存在 true 存在
+     * @author liweifan
+     * @param: id
+     * @updateTime 2022/4/14 17:07
+     */
+    Boolean queryUserAccount(@Param("userId") Long id);
     /***
      * 创建用户账户
      * @author liweifan

+ 4 - 9
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/SysUserServiceImpl.java

@@ -203,19 +203,14 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
     @Transactional(rollbackFor = Exception.class)
     public void saveStudent(SysUser sysUser) {
         sysUserDao.saveStudent(sysUser.getId());
-        if (!sysUser.getUserType().contains("TEACHER")) {
-            sysUserDao.createUserAccount(sysUser.getId());
-        }
+        sysUserDao.createUserAccount(sysUser.getId());
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void saveTeacher(SysUser sysUser) {
-
         sysUserDao.saveTeacher(sysUser.getId());
-        if (!sysUser.getUserType().contains("STUDENT")) {
-            sysUserDao.createUserAccount(sysUser.getId());
-        }
+        sysUserDao.createUserAccount(sysUser.getId());
     }
 
     @Override
@@ -252,7 +247,7 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
 
     @Override
     public boolean verifyQrCode(String phone, String qrCode) {
-        if(StringUtils.isEmpty(phone) || StringUtils.isEmpty(qrCode)){
+        if (StringUtils.isEmpty(phone) || StringUtils.isEmpty(qrCode)) {
             return false;
         }
         Object data = redissonClient.getBucket(CacheNameEnum.QR_LOGIN_CODE.getRedisKey(qrCode))
@@ -261,7 +256,7 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
             return false;
         }
         QRLoginDto dto = (QRLoginDto) data;
-        if(phone.equals(dto.getPhone()) && qrCode.equals(dto.getCode())){
+        if (phone.equals(dto.getPhone()) && qrCode.equals(dto.getCode())) {
             return true;
         }
         return false;

+ 8 - 0
cooleshow-auth/auth-server/src/main/resources/config/mybatis/SysUserMapper.xml

@@ -72,8 +72,15 @@
     <insert id="saveStudent">
         INSERT INTO student (user_id_,create_time_,update_time_) VALUES(#{userId},NOW(),NOW())
     </insert>
+
+    <select id="queryUserAccount" resultType="java.lang.Boolean">
+        select count(1) from user_cash_account where #{userId}
+    </select>
+
     <insert id="createUserAccount">
         INSERT INTO user_cash_account (user_id_,create_time_,update_time_)VALUES(#{userId},NOW(),NOW())
+            ON DUPLICATE KEY UPDATE
+                                 user_id_ = VALUES(user_id_)
     </insert>
 
     <!-- 根据主键查询一条记录 -->
@@ -269,4 +276,5 @@
             </if>
         </where>
     </select>
+
 </mapper>

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

@@ -5,8 +5,7 @@ import com.yonge.toolset.base.enums.BaseEnum;
 
 public enum ContractTemplateTypeEnum implements BaseEnum<String, ContractTemplateTypeEnum> {
     REGISTER(ContractTemplateSourceEnum.PLATFORM, "注册"),
-    COURSES(ContractTemplateSourceEnum.PLATFORM, "课程购买"),
-    PRODUCT(ContractTemplateSourceEnum.PLATFORM, "产品"),
+    BUY_ORDER(ContractTemplateSourceEnum.PLATFORM, "平台购买商品"),
     WITHDRAW(ContractTemplateSourceEnum.LINGXINPAY, "用户结算");
 
     @EnumValue

+ 3 - 1
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/OmsOrderReturnApplyController.java

@@ -83,7 +83,9 @@ public class OmsOrderReturnApplyController {
             e.printStackTrace();
             log.warn("");
         } finally {
-            lock.unlock();
+            if (lock.getHoldCount() >0) {
+                lock.unlock();
+            }
         }
 
         return CommonResult.failed();

+ 3 - 1
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/PaymentController.java

@@ -96,7 +96,9 @@ public class PaymentController extends BaseController {
             e.printStackTrace();
             return HttpResponseResult.failed("付款失败");
         } finally {
-            lock.unlock();
+            if (lock.getHoldCount()>0) {
+                lock.unlock();
+            }
         }
     }
 

+ 8 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/MusicSheetController.java

@@ -89,6 +89,9 @@ public class MusicSheetController extends BaseController {
             return failed("曲目声部不能为空");
         }
 
+        if (musicSheetDto.getNotation() == null) {
+            musicSheetDto.setNotation(YesOrNoEnum.NO);
+        }
         String musicTag = musicSheetDto.getMusicTag();
         List<Long> musicTagList = StringUtil.toLongList(musicTag);
 
@@ -143,7 +146,12 @@ public class MusicSheetController extends BaseController {
             return failed("启用状态不许修改");
         }
 
+        if (musicSheet.getNotation() == null) {
+            musicSheet.setNotation(YesOrNoEnum.NO);
+        }
+
         musicSheet.setUpdateBy(sysUser.getId());
+        musicSheet.setAuditStatus(AuthStatusEnum.PASS);
         musicSheet.setUpdateTime(new Date());
         if ( musicSheetService.saveMusicSheet(musicSheet,sysUser.getId())){
             return succeed("修改成功");

+ 7 - 8
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UserWithdrawalController.java

@@ -6,9 +6,6 @@ import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.excel.UserWithdrawalExport;
 import com.yonge.cooleshow.biz.dal.dto.req.AuthOperaReq;
-import com.yonge.cooleshow.biz.dal.support.DistributedLock;
-import com.yonge.cooleshow.common.enums.CacheNameEnum;
-import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
@@ -16,7 +13,6 @@ import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.utils.easyexcel.*;
 import io.swagger.annotations.*;
 import org.apache.commons.beanutils.BeanUtils;
-import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -25,12 +21,10 @@ import org.springframework.web.bind.annotation.*;
 import com.yonge.cooleshow.biz.dal.vo.UserWithdrawalVo;
 import com.yonge.cooleshow.biz.dal.dto.search.TeacherWithdrawalSearch;
 import com.yonge.cooleshow.biz.dal.service.UserWithdrawalService;
-import springfox.documentation.annotations.ApiIgnore;
 
 import javax.validation.Valid;
 import java.lang.reflect.InvocationTargetException;
 import java.util.*;
-import java.util.concurrent.TimeUnit;
 
 @RestController
 @RequestMapping("/userWithdrawal")
@@ -40,8 +34,7 @@ public class UserWithdrawalController extends BaseController {
     private SysUserFeignService sysUserFeignService;
     @Autowired
     private UserWithdrawalService userWithdrawalService;
-    @Autowired
-    private RedissonClient redissonClient;
+
     /**
      * 查询单条
      */
@@ -87,6 +80,12 @@ public class UserWithdrawalController extends BaseController {
                 "列表数据");
     }
 
+    @GetMapping("/totalAmount")
+    @ApiOperation(value = "统计金额")
+    @PreAuthorize("@pcs.hasPermissions('userWithdrawal/totalAmount')")
+    public HttpResponseResult<UserWithdrawalVo> totalAmount() {
+        return succeed(userWithdrawalService.totalAmount());
+    }
 
     @PostMapping("/doAuth")
     @ApiOperation(value = "审核", notes = "传入authOperaReq")

+ 43 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/convert/AuthStatusConvert.java

@@ -0,0 +1,43 @@
+package com.yonge.cooleshow.biz.dal.convert;
+
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.CellData;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
+import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
+
+/**
+ * @Author: liweifan
+ * @Data: 2022/4/15 15:36
+ */
+public class AuthStatusConvert implements Converter<AuthStatusEnum> {
+
+    @Override
+    public Class supportJavaTypeKey() {
+        return CellDataTypeEnum.class;
+    }
+
+    @Override
+    public CellDataTypeEnum supportExcelTypeKey() {
+        return CellDataTypeEnum.STRING;
+    }
+
+    @Override
+    public AuthStatusEnum convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        try {
+            return AuthStatusEnum.valueOf(cellData.getStringValue().trim());
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    @Override
+    public CellData convertToExcelData(AuthStatusEnum statusEnum, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        if (null != statusEnum) {
+            return new CellData(statusEnum.getName());
+        }
+        return new CellData("异常数据");
+    }
+}

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/convert/OrderStatusConvert.java

@@ -41,7 +41,7 @@ public class OrderStatusConvert implements Converter<OrderStatusEnum> {
     @Override
     public CellData convertToExcelData(OrderStatusEnum statusEnum, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
         if(null != statusEnum){
-            return new CellData(statusEnum.getCode());
+            return new CellData(statusEnum.getMsg());
         }
         return new CellData("异常数据");
     }

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/convert/OrderTypeConvert.java

@@ -35,7 +35,7 @@ public class OrderTypeConvert implements Converter<OrderTypeEnum> {
     @Override
     public CellData convertToExcelData(OrderTypeEnum statusEnum, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
         if(null != statusEnum){
-            return new CellData(statusEnum.getCode());
+            return new CellData(statusEnum.getMsg());
         }
         return new CellData("异常数据");
     }

+ 1 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/convert/WithdrawalStatusConvert.java → cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/convert/TradeStatusConvert.java

@@ -5,14 +5,13 @@ import com.alibaba.excel.enums.CellDataTypeEnum;
 import com.alibaba.excel.metadata.CellData;
 import com.alibaba.excel.metadata.GlobalConfiguration;
 import com.alibaba.excel.metadata.property.ExcelContentProperty;
-import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
 import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
 
 /**
  * @Author: liweifan
  * @Data: 2022/4/15 15:36
  */
-public class WithdrawalStatusConvert implements Converter<TradeStatusEnum> {
+public class TradeStatusConvert implements Converter<TradeStatusEnum> {
 
     @Override
     public Class supportJavaTypeKey() {

+ 17 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/BannerDao.java

@@ -0,0 +1,17 @@
+package com.yonge.cooleshow.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yonge.cooleshow.biz.dal.entity.SysNewsInformation;
+
+import java.util.List;
+
+/**
+ * AlbumFavoriteDao数据库访问类
+ * @author yzp
+ * @date 2022-03-25 23:46:28
+ * @version v1.0
+ **/
+public interface BannerDao extends BaseMapper<SysNewsInformation> {
+
+    List<SysNewsInformation> selectBanner();
+}

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

@@ -228,4 +228,7 @@ public interface CourseScheduleDao extends BaseMapper<CourseSchedule> {
 
     //查询已完成课时
     List<CourseCompleteVo> selectComplete();
+
+    //查琴房课列表
+    List<PianoClassVo> queryPianoClass(IPage page,@Param("param") MyCourseSearch search);
 }

+ 6 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserWithdrawalDao.java

@@ -39,7 +39,7 @@ public interface UserWithdrawalDao extends BaseMapper<UserWithdrawal> {
      * @updateTime 2022/4/15 18:05
      * @return: java.util.List<com.yonge.cooleshow.biz.dal.vo.UserWithdrawalVo>
      */
-    List<UserWithdrawalVo> selectList(@Param("param") TeacherWithdrawalSearch teacherWithdrawal);
+    List<UserWithdrawalVo> selectAllList(@Param("param") TeacherWithdrawalSearch teacherWithdrawal);
 
     /**
      * 查询用户今天发起的结算次数
@@ -49,5 +49,9 @@ public interface UserWithdrawalDao extends BaseMapper<UserWithdrawal> {
      */
     Integer getNowDayWithdrawalCount(@Param("userId") Long userId);
 
-
+    /**
+     * 统计金额
+     * @return
+     */
+    UserWithdrawalVo totalAmount();
 }

+ 55 - 65
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/excel/UserWithdrawalExport.java

@@ -1,14 +1,11 @@
 package com.yonge.cooleshow.biz.dal.dto.excel;
 
 import com.alibaba.excel.annotation.ExcelProperty;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.yonge.cooleshow.biz.dal.convert.WithdrawalStatusConvert;
+import com.yonge.cooleshow.biz.dal.convert.AuthStatusConvert;
+import com.yonge.cooleshow.biz.dal.convert.TradeStatusConvert;
 import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
 import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
-import io.swagger.annotations.ApiModelProperty;
 
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
 import java.math.BigDecimal;
 import java.util.Date;
 
@@ -17,37 +14,30 @@ import java.util.Date;
  * @Data: 2022/4/15 18:01
  */
 public class UserWithdrawalExport {
-    @NotNull(message = "结算编号不能为空")
     @ExcelProperty(value = "结算编号", index = 0)
     private Long id;
     @ExcelProperty(value = "结算人", index = 1)
     private String	withdrawaUser;
-    @ExcelProperty(value = "结算人编号", index = 2)
-    @NotNull(message = "结算人编号不能为空")
-    private Long userId;
-    @ExcelProperty(value = "开户行", index = 3)
+    @ExcelProperty(value = "结算金额", index = 2)
+    private BigDecimal amount;
+    @ExcelProperty(value = "发起时间", index = 3)
+    private Date createTime;
+    @ExcelProperty(value = "开户行", index = 4)
     private String bankName;
-    @ExcelProperty(value = "银行卡号", index = 4)
+    @ExcelProperty(value = "银行卡号", index = 5)
     private String bankCard;
-    @NotNull(message = "结算金额不能为空")
-    @ExcelProperty(value = "结算金额", index = 5)
-    private BigDecimal amount;
-    @NotNull(message = "平台服务费不能为空")
-    @ExcelProperty(value = "平台服务费", index = 6)
-    private BigDecimal plantformFee;
-    @ExcelProperty(value = "转账金额", index = 7)
+    @ExcelProperty(value = "转账金额(元)", index = 6)
     private BigDecimal actualAmount;
-
-    @NotNull(message = "结算状态不能为空")
-    @ExcelProperty(value = "结算状态 审核中/通过/不通过", index = 8,converter = WithdrawalStatusConvert.class)
-    private TradeStatusEnum status;
-    /*@ExcelProperty(value = "审核原因", index = 9)
-    private String verifyReason;*/
-    @ExcelProperty(value = "银行流水号", index = 9)
-    private String bankFlowNo;
-    /*@NotBlank(message = "签名不能为空")
-    @ExcelProperty(value = "签名", index = 11)
-    private String sign;*/
+    @ExcelProperty(value = "银行流水号", index = 7)
+    private String tradeNo;
+    @ExcelProperty(value = "审核状态", index = 8,converter = AuthStatusConvert.class)
+    private AuthStatusEnum authStatus;
+    @ExcelProperty(value = "转账状态", index = 9,converter = TradeStatusConvert.class)
+    private TradeStatusEnum tradeStatus;
+    @ExcelProperty(value = "审核时间", index = 10)
+    private Date authTime;
+    @ExcelProperty(value = "审核人", index = 11)
+    private String verifyUser;
 
     public Long getId() {
         return id;
@@ -65,12 +55,20 @@ public class UserWithdrawalExport {
         this.withdrawaUser = withdrawaUser;
     }
 
-    public Long getUserId() {
-        return userId;
+    public BigDecimal getAmount() {
+        return amount;
     }
 
-    public void setUserId(Long userId) {
-        this.userId = userId;
+    public void setAmount(BigDecimal amount) {
+        this.amount = amount;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
     }
 
     public String getBankName() {
@@ -89,59 +87,51 @@ public class UserWithdrawalExport {
         this.bankCard = bankCard;
     }
 
-    public BigDecimal getAmount() {
-        return amount;
-    }
-
-    public void setAmount(BigDecimal amount) {
-        this.amount = amount;
+    public BigDecimal getActualAmount() {
+        return actualAmount;
     }
 
-    public BigDecimal getPlantformFee() {
-        return plantformFee;
+    public void setActualAmount(BigDecimal actualAmount) {
+        this.actualAmount = actualAmount;
     }
 
-    public void setPlantformFee(BigDecimal plantformFee) {
-        this.plantformFee = plantformFee;
+    public String getTradeNo() {
+        return tradeNo;
     }
 
-    public BigDecimal getActualAmount() {
-        return actualAmount;
+    public void setTradeNo(String tradeNo) {
+        this.tradeNo = tradeNo;
     }
 
-    public void setActualAmount(BigDecimal actualAmount) {
-        this.actualAmount = actualAmount;
+    public AuthStatusEnum getAuthStatus() {
+        return authStatus;
     }
 
-    public String getBankFlowNo() {
-        return bankFlowNo;
+    public void setAuthStatus(AuthStatusEnum authStatus) {
+        this.authStatus = authStatus;
     }
 
-    public void setBankFlowNo(String bankFlowNo) {
-        this.bankFlowNo = bankFlowNo;
+    public TradeStatusEnum getTradeStatus() {
+        return tradeStatus;
     }
 
-    public TradeStatusEnum getStatus() {
-        return status;
+    public void setTradeStatus(TradeStatusEnum tradeStatus) {
+        this.tradeStatus = tradeStatus;
     }
 
-    public void setStatus(TradeStatusEnum status) {
-        this.status = status;
+    public Date getAuthTime() {
+        return authTime;
     }
 
-    /*public String getVerifyReason() {
-        return verifyReason;
+    public void setAuthTime(Date authTime) {
+        this.authTime = authTime;
     }
 
-    public void setVerifyReason(String verifyReason) {
-        this.verifyReason = verifyReason;
+    public String getVerifyUser() {
+        return verifyUser;
     }
 
-    public String getSign() {
-        return sign;
+    public void setVerifyUser(String verifyUser) {
+        this.verifyUser = verifyUser;
     }
-
-    public void setSign(String sign) {
-        this.sign = sign;
-    }*/
 }

+ 28 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseScheduleReplied.java

@@ -69,6 +69,18 @@ public class CourseScheduleReplied implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date updateTime;
 
+    @ApiModelProperty("学生评价时间 ")
+    @TableField(value = "student_replied_time_")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date studentRepliedTime;
+
+    @ApiModelProperty("老师评价时间 ")
+    @TableField(value = "teacher_replied_time_")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date teacherRepliedTime;
+
     public Long getId() {
         return id;
     }
@@ -148,4 +160,20 @@ public class CourseScheduleReplied implements Serializable {
     public void setUpdateTime(Date updateTime) {
         this.updateTime = updateTime;
     }
+
+    public Date getStudentRepliedTime() {
+        return studentRepliedTime;
+    }
+
+    public void setStudentRepliedTime(Date studentRepliedTime) {
+        this.studentRepliedTime = studentRepliedTime;
+    }
+
+    public Date getTeacherRepliedTime() {
+        return teacherRepliedTime;
+    }
+
+    public void setTeacherRepliedTime(Date teacherRepliedTime) {
+        this.teacherRepliedTime = teacherRepliedTime;
+    }
 }

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicSheet.java

@@ -37,6 +37,9 @@ public class MusicSheet implements Serializable {
     @ApiModelProperty(value = "曲谱来源(平台用户ID或者是老师ID)")
     private Long userId;  //曲谱来源(平台用户ID或者是老师ID)
 
+	@TableField("notation_")
+	@ApiModelProperty("是否可以转简谱(0:否,1:是)")
+	private YesOrNoEnum notation;
 
 	@TableField("source_type_")
 	@ApiModelProperty(value = "曲目来源类型 TEACHER 老师 PLATFORM 平台")
@@ -170,6 +173,14 @@ public class MusicSheet implements Serializable {
 	@ApiModelProperty(value = "假删除标识 0:未删除 1:已删除")
 	private Boolean delFlag;
 
+	public YesOrNoEnum getNotation() {
+		return notation;
+	}
+
+	public void setNotation(YesOrNoEnum notation) {
+		this.notation = notation;
+	}
+
 	public String getMidiUrl() {
 		return midiUrl;
 	}

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

@@ -31,6 +31,9 @@ public class PianoRoomSettings implements Serializable {
     @ApiModelProperty("状态 0-停用 1-使用 ")
     @TableField(value = "status_")
     private Integer status;
+    @ApiModelProperty("封面url")
+    @TableField(value = "cover_url_")
+    private String coverUrl;
     @ApiModelProperty("创建人 ")
 	@TableField(value = "create_by_")
     private Long createBy;
@@ -52,7 +55,15 @@ public class PianoRoomSettings implements Serializable {
     @TableLogic
     private Integer delFlag;
 
-	public Long getId() {
+    public String getCoverUrl() {
+        return coverUrl;
+    }
+
+    public void setCoverUrl(String coverUrl) {
+        this.coverUrl = coverUrl;
+    }
+
+    public Long getId() {
         return id;
     }
 

+ 0 - 6
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/Subject.java

@@ -135,10 +135,4 @@ public class Subject implements Serializable {
 	public void setDesc(String desc) {
 		this.desc = desc;
 	}
-
-	@Override
-	public String toString() {
-		return ToStringBuilder.reflectionToString(this);
-	}
-
 }

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/SysMusicCompareRecord.java

@@ -4,6 +4,7 @@ import java.math.BigDecimal;
 import java.time.DayOfWeek;
 import java.time.LocalDate;
 
+import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
 import com.yonge.cooleshow.biz.dal.enums.DeviceTypeEnum;
@@ -75,6 +76,17 @@ public class SysMusicCompareRecord extends BaseEntity {
 	
 	private String partIndex;
 
+	@ApiModelProperty("音乐过期 0:否 1:是")
+	private Integer expire;
+
+	public Integer getExpire() {
+		return expire;
+	}
+
+	public void setExpire(Integer expire) {
+		this.expire = expire;
+	}
+
 	public SysMusicCompareRecord() {
 	}
 

+ 311 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/SysNewsInformation.java

@@ -0,0 +1,311 @@
+package com.yonge.cooleshow.biz.dal.entity;
+
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * 对应数据库表(sys_news_information):
+ */
+public class SysNewsInformation {
+
+	/**  */
+	private Long id;
+
+	/** 标题 */
+	@ApiModelProperty(value = "标题", required = true)
+	@NotBlank(message = "标题不能为空")
+	private String title;
+
+	/** 内容 */
+	@ApiModelProperty(value = "内容", required = true)
+	private String content;
+
+	/** 封面图片 */
+	@ApiModelProperty(value = "封面图片", required = false)
+	private String coverImage;
+
+	/** 视频封面图片 */
+	@ApiModelProperty(value = "视频封面图片", required = false)
+	private String videoCoverImage;
+
+	/** 类型 */
+	@ApiModelProperty(value = "类型,1热门资讯,2开屏广告,3闪页管理,4轮播图管理 5app按钮管理 6:乐理章节", required = true)
+	@NotNull(message = "类型不能为空")
+	private Integer type;
+	
+	@ApiModelProperty(value = "子类型  章节id ", required = false)
+	private Integer subType;
+
+	/** 状态(1-可见 0-不可见) */
+	@ApiModelProperty(value = "状态(1-启用 0-禁用)")
+	private Integer status;
+
+	@ApiModelProperty(value = "链接地址")
+	private String linkUrl;
+
+	@ApiModelProperty(value = "跳转类型_bank,_slef")
+	private String hrefTarget;
+
+	@ApiModelProperty(value = "顺序号", required = true)
+	private Integer order;
+	
+	@ApiModelProperty(value = "上线、生效时间", required = false)
+	private Date onlineTime;
+	
+	@ApiModelProperty(value = "下线时间", required = false)
+	private Date offlineTime;
+
+	@ApiModelProperty("展示时间")
+	private Integer showTime;
+	/**  */
+	private Date createTime;
+
+
+	@ApiModelProperty(value = "创建人id",hidden = true)
+	private Long createBy;
+
+	@ApiModelProperty(value = "修改人id",hidden = true)
+	private Long updateBy;
+
+	/**  */
+	private Date updateTime;
+
+	@ApiModelProperty(value = "备注", required = false)
+	private String memo;
+
+	private Boolean delFlag= false;
+
+	@ApiModelProperty("是否审核版本 0:否,1:是")
+	private String attribute1;
+
+	@ApiModelProperty("广告类型  IMAGE:图片,VIDEO:视频")
+	private String attribute2;
+	
+	private String subjectIdList;
+	
+	private String subjectName;
+
+	@ApiModelProperty("链接方式 IN :内部链接   OUT:外部链接")
+	private String linkType;
+
+	// 平台类型  ADMIN:平台端  STUDENT:学生端  TEACHER:老师端 WEBSITE:官网
+	@ApiModelProperty(value = "客户端类型    STUDENT:学生端  WEBSITE:官网")
+	private String clientType;
+
+	public String getClientType() {
+		return clientType;
+	}
+
+	public void setClientType(String clientType) {
+		this.clientType = clientType;
+	}
+
+	public Integer getShowTime() {
+		return showTime;
+	}
+
+	public void setShowTime(Integer showTime) {
+		this.showTime = showTime;
+	}
+
+	public Long getCreateBy() {
+		return createBy;
+	}
+
+	public void setCreateBy(Long createBy) {
+		this.createBy = createBy;
+	}
+
+	public Long getUpdateBy() {
+		return updateBy;
+	}
+
+	public void setUpdateBy(Long updateBy) {
+		this.updateBy = updateBy;
+	}
+
+	public String getLinkUrl() {
+		return linkUrl;
+	}
+
+	public void setLinkUrl(String linkUrl) {
+		this.linkUrl = linkUrl;
+	}
+
+	public String getHrefTarget() {
+		return hrefTarget;
+	}
+
+	public void setHrefTarget(String hrefTarget) {
+		this.hrefTarget = hrefTarget;
+	}
+
+	public Integer getOrder() {
+		return order;
+	}
+
+	public void setOrder(Integer order) {
+		this.order = order;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Long getId() {
+		return this.id;
+	}
+
+	public void setTitle(String title) {
+		this.title = title;
+	}
+
+	public String getTitle() {
+		return this.title;
+	}
+
+	public void setContent(String content) {
+		this.content = content;
+	}
+
+	public String getContent() {
+		return this.content;
+	}
+
+	public void setCoverImage(String coverImage) {
+		this.coverImage = coverImage;
+	}
+
+	public String getCoverImage() {
+		return this.coverImage;
+	}
+
+	public String getVideoCoverImage() {
+		return videoCoverImage;
+	}
+
+	public void setVideoCoverImage(String videoCoverImage) {
+		this.videoCoverImage = videoCoverImage;
+	}
+
+	public void setType(Integer type) {
+		this.type = type;
+	}
+
+	public Integer getType() {
+		return this.type;
+	}
+
+	public Integer getStatus() {
+		return status;
+	}
+
+	public void setStatus(Integer status) {
+		this.status = status;
+	}
+
+	public void setCreateTime(Date createTime) {
+		this.createTime = createTime;
+	}
+
+	public Date getCreateTime() {
+		return this.createTime;
+	}
+
+	public void setUpdateTime(Date updateTime) {
+		this.updateTime = updateTime;
+	}
+
+	public Date getUpdateTime() {
+		return this.updateTime;
+	}
+
+	public String getMemo() {
+		return memo;
+	}
+
+	public void setMemo(String memo) {
+		this.memo = memo;
+	}
+
+	public Boolean getDelFlag() {
+		return delFlag;
+	}
+
+	public void setDelFlag(Boolean delFlag) {
+		this.delFlag = delFlag;
+	}
+
+	public Integer getSubType() {
+		return subType;
+	}
+
+	public void setSubType(Integer subType) {
+		this.subType = subType;
+	}
+
+	public String getAttribute1() {
+		return attribute1;
+	}
+
+	public void setAttribute1(String attribute1) {
+		this.attribute1 = attribute1;
+	}
+
+	public String getAttribute2() {
+		return attribute2;
+	}
+
+	public void setAttribute2(String attribute2) {
+		this.attribute2 = attribute2;
+	}
+
+	public Date getOnlineTime() {
+		return onlineTime;
+	}
+
+	public void setOnlineTime(Date onlineTime) {
+		this.onlineTime = onlineTime;
+	}
+
+	public Date getOfflineTime() {
+		return offlineTime;
+	}
+
+	public void setOfflineTime(Date offlineTime) {
+		this.offlineTime = offlineTime;
+	}
+
+	public String getSubjectIdList() {
+		return subjectIdList;
+	}
+
+	public void setSubjectIdList(String subjectIdList) {
+		this.subjectIdList = subjectIdList;
+	}
+
+	public String getSubjectName() {
+		return subjectName;
+	}
+
+	public void setSubjectName(String subjectName) {
+		this.subjectName = subjectName;
+	}
+
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+	public String getLinkType() {
+		return linkType;
+	}
+
+	public void setLinkType(String linkType) {
+		this.linkType = linkType;
+	}
+}

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

@@ -57,7 +57,6 @@ public class UserBankCard implements Serializable {
     private Date updateTime;
     @ApiModelProperty("逻辑删除 ")
     @TableField(value = "del_flag_")
-    @TableLogic
     private Boolean delFlag;
 	public Long getId() {
         return id;

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

@@ -39,13 +39,15 @@ public enum CourseScheduleEnum implements BaseEnum<String, CourseScheduleEnum> {
      * @param errMsg 错误异常
      */
     public static CourseScheduleEnum existCourseType(String code, String errMsg) {
-        CourseScheduleEnum[] values = {PRACTICE, LIVE};
+        CourseScheduleEnum[] values = {PRACTICE, LIVE, PIANO_ROOM_CLASS};
         existCourse(values, code, errMsg);
         //返回枚举对象
         if (code.equals(CourseScheduleEnum.PRACTICE.getCode())) {
             return CourseScheduleEnum.PRACTICE;
-        } else {
+        } else if (code.equals(CourseScheduleEnum.LIVE.getCode())) {
             return CourseScheduleEnum.LIVE;
+        } else {
+            return CourseScheduleEnum.PIANO_ROOM_CLASS;
         }
     }
 

+ 39 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/sdk/WithdrawSdk.java

@@ -16,6 +16,7 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import java.io.IOException;
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
@@ -50,6 +51,8 @@ public class WithdrawSdk {
     //结算第三方url
     @Value("${withdraw.apiUrl}")
     private String apiUrl;
+    @Value("${withdraw.privateKey}")
+    private String privateKey;
 
     /**
      * 签署协议
@@ -243,4 +246,40 @@ public class WithdrawSdk {
         }
         return null;
     }
+
+    /**
+     * 查询商户余额(单位为:分,范围:1~10000000000)
+     * @return
+     */
+    public BigDecimal balanceQuery(){
+        Map<String, Object> requestMap = new HashMap<>();
+        requestMap.put("outMemberNo", memberNo);
+        requestMap.put("charset", "UTF-8");
+        requestMap.put("service", "bpotop.zx.pay.order");
+        requestMap.put("version", "2.0");
+        requestMap.put("signType", "RSA");
+
+        String jsonStr = JSONObject.toJSONString(requestMap);
+        String encryptStr = null;
+        try {
+            encryptStr = RSA.encryptPub(jsonStr, publicKey);
+            requestMap.put("sign", encryptStr);
+            logger.info("查询余额请求参数:{}", requestMap);
+        } catch (Exception e) {
+            throw new ThirdpartyException("加密失败:{}", e.getMessage());
+        }
+
+        String resultJsonStr = null;
+        try {
+            resultJsonStr = HttpUtil.postForHttp(apiUrl + "/bpotop_trade/balance_query", JSONObject.toJSONString(requestMap), null);
+            logger.info("查询余额响应参数:{}", resultJsonStr);
+
+            String decryptStr = RSA.decryptPri(resultJsonStr, privateKey);
+            Map stringToMap =  JSONObject.parseObject(decryptStr);
+            return new BigDecimal(String.valueOf(stringToMap.get("balance"))).divide(new BigDecimal("100"));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return BigDecimal.ZERO;
+    }
 }

+ 18 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/BannerService.java

@@ -0,0 +1,18 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.entity.SysNewsInformation;
+
+import java.util.List;
+
+
+public interface BannerService extends IService<SysNewsInformation> {
+
+    /**
+     * 查询官网轮播图
+     *
+     * @return
+     */
+    List<SysNewsInformation> selectBanner();
+
+}

+ 8 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseGroupService.java

@@ -73,6 +73,14 @@ public interface CourseGroupService extends IService<CourseGroup> {
     void unlockCourseToCache(Long teacherId);
 
     /**
+     * 获取老师锁定课时数据的缓存-设置过期时间
+     *
+     * @param teacherId 老师id
+     * @return 缓存
+     */
+    RMap<Long, List<CourseTimeEntity>> getExpireLiveLockTimeCache(Long teacherId);
+
+    /**
      * 获取老师锁定的直播课时数据的缓存
      *
      * @param teacherId 老师id

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

@@ -255,5 +255,7 @@ public interface CourseScheduleService extends IService<CourseSchedule> {
     void updateCourseStudent(Map<String, Object> param);
 
     PageInfo<CourseScheduleRecordVo> selectCourseList(Map<String, Object> param);
+
+    IPage<PianoClassVo> queryPianoClass(IPage<PianoClassVo> page, MyCourseSearch search);
 }
 

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

@@ -4,6 +4,7 @@ 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 java.util.List;
 import java.util.Map;
@@ -30,7 +31,16 @@ public interface LiveRoomService extends IService<LiveRoom> {
      *
      * @param roomUid 房间uid
      */
-    RoomVo studentCheckRoomInfo(String roomUid);
+    RoomInfoCache studentCheckRoomInfo(String roomUid);
+
+    /**
+     * 主讲人查询并校验房间信息
+     *
+     * @param roomUid 房间uid
+     * @param userId  主讲人id
+     * @return
+     */
+    RoomInfoCache speakerCheckRoomInfo(String roomUid);
 
     /**
      * 定时任务创建直播间
@@ -43,6 +53,13 @@ public interface LiveRoomService extends IService<LiveRoom> {
     void destroyExpiredLiveRoom();
 
     /**
+     * 手动关闭直播间
+     *
+     * @param roomUId 房间uid
+     */
+    void destroyLiveRoom(String roomUId);
+
+    /**
      * 定时任务-清理过期的房间-陪练课
      */
     void destroyExpiredPracticeRoom();
@@ -74,7 +91,7 @@ public interface LiveRoomService extends IService<LiveRoom> {
      * @param roomUid 房间uid
      * @param userId  主讲人id
      */
-    RoomInfoCache speakerJoinRoom(String roomUid, Long userId);
+    RoomInfoCache speakerJoinRoom(String roomUid);
 
     /**
      * 观看者-进入房间

+ 3 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SysUserContractRecordService.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.SysUserContractRecordDao;
 import com.yonge.cooleshow.biz.dal.dto.search.SysUserContractRecordSearch;
 import com.yonge.cooleshow.biz.dal.entity.SysUserContractRecord;
@@ -45,5 +46,7 @@ public interface SysUserContractRecordService extends IService<SysUserContractRe
      * @return
      */
     SysUserContractRecord queryLatestContract(Long userId, SysUserType userType, ContractTemplateTypeEnum contractType);
+
+    HttpResponseResult<Boolean> sign(ContractTemplateTypeEnum contractType, SysUserType userType, SysUser user);
 }
 

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

@@ -99,6 +99,12 @@ public interface UserWithdrawalService extends IService<UserWithdrawal> {
      */
     HttpResponseResult<Boolean> transferAccount(AuthOperaReq authOperaReq, SysUser user);
 
+    /**
+     * 统计金额
+     * @return
+     */
+    UserWithdrawalVo totalAmount();
+
 
     /***
      * 导入

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

@@ -9,6 +9,8 @@ import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroup;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.vo.*;
 
+import java.util.List;
+
 /**
  * VideoLessonGroupService服务类
  *
@@ -19,6 +21,8 @@ import com.yonge.cooleshow.biz.dal.vo.*;
 public interface VideoLessonGroupService extends IService<VideoLessonGroup> {
     IPage<VideoLessonGroupVo> selectPage(IPage<VideoLessonGroupVo> page, VideoLessonGroupSearch query);
 
+    List<VideoLessonGroupVo> selectPage(VideoLessonGroupSearch query);
+
     VideoLessonGroup selectGroup(Long groupId);
 
     void updateGroup(VideoLessonGroupUpVo lessonGroupUpVo);

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

@@ -0,0 +1,31 @@
+package com.yonge.cooleshow.biz.dal.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.biz.dal.dao.BannerDao;
+import com.yonge.cooleshow.biz.dal.entity.SysNewsInformation;
+import com.yonge.cooleshow.biz.dal.service.BannerService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+
+@Service
+public class BannerServiceImpl extends ServiceImpl<BannerDao, SysNewsInformation> implements BannerService {
+
+    private final static Logger log = LoggerFactory.getLogger(BannerServiceImpl.class);
+
+    @Autowired
+    private BannerDao bannerDao;
+
+    public BannerDao getDao() {
+        return bannerDao;
+    }
+
+    @Override
+    public List<SysNewsInformation> selectBanner() {
+        return baseMapper.selectBanner();
+    }
+}

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

@@ -326,8 +326,9 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         }
         //获取老师锁课缓存
         RMap<Long, List<CourseTimeEntity>> map = getExpireLiveLockTimeCache(dto.getTeacherId());
-        //陪练课无需锁定时间
-        if (!courseTypeFlag) {
+        //陪练课/琴房课无需锁定时间
+        boolean coursePianoFlag = CourseScheduleEnum.existCourseType(dto.getCourseType(), "课程类型不正确!").equals(CourseScheduleEnum.PIANO_ROOM_CLASS);
+        if (!courseTypeFlag && !coursePianoFlag) {
             //直播课添加课时数据
             map.fastPut(dto.getTeacherId(), timeList);
         }
@@ -492,6 +493,19 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
                     }
                 }
 
+                //获取老师锁课缓存
+                RMap<Long, List<CourseTimeEntity>> map = getExpireLiveLockTimeCache(teacherId);
+                if (map.isExists()) {
+                    List<CourseTimeEntity> courseTimeCache = map.get(teacherId);
+                    //校验缓存中的时间和当前自动生成的时间有没有重复
+                    checkTime = courseScheduleService.checkCourseTime(courseTimeCache, CourseTimeEntity::getStartTime, CourseTimeEntity::getEndTime, autoStartDate, autoEndDate);
+                    con.accept(checkTime);
+                    //如果和未来时间冲突则跳过
+                    if (flag.get()) {
+                        continue;
+                    }
+                }
+
                 //将自动生成时间收入集合
                 CourseTimeEntity autoTimeDto = new CourseTimeEntity();
                 autoTimeDto.setStartTime(autoStartDate);
@@ -520,7 +534,7 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
      * @param teacherId 老师id
      * @return 缓存
      */
-    private RMap<Long, List<CourseTimeEntity>> getExpireLiveLockTimeCache(Long teacherId) {
+    public RMap<Long, List<CourseTimeEntity>> getExpireLiveLockTimeCache(Long teacherId) {
         String lockMinuteStr = sysConfigService.findConfigValue(SysConfigConstant.CREATE_LIVE_TIME_LOCK_MINUTE);
         long lockMinute = StringUtils.isBlank(lockMinuteStr) ? 15L : Long.parseLong(lockMinuteStr);
         RMap<Long, List<CourseTimeEntity>> cache = getLiveLockTimeCache(teacherId);
@@ -764,21 +778,6 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         log.info("buyLiveCourseSuccess ok");
         //课程购买成功后进行消息推送
         buyLiveSendMessage(studentPayment, courseGroup);
-
-        //创建群聊
-        try {
-            ImGroup imGroup = imGroupService.getDao().selectOne(Wrappers.<ImGroup>lambdaQuery().eq(ImGroup::getCourseGroupId, courseGroup.getId()));
-            if (imGroup == null) {//群组不存在->创建群组
-                imGroupService.autoCreate(courseGroup.getId(), CourseScheduleEnum.LIVE.getCode());
-            } else {//存在->加入当前学员
-                String imGroupId = imGroup.getId();
-                Set<Long> userIds = new HashSet<>(Collections.singletonList(studentPayment.getUserId()));
-                imGroupMemberService.initGroupMembers(imGroupId, userIds, ImGroupMemberRoleType.STUDENT);
-            }
-        } catch (Exception e) {
-            log.error("直播课程组id:{},创建群聊失败:{}", courseGroup.getId(), e);
-            e.printStackTrace();
-        }
     }
 
     /**
@@ -1037,8 +1036,14 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
                 if (courseGroup.getPreStudentNum() >= courseGroup.getMixStudentNum()) {
                     //人数达标则修改课程组为进行中状态
                     courseGroup.setStatus(CourseGroupEnum.ING.getCode());
-                    //建立群组
+                    //创建群聊 并添加人员到群中
                     String imGroupId = imGroupService.autoCreate(courseGroup.getId(), courseGroup.getType());
+                    List<CourseScheduleStudentPayment> list = courseScheduleStudentPaymentService.list(Wrappers.<CourseScheduleStudentPayment>lambdaQuery()
+                            .eq(CourseScheduleStudentPayment::getCourseGroupId, courseGroup.getId()));
+                    Set<Long> userIds = list.stream().map(CourseScheduleStudentPayment::getUserId).collect(Collectors.toSet());
+                    imGroupMemberService.initGroupMembers(imGroupId, userIds, ImGroupMemberRoleType.STUDENT);
+                    //添加老师进群
+                    imGroupMemberService.initGroupMembers(imGroupId, Collections.singleton(courseGroup.getTeacherId()), ImGroupMemberRoleType.TEACHER);
                     courseGroup.setImGroupId(imGroupId);
                 } else {
                     //人数未达标则修改课程组为取消状态

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

@@ -176,6 +176,19 @@ public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, Co
             throw  new BizException("未找到作业信息");
         }
 
+        // 课程组的群聊
+        ImGroup imGroup = imGroupService.getByCourseGroupId(courseHomeworkDetailVo.getCourseGroupId());
+        if (imGroup != null) {
+            courseHomeworkDetailVo.setImGroupId(imGroup.getId());
+        }
+
+        // 购买人数
+        List<CourseScheduleStudentPayment> studentPaymentList = courseScheduleStudentPaymentService.getByCourseId(
+                courseHomeworkDetailVo.getCourseScheduleId());
+        if (!CollectionUtils.isEmpty(studentPaymentList)) {
+            courseHomeworkDetailVo.setStudentNum(studentPaymentList.size());
+        }
+
         // 学生信息
         CourseHomeworkDetailVo studentInfoDetailVo = baseMapper
                 .selectPaymentStudentInfo(courseHomeworkDetailVo.getCourseScheduleId(),studentId);

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

@@ -84,6 +84,7 @@ public class CourseRepliedServiceImpl extends ServiceImpl<CourseScheduleRepliedD
             isPayment(studentId, scheduleId);
             replied.setScore(null);
             replied.setStudentReplied(null);
+            replied.setTeacherRepliedTime(new Date());
             if (!repliedIsNull(replied)) {
                 repliedDao.updateReplied(replied);
                 return;
@@ -96,6 +97,7 @@ public class CourseRepliedServiceImpl extends ServiceImpl<CourseScheduleRepliedD
         isPayment(userId, scheduleId);
         replied.setStudentId(userId);
         replied.setTeacherReplied(null);
+        replied.setStudentRepliedTime(new Date());
         if (!repliedIsNull(replied)) {
             repliedDao.updateReplied(replied);
             return;

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

@@ -37,6 +37,7 @@ import com.yonge.toolset.utils.date.DateUtil;
 import com.yonge.toolset.utils.obj.ObjectUtil;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.redisson.api.RLock;
 import org.redisson.api.RMap;
 import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
@@ -945,6 +946,20 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         if (multiply.compareTo(scheduleDto.getCoursePrice()) != 0) {
             throw new BizException("价格异常。预计价格:{},实际价格:{}", multiply, scheduleDto.getCoursePrice());
         }
+
+        //获取老师锁课缓存
+        RMap<Long, List<CourseTimeEntity>> map = courseGroupService.getExpireLiveLockTimeCache(scheduleDto.getTeacherId());
+        if (map.isExists()) {
+            List<CourseTimeEntity> courseTimeCache = map.get(scheduleDto.getTeacherId());
+            //校验缓存中的时间和当前自动生成的时间有没有重复
+            dateList.forEach(item ->
+            {
+                if (checkCourseTime(courseTimeCache, CourseTimeEntity::getStartTime, CourseTimeEntity::getEndTime, item.getStartTime(), item.getEndTime())) {
+                    throw new BizException("与缓存中时间存在中途");
+                }
+            });
+        }
+
         //批量检查老师课时在数据库是否重复
         batchCheckTeacherCourseTime(scheduleDto.getTeacherId(), dateList, CourseScheduleDate::getStartTime, CourseScheduleDate::getEndTime);
         //批量检查学生课时在数据库是否重复
@@ -1020,9 +1035,18 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
     public HttpResponseResult<OrderCreateRes> buyPracticeCourse(OrderReq.OrderReqInfo orderReqInfo) {
         ObjectMapper objectMapper = new ObjectMapper();
         PracticeScheduleDto scheduleDto = objectMapper.convertValue(orderReqInfo.getBizContent(), PracticeScheduleDto.class);
-        return DistributedLock.of(redissonClient)
-                .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey("teacherId:" + scheduleDto.getTeacherId())
-                        , () -> this.buyPracticeCourseTran(orderReqInfo), 60L, TimeUnit.SECONDS);
+
+        RLock lock = redissonClient.getLock("teacherId:" + scheduleDto.getTeacherId());
+        try {
+            if (lock.tryLock(0, 60, TimeUnit.SECONDS)) {
+                return buyPracticeCourseTran(orderReqInfo);
+            }
+        } catch (InterruptedException e) {
+            throw new BizException("创建陪练课失败:{}", e.getMessage());
+        } finally {
+            lock.unlock();
+        }
+        return HttpResponseResult.failed();
     }
 
     /**
@@ -1241,7 +1265,28 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
      * @Date: 2022/4/26
      */
     public List<TeacherSubjectPrice> teacherSubjectPrice(Long teacherId) {
-        return teacherFreeTimeDao.selectPriceByTeacherId(teacherId);
+        TeacherFreeTime teacherFreeTime = teacherFreeTimeDao.selectOne(Wrappers.<TeacherFreeTime>lambdaQuery()
+                .eq(TeacherFreeTime::getTeacherId, teacherId)
+                .eq(TeacherFreeTime::getEnableFlag, 1)
+                .eq(TeacherFreeTime::getDefaultFlag, 1));
+
+        if (teacherFreeTime==null){
+            log.info("未查到陪练课配置,老师id:{}",teacherId);
+            return new ArrayList<>();
+        }
+
+        if ((teacherFreeTime.getMonday() == null || teacherFreeTime.getMonday().equals("[]")) &&
+                (teacherFreeTime.getThursday() == null || teacherFreeTime.getThursday().equals("[]")) &&
+                (teacherFreeTime.getWednesday() == null || teacherFreeTime.getWednesday().equals("[]")) &&
+                (teacherFreeTime.getThursday() == null || teacherFreeTime.getThursday().equals("[]")) &&
+                (teacherFreeTime.getFriday() == null || teacherFreeTime.getFriday().equals("[]")) &&
+                (teacherFreeTime.getSaturday() == null || teacherFreeTime.getSaturday().equals("[]")) &&
+                (teacherFreeTime.getSunday() == null || teacherFreeTime.getSunday().equals("[]"))) {
+            return new ArrayList<>();
+        }
+
+        List<TeacherSubjectPrice> list = teacherFreeTimeDao.selectPriceByTeacherId(teacherId);
+        return list;
     }
 
     @Override
@@ -1831,8 +1876,6 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
                 payment.setUserId(studentId);
                 payment.setCourseType(CourseScheduleEnum.PIANO_ROOM_CLASS.getCode());
                 courseScheduleStudentPaymentService.save(payment);
-
-                pianoSend(teacherId, studentId);
             }
         }
 
@@ -1849,6 +1892,13 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
             log.error("琴房课程组id:{},创建群聊失败:{}", courseGroup.getId(), e);
             e.printStackTrace();
         }
+
+        //清除统计缓存
+        for (Long studentId : studentIds) {
+            redissonClient.getBucket(CacheNameEnum.STUDENT_TOTAL.getRedisKey(studentId)).delete();
+            pianoSend(teacherId, studentId);
+        }
+        redissonClient.getBucket(CacheNameEnum.TEACHER_TOTAL.getRedisKey(teacherId)).delete();
     }
 
     /**
@@ -2090,31 +2140,20 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         if (pianoRoomTime == null) {
             throw new BizException("未查到剩余时长");
         }
-        Integer frozenTime = pianoRoomTime.getFrozenTime();
-        Integer remainTime = pianoRoomTime.getRemainTime();
+        Integer frozenTime = pianoRoomTime.getFrozenTime();//冻结时长
+        Integer remainTime = pianoRoomTime.getRemainTime();//剩余时长
 
         String formula = sysConfigService.findConfigValue(SysConfigConstant.PIANO_ROOM_TIME_FORMULA);
-
-        int i = studentIds.size() - paymentList.size();//新人数-原人数
-        if (i > 0) {//加人,扣时长
-            Integer n = (Integer) WrapperUtil.strToFormula(formula, "n", String.valueOf(i + 1));
-            int courseTime = singleCourseTime * n;
-            if (remainTime - courseTime < 0) {
-                throw new BizException("剩余时长不足");
-            }
-            pianoRoomTimeDao.update(null, Wrappers.<PianoRoomTime>lambdaUpdate()
-                    .eq(PianoRoomTime::getTeacherId, teacherId)
-                    .set(PianoRoomTime::getRemainTime, remainTime - courseTime)
-                    .set(PianoRoomTime::getFrozenTime, frozenTime + courseTime));
-        }
-        if (i < 0) {//减人,释放时长
-            Integer n = (Integer) WrapperUtil.strToFormula(formula, "n", String.valueOf(-i + 1));
-            int courseTime = singleCourseTime * n;
-            pianoRoomTimeDao.update(null, Wrappers.<PianoRoomTime>lambdaUpdate()
-                    .eq(PianoRoomTime::getTeacherId, teacherId)
-                    .set(PianoRoomTime::getRemainTime, remainTime + courseTime)
-                    .set(PianoRoomTime::getFrozenTime, frozenTime - courseTime));
+        Integer after = (Integer) WrapperUtil.strToFormula(formula, "n", String.valueOf(studentIds.size() + 1));//变更后
+        Integer before = (Integer) WrapperUtil.strToFormula(formula, "n", String.valueOf(paymentList.size() + 1));//变更前
+        int diffTime = singleCourseTime * (after - before);//人数变更后单课耗时
+        if (remainTime - diffTime < 0) {
+            throw new BizException("剩余时长不足");
         }
+        pianoRoomTimeDao.update(null, Wrappers.<PianoRoomTime>lambdaUpdate()
+                .eq(PianoRoomTime::getTeacherId, teacherId)
+                .set(PianoRoomTime::getRemainTime, remainTime - diffTime)
+                .set(PianoRoomTime::getFrozenTime, frozenTime + diffTime));
 
         //删除原学员
         paymentDao.delete(Wrappers.<CourseScheduleStudentPayment>lambdaQuery().eq(CourseScheduleStudentPayment::getCourseId, courseId));
@@ -2140,4 +2179,10 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         //重新新增学员
         paymentDao.insertBatch(payments);
     }
+
+    @Override
+    public IPage<PianoClassVo> queryPianoClass(IPage<PianoClassVo> page, MyCourseSearch search) {
+        monthToDate(search);
+        return page.setRecords(baseMapper.queryPianoClass(page, search));
+    }
 }

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

@@ -14,6 +14,7 @@ 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.utils.date.DateUtil;
 import org.apache.commons.collections.CollectionUtils;
@@ -62,6 +63,8 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
     @Autowired
     private UserAccountService userAccountService;
     @Autowired
+    private UserOrderService userOrderService;
+    @Autowired
     private CourseScheduleTeacherSalaryService courseScheduleTeacherSalaryService;
     @Autowired
     private CourseScheduleStudentPaymentService courseScheduleStudentPaymentService;
@@ -110,10 +113,34 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
      * @param roomUid 房间uid
      */
     @Override
-    public RoomVo studentCheckRoomInfo(String roomUid) {
-        //校验学生与房间的关系
-        checkStudentRoom(roomUid, getSysUser());
-        return queryRoomInfo(roomUid);
+    public RoomInfoCache studentCheckRoomInfo(String roomUid) {
+        return checkStudentRoom(roomUid, getSysUser());
+    }
+
+    /**
+     * 主讲人查询并校验房间信息
+     *
+     * @param roomUid 房间uid
+     * @return
+     */
+    @Override
+    public RoomInfoCache speakerCheckRoomInfo(String roomUid) {
+        Long userId = getSysUser().getId();
+        //校验房间是否存在
+        RBucket<RoomInfoCache> roomInfoCache = redissonClient.getBucket(LIVE_ROOM_INFO.replace(ROOM_UID, roomUid));
+        if (!roomInfoCache.isExists()) {
+            log.error("teacherCheckRoomInfo>>>live not start  roomUid: {} userId:{}", roomUid, userId);
+            throw new BizException("直播还未开始!");
+        }
+        RoomInfoCache roomInfo = roomInfoCache.get();
+        //校验进入房间的是否是该直播间的主讲人
+        if (!roomInfo.getSpeakerId().equals(userId)) {
+            log.error("teacherCheckRoomInfo>>>not speaker  roomUid: {} userId:{}", roomUid, userId);
+            throw new BizException("您不是该直播间的主讲人!");
+        }
+        roomInfo.setLikeNum(getLike(roomUid));
+        roomInfo.setLookNum(getNum.apply(this::getOnlineUserCache, roomUid));
+        return roomInfo;
     }
 
     /**
@@ -185,12 +212,12 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
         SysUser sysUser = getSysUser();
         String roomTitle = WrapperUtil.toStr(param, "roomTitle", "房间标题不能为空!");
         String liveRemark = WrapperUtil.toStr(param, "liveRemark", "直播间描述不能为空!");
-        Integer liveTime = WrapperUtil.toInt(param, "liveTime","请选择直播时长!");
+        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);
+        boolean check = courseScheduleService.checkTeacherCourseTime(teacherId, liveStartTime, liveEndTime);
         if (check) {
             //如果当前时间和课程时间有交集则不能开启临时直播
             throw new BizException("当前选择的时间段有课无法开启直播");
@@ -309,43 +336,67 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
             Date expiredDate = DateUtil.addMinutes(room.getLiveEndTime(), Integer.parseInt(expiredMinuteStr));
             //当前时间 大于(结束播时间 + 设置的过期分钟数)
             if (now.getTime() >= expiredDate.getTime()) {
-                //删除房间
-                destroyLiveRoom(room.getRoomUid());
-                //查询老师分润表
-                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 (Objects.isNull(payment)) {
-                        return;
-                    }
-                    //获取教师课酬写入到金额变更表
-                    UserAccountRecordDto userAccountRecord = new UserAccountRecordDto();
-                    userAccountRecord.setUserId(room.getSpeakerId());
-                    userAccountRecord.setInOrOut(InOrOutEnum.IN);
-                    userAccountRecord.setBizType(AccountBizTypeEnum.LIVE);
-                    userAccountRecord.setBizId(room.getCourseId());
-                    userAccountRecord.setBizName(room.getRoomTitle());
-                    userAccountRecord.setTransAmount(salary.getActualSalary());//扣除手续费后所得金额
-                    userAccountRecord.setOrderNo(payment.getOrderNo());
-                    userAccountService.accountChange(userAccountRecord);
-                    //修改教师课酬状态-已结算
-                    salary.setStatus(TeacherSalaryEnum.COMPLETE.getCode());
-                    courseScheduleTeacherSalaryService.updateById(salary);
-                });
+                destroyLiveRoom(room);
             }
         });
     }
 
     /**
+     * 关闭直播间
+     *
+     * @param roomUId 房间uid
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void destroyLiveRoom(String roomUId) {
+        LiveRoom liveRoom = this.getOne(Wrappers.<LiveRoom>lambdaQuery().eq(LiveRoom::getRoomUid, roomUId));
+        destroyLiveRoom(liveRoom);
+    }
+
+    /**
+     * 关闭直播间
+     *
+     * @param room 房间信息
+     */
+    private void destroyLiveRoom(LiveRoom room) {
+        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 (Objects.isNull(payment)) {
+                return;
+            }
+            //获取教师课酬写入到金额变更表
+            UserAccountRecordDto userAccountRecord = new UserAccountRecordDto();
+            userAccountRecord.setUserId(room.getSpeakerId());
+            userAccountRecord.setInOrOut(InOrOutEnum.IN);
+            userAccountRecord.setBizType(AccountBizTypeEnum.LIVE);
+            userAccountRecord.setBizId(room.getCourseId());
+            userAccountRecord.setBizName(room.getRoomTitle());
+            userAccountRecord.setTransAmount(salary.getActualSalary());//扣除手续费后所得金额
+            userAccountRecord.setOrderNo(payment.getOrderNo());
+            userAccountService.accountChange(userAccountRecord);
+            //修改教师课酬状态-已结算
+            salary.setStatus(TeacherSalaryEnum.COMPLETE.getCode());
+            courseScheduleTeacherSalaryService.updateById(salary);
+        });
+        //删除房间
+        ImDestroyLiveRoom(room.getRoomUid());
+    }
+
+    /**
      * 定时任务-清理过期的房间-陪练课
      */
     public void destroyExpiredPracticeRoom() {
@@ -370,7 +421,7 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
             //当前时间 大于(结束播时间 + 设置的过期分钟数)
             if (now.getTime() >= expiredDate.getTime()) {
                 //删除房间
-                destroyLiveRoom(room.getRoomUid());
+                ImDestroyLiveRoom(room.getRoomUid());
                 //查询老师分润表
                 CourseScheduleTeacherSalary salary = courseScheduleTeacherSalaryService.getOne(Wrappers.<CourseScheduleTeacherSalary>lambdaQuery()
                         .eq(CourseScheduleTeacherSalary::getCourseScheduleId, room.getCourseId())
@@ -405,7 +456,7 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
      *
      * @param roomId 房间Uid
      */
-    private void destroyLiveRoom(String roomId) {
+    private void ImDestroyLiveRoom(String roomId) {
         try {
             //删除服务器房间
             List<String> deleteRoomIds = Lists.newArrayList(roomId);
@@ -614,29 +665,16 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
      * 主讲人-进入房间
      *
      * @param roomUid 房间uid
-     * @param userId  主讲人id
      */
-    public RoomInfoCache speakerJoinRoom(String roomUid, Long userId) {
-        //校验房间是否存在
-        RBucket<RoomInfoCache> roomInfoCache = redissonClient.getBucket(LIVE_ROOM_INFO.replace(ROOM_UID, roomUid));
-        if (!roomInfoCache.isExists()) {
-            throw new BizException("直播还未开始!");
-        }
-        RoomInfoCache roomInfo = roomInfoCache.get();
+    public RoomInfoCache speakerJoinRoom(String roomUid) {
+        RoomInfoCache roomInfo = speakerCheckRoomInfo(roomUid);
         Date now = new Date();
-        //校验进入房间的是否是该直播间的主讲人
-        if (!roomInfo.getSpeakerId().equals(userId)) {
-            throw new BizException("您不是该直播间的主讲人!");
-        }
         roomInfo.setSpeakerState(0);
         roomInfo.setJoinRoomTime(now);
-        roomInfoCache.set(roomInfo);
         //查询老师是否有进入过,没有则写老师考勤表的进入时间
-        setTeacherAttendance(userId, roomInfo.getCourseGroupId(), roomInfo.getCourseId());
-        roomInfo.setLikeNum(getLike(roomUid));
-        roomInfo.setLookNum(getNum.apply(this::getOnlineUserCache, roomUid));
+        setTeacherAttendance(roomInfo.getSpeakerId(), roomInfo.getCourseGroupId(), roomInfo.getCourseId());
         //记录当前用户对应的房间uid
-        redissonClient.getBucket(LIVE_USER_ROOM.replace(USER_ID, userId.toString())).set(roomUid, 2L, TimeUnit.DAYS);
+        redissonClient.getBucket(LIVE_USER_ROOM.replace(USER_ID, roomInfo.getSpeakerId().toString())).set(roomUid, 2L, TimeUnit.DAYS);
         return roomInfo;
     }
 
@@ -650,8 +688,7 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
         //获取进入房间人员信息
         SysUser sysUser = getSysUser(userId);
         //校验信息
-        RBucket<RoomInfoCache> roomInfoCache = checkStudentRoom(roomUid, sysUser);
-        RoomInfoCache roomInfo = roomInfoCache.get();
+        RoomInfoCache roomInfo = checkStudentRoom(roomUid, sysUser);
         Date now = new Date();
         //房间累计用户信息-指只要进入到该房间的用户都要记录
         RMap<Long, String> roomTotalUser = getTotalUserCache(roomUid);
@@ -678,10 +715,6 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
         RMap<Long, String> onlineUserCache = getOnlineUserCache(roomUid);
         onlineUserCache.fastPut(userId, userJsonStr);
         log.info("joinRoom>>>> userInfo: {}", userJsonStr);
-        //刷新当前房间的点赞及观看人数信息
-        roomInfo.setLikeNum(getLike(roomUid));
-        roomInfo.setLookNum(getNum.apply(this::getOnlineUserCache, roomUid));
-        roomInfoCache.set(roomInfo);
         //向直播间发送当前在线人数消息
         this.sendOnlineUserCount(roomUid, userId, onlineUserCache.size());
         log.info("join sendOnlineUserCount>>>> param is null   roomUid: {}  fromUserId:{}  count:{}", roomUid, userId, onlineUserCache.size());
@@ -692,26 +725,41 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
     }
 
     //校验学生与房间的关系
-    private RBucket<RoomInfoCache> checkStudentRoom(String roomUid, SysUser sysUser) {
+    private RoomInfoCache checkStudentRoom(String roomUid, SysUser sysUser) {
         //校验房间是否存在
         RBucket<RoomInfoCache> roomInfoCache = redissonClient.getBucket(LIVE_ROOM_INFO.replace(ROOM_UID, roomUid));
         if (!roomInfoCache.isExists()) {
             throw new BizException("直播还未开始!");
         }
         RoomInfoCache roomInfo = roomInfoCache.get();
-        //校验观看者是否可以进入该房间,如果是非临时直播间,则校验是否已经买过课
+        //校验观看者是否买过课,如果是非临时直播间,则校验是否已经买过课
         if (!roomInfo.getRoomType().equals(RoomTypeEnum.TEMP.getCode())) {
             // 查询该学员成功购买课程
-            int count = courseScheduleStudentPaymentService.count(Wrappers.<CourseScheduleStudentPayment>lambdaQuery()
+            CourseScheduleStudentPayment studentPayment = courseScheduleStudentPaymentService.getOne(Wrappers.<CourseScheduleStudentPayment>lambdaQuery()
                     .eq(CourseScheduleStudentPayment::getUserId, sysUser.getId())
                     .eq(CourseScheduleStudentPayment::getCourseId, roomInfo.getCourseId())
                     .eq(CourseScheduleStudentPayment::getCourseGroupId, roomInfo.getCourseGroupId())
                     .eq(CourseScheduleStudentPayment::getCourseType, CourseScheduleEnum.LIVE.getCode()));
-            if (count < 0) {
-                throw new BizException("您还未购买课程!");
+            if (Objects.nonNull(studentPayment)) {
+                UserOrderVo detail = userOrderService.detail(studentPayment.getOrderNo(), studentPayment.getUserId());
+                if (Objects.isNull(detail)) {
+                    throw new BizException("您还未购买该课程.");
+                }
+                //不等于已支付的都是异常
+                if (detail.getStatus().equals(OrderStatusEnum.CLOSE) || detail.getStatus().equals(OrderStatusEnum.FAIL)) {
+                    throw new BizException("您还未购买该课程。");
+                }
+                if (detail.getStatus().equals(OrderStatusEnum.WAIT_PAY) || detail.getStatus().equals(OrderStatusEnum.PAYING)) {
+                    throw new BizException("该课程的订单" + detail.getStatus().getMsg() + ",请先支付完成后再上课。");
+                }
+            } else {
+                throw new BizException("您还未购买该课程!");
             }
         }
-        return roomInfoCache;
+        //刷新当前房间的点赞及观看人数信息
+        roomInfo.setLikeNum(getLike(roomUid));
+        roomInfo.setLookNum(getNum.apply(this::getOnlineUserCache, roomUid));
+        return roomInfo;
     }
 
     /**

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

@@ -112,7 +112,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
         musicSheet.setState(YesOrNoEnum.NO);
         this.saveOrUpdate(musicSheet);
 
-        if (AuthStatusEnum.DOING.getCode().equals(musicSheet.getAuditStatus().getCode())) {
+        if (musicSheet.getAuditStatus() == null || AuthStatusEnum.DOING.getCode().equals(musicSheet.getAuditStatus().getCode())) {
             musicSheetAuthRecordService.setAuditDoing(musicSheet.getId());
         }
 
@@ -403,7 +403,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
             musicSheet.setUpdateBy(userId);
             musicSheet.setState(YesOrNoEnum.NO);
             this.saveOrUpdate(musicSheet);
-            if (AuthStatusEnum.DOING.getCode().equals(musicSheet.getAuditStatus().getCode())) {
+            if (musicSheet.getAuditStatus() == null || AuthStatusEnum.DOING.getCode().equals(musicSheet.getAuditStatus().getCode())) {
                 musicSheetAuthRecordService.setAuditDoing(musicSheet.getId());
             }
 

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

@@ -48,6 +48,7 @@ public class StudentCourseHomeworkServiceImpl extends ServiceImpl<StudentCourseH
                                         .one();
         if (studentCourseHomework == null) {
             studentCourseHomework = new StudentCourseHomework();
+            studentCourseHomework.setSubmitTime(new Date());
         }
         studentCourseHomework.setCourseHomeworkId(courseHomeworkDetailVo.getId());
         studentCourseHomework.setCourseGroupType(courseHomeworkDetailVo.getCourseType().getCode());
@@ -55,7 +56,6 @@ public class StudentCourseHomeworkServiceImpl extends ServiceImpl<StudentCourseH
         studentCourseHomework.setCourseScheduleId(courseHomeworkDetailVo.getCourseScheduleId());
         studentCourseHomework.setStudentId(studentId);
         studentCourseHomework.setAttachments(submit);
-        studentCourseHomework.setSubmitTime(new Date());
         studentCourseHomework.setTeacherReplied("");
         return this.saveOrUpdate(studentCourseHomework);
     }

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

@@ -15,6 +15,7 @@ import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.cooleshow.biz.dal.service.StudentTotalService;
 import com.yonge.cooleshow.biz.dal.vo.*;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.UserLockFlag;
 import com.yonge.toolset.utils.date.DateUtil;
 import com.yonge.toolset.utils.string.ValueUtil;
 import org.apache.commons.beanutils.BeanUtils;
@@ -137,6 +138,9 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
         if (null == detail) {
             return HttpResponseResult.failed("未找老师信息");
         }
+        if (UserLockFlag.LOCKED.equals(detail.getLockFlag())) {
+            return HttpResponseResult.failed("老师被锁定");
+        }
         if (null == old || (null != isUpdate && isUpdate)) {
             //更新
             //删除用户绑定

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

@@ -2,6 +2,8 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 
 import java.math.BigDecimal;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.Date;
@@ -12,6 +14,8 @@ import java.util.Objects;
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import com.yonge.cooleshow.biz.dal.service.SysConfigService;
+import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -58,6 +62,9 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
     private SysUserFeignService sysUserFeignService;
 
 	@Autowired
+	private SysConfigService sysConfigService;
+
+	@Autowired
 	private MusicSheetDao musicSheetDao;
 
 	@Override
@@ -102,6 +109,19 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 		jsonObject.put("heardLevel", userLastEvaluationData.getHeardLevel());
 		jsonObject.put("videoFilePath", userLastEvaluationData.getVideoFilePath());
 		jsonObject.put("partIndex", userLastEvaluationData.getPartIndex());
+		if(userLastEvaluationData.getCreateTime() == null) {
+			jsonObject.put("expire", 1);
+		} else {
+			LocalDateTime localDateTime = userLastEvaluationData.getCreateTime()
+																.toInstant()
+																.atZone(ZoneId.systemDefault())
+																.toLocalDateTime();
+			if (localDateTime.plusDays(Long.parseLong(getExpireTime())).compareTo(LocalDateTime.now()) <0) {
+				jsonObject.put("expire", 1);
+			} else {
+				jsonObject.put("expire", 0);
+			}
+		}
 
 		MusicSheet sysMusicScore = musicSheetDao.selectById(userLastEvaluationData.getMusicSheetId());
 		if(Objects.nonNull(sysMusicScore)){
@@ -136,6 +156,7 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 		queryInfo.setFeatureType(FeatureType.CLOUD_STUDY_EVALUATION);
 		MapUtil.populateMap(params, queryInfo);
 
+		params.put("expireTime",getExpireTime());
 		List<SysMusicCompareRecord> dataList = null;
 		int count = this.findCount(params);
 		if (count > 0) {
@@ -192,4 +213,13 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 		return pageInfo;
 	}
 
+
+	private String getExpireTime() {
+
+		String homeworkExpireTime = sysConfigService.findConfigValue(SysConfigConstant.HOMEWORK_EXPIRE_TIME);
+		if (org.springframework.util.StringUtils.isEmpty(homeworkExpireTime)) {
+			return "9999";
+		}
+		return homeworkExpireTime;
+	}
 }

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

@@ -2,16 +2,24 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.SysUserContractRecordDao;
 import com.yonge.cooleshow.biz.dal.dto.search.SysUserContractRecordSearch;
+import com.yonge.cooleshow.biz.dal.entity.ContractTemplate;
 import com.yonge.cooleshow.biz.dal.entity.SysUserContractRecord;
+import com.yonge.cooleshow.biz.dal.enums.DealStatusEnum;
+import com.yonge.cooleshow.biz.dal.sdk.WithdrawSdk;
+import com.yonge.cooleshow.biz.dal.service.ContractService;
 import com.yonge.cooleshow.biz.dal.service.ContractTemplateService;
 import com.yonge.cooleshow.biz.dal.service.SysUserContractRecordService;
 import com.yonge.cooleshow.biz.dal.vo.SysUserContractRecordVo;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.ContractTemplateSourceEnum;
 import com.yonge.cooleshow.common.enums.ContractTemplateTypeEnum;
 import com.yonge.cooleshow.common.enums.SysUserType;
+import com.yonge.cooleshow.common.service.IdGeneratorService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Service;
 
 import org.slf4j.Logger;
@@ -30,6 +38,12 @@ public class SysUserContractRecordServiceImpl extends ServiceImpl<SysUserContrac
 
     @Autowired
     private ContractTemplateService contractTemplateService;
+    @Autowired
+    private WithdrawSdk withdrawSdk;
+    @Autowired
+    private IdGeneratorService idGeneratorService;
+    @Autowired
+    private ContractService contractService;
 
     @Override
     public SysUserContractRecordDao getDao() {
@@ -56,5 +70,44 @@ public class SysUserContractRecordServiceImpl extends ServiceImpl<SysUserContrac
         return getDao().queryLatestContract(userId, userType.getCode(), contractType.getSource().getCode(), contractType.getCode());
     }
 
+    @Override
+    public HttpResponseResult<Boolean> sign(ContractTemplateTypeEnum contractType, SysUserType userType, SysUser user) {
+        //是否签署标识,签署了才入库
+        boolean flag = false;
+        SysUserContractRecord contractRecord = queryLatestContract(user.getId(), userType, contractType);
+
+        //未签署协议
+        if (null == contractRecord) {
+            ContractTemplate contractTemplate = contractTemplateService.queryLatestContractTemplate(contractType);
+            if (null == contractTemplate) {
+                return HttpResponseResult.failed(HttpStatus.FORBIDDEN, "未找到协议");
+            }
+            contractRecord = new SysUserContractRecord();
+            Long contractNo = idGeneratorService.generatorId("contractNo");
+            contractRecord.setContractNo(contractNo.toString());
+            contractRecord.setUserId(user.getId());
+            contractRecord.setContractId(contractTemplate.getId());
+            contractRecord.setUserType(userType.getCode());
+
+            if (ContractTemplateSourceEnum.LINGXINPAY.getCode().equals(contractTemplate.getSource())
+                    && ContractTemplateTypeEnum.WITHDRAW.getCode().equals(contractTemplate.getType())) {
+                //签署结算协议
+                contractRecord.setStatus(DealStatusEnum.DOING.getCode());
+                flag = withdrawSdk.signContract(user.getRealName(), user.getIdCardNo(), user.getPhone(), contractNo.toString());
+            } else {
+                HttpResponseResult<String> stringHttpResponseResult = contractService.transferProduceContract(contractRecord.getUserId(), userType, contractType);
+                if (stringHttpResponseResult.getStatus()) {
+                    contractRecord.setUrl(stringHttpResponseResult.getData());
+                    contractRecord.setStatus(DealStatusEnum.SUCCESS.getCode());
+                    flag = true;
+                }
+            }
+            if (flag) {
+                save(contractRecord);
+            }
+        }
+        return HttpResponseResult.succeed(true);
+    }
+
 }
 

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

@@ -175,7 +175,8 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
 
     @Override
     public List<Subject> querySubject(Long userId) {
-        return baseMapper.querySubject(userId);
+        List<Subject> subjects = baseMapper.querySubject(userId);
+        return subjects;
     }
 
     private HttpResponseResult<Boolean> doCreate(TeacherSubmitReq teacherSubmitReq) throws BizException {
@@ -199,14 +200,18 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
         sysUser.setUsername("游客" + sysUser.getId());
         employeeDao.updateSysUser(sysUser);
         //插入老师表
+
         Teacher teacher = new Teacher();
         teacher.setUserId(sysUser.getId());
         teacher = getTeacherDetil(teacher, teacherSubmitReq);
         baseMapper.insert(teacher);
         //插入老师账户表
-        UserAccount userAccount = new UserAccount();
-        userAccount.setUserId(sysUser.getId());
-        userAccountService.save(userAccount);
+        UserAccount oldAcc = userAccountService.getById(sysUser.getId());
+        if(null == oldAcc){
+            UserAccount userAccount = new UserAccount();
+            userAccount.setUserId(sysUser.getId());
+            userAccountService.save(userAccount);
+        }
         return HttpResponseResult.succeed(true);
     }
 

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

@@ -18,6 +18,8 @@ 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 org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -33,7 +35,8 @@ import org.springframework.transaction.annotation.Transactional;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.List;
-import java.util.concurrent.TimeUnit;
+import java.util.Objects;
+import java.util.concurrent.*;
 
 
 @Service
@@ -66,18 +69,32 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
     public HttpResponseResult<UserAccountRecord> accountChange(UserAccountRecordDto accountRecordDto) {
         if (null == accountRecordDto.getUserId() || null == accountRecordDto.getTransAmount()
                 || null == accountRecordDto.getInOrOut() || null == accountRecordDto.getBizType()) {
-            throw new BizException("缺少参数");
+            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 {
-            return DistributedLock.of(redissonClient)
-                    .runIfLockCanGet(CacheNameEnum.LOCK_CHANGE_ACCOUNT.getRedisKey(accountRecordDto.getUserId())
-                            , () -> doAccountChange(accountRecordDto), 60L, TimeUnit.SECONDS);
+            if (lock.tryLock(10L, 60L, TimeUnit.SECONDS)) {
+                return doAccountChange(accountRecordDto);
+            } else {
+                return HttpResponseResult.failed("账户变更失败");
+            }
         } catch (BizException e) {
             return HttpResponseResult.failed(e.getMessage());
         } catch (Exception e) {
-            e.printStackTrace();
-            throw new BizException("账户变更失败");
+            log.error("callIfLockCanGet error lockKey {}", lockName);
+            return HttpResponseResult.failed("账户变更失败");
+        } finally {
+            executor.shutdown();
+            if (lock.getHoldCount() != 0) {
+                lock.unlock();
+            }
         }
     }
 

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

@@ -3,13 +3,19 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.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.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderPayRes;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.ContractTemplateTypeEnum;
+import com.yonge.cooleshow.common.enums.SysUserType;
 import com.yonge.cooleshow.common.service.IdGeneratorService;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.result.BaseResult;
@@ -30,9 +36,11 @@ 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;
 import java.math.RoundingMode;
 import java.util.*;
+import java.util.concurrent.CompletableFuture;
 
 
 @Service
@@ -47,6 +55,13 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
     private PaymentProperties paymentProperties;
     @Autowired
     private PaymentClient paymentClient;
+    /**
+     * 服务对象
+     */
+    @Resource
+    private SysUserContractRecordService sysUserContractRecordService;
+    @Autowired
+    private SysUserService userService;
 
     @Override
     public UserOrderPayment detailByOrderNo(String orderNo, PayChannelEnum payChannel, TradeStatusEnum status) {
@@ -263,8 +278,21 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
                 || detail.getStatus().equals(OrderStatusEnum.PAYING)) {
             userOrderService.orderSuccess(detail, data);
         }
+
+        //处理支付完成签署协议
+        SysUserType userType = SysUserType.STUDENT;
+        if (ClientEnum.TEACHER.getCode().equals(orderPayment.getPaymentClient())) {
+            userType = SysUserType.TEACHER;
+        }
+        Boolean aBoolean = sysUserContractRecordService.checkContractSign(detail.getUserId(), userType, ContractTemplateTypeEnum.BUY_ORDER);
+        if (!aBoolean) {
+            SysUser userById = userService.findUserById(detail.getUserId());
+            SysUserType finalUserType = userType;
+            CompletableFuture.runAsync(() -> sysUserContractRecordService.sign(ContractTemplateTypeEnum.BUY_ORDER, finalUserType, userById));
+        }
     }
 
+
     /***
      * 处理回调-支付失败
      * @author liweifan

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

@@ -178,7 +178,6 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
     public HttpResponseResult<Boolean> doAuth(AuthOperaReq authOperaReq, SysUser user) {
         Long[] ids = StringUtil.toLongArray(StringPool.COMMA, authOperaReq.getId());
         for (Long id : ids) {
@@ -196,7 +195,6 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
             orderRefund.setOperateId(user.getId());
             orderRefund.setOperateReason(authOperaReq.getReason());
             orderRefund.setUpdateTime(new Date());
-            updateById(orderRefund);
 
             if (authOperaReq.getPass()) {
                 //通过调用退款接口
@@ -220,7 +218,7 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
     }
 
 
-    @Transactional
+    @Transactional(rollbackFor = Exception.class)
     public HttpResponseResult<UserOrderRefundBill> orderRefund(String orderNo, String reason) {
         UserOrderVo detail = orderService.detail(orderNo, null);
 
@@ -289,12 +287,12 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
                 }
             }
         }
-
         return doOrderRefund(orderRefunds);
     }
 
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void refundPaymentCallBack(PaymentCallBack data) {
         if (TradeStatusEnum.succeeded.equals(data.getStatus())) {//退款成功
             paymentRefundSucceededHandle(data);
@@ -303,7 +301,8 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
         }
     }
 
-    private HttpResponseResult<UserOrderRefundBill> doOrderRefund(UserOrderRefund orderRefund) {
+    @Transactional(rollbackFor = Exception.class)
+    HttpResponseResult<UserOrderRefundBill> doOrderRefund(UserOrderRefund orderRefund) {
         UserOrderPayment payment = orderPaymentService.getOne(Wrappers.<UserOrderPayment>lambdaQuery()
                 .eq(UserOrderPayment::getOrderNo, orderRefund.getOrderNo())
                 .eq(UserOrderPayment::getStatus, TradeStatusEnum.succeeded)
@@ -313,20 +312,22 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
             throw new BizException("订单状态异常");
         }
 
-        //单号生成
-        Long billNo = idGeneratorService.generatorId("billNo");
-
         RefundBill refundBill = new RefundBill(payment.getOpenType(),
                 PaymentClientEnum.valueOf(payment.getPaymentClient()), payment.getPayChannel());
         refundBill.setTradeNo(payment.getTransNo());
         refundBill.setPaymentNo(payment.getPaymentNo());
+
+        //单号生成
+        Long billNo = idGeneratorService.generatorId("billNo");
         refundBill.setRefundNo(billNo.toString());
+
         refundBill.setOrderAmt(payment.getPayAmt());
         refundBill.setRefundAmt(orderRefund.getActualAmount());
         refundBill.setReason(orderRefund.getReason());
 
         BaseResult<RefundBill> refundBillBaseResult = paymentClient.refundPayment(refundBill);
         log.info("退款返回: {} ", JSONObject.toJSONString(refundBillBaseResult));
+
         //入退款单表
         UserOrderRefundBill orderRefundBill = new UserOrderRefundBill();
         orderRefundBill.setRefundId(orderRefund.getId());
@@ -340,6 +341,7 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
             orderRefundBill.setPayFailMsg(refundBillBaseResult.getMsg());
         }
         refundBillService.save(orderRefundBill);
+        updateById(orderRefund);
         return HttpResponseResult.succeed(orderRefundBill);
     }
 
@@ -366,26 +368,7 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
         one.setUpdateTime(new Date());
         refundBillService.updateById(one);
 
-        //处理业务
-        UserOrderRefund orderRefund = getById(one.getRefundId());
-        if (StringUtil.isEmpty(orderRefund.getOredrDetilIds())) {
-            List<Long> ids = new ArrayList<>();
-            for (String id : orderRefund.getOredrDetilIds().split(",")) {
-                ids.add(Long.parseLong(id));
-            }
-            OrderDetailSearch search = new OrderDetailSearch();
-            search.setIds(ids);
-            search.setOrderNo(orderRefund.getOrderNo());
-            List<UserOrderDetailVo> userOrderDetails = orderDetailService.selectList(search);
-
-            for (UserOrderDetailVo vo : userOrderDetails) {
-                Consumer<UserOrderDetailVo> refundAfterConsumer = refundSuccess.get(vo.getGoodType());
-                if (!Objects.isNull(refundAfterConsumer)) {
-                    refundAfterConsumer.accept(vo);
-                }
-            }
-
-        }
+        orderRefundSuccessBizHandle(one.getRefundId());
     }
 
     /***
@@ -413,8 +396,17 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
         one.setUpdateTime(new Date());
         refundBillService.updateById(one);
 
+        orderRefundFailBizHandle(one.getRefundId());
+    }
+
+    /**
+     * 处理退款成功业务
+     *
+     * @param refundId 退款单id
+     */
+    private void orderRefundSuccessBizHandle(Long refundId) {
         //处理业务
-        UserOrderRefund orderRefund = getById(one.getRefundId());
+        UserOrderRefund orderRefund = getById(refundId);
         if (StringUtil.isEmpty(orderRefund.getOredrDetilIds())) {
             List<Long> ids = new ArrayList<>();
             for (String id : orderRefund.getOredrDetilIds().split(",")) {
@@ -426,12 +418,39 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
             List<UserOrderDetailVo> userOrderDetails = orderDetailService.selectList(search);
 
             for (UserOrderDetailVo vo : userOrderDetails) {
-                Consumer<UserOrderDetailVo> refundAfterConsumer = refundFailed.get(vo.getGoodType());
+                Consumer<UserOrderDetailVo> refundAfterConsumer = refundSuccess.get(vo.getGoodType());
                 if (!Objects.isNull(refundAfterConsumer)) {
                     refundAfterConsumer.accept(vo);
                 }
             }
+        }
+    }
 
+    /**
+     * 处理退款失败业务
+     *
+     * @param refundId 退款单id
+     */
+    private void orderRefundFailBizHandle(Long refundId) {
+        //处理业务
+        UserOrderRefund orderRefund = getById(refundId);
+
+        if (StringUtil.isEmpty(orderRefund.getOredrDetilIds())) {
+            List<Long> ids = new ArrayList<>();
+            for (String id : orderRefund.getOredrDetilIds().split(",")) {
+                ids.add(Long.parseLong(id));
+            }
+            OrderDetailSearch search = new OrderDetailSearch();
+            search.setIds(ids);
+            search.setOrderNo(orderRefund.getOrderNo());
+            List<UserOrderDetailVo> userOrderDetails = orderDetailService.selectList(search);
+
+            for (UserOrderDetailVo vo : userOrderDetails) {
+                Consumer<UserOrderDetailVo> refundAfterConsumer = refundFailed.get(vo.getGoodType());
+                if (!Objects.isNull(refundAfterConsumer)) {
+                    refundAfterConsumer.accept(vo);
+                }
+            }
         }
     }
 }

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

@@ -668,13 +668,13 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             //清除商家统计缓存
             Long merchId = orderDetailVo.getMerchId();
             if (merchId != null && merchId != 0) {
-                redissonClient.getBucket(CacheNameEnum.TEACHER_SUBJECT_ITEM.getRedisKey(merchId)).delete();
+                //redissonClient.getBucket(CacheNameEnum.TEACHER_SUBJECT_ITEM.getRedisKey(merchId)).delete();
                 redissonClient.getBucket(CacheNameEnum.TEACHER_TOTAL.getRedisKey(merchId)).delete();
             }
         }
         //清除买家统计缓存
         if (ClientEnum.STUDENT.getCode().equals(detail.getPaymentClient())) {
-            redissonClient.getBucket(CacheNameEnum.STUDENT_SUBJECT_ITEM.getRedisKey(detail.getUserId())).delete();
+            //redissonClient.getBucket(CacheNameEnum.STUDENT_SUBJECT_ITEM.getRedisKey(detail.getUserId())).delete();
             redissonClient.getBucket(CacheNameEnum.STUDENT_TOTAL.getRedisKey(detail.getUserId())).delete();
         } else if (ClientEnum.TEACHER.getCode().equals(detail.getPaymentClient())) {
             redissonClient.getBucket(CacheNameEnum.TEACHER_TOTAL.getRedisKey(detail.getUserId())).delete();

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

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.SysUserContractRecordDao;
@@ -83,11 +84,11 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
     public IPage<UserWithdrawalVo> selectPage(IPage<UserWithdrawalVo> page, TeacherWithdrawalSearch query) {
         List<UserWithdrawalVo> withdrawalVoList = baseMapper.selectPage(page, query);
         withdrawalVoList.forEach(o -> {
-            if(AuthStatusEnum.DOING.equals(o.getAuthStatus()) || TradeStatusEnum.pending.equals(o.getTradeStatus())){
+            if (AuthStatusEnum.DOING.equals(o.getAuthStatus()) || TradeStatusEnum.pending.equals(o.getTradeStatus())) {
                 o.setWithdrawStatus("DOING");
-            }else if(TradeStatusEnum.succeeded.equals(o.getTradeStatus())){
+            } else if (TradeStatusEnum.succeeded.equals(o.getTradeStatus())) {
                 o.setWithdrawStatus("SUCCESS");
-            }else{
+            } else {
                 o.setWithdrawStatus("FAILED");
             }
             o.setBankCard(ValueUtil.fuzzyBankCard(o.getBankCard()));
@@ -97,7 +98,7 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
 
     @Override
     public List<UserWithdrawalVo> selectList(TeacherWithdrawalSearch query) {
-        return baseMapper.selectList(query);
+        return baseMapper.selectAllList(query);
     }
 
     @Override
@@ -195,7 +196,25 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
     @Override
     @Transactional(rollbackFor = Exception.class)
     public HttpResponseResult<Boolean> batchAuth(AuthOperaReq authOperaReq, SysUser sysUser) {
-        Long[] ids = StringUtil.toLongArray(StringPool.COMMA, authOperaReq.getId());
+        List<Long> ids = Arrays.asList(StringUtil.toLongArray(StringPool.COMMA, authOperaReq.getId()));
+
+        //先判断三方余额是否充足
+        List<UserWithdrawal> userWithdrawals = baseMapper.selectList(Wrappers.<UserWithdrawal>lambdaQuery()
+                .in(UserWithdrawal::getId, ids)
+                .ne(UserWithdrawal::getAuthStatus, AuthStatusEnum.DOING));
+        //总提现金额
+        BigDecimal totalAmount = BigDecimal.ZERO;
+        for (UserWithdrawal withdrawal : userWithdrawals) {
+            if (null != withdrawal.getActualAmount()
+                    && BigDecimal.ZERO.compareTo(withdrawal.getActualAmount()) <= 0) {
+                totalAmount = totalAmount.add(withdrawal.getActualAmount());
+            }
+        }
+        BigDecimal useDecimal = withdrawSdk.balanceQuery();
+        if (useDecimal.compareTo(totalAmount) < 0) {
+            return HttpResponseResult.failed("账户余额不足");
+        }
+
         for (Long id : ids) {
             AuthOperaReq param = new AuthOperaReq();
             param.setId(id.toString());
@@ -228,10 +247,8 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
         build.setUpdateTime(new Date());
         build.setAuthTime(new Date());
 
-        //请求三方
         SysUser withdrawalUser = sysUserService.findUserById(build.getUserId());
         if (authOperaReq.getPass()) {
-            //请求三方接口
             //交易流水号生成
             Long transNo = idGeneratorService.generatorId("withdrawNo");
 
@@ -243,14 +260,11 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
                 build.setTradeStatus(TradeStatusEnum.pending);
                 build.setTransNo(transNo.toString());
             } else {
+                build.setAuthStatus(AuthStatusEnum.DOING);
                 build.setTradeStatus(TradeStatusEnum.failed);
-                build.setErrorMsg("请求三方接口返回失败");
+                build.setErrorMsg("请求三方接口同步返回失败");
             }
-        }
-        updateById(build);
-
-        //修改系统中账户
-        if (!authOperaReq.getPass()) {
+        } else {
             //审核不通过,账户解冻
             UserAccountRecordDto accountRecordDto = new UserAccountRecordDto(
                     build.getUserId(), build.getAmount(), InOrOutEnum.OUT, AccountBizTypeEnum.WITHDRAWAL,
@@ -260,10 +274,10 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
             accountRecordDto.setSaveRecord(false);
             userAccountService.accountChange(accountRecordDto);
 
-            //发生结算成功通知
+            //发生审核未通过通知
             unpassSend(build.getUserId(), build.getPhone(), authOperaReq.getReason());
         }
-
+        updateById(build);
     }
 
     @Override
@@ -298,6 +312,11 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
         }
     }
 
+    @Override
+    public UserWithdrawalVo totalAmount() {
+        return baseMapper.totalAmount();
+    }
+
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -350,7 +369,7 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
             userAccountService.accountChange(accountRecordDto);
 
             //发生结算失败通知
-            unpassSend(detail.getUserId(), detail.getPhone(), "结算失败,请重新提交。");
+            unpassSend(detail.getUserId(), detail.getPhone(), callback.getErrorMsg());
         } else {
             return;
         }

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

@@ -27,6 +27,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -73,6 +74,12 @@ public class VideoLessonGroupServiceImpl extends ServiceImpl<VideoLessonGroupDao
         return page.setRecords(baseMapper.selectPage(page, query));
     }
 
+    public List<VideoLessonGroupVo> selectPage(VideoLessonGroupSearch query) {
+        List<VideoLessonGroupVo> list = baseMapper.selectPage(null, query);
+        List<VideoLessonGroupVo> collect = list.stream().sorted(Comparator.comparing(VideoLessonGroupVo::getCountStudent, Comparator.reverseOrder())).limit(2).collect(Collectors.toList());
+        return collect;
+    }
+
     /**
      * @Description: 根据组id查详情
      * @Author: cy
@@ -121,15 +128,15 @@ public class VideoLessonGroupServiceImpl extends ServiceImpl<VideoLessonGroupDao
         //推送
         VideoLessonGroup lessonGroup = baseMapper.selectById(examineVo.getId());
         String status = examineVo.getAuditStatus();
-        Map<Long,String> receivers = new HashMap<>();
+        Map<Long, String> receivers = new HashMap<>();
         SysUser teacher = sysUserFeignService.queryUserById(lessonGroup.getTeacherId());
         receivers.put(lessonGroup.getTeacherId(), teacher.getPhone());
         if (status.equals("PASS")) {
             try {
                 sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.VIDEO_SHEET_AUTH_PASS,
-                        receivers, null, 0, null, ClientEnum.TEACHER.getCode(),lessonGroup.getLessonName());
-            }catch (Exception e){
-                log.warn("视频课审核失败,{}",e.getMessage());
+                        receivers, null, 0, null, ClientEnum.TEACHER.getCode(), lessonGroup.getLessonName());
+            } catch (Exception e) {
+                log.warn("视频课审核失败,{}", e.getMessage());
             }
         } else {
             try {
@@ -138,9 +145,9 @@ public class VideoLessonGroupServiceImpl extends ServiceImpl<VideoLessonGroupDao
                     remark = examineVo.getRemarks();
                 }
                 sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.VIDEO_SHEET_AUTH_UNPASS,
-                        receivers, null, 0, null, ClientEnum.TEACHER.getCode(),lessonGroup.getLessonName(),remark);
-            }catch (Exception e){
-                log.warn("视频课审核失败,{}",e.getMessage());
+                        receivers, null, 0, null, ClientEnum.TEACHER.getCode(), lessonGroup.getLessonName(), remark);
+            } catch (Exception e) {
+                log.warn("视频课审核失败,{}", e.getMessage());
             }
         }
 

+ 11 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/support/WrapperUtil.java

@@ -4,7 +4,6 @@ import com.alibaba.fastjson.JSONObject;
 import com.yonge.toolset.base.exception.BizException;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.poi.ss.formula.functions.T;
 
 import javax.script.ScriptEngine;
 import javax.script.ScriptEngineManager;
@@ -42,6 +41,13 @@ public class WrapperUtil {
                 .orElse(0);
     }
 
+    public static <S, O> Long toLong(Map<S, O> map, S str) {
+        return Optional.ofNullable(map.get(str))
+                .map(String::valueOf)
+                .map(Long::parseLong)
+                .orElse(null);
+    }
+
     public static <S, O> Long toLong(Map<S, O> map, S str, String exMsg) {
         return Optional.ofNullable(map.get(str))
                 .map(String::valueOf)
@@ -274,12 +280,13 @@ public class WrapperUtil {
 
     /**
      * 字符串转公式
-     * @param formula 公式字符串
+     *
+     * @param formula  公式字符串
      * @param variable 变量
-     * @param param 参数
+     * @param param    参数
      * @return
      */
-    public static Object strToFormula(String formula, String variable, String param){
+    public static Object strToFormula(String formula, String variable, String param) {
         ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript");
         try {
             return jse.eval(formula.replace(variable, param));

+ 47 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseHomeworkDetailVo.java

@@ -27,6 +27,20 @@ public class CourseHomeworkDetailVo {
     @ApiModelProperty("课程组id")
     private Long courseGroupId;
 
+    @ApiModelProperty("课程组名")
+    private String courseGroupName;
+
+    @ApiModelProperty("课堂编号-第几堂课")
+    private Integer classNum;
+
+
+    @ApiModelProperty("群聊id")
+    private String imGroupId;
+
+
+    @ApiModelProperty("学员人数")
+    private Integer studentNum;
+
     @ApiModelProperty("学生课程作业id")
     private Long studentHomeworkId;
 
@@ -107,6 +121,39 @@ public class CourseHomeworkDetailVo {
     @ApiModelProperty("作业过期 1:已过期 0:未过期")
     private Integer homeworkExpire;
 
+
+    public String getCourseGroupName() {
+        return courseGroupName;
+    }
+
+    public void setCourseGroupName(String courseGroupName) {
+        this.courseGroupName = courseGroupName;
+    }
+
+    public Integer getClassNum() {
+        return classNum;
+    }
+
+    public void setClassNum(Integer classNum) {
+        this.classNum = classNum;
+    }
+
+    public String getImGroupId() {
+        return imGroupId;
+    }
+
+    public void setImGroupId(String imGroupId) {
+        this.imGroupId = imGroupId;
+    }
+
+    public Integer getStudentNum() {
+        return studentNum;
+    }
+
+    public void setStudentNum(Integer studentNum) {
+        this.studentNum = studentNum;
+    }
+
     public Integer getHomeworkExpire() {
         return homeworkExpire;
     }

+ 22 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/LiveCourseInfoVo.java

@@ -37,6 +37,12 @@ public class LiveCourseInfoVo extends CourseGroupVo implements Serializable {
         @ApiModelProperty(value = "教学计划/最多200字")
         private String plan;
 
+        @ApiModelProperty(value = "房间uid")
+        private String roomUid;
+
+        @ApiModelProperty(value = "直播状态 0未开始 1已开始 2已结束")
+        private Integer liveState;
+
         public Long getId() {
             return planId;
         }
@@ -76,6 +82,22 @@ public class LiveCourseInfoVo extends CourseGroupVo implements Serializable {
         public void setPlan(String plan) {
             this.plan = plan;
         }
+
+        public String getRoomUid() {
+            return roomUid;
+        }
+
+        public void setRoomUid(String roomUid) {
+            this.roomUid = roomUid;
+        }
+
+        public Integer getLiveState() {
+            return liveState;
+        }
+
+        public void setLiveState(Integer liveState) {
+            this.liveState = liveState;
+        }
     }
 
     @ApiModel(value = "CourseBuyStudentVo", description = "学员列表")

+ 174 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/PianoClassVo.java

@@ -0,0 +1,174 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.yonge.cooleshow.common.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * @Author: cy
+ * @Date: 2022/6/27
+ */
+@ApiModel
+public class PianoClassVo extends BaseEntity {
+    @ApiModelProperty("课程id")
+    private Long courseId;
+
+    @ApiModelProperty("课程组id")
+    private Long courseGroupId;
+
+    @ApiModelProperty("课程组名称")
+    private String courseGroupName;
+
+    @ApiModelProperty("声部id")
+    private Long subjectId;
+
+    @ApiModelProperty("声部名称")
+    private String subjectName;
+
+    @ApiModelProperty("老师id")
+    private Long teacherId;
+
+    @ApiModelProperty("老师姓名")
+    private String teacherName;
+
+    @ApiModelProperty("老师真实姓名")
+    private String teacherRealName;
+
+    @ApiModelProperty("老师头像")
+    private String avatar;
+
+    @ApiModelProperty("课程状态 NOT_START未开始 ING进行中 COMPLETE已完成")
+    private String status;
+
+    @ApiModelProperty("群聊id")
+    private String imGroupId;
+
+    @ApiModelProperty("开始时间")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date startTime;
+
+    @ApiModelProperty("结束时间")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date endTime;
+
+    @ApiModelProperty("学生考勤 0:异常 1:正常")
+    private Integer studentSign;
+
+    public String getImGroupId() {
+        return imGroupId;
+    }
+
+    public void setImGroupId(String imGroupId) {
+        this.imGroupId = imGroupId;
+    }
+
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
+    public Long getCourseGroupId() {
+        return courseGroupId;
+    }
+
+    public void setCourseGroupId(Long courseGroupId) {
+        this.courseGroupId = courseGroupId;
+    }
+
+    public String getCourseGroupName() {
+        return courseGroupName;
+    }
+
+    public void setCourseGroupName(String courseGroupName) {
+        this.courseGroupName = courseGroupName;
+    }
+
+    public Long getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Long subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public Long getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Long teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public String getTeacherRealName() {
+        return teacherRealName;
+    }
+
+    public void setTeacherRealName(String teacherRealName) {
+        this.teacherRealName = teacherRealName;
+    }
+
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Integer getStudentSign() {
+        return studentSign;
+    }
+
+    public void setStudentSign(Integer studentSign) {
+        this.studentSign = studentSign;
+    }
+}

+ 4 - 4
cooleshow-user/user-biz/src/main/resources/config/contracts/latest_contract_template.ftl

@@ -96,17 +96,17 @@
                         <span>身份证号:${userInfo.idCardNo!}</span>
                     </div>
                 </#if>
-                <#if userInfo.subjectName?default("")?trim?length gt 1>
+                <#--<#if userInfo.subjectName?default("")?trim?length gt 1>
                 <div class="iInfo">
                     <span>所在声部:${userInfo.subjectName!}</span>
                 </div>
-                </#if>
+                </#if>-->
             </div>
         </div>
         <div>(本协议中“乙方“指学员及家长;”乙方学员“指购买甲方产品或服务的学员;”乙方家长“仅指乙方学员的法定监护人。)</div>
 
-        <p class="underline bold">重要须知:在注册或购买使用甲方提供的产品、服务之前,请您务必审慎阅读、充分理解本使用协议各条款内容, 特别是免除或者限制甲方责任的条款、对您权利进行限制的条款、约定争议解决方式和司法管辖的条款等。 限制、免责条款或者其他涉及您重大权益的条款可能以加粗、加下划线等形式提示您重点注意。您注册或购买使用甲方提供的产品和服务,均视为您同意本使用协议,以及同意接受本使用协议的约束。</p>
-        <p class="underline bold">如无特别说明 ,下列术语在本协议中的定义为:管乐迷平台(下称“本平台”),即管乐迷APP;(下称“本平台”)指由甲方提供的器乐教学全流程辅助系统,包括媒体资料,教师点评,课前、课中、课后管理等服务;乐器练习云教练 (下称“本系统”),指由甲方提供和维护的器乐辅助练习系统;具体以该系统实际提供为准。该系统将根据实际需要进行调整和增减,乙方使用平台时需遵守本服务协议。</p>
+        <#--<p class="underline bold">重要须知:在注册或购买使用甲方提供的产品、服务之前,请您务必审慎阅读、充分理解本使用协议各条款内容, 特别是免除或者限制甲方责任的条款、对您权利进行限制的条款、约定争议解决方式和司法管辖的条款等。 限制、免责条款或者其他涉及您重大权益的条款可能以加粗、加下划线等形式提示您重点注意。您注册或购买使用甲方提供的产品和服务,均视为您同意本使用协议,以及同意接受本使用协议的约束。</p>
+        <p class="underline bold">如无特别说明 ,下列术语在本协议中的定义为:管乐迷平台(下称“本平台”),即管乐迷APP;(下称“本平台”)指由甲方提供的器乐教学全流程辅助系统,包括媒体资料,教师点评,课前、课中、课后管理等服务;乐器练习云教练 (下称“本系统”),指由甲方提供和维护的器乐辅助练习系统;具体以该系统实际提供为准。该系统将根据实际需要进行调整和增减,乙方使用平台时需遵守本服务协议。</p>-->
 
 		${contractMainContent!}
         

+ 21 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/BannerMapper.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
+    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yonge.cooleshow.biz.dal.dao.BannerDao">
+
+<select id="selectBanner" resultType="com.yonge.cooleshow.biz.dal.entity.SysNewsInformation">
+
+	SELECT sni.*
+	, su.username_ as updateName
+	, snt.name_ as subTypeName
+	FROM sys_news_information sni
+	left join sys_news_type snt on snt.id_ = sni.sub_type_
+	left join sys_user su on sni.update_by_ = su.id_
+		where
+		sni.del_flag_=0 and sni.type_ = 4  and if(sni.online_time_ is not null,sni.online_time_ &lt;= now(),1=1)
+	  and if(sni.offline_time_ is not null,sni.offline_time_ &gt;= now(),1=1)
+	  and sni.status_ = 1 and sni.client_type_ = 'WEBSITE'
+	order by sni.status_ desc,sni.order_,sni.update_time_ desc
+
+	</select>
+</mapper>

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

@@ -222,7 +222,7 @@
         cssp.id_ as paymentId,
         su.id_ as studentId,
         su.username_ as studentName,
-        cssp.actual_price_ as price,
+        sum(cssp.actual_price_) as price,
         cssp.order_no_ as orderNo,
         su.phone_ as phone,
         cssp.created_time_ as payTime
@@ -250,6 +250,7 @@
                 and #{param.endTime} &gt;= cssp.created_time_
             </if>
         </where>
+        group by cssp.actual_price_
         order by  cssp.id_ desc
     </select>
 
@@ -746,7 +747,7 @@
         </if>
     </select>
     <select id="studentSign" resultType="com.yonge.cooleshow.biz.dal.vo.StudentSignVo">
-        SELECT
+        SELECT DISTINCT
         p.course_id_ AS courseId,
         p.user_id_ AS userId,
         u.username_ AS userName,
@@ -952,5 +953,6 @@
                 AND endTime &lt;= #{param.endTime}
             </if>
         </where>
+        GROUP BY courseId
     </select>
 </mapper>

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

@@ -188,6 +188,9 @@
         ,ch.create_time_ as decorateTime
         ,sch.attachments_ as studentAttachments
         ,sch.teacher_replied_ as teacherReplied
+        ,cg.id_ as courseGroupId
+        ,cg.name_ as courseGroupName
+        ,cs.class_num_ as classNum
         ,sch.submit_time_ as submitTime
         ,sch.id_ as studentHomeworkId
         ,sch.student_id_ as studentId
@@ -201,11 +204,12 @@
         ,if(ch.id_ is null,0,1) as decorateHomework
         ,if(sch.attachments_ is null or sch.attachments_ = '',0,1) as submitHomework
         ,if(sch.teacher_replied_ is null or sch.teacher_replied_ = '',0,1) as reviewHomework
-        ,if(sch.id_ is not null and date_add(sch.create_time_,INTERVAL #{homeworkExpireTime} DAY) &lt; now(),1,0) as homeworkExpire
+        ,if(sch.id_ is not null and date_add(sch.submit_time_,INTERVAL #{homeworkExpireTime} DAY) &lt; now(),1,0) as homeworkExpire
         from course_schedule cs
+        left join course_group cg on cs.course_group_id_ = cg.id_
         left join course_homework ch on ch.course_schedule_id_ = cs.id_
-        left join student_course_homework sch on ch.id_ = sch.course_homework_id_
         left join course_schedule_student_payment cssp on cs.id_ = cssp.course_id_
+        left join student_course_homework sch  on sch.course_schedule_id_ = cssp.course_id_ and sch.student_id_ = cssp.user_id_
         <where>
             <if test="courseId != null">
                 and cs.id_ = #{courseId}
@@ -337,7 +341,7 @@
         select
         s.id_ as studentId,
         s.username_ as studentName,
-        s.phone_ as studentAvatar,
+        s.avatar_ as studentAvatar,
         if(sch.id_ is not null,1,0) as submitHomework,
         (case when sch.id_ is null then 'NOTCOMMIT'
         when sch.teacher_replied_ is not null or sch.teacher_replied_ != '' then 'NOTREVIEW'

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

@@ -30,10 +30,13 @@
                a.class_num_,
                b.id_ as courseId,
                b.start_time_,
-               b.end_time_
+               b.end_time_,
+               c.room_uid_ as roomUid,
+               IFNULL(c.live_state_,0) as liveState
         from course_plan as a
                  left join course_schedule as b on a.course_group_id_ = b.course_group_id_
                  AND a.class_num_ = b.class_num_
+                 left join live_room as c on b.id_ = c.course_id_
         where a.course_group_id_ = #{groupId}
         order by b.start_time_
     </select>

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

@@ -457,13 +457,16 @@
             u.avatar_ AS cover,
             g.subject_id_ AS subjectId,
             b.name_ AS subjectName,
+            ig.id_ AS imGroupId,
             (r.student_replied_ IS NOT NULL) AS studentReplied,
-            (r.teacher_replied_ IS NOT NULL) AS teacherReplied
+            (r.teacher_replied_ IS NOT NULL) AS teacherReplied,
+            1 AS payCount
         FROM course_schedule s
         LEFT JOIN sys_user u ON s.teacher_id_ = u.id_
         LEFT JOIN course_group g ON s.course_group_id_ = g.id_
         LEFT JOIN `subject` b ON g.subject_id_ = b.id_
         LEFT JOIN course_schedule_replied r ON s.id_ = r.course_schedule_id_
+        LEFT JOIN im_group ig ON ig.course_group_id_ = g.id_
         WHERE s.lock_=0
         AND s.status_ IN ('ING','NOT_START','COMPLETE')
         AND s.id_ IN
@@ -484,12 +487,16 @@
             g.background_pic_ AS cover,
             g.subject_id_ AS subjectId,
             sb.name_ AS subjectName,
+            ig.id_ AS imGroupId,
             (r.student_replied_ IS NOT NULL) AS studentReplied,
-            (r.teacher_replied_ IS NOT NULL) AS teacherReplied
+            (r.teacher_replied_ IS NOT NULL) AS teacherReplied,
+            IFNULL(a.payCount,0) AS payCount
         FROM course_schedule s
         LEFT JOIN course_group g ON s.course_group_id_ = g.id_
         LEFT JOIN `subject` sb ON g.subject_id_=sb.id_
         LEFT JOIN course_schedule_replied r ON s.id_ = r.course_schedule_id_
+        LEFT JOIN im_group ig ON ig.course_group_id_ = g.id_
+        LEFT JOIN (SELECT course_id_,COUNT(1) AS payCount FROM course_schedule_student_payment GROUP BY course_id_) a ON s.id_=a.course_id_
         WHERE s.lock_=0
         AND s.status_ IN ('ING','NOT_START','COMPLETE')
         AND s.id_ IN
@@ -695,7 +702,7 @@
         left join course_schedule_replied csr on cs.id_ = csr.course_schedule_id_
         where cs.teacher_id_ = #{userId} and cs.status_ = 'COMPLETE' and cs.type_ = 'PRACTICE'
         and csr.student_replied_ is not null
-        and YEARWEEK(date_format(csr.create_time_,'%Y-%m-%d'),7) = YEARWEEK(now(),7)
+        and YEARWEEK(date_format(csr.student_replied_time_,'%Y-%m-%d'),7) = YEARWEEK(now(),7)
     </select>
     <select id="selectStartTime" resultType="java.lang.String" parameterType="java.lang.String">
         SELECT s.start_time_
@@ -834,4 +841,40 @@
             #{item}
         </foreach>
     </update>
+    <select id="queryPianoClass" resultType="com.yonge.cooleshow.biz.dal.vo.PianoClassVo">
+        SELECT DISTINCT
+            s.id_ AS courseId,
+            g.id_ AS courseGroupId,
+            CONCAT(g.name_,'-第',s.class_num_,'课') AS courseGroupName,
+            b.id_ AS subjectId,
+            b.name_ AS subjectName,
+            s.teacher_id_ AS teacherId,
+            u.username_ AS teacherName,
+            u.real_name_ AS teacherRealName,
+            u.avatar_ AS avatar,
+            s.status_ AS `status`,
+            i.id_ AS imGroupId,
+            s.start_time_ AS startTime,
+            s.end_time_ AS endTime,
+            CASE WHEN a.sign_in_time_ IS NOT NULL THEN 1 ELSE 0 END AS studentSign
+        FROM course_schedule s
+        LEFT JOIN sys_user u ON s.teacher_id_=u.id_
+        LEFT JOIN course_group g ON s.course_group_id_=g.id_
+        LEFT JOIN `subject` b ON g.subject_id_=b.id_
+        LEFT JOIN course_schedule_student_payment p ON s.id_=p.course_id_
+        LEFT JOIN student_attendance a ON s.id_=a.course_group_id_
+        LEFT JOIN im_group i ON s.course_group_id_=i.course_group_id_
+        WHERE s.type_='PIANO_ROOM_CLASS'
+        AND p.user_id_=#{param.studentId}
+        <if test="param.status !=null and param.status !=''">
+            AND s.status_ = #{param.status}
+        </if>
+        <if test="param.subjectId !=null">
+            AND b.id_ = #{param.subjectId}
+        </if>
+        <if test="param.classMonth !=null">
+            <![CDATA[ AND s.class_date_ >= #{param.startDate} ]]>
+            <![CDATA[ AND s.class_date_ <= #{param.endDate} ]]>
+        </if>
+    </select>
 </mapper>

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

@@ -107,6 +107,8 @@
             <if test="score !=null">score_ = #{score},</if>
             <if test="studentReplied !=null and studentReplied !=''">student_replied_ = #{studentReplied},</if>
             <if test="teacherReplied !=null and teacherReplied !=''">teacher_replied_ = #{teacherReplied},</if>
+            <if test="studentRepliedTime !=null">student_replied_time_ = #{studentRepliedTime},</if>
+            <if test="teacherRepliedTime !=null">teacher_replied_time_ = #{teacherRepliedTime},</if>
             update_time_ = SYSDATE()
         </set>
         WHERE student_id_ = #{studentId}

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

@@ -27,6 +27,7 @@
         <result column="update_time_" jdbcType="TIMESTAMP" property="updateTime"/>
         <result column="update_by_" jdbcType="BIGINT" property="updateBy"/>
         <result column="remark_" jdbcType="VARCHAR" property="remark"/>
+        <result column="notation_" jdbcType="VARCHAR" property="notation"/>
     </resultMap>
 
     <sql id="Base_Column_List">
@@ -59,7 +60,8 @@
         t.audit_version_ as auditVersion,
         t.source_type_ as sourceType,
         t.submit_audit_time_ as submitAuditTime,
-        t.remark_ as remark
+        t.remark_ as remark,
+        t.notation_ as notation
     </sql>
 
     <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.vo.MusicSheetVo">
@@ -226,6 +228,7 @@
         <result column="userName" jdbcType="VARCHAR" property="userName"/>
         <result column="auditVersion" jdbcType="VARCHAR" property="auditVersion"/>
         <result column="code" jdbcType="VARCHAR" property="code"/>
+        <result column="notation" jdbcType="VARCHAR" property="notation"/>
         <collection property="background" ofType="com.yonge.cooleshow.biz.dal.entity.MusicSheetAccompaniment">
             <id column="accompanimentId" jdbcType="BIGINT" property="id"/>
             <result column="accompanimentMusicSheetId" jdbcType="BIGINT" property="musicSheetId"/>

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

@@ -12,7 +12,8 @@
 	        <result column="create_time_" property="createTime" />
 	        <result column="update_by_" property="updateBy" />
 	        <result column="update_time_" property="updateTime" />
-		</resultMap>  
+	        <result column="cover_url_" property="coverUrl" />
+		</resultMap>
     
     <!-- 表字段 -->
     <sql id="baseColumns">
@@ -26,6 +27,7 @@
         , t.create_time_ as createTime
         , t.update_by_ as updateBy
         , t.update_time_ as updateTime
+        , t.cover_url_ as coverUrl
         </sql>
 
     <select id="detail" resultType="com.yonge.cooleshow.biz.dal.vo.PianoRoomSettingsVo">

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

@@ -147,9 +147,9 @@
 		       smcr.score_, smcr.intonation_, smcr.cadence_,
 		       smcr.integrity_, smcr.record_file_path_, smcr.video_file_path_, smcr.client_id_, smcr.device_type_, smcr.play_time_,
 		       smcr.monday_, smcr.create_time_,
-			sms.name_ sys_music_score_name_
+			sms.music_sheet_name_ sys_music_score_name_,if(smcr.create_time_ is not null and date_add(smcr.create_time_,INTERVAL #{expireTime} DAY) &lt; now(),1,0) as expire
 		FROM sys_music_compare_record smcr
-		LEFT JOIN sys_music_score sms on smcr.music_sheet_id_ = sms.id_
+		LEFT JOIN music_sheet sms on smcr.music_sheet_id_ = sms.id_
 		<include refid="queryCondition"/>
 		ORDER BY id_ DESC
 		<include refid="global.limit"/>

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

@@ -107,17 +107,10 @@
             p.subject_name_ AS subjectName,
             p.subject_price_ AS subjectPrice
         FROM teacher_free_time f
-                 LEFT JOIN teacher_subject_price p ON f.id_=p.teacher_free_time_id
+        LEFT JOIN teacher_subject_price p ON f.id_=p.teacher_free_time_id
         WHERE f.teacher_id_=#{teacherId}
         AND f.default_flag_=1
         AND f.enable_flag_=1
-        AND f.monday_ IS NOT NULL
-        AND f.tuesday_ IS NOT NULL
-        AND f.wednesday_ IS NOT NULL
-        AND f.thursday_ IS NOT NULL
-        AND f.friday_ IS NOT NULL
-        AND f.saturday_ IS NOT NULL
-        AND f.sunday_ IS NOT NULL
     </select>
     <select id="getTeacherFreeTime" resultType="com.yonge.cooleshow.biz.dal.entity.TeacherFreeTime">
         SELECT * FROM teacher_free_time WHERE default_flag_=1

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

@@ -130,8 +130,8 @@
     </select>
 
     <select id="querySubject" resultMap="com.yonge.cooleshow.biz.dal.dao.SubjectDao.Subject">
-        SELECT s.* FROM teacher t
-        LEFT JOIN `subject` s ON FIND_IN_SET(s.id_,t.subject_id_)
+        SELECT s.* FROM `subject` s
+        LEFT JOIN teacher t ON FIND_IN_SET(s.id_,t.subject_id_)
         WHERE t.user_id_ = #{userId}
     </select>
 

+ 9 - 9
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserBindingTeacherMapper.xml

@@ -3,14 +3,13 @@
 <mapper namespace="com.yonge.cooleshow.biz.dal.dao.UserBindingTeacherDao">
     <select id="selectStudent" resultType="com.yonge.cooleshow.biz.dal.vo.CourseStudentVo">
         SELECT
-        su.id_ AS userId,
-        su.username_ AS userName,
-        su.real_name_ AS realName,
-        su.avatar_ AS avatar,
-        su.phone_ AS phone,
-        (SELECT group_concat(name_) FROM `subject` WHERE find_in_set(id_,s.subject_id_)) AS subjectName,
---         IFNULL(TIMESTAMPDIFF(DAY,b.last_end_class_,NOW()),TIMESTAMPDIFF(DAY,b.created_time_,NOW())) AS lastEndClass
-        TIMESTAMPDIFF(DAY,b.last_end_class_,NOW()) AS lastEndClass
+            su.id_ AS userId,
+            su.username_ AS userName,
+            su.real_name_ AS realName,
+            su.avatar_ AS avatar,
+            su.phone_ AS phone,
+            (SELECT group_concat(name_) FROM `subject` WHERE find_in_set(id_,s.subject_id_)) AS subjectName,
+            DATEDIFF(NOW(),b.last_end_class_) AS lastEndClass
         FROM user_binding_teacher b
         LEFT JOIN sys_user su ON b.student_id_=su.id_
         LEFT JOIN student s ON b.student_id_=s.user_id_
@@ -68,6 +67,7 @@
             (case when isnull(u.id_card_no_) then 0 else 1 end) as isReal,
             u.real_name_ as realName,
             u.id_card_no_ as idCardNo,
+            u.lock_flag_ as lockFlag,
             (
                 SELECT GROUP_CONCAT(name_) FROM subject WHERE FIND_IN_SET(id_,t.subject_id_)
             ) as subjectName
@@ -94,6 +94,6 @@
               AND a.type_ = 'PIANO_ROOM_CLASS'
             GROUP BY a.teacher_id_,b.user_id_
         ) v on t.teacher_id_ = v.teacher_id_ and t.student_id_ = v.user_id_
-        where v.user_id_ is null and t.created_time_ >= DATE_SUB(NOW(),INTERVAL #{days} DAY)
+        where v.user_id_ is null and t.created_time_ &lt;= DATE_SUB(NOW(),INTERVAL #{days} DAY)
     </select>
 </mapper>

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

@@ -91,6 +91,9 @@
         left join sys_user u on t.user_id_ = u.id_
             left join sys_user au on t.auth_user_id_ = au.id_
         <where>
+            <if test="param.userId !=null">
+                AND t.user_id_ = #{param.userId}
+            </if>
             <if test="null != param.search and '' != param.search">
                 AND (
                     t.user_id_ LIKE CONCAT('%', #{param.search}, '%') or
@@ -120,10 +123,10 @@
                 AND t.trans_no_ LIKE CONCAT('%', #{transNo}, '%')
             </if>
             <if test="param.startTime !=null">
-                <![CDATA[AND t.auth_time_ >= #{param.startTime} ]]>
+                <![CDATA[AND t.create_time_ >= #{param.startTime} ]]>
             </if>
             <if test="param.endTime !=null">
-                <![CDATA[AND t.auth_time_ < #{param.endTime} ]]>
+                <![CDATA[AND t.create_time_ < #{param.endTime} ]]>
             </if>
         </where>
         order by t.create_time_ desc
@@ -133,7 +136,7 @@
         <include refid="selectSql"/>
     </select>
 
-    <select id="selectList" resultType="com.yonge.cooleshow.biz.dal.vo.UserWithdrawalVo">
+    <select id="selectAllList" resultType="com.yonge.cooleshow.biz.dal.vo.UserWithdrawalVo">
         <include refid="selectSql"/>
     </select>
 
@@ -143,4 +146,9 @@
           and auth_status_ in ('DOING','PASS') and trade_status_ != 'failed'
         and to_days(create_time_) = to_days(now())
     </select>
+
+    <select id="totalAmount" resultType="com.yonge.cooleshow.biz.dal.vo.UserWithdrawalVo">
+        select sum(actual_amount_) as actual_amount_ from user_withdrawal
+        where auth_status_ = 'DOING'
+    </select>
 </mapper>

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

@@ -169,5 +169,18 @@ public class StudentCourseScheduleController extends BaseController {
     public HttpResponseResult<List<TeacherSubjectPrice>> getTeacherSubjectPrice(@NotNull Long teacherId) {
         return succeed(courseScheduleService.teacherSubjectPrice(teacherId));
     }
+
+    @ApiOperation("学生端-我的课程-琴房课列表")
+    @PostMapping("/queryPianoClass")
+    public HttpResponseResult<PageInfo<PianoClassVo>> queryPianoClass(@RequestBody MyCourseSearch search) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+
+        search.setStudentId(user.getId());
+        IPage<PianoClassVo> pages = courseScheduleService.queryPianoClass(PageUtil.getPage(search), search);
+        return succeed(PageUtil.pageInfo(pages));
+    }
 }
 

+ 4 - 15
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/StudentLiveRoomController.java

@@ -5,17 +5,16 @@ import com.alibaba.fastjson.JSONObject;
 import com.yonge.cooleshow.biz.dal.entity.ImUserStateSync;
 import com.yonge.cooleshow.biz.dal.entity.RoomInfoCache;
 import com.yonge.cooleshow.biz.dal.service.LiveRoomService;
-import com.yonge.cooleshow.biz.dal.vo.RoomVo;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
-import io.swagger.annotations.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import java.util.List;
-import java.util.Map;
 
 /**
  * 直播房间与课程的关系表表(LiveRoom)表控制层
@@ -35,26 +34,16 @@ public class StudentLiveRoomController extends BaseController {
     private LiveRoomService liveRoomService;
 
     /**
-     * 根据房间uid查询房间信息
-     *
-     * @param roomUid 房间uid
-     */
-    @GetMapping("queryRoomInfo")
-    public HttpResponseResult<RoomVo> queryRoomInfo(@RequestParam("roomUid") String roomUid) {
-        return succeed(liveRoomService.queryRoomInfo(roomUid));
-    }
-
-    /**
      * 校验房间信息,及个人信息
      *
      * @param roomUid 房间uid
      */
     @GetMapping("/studentCheckRoomInfo")
-    public HttpResponseResult<RoomVo> studentCheckRoomInfo(@RequestParam("roomUid") String roomUid) {
+    public HttpResponseResult<RoomInfoCache> studentCheckRoomInfo(@RequestParam("roomUid") String roomUid) {
         return succeed(liveRoomService.studentCheckRoomInfo(roomUid));
     }
 
-    @ApiOperation("进入房间")
+    @ApiOperation("观看者-进入房间")
     @GetMapping(value = "/joinRoom")
     public HttpResponseResult<RoomInfoCache> joinRoom(String roomUid, Long userId) {
         return succeed(liveRoomService.joinRoom(roomUid, userId));

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

@@ -3,18 +3,13 @@ package com.yonge.cooleshow.student.controller;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.entity.ContractTemplate;
-import com.yonge.cooleshow.biz.dal.entity.SysUserContractRecord;
-import com.yonge.cooleshow.biz.dal.enums.DealStatusEnum;
-import com.yonge.cooleshow.biz.dal.sdk.WithdrawSdk;
 import com.yonge.cooleshow.biz.dal.service.ContractService;
 import com.yonge.cooleshow.biz.dal.service.ContractTemplateService;
 import com.yonge.cooleshow.biz.dal.service.SysUserContractRecordService;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
-import com.yonge.cooleshow.common.enums.ContractTemplateSourceEnum;
 import com.yonge.cooleshow.common.enums.ContractTemplateTypeEnum;
 import com.yonge.cooleshow.common.enums.SysUserType;
-import com.yonge.cooleshow.common.service.IdGeneratorService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -46,10 +41,7 @@ public class SysUserContractRecordController extends BaseController {
     private SysUserContractRecordService sysUserContractRecordService;
     @Autowired
     private ContractService contractService;
-    @Autowired
-    private WithdrawSdk withdrawSdk;
-    @Autowired
-    private IdGeneratorService idGeneratorService;
+
 
     @ApiOperation("判断用户是否签署协议")
     @GetMapping(value = "/checkContractSign", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@@ -75,42 +67,7 @@ public class SysUserContractRecordController extends BaseController {
         if (user == null || null == user.getId()) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
-        //是否签署标识,签署了才入库
-        boolean flag = false;
-        SysUserContractRecord contractRecord = sysUserContractRecordService.queryLatestContract(user.getId(), SysUserType.STUDENT, contractType);
-
-        //未签署协议
-        if (null == contractRecord) {
-            ContractTemplate contractTemplate = contractTemplateService.queryLatestContractTemplate(contractType);
-            if (null == contractTemplate) {
-                return failed(HttpStatus.FORBIDDEN, "未找到协议");
-            }
-            contractRecord = new SysUserContractRecord();
-            Long contractNo = idGeneratorService.generatorId("contractNo");
-            contractRecord.setContractNo(contractNo.toString());
-            contractRecord.setUserId(user.getId());
-            contractRecord.setContractId(contractTemplate.getId());
-            //注意 老师端默认用户为student
-            contractRecord.setUserType(SysUserType.STUDENT.getCode());
-
-            if (ContractTemplateSourceEnum.LINGXINPAY.getCode().equals(contractTemplate.getSource())
-                    && ContractTemplateTypeEnum.WITHDRAW.getCode().equals(contractTemplate.getType())) {
-                //签署结算协议
-                contractRecord.setStatus(DealStatusEnum.DOING.getCode());
-                flag = withdrawSdk.signContract(user.getRealName(), user.getIdCardNo(), user.getPhone(), contractNo.toString());
-            } else {
-                HttpResponseResult<String> stringHttpResponseResult = contractService.transferProduceContract(contractRecord.getUserId(), SysUserType.STUDENT, contractType);
-                if (stringHttpResponseResult.getStatus()) {
-                    contractRecord.setUrl(stringHttpResponseResult.getData());
-                    contractRecord.setStatus(DealStatusEnum.SUCCESS.getCode());
-                    flag = true;
-                }
-            }
-            if (flag) {
-                sysUserContractRecordService.save(contractRecord);
-            }
-        }
-        return HttpResponseResult.succeed(true);
+        return sysUserContractRecordService.sign(contractType, SysUserType.STUDENT, user);
     }
 
     @ApiOperation("查看协议")
@@ -121,8 +78,7 @@ public class SysUserContractRecordController extends BaseController {
         if (user == null || null == user.getId()) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
-        return contractService.queryProductContract(user.getId(),SysUserType.STUDENT,contractType);
+        return contractService.queryProductContract(user.getId(), SysUserType.STUDENT, contractType);
     }
-
 }
 

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

@@ -66,6 +66,9 @@ public class MusicSheetController extends BaseController {
                 && musicSheetDto.getMusicPrice()==null){
             return failed("此曲谱为收费曲谱,需要提供价格");
         }
+        if (musicSheetDto.getNotation() == null) {
+            musicSheetDto.setNotation(YesOrNoEnum.NO);
+        }
 
         musicSheetDto.setUserId(sysUser.getId());
         musicSheetDto.setAuditStatus(AuthStatusEnum.DOING);
@@ -89,6 +92,9 @@ public class MusicSheetController extends BaseController {
         if (musicSheet.getId()==null){
             return failed("缺少ID");
         }
+        if (musicSheet.getNotation() == null) {
+            musicSheet.setNotation(YesOrNoEnum.NO);
+        }
 
         musicSheet.setUpdateBy(sysUser.getId());
         musicSheet.setUpdateTime(new Date());

+ 1 - 40
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/SysUserContractRecordController.java

@@ -43,10 +43,6 @@ public class SysUserContractRecordController extends BaseController {
     private SysUserContractRecordService sysUserContractRecordService;
     @Autowired
     private ContractService contractService;
-    @Autowired
-    private WithdrawSdk withdrawSdk;
-    @Autowired
-    private IdGeneratorService idGeneratorService;
 
     @ApiOperation("判断用户是否签署协议")
     @GetMapping(value = "/checkContractSign", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@@ -83,42 +79,7 @@ public class SysUserContractRecordController extends BaseController {
         if (user == null || null == user.getId()) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
-        //是否签署标识,签署了才入库
-        boolean flag = false;
-        SysUserContractRecord contractRecord = sysUserContractRecordService.queryLatestContract(user.getId(), SysUserType.TEACHER, contractType);
-
-        //未签署协议
-        if (null == contractRecord) {
-            ContractTemplate contractTemplate = contractTemplateService.queryLatestContractTemplate(contractType);
-            if (null == contractTemplate) {
-                return failed(HttpStatus.FORBIDDEN, "未找到协议");
-            }
-            contractRecord = new SysUserContractRecord();
-            Long contractNo = idGeneratorService.generatorId("contractNo");
-            contractRecord.setContractNo(contractNo.toString());
-            contractRecord.setUserId(user.getId());
-            contractRecord.setContractId(contractTemplate.getId());
-            //注意 老师端默认用户为teacher
-            contractRecord.setUserType(SysUserType.TEACHER.getCode());
-
-            if (ContractTemplateSourceEnum.LINGXINPAY.getCode().equals(contractTemplate.getSource())
-                    && ContractTemplateTypeEnum.WITHDRAW.getCode().equals(contractTemplate.getType())) {
-                //签署结算协议
-                contractRecord.setStatus(DealStatusEnum.DOING.getCode());
-                flag = withdrawSdk.signContract(user.getRealName(), user.getIdCardNo(), user.getPhone(), contractNo.toString());
-            } else {
-                HttpResponseResult<String> stringHttpResponseResult = contractService.transferProduceContract(contractRecord.getUserId(), SysUserType.TEACHER, contractType);
-                if (stringHttpResponseResult.getStatus()) {
-                    contractRecord.setUrl(stringHttpResponseResult.getData());
-                    contractRecord.setStatus(DealStatusEnum.SUCCESS.getCode());
-                    flag = true;
-                }
-            }
-            if (flag) {
-                sysUserContractRecordService.save(contractRecord);
-            }
-        }
-        return HttpResponseResult.succeed(true);
+        return sysUserContractRecordService.sign(contractType, SysUserType.TEACHER, user);
     }
 
 

+ 15 - 0
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherCourseGroupController.java

@@ -1,21 +1,27 @@
 package com.yonge.cooleshow.teacher.controller;
 
 
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.CheckCourseTimeDto;
 import com.yonge.cooleshow.biz.dal.dto.LiveCourseGroupDto;
 import com.yonge.cooleshow.biz.dal.entity.CourseTimeEntity;
 import com.yonge.cooleshow.biz.dal.service.CourseGroupService;
+import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
 import com.yonge.cooleshow.biz.dal.vo.CourseGroupVo;
 import com.yonge.cooleshow.biz.dal.vo.LiveCourseInfoVo;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.page.PageInfo;
 import io.swagger.annotations.*;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 
 /**
  * 课程组表(CourseGroup)表控制层
@@ -32,6 +38,8 @@ public class TeacherCourseGroupController extends BaseController {
      */
     @Resource
     private CourseGroupService courseGroupService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
 
     @ApiOperation("直播课详情")
     @GetMapping("/queryLiveCourseInfo")
@@ -49,6 +57,9 @@ public class TeacherCourseGroupController extends BaseController {
     @ApiOperation("分页查询直播课课程组列表")
     @PostMapping("/queryPageCourseGroup")
     public HttpResponseResult<PageInfo<CourseGroupVo>> queryPageLiveCourseGroup(@RequestBody Map<String, Object> param) {
+        Long teacherId = WrapperUtil.toLong(param, "teacherId");
+        teacherId = Optional.ofNullable(teacherId).orElseGet(() -> getSysUser().getId());
+        param.put("teacherId", teacherId);
         return succeed(courseGroupService.queryPageLiveCourseGroup(param));
     }
 
@@ -85,5 +96,9 @@ public class TeacherCourseGroupController extends BaseController {
         return succeed(courseGroupService.getLiveLockTimeCache(teacherId).get(teacherId));
     }
 
+    private SysUser getSysUser() {
+        return Optional.ofNullable(sysUserFeignService.queryUserInfo())
+                .orElseThrow(() -> new BizException("用户不存在"));
+    }
 }
 

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

@@ -219,7 +219,7 @@ public class TeacherCourseScheduleController extends BaseController {
             @ApiImplicitParam(name = "month", dataType = "String", value = "月份,yyyy-mm"),
             @ApiImplicitParam(name = "status", dataType = "String", value = "课程状态"),
     })
-    @ApiOperation("课程列表")
+    @ApiOperation("琴房课程列表")
     @PostMapping("/selectCourseList")
     public HttpResponseResult<PageInfo<CourseScheduleRecordVo>> selectCourseList(@RequestBody Map<String, Object> param) {
         SysUser user = sysUserFeignService.queryUserInfo();

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

@@ -5,7 +5,6 @@ import com.alibaba.fastjson.JSONObject;
 import com.yonge.cooleshow.biz.dal.entity.ImUserStateSync;
 import com.yonge.cooleshow.biz.dal.entity.RoomInfoCache;
 import com.yonge.cooleshow.biz.dal.service.LiveRoomService;
-import com.yonge.cooleshow.biz.dal.vo.RoomVo;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import io.swagger.annotations.*;
@@ -39,9 +38,9 @@ public class TeacherLiveRoomController extends BaseController {
      *
      * @param roomUid 房间uid
      */
-    @GetMapping("queryRoomInfo")
-    public HttpResponseResult<RoomVo> queryRoomInfo(@RequestParam("roomUid") String roomUid) {
-        return succeed(liveRoomService.queryRoomInfo(roomUid));
+    @GetMapping("/speakerCheckRoomInfo")
+    public HttpResponseResult<RoomInfoCache> speakerCheckRoomInfo(@RequestParam("roomUid") String roomUid) {
+        return succeed(liveRoomService.speakerCheckRoomInfo(roomUid));
     }
 
     @ApiImplicitParams({
@@ -58,15 +57,15 @@ public class TeacherLiveRoomController extends BaseController {
     @ApiOperation("同步点赞数量")
     @GetMapping("/syncLike")
     public HttpResponseResult<Object> syncLike(@ApiParam(value = "房间uid", required = true) String roomUid,
-                                       @ApiParam(value = "点赞数", required = true) Integer likeNum) {
+                                               @ApiParam(value = "点赞数", required = true) Integer likeNum) {
         liveRoomService.syncLike(roomUid, likeNum);
         return succeed();
     }
 
-    @ApiOperation("进入房间")
+    @ApiOperation("主讲人-进入房间")
     @GetMapping(value = "/speakerJoinRoom")
-    public HttpResponseResult<RoomInfoCache> speakerJoinRoom(String roomUid, Long userId) {
-        return succeed(liveRoomService.speakerJoinRoom(roomUid, userId));
+    public HttpResponseResult<RoomInfoCache> speakerJoinRoom(String roomUid) {
+        return succeed(liveRoomService.speakerJoinRoom(roomUid));
     }
 
     @ApiOperation("定时任务-创建房间-直播间")
@@ -87,6 +86,13 @@ public class TeacherLiveRoomController extends BaseController {
         liveRoomService.destroyExpiredPracticeRoom();
     }
 
+    @ApiOperation("手动关闭直播间")
+    @GetMapping("/destroyLiveRoom")
+    public HttpResponseResult<Object> destroyLiveRoom(@ApiParam(value = "房间uid", required = true) String roomUid) {
+        liveRoomService.destroyLiveRoom(roomUid);
+        return succeed();
+    }
+
     /**
      * 同步融云用户状态变更
      *

+ 40 - 0
cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/open/OpenNewsController.java

@@ -0,0 +1,40 @@
+package com.yonge.cooleshow.website.controller.open;
+
+import com.yonge.cooleshow.biz.dal.entity.SysNewsInformation;
+import com.yonge.cooleshow.biz.dal.service.BannerService;
+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;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-06-23
+ */
+@RestController
+@RequestMapping("/open/banner")
+@Api(value = "轮播图", tags = "轮播图")
+public class OpenNewsController  extends BaseController {
+
+    @Autowired
+    private BannerService bannerService;
+
+    /**
+     * 查询分页tree
+     */
+    @GetMapping("/list")
+    @ApiOperation(value = "官网轮播图列表")
+    public HttpResponseResult<List<SysNewsInformation>> tree() {
+        List<SysNewsInformation> treeList = bannerService.selectBanner();
+        return succeed(treeList);
+    }
+
+}

+ 30 - 0
cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/open/OpenTeacherController.java

@@ -0,0 +1,30 @@
+package com.yonge.cooleshow.website.controller.open;
+
+import com.yonge.cooleshow.biz.dal.service.TeacherService;
+import com.yonge.cooleshow.biz.dal.vo.TeacherVo;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import io.swagger.annotations.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/open/teacher")
+@Api(value = "开放老师接口", tags = "开放老师接口")
+public class OpenTeacherController extends BaseController {
+    @Autowired
+    private TeacherService teacherService;
+
+    /**
+     * 查询单条
+     */
+    @GetMapping("/detail/{id}")
+    @ApiOperation(value = "详情", notes = "传入id")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "id", paramType = "path", dataType = "long", required = true),
+    })
+    public HttpResponseResult<TeacherVo> detail(@PathVariable("id") Long userId) {
+        TeacherVo detail = teacherService.detail(userId);
+        return succeed(detail);
+    }
+}

+ 29 - 6
cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/open/OpenVideoGroupController.java

@@ -4,27 +4,31 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.search.VideoLessonGroupSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.VideoLessonSearch;
 import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroup;
+import com.yonge.cooleshow.biz.dal.service.TeacherService;
+import com.yonge.cooleshow.biz.dal.service.VideoLessonGroupDetailService;
 import com.yonge.cooleshow.biz.dal.service.VideoLessonGroupService;
+import com.yonge.cooleshow.biz.dal.vo.*;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.valid.AddGroup;
 import com.yonge.cooleshow.biz.dal.valid.UpdateGroup;
-import com.yonge.cooleshow.biz.dal.vo.VideoLessonGroupUpVo;
-import com.yonge.cooleshow.biz.dal.vo.VideoLessonGroupVo;
-import com.yonge.cooleshow.biz.dal.vo.VideoLessonStudentVo;
-import com.yonge.cooleshow.biz.dal.vo.VideoLessonVo;
 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.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.constraints.NotNull;
+import java.util.List;
 
 /**
  * 视频课基本信息表 web 控制层
@@ -38,9 +42,12 @@ import javax.validation.constraints.NotNull;
 public class OpenVideoGroupController extends BaseController {
     @Autowired
     private SysUserFeignService sysUserFeignService;
-
+    @Autowired
+    private TeacherService teacherService;
     @Autowired
     private VideoLessonGroupService videoLessonGroupService;
+    @Autowired
+    private VideoLessonGroupDetailService videoLessonGroupDetailService;
 
     /**
     * @Description: 查询视频课组
@@ -54,7 +61,6 @@ public class OpenVideoGroupController extends BaseController {
         return succeed(PageUtil.pageInfo(pages));
     }
 
-
     /**
      * @Description: 根据组id查询视频课&视频课组
      * @Author: cy
@@ -66,4 +72,21 @@ public class OpenVideoGroupController extends BaseController {
         return succeed(videoLessonGroupService.selectVideoLesson(groupId));
     }
 
+    /**
+     * @Description: 根据视频课组id查详情
+     * @Author: cy
+     * @Date: 2022/6/27
+     */
+    @ApiOperation(value = "查询视频课", httpMethod = "POST", consumes = "application/json", produces = "application/json")
+    @PostMapping(value = "/info/page", consumes = "application/json", produces = "application/json")
+    public HttpResponseResult<PageInfo<VideoLessonGroupDetailVo>> page(@RequestBody VideoLessonSearch query) {
+        IPage<VideoLessonGroupDetailVo> pages = videoLessonGroupDetailService.selectPage(PageUtil.getPage(query), query);
+        return succeed(PageUtil.pageInfo(pages));
+    }
+
+    @ApiOperation(value = "其他课程")
+    @PostMapping("/otherLesson")
+    public HttpResponseResult<List<VideoLessonGroupVo>> otherLesson(@RequestBody VideoLessonGroupSearch query) {
+        return succeed(videoLessonGroupService.selectPage(query));
+    }
 }