Selaa lähdekoodia

Merge branch 'dev_v1.3.5_20220929' into online

Eric 2 vuotta sitten
vanhempi
commit
552768d937
93 muutettua tiedostoa jossa 3821 lisäystä ja 200 poistoa
  1. 11 0
      cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/dto/RealnameAuthReq.java
  2. 1 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/UserController.java
  3. 2 1
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/ContractTemplateTypeEnum.java
  4. 32 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ActivityEvaluationController.java
  5. 2 2
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/MusicAlbumController.java
  6. 2 1
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/MusicSheetController.java
  7. 90 1
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TeacherController.java
  8. 1 1
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/coupon/CouponIssueController.java
  9. 326 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/TeacherBindingUserVo.java
  10. 142 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/teacher/TeacherVO.java
  11. 18 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityUserRewardDao.java
  12. 15 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleDao.java
  13. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicAlbumDao.java
  14. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicSheetDao.java
  15. 13 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/TeacherDao.java
  16. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserBindingTeacherDao.java
  17. 48 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ActivityEvaluationDto.java
  18. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderReq.java
  19. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MusicAlbumDetailSearch.java
  20. 23 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MusicAlbumSearch.java
  21. 88 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/StudentMusicAlbumSearch.java
  22. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityEvaluation.java
  23. 13 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityUserReward.java
  24. 24 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicAlbum.java
  25. 13 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicSheetPurchaseRecord.java
  26. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/AccountBizTypeEnum.java
  27. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/ChargeTypeEnum.java
  28. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/GoodTypeEnum.java
  29. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageTypeEnum.java
  30. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/OrderTypeEnum.java
  31. 41 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/album/PurchaseRecordTypeEnum.java
  32. 29 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/CourseScheduleMapper.java
  33. 19 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/StudentMapper.java
  34. 13 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/SubjectMapper.java
  35. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/SysUserMapper.java
  36. 102 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/queryInfo/TeacherBindingUserQueryInfo.java
  37. 40 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/queryInfo/TeacherQueryInfo.java
  38. 52 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/queryInfo/UserRewardQueryInfo.java
  39. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityEvaluationRecordService.java
  40. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityEvaluationService.java
  41. 12 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityRewardService.java
  42. 23 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityUserRewardService.java
  43. 6 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CouponIssueService.java
  44. 4 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicAlbumService.java
  45. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetPurchaseRecordService.java
  46. 11 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetService.java
  47. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SysUserService.java
  48. 24 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TeacherService.java
  49. 18 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserBindingTeacherService.java
  50. 9 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityEvaluationRecordServiceImpl.java
  51. 23 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityEvaluationServiceImpl.java
  52. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanServiceImpl.java
  53. 42 36
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityRewardServiceImpl.java
  54. 34 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityUserRewardServiceImpl.java
  55. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ContractServiceImpl.java
  56. 16 20
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CouponIssueServiceImp.java
  57. 129 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicAlbumServiceImpl.java
  58. 7 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetPurchaseRecordServiceImpl.java
  59. 223 54
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  60. 66 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/SysUserServiceImpl.java
  61. 118 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java
  62. 165 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserBindingTeacherServiceImpl.java
  63. 13 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  64. 56 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/AlbumDetailVo.java
  65. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MusicSheetVo.java
  66. 67 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MyFens.java
  67. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherHomeVo.java
  68. 107 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherVo.java
  69. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserOrderDetailVo.java
  70. 87 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/activity/UserRewardWrapper.java
  71. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/res/OrderCreateRes.java
  72. 125 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/userBindingTeacher/UserBindingCourseWrapper.java
  73. 179 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/userBindingTeacher/UserBindingTeacherWrapper.java
  74. 77 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/teacher/TeacherWrapper.java
  75. 1 1
      cooleshow-user/user-biz/src/main/resources/config/contracts/latest_contract_template.ftl
  76. 1 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityEvaluationMapper.xml
  77. 45 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityUserRewardMapper.xml
  78. 39 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  79. 67 26
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicAlbumMapper.xml
  80. 22 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml
  81. 19 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/SysUserMapper.xml
  82. 35 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  83. 31 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserBindingTeacherMapper.xml
  84. 30 3
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/MusicAlbumController.java
  85. 68 5
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/StudentActivityController.java
  86. 25 1
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/StudentController.java
  87. 137 0
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/io/request/ActivityVo.java
  88. 95 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/ActivityController.java
  89. 30 3
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/MusicAlbumController.java
  90. 23 6
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherController.java
  91. 136 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/io/request/ActivityVo.java
  92. 30 2
      cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/MusicAlbumController.java
  93. 2 1
      cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/open/OpenMusicAlbumController.java

+ 11 - 0
cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/dto/RealnameAuthReq.java

@@ -29,12 +29,23 @@ public class RealnameAuthReq implements Serializable {
     @ApiModelProperty(value = "是否修改用户信息", required = true)
     private Boolean save;
 
+    @ApiModelProperty("是否签署协议")
+    private Boolean contract = false;
+
     private Long userId;
     // 性别(1,男 0,女)
     private int gender;
     // 出生日期
     private Date birthday;
 
+    public Boolean getContract() {
+        return contract;
+    }
+
+    public void setContract(Boolean contract) {
+        this.contract = contract;
+    }
+
     public Long getUserId() {
         return userId;
     }

+ 1 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/UserController.java

@@ -535,6 +535,7 @@ public class UserController extends BaseController {
     }
 
 
+    // 实名认证改到对应的服务中
     @PostMapping("/realNameAuth")
     @ApiOperation(value = "实名认证", notes = "传入realNameAuthDto")
     @ResponseBody

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

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

+ 32 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ActivityEvaluationController.java

@@ -23,6 +23,8 @@ import com.yonge.toolset.mybatis.support.PageUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
+import org.apache.commons.collections.CollectionUtils;
+import org.joda.time.DateTime;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -36,6 +38,7 @@ import javax.annotation.Resource;
 import javax.validation.Valid;
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 
 @RestController
 @RequestMapping("/activityEvaluation")
@@ -80,6 +83,35 @@ public class ActivityEvaluationController extends BaseController {
     	return status(activityEvaluationService.addBatch(param,user));
 	}
 
+	@ApiOperation(value = "批量更新曲目信息")
+	@PostMapping("/batchUpdate")
+	public HttpResponseResult<Boolean> batchUpdateEvaluationInfo(@Valid @RequestBody ActivityEvaluationDto info) {
+
+		SysUser user = sysUserFeignService.queryUserInfo();
+		if (user == null || null == user.getId()) {
+			return failed(HttpStatus.FORBIDDEN, "请登录");
+		}
+
+		if (CollectionUtils.isEmpty(info.getEvaluationInfos())) {
+			return failed("评测曲目信息为空");
+		}
+
+		for (ActivityEvaluationDto.EvaluationInfo item : info.getEvaluationInfos()) {
+
+			if (Objects.isNull(item.getId())
+					|| Objects.isNull(item.getEvaluationDifficulty())) {
+				return failed("无效的请求参数");
+			}
+
+			item.updateBy(user.getId()).updateTime(DateTime.now().toDate());
+		}
+
+		// 批量更新曲目信息
+		int ret = activityEvaluationService.batchUpdateEvaluationInfo(user, info);
+
+		return status(ret > 0);
+	}
+
  	/**
 	 * 删除
 	 */

+ 2 - 2
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/MusicAlbumController.java

@@ -127,7 +127,7 @@ public class MusicAlbumController extends BaseController {
     public HttpResponseResult<AlbumDetailVo> detail(@Valid @RequestBody MusicAlbumDetailSearch query) {
 
         query.setType(2);
-        AlbumDetailVo albumDetailVo = musicAlbumService.detail(PageUtil.getPage(query),query);
+        AlbumDetailVo albumDetailVo = musicAlbumService.detail(PageUtil.getPage(query), query, null, null);
         return succeed(albumDetailVo);
     }
 
@@ -142,7 +142,7 @@ public class MusicAlbumController extends BaseController {
 
         query.setType(1);
         query.setState(YesOrNoEnum.YES);
-        AlbumDetailVo albumDetailVo = musicAlbumService.detail(PageUtil.getPage(query),query);
+        AlbumDetailVo albumDetailVo = musicAlbumService.detail(PageUtil.getPage(query), query, null, null);
         return succeed(albumDetailVo);
     }
 

+ 2 - 1
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/MusicSheetController.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.admin.controller;
 
+import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -322,7 +323,7 @@ public class MusicSheetController extends BaseController {
             return failed("用户信息获取失败");
         }
         return status(musicSheetService.sendBuyMessage(param.getTeacherId(), param.getStudentId(), param.getMusicSheetId(),
-                                                       ClientEnum.STUDENT));
+                                                       ClientEnum.STUDENT, OrderTypeEnum.MUSIC));
     }
     /**
      * 导入

+ 90 - 1
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TeacherController.java

@@ -1,5 +1,17 @@
 package com.yonge.cooleshow.admin.controller;
 
+import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.admin.io.request.TeacherBindingUserVo;
+import com.yonge.cooleshow.admin.io.request.coupon.CouponIssueVo;
+import com.yonge.cooleshow.biz.dal.queryInfo.TeacherBindingUserQueryInfo;
+import com.yonge.cooleshow.biz.dal.queryInfo.TeacherQueryInfo;
+import com.yonge.cooleshow.biz.dal.service.UserBindingTeacherService;
+import com.yonge.cooleshow.biz.dal.vo.userBindingTeacher.UserBindingCourseWrapper;
+import com.yonge.cooleshow.biz.dal.vo.userBindingTeacher.UserBindingTeacherWrapper;
+import com.yonge.cooleshow.admin.io.request.teacher.TeacherVO;
+import com.yonge.cooleshow.biz.dal.vo.MyFens;
+import com.yonge.cooleshow.biz.dal.wrapper.teacher.TeacherWrapper;
+import com.yonge.toolset.base.page.QueryInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -9,6 +21,8 @@ import java.io.IOException;
 import java.io.OutputStream;
 import java.util.Date;
 import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 import javax.servlet.http.HttpServletResponse;
@@ -17,6 +31,7 @@ import javax.validation.Valid;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 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.web.bind.annotation.GetMapping;
@@ -54,6 +69,8 @@ import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.toolset.utils.date.DateUtil;
 import com.yonge.toolset.utils.excel.POIUtil;
 
+import static com.yonge.cooleshow.common.entity.HttpResponseResult.succeed;
+
 @RestController
 @RequestMapping("/teacher")
 @Api(value = "教师表", tags = "教师表")
@@ -71,6 +88,9 @@ public class TeacherController extends BaseController {
     @Autowired
     private VipCardRecordService vipCardRecordService;
 
+    @Autowired
+    private UserBindingTeacherService userBindingTeacherService;
+
     /**
      * 查询单条
      */
@@ -81,7 +101,9 @@ public class TeacherController extends BaseController {
     })
     @PreAuthorize("@pcs.hasPermissions('teacher/detail')")
     public HttpResponseResult<TeacherVo> detail(@PathVariable("id") Long userId) {
-        TeacherVo detail = teacherService.detail(userId);
+        //TeacherVo detail = teacherService.detail(userId);
+
+        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());
@@ -244,4 +266,71 @@ public class TeacherController extends BaseController {
         teacherService.updateStyleVideo(teacherDto.getUserId(), teacherDto.getStyleVideo(), teacherDto.getMessage());
         return succeed();
     }
+
+
+    @ApiOperation(value = "老师琴房课绑定学员列表")
+    @PostMapping("/bindingUserList")
+    // @PreAuthorize("@pcs.hasPermissions('teacher/bindingUserList')")
+    public HttpResponseResult<PageInfo<TeacherBindingUserVo.BindingUserList>> bindingUserList(@RequestBody  @Valid  TeacherBindingUserVo.BindingUserQuery query) {
+        IPage<UserBindingTeacherWrapper> wrapperIPage = userBindingTeacherService.selectBindingUserPage(PageUtil.getPage(query),
+                                                        TeacherBindingUserQueryInfo.BindingUserQuery.from(query.jsonString()));
+        // 数据转换
+        List<TeacherBindingUserVo.BindingUserList> pageInfos = JSON.parseArray(JSON.toJSONString(wrapperIPage.getRecords()),
+                                                                               TeacherBindingUserVo.BindingUserList.class);
+
+        return succeed(PageUtil.getPageInfo(wrapperIPage,pageInfos));
+    }
+
+
+    @ApiOperation(value = "查看课表")
+    @PostMapping("/selectBindingUserCourse")
+    // @PreAuthorize("@pcs.hasPermissions('teacher/selectBindingUserCourse')")
+    public HttpResponseResult<PageInfo<TeacherBindingUserVo.BindingStudentCourseList>> selectBindingUserCourse(@RequestBody @Valid TeacherBindingUserVo.BindingStudentCourseQuery query) {
+        IPage<UserBindingCourseWrapper> wrapperIPage = userBindingTeacherService.selectBindingUserCoursePage(PageUtil.getPage(query),
+                                                                                                             TeacherBindingUserQueryInfo.BindingStudentCourseQuery.from(query.jsonString()));
+        // 数据转换
+        List<TeacherBindingUserVo.BindingStudentCourseList> pageInfos = JSON.parseArray(JSON.toJSONString(wrapperIPage.getRecords()),
+                                                                                        TeacherBindingUserVo.BindingStudentCourseList.class);
+
+        return succeed(PageUtil.getPageInfo(wrapperIPage, pageInfos));
+    }
+    /**
+     * 查询老师统计指标
+     * @param userId 老师ID
+     * @return HttpResponseResult<TeacherVO.TeacherStat>
+     */
+    @ApiOperation(value = "老师统计指标", notes = "传入id")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "id", paramType = "path", dataType = "long", required = true),
+    })
+    @GetMapping("/stat/{id}")
+    public HttpResponseResult<TeacherVO.TeacherStat> teacherStatInfo(@PathVariable("id") Long userId) {
+
+        // 老师统计指标
+        TeacherWrapper.TeacherStatInfo statInfo = teacherService.findTeacherStatInfoById(userId);
+
+        return succeed(TeacherVO.TeacherStat.from(statInfo.jsonString()));
+    }
+
+    /**
+     * 老师粉丝信息查询
+     * @param query TeacherVO.TeacherFansQuery
+     * @return HttpResponseResult<PageInfo<MyFens>>
+     */
+    @ApiOperation(value = "我的粉丝")
+    @PostMapping(value = "/myFans")
+    public HttpResponseResult<PageInfo<TeacherVO.TeacherFans>> queryMyFans(@RequestBody TeacherVO.TeacherFansQuery query) {
+
+        if (Optional.ofNullable(query.getTeacherId()).orElse(0L) <= 0) {
+            return failed("无效的请求参数");
+        }
+
+        IPage<MyFens> pages = teacherService.queryMyFans(PageUtil.getPage(query), TeacherQueryInfo.FansQuery.from(query.jsonString()));
+
+        // 数据转换
+        List<TeacherVO.TeacherFans> responses = JSON.parseArray(JSON.toJSONString(pages.getRecords()),
+                TeacherVO.TeacherFans.class);
+
+        return succeed(PageUtil.getPageInfo(pages, responses));
+    }
 }

+ 1 - 1
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/coupon/CouponIssueController.java

@@ -96,7 +96,7 @@ public class CouponIssueController {
         if (sysUser == null  || sysUser.getId() == null) {
             return failed("用户信息获取失败");
         }
-        couponIssueService.issueCoupon(param.getCouponId(), param.getUserParam(), sysUser.getId(), param.getRemark(), true, true,
+        couponIssueService.issueCoupon(param.getCouponId(), param.getUserParam(), sysUser.getId(), param.getRemark(),
                                        SendTypeEnum.PLATFORM, new Date());
 
         return succeed();

+ 326 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/TeacherBindingUserVo.java

@@ -0,0 +1,326 @@
+package com.yonge.cooleshow.admin.io.request;
+
+import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import com.yonge.toolset.base.page.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-10-08
+ */
+public class TeacherBindingUserVo {
+
+    @ApiModel("BindingUserQuery-老师绑定的学生列表查询")
+    public static class BindingUserQuery extends QueryInfo {
+
+        @ApiModelProperty(value = "老师id",required = true)
+        @NotNull(message = "老师id不能为空")
+        private Long teacherId;
+
+        @ApiModelProperty("查询条件 昵称、编号、手机号")
+        private String search;
+
+        @ApiModelProperty("绑定开始时间")
+        private Date startTime;
+
+        @ApiModelProperty("绑定结束时间")
+        private Date endTime;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public Long getTeacherId() {
+            return teacherId;
+        }
+
+        public void setTeacherId(Long teacherId) {
+            this.teacherId = teacherId;
+        }
+
+        @Override
+        public String getSearch() {
+            return search;
+        }
+
+        @Override
+        public void setSearch(String search) {
+            this.search = search;
+        }
+
+        public Date getStartTime() {
+            return startTime;
+        }
+
+        public void setStartTime(Date startTime) {
+            this.startTime = startTime;
+        }
+
+        public Date getEndTime() {
+            return endTime;
+        }
+
+        public void setEndTime(Date endTime) {
+            this.endTime = endTime;
+        }
+    }
+
+
+    @ApiModel("BindingUserList-老师绑定的学生列表")
+    public static class BindingUserList  {
+
+        @ApiModelProperty("学生编号")
+        private Long userId;
+
+        @ApiModelProperty("昵称")
+        private String username;
+
+
+        @ApiModelProperty(value = "性别0女1男")
+        private Integer gender;
+
+        @ApiModelProperty(value = "年龄")
+        private Integer age;
+
+
+        // 声部
+        @ApiModelProperty(value = "声部")
+        private String subjectName;
+
+        @ApiModelProperty(value = "手机号")
+        private String phone;
+
+        @ApiModelProperty(value = "是否会员 0否 1是")
+        private YesOrNoEnum isVip;
+
+
+        @ApiModelProperty("课程数")
+        private Long courseNum;
+
+        @ApiModelProperty("已结束课时数")
+        private Integer endCourseNum;
+
+        @ApiModelProperty("未开始课程数")
+        private Integer noStartCourseNum;
+
+        @ApiModelProperty("绑定时间")
+        private Date bindingTime;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public String getSubjectName() {
+            return subjectName;
+        }
+
+        public void setSubjectName(String subjectName) {
+            this.subjectName = subjectName;
+        }
+
+        public Long getUserId() {
+            return userId;
+        }
+
+        public void setUserId(Long userId) {
+            this.userId = userId;
+        }
+
+        public String getUsername() {
+            return username;
+        }
+
+        public void setUsername(String username) {
+            this.username = username;
+        }
+
+        public Integer getGender() {
+            return gender;
+        }
+
+        public void setGender(Integer gender) {
+            this.gender = gender;
+        }
+
+        public Integer getAge() {
+            return age;
+        }
+
+        public void setAge(Integer age) {
+            this.age = age;
+        }
+
+        public String getPhone() {
+            return phone;
+        }
+
+        public void setPhone(String phone) {
+            this.phone = phone;
+        }
+
+        public YesOrNoEnum getIsVip() {
+            return isVip;
+        }
+
+        public void setIsVip(YesOrNoEnum isVip) {
+            this.isVip = isVip;
+        }
+
+        public Long getCourseNum() {
+            return courseNum;
+        }
+
+        public void setCourseNum(Long courseNum) {
+            this.courseNum = courseNum;
+        }
+
+        public Integer getEndCourseNum() {
+            return endCourseNum;
+        }
+
+        public void setEndCourseNum(Integer endCourseNum) {
+            this.endCourseNum = endCourseNum;
+        }
+
+        public Integer getNoStartCourseNum() {
+            return noStartCourseNum;
+        }
+
+        public void setNoStartCourseNum(Integer noStartCourseNum) {
+            this.noStartCourseNum = noStartCourseNum;
+        }
+
+        public Date getBindingTime() {
+            return bindingTime;
+        }
+
+        public void setBindingTime(Date bindingTime) {
+            this.bindingTime = bindingTime;
+        }
+    }
+
+    @ApiModel("BindingStudentCourseQuery-绑定学生课程列表查询")
+    public static class BindingStudentCourseQuery extends QueryInfo{
+
+        @ApiModelProperty(value = "老师id",required = true)
+        @NotNull(message = "老师id不能为空")
+        private Long teacherId;
+
+        @NotNull(message = "学员id不能为空")
+        @ApiModelProperty(value = "学员id",required = true)
+        private Long studentId;
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+        public Long getTeacherId() {
+            return teacherId;
+        }
+
+        public void setTeacherId(Long teacherId) {
+            this.teacherId = teacherId;
+        }
+
+        public Long getStudentId() {
+            return studentId;
+        }
+
+        public void setStudentId(Long studentId) {
+            this.studentId = studentId;
+        }
+    }
+
+
+
+    @ApiModel("BindingStudentCourseList-绑定学生课程列表")
+    public static class BindingStudentCourseList{
+
+        @ApiModelProperty("课程编号")
+        private Long courseId;
+
+        @ApiModelProperty("课程声部")
+        private String subjectName;
+
+        @ApiModelProperty("学员考勤 TRUANT:旷课 ATTENDCLASS:到课 NOTSTART:未开始")
+        private String status;
+
+        @ApiModelProperty(value = "课程状态 NOT_START未开始 ING进行中 COMPLETE已完成 CANCEL已取消  CourseScheduleEnum")
+        private String courseStatus;
+
+        @ApiModelProperty("上课时间")
+        private Date classDate;
+
+        // 课程开始时间
+        @ApiModelProperty("课程开始时间")
+        private Date startTime;
+
+        //课程结束时间
+        @ApiModelProperty("课程结束时间")
+        private Date endTime;
+
+        public Date getStartTime() {
+            return startTime;
+        }
+
+        public void setStartTime(Date startTime) {
+            this.startTime = startTime;
+        }
+
+        public Date getEndTime() {
+            return endTime;
+        }
+
+        public void setEndTime(Date endTime) {
+            this.endTime = endTime;
+        }
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+        public Long getCourseId() {
+            return courseId;
+        }
+
+        public void setCourseId(Long courseId) {
+            this.courseId = courseId;
+        }
+
+        public String getSubjectName() {
+            return subjectName;
+        }
+
+        public void setSubjectName(String subjectName) {
+            this.subjectName = subjectName;
+        }
+
+        public String getStatus() {
+            return status;
+        }
+
+        public void setStatus(String status) {
+            this.status = status;
+        }
+
+        public String getCourseStatus() {
+            return courseStatus;
+        }
+
+        public void setCourseStatus(String courseStatus) {
+            this.courseStatus = courseStatus;
+        }
+
+        public Date getClassDate() {
+            return classDate;
+        }
+
+        public void setClassDate(Date classDate) {
+            this.classDate = classDate;
+        }
+    }
+}

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

@@ -0,0 +1,142 @@
+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.GenderEnum;
+import com.yonge.cooleshow.biz.dal.enums.MK;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import com.yonge.toolset.base.page.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 老师端统计信息
+ * Created by Eric.Shang on 2022/10/8.
+ */
+public class TeacherVO {
+
+    /**
+     * 老师统计指标信息
+     */
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel("老师统计响应信息")
+    public static class TeacherStat implements Serializable {
+
+        @ApiModelProperty("星级")
+        private Integer starGrade;
+        @ApiModelProperty("粉丝数")
+        private Integer fansNum;
+        @ApiModelProperty("已上课时")
+        private Integer expTime;
+        @ApiModelProperty("未上课时")
+        private Integer unExpTime;
+        @ApiModelProperty("专辑数 ")
+        private Integer musicAlbumNum;
+        @ApiModelProperty("曲谱数 ")
+        private Integer musicSheetNum;
+        @ApiModelProperty("学生数")
+        private Integer studentNums;
+
+        public static TeacherStat from(String recv) {
+
+            return JSON.parseObject(recv, TeacherStat.class);
+        }
+    }
+
+    /**
+     * 老师粉丝数
+     */
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class TeacherFansQuery extends QueryInfo {
+
+        @ApiModelProperty("搜索条件:昵称/编号/手机号")
+        private String search;
+
+        @ApiModelProperty("老师ID")
+        private Long teacherId;
+
+        @ApiModelProperty("开始时间")
+        @JsonFormat(pattern = MK.TIME_PATTERN, timezone = MK.TIME_ZONE)
+        private Date startTime;
+
+        @ApiModelProperty("结束时间")
+        @JsonFormat(pattern = MK.TIME_PATTERN, timezone = MK.TIME_ZONE)
+        private Date endTime;
+
+        private String nickname;
+        private Long userId;
+        private String phone;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public void setSearch(String search) {
+            if (StringUtils.isNotEmpty(search)) {
+
+                if (search.matches(MK.EXP_INT)) {
+
+                    if (search.matches(MK.EXP_MOBILE_NUMBER)) {
+
+                        setPhone(search);
+                    } else {
+                        setUserId(Long.parseLong(search));
+                    }
+
+                } else {
+                    // 昵称
+                    setNickname(search);
+                }
+            }
+            this.search = search;
+        }
+    }
+
+    /**
+     * 老师粉丝
+     */
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class TeacherFans implements Serializable {
+
+        @ApiModelProperty("用户编号")
+        private String userId;
+        @ApiModelProperty("昵称")
+        private String userName;
+        @ApiModelProperty(value = "真实姓名")
+        private String realName;
+        @ApiModelProperty("头像地址")
+        private String avatar;
+        @ApiModelProperty("声部")
+        private String subjectName;
+        @ApiModelProperty(value = "性别 0女 1男")
+        private GenderEnum gender;
+        @ApiModelProperty(value = "是否会员 0否 1是")
+        private YesOrNoEnum isVip;
+
+        @ApiModelProperty("手机号")
+        private String phone;
+
+        @ApiModelProperty("关注时间")
+        @JsonFormat(pattern = MK.TIME_PATTERN, timezone = MK.TIME_ZONE)
+        private Date starTime;
+
+        @ApiModelProperty("出生日期")
+        private Date birthdate;
+
+        @ApiModelProperty("出生日期")
+        private Integer age;
+    }
+}

+ 18 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityUserRewardDao.java

@@ -1,10 +1,13 @@
 package com.yonge.cooleshow.biz.dal.dao;
 
+import java.util.Date;
 import java.util.List;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.biz.dal.queryInfo.UserRewardQueryInfo;
 import com.yonge.cooleshow.biz.dal.vo.UserRewardVo;
+import com.yonge.cooleshow.biz.dal.vo.activity.UserRewardWrapper;
 import org.apache.ibatis.annotations.Param;
 import com.yonge.cooleshow.biz.dal.entity.ActivityUserReward;
 import com.yonge.cooleshow.biz.dal.vo.ActivityUserRewardVo;
@@ -35,4 +38,19 @@ public interface ActivityUserRewardDao extends BaseMapper<ActivityUserReward>{
 	 * @return List<UserRewardVo>
 	 */
 	List<UserRewardVo> selectActivityShareTeacher(@Param("activityId") Long activityId, @Param("userIds") List<Long> userIds);
+
+	/**
+	 * 查询领取的奖品数
+	 */
+	int selectReceiveRewardCount(@Param("query") UserRewardQueryInfo query);
+
+	/**
+	 * 修改领奖状态
+	 */
+	int receiveReward(@Param("userId") Long userId, @Param("receiveRewardId") Long receiveRewardId, @Param(
+			"receiveTime") Date receiveTime);
+
+
+	IPage<UserRewardWrapper> selectReceiveRewardList(@Param("page") IPage<UserRewardWrapper> page, @Param(
+			"query") UserRewardQueryInfo query);
 }

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

@@ -10,7 +10,10 @@ import com.yonge.cooleshow.biz.dal.dto.search.HomeworkSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.MyCourseSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.PracticeTeacherSearch;
 import com.yonge.cooleshow.biz.dal.entity.CourseSchedule;
+import com.yonge.cooleshow.biz.dal.queryInfo.TeacherBindingUserQueryInfo;
 import com.yonge.cooleshow.biz.dal.vo.*;
+import com.yonge.cooleshow.biz.dal.vo.userBindingTeacher.UserBindingCourseWrapper;
+import com.yonge.cooleshow.biz.dal.vo.userBindingTeacher.UserBindingTeacherWrapper;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import org.apache.ibatis.annotations.Param;
 
@@ -235,4 +238,16 @@ public interface CourseScheduleDao extends BaseMapper<CourseSchedule> {
 
     //查询待结算课程
     List<UserAccountRecordDto> selectWaitCourse(String day);
+
+    /**
+     * 查询课程数
+     */
+    List<UserBindingTeacherWrapper.CourseNum> selectStudentPianoCourse(@Param("teacherId") Long teacherId, @Param(
+            "studentIdList") List<Long> studentIdList);
+
+    /**
+     * 查询琴房课
+     */
+    IPage<UserBindingCourseWrapper> selectBindingUserCoursePage(@Param(
+            "page") IPage<UserBindingCourseWrapper> page, @Param("query") TeacherBindingUserQueryInfo.BindingStudentCourseQuery query);
 }

+ 10 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicAlbumDao.java

@@ -5,8 +5,10 @@ import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicAlbumSearch;
 import com.yonge.cooleshow.biz.dal.entity.MusicAlbum;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yonge.cooleshow.biz.dal.enums.ChargeTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.vo.MusicAlbumVo;
+import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -64,4 +66,12 @@ public interface MusicAlbumDao extends BaseMapper<MusicAlbum> {
      * @return page
      */
     List<MusicAlbumVo> selectStudentPage(@Param("page") IPage<MusicAlbumVo> page, @Param("query") MusicAlbumSearch query, @Param("clientType") ClientEnum clientType);
+
+    /**
+     * 专辑单曲付费类型统计
+     * @param albumId 专辑ID
+     * @param paymentType 付费方式
+     * @return List<StatGroupWrapper>
+     */
+    List<StatGroupWrapper> selectAlbumMusicSheetStatInfo(@Param("albumId") Long albumId, @Param("paymentType") ChargeTypeEnum paymentType);
 }

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

@@ -6,6 +6,7 @@ import com.yonge.cooleshow.biz.dal.dto.search.*;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.vo.*;
+import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -162,4 +163,11 @@ public interface MusicSheetDao extends BaseMapper<MusicSheet> {
      */
     List<MusicSheetDetailVo> auditDetailList(@Param("originalMusicSheetId") Long originalMusicSheetId, @Param(
             "authMusicSheetId") Long authMusicSheetId);
+
+    /**
+     * 单曲数量统计
+     * @param musicIds 单曲ID
+     * @return List<StatGroupWrapper>
+     */
+    List<StatGroupWrapper> selectMusicAlbumStatInfo(@Param("musicIds") List<Long> musicIds);
 }

+ 13 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/TeacherDao.java

@@ -9,10 +9,12 @@ import com.yonge.cooleshow.biz.dal.dto.BasicUserInfo;
 import com.yonge.cooleshow.biz.dal.dto.search.TeacherSearch;
 import com.yonge.cooleshow.biz.dal.entity.Subject;
 import com.yonge.cooleshow.biz.dal.entity.Teacher;
+import com.yonge.cooleshow.biz.dal.queryInfo.TeacherQueryInfo;
 import com.yonge.cooleshow.biz.dal.vo.HotTeacherVo;
 import com.yonge.cooleshow.biz.dal.vo.MyFens;
 import com.yonge.cooleshow.biz.dal.vo.TeacherVo;
 
+import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
 import org.apache.ibatis.annotations.Param;
 
 public interface TeacherDao extends BaseMapper<Teacher> {
@@ -87,15 +89,22 @@ public interface TeacherDao extends BaseMapper<Teacher> {
 
     /**
      * 查询我的粉丝
-     * @param page
-     * @param teacherId
-     * @return
+     * @param page IPage<MyFens>
+     * @param query TeacherQueryInfo.FansQuery
+     * @return List<MyFens>
      */
-    List<MyFens> queryMyFans(@Param("page") IPage<MyFens> page, @Param("teacherId") Long teacherId);
+    List<MyFens> queryMyFans(@Param("page") IPage<MyFens> page, @Param("record") TeacherQueryInfo.FansQuery query);
     
     /**
      * 查询热门老师
      * @return
      */
     List<HotTeacherVo> queryHotTeacherList(Long subjectId);
+
+    /**
+     * 老师学生人数统计
+     * @param teacherIds 老师ID
+     * @return List<StatGroupWrapper>
+     */
+    List<StatGroupWrapper> selectTeacherStudentNumberStatInfo(@Param("teacherIds") List<Long> teacherIds);
 }

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserBindingTeacherDao.java

@@ -4,8 +4,10 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.yonge.cooleshow.biz.dal.entity.UserBindingTeacher;
+import com.yonge.cooleshow.biz.dal.queryInfo.TeacherBindingUserQueryInfo;
 import com.yonge.cooleshow.biz.dal.vo.CourseStudentVo;
 import com.yonge.cooleshow.biz.dal.vo.TeacherVo;
+import com.yonge.cooleshow.biz.dal.vo.userBindingTeacher.UserBindingTeacherWrapper;
 import io.swagger.models.auth.In;
 import org.apache.ibatis.annotations.Param;
 
@@ -25,4 +27,14 @@ public interface UserBindingTeacherDao extends BaseMapper<UserBindingTeacher> {
 
     //查询超过days天数没有排课的绑定学院
     List<UserBindingTeacher> queryUnbindList(@Param("days") Integer days);
+
+    /**
+     * 查询绑定的学员信息
+     *
+     * @param page
+     * @param query
+     * @return
+     */
+    IPage<UserBindingTeacherWrapper> selectBindingUserPage(@Param("page") IPage<UserBindingTeacherWrapper> page,
+                                                           @Param("query") TeacherBindingUserQueryInfo.BindingUserQuery query);
 }

+ 48 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ActivityEvaluationDto.java

@@ -1,10 +1,17 @@
 package com.yonge.cooleshow.biz.dal.dto;
 
 import com.yonge.cooleshow.common.entity.BaseEntity;
+import com.yonge.cooleshow.common.enums.HardLevelEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
 
 import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
 
 /**
  * @Author: liweifan
@@ -17,12 +24,16 @@ public class ActivityEvaluationDto extends BaseEntity {
 	@ApiModelProperty("活动id ")
 	@NotNull(message = "活动id不能为空")
 	private Long activityId;
+
 	@ApiModelProperty("曲目id 多个用,分割 ")
 	//@NotBlank(message = "曲子id不能为空")
 	private String musicSheetIds; // 评测活动曲目ID
 	@ApiModelProperty("活动老师id 多个用,分割 ")
 	private String teacherIds; // 分享活动老师ID
 
+	@ApiModelProperty("评测曲目信息 ")
+	private List<EvaluationInfo> evaluationInfos;
+
 	public String getTeacherIds() {
 		return teacherIds;
 	}
@@ -47,4 +58,41 @@ public class ActivityEvaluationDto extends BaseEntity {
 	public void setMusicSheetIds(String musicSheetIds) {
 		this.musicSheetIds = musicSheetIds;
 	}
+
+	public List<EvaluationInfo> getEvaluationInfos() {
+		return evaluationInfos;
+	}
+
+	public void setEvaluationInfos(List<EvaluationInfo> evaluationInfos) {
+		this.evaluationInfos = evaluationInfos;
+	}
+
+	/**
+	 * 评测活动内容
+	 */
+	@Data
+	@NoArgsConstructor
+	@AllArgsConstructor
+	public static class EvaluationInfo implements Serializable {
+
+		@ApiModelProperty("主键 ")
+		private Long id;
+
+		@ApiModelProperty("评测难度 BEGINNER 入门级 ADVANCED 进阶级 PERFORMER 大师级 ")
+		private HardLevelEnum evaluationDifficulty;
+
+		private Date updateTime;
+		private Long updateBy;
+
+
+		public EvaluationInfo updateTime(Date updateTime) {
+			this.updateTime = updateTime;
+			return this;
+		}
+
+		public EvaluationInfo updateBy(Long updateBy) {
+			this.updateBy = updateBy;
+			return this;
+		}
+	}
 }

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

@@ -83,6 +83,9 @@ public class OrderReq {
         @ApiModelProperty(value = "活动id")
         private Long activityId;
 
+        // 透传订单类型
+        private OrderTypeEnum orderType;
+
         public BigDecimal getActualPrice() {
             return actualPrice;
         }
@@ -170,6 +173,14 @@ public class OrderReq {
         public void setRecomUserId(Long recomUserId) {
             this.recomUserId = recomUserId;
         }
+
+        public OrderTypeEnum getOrderType() {
+            return orderType;
+        }
+
+        public void setOrderType(OrderTypeEnum orderType) {
+            this.orderType = orderType;
+        }
     }
 
     public Long getRewardId() {

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

@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
 import javax.validation.constraints.NotNull;
+import java.util.List;
 import java.util.Optional;
 
 /**
@@ -38,6 +39,8 @@ public class MusicAlbumDetailSearch extends MusicSheetSearch {
     @ApiModelProperty(value = "艺术家")
     private String composer;  //音乐家
 
+    private List<String> paymentTypes;
+
     public Integer getRelatedNum() {
         return relatedNum;
     }
@@ -87,4 +90,12 @@ public class MusicAlbumDetailSearch extends MusicSheetSearch {
     public void setDelFlag(Boolean delFlag) {
         this.delFlag = delFlag;
     }
+
+    public List<String> getPaymentTypes() {
+        return paymentTypes;
+    }
+
+    public void setPaymentTypes(List<String> paymentTypes) {
+        this.paymentTypes = paymentTypes;
+    }
 }

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

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.dto.search;
 
+import com.yonge.cooleshow.biz.dal.enums.ChargeTypeEnum;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.page.QueryInfo;
 import com.yonge.toolset.base.util.StringUtil;
@@ -53,9 +54,23 @@ public class MusicAlbumSearch extends QueryInfo{
     @ApiModelProperty("声部id,多个逗号隔开")
     private String subjectIds;
 
+    @ApiModelProperty("曲目ID")
+    private Long musicId;
+
+    @ApiModelProperty(value = "收费类型(FREE:免费;VIP:会员;CHARGE:单曲收费)")
+    private ChargeTypeEnum paymentType;  //收费类型(0:免费;1:会员;2:单曲收费)
+
     @ApiModelProperty(hidden = true)
     private List<Long> subjectIdList;
 
+    public ChargeTypeEnum getPaymentType() {
+        return paymentType;
+    }
+
+    public void setPaymentType(ChargeTypeEnum paymentType) {
+        this.paymentType = paymentType;
+    }
+
     public Long getUserId() {
         return userId;
     }
@@ -157,4 +172,12 @@ public class MusicAlbumSearch extends QueryInfo{
 	public void setClientId(String clientId) {
 		this.clientId = clientId;
 	}
+
+    public Long getMusicId() {
+        return musicId;
+    }
+
+    public void setMusicId(Long musicId) {
+        this.musicId = musicId;
+    }
 }

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

@@ -1,5 +1,8 @@
 package com.yonge.cooleshow.biz.dal.dto.search;
 
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
+import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
 import io.swagger.annotations.ApiModelProperty;
 
 /**
@@ -14,6 +17,20 @@ public class StudentMusicAlbumSearch extends MusicAlbumSearch{
     @ApiModelProperty(value = "登录学生id",hidden = true)
     private Long studentId;
 
+    @ApiModelProperty(value = "收藏专辑标识", hidden = true)
+    private Boolean albumFavorite;
+
+    @ApiModelProperty("已购买专辑 ")
+    private Boolean albumPurchased;
+
+    @ApiModelProperty(value = "订单状态(WAIT_PAY:待支付;PAYING:支付中,PAID:已付款)", hidden = true)
+    private OrderStatusEnum orderStatus;  //订单状态(1:已完成;0:取消)
+
+    @ApiModelProperty(value = "购买类型 ", hidden = true)
+    private PurchaseRecordTypeEnum purchaseType;
+
+    @ApiModelProperty(value = "用户类型 TEACHER:老师,STUDENT:学生", hidden = true)
+    private ClientEnum clientType;
 
     public Long getStudentId() {
         return studentId;
@@ -22,4 +39,75 @@ public class StudentMusicAlbumSearch extends MusicAlbumSearch{
     public void setStudentId(Long studentId) {
         this.studentId = studentId;
     }
+
+    public Boolean getAlbumFavorite() {
+        return albumFavorite;
+    }
+
+    public void setAlbumFavorite(Boolean albumFavorite) {
+        this.albumFavorite = albumFavorite;
+    }
+
+    public Boolean getAlbumPurchased() {
+        return albumPurchased;
+    }
+
+    public void setAlbumPurchased(Boolean albumPurchased) {
+        this.albumPurchased = albumPurchased;
+    }
+
+    public OrderStatusEnum getOrderStatus() {
+        return orderStatus;
+    }
+
+    public void setOrderStatus(OrderStatusEnum orderStatus) {
+        this.orderStatus = orderStatus;
+    }
+
+    public PurchaseRecordTypeEnum getPurchaseType() {
+        return purchaseType;
+    }
+
+    public void setPurchaseType(PurchaseRecordTypeEnum purchaseType) {
+        this.purchaseType = purchaseType;
+    }
+
+    public ClientEnum getClientType() {
+        return clientType;
+    }
+
+    public void setClientType(ClientEnum clientType) {
+        this.clientType = clientType;
+    }
+
+
+    public StudentMusicAlbumSearch studentId(Long studentId) {
+        this.studentId = studentId;
+        return this;
+    }
+
+    public StudentMusicAlbumSearch albumFavorite(Boolean albumFavorite) {
+        this.albumFavorite = albumFavorite;
+        return this;
+    }
+
+    public StudentMusicAlbumSearch albumPurchased(Boolean albumPurchased) {
+        this.albumPurchased = albumPurchased;
+        return this;
+    }
+
+    public StudentMusicAlbumSearch orderStatus(OrderStatusEnum orderStatus) {
+        this.orderStatus = orderStatus;
+        return this;
+    }
+
+    public StudentMusicAlbumSearch purchaseType(PurchaseRecordTypeEnum purchaseType) {
+        this.purchaseType = purchaseType;
+        return this;
+    }
+
+    public StudentMusicAlbumSearch clientType(ClientEnum clientType) {
+        this.clientType = clientType;
+        return this;
+    }
 }

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

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.yonge.cooleshow.common.enums.ActivityResourceEnum;
+import com.yonge.cooleshow.common.enums.HardLevelEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -30,6 +31,10 @@ public class ActivityEvaluation implements Serializable {
     @TableField(value = "music_sheet_id_")
     private Long musicSheetId;
 
+    @ApiModelProperty("评测难度 BEGINNER 入门级 ADVANCED 进阶级 PERFORMER 大师级 ")
+    @TableField(value = "evaluation_difficulty_")
+    private HardLevelEnum evaluationDifficulty;
+
     @ApiModelProperty("资源类型 ")
     @TableField(value = "resource_type_")
     private ActivityResourceEnum resourceType;
@@ -91,4 +96,11 @@ public class ActivityEvaluation implements Serializable {
         this.createBy = createBy;
     }
 
+    public HardLevelEnum getEvaluationDifficulty() {
+        return evaluationDifficulty;
+    }
+
+    public void setEvaluationDifficulty(HardLevelEnum evaluationDifficulty) {
+        this.evaluationDifficulty = evaluationDifficulty;
+    }
 }

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

@@ -56,6 +56,11 @@ public class ActivityUserReward implements Serializable {
     @TableField(value = "winning_time_")
     private Date winningTime;
 
+
+    @ApiModelProperty("领奖时间 ")
+    @TableField(value = "receive_time_")
+    private Date receiveTime;
+
     @ApiModelProperty("奖品单位 同奖品表")
     @TableField(value = "unit_")
     private String unit;
@@ -69,6 +74,14 @@ public class ActivityUserReward implements Serializable {
     @TableField(value = "ranking_rule_")
     private ActivityRankingRuleEnum rankingRule;
 
+    public Date getReceiveTime() {
+        return receiveTime;
+    }
+
+    public void setReceiveTime(Date receiveTime) {
+        this.receiveTime = receiveTime;
+    }
+
     public Integer getRanking() {
         return ranking;
     }

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

@@ -90,6 +90,14 @@ public class MusicAlbum extends BaseEntity {
 	@ApiModelProperty("假删除标识 0:未删除 1:已删除")
 	private Boolean delFlag;
 
+	@TableField("album_price_")
+	@ApiModelProperty("专辑价格 ")
+	private Double albumPrice;
+
+	@TableField("payment_type_")
+	@ApiModelProperty("专辑价格 ")
+	private String paymentType;
+
 	public String getSubjectId() {
 		return subjectId;
 	}
@@ -236,4 +244,20 @@ public class MusicAlbum extends BaseEntity {
 	public void setAuditVersion(YesOrNoEnum auditVersion) {
 		this.auditVersion = auditVersion;
 	}
+
+	public Double getAlbumPrice() {
+		return albumPrice;
+	}
+
+	public void setAlbumPrice(Double albumPrice) {
+		this.albumPrice = albumPrice;
+	}
+
+	public String getPaymentType() {
+		return paymentType;
+	}
+
+	public void setPaymentType(String paymentType) {
+		this.paymentType = paymentType;
+	}
 }

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

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.entity;
 
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
+import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
 import com.yonge.cooleshow.common.entity.BaseEntity;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
@@ -67,6 +68,10 @@ public class MusicSheetPurchaseRecord extends BaseEntity {
     @ApiModelProperty(value = "订单状态(WAIT_PAY:待支付;PAYING:支付中,PAID:已付款)")
     private OrderStatusEnum orderStatus;  //订单状态(1:已完成;0:取消)
 
+	@TableField("purchase_type_")
+	@ApiModelProperty("购买类型 ")
+	private PurchaseRecordTypeEnum purchaseType;
+
 	public ClientEnum getClientType() {
 		return clientType;
 	}
@@ -163,8 +168,15 @@ public class MusicSheetPurchaseRecord extends BaseEntity {
 	    return this.orderStatus;
 	}
 
+	public PurchaseRecordTypeEnum getPurchaseType() {
+		return purchaseType;
+	}
+
+	public void setPurchaseType(PurchaseRecordTypeEnum purchaseType) {
+		this.purchaseType = purchaseType;
+	}
 
-    @Override
+	@Override
     public String toString() {
         return ToStringBuilder.reflectionToString(this);
     }

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

@@ -20,6 +20,7 @@ public enum AccountBizTypeEnum implements BaseEnum<String, AccountBizTypeEnum> {
     PIAON_ROOM("琴房充值"),
     ACTI_REGIST("活动报名"),
     WITHDRAWAL("结算"),
+    ALBUM("专辑"),
 
     LIVE_SHARE("直播课分润"),
     VIDEO_SHARE("视频课分润"),

+ 10 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/ChargeTypeEnum.java

@@ -30,4 +30,14 @@ public enum ChargeTypeEnum implements BaseEnum<String, ChargeTypeEnum> {
     public String getCode() {
         return this.code;
     }
+
+    /**
+     * 收费类型匹配
+     * @param type 收费类型
+     * @return boolean
+     */
+    public boolean match(String type) {
+
+        return getCode().equals(type);
+    }
 }

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

@@ -15,6 +15,7 @@ public enum GoodTypeEnum implements BaseEnum<String, GoodTypeEnum> {
     LIVE("直播课购买"),
     VIDEO("视频课购买"),
     MUSIC("单曲点播"),
+    ALBUM("专辑购买"),
     PINAO_ROOM("琴房时长"),
     ACTI_REGIST("活动报名")
     ;

+ 4 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageTypeEnum.java

@@ -20,6 +20,10 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     VIDEO_SHEET_AUTH_PASS("视频课审核通过"),
     VIDEO_SHEET_AUTH_UNPASS("视频课审核失败"),
 
+    STUDENT_BUY_MUSIC_ALBUM_SUCCESS("购买专辑成功"),
+    TEACHER_BUY_MUSIC_ALBUM_SUCCESS("购买专辑成功"),
+    SMS_STUDENT_BUY_MUSIC_ALBUM_SUCCESS("学员购买乐谱(短信)"),
+
     STUDENT_BUY_MUSIC_SHEET_SUCCESS("学员购买乐谱成功"),
     TEACHER_BUY_MUSIC_SHEET_SUCCESS("老师购买乐谱成功"),
     SMS_STUDENT_BUY_MUSIC_SHEET_SUCCESS("学员购买乐谱(短信)"),

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

@@ -16,7 +16,8 @@ public enum OrderTypeEnum implements BaseEnum<String, OrderTypeEnum> {
     VIDEO("视频课购买"),
     MUSIC("单曲点播"),
     PINAO_ROOM("琴房时长"),
-    ACTI_REGIST("活动报名")
+    ACTI_REGIST("活动报名"),
+    ALBUM("专辑购买"),
     ;
     @EnumValue
     private String code;

+ 41 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/album/PurchaseRecordTypeEnum.java

@@ -0,0 +1,41 @@
+package com.yonge.cooleshow.biz.dal.enums.album;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.toolset.base.enums.BaseEnum;
+
+/**
+ * 单曲、专辑付费购买类型
+ */
+public enum PurchaseRecordTypeEnum implements BaseEnum<String, PurchaseRecordTypeEnum> {
+
+    MUSIC("曲目"),
+    ALBUM("专辑"),
+    ;
+    @EnumValue
+    private String code;
+    private String msg;
+
+    PurchaseRecordTypeEnum(String msg) {
+        this.code = this.name();
+        this.msg = msg;
+    }
+
+    public String getMsg() {
+        return this.msg;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }
+
+    /**
+     * 收费类型匹配
+     * @param type 收费类型
+     * @return boolean
+     */
+    public boolean match(String type) {
+
+        return getCode().equals(type);
+    }
+}

+ 29 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/CourseScheduleMapper.java

@@ -0,0 +1,29 @@
+package com.yonge.cooleshow.biz.dal.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yonge.cooleshow.biz.dal.entity.CourseSchedule;
+import com.yonge.cooleshow.biz.dal.entity.Subject;
+import com.yonge.cooleshow.biz.dal.vo.userBindingTeacher.UserBindingTeacherWrapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 用户表 Mapper 接口
+ * </p>
+ *
+ * @author Eric
+ * @since 2022-09-02
+ */
+@Repository
+public interface CourseScheduleMapper extends BaseMapper<CourseSchedule> {
+
+
+    /**
+     * 查询课程数
+     */
+    List<UserBindingTeacherWrapper.CourseNum> selectStudentPianoCourse(@Param("teacherId") Long teacherId, @Param(
+            "studentIdList") List<Long> studentIdList);
+}

+ 19 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/StudentMapper.java

@@ -0,0 +1,19 @@
+package com.yonge.cooleshow.biz.dal.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.biz.dal.entity.Student;
+import com.yonge.cooleshow.biz.dal.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.vo.CouponIssueUserVo;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+
+@Repository
+public interface StudentMapper extends BaseMapper<Student> {
+
+
+}

+ 13 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/SubjectMapper.java

@@ -0,0 +1,13 @@
+package com.yonge.cooleshow.biz.dal.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yonge.cooleshow.biz.dal.entity.Student;
+import com.yonge.cooleshow.biz.dal.entity.Subject;
+import org.springframework.stereotype.Repository;
+
+
+@Repository
+public interface SubjectMapper extends BaseMapper<Subject> {
+
+
+}

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/SysUserMapper.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.mapper;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.auth.api.dto.RealnameAuthReq;
 import com.yonge.cooleshow.biz.dal.entity.SysUser;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
@@ -31,4 +32,14 @@ public interface SysUserMapper extends BaseMapper<SysUser> {
      */
     List<CouponIssueUserVo> queryCouponIssueUser(@Param("iPage") IPage<CouponIssueUserVo> iPage, @Param(
             "client") ClientEnum client, @Param("keyword") String keyword);
+
+
+    /***
+     * 修改用户实名信息
+     * @author liweifan
+     * @param: teacherApplyDetailDto
+     * @updateTime 2022/3/18 15:57
+     * @return: java.lang.Integer
+     */
+    Integer updateUserCard(@Param("param") RealnameAuthReq param);
 }

+ 102 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/queryInfo/TeacherBindingUserQueryInfo.java

@@ -0,0 +1,102 @@
+package com.yonge.cooleshow.biz.dal.queryInfo;
+
+import com.alibaba.fastjson.JSON;
+
+import java.util.Date;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-10-08
+ */
+public class TeacherBindingUserQueryInfo {
+
+    // 老师绑定的学生列表查询
+    public static class BindingUserQuery{
+
+        // 老师id
+        private Long teacherId;
+
+        // 查询条件 昵称、编号、手机号
+        private String search;
+
+        // 绑定开始时间
+        private Date startTime;
+
+        // 绑定结束时间
+        private Date endTime;
+
+
+        public static BindingUserQuery from(String recv) {
+
+            return JSON.parseObject(recv, BindingUserQuery.class);
+        }
+
+        public Long getTeacherId() {
+            return teacherId;
+        }
+
+        public void setTeacherId(Long teacherId) {
+            this.teacherId = teacherId;
+        }
+
+        public String getSearch() {
+            return search;
+        }
+
+        public void setSearch(String search) {
+            this.search = search;
+        }
+
+        public Date getStartTime() {
+            return startTime;
+        }
+
+        public void setStartTime(Date startTime) {
+            this.startTime = startTime;
+        }
+
+        public Date getEndTime() {
+            return endTime;
+        }
+
+        public void setEndTime(Date endTime) {
+            this.endTime = endTime;
+        }
+    }
+    // 绑定学生课程列表查询
+    public static class BindingStudentCourseQuery{
+
+        // 老师id
+        private Long teacherId;
+
+        // 学员id
+        private Long studentId;
+
+
+        public static BindingStudentCourseQuery from(String recv) {
+
+            return JSON.parseObject(recv, BindingStudentCourseQuery.class);
+        }
+
+        public Long getTeacherId() {
+            return teacherId;
+        }
+
+        public void setTeacherId(Long teacherId) {
+            this.teacherId = teacherId;
+        }
+
+        public Long getStudentId() {
+            return studentId;
+        }
+
+        public void setStudentId(Long studentId) {
+            this.studentId = studentId;
+        }
+    }
+
+
+
+}

+ 40 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/queryInfo/TeacherQueryInfo.java

@@ -0,0 +1,40 @@
+package com.yonge.cooleshow.biz.dal.queryInfo;
+
+import com.alibaba.fastjson.JSON;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * Created by Eric.Shang on 2022/10/9.
+ */
+public class TeacherQueryInfo {
+
+    /**
+     * 老师粉丝数查询条件
+     */
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class FansQuery implements Serializable {
+
+        private Long teacherId;
+        private Date startTime;
+        private Date endTime;
+        // 昵称
+        private String nickname;
+        // 编号/手机号
+        private Long userId;
+        private String phone;
+
+        public static FansQuery from(String recv) {
+
+            return JSON.parseObject(recv, FansQuery.class);
+        }
+    }
+}

+ 52 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/queryInfo/UserRewardQueryInfo.java

@@ -0,0 +1,52 @@
+package com.yonge.cooleshow.biz.dal.queryInfo;
+
+import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+
+/**
+ * Description 用户领奖查询
+ *
+ * @author liujunchi
+ * @date 2022-10-08
+ */
+public class UserRewardQueryInfo {
+
+    // 用户id
+    private Long userId;
+
+    // 客户端类型
+    private ClientEnum client;
+
+
+    // 是否领取
+    private YesOrNoEnum receive;
+    public static UserRewardQueryInfo from(String recv) {
+
+        return JSON.parseObject(recv, UserRewardQueryInfo.class);
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public ClientEnum getClient() {
+        return client;
+    }
+
+    public void setClient(ClientEnum client) {
+        this.client = client;
+    }
+
+    public YesOrNoEnum getReceive() {
+        return receive;
+    }
+
+    public void setReceive(YesOrNoEnum receive) {
+        this.receive = receive;
+    }
+}

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

@@ -87,4 +87,6 @@ public interface ActivityEvaluationRecordService extends IService<ActivityEvalua
 	 * @return List<ActivityEvaluationRecord>
 	 */
 	List<ActivityEvaluationRecord> queryActivityUserHighestRankingInfo(Long activityId, List<Long> userIds);
+
+
 }

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

@@ -77,4 +77,12 @@ public interface ActivityEvaluationService extends IService<ActivityEvaluation>
 	 * @return IPage<ActivityTeacherWrapper>
 	 */
 	IPage<ActivityTeacherWrapper> activityTeacherByTimePageInfo(IPage<ActivityTeacherWrapper> page, ActivityTeacherQuery query);
+
+	/**
+	 * 批量更新评测曲目信息
+	 * @param user SysUser
+	 * @param info ActivityEvaluationDto
+	 * @return int
+	 */
+    int batchUpdateEvaluationInfo(SysUser user, ActivityEvaluationDto info);
 }

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

@@ -83,7 +83,7 @@ public interface ActivityRewardService extends IService<ActivityReward>  {
 	IPage<ActivityRewardChangeStockVo> selectChangeStockPage(IPage<ActivityRewardChangeStockVo> page, ActivityRewardChangeStockSearch query);
 
 	/**
-	 * 发放获奖奖品
+	 * 发放获奖奖品 记录
 	 * @param userId 用户id
 	 * @param activityId 活动id
 	 * @param activityRewardIds 活动关联奖品ID
@@ -92,5 +92,15 @@ public interface ActivityRewardService extends IService<ActivityReward>  {
 	 */
 	List<Long> sendReward(Long userId, Long activityId, List<Long> activityRewardIds, Date date);
 
-	Boolean userRewarded(Long userId, Long activityId);
+	/**
+	 * 领取奖品
+	 *
+	 * @param userId 用户id
+	 * @param date 领取时间
+	 * @param activityPlanId 活动id
+	 * @param activityRewardId 奖品id
+	 */
+    void receiveReward(Long userId, Date date, Long activityPlanId, Long activityRewardId);
+
+    Boolean userRewarded(Long userId, Long activityId);
 }

+ 23 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityUserRewardService.java

@@ -2,10 +2,13 @@ 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.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.queryInfo.UserRewardQueryInfo;
 import com.yonge.cooleshow.biz.dal.vo.ActivityUserRewardVo;
 import com.yonge.cooleshow.biz.dal.dto.search.ActivityUserRewardSearch;
 import com.yonge.cooleshow.biz.dal.entity.ActivityUserReward;
 import com.yonge.cooleshow.biz.dal.vo.UserRewardVo;
+import com.yonge.cooleshow.biz.dal.vo.activity.UserRewardWrapper;
 
 /**
  * 活动用户获奖表 服务类
@@ -36,4 +39,24 @@ public interface ActivityUserRewardService extends IService<ActivityUserReward>
 	 * @param userId 用户id
 	 */
     void saveRewardRecord(Long activityId, Long rewardId, Long userId);
+
+	/**
+	 * 检查是否存在未领取的奖品
+	 *
+	 * @param userId 用户id
+	 * @param client 客户端
+	 * @return
+	 */
+    Boolean checkReceiveReward(Long userId, ClientEnum client);
+
+	/**
+	 * 领奖
+	 *
+	 */
+	Boolean receiveReward(Long userId, Long receiveRewardId);
+
+	/**
+	 * 发放奖品记录
+	 */
+	IPage<UserRewardWrapper> receiveRewardList(IPage<UserRewardWrapper> page, UserRewardQueryInfo query);
 }

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

@@ -51,7 +51,12 @@ public interface CouponIssueService extends IService<CouponIssue> {
      * @param date
      * @return
      */
-    Boolean issueCoupon(Long couponId, List<UserParam> userParam, Long issuer, String reason, Boolean sendMessage, Boolean throwE, SendTypeEnum issueWay, Date date);
+    void issueCoupon(Long couponId, List<UserParam> userParam, Long issuer, String reason,SendTypeEnum issueWay, Date date);
+
+    /**
+     * 保存发放优惠券记录,不发推送
+     */
+    void saveIssueCoupon(Long couponId, List<UserParam> userParam, Long issuer, String reason, SendTypeEnum issueWay, Date date);
 
     /**
      * 查询能发放优惠券的用户列表

+ 4 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicAlbumService.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.dto.MusicAlbumSheetDto;
 import com.yonge.cooleshow.biz.dal.dto.MusicAlbumSheetSortDto;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumDetailSearch;
@@ -46,9 +47,11 @@ public interface MusicAlbumService extends IService<MusicAlbum> {
      *
      * @param page 分页信息
      * @param query 查询条件
+     * @param sysUser
+     * @param student
      * @return AlbumDetailVo
      */
-    AlbumDetailVo detail(IPage<MusicSheetVo> page, MusicAlbumDetailSearch query);
+    AlbumDetailVo detail(IPage<MusicSheetVo> page, MusicAlbumDetailSearch query, SysUser sysUser, ClientEnum client);
 
     /**
      * 删除专辑详情关联曲目

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

@@ -3,6 +3,7 @@ package com.yonge.cooleshow.biz.dal.service;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheetPurchaseRecord;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
 
 /**
  * MusicSheetPurchaseRecordService服务类
@@ -19,5 +20,5 @@ public interface MusicSheetPurchaseRecordService extends IService<MusicSheetPurc
      * @param musicSheetId 曲目id
      * @return boolean
      */
-    MusicSheetPurchaseRecord checkPurchase(Long userId, Long musicSheetId, ClientEnum clientType);
+    MusicSheetPurchaseRecord checkPurchase(Long userId, Long musicSheetId, ClientEnum clientType, PurchaseRecordTypeEnum purchaseType);
 }

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

@@ -18,6 +18,7 @@ import com.yonge.cooleshow.biz.dal.dto.search.TeacherMusicSheetAuditSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.TeacherMusicSheetSearch;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
 import com.yonge.cooleshow.biz.dal.vo.HomeMusicSheetVo;
 import com.yonge.cooleshow.biz.dal.vo.MusicSheetDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.MusicSheetShareVo;
@@ -101,6 +102,13 @@ public interface MusicSheetService extends IService<MusicSheet> {
     IPage<MusicSheetVo> selectStudentPage(IPage<MusicSheetVo> page, StudentMusicSheetSearch query, ClientEnum clientType);
 
     /**
+     * 更新曲目专辑数
+     * @param records List<MusicSheetVo>
+     * @return List<MusicSheetVo>
+     */
+    List<MusicSheetVo> updateMusicAlbumNumInfo(List<MusicSheetVo> records);
+
+    /**
      * 收藏/取消收藏 曲目
      *
      * @param userId 用户id , 学生id
@@ -215,12 +223,13 @@ public interface MusicSheetService extends IService<MusicSheet> {
 
     /**
      * 发送学生购买曲目消息
-     *  @param teacherId 老师id
+     * @param teacherId 老师id
      * @param studentId 学生id
      * @param musicSheetId 曲目id
      * @param orderClient
+     * @param orderType
      */
-    boolean sendBuyMessage(Long teacherId, Long studentId, Long musicSheetId, ClientEnum orderClient);
+    boolean sendBuyMessage(Long teacherId, Long studentId, Long musicSheetId, ClientEnum orderClient, OrderTypeEnum orderType);
 
     /**
      * 订单生产后,创建记录

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SysUserService.java

@@ -1,6 +1,9 @@
 package com.yonge.cooleshow.biz.dal.service;
 
+import com.yonge.cooleshow.auth.api.dto.RealnameAuthReq;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.toolset.utils.idcard.IdcardInfoExtractor;
 
 public interface SysUserService{
 
@@ -9,4 +12,13 @@ public interface SysUserService{
     SysUser getUser();
 
     SysUser findUserById(Long userId);
+
+    /**
+     * 实名 + 注册协议
+     *
+     *  @param realNameAuthDto
+     * @param sysUser
+     * @param client
+     */
+    IdcardInfoExtractor updateUserCard(RealnameAuthReq realNameAuthDto, SysUser sysUser, ClientEnum client);
 }

+ 24 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TeacherService.java

@@ -9,7 +9,9 @@ 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.enums.TeacherTagEnum;
+import com.yonge.cooleshow.biz.dal.queryInfo.TeacherQueryInfo;
 import com.yonge.cooleshow.biz.dal.vo.*;
+import com.yonge.cooleshow.biz.dal.wrapper.teacher.TeacherWrapper;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 
 import java.util.List;
@@ -138,6 +140,14 @@ public interface TeacherService extends IService<Teacher> {
     IPage<MyFens> queryMyFans(IPage<MyFens> page, Long teacherId);
 
     /**
+     * 老师粉丝查询
+     * @param page IPage<MyFens>
+     * @param query TeacherQueryInfo.FansQuery
+     * @return IPage<MyFens>
+     */
+    IPage<MyFens> queryMyFans(IPage<MyFens> page, TeacherQueryInfo.FansQuery query);
+
+    /**
      * 设置老师标签
      *
      * @param userId 老师id
@@ -151,4 +161,18 @@ public interface TeacherService extends IService<Teacher> {
      * @return
      */
     List<HotTeacherVo> queryHotTeacherList(Long userId);
+
+    /**
+     * 老师详情信息
+     * @param teacherId 用户ID
+     * @return TeacherVo
+     */
+    TeacherVo findTeacherDetailInfo(Long teacherId);
+
+    /**
+     * 老师统计指标信息
+     * @param userId 用户ID
+     * @return TeacherWrapper.TeacherStatInfo
+     */
+    TeacherWrapper.TeacherStatInfo findTeacherStatInfoById(Long userId);
 }

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

@@ -1,7 +1,11 @@
 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.entity.UserBindingTeacher;
+import com.yonge.cooleshow.biz.dal.queryInfo.TeacherBindingUserQueryInfo;
+import com.yonge.cooleshow.biz.dal.vo.userBindingTeacher.UserBindingCourseWrapper;
+import com.yonge.cooleshow.biz.dal.vo.userBindingTeacher.UserBindingTeacherWrapper;
 
 /**
  * @Author: cy
@@ -12,5 +16,19 @@ public interface UserBindingTeacherService extends IService<UserBindingTeacher>
      * 超过天数无琴房课的解除绑定关系
      */
     void unbindTask();
+
+    /**
+     * 查询老师绑定学生数据
+     *
+     * @param page
+     * @param query
+     * @return
+     */
+    IPage<UserBindingTeacherWrapper> selectBindingUserPage(IPage<UserBindingTeacherWrapper> page, TeacherBindingUserQueryInfo.BindingUserQuery query);
+
+    /**
+     * 查询老师绑定的学生课程信息
+     */
+    IPage<UserBindingCourseWrapper> selectBindingUserCoursePage(IPage<UserBindingCourseWrapper> page, TeacherBindingUserQueryInfo.BindingStudentCourseQuery query);
 }
 

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

@@ -277,15 +277,19 @@ public class ActivityEvaluationRecordServiceImpl extends ServiceImpl<ActivityEva
             // 学生声部信息
             Student student = studentMapper.selectOne(Wrappers.<Student>lambdaQuery().eq(Student::getUserId, userId));
 
-            long subjectId = 0;
-            if (Objects.nonNull(student.getSubjectId())) {
-                subjectId = Long.parseLong(student.getSubjectId().split(",")[0]);
+            String userSubject = "";
+            if (Objects.nonNull(student) && Objects.nonNull(student.getSubjectId())) {
+                long subjectId = Long.parseLong(student.getSubjectId().split(",")[0]);
+
+                Subject subject = subjectService.get(subjectId);
+
+                // 学生声部信息
+                userSubject = Optional.ofNullable(subject).map(Subject::getName).orElse("");
             }
-            Subject subject = subjectService.get(subjectId);
 
             if (Objects.nonNull(userRanking)) {
 
-                userRanking.setUserSubject(Optional.ofNullable(subject).map(Subject::getName).orElse(""));
+                userRanking.setUserSubject(userSubject);
             }
 
         } else {

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

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -333,4 +334,26 @@ public class ActivityEvaluationServiceImpl extends ServiceImpl<ActivityEvaluatio
         return page.setRecords(wrappers);
     }
 
+    /**
+     * 批量更新评测曲目信息
+     *
+     * @param user SysUser
+     * @param info ActivityEvaluationDto
+     * @return int
+     */
+    @Transactional
+    @Override
+    public int batchUpdateEvaluationInfo(SysUser user, ActivityEvaluationDto info) {
+
+        List<ActivityEvaluationDto.EvaluationInfo> evaluationInfos = info.getEvaluationInfos();
+
+        List<ActivityEvaluation> evaluations = JSON.parseArray(JSON.toJSONString(evaluationInfos),
+                ActivityEvaluation.class);
+
+        // 批量更新
+        activityEvaluationService.updateBatchById(evaluations, 30);
+
+        return evaluationInfos.size();
+    }
+
 }

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

@@ -528,6 +528,18 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
             String evaluationDifficulty = baseMapper.selectActivityPlanEvaluation(activityPlanId);
             activityVo.setEvaluationDifficulty(evaluationDifficulty);
 
+            // 单曲排名
+            if (ActivityRankingMethodEnum.MUSIC_RANKING == activityPlan.getRankingMethod()) {
+
+                for (ActivityMusicVo item : activityVo.getActivityMusicVoList()) {
+
+                    if (StringUtils.isEmpty(item.getEvaluationDifficulty())) {
+
+                        item.setEvaluationDifficulty(evaluationDifficulty);
+                    }
+                }
+            }
+
             // 计算评测活动声部最高分
             if (ActivityRankingMethodEnum.TOTAL_SCORE == activityPlan.getRankingMethod()) {
 

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

@@ -48,13 +48,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
+import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -287,34 +281,6 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
                 continue;
             }
 
-            if (activityReward.getRewardType().equals(RewardTypeEnum.PIAMO_ROOM)) {
-                // 琴房课时
-                PianoRoomChangeRecord pianoRoomChangeRecord = new PianoRoomChangeRecord();
-                pianoRoomChangeRecord.setUserId(userId);
-                pianoRoomChangeRecord.setInOrOut(InOrOutEnum.IN);
-                pianoRoomChangeRecord.setSourceType(SourceTypeEnum.ACTIVITY);
-                pianoRoomChangeRecord.setTimes(activityReward.getNum());
-                pianoRoomChangeRecord.setBizId(activityId.toString());
-                pianoRoomChangeRecord.setCreateTime(new Date());
-                pianoRoomChangeRecord.setReason(activityPlan.getActivityName());
-                pianoRoomChangeRecordService.add(pianoRoomChangeRecord);
-            } else if (activityReward.getRewardType().equals(RewardTypeEnum.VIP)) {
-                // VIP
-                memberPriceSettingsService.activityReward(userId, activityPlan.getActivityClient(),
-                        activityReward, activityId,activityPlan.getActivityName());
-            } else if (activityReward.getRewardType().equals(RewardTypeEnum.COUPON)) {
-                // 优惠券
-                List<UserParam> list = new ArrayList<>();
-                UserParam userParam = new UserParam();
-                userParam.setUserId(userId);
-                userParam.setClientType(activityPlan.getActivityClient());
-                list.add(userParam);
-                Boolean issueCoupon = couponIssueService.issueCoupon(activityReward.getCouponId(), list, null, activityPlan.getActivityName(),
-                        false, false, SendTypeEnum.ACTIVITY,date);
-                if (!issueCoupon) {
-                    continue;
-                }
-            }
             // 获取推送奖品消息信息
             rewardNameList.add(activityReward.getRewardName());
             // 关联返回数据,更新用户奖品发送状态
@@ -331,6 +297,43 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
     }
 
     @Override
+    public void receiveReward(Long userId, Date date, Long activityPlanId, Long activityRewardId) {
+        ActivityPlan activityPlan = activityPlanService.getById(activityPlanId);
+        ActivityReward activityReward = getById(activityRewardId);
+        if (activityPlan == null) {
+            throw new BizException("活动不存在");
+        }
+        if (activityReward == null) {
+            throw new BizException("奖品不存在");
+        }
+        if (activityReward.getRewardType().equals(RewardTypeEnum.PIAMO_ROOM)) {
+            // 琴房课时
+            PianoRoomChangeRecord pianoRoomChangeRecord = new PianoRoomChangeRecord();
+            pianoRoomChangeRecord.setUserId(userId);
+            pianoRoomChangeRecord.setInOrOut(InOrOutEnum.IN);
+            pianoRoomChangeRecord.setSourceType(SourceTypeEnum.ACTIVITY);
+            pianoRoomChangeRecord.setTimes(activityReward.getNum());
+            pianoRoomChangeRecord.setBizId(activityPlan.getId().toString());
+            pianoRoomChangeRecord.setCreateTime(new Date());
+            pianoRoomChangeRecord.setReason(activityPlan.getActivityName());
+            pianoRoomChangeRecordService.add(pianoRoomChangeRecord);
+        } else if (activityReward.getRewardType().equals(RewardTypeEnum.VIP)) {
+            // VIP
+            memberPriceSettingsService.activityReward(userId, activityPlan.getActivityClient(), activityReward,
+                                                      activityPlan.getId(), activityPlan.getActivityName());
+        } else if (activityReward.getRewardType().equals(RewardTypeEnum.COUPON)) {
+            // 优惠券
+            List<UserParam> list = new ArrayList<>();
+            UserParam userParam = new UserParam();
+            userParam.setUserId(userId);
+            userParam.setClientType(activityPlan.getActivityClient());
+            list.add(userParam);
+            couponIssueService.saveIssueCoupon(activityReward.getCouponId(), list, null, activityPlan.getActivityName(),
+                                                                  SendTypeEnum.ACTIVITY, date);
+        }
+    }
+
+    @Override
     public Boolean userRewarded(Long userId, Long activityId) {
         return baseMapper.userRewarded(userId, activityId);
     }
@@ -353,8 +356,11 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
             Map<Long, String> receivers = new HashMap<>();
             receivers.put(userId, user.getPhone());
 
+
+            String url = sysMessageService.selectConfigUrl(MessageTypeEnum.ACTIVITY_WIN.getCode(),clientType.getCode()
+                                                                                        .toLowerCase(Locale.ROOT));
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.ACTIVITY_WIN, receivers, null,
-                    0, null, clientType.getCode(), activityName, activityRewardName);
+                    0, url, clientType.getCode(), activityName, activityRewardName);
         } catch (Exception e) {
             e.printStackTrace();
             log.error("获奖消息发送失败,{}", e.getMessage());

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

@@ -10,15 +10,19 @@ import com.yonge.cooleshow.biz.dal.entity.ActivityEvaluationRecord;
 import com.yonge.cooleshow.biz.dal.entity.ActivityPlan;
 import com.yonge.cooleshow.biz.dal.entity.ActivityReward;
 import com.yonge.cooleshow.biz.dal.entity.ActivityUserReward;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.queryInfo.UserRewardQueryInfo;
 import com.yonge.cooleshow.biz.dal.service.ActivityEvaluationRecordService;
 import com.yonge.cooleshow.biz.dal.service.ActivityPlanService;
 import com.yonge.cooleshow.biz.dal.service.ActivityRewardService;
 import com.yonge.cooleshow.biz.dal.service.ActivityUserRewardService;
 import com.yonge.cooleshow.biz.dal.vo.ActivityUserRewardVo;
 import com.yonge.cooleshow.biz.dal.vo.UserRewardVo;
+import com.yonge.cooleshow.biz.dal.vo.activity.UserRewardWrapper;
 import com.yonge.cooleshow.common.enums.ActivityTypeEnum;
 import com.yonge.cooleshow.common.enums.EStatus;
 import com.yonge.cooleshow.common.enums.RewardTypeEnum;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.exception.BizException;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
@@ -155,4 +159,34 @@ public class ActivityUserRewardServiceImpl extends ServiceImpl<ActivityUserRewar
         activityUserReward.setReceiveFlag(1);
         this.save(activityUserReward);
     }
+
+    @Override
+    public Boolean checkReceiveReward(Long userId, ClientEnum client) {
+        UserRewardQueryInfo query = new UserRewardQueryInfo();
+        query.setUserId(userId);
+        query.setClient(client);
+        query.setReceive(YesOrNoEnum.NO);
+
+        return baseMapper.selectReceiveRewardCount(query) >0;
+    }
+
+    @Override
+    public Boolean receiveReward(Long userId, Long receiveRewardId) {
+        ActivityUserReward activityUserReward = getById(receiveRewardId);
+        Date receiveTime = new Date();
+        // 修改领奖状态
+        int i  = baseMapper.receiveReward(userId,receiveRewardId,receiveTime);
+        if (i == 0) {
+            return false;
+        }
+
+        activityRewardService.receiveReward(userId,receiveTime,activityUserReward.getActivityId(),activityUserReward.getRewardId());
+        return true;
+    }
+
+    @Override
+    public IPage<UserRewardWrapper> receiveRewardList(IPage<UserRewardWrapper> page, UserRewardQueryInfo query) {
+
+        return baseMapper.selectReceiveRewardList(page,query);
+    }
 }

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

@@ -128,6 +128,11 @@ public class ContractServiceImpl implements ContractService {
 
         Map<String, Object> params = new HashMap<>();
         String companyName = sysConfigService.findConfigValue(SysConfigConstant.COMPANY_NAME);
+        if (contractType.equals(ContractTemplateTypeEnum.REGISTER)) {
+            params.put("contractName", "用户注册协议");
+        } else {
+            params.put("contractName", "产品与服务协议");
+        }
         params.put("companyName", companyName);
         params.put("companySealPicture", sysConfigService.findConfigValue(SysConfigConstant.COMPANY_SEAL_PICTURE));
         params.put("contractMainContent", mainContent);
@@ -216,6 +221,11 @@ public class ContractServiceImpl implements ContractService {
 
         Map<String, Object> params = new HashMap<>();
         String companyName = sysConfigService.findConfigValue(SysConfigConstant.COMPANY_NAME);
+        if (contractType.equals(ContractTemplateTypeEnum.REGISTER)) {
+            params.put("contractName", "用户注册协议");
+        } else {
+            params.put("contractName", "产品与服务协议");
+        }
         params.put("companyName", companyName);
         params.put("companySealPicture", sysConfigService.findConfigValue(SysConfigConstant.COMPANY_SEAL_PICTURE));
         params.put("contractMainContent", mainContent);

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

@@ -26,7 +26,6 @@ import com.yonge.cooleshow.biz.dal.vo.coupon.CouponIssueWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
 import com.yonge.cooleshow.common.enums.EStatus;
 import com.yonge.toolset.base.exception.BizException;
-import com.yonge.toolset.base.string.MessageFormatter;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -155,18 +154,15 @@ public class CouponIssueServiceImp extends ServiceImpl<CouponIssueMapper, Coupon
 
     @Override
     @Transactional
-    public Boolean issueCoupon(Long couponId, List<UserParam> userParam, Long issuer, String reason, Boolean sendMessage, Boolean throwE, SendTypeEnum issueWay, Date date) {
+    public void issueCoupon(Long couponId, List<UserParam> userParam, Long issuer, String reason,SendTypeEnum issueWay, Date date) {
         CouponInfo couponInfo = couponInfoService.queryCouponInfoById(couponId);
         if (couponInfo == null) {
-            if (!throwE) return false;
             throw new BizException("未找到优惠券信息");
         }
         if (couponInfo.getInventory() < userParam.size()) {
-            if (!throwE) return false;
             throw new BizException("库存不足");
         }
         if (couponInfo.getStatus() == EStatus.DISABLE.getValue()) {
-            if (!throwE) return false;
             throw new BizException("优惠券已被禁用");
         }
 
@@ -185,6 +181,21 @@ public class CouponIssueServiceImp extends ServiceImpl<CouponIssueMapper, Coupon
             }
         }
 
+        saveIssueCoupon(couponId, userParam, issuer, reason, issueWay, date);
+
+        //  优惠券扣减库存
+        int i = couponInfoService.updateStock(couponId, userParam.size(), InOrOutEnum.OUT);
+        if (i == 0) {
+            throw new BizException("库存不足");
+        }
+
+        // 发送消息
+        sendMessage(couponInfo.getName(), userParam);
+    }
+
+    @Override
+    public void saveIssueCoupon(Long couponId, List<UserParam> userParam, Long issuer, String reason, SendTypeEnum issueWay, Date date) {
+        CouponInfo couponInfo = couponInfoService.queryCouponInfoById(couponId);
         // 判断优惠券类型 设置优惠券时间
         Long startTime = null;
         Long endTime = null;
@@ -199,11 +210,9 @@ public class CouponIssueServiceImp extends ServiceImpl<CouponIssueMapper, Coupon
         List<CouponIssue> couponIssueList = new ArrayList<>();
         for (UserParam param : userParam) {
             if (param.getUserId() == null) {
-                if (!throwE) return false;
                 throw new BizException("发放用户id不能为空");
             }
             if (param.getClientType() == null) {
-                if (!throwE) return false;
                 throw new BizException("发放客户端不能为空");
             }
             CouponIssue couponIssue = new CouponIssue();
@@ -221,19 +230,6 @@ public class CouponIssueServiceImp extends ServiceImpl<CouponIssueMapper, Coupon
             couponIssueList.add(couponIssue);
         }
         this.saveBatch(couponIssueList);
-
-        //  优惠券扣减库存
-        int i = couponInfoService.updateStock(couponId, userParam.size(), InOrOutEnum.OUT);
-        if (i == 0) {
-            if (!throwE) return false;
-            throw new BizException("库存不足");
-        }
-
-        // 发送消息
-        if (sendMessage) {
-            sendMessage(couponInfo.getName(), userParam);
-        }
-        return true;
     }
 
     private void sendMessage(String couponName,List<UserParam> userParams) {

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

@@ -1,16 +1,29 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import java.text.MessageFormat;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dao.AlbumMusicRelateDao;
+import com.yonge.cooleshow.biz.dal.dao.MusicSheetDao;
+import com.yonge.cooleshow.biz.dal.dao.MusicSheetPurchaseRecordDao;
+import com.yonge.cooleshow.biz.dal.entity.MusicSheetPurchaseRecord;
+import com.yonge.cooleshow.biz.dal.enums.ChargeTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
+import com.yonge.cooleshow.biz.dal.service.MusicSheetPurchaseRecordService;
+import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
+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 org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.additional.query.impl.LambdaQueryChainWrapper;
@@ -62,6 +75,15 @@ public class MusicAlbumServiceImpl extends ServiceImpl<MusicAlbumDao,MusicAlbum>
 
     @Autowired
     private AlbumFavoriteService albumFavoriteService;
+    @Autowired
+    private MusicSheetPurchaseRecordDao musicSheetPurchaseRecordMapper;
+    @Autowired
+    private MusicSheetDao musicSheetMapper;
+    @Autowired
+    private AlbumMusicRelateDao albumMusicRelateMapper;
+
+    @Autowired
+    private MusicSheetPurchaseRecordService musicSheetPurchaseRecordService;
 
     public MusicAlbumDao getDao() {
         return musicAlbumDao;
@@ -88,7 +110,7 @@ public class MusicAlbumServiceImpl extends ServiceImpl<MusicAlbumDao,MusicAlbum>
     }
 
     @Override
-    public AlbumDetailVo detail(IPage<MusicSheetVo> page, MusicAlbumDetailSearch query) {
+    public AlbumDetailVo detail(IPage<MusicSheetVo> page, MusicAlbumDetailSearch query, SysUser sysUser, ClientEnum client) {
         MusicAlbumVo musicAlbum = baseMapper.selectMusicAlbumById(query.getId());
         if (musicAlbum == null) {
             throw  new BizException("未找到专辑信息");
@@ -101,16 +123,62 @@ public class MusicAlbumServiceImpl extends ServiceImpl<MusicAlbumDao,MusicAlbum>
         albumDetailVo.setAlbumCoverUrl(musicAlbum.getAlbumCoverUrl());
         albumDetailVo.setAlbumStatue(musicAlbum.getAlbumStatus());
         albumDetailVo.setAlbumFavoriteCount(musicAlbum.getAlbumFavoriteCount());
+        albumDetailVo.setAlbumPrice(musicAlbum.getAlbumPrice());
+        albumDetailVo.setPaymentType(musicAlbum.getPaymentType());
         albumDetailVo.setMusicTagNames(musicTagService.getMusicTagNames(StringUtil.toLongList(musicAlbum.getAlbumTag())));
 
+        // 新增专辑曲目查询条件
         if (query.getType() != null && query.getType() == 1) {
             query.setSubjectIds(musicAlbum.getSubjectId());
+
+            // 判断专辑收费类型;非免费类型,只能添加平台曲目
+            /*if (!ChargeTypeEnum.FREE.match(musicAlbum.getPaymentType())) {
+
+                // 曲目来源
+                query.setSourceType(SourceTypeEnum.PLATFORM);
+                // 曲目收费类型
+                if (musicAlbum.getPaymentType().contains(",")) {
+                    // 多种付费方式
+                    query.setPaymentTypes(Lists.newArrayList(musicAlbum.getPaymentType(), ChargeTypeEnum.FREE.getCode()));
+                } else {
+                    // 单一付费方式
+                    query.setChargeType(ChargeTypeEnum.valueOf(musicAlbum.getPaymentType()));
+                }
+
+            }*/
         }
 
         IPage<MusicSheetVo> musicSheetVoIPage = musicSheetService.selectAlbumDetailPage(page,query);
+
+        List<MusicSheetVo> records = musicSheetVoIPage.getRecords();
+        if (CollectionUtils.isNotEmpty(records)) {
+
+            // 专辑曲目付费方式
+            List<String> paymentTypes = musicSheetVoIPage.getRecords().stream()
+                    .flatMap(x -> Arrays.stream(x.getPaymentType().split(","))).distinct().collect(Collectors.toList());
+            albumDetailVo.setMusicPaymentTypes(paymentTypes);
+
+            // 更新曲目专辑数量
+            musicSheetService.updateMusicAlbumNumInfo(records);
+        }
+
+
         albumDetailVo.setMusicSheetList(PageUtil.pageInfo(musicSheetVoIPage));
 
         albumDetailVo.setMusicSheetCount((int) musicSheetVoIPage.getTotal());
+
+        if (sysUser == null) {
+            return albumDetailVo;
+        }
+
+        // 查询购买信息
+        MusicSheetPurchaseRecord purchaseRecord = musicSheetPurchaseRecordService.checkPurchase(
+                sysUser.getId(), query.getId(), client, PurchaseRecordTypeEnum.ALBUM);
+        if (purchaseRecord != null) {
+            albumDetailVo.setOrderStatus(purchaseRecord.getOrderStatus());
+            albumDetailVo.setOrderNo(purchaseRecord.getOrderNo());
+        }
+
         return albumDetailVo;
     }
 
@@ -121,6 +189,20 @@ public class MusicAlbumServiceImpl extends ServiceImpl<MusicAlbumDao,MusicAlbum>
         if (musicAlbum == null) {
             throw  new BizException("未找到专辑信息");
         }
+
+        // 付费专辑,需要校验是否已存在购买记录
+        /*if (!ChargeTypeEnum.VIP.match(musicAlbum.getPaymentType())) {
+
+            // 统计付费专辑的购买数量
+            Integer count = musicSheetPurchaseRecordMapper.selectCount(Wrappers.<MusicSheetPurchaseRecord>lambdaQuery()
+                    .eq(MusicSheetPurchaseRecord::getMusicSheetId, albumId)
+                    .eq(MusicSheetPurchaseRecord::getPurchaseType, PurchaseRecordTypeEnum.ALBUM)
+            );
+            if (Optional.ofNullable(count).orElse(0) > 0) {
+                throw new BizException("当前专辑已有购买记录");
+            }
+        }*/
+
         List<Long> musicSheetIdList = StringUtil.toLongList(musicSheetIds);
         return albumMusicRelateService.delMusicSheet(albumId,musicSheetIdList);
     }
@@ -132,6 +214,31 @@ public class MusicAlbumServiceImpl extends ServiceImpl<MusicAlbumDao,MusicAlbum>
         if (musicAlbum == null) {
             throw  new BizException("未找到专辑信息");
         }
+
+        // 付费专辑最多只能添加两首免费曲目
+        /*if (!ChargeTypeEnum.FREE.match(musicAlbum.getPaymentType())) {
+
+            // 新添加曲目统计
+            long freeNum = 0;
+            List<Long> musicIds = albumMusicList.stream()
+                    .map(MusicAlbumSheetDto.AlbumMusic::getMusicSheetId).distinct().collect(Collectors.toList());
+
+            if (CollectionUtils.isNotEmpty(musicIds)) {
+
+                freeNum = musicSheetMapper.selectBatchIds(musicIds).stream()
+                        .filter(x -> ChargeTypeEnum.FREE.match(x.getPaymentType()))
+                        .count();
+            }
+
+            // 已添加曲目统计
+            Map<Long, Integer> collect = getBaseMapper().selectAlbumMusicSheetStatInfo(albumId, ChargeTypeEnum.FREE).stream()
+                    .collect(Collectors.toMap(StatGroupWrapper::getId, StatGroupWrapper::getTotal, (o, n) -> n));
+
+            if ((collect.getOrDefault(albumId, 0) + freeNum) > 2) {
+                throw new BizException("专辑免费曲目最多2首");
+            }
+        }*/
+
         return albumMusicRelateService.addMusicSheet(albumId,albumMusicList,userId);
     }
 
@@ -157,6 +264,26 @@ public class MusicAlbumServiceImpl extends ServiceImpl<MusicAlbumDao,MusicAlbum>
         if (musicAlbum.getAuditVersion() == null) {
             musicAlbum.setAuditVersion(YesOrNoEnum.NO);
         }
+
+        // 非付费类型,已添加曲目或者已购买,不允许修改付费方式
+        /*MusicAlbum album = getById(musicAlbum.getId());
+        if (Objects.isNull(album)) {
+            throw new BizException("无效的专辑ID");
+        }*/
+
+        // 专辑从免费修改为付费方式,需要判断当前免费单曲数量
+        /*if (Objects.nonNull(musicAlbum.getPaymentType())
+                && ChargeTypeEnum.FREE.match(album.getPaymentType())
+                && !album.getPaymentType().equals(musicAlbum.getPaymentType())) {
+
+            Map<Long, Integer> collect = getBaseMapper().selectAlbumMusicSheetStatInfo(album.getId(), ChargeTypeEnum.FREE).stream()
+                    .collect(Collectors.toMap(StatGroupWrapper::getId, StatGroupWrapper::getTotal, (o, n) -> n));
+
+            if (collect.getOrDefault(album.getId(), 0) > 2) {
+                throw new BizException(MessageFormat.format("当前专辑免费单曲数为 {0}, 已超过免费数量", collect.get(album.getId())));
+            }
+        }*/
+
         return this.updateById(musicAlbum);
     }
 

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

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.biz.dal.dao.MusicSheetPurchaseRecordDao;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheetPurchaseRecord;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.MusicSheetPurchaseRecordService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -32,12 +33,13 @@ public class MusicSheetPurchaseRecordServiceImpl extends ServiceImpl<MusicSheetP
     }
 
     @Override
-    public MusicSheetPurchaseRecord checkPurchase(Long userId, Long musicSheetId, ClientEnum clientType) {
+    public MusicSheetPurchaseRecord checkPurchase(Long userId, Long musicSheetId, ClientEnum clientType, PurchaseRecordTypeEnum purchaseType) {
         List<MusicSheetPurchaseRecord> list = this.lambdaQuery()
-                                                  .eq(MusicSheetPurchaseRecord::getMusicSheetId, musicSheetId)
-                                                  .eq(MusicSheetPurchaseRecord::getStudentId, userId)
-                                                  .eq(MusicSheetPurchaseRecord::getClientType, clientType)
-                                                  .list();
+                .eq(MusicSheetPurchaseRecord::getMusicSheetId, musicSheetId)
+                .eq(MusicSheetPurchaseRecord::getStudentId, userId)
+                .eq(MusicSheetPurchaseRecord::getClientType, clientType)
+                .eq(MusicSheetPurchaseRecord::getPurchaseType, purchaseType)
+                .list();
         if (CollectionUtils.isEmpty(list)) {
             return null;
         }

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

@@ -6,8 +6,11 @@ import com.baomidou.mybatisplus.extension.service.additional.update.impl.LambdaU
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dao.MusicAlbumDao;
 import com.yonge.cooleshow.biz.dal.dto.*;
+import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
 import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
+import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
 import com.yonge.cooleshow.common.enums.ActivityShareEnum;
 import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import com.yonge.cooleshow.biz.dal.dao.MusicSheetDao;
@@ -31,18 +34,19 @@ import com.yonge.toolset.utils.easyexcel.ErrMsg;
 import com.yonge.toolset.utils.easyexcel.ExcelDataReaderProperty;
 import com.yonge.toolset.utils.easyexcel.ExcelException;
 
+import org.apache.commons.collections.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.text.MessageFormat;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -80,6 +84,9 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
     private MusicSheetPracticeRecordService musicSheetPracticeRecordService;
 
     @Autowired
+    private MusicAlbumService musicAlbumService;
+
+    @Autowired
     private StudentService studentService;
 
     @Autowired
@@ -113,6 +120,10 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
     private StudentStarService studentStarService;
     @Autowired
     private UserOrderService userOrderService;
+    @Autowired
+    private MusicAlbumDao musicAlbumMapper;
+    @Autowired
+    private MusicSheetService musicSheetService;
 
     public MusicSheetDao getDao() {
         return musicSheetDao;
@@ -141,7 +152,16 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
 
     @Override
     public IPage<MusicSheetVo> selectPage(IPage<MusicSheetVo> page, MusicSheetSearch query) {
-        return page.setRecords(baseMapper.selectPage(page, query));
+
+        List<MusicSheetVo> records = baseMapper.selectPage(page, query);
+
+        if (CollectionUtils.isNotEmpty(records)) {
+
+            // 更新曲目专辑数量
+            musicSheetService.updateMusicAlbumNumInfo(records);
+        }
+
+        return page.setRecords(records);
     }
 
     @Override
@@ -250,7 +270,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
             String reason = musicSheetAuthRecordService.selectAuditReason(id);
             detail.setReason(reason);
         }
-        if (ChargeTypeEnum.FREE.getCode().equals(detail.getChargeType().getCode())) {
+        if (detail.getPaymentType().contains(ChargeTypeEnum.FREE.getCode())) {
             detail.setPlay(YesOrNoEnum.YES);
         } else if (ClientEnum.STUDENT.getCode().equals(userType.getCode())
                 || ClientEnum.TEACHER.getCode().equals(userType.getCode())) {
@@ -282,21 +302,23 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
     private void setMusicSheetPlay(Long studentId, MusicSheetDetailVo detail, ClientEnum userType) {
         detail.setPlay(YesOrNoEnum.NO);
         // 单曲购买 判断购买记录,有记录课播放
-        if (ChargeTypeEnum.CHARGE.getCode().equals(detail.getChargeType().getCode())) {
+        if (detail.getPaymentType().contains(ChargeTypeEnum.CHARGE.getCode())) {
             // 学生须判断是否能播放曲目
             MusicSheetPurchaseRecord musicSheetPurchaseRecord = musicSheetPurchaseRecordService.checkPurchase(
-                    studentId, detail.getId(), userType);
+                    studentId, detail.getId(), userType, PurchaseRecordTypeEnum.MUSIC);
             if (musicSheetPurchaseRecord != null) {
                 detail.setOrderStatus(musicSheetPurchaseRecord.getOrderStatus());
                 detail.setOrderNo(musicSheetPurchaseRecord.getOrderNo());
                 if (OrderStatusEnum.PAID.getCode().equals(musicSheetPurchaseRecord.getOrderStatus().getCode())) {
                     detail.setPlay(YesOrNoEnum.YES);
+                    return;
                 }
             }
-        } else if (ChargeTypeEnum.VIP.getCode().equals(detail.getChargeType().getCode())) {
+        }
+        if (detail.getPaymentType().contains(ChargeTypeEnum.VIP.getCode())) {
             // 先判断是否购买过
             MusicSheetPurchaseRecord musicSheetPurchaseRecord = musicSheetPurchaseRecordService.checkPurchase(
-                    studentId, detail.getId(), userType);
+                    studentId, detail.getId(), userType, PurchaseRecordTypeEnum.MUSIC);
             if (musicSheetPurchaseRecord != null) {
                 detail.setPlay(YesOrNoEnum.YES);
             } else
@@ -313,11 +335,49 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
                 }
             }
         }
+
+        if (detail.getPlay().equals(YesOrNoEnum.YES)) {
+            return;
+        }
+
+        // 判断专辑购买
+
+        // 1 查询曲目所在的专辑
+        List<AlbumMusicRelate> albumMusicRelateList = albumMusicRelateService.lambdaQuery()
+                                                             .eq(AlbumMusicRelate::getMusicSheetId, detail.getId())
+                                                             .list();
+        if (CollectionUtils.isEmpty(albumMusicRelateList)) {
+            return;
+        }
+        List<Long> albumIdList = albumMusicRelateList.stream()
+                                                 .map(AlbumMusicRelate::getAlbumId)
+                                                 .collect(Collectors.toList());
+
+        // 2 检查是否购买过专辑
+        Integer count = musicSheetPurchaseRecordService.lambdaQuery()
+                                                       .eq(MusicSheetPurchaseRecord::getClientType, userType)
+                                                       .eq(MusicSheetPurchaseRecord::getOrderStatus,
+                                                           OrderStatusEnum.PAID)
+                                                       .in(MusicSheetPurchaseRecord::getMusicSheetId, albumIdList)
+                                                       .eq(MusicSheetPurchaseRecord::getPurchaseType,
+                                                           PurchaseRecordTypeEnum.ALBUM)
+                                                       .eq(MusicSheetPurchaseRecord::getStudentId, studentId)
+                                                       .count();
+        if (count >0) {
+            detail.setPlay(YesOrNoEnum.YES);
+        }
+
     }
 
     @Override
     public IPage<MusicSheetVo> selectStudentPage(IPage<MusicSheetVo> page, StudentMusicSheetSearch query, ClientEnum clientType) {
     	List<MusicSheetVo> records = baseMapper.selectStudentMusicPage(page, query, clientType);
+
+        if (CollectionUtils.isNotEmpty(records)) {
+
+            // 统计单曲归属专辑数
+            updateMusicAlbumNumInfo(records);
+        }
     	
     	/*if(query.getMyself() != null && query.getMyself() == false){//首页
         	if(records == null || records.size() == 0){
@@ -343,6 +403,26 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
 
     }
 
+    /**
+     * 更新曲目专辑数
+     * @param records List<MusicSheetVo>
+     * @return List<MusicSheetVo>
+     */
+    public List<MusicSheetVo> updateMusicAlbumNumInfo(List<MusicSheetVo> records) {
+        List<Long> musicIds = records.stream()
+                .map(MusicSheet::getId).distinct().collect(Collectors.toList());
+
+        Map<Long, Integer> collect = getBaseMapper().selectMusicAlbumStatInfo(musicIds).stream()
+                .collect(Collectors.toMap(StatGroupWrapper::getId, StatGroupWrapper::getTotal, (o, n) -> n));
+
+        for (MusicSheetVo item : records) {
+
+            item.setAlbumNums(collect.getOrDefault(item.getId(), 0));
+        }
+
+        return records;
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean setFavorite(Long userId, Long musicSheetId, ClientEnum clientType) {
@@ -363,12 +443,31 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
     @Override
     public IPage<MusicSheetVo> myMusic(IPage<MusicSheetVo> page, StudentMusicSheetSearch query) {
         query.setDelFlag(null);
-        return page.setRecords(baseMapper.selectMyMusicPage(page, query));
+
+        List<MusicSheetVo> records = baseMapper.selectMyMusicPage(page, query);
+
+        // 统计曲目专辑数
+        if (CollectionUtils.isNotEmpty(records)) {
+
+            // 更新曲目专辑数量
+            musicSheetService.updateMusicAlbumNumInfo(records);
+        }
+
+        return page.setRecords(records);
     }
 
     @Override
     public IPage<MusicSheetVo> favoriteMusic(IPage<MusicSheetVo> page, StudentMusicSheetSearch query, ClientEnum clientType) {
-        return page.setRecords(baseMapper.selectFavoriteMusicPage(page, query, clientType));
+
+        List<MusicSheetVo> records = baseMapper.selectFavoriteMusicPage(page, query, clientType);
+
+        if (CollectionUtils.isNotEmpty(records)) {
+
+            // 更新曲目专辑数量
+            musicSheetService.updateMusicAlbumNumInfo(records);
+        }
+
+        return page.setRecords(records);
     }
 
     @Override
@@ -390,6 +489,12 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
         page.setCurrent(practiceMusicIdPage.getCurrent());
         page.setSize(practiceMusicIdPage.getSize());
         page.setTotal(practiceMusicIdPage.getTotal());
+
+        if (CollectionUtils.isNotEmpty(page.getRecords())) {
+
+            // 更新曲目专辑数量
+            musicSheetService.updateMusicAlbumNumInfo(page.getRecords());
+        }
         return page;
     }
 
@@ -627,24 +732,53 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
         MusicSheetPayDto musicSheetPayDto = JSON.parseObject(
                 JSON.toJSONString(orderReqInfo.getBizContent()), MusicSheetPayDto.class);
 
-        MusicSheet musicSheet = this.getById(musicSheetPayDto.getMusicSheetId());
         OrderCreateRes orderCreateRes = new OrderCreateRes();
-        if (musicSheet == null) {
-            throw new BizException("不存在曲目信息");
-        }
+        orderCreateRes.setGoodType(orderCreateRes.getGoodType());
+        orderCreateRes.setGoodNum(1);
+        orderCreateRes.setOrderType(orderReqInfo.getOrderType());
+
+        switch (orderReqInfo.getGoodType()) {
+            case MUSIC: // 单曲
+                {
+                    MusicSheet musicSheet = this.getById(musicSheetPayDto.getMusicSheetId());
+                    if (musicSheet == null) {
+                        throw new BizException("不存在曲目信息");
+                    }
+
+                    orderCreateRes.setRes(true);
+                    if (!musicSheet.getSourceType().getCode().equals(SourceTypeEnum.PLATFORM.getCode())) {
+                        orderCreateRes.setMerchId(musicSheet.getUserId());
+                    }
+
+
+                    orderCreateRes.setBizId(musicSheet.getId());
+                    orderCreateRes.setOriginalPrice(musicSheet.getMusicPrice());
+                    orderCreateRes.setExpectPrice(musicSheet.getMusicPrice());
+                }
+                break;
+            case ALBUM: // 专辑
+                {
+                    MusicAlbum album = musicAlbumMapper.selectById(musicSheetPayDto.getMusicSheetId());
 
-        // 检查已经购买
-        checkoutPay(orderReqInfo.getUserId(), musicSheetPayDto.getMusicSheetId(), musicSheetPayDto.getClientType());
+                    if (Objects.isNull(album)) {
+                        throw new BizException("无效的专辑信息");
+                    }
 
-        orderCreateRes.setRes(true);
-        if (!musicSheet.getSourceType().getCode().equals(SourceTypeEnum.PLATFORM.getCode())) {
-            orderCreateRes.setMerchId(musicSheet.getUserId());
+                    orderCreateRes.setRes(true);
+                    orderCreateRes.setMerchId(0L);
+                    orderCreateRes.setBizId(album.getId());
+                    orderCreateRes.setOriginalPrice(BigDecimal.valueOf(album.getAlbumPrice()));
+                    orderCreateRes.setExpectPrice(BigDecimal.valueOf(album.getAlbumPrice()));
+                }
+                break;
+            default:
+                break;
         }
-        orderCreateRes.setGoodType(orderCreateRes.getGoodType());
-        orderCreateRes.setBizId(musicSheet.getId());
-        orderCreateRes.setGoodNum(1);
-        orderCreateRes.setOriginalPrice(musicSheet.getMusicPrice());
-        orderCreateRes.setExpectPrice(musicSheet.getMusicPrice());
+
+        // 检查已经购买,抛出已购买异常
+        checkoutPay(orderReqInfo.getUserId(), musicSheetPayDto.getMusicSheetId(), musicSheetPayDto.getClientType(),
+                PurchaseRecordTypeEnum.valueOf(orderReqInfo.getGoodType().getCode()));
+
         return HttpResponseResult.succeed(orderCreateRes);
 
     }
@@ -656,23 +790,23 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
      * @param musicSheetId 曲目id
      * @param clientType
      */
-    private void checkoutPay(Long userId, Long musicSheetId, String clientType) {
+    private void checkoutPay(Long userId, Long musicSheetId, String clientType, PurchaseRecordTypeEnum purchaseType) {
         List<MusicSheetPurchaseRecord> list = musicSheetPurchaseRecordService
                 .lambdaQuery()
                 .eq(MusicSheetPurchaseRecord::getMusicSheetId, musicSheetId)
                 .eq(MusicSheetPurchaseRecord::getStudentId, userId)
                 .eq(MusicSheetPurchaseRecord::getClientType, clientType)
+                .eq(MusicSheetPurchaseRecord::getPurchaseType, purchaseType)
                 .eq(MusicSheetPurchaseRecord::getOrderStatus, OrderStatusEnum.PAID)
                 .list();
         if (!CollectionUtils.isEmpty(list)) {
-            throw new BizException("已经购买了当前曲目");
+            throw new BizException(MessageFormat.format("已经购买了当前{0}", purchaseType.getMsg()));
         }
     }
 
     @Override
     @Transactional
     public void buyMusicSheetSuccess(UserOrderDetailVo userOrderDetailVo) {
-        MusicSheet musicSheet = this.getById(userOrderDetailVo.getBizId());
         // 曲目服务费比例
         String musicSheetServiceFee = sysConfigService.findConfigValue(SysConfigConstant.MUSIC_SHEET_SERVICE_FEE);
         BigDecimal serviceFee = new BigDecimal(musicSheetServiceFee).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
@@ -689,18 +823,22 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
         // 保存购买记录
         addMusicSheetPurchaseRecord(userOrderDetailVo, actualPrice, serviceFeeAmount);
 
-        if (!musicSheet.getSourceType().getCode().equals(SourceTypeEnum.PLATFORM.getCode())) {
+        // 曲目判断老师收入
+        if (userOrderDetailVo.getOrderType().equals(OrderTypeEnum.MUSIC)) {
+            MusicSheet musicSheet = this.getById(userOrderDetailVo.getBizId());
+            if (!musicSheet.getSourceType().getCode().equals(SourceTypeEnum.PLATFORM.getCode())) {
 
-            // 老师收入
-            BigDecimal teacherAmount = BigDecimal.ONE.subtract(serviceFee).multiply(expectPrice);
+                // 老师收入
+                BigDecimal teacherAmount = BigDecimal.ONE.subtract(serviceFee).multiply(expectPrice);
 
-            // 加入账户
-            addTeacherAccount(userOrderDetailVo, teacherAmount, userOrderDetailVo.getBizId());
+                // 加入账户
+                addTeacherAccount(userOrderDetailVo, teacherAmount, userOrderDetailVo.getBizId());
+            }
         }
 
         // 消息通知
         try {
-            sendBuyMessage(userOrderDetailVo.getMerchId(), userOrderDetailVo.getUserId(), userOrderDetailVo.getBizId(), userOrderDetailVo.getOrderClient());
+            sendBuyMessage(userOrderDetailVo.getMerchId(), userOrderDetailVo.getUserId(), userOrderDetailVo.getBizId(), userOrderDetailVo.getOrderClient(),userOrderDetailVo.getOrderType());
         } catch (Exception e) {
             log.warn("购买曲目消息推送失败 {}", e.getMessage());
         }
@@ -708,19 +846,43 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
 
     /**
      * 发送购买消息通知
-     *
-     * @param teacherId    老师id
+     *  @param teacherId    老师id
      * @param studentId    学生id
      * @param musicSheetId 曲目id
      * @param orderClient
+     * @param orderType
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public boolean sendBuyMessage(Long teacherId, Long studentId, Long musicSheetId, ClientEnum orderClient) {
+    public boolean sendBuyMessage(Long teacherId, Long studentId, Long musicSheetId, ClientEnum orderClient, OrderTypeEnum orderType) {
+
+        String name = null;
+        MusicSheet musicSheet = null;
+        MessageTypeEnum messageType = null;
+        MessageTypeEnum smsMessageType = null;
+        if (orderType.equals(OrderTypeEnum.MUSIC)) {
+            musicSheet = this.getById(musicSheetId);
+            name = musicSheet.getMusicSheetName();
+            if (orderClient.equals(ClientEnum.STUDENT)) {
+                messageType = MessageTypeEnum.STUDENT_BUY_MUSIC_SHEET_SUCCESS;
+            } else {
+                messageType = MessageTypeEnum.TEACHER_BUY_MUSIC_SHEET_SUCCESS;
+            }
+            smsMessageType = MessageTypeEnum.SMS_STUDENT_BUY_MUSIC_SHEET_SUCCESS;
+        } else if (orderType.equals(OrderTypeEnum.ALBUM)) {
+            name = musicAlbumService.getById(musicSheetId).getAlbumName();
+            if (orderClient.equals(ClientEnum.STUDENT)) {
+                messageType = MessageTypeEnum.STUDENT_BUY_MUSIC_ALBUM_SUCCESS;
+            } else {
+                messageType = MessageTypeEnum.TEACHER_BUY_MUSIC_ALBUM_SUCCESS;
+            }
+            smsMessageType = MessageTypeEnum.SMS_STUDENT_BUY_MUSIC_ALBUM_SUCCESS;
+        } else {
+            return false;
+        }
 
-        MusicSheet musicSheet = this.getById(musicSheetId);
         SysUser student = sysUserFeignService.queryUserById(studentId);
-        if (musicSheet.getSourceType().equals(SourceTypeEnum.TEACHER)) {
+        if (orderType.equals(OrderTypeEnum.MUSIC) && musicSheet.getSourceType().equals(SourceTypeEnum.TEACHER)) {
             SysUser teacher = sysUserFeignService.queryUserById(teacherId);
             if (StringUtil.isEmpty(teacher.getPhone())) {
                 log.warn("teacher id {} name {} 手机号不存在,消息推送失败", teacher.getId(), teacher.getUsername());
@@ -731,31 +893,26 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
             teacherReceivers.put(teacherId, teacher.getPhone());
 
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_BUY_TEACHER_MUSIC_SHEET, teacherReceivers, null,
-                                               0, null, ClientEnum.TEACHER.getCode(), student.getUsername(), musicSheet.getMusicSheetName());
+                                               0, null, ClientEnum.TEACHER.getCode(), student.getUsername(), name);
 
         }
         // 推送学生
         Map<Long, String> studentReceivers = new HashMap<>();
         studentReceivers.put(studentId, student.getPhone());
-        MessageTypeEnum messageType;
-        if (orderClient.equals(ClientEnum.STUDENT)) {
-            messageType = MessageTypeEnum.STUDENT_BUY_MUSIC_SHEET_SUCCESS;
-        } else {
-            messageType = MessageTypeEnum.TEACHER_BUY_MUSIC_SHEET_SUCCESS;
-        }
+
 
         String url = sysMessageService.selectConfigUrl(messageType.getCode());
 
         sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,
                                            messageType, studentReceivers, null,
-                0, url, orderClient.getCode(), musicSheet.getMusicSheetName());
+                0, url, orderClient.getCode(), name);
         // 推送学生
         Map<Long, String> studentSMS = new HashMap<>();
         studentSMS.put(studentId, student.getPhone());
         // 推送短信
-        url = sysMessageService.selectConfigUrl(MessageTypeEnum.SMS_STUDENT_BUY_MUSIC_SHEET_SUCCESS.getCode());
-        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_STUDENT_BUY_MUSIC_SHEET_SUCCESS,
-                studentSMS, null, 0, url, null, musicSheet.getMusicSheetName());
+        url = sysMessageService.selectConfigUrl(smsMessageType.getCode());
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, smsMessageType,
+                studentSMS, null, 0, url, null, name);
 
         return true;
     }
@@ -768,8 +925,11 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
      * @param serviceFeeAmount  服务费
      */
     private void addMusicSheetPurchaseRecord(UserOrderDetailVo userOrderDetailVo, BigDecimal actualPrice, BigDecimal serviceFeeAmount) {
-        MusicSheetPurchaseRecord musicSheetPurchaseRecord = musicSheetPurchaseRecordService
-                .checkPurchase(userOrderDetailVo.getUserId(), userOrderDetailVo.getBizId(), userOrderDetailVo.getOrderClient());
+        MusicSheetPurchaseRecord musicSheetPurchaseRecord = musicSheetPurchaseRecordService.checkPurchase(
+                userOrderDetailVo.getUserId(),
+                userOrderDetailVo.getBizId(),
+                userOrderDetailVo.getOrderClient(),
+                PurchaseRecordTypeEnum.valueOf(userOrderDetailVo.getOrderType().getCode()));
         if (musicSheetPurchaseRecord == null) {
             musicSheetPurchaseRecord = new MusicSheetPurchaseRecord();
         }
@@ -783,6 +943,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
         musicSheetPurchaseRecord.setMusicSheetServiceFee(serviceFeeAmount);
         musicSheetPurchaseRecord.setOrderStatus(OrderStatusEnum.PAID);
         musicSheetPurchaseRecord.setStudentId(userOrderDetailVo.getUserId());
+        musicSheetPurchaseRecord.setPurchaseType(PurchaseRecordTypeEnum.valueOf(userOrderDetailVo.getGoodType().getCode()));
         musicSheetPurchaseRecordService.saveOrUpdate(musicSheetPurchaseRecord);
     }
 
@@ -808,8 +969,11 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
     @Transactional(rollbackFor = Exception.class)
     public void orderAfterSheet(UserOrderDetailVo userOrderDetailVo) {
         // 保存购买记录
-        MusicSheetPurchaseRecord musicSheetPurchaseRecord = musicSheetPurchaseRecordService
-                .checkPurchase(userOrderDetailVo.getUserId(), userOrderDetailVo.getBizId(), userOrderDetailVo.getOrderClient());
+        MusicSheetPurchaseRecord musicSheetPurchaseRecord = musicSheetPurchaseRecordService.checkPurchase(
+                userOrderDetailVo.getUserId(),
+                userOrderDetailVo.getBizId(),
+                userOrderDetailVo.getOrderClient(),
+                PurchaseRecordTypeEnum.valueOf(userOrderDetailVo.getOrderType().getCode()));
         if (musicSheetPurchaseRecord == null) {
             musicSheetPurchaseRecord = new MusicSheetPurchaseRecord();
         }
@@ -820,14 +984,19 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
         musicSheetPurchaseRecord.setOriginalPrice(userOrderDetailVo.getOriginalPrice());
         musicSheetPurchaseRecord.setOrderStatus(OrderStatusEnum.WAIT_PAY);
         musicSheetPurchaseRecord.setStudentId(userOrderDetailVo.getUserId());
+        musicSheetPurchaseRecord.setPurchaseType(PurchaseRecordTypeEnum.valueOf(userOrderDetailVo.getGoodType().getCode()));
+
         musicSheetPurchaseRecordService.saveOrUpdate(musicSheetPurchaseRecord);
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void buyMusicSheetCancel(UserOrderDetailVo userOrderDetailVo) {
-        MusicSheetPurchaseRecord musicSheetPurchaseRecord = musicSheetPurchaseRecordService
-                .checkPurchase(userOrderDetailVo.getUserId(), userOrderDetailVo.getBizId(), userOrderDetailVo.getOrderClient());
+        MusicSheetPurchaseRecord musicSheetPurchaseRecord = musicSheetPurchaseRecordService.checkPurchase(
+                userOrderDetailVo.getUserId(),
+                userOrderDetailVo.getBizId(),
+                userOrderDetailVo.getOrderClient(),
+                PurchaseRecordTypeEnum.valueOf(userOrderDetailVo.getGoodType().getCode()));
 
         if (musicSheetPurchaseRecord == null) return;
         musicSheetPurchaseRecordService.removeById(musicSheetPurchaseRecord.getId());

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

@@ -1,12 +1,23 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.dto.RealnameAuthReq;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
+import com.yonge.cooleshow.biz.dal.service.SysUserContractRecordService;
 import com.yonge.cooleshow.biz.dal.service.SysUserService;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.ContractTemplateTypeEnum;
+import com.yonge.cooleshow.common.enums.SysUserType;
 import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.thirdparty.user.realname.RealnameAuthenticationPlugin;
+import com.yonge.toolset.utils.idcard.IdcardInfoExtractor;
+import com.yonge.toolset.utils.idcard.IdcardValidator;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
 import java.util.Optional;
 
 @Service
@@ -15,6 +26,13 @@ public class SysUserServiceImpl implements SysUserService {
     @Autowired
     private SysUserFeignService sysUserFeignService;
 
+    @Autowired
+    private RealnameAuthenticationPlugin realnameAuthenticationPlugin;
+    @Autowired
+    private SysUserMapper sysUserMapper;
+
+    @Resource
+    private SysUserContractRecordService sysUserContractRecordService;
     @Override
     public Long getUserId() {
         return Optional.ofNullable(sysUserFeignService.queryUserInfo()).
@@ -37,4 +55,52 @@ public class SysUserServiceImpl implements SysUserService {
                 orElseThrow(()-> new BizException("请登录"));
         return optional.get();
     }
+
+    @Override
+    public IdcardInfoExtractor updateUserCard(RealnameAuthReq realNameAuthDto, SysUser sysUser,ClientEnum client) {
+        IdcardValidator idcardValidator = new IdcardValidator();
+        //验证身份证号合法性
+        boolean validatedAllIdcard = idcardValidator.isValidatedAllIdcard(realNameAuthDto.getIdCardNo());
+        if (!validatedAllIdcard) {
+            throw new BizException("身份证号不合法");
+        }
+        //通过身份证号获取身份信息
+        IdcardInfoExtractor idcardInfoExtractor = new IdcardInfoExtractor(realNameAuthDto.getIdCardNo(), validatedAllIdcard);
+        //todo 通过环境,不做实名判断
+        try {
+            boolean verify = realnameAuthenticationPlugin.verify(realNameAuthDto.getRealName(), realNameAuthDto.getIdCardNo());
+            if (!verify) {
+                throw new BizException("未通过实名认证");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new BizException("未通过实名认证");
+        }
+
+        if (realNameAuthDto.getSave()) {
+            realNameAuthDto.setUserId(sysUser.getId());
+            realNameAuthDto.setGender(idcardInfoExtractor.getGender());
+            realNameAuthDto.setBirthday(idcardInfoExtractor.getBirthday());
+            //实名认证通过后立刻保存
+            sysUserMapper.updateUserCard(realNameAuthDto);
+        }
+        // 签订用户注册协议
+
+        // 判断是否已经签署
+        Boolean contractSign = sysUserContractRecordService.checkContractSign(sysUser.getId(),
+                                                                              SysUserType.valueOf(client.getCode()),
+                                                                              ContractTemplateTypeEnum.REGISTER);
+        if (!contractSign && realNameAuthDto.getContract()) {
+            sysUser.setRealName(realNameAuthDto.getRealName());
+            sysUser.setIdCardNo(realNameAuthDto.getIdCardNo());
+            sysUser.setGender(realNameAuthDto.getGender());
+            sysUser.setBirthdate(realNameAuthDto.getBirthday());
+            HttpResponseResult<Boolean> sign = sysUserContractRecordService.sign(ContractTemplateTypeEnum.REGISTER,
+                                                                                 SysUserType.valueOf(client.getCode()),sysUser);
+            if (!sign.getStatus() || !sign.getData()) {
+                throw new BizException(sign.getMsg());
+            }
+        }
+        return idcardInfoExtractor;
+    }
 }

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

@@ -7,11 +7,16 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 import javax.annotation.Resource;
 
+import com.google.common.collect.Lists;
+import com.yonge.cooleshow.biz.dal.queryInfo.TeacherQueryInfo;
+import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.teacher.TeacherWrapper;
 import org.redisson.api.RMap;
 import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
@@ -205,6 +210,13 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
         teacherHomeVo.setMusicAlbumNum(null == total.getMusicAlbumNum() ? 0 : total.getMusicAlbumNum());
         teacherHomeVo.setMusicSheetNum(null == total.getMusicSheetNum() ? 0 : total.getMusicSheetNum());
 
+        // 老师学生人数统计
+        List<Long> teacherIds = Lists.newArrayList(userId);
+        Map<Long, Integer> studentNumsMap = getBaseMapper().selectTeacherStudentNumberStatInfo(teacherIds).stream()
+                .collect(Collectors.toMap(StatGroupWrapper::getId, StatGroupWrapper::getTotal, (o, n) -> n));
+
+        teacherHomeVo.setStudentNums(studentNumsMap.getOrDefault(userId, 0));
+
         //取直播缓存
         RMap<Long, String> liveMap = redissonClient.getMap(TEACHER_TEMP_LIVE_ROOM);
         String roomUid = liveMap.get(userId);
@@ -602,7 +614,21 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
 
 
     public IPage<MyFens> queryMyFans(IPage<MyFens> page, Long teacherId) {
-        List<MyFens> teacherVos = baseMapper.queryMyFans(page, teacherId);
+        List<MyFens> teacherVos = baseMapper.queryMyFans(page, TeacherQueryInfo.FansQuery.builder().teacherId(teacherId).build());
+        return page.setRecords(teacherVos);
+    }
+
+    /**
+     * 老师粉丝查询
+     *
+     * @param page  IPage<MyFens>
+     * @param query TeacherQueryInfo.FansQuery
+     * @return IPage<MyFens>
+     */
+    @Override
+    public IPage<MyFens> queryMyFans(IPage<MyFens> page, TeacherQueryInfo.FansQuery query) {
+
+        List<MyFens> teacherVos = baseMapper.queryMyFans(page, query);
         return page.setRecords(teacherVos);
     }
 
@@ -651,7 +677,7 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
 		return hotTeacherList;
 	}
 
-	private void setTagTime(TeacherTagEnum teacherTagEnum, TeacherVo teacherVo) {
+    private void setTagTime(TeacherTagEnum teacherTagEnum, TeacherVo teacherVo) {
         if (teacherTagEnum.equals(TeacherTagEnum.LIVE)) {
             teacherVo.setLiveDate(new Date());
         } else if (teacherTagEnum.equals(TeacherTagEnum.MUSIC)) {
@@ -663,4 +689,94 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
         }
     }
 
+
+    /**
+     * 老师详情信息
+     *
+     * @param teacherId 用户ID
+     * @return TeacherVo
+     */
+    @Override
+    public TeacherVo findTeacherDetailInfo(Long teacherId) {
+
+        // 用户详情基本信息
+        TeacherVo teacherInfo = detail(teacherId);
+
+        if (Objects.nonNull(teacherInfo)) {
+
+            // 设置默认数据
+            teacherInfo
+                    .starGrade(0)
+                    .fansNum(0)
+                    .expTime(0)
+                    .unExpTime(0)
+                    .musicSheetNum(0)
+                    .musicAlbumNum(0)
+                    .studentNums(0);
+
+            // 老师相关统计信息
+            TeacherTotal total = totalService.getTotalById(teacherId);
+
+            if (Objects.nonNull(total)) {
+
+                teacherInfo
+                        .starGrade(total.getStarGrade().intValue())
+                        .fansNum(total.getFansNum())
+                        .expTime(total.getExpTime())
+                        .unExpTime(total.getUnExpTime())
+                        .musicAlbumNum(total.getMusicAlbumNum())
+                        .musicSheetNum(total.getMusicSheetNum());
+            }
+
+            // 老师学生人数统计
+            Map<Long, Integer> studentNumsMap = getBaseMapper().selectTeacherStudentNumberStatInfo(Lists.newArrayList(teacherId)).stream()
+                    .collect(Collectors.toMap(StatGroupWrapper::getId, StatGroupWrapper::getTotal, (o, n) -> n));
+
+            teacherInfo.setStudentNums(studentNumsMap.getOrDefault(teacherId, 0));
+        }
+
+        return teacherInfo;
+    }
+
+    /**
+     * 老师统计指标信息
+     *
+     * @param userId 用户ID
+     * @return TeacherWrapper.TeacherStatInfo
+     */
+    @Override
+    public TeacherWrapper.TeacherStatInfo findTeacherStatInfoById(Long userId) {
+
+        TeacherWrapper.TeacherStatInfo wrapper = TeacherWrapper.TeacherStatInfo.builder()
+                .fansNum(0)
+                .studentNums(0)
+                .starGrade(0)
+                .expTime(0)
+                .unExpTime(0)
+                .musicAlbumNum(0)
+                .musicSheetNum(0)
+                .build();
+
+        // 查询老师统计指标
+        TeacherTotal total = totalService.getTotalById(userId);
+        if (Objects.nonNull(total)) {
+
+            wrapper.starGrade(total.getStarGrade().intValue())
+                    .fansNum(total.getFansNum())
+                    .expTime(total.getExpTime())
+                    .unExpTime(total.getUnExpTime())
+                    .musicAlbumNum(total.getMusicAlbumNum())
+                    .musicSheetNum(total.getMusicSheetNum());
+        }
+
+        // 老师学生端人数统计
+        List<Long> teacherIds = Lists.newArrayList(userId);
+        Map<Long, Integer> studentNumsMap = getBaseMapper().selectTeacherStudentNumberStatInfo(teacherIds).stream()
+                .collect(Collectors.toMap(StatGroupWrapper::getId, StatGroupWrapper::getTotal, (o, n) -> n));
+
+        wrapper.setStudentNums(studentNumsMap.getOrDefault(userId, 0));
+
+        return wrapper;
+    }
+
 }

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

@@ -1,18 +1,41 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.biz.dal.dao.CourseScheduleDao;
+import com.yonge.cooleshow.biz.dal.dao.StudentDao;
+import com.yonge.cooleshow.biz.dal.dao.SubjectDao;
 import com.yonge.cooleshow.biz.dal.dao.UserBindingTeacherDao;
+import com.yonge.cooleshow.biz.dal.entity.Student;
+import com.yonge.cooleshow.biz.dal.entity.StudentAttendance;
+import com.yonge.cooleshow.biz.dal.entity.Subject;
 import com.yonge.cooleshow.biz.dal.entity.UserBindingTeacher;
-import com.yonge.cooleshow.biz.dal.service.SysConfigService;
-import com.yonge.cooleshow.biz.dal.service.UserBindingTeacherService;
+import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
+import com.yonge.cooleshow.biz.dal.enums.StudentCourseEnum;
+import com.yonge.cooleshow.biz.dal.mapper.CourseScheduleMapper;
+import com.yonge.cooleshow.biz.dal.mapper.StudentMapper;
+import com.yonge.cooleshow.biz.dal.mapper.SubjectMapper;
+import com.yonge.cooleshow.biz.dal.queryInfo.TeacherBindingUserQueryInfo;
+import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.vo.LiveCourseGroupStudentCourseVo;
+import com.yonge.cooleshow.biz.dal.vo.userBindingTeacher.UserBindingCourseWrapper;
+import com.yonge.cooleshow.biz.dal.vo.userBindingTeacher.UserBindingTeacherWrapper;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.base.util.StringUtil;
+import com.yonge.toolset.utils.date.DateUtil;
+import org.joda.time.DateTime;
+import org.joda.time.Period;
+import org.joda.time.PeriodType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
 
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -20,20 +43,157 @@ import java.util.stream.Collectors;
  * @Date: 2022/5/26
  */
 @Service("userBindingTeacherService")
-public class UserBindingTeacherServiceImpl extends ServiceImpl<UserBindingTeacherDao, UserBindingTeacher> implements UserBindingTeacherService {
+public class UserBindingTeacherServiceImpl extends ServiceImpl<UserBindingTeacherDao, UserBindingTeacher>
+        implements UserBindingTeacherService {
     private final static Logger log = LoggerFactory.getLogger(UserBindingTeacherServiceImpl.class);
 
     @Autowired
     private SysConfigService sysConfigService;
 
+    @Autowired
+    private StudentDao studentDao;
+
+    @Autowired
+    private SubjectDao subjectDao;
+
+    @Autowired
+    private CourseScheduleDao courseScheduleDao;
+
+    @Autowired
+    private StudentAttendanceService studentAttendanceService;
+
     @Override
     public void unbindTask() {
         String days = sysConfigService.findConfigValue(SysConfigConstant.PIANO_ROOM_UNBIND_DAYS);
         int i = Integer.parseInt(days);
         List<UserBindingTeacher> userBindingTeachers = baseMapper.queryUnbindList(i);
-        if(!CollectionUtils.isEmpty(userBindingTeachers)){
+        if (!CollectionUtils.isEmpty(userBindingTeachers)) {
             removeByIds(userBindingTeachers.stream().map(UserBindingTeacher::getId).collect(Collectors.toList()));
         }
     }
+
+    @Override
+    public IPage<UserBindingTeacherWrapper> selectBindingUserPage(IPage<UserBindingTeacherWrapper> page, TeacherBindingUserQueryInfo.BindingUserQuery query) {
+        if (query.getTeacherId() == null) {
+            throw new BizException("老师id不能为空");
+        }
+
+        IPage<UserBindingTeacherWrapper> bindingUserPage = baseMapper.selectBindingUserPage(page, query);
+
+        List<UserBindingTeacherWrapper> records = bindingUserPage.getRecords();
+        if (CollectionUtils.isEmpty(records)) {
+            return bindingUserPage;
+        }
+
+        // 学生id集合
+        List<Long> studentIdList = records.stream()
+                                          .map(UserBindingTeacherWrapper::getUserId)
+                                          .collect(Collectors.toList());
+
+
+        // 生日
+        records.forEach(userBindingTeacherWrapper -> {
+            Integer age = null;
+            if (userBindingTeacherWrapper.getBirthdate() != null) {
+                age = new Period(new DateTime(userBindingTeacherWrapper.getBirthdate()), DateTime.now(), PeriodType.years()).getYears();
+            }
+            userBindingTeacherWrapper.setAge(age);
+        });
+
+        // vip
+        List<Student> students = studentDao.selectBatchIds(studentIdList);
+
+        Map<Long, YesOrNoEnum> userIdVipMap = students.stream()
+                                                      .collect(Collectors.toMap(Student::getUserId,
+                                           student -> student.getMembershipEndTime() != null && student.getMembershipEndTime()
+                                           .compareTo(new Date()) > 0?YesOrNoEnum.YES:YesOrNoEnum.NO, (o, n) -> n));
+
+        // 声部
+        List<Long> subjectIdList = new ArrayList<>();
+        for (Student student1 : students) {
+            if (!StringUtil.isEmpty(student1.getSubjectId())) {
+                Long aLong = Long.valueOf(student1.getSubjectId());
+                subjectIdList.add(aLong);
+            }
+        }
+        List<Subject> subjectList = subjectDao.findBySubjectIds(subjectIdList);
+        Map<Long, String> userIdSubjectMap = students.stream()
+                      .collect(Collectors.toMap(Student::getUserId,student -> subjectList.stream()
+                                 .filter(subject -> student.getSubjectId().equals(subject.getId().toString())).findFirst().get().getName(), (o, n) -> n));
+
+        // 课程数
+        List<UserBindingTeacherWrapper.CourseNum> courseNumList = courseScheduleDao.selectStudentPianoCourse(query.getTeacherId(),studentIdList);
+        Map<Long, List<UserBindingTeacherWrapper.CourseNum>> userIdCourseStatusMap = courseNumList.stream()
+                                                                                    .collect(Collectors.groupingBy(
+                                                                                            UserBindingTeacherWrapper.CourseNum::getStudentId));
+
+        for (UserBindingTeacherWrapper record : records) {
+            record.setIsVip(userIdVipMap.get(record.getUserId()));
+            record.setSubjectName(userIdSubjectMap.get(record.getUserId()));
+
+            List<UserBindingTeacherWrapper.CourseNum> courseNums = userIdCourseStatusMap.get(record.getUserId());
+
+            Integer endCourseNum = 0;
+            Integer noStartCourseNum = 0;
+            record.setCourseNum(0);
+            if (!CollectionUtils.isEmpty(courseNums)) {
+                record.setCourseNum(courseNums.size());
+                for (UserBindingTeacherWrapper.CourseNum courseNum : courseNums) {
+                    if (courseNum.getStatus().equals("COMPLETE")) {
+                        endCourseNum++;
+                    } else {
+                        noStartCourseNum++;
+                    }
+                }
+            }
+            record.setEndCourseNum(endCourseNum);
+            record.setNoStartCourseNum(noStartCourseNum);
+
+        }
+        bindingUserPage.setRecords(records);
+        return bindingUserPage;
+    }
+
+    @Override
+    public IPage<UserBindingCourseWrapper> selectBindingUserCoursePage(IPage<UserBindingCourseWrapper> page, TeacherBindingUserQueryInfo.BindingStudentCourseQuery query) {
+        IPage<UserBindingCourseWrapper> userBindingCourseWrapperIPage = courseScheduleDao.selectBindingUserCoursePage(
+                page, query);
+        List<UserBindingCourseWrapper> records = userBindingCourseWrapperIPage.getRecords();
+        if (CollectionUtils.isEmpty(records)) {
+            return  userBindingCourseWrapperIPage;
+        }
+
+        // 声部
+        List<Long> subjectIdList = records.stream().map(UserBindingCourseWrapper::getSubjectId)
+                                          .collect(Collectors.toList());
+        List<Subject> subjectList = subjectDao.findBySubjectIds(subjectIdList);
+        Map<Long, String> subjectIdSubjectNameMap = subjectList.stream()
+                                                     .collect(Collectors.toMap(Subject::getId,Subject::getName, (o, n) -> n));
+
+        // 考勤
+        List<Long> courseIdList = records.stream().map(UserBindingCourseWrapper::getCourseId).collect(Collectors.toList());
+        List<StudentAttendance> studentAttendanceList = studentAttendanceService.lambdaQuery()
+                                                               .in(StudentAttendance::getCourseScheduleId, courseIdList)
+                                                               .list();
+        Set<Long> courseAttendanceList = studentAttendanceList.stream()
+                                                 .map(StudentAttendance::getCourseScheduleId)
+                                                 .collect(Collectors.toSet());
+
+        // 设置学生上课状态
+        for (UserBindingCourseWrapper record : records) {
+            record.setSubjectName(subjectIdSubjectNameMap.get(record.getSubjectId()));
+            if (CourseScheduleEnum.NOT_START.getCode().equals(record.getCourseStatus())) {
+                record.setStatus(StudentCourseEnum.NOTSTART);
+            } else {
+                if (courseAttendanceList.contains(record.getCourseId())) {
+                    record.setStatus(StudentCourseEnum.ATTENDCLASS);
+                } else {
+                    record.setStatus(StudentCourseEnum.TRUANT);
+                }
+            }
+        }
+        userBindingCourseWrapperIPage.setRecords(records);
+        return userBindingCourseWrapperIPage;
+    }
 }
 

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

@@ -160,6 +160,8 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         orderCreate.put(GoodTypeEnum.VIDEO, recordService::buyVideoCourse);
         //曲目购买
         orderCreate.put(GoodTypeEnum.MUSIC, musicSheetService::buyMusicSheetCheck);
+        // 专辑购买
+        orderCreate.put(GoodTypeEnum.ALBUM, musicSheetService::buyMusicSheetCheck);
         //琴房时长
         orderCreate.put(GoodTypeEnum.PINAO_ROOM, pianoRoomBuyRecordService::orderCreate);
         //活动报名
@@ -168,6 +170,8 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         /**********订单生成后******************/
         //曲目购买
         orderAfter.put(GoodTypeEnum.MUSIC, musicSheetService::orderAfterSheet);
+        // 专辑购买
+        orderAfter.put(GoodTypeEnum.ALBUM, musicSheetService::orderAfterSheet);
 
         /**********订单完成后******************/
         //vip开通缴费
@@ -180,6 +184,8 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         orderSuccess.put(GoodTypeEnum.VIDEO, recordService::buyVideoCourseSuccess);
         //曲目购买
         orderSuccess.put(GoodTypeEnum.MUSIC, musicSheetService::buyMusicSheetSuccess);
+        // 专辑购买
+        orderSuccess.put(GoodTypeEnum.ALBUM, musicSheetService::buyMusicSheetSuccess);
         //琴房时长
         orderSuccess.put(GoodTypeEnum.PINAO_ROOM, pianoRoomBuyRecordService::orderSuccess);
         //活动报名
@@ -194,6 +200,8 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         orderCancel.put(GoodTypeEnum.LIVE, courseGroupService::buyLiveCourseCancel);
         // 曲目购买
         orderCancel.put(GoodTypeEnum.MUSIC, musicSheetService::buyMusicSheetCancel);
+        // 专辑购买
+        orderCancel.put(GoodTypeEnum.ALBUM, musicSheetService::buyMusicSheetCancel);
     }
 
     @Override
@@ -349,6 +357,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
                 return HttpResponseResult.failed("订单商品信息获取失败");
             }
             info.setOrderNo(orderReq.getOrderNo());
+            info.setOrderType(orderReq.getOrderType());
             Long subOrderNo = idGeneratorService.generatorId("subOrderNo");
             info.setSubOrderNo(Long.toString(subOrderNo));
             info.setUserId(orderReq.getUserId());
@@ -663,6 +672,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
 
             UserOrderDetailVo orderDetail = new UserOrderDetailVo();
             orderDetail.setOrderNo(data.getOrderNo());
+            orderDetail.setOrderType(orderReq.getOrderType());
             orderDetail.setSubOrderNo(data.getSubOrderNo());
             orderDetail.setMerchId(res.getMerchId());
             orderDetail.setGoodType(res.getGoodType());
@@ -804,6 +814,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         for (UserOrderDetailVo orderDetailVo : orderDetailList) {
             orderDetailVo.setUserId(userOrder.getUserId());
             orderDetailVo.setOrderId(userOrder.getId());
+
             //调用业务
             Consumer<UserOrderDetailVo> userOrderVoConsumer = orderCancel.get(orderDetailVo.getGoodType());
             if (!Objects.isNull(userOrderVoConsumer)) {
@@ -841,6 +852,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
                 && !OrderStatusEnum.PAYING.equals(detail.getStatus())) {
             return;
         }
+
         //修改订单状态
         Date now = new Date();
         detail.setStatus(OrderStatusEnum.PAID);
@@ -882,6 +894,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             orderDetailVo.setRecomUserId(detail.getRecomUserId());
             orderDetailVo.setActivityId(detail.getActivityId());
             orderDetailVo.setRewardId(detail.getRewardId());
+            orderDetailVo.setOrderType(detail.getOrderType());
             //调用业务
             Consumer<UserOrderDetailVo> userOrderVoConsumer = orderSuccess.get(orderDetailVo.getGoodType());
             if (!Objects.isNull(userOrderVoConsumer)) {

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

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.vo;
 
+import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.page.PageInfo;
 import io.swagger.annotations.ApiModelProperty;
@@ -56,6 +57,37 @@ public class AlbumDetailVo {
     @ApiModelProperty("相关专辑")
     private List<MusicAlbumVo> relatedMusicAlbum;
 
+    @ApiModelProperty("专辑价格 ")
+    private Double albumPrice;
+
+    @ApiModelProperty("专辑价格 ")
+    private String paymentType;
+
+    @ApiModelProperty("专辑曲目付费方式")
+    private List<String> musicPaymentTypes;
+
+
+    @ApiModelProperty("订单状态(WAIT_PAY:待支付;PAYING:支付中,PAID:已付款)")
+    private OrderStatusEnum orderStatus;
+
+    @ApiModelProperty("支付订单号")
+    private String orderNo;
+
+    public OrderStatusEnum getOrderStatus() {
+        return orderStatus;
+    }
+
+    public void setOrderStatus(OrderStatusEnum orderStatus) {
+        this.orderStatus = orderStatus;
+    }
+
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
 
     public String getSubjectId() {
         return subjectId;
@@ -179,4 +211,28 @@ public class AlbumDetailVo {
     public void setFavorite(YesOrNoEnum favorite) {
         this.favorite = favorite;
     }
+
+    public Double getAlbumPrice() {
+        return albumPrice;
+    }
+
+    public void setAlbumPrice(Double albumPrice) {
+        this.albumPrice = albumPrice;
+    }
+
+    public String getPaymentType() {
+        return paymentType;
+    }
+
+    public void setPaymentType(String paymentType) {
+        this.paymentType = paymentType;
+    }
+
+    public List<String> getMusicPaymentTypes() {
+        return musicPaymentTypes;
+    }
+
+    public void setMusicPaymentTypes(List<String> musicPaymentTypes) {
+        this.musicPaymentTypes = musicPaymentTypes;
+    }
 }

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

@@ -38,6 +38,8 @@ public class MusicSheetVo extends MusicSheet {
     @ApiModelProperty("专辑中曲目的排序号")
     private Integer albumSortNumber;  //排序号
 
+    @ApiModelProperty("单曲专辑数")
+    private Integer albumNums;
 
     public Integer getAlbumSortNumber() {
         return albumSortNumber;
@@ -102,4 +104,12 @@ public class MusicSheetVo extends MusicSheet {
     public void setPlay(YesOrNoEnum play) {
         this.play = play;
     }
+
+    public Integer getAlbumNums() {
+        return albumNums;
+    }
+
+    public void setAlbumNums(Integer albumNums) {
+        this.albumNums = albumNums;
+    }
 }

+ 67 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MyFens.java

@@ -1,16 +1,27 @@
 package com.yonge.cooleshow.biz.dal.vo;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.yonge.cooleshow.biz.dal.enums.GenderEnum;
-import com.yonge.cooleshow.common.entity.BaseEntity;
+import com.yonge.cooleshow.biz.dal.enums.MK;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import org.joda.time.DateTime;
+import org.joda.time.Period;
+import org.joda.time.PeriodType;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.Objects;
 
 /**
  * @Author: cy
  * @Date: 2022/5/12
  */
-public class MyFens extends BaseEntity {
-    @ApiModelProperty("昵称")
+@ApiModel("老师粉丝响应信息")
+public class MyFens implements Serializable {
+
+    @ApiModelProperty("用户编号")
     private String userId;
     @ApiModelProperty("昵称")
     private String userName;
@@ -25,6 +36,19 @@ public class MyFens extends BaseEntity {
     @ApiModelProperty(value = "是否会员 0否 1是")
     private YesOrNoEnum isVip;
 
+    @ApiModelProperty("手机号")
+    private String phone;
+
+    @ApiModelProperty("关注时间")
+    @JsonFormat(pattern = MK.TIME_PATTERN, timezone = MK.TIME_ZONE)
+    private Date starTime;
+
+    @ApiModelProperty("出生日期")
+    private Date birthdate;
+
+    @ApiModelProperty("出生日期")
+    private Integer age;
+
     public String getSubjectName() {
         return subjectName;
     }
@@ -84,4 +108,44 @@ public class MyFens extends BaseEntity {
     public void setIsVip(YesOrNoEnum isVip) {
         this.isVip = isVip;
     }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public Date getStarTime() {
+        return starTime;
+    }
+
+    public void setStarTime(Date starTime) {
+        this.starTime = starTime;
+    }
+
+    public void setGender(GenderEnum gender) {
+        this.gender = gender;
+    }
+
+    public Date getBirthdate() {
+        return birthdate;
+    }
+
+    public void setBirthdate(Date birthdate) {
+        this.birthdate = birthdate;
+    }
+
+    public Integer getAge() {
+        if (Objects.nonNull(getBirthdate())) {
+
+            return new Period(new DateTime(getBirthdate()), DateTime.now(), PeriodType.years()).getYears();
+        }
+        return age;
+    }
+
+    public void setAge(Integer age) {
+        this.age = age;
+    }
 }

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

@@ -40,6 +40,9 @@ public class TeacherHomeVo extends Teacher implements Serializable {
     @ApiModelProperty("曲谱数 ")
     private Integer musicSheetNum;
 
+    @ApiModelProperty("学生数")
+    private Integer studentNums;
+
     @ApiModelProperty(value = "声部名称(支持多个,用逗号分隔) ")
     private String subjectName;
     @ApiModelProperty(value = "性别 0女 1男")
@@ -291,4 +294,12 @@ public class TeacherHomeVo extends Teacher implements Serializable {
     public void setMusicSheetNum(Integer musicSheetNum) {
         this.musicSheetNum = musicSheetNum;
     }
+
+    public Integer getStudentNums() {
+        return studentNums;
+    }
+
+    public void setStudentNums(Integer studentNums) {
+        this.studentNums = studentNums;
+    }
 }

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

@@ -68,6 +68,21 @@ public class TeacherVo extends Teacher {
     @ApiModelProperty(value = "用户状态 NORMAL-正常   LOCKED-冻结  CLOSED-关闭")
     private UserStatusEnum userStatus;
 
+    @ApiModelProperty("星级")
+    private Integer starGrade;
+    @ApiModelProperty("粉丝数")
+    private Integer fansNum;
+    @ApiModelProperty("已上课时")
+    private Integer expTime;
+    @ApiModelProperty("未上课时")
+    private Integer unExpTime;
+    @ApiModelProperty("专辑数 ")
+    private Integer musicAlbumNum;
+    @ApiModelProperty("曲谱数 ")
+    private Integer musicSheetNum;
+    @ApiModelProperty("学生数")
+    private Integer studentNums;
+
     public YesOrNoEnum getDelFlag() {
         return delFlag;
     }
@@ -237,4 +252,96 @@ public class TeacherVo extends Teacher {
 	public void setUserStatus(UserStatusEnum userStatus) {
 		this.userStatus = userStatus;
 	}
+
+    public Integer getStarGrade() {
+        return starGrade;
+    }
+
+    public void setStarGrade(Integer starGrade) {
+        this.starGrade = starGrade;
+    }
+
+    public Integer getFansNum() {
+        return fansNum;
+    }
+
+    public void setFansNum(Integer fansNum) {
+        this.fansNum = fansNum;
+    }
+
+    public Integer getExpTime() {
+        return expTime;
+    }
+
+    public void setExpTime(Integer expTime) {
+        this.expTime = expTime;
+    }
+
+    public Integer getUnExpTime() {
+        return unExpTime;
+    }
+
+    public void setUnExpTime(Integer unExpTime) {
+        this.unExpTime = unExpTime;
+    }
+
+    public Integer getMusicAlbumNum() {
+        return musicAlbumNum;
+    }
+
+    public void setMusicAlbumNum(Integer musicAlbumNum) {
+        this.musicAlbumNum = musicAlbumNum;
+    }
+
+    public Integer getMusicSheetNum() {
+        return musicSheetNum;
+    }
+
+    public void setMusicSheetNum(Integer musicSheetNum) {
+        this.musicSheetNum = musicSheetNum;
+    }
+
+    public Integer getStudentNums() {
+        return studentNums;
+    }
+
+    public void setStudentNums(Integer studentNums) {
+        this.studentNums = studentNums;
+    }
+
+
+    public TeacherVo starGrade(Integer starGrade) {
+        this.starGrade = starGrade;
+        return this;
+    }
+
+    public TeacherVo fansNum(Integer fansNum) {
+        this.fansNum = fansNum;
+        return this;
+    }
+
+    public TeacherVo expTime(Integer expTime) {
+        this.expTime = expTime;
+        return this;
+    }
+
+    public TeacherVo unExpTime(Integer unExpTime) {
+        this.unExpTime = unExpTime;
+        return this;
+    }
+
+    public TeacherVo musicAlbumNum(Integer musicAlbumNum) {
+        this.musicAlbumNum = musicAlbumNum;
+        return this;
+    }
+
+    public TeacherVo musicSheetNum(Integer musicSheetNum) {
+        this.musicSheetNum = musicSheetNum;
+        return this;
+    }
+
+    public TeacherVo studentNums(Integer studentNums) {
+        this.studentNums = studentNums;
+        return this;
+    }
 }

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserOrderDetailVo.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.vo;
 
 import com.yonge.cooleshow.biz.dal.entity.UserOrderDetail;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -42,6 +43,9 @@ public class UserOrderDetailVo extends UserOrderDetail {
     @ApiModelProperty("活动奖品id")
     private Long rewardId;
 
+    // 透传订单类型
+    private OrderTypeEnum orderType;
+
     public Long getRewardId() {
         return rewardId;
     }
@@ -121,4 +125,12 @@ public class UserOrderDetailVo extends UserOrderDetail {
     public void setRecomUserId(Long recomUserId) {
         this.recomUserId = recomUserId;
     }
+
+    public OrderTypeEnum getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(OrderTypeEnum orderType) {
+        this.orderType = orderType;
+    }
 }

+ 87 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/activity/UserRewardWrapper.java

@@ -0,0 +1,87 @@
+package com.yonge.cooleshow.biz.dal.vo.activity;
+
+import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.common.enums.RewardTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-10-09
+ */
+public class UserRewardWrapper {
+
+
+    // ("领奖id")
+    private Long receiveRewardId;
+
+    // ("奖品名称 ")
+    private String rewardName;
+
+     // ("奖品类型:  ACTUAL 实物 VIP 小酷AI会员 PIAMO_ROOM 琴房时长 COUPON(优惠券)")
+    private RewardTypeEnum rewardType;
+
+    // ("奖品描述 ")
+    private String rewardDescribe;
+
+    // ("奖品图片 ")
+    private String imgUrl;
+
+    // ("获奖时间")
+    private Date winningTime;
+
+    public Long getReceiveRewardId() {
+        return receiveRewardId;
+    }
+
+    public void setReceiveRewardId(Long receiveRewardId) {
+        this.receiveRewardId = receiveRewardId;
+    }
+
+    public String getRewardName() {
+        return rewardName;
+    }
+
+    public void setRewardName(String rewardName) {
+        this.rewardName = rewardName;
+    }
+
+    public RewardTypeEnum getRewardType() {
+        return rewardType;
+    }
+
+    public void setRewardType(RewardTypeEnum rewardType) {
+        this.rewardType = rewardType;
+    }
+
+    public String getRewardDescribe() {
+        return rewardDescribe;
+    }
+
+    public void setRewardDescribe(String rewardDescribe) {
+        this.rewardDescribe = rewardDescribe;
+    }
+
+    public String getImgUrl() {
+        return imgUrl;
+    }
+
+    public void setImgUrl(String imgUrl) {
+        this.imgUrl = imgUrl;
+    }
+
+    public Date getWinningTime() {
+        return winningTime;
+    }
+
+    public void setWinningTime(Date winningTime) {
+        this.winningTime = winningTime;
+    }
+
+    public String jsonString() {
+        return JSON.toJSONString(this);
+    }
+}

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/res/OrderCreateRes.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.vo.res;
 
 import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -42,6 +43,9 @@ public class OrderCreateRes {
     @ApiModelProperty(value = "冗余字段,用于传递参数用")
     private Object bizParam;
 
+    // 透传订单类型
+    private OrderTypeEnum orderType;
+
     public Long getRewardId() {
         return rewardId;
     }
@@ -145,4 +149,12 @@ public class OrderCreateRes {
     public void setCouponAmount(BigDecimal couponAmount) {
         this.couponAmount = couponAmount;
     }
+
+    public OrderTypeEnum getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(OrderTypeEnum orderType) {
+        this.orderType = orderType;
+    }
 }

+ 125 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/userBindingTeacher/UserBindingCourseWrapper.java

@@ -0,0 +1,125 @@
+package com.yonge.cooleshow.biz.dal.vo.userBindingTeacher;
+
+import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.biz.dal.enums.StudentCourseEnum;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-10-08
+ */
+public class UserBindingCourseWrapper {
+
+    //("课程编号")
+    private Long courseId;
+
+    // 声部id
+    private Long subjectId;
+
+    //("课程声部")
+    private String subjectName;
+
+    //("学员考勤")
+    private StudentCourseEnum status;
+    //(value = "课程状态 NOT_START未开始 ING进行中 COMPLETE已完成 CANCEL已取消  CourseScheduleEnum")
+    private String courseStatus;
+
+    // ("上课时间")
+    private Date classDate;
+    // 课程开始时间
+    private Date startTime;
+
+    //课程结束时间
+    private Date endTime;
+
+    // 学生id
+    private Long studentId;
+
+    // 考勤id
+    private Long studentAttendanceId;
+
+    public Long getStudentAttendanceId() {
+        return studentAttendanceId;
+    }
+
+    public void setStudentAttendanceId(Long studentAttendanceId) {
+        this.studentAttendanceId = studentAttendanceId;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Long getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Long subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public Long getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Long studentId) {
+        this.studentId = studentId;
+    }
+
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public StudentCourseEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(StudentCourseEnum status) {
+        this.status = status;
+    }
+
+    public String getCourseStatus() {
+        return courseStatus;
+    }
+
+    public void setCourseStatus(String courseStatus) {
+        this.courseStatus = courseStatus;
+    }
+
+    public Date getClassDate() {
+        return classDate;
+    }
+
+    public void setClassDate(Date classDate) {
+        this.classDate = classDate;
+    }
+}

+ 179 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/userBindingTeacher/UserBindingTeacherWrapper.java

@@ -0,0 +1,179 @@
+package com.yonge.cooleshow.biz.dal.vo.userBindingTeacher;
+
+import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-10-08
+ */
+public class UserBindingTeacherWrapper {
+
+    // 学生编号
+    private Long userId;
+
+    // 昵称
+    private String username;
+
+
+    // 性别0女1男
+    private Integer gender;
+
+    // 年龄
+    private Integer age;
+
+    // 生日
+    private Date birthdate;
+
+    // 声部
+    private String subjectName;
+
+    // 手机号
+    private String phone;
+
+    // 是否会员 0否 1是
+    private YesOrNoEnum isVip;
+
+
+    // 课程数
+    private Integer courseNum;
+
+    // 已结束课时数
+    private Integer endCourseNum;
+
+    // 未开始课程数
+    private Integer noStartCourseNum;
+
+    // 绑定时间
+    private Date bindingTime;
+
+    public String jsonString() {
+        return JSON.toJSONString(this);
+    }
+    public Long getUserId() {
+        return userId;
+    }
+
+    public Date getBirthdate() {
+        return birthdate;
+    }
+
+    public void setBirthdate(Date birthdate) {
+        this.birthdate = birthdate;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public Integer getGender() {
+        return gender;
+    }
+
+    public void setGender(Integer gender) {
+        this.gender = gender;
+    }
+
+    public Integer getAge() {
+        return age;
+    }
+
+    public void setAge(Integer age) {
+        this.age = age;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public YesOrNoEnum getIsVip() {
+        return isVip;
+    }
+
+    public void setIsVip(YesOrNoEnum isVip) {
+        this.isVip = isVip;
+    }
+
+    public Integer getCourseNum() {
+        return courseNum;
+    }
+
+    public void setCourseNum(Integer courseNum) {
+        this.courseNum = courseNum;
+    }
+
+    public Integer getEndCourseNum() {
+        return endCourseNum;
+    }
+
+    public void setEndCourseNum(Integer endCourseNum) {
+        this.endCourseNum = endCourseNum;
+    }
+
+    public Integer getNoStartCourseNum() {
+        return noStartCourseNum;
+    }
+
+    public void setNoStartCourseNum(Integer noStartCourseNum) {
+        this.noStartCourseNum = noStartCourseNum;
+    }
+
+    public Date getBindingTime() {
+        return bindingTime;
+    }
+
+    public void setBindingTime(Date bindingTime) {
+        this.bindingTime = bindingTime;
+    }
+
+    public static class CourseNum {
+
+        // 学生id
+        private Long studentId;
+
+        // 课程数
+        private String status;
+
+
+        public Long getStudentId() {
+            return studentId;
+        }
+
+        public void setStudentId(Long studentId) {
+            this.studentId = studentId;
+        }
+
+        public String getStatus() {
+            return status;
+        }
+
+        public void setStatus(String status) {
+            this.status = status;
+        }
+    }
+}

+ 77 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/teacher/TeacherWrapper.java

@@ -0,0 +1,77 @@
+package com.yonge.cooleshow.biz.dal.wrapper.teacher;
+
+import com.alibaba.fastjson.JSON;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * Created by Eric.Shang on 2022/10/8.
+ */
+public class TeacherWrapper {
+
+    /**
+     * 老师统计指标信息
+     */
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class TeacherStatInfo implements Serializable {
+
+        // 星级
+        private Integer starGrade;
+        // 粉丝数
+        private Integer fansNum;
+        // 已上课时
+        private Integer expTime;
+        // 未上课时
+        private Integer unExpTime;
+        // 专辑数
+        private Integer musicAlbumNum;
+        // 曲谱数
+        private Integer musicSheetNum;
+        // 学生数
+        private Integer studentNums;
+
+        public String jsonString() {
+
+            return JSON.toJSONString(this);
+        }
+
+
+        public TeacherStatInfo starGrade(Integer starGrade) {
+            this.starGrade = starGrade;
+            return this;
+        }
+
+        public TeacherStatInfo fansNum(Integer fansNum) {
+            this.fansNum = fansNum;
+            return this;
+        }
+
+        public TeacherStatInfo expTime(Integer expTime) {
+            this.expTime = expTime;
+            return this;
+        }
+
+        public TeacherStatInfo unExpTime(Integer unExpTime) {
+            this.unExpTime = unExpTime;
+            return this;
+        }
+
+        public TeacherStatInfo musicAlbumNum(Integer musicAlbumNum) {
+            this.musicAlbumNum = musicAlbumNum;
+            return this;
+        }
+
+        public TeacherStatInfo musicSheetNum(Integer musicSheetNum) {
+            this.musicSheetNum = musicSheetNum;
+            return this;
+        }
+
+    }
+}

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

@@ -82,7 +82,7 @@
 </head>
 <body style="font-family:'SimSun'">
     <div class="container">
-        <h1>《产品与服务协议》</h1>
+        <h1>《${contractName}》</h1>
                             甲方:${companyName} <br/>
 
         <div style="display: flex;">

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

@@ -16,6 +16,7 @@
         , t.activity_id_ as activityId
         , t.music_sheet_id_ as musicSheetId
         , t.resource_type_ as resourceType
+        , t.evaluation_difficulty_ as evaluationDifficulty
         , t.create_time_ as createTime
         , t.create_by_ as createBy
     </sql>

+ 45 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityUserRewardMapper.xml

@@ -10,6 +10,7 @@
         <result column="unit_" property="unit" />
         <result column="grant_flag_" property="grantFlag" />
         <result column="receive_flag_" property="receiveFlag" />
+        <result column="receive_time_" property="receiveTime" />
         <result column="create_time_" property="createTime" />
         <result column="update_time_" property="updateTime" />
     </resultMap>
@@ -26,6 +27,7 @@
         , t.receive_flag_ as receiveFlag
         , t.create_time_ as createTime
         , t.update_time_ as updateTime
+        , t.receive_time_ as receiveTime
     </sql>
 
     <select id="detail" resultType="com.yonge.cooleshow.biz.dal.vo.ActivityUserRewardVo">
@@ -88,6 +90,49 @@
         FROM sys_user t1 JOIN activity_evaluation t2 ON t1.id_ = t2.music_sheet_id_ JOIN activity_evaluation_record t3 ON t2.id_ = t3.evaluation_id_
         WHERE t3.activity_id_ = #{activityId} AND t3.user_id_ IN (<foreach collection="userIds" separator="," item="item">#{item}</foreach>)
     </select>
+
+    <select id="selectReceiveRewardCount" resultType="int">
+
+        select count(1) from
+        activity_user_reward aur
+        left join activity_plan ap on ap.id_ = aur.activity_id_
+        left join activity_reward ar on ar.id_ = aur.reward_id_
+        <include refid="selectReceiveRewardSql"/>
+    </select>
+
+    <update id="receiveReward">
+        update  activity_user_reward set receive_flag_ = 1 ,receive_time_ = #{receiveTime} where grant_flag_=1 and receive_flag_ = 0 and id_ = #{receiveRewardId} and user_id_ = #{userId}
+
+    </update>
+    <sql id="selectReceiveRewardSql">
+        <where>
+            ar.reward_type_ != 'ACTUAL'
+            <if test="query.userId != null">
+                and aur.user_id_ = #{query.userId}
+            </if>
+            <if test="query.client != null">
+                and ap.activity_client_ = #{query.client}
+            </if>
+            <if test="query.receive != null">
+                and aur.receive_flag_ = #{query.receive}
+            </if>
+        </where>
+    </sql>
+
+    <select id="selectReceiveRewardList" resultType="com.yonge.cooleshow.biz.dal.vo.activity.UserRewardWrapper">
+        select
+            aur.id_ as receiveRewardId,
+            ar.reward_name_ as rewardName,
+            ar.reward_type_ as rewardType,
+            ar.reward_describe_ as rewardDescribe,
+            ar.img_url_ as imgUrl,
+            aur.create_time_ as winningTime
+        from
+        activity_user_reward aur
+        left join activity_plan ap on ap.id_ = aur.activity_id_
+        left join activity_reward ar on ar.id_ = aur.reward_id_
+        <include refid="selectReceiveRewardSql"/>
+    </select>
     <!--分享活动关联老师-->
 
 </mapper>

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

@@ -946,4 +946,43 @@
         AND ts.status_ = 'WAIT'
         <![CDATA[ AND DATE_FORMAT(ts.update_time_,'%Y-%m-%d') <= #{day}]]>
     </select>
+
+    <select id="selectStudentPianoCourse"
+            resultType="com.yonge.cooleshow.biz.dal.vo.userBindingTeacher.UserBindingTeacherWrapper$CourseNum">
+        select cssp.user_id_ as studentId
+            ,cs.status_ as status
+        from course_schedule_student_payment cssp
+        left join course_group cg on cg.id_ = cssp.course_group_id_
+        left join course_schedule cs on cs.id_ = cssp.course_id_
+        <where>
+            cssp.course_type_ = 'PIANO_ROOM_CLASS'
+            and #{teacherId} = cg.teacher_id_
+            and cs.status_ in ('NOT_START','ING','COMPLETE')
+            and cssp.user_id_ in
+            <foreach collection="studentIdList" close=")" open="(" item="item" separator=",">
+                #{item}
+            </foreach>
+        </where>
+    </select>
+
+    <select id="selectBindingUserCoursePage"
+            resultType="com.yonge.cooleshow.biz.dal.vo.userBindingTeacher.UserBindingCourseWrapper">
+        select cssp.user_id_ as studentId
+        ,cs.status_ as courseStatus
+        ,cs.id_ as courseId
+        ,cg.subject_id_ as subjectId
+        ,cs.class_date_ as classDate
+        ,cs.start_time_ as startTime
+        ,cs.end_time_ as endTime
+        ,cg.subject_id_ as subjectId
+        from course_schedule_student_payment cssp
+        left join course_group cg on cg.id_ = cssp.course_group_id_
+        left join course_schedule cs on cs.id_ = cssp.course_id_
+        <where>
+            cssp.course_type_ = 'PIANO_ROOM_CLASS'
+            and #{query.teacherId} = cg.teacher_id_
+            and cs.status_ in ('NOT_START','ING','COMPLETE')
+            and cssp.user_id_ =#{query.studentId}
+        </where>
+    </select>
 </mapper>

+ 67 - 26
cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicAlbumMapper.xml

@@ -34,6 +34,8 @@
         t.create_time_,
         t.audit_version_,
         t.create_by_,
+        t.album_price_,
+        t.payment_type_,
         t.update_time_,
         t.update_by_
     </sql>
@@ -47,8 +49,7 @@
         ,(select count(1) as num
             from album_music_relate amr
             join music_sheet ms on amr.music_sheet_id_ = ms.id_
-            left join sys_user su on su.id_ = ms.user_id_
-            where ms.del_flag_ = 0 and ms.state_ = 1 and ms.audit_status_ = 'PASS' and su.del_flag_ = 0
+            where ms.del_flag_ = 0 and ms.state_ = 1 and ms.audit_status_ = 'PASS'
             and amr.album_id_ = t.id_) as musicSheetCount
         ,t2.num as albumFavoriteCount
         <if test="query.userId != null">
@@ -56,8 +57,7 @@
         </if>
         from music_album t
         left join (select count(1) as num,af.album_id_ from album_favorite af
-            left join sys_user su on af.user_id_ = su.id_
-            where su.del_flag_ = 0 group by af.album_id_
+            group by af.album_id_
         ) t2 on t2.album_id_ = t.id_
         <where>
             t.del_flag_ = 0
@@ -83,6 +83,9 @@
             <if test="query.auditVersion != null">
                 and t.audit_version_ = #{query.auditVersion}
             </if>
+            <if test="query.paymentType != null">
+                and t.payment_type_ = #{query.paymentType}
+            </if>
         </where>
         order by t.sort_number_ desc
         <if test="query.sortBy != null">
@@ -102,14 +105,35 @@
         ,(select group_concat(s.name_) from subject s
         where find_in_set(s.id_,t.subject_id_) and s.del_flag_ = 0 ) as subjectNames
         from music_album t
-        left join album_favorite af2 on af2.album_id_ = t.id_
+        <if test="query.albumFavorite != null">
+            left join album_favorite af2 on af2.album_id_ = t.id_
+        </if>
+        <if test="query.albumPurchased != null">
+            JOIN music_sheet_purchase_record t2 ON (t.id_ = t2.music_sheet_id_)
+        </if>
         <where>
-            t.del_flag_ = 0
-            <if test="query.studentId != null">
-                and af2.user_id_ = #{query.studentId}
+            <if test="query.albumFavorite != null">
+                t.del_flag_ = 0
+                <if test="query.studentId != null">
+                    and af2.user_id_ = #{query.studentId}
+                </if>
+                <if test="clientType != null">
+                    AND af2.client_type_ = #{clientType}
+                </if>
             </if>
-            <if test="clientType != null">
-                AND af2.client_type_ = #{clientType}
+            <if test="query.albumPurchased != null">
+                <if test="query.clientType != null">
+                    AND t2.client_type_ = #{query.clientType}
+                </if>
+                <if test="query.orderStatus != null">
+                    AND t2.order_status_ = #{query.orderStatus}
+                </if>
+                <if test="query.purchaseType != null">
+                    AND t2.purchase_type_ = #{query.purchaseType}
+                </if>
+                <if test="query.studentId != null">
+                    AND t2.student_id_ = #{query.studentId}
+                </if>
             </if>
             <if test="query.idAndName != null and query.idAndName != ''">
                 and (t.id_ like concat('%',#{query.idAndName},'%') or
@@ -134,7 +158,9 @@
                 and t.album_status_ = #{query.albumStatus}
             </if>
         </where>
-        order by  af2.favorite_time_ desc
+        <if test="query.albumFavorite != null">
+            order by  af2.favorite_time_ desc
+        </if>
     </select>
 
     <select id="selectFavoriteNumAndMusicNum" resultType="com.yonge.cooleshow.biz.dal.vo.MusicAlbumVo">
@@ -145,12 +171,10 @@
         left join (select count(1) as num,amr.album_id_
             from album_music_relate amr
             join music_sheet ms on amr.music_sheet_id_ = ms.id_
-            left join sys_user su on su.id_ = ms.user_id_
-            where ms.del_flag_ = 0 and ms.state_ = 1 and ms.audit_status_ = 'PASS' and su.del_flag_ = 0
+            where ms.del_flag_ = 0 and ms.state_ = 1 and ms.audit_status_ = 'PASS'
             group by amr.album_id_) t1 on t1.album_id_ = t.id_
         left join (select count(1) as num,af.album_id_ from album_favorite af
-                left join sys_user su on af.user_id_ = su.id_
-                where su.del_flag_ = 0 group by af.album_id_
+              group by af.album_id_
         ) t2 on t2.album_id_ = t.id_
         <where>
             t.del_flag_ = 0
@@ -179,14 +203,12 @@
             , (
                 select count(1) as num from album_music_relate amr
                 join music_sheet ms on amr.music_sheet_id_ = ms.id_
-                left join sys_user su on su.id_ = ms.user_id_
-                where ms.del_flag_ = 0 and ms.state_ = 1 and ms.audit_status_ = 'PASS' and su.del_flag_ = 0
+                where ms.del_flag_ = 0 and ms.state_ = 1 and ms.audit_status_ = 'PASS'
                 and amr.album_id_ = t.id_
             ) as musicSheetCount
             ,(
                 select count(1) as num from album_favorite af
-                left join sys_user su on af.user_id_ = su.id_
-                where su.del_flag_ = 0 and af.album_id_ = t.id_
+                where af.album_id_ = t.id_
             ) as albumFavoriteCount
         from music_album t
         where t.id_ = #{musicAlbumId}
@@ -199,16 +221,17 @@
         ,(select group_concat(s.name_) from subject s
         where find_in_set(s.id_,t.subject_id_) and s.del_flag_ = 0 ) as subjectNames
         ,(select count(1) as num
-        from album_music_relate amr
-        join music_sheet ms on amr.music_sheet_id_ = ms.id_
-        left join sys_user su on su.id_ = ms.user_id_
-        where ms.del_flag_ = 0 and ms.state_ = 1 and ms.audit_status_ = 'PASS' and su.del_flag_ = 0
-       and amr.album_id_ = t.id_) as musicSheetCount
+            from album_music_relate amr
+            join music_sheet ms on amr.music_sheet_id_ = ms.id_
+            where ms.del_flag_ = 0 and ms.state_ = 1 and ms.audit_status_ = 'PASS'
+           and amr.album_id_ = t.id_) as musicSheetCount
         ,if(t2.num >0,t2.num,0) as albumFavoriteCount
         from music_album t
+        <if test="query.musicId != null">
+            JOIN album_music_relate t1 ON (t.id_ = t1.album_id_ AND t1.music_sheet_id_ = #{query.musicId})
+        </if>
         left join (select count(1) as num,af.album_id_ from album_favorite af
-            left join sys_user su on (af.user_id_ = su.id_ <if test="clientType != null"> AND af.client_type_ = #{clientType} </if>)
-            where su.del_flag_ = 0 group by af.album_id_
+            group by af.album_id_
         ) t2 on t2.album_id_ = t.id_
         <where>
             t.del_flag_ = 0
@@ -245,4 +268,22 @@
         </if>
         ,t.id_ desc
     </select>
+
+    <!--专辑曲目付费方式统计-->
+    <select id="selectAlbumMusicSheetStatInfo"
+            resultType="com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper">
+        SELECT t1.album_id_ AS id, COUNT(t1.id_) AS total
+        FROM album_music_relate t1 JOIN music_sheet t2 ON (t1.music_sheet_id_ = t2.id_)
+        <where>
+            <if test="albumId != null">
+                AND t1.album_id_ = #{albumId}
+            </if>
+            <if test="paymentType != null">
+                AND t2.payment_type_ = #{paymentType}
+            </if>
+        </where>
+        GROUP BY t1.album_id_
+    </select>
+    <!--专辑曲目付费方式统计-->
+
 </mapper>

+ 22 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml

@@ -191,6 +191,15 @@
             <if test="param.delFlag != null">
                 and t.del_flag_ = #{param.delFlag}
             </if>
+            <if test="param.sourceType != null">
+                AND t.source_type_ = #{param.sourceType}
+            </if>
+            <if test="param.chargeType != null">
+                AND (t.payment_type_ = 'FREE' OR FIND_IN_SET(#{param.chargeType}, t.payment_type_))
+            </if>
+            <if test="param.paymentTypes != null">
+                AND t.payment_type_ IN (<foreach collection="param.paymentTypes" separator="," item="item">#{item}</foreach>)
+            </if>
             <if test="param.id != null">
                 <if test="param.type == 2">
                     and amr.album_id_ = #{param.id}
@@ -713,4 +722,17 @@
 
         order by msar.id_ desc
     </select>
+
+    <!--单曲专辑数量统计-->
+    <select id="selectMusicAlbumStatInfo" resultType="com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper">
+        SELECT t1.music_sheet_id_ AS id, COUNT(DISTINCT t1.id_) AS total
+        FROM album_music_relate t1 JOIN music_sheet t2 ON (t1.music_sheet_id_ = t2.id_)
+        <where>
+            <if test="musicIds != null">
+                AND t1.music_sheet_id_ IN (<foreach collection="musicIds" separator="," item="item">#{item}</foreach>)
+            </if>
+        </where>
+        GROUP BY t1.music_sheet_id_
+    </select>
+    <!--单曲专辑数量统计-->
 </mapper>

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

@@ -66,4 +66,23 @@
         </where>
 
     </select>
+
+    <update id="updateUserCard">
+        UPDATE sys_user
+        set
+        <if test="param.realName != null and param.realName != ''">
+            real_name_ = #{param.realName},
+        </if>
+        <if test="param.idCardNo != null and param.idCardNo != ''">
+            id_card_no_ = #{param.idCardNo},
+        </if>
+        <if test="param.gender != null">
+            gender_ = #{param.gender},
+        </if>
+        <if test="param.birthday != null">
+            birthdate_ = #{param.birthday},
+        </if>
+        update_time_ = now()
+        WHERE del_flag_ = 0 and id_ = #{param.userId}
+    </update>
 </mapper>

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

@@ -250,16 +250,36 @@
     <select id="queryMyFans" resultType="com.yonge.cooleshow.biz.dal.vo.MyFens">
         SELECT
             s.student_id_ AS userId,
+            s.create_time_ AS starTime,
             u.avatar_ AS avatar,
             u.username_ AS userName,
             u.real_name_ AS realName,
             u.gender_ AS gender,
+            u.phone_ AS phone,
+            u.birthdate_ AS birthdate,
             (SELECT group_concat(name_) FROM `subject` WHERE find_in_set(id_,sr.subject_id_)) AS subjectName,
             if(sr.membership_start_time_ &lt;= now() and sr.membership_end_time_ &gt;= now(),1,0) AS isVip
         FROM student_star s
         LEFT JOIN sys_user u ON s.student_id_ = u.id_
         LEFT JOIN student sr ON s.student_id_ = sr.user_id_
-        WHERE u.del_flag_ = 0 and s.teacher_id_ =#{teacherId}
+        <where>
+            u.del_flag_ = 0
+            <if test="record.teacherId != null">
+                AND s.teacher_id_ =#{record.teacherId}
+            </if>
+            <if test="record.nickname != null">
+                AND u.username_ LIKE '%${record.nickname}%'
+            </if>
+            <if test="record.userId != null">
+                AND u.id_ = #{record.userId}
+            </if>
+            <if test="record.phone != null">
+                AND u.phone_ = #{record.phone}
+            </if>
+            <if test="record.startTime != null and record.endTime != null">
+                AND ( #{record.startTime} &lt;= s.create_time_ AND s.create_time_ &lt;= #{record.endTime})
+            </if>
+        </where>
     </select>
     
     <select id="queryHotTeacherList" resultMap="HotTeacherVoMap">
@@ -271,4 +291,18 @@
 		where t.entry_flag_ = 1 and t.is_test_user_ = 0 and find_in_set(#{subjectId},t.subject_id_)
 		order by tt.fans_num_ desc limit 10
     </select>
+
+    <!--老师学生人数统计-->
+    <select id="selectTeacherStudentNumberStatInfo"
+            resultType="com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper">
+        SELECT t1.teacher_id_ AS id, COUNT(DISTINCT t1.id_) AS total FROM user_binding_teacher t1
+        <where>
+            <if test="teacherIds != null">
+                AND t1.teacher_id_ IN (<foreach collection="teacherIds" separator="," item="item">#{item}</foreach>)
+            </if>
+        </where>
+        GROUP BY t1.teacher_id_
+    </select>
+    <!--老师学生人数统计-->
+
 </mapper>

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

@@ -98,4 +98,35 @@
         ) v on t.teacher_id_ = v.teacher_id_ and t.student_id_ = v.user_id_
         where v.user_id_ is null and t.created_time_ &lt;= DATE_SUB(NOW(),INTERVAL #{days} DAY)
     </select>
+
+    <select id="selectBindingUserPage"
+            resultType="com.yonge.cooleshow.biz.dal.vo.userBindingTeacher.UserBindingTeacherWrapper">
+        select
+            su.id_ as userId,
+            su.username_ as username,
+            su.gender_ as gender,
+            su.birthdate_ as birthdate,
+            su.phone_ as phone,
+            ubt.created_time_ as bindingTime
+        from user_binding_teacher ubt
+        left join sys_user su on su.id_ = ubt.student_id_
+        <where>
+            <if test="query.teacherId != null">
+                and #{query.teacherId} = ubt.teacher_id_
+            </if>
+            <if test="query.search != null and query.search != ''">
+                and ( su.id_ like ('%${query.search}%')
+                    or su.username_ like  ('%${query.search}%')
+                    or su.phone_  like  ('%${query.search}%')
+                )
+            </if>
+            <if test="query.startTime != null">
+                and ubt.created_time_ &gt;= #{query.startTime}
+            </if>
+            <if test="query.endTime != null">
+                and ubt.created_time_ &lt;= #{query.endTime}
+            </if>
+        </where>
+        order by ubt.id_ desc
+    </select>
 </mapper>

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

@@ -12,6 +12,8 @@ import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicAlbumSearch;
 import com.yonge.cooleshow.biz.dal.entity.Student;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
+import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.AppVersionInfoService;
 import com.yonge.cooleshow.biz.dal.service.MusicAlbumService;
 import com.yonge.cooleshow.biz.dal.service.StudentService;
@@ -102,7 +104,7 @@ public class MusicAlbumController extends BaseController {
         query.setType(2);
         query.setState(YesOrNoEnum.YES);
         YesOrNoEnum yesOrNoEnum = musicAlbumService.checkFavorite(sysUser.getId(),query.getId(), ClientEnum.STUDENT);
-        AlbumDetailVo albumDetailVo = musicAlbumService.detail(PageUtil.getPage(query), query);
+        AlbumDetailVo albumDetailVo = musicAlbumService.detail(PageUtil.getPage(query), query,sysUser,ClientEnum.STUDENT);
         albumDetailVo.setFavorite(yesOrNoEnum);
 
         // 相关专辑
@@ -157,8 +159,33 @@ public class MusicAlbumController extends BaseController {
             return failed("用户信息获取失败");
         }
         StudentMusicAlbumSearch search = new StudentMusicAlbumSearch();
-        search.setStudentId(sysUser.getId());
-        search.setAlbumStatus(YesOrNoEnum.YES);
+        search.studentId(sysUser.getId())
+                .albumFavorite(true)
+                .setAlbumStatus(YesOrNoEnum.YES);
+
+        IPage<MusicAlbumVo> albumVoIPage = musicAlbumService.favoriteAlbum(PageUtil.getPage(query), search, ClientEnum.STUDENT);
+        return succeed(PageUtil.pageInfo(albumVoIPage));
+    }
+
+    /**
+     * 已购买专辑信息
+     * @return HttpResponseResult<PageInfo<MusicAlbumVo>>
+     */
+    @ApiOperation(value = "已购买专辑信息")
+    @GetMapping("/purchased")
+    public HttpResponseResult<PageInfo<MusicAlbumVo>> purchasedAlbumInfo(QueryInfo query) {
+
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null  || sysUser.getId() == null) {
+            return failed("用户信息获取失败");
+        }
+        StudentMusicAlbumSearch search = new StudentMusicAlbumSearch();
+        search.studentId(sysUser.getId())
+                .albumPurchased(true)
+                .purchaseType(PurchaseRecordTypeEnum.ALBUM)
+                .orderStatus(OrderStatusEnum.PAID)
+                .clientType(ClientEnum.STUDENT);
+
         IPage<MusicAlbumVo> albumVoIPage = musicAlbumService.favoriteAlbum(PageUtil.getPage(query), search, ClientEnum.STUDENT);
         return succeed(PageUtil.pageInfo(albumVoIPage));
     }

+ 68 - 5
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/StudentActivityController.java

@@ -1,17 +1,24 @@
 package com.yonge.cooleshow.student.controller;
 
 
+import com.alibaba.fastjson.JSON;
+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.ActivityEvaluationRecordDto;
 import com.yonge.cooleshow.biz.dal.dto.EvaluationRecordDto;
-import com.yonge.cooleshow.biz.dal.entity.SysMusicCompareRecord;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.queryInfo.UserRewardQueryInfo;
 import com.yonge.cooleshow.biz.dal.service.ActivityEvaluationRecordService;
 import com.yonge.cooleshow.biz.dal.service.ActivityPlanService;
-import com.yonge.cooleshow.biz.dal.vo.MusicActivityVo;
+import com.yonge.cooleshow.biz.dal.service.ActivityUserRewardService;
+import com.yonge.cooleshow.biz.dal.vo.CheckVo;
+import com.yonge.cooleshow.biz.dal.vo.activity.UserRewardWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
-import com.yonge.toolset.base.exception.BizException;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import com.yonge.cooleshow.student.io.request.ActivityVo;
+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.slf4j.Logger;
@@ -20,7 +27,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.Objects;
+import java.util.List;
 
 
 @Api(tags = "学生活动接口")
@@ -37,6 +44,9 @@ public class StudentActivityController extends BaseController {
     @Autowired
     private ActivityEvaluationRecordService activityEvaluationRecordService;
 
+    @Autowired
+    private ActivityUserRewardService activityUserRewardService;
+
     @ApiOperation(value = "评测活动参与项目", notes = "评测项目id")
     @PostMapping(value = "/evaluation/{evaluationId}")
     public HttpResponseResult<Boolean> joinEvaluation(@PathVariable Long evaluationId) {
@@ -76,5 +86,58 @@ public class StudentActivityController extends BaseController {
         }
         return succeed();
     }
+
+
+    @ApiOperation(value = "检查是否存在未领奖")
+    @GetMapping("/checkReceiveReward")
+    public HttpResponseResult<CheckVo> checkReceiveReward(){
+
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+
+        Boolean b = activityUserRewardService.checkReceiveReward(user.getId(), ClientEnum.STUDENT);
+        YesOrNoEnum check = b?YesOrNoEnum.YES:YesOrNoEnum.NO;
+        CheckVo checkVo = new CheckVo();
+        checkVo.setCheck(check);
+
+        return succeed(checkVo);
+    }
+
+
+    @ApiOperation(value = "查看领奖列表")
+    @PostMapping("/receiveRewardList")
+    public HttpResponseResult<PageInfo<ActivityVo.ReceiveRewardList>> receiveRewardList(@RequestBody ActivityVo.ReceiveRewardQuery query){
+
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+
+        query.setClient(ClientEnum.STUDENT);
+        query.setReceive(YesOrNoEnum.NO);
+        query.setUserId(user.getId());
+
+        IPage<UserRewardWrapper> iPage = activityUserRewardService.receiveRewardList(PageUtil.getPage(query), UserRewardQueryInfo.from(query.jsonString()));
+
+        // 数据转换
+        List<ActivityVo.ReceiveRewardList> pageInfos = JSON.parseArray(JSON.toJSONString(iPage.getRecords()),
+                                                                                        ActivityVo.ReceiveRewardList.class);
+
+        return succeed(PageUtil.getPageInfo(iPage,pageInfos));
+    }
+
+
+    @ApiOperation(value = "领取奖品")
+    @PostMapping("/receiveReward/{receiveRewardId}")
+    public HttpResponseResult<CheckVo> receiveReward(@PathVariable Long receiveRewardId){
+
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        return status(activityUserRewardService.receiveReward(user.getId(), receiveRewardId));
+    }
 }
 

+ 25 - 1
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/StudentController.java

@@ -2,17 +2,23 @@ package com.yonge.cooleshow.student.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.dto.RealnameAuthReq;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.search.QueryMyFollowSearch;
 import com.yonge.cooleshow.biz.dal.entity.Subject;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.service.SysUserService;
+import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.vo.MyFollow;
 import com.yonge.cooleshow.biz.dal.vo.StudentHomeVo;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.page.PageInfo;
-import com.yonge.toolset.base.page.QueryInfo;
 import com.yonge.toolset.base.util.StringUtil;
+import com.yonge.toolset.thirdparty.user.realname.RealnameAuthenticationPlugin;
+import com.yonge.toolset.utils.idcard.IdcardInfoExtractor;
+import com.yonge.toolset.utils.idcard.IdcardValidator;
 import io.swagger.annotations.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
@@ -21,6 +27,7 @@ import org.springframework.web.bind.annotation.*;
 import com.yonge.cooleshow.biz.dal.entity.Student;
 import com.yonge.cooleshow.biz.dal.service.StudentService;
 
+import javax.validation.Valid;
 import java.util.List;
 
 @RestController
@@ -32,6 +39,10 @@ public class StudentController extends BaseController {
     @Autowired
     private SysUserFeignService sysUserFeignService;
 
+    @Autowired
+    private SysUserService sysUserService;
+
+
     @ApiOperation(value = "查询学员")
     @GetMapping("/queryUser")
     public HttpResponseResult<Student> queryUser() throws Exception {
@@ -89,4 +100,17 @@ public class StudentController extends BaseController {
         return succeed(PageUtil.pageInfo(pages));
     }
 
+    @PostMapping("/realNameAuth")
+    @ApiOperation(value = "实名认证", notes = "传入realNameAuthDto")
+    @ResponseBody
+    public HttpResponseResult<IdcardInfoExtractor> realNameAuth(@Valid @RequestBody RealnameAuthReq realNameAuthDto) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        IdcardInfoExtractor idcardInfoExtractor = sysUserService.updateUserCard(realNameAuthDto, user,ClientEnum.STUDENT);
+        return succeed(idcardInfoExtractor);
+    }
+
+
 }

+ 137 - 0
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/io/request/ActivityVo.java

@@ -0,0 +1,137 @@
+package com.yonge.cooleshow.student.io.request;
+
+import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.common.enums.RewardTypeEnum;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import com.yonge.toolset.base.page.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-10-09
+ */
+public class ActivityVo {
+
+    @ApiModel("ReceiveRewardQuery-活动领取奖品查询")
+    public static class ReceiveRewardQuery extends QueryInfo {
+
+        // 用户id
+        @ApiModelProperty(hidden = true)
+        private Long userId;
+
+        // 客户端类型
+        @ApiModelProperty(hidden = true)
+        private ClientEnum client;
+
+
+        // 是否领取
+        @ApiModelProperty("是否已领取,1是 0:否")
+        private YesOrNoEnum receive;
+
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public Long getUserId() {
+            return userId;
+        }
+
+        public void setUserId(Long userId) {
+            this.userId = userId;
+        }
+
+        public ClientEnum getClient() {
+            return client;
+        }
+
+        public void setClient(ClientEnum client) {
+            this.client = client;
+        }
+
+        public YesOrNoEnum getReceive() {
+            return receive;
+        }
+
+        public void setReceive(YesOrNoEnum receive) {
+            this.receive = receive;
+        }
+
+    }
+
+    @ApiModel("ReceiveRewardList-活动领取奖品列表")
+    public static class ReceiveRewardList {
+
+        @ApiModelProperty("领奖id")
+        private Long receiveRewardId;
+
+        @ApiModelProperty("奖品名称 ")
+        private String rewardName;
+
+        @ApiModelProperty("奖品类型:  ACTUAL 实物 VIP 小酷AI会员 PIAMO_ROOM 琴房时长 COUPON(优惠券)")
+        private RewardTypeEnum rewardType;
+
+        @ApiModelProperty("奖品描述 ")
+        private String rewardDescribe;
+
+        @ApiModelProperty("奖品图片 ")
+        private String imgUrl;
+
+        @ApiModelProperty("获奖时间")
+        private Date winningTime;
+
+        public Long getReceiveRewardId() {
+            return receiveRewardId;
+        }
+
+        public void setReceiveRewardId(Long receiveRewardId) {
+            this.receiveRewardId = receiveRewardId;
+        }
+
+        public String getRewardName() {
+            return rewardName;
+        }
+
+        public void setRewardName(String rewardName) {
+            this.rewardName = rewardName;
+        }
+
+        public RewardTypeEnum getRewardType() {
+            return rewardType;
+        }
+
+        public void setRewardType(RewardTypeEnum rewardType) {
+            this.rewardType = rewardType;
+        }
+
+        public String getRewardDescribe() {
+            return rewardDescribe;
+        }
+
+        public void setRewardDescribe(String rewardDescribe) {
+            this.rewardDescribe = rewardDescribe;
+        }
+
+        public String getImgUrl() {
+            return imgUrl;
+        }
+
+        public void setImgUrl(String imgUrl) {
+            this.imgUrl = imgUrl;
+        }
+
+        public Date getWinningTime() {
+            return winningTime;
+        }
+
+        public void setWinningTime(Date winningTime) {
+            this.winningTime = winningTime;
+        }
+    }
+}

+ 95 - 0
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/ActivityController.java

@@ -0,0 +1,95 @@
+package com.yonge.cooleshow.teacher.controller;
+
+
+import com.alibaba.fastjson.JSON;
+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.EvaluationRecordDto;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.queryInfo.UserRewardQueryInfo;
+import com.yonge.cooleshow.biz.dal.service.ActivityEvaluationRecordService;
+import com.yonge.cooleshow.biz.dal.service.ActivityPlanService;
+import com.yonge.cooleshow.biz.dal.service.ActivityUserRewardService;
+import com.yonge.cooleshow.biz.dal.vo.CheckVo;
+import com.yonge.cooleshow.biz.dal.vo.activity.UserRewardWrapper;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import com.yonge.cooleshow.teacher.io.request.ActivityVo;
+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.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+
+@Api(tags = "活动接口")
+@RestController
+@RequestMapping("/activity")
+public class ActivityController extends BaseController {
+    private final static Logger log = LoggerFactory.getLogger(ActivityController.class);
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private ActivityUserRewardService activityUserRewardService;
+
+    @ApiOperation(value = "检查是否存在未领奖")
+    @GetMapping("/checkReceiveReward")
+    public HttpResponseResult<CheckVo> checkReceiveReward(){
+
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+
+        Boolean b = activityUserRewardService.checkReceiveReward(user.getId(), ClientEnum.TEACHER);
+        YesOrNoEnum check = b?YesOrNoEnum.YES:YesOrNoEnum.NO;
+        CheckVo checkVo = new CheckVo();
+        checkVo.setCheck(check);
+
+        return succeed(checkVo);
+    }
+
+
+    @ApiOperation(value = "查看领奖列表")
+    @PostMapping("/receiveRewardList")
+    public HttpResponseResult<PageInfo<ActivityVo.ReceiveRewardList>> receiveRewardList(@RequestBody ActivityVo.ReceiveRewardQuery query){
+
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        query.setClient(ClientEnum.TEACHER);
+        query.setReceive(YesOrNoEnum.NO);
+        query.setUserId(user.getId());
+
+        IPage<UserRewardWrapper> iPage = activityUserRewardService.receiveRewardList(PageUtil.getPage(query), UserRewardQueryInfo.from(query.jsonString()));
+
+        // 数据转换
+        List<ActivityVo.ReceiveRewardList> pageInfos = JSON.parseArray(JSON.toJSONString(iPage.getRecords()),
+                                                                       ActivityVo.ReceiveRewardList.class);
+
+        return succeed(PageUtil.getPageInfo(iPage,pageInfos));
+    }
+
+
+    @ApiOperation(value = "领取奖品")
+    @PostMapping("/receiveReward/{receiveRewardId}")
+    public HttpResponseResult<CheckVo> receiveReward(@PathVariable Long receiveRewardId){
+
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        return status(activityUserRewardService.receiveReward(user.getId(), receiveRewardId));
+    }
+}
+

+ 30 - 3
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/MusicAlbumController.java

@@ -1,6 +1,8 @@
 package com.yonge.cooleshow.teacher.controller;
 
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
+import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -109,7 +111,7 @@ public class MusicAlbumController extends BaseController {
         query.setType(2);
         query.setState(YesOrNoEnum.YES);
         YesOrNoEnum yesOrNoEnum = musicAlbumService.checkFavorite(sysUser.getId(),query.getId(), ClientEnum.TEACHER);
-        AlbumDetailVo albumDetailVo = musicAlbumService.detail(PageUtil.getPage(query), query);
+        AlbumDetailVo albumDetailVo = musicAlbumService.detail(PageUtil.getPage(query), query, sysUser,  ClientEnum.TEACHER);
         albumDetailVo.setFavorite(yesOrNoEnum);
 
         // 相关专辑
@@ -164,8 +166,33 @@ public class MusicAlbumController extends BaseController {
             return failed("用户信息获取失败");
         }
         StudentMusicAlbumSearch search = new StudentMusicAlbumSearch();
-        search.setStudentId(sysUser.getId());
-        search.setAlbumStatus(YesOrNoEnum.YES);
+        search.studentId(sysUser.getId())
+                .albumFavorite(true)
+                 .setAlbumStatus(YesOrNoEnum.YES);
+
+        IPage<MusicAlbumVo> albumVoIPage = musicAlbumService.favoriteAlbum(PageUtil.getPage(query), search, ClientEnum.TEACHER);
+        return succeed(PageUtil.pageInfo(albumVoIPage));
+    }
+
+    /**
+     * 已购买专辑信息
+     * @return HttpResponseResult<PageInfo<MusicAlbumVo>>
+     */
+    @ApiOperation(value = "已购买专辑信息")
+    @GetMapping("/purchased")
+    public HttpResponseResult<PageInfo<MusicAlbumVo>> purchasedAlbumInfo(QueryInfo query) {
+
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null  || sysUser.getId() == null) {
+            return failed("用户信息获取失败");
+        }
+        StudentMusicAlbumSearch search = new StudentMusicAlbumSearch();
+        search.studentId(sysUser.getId())
+                .albumPurchased(true)
+                .purchaseType(PurchaseRecordTypeEnum.ALBUM)
+                .orderStatus(OrderStatusEnum.PAID)
+                .clientType(ClientEnum.TEACHER);
+
         IPage<MusicAlbumVo> albumVoIPage = musicAlbumService.favoriteAlbum(PageUtil.getPage(query), search, ClientEnum.TEACHER);
         return succeed(PageUtil.pageInfo(albumVoIPage));
     }

+ 23 - 6
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherController.java

@@ -1,5 +1,9 @@
 package com.yonge.cooleshow.teacher.controller;
 
+import com.yonge.cooleshow.auth.api.dto.RealnameAuthReq;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.service.SysUserService;
+import com.yonge.toolset.utils.idcard.IdcardInfoExtractor;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -8,12 +12,7 @@ import java.util.List;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
@@ -31,6 +30,8 @@ import com.yonge.toolset.base.page.QueryInfo;
 import com.yonge.toolset.base.util.StringUtil;
 import com.yonge.toolset.mybatis.support.PageUtil;
 
+import javax.validation.Valid;
+
 @RestController
 @RequestMapping("/teacher")
 @Api(value = "教师表", tags = "教师表")
@@ -40,6 +41,9 @@ public class TeacherController extends BaseController {
     @Autowired
     private SysUserFeignService sysUserFeignService;
 
+    @Autowired
+    private SysUserService sysUserService;
+
     @ApiOperation(value = "我的-查询教师基本信息")
     @GetMapping("/queryUserInfo")
     public HttpResponseResult<TeacherHomeVo> queryUserInfo() {
@@ -134,4 +138,17 @@ public class TeacherController extends BaseController {
         IPage<MyFens> pages = teacherService.queryMyFans(PageUtil.getPage(query), sysUser.getId());
         return succeed(PageUtil.pageInfo(pages));
     }
+
+
+    @PostMapping("/realNameAuth")
+    @ApiOperation(value = "实名认证", notes = "传入realNameAuthDto")
+    @ResponseBody
+    public HttpResponseResult<IdcardInfoExtractor> realNameAuth(@Valid @RequestBody RealnameAuthReq realNameAuthDto) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        IdcardInfoExtractor idcardInfoExtractor = sysUserService.updateUserCard(realNameAuthDto, user, ClientEnum.TEACHER);
+        return succeed(idcardInfoExtractor);
+    }
 }

+ 136 - 0
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/io/request/ActivityVo.java

@@ -0,0 +1,136 @@
+package com.yonge.cooleshow.teacher.io.request;
+
+import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.common.enums.RewardTypeEnum;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import com.yonge.toolset.base.page.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-10-09
+ */
+public class ActivityVo {
+
+    @ApiModel("ReceiveRewardQuery-活动领取奖品查询")
+    public static class ReceiveRewardQuery extends QueryInfo {
+
+        // 用户id
+        @ApiModelProperty(hidden = true)
+        private Long userId;
+
+        // 客户端类型
+        @ApiModelProperty(hidden = true)
+        private ClientEnum client;
+
+
+        // 是否领取
+        @ApiModelProperty("是否已领取,1是 2:否")
+        private YesOrNoEnum receive;
+
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public Long getUserId() {
+            return userId;
+        }
+
+        public void setUserId(Long userId) {
+            this.userId = userId;
+        }
+
+        public ClientEnum getClient() {
+            return client;
+        }
+
+        public void setClient(ClientEnum client) {
+            this.client = client;
+        }
+
+        public YesOrNoEnum getReceive() {
+            return receive;
+        }
+
+        public void setReceive(YesOrNoEnum receive) {
+            this.receive = receive;
+        }
+    }
+
+    @ApiModel("ReceiveRewardList-活动领取奖品列表")
+    public static class ReceiveRewardList {
+
+        @ApiModelProperty("领奖id")
+        private Long receiveRewardId;
+
+        @ApiModelProperty("奖品名称 ")
+        private String rewardName;
+
+        @ApiModelProperty("奖品类型:  ACTUAL 实物 VIP 小酷AI会员 PIAMO_ROOM 琴房时长 COUPON(优惠券)")
+        private RewardTypeEnum rewardType;
+
+        @ApiModelProperty("奖品描述 ")
+        private String rewardDescribe;
+
+        @ApiModelProperty("奖品图片 ")
+        private String imgUrl;
+
+        @ApiModelProperty("获奖时间")
+        private Date winningTime;
+
+        public Long getReceiveRewardId() {
+            return receiveRewardId;
+        }
+
+        public void setReceiveRewardId(Long receiveRewardId) {
+            this.receiveRewardId = receiveRewardId;
+        }
+
+        public String getRewardName() {
+            return rewardName;
+        }
+
+        public void setRewardName(String rewardName) {
+            this.rewardName = rewardName;
+        }
+
+        public RewardTypeEnum getRewardType() {
+            return rewardType;
+        }
+
+        public void setRewardType(RewardTypeEnum rewardType) {
+            this.rewardType = rewardType;
+        }
+
+        public String getRewardDescribe() {
+            return rewardDescribe;
+        }
+
+        public void setRewardDescribe(String rewardDescribe) {
+            this.rewardDescribe = rewardDescribe;
+        }
+
+        public String getImgUrl() {
+            return imgUrl;
+        }
+
+        public void setImgUrl(String imgUrl) {
+            this.imgUrl = imgUrl;
+        }
+
+        public Date getWinningTime() {
+            return winningTime;
+        }
+
+        public void setWinningTime(Date winningTime) {
+            this.winningTime = winningTime;
+        }
+    }
+}

+ 30 - 2
cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/MusicAlbumController.java

@@ -5,6 +5,8 @@ import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicAlbumSearch;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
+import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.MusicAlbumService;
 import com.yonge.cooleshow.biz.dal.vo.MusicAlbumVo;
 import com.yonge.cooleshow.common.controller.BaseController;
@@ -73,8 +75,34 @@ public class MusicAlbumController extends BaseController {
         }
 
         StudentMusicAlbumSearch search = new StudentMusicAlbumSearch();
-        search.setStudentId(sysUser.getId());
-        search.setAlbumStatus(YesOrNoEnum.YES);
+        search.studentId(sysUser.getId())
+                .albumFavorite(true)
+                .setAlbumStatus(YesOrNoEnum.YES);
+
+        IPage<MusicAlbumVo> albumVoIPage = musicAlbumService.favoriteAlbum(PageUtil.getPage(query), search, ClientEnum.valueOf(clientType));
+        return succeed(PageUtil.pageInfo(albumVoIPage));
+    }
+
+    /**
+     * 已购买专辑信息
+     * @return HttpResponseResult<PageInfo<MusicAlbumVo>>
+     */
+    @ApiOperation(value = "已购买专辑信息")
+    @GetMapping("/purchased")
+    public HttpResponseResult<PageInfo<MusicAlbumVo>> purchasedAlbumInfo(@ApiParam(value = "客户端类型") @RequestParam(value = "clientType", required = false, defaultValue = "STUDENT") String clientType,
+                                                                         QueryInfo query) {
+
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null  || sysUser.getId() == null) {
+            return failed("用户信息获取失败");
+        }
+        StudentMusicAlbumSearch search = new StudentMusicAlbumSearch();
+        search.studentId(sysUser.getId())
+                .albumPurchased(true)
+                .purchaseType(PurchaseRecordTypeEnum.ALBUM)
+                .orderStatus(OrderStatusEnum.PAID)
+                .clientType(ClientEnum.valueOf(clientType));
+
         IPage<MusicAlbumVo> albumVoIPage = musicAlbumService.favoriteAlbum(PageUtil.getPage(query), search, ClientEnum.valueOf(clientType));
         return succeed(PageUtil.pageInfo(albumVoIPage));
     }

+ 2 - 1
cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/open/OpenMusicAlbumController.java

@@ -34,6 +34,7 @@ import org.springframework.web.bind.annotation.RestController;
 import javax.validation.Valid;
 
 import java.util.List;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 /**
@@ -115,7 +116,7 @@ public class OpenMusicAlbumController extends BaseController {
         }
         query.setType(2);
         query.setState(YesOrNoEnum.YES);
-        AlbumDetailVo albumDetailVo = musicAlbumService.detail(PageUtil.getPage(query), query);
+        AlbumDetailVo albumDetailVo = musicAlbumService.detail(PageUtil.getPage(query), query, null, null);
         albumDetailVo.setFavorite(favorite);
 
         // 热门专辑