Browse Source

Merge branch 'online' of http://git.dayaedu.com/yonge/cooleshow into zx_online_scoretype

# Conflicts:
#	cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MusicSheetSearch.java
#	pom.xml
zouxuan 7 months ago
parent
commit
db18caf6e7
100 changed files with 1979 additions and 695 deletions
  1. 3 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/CourseCoursewareController.java
  2. 1 1
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/ImGroupController.java
  3. 6 1
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/MemberPriceSettingsController.java
  4. 13 12
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/StudentController.java
  5. 28 15
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/TeacherController.java
  6. 56 6
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/VipCardRecordController.java
  7. 12 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/io/request/TeacherBindingUserVo.java
  8. 3 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/io/request/teacher/TeacherVO.java
  9. 2 2
      cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/ImGroupController.java
  10. 2 2
      cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/ImUserFriendController.java
  11. 38 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/MemberPriceSettingsController.java
  12. 40 2
      cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/MusicSheetController.java
  13. 9 4
      cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java
  14. 10 28
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/CourseCoursewareController.java
  15. 3 3
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/ImGroupController.java
  16. 4 2
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/ImUserFriendController.java
  17. 17 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/MemberPriceSettingsController.java
  18. 22 1
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/MusicSheetController.java
  19. 25 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/StudentController.java
  20. 28 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherController.java
  21. 2 2
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherCourseScheduleController.java
  22. 33 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/UserOrderController.java
  23. 1 1
      cooleshow-app/src/main/java/com/yonge/cooleshow/website/controller/MusicSheetController.java
  24. 3 2
      cooleshow-app/src/main/java/com/yonge/cooleshow/website/controller/WebCourseScheduleController.java
  25. 2 2
      cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/config/CustomerServiceConfig.java
  26. 3 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/dal/dao/SysUserDao.java
  27. 5 13
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/SysUserServiceImpl.java
  28. 23 0
      cooleshow-auth/auth-server/src/main/resources/config/mybatis/SysUserMapper.xml
  29. 21 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/constant/SysConfigConstant.java
  30. 1 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/RewardTypeEnum.java
  31. 1 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/UnitEnum.java
  32. 1 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/payment/EPaymentType.java
  33. 3 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleStudentMusicSheetDao.java
  34. 13 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  35. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ImUserFriendDao.java
  36. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicSheetDao.java
  37. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/StudentDao.java
  38. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/TeacherDao.java
  39. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/VipCardRecordDao.java
  40. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/BasicUserInfo.java
  41. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkDeviceControlDto.java
  42. 3 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkDeviceStateChangedMessage.java
  43. 3 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkMusicSheetDownloadMessageContent.java
  44. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkMusicSheetDto.java
  45. 44 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderReq.java
  46. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/TeacherSubmitReq.java
  47. 7 13
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MemberPriceSettingsSearch.java
  48. 22 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MusicSheetRelatedQueryInfo.java
  49. 23 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MusicSheetSearch.java
  50. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/OrderSearch.java
  51. 13 9
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/StudentSearch.java
  52. 9 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/TeacherSearch.java
  53. 23 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/VipRecordSearch.java
  54. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseScheduleStudentMusicSheet.java
  55. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseScheduleStudentPayment.java
  56. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImGroup.java
  57. 13 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImUserFriend.java
  58. 12 58
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MemberPriceSettings.java
  59. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicSheetAccompaniment.java
  60. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/Student.java
  61. 16 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/StudentTime.java
  62. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/Teacher.java
  63. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderDetail.java
  64. 27 130
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/VipCardRecord.java
  65. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/AccountBizTypeEnum.java
  66. 33 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/EUserVipType.java
  67. 37 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/EVipRecordStatus.java
  68. 46 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/EVipType.java
  69. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/GoodTypeEnum.java
  70. 24 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageTypeEnum.java
  71. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/OrderTypeEnum.java
  72. 4 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/PeriodEnum.java
  73. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/SourceTypeEnum.java
  74. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/coupon/CouponCategoryEnum.java
  75. 32 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/im/EImUserFriendSourceForm.java
  76. 21 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleService.java
  77. 7 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImGroupMemberService.java
  78. 9 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImGroupService.java
  79. 9 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImUserFriendService.java
  80. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MemberPriceSettingsService.java
  81. 3 14
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetAccompanimentService.java
  82. 11 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetService.java
  83. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/StudentService.java
  84. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TeacherService.java
  85. 41 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/VipCardRecordService.java
  86. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/im/ImGroupCoreService.java
  87. 12 10
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/im/impl/ImGroupCoreServiceImpl.java
  88. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityRewardServiceImpl.java
  89. 39 61
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseCoursewareServiceImpl.java
  90. 8 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  91. 35 18
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  92. 97 12
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CustomerServiceBatchSendingServiceImpl.java
  93. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/HomeServiceImpl.java
  94. 113 44
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImGroupMemberAuditServiceImpl.java
  95. 14 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImGroupMemberServiceImpl.java
  96. 120 34
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImGroupServiceImpl.java
  97. 71 30
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImNetworkRoomServiceImpl.java
  98. 194 44
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImUserFriendServiceImpl.java
  99. 244 57
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MemberPriceSettingsServiceImpl.java
  100. 10 13
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetAccompanimentServiceImpl.java

+ 3 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/CourseCoursewareController.java

@@ -39,6 +39,9 @@ public class CourseCoursewareController extends BaseController {
     @PostMapping("/page")
     @ApiOperation(value = "查询分页", notes = "传入courseCoursewareSearch")
     public HttpResponseResult<PageInfo<CourseCoursewareVo>> page(@RequestBody CourseCoursewareSearch query) {
+		if(query.getClientType() == null){
+			query.setClientType(ClientEnum.TEACHER);
+		}
 		IPage<CourseCoursewareVo> pages = courseCoursewareService.selectPage(PageUtil.getPage(query), query);
         return succeed(PageUtil.pageInfo(pages));
 	}

+ 1 - 1
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/ImGroupController.java

@@ -65,7 +65,7 @@ public class ImGroupController extends BaseController {
     @PostMapping(value = "/getDetail/{groupId}")
     @PreAuthorize("@pcs.hasPermissions('imGroup/detail')")
     public HttpResponseResult<ImGroup> getDetail(@ApiParam(value = "群编号", required = true) @PathVariable("groupId") String groupId) throws Exception {
-        ImGroup group = imGroupService.getById(groupId);
+        ImGroup group = imGroupService.getGroupById(groupId);
         if (group == null) {
             return failed(HttpStatus.NO_CONTENT, "群组不存在");
         }

+ 6 - 1
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/MemberPriceSettingsController.java

@@ -1,5 +1,7 @@
 package com.yonge.cooleshow.admin.controller;
 
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
@@ -69,6 +71,9 @@ public class MemberPriceSettingsController extends BaseController {
 		}
 		memberPriceSettings.setUpdateBy(user.getId());
 		memberPriceSettings.setUpdateTime(new Date());
-		return status(memberPriceSettingsService.updateById(memberPriceSettings));
+		boolean update = memberPriceSettingsService.update(memberPriceSettings, new UpdateWrapper<MemberPriceSettings>().lambda()
+				.set(MemberPriceSettings::getDesc, memberPriceSettings.getDesc())
+				.eq(MemberPriceSettings::getId, memberPriceSettings.getId()));
+		return status(update);
 	}
 }

+ 13 - 12
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/StudentController.java

@@ -251,9 +251,9 @@ public class StudentController extends BaseController {
         OutputStream outputStream = response.getOutputStream();
         try {
             HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"学生编号", "学生姓名", "真实姓名", "性别", "出生日期",
-                    "年龄", "专业", "手机号码", "是否是会员", "注册时间", "用户状态", "学生来源","小组"}, new String[]{
+                    "年龄", "专业", "手机号码", "会员类型", "会员结束时间", "注册时间", "用户状态", "学生来源","小组"}, new String[]{
                     "userId", "username", "realName", "gender.msg", "birthdate", "age", "subjectName", "phone",
-                    "isVip.msg", "createTime", "userStatus.msg", "tenantName", "tenantGroupName"}, rows);
+                    "vipType.name", "membershipEndTimeStr", "createTime", "userStatus.msg", "tenantName", "tenantGroupName"}, rows);
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attac:wq" +
                     "hment;filename=学生列表-" + DateUtil.getDate(new Date()) + ".xls");
@@ -274,16 +274,16 @@ public class StudentController extends BaseController {
         }
     }
 
-    @PostMapping("/addVip")
-    @ApiOperation(value = "添加会员")
-    @PreAuthorize("@pcs.hasPermissions('student/addVip')")
-    public HttpResponseResult<Boolean> addVip(@Valid @RequestBody VipSubmitReq vipSubmitReq) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null || sysUser.getId() == null) {
-            return failed("用户信息获取失败");
-        }
-        return succeed(memberPriceSettingsService.addVip(vipSubmitReq, ClientEnum.STUDENT, sysUser));
-    }
+//    @PostMapping("/addVip")
+//    @ApiOperation(value = "添加会员")
+//    @PreAuthorize("@pcs.hasPermissions('student/addVip')")
+//    public HttpResponseResult<Boolean> addVip(@Valid @RequestBody VipSubmitReq vipSubmitReq) {
+//        SysUser sysUser = sysUserFeignService.queryUserInfo();
+//        if (sysUser == null || sysUser.getId() == null) {
+//            return failed("用户信息获取失败");
+//        }
+//        return succeed(memberPriceSettingsService.addVip(vipSubmitReq, ClientEnum.STUDENT, sysUser));
+//    }
 
 
     @PostMapping("/vipRecord")
@@ -291,6 +291,7 @@ public class StudentController extends BaseController {
     @PreAuthorize("@pcs.hasPermissions('student/vipRecord')")
     public HttpResponseResult<PageInfo<VipRecordVo>> vipRecord(@Valid @RequestBody VipRecordSearch recordSearch) {
 
+        recordSearch.setDisplayFlag(true);
         recordSearch.setClient(ClientEnum.STUDENT);
         return succeed(vipCardRecordService.vipRecord(recordSearch));
     }

+ 28 - 15
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/TeacherController.java

@@ -218,9 +218,9 @@ public class TeacherController extends BaseController {
         OutputStream outputStream = response.getOutputStream();
         try {
             HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"老师编号", "昵称", "姓名", "手机号", "老师类型",
-                    "注册时间", "认证时间", "状态", "是否是会员", "徽章", "机构", "小组"}, new String[]{
+                    "注册时间", "认证时间", "状态", "会员类型", "会员结束时间", "徽章", "机构", "小组"}, new String[]{
                     "userId", "username", "realName", "phone", "entryFlag.code == 1 ? '达人' : '游客'", "createTime",
-                    "entryAuthDate","userStatus.msg", "isVip.code == 1 ? '是' : '否'", "tag", "tenantName",
+                    "entryAuthDate","userStatus.msg", "vipType.name", "membershipEndTimeStr", "tag", "tenantName",
                     "tenantGroupName"}, rows);
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attac:wq" +
@@ -242,25 +242,25 @@ public class TeacherController extends BaseController {
         }
     }
 
-    @PostMapping("/addVip")
-    @ApiOperation(value = "添加会员")
-    @PreAuthorize("@pcs.hasPermissions('teacher/addVip')")
-    public HttpResponseResult<Boolean> addVip(@Valid @RequestBody VipSubmitReq vipSubmitReq) {
-
-
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null  || sysUser.getId() == null) {
-            return failed("用户信息获取失败");
-        }
-        return succeed(memberPriceSettingsService.addVip(vipSubmitReq, ClientEnum.TEACHER,sysUser));
-    }
+//    @PostMapping("/addVip")
+//    @ApiOperation(value = "添加会员")
+//    @PreAuthorize("@pcs.hasPermissions('teacher/addVip')")
+//    public HttpResponseResult<Boolean> addVip(@Valid @RequestBody VipSubmitReq vipSubmitReq) {
+//
+//
+//        SysUser sysUser = sysUserFeignService.queryUserInfo();
+//        if (sysUser == null  || sysUser.getId() == null) {
+//            return failed("用户信息获取失败");
+//        }
+//        return succeed(memberPriceSettingsService.addVip(vipSubmitReq, ClientEnum.TEACHER,sysUser));
+//    }
 
 
     @PostMapping("/vipRecord")
     @ApiOperation(value = "会员记录")
     @PreAuthorize("@pcs.hasPermissions('teacher/vipRecord')")
     public HttpResponseResult<PageInfo<VipRecordVo>> vipRecord(@Valid @RequestBody VipRecordSearch recordSearch) {
-
+        recordSearch.setDisplayFlag(true);
         recordSearch.setClient(ClientEnum.TEACHER);
         return succeed(vipCardRecordService.vipRecord(recordSearch));
     }
@@ -355,4 +355,17 @@ public class TeacherController extends BaseController {
         imGroupService.setTeacherFansGroup();
         return succeed();
     }
+
+    /**
+     * 老师账号冻结/解冻
+     */
+    @PostMapping("/updateLock/{teacherId}")
+    @ApiOperation(value = "老师账号冻结/解冻")
+    @PreAuthorize("@pcs.hasPermissions('teacher/updateLock')")
+    public HttpResponseResult updateLock(@PathVariable("teacherId") Long teacherId) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        teacherService.updateLock(sysUser, teacherId);
+        return succeed();
+    }
+
 }

+ 56 - 6
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/VipCardRecordController.java

@@ -1,16 +1,30 @@
 package com.yonge.cooleshow.admin.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.google.common.collect.Lists;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dao.UserOrderDao;
+import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.VipCardRecordSearch;
+import com.yonge.cooleshow.biz.dal.enums.EVipRecordStatus;
+import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.VipCardRecordService;
+import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 import com.yonge.cooleshow.biz.dal.vo.VipCardRecordVo;
+import com.yonge.cooleshow.biz.dal.wrapper.VipCardRecordWrapper;
 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 com.yonge.toolset.mybatis.support.PageUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.checkerframework.checker.units.qual.A;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -18,6 +32,9 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
+import java.util.stream.Collectors;
+
 @RestController
 @RequestMapping("${app-config.url.admin:}/vipCardRecord")
 @Api(value = "购买会员卡记录表", tags = "购买会员卡记录表")
@@ -26,22 +43,55 @@ public class VipCardRecordController extends BaseController {
     @Autowired
     private VipCardRecordService vipCardRecordService;
 
-	/**
+    @Resource
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private UserOrderDao userOrderDao;
+
+    /**
      * 查询单条
      */
     @GetMapping("/detail/{orderDetilId}")
     @ApiOperation(value = "详情", notes = "传入订单详情id")
     public HttpResponseResult<VipCardRecordVo> detail(@PathVariable("orderDetilId") Long orderDetilId) {
-    	return succeed(vipCardRecordService.detail(orderDetilId));
-	}
-    
+        return succeed(vipCardRecordService.detail(orderDetilId));
+    }
+
     /**
      * 查询分页
      */
     @PostMapping("/page")
     @ApiOperation(value = "查询分页", notes = "传入vipCardRecordSearch")
     public HttpResponseResult<PageInfo<VipCardRecordVo>> page(@RequestBody VipCardRecordSearch query) {
-		IPage<VipCardRecordVo> pages = vipCardRecordService.selectPage(PageUtil.getPage(query), query);
+        IPage<VipCardRecordVo> pages = vipCardRecordService.selectPage(PageUtil.getPage(query), query);
         return succeed(PageUtil.pageInfo(pages));
-	}
+    }
+
+
+    @ApiOperation("添加/扣减会员")
+    @PostMapping("/add")
+    @PreAuthorize("@pcs.hasPermissions('vipCardRecord/add')")
+    public HttpResponseResult<Void> add(@RequestBody @Validated VipCardRecordWrapper.AddVipCardRecord addVipCardRecord) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        addVipCardRecord.setCreateBy(sysUser.getId());
+        if (addVipCardRecord.getStatus().equals(EVipRecordStatus.ADD)) {
+            addVipCardRecord.setSourceType(SourceTypeEnum.PLATFORM);
+        } else if (addVipCardRecord.getStatus().equals(EVipRecordStatus.DEDUCTION)) {
+            addVipCardRecord.setSourceType(SourceTypeEnum.PLATFORM_DEDUCT);
+        }
+
+        // 判断是否有待支付订单 如果有返回不可下单
+        OrderSearch search = new OrderSearch();
+        search.setOrderClient(addVipCardRecord.getClientType().name());
+        search.setGoodType(Lists.newArrayList(GoodTypeEnum.VIP, GoodTypeEnum.SVIP).stream().map(GoodTypeEnum::name).collect(Collectors.joining(",")));
+        search.setUserId(addVipCardRecord.getUserId());
+
+        UserOrderVo userOrderVo = userOrderDao.getPendingOrder(search);
+        if (null != userOrderVo) {
+            throw new BizException(997, "当前用户存在未支付订单,不可操作添加/扣减会员");
+        }
+        vipCardRecordService.add(addVipCardRecord);
+        return succeed();
+    }
 }

+ 12 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/io/request/TeacherBindingUserVo.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.admin.io.request;
 
 import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.biz.dal.enums.EUserVipType;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.page.QueryInfo;
 import io.swagger.annotations.ApiModel;
@@ -100,6 +101,9 @@ public class TeacherBindingUserVo {
         @ApiModelProperty(value = "是否会员 0否 1是")
         private YesOrNoEnum isVip;
 
+        @ApiModelProperty("用户会员类型")
+        private EUserVipType vipType;
+
 
         @ApiModelProperty("课程数")
         private Long courseNum;
@@ -204,6 +208,14 @@ public class TeacherBindingUserVo {
         public void setBindingTime(Date bindingTime) {
             this.bindingTime = bindingTime;
         }
+
+        public EUserVipType getVipType() {
+            return vipType;
+        }
+
+        public void setVipType(EUserVipType vipType) {
+            this.vipType = vipType;
+        }
     }
 
     @ApiModel("BindingStudentCourseQuery-绑定学生课程列表查询")

+ 3 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/io/request/teacher/TeacherVO.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.admin.io.request.teacher;
 
 import com.alibaba.fastjson.JSON;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.yonge.cooleshow.biz.dal.enums.EUserVipType;
 import com.yonge.cooleshow.biz.dal.enums.GenderEnum;
 import com.yonge.cooleshow.biz.dal.enums.MK;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
@@ -138,5 +139,7 @@ public class TeacherVO {
 
         @ApiModelProperty("出生日期")
         private Integer age;
+
+        private EUserVipType vipType;
     }
 }

+ 2 - 2
cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/ImGroupController.java

@@ -136,7 +136,7 @@ public class ImGroupController extends BaseController {
             return failed("无效的用户ID");
         }
 
-        ImUserFriend userFriend = imUserFriendService.getDetail(userId, ClientEnum.TEACHER);
+        ImUserFriendVO.ImUserFriend userFriend = imUserFriendService.getDetail(userId, ClientEnum.TEACHER);
         if (Objects.isNull(userFriend)) {
             return failed("当前好友不存在");
         }
@@ -145,7 +145,7 @@ public class ImGroupController extends BaseController {
             userFriend.setFriendType(ClientEnum.STUDENT);
         }
 
-        return succeed(ImUserFriendVO.ImUserFriend.from(JSON.toJSONString(userFriend)));
+        return succeed(userFriend);
     }
 }
 

+ 2 - 2
cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/ImUserFriendController.java

@@ -91,7 +91,7 @@ public class ImUserFriendController extends BaseController {
             return failed("无效的用户ID");
         }
 
-        ImUserFriend userFriend = imUserFriendService.getDetail(userId, ClientEnum.STUDENT);
+        ImUserFriendVO.ImUserFriend userFriend = imUserFriendService.getDetail(userId, ClientEnum.STUDENT);
         if (Objects.isNull(userFriend)) {
             return failed("当前好友不存在");
         }
@@ -100,7 +100,7 @@ public class ImUserFriendController extends BaseController {
             userFriend.setFriendType(ClientEnum.TEACHER);
         }
 
-        return succeed(ImUserFriendVO.ImUserFriend.from(JSON.toJSONString(userFriend)));
+        return succeed(userFriend);
     }
 }
 

+ 38 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/MemberPriceSettingsController.java

@@ -6,11 +6,13 @@ import com.yonge.cooleshow.biz.dal.service.MemberPriceSettingsService;
 import com.yonge.cooleshow.biz.dal.service.SysConfigService;
 import com.yonge.cooleshow.biz.dal.vo.MemberPriceSettingsVo;
 import com.yonge.cooleshow.biz.dal.vo.MemberPriceVo;
+import com.yonge.cooleshow.biz.dal.wrapper.MemberPriceSettingsWrapper;
 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.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -43,10 +45,46 @@ public class MemberPriceSettingsController extends BaseController {
 	@PostMapping("/list")
 	@ApiOperation(value = "查询列表")
 	public HttpResponseResult<MemberPriceVo> list(@RequestBody MemberPriceSettingsSearch query) {
+		query.setStatus(true);
 		MemberPriceVo memberPriceVo = memberPriceSettingsService.getVipShare(query);
 		return succeed(memberPriceVo);
 	}
 
+
+
+    /**
+     * 查询单条
+     */
+    @GetMapping("/check/{id}")
+    @ApiOperation(value = "检查会员是否有效", notes = "传入id")
+    public HttpResponseResult<Boolean> check(@PathVariable("id") Long id) {
+        MemberPriceSettingsVo detail = memberPriceSettingsService.detail(id);
+        if (detail == null) {
+            return succeed(false);
+        }else if (Boolean.FALSE.equals(detail.getStatus())) {
+            return succeed(false);
+        }
+        return succeed(true);
+    }
+
+
+    /**
+     * 查询单条
+     */
+    @PostMapping("/checkChange")
+    @ApiOperation(value = "检查会员是否有效", notes = "传入id")
+    public HttpResponseResult<Boolean> checkChange(@RequestBody @Validated MemberPriceSettingsWrapper.MemberChange memberChange) {
+        MemberPriceSettingsVo detail = memberPriceSettingsService.detail(memberChange.getId());
+        if (detail == null) {
+            return succeed(false);
+        }else if (Boolean.FALSE.equals(detail.getStatus())) {
+            return succeed(false);
+        } else if (memberChange.getSalePrice() != null && memberChange.getSalePrice().compareTo(detail.getSalePrice()) !=0) {
+            return succeed(false);
+        }
+        return succeed(true);
+    }
+
 	@PostMapping("/vipPermissions")
 	@ApiOperation(value = "查询vip权限")
 	public HttpResponseResult<List<SysConfig>> vipPermissions() {

+ 40 - 2
cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/MusicSheetController.java

@@ -25,6 +25,7 @@ import com.yonge.cooleshow.biz.dal.vo.CheckVo;
 import com.yonge.cooleshow.biz.dal.vo.MusicAlbumVo;
 import com.yonge.cooleshow.biz.dal.vo.MusicSheetDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.MusicSheetVo;
+import com.yonge.cooleshow.biz.dal.wrapper.MusicSheetWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.music.MusicCompareWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
@@ -96,6 +97,27 @@ public class MusicSheetController extends BaseController {
         return succeed(musicSheetService.detail(id, sysUser, ClientEnum.STUDENT,tenantAlbumId));
     }
 
+
+
+    @GetMapping("/detailUse/{id}")
+    @ApiOperation(value = "是否可使用")
+    public HttpResponseResult<MusicSheetWrapper.MusicUse> detailUse(@ApiParam(value = "曲谱编号", required = true) @PathVariable("id") String id,
+                                                        @RequestParam(required = false) String tenantAlbumId) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null  || sysUser.getId() == null) {
+            sysUser = null;
+        }
+        MusicSheetDetailVo detail = musicSheetService.detail(id, sysUser, ClientEnum.STUDENT, tenantAlbumId);
+        if (detail == null) {
+            return failed("曲目不存在");
+        }
+
+        MusicSheetWrapper.MusicUse musicUse = new MusicSheetWrapper.MusicUse();
+        musicUse.setBuyed(detail.getBuyed());
+        musicUse.setPlay(detail.getPlay());
+        return succeed(musicUse);
+    }
+
     @ApiOperation(value = "曲目分页查询", httpMethod="POST", consumes="application/json", produces="application/json")
     @PostMapping(value="/list", consumes="application/json", produces="application/json")
     public HttpResponseResult<PageInfo<MusicSheetVo>> list(@RequestBody StudentMusicSheetSearch query) {
@@ -329,8 +351,24 @@ public class MusicSheetController extends BaseController {
     @ApiOperation(value = "关联的曲目列表")
     @GetMapping(value="/queryRelatedList")
     public HttpResponseResult<PageInfo<MusicSheetVo>> queryRelatedList(MusicSheetRelatedQueryInfo queryInfo) {
-    	
-    	IPage<MusicSheetVo> musicSheetVoIPage = musicSheetService.queryRelatedList(PageUtil.getPage(queryInfo),queryInfo.getAlbumId(), queryInfo.getMusicSheetId());
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null  || sysUser.getId() == null) {
+            return failed("用户信息获取失败");
+        }
+
+        Student student = studentService.getById(sysUser.getId());
+        if (student == null) {
+            return failed("用户信息获取失败");
+        }
+        // 如果是机构学生
+        IPage<MusicSheetVo> musicSheetVoIPage;
+        if (student.getTenantId() !=null && student.getTenantId()>0) {
+            queryInfo.setSubjectId(Long.parseLong(student.getSubjectId()));
+            musicSheetVoIPage =musicSheetService.queryTenantRelatedList(PageUtil.getPage(queryInfo),queryInfo);
+        } else {
+
+            musicSheetVoIPage = musicSheetService.queryRelatedList(PageUtil.getPage(queryInfo), queryInfo);
+        }
         return succeed(PageUtil.pageInfo(musicSheetVoIPage));
     }
 

+ 9 - 4
cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java

@@ -103,9 +103,10 @@ public class UserOrderController extends BaseController {
                 return HttpResponseResult.failed("下单失败");
             }
         } catch (BizException e) {
-            return HttpResponseResult.failed(e.getMessage());
+            log.error("下单失败", e);
+            throw e;
         } catch (Exception e) {
-            e.printStackTrace();
+            log.error("下单失败", e);
             return HttpResponseResult.failed("下单失败");
         }
     }
@@ -134,7 +135,8 @@ public class UserOrderController extends BaseController {
                 return HttpResponseResult.failed("付款失败");
             }
         } catch (BizException e) {
-            return HttpResponseResult.failed(e.getMessage());
+            log.error("下单失败", e);
+            throw e;
         } catch (Exception e) {
             e.printStackTrace();
             return HttpResponseResult.failed("付款失败");
@@ -157,7 +159,9 @@ public class UserOrderController extends BaseController {
     })
     public HttpResponseResult<UserOrderVo> getPendingOrder(@ApiIgnore @RequestBody OrderSearch query) {
         if (null == query.getGoodType()
-                || (!GoodTypeEnum.VIP.getCode().equals(query.getGoodType()) && null == query.getBizId())) {
+                || (!GoodTypeEnum.VIP.getCode().equals(query.getGoodType())
+            && !GoodTypeEnum.SVIP.getCode().equals(query.getGoodType())
+            && null == query.getBizId())) {
             return HttpResponseResult.failed("参数异常");
         }
         SysUser user = sysUserFeignService.queryUserInfo();
@@ -165,6 +169,7 @@ public class UserOrderController extends BaseController {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
         query.setUserId(user.getId());
+        query.setOrderClient(ClientEnum.STUDENT.name());
         return userOrderService.getPendingOrder(query);
     }
 

+ 10 - 28
cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/CourseCoursewareController.java

@@ -1,29 +1,22 @@
 package com.yonge.cooleshow.teacher.controller;
 
 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.CourseCoursewareSearch;
 import com.yonge.cooleshow.biz.dal.entity.CourseCourseware;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.service.CourseCoursewareService;
+import com.yonge.cooleshow.biz.dal.service.SysUserService;
 import com.yonge.cooleshow.biz.dal.vo.CourseCoursewareVo;
 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 com.yonge.toolset.base.util.StringUtil;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
+import javax.annotation.Resource;
 import javax.validation.Valid;
 import java.util.Date;
 
@@ -32,12 +25,11 @@ import java.util.Date;
 @Api(value = "课件表", tags = "课件表")
 public class CourseCoursewareController extends BaseController {
 
-	@Autowired
+	@Resource
 	private CourseCoursewareService courseCoursewareService;
 
-
-	@Autowired
-	private SysUserFeignService sysUserFeignService;
+	@Resource
+	private SysUserService sysUserService;
 
 	/**
 	 * 查询分页
@@ -45,12 +37,8 @@ public class CourseCoursewareController extends BaseController {
 	@PostMapping("/page")
 	@ApiOperation(value = "查询分页", notes = "传入courseCoursewareSearch")
 	public HttpResponseResult<PageInfo<CourseCoursewareVo>> page(@RequestBody CourseCoursewareSearch query) {
-		SysUser user = sysUserFeignService.queryUserInfo();
-		if (user == null) {
-			throw new BizException("请重新登录");
-		}
 		query.setClientType(ClientEnum.TEACHER);
-		query.setUserId(user.getId());
+		query.setUserId(sysUserService.getUserId());
 		IPage<CourseCoursewareVo> pages = courseCoursewareService.selectPage(PageUtil.getPage(query), query);
 		return succeed(PageUtil.pageInfo(pages));
 	}
@@ -61,14 +49,8 @@ public class CourseCoursewareController extends BaseController {
 	@PostMapping("/submit")
 	@ApiOperation(value = "新增或修改", notes = "传入courseCourseware")
 	public HttpResponseResult<CourseCourseware> submit(@Valid @RequestBody CourseCourseware courseCourseware) {
-
-		SysUser user = sysUserFeignService.queryUserInfo();
-		if (user == null) {
-			throw new BizException("请重新登录");
-		}
-
 		courseCourseware.setClientType(ClientEnum.TEACHER);
-		courseCourseware.setUserId(user.getId());
+		courseCourseware.setUserId(sysUserService.getUserId());
 		if (courseCourseware.getId() != null) {
 			courseCourseware.setUpdateTime(new Date());
 		} else {
@@ -84,7 +66,7 @@ public class CourseCoursewareController extends BaseController {
 	 */
 	@PostMapping("/remove/{id}")
 	@ApiOperation(value = "删除", notes = "传入id")
-	public HttpResponseResult remove(@PathVariable Long id ) {
+	public HttpResponseResult<Object> remove(@PathVariable Long id ) {
 		return status(courseCoursewareService.removeById(id));
 	}
 
@@ -94,7 +76,7 @@ public class CourseCoursewareController extends BaseController {
 	 */
 	@PostMapping("/remove")
 	@ApiOperation(value = "批量删除", notes = "传入id")
-	public HttpResponseResult remove(@RequestParam String ids ) {
+	public HttpResponseResult<Object> remove(@RequestParam String ids ) {
 		return status(courseCoursewareService.removeByIds(StringUtil.toLongList(ids)));
 	}
 }

+ 3 - 3
cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/ImGroupController.java

@@ -145,7 +145,7 @@ public class ImGroupController extends BaseController {
     @ApiOperation("获取群详情")
     @PostMapping(value = "/getDetail/{groupId}")
     public HttpResponseResult<ImGroup> getDetail(@ApiParam(value = "群编号", required = true) @PathVariable("groupId") String groupId) throws Exception {
-        ImGroup group = imGroupService.getById(groupId);
+        ImGroup group = imGroupService.getGroupById(groupId);
         if (group == null) {
             return failed(HttpStatus.NO_CONTENT, "群组不存在");
         }
@@ -195,7 +195,7 @@ public class ImGroupController extends BaseController {
             return failed("无效的用户ID");
         }
 
-        ImUserFriend userFriend = imUserFriendService.getDetail(userId, ClientEnum.TEACHER);
+        ImUserFriendVO.ImUserFriend userFriend = imUserFriendService.getDetail(userId, ClientEnum.TEACHER);
         if (Objects.isNull(userFriend)) {
             return failed("当前好友不存在");
         }
@@ -204,7 +204,7 @@ public class ImGroupController extends BaseController {
             userFriend.setFriendType(ClientEnum.STUDENT);
         }
 
-        return succeed(ImUserFriendVO.ImUserFriend.from(JSON.toJSONString(userFriend)));
+        return succeed(userFriend);
     }
 
     @ApiOperation(value = "转让群主", notes = "转让群主- 传入 ImGroupVo.ImGroupOwner")

+ 4 - 2
cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/ImUserFriendController.java

@@ -9,6 +9,7 @@ import com.yonge.cooleshow.biz.dal.service.ImGroupService;
 import com.yonge.cooleshow.biz.dal.service.ImUserFriendService;
 import com.yonge.cooleshow.biz.dal.service.SysUserService;
 import com.yonge.cooleshow.biz.dal.vo.im.ImUserFriendVO;
+import com.yonge.cooleshow.biz.dal.wrapper.VipCardRecordWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.im.ImUserWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
@@ -90,7 +91,7 @@ public class ImUserFriendController extends BaseController {
             return failed("无效的用户ID");
         }
 
-        ImUserFriend userFriend = imUserFriendService.getDetail(userId, ClientEnum.TEACHER);
+        ImUserFriendVO.ImUserFriend userFriend = imUserFriendService.getDetail(userId, ClientEnum.TEACHER);
         if (Objects.isNull(userFriend)) {
             return failed("当前好友不存在");
         }
@@ -99,7 +100,8 @@ public class ImUserFriendController extends BaseController {
             userFriend.setFriendType(ClientEnum.STUDENT);
         }
 
-        return succeed(ImUserFriendVO.ImUserFriend.from(JSON.toJSONString(userFriend)));
+
+        return succeed(userFriend);
     }
 
 }

+ 17 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/MemberPriceSettingsController.java

@@ -40,9 +40,26 @@ public class MemberPriceSettingsController extends BaseController {
 		return succeed(memberPriceSettingsService.detail(id)); 
 	}
 
+
+    /**
+     * 查询单条
+     */
+    @GetMapping("/check/{id}")
+    @ApiOperation(value = "检查会员是否有效", notes = "传入id")
+    public HttpResponseResult<Boolean> check(@PathVariable("id") Long id) {
+        MemberPriceSettingsVo detail = memberPriceSettingsService.detail(id);
+        if (detail == null) {
+            return succeed(false);
+        }else if (Boolean.FALSE.equals(detail.getStatus())) {
+            return succeed(false);
+        }
+        return succeed(true);
+    }
+
 	@PostMapping("/list")
 	@ApiOperation(value = "查询列表")
 	public HttpResponseResult<MemberPriceVo> list(@RequestBody MemberPriceSettingsSearch query) {
+		query.setStatus(true);
 		MemberPriceVo memberPriceVo = memberPriceSettingsService.getVipShare(query);
 		return succeed(memberPriceVo);
 	}

+ 22 - 1
cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/MusicSheetController.java

@@ -23,6 +23,7 @@ import com.yonge.cooleshow.biz.dal.service.cbs.CbsMusicScoreService;
 import com.yonge.cooleshow.biz.dal.vo.MusicSheetDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.MusicSheetShareVo;
 import com.yonge.cooleshow.biz.dal.vo.MusicSheetVo;
+import com.yonge.cooleshow.biz.dal.wrapper.MusicSheetWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.EStatus;
@@ -89,6 +90,26 @@ public class MusicSheetController extends BaseController {
         return succeed(detail);
     }
 
+
+    @GetMapping("/detailUse/{id}")
+    @ApiOperation(value = "是否可使用")
+    public HttpResponseResult<MusicSheetWrapper.MusicUse> detailUse(@ApiParam(value = "曲谱编号", required = true) @PathVariable("id") String id,
+                                                                    @RequestParam(required = false) String tenantAlbumId) {
+        SysUser sysUser = sysUserService.getUser();
+        if (sysUser == null  || sysUser.getId() == null) {
+            sysUser = null;
+        }
+        MusicSheetDetailVo detail = musicSheetService.detail(id, sysUser, ClientEnum.TEACHER, tenantAlbumId);
+        if (detail == null) {
+            return failed("曲目不存在");
+        }
+
+        MusicSheetWrapper.MusicUse musicUse = new MusicSheetWrapper.MusicUse();
+        musicUse.setBuyed(detail.getBuyed());
+        musicUse.setPlay(detail.getPlay());
+        return succeed(musicUse);
+    }
+
     @ApiOperation(value = "修改", httpMethod="POST", consumes="application/json", produces="application/json")
     @PostMapping(value="/updateRenderFile", consumes="application/json", produces="application/json")
     public HttpResponseResult<Object> updateRenderFile(@Valid @RequestBody MusicSheetRenderDto musicSheetRenderDto) {
@@ -238,7 +259,7 @@ public class MusicSheetController extends BaseController {
     @GetMapping(value="/queryRelatedList")
     public HttpResponseResult<PageInfo<MusicSheetVo>> queryRelatedList(MusicSheetRelatedQueryInfo queryInfo) {
     	
-    	IPage<MusicSheetVo> musicSheetVoIPage = musicSheetService.queryRelatedList(PageUtil.getPage(queryInfo),queryInfo.getAlbumId(), queryInfo.getMusicSheetId());
+    	IPage<MusicSheetVo> musicSheetVoIPage = musicSheetService.queryRelatedList(PageUtil.getPage(queryInfo),queryInfo);
         return succeed(PageUtil.pageInfo(musicSheetVoIPage));
     }
 

+ 25 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/StudentController.java

@@ -5,10 +5,12 @@ import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentSearch;
 import com.yonge.cooleshow.biz.dal.entity.Student;
+import com.yonge.cooleshow.biz.dal.entity.Teacher;
 import com.yonge.cooleshow.biz.dal.entity.TenantGroup;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.service.ImGroupService;
 import com.yonge.cooleshow.biz.dal.service.StudentService;
+import com.yonge.cooleshow.biz.dal.service.TeacherService;
 import com.yonge.cooleshow.biz.dal.service.TenantGroupService;
 import com.yonge.cooleshow.biz.dal.vo.StudentVo;
 import com.yonge.cooleshow.common.controller.BaseController;
@@ -16,15 +18,20 @@ import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.UserLockFlag;
 import com.yonge.cooleshow.common.enums.UserStatusEnum;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.base.util.StringUtil;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -53,6 +60,9 @@ public class StudentController extends BaseController {
     @Autowired
     private TenantGroupService tenantGroupService;
 
+    @Autowired
+    private TeacherService teacherService;
+
 
     @ApiOperation(value = "查询指定学员信息-融云token")
     @GetMapping("/queryUserById")
@@ -75,6 +85,21 @@ public class StudentController extends BaseController {
         return succeed(studentService.detail(userId));
     }
 
+    @GetMapping("/detail/{id}")
+    public HttpResponseResult<StudentVo> detail(@PathVariable("id") Long id) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        Teacher teacher = teacherService.getById(user.getId());
+        if (Boolean.FALSE.equals(teacher.getCustomerService())) {
+            throw new BizException("权限不足");
+        }
+        StudentVo detail = studentService.detail(id);
+        if (detail != null && detail.getTenantGroupId() != null) {
+            TenantGroup group = tenantGroupService.getById(detail.getTenantGroupId());
+            detail.setTenantGroupName(group == null ? "" : group.getName());
+        }
+        return succeed(detail);
+    }
+
     /**
      * 查询老师所属机构下所有的学生
      *

+ 28 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherController.java

@@ -7,8 +7,10 @@ import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.TeacherDto;
 import com.yonge.cooleshow.biz.dal.entity.Subject;
 import com.yonge.cooleshow.biz.dal.entity.Teacher;
+import com.yonge.cooleshow.biz.dal.entity.TeacherStyleVideo;
 import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
 import com.yonge.cooleshow.biz.dal.entity.TenantUnbindRecord;
+import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.service.SmsCodeService;
 import com.yonge.cooleshow.biz.dal.service.SubjectService;
@@ -30,13 +32,18 @@ import com.yonge.toolset.base.util.StringUtil;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.toolset.utils.idcard.IdcardInfoExtractor;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.util.CollectionUtils;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -83,6 +90,27 @@ public class TeacherController extends BaseController {
         return teacherService.queryUserInfo(user.getId());
     }
 
+
+    /**
+     * 查询单条
+     */
+    @GetMapping("/detail/{id}")
+    public HttpResponseResult<TeacherVo> detail(@PathVariable("id") Long userId) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        Teacher teacher = teacherService.getById(user.getId());
+        if (Boolean.FALSE.equals(teacher.getCustomerService())) {
+            throw new BizException("权限不足");
+        }
+
+        TeacherVo detail = teacherService.findTeacherDetailInfo(userId);
+        if (null != detail && !CollectionUtils.isEmpty(detail.getStyleVideo())) {
+            List<TeacherStyleVideo> styleVideo = detail.getStyleVideo();
+            List<TeacherStyleVideo> collect = styleVideo.stream().filter(o -> AuthStatusEnum.PASS.equals(o.getAuthStatus())).collect(Collectors.toList());
+            detail.setStyleVideo(collect);
+        }
+        return succeed(detail);
+    }
+
     @ApiOperation(value = "开通直播")
     @GetMapping("/openLive")
     public HttpResponseResult<Boolean> openLive() {

+ 2 - 2
cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherCourseScheduleController.java

@@ -215,8 +215,8 @@ public class TeacherCourseScheduleController extends BaseController {
         if (user == null || null == user.getId()) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
-        courseScheduleService.arrangeCourse(arrangeCourseVo, user.getId());
-        return succeed();
+        String message = courseScheduleService.arrangeCourse(arrangeCourseVo, user.getId());
+        return succeed(message);
     }
 
     @ApiOperation("根据月份查询消耗时长")

+ 33 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/UserOrderController.java

@@ -12,6 +12,7 @@ import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
 import com.yonge.cooleshow.biz.dal.entity.UserOrder;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.TenantStaffService;
 import com.yonge.cooleshow.biz.dal.service.UserOrderService;
 import com.yonge.cooleshow.biz.dal.service.UserPaymentCoreService;
@@ -137,6 +138,38 @@ public class UserOrderController extends BaseController {
         }
     }
 
+
+    @ApiOperation(value = "通过业务id查询用户正在交易中的订单")
+    @PostMapping("/getPendingOrder")
+    @ApiImplicitParams({
+        @ApiImplicitParam(
+            name = "goodType",
+            value = "订单类型:  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ACTI_REGIST、活动报名",
+            paramType = "query", dataType = "String", required = true
+        ),
+        @ApiImplicitParam(
+            name = "bizId",
+            value = "业务id 直播课、陪练课购买为课程组id;陪练课为老师id;单曲点播传曲子id",
+            paramType = "query", dataType = "Long"
+        )
+    })
+    public HttpResponseResult<UserOrderVo> getPendingOrder(@ApiIgnore @RequestBody OrderSearch query) {
+        if (null == query.getGoodType()
+            || (!GoodTypeEnum.VIP.getCode().equals(query.getGoodType())
+            && !GoodTypeEnum.SVIP.getCode().equals(query.getGoodType())
+            && null == query.getBizId())) {
+            return HttpResponseResult.failed("参数异常");
+        }
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        query.setUserId(user.getId());
+        query.setOrderClient(ClientEnum.TEACHER.name());
+        return userOrderService.getPendingOrder(query);
+    }
+
+
     @ApiOperation(value = "取消订单")
     @PostMapping("/orderCancel")
     @ApiImplicitParams({

+ 1 - 1
cooleshow-app/src/main/java/com/yonge/cooleshow/website/controller/MusicSheetController.java

@@ -177,7 +177,7 @@ public class MusicSheetController extends BaseController {
     @GetMapping(value="/queryRelatedList")
     public HttpResponseResult<PageInfo<MusicSheetVo>> queryRelatedList(MusicSheetRelatedQueryInfo queryInfo) {
     	
-    	IPage<MusicSheetVo> musicSheetVoIPage = musicSheetService.queryRelatedList(PageUtil.getPage(queryInfo),queryInfo.getAlbumId(), queryInfo.getMusicSheetId());
+    	IPage<MusicSheetVo> musicSheetVoIPage = musicSheetService.queryRelatedList(PageUtil.getPage(queryInfo), queryInfo);
         return succeed(PageUtil.pageInfo(musicSheetVoIPage));
     }
 }

+ 3 - 2
cooleshow-app/src/main/java/com/yonge/cooleshow/website/controller/WebCourseScheduleController.java

@@ -23,6 +23,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.validation.annotation.Validated;
@@ -211,8 +212,8 @@ public class WebCourseScheduleController extends BaseController {
         if (user == null || null == user.getId()) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
-        courseScheduleService.arrangeCourse(arrangeCourseVo, user.getId());
-        return succeed();
+        String message = courseScheduleService.arrangeCourse(arrangeCourseVo, user.getId());
+        return succeed(message);
     }
 
     @ApiOperation("根据月份查询消耗时长")

+ 2 - 2
cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/config/CustomerServiceConfig.java

@@ -16,8 +16,8 @@ import java.io.Serializable;
 @Component
 public class CustomerServiceConfig implements Serializable {
 
-    @Value("${app.customer.service:17740683946}")
-    private String customerService;
+//    @Value("${app.customer.service:17740683946}")
+//    private String customerService;
     @Value("${app.customer.message:}")
     private String customerMessage;
     @Value("${app.customer.title:}")

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

@@ -185,4 +185,7 @@ public interface SysUserDao extends BaseDAO<Long, SysUser> {
     void updateStudentHideFlag(@Param("userId") Long userId, @Param("hideFlag") int hideFlag);
 
     void updateAvatar(@Param("clientId") String clientId, @Param("avatar") String avatar,@Param("id") Long id);
+
+    SysUser getCustomerServiceByFriendLeast();
+
 }

+ 5 - 13
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/SysUserServiceImpl.java

@@ -3,6 +3,7 @@ package com.yonge.cooleshow.auth.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.google.common.collect.Lists;
 import com.yonge.cooleshow.api.feign.AdminFeignService;
+import com.yonge.cooleshow.api.feign.TeacherFeignService;
 import com.yonge.cooleshow.api.feign.dto.UserFriendInfoVO;
 import com.yonge.cooleshow.auth.api.dto.QRLoginDto;
 import com.yonge.cooleshow.auth.api.dto.RealnameAuthReq;
@@ -218,24 +219,15 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
 
             ThreadPool.getExecutor().submit(() -> {
 
-                String customerService = customerServiceConfig.getCustomerService();
-                if (StringUtils.isNotEmpty(customerService)) {
-
-                    List<String> collect = Arrays.stream(customerService.split(",")).collect(Collectors.toList());
-
-                    Random rand = new Random();
-                    String mobile = collect.get(rand.nextInt(collect.size()));
-
-                    // 系统客服好友
-                    SysUser friend = sysUserDao.queryByPhone(mobile);
-
+                SysUser customerService = sysUserDao.getCustomerServiceByFriendLeast();
+                if (customerService != null) {
                     // 发送添加系统客服好友消息
                     HttpResponseResult<Boolean> result = adminFeignService.customerService(UserFriendInfoVO.builder()
                             .userId(sysUser.getId())
                             .clientType(clientType)
-                            .friendIds(Lists.newArrayList(friend.getId()))
+                            .friendIds(Lists.newArrayList(customerService.getId()))
                             .build());
-                    log.info("sendSysCustomerServiceFriendMessage mobile={}, ret={}", mobile, JSON.toJSONString(result));
+                    log.info("sendSysCustomerServiceFriendMessage mobile={}, ret={}", customerService.getPhone(), JSON.toJSONString(result));
                 }
 
             });

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

@@ -382,4 +382,27 @@
             update sys_user set avatar_ = #{avatar} where id_ = #{id}
         </if>
     </update>
+
+    <select id="getCustomerServiceByFriendLeast" resultMap="SysUser">
+        select m.*
+        from (SELECT te.user_id_,
+                     count(k.user_id_) friends
+              from teacher te
+                       left join sys_user su on te.user_id_ = su.id_
+                       left join (select s.user_id_, s.customer_id_
+                                  from student s
+                                  where s.customer_id_ is not null
+                                  union all
+                                  select te.user_id_, te.customer_id_
+                                  from teacher te
+                                  where te.customer_service_ = 0 and te.customer_id_ is not null) k on te.user_id_ = k.customer_id_
+              where te.lock_flag_ = 0
+                and te.customer_service_ = 1
+                and su.del_flag_ = 0
+                and su.lock_flag_ = 0
+              group by te.user_id_
+              order by friends
+              limit 1) t
+                 left join sys_user m on m.id_ = t.user_id_
+    </select>
 </mapper>

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

@@ -110,6 +110,7 @@ public interface SysConfigConstant {
      * @updateTime 2022/4/20 11:43
      */
     String GOOD_LOGO_VIP = "good_logo_vip";
+    String GOOD_LOGO_SVIP = "good_logo_svip";
     /***
      * 商品视频课图片
      * @author liweifan
@@ -429,4 +430,24 @@ public interface SysConfigConstant {
      * 草稿保存时长
      */
     String USER_MUSIC_DRAFT_TIME = "user_music_draft_time";
+
+    /**
+     * 添加客服好友时,客服发送消息
+     */
+    String CUSTOMER_SERVICE_ADD_MSG = "customer_service_add_msg";
+
+    /**
+     * 添加客服好友时,客服发送消息标题
+     */
+    String CUSTOMER_SERVICE_ADD_MSG_TITLE = "customer_service_add_msg_title";
+
+    /**
+     * 群成员人数限制
+     */
+    String GROUP_MEMBER_LIMIT = "group_member_limit";
+
+    /**
+     * 消息发送频率限制
+     */
+    String MESSAGE_SEND_LIMIT = "message_send_limit";
 }

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

@@ -13,6 +13,7 @@ public enum RewardTypeEnum implements BaseEnum<String, RewardTypeEnum> {
 
     ACTUAL("实物"),
     VIP("小酷AI会员"),
+    SVIP("小酷AISVIP会员"),
     PIANO_ROOM("琴房时长"),
     COUPON("优惠券"),
     ;

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

@@ -22,6 +22,7 @@ public enum UnitEnum implements BaseEnum<String, UnitEnum> {
 //    YEAR("年"),
     QUARTERLY("季度"),
     YEAR_HALF("半年"),
+    PERPETUAL("永久"),
     ;
 
     @EnumValue

+ 1 - 0
cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/payment/EPaymentType.java

@@ -10,6 +10,7 @@ import lombok.Getter;
 public enum EPaymentType {
 
     VIP("开通会员"),
+    SVIP("开通会员 SVIP"),
     PRACTICE("陪练课购买"),
     LIVE("直播课购买"),
     VIDEO("视频课购买"),

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

@@ -15,17 +15,17 @@ import java.util.List;
  */
 public interface CourseScheduleStudentMusicSheetDao extends BaseMapper<CourseScheduleStudentMusicSheet> {
 
-    List<CourseScheduleStudentMusicSheetResult> queryBySheetIdAndCourseId(@Param("musicSheetAccompanimentId") Long musicSheetAccompanimentId,
+    List<CourseScheduleStudentMusicSheetResult> queryBySheetIdAndCourseId(@Param("musicSheetAccompanimentId") String musicSheetAccompanimentId,
                                                                           @Param("courseId") Long courseId,
                                                                           @Param("userId") Long userId,
                                                                           @Param("downStatus") Integer downStatus,
                                                                           @Param("userType") Integer userType);
     //开启原音播放
     void openPlayStatus(@Param("scheduleId") Long scheduleId,
-                       @Param("musicSheetAccompanimentId") Integer musicSheetAccompanimentId,
+                       @Param("musicSheetAccompanimentId") String musicSheetAccompanimentId,
                        @Param("userId") Long userId);
     void openAccompanimentPlayStatus(@Param("scheduleId") Long scheduleId,
-                                    @Param("musicSheetAccompanimentId") Integer musicSheetAccompanimentId,
+                                    @Param("musicSheetAccompanimentId") String musicSheetAccompanimentId,
                                     @Param("userId") Long userId);
     //关闭伴奏
     void closePlayStatus(@Param("courseId") Long courseId,@Param("userId") Long userId);

+ 13 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleStudentPaymentDao.java

@@ -30,7 +30,7 @@ public interface CourseScheduleStudentPaymentDao extends BaseMapper<CourseSchedu
      * @author zx
      * @date 2022/3/23 16:18
      */
-    Set<Long> queryStudentIds(@Param("courseGroupId") Long courseGroupId,
+    List<Long> queryStudentIds(@Param("courseGroupId") Long courseGroupId,
                               @Param("courseGroupType") String courseGroupType);
 
     /**
@@ -87,5 +87,17 @@ public interface CourseScheduleStudentPaymentDao extends BaseMapper<CourseSchedu
     List<CourseScheduleStudentVo> selectUser();
 
     List<BasicUserInfoDto> queryNoJoinStu(@Param("scheduleId") String scheduleId, @Param("studentIds") List<String> studentIds);
+
+    /**
+     * 更新用户入群状态
+     * @param courseGroupId 课程组id
+     * @param courseGroupType 课程组类型
+     * @param groupJoin 入群状态
+     * @param studentIds 学员id
+     */
+    void updateGroupJoinStatus(@Param("courseGroupId") Long courseGroupId,
+                               @Param("courseGroupType") String courseGroupType,
+                               @Param("groupJoin") Boolean groupJoin,
+                               @Param("studentIds") List<Long> studentIds);
 }
 

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

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.yonge.cooleshow.biz.dal.entity.ImUserFriend;
+import com.yonge.cooleshow.biz.dal.enums.im.EImUserFriendSourceForm;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -23,5 +24,7 @@ public interface ImUserFriendDao extends BaseMapper<ImUserFriend> {
 
     void delStudentFriendByTenantId(@Param("tenantId") Long tenantId,@Param("userId") Long userId ,
                                     @Param("clientType") String clientType);
+
+    List<ImUserFriend> queryExistCustomerServiceFriend(@Param("userIds") String userIds, @Param("clientType") String clientType);
 }
 

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

@@ -213,4 +213,6 @@ public interface MusicSheetDao extends BaseMapper<MusicSheet> {
     MusicSheet get(Long id);
 
     IPage<MusicSheet> selectSyncPage(Page<Object> objectPage);
+
+    IPage<MusicSheetVo> queryTenantRelatedList(@Param("page") IPage<Object> page, @Param("queryInfo") MusicSheetRelatedQueryInfo queryInfo);
 }

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/StudentDao.java

@@ -82,4 +82,5 @@ public interface StudentDao extends BaseMapper<Student> {
     Integer queryStudentCounts(@Param("id") Long id);
 
     List<StudentWrapper.UserCount> countStudentByTenantGroupIds(@Param("tenantId") Long tenantId, @Param("groupIdList") List<Long> groupIdList);
+
 }

+ 5 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/TeacherDao.java

@@ -16,6 +16,7 @@ import com.yonge.cooleshow.biz.dal.vo.TeacherVo;
 
 import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantInfoWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.teacher.TeacherWrapper;
 import org.apache.ibatis.annotations.Param;
 
 public interface TeacherDao extends BaseMapper<Teacher> {
@@ -115,4 +116,8 @@ public interface TeacherDao extends BaseMapper<Teacher> {
     List<TenantInfoWrapper.UserCount> countTeacherByTenantIds(@Param("tenantIdList") List<Long> tenantIdList);
 
     Integer queryTeacherCounts(@Param("id") Long id);
+
+    Teacher getCustomerServiceByFriendLeast();
+
+    List<TeacherWrapper.TeacherFriend> getCustomerServiceFriendNums();
 }

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

@@ -7,6 +7,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.biz.dal.dto.search.VipRecordSearch;
 import com.yonge.cooleshow.biz.dal.entity.MemberPriceSettings;
 import com.yonge.cooleshow.biz.dal.vo.VipRecordVo;
+import com.yonge.cooleshow.biz.dal.wrapper.StudentWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.VipCardRecordWrapper;
 import org.apache.ibatis.annotations.Param;
 import com.yonge.cooleshow.biz.dal.entity.VipCardRecord;
 import com.yonge.cooleshow.biz.dal.vo.VipCardRecordVo;
@@ -58,4 +60,6 @@ public interface VipCardRecordDao extends BaseMapper<VipCardRecord> {
      * @return
      */
     IPage<VipRecordVo> selectVipRecord(@Param("page") IPage<VipRecordVo> page, @Param("param") VipRecordSearch param);
+
+    List<VipCardRecordWrapper.UserVipInfo> queryUserVipInfo(@Param("userIdList") List<Long> userIdList ,@Param("clientType") String clientType);
 }

+ 8 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/BasicUserInfo.java

@@ -3,6 +3,8 @@ package com.yonge.cooleshow.biz.dal.dto;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.util.Date;
+
 /**
 * @description: 用户基本信息
 * @author zx
@@ -27,4 +29,10 @@ public class BasicUserInfo {
 
     @ApiModelProperty("手机号")
     private String phone;
+
+    @ApiModelProperty("性别")
+    private Integer gender;
+
+    @ApiModelProperty("生日")
+    private Date birthdate;
 }

+ 2 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkDeviceControlDto.java

@@ -26,10 +26,10 @@ public class ImNetworkDeviceControlDto {
 	private Integer status;
 
 	@ApiModelProperty(value = "原音",required = true)
-	private Integer musicSheetId;
+	private String musicSheetId;
 
 	@ApiModelProperty(value = "伴奏",required = true)
-	private Integer musicScoreAccompanimentId;
+	private String musicScoreAccompanimentId;
 
 	@ApiModelProperty(value = "伴奏音量",required = true)
 	private Integer soundVolume = 100;

+ 3 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkDeviceStateChangedMessage.java

@@ -6,7 +6,7 @@ import com.yonge.cooleshow.biz.dal.entity.BaseMessage;
 public class ImNetworkDeviceStateChangedMessage extends BaseMessage {
     private boolean enable;
     private int type;
-    private Integer musicSheetAccompanimentId;
+    private String musicSheetAccompanimentId;
     private String userId;
     private String userName;
     private Integer soundVolume = 100;
@@ -32,11 +32,11 @@ public class ImNetworkDeviceStateChangedMessage extends BaseMessage {
         this.type = type;
     }
 
-    public Integer getMusicSheetAccompanimentId() {
+    public String getMusicSheetAccompanimentId() {
         return musicSheetAccompanimentId;
     }
 
-    public void setMusicSheetAccompanimentId(Integer musicSheetAccompanimentId) {
+    public void setMusicSheetAccompanimentId(String musicSheetAccompanimentId) {
         this.musicSheetAccompanimentId = musicSheetAccompanimentId;
     }
 

+ 3 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkMusicSheetDownloadMessageContent.java

@@ -9,11 +9,11 @@ import org.apache.commons.lang3.builder.ToStringBuilder;
 public class ImNetworkMusicSheetDownloadMessageContent{
     //伴奏编号
     @ApiModelProperty(value = "伴奏编号")
-    private Integer id;
+    private String id;
 
     //曲目编号
     @ApiModelProperty(value = "曲目编号")
-    private Integer examSongId;
+    private String examSongId;
 
     //声部
     @ApiModelProperty(value = "声部")
@@ -29,7 +29,7 @@ public class ImNetworkMusicSheetDownloadMessageContent{
 
     //速度
     @ApiModelProperty(value = "速度")
-    private Integer speed;
+    private String speed;
 
     //xmlUrl
     @ApiModelProperty(value = "xmlUrl")

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkMusicSheetDto.java

@@ -7,7 +7,7 @@ import lombok.Data;
 public class ImNetworkMusicSheetDto extends ImNetworkBaseDto{
 
     @ApiModelProperty(value = "伴奏编号",required = true)
-    private Long musicScoreAccompanimentId;
+    private String musicScoreAccompanimentId;
 
     @ApiModelProperty(value = "伴奏下载状态(1下载成功0下载中2下载失败)",required = true)
     private Integer status;

+ 44 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderReq.java

@@ -32,7 +32,7 @@ public class OrderReq {
     @ApiModelProperty(value = "订单名称 ", required = true)
     private String orderName;
     @NotNull(message = "订单类型不能为空")
-    @ApiModelProperty(value = "订单类型: 学生端( VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ACTI_REGIST、活动报名 ) 老师端(VIP、开通会员 PIANO_ROOM、琴房时长 ACTI_REGIST 活动报名)", required = true)
+    @ApiModelProperty(value = "订单类型: 学生端( VIP、开通会员  SVIP:SVIP PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ACTI_REGIST、活动报名 ) 老师端(VIP、开通会员 PIANO_ROOM、琴房时长 ACTI_REGIST 活动报名)", required = true)
     private OrderTypeEnum orderType;
     @ApiModelProperty(value = "订单描述信息 ")
     private String orderDesc;
@@ -71,10 +71,21 @@ public class OrderReq {
         private GoodTypeEnum goodType;
         @ApiModelProperty("商品名称 ")
         private String goodName;
+
+        @ApiModelProperty(value = "下单客户端 ",hidden = true)
+        private ClientEnum orderClient;
+        @ApiModelProperty(value = "vip剩余天数")
+        private Integer vipEndDays;
+
+        @ApiModelProperty(value = "商品数量")
+        private Integer goodsNum = 1;
+
         @ApiModelProperty(value = "优惠券id")
         private Long couponId;
         @ApiModelProperty(value = "业务内容")
         private Object bizContent;
+        @ApiModelProperty(value = "业务价格")
+        private BigDecimal bizPrice;
         @ApiModelProperty(value = "调用业务创建方法返回", hidden = true)
         private OrderCreateRes createRes;
         @ApiModelProperty(value = "订单金额", required = true)
@@ -85,6 +96,38 @@ public class OrderReq {
         // 透传订单类型
         private OrderTypeEnum orderType;
 
+        public BigDecimal getBizPrice() {
+            return bizPrice;
+        }
+
+        public void setBizPrice(BigDecimal bizPrice) {
+            this.bizPrice = bizPrice;
+        }
+
+        public Integer getGoodsNum() {
+            return goodsNum;
+        }
+
+        public void setGoodsNum(Integer goodsNum) {
+            this.goodsNum = goodsNum;
+        }
+
+        public ClientEnum getOrderClient() {
+            return orderClient;
+        }
+
+        public void setOrderClient(ClientEnum orderClient) {
+            this.orderClient = orderClient;
+        }
+
+        public Integer getVipEndDays() {
+            return vipEndDays;
+        }
+
+        public void setVipEndDays(Integer vipEndDays) {
+            this.vipEndDays = vipEndDays;
+        }
+
         public BigDecimal getActualPrice() {
             return actualPrice;
         }

+ 3 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/TeacherSubmitReq.java

@@ -65,6 +65,9 @@ public class TeacherSubmitReq implements Serializable {
     @ApiModelProperty(value = "后台修改人",hidden = true)
     private Long updateBy;
 
+    @ApiModelProperty("是否客服")
+    private Boolean customerService;
+
     public Long getUserId() {
         return userId;
     }

+ 7 - 13
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MemberPriceSettingsSearch.java

@@ -1,13 +1,16 @@
 package com.yonge.cooleshow.biz.dal.dto.search;
 
+import com.yonge.cooleshow.biz.dal.enums.EVipType;
 import com.yonge.toolset.base.page.QueryInfo;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 /**
  * @Author: liweifan
  * @Data: 2022-04-25 14:34:49
  */
+@Data
 @ApiModel(value = "MemberPriceSettingsSearch对象", description = "查询对象")
 public class MemberPriceSettingsSearch extends QueryInfo{
 	private static final long serialVersionUID = 1L;
@@ -18,19 +21,10 @@ public class MemberPriceSettingsSearch extends QueryInfo{
 	@ApiModelProperty("活动id")
 	private Long  activityId;
 
-	public Long getActivityId() {
-		return activityId;
-	}
+	@ApiModelProperty("true:启用,false:停用")
+	private Boolean status;
 
-	public void setActivityId(Long activityId) {
-		this.activityId = activityId;
-	}
+	@ApiModelProperty("VIP,SVIP")
+	private EVipType vipType;
 
-	public Long getUserId() {
-		return userId;
-	}
-
-	public void setUserId(Long userId) {
-		this.userId = userId;
-	}
 }

+ 22 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MusicSheetRelatedQueryInfo.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.dto.search;
 
+import com.yonge.cooleshow.biz.dal.enums.MusicSheetTypeEnum;
 import com.yonge.toolset.base.page.QueryInfo;
 
 public class MusicSheetRelatedQueryInfo extends QueryInfo {
@@ -8,7 +9,27 @@ public class MusicSheetRelatedQueryInfo extends QueryInfo {
 	
 	private Long musicSheetId;
 
-	public Long getAlbumId() {
+    private Long subjectId;
+
+    private MusicSheetTypeEnum musicSheetType;
+
+    public MusicSheetTypeEnum getMusicSheetType() {
+        return musicSheetType;
+    }
+
+    public void setMusicSheetType(MusicSheetTypeEnum musicSheetType) {
+        this.musicSheetType = musicSheetType;
+    }
+
+    public Long getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Long subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public Long getAlbumId() {
 		return albumId;
 	}
 

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

@@ -106,6 +106,29 @@ public class MusicSheetSearch  extends QueryInfo{
     @ApiModelProperty("指定关联专辑的曲目排在最后")
     private Long sortByAlbumIdDesc;
 
+
+    @ApiModelProperty(value = "不包含曲目ID",hidden = true)
+    private List<Long> excludeMusicIds;
+
+    @ApiModelProperty(value = "必须要匹配声部ID")
+    private List<Long> mustMatchSubjectIds;
+
+    public List<Long> getExcludeMusicIds() {
+        return excludeMusicIds;
+    }
+
+    public void setExcludeMusicIds(List<Long> excludeMusicIds) {
+        this.excludeMusicIds = excludeMusicIds;
+    }
+
+    public List<Long> getMustMatchSubjectIds() {
+        return mustMatchSubjectIds;
+    }
+
+    public void setMustMatchSubjectIds(List<Long> mustMatchSubjectIds) {
+        this.mustMatchSubjectIds = mustMatchSubjectIds;
+    }
+
     @ApiModelProperty("谱面类型")
     private String scoreType;
 

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/OrderSearch.java

@@ -22,7 +22,7 @@ public class OrderSearch extends QueryInfo{
 	@ApiModelProperty("下单应用:STUDENT 学生端 TEACHER 老师端")
 	private String orderClient;
 
-	@ApiModelProperty("交易类型:  VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ACTI_REGIST、活动报名(多选用,分割)")
+	@ApiModelProperty("交易类型:  VIP、开通会员  SVIP、开通会员 PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ACTI_REGIST、活动报名(多选用,分割)")
 	private String orderType;
 
 	@ApiModelProperty("订单状态 WAIT_PAY 待支付 PAYING 支付中  PAID 已付款 CLOSE 已关闭 FAIL 支付失败 (多选用,分割)")

+ 13 - 9
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/StudentSearch.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.dto.search;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.yonge.cooleshow.biz.dal.enums.EUserVipType;
 import com.yonge.cooleshow.biz.dal.enums.GenderEnum;
 import com.yonge.cooleshow.common.enums.UserLockFlag;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
@@ -31,8 +32,8 @@ public class StudentSearch extends QueryInfo{
     @ApiModelProperty(value = "0-正常, 1-锁定")
     private UserLockFlag lockFlag;
     private YesOrNoEnum delFlag;
-    @ApiModelProperty(value = "是否会员 0否 1是")
-    private YesOrNoEnum isVip;
+//    @ApiModelProperty(value = "是否会员 0否 1是")
+//    private YesOrNoEnum isVip;
 
     @ApiModelProperty(value = "是否练习 0否 1是")
     private YesOrNoEnum trainFlag;
@@ -80,6 +81,9 @@ public class StudentSearch extends QueryInfo{
     @ApiModelProperty("机构购买专辑的购买记录ID")
     private Long tenantAlbumPurchaseId;
 
+    @ApiModelProperty("用户会员类型")
+    private EUserVipType vipType;
+
     @ApiModelProperty(value = "手机号码列表", hidden = true)
     private List<String> phoneList = new ArrayList<>();
 
@@ -138,13 +142,13 @@ public class StudentSearch extends QueryInfo{
         this.lockFlag = lockFlag;
     }
 
-    public YesOrNoEnum getIsVip() {
-        return isVip;
-    }
-
-    public void setIsVip(Integer isVip) {
-        this.isVip = YesOrNoEnum.valueOf(isVip);
-    }
+//    public YesOrNoEnum getIsVip() {
+//        return isVip;
+//    }
+//
+//    public void setIsVip(Integer isVip) {
+//        this.isVip = YesOrNoEnum.valueOf(isVip);
+//    }
 
     public Date getStartTime() {
         return startTime;

+ 9 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/TeacherSearch.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.dto.search;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.yonge.cooleshow.biz.dal.enums.EUserVipType;
 import com.yonge.cooleshow.common.enums.ESettlementFrom;
 import com.yonge.cooleshow.common.enums.UserLockFlag;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
@@ -32,8 +33,8 @@ public class TeacherSearch extends QueryInfo{
     
     private YesOrNoEnum delFlag;
     
-    @ApiModelProperty(value = "是否会员(0-否 1-是)")
-    private Integer isVip;
+//    @ApiModelProperty(value = "是否会员(0-否 1-是)")
+//    private Integer isVip;
     
     @ApiModelProperty("用户状态")
     private String userStatus;
@@ -78,6 +79,12 @@ public class TeacherSearch extends QueryInfo{
 	@ApiModelProperty("老师ID")
 	private Long userId;
 
+	@ApiModelProperty("用户会员类型")
+	private EUserVipType vipType;
+
+	@ApiModelProperty("是否客服")
+	private Boolean customerService;
+
 	@ApiModelProperty(value = "排序方式, 默认 create_time_ desc", hidden = true)
 	private String orderBy;
 	public YesOrNoEnum getTrainFlag() {

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

@@ -3,6 +3,7 @@ package com.yonge.cooleshow.biz.dal.dto.search;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.EVipType;
 import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
 import com.yonge.toolset.base.page.QueryInfo;
 import io.swagger.annotations.ApiModel;
@@ -45,6 +46,12 @@ public class VipRecordSearch extends QueryInfo {
     @ApiModelProperty("来源类型 : ACTIVITY :活动 ,ORDER:订单 PLATFORM:平台")
     private SourceTypeEnum sourceType;
 
+    @ApiModelProperty(value = "是否展示1:展示,0:隐藏",hidden = true)
+    private Boolean displayFlag;
+
+    @ApiModelProperty("会员类型")
+    private EVipType vipType;
+
     public SourceTypeEnum getSourceType() {
         return sourceType;
     }
@@ -94,4 +101,20 @@ public class VipRecordSearch extends QueryInfo {
     public void setSearch(String search) {
         this.search = search;
     }
+
+    public Boolean getDisplayFlag() {
+        return displayFlag;
+    }
+
+    public void setDisplayFlag(Boolean displayFlag) {
+        this.displayFlag = displayFlag;
+    }
+
+    public EVipType getVipType() {
+        return vipType;
+    }
+
+    public void setVipType(EVipType vipType) {
+        this.vipType = vipType;
+    }
 }

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

@@ -38,7 +38,7 @@ public class CourseScheduleStudentMusicSheet implements Serializable {
 
     @TableField("music_sheet_accompaniment_id_")
     @ApiModelProperty(value = "伴奏编号")
-    private Long musicScoreAccompanimentId;
+    private String musicScoreAccompanimentId;
 
     @TableField("play_status_")
     @ApiModelProperty(value = "原音播放状态(1是0否)")
@@ -54,7 +54,7 @@ public class CourseScheduleStudentMusicSheet implements Serializable {
 
     @TableField("speed_")
     @ApiModelProperty(value = "播放速度")
-    private Integer speed = 100;
+    private String speed = "100";
 
     @TableField("create_time_")
     @ApiModelProperty(value = "${column.comment}")

+ 5 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseScheduleStudentPayment.java

@@ -65,5 +65,10 @@ public class CourseScheduleStudentPayment implements Serializable {
     @ApiModelProperty(value = "类型 practice陪练课 live直播课")
     private String courseType;
 
+    @TableField(value = "group_join_")
+    @ApiModelProperty("入群标记")
+    private Boolean groupJoin;
+
+
 }
 

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

@@ -75,6 +75,10 @@ public class ImGroup implements Serializable {
     @ApiModelProperty(value = "群聊配置")
     private String configJson;
 
+    @TableField(exist = false) // 不映射数据库字段,返回群成员人数限制
+    @ApiModelProperty("群成员人数限制")
+    private Integer groupMemberLimit;
+
     public Long getCourseGroupId() {
         return courseGroupId;
     }
@@ -178,5 +182,13 @@ public class ImGroup implements Serializable {
     public void setConfigJson(String configJson) {
         this.configJson = configJson;
     }
+
+    public Integer getGroupMemberLimit() {
+        return groupMemberLimit;
+    }
+
+    public void setGroupMemberLimit(Integer groupMemberLimit) {
+        this.groupMemberLimit = groupMemberLimit;
+    }
 }
 

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

@@ -6,6 +6,7 @@ import java.util.Date;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.im.EImUserFriendSourceForm;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import com.baomidou.mybatisplus.annotation.TableId;
@@ -64,6 +65,10 @@ public class ImUserFriend implements Serializable {
     @ApiModelProperty(value = "修改时间;")
     private Date updateTime;
 
+    @TableField("source_form_")
+    @ApiModelProperty(value = "建立好友时,标记建立身份,TEACHER:以老师身份建立,CUSTOMER:以客服身份建立")
+    private EImUserFriendSourceForm sourceForm;
+
     public String getFriendAvatar() {
         return friendAvatar;
     }
@@ -157,5 +162,13 @@ public class ImUserFriend implements Serializable {
     public void setFriendType(ClientEnum friendType) {
         this.friendType = friendType;
     }
+
+    public EImUserFriendSourceForm getSourceForm() {
+        return sourceForm;
+    }
+
+    public void setSourceForm(EImUserFriendSourceForm sourceForm) {
+        this.sourceForm = sourceForm;
+    }
 }
 

+ 12 - 58
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MemberPriceSettings.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.yonge.cooleshow.biz.dal.enums.EVipType;
 import com.yonge.cooleshow.biz.dal.enums.PeriodEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -11,11 +12,13 @@ import io.swagger.annotations.ApiModelProperty;
 import java.io.Serializable;
 import java.util.Date;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import javax.validation.constraints.PositiveOrZero;
 import java.math.BigDecimal;
 
+@Data
 @TableName("member_price_settings")
 @ApiModel(value = "MemberPriceSettings对象", description = "")
 public class MemberPriceSettings implements Serializable {
@@ -50,68 +53,19 @@ public class MemberPriceSettings implements Serializable {
 	@TableField(value = "update_by_")
 	private Long updateBy;
 
-	public Long getId() {
-		return id;
-	}
 
-	public void setId(Long id) {
-		this.id = id;
-	}
+    @ApiModelProperty("状态 1:启用 0:停用 ")
+    @TableField(value = "status_")
+    private Boolean status;
 
-	public PeriodEnum getPeriod() {
-		return period;
-	}
 
-	public void setPeriod(PeriodEnum period) {
-		this.period = period;
-	}
+    @ApiModelProperty("描述文案")
+    @TableField(value = "desc_")
+    private String desc;
 
-	public BigDecimal getSalePrice() {
-		return salePrice;
-	}
 
-	public void setSalePrice(BigDecimal salePrice) {
-		this.salePrice = salePrice;
-	}
-
-	public BigDecimal getOriginalPrice() {
-		return originalPrice;
-	}
-
-	public void setOriginalPrice(BigDecimal originalPrice) {
-		this.originalPrice = originalPrice;
-	}
-
-	public Date getCreateTime() {
-		return createTime;
-	}
-
-	public void setCreateTime(Date createTime) {
-		this.createTime = createTime;
-	}
-
-	public Date getUpdateTime() {
-		return updateTime;
-	}
-
-	public void setUpdateTime(Date updateTime) {
-		this.updateTime = updateTime;
-	}
-
-	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;
-	}
 
+    @ApiModelProperty("会员类型")
+    @TableField(value = "vip_type_")
+    private EVipType vipType;
 }

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

@@ -27,7 +27,7 @@ public class MusicSheetAccompaniment extends BaseEntity {
 
     @TableId(value = "id_", type = IdType.AUTO)
     @ApiModelProperty(value = "主键id")
-    private Long id;  //主键ID
+    private String id;  //主键ID
 
     @TableField("music_sheet_id_")
     @ApiModelProperty(value = "曲谱ID")
@@ -64,7 +64,7 @@ public class MusicSheetAccompaniment extends BaseEntity {
 
     @TableField("speed_")
     @ApiModelProperty(value = "速度")
-    private Integer speed;  //速度
+    private String speed;  //速度
 
     @TableField("create_time_")
     @ApiModelProperty(value = "创建时间")

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

@@ -112,6 +112,10 @@ public class Student implements Serializable {
     @TableField(value = "im_device_id_")
     private String imDeviceId;
 
+    @ApiModelProperty("专属客服ID")
+    @TableField(value = "customer_id_")
+    private Long customerId;
+
     public Long getTenantId() {
         return tenantId;
     }
@@ -231,4 +235,12 @@ public class Student implements Serializable {
     public void setHideFlag(Integer hideFlag) {
         this.hideFlag = hideFlag;
     }
+
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
 }

+ 16 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/StudentTime.java

@@ -25,6 +25,13 @@ public class StudentTime implements Serializable {
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
     private Date firstVipTime;
+
+
+    @ApiModelProperty("第一次购买svip时间 ")
+    @TableField(value = "first_svip_time_")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date firstSvipTime;
     @ApiModelProperty("第一次购买陪练课时间 ")
     @TableField(value = "first_practice_time_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@@ -65,6 +72,15 @@ public class StudentTime implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
     private Date firstActivityTime;
 
+
+    public Date getFirstSvipTime() {
+        return firstSvipTime;
+    }
+
+    public void setFirstSvipTime(Date firstSvipTime) {
+        this.firstSvipTime = firstSvipTime;
+    }
+
     public Date getFirstActivityTime() {
         return firstActivityTime;
     }

+ 8 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/Teacher.java

@@ -251,6 +251,14 @@ public class Teacher implements Serializable {
     @TableField(value = "im_device_id_")
     private String imDeviceId;
 
+    @ApiModelProperty("是否是客服")
+    @TableField(value = "customer_service_")
+    private Boolean customerService;
+
+    @ApiModelProperty("专属客服ID")
+    @TableField(value = "customer_id_")
+    private Long customerId;
+
     public ESettlementFrom getSettlementFrom() {
         return settlementFrom;
     }

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

@@ -95,4 +95,9 @@ public class UserOrderDetail implements Serializable {
     @TableField(value = "tenant_group_album_id_")
     private Long tenantGroupAlbumId;
 
+
+    @ApiModelProperty("业务数据")
+    @TableField(value = "biz_json_")
+    private String bizJson;
+
 }

+ 27 - 130
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/VipCardRecord.java

@@ -4,20 +4,20 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
-import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
-import com.yonge.cooleshow.biz.dal.enums.PeriodEnum;
-import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.*;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.io.Serializable;
 import java.util.Date;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
 
 /**
  * 购买会员卡记录表
  */
+@Data
 @TableName("vip_card_record")
 @ApiModel(value = "VipCardRecord对象", description = "购买会员卡记录表")
 public class VipCardRecord implements Serializable {
@@ -90,131 +90,28 @@ public class VipCardRecord implements Serializable {
     @TableField(value = "reason_")
     private String reason;
 
-    public Long getCreateBy() {
-        return createBy;
-    }
-
-    public void setCreateBy(Long createBy) {
-        this.createBy = createBy;
-    }
-
-    public String getReason() {
-        return reason;
-    }
-
-    public void setReason(String reason) {
-        this.reason = reason;
-    }
-
-    public Integer getTimes() {
-        return times;
-    }
-
-    public void setTimes(Integer times) {
-        this.times = times;
-    }
-
-    public PeriodEnum getType() {
-        return type;
-    }
-
-    public void setType(PeriodEnum type) {
-        this.type = type;
-    }
-
-    public SourceTypeEnum getSourceType() {
-        return sourceType;
-    }
-
-    public void setSourceType(SourceTypeEnum sourceType) {
-        this.sourceType = sourceType;
-    }
-
-    public ClientEnum getClientType() {
-        return clientType;
-    }
-
-    public void setClientType(ClientEnum clientType) {
-        this.clientType = clientType;
-    }
-
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
-    
-	public Long getUserId() {
-        return userId;
-    }
-
-    public void setUserId(Long userId) {
-        this.userId = userId;
-    }
-
-    public String getOrderNo() {
-        return orderNo;
-    }
-
-    public void setOrderNo(String orderNo) {
-        this.orderNo = orderNo;
-    }
-
-    public String getSubOrderNo() {
-        return subOrderNo;
-    }
-
-    public void setSubOrderNo(String subOrderNo) {
-        this.subOrderNo = subOrderNo;
-    }
-
-    public Long getVipCardId() {
-        return vipCardId;
-    }
-
-    public void setVipCardId(Long vipCardId) {
-        this.vipCardId = vipCardId;
-    }
-
-    public Date getStartTime() {
-        return startTime;
-    }
-
-    public void setStartTime(Date startTime) {
-        this.startTime = startTime;
-    }
-    
-	public Date getCreateTime() {
-        return createTime;
-    }
-
-    public void setCreateTime(Date createTime) {
-        this.createTime = createTime;
-    }
-    
-	public Date getUpdateTime() {
-        return updateTime;
-    }
-
-    public void setUpdateTime(Date updateTime) {
-        this.updateTime = updateTime;
-    }
-    
-	public Date getEndTime() {
-        return endTime;
-    }
-
-    public void setEndTime(Date endTime) {
-        this.endTime = endTime;
-    }
-
-    public Integer getMsgStatus() {
-        return msgStatus;
-    }
-
-    public void setMsgStatus(Integer msgStatus) {
-        this.msgStatus = msgStatus;
-    }
+    @ApiModelProperty("会员类型 VIP,SVIP")
+    @TableField(value = "vip_type_")
+    private EVipType vipType;
+
+    @ApiModelProperty("状态 ADD:新增,DEDUCTION:扣减,UPDATE:变更")
+    @TableField(value = "status_")
+    private EVipRecordStatus status;
+
+    @ApiModelProperty("是否展示1:展示,0:隐藏")
+    @TableField(value = "display_flag_")
+    private Boolean displayFlag;
+
+    @ApiModelProperty("是否有效 1:有效,0:失效")
+    @TableField(value = "efficient_flag_")
+    private Boolean efficientFlag;
+
+    @ApiModelProperty("关联ID")
+    @TableField(value = "ref_id_")
+    private Long refId;
+
+    @ApiModelProperty("是否发送消息")
+    @TableField(value = "send_msg_")
+    private Boolean sendMsg;
+
 }

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/AccountBizTypeEnum.java

@@ -16,6 +16,7 @@ public enum AccountBizTypeEnum implements BaseEnum<String, AccountBizTypeEnum> {
     VIDEO("视频课"),
     MUSIC("乐谱购买"),
     VIP("会员充值"),
+    SVIP("SVIP会员充值"),
     MALL("商品购买"),
     PIANO_ROOM("琴房充值"),
     ACTI_REGIST("活动报名"),

+ 33 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/EUserVipType.java

@@ -0,0 +1,33 @@
+package com.yonge.cooleshow.biz.dal.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.toolset.base.enums.BaseEnum;
+
+/**
+ * 用户会员类型
+ */
+public enum EUserVipType implements BaseEnum<String, EUserVipType> {
+
+    NORMAL("普通用户"),
+    VIP("VIP会员"),
+    SVIP("SVIP会员"),
+
+    ;
+    @EnumValue
+    private String code;
+    private String name;
+
+    EUserVipType(String name) {
+        this.code = this.name();
+        this.name = name;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }
+
+    public String getName() {
+        return name;
+    }
+}

+ 37 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/EVipRecordStatus.java

@@ -0,0 +1,37 @@
+package com.yonge.cooleshow.biz.dal.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.toolset.base.enums.BaseEnum;
+
+/**
+ * 认证审核类型 ADD 新增 MODIFY 修改
+ *
+ * @Author: liweifan
+ * @Data: 2022/3/16 10:19
+ */
+public enum EVipRecordStatus implements BaseEnum<String, EVipRecordStatus> {
+
+    //状态 ADD:新增,DEDUCTION:扣减,UPDATE:变更
+    ADD("新增"),
+    DEDUCTION("扣减"),
+    UPDATE("变更"),
+
+    ;
+    @EnumValue
+    private String code;
+    private String name;
+
+    EVipRecordStatus(String name) {
+        this.code = this.name();
+        this.name = name;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }
+
+    public String getName() {
+        return name;
+    }
+}

+ 46 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/EVipType.java

@@ -0,0 +1,46 @@
+package com.yonge.cooleshow.biz.dal.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.toolset.base.enums.BaseEnum;
+
+/**
+ * 认证审核类型 ADD 新增 MODIFY 修改
+ *
+ * @Author: liweifan
+ * @Data: 2022/3/16 10:19
+ */
+public enum EVipType implements BaseEnum<String, EVipType> {
+
+    // 字段 说明 VIP:会员 SVIP:SVIP,PERMANENT_SVIP:永久SVIP,NOT_VIP:不是vip
+
+    VIP("VIP"),
+    SVIP("SVIP"),
+
+
+    // 业务用字段
+    // 永久SVIP
+    PERMANENT_SVIP("永久SVIP"),
+
+    // 不是vip
+    NOT_VIP("不是vip"),
+    ALL_VIP("所有VIP"),
+
+    ;
+    @EnumValue
+    private String code;
+    private String name;
+
+    EVipType(String name) {
+        this.code = this.name();
+        this.name = name;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }
+
+    public String getName() {
+        return name;
+    }
+}

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/GoodTypeEnum.java

@@ -11,6 +11,7 @@ import com.yonge.toolset.base.enums.BaseEnum;
  */
 public enum GoodTypeEnum implements BaseEnum<String, GoodTypeEnum> {
     VIP("开通会员"),
+    SVIP("开通会员 SVIP"),
     PRACTICE("陪练课购买"),
     LIVE("直播课购买"),
     VIDEO("视频课购买"),

+ 24 - 8
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageTypeEnum.java

@@ -62,14 +62,22 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     STUDENT_JOIN_FANSGROUP("学员申请加入粉丝群"),
     STUDENT_AUTOJOIN_FANSGROUP("学员自动加入粉丝群"),
 
-    VIP_BUY_SUCCESS("会员购买成功"),
-    SMS_VIP_BUY_SUCCESS("会员购买成功(短信)"),
-
-    VIP_EXPIRE_THIRTY_DAY("会员到期前30天"),
-    SMS_VIP_EXPIRE_THIRTY_DAY("会员到期前30天(短信)"),
-
-    VIP_EXPIRE("会员到期"),
-    SMS_VIP_EXPIRE("会员到期(短信)"),
+//    VIP_BUY_SUCCESS("会员购买成功"),
+    NEW_VIP_BUY_SUCCESS("会员购买成功"),
+    NEW_TEACHER_VIP_BUY_SUCCESS("会员购买成功"),
+//    SMS_VIP_BUY_SUCCESS("会员购买成功(短信)"),
+    SMS_NEW_VIP_BUY_SUCCESS("会员购买成功(短信)"),
+    SMS_TEACHER_NEW_VIP_BUY_SUCCESS("会员购买成功(短信)"),
+
+    VIP_EXPIRE_THIRTY_DAY("VIP会员到期前30天"),
+    SVIP_EXPIRE_THIRTY_DAY("SVIP会员到期前30天"),
+    SMS_VIP_EXPIRE_THIRTY_DAY("VIP会员到期前30天(短信)"),
+    SMS_SVIP_EXPIRE_THIRTY_DAY("SVIP会员到期前30天(短信)"),
+
+    VIP_EXPIRE("VIP会员到期"),
+    SVIP_EXPIRE("SVIP会员到期"),
+    SMS_VIP_EXPIRE("VIP会员到期(短信)"),
+    SMS_SVIP_EXPIRE("SVIP会员到期(短信)"),
 
     PRACTICE_BUY("陪练课购买"),
     SMS_PRACTICE_BUY("陪练课购买(短信)"),
@@ -110,6 +118,14 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     PRACTICE_ADJUST("陪练课调整"),
     ACTIVITY_WIN("获奖消息"),
     PLATFORM_ADD_VIP("会员赠送"),
+    PLATFORM_ADD_SVIP("会员赠送"),
+
+    PLATFORM_ADD_PER_SVIP("会员永久赠送"),
+
+    PLATFORM_ADD_DUDECT_VIP("会员扣减"),
+    PLATFORM_ADD_DUDECT_SVIP("会员扣减"),
+    PLATFORM_ADD_DUDECT_PER_SVIP("会员永久扣减"),
+
     SMS_STUDENT_LIVE_COMPLETION_FAIL("直播课成课失败"),
     STUDENT_LIVE_COMPLETION_FAIL("直播课成课失败"),
     COUPON_ISSUE("优惠券发放"),

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/OrderTypeEnum.java

@@ -11,6 +11,7 @@ import com.yonge.toolset.base.enums.BaseEnum;
  */
 public enum OrderTypeEnum implements BaseEnum<String, OrderTypeEnum> {
     VIP("开通会员"),
+    SVIP("开通会员 SVIP"),
     PRACTICE("陪练课购买"),
     LIVE("直播课购买"),
     VIDEO("视频课购买"),

+ 4 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/PeriodEnum.java

@@ -12,7 +12,10 @@ public enum PeriodEnum implements BaseEnum<String, PeriodEnum> {
 	MONTH("月"),
 	QUARTERLY("季度"),
 	YEAR_HALF("半年"),
-	YEAR("年");
+	YEAR("年"),
+	PERPETUAL("永久"),
+
+    ;
 
 	@EnumValue
 	private String code;

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

@@ -16,9 +16,11 @@ public enum SourceTypeEnum implements BaseEnum<String, AuditStatusEnum> {
     // 机构,机构自己上传曲目 , 暂时没有
     TENANT("机构"),
     PLATFORM("平台"),
+    PLATFORM_DEDUCT("后台扣减"),
     ACTIVITY("活动"),
     ORDER("订单"),
     BACKEND_GIVE("后台赠送"),
+    FREE_UPGRADE("免费升级"),
 
 
     ;

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/coupon/CouponCategoryEnum.java

@@ -16,6 +16,7 @@ public enum CouponCategoryEnum implements BaseEnum<String, CouponCategoryEnum> {
 
     UNIVERSAL("全场通用", "UNIVERSAL"),
     VIP("小酷Ai", "VIP"),
+    SVIP("小酷Ai SVIP ", "SVIP"),
     PIANO("云酷琴房", "PIANO_ROOM"),
     MALL("商场购物券", "MALL"),
     MUSIC("单曲点播券", "MUSIC"),

+ 32 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/im/EImUserFriendSourceForm.java

@@ -0,0 +1,32 @@
+package com.yonge.cooleshow.biz.dal.enums.im;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.toolset.base.enums.BaseEnum;
+
+/**
+ * 用户会员类型
+ */
+public enum EImUserFriendSourceForm implements BaseEnum<String, EImUserFriendSourceForm> {
+
+    TEACHER("老师身份"),
+    CUSTOMER("客服"),
+
+    ;
+    @EnumValue
+    private String code;
+    private String name;
+
+    EImUserFriendSourceForm(String name) {
+        this.code = this.name();
+        this.name = name;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }
+
+    public String getName() {
+        return name;
+    }
+}

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

@@ -10,11 +10,21 @@ import com.yonge.cooleshow.biz.dal.dto.search.PracticeTeacherSearch;
 import com.yonge.cooleshow.biz.dal.entity.CourseCalendarEntity;
 import com.yonge.cooleshow.biz.dal.entity.CourseSchedule;
 import com.yonge.cooleshow.biz.dal.entity.TeacherSubjectPrice;
-import com.yonge.cooleshow.biz.dal.entity.UserOrderDetail;
-import com.yonge.cooleshow.biz.dal.vo.*;
+import com.yonge.cooleshow.biz.dal.vo.ArrangeCourseVo;
+import com.yonge.cooleshow.biz.dal.vo.CourseAdjustVo;
+import com.yonge.cooleshow.biz.dal.vo.CourseScheduleRecordVo;
+import com.yonge.cooleshow.biz.dal.vo.CourseStudent;
+import com.yonge.cooleshow.biz.dal.vo.CourseStudentVo;
+import com.yonge.cooleshow.biz.dal.vo.MyCourseVo;
+import com.yonge.cooleshow.biz.dal.vo.PianoClassVo;
+import com.yonge.cooleshow.biz.dal.vo.PianoRoomTimeVo;
+import com.yonge.cooleshow.biz.dal.vo.PracticeTeacherVo;
+import com.yonge.cooleshow.biz.dal.vo.StudentHomePage;
+import com.yonge.cooleshow.biz.dal.vo.TeacherLiveCourseInfoVo;
+import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
-import com.yonge.cooleshow.biz.dal.wrapper.course.CourseScheduleWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.course.CourseScheduleWrapper;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.page.PageInfo;
@@ -247,7 +257,14 @@ public interface CourseScheduleService extends IService<CourseSchedule> {
 
     PageInfo<CourseStudentVo> selectStudent(Map<String, Object> param);
 
-    void arrangeCourse(ArrangeCourseVo arrangeCourseVo, Long teacherId);
+    String arrangeCourse(ArrangeCourseVo arrangeCourseVo, Long teacherId);
+
+    /**
+     * 校验排课
+     * @param arrangeCourseVo 排课参数
+     * @param teacherId 老师id
+     */
+    String checkArrangeCourse(ArrangeCourseVo arrangeCourseVo, Long teacherId);
 
     Map<String, Object> selectConsumeTime(String month, Long teacherId);
 

+ 7 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImGroupMemberService.java

@@ -92,5 +92,12 @@ public interface ImGroupMemberService extends IService<ImGroupMember> {
     List<ImGroupMember> findChatGroupAllMemberInfo(Map<String, Object> params);
 
     IPage<ImGroupMemberWrapper.ImGroupMember> selectPage(@Param("page") IPage<ImGroupMemberWrapper.ImGroupMember> page,@Param("query") ImGroupMemberWrapper.ImGroupMemberQuery query);
+
+    /**
+     * 获取群成员数量
+     * @param groupId 群ID
+     * @return int
+     */
+    int countGroupMember(String groupId);
 }
 

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

@@ -85,10 +85,11 @@ public interface ImGroupService extends IService<ImGroup> {
     * @description: 成课后自动创建群聊,建议放在最后执行
      * @param courseGroupId 课程组编号
      * @param courseGroupType 课程组类型
+     * @param noGroupJoinUserIds 未加入群聊的用户编号
     * @author zx
     * @date 2022/3/22 11:17
     */
-    String autoCreate(Long courseGroupId,String courseGroupType) throws Exception;
+    String autoCreate(Long courseGroupId,String courseGroupType, List<Long> noGroupJoinUserIds) throws Exception;
 
     List<GroupMemberWrapper.ImGroupMember> getImGroupMembers(List<ImGroupMember> groupMemberList);
 
@@ -144,6 +145,13 @@ public interface ImGroupService extends IService<ImGroup> {
      */
     ImGroup findGroupInfoById(String groupId, Long userId);
 
+    /**
+     * 获取群信息
+     * @param groupId 群ID
+     * @return ImGroup
+     */
+    ImGroup getGroupById(String groupId);
+
     void getAndSaveImHistoryMessage(String date) throws Exception;
 
     /**

+ 9 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImUserFriendService.java

@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.dao.ImUserFriendDao;
 import com.yonge.cooleshow.biz.dal.entity.ImUserFriend;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.im.EImUserFriendSourceForm;
+import com.yonge.cooleshow.biz.dal.vo.im.ImUserFriendVO;
 import com.yonge.cooleshow.biz.dal.wrapper.im.CustomerService;
 import com.yonge.cooleshow.biz.dal.wrapper.im.ImUserWrapper;
 import org.springframework.transaction.annotation.Transactional;
@@ -30,9 +32,9 @@ public interface ImUserFriendService extends IService<ImUserFriend> {
     * @author zx
     * @date 2022/3/24 10:06
     */
-    void saveUserFriend(Long teacherId, Set<Long> studentIds);
+    void saveUserFriend(Long teacherId, Set<Long> studentIds, EImUserFriendSourceForm sourceForm);
 
-    void saveUserTeacherFriend(Long teacherId, Set<Long> teacherIds);
+    void saveUserTeacherFriend(Long teacherId, Set<Long> teacherIds, EImUserFriendSourceForm sourceForm);
 
     /**
     * @description: 获取用户详情
@@ -41,7 +43,7 @@ public interface ImUserFriendService extends IService<ImUserFriend> {
     * @author zx
     * @date 2022/3/24 12:03
     */
-    ImUserFriend getDetail(String userId, ClientEnum clientType);
+    ImUserFriendVO.ImUserFriend getDetail(String userId, ClientEnum clientType);
 
     /**
      * 新用户自动添加客服
@@ -52,6 +54,8 @@ public interface ImUserFriendService extends IService<ImUserFriend> {
      */
     Integer registerUserBindCustomerService(Long userId, List<Long> friendIds, ClientEnum clientType);
 
+    void sendCustomerServiceAddFriendMessage(Long customerServiceId, String sendTitle, String sendMessage, List<Long> friendIds, ClientEnum friendType);
+
     /**
      * 发送系统客服消息
      * @param sender 发送者
@@ -71,5 +75,7 @@ public interface ImUserFriendService extends IService<ImUserFriend> {
     void delTeacherFriendByTenantId(Long tenantId, Long userId, String clientType);
 
     void delStudentFriendByTenantId(Long tenantId, Long userId, String clientType);
+
+    void refreshCustomer(Long userId, ClientEnum userClientType, List<Long> friendIds, ClientEnum friendClientType);
 }
 

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

@@ -87,7 +87,7 @@ public interface MemberPriceSettingsService extends IService<MemberPriceSettings
      * @param sysUser
      * @return
      */
-    Boolean addVip(VipSubmitReq vipSubmitReq, ClientEnum client, SysUser sysUser);
+//    Boolean addVip(VipSubmitReq vipSubmitReq, ClientEnum client, SysUser sysUser);
 
     /**
      * 会员信息

+ 3 - 14
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetAccompanimentService.java

@@ -1,28 +1,17 @@
 package com.yonge.cooleshow.biz.dal.service;
 
+import com.dayaedu.cbs.openfeign.wrapper.music.CbsMusicSheetWrapper;
 import com.yonge.cooleshow.biz.dal.dao.MusicSheetAccompanimentDao;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheetAccompaniment;
 import com.baomidou.mybatisplus.extension.service.IService;
 
 import java.util.List;
 
-/**
- * MusicSheetAccompanimentService服务类
- * @author yzp
- * @date 2022-03-25 23:46:28
- * @version v1.0
- **/
 public interface MusicSheetAccompanimentService extends IService<MusicSheetAccompaniment> {
 
-    /**
-     * 删除原音
-     *
-     * @param musicSheetId
-     */
-    void delByMusicSheetId(Long musicSheetId);
     MusicSheetAccompanimentDao getDao();
 
-    List<MusicSheetAccompaniment> getByMusicSheetId(Long musicSheetId);
-
     List<MusicSheetAccompaniment> initMusicSheetAccompaniment(String musicSheetJson,Long musicSheetId);
+
+    MusicSheetAccompaniment initSysMusicScoreAccompaniment(CbsMusicSheetWrapper.MusicSheetAccApplication sheetApplication);
 }

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

@@ -10,6 +10,7 @@ import com.yonge.cooleshow.biz.dal.dto.ReasonDto;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.dto.search.*;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
+import com.yonge.cooleshow.biz.dal.entity.MusicSheetAccompaniment;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
 import com.yonge.cooleshow.biz.dal.vo.*;
@@ -18,6 +19,7 @@ import com.yonge.cooleshow.biz.dal.wrapper.MusicSheetWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.music.MusicCompareWrapper;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.base.page.PageInfo;
 
 import java.math.BigDecimal;
 import java.util.List;
@@ -45,7 +47,7 @@ public interface MusicSheetService extends IService<MusicSheet> {
 
     IPage<MusicSheetVoResult> selectCbsPage(IPage<MusicSheetVo> page, MusicSheetSearch query);
     
-    IPage<MusicSheetVo> queryRelatedList(IPage<MusicSheetVo> page, Long albumId, Long musicSheetId);
+    IPage<MusicSheetVo> queryRelatedList(IPage<MusicSheetVo> page, MusicSheetRelatedQueryInfo queryInfo);
 
     /**
      * 曲目状态修改 启用、停用
@@ -408,4 +410,12 @@ public interface MusicSheetService extends IService<MusicSheet> {
     void initMusicSheetDetailVo(CbsMusicSheetWrapper.AddMusicSheet addMusicSheet, MusicSheetDetailVo musicSheetAudit);
 
     void sync();
+
+    CbsMusicSheetWrapper.MusicSheetApplicationQuery getMusicSheetApplicationQuery();
+
+    PageInfo<CbsMusicSheetWrapper.MusicSheetAccApplication> queryCbsMusicSheetSoundApplication(CbsMusicSheetWrapper.MusicSheetApplicationQuery query);
+
+    List<CbsMusicSheetWrapper.MusicSheetApplication> queryCbsMusicSheetApplication(CbsMusicSheetWrapper.MusicSheetApplicationQuery query);
+
+    IPage<MusicSheetVo> queryTenantRelatedList(IPage<Object> page, MusicSheetRelatedQueryInfo queryInfo);
 }

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

@@ -133,4 +133,5 @@ public interface StudentService extends IService<Student> {
     void sendStudentTenantChange(Student student, Long toTenantId);
 
     Map<Long,Student> getMapByIds(List<Long> userIds);
+
 }

+ 5 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TeacherService.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.TeacherDao;
 import com.yonge.cooleshow.biz.dal.dto.TeacherDto;
 import com.yonge.cooleshow.biz.dal.dto.req.TeacherSubmitReq;
@@ -186,4 +187,8 @@ public interface TeacherService extends IService<Teacher> {
     UserPaymentOrderWrapper.AccountTenantTo teacherSettlementFrom(Long teacherId,Long recomUserId);
 
     Map<Long, Teacher> getMapByIds(List<Long> teacherIds);
+
+    List<Teacher> getCustomerService();
+
+    void updateLock(SysUser sysUser, Long teacherId);
 }

+ 41 - 5
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/VipCardRecordService.java

@@ -2,22 +2,22 @@ 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.biz.dal.dto.VipSubmitReq;
-import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.dto.search.VipRecordSearch;
 import com.yonge.cooleshow.biz.dal.entity.ActivityReward;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.EVipType;
 import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.VipRecordVo;
-import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
-import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 import com.yonge.cooleshow.biz.dal.vo.VipCardRecordVo;
 import com.yonge.cooleshow.biz.dal.dto.search.VipCardRecordSearch;
 import com.yonge.cooleshow.biz.dal.entity.VipCardRecord;
-import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.biz.dal.wrapper.VipCardRecordWrapper;
 import com.yonge.toolset.base.page.PageInfo;
 
+import java.util.List;
+import java.util.Map;
+
 /**
  * 购买会员卡记录表 服务类
  *
@@ -83,4 +83,40 @@ public interface VipCardRecordService extends IService<VipCardRecord> {
      * @return
      */
     PageInfo<VipRecordVo> vipRecord(VipRecordSearch recordSearch);
+
+    /**
+     * 获取生效中的会员记录
+     *
+     * @param userId
+     * @param clientEnum
+     * @return
+     */
+    List<VipCardRecord> getEfficientVipRecord(List<Long> userId, ClientEnum clientEnum);
+
+    VipCardRecordWrapper.UserVip UserVipInfo(Long userId, ClientEnum clientEnum);
+
+    /**
+     * 用户会员信息
+     *
+     * @param userId
+     * @param clientEnum
+     * @return
+     */
+    VipCardRecordWrapper.UserVip userVipInfo(Long userId, ClientEnum clientEnum);
+
+    void add(VipCardRecordWrapper.AddVipCardRecord addVipCardRecord);
+
+    /**
+     * 获取用户会员类型
+     *
+     * @param studentIds
+     * @param client
+     * @return
+     */
+    Map<Long, EVipType> getVipTypeMapByUserIds(List<Long> studentIds, ClientEnum client);
+
+    // 会员添加
+    VipCardRecord addVip(VipCardRecordWrapper.AddVipCardRecord addVipCardRecord);
+
+    List<VipCardRecordWrapper.UserVipInfo> queryUserVipInfo(List<Long> userIdList , String clientType);
 }

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

@@ -48,6 +48,8 @@ public interface ImGroupCoreService {
     String analysisImUserId(String imUserId);
 
 
+    String analysisImUser(String imUserId);
+
     /**
      * 检测imUserid
      *

+ 12 - 10
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/im/impl/ImGroupCoreServiceImpl.java

@@ -7,7 +7,6 @@ import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.dayaedu.cbs.common.enums.EClientType;
 import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
 import com.microsvc.toolkit.common.tools.ThreadPool;
 import com.microsvc.toolkit.middleware.im.ImPluginContext;
 import com.microsvc.toolkit.middleware.im.ImPluginService;
@@ -19,7 +18,6 @@ import com.yonge.cooleshow.biz.dal.entity.ImGroupMemberAudit;
 import com.yonge.cooleshow.biz.dal.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.enums.AuditStatusEnum;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
-import com.yonge.cooleshow.biz.dal.enums.ImGroupMemberRoleType;
 import com.yonge.cooleshow.biz.dal.enums.RoleEnum;
 import com.yonge.cooleshow.biz.dal.enums.im.EImGroupMemberRoleType;
 import com.yonge.cooleshow.biz.dal.service.ImGroupMemberAuditService;
@@ -27,14 +25,12 @@ import com.yonge.cooleshow.biz.dal.service.ImGroupMemberService;
 import com.yonge.cooleshow.biz.dal.service.ImGroupService;
 import com.yonge.cooleshow.biz.dal.service.SysUserService;
 import com.yonge.cooleshow.biz.dal.service.im.ImGroupCoreService;
-import com.yonge.cooleshow.biz.dal.wrapper.TenantActivationCodeWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupMemberAuditWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupMemberWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupWrapper;
 import com.yonge.toolset.base.exception.BizException;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.collections.MapUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -120,7 +116,7 @@ public class ImGroupCoreServiceImpl implements ImGroupCoreService {
             clientType = "TEACHER";
         }
         if (StringUtils.isNotBlank(imConfig.getAppPrefix()) && !imUserId.startsWith(imConfig.getAppPrefix())) {
-            imUserId = MessageFormat.format("{0}_{1}_{2}", imConfig.getAppPrefix(), userId, clientType);
+            imUserId = MessageFormat.format("{0}_{1}_{2}", imConfig.getAppPrefix(), userId.toString(), clientType);
         }
         return imUserId;
     }
@@ -133,7 +129,7 @@ public class ImGroupCoreServiceImpl implements ImGroupCoreService {
             clientType = "TEACHER";
         }
         if (StringUtils.isNotBlank(imConfig.getAppPrefix()) && !imUserId.startsWith(imConfig.getAppPrefix())) {
-            imUserId = MessageFormat.format("{0}_{1}_{2}", imConfig.getAppPrefix(), userId, clientType);
+            imUserId = MessageFormat.format("{0}_{1}_{2}", imConfig.getAppPrefix(), userId.toString(), clientType);
         }
         return imUserId;
     }
@@ -152,6 +148,13 @@ public class ImGroupCoreServiceImpl implements ImGroupCoreService {
         }
         return imUserId;
     }
+    @Override
+    public String analysisImUser(String imUserId) {
+        if (StringUtils.isNotBlank(imConfig.getAppPrefix()) && imUserId.startsWith(imConfig.getAppPrefix())) {
+            return imUserId.replace(imConfig.getAppPrefix() + "_", "");
+        }
+        return imUserId;
+    }
 
 
     /**
@@ -738,7 +741,6 @@ public class ImGroupCoreServiceImpl implements ImGroupCoreService {
      */
     @Override
     public void changeGroupOwner(String groupId, String newOwner, String oldOwner) throws Exception {
-
         try {
             if (newOwner.equals(oldOwner)) {
                 throw new BizException("不能转让给自己");
@@ -746,7 +748,7 @@ public class ImGroupCoreServiceImpl implements ImGroupCoreService {
 
             {
                 // 判断旧群主
-                String[] values = analysisImUserId(oldOwner).split(IM_USER_ID_SPLIT);
+                String[] values = analysisImUser(oldOwner).split(IM_USER_ID_SPLIT);
 
                 // 新群主ID和身份
                 long userId = Long.parseLong(values[0]);
@@ -765,7 +767,7 @@ public class ImGroupCoreServiceImpl implements ImGroupCoreService {
 
             {
                 // 判定新群主是否为禁言状态,需要先解除禁言
-                String[] values = analysisImUserId(newOwner).split(IM_USER_ID_SPLIT);
+                String[] values = analysisImUser(newOwner).split(IM_USER_ID_SPLIT);
 
                 // 新群主ID和身份
                 long userId = Long.parseLong(values[0]);
@@ -1016,7 +1018,7 @@ public class ImGroupCoreServiceImpl implements ImGroupCoreService {
      * @param isAdmin 群主标记
      */
     private void updateGroupOwner(String groupId, String groupMember, Boolean isAdmin) {
-        String[] values = analysisImUserId(groupMember).split(IM_USER_ID_SPLIT);
+        String[] values = analysisImUser(groupMember).split(IM_USER_ID_SPLIT);
 
         // 新群主ID和身份
         long userId = Long.parseLong(values[0]);

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

@@ -317,7 +317,7 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
             pianoRoomChangeRecord.setCreateTime(new Date());
             pianoRoomChangeRecord.setReason(activityPlan.getActivityName());
             pianoRoomChangeRecordService.add(pianoRoomChangeRecord);
-        } else if (activityReward.getRewardType().equals(RewardTypeEnum.VIP)) {
+        } else if (activityReward.getRewardType().equals(RewardTypeEnum.VIP) || activityReward.getRewardType().equals(RewardTypeEnum.SVIP)) {
             // VIP
             memberPriceSettingsService.activityReward(userId, activityPlan.getActivityClient(), activityReward,
                                                       activityPlan.getId(), activityPlan.getActivityName());

+ 39 - 61
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseCoursewareServiceImpl.java

@@ -1,16 +1,12 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
 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.client.SysUserFeignService;
+import com.dayaedu.cbs.openfeign.wrapper.music.CbsMusicSheetWrapper;
 import com.yonge.cooleshow.biz.dal.dao.CourseCoursewareDao;
-import com.yonge.cooleshow.biz.dal.dao.MusicSheetAccompanimentDao;
 import com.yonge.cooleshow.biz.dal.dao.TeacherDao;
-import com.yonge.cooleshow.biz.dal.dto.MusicSheetAccompanimentResult;
 import com.yonge.cooleshow.biz.dal.dto.search.CourseCoursewareSearch;
 import com.yonge.cooleshow.biz.dal.entity.CourseCourseware;
-import com.yonge.cooleshow.biz.dal.entity.MusicSheetAccompaniment;
 import com.yonge.cooleshow.biz.dal.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.entity.Teacher;
 import com.yonge.cooleshow.biz.dal.enums.AudioTypeEnum;
@@ -18,6 +14,7 @@ import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
 import com.yonge.cooleshow.biz.dal.service.CourseCoursewareService;
 import com.yonge.cooleshow.biz.dal.service.MusicSheetService;
+import com.yonge.cooleshow.biz.dal.service.SysUserService;
 import com.yonge.cooleshow.biz.dal.service.TenantAlbumMusicService;
 import com.yonge.cooleshow.biz.dal.vo.CourseCoursewareVo;
 import com.yonge.cooleshow.biz.dal.vo.MusicSheetDetailVo;
@@ -27,16 +24,11 @@ import com.yonge.toolset.base.exception.BizException;
 import org.apache.commons.collections.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
 import java.io.Serializable;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 
@@ -44,23 +36,15 @@ import java.util.stream.Collectors;
 public class CourseCoursewareServiceImpl extends ServiceImpl<CourseCoursewareDao, CourseCourseware> implements CourseCoursewareService {
     private final static Logger log = LoggerFactory.getLogger(CourseCoursewareServiceImpl.class);
 
-
-    @Autowired
+    @Resource
     private SysUserMapper userMapper;
-
-    @Autowired
+    @Resource
     private MusicSheetService musicSheetService;
-
-    @Autowired
-    private SysUserFeignService sysUserFeignService;
-
-    @Autowired
-    private MusicSheetAccompanimentDao musicSheetAccompanimentDao;
-
-    @Autowired
+    @Resource
+    private SysUserService sysUserService;
+    @Resource
     private TeacherDao teacherDao;
-
-    @Autowired
+    @Resource
     private TenantAlbumMusicService tenantAlbumMusicService;
 
 	@Override
@@ -82,42 +66,39 @@ public class CourseCoursewareServiceImpl extends ServiceImpl<CourseCoursewareDao
             return courseCoursewareVoIPage;
         }
         Map<Long, String> userIdUsernameMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getId, SysUser::getUsername));
-        //获取曲目关联的伴奏
-        List<Long> musicSheetIds = records.stream().map(e -> e.getMusicSheetId()).distinct().collect(Collectors.toList());
-        Map<Long, MusicSheetAccompaniment> accoompanimentMap = musicSheetAccompanimentDao.selectList(
-                        Wrappers.<MusicSheetAccompaniment>lambdaQuery()
-                                .in(MusicSheetAccompaniment::getMusicSheetId, musicSheetIds)).stream()
-                .collect(Collectors.groupingBy(MusicSheetAccompaniment::getMusicSheetId, Collectors.collectingAndThen(Collectors.toList(), e -> e.get(0))));
-        for (CourseCoursewareVo record : records) {
-            record.setUsername(userIdUsernameMap.get(record.getUserId()));
-            MusicSheetAccompaniment musicSheetAccompaniment = accoompanimentMap.get(record.getMusicSheetId());
-            if (musicSheetAccompaniment != null) {
-                record.setMusicSheetAccompanimentId(musicSheetAccompaniment.getId());
-            }
-        }
-
-        // 设置原音
-        List<Long> musicSheetIdList = records.stream().map(CourseCoursewareVo::getMusicSheetId).collect(Collectors.toList());
-        List<MusicSheetAccompaniment> musicSheetAccompanimentList = musicSheetAccompanimentDao.selectList(
-                Wrappers.<MusicSheetAccompaniment>lambdaQuery()
-                        .in(MusicSheetAccompaniment::getMusicSheetId, musicSheetIdList));
-        if (CollectionUtils.isNotEmpty(musicSheetAccompanimentList)) {
-            Map<Long, List<MusicSheetAccompaniment>> map = musicSheetAccompanimentList.stream()
-                                                          .collect( Collectors.groupingBy(MusicSheetAccompaniment::getMusicSheetId));
+        //获取内容平台曲目信息
+        List<Long> cbsMusicSheetIds = records.stream().map(e -> Long.parseLong(e.getCbsMusicSheetId())).collect(Collectors.toList());
+        CbsMusicSheetWrapper.MusicSheetApplicationQuery applicationQuery = musicSheetService.getMusicSheetApplicationQuery();
+        applicationQuery.setMusicSheetIds(cbsMusicSheetIds);
+        applicationQuery.setRows(cbsMusicSheetIds.size());
+        List<CbsMusicSheetWrapper.MusicSheetApplication> applications = musicSheetService.queryCbsMusicSheetApplication(applicationQuery);
+        if(CollectionUtils.isNotEmpty(applications)){
+            Map<Long, CbsMusicSheetWrapper.MusicSheetApplication> applicationMap = applications.stream().collect(Collectors.toMap(CbsMusicSheetWrapper.MusicSheetApplication::getId, e -> e));
             for (CourseCoursewareVo record : records) {
-                List<MusicSheetAccompaniment> musicSheetAccompaniments = map.get(record.getMusicSheetId());
-                if (CollectionUtils.isEmpty(musicSheetAccompaniments)) {
-                    continue;
+                record.setUsername(userIdUsernameMap.get(record.getUserId()));
+                CbsMusicSheetWrapper.MusicSheetApplication sheetApplication = applicationMap.get(Long.parseLong(record.getCbsMusicSheetId()));
+                if(sheetApplication != null){
+                    record.setMusicSheetName(sheetApplication.getName());
+                    record.setTitleImg(sheetApplication.getMusicCover());
+                    record.setMusicImg(sheetApplication.getMusicImg());
+                    record.setPaymentType(sheetApplication.getPaymentType());
+                    record.setStatus(sheetApplication.getStatus()?YesOrNoEnum.YES:YesOrNoEnum.NO);
+                    record.setMusicStatus(sheetApplication.getStatus()?YesOrNoEnum.YES:YesOrNoEnum.NO);
+                    List<CbsMusicSheetWrapper.MusicSheetAccompaniment> accompanimentList = sheetApplication.getMusicSheetAccompanimentList();
+                    if(CollectionUtils.isNotEmpty(accompanimentList)){
+                        CbsMusicSheetWrapper.MusicSheetAccompaniment accompaniment = accompanimentList.get(0);
+                        record.setUrl(accompaniment.getAudioFileUrl());
+                    }
+                    List<CbsMusicSheetWrapper.MusicSheetSound> soundList = sheetApplication.getMusicSheetSoundList();
+                    if(CollectionUtils.isNotEmpty(soundList)){
+                        record.setMusicSheetAccompanimentId(soundList.get(0).getId().toString());
+                        String url = soundList.stream().map(CbsMusicSheetWrapper.MusicSheetSound::getAudioFileUrl).collect(Collectors.joining(","));
+                        record.setMp3url(url);
+                    }
                 }
-                String url = musicSheetAccompaniments.stream()
-                                                         .map(MusicSheetAccompaniment::getAudioFileUrl)
-                                                         .collect(Collectors.joining(","));
-                record.setMp3url(url);
             }
         }
 
-
-
         // 查询有效直接返回
         if (query.getStatus() != null && query.getStatus().equals(YesOrNoEnum.YES)) {
             records = records.stream()
@@ -207,11 +188,8 @@ public class CourseCoursewareServiceImpl extends ServiceImpl<CourseCoursewareDao
     public CourseCourseware submit(CourseCourseware courseCourseware) {
 
         // 判断用户
-        com.yonge.cooleshow.auth.api.entity.SysUser user = sysUserFeignService.queryUserById(
+        com.yonge.cooleshow.auth.api.entity.SysUser user = sysUserService.getByUserId(
                 courseCourseware.getUserId());
-        if (user == null) {
-            throw new BizException("用户信息未找到");
-        }
 
         // 判断是否已经添加到附件
         Integer count = this.lambdaQuery()

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

@@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.beust.jcommander.internal.Lists;
+import com.google.common.collect.Lists;
 import com.microsvc.toolkit.config.jwt.utils.JwtUserInfo;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
@@ -1250,9 +1250,15 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
                 if (courseGroup.getPreStudentNum() >= courseGroup.getMixStudentNum() &&courseGroup.getStatus().equals(CourseGroupEnum.APPLY.getCode())) {
                     //人数达标则修改课程组为进行中状态
                     courseGroup.setStatus(CourseGroupEnum.ING.getCode());
+                    List<Long> noGroupJoinUserIds = Lists.newArrayList();
                     //创建群聊 并添加人员到群中
-                    String imGroupId = imGroupService.autoCreate(courseGroup.getId(), courseGroup.getType());
+                    String imGroupId = imGroupService.autoCreate(courseGroup.getId(), courseGroup.getType(), noGroupJoinUserIds);
 
+                    // 排除未进群的学生
+                    if (CollectionUtils.isNotEmpty(noGroupJoinUserIds)) {
+                        noGroupJoinUserIds.forEach(userIds::remove);
+                    }
+                    // 更新已进群用户身份
                     imGroupMemberService.initGroupMembers(imGroupId, userIds, ImGroupMemberRoleType.STUDENT);
                     //添加老师进群
                     imGroupMemberService.initGroupMembers(imGroupId, Collections.singleton(courseGroup.getTeacherId()), ImGroupMemberRoleType.TEACHER);

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

@@ -10,9 +10,11 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.*;
+import com.yonge.cooleshow.biz.dal.dto.BasicUserInfo;
 import com.yonge.cooleshow.biz.dal.dto.PracticeScheduleDto;
 import com.yonge.cooleshow.biz.dal.dto.UserAccountRecordDto;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
@@ -21,6 +23,7 @@ import com.yonge.cooleshow.biz.dal.dto.search.MyCourseSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.PracticeTeacherSearch;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.*;
+import com.yonge.cooleshow.biz.dal.enums.im.EImUserFriendSourceForm;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.wrapper.course.CourseScheduleWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.liveroom.LiveRoomWrapper;
@@ -54,7 +57,6 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.text.MessageFormat;
 import java.text.SimpleDateFormat;
 import java.time.Instant;
 import java.time.LocalDate;
@@ -1199,7 +1201,8 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         Set<Long> studentIds = new HashSet();
         studentIds.add(studentId);
         try {
-            imUserFriendService.saveUserFriend(teacherId, studentIds);
+            imUserFriendService.saveUserFriend(teacherId, studentIds, EImUserFriendSourceForm.TEACHER);
+            imUserFriendService.refreshCustomer(teacherId, ClientEnum.TEACHER, new ArrayList<>(studentIds), ClientEnum.STUDENT);
             log.info("保存用户通讯录成功,teacherId:{},studentIds:{}", teacherId, studentIds);
         } catch (Exception e) {
             log.error("保存用户通讯录失败,teacherId:{},studentIds:{},e:{}", teacherId, studentIds, e);
@@ -1954,16 +1957,23 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
      * @Author: cy
      * @Date: 2022/5/27
      */
-    public void arrangeCourse(ArrangeCourseVo arrangeCourseVo, Long teacherId) {
-        DistributedLock.of(redissonClient)
-                .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey("teacherId:" + teacherId)
-                        , () -> this.checkArrangeCourse(arrangeCourseVo, teacherId), 60L, TimeUnit.SECONDS);
+    public String arrangeCourse(ArrangeCourseVo arrangeCourseVo, Long teacherId) {
+
+        // 返回未加入群用户消息
+        return DistributedLock.of(redissonClient)
+            .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey("teacherId:" + teacherId)
+                , () -> this.checkArrangeCourse(arrangeCourseVo, teacherId), 60L, TimeUnit.SECONDS);
     }
 
+    /**
+     * 校验排课
+     * @param arrangeCourseVo 排课参数
+     * @param teacherId 老师id
+     */
     @Transactional(rollbackFor = Exception.class)
-    public void checkArrangeCourse(ArrangeCourseVo arrangeCourseVo, Long teacherId) {
+    public String checkArrangeCourse(ArrangeCourseVo arrangeCourseVo, Long teacherId) {
         Integer classNum = arrangeCourseVo.getClassNum();//课时数
-        Integer singleClssTime = arrangeCourseVo.getSingleClssTime();//单课时长
+        Integer singleClassTime = arrangeCourseVo.getSingleClssTime();//单课时长
         List<Long> studentIds = arrangeCourseVo.getStudentIds();//学员id集合
 
         String formula = sysConfigService.findConfigValue(SysConfigConstant.PIANO_ROOM_TIME_FORMULA);
@@ -1971,13 +1981,13 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         if (n == null) {
             throw new BizException("公式转换失败");
         }
-        Integer consumTime = classNum * singleClssTime * n;//消耗时长 课程数*单课时长*人数
+        Integer consumTime = classNum * singleClassTime * n;//消耗时长 课程数*单课时长*人数
 
         List<CourseTimeEntity> timeList = arrangeCourseVo.getTimeList();//选课时间
         Integer consumeTime = arrangeCourseVo.getConsumeTime();
 
         log.info("classNum:" + classNum);
-        log.info("singleClssTime:" + singleClssTime);
+        log.info("singleClssTime:" + singleClassTime);
         log.info("n:" + n);
         log.info("消耗时长:" + consumTime);
         log.info("传入时长:" + consumeTime);
@@ -2002,7 +2012,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
             if (timeList.get(i).getStartTime().before(new Date())) {
                 throw new BizException("上课时间必须大于当前时间");
             }
-            if (!DateUtil.offsetMinute(timeList.get(i).getStartTime(), singleClssTime).equals(timeList.get(i).getEndTime())) {
+            if (!DateUtil.offsetMinute(timeList.get(i).getStartTime(), singleClassTime).equals(timeList.get(i).getEndTime())) {
                 throw new BizException("第{}节课结束时间计算错误", i + 1);
             }
         }
@@ -2059,7 +2069,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         courseGroup.setTeacherId(teacherId);
         courseGroup.setName(arrangeCourseVo.getCourseName());
         courseGroup.setSubjectId(arrangeCourseVo.getSubjectId());
-        courseGroup.setSingleCourseMinutes(singleClssTime);
+        courseGroup.setSingleCourseMinutes(singleClassTime);
         courseGroup.setCourseNum(classNum);
         courseGroup.setStatus(CourseGroupEnum.ING.getCode());
         courseGroup.setCreatedBy(teacherId);
@@ -2079,7 +2089,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
             schedule.setLock(0);
             schedule.setStatus(CourseScheduleEnum.NOT_START.getCode());
             schedule.setCreatedBy(teacherId);
-            schedule.setSingleCourseTime(singleClssTime);
+            schedule.setSingleCourseTime(singleClassTime);
             baseMapper.insert(schedule);
 
             //添加payment
@@ -2113,14 +2123,14 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
                             roomTimeLock.setFrozenTime(frozenTimeLock + consumTime);
                             pianoRoomTimeDao.update(roomTimeLock, Wrappers.<PianoRoomTime>lambdaQuery().eq(PianoRoomTime::getTeacherId, teacherId));
                             return null;
-                        }, null, 10l);
+                        }, null, 10L);
 
+        List<Long> noGroupJoinUserIds = Lists.newArrayList();
         //创建群聊
         try {
-            imGroupService.autoCreate(courseGroup.getId(), CourseScheduleEnum.PIANO_ROOM_CLASS.getCode());
+            imGroupService.autoCreate(courseGroup.getId(), CourseScheduleEnum.PIANO_ROOM_CLASS.getCode(), noGroupJoinUserIds);
         } catch (Exception e) {
-            log.error("琴房课程组id:{},创建群聊失败:{}", courseGroup.getId(), e);
-            e.printStackTrace();
+            log.error("琴房课程组id:{},创建群聊失败", courseGroup.getId(), e);
         }
 
         for (Long studentId : studentIds) {
@@ -2131,6 +2141,13 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         }
         //清除老师缓存
         redissonClient.getBucket(CacheNameEnum.TEACHER_TOTAL.getRedisKey(teacherId)).delete();
+
+        String message = "";
+        if (CollectionUtils.isNotEmpty(noGroupJoinUserIds)) {
+            // 返回未加入群用户消息
+            message = "群成员人数达到上限,有" + noGroupJoinUserIds.size() + "位学生未进入课程群";
+        }
+        return message;
     }
 
     /**
@@ -2450,7 +2467,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
                                     .set(PianoRoomTime::getRemainTime, remainTime - diffTime)
                                     .set(PianoRoomTime::getFrozenTime, frozenTime + diffTime));
                             return null;
-                        }, null, 10l);
+                        }, null, 10L);
 
         //删除原学员
         paymentDao.delete(Wrappers.<CourseScheduleStudentPayment>lambdaQuery().eq(CourseScheduleStudentPayment::getCourseId, courseId));

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

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -11,10 +12,10 @@ import com.microsvc.toolkit.middleware.im.ImPluginContext;
 import com.microsvc.toolkit.middleware.im.impl.TencentCloudImPlugin;
 import com.microsvc.toolkit.middleware.im.message.MessageWrapper;
 import com.microsvc.toolkit.middleware.im.message.TencentRequest;
-import com.yonge.cooleshow.auth.config.CustomerServiceConfig;
 import com.yonge.cooleshow.biz.dal.entity.CustomerServiceBatchSending;
 import com.yonge.cooleshow.biz.dal.entity.CustomerServiceReceive;
 import com.yonge.cooleshow.biz.dal.entity.Subject;
+import com.yonge.cooleshow.biz.dal.entity.SysConfig;
 import com.yonge.cooleshow.biz.dal.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.entity.Teacher;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
@@ -24,10 +25,16 @@ import com.yonge.cooleshow.biz.dal.enums.im.EImSendStatus;
 import com.yonge.cooleshow.biz.dal.enums.im.EImSendType;
 import com.yonge.cooleshow.biz.dal.mapper.CustomerServiceBatchSendingMapper;
 import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
-import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.service.CustomerServiceBatchSendingService;
+import com.yonge.cooleshow.biz.dal.service.CustomerServiceReceiveService;
+import com.yonge.cooleshow.biz.dal.service.ImGroupService;
+import com.yonge.cooleshow.biz.dal.service.SubjectService;
+import com.yonge.cooleshow.biz.dal.service.SysConfigService;
+import com.yonge.cooleshow.biz.dal.service.TeacherService;
 import com.yonge.cooleshow.biz.dal.wrapper.im.CustomerService;
 import com.yonge.cooleshow.biz.dal.wrapper.im.CustomerServiceBatchSendingWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.im.CustomerServiceReceiveWrapper;
+import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.util.ImUtil;
 import com.yonge.toolset.base.util.ThreadPool;
@@ -36,9 +43,7 @@ import com.yonge.toolset.payment.util.DistributedLock;
 import io.rong.messages.BaseMessage;
 import io.rong.messages.ImgMessage;
 import io.rong.messages.TxtMessage;
-import io.rong.models.message.PrivateMessage;
 import io.rong.models.message.PushExt;
-import io.rong.models.response.ResponseResult;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -49,7 +54,15 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.text.MessageFormat;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Random;
+import java.util.concurrent.TimeUnit;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
@@ -66,8 +79,7 @@ public class CustomerServiceBatchSendingServiceImpl extends ServiceImpl<Customer
     private CustomerServiceReceiveService customerServiceReceiveService;
     @Autowired
     private SubjectService subjectService;
-    @Autowired
-    private CustomerServiceConfig customerServiceConfig;
+
     @Autowired
     private SysUserMapper sysUserMapper;
     @Autowired
@@ -81,6 +93,9 @@ public class CustomerServiceBatchSendingServiceImpl extends ServiceImpl<Customer
     @Autowired
     private ImGroupService imGroupService;
 
+    @Autowired
+    private SysConfigService sysConfigService;
+
 	/**
      * 查询详情
      * @param id 详情ID
@@ -211,7 +226,14 @@ public class CustomerServiceBatchSendingServiceImpl extends ServiceImpl<Customer
         // 发送客服ID
         String customerService = info.getMobile();
         if (StringUtils.isBlank(customerService)) {
-            customerService = customerServiceConfig.getCustomerService();
+            List<Long> teacherIds = teacherService.getCustomerService().stream().map(Teacher::getUserId).collect(Collectors.toList());
+            if (!teacherIds.isEmpty()) {
+                customerService = sysUserMapper.selectList(new QueryWrapper<SysUser>().lambda()
+                                .in(SysUser::getId, teacherIds))
+                        .stream()
+                        .map(SysUser::getPhone)
+                        .collect(Collectors.joining(","));
+            }
         }
         if (StringUtils.isNotEmpty(customerService)) {
 
@@ -416,12 +438,38 @@ public class CustomerServiceBatchSendingServiceImpl extends ServiceImpl<Customer
 
                 try {
 
+                    // 消息发送数量,默认只发送1类消息(文字或图片)
+                    int messageNum = 1;
+                    if (StringUtils.isNoneBlank(info.getTextMessage(), info.getImgMessage())) {
+                        // 同时发送图片和文字消息
+                        messageNum += 1;
+                    }
+
+                    int messageSendLimit; // 默认发送10000/分钟
+                    // 群发消息频率限制
+                    SysConfig config = sysConfigService.findByParamName(SysConfigConstant.MESSAGE_SEND_LIMIT);
+                    // 群发消息频率限制不能超过10000/分钟,超过当前值默认取值为10000
+                    if (config != null && config.getParamValue().matches("\\d+")) {
+                        int sendLimit = Integer.parseInt(config.getParamValue());
+                        if (sendLimit > 0 && sendLimit < 10000) {
+                            // 消息发送频率限制
+                            messageSendLimit = Integer.parseInt(config.getParamValue());
+                        } else {
+                            // 默认发送10000/分钟
+                            messageSendLimit = 10000;
+                        }
+                    } else {
+                        // 默认发送10000/分钟
+                        messageSendLimit = 10000;
+                    }
+
+                    int finalMessageNum = messageNum;
                     if (EImReceiveType.ALL == info.getReceiveType()) {
 
                         // 推送消息给匹配用户
-                        List<String> targetGroupes = Arrays.stream(info.getTargetGroup().split(",")).collect(Collectors.toList());
+                        List<String> targetGroups = Arrays.stream(info.getTargetGroup().split(",")).collect(Collectors.toList());
 
-                        targetGroupes.parallelStream().forEach(clientType -> {
+                        targetGroups.forEach(clientType -> {
 
                             CustomerService.NotifyMessage receiveQuery = CustomerService.NotifyMessage.builder()
                                     .clientType(ClientEnum.valueOf(clientType))
@@ -437,6 +485,8 @@ public class CustomerServiceBatchSendingServiceImpl extends ServiceImpl<Customer
 
                             List<Integer> collect = IntStream.iterate(1, i -> i + 1).limit(pages).boxed().collect(Collectors.toList());
 
+                            // 线程休眠计算器
+                            int sleepCount = 0;
                             for (Integer pageNum : collect) {
 
                                 List<String> receiveUserIds = getBaseMapper().selectMessageReceives(PageUtil.getPage(pageNum, limit), receiveQuery).stream()
@@ -447,6 +497,9 @@ public class CustomerServiceBatchSendingServiceImpl extends ServiceImpl<Customer
                                         .map(x -> imGroupService.getImUserId(x, clientType))
                                         .collect(Collectors.toList());
 
+                                // 累加线程休眠计算器,若大于指定阀值时,线程休眠1分钟
+                                sleepCount = messageSendSleepCondition(info, sleepCount, receiveUserIds.size(), finalMessageNum, messageSendLimit);
+
                                 batchSendCustomerServiceMessage(info, receiveNums, receiveUserIds);
                             }
                         });
@@ -466,12 +519,17 @@ public class CustomerServiceBatchSendingServiceImpl extends ServiceImpl<Customer
 
                         List<Integer> collect = IntStream.iterate(1, i -> i + 1).limit(pages).boxed().collect(Collectors.toList());
 
+                        // 线程休眠计算器
+                        int sleepCount = 0;
                         for (Integer pageNum : collect) {
 
                             List<String> receiveUserIds = customerServiceReceiveService.selectPage(PageUtil.getPage(pageNum, limit), receiveQuery).getRecords().stream()
                                     .map(x -> imGroupService.getImUserId(String.valueOf(x.getUserId()), x.getClientType()))
                                     .collect(Collectors.toList());
 
+                            // 累加线程休眠计算器,若大于指定阀值时,线程休眠1分钟
+                            sleepCount = messageSendSleepCondition(info, sleepCount, receiveUserIds.size(), finalMessageNum, messageSendLimit);
+
                             batchSendCustomerServiceMessage(info, receiveNums, receiveUserIds);
                         }
                     }
@@ -490,7 +548,35 @@ public class CustomerServiceBatchSendingServiceImpl extends ServiceImpl<Customer
 
             });
 
-        });
+        }, 30L, TimeUnit.MINUTES);
+    }
+
+    /**
+     * 消息发送休眠条件
+     * @param info CustomerServiceBatchSending
+     * @param sleepCount 休眠次数统计
+     * @param receiveSize 发送人数
+     * @param finalMessageNum 发送消息数
+     * @param messageSendLimit 消息休眠频率限制
+     * @return int
+     */
+    private static int messageSendSleepCondition(CustomerServiceBatchSending info, int sleepCount,
+                                                 int receiveSize, int finalMessageNum, int messageSendLimit) {
+        // 累加线程休眠计算器,若大于指定阀值时,线程休眠1分钟
+        sleepCount += receiveSize * finalMessageNum;
+        if (sleepCount > messageSendLimit) {
+            try {
+                // 线程休眠1分钟
+                Thread.sleep(1000 * 60);
+                log.info("messageSendSleepCondition THREAD_SLEEP END, sleepCount={}, receiveSize={}, finalMessageNum={}, messageSendLimit={}",
+                    sleepCount, receiveSize, finalMessageNum, messageSendLimit);
+            } catch (InterruptedException e) {
+                log.error("messageSendSleepCondition THREAD_SLEEP EX id={}", info.getId(), e);
+            }
+            // 重置线程休眠计算器
+            sleepCount = 0;
+        }
+        return sleepCount;
     }
 
     /**
@@ -555,7 +641,6 @@ public class CustomerServiceBatchSendingServiceImpl extends ServiceImpl<Customer
     /**
      * 推送消息类型
      * @param info CustomerServiceBatchSending
-     * @return List<BaseMessage>
      */
     private static void getReceiveMessage(CustomerServiceBatchSending info, List<BaseMessage> messages, List<TencentRequest.MessageBody> tencentMessages) {
 

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

@@ -141,6 +141,7 @@ public class HomeServiceImpl implements HomeService {
         List<HomeTotalStudent> totalList = baserMapper.totalStudent(query.getTimeType().getCode(), query);
         Integer registerNum = 0;
         Integer vipNum = 0;
+        Integer svipNum = 0;
         Integer practiceNum = 0;
         Integer videoNum = 0;
         Integer liveNum = 0;
@@ -151,6 +152,7 @@ public class HomeServiceImpl implements HomeService {
         for (HomeTotalStudent totalStudent : totalList) {
             totalStudent.setRegisterNum(null == totalStudent.getRegisterNum() ? 0 : totalStudent.getRegisterNum());
             totalStudent.setVipNum(null == totalStudent.getVipNum() ? 0 : totalStudent.getVipNum());
+            totalStudent.setSvipNum(null == totalStudent.getSvipNum() ? 0 : totalStudent.getSvipNum());
             totalStudent.setPracticeNum(null == totalStudent.getPracticeNum() ? 0 : totalStudent.getPracticeNum());
             totalStudent.setVideoNum(null == totalStudent.getVideoNum() ? 0 : totalStudent.getVideoNum());
             totalStudent.setLiveNum(null == totalStudent.getLiveNum() ? 0 : totalStudent.getLiveNum());
@@ -160,6 +162,7 @@ public class HomeServiceImpl implements HomeService {
 
             registerNum += totalStudent.getRegisterNum();
             vipNum += totalStudent.getVipNum();
+            svipNum += totalStudent.getSvipNum();
             practiceNum += totalStudent.getPracticeNum();
             videoNum += totalStudent.getVideoNum();
             liveNum += totalStudent.getLiveNum();
@@ -170,6 +173,7 @@ public class HomeServiceImpl implements HomeService {
         HomeTotalStudent total = new HomeTotalStudent();
         total.setRegisterNum(registerNum);
         total.setVipNum(vipNum);
+        total.setSvipNum(svipNum);
         total.setPracticeNum(practiceNum);
         total.setVideoNum(videoNum);
         total.setLiveNum(liveNum);

+ 113 - 44
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImGroupMemberAuditServiceImpl.java

@@ -6,6 +6,7 @@ import com.yonge.cooleshow.biz.dal.dao.ImGroupMemberAuditDao;
 import com.yonge.cooleshow.biz.dal.entity.ImGroup;
 import com.yonge.cooleshow.biz.dal.entity.ImGroupMember;
 import com.yonge.cooleshow.biz.dal.entity.ImGroupMemberAudit;
+import com.yonge.cooleshow.biz.dal.entity.SysConfig;
 import com.yonge.cooleshow.biz.dal.enums.AuditStatusEnum;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.ImGroupMemberRoleType;
@@ -14,19 +15,28 @@ import com.yonge.cooleshow.biz.dal.queryInfo.ImGroupMemberAuditQueryInfo;
 import com.yonge.cooleshow.biz.dal.service.ImGroupMemberAuditService;
 import com.yonge.cooleshow.biz.dal.service.ImGroupMemberService;
 import com.yonge.cooleshow.biz.dal.service.ImGroupService;
+import com.yonge.cooleshow.biz.dal.service.SysConfigService;
 import com.yonge.cooleshow.biz.dal.service.SysUserService;
 import com.yonge.cooleshow.biz.dal.vo.AuditUserInfo;
+import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.payment.util.DistributedLock;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
-import io.rong.models.group.GroupMember;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
-import java.util.*;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -35,11 +45,10 @@ import java.util.stream.Collectors;
  * @author zx
  * @since 2022-03-22 17:18:51
  */
+@Slf4j
 @Service("imGroupMemberAuditService")
 public class ImGroupMemberAuditServiceImpl extends ServiceImpl<ImGroupMemberAuditDao, ImGroupMemberAudit> implements ImGroupMemberAuditService {
 
-    private final static Logger log = LoggerFactory.getLogger(ImGroupMemberAuditServiceImpl.class);
-
     @Resource
     private ImGroupService imGroupService;
     @Resource
@@ -49,6 +58,12 @@ public class ImGroupMemberAuditServiceImpl extends ServiceImpl<ImGroupMemberAudi
     @Resource
     private SysMessageServiceImpl sysMessageService;
 
+    @Autowired
+    private RedissonClient redissonClient;
+
+    @Autowired
+    private SysConfigService sysConfigService;
+
     @Override
     public ImGroupMemberAuditDao getDao() {
         return this.baseMapper;
@@ -79,36 +94,55 @@ public class ImGroupMemberAuditServiceImpl extends ServiceImpl<ImGroupMemberAudi
         if(Objects.nonNull(baseMapper.findOne(auditParams))){
             throw new BizException("您有待审核的申请,请勿重复提交");
         }
-        Date date = new Date();
-        //是否自动通过审核
-        imGroupMemberAudit.setAuditStatus(imGroup.getAutoPassFlag() && autoJoin?AuditStatusEnum.OPEN:AuditStatusEnum.AUDITING);
-        imGroupMemberAudit.setUpdateTime(date);
-        imGroupMemberAudit.setCreateTime(date);
-        baseMapper.insert(imGroupMemberAudit);
-        if(imGroup.getAutoPassFlag() && Optional.ofNullable(autoJoin).orElse(false)){
-            //处理本地群成员
-            List<ImGroupMember> groupMembers = imGroupMemberService.initGroupMember(imGroup.getId(),
-                    imGroupMemberAudit.getUserId(), false,
-                    imGroupMemberAudit.getRoleType());
-            //同步群成员数量
-            imGroupService.getDao().updateMemberNum(imGroup.getId());
-            //加入融云群
-            imGroupMemberService.join(groupMembers,groupId);
-        } else {
-            Map<Long,String> receivers = new HashMap<>(1);
-            // 群创建人
-            SysUser user = sysUserService.findUserById(imGroup.getCreateBy());
-            // 申请人
-            SysUser auditUser = sysUserService.findUserById(imGroupMemberAudit.getUserId());
-
-            receivers.put(user.getId(), user.getPhone());
+
+        // 增加群成员校验锁,当群成员人数达到限制时,不允许再次加入
+        String lockName = "klx:group_member_apply_lock:" + groupId;
+        DistributedLock.of(redissonClient).runIfLockToFunction(lockName, (x)-> {
+
+            // 统计群成员数量,大于等于群组最大人数时,不允许加入
+            if (!verifyGroupMemberJoinLimit(groupId, 1)) {
+                SysConfig config = sysConfigService.findByParamName(SysConfigConstant.GROUP_MEMBER_LIMIT);
+                throw new BizException("群成员人数上限为:" + config.getParamValue() + "人");
+            }
+
             try {
-                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_JOIN_FANSGROUP,
-                           receivers, null, 0, null, ClientEnum.TEACHER.getCode(), auditUser.getUsername(),imGroup.getName());
+                Date date = new Date();
+                //是否自动通过审核
+                imGroupMemberAudit.setAuditStatus(imGroup.getAutoPassFlag() && autoJoin?AuditStatusEnum.OPEN:AuditStatusEnum.AUDITING);
+                imGroupMemberAudit.setUpdateTime(date);
+                imGroupMemberAudit.setCreateTime(date);
+                baseMapper.insert(imGroupMemberAudit);
+                if(imGroup.getAutoPassFlag() && Optional.ofNullable(autoJoin).orElse(false)){
+                    //处理本地群成员
+                    List<ImGroupMember> groupMembers = imGroupMemberService.initGroupMember(imGroup.getId(),
+                        imGroupMemberAudit.getUserId(), false,
+                        imGroupMemberAudit.getRoleType());
+                    //同步群成员数量
+                    imGroupService.getDao().updateMemberNum(imGroup.getId());
+                    //加入融云群
+                    imGroupMemberService.join(groupMembers,groupId);
+                } else {
+                    Map<Long,String> receivers = new HashMap<>(1);
+                    // 群创建人
+                    SysUser user = sysUserService.findUserById(imGroup.getCreateBy());
+                    // 申请人
+                    SysUser auditUser = sysUserService.findUserById(imGroupMemberAudit.getUserId());
+
+                    receivers.put(user.getId(), user.getPhone());
+                    try {
+                        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_JOIN_FANSGROUP,
+                            receivers, null, 0, null, ClientEnum.TEACHER.getCode(), auditUser.getUsername(),imGroup.getName());
+                    } catch (Exception e) {
+                        log.warn("学生入群消息发送失败,{}",e.getMessage());
+                    }
+                }
             } catch (Exception e) {
-                log.warn("学生入群消息发送失败,{}",e.getMessage());
+                log.error("加入群组申请失败,{}", e.getMessage(), e);
+                throw new BizException("加入群组申请失败");
             }
-        }
+            return true;
+        }, null, 10L);
+
     }
 
     @Override
@@ -117,18 +151,53 @@ public class ImGroupMemberAuditServiceImpl extends ServiceImpl<ImGroupMemberAudi
         Optional.of(auditStatus).filter(e->e != AuditStatusEnum.AUDITING).orElseThrow(()->new BizException("操作失败:审核状态异常"));
         ImGroup imGroup = Optional.ofNullable(imGroupService.getById(groupId)).orElseThrow(() ->new BizException("群组信息不存在"));
         Optional.of(sysUserService.getUserId()).filter(imGroup.getCreateBy()::equals).orElseThrow(()->new BizException("操作失败:您没有审核权限"));
-        //修改审核状态
-        baseMapper.batchUpdateAuditStatus(auditIds,auditStatus.getCode());
-        if(auditStatus == AuditStatusEnum.OPEN){
-            List<ImGroupMemberAudit> imGroupMemberAudit = baseMapper.findByIds(auditIds);
-            Set<Long> userIds = imGroupMemberAudit.stream().map(ImGroupMemberAudit::getUserId).collect(Collectors.toSet());
-            List<ImGroupMember> groupMembers = imGroupMemberService.initGroupMembers(groupId,userIds, ImGroupMemberRoleType.STUDENT);
-            //同步群成员数量
-            imGroupService.getDao().updateMemberNum(imGroup.getId());
-            //加入融云群
-            imGroupMemberService.join(groupMembers,imGroup.getId());
-            sendMessage(auditIds);
+
+        // 增加群成员校验锁,当群成员人数达到限制时,不允许再次加入
+        String lockName = "klx:group_member_audit_lock:" + groupId;
+        DistributedLock.of(redissonClient).runIfLockToFunction(lockName, (x)-> {
+
+            // 校验群成员加入限制
+            String[] split = auditIds.split(",");
+            if (AuditStatusEnum.OPEN.equals(auditStatus) && !verifyGroupMemberJoinLimit(groupId, split.length)) {
+                SysConfig config = sysConfigService.findByParamName(SysConfigConstant.GROUP_MEMBER_LIMIT);
+                throw new BizException("群成员人数上限为:" + config.getParamValue() + "人");
+            }
+            try {
+                //修改审核状态
+                baseMapper.batchUpdateAuditStatus(auditIds,auditStatus.getCode());
+                if(auditStatus == AuditStatusEnum.OPEN){
+                    List<ImGroupMemberAudit> imGroupMemberAudit = baseMapper.findByIds(auditIds);
+                    Set<Long> userIds = imGroupMemberAudit.stream().map(ImGroupMemberAudit::getUserId).collect(Collectors.toSet());
+                    List<ImGroupMember> groupMembers = imGroupMemberService.initGroupMembers(groupId,userIds, ImGroupMemberRoleType.STUDENT);
+                    //同步群成员数量
+                    imGroupService.getDao().updateMemberNum(imGroup.getId());
+                    //加入融云群
+                    imGroupMemberService.join(groupMembers,imGroup.getId());
+                    sendMessage(auditIds);
+                }
+            } catch (Exception e) {
+                log.error("加入群组审核失败,{}", e.getMessage(), e);
+                throw new BizException("加入群组审核失败");
+            }
+            return true;
+        }, null, 10L);
+
+    }
+
+    /**
+     * 校验群成员加入限制
+     * @param groupId 群组ID
+     */
+    private Boolean verifyGroupMemberJoinLimit(String groupId, int addNum) {
+        // 统计群成员数量,大于等于群组最大人数时,不允许加入
+        int memberCount = imGroupMemberService.countGroupMember(groupId);
+        // 查询群成员人数限制
+        SysConfig config = sysConfigService.findByParamName(SysConfigConstant.GROUP_MEMBER_LIMIT);
+        if (Objects.nonNull(config) && Integer.parseInt(config.getParamValue()) > 0
+            && (memberCount + addNum) > Integer.parseInt(config.getParamValue())) {
+            return false;
         }
+        return true;
     }
 
     /**

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

@@ -266,5 +266,19 @@ public class ImGroupMemberServiceImpl extends ServiceImpl<ImGroupMemberDao, ImGr
     public IPage<ImGroupMemberWrapper.ImGroupMember> selectPage(IPage<ImGroupMemberWrapper.ImGroupMember> page, ImGroupMemberWrapper.ImGroupMemberQuery query) {
         return page.setRecords(imGroupMemberDao.selectPage(page, query));
     }
+
+    /**
+     * 获取群成员数量
+     *
+     * @param groupId 群ID
+     * @return int
+     */
+    @Override
+    public int countGroupMember(String groupId) {
+        if (org.apache.commons.lang3.StringUtils.isEmpty(groupId)) {
+            return 0;
+        }
+        return lambdaQuery().eq(ImGroupMember::getGroupId, groupId).count();
+    }
 }
 

+ 120 - 34
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImGroupServiceImpl.java

@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 import com.microsvc.toolkit.middleware.common.http.ImageUtil;
 import com.microsvc.toolkit.middleware.im.ImPluginContext;
 import com.microsvc.toolkit.middleware.im.message.GroupMemberWrapper;
@@ -33,9 +34,11 @@ import com.yonge.cooleshow.biz.dal.dto.search.StudentSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.TeacherSearch;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
 import com.yonge.cooleshow.biz.dal.enums.ImGroupMemberRoleType;
 import com.yonge.cooleshow.biz.dal.enums.ImGroupType;
 import com.yonge.cooleshow.biz.dal.enums.RoleEnum;
+import com.yonge.cooleshow.biz.dal.enums.im.EImUserFriendSourceForm;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.entity.CourseGroup;
 import com.yonge.cooleshow.biz.dal.entity.ImGroup;
@@ -64,6 +67,7 @@ import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.entity.UploadReturnBean;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.util.ThreadPool;
+import com.yonge.toolset.payment.util.DistributedLock;
 import com.yonge.toolset.utils.date.DateUtil;
 import io.rong.RongCloud;
 import io.rong.methods.message.history.History;
@@ -304,6 +308,12 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
     @Override
     @Transactional(rollbackFor = Exception.class)
     public String create(ImGroupWrapper.ImGroup imGroup) throws Exception {
+        // 群成员数量限制校验
+        SysConfig config = sysConfigService.findByParamName(SysConfigConstant.GROUP_MEMBER_LIMIT);
+        if (config != null && Integer.parseInt(config.getParamValue()) < (imGroup.getStudentIdList().size() + 1)) {
+            throw new BizException("群成员人数上限为:" + config.getParamValue() + "人");
+        }
+
         Date now = new Date();
         if (imGroup.getType() == null) {
             imGroup.setType(ImGroupType.FAN.getCode());
@@ -359,31 +369,57 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
             throw new BizException("添加的群成员不能为空");
 
         }
-        List<ImGroupMember> groupMemberList = imGroupMemberService.initGroupMembers(groupId,
-                studentIdList, ImGroupMemberRoleType.STUDENT);
-        imGroupMemberService.join(groupMemberList, groupId);
-
-        // 如果是机构群,学生自动添加老师好友
-        if (ImGroupType.ORG.equals(imGroup.getType())) {
-            List<ImGroupMember> teacherList = imGroupMemberService.lambdaQuery()
-                    .eq(ImGroupMember::getGroupId, groupId)
-                    .eq(ImGroupMember::getRoleType, ImGroupMemberRoleType.TEACHER)
-                    .list();
-            teacherList.forEach(teacher -> imUserFriendService.saveUserFriend(teacher.getUserId(), studentIdList));
-        }
+        // 增加群成员校验锁,当群成员人数达到限制时,不允许再次加入
+        String lockName = "klx:group_member_add_lock:" + groupId;
+        DistributedLock.of(redissonClient).runIfLockToFunction(lockName, (x)-> {
+            // 群成员数量限制校验
+            int memberCount = imGroupMemberService.countGroupMember(groupId);
+            // 查询群成员人数限制
+            SysConfig config = sysConfigService.findByParamName(SysConfigConstant.GROUP_MEMBER_LIMIT);
+            if (Objects.nonNull(config) && Integer.parseInt(config.getParamValue()) > 0
+                && (memberCount + studentIdList.size()) > Integer.parseInt(config.getParamValue())) {
+                throw new BizException("群成员人数上限为:" + config.getParamValue() + "人");
+            }
+
+            try {
+                List<ImGroupMember> groupMemberList = imGroupMemberService.initGroupMembers(groupId,
+                    studentIdList, ImGroupMemberRoleType.STUDENT);
+                imGroupMemberService.join(groupMemberList, groupId);
+
+                // 如果是机构群,学生自动添加老师好友
+                if (ImGroupType.ORG.equals(imGroup.getType())) {
+                    List<ImGroupMember> teacherList = imGroupMemberService.lambdaQuery()
+                        .eq(ImGroupMember::getGroupId, groupId)
+                        .eq(ImGroupMember::getRoleType, ImGroupMemberRoleType.TEACHER)
+                        .list();
+                    teacherList.forEach(teacher ->
+                            {
+                                imUserFriendService.saveUserFriend(teacher.getUserId(), studentIdList, EImUserFriendSourceForm.TEACHER);
+                                imUserFriendService.refreshCustomer(teacher.getUserId(), ClientEnum.TEACHER, new ArrayList<>(studentIdList), ClientEnum.STUDENT);
+                            }
+                    );
+                }
+            } catch (Exception e) {
+                log.error("加入群组失败,{}", e.getMessage(), e);
+                throw new BizException(e.getMessage());
+            }
+            return true;
+        }, null, 10L);
+
     }
 
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public String autoCreate(Long courseGroupId, String courseGroupType) throws Exception {
+    public String autoCreate(Long courseGroupId, String courseGroupType, List<Long> noGroupJoinUserIds) throws Exception {
         //获取课程组
         CourseGroup courseGroup = courseGroupService.getById(courseGroupId);
         if (courseGroup.getTeacherId() == null) {
             return null;
         }
-        //获取学员列表
-        Set<Long> studentIds = courseScheduleStudentPaymentDao.queryStudentIds(courseGroupId, courseGroupType);
+        //获取学员列表,按购买时间顺序升序排列返回
+        List<Long> studentIds = courseScheduleStudentPaymentDao.queryStudentIds(courseGroupId, courseGroupType);
+        // studentIds集合中所有null元素移除
         studentIds.removeAll(Collections.singleton(null));
         if (CollectionUtils.isEmpty(studentIds)) {
             return null;
@@ -391,7 +427,31 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
         Date now = new Date();
         Long teacherId = courseGroup.getTeacherId();
         //保存老师学员关联的通讯录xz
-        imUserFriendService.saveUserFriend(teacherId, studentIds);
+        imUserFriendService.saveUserFriend(teacherId, Sets.newHashSet(studentIds),EImUserFriendSourceForm.TEACHER);
+        imUserFriendService.refreshCustomer(teacherId, ClientEnum.TEACHER, new ArrayList<>(studentIds), ClientEnum.STUDENT);
+
+
+        // 直播课、琴房课校验群成员人数限制
+        if (CourseScheduleEnum.PIANO_ROOM_CLASS.getCode().equals(courseGroupType)
+            || CourseScheduleEnum.LIVE.getCode().equals(courseGroupType)) {
+
+            // 增加群成员人数限制,若超过限制则不添加到群组
+            SysConfig config = sysConfigService.findByParamName(SysConfigConstant.GROUP_MEMBER_LIMIT);
+            if (Objects.nonNull(config) && Integer.parseInt(config.getParamValue()) > 0) {
+                int groupMemberLimit = Integer.parseInt(config.getParamValue());
+                if ((CollectionUtils.size(studentIds) + 1) > groupMemberLimit) {
+
+                    // 已加入群组用户标记
+                    List<Long> userIds = Lists.newArrayList(studentIds);
+                    studentIds = userIds.subList(0, groupMemberLimit - 1);
+                    // 未加入群组用户标记
+                    noGroupJoinUserIds.addAll(userIds.subList(groupMemberLimit - 1, userIds.size()));
+                    // 重置用户入群加入标记
+                    courseScheduleStudentPaymentDao.updateGroupJoinStatus(courseGroupId, courseGroupType, false,
+                        noGroupJoinUserIds);
+                }
+            }
+        }
 
         //创建群聊
         ImGroup imGroup = new ImGroup();
@@ -408,25 +468,26 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
         imGroup.setCourseGroupId(courseGroupId);
 //        this.baseMapper.insert(imGroup);
 
-
         String groupId = createImGroup(imGroup);
-//        // 添加学生
-        List<ImGroupMember> groupMembers = imGroupMemberService.initGroupMembers(groupId, studentIds,
-                ImGroupMemberRoleType.STUDENT);
-        List<com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupMemberWrapper.ImGroupMember> groupMemberList = Lists.newArrayList();
-        for (ImGroupMember groupMember : groupMembers) {
-            groupMemberList.add(com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupMemberWrapper.ImGroupMember.builder()
-                    .groupId(groupMember.getGroupId())
-                    .userId(groupMember.getUserId())
-                    .clientType(groupMember.getRoleType().getCode())
-                    .avatar(groupMember.getAvatar())
-                    .nickname(groupMember.getNickname())
-                    .isAdmin(groupMember.getIsAdmin())
-                    .imUserId(getImUserId(groupMember.getUserId().toString(), groupMember.getRoleType().getCode()))
-                    .roleType(groupMember.getRoleType().getCode())
-                    .build());
+
+        if (!studentIds.isEmpty()) {
+            // 添加学生
+            List<ImGroupMember> groupMembers = imGroupMemberService.initGroupMembers(groupId, Sets.newHashSet(studentIds), ImGroupMemberRoleType.STUDENT);
+            List<com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupMemberWrapper.ImGroupMember> groupMemberList = Lists.newArrayList();
+            for (ImGroupMember groupMember : groupMembers) {
+                groupMemberList.add(com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupMemberWrapper.ImGroupMember.builder()
+                        .groupId(groupMember.getGroupId())
+                        .userId(groupMember.getUserId())
+                        .clientType(groupMember.getRoleType().getCode())
+                        .avatar(groupMember.getAvatar())
+                        .nickname(groupMember.getNickname())
+                        .isAdmin(groupMember.getIsAdmin())
+                        .imUserId(getImUserId(groupMember.getUserId().toString(), groupMember.getRoleType().getCode()))
+                        .roleType(groupMember.getRoleType().getCode())
+                        .build());
+            }
+            imGroupCoreService.saveImGroupMemberList(groupId, groupMemberList);
         }
-        imGroupCoreService.saveImGroupMemberList(groupId, groupMemberList);
         //处理本地群成员列表
         // 添加老师
 //        List<ImGroupMember> groupMembers = imGroupMemberService.initGroupMember(imGroupId, imGroup.getCreateBy(),
@@ -436,7 +497,7 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
 //        this.rtcCreate(courseGroup.getTeacherId(), imGroupId, imGroup.getName(),imGroup.getImg());
 //        //加入融云群
 //        imGroupMemberService.join(groupMembers, imGroupId);
-        return groupId.toString();
+        return groupId;
     }
 
 
@@ -612,6 +673,13 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
     public ImGroup findGroupInfoById(String groupId, Long userId) {
 
         ImGroup group = imGroupService.getById(groupId);
+        if (Objects.nonNull(group)) {
+            // 查询群成员人数限制
+            SysConfig byParamName = sysConfigService.findByParamName(SysConfigConstant.GROUP_MEMBER_LIMIT);
+            if (Objects.nonNull(byParamName)) {
+                group.setGroupMemberLimit(Integer.parseInt(byParamName.getParamValue()));
+            }
+        }
 
         // 异步执行自动加入群组功能
         ThreadPool.getExecutor().submit(() -> {
@@ -664,6 +732,24 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
         return group;
     }
 
+    /**
+     * 获取群信息
+     *
+     * @param groupId 群ID
+     * @return ImGroup
+     */
+    @Override
+    public ImGroup getGroupById(String groupId) {
+        ImGroup group = imGroupService.getById(groupId);
+        if (Objects.nonNull(group)) {
+            // 查询群成员人数限制
+            SysConfig byParamName = sysConfigService.findByParamName(SysConfigConstant.GROUP_MEMBER_LIMIT);
+            if (Objects.nonNull(byParamName)) {
+                group.setGroupMemberLimit(Integer.parseInt(byParamName.getParamValue()));
+            }
+        }
+        return group;
+    }
 
 
     /**

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

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dayaedu.cbs.openfeign.wrapper.music.CbsMusicSheetWrapper;
 import com.google.common.collect.Lists;
 import com.microsvc.toolkit.middleware.rtc.RTCRoomPluginService;
 import com.microsvc.toolkit.middleware.rtc.message.TencentRequest;
@@ -23,6 +24,7 @@ import com.yonge.cooleshow.common.entity.BaseResponse;
 import com.yonge.cooleshow.common.enums.ErrorEnum;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.utils.date.DateUtil;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -31,11 +33,11 @@ import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.support.TransactionTemplate;
-import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -85,7 +87,6 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
     private ImService imService;
     @Resource
     private TransactionTemplate transactionTemplate;
-
     @Override
     public ImNetworkRoomDao getDao() {
         return this.baseMapper;
@@ -114,9 +115,8 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
 
         ImNetworkRoomResult joinRoomResult = new ImNetworkRoomResult();
         String imUserId = imGroupService.getImUserId(sysUser.getUserId(), userRole);
-        List<CourseScheduleStudentMusicSheetResult> studentMusicSheetResults =
-                courseScheduleStudentMusicSheetService.getDao().queryBySheetIdAndCourseId(null,
-                        Long.parseLong(roomId), null, null, null);
+        List<CourseScheduleStudentMusicSheetResult> studentMusicSheetResults = this.initCourseScheduleStudentMusicScore(courseScheduleStudentMusicSheetService.getDao()
+                .queryBySheetIdAndCourseId(null,Long.parseLong(roomId), null, null, null));
         //获取学员列表
         List<CourseScheduleStudentPayment> studentPayments =
                 courseScheduleStudentPaymentService.lambdaQuery().eq(CourseScheduleStudentPayment::getCourseId,roomId).list();
@@ -184,6 +184,42 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
         return BaseResponse.success(joinRoomResult);
     }
 
+    private List<CourseScheduleStudentMusicSheetResult> initCourseScheduleStudentMusicScore(List<CourseScheduleStudentMusicSheetResult> scheduleStudentMusicScores) {
+        List<CourseScheduleStudentMusicSheetResult> result = new ArrayList<>();
+        if(CollectionUtils.isEmpty(scheduleStudentMusicScores)){
+            return result;
+        }
+        List<Long> musicSheetSoundIds = scheduleStudentMusicScores.stream().map(e->Long.parseLong(e.getMusicScoreAccompanimentId()))
+                .distinct().collect(Collectors.toList());
+        List<CbsMusicSheetWrapper.MusicSheetAccApplication> sheetApplications = this.getSheetApplications(musicSheetSoundIds);
+        Map<Long, CbsMusicSheetWrapper.MusicSheetAccApplication> sheetApplicationMap = sheetApplications.stream()
+                .collect(Collectors.toMap(CbsMusicSheetWrapper.MusicSheetAccApplication::getMusicSheetSoundId, Function.identity()));
+        for (CourseScheduleStudentMusicSheetResult studentMusicScore : scheduleStudentMusicScores) {
+            CbsMusicSheetWrapper.MusicSheetAccApplication sheetApplication =
+                    sheetApplicationMap.get(Long.parseLong(studentMusicScore.getMusicScoreAccompanimentId()));
+            if(sheetApplication == null) {
+                continue;
+            }
+            studentMusicScore.setMusicScoreName(sheetApplication.getName());
+            //管乐迷的历史问题,原音和伴奏反过来
+            studentMusicScore.setMp3Url(sheetApplication.getUrl());
+            studentMusicScore.setUrl(sheetApplication.getMp3Url());
+            result.add(studentMusicScore);
+        }
+        return result;
+    }
+
+    private List<CbsMusicSheetWrapper.MusicSheetAccApplication> getSheetApplications(List<Long> musicSheetSoundIds){
+        CbsMusicSheetWrapper.MusicSheetApplicationQuery query = musicSheetService.getMusicSheetApplicationQuery();
+        query.setRows(musicSheetSoundIds.size());
+        query.setMusicSheetSoundIds(musicSheetSoundIds);
+        List<CbsMusicSheetWrapper.MusicSheetAccApplication> applications = musicSheetService.queryCbsMusicSheetSoundApplication(query).getRows();
+        if (CollectionUtils.isEmpty(applications)) {
+            throw new BizException("曲目信息不存在");
+        }
+        return applications;
+    }
+
     @Override
     public BaseResponse<ImNetworkRoomResult> roomInfo(ImNetworkBaseDto imNetworkBaseDto) {
         // 当前登录用户ID
@@ -211,7 +247,8 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
         ImNetworkRoomMember roomMember = imNetworkRoomMemberService.lambdaQuery().eq(ImNetworkRoomMember::getRoomId,roomId)
                 .eq(ImNetworkRoomMember::getUserId,imUserId).last("LIMIT 1").one();
         List<CourseScheduleStudentMusicSheetResult> studentMusicSheetResults =
-                courseScheduleStudentMusicSheetService.getDao().queryBySheetIdAndCourseId(null, Long.parseLong(roomId), null, null, null);
+                this.initCourseScheduleStudentMusicScore(courseScheduleStudentMusicSheetService.getDao()
+                        .queryBySheetIdAndCourseId(null, Long.parseLong(roomId), null, null, null));
         if(!CollectionUtils.isEmpty(studentMusicSheetResults)){
             List<CourseScheduleStudentMusicSheetResult> musicScores = studentMusicSheetResults.stream().
                     filter(e -> e.getUserId().equals(userId)).collect(Collectors.toList());
@@ -249,8 +286,8 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
     }
 
     private void setMusicSheetList(List<ImNetworkRoomMemberResult> roomMemberList,Long courseScheduleId){
-        List<CourseScheduleStudentMusicSheetResult> musicSheetResults = courseScheduleStudentMusicSheetService.getDao().
-                queryBySheetIdAndCourseId(null,courseScheduleId,null,null,null);
+        List<CourseScheduleStudentMusicSheetResult> musicSheetResults = this.initCourseScheduleStudentMusicScore(courseScheduleStudentMusicSheetService.getDao().
+                queryBySheetIdAndCourseId(null,courseScheduleId,null,null,null));
         if (!CollectionUtils.isEmpty(musicSheetResults)) {
             //分组塞到学员列表中
             Map<String, List<CourseScheduleStudentMusicSheetResult>> musicSheetResultMap = musicSheetResults.stream().
@@ -380,14 +417,15 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
     @Transactional(rollbackFor = Exception.class)
     public void pushDownloadMusicSheetMsg(ImNetworkMusicSheetDto musicSheetDto) throws Exception {
         String roomId = Optional.ofNullable(musicSheetDto).map(ImNetworkBaseDto::getRoomId).orElseThrow(() -> new BizException("房间编号不能为空"));
-        Long accompanimentId = Optional.of(musicSheetDto).map(ImNetworkMusicSheetDto::getMusicScoreAccompanimentId).orElseThrow(() -> new BizException("伴奏编号不能为空"));
+        String accompanimentId = Optional.of(musicSheetDto).map(ImNetworkMusicSheetDto::getMusicScoreAccompanimentId).orElseThrow(() -> new BizException("伴奏编号不能为空"));
         log.info("pushDownloadMusicSheetMsg: roomId:{} ,accompanimentId:{}", roomId,accompanimentId);
         Long userId = sysUserService.getUserId();
-        MusicSheetAccompaniment accompaniment = musicSheetAccompanimentService.getById(accompanimentId);
         List<CourseScheduleStudentMusicSheetResult> scheduleStudentMusicSheetResults = courseScheduleStudentMusicSheetService.getDao().
                 queryBySheetIdAndCourseId(accompanimentId, Long.parseLong(roomId), null, null, 0);
 
-        if (scheduleStudentMusicSheetResults.isEmpty()) {
+        //获取曲目信息
+        CbsMusicSheetWrapper.MusicSheetAccApplication sheetApplication = this.getSheetApplication(accompanimentId);
+        if (CollectionUtils.isEmpty(scheduleStudentMusicSheetResults)) {
             //第一次下载,生成数据
             List<CourseScheduleStudentPayment> studentPayments =
                     courseScheduleStudentPaymentService.lambdaQuery().eq(CourseScheduleStudentPayment::getCourseId,roomId).list();
@@ -395,7 +433,7 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
             studentIds.forEach(e -> {
                 CourseScheduleStudentMusicSheetResult musicSheet = new CourseScheduleStudentMusicSheetResult();
                 musicSheet.setMusicScoreAccompanimentId(accompanimentId);
-                musicSheet.setSpeed(accompaniment.getSpeed());
+                musicSheet.setSpeed(sheetApplication.getPlaySpeed());
                 musicSheet.setCourseScheduleId(Long.parseLong(roomId));
                 musicSheet.setUserId(e);
                 musicSheet.setUserType(0);
@@ -403,7 +441,7 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
             });
             CourseScheduleStudentMusicSheetResult musicSheet = new CourseScheduleStudentMusicSheetResult();
             musicSheet.setMusicScoreAccompanimentId(accompanimentId);
-            musicSheet.setSpeed(accompaniment.getSpeed());
+            musicSheet.setSpeed(sheetApplication.getPlaySpeed());
             musicSheet.setCourseScheduleId(Long.parseLong(roomId));
             musicSheet.setUserId(userId);
             musicSheet.setUserType(1);
@@ -413,20 +451,14 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
         //通知学员下载伴奏
         // IM用户ID
         String imUserId = imGroupService.getImUserId(userId,musicSheetDto.getClientType());
+        MusicSheetAccompaniment accompaniment = musicSheetAccompanimentService.initSysMusicScoreAccompaniment(sheetApplication);
+        accompaniment.setId(accompanimentId);
         ImNetworkMusicSheetDownloadMessageContent content = JSON.parseObject(JSON.toJSONString(accompaniment), ImNetworkMusicSheetDownloadMessageContent.class);
         if(StringUtils.isNotEmpty(accompaniment.getMusicSubjectId())){
             content.setSubjectId(Integer.parseInt(accompaniment.getMusicSubjectId()));
         }
-        content.setMp3Url(accompaniment.getAudioFileUrl());
-        if(accompaniment.getMusicSheetId() != null){
-            content.setExamSongId(accompaniment.getMusicSheetId().intValue());
-            MusicSheet musicSheet = musicSheetService.getById(accompaniment.getMusicSheetId());
-            if(musicSheet != null){
-                content.setUrl(StringUtils.isNotEmpty(musicSheet.getAudioFileUrl())?musicSheet.getAudioFileUrl()
-                        :StringUtils.isNotEmpty(musicSheet.getMetronomeUrl())?musicSheet.getMetronomeUrl()
-                        :musicSheet.getUrl());
-            }
-        }
+        content.setMp3Url(accompaniment.getMetronomeUrl());
+        content.setUrl(accompaniment.getAudioFileUrl());
         BasicUserInfo basicUserInfo = teacherDao.getBasicUserInfo(userId);
         basicUserInfo.setImUserId(imUserId);
         CourseSchedule courseSchedule = courseScheduleService.getById(roomId);
@@ -543,7 +575,7 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
             long scheduleId = Long.parseLong(roomId);
             switch (deviceControl.getDeviceType()) {
                 case MUSIC_SHEET:
-                    Integer musicSheetId = Optional.ofNullable(deviceControl.getMusicScoreAccompanimentId()).
+                    String musicSheetId = Optional.ofNullable(deviceControl.getMusicScoreAccompanimentId()).
                             orElseThrow(()-> new BizException("请选择曲目"));
                     //关闭所有曲目播放
                     courseScheduleStudentMusicSheetService.getDao().closePlayStatus(scheduleId,userId);
@@ -551,7 +583,7 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
                     courseScheduleStudentMusicSheetService.getDao().openPlayStatus(scheduleId,musicSheetId,userId);
                     break;
                 case ACCOMPANIMENT:
-                  Integer musicSheetAccompanimentId = Optional.ofNullable(deviceControl.getMusicScoreAccompanimentId()).
+                    String musicSheetAccompanimentId = Optional.ofNullable(deviceControl.getMusicScoreAccompanimentId()).
                             orElseThrow(()-> new BizException("请选择曲目"));
                     //关闭所有曲目播放
                     courseScheduleStudentMusicSheetService.getDao().closePlayStatus(scheduleId,userId);
@@ -649,17 +681,15 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
     @Transactional(rollbackFor = Exception.class)
     public void musicSheetDownNotify(ImNetworkMusicSheetDto musicSheetDto) throws Exception {
         String roomId = Optional.ofNullable(musicSheetDto).map(ImNetworkBaseDto::getRoomId).orElseThrow(() -> new BizException("房间编号不能为空"));
-        Long accompanimentId = Optional.of(musicSheetDto).map(ImNetworkMusicSheetDto::getMusicScoreAccompanimentId).orElseThrow(() -> new BizException("伴奏编号不能为空"));
+        String accompanimentId = Optional.of(musicSheetDto).map(ImNetworkMusicSheetDto::getMusicScoreAccompanimentId).orElseThrow(() -> new BizException("伴奏编号不能为空"));
         Integer status = Optional.of(musicSheetDto).map(ImNetworkMusicSheetDto::getStatus).orElseThrow(() -> new BizException("伴奏下载状态不能为空"));
         log.info("musicSheetDownNotify: roomId:{} ,accompanimentId:{} ,status:{}", roomId,accompanimentId,status);
         Long userId = sysUserService.getUserId();
-        List<CourseScheduleStudentMusicSheetResult> studentMusicSheetResults = courseScheduleStudentMusicSheetService.getDao().
-                queryBySheetIdAndCourseId(accompanimentId, Long.parseLong(roomId),userId, null, null);
+        List<CourseScheduleStudentMusicSheetResult> studentMusicSheetResults = this.initCourseScheduleStudentMusicScore(courseScheduleStudentMusicSheetService.getDao().
+                queryBySheetIdAndCourseId(accompanimentId, Long.parseLong(roomId),userId, null, null));
         if(CollectionUtils.isEmpty(studentMusicSheetResults)){
             return;
         }
-        Optional.ofNullable(musicSheetAccompanimentService.getById(accompanimentId)).
-                orElseThrow(()-> new BizException("曲目信息不存在"));
         //修改下载状态
         CourseScheduleStudentMusicSheetResult musicSheetResult = studentMusicSheetResults.get(0);
         musicSheetResult.setDownStatus(status);
@@ -691,4 +721,15 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
             return Boolean.TRUE;
         });
     }
+
+    private CbsMusicSheetWrapper.MusicSheetAccApplication getSheetApplication(String musicSheetSoundId){
+        CbsMusicSheetWrapper.MusicSheetApplicationQuery query = musicSheetService.getMusicSheetApplicationQuery();
+        query.setRows(1);
+        query.setMusicSheetSoundId(Long.parseLong(musicSheetSoundId));
+        List<CbsMusicSheetWrapper.MusicSheetAccApplication> applications = musicSheetService.queryCbsMusicSheetSoundApplication(query).getRows();
+        if (org.apache.commons.collections.CollectionUtils.isEmpty(applications)) {
+            throw new BizException("曲目信息不存在");
+        }
+        return applications.get(0);
+    }
 }

+ 194 - 44
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImUserFriendServiceImpl.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
@@ -15,24 +16,35 @@ import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.auth.config.CustomerServiceConfig;
 import com.yonge.cooleshow.biz.dal.dao.ImUserFriendDao;
+import com.yonge.cooleshow.biz.dal.dao.StudentDao;
 import com.yonge.cooleshow.biz.dal.dao.TeacherDao;
 import com.yonge.cooleshow.biz.dal.dto.BasicUserInfo;
 import com.yonge.cooleshow.biz.dal.entity.ImUserFriend;
+import com.yonge.cooleshow.biz.dal.entity.Student;
+import com.yonge.cooleshow.biz.dal.entity.Subject;
+import com.yonge.cooleshow.biz.dal.entity.Teacher;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.MK;
+import com.yonge.cooleshow.biz.dal.enums.im.EImUserFriendSourceForm;
 import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
 import com.yonge.cooleshow.biz.dal.service.ImGroupService;
 import com.yonge.cooleshow.biz.dal.service.ImUserFriendService;
+import com.yonge.cooleshow.biz.dal.service.SubjectService;
+import com.yonge.cooleshow.biz.dal.service.SysConfigService;
+import com.yonge.cooleshow.biz.dal.service.VipCardRecordService;
+import com.yonge.cooleshow.biz.dal.vo.StudentVo;
+import com.yonge.cooleshow.biz.dal.vo.TeacherVo;
+import com.yonge.cooleshow.biz.dal.vo.im.ImUserFriendVO;
+import com.yonge.cooleshow.biz.dal.wrapper.VipCardRecordWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.im.CustomerService;
 import com.yonge.cooleshow.biz.dal.wrapper.im.ImUserWrapper;
+import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.util.ImUtil;
 import io.rong.messages.BaseMessage;
 import io.rong.messages.ImgMessage;
 import io.rong.messages.TxtMessage;
-import io.rong.models.message.PrivateMessage;
 import io.rong.models.message.PushExt;
-import io.rong.models.response.ResponseResult;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -41,13 +53,11 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
-import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
 
@@ -78,14 +88,28 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
 
     @Autowired
     private ImPluginContext imPluginContext;
+    @Autowired
+    private StudentDao studentDao;
+    @Autowired
+    private SubjectService subjectService;
+    @Autowired
+    private VipCardRecordService vipCardRecordService;
+    @Autowired
+    private SysConfigService sysConfigService;
     @Override
     public ImUserFriendDao getDao() {
         return this.baseMapper;
     }
 
+    /**
+     *
+     * @param teacherId 老师ID
+     * @param studentIds  学生列表
+     * @param sourceForm 建立关系方式,TEACHER:已老师身份添加或更新关系,CUSTOMER:以客服身份添加或者更新关系
+     */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void saveUserFriend(Long teacherId, Set<Long> studentIds) {
+    public void saveUserFriend(Long teacherId, Set<Long> studentIds, EImUserFriendSourceForm sourceForm) {
         if (CollectionUtils.isEmpty(studentIds)) {
             return;
         }
@@ -119,6 +143,7 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
             teacherFriend.setFriendId(studentId);
             teacherFriend.setFriendType(ClientEnum.STUDENT);
             teacherFriend.setUserId(teacherId);
+            teacherFriend.setSourceForm(sourceForm);
             teacherFriend.setCreateTime(now);
             teacherFriend.setUpdateTime(now);
 
@@ -126,6 +151,7 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
             studentFriend.setFriendId(teacherId);
             studentFriend.setFriendType(ClientEnum.TEACHER);
             studentFriend.setUserId(studentId);
+            studentFriend.setSourceForm(sourceForm);
             studentFriend.setCreateTime(now);
             studentFriend.setUpdateTime(now);
             imUserFriends.add(teacherFriend);
@@ -136,7 +162,7 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void saveUserTeacherFriend(Long teacherId, Set<Long> teacherIds) {
+    public void saveUserTeacherFriend(Long teacherId, Set<Long> teacherIds, EImUserFriendSourceForm sourceForm) {
         if (CollectionUtils.isEmpty(teacherIds)) {
             return;
         }
@@ -166,6 +192,7 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
             teacherFriend.setFriendId(studentId);
             teacherFriend.setFriendType(ClientEnum.TEACHER);
             teacherFriend.setUserId(teacherId);
+            teacherFriend.setSourceForm(sourceForm);
             teacherFriend.setCreateTime(now);
             teacherFriend.setUpdateTime(now);
 
@@ -173,6 +200,7 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
             studentFriend.setFriendId(teacherId);
             studentFriend.setFriendType(ClientEnum.TEACHER);
             studentFriend.setUserId(studentId);
+            studentFriend.setSourceForm(sourceForm);
             studentFriend.setCreateTime(now);
             studentFriend.setUpdateTime(now);
             imUserFriends.add(teacherFriend);
@@ -183,61 +211,86 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public ImUserFriend getDetail(String imUserId, ClientEnum clientType) {
+    public ImUserFriendVO.ImUserFriend getDetail(String imUserId, ClientEnum clientType) {
 
         // 用户ID
         long userId = Long.parseLong(imGroupService.analysisImUserId(imUserId));
 
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         BasicUserInfo basicUserInfo = teacherDao.getBasicUserInfo(userId);
-        if (sysUser != null && sysUser.getId() != null) {
-
-            ImUserFriend imUserFriend = lambdaQuery()
-                    .eq(ImUserFriend::getUserId, sysUser.getId())
-                    .eq(ImUserFriend::getClientType, clientType)
-                    .eq(ImUserFriend::getFriendId, userId)
-                    .one();
-            if (Objects.nonNull(imUserFriend)) {
-                //更新当前用户关联的该用户的详情信息
-                imUserFriend.setFriendAvatar(basicUserInfo.getAvatar());
-                imUserFriend.setFriendNickname(basicUserInfo.getUsername());
-                imUserFriend.setUpdateTime(new Date());
-                baseMapper.updateById(imUserFriend);
-
-                // 设置融云IM好友ID
-                imUserFriend.setImFriendId(imUserId);
-
-                return imUserFriend;
+        if (basicUserInfo == null) {
+            throw new BizException("无效的用户");
+        }
+
+        String friendClientType = imGroupService.analysisImUserClient(imUserId);
+        ImUserFriend imUserFriend = lambdaQuery()
+                .eq(ImUserFriend::getUserId, sysUser.getId())
+                .eq(ImUserFriend::getClientType, clientType)
+                .eq(ImUserFriend::getFriendId, userId)
+                .eq(ImUserFriend::getFriendType, ClientEnum.valueOf(friendClientType))
+                .one();
+        if (Objects.nonNull(imUserFriend)) {
+            //更新当前用户关联的该用户的详情信息
+            imUserFriend.setFriendAvatar(basicUserInfo.getAvatar());
+            imUserFriend.setFriendNickname(basicUserInfo.getUsername());
+            imUserFriend.setUpdateTime(new Date());
+            baseMapper.updateById(imUserFriend);
+
+            // 设置融云IM好友ID
+            imUserFriend.setImFriendId(imUserId);
+        } else {
+            // 好友身份类型
+            ClientEnum friendType = ClientEnum.TEACHER;
+            if (ClientEnum.STUDENT.match(imGroupService.analysisImUserClient(imUserId))) {
+                friendType = ClientEnum.STUDENT;
             }
+            // 返回当前登录用户信息
+            imUserFriend = new ImUserFriend();
+            imUserFriend.setFriendAvatar(basicUserInfo.getAvatar());
+            imUserFriend.setFriendNickname(basicUserInfo.getUsername());
+            imUserFriend.setFriendId(userId);
+            imUserFriend.setFriendType(friendType);
+            // 设置融云IM好友ID
+            imUserFriend.setImFriendId(imUserId);
         }
 
-        // 好友身份类型
-        ClientEnum friendType = ClientEnum.TEACHER;
-        if (ClientEnum.STUDENT.match(imGroupService.analysisImUserClient(imUserId))) {
-            friendType = ClientEnum.STUDENT;
+        ImUserFriendVO.ImUserFriend result = JSON.parseObject(JSON.toJSONString(imUserFriend), ImUserFriendVO.ImUserFriend.class);
+        result.setFriendGender(basicUserInfo.getGender());
+
+        if (ClientEnum.STUDENT.getCode().equals(friendClientType)) {
+            StudentVo detail = studentDao.detail(userId);
+            if (detail != null && StringUtils.isNotEmpty(detail.getSubjectId())) {
+                List<Subject> subject = subjectService.findBySubjectByIdList(detail.getSubjectId());
+                String subjectName = subject.stream().map(Subject::getName).collect(Collectors.joining("、"));
+                result.setFriendSubjectName(subjectName);
+            }
+        } else if (ClientEnum.TEACHER.getCode().equals(friendClientType)) {
+            TeacherVo detail = teacherDao.detail(userId);
+            if (detail != null && StringUtils.isNotEmpty(detail.getSubjectId())) {
+                List<Subject> subject = subjectService.findBySubjectByIdList(detail.getSubjectId());
+                String subjectName = subject.stream().map(Subject::getName).collect(Collectors.joining("、"));
+                result.setFriendSubjectName(subjectName);
+            }
         }
-        // 返回当前登录用户信息
-        ImUserFriend imUserFriend = new ImUserFriend();
-        imUserFriend.setFriendAvatar(basicUserInfo.getAvatar());
-        imUserFriend.setFriendNickname(basicUserInfo.getUsername());
-        imUserFriend.setFriendId(userId);
-        imUserFriend.setFriendType(friendType);
-        // 设置融云IM好友ID
-        imUserFriend.setImFriendId(imUserId);
-
-        return imUserFriend;
+        VipCardRecordWrapper.UserVip userVip = vipCardRecordService.UserVipInfo(userId, ClientEnum.valueOf(friendClientType));
+        result.setUserVip(userVip);
+        result.setFriendBirthdate(basicUserInfo.getBirthdate());
+        return result;
     }
 
     /**
      * 新用户自动添加客服
      *
      * @param userId     新用户ID
-     * @param friendIds  好友ID
+     * @param friendIds  好友ID,客服ID
      * @param clientType 客户端类型
      * @return Integer
      */
     @Override
     public Integer registerUserBindCustomerService(Long userId, List<Long> friendIds, ClientEnum clientType) {
+        if(userId == null || CollectionUtils.isEmpty(friendIds)){
+            return 0;
+        }
 
         SysUser sysUser = sysUserMapper.getByUserId(userId);
         try {
@@ -246,12 +299,32 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
         } catch (Exception e) {
             log.error("注册用户失败:" + userId + ",type:" + clientType);
         }
+        // 判断是否是同一机构
+        EImUserFriendSourceForm sourceForm = EImUserFriendSourceForm.CUSTOMER;
+        Teacher customer = teacherDao.selectById(friendIds.get(0));
+        if (customer.getTenantId() != null && customer.getTenantId() > 0) {
+            if (ClientEnum.STUDENT.equals(clientType)) {
+                Student student = studentDao.selectById(userId);
+                if (customer.getTenantId().equals(student.getTenantId())) {
+                    sourceForm = EImUserFriendSourceForm.TEACHER;
+
+                }
+            } else if (ClientEnum.TEACHER.equals(clientType)) {
+                Teacher teacher = teacherDao.selectById(userId);
+                if (customer.getTenantId().equals(teacher.getTenantId())) {
+                    sourceForm = EImUserFriendSourceForm.TEACHER;
+                }
+            }
+        }
+
         // 添加新用户好友,客服默认为老师身份
         for (Long teacherId : friendIds) {
             if (ClientEnum.STUDENT == clientType) {
-                saveUserFriend(teacherId, Sets.newHashSet(userId));
+                saveUserFriend(teacherId, Sets.newHashSet(userId), sourceForm);
+                studentDao.update(null, new UpdateWrapper<Student>().lambda().eq(Student::getUserId, userId).set(Student::getCustomerId, teacherId));
             } else if (ClientEnum.TEACHER == clientType) {
-                saveUserTeacherFriend(teacherId, Sets.newHashSet(userId));
+                saveUserTeacherFriend(teacherId, Sets.newHashSet(userId), sourceForm);
+                teacherDao.update(null, new UpdateWrapper<Teacher>().lambda().eq(Teacher::getUserId, userId).set(Teacher::getCustomerId, teacherId));
             }
 
             // 新注册用户为老师身份时,更新好友关系为老师身份
@@ -280,12 +353,12 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
         try {
 
             // 设置默认值
-            String customerMessage = customerServiceConfig.getCustomerMessage();
+            String customerMessage = sysConfigService.findConfigValue(SysConfigConstant.CUSTOMER_SERVICE_ADD_MSG);
             if (StringUtils.isEmpty(customerMessage)) {
                 customerMessage = MK.IM_SYS_FRIEND;
             }
 
-            String customerTitle = customerServiceConfig.getCustomerTitle();
+            String customerTitle = sysConfigService.findConfigValue(SysConfigConstant.CUSTOMER_SERVICE_ADD_MSG_TITLE);
             if (StringUtils.isEmpty(customerTitle)) {
                 customerTitle = MK.IM_SYS_TITLE;
             }
@@ -332,6 +405,63 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
     }
 
     /**
+     * 与客服建立好友关系时,客服给好友发送消息
+     */
+    @Override
+    public void sendCustomerServiceAddFriendMessage(Long customerServiceId, String sendTitle, String sendMessage, List<Long> friendIds, ClientEnum friendType) {
+
+        if (customerServiceId == null || CollectionUtils.isEmpty(friendIds)) {
+            return;
+        }
+
+        try {
+            if (StringUtils.isEmpty(sendMessage)) {
+                sendMessage = MK.IM_SYS_FRIEND;
+            }
+
+            if (StringUtils.isEmpty(sendTitle)) {
+                sendTitle = MK.IM_SYS_TITLE;
+            }
+
+            // 拓展消息
+            PushExt pushExt = PushExt.build(sendTitle, 1,
+                    new PushExt.HW("channelId", "NORMAL"), new PushExt.VIVO("1"),
+                    new PushExt.APNs("", ""),
+                    new PushExt.OPPO(""));
+
+
+            List<String> targetIds = friendIds.stream().map(n -> imGroupService.getImUserId(n, friendType)).collect(Collectors.toList());
+            MessageWrapper.PrivateMessage build = MessageWrapper.PrivateMessage.builder()
+                    .senderId(imGroupService.getImUserId(customerServiceId.toString(), ClientEnum.TEACHER.getCode()))
+                    .targetIds(targetIds)
+                    //.objectName(txtMessage.getType())
+                    //.rongCloueMessage(txtMessage)
+                    .pushExt(JSON.toJSONString(pushExt))
+                    .includeSender(0)
+                    .build();
+
+
+            if (TencentCloudImPlugin.PLUGIN_NAME.equals(imPluginContext.defaultService())) {
+                // 腾讯IM消息
+                TencentRequest.MessageBody message = TencentRequest.MessageBody.builder()
+                        .msgType(ETencentMessage.TIMTextElem.name())
+                        .msgContent(TencentRequest.TextMessageBody.builder().text(sendMessage).build())
+                        .build();
+
+                Boolean ret = imPluginContext.getPluginService().sendPrivateMessage(build.objectName(message.getMsgType()).tencentMessage(message));
+                log.info("registerUserBindCustomerService GROUP tencentCloud senderId={}, ret={}", build.getSenderId(), ret);
+            } else {
+                // 融云IM消息
+                TxtMessage message = new TxtMessage(sendMessage, "");
+                Boolean ret = imPluginContext.getPluginService().sendPrivateMessage(build.objectName(message.getType()).rongCloueMessage(message));
+                log.info("registerUserBindCustomerService GROUP rongCloud senderId={}, ret={}", build.getSenderId(), ret);
+            }
+        } catch (Exception e) {
+            log.error("registerUserBindCustomerService userId={}", customerServiceId, e);
+        }
+    }
+
+    /**
      * 发送系统客服消息
      *
      * @param sender 发送者
@@ -493,5 +623,25 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
     public void delStudentFriendByTenantId(Long tenantId, Long userId, String clientType) {
         this.baseMapper.delStudentFriendByTenantId(tenantId, userId, clientType);
     }
+
+    @Override
+    public void refreshCustomer(Long userId, ClientEnum userClientType, List<Long> friendIds, ClientEnum friendClientType) {
+
+        this.lambdaUpdate()
+                .set(ImUserFriend::getSourceForm, EImUserFriendSourceForm.TEACHER)
+                .eq(ImUserFriend::getUserId, userId)
+                .eq(ImUserFriend::getClientType, userClientType)
+                .in(ImUserFriend::getFriendId, friendIds)
+                .eq(ImUserFriend::getFriendType, friendClientType)
+                .update();
+
+        this.lambdaUpdate()
+                .set(ImUserFriend::getSourceForm, EImUserFriendSourceForm.TEACHER)
+                .in(ImUserFriend::getUserId, friendIds)
+                .eq(ImUserFriend::getClientType, friendClientType)
+                .eq(ImUserFriend::getFriendId, userId)
+                .eq(ImUserFriend::getFriendType, userClientType)
+                .update();
+    }
 }
 

+ 244 - 57
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MemberPriceSettingsServiceImpl.java

@@ -3,11 +3,13 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.collect.Lists;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dao.UserOrderDao;
 import com.yonge.cooleshow.biz.dal.dto.ActivityPlanRewardDto;
-import com.yonge.cooleshow.biz.dal.dto.VipSubmitReq;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
+import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.entity.VipCardRecord;
@@ -21,15 +23,14 @@ import com.yonge.cooleshow.biz.dal.vo.*;
 
 import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
 import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
-import com.yonge.cooleshow.common.constant.SysConfigConstant;
+import com.yonge.cooleshow.biz.dal.wrapper.VipCardRecordWrapper;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.ActivityShareEnum;
-import com.yonge.cooleshow.common.enums.RewardTypeEnum;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.exception.BizException;
-import com.yonge.toolset.base.string.MessageFormatter;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import com.yonge.toolset.utils.date.DateUtil;
+import org.joda.time.DateTime;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -37,9 +38,11 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import com.yonge.cooleshow.biz.dal.dto.search.MemberPriceSettingsSearch;
 import com.yonge.cooleshow.biz.dal.dao.MemberPriceSettingsDao;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.util.*;
+import java.util.stream.Collectors;
 
 
 @Service
@@ -66,6 +69,9 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
     private UserOrderService userOrderService;
 
     @Autowired
+    private UserOrderDao userOrderDao;
+
+    @Autowired
     private RedisCacheService redisCacheService;
 
     @Override
@@ -88,16 +94,32 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
     public HttpResponseResult<OrderCreateRes> orderCreate(OrderReq.OrderReqInfo orderReqInfo) {
         MemberPriceSettingsVo detail = detail(Long.parseLong(orderReqInfo.getBizContent().toString()));
         if (null == detail) {
-            return HttpResponseResult.failed("未找到会员卡信息");
+            return HttpResponseResult.failed("产品信息已更新,请重新选择");
+        }
+
+        if (!orderReqInfo.getOrderType().name().equals(detail.getVipType().name())) {
+            return HttpResponseResult.failed("产品信息已更新,请重新选择");
         }
 
+        if (Boolean.FALSE.equals(detail.getStatus())) {
+            return HttpResponseResult.failed("产品信息已更新,请重新选择");
+        }
+
+
+        // 判断是否有待支付订单 如果有返回不可下单
+        checkOrder(orderReqInfo.getOrderClient(), orderReqInfo.getOrderType().name(), orderReqInfo.getUserId());
+
+
+        checkVip(detail, orderReqInfo.getVipEndDays(), orderReqInfo.getUserId(), orderReqInfo.getOrderClient(), orderReqInfo.getGoodsNum(),orderReqInfo.getBizPrice());
+
         OrderCreateRes orderCreateRes = new OrderCreateRes();
         BigDecimal couponAmount = BigDecimal.ZERO;
         ActivityPlanVo activityPlanVo = activityPlanService.detail(orderReqInfo.getActivityId());
 
         if (activityPlanVo != null && activityPlanVo.getActivityState() == 1) {
             for (ActivityPlanRewardDto activityPlanRewardDto : activityPlanVo.getActivityRewardList()) {
-                if (activityPlanRewardDto.getActivityReward().getUnit().getCode().equals(detail.getPeriod().getCode())) {
+                if (activityPlanRewardDto.getActivityReward().getRewardType().getCode().equals(detail.getVipType().getCode())
+                && activityPlanRewardDto.getActivityReward().getUnit().getCode().equals(detail.getPeriod().getCode())) {
                     couponAmount = activityPlanRewardDto.getActivityReward().getDiscountPrice();
                     orderCreateRes.setActivityId(activityPlanVo.getId());
                     orderCreateRes.setRewardId(activityPlanRewardDto.getActivityReward().getId());
@@ -110,14 +132,70 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
         orderCreateRes.setMerchId(0l);
         orderCreateRes.setBizId(detail.getId());
         orderCreateRes.setBizContent("会员卡购买-" + detail.getPeriod().getMsg());
-        orderCreateRes.setGoodNum(1);
-        orderCreateRes.setOriginalPrice(detail.getOriginalPrice());
-        orderCreateRes.setCouponAmount(couponAmount);
-        orderCreateRes.setExpectPrice(detail.getSalePrice());
+        orderCreateRes.setGoodNum(orderReqInfo.getGoodsNum());
+        orderCreateRes.setOriginalPrice(detail.getOriginalPrice().multiply(new BigDecimal(orderReqInfo.getGoodsNum())));
+        orderCreateRes.setCouponAmount(couponAmount.multiply(new BigDecimal(orderReqInfo.getGoodsNum())));
+        orderCreateRes.setExpectPrice(detail.getSalePrice().multiply(new BigDecimal(orderReqInfo.getGoodsNum())));
         orderCreateRes.setSourceType(SourceTypeEnum.PLATFORM);
+        UserPaymentOrderWrapper.VipDays vipDays = new UserPaymentOrderWrapper.VipDays();
+        vipDays.setVipEndDays(orderReqInfo.getVipEndDays());
+        orderCreateRes.setBizJson(JSON.toJSONString(vipDays));
         return HttpResponseResult.succeed(orderCreateRes);
     }
 
+    private void checkVip(MemberPriceSettingsVo detail, Integer vipDays, Long userId, ClientEnum client, Integer num, BigDecimal bizPrice) {
+        // 判断会员剩余天数是否改变
+        if (detail.getVipType() == EVipType.SVIP && vipDays != null && vipDays > 0) {
+            VipCardRecordWrapper.UserVip userVip = vipCardRecordService.userVipInfo(userId, client);
+            if (!userVip.getVipEndDays().equals(vipDays)) {
+                throw new BizException(998, "您当前VIP天数更新,请刷新后尝试");
+            }
+            // 判断能不能升级
+            // 按时间区分 个数
+            int days = getSvipDays(detail, num, userVip);
+            if (days < userVip.getVipEndDays()) {
+                throw new BizException(998, "您当前VIP天数更新,请刷新后尝试");
+            }
+        }
+        if (bizPrice !=null && detail.getSalePrice().compareTo(bizPrice) !=0) {
+            throw new BizException(999, "产品信息已更新,请重新选择");
+
+        }
+    }
+
+    private int getSvipDays(MemberPriceSettingsVo detail, Integer num, VipCardRecordWrapper.UserVip userVip) {
+        Integer timeNum = num;
+
+        // 判断当前时间 加 一段时间后,和当前天数比较
+        Date svipStartDate = new Date();
+        if (userVip.getSvipEndDate() != null) {
+            svipStartDate = userVip.getSvipEndDate();
+        }
+
+        DateTime dateTime = DateTime.parse(DateUtil.format(svipStartDate, "yyyy-MM-dd"))
+            .withHourOfDay(23)
+            .withMinuteOfHour(59)
+            .withSecondOfMinute(59)
+            .withMillisOfSecond(0);
+        if (PeriodEnum.DAY.equals(detail.getPeriod())) {
+            dateTime=dateTime.plusDays(timeNum);
+        } else if (PeriodEnum.MONTH.equals(detail.getPeriod())) {
+            dateTime=dateTime.plusMonths(timeNum);
+        } else if (PeriodEnum.QUARTERLY.equals(detail.getPeriod())) {
+            dateTime=dateTime.plusMonths(3 * timeNum);
+        } else if (PeriodEnum.YEAR_HALF.equals(detail.getPeriod())) {
+            dateTime=dateTime.plusMonths(6 * timeNum);
+        } else if (PeriodEnum.YEAR.equals(detail.getPeriod())) {
+            dateTime=dateTime.plusYears(timeNum);
+        } else if (PeriodEnum.PERPETUAL.equals(detail.getPeriod())) {
+            dateTime=dateTime.plusYears(100);
+        }
+        Date date = dateTime.toDate();
+        // 比较两个时间 天数差
+        int days = DateUtil.daysBetween(svipStartDate, date);
+        return days;
+    }
+
     @Override
     public void orderSuccess(UserOrderDetailVo orderDetailVo) {
         orderSuccess(orderDetailVo,true);
@@ -126,25 +204,101 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
     @Override
     public void orderSuccess(UserOrderDetailVo orderDetailVo,boolean messageFlag) {
 
-        VipCardRecord vipCardRecord = vipCardRecordService.buildVipCardRecordByOrderDetail(orderDetailVo);
+        if (null == orderDetailVo) {
+            return;
+        }
+        MemberPriceSettingsVo detail = detail(orderDetailVo.getBizId());
+
+
+        VipCardRecordWrapper.AddVipCardRecord addVipCardRecord = new VipCardRecordWrapper.AddVipCardRecord();
+
+        addVipCardRecord.setUserId(orderDetailVo.getUserId());
+        addVipCardRecord.setClientType(orderDetailVo.getOrderClient());
+        addVipCardRecord.setStatus(EVipRecordStatus.ADD);
+        addVipCardRecord.setVipType(detail.getVipType());
+        addVipCardRecord.setType(detail.getPeriod());
+        addVipCardRecord.setTimes(orderDetailVo.getGoodNum());
+        addVipCardRecord.setSendMsg(false);
+        addVipCardRecord.setSourceType(SourceTypeEnum.ORDER);
+        addVipCardRecord.setCreateBy(orderDetailVo.getUserId());
+        addVipCardRecord.setOrderNo(orderDetailVo.getOrderNo());
+        addVipCardRecord.setSubOrderNo(orderDetailVo.getSubOrderNo());
+        addVipCardRecord.setVipCardId(orderDetailVo.getBizId());
+        addVipCardRecord.setOrderFlag(true);
+
+        // 判断转换天数
+
+        VipCardRecordWrapper.UserVip userVip = vipCardRecordService.userVipInfo(orderDetailVo.getUserId(), orderDetailVo.getOrderClient());
+        int svipDays = getSvipDays(detail, orderDetailVo.getGoodNum(), userVip);
+        if (detail.getVipType() == EVipType.SVIP &&userVip.getVipEndDays() !=null && svipDays >=userVip.getVipEndDays()) {
+            addVipCardRecord.setVipDays(userVip.getVipEndDays());
+            if (userVip.getVipType() == EVipType.VIP) {
+                addVipCardRecord.setVipDays(Math.max(userVip.getVipEndDays()-1,0));
+            }
+        }
+
+        addVipCardRecord.setReason("会员购买");
+        vipCardRecordService.add(addVipCardRecord);
 
-        UserVipInfoVo userVipInfoVo = getUserVipInfoVo(vipCardRecord);
         //会员购买消息推送
         if (messageFlag) {
-            authSend(userVipInfoVo.getUserId(), userVipInfoVo.getPhone(), DateUtil.format(vipCardRecord.getEndTime(), DateUtil.DEFAULT_PATTERN), orderDetailVo.getOrderClient());
+
+            SysUser sysUser = sysUserFeignService.queryUserById(orderDetailVo.getUserId());
+            if (sysUser == null) {
+                return;
+            }
+
+            // 按时间区分 个数
+            Integer timeNum = 0;
+            PeriodEnum periodType  = null;
+            if (PeriodEnum.DAY.equals(detail.getPeriod())) {
+                timeNum = 1;
+                periodType = PeriodEnum.DAY;
+            } else if (PeriodEnum.MONTH.equals(detail.getPeriod())) {
+                timeNum = 1;
+                periodType = PeriodEnum.MONTH;
+            } else if (PeriodEnum.QUARTERLY.equals(detail.getPeriod())) {
+                timeNum = 3;
+                periodType = PeriodEnum.MONTH;
+            } else if (PeriodEnum.YEAR_HALF.equals(detail.getPeriod())) {
+                timeNum = 6;
+                periodType = PeriodEnum.MONTH;
+            } else if (PeriodEnum.YEAR.equals(detail.getPeriod())) {
+                timeNum = 1;
+                periodType = PeriodEnum.YEAR;
+            } else if (PeriodEnum.PERPETUAL.equals(detail.getPeriod())) {
+                timeNum = 1;
+                periodType = PeriodEnum.PERPETUAL;
+            }
+            if (periodType == null) {
+                return;
+            }
+            String s = timeNum + periodType.getMsg() + addVipCardRecord.getVipType().getName();
+            if (PeriodEnum.PERPETUAL.equals(detail.getPeriod())) {
+                s =addVipCardRecord.getVipType().getName();
+            }
+            authSend(sysUser.getId(), sysUser.getPhone(), s, orderDetailVo.getOrderClient());
         }
     }
 
 
     @Override
+    @Transactional
     public void activityReward(Long userId, ClientEnum client, ActivityReward activityReward, Long activityId,String activityName) {
 
-        VipCardRecord vipCardRecord = vipCardRecordService.buildVipCardRecordByOrderDetail(userId,client,activityReward,activityId,activityName);
-        if (vipCardRecord == null) {
-            return;
-        }
+        VipCardRecordWrapper.AddVipCardRecord addVipCardRecord = new VipCardRecordWrapper.AddVipCardRecord();
+
+        addVipCardRecord.setUserId(userId);
+        addVipCardRecord.setClientType(client);
+        addVipCardRecord.setStatus(EVipRecordStatus.ADD);
+        addVipCardRecord.setVipType(EVipType.valueOf(activityReward.getRewardType().name()));
+        addVipCardRecord.setType(PeriodEnum.valueOf(activityReward.getUnit().name()));
+        addVipCardRecord.setTimes(activityReward.getNum());
+        addVipCardRecord.setSendMsg(false);
+        addVipCardRecord.setCreateBy(userId);
+        addVipCardRecord.setSourceType(SourceTypeEnum.ACTIVITY);
+        vipCardRecordService.add(addVipCardRecord);
 
-        getUserVipInfoVo(vipCardRecord);
     }
 
     private UserVipInfoVo getUserVipInfoVo(VipCardRecord vipCardRecord) {
@@ -212,19 +366,20 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
         return result;
     }
 
-    @Override
-    public Boolean addVip(VipSubmitReq vipSubmitReq, ClientEnum client, SysUser sysUser) {
-
-        VipCardRecord vipCardRecord = vipCardRecordService.getVipCardRecord(vipSubmitReq.getUserId(), client, null, null, vipSubmitReq.getType().toString(),
-                            null, vipSubmitReq.getTimes(),SourceTypeEnum.PLATFORM, sysUser.getId(), vipSubmitReq.getReason());
-
-        getUserVipInfoVo(vipCardRecord);
-
-        // 发消息
-        sendAddVipMessage(vipSubmitReq.getUserId(),sysUser.getPhone(),client,vipSubmitReq.getTimes(),vipSubmitReq.getType(),vipSubmitReq.getReason());
-
-        return true;
-    }
+//    @Deprecated
+//    @Override
+//    public Boolean addVip(VipSubmitReq vipSubmitReq, ClientEnum client, SysUser sysUser) {
+//
+//        VipCardRecord vipCardRecord = vipCardRecordService.getVipCardRecord(vipSubmitReq.getUserId(), client, null, null, vipSubmitReq.getType().toString(),
+//                            null, vipSubmitReq.getTimes(),SourceTypeEnum.PLATFORM, sysUser.getId(), vipSubmitReq.getReason());
+//
+//        getUserVipInfoVo(vipCardRecord);
+//
+//        // 发消息
+//        sendAddVipMessage(vipSubmitReq.getUserId(),sysUser.getPhone(),client,vipSubmitReq.getTimes(),vipSubmitReq.getType(),vipSubmitReq.getReason());
+//
+//        return true;
+//    }
 
     @Override
     public MemberPriceVo getVipShare(MemberPriceSettingsSearch query) {
@@ -248,7 +403,8 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
 
         for (ActivityPlanRewardDto activityPlanRewardDto : activityPlan.getActivityRewardList()) {
             for (MemberPriceSettingsVo memberPriceSettingsVo : memberPriceSettingsVos) {
-                if (memberPriceSettingsVo.getPeriod().getCode().equals( activityPlanRewardDto.getActivityReward().getUnit().getCode())) {
+                if (activityPlanRewardDto.getActivityReward().getRewardType().getCode().equals(memberPriceSettingsVo.getVipType().getCode())
+                    && activityPlanRewardDto.getActivityReward().getUnit().getCode().equals(memberPriceSettingsVo.getPeriod().getCode())) {
                     memberPriceSettingsVo.setDiscount(YesOrNoEnum.YES);
                     memberPriceSettingsVo.setDiscountPrice(activityPlanRewardDto.getActivityReward().getDiscountPrice());
                 }
@@ -261,14 +417,29 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
     public void orderCreate(UserPaymentOrderWrapper.OrderGoodsInfo orderGoodsInfo) {
         MemberPriceSettingsVo detail = detail(Long.parseLong(orderGoodsInfo.getBizContent().toString()));
         if (null == detail) {
-            throw new BizException("未找到会员卡信息");
+            throw new BizException(999,"产品信息已更新,请重新选择");
+        }
+
+        if (!orderGoodsInfo.getGoodType().name().equals(detail.getVipType().name())) {
+            throw new BizException(999,"产品信息已更新,请重新选择");
+        }
+        if (Boolean.FALSE.equals(detail.getStatus())) {
+            throw new BizException(999,"产品信息已更新,请重新选择");
         }
+
+
+        checkOrder(orderGoodsInfo.getPaymentClient(), detail.getVipType().name(), orderGoodsInfo.getUserId());
+
+        // 判断会员剩余天数是否改变
+        checkVip(detail, orderGoodsInfo.getVipEndDays(), orderGoodsInfo.getUserId(), orderGoodsInfo.getPaymentClient(), orderGoodsInfo.getGoodNum(), orderGoodsInfo.getBizPrice());
+
         BigDecimal couponAmount = BigDecimal.ZERO;
         ActivityPlanVo activityPlanVo = activityPlanService.detail(orderGoodsInfo.getActivityId());
 
         if (activityPlanVo != null && activityPlanVo.getActivityState() == 1) {
             for (ActivityPlanRewardDto activityPlanRewardDto : activityPlanVo.getActivityRewardList()) {
-                if (activityPlanRewardDto.getActivityReward().getUnit().getCode().equals(detail.getPeriod().getCode())) {
+                if (activityPlanRewardDto.getActivityReward().getRewardType().getCode().equals(detail.getVipType().getCode())
+                    && activityPlanRewardDto.getActivityReward().getUnit().getCode().equals(detail.getPeriod().getCode())) {
                     couponAmount = activityPlanRewardDto.getActivityReward().getDiscountPrice();
                     break;
                 }
@@ -281,13 +452,16 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
         userOrderDetail.setMerchId(0l);
         userOrderDetail.setBizId(detail.getId());
         userOrderDetail.setBizContent("会员卡购买-" + detail.getPeriod().getMsg());
-        userOrderDetail.setGoodNum(1);
-        userOrderDetail.setOriginalPrice(detail.getOriginalPrice());
-        userOrderDetail.setCouponAmount(couponAmount);
-        userOrderDetail.setExpectPrice(detail.getSalePrice());
+        userOrderDetail.setGoodNum(orderGoodsInfo.getGoodNum());
+        userOrderDetail.setOriginalPrice(detail.getOriginalPrice().multiply(new BigDecimal(orderGoodsInfo.getGoodNum())));
+        userOrderDetail.setCouponAmount(couponAmount.multiply(new BigDecimal(orderGoodsInfo.getGoodNum())));
+        userOrderDetail.setExpectPrice(detail.getSalePrice().multiply(new BigDecimal(orderGoodsInfo.getGoodNum())));
         userOrderDetail.setActualPrice(userOrderDetail.getExpectPrice().subtract(couponAmount));
         orderGoodsInfo.setUserOrderDetail(userOrderDetail);
 
+        UserPaymentOrderWrapper.VipDays vipDays = new UserPaymentOrderWrapper.VipDays();
+        vipDays.setVipEndDays(orderGoodsInfo.getVipEndDays());
+        userOrderDetail.setBizJson(JSON.toJSONString(vipDays));
         userOrderDetail.setAccountConfig( teacherService.teacherSettlementFrom(null,orderGoodsInfo.getRecomUserId()).jsonString());
 
         // 设置金额入账去向
@@ -296,6 +470,19 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
 
     }
 
+    private void checkOrder(ClientEnum orderGoodsInfo, String orderType, Long userId) {
+        // 判断是否有待支付订单 如果有返回不可下单
+        OrderSearch search = new OrderSearch();
+        search.setOrderClient(orderGoodsInfo.name());
+        search.setGoodType(Lists.newArrayList(GoodTypeEnum.VIP, GoodTypeEnum.SVIP).stream().map(GoodTypeEnum::name).collect(Collectors.joining(",")));
+        search.setUserId(userId);
+
+        UserOrderVo userOrderVo = userOrderDao.getPendingOrder(search);
+        if (null != userOrderVo) {
+            throw new BizException(997, "您有未支付订单,请先支付");
+        }
+    }
+
     private void sendAddVipMessage(Long userId,String phone, ClientEnum client, Integer times, PeriodEnum type, String reason) {
         try {
             Map<Long, String> receivers = new HashMap<>();
@@ -348,28 +535,28 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
         receivers.put(userId, phone);
 
         // 判断是否是机构学生 机构学生推送走另一个
-        Student student = studentService.getById(userId);
-        if (clientEnum.equals(ClientEnum.STUDENT) && student != null && student.getTenantId() != null && student.getTenantId() >0) {
-            try {
-                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TENANT_VIP_BUY,
-                        receivers, null, 0, null, ClientEnum.TENANT_STUDENT.getCode(),param1);
-            } catch (Exception e) {
-                log.error("会员购买极光消息推送异常,userId={}", userId);
-            }
-        } else {
-            try {
-                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.VIP_BUY_SUCCESS,
-                        receivers, null, 0, null, clientEnum.getCode(), param1);
-            } catch (Exception e) {
-                log.error("会员购买极光消息推送异常,userId={}", userId);
+
+        try {
+            MessageTypeEnum messageTypeEnum = MessageTypeEnum.NEW_VIP_BUY_SUCCESS;
+            if (clientEnum == ClientEnum.TEACHER) {
+                messageTypeEnum= MessageTypeEnum.NEW_TEACHER_VIP_BUY_SUCCESS;
             }
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, messageTypeEnum,
+                    receivers, null, 0, null, clientEnum.getCode(), param1);
+        } catch (Exception e) {
+            log.error("会员购买极光消息推送异常,userId={}", userId);
+        }
 
-            try {
-                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_VIP_BUY_SUCCESS,
-                        receivers, null, 0, null, clientEnum.getCode(), param1);
-            } catch (Exception e) {
-                log.error("会员购买短信消息推送异常,userId={}", userId);
+        try {
+
+            MessageTypeEnum messageTypeEnum = MessageTypeEnum.SMS_NEW_VIP_BUY_SUCCESS;
+            if (clientEnum == ClientEnum.TEACHER) {
+                messageTypeEnum= MessageTypeEnum.SMS_TEACHER_NEW_VIP_BUY_SUCCESS;
             }
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, messageTypeEnum,
+                    receivers, null, 0, null, clientEnum.getCode(), param1);
+        } catch (Exception e) {
+            log.error("会员购买短信消息推送异常,userId={}", userId);
         }
 
     }

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

@@ -37,19 +37,6 @@ public class MusicSheetAccompanimentServiceImpl extends ServiceImpl<MusicSheetAc
     }
 
     @Override
-    public List<MusicSheetAccompaniment> getByMusicSheetId(Long musicSheetId) {
-
-        return this.lambdaQuery()
-                .eq(MusicSheetAccompaniment::getMusicSheetId,musicSheetId)
-                .list();
-    }
-
-    @Override
-    public void delByMusicSheetId(Long musicSheetId) {
-        musicSheetAccompanimentDao.delByMusicSheetId(musicSheetId);
-    }
-
-    @Override
     @Transactional(rollbackFor = Exception.class)
     public List<MusicSheetAccompaniment> initMusicSheetAccompaniment(String musicSheetJson,Long musicSheetId) {
         CbsMusicSheetWrapper.AddMusicSheet addMusicSheet = JSON.parseObject(musicSheetJson, CbsMusicSheetWrapper.AddMusicSheet.class);
@@ -69,4 +56,14 @@ public class MusicSheetAccompanimentServiceImpl extends ServiceImpl<MusicSheetAc
         }
         return background;
     }
+
+    @Override
+    public MusicSheetAccompaniment initSysMusicScoreAccompaniment(CbsMusicSheetWrapper.MusicSheetAccApplication musicSheetApplication) {
+        MusicSheetAccompaniment record = new MusicSheetAccompaniment();
+        record.setSpeed(musicSheetApplication.getPlaySpeed());
+        record.setTrack(musicSheetApplication.getTrack());
+        record.setAudioFileUrl(musicSheetApplication.getMp3Url());
+        record.setMetronomeUrl(musicSheetApplication.getUrl());
+        return record;
+    }
 }

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