Browse Source

Merge branch 'master' of http://git.dayaedu.com/yonge/cooleshow

yonge 3 năm trước cách đây
mục cha
commit
b7045076d2
100 tập tin đã thay đổi với 3424 bổ sung148 xóa
  1. 7 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/AdminFeignService.java
  2. 3 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/dto/UserFriendInfoVO.java
  3. 5 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/AdminFeignServiceFallback.java
  4. 11 0
      cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/dto/UserSetReq.java
  5. 2 2
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/handler/BaseAuthenticationSuccessEventHandler.java
  6. 1 1
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/provider/PhoneAuthenticationProvider.java
  7. 3 2
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/SysUserService.java
  8. 17 6
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/SysUserServiceImpl.java
  9. 10 0
      cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/controller/NewsController.java
  10. 10 0
      cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/controller/queryinfo/NewsInformationQueryInfo.java
  11. 24 1
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/constant/SysConfigConstant.java
  12. 25 0
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/OmsOrderController.java
  13. 1 1
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/UmsAdminController.java
  14. 30 0
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/OmsOrderCourierService.java
  15. 68 0
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderCourierServiceImpl.java
  16. 39 0
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderServiceImpl.java
  17. 10 0
      cooleshow-mall/mall-common/pom.xml
  18. 150 0
      cooleshow-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/courier/domain/CourierInfo.java
  19. 61 0
      cooleshow-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/courier/enums/CompanyEnum.java
  20. 7 0
      cooleshow-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/courier/package-info.java
  21. 42 0
      cooleshow-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/courier/service/CourierService.java
  22. 150 0
      cooleshow-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/courier/service/impl/Courier100ServiceImpl.java
  23. 1 0
      cooleshow-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/enums/OrderCacheEnum.java
  24. 37 0
      cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/OmsOrderCourierMapper.java
  25. 1 1
      cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/OmsOrder.java
  26. 75 0
      cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/OmsOrderCourier.java
  27. 114 0
      cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/OmsOrderCourierMapper.xml
  28. 22 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderController.java
  29. 39 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/open/OpenShareController.java
  30. 2 1
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dao/PortalOrderDao.java
  31. 30 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsOrderCourierService.java
  32. 68 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsOrderCourierServiceImpl.java
  33. 41 12
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java
  34. 2 1
      cooleshow-mall/mall-portal/src/main/resources/config/mybatis/PortalOrderDao.xml
  35. 19 0
      cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/VirtualNumberTask.java
  36. 80 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/CourseCoursewareController.java
  37. 2 1
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ImGroupController.java
  38. 29 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/MusicAlbumController.java
  39. 2 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/MusicSheetController.java
  40. 94 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ReturnVisitController.java
  41. 156 1
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/VideoLessonController.java
  42. 75 13
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/music/MusicCompareRecordStatController.java
  43. 31 5
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/ImUserFriendController.java
  44. 15 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/OpenUserAccountController.java
  45. 6 3
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/coupon/CouponInfoVO.java
  46. 166 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/course/CourseRelationVo.java
  47. 3 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/im/UserFriendInfoVO.java
  48. 118 8
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/music/MusicCompareVo.java
  49. 32 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/task/TaskController.java
  50. 34 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseCoursewareDao.java
  51. 23 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseRelationMusicAlbumDao.java
  52. 4 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ImGroupMemberDao.java
  53. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ImNetworkRoomMemberDao.java
  54. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicAlbumDao.java
  55. 0 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicFavoriteDao.java
  56. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicSheetDao.java
  57. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicSheetPurchaseRecordDao.java
  58. 1 12
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicTagDao.java
  59. 30 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ReturnVisitDao.java
  60. 20 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/SysMusicCompareRecordDao.java
  61. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/VideoLessonGroupDao.java
  62. 4 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/VideoLessonGroupDetailDao.java
  63. 51 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/AppMusicSheetVo.java
  64. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/BasicUserInfo.java
  65. 13 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/CourseCoursewareDto.java
  66. 58 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/CourseMusicAlbumRelationDto.java
  67. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkBaseDto.java
  68. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkCustomMessage.java
  69. 16 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkDeviceControlDto.java
  70. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkDisplayDataDto.java
  71. 14 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkMusicSheetDto.java
  72. 30 22
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/VideoLessonGroupDetailDto.java
  73. 116 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/CourseCoursewareSearch.java
  74. 36 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/CourseGroupSearch.java
  75. 9 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MusicAlbumSearch.java
  76. 21 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MusicSheetSearch.java
  77. 83 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/ReturnVisitSearch.java
  78. 16 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/StudentMusicAlbumSearch.java
  79. 3 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/StudentMusicSheetOrderSearch.java
  80. 21 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/StudentMusicSheetSearch.java
  81. 56 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/StudentSearch.java
  82. 59 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/TeacherSearch.java
  83. 115 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseCourseware.java
  84. 166 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseRelationMusicAlbum.java
  85. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImNetworkRoomMember.java
  86. 16 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImUserFriend.java
  87. 15 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicAlbum.java
  88. 3 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicCompareRecordStat.java
  89. 38 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicSheet.java
  90. 13 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicSheetPurchaseRecord.java
  91. 116 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ReturnVisit.java
  92. 30 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/Student.java
  93. 39 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/Teacher.java
  94. 18 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TeacherStyleVideo.java
  95. 41 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/VideoLessonGroup.java
  96. 3 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/VideoLessonGroupDetail.java
  97. 32 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/VideoLessonGroupLog.java
  98. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/ClientEnum.java
  99. 34 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/CoursewareEnum.java
  100. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/FeatureType.java

+ 7 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/AdminFeignService.java

@@ -137,4 +137,11 @@ public interface AdminFeignService {
      */
     @PostMapping(value = "/open/im/customerService")
     HttpResponseResult<Boolean> customerService(@RequestBody UserFriendInfoVO info);
+
+
+    /**
+     *  每日增加收藏/热度人数
+     */
+    @GetMapping("/task/virtualNumber")
+    HttpResponseResult<Boolean> virtualNumber();
 }

+ 3 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/dto/UserFriendInfoVO.java

@@ -21,6 +21,9 @@ public class UserFriendInfoVO implements Serializable {
     // 新用户ID
     private Long userId;
 
+    // 客户端类型
+    private String clientType;
+
     // 好友ID
     private List<Long> friendIds;
 

+ 5 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/AdminFeignServiceFallback.java

@@ -118,4 +118,9 @@ public class AdminFeignServiceFallback implements AdminFeignService {
     public HttpResponseResult<Boolean> customerService(UserFriendInfoVO info) {
         return null;
     }
+
+    @Override
+    public HttpResponseResult<Boolean> virtualNumber() {
+        return null;
+    }
 }

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

@@ -29,6 +29,9 @@ public class UserSetReq {
     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     private Date birthdate;
 
+    @ApiModelProperty("客户端类型: TEACHER, STUDENT")
+    private String clientType;
+
     public String getClientId() {
         return clientId;
     }
@@ -68,4 +71,12 @@ public class UserSetReq {
     public void setBirthdate(Date birthdate) {
         this.birthdate = birthdate;
     }
+
+    public String getClientType() {
+        return clientType;
+    }
+
+    public void setClientType(String clientType) {
+        this.clientType = clientType;
+    }
 }

+ 2 - 2
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/handler/BaseAuthenticationSuccessEventHandler.java

@@ -84,9 +84,9 @@ public class BaseAuthenticationSuccessEventHandler extends SavedRequestAwareAuth
 			sysUser = sysUserService.queryLockByPhone(username.split(":")[1]);
 		}
 		if(StringUtils.isEmpty(sysUser.getImToken())){
-			String name = sysUser.getRealName();
+			String name = sysUser.getUsername();
 			if(StringUtils.isEmpty(name)){
-				name = sysUser.getUsername();
+				name = sysUser.getRealName();
 			}
 			try {
 				TokenResult result = RongCloudConfig.rongCloud.user.register(new UserModel(sysUser.getId().toString(), name, sysUser.getAvatar()));

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

@@ -80,7 +80,7 @@ public class PhoneAuthenticationProvider extends AbstractAuthenticationProvider
 
             if (Objects.nonNull(userInfo.getSysUser())) {
                 // 自动添加系统默认IM帐号为好友,并自动发送通知消息
-                sysUserService.sendSysCustomerServiceFriendMessage(userInfo.getSysUser());
+                sysUserService.sendSysCustomerServiceFriendMessage(userInfo.getSysUser(), clientId.toUpperCase());
             }
 
             if (StringUtils.isNotBlank(deviceNum)) {

+ 3 - 2
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/SysUserService.java

@@ -124,8 +124,9 @@ public interface SysUserService extends BaseService<Long, SysUser> {
     /**
      * 添加系统客服好友消息
      * @param sysUser SysUser
+     * @param clientType 客户端类型
      */
-    void sendSysCustomerServiceFriendMessage(SysUser sysUser);
+    void sendSysCustomerServiceFriendMessage(SysUser sysUser, String clientType);
 
     /**
      * 刷新token
@@ -177,7 +178,7 @@ public interface SysUserService extends BaseService<Long, SysUser> {
     void submitSetDetail(UserSetReq setReq, Long id);
 
     //修改融云用户基本信息
-    void updateRongCloudUserInfo(Long userId);
+    void updateRongCloudUserInfo(Long userId, String clientType);
 
     /**
      * 商城同步管理用户

+ 17 - 6
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/SysUserServiceImpl.java

@@ -211,7 +211,7 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
      * 添加系统客服好友消息
      * @param sysUser SysUser
      */
-    public void sendSysCustomerServiceFriendMessage(SysUser sysUser) {
+    public void sendSysCustomerServiceFriendMessage(SysUser sysUser, String clientType) {
 
         try {
 
@@ -231,6 +231,7 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
                     // 发送添加系统客服好友消息
                     HttpResponseResult<Boolean> result = adminFeignService.customerService(UserFriendInfoVO.builder()
                             .userId(sysUser.getId())
+                            .clientType(clientType)
                             .friendIds(Lists.newArrayList(friend.getId()))
                             .build());
                     log.info("sendSysCustomerServiceFriendMessage mobile={}, ret={}", mobile, JSON.toJSONString(result));
@@ -283,19 +284,29 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
     @Override
     public void submitSetDetail(UserSetReq setReq, Long id) {
         sysUserDao.updatetSetDetail(setReq, id);
+
+        if (StringUtils.isEmpty(setReq.getClientType())) {
+            setReq.setClientType(EClientType.TEACHER.name());
+        }
         //更新融云用户基本信息
-        this.updateRongCloudUserInfo(id);
+        this.updateRongCloudUserInfo(id, setReq.getClientType());
     }
 
     @Override
-    public void updateRongCloudUserInfo(Long userId) {
+    public void updateRongCloudUserInfo(Long userId, String clientType) {
         UserSetVo setDetail = this.getSetDetail(userId);
         //更新imGroupMember表用户头像
         sysUserDao.updateImGroupMember(userId, setDetail.getUsername(), setDetail.getAvatar());
         //更新imUserFriend表用户头像
         sysUserDao.updateImUserFriend(userId, setDetail.getUsername(), setDetail.getAvatar());
         try {
-            RongCloudConfig.rongCloud.user.update(new UserModel(userId.toString(), setDetail.getUsername(), setDetail.getAvatar()));
+
+            String imUserId = String.valueOf(userId);
+            if (EClientType.STUDENT.match(clientType)) {
+                imUserId = MessageFormat.format("{0}:{1}", imUserId, EClientType.STUDENT.name());
+            }
+
+            RongCloudConfig.rongCloud.user.update(new UserModel(imUserId, setDetail.getUsername(), setDetail.getAvatar()));
         } catch (Exception e) {
             throw new BizException("更新用户信息失败");
         }
@@ -378,9 +389,9 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
 
                 }*/
 
-                String name = sysUser.getRealName();
+                String name = sysUser.getUsername();
                 if(StringUtils.isEmpty(name)){
-                    name = sysUser.getUsername();
+                    name = sysUser.getRealName();
                 }
 
                 // IM用户ID

+ 10 - 0
cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/controller/NewsController.java

@@ -45,6 +45,16 @@ public class NewsController extends BaseController {
 	@PostMapping(value = "/page",  consumes="application/json", produces="application/json")
 	public HttpResponseResult<PageInfo<SysNewsInformationDto>> getList(@Valid @RequestBody NewsInformationQueryInfo queryInfo) {
 
+		//  查询app版本
+		if (!StringUtil.isEmpty(queryInfo.getVersion())) {
+			String status = sysNewsInformationService.selectAppVersionInfo(queryInfo.getPlatform(), queryInfo.getVersion());
+			if ("auditing".equals(status) || queryInfo.getVersion().equals("1")) {
+				queryInfo.setVersion("1");
+			} else {
+				queryInfo.setVersion("0");
+			}
+		}
+
 		if (queryInfo.getType() == 2) {
 			queryInfo.setAttribute2(queryInfo.getSubType());
 			queryInfo.setSubType(null);

+ 10 - 0
cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/controller/queryinfo/NewsInformationQueryInfo.java

@@ -47,6 +47,16 @@ public class NewsInformationQueryInfo extends QueryInfo {
 
 	private Date date;
 
+	@ApiModelProperty(value = "平台")
+	private String platform;
+
+	public String getPlatform() {
+		return platform;
+	}
+
+	public void setPlatform(String platform) {
+		this.platform = platform;
+	}
 
 	public String getClientType() {
 		return clientType;

+ 24 - 1
cooleshow-common/src/main/java/com/yonge/cooleshow/common/constant/SysConfigConstant.java

@@ -331,8 +331,31 @@ public interface SysConfigConstant {
     String MALL_ACCOUNT_PERIOD = "mall_account_period";
 
     /**
-     * 曲目置顶数
+     * 曲目置顶数 弃用
      */
     String MUSIC_SHEET_TOP_NUM = "music_sheet_top_num";
 
+
+    /**
+     * 曲目虚拟人数增长最大值
+     */
+    String MUSIC_SHEET_VIRTUAL_NUMBER = "music_sheet_virtual_number";
+
+    /**
+     * 专辑虚拟人数增长最大值
+     */
+    String MUSIC_ALBUM_VIRTUAL_NUMBER = "music_album_virtual_number";
+
+
+    /**
+     * 免费视频课虚拟人数增长最大值
+     */
+    String VIDEO_VIRTUAL_NUMBER = "video_virtual_number";
+
+
+
+    /**
+     * 个人风采虚拟人数增长最大值
+     */
+    String STYLE_VIDEO_VIRTUAL_NUMBER = "style_video_virtual_number";
 }

+ 25 - 0
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/OmsOrderController.java

@@ -1,10 +1,12 @@
 package com.yonge.cooleshow.admin.controller;
 
+import com.yonge.cooleshow.admin.service.OmsOrderCourierService;
 import com.yonge.cooleshow.mall.common.api.CommonPage;
 import com.yonge.cooleshow.mall.common.api.CommonResult;
 import com.yonge.cooleshow.admin.dto.*;
 import com.yonge.cooleshow.mbg.model.OmsOrder;
 import com.yonge.cooleshow.admin.service.OmsOrderService;
+import com.yonge.cooleshow.mbg.model.OmsOrderCourier;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -27,6 +29,9 @@ public class OmsOrderController {
     @Autowired
     private OmsOrderService orderService;
 
+
+    @Autowired
+    private OmsOrderCourierService orderCourierService;
     @ApiOperation("查询订单")
     @RequestMapping(value = "/list", method = RequestMethod.GET)
     @ResponseBody
@@ -112,4 +117,24 @@ public class OmsOrderController {
         }
         return CommonResult.failed();
     }
+
+
+
+    @ApiOperation("用户查询物流")
+    @GetMapping(value = "/selectCourier")
+    @ResponseBody
+    public CommonResult<OmsOrderCourier> selectCourier(@RequestParam String  deliverySn) {
+        OmsOrderCourier omsOrderCourier = orderCourierService.getCourierInfo(deliverySn);
+        return CommonResult.success(omsOrderCourier);
+    }
+
+
+
+    @ApiOperation("用户刷新物流信息")
+    @GetMapping(value = "/refreshCourier")
+    @ResponseBody
+    public CommonResult refreshCourier(@RequestParam String  deliverySn) throws InterruptedException {
+        OmsOrderCourier omsOrderCourier = orderCourierService.refreshCourier(deliverySn);
+        return CommonResult.success(omsOrderCourier);
+    }
 }

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

@@ -94,7 +94,7 @@ public class UmsAdminController {
         data.put("icon", umsAdmin.getIcon());
         List<UmsRole> roleList = adminService.getRoleList(umsAdmin.getId());
         if(CollUtil.isNotEmpty(roleList)){
-            List<String> roles = roleList.stream().map(UmsRole::getName).collect(Collectors.toList());
+            List<String> roles = roleList.stream().filter(role -> role != null).map(UmsRole::getName).collect(Collectors.toList());
             data.put("roles",roles);
         }
         return CommonResult.success(data);

+ 30 - 0
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/OmsOrderCourierService.java

@@ -0,0 +1,30 @@
+package com.yonge.cooleshow.admin.service;
+
+import com.yonge.cooleshow.mall.common.courier.domain.CourierInfo;
+import com.yonge.cooleshow.mbg.model.OmsOrderCourier;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-10-31
+ */
+public interface OmsOrderCourierService {
+
+
+    @Transactional
+    void updateCourierInfo(CourierInfo courierInfos);
+
+    /**
+     * 查询物流
+     */
+    OmsOrderCourier getCourierInfo(String deliverySn);
+
+    /**
+     * 刷新物流信息
+     * @return
+     */
+    @Transactional
+    OmsOrderCourier refreshCourier(String deliverySn) throws InterruptedException;
+}

+ 68 - 0
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderCourierServiceImpl.java

@@ -0,0 +1,68 @@
+package com.yonge.cooleshow.admin.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.admin.service.OmsOrderCourierService;
+import com.yonge.cooleshow.mall.common.courier.domain.CourierInfo;
+import com.yonge.cooleshow.mall.common.courier.enums.CompanyEnum;
+import com.yonge.cooleshow.mall.common.courier.service.CourierService;
+import com.yonge.cooleshow.mall.common.enums.OrderCacheEnum;
+import com.yonge.cooleshow.mbg.mapper.OmsOrderCourierMapper;
+import com.yonge.cooleshow.mbg.model.OmsOrderCourier;
+import com.yonge.toolset.base.exception.BizException;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-10-31
+ */
+@Service
+public class OmsOrderCourierServiceImpl implements OmsOrderCourierService {
+
+    @Autowired
+    private OmsOrderCourierMapper omsOrderCourierMapper;
+    @Autowired
+    private CourierService courierService;
+
+    @Autowired
+    private RedissonClient redissonClient;
+
+    @Override
+    public void updateCourierInfo(CourierInfo courierInfos) {
+        String courierNo = courierInfos.getCourierNo();
+        String logistics = JSON.toJSONString(courierInfos.getLogisticsList());
+        omsOrderCourierMapper.updateByCourierNo(courierNo,logistics);
+    }
+
+    @Override
+    public OmsOrderCourier getCourierInfo(String deliverySn) {
+        OmsOrderCourier omsOrderCourier = omsOrderCourierMapper.queryByCourierNo(deliverySn);
+        if (omsOrderCourier == null) {
+            throw new BizException("未找到物流信息");
+        }
+        return omsOrderCourier;
+    }
+
+    @Override
+    public OmsOrderCourier refreshCourier(String deliverySn) throws InterruptedException {
+        RLock lock = redissonClient.getLock(OrderCacheEnum.COURIER_LOCK.getCode() + deliverySn);
+        boolean b = lock.tryLock(0,1, TimeUnit.HOURS);
+
+        OmsOrderCourier omsOrderCourier = omsOrderCourierMapper.queryByCourierNo(deliverySn);
+        if (b) {
+            if (omsOrderCourier == null) {
+                throw new BizException("未找到物流信息");
+            }
+            CourierInfo courierInfo = courierService.queryTrack(CompanyEnum.descOf(omsOrderCourier.getCompany()),
+                                                                omsOrderCourier.getCourierNo());
+            updateCourierInfo(courierInfo);
+        }
+        return omsOrderCourierMapper.queryByCourierNo(deliverySn);
+    }
+}

+ 39 - 0
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderServiceImpl.java

@@ -8,15 +8,22 @@ import com.yonge.cooleshow.admin.dto.search.OrderStatisticalSearch;
 import com.yonge.cooleshow.admin.dto.search.UserStatisticalSearch;
 import com.yonge.cooleshow.admin.service.OmsOrderReturnApplyService;
 import com.yonge.cooleshow.admin.service.PmsProductService;
+import com.yonge.cooleshow.mall.common.courier.enums.CompanyEnum;
+import com.yonge.cooleshow.mall.common.courier.service.CourierService;
+import com.yonge.cooleshow.mbg.mapper.OmsOrderCourierMapper;
 import com.yonge.cooleshow.mbg.mapper.OmsOrderMapper;
 import com.yonge.cooleshow.mbg.mapper.OmsOrderOperateHistoryMapper;
+import com.yonge.cooleshow.mbg.mapper.SysConfigMapper;
 import com.yonge.cooleshow.mbg.model.OmsOrder;
+import com.yonge.cooleshow.mbg.model.OmsOrderCourier;
 import com.yonge.cooleshow.mbg.model.OmsOrderExample;
 import com.yonge.cooleshow.mbg.model.OmsOrderOperateHistory;
 import com.yonge.cooleshow.admin.service.OmsOrderService;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.utils.date.DateUtil;
 import com.yonge.cooleshow.admin.enums.OrderStatisticalEnum;
+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;
@@ -39,6 +46,8 @@ import java.util.stream.Collectors;
  */
 @Service
 public class OmsOrderServiceImpl implements OmsOrderService {
+
+    private static final Logger LOG = LoggerFactory.getLogger(OmsOrderServiceImpl.class);
     @Autowired
     private OmsOrderMapper orderMapper;
     @Autowired
@@ -54,6 +63,15 @@ public class OmsOrderServiceImpl implements OmsOrderService {
     @Autowired
     private PmsProductService productService;
 
+    @Autowired
+    private OmsOrderCourierMapper omsOrderCourierMapper;
+
+    @Autowired
+    private CourierService courierService;
+
+    @Autowired
+    private SysConfigMapper sysConfigMapper;
+
     @Override
     public List<OrderVo> list(OmsOrderQueryParam queryParam, Integer pageSize, Integer pageNum) {
         PageHelper.startPage(pageNum, pageSize);
@@ -76,6 +94,27 @@ public class OmsOrderServiceImpl implements OmsOrderService {
                     return history;
                 }).collect(Collectors.toList());
         orderOperateHistoryDao.insertList(operateHistoryList);
+
+        // 添加快递信息
+        List<OmsOrderCourier> omsOrderCouriers = new ArrayList<>();
+        for (OmsOrderDeliveryParam omsOrderDeliveryParam : deliveryParamList) {
+            OmsOrderCourier omsOrderCourier = new OmsOrderCourier();
+            omsOrderCourier.setOrderId(omsOrderDeliveryParam.getOrderId());
+            omsOrderCourier.setCourierNo(omsOrderDeliveryParam.getDeliverySn());
+            omsOrderCourier.setCompany(omsOrderDeliveryParam.getDeliveryCompany());
+            omsOrderCouriers.add(omsOrderCourier);
+        }
+        omsOrderCourierMapper.batchInsert(omsOrderCouriers);
+
+
+        for (OmsOrderCourier omsOrderCourier : omsOrderCouriers) {
+            try {
+                courierService.subscribe(CompanyEnum.descOf(omsOrderCourier.getCompany()),omsOrderCourier.getCourierNo(),sysConfigMapper.getConfig("kuaidiUrl"));
+
+            } catch (Exception e) {
+                LOG.error(e.getMessage());
+            }
+        }
         return count;
     }
 

+ 10 - 0
cooleshow-mall/mall-common/pom.xml

@@ -64,6 +64,16 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-validation</artifactId>
         </dependency>
+<!--        快递100-->
+        <dependency>
+            <groupId>com.github.kuaidi100-api</groupId>
+            <artifactId>sdk</artifactId>
+            <version>1.0.10</version>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+        </dependency>
 
     </dependencies>
 

+ 150 - 0
cooleshow-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/courier/domain/CourierInfo.java

@@ -0,0 +1,150 @@
+package com.yonge.cooleshow.mall.common.courier.domain;
+
+import com.yonge.cooleshow.mall.common.courier.enums.CompanyEnum;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Description 快递运输信息
+ *
+ * @author liujunchi
+ * @date 2022-10-26
+ */
+public class CourierInfo {
+
+    // 快递公司
+    private CompanyEnum company;
+
+    // 快递单号
+    private String courierNo;
+
+    // 物流信息
+    private List<Logistics> logisticsList;
+
+    public  static class Logistics {
+        // 时间
+        private Date time;
+
+        //内容
+        private String context;
+
+
+        //行政区域的编码
+        private String areaCode;
+
+        //行政区域的名称
+        private String areaName;
+
+        //物流状态名称或者高级状态名称
+        private String status;
+
+        //快件当前地点
+        private String location;
+
+        //行政区域经纬度
+        private String areaCenter;
+
+        //行政区域拼音
+        private String areaPinYin;
+
+        //高级物流状态值
+        private String statusCode;
+
+        public Date getTime() {
+            return time;
+        }
+
+        public void setTime(Date time) {
+            this.time = time;
+        }
+
+        public String getContext() {
+            return context;
+        }
+
+        public void setContext(String context) {
+            this.context = context;
+        }
+
+        public String getAreaCode() {
+            return areaCode;
+        }
+
+        public void setAreaCode(String areaCode) {
+            this.areaCode = areaCode;
+        }
+
+        public String getAreaName() {
+            return areaName;
+        }
+
+        public void setAreaName(String areaName) {
+            this.areaName = areaName;
+        }
+
+        public String getStatus() {
+            return status;
+        }
+
+        public void setStatus(String status) {
+            this.status = status;
+        }
+
+        public String getLocation() {
+            return location;
+        }
+
+        public void setLocation(String location) {
+            this.location = location;
+        }
+
+        public String getAreaCenter() {
+            return areaCenter;
+        }
+
+        public void setAreaCenter(String areaCenter) {
+            this.areaCenter = areaCenter;
+        }
+
+        public String getAreaPinYin() {
+            return areaPinYin;
+        }
+
+        public void setAreaPinYin(String areaPinYin) {
+            this.areaPinYin = areaPinYin;
+        }
+
+        public String getStatusCode() {
+            return statusCode;
+        }
+
+        public void setStatusCode(String statusCode) {
+            this.statusCode = statusCode;
+        }
+    }
+
+    public CompanyEnum getCompany() {
+        return company;
+    }
+
+    public void setCompany(CompanyEnum company) {
+        this.company = company;
+    }
+
+    public String getCourierNo() {
+        return courierNo;
+    }
+
+    public void setCourierNo(String courierNo) {
+        this.courierNo = courierNo;
+    }
+
+    public List<Logistics> getLogisticsList() {
+        return logisticsList;
+    }
+
+    public void setLogisticsList(List<Logistics> logisticsList) {
+        this.logisticsList = logisticsList;
+    }
+}

+ 61 - 0
cooleshow-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/courier/enums/CompanyEnum.java

@@ -0,0 +1,61 @@
+package com.yonge.cooleshow.mall.common.courier.enums;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-10-26
+ */
+public enum CompanyEnum {
+
+    SHUNFENG("shunfeng","顺丰快递"),
+    ZHONGTONG("zhongtong","中通快递"),
+    YUANTONG("yuantong","圆通快递"),
+    HUITONGKUAIDI("huitongkuaidi","汇通"),
+    SHENTONG("shentong","申通"),
+    YUNDA("yunda","韵达快递"),
+    EMS("ems","ems"),
+    JD("jd","京东"),
+    ZHAIJISONG("zhaijisong","宅急送"),
+    DEBANGKUAIDI("debangkuaidi","德邦快递"),
+    ;
+
+
+    // 快递100对应编号
+    private String code;
+
+    // 公司描述
+    private String desc;
+
+    CompanyEnum(String code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public static CompanyEnum codeOf(String s) {
+        for (CompanyEnum value : CompanyEnum.values()) {
+            if (value.getCode().equals(s)) {
+                return value;
+            }
+        }
+        return null;
+    }
+
+
+    public static CompanyEnum descOf(String s) {
+        for (CompanyEnum value : CompanyEnum.values()) {
+            if (value.getDesc().equals(s)) {
+                return value;
+            }
+        }
+        return null;
+    }
+}

+ 7 - 0
cooleshow-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/courier/package-info.java

@@ -0,0 +1,7 @@
+/**
+ * Description 快递
+ *
+ * @author: feng-ji
+ * @date: 2022-10-26
+ */
+package com.yonge.cooleshow.mall.common.courier;

+ 42 - 0
cooleshow-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/courier/service/CourierService.java

@@ -0,0 +1,42 @@
+package com.yonge.cooleshow.mall.common.courier.service;
+
+import com.yonge.cooleshow.mall.common.courier.domain.CourierInfo;
+import com.yonge.cooleshow.mall.common.courier.enums.CompanyEnum;
+
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-10-26
+ */
+public interface CourierService {
+
+
+    /**
+     * 查询快递信息
+     *
+     * @param company 快递公司
+     * @param courierNo 快递编号
+     */
+    CourierInfo queryTrack(CompanyEnum company,String courierNo);
+
+
+    /**
+     * 回调返回数据转 快递信息
+     *
+     * @param body
+     * @return
+     */
+    CourierInfo getCourierInfos(String body);
+
+    /**
+     * 快递信息订阅
+     *
+     * @param company 快递公司编号
+     * @param courierNo 快递单号
+     * @param url 回调地址
+     */
+    boolean subscribe(CompanyEnum company,String courierNo,String url) throws Exception;
+}

+ 150 - 0
cooleshow-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/courier/service/impl/Courier100ServiceImpl.java

@@ -0,0 +1,150 @@
+package com.yonge.cooleshow.mall.common.courier.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.google.gson.Gson;
+import com.kuaidi100.sdk.api.QueryTrack;
+import com.kuaidi100.sdk.api.Subscribe;
+import com.kuaidi100.sdk.contant.ApiInfoConstant;
+import com.kuaidi100.sdk.contant.CompanyConstant;
+import com.kuaidi100.sdk.core.IBaseClient;
+import com.kuaidi100.sdk.pojo.HttpResult;
+import com.kuaidi100.sdk.request.QueryTrackParam;
+import com.kuaidi100.sdk.request.QueryTrackReq;
+import com.kuaidi100.sdk.request.SubscribeParam;
+import com.kuaidi100.sdk.request.SubscribeParameters;
+import com.kuaidi100.sdk.request.SubscribeReq;
+import com.kuaidi100.sdk.utils.SignUtils;
+import com.yonge.cooleshow.mall.common.courier.domain.CourierInfo;
+import com.yonge.cooleshow.mall.common.courier.enums.CompanyEnum;
+import com.yonge.cooleshow.mall.common.courier.service.CourierService;
+import com.yonge.toolset.base.exception.BizException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-10-26
+ */
+@Service("Courier100Service")
+public class Courier100ServiceImpl implements CourierService {
+
+    private static final Logger LOG = LoggerFactory.getLogger(Courier100ServiceImpl.class);
+
+    @Value("${courier.courier100.key:jvpXSAFN9687}")
+    private String key;
+
+    @Value("${courier.courier100.customer:B6E26D57F060E7D9C87032AF7F000046}")
+    private String customer;
+
+
+    @Override
+    public CourierInfo queryTrack(CompanyEnum company, String courierNo) {
+        QueryTrackReq queryTrackReq = new QueryTrackReq();
+        QueryTrackParam queryTrackParam = new QueryTrackParam();
+
+        queryTrackParam.setCom(getCompanyConstant(company));
+        queryTrackParam.setNum(courierNo);
+        queryTrackParam.setResultv2("4");
+        String param = new Gson().toJson(queryTrackParam);
+
+        queryTrackReq.setParam(param);
+        queryTrackReq.setCustomer(customer);
+        queryTrackReq.setSign(SignUtils.querySign(param , key, customer));
+
+        IBaseClient baseClient = new QueryTrack();
+        try {
+            LOG.debug("查询快递参数: {}",queryTrackParam);
+            HttpResult execute = baseClient.execute(queryTrackReq);
+            LOG.info("查询快递信息参数: {}",execute);
+            if (execute.getStatus() != 200) {
+                throw new BizException(execute.getError());
+            }
+            String body = execute.getBody();
+            return getCourierInfos(body);
+        } catch (Exception e) {
+            LOG.error(e.getLocalizedMessage());
+            e.printStackTrace();
+            throw new BizException(e.getMessage());
+        }
+    }
+
+    @Override
+    public CourierInfo getCourierInfos(String body) {
+        JSONObject jsonObject = JSON.parseObject(body);
+        if (!"200".equals(jsonObject.getString("status"))) {
+            throw new BizException(jsonObject.getString("message"));
+        }
+        CourierInfo courierInfo = new CourierInfo();
+        List<CourierInfo.Logistics> data = JSON.parseArray(jsonObject.getString("data"), CourierInfo.Logistics.class);
+
+        courierInfo.setLogisticsList(data);
+        courierInfo.setCourierNo(jsonObject.getString("nu"));
+        courierInfo.setCompany(CompanyEnum.codeOf(jsonObject.getString("com")));
+        return courierInfo;
+    }
+
+    @Override
+    public boolean subscribe(CompanyEnum company, String courierNo, String url) {
+        SubscribeParameters subscribeParameters = new SubscribeParameters();
+        subscribeParameters.setCallbackurl(url);
+        subscribeParameters.setResultv2("4");
+
+        SubscribeParam subscribeParam = new SubscribeParam();
+        subscribeParam.setParameters(subscribeParameters);
+
+        subscribeParam.setCompany(getCompanyConstant(company));
+        subscribeParam.setNumber(courierNo);
+        subscribeParam.setKey(key);
+
+        SubscribeReq subscribeReq = new SubscribeReq();
+        subscribeReq.setSchema(ApiInfoConstant.SUBSCRIBE_SCHEMA);
+        subscribeReq.setParam(new Gson().toJson(subscribeParam));
+
+        IBaseClient subscribe = new Subscribe();
+        try {
+            LOG.debug("快递信息订阅参数: {}",subscribeReq);
+            HttpResult execute = subscribe.execute(subscribeReq);
+            LOG.info("快递信息订阅返回参数: {}",execute);
+            if (execute.getStatus() != 200) {
+                throw new BizException(execute.getError());
+            }
+            JSONObject jsonObject = JSON.parseObject(execute.getBody());
+            if (!"200".equals(jsonObject.getString("returnCode"))) {
+                throw new BizException(jsonObject.getString("message"));
+            }
+            return true;
+        } catch (Exception e) {
+            LOG.error(e.getLocalizedMessage());
+            e.printStackTrace();
+            throw new BizException(e.getMessage());
+        }
+    }
+
+    private String getCompanyConstant(CompanyEnum companyEnum) {
+        switch (companyEnum) {
+            case JD: return CompanyConstant.JD;
+            case EMS: return CompanyConstant.EMS;
+            case YUNDA: return CompanyConstant.YD;
+            case SHENTONG: return CompanyConstant.ST;
+            case SHUNFENG: return CompanyConstant.SF;
+            case YUANTONG: return CompanyConstant.YT;
+            case ZHONGTONG: return CompanyConstant.ZT;
+            case ZHAIJISONG: return CompanyConstant.ZJS;
+            case DEBANGKUAIDI: return CompanyConstant.DB;
+            case HUITONGKUAIDI: return CompanyConstant.HT;
+            default: return null;
+        }
+    }
+
+    public static void main(String[] args) {
+        Courier100ServiceImpl courier100Service = new Courier100ServiceImpl();
+        courier100Service.queryTrack(CompanyEnum.DEBANGKUAIDI,"75606690482924");
+    }
+}

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

@@ -18,6 +18,7 @@ public enum OrderCacheEnum {
     LOCK_REFUND_ORDER_MALL("商城退款锁"),
     LOCK_ORDER_NO_MALL("订单号锁"),
     LOCK_STOCK_MALL("商品库存锁"),
+    COURIER_LOCK("快递单号锁"),
 
     ;
     /***

+ 37 - 0
cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/OmsOrderCourierMapper.java

@@ -0,0 +1,37 @@
+package com.yonge.cooleshow.mbg.mapper;
+
+import com.yonge.cooleshow.mbg.model.OmsOrderCourier;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * Description
+ *
+ * @author: feng-ji
+ * @date: 2022-10-28
+ */
+public interface OmsOrderCourierMapper {
+    int deleteByPrimaryKey(Long id);
+
+    int insert(OmsOrderCourier record);
+
+    int insertSelective(OmsOrderCourier record);
+
+    OmsOrderCourier selectByPrimaryKey(Long id);
+
+    int updateByPrimaryKeySelective(OmsOrderCourier record);
+
+    int updateByPrimaryKey(OmsOrderCourier record);
+
+    int batchInsert(@Param("list") List<OmsOrderCourier> list);
+
+    /**
+     * 更新物流信息
+     */
+    void updateByCourierNo(@Param("courierNo") String courierNo, @Param("logistics") String logistics);
+
+    /**
+     * 查询物流信息
+     */
+    OmsOrderCourier queryByCourierNo(@Param("courierNo") String deliverySn);
+}

+ 1 - 1
cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/OmsOrder.java

@@ -55,7 +55,7 @@ public class OmsOrder implements Serializable {
     @ApiModelProperty(value = "订单来源:0->PC订单;1->app订单")
     private Integer sourceType;
 
-    @ApiModelProperty(value = "订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单")
+    @ApiModelProperty(value = "订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单 6 ->未拉起支付")
     private Integer status;
 
     @ApiModelProperty(value = "订单类型:0->正常订单;1->秒杀订单")

+ 75 - 0
cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/OmsOrderCourier.java

@@ -0,0 +1,75 @@
+package com.yonge.cooleshow.mbg.model;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * 快递信息表
+ */
+public class OmsOrderCourier {
+    @ApiModelProperty("")
+    private Long id;
+
+    /**
+    * 快递公司
+    */
+    @ApiModelProperty("快递公司名")
+    private String company;
+
+    /**
+     * 订单号
+     */
+    @ApiModelProperty("订单id")
+    private Long orderId;
+
+    /**
+     * 快递单号
+     */
+    @ApiModelProperty("快递单号")
+    private String courierNo;
+
+    /**
+     * 物流信息
+     */
+    @ApiModelProperty("物流信息 ")
+    private String logistics;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getCompany() {
+        return company;
+    }
+
+    public void setCompany(String company) {
+        this.company = company;
+    }
+
+    public Long getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Long orderId) {
+        this.orderId = orderId;
+    }
+
+    public String getCourierNo() {
+        return courierNo;
+    }
+
+    public void setCourierNo(String courierNo) {
+        this.courierNo = courierNo;
+    }
+
+    public String getLogistics() {
+        return logistics;
+    }
+
+    public void setLogistics(String logistics) {
+        this.logistics = logistics;
+    }
+}

+ 114 - 0
cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/OmsOrderCourierMapper.xml

@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yonge.cooleshow.mbg.mapper.OmsOrderCourierMapper">
+  <resultMap id="BaseResultMap" type="com.yonge.cooleshow.mbg.model.OmsOrderCourier">
+    <!--@mbg.generated-->
+    <!--@Table oms_order_courier-->
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="company" jdbcType="VARCHAR" property="company" />
+    <result column="order_id" jdbcType="BIGINT" property="orderId" />
+    <result column="courier_no" jdbcType="VARCHAR" property="courierNo" />
+    <result column="logistics" jdbcType="LONGVARCHAR" property="logistics" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    <!--@mbg.generated-->
+    id, company, order_id, courier_no, logistics
+  </sql>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    <!--@mbg.generated-->
+    select 
+    <include refid="Base_Column_List" />
+    from oms_order_courier
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    <!--@mbg.generated-->
+    delete from oms_order_courier
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.yonge.cooleshow.mbg.model.OmsOrderCourier" useGeneratedKeys="true">
+    <!--@mbg.generated-->
+    insert into oms_order_courier (company, order_id, courier_no, 
+      logistics)
+    values (#{company,jdbcType=VARCHAR}, #{orderId,jdbcType=BIGINT}, #{courierNo,jdbcType=VARCHAR}, 
+      #{logistics,jdbcType=LONGVARCHAR})
+  </insert>
+  <insert id="insertSelective" keyColumn="id" keyProperty="id" parameterType="com.yonge.cooleshow.mbg.model.OmsOrderCourier" useGeneratedKeys="true">
+    <!--@mbg.generated-->
+    insert into oms_order_courier
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="company != null">
+        company,
+      </if>
+      <if test="orderId != null">
+        order_id,
+      </if>
+      <if test="courierNo != null">
+        courier_no,
+      </if>
+      <if test="logistics != null">
+        logistics,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="company != null">
+        #{company,jdbcType=VARCHAR},
+      </if>
+      <if test="orderId != null">
+        #{orderId,jdbcType=BIGINT},
+      </if>
+      <if test="courierNo != null">
+        #{courierNo,jdbcType=VARCHAR},
+      </if>
+      <if test="logistics != null">
+        #{logistics,jdbcType=LONGVARCHAR},
+      </if>
+    </trim>
+  </insert>
+  <update id="updateByPrimaryKeySelective" parameterType="com.yonge.cooleshow.mbg.model.OmsOrderCourier">
+    <!--@mbg.generated-->
+    update oms_order_courier
+    <set>
+      <if test="company != null">
+        company = #{company,jdbcType=VARCHAR},
+      </if>
+      <if test="orderId != null">
+        order_id = #{orderId,jdbcType=BIGINT},
+      </if>
+      <if test="courierNo != null">
+        courier_no = #{courierNo,jdbcType=VARCHAR},
+      </if>
+      <if test="logistics != null">
+        logistics = #{logistics,jdbcType=LONGVARCHAR},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.yonge.cooleshow.mbg.model.OmsOrderCourier">
+    <!--@mbg.generated-->
+    update oms_order_courier
+    set company = #{company,jdbcType=VARCHAR},
+      order_id = #{orderId,jdbcType=BIGINT},
+      courier_no = #{courierNo,jdbcType=VARCHAR},
+      logistics = #{logistics,jdbcType=LONGVARCHAR}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <insert id="batchInsert" keyColumn="id" keyProperty="id" parameterType="map" useGeneratedKeys="true">
+    <!--@mbg.generated-->
+    insert into oms_order_courier
+    (company, order_id, courier_no, logistics)
+    values
+    <foreach collection="list" item="item" separator=",">
+      (#{item.company,jdbcType=VARCHAR}, #{item.orderId,jdbcType=BIGINT}, #{item.courierNo,jdbcType=VARCHAR}, 
+        #{item.logistics,jdbcType=LONGVARCHAR})
+    </foreach>
+  </insert>
+
+  <update id="updateByCourierNo">
+    update oms_order_courier set logistics = #{logistics} where courier_no = #{courierNo};
+  </update>
+
+  <select id="queryByCourierNo" resultMap="BaseResultMap">
+    select * from oms_order_courier where courier_no = #{courierNo} order by  id desc limit  1
+    </select>
+</mapper>

+ 22 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderController.java

@@ -4,9 +4,11 @@ import com.yonge.cooleshow.mall.common.api.CommonPage;
 import com.yonge.cooleshow.mall.common.api.CommonResult;
 import com.yonge.cooleshow.mall.common.enums.OrderCacheEnum;
 import com.yonge.cooleshow.mbg.model.OmsOrder;
+import com.yonge.cooleshow.mbg.model.OmsOrderCourier;
 import com.yonge.cooleshow.portal.domain.ConfirmOrderResult;
 import com.yonge.cooleshow.portal.domain.OmsOrderDetail;
 import com.yonge.cooleshow.portal.domain.OrderParam;
+import com.yonge.cooleshow.portal.service.OmsOrderCourierService;
 import com.yonge.cooleshow.portal.service.OmsPortalOrderService;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.util.StringUtil;
@@ -37,6 +39,8 @@ public class OmsPortalOrderController {
     private OmsPortalOrderService portalOrderService;
 
 
+    @Autowired
+    private OmsOrderCourierService orderCourierService;
 
     @Value("${message.debugMode}")
     private boolean debugMode;
@@ -214,4 +218,22 @@ public class OmsPortalOrderController {
                                }, 60L, TimeUnit.SECONDS);
         return CommonResult.success(null);
     }
+
+
+    @ApiOperation("用户查询物流")
+    @GetMapping(value = "/selectCourier")
+    @ResponseBody
+    public CommonResult<OmsOrderCourier> selectCourier(@RequestParam String  deliverySn) {
+        OmsOrderCourier omsOrderCourier = orderCourierService.getCourierInfo(deliverySn);
+        return CommonResult.success(omsOrderCourier);
+    }
+
+
+
+    @ApiOperation("用户刷新物流信息")
+    @GetMapping(value = "/refreshCourier")
+    @ResponseBody
+    public CommonResult refreshCourier(@RequestParam String  deliverySn) throws InterruptedException {
+        return CommonResult.success(orderCourierService.refreshCourier(deliverySn));
+    }
 }

+ 39 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/open/OpenShareController.java

@@ -1,12 +1,18 @@
 package com.yonge.cooleshow.portal.controller.open;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.mall.common.api.CommonResult;
+import com.yonge.cooleshow.mall.common.courier.domain.CourierInfo;
+import com.yonge.cooleshow.mall.common.courier.service.CourierService;
 import com.yonge.cooleshow.portal.dto.ShareProductVo;
 import com.yonge.cooleshow.portal.dto.ShareProfitParam;
+import com.yonge.cooleshow.portal.service.OmsOrderCourierService;
+import com.yonge.cooleshow.portal.service.OmsPortalOrderService;
 import com.yonge.cooleshow.portal.service.PmsPortalProductService;
 import com.yonge.toolset.base.util.StringUtil;
 import io.swagger.annotations.Api;
@@ -14,9 +20,13 @@ import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 @RestController
 @RequestMapping("/open")
@@ -30,6 +40,11 @@ public class OpenShareController extends BaseController {
     @Autowired
     private PmsPortalProductService portalProductService;
 
+    @Autowired
+    private OmsOrderCourierService orderCourierService;
+
+    @Autowired
+    private CourierService courierService;
 
     @ApiOperation(value = "老师商品分享分润")
     @PostMapping(value="/productProfit")
@@ -49,4 +64,28 @@ public class OpenShareController extends BaseController {
         }
         return CommonResult.failed("分享功能暂未开放");
     }
+
+
+
+    @ApiOperation(value = "快递信息回调")
+    @PostMapping(value="/courierCallback", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
+    @ResponseBody
+    public Object courierCallback( String param) {
+        log.info("快递信息回调:{}",param);
+
+        JSONObject jsonObject = JSON.parseObject(param);
+        String data = jsonObject.getString("lastResult");
+        CourierInfo courierInfos = courierService.getCourierInfos(data);
+
+        // 保存快递信息
+        orderCourierService.updateCourierInfo(courierInfos);
+        Map<String,Object> result = new HashMap<>();
+        result.put("result",true);
+        result.put("returnCode","200");
+        result.put("message","成功");
+
+        return result;
+    }
+
+
 }

+ 2 - 1
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dao/PortalOrderDao.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.portal.dao;
 
 import com.yonge.cooleshow.mbg.model.OmsOrderItem;
 import com.yonge.cooleshow.portal.domain.OmsOrderDetail;
+import com.yonge.cooleshow.portal.domain.ProductStock;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -37,5 +38,5 @@ public interface PortalOrderDao {
      */
     int releaseSkuStockLock(@Param("itemList") List<OmsOrderItem> orderItemList);
 
-    int releaseProductStockLock(@Param("itemList") List<OmsOrderItem> orderItemList);
+    int releaseProductStockLock(@Param("itemList") List<ProductStock> orderItemList);
 }

+ 30 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsOrderCourierService.java

@@ -0,0 +1,30 @@
+package com.yonge.cooleshow.portal.service;
+
+import com.yonge.cooleshow.mall.common.courier.domain.CourierInfo;
+import com.yonge.cooleshow.mbg.model.OmsOrderCourier;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-10-31
+ */
+public interface OmsOrderCourierService {
+
+
+    @Transactional
+    void updateCourierInfo(CourierInfo courierInfos);
+
+    /**
+     * 查询物流
+     */
+    OmsOrderCourier getCourierInfo(String deliverySn);
+
+    /**
+     * 刷新物流信息
+     * @return
+     */
+    @Transactional
+    OmsOrderCourier refreshCourier(String deliverySn) throws InterruptedException;
+}

+ 68 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsOrderCourierServiceImpl.java

@@ -0,0 +1,68 @@
+package com.yonge.cooleshow.portal.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.mall.common.courier.domain.CourierInfo;
+import com.yonge.cooleshow.mall.common.courier.enums.CompanyEnum;
+import com.yonge.cooleshow.mall.common.courier.service.CourierService;
+import com.yonge.cooleshow.mall.common.enums.OrderCacheEnum;
+import com.yonge.cooleshow.mbg.mapper.OmsOrderCourierMapper;
+import com.yonge.cooleshow.mbg.model.OmsOrderCourier;
+import com.yonge.cooleshow.portal.service.OmsOrderCourierService;
+import com.yonge.toolset.base.exception.BizException;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-10-31
+ */
+@Service
+public class OmsOrderCourierServiceImpl implements OmsOrderCourierService {
+
+    @Autowired
+    private OmsOrderCourierMapper omsOrderCourierMapper;
+    @Autowired
+    private CourierService courierService;
+
+    @Autowired
+    private RedissonClient redissonClient;
+
+    @Override
+    public void updateCourierInfo(CourierInfo courierInfos) {
+        String courierNo = courierInfos.getCourierNo();
+        String logistics = JSON.toJSONString(courierInfos.getLogisticsList());
+        omsOrderCourierMapper.updateByCourierNo(courierNo,logistics);
+    }
+
+    @Override
+    public OmsOrderCourier getCourierInfo(String deliverySn) {
+        OmsOrderCourier omsOrderCourier = omsOrderCourierMapper.queryByCourierNo(deliverySn);
+        if (omsOrderCourier == null) {
+            throw new BizException("未找到物流信息");
+        }
+        return omsOrderCourier;
+    }
+
+    @Override
+    public OmsOrderCourier refreshCourier(String deliverySn) throws InterruptedException {
+        RLock lock = redissonClient.getLock(OrderCacheEnum.COURIER_LOCK.getCode() + deliverySn);
+        boolean b = lock.tryLock(0,1, TimeUnit.HOURS);
+
+        OmsOrderCourier omsOrderCourier = omsOrderCourierMapper.queryByCourierNo(deliverySn);
+        if (b) {
+            if (omsOrderCourier == null) {
+                throw new BizException("未找到物流信息");
+            }
+            CourierInfo courierInfo = courierService.queryTrack(CompanyEnum.descOf(omsOrderCourier.getCompany()),
+                                                                omsOrderCourier.getCourierNo());
+            updateCourierInfo(courierInfo);
+        }
+        return omsOrderCourierMapper.queryByCourierNo(deliverySn);
+    }
+}

+ 41 - 12
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java

@@ -191,6 +191,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
                 orderItem.setCouponAmount(new BigDecimal(0));
             }
         } else {
+            BigDecimal totalAmount = calcTotalAmount(orderItemList);
             // todo 使用优惠券 远程调用获取优惠券金额
             // SmsCouponHistoryDetail couponHistoryDetail = getUseCoupon(cartPromotionItemList, orderParam.getCouponId());
             //     if (couponHistoryDetail == null) {
@@ -198,14 +199,14 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             // }
             //对下单商品的优惠券进行处理
             HttpResponseResult<CouponInfoApi> couponInfoApiHttpResponseResult = adminFeignService.queryCouponOrderPageInfo(
-                    currentMember.getId(), orderParam.getCouponId(), orderParam.getOrderAmount(),
+                    currentMember.getId(), orderParam.getCouponId(), totalAmount,
                     orderParam.getPlatformType());
             CouponInfoApi data = couponInfoApiHttpResponseResult.getData();
             if(data != null) {
                 couponAmount = data.getDiscountedPrices();
             }
-            if (couponAmount.compareTo(orderParam.getOrderAmount()) > 0) {
-                couponAmount = orderParam.getOrderAmount();
+            if (couponAmount.compareTo(totalAmount) > 0) {
+                couponAmount = totalAmount;
             }
             handleCouponAmount(orderItemList, couponAmount);
         }
@@ -330,7 +331,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         result.put("order", order);
         result.put("orderItemList", orderItemList);
         if (order.getPayAmount().compareTo(BigDecimal.ZERO) == 0) {
-            paySuccess(order.getId(),order.getPayType());
+            paySuccess(order.getId(),3);
             order.setStatus(1);
         }
         return result;
@@ -494,7 +495,23 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             //解除订单商品库存锁定
             if (!CollectionUtils.isEmpty(orderItemList)) {
                 portalOrderDao.releaseSkuStockLock(orderItemList);
-                portalOrderDao.releaseProductStockLock(orderItemList);
+                Map<Long, List<OmsOrderItem>> collect = orderItemList
+                        .stream()
+                        .collect(Collectors.groupingBy(OmsOrderItem::getProductId));
+                List<ProductStock> productStockList = new ArrayList<>();
+                for (Map.Entry<Long, List<OmsOrderItem>> entry : collect.entrySet()) {
+                    ProductStock stock = new ProductStock();
+                    stock.setProductId(entry.getKey());
+                    List<OmsOrderItem> value = entry.getValue();
+                    if (CollectionUtils.isEmpty(value)) {
+                        continue;
+                    }
+                    int sum = value.stream().mapToInt(OmsOrderItem::getProductQuantity).sum();
+                    stock.setStock(sum);
+                    productStockList.add(stock);
+                }
+
+                portalOrderDao.releaseProductStockLock(productStockList);
             }
             //修改优惠券使用状态
             // updateCouponStatus(cancelOrder.getCouponId(), cancelOrder.getMemberId(), 0);
@@ -531,8 +548,8 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         // if (!member.getId().equals(order.getMemberId())) {
         //     Asserts.fail("不能确认他人订单!");
         // }
-        if (order.getStatus() != 2) {
-            Asserts.fail("该订单还未发货!");
+        if (order.getStatus() == 0 || order.getStatus() == 6) {
+            Asserts.fail("该订单还未付款!");
         }else if (order.getStatus() == 3) {
             Asserts.fail("已确认收货!");
         }
@@ -1059,16 +1076,18 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         }
 
         // 判断支付金额 是否正确
-        BigDecimal pay_amt;
+        BigDecimal pay_amt = null;
         if (data != null) {
             pay_amt = new BigDecimal(data.getExecutePaymentCallBack().getPayAmt());
 
             orderPayment.setTransNo(data.getId());
         } else {
-            pay_amt = new BigDecimal(payment.getPayAmt());
+            if (payment.getPayAmt() != null) {
+                pay_amt = new BigDecimal(payment.getPayAmt());
+            }
             orderPayment.setTransNo(payment.getId());
         }
-        if (pay_amt.compareTo(detail.getPayAmount()) != 0) {
+        if (pay_amt != null && pay_amt.compareTo(detail.getPayAmount()) != 0) {
             orderPayment.setPayFailMsg("订单金额和实际支付金额不符");
             orderRefund(orderPayment,pay_amt.setScale(2, RoundingMode.HALF_UP).toString(),orderPayment.getTransNo(),detail);
         } else {
@@ -1323,8 +1342,18 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         BigDecimal reduce = orderItemList.stream()
                                          .map(omsOrderItem -> omsOrderItem.getCouponAmount().multiply(BigDecimal.valueOf(omsOrderItem.getProductQuantity())))
                                          .reduce(BigDecimal.ZERO, BigDecimal::add);
-        OmsOrderItem omsOrderItem = orderItemList.get(0);
-        omsOrderItem.setPrecisionAmount(coupon.subtract(reduce));
+        BigDecimal precisionAmount = coupon.subtract(reduce);
+        for (OmsOrderItem omsOrderItem : orderItemList) {
+            BigDecimal multiply = omsOrderItem.getProductPrice()
+                                              .multiply(BigDecimal.valueOf(omsOrderItem.getProductQuantity())).subtract(omsOrderItem.getCouponAmount().multiply(BigDecimal.valueOf(omsOrderItem.getProductQuantity())));
+            if (multiply.compareTo(precisionAmount) >=0) {
+                omsOrderItem.setPrecisionAmount(precisionAmount);
+                break;
+            } else {
+                omsOrderItem.setPrecisionAmount(multiply);
+                precisionAmount = precisionAmount.subtract(multiply);
+            }
+        }
 
     }
 

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

@@ -94,12 +94,13 @@
         </foreach>
     </update>
 
+
     <update id="releaseProductStockLock">
         UPDATE pms_product
         SET
         lock_stock = CASE id
         <foreach collection="itemList" item="item">
-            WHEN #{item.productId} THEN lock_stock - #{item.productQuantity}
+            WHEN #{item.productId} THEN lock_stock - #{item.stock}
         </foreach>
         END
         WHERE

+ 19 - 0
cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/VirtualNumberTask.java

@@ -0,0 +1,19 @@
+package com.yonge.cooleshow.task.jobs;
+
+import com.yonge.cooleshow.api.feign.AdminFeignService;
+import com.yonge.cooleshow.task.core.BaseTask;
+import com.yonge.cooleshow.task.core.TaskException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class VirtualNumberTask extends BaseTask {
+
+    @Autowired
+    private AdminFeignService adminFeignService;
+
+    @Override
+    public void execute() throws TaskException {
+        Object o = adminFeignService.virtualNumber();
+    }
+}

+ 80 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/CourseCoursewareController.java

@@ -0,0 +1,80 @@
+package com.yonge.cooleshow.admin.controller;
+
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.mybatis.support.PageUtil;
+
+import com.yonge.toolset.base.util.StringUtil;
+import io.swagger.annotations.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+import com.yonge.cooleshow.biz.dal.vo.CourseCoursewareVo;
+import com.yonge.cooleshow.biz.dal.dto.search.CourseCoursewareSearch;
+import com.yonge.cooleshow.biz.dal.entity.CourseCourseware;
+import com.yonge.cooleshow.biz.dal.service.CourseCoursewareService;
+
+import java.util.Date;
+
+@RestController
+@RequestMapping("/courseCourseware")
+@Api(value = "课件表", tags = "课件表")
+public class CourseCoursewareController extends BaseController {
+
+    @Autowired
+    private CourseCoursewareService courseCoursewareService;
+    
+    /**
+     * 查询分页
+     */
+    @PostMapping("/page")
+    @ApiOperation(value = "查询分页", notes = "传入courseCoursewareSearch")
+    public HttpResponseResult<PageInfo<CourseCoursewareVo>> page(@RequestBody CourseCoursewareSearch query) {
+		IPage<CourseCoursewareVo> pages = courseCoursewareService.selectPage(PageUtil.getPage(query), query);
+        return succeed(PageUtil.pageInfo(pages));
+	}
+    
+    /**
+	 * 新增或修改
+	 */
+    @PostMapping("/submit")
+    @ApiOperation(value = "新增或修改", notes = "传入courseCourseware")
+	public HttpResponseResult<CourseCourseware> submit(@Valid @RequestBody CourseCourseware courseCourseware) {
+		if (courseCourseware.getId() != null) {
+			courseCourseware.setUpdateTime(new Date());
+		} else {
+			courseCourseware.setUpdateTime(new Date());
+			courseCourseware.setCreateTime(new Date());
+		}
+		if (courseCourseware.getUserId() == null) {
+			throw new BizException("用户id不能为空");
+		}
+		courseCourseware.setClientType(ClientEnum.TEACHER);
+        return succeed(courseCoursewareService.submit(courseCourseware));
+    }
+
+ 	/**
+	 * 删除
+	 */
+	@PostMapping("/remove/{id}")
+	@ApiOperation(value = "删除", notes = "传入id")
+	public HttpResponseResult remove(@PathVariable Long id ) {
+		return status(courseCoursewareService.removeById(id));
+	}
+
+
+	/**
+	 * 删除
+	 */
+	@PostMapping("/remove")
+	@ApiOperation(value = "批量删除", notes = "传入id")
+	public HttpResponseResult remove(@RequestParam String ids ) {
+		return status(courseCoursewareService.removeByIds(StringUtil.toLongList(ids)));
+	}
+}

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

@@ -3,6 +3,7 @@ package com.yonge.cooleshow.admin.controller;
 
 import com.yonge.cooleshow.biz.dal.dto.ImGroupSearchDto;
 import com.yonge.cooleshow.biz.dal.entity.ImGroup;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.service.ImGroupService;
 import com.yonge.cooleshow.biz.dal.service.SysUserService;
 import com.yonge.cooleshow.common.controller.BaseController;
@@ -61,7 +62,7 @@ public class ImGroupController extends BaseController {
     @ApiOperation("退出群聊")
     @PostMapping(value = "/quit/{groupId}")
     public HttpResponseResult quit(@ApiParam(value = "群编号", required = true) @PathVariable("groupId") String groupId) throws Exception {
-        imGroupService.quit(groupId,sysUserService.getUserId());
+        imGroupService.quit(groupId,sysUserService.getUserId(), ClientEnum.STUDENT);
         return succeed();
     }
 }

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

@@ -8,10 +8,19 @@ import com.yonge.cooleshow.biz.dal.dto.MusicAlbumSheetSortDto;
 import com.yonge.cooleshow.biz.dal.dto.AdjustModel;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumDetailSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicAlbumSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicSheetOrderSearch;
 import com.yonge.cooleshow.biz.dal.entity.MusicAlbum;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
+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.StudentMusicAlbumOrderVo;
+import com.yonge.cooleshow.biz.dal.vo.StudentMusicSheetOrderVo;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.base.page.QueryInfo;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.vo.AlbumDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.MusicAlbumVo;
@@ -53,6 +62,12 @@ public class MusicAlbumController extends BaseController {
             return failed("用户信息获取失败");
         }
 
+
+        String[] split = musicAlbum.getAlbumTag().split(",");
+        if (split.length >3) {
+            throw new BizException("专辑标签数不能超过3个");
+        }
+
         musicAlbum.setCreateBy(sysUser.getId());
         musicAlbum.setCreateTime(new Date());
         musicAlbum.setUpdateBy(sysUser.getId());
@@ -88,6 +103,12 @@ public class MusicAlbumController extends BaseController {
         if (YesOrNoEnum.YES.getCode().equals(service.getAlbumStatus().getCode())) {
             return failed("启用状态不许修改");
         }
+
+        String[] split = musicAlbum.getAlbumTag().split(",");
+        if (split.length >3) {
+            throw new BizException("专辑标签数不能超过3个");
+        }
+
         musicAlbum.setUpdateBy(sysUser.getId());
         musicAlbum.setUpdateTime(new Date());
         return succeed(musicAlbumService.updateMusicAlbum(musicAlbum));
@@ -224,6 +245,14 @@ public class MusicAlbumController extends BaseController {
         return succeed();
     }
 
+    /**
+     * 学生详情-乐谱
+     */
+    @PostMapping(value = "/student", consumes="application/json", produces="application/json")
+    @ApiOperation(value = "学生详情-专辑", httpMethod="POST", consumes="application/json", produces="application/json")
+    public HttpResponseResult<PageInfo<StudentMusicAlbumOrderVo>> student(@Valid @RequestBody StudentMusicSheetOrderSearch query) {
+        return succeed(PageUtil.pageInfo(musicAlbumService.selectStudentOrderPage(PageUtil.getPage(query),query)));
+    }
 
 
 }

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

@@ -131,9 +131,11 @@ public class MusicSheetController extends BaseController {
 
         musicSheetDto.setUserId(sysUser.getId());
         musicSheetDto.setAuditStatus(AuthStatusEnum.PASS);
+        musicSheetDto.setFirstPassAuditTime(new Date());
         musicSheetDto.setDelFlag(false);
         musicSheetDto.setSourceType(SourceTypeEnum.PLATFORM);
 
+        musicSheetDto.setFavoriteCount(0);
         musicSheetDto.setCreateBy(sysUser.getId());
         musicSheetDto.setCreateTime(new Date());
         musicSheetService.saveMusicSheet(musicSheetDto,sysUser.getId());

+ 94 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ReturnVisitController.java

@@ -0,0 +1,94 @@
+package com.yonge.cooleshow.admin.controller;
+
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.mybatis.support.PageUtil;
+
+import com.yonge.toolset.base.util.StringUtil;
+import io.swagger.annotations.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+
+import com.yonge.cooleshow.biz.dal.vo.ReturnVisitVo;
+import com.yonge.cooleshow.biz.dal.dto.search.ReturnVisitSearch;
+import com.yonge.cooleshow.biz.dal.entity.ReturnVisit;
+import com.yonge.cooleshow.biz.dal.service.ReturnVisitService;
+
+import java.util.Date;
+
+@RestController
+@RequestMapping("/returnVisit")
+@Api(value = "回访表", tags = "回访表")
+public class ReturnVisitController extends BaseController {
+
+    @Autowired
+    private ReturnVisitService returnVisitService;
+
+	@Resource
+	private SysUserFeignService sysUserFeignService;
+
+	/**
+     * 查询单条
+     */
+    @GetMapping("/detail/{id}")
+    @ApiOperation(value = "详情", notes = "传入id")
+    public HttpResponseResult<ReturnVisitVo> detail(@PathVariable("id") Long id) {
+    	return succeed(returnVisitService.detail(id));
+	}
+    
+    /**
+     * 查询分页
+     */
+    @PostMapping("/page")
+    @ApiOperation(value = "查询分页", notes = "传入returnVisitSearch")
+    public HttpResponseResult<PageInfo<ReturnVisitVo>> page(@RequestBody ReturnVisitSearch query) {
+		IPage<ReturnVisitVo> pages = returnVisitService.selectPage(PageUtil.getPage(query), query);
+        return succeed(PageUtil.pageInfo(pages));
+	}
+    
+    /**
+	 * 新增
+	 */
+	@PostMapping("/save")
+	@ApiOperation(value = "新增", notes = "传入returnVisit")
+	public HttpResponseResult save(@Valid @RequestBody ReturnVisit returnVisit) {
+		SysUser user = sysUserFeignService.queryUserInfo();
+		if (user == null || null == user.getId()) {
+			return failed(HttpStatus.FORBIDDEN, "请登录");
+		}
+		returnVisit.setCreateBy(user.getId());
+		returnVisit.setCreateTime(new Date());
+
+    	return status(returnVisitService.save(returnVisit));
+	}
+    
+    /**
+	 * 修改
+	 */
+	// @PostMapping("/update")
+	@ApiOperation(value = "修改", notes = "传入returnVisit")
+	public HttpResponseResult update(@Valid @RequestBody ReturnVisit returnVisit) {
+        return status(returnVisitService.updateById(returnVisit));
+	}
+
+
+ 	/**
+	 * 删除
+	 */
+	@PostMapping("/remove")
+	@ApiOperation(value = "删除", notes = "传入ids")
+	public HttpResponseResult remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+        if (StringUtil.isEmpty(ids)) {
+			return failed("参数不能为空");
+		}
+		return status(returnVisitService.removeByIds(StringUtil.toLongList(ids)));
+	}
+}

+ 156 - 1
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/VideoLessonController.java

@@ -1,15 +1,28 @@
 package com.yonge.cooleshow.admin.controller;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.admin.io.request.coupon.CouponIssueVo;
+import com.yonge.cooleshow.admin.io.request.course.CourseRelationVo;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dto.AdjustModel;
+import com.yonge.cooleshow.biz.dal.dto.VideoLessonGroupDetailDto;
 import com.yonge.cooleshow.biz.dal.dto.search.VideoGroupSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.VideoLessonSearch;
+import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
 import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroup;
 import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroupDetail;
+import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.course.CourseTypeEnum;
+import com.yonge.cooleshow.biz.dal.queryInfo.CourseRelationQueryInfo;
 import com.yonge.cooleshow.biz.dal.service.VideoLessonGroupDetailService;
 import com.yonge.cooleshow.biz.dal.service.VideoLessonGroupService;
+import com.yonge.cooleshow.biz.dal.valid.UpdateGroup;
+import com.yonge.cooleshow.biz.dal.wrapper.course.CourseRelationWrapper;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.util.StringUtil;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.valid.AddGroup;
@@ -22,16 +35,21 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import javax.validation.Valid;
 import javax.validation.constraints.NotNull;
 import java.util.Date;
 import java.util.List;
 
+import static com.yonge.cooleshow.common.entity.HttpResponseResult.succeed;
+
 /**
  * @Author: cy
  * @Date: 2022/4/2
@@ -115,6 +133,18 @@ public class VideoLessonController extends BaseController {
         return succeed(PageUtil.pageInfo(lessonGroupService.queryGroupHistoryList(PageUtil.getPage(search), search)));
     }
 
+    @ApiOperation(value = "老师详情-视频课详情-推荐/赠送内容", httpMethod = "POST", consumes = "application/json", produces = "application/json")
+    @PostMapping(value = "/queryRelationMusicAlbum", consumes = "application/json", produces = "application/json")
+    public HttpResponseResult<PageInfo<CourseRelationWrapper.MusicAlbumInfo>> queryRelationMusicAlbum(@RequestBody CourseRelationVo.CourseRelationQuery query) {
+
+        query.setCourseType(CourseTypeEnum.VIDEO);
+        IPage<CourseRelationWrapper.MusicAlbumInfo> iPage = lessonGroupService
+                .queryRelationMusicAlbum(PageUtil.getPage(query), CourseRelationQueryInfo.from(query.jsonString()));
+        return succeed(PageUtil.pageInfo(iPage));
+
+    }
+
+
     /**
      * @Description: 审核-根据视频课组id查视频课详情
      * @Author: cy
@@ -175,9 +205,15 @@ public class VideoLessonController extends BaseController {
         if (shelvesVo.getShelvesFlag() == 0 && StringUtil.isEmpty(shelvesVo.getShelvesReason())) {
             return failed( "下架必须要有下架原因");
         }
+        VideoLessonGroup videoLessonGroup = lessonGroupService.getById(shelvesVo.getId());
+        if (videoLessonGroup.getAuditStatus() ==null || !videoLessonGroup.getAuditStatus().equals(AuthStatusEnum.PASS)) {
+            return failed("审核通过才能上架");
+        }
 
         shelvesVo.setShelvesId(user.getId());
-        shelvesVo.setShelvesTime(new Date());
+        if (shelvesVo.getShelvesFlag() == 1) {
+            shelvesVo.setShelvesTime(new Date());
+        }
         shelvesVo.setClientType(ClientEnum.SYSTEM);
         lessonGroupService.updateShelves(shelvesVo);
         return succeed();
@@ -188,4 +224,123 @@ public class VideoLessonController extends BaseController {
     public HttpResponseResult<CountVideoGroupVo> countVideoGroup() {
         return succeed(lessonGroupService.countVideoGroup());
     }
+
+
+    /**
+     * @Description: 新增视频课组&视频课
+     * @Author: cy
+     * @Date: 2022/4/1
+     */
+    @ApiOperation(value = "新增视频课组&视频课", httpMethod = "POST", consumes = "application/json", produces = "application/json")
+    @PostMapping(value = "/add", consumes = "application/json", produces = "application/json")
+    public HttpResponseResult<Object> add( @RequestBody VideoLessonVo lessonVo) {
+
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        lessonVo.setUserBy(user.getId());
+        if (lessonVo.getLessonGroup().getTeacherId() == null) {
+            return failed("请设置所属老师");
+        }
+        SysUser sysUser = sysUserFeignService.queryUserById(lessonVo.getLessonGroup().getTeacherId());
+
+        if (sysUser == null || sysUser.getId() == null) {
+            return failed("用户信息获取失败");
+        }
+        if (lessonVo.getLessonGroup().getDraftFlag().equals(YesOrNoEnum.NO) && CollectionUtils.isEmpty(lessonVo.getLessonList())) {
+            return failed("课程不能为空");
+        }
+        Long add = lessonGroupService.add(lessonVo, sysUser);
+        return succeed(add);
+    }
+
+    /**
+     * @Description: 修改视频课组&视频课
+     * @Author: cy
+     * @Date: 2022/4/7
+     */
+    @ApiOperation(value = "修改视频课组&视频课", httpMethod = "POST", consumes = "application/json", produces = "application/json")
+    @PostMapping(value = "/update", consumes = "application/json", produces = "application/json")
+    public HttpResponseResult<Object> update(@RequestBody VideoLessonVo lessonVo) {
+
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        lessonVo.setUserBy(user.getId());
+
+        if (lessonVo.getLessonGroup().getTeacherId() == null) {
+            return failed("请设置所属老师");
+        }
+        SysUser sysUser = sysUserFeignService.queryUserById(lessonVo.getLessonGroup().getTeacherId());
+
+        if (sysUser == null || sysUser.getId() == null) {
+            return failed("用户信息获取失败");
+        }
+        if (lessonVo.getLessonGroup().getDraftFlag().equals(YesOrNoEnum.NO) && CollectionUtils.isEmpty(lessonVo.getLessonList())) {
+            return failed("课程不能为空");
+        }
+        return succeed(lessonGroupService.update(lessonVo, sysUser));
+    }
+
+
+
+    /**
+     * 置顶
+     */
+    @PostMapping("/top/{id}")
+    @ApiOperation(value = "置顶", notes = "传入id")
+    public HttpResponseResult<Boolean> top(@ApiParam(value = "视频课编号", required = true)  @PathVariable Long id) {
+        if (StringUtil.isEmpty(id)) {
+            return failed("参数不能为空");
+        }
+        return status(lessonGroupService.top(id));
+    }
+
+
+
+    /**
+     * @Description: 根据组id查询视频课&视频课组
+     * @Author: cy
+     * @Date: 2022/4/2
+     */
+    @ApiOperation(value = "根据组id查询视频课&视频课组")
+    @GetMapping(value = "/selectVideoLesson")
+    public HttpResponseResult<VideoLessonStudentVo> selectVideoLesson(@NotNull(message = "视频组id不能为空") Long groupId) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null || sysUser.getId() == null) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+
+        VideoLessonStudentVo videoLessonStudentVo = lessonGroupService.selectVideoLesson(groupId);
+        if (videoLessonStudentVo.getLessonGroup().getTeacherId().equals(sysUser.getId())) {
+            videoLessonStudentVo.setMyself(true);
+        } else {
+            videoLessonStudentVo.setMyself(false);
+        }
+        if (videoLessonStudentVo.getLessonGroup() != null && sysUser.getId().equals(videoLessonStudentVo.getLessonGroup().getId())) {
+            videoLessonStudentVo.setAlreadyBuy(true);
+        } else {
+            videoLessonStudentVo.setAlreadyBuy(false);
+        }
+        return succeed(videoLessonStudentVo);
+    }
+
+    /**
+     * 设置排序值 和加精
+     */
+    @PostMapping("/adjust")
+    @ApiOperation(value = "视频课调整排序")
+    public HttpResponseResult<Boolean> adjust(@RequestBody @Valid AdjustModel model) {
+
+        VideoLessonGroup videoLessonGroup = new VideoLessonGroup();
+        videoLessonGroup.setId(model.getId());
+        videoLessonGroup.setSortNumber(model.getSort());
+
+        lessonGroupService.updateById(videoLessonGroup);
+
+        return succeed();
+    }
+
 }

+ 75 - 13
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/music/MusicCompareRecordStatController.java

@@ -1,27 +1,30 @@
 package com.yonge.cooleshow.admin.controller.music;
 
 
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.admin.io.request.music.MusicCompareVo;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
-import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.service.MusicCompareRecordStatService;
-import com.yonge.cooleshow.biz.dal.vo.MusicSheetDetailVo;
+import com.yonge.cooleshow.biz.dal.service.SysMusicCompareRecordService;
 import com.yonge.cooleshow.biz.dal.wrapper.music.MusicCompareWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.mybatis.support.PageUtil;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
-
-import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
 
@@ -33,36 +36,95 @@ import java.util.List;
  * @author Eric
  * @since 2022-10-17
  */
-@Controller
+@RestController
 @RequestMapping("/music/compare")
-@Api(tags = "曲目练习统计 API接口")
+@Api(tags = "曲目练习统计 ")
 public class MusicCompareRecordStatController extends BaseController {
 
     @Autowired
     private SysUserFeignService sysUserFeignService;
     @Autowired
     private MusicCompareRecordStatService musicCompareRecordStatService;
+    @Autowired
+    private SysMusicCompareRecordService sysMusicCompareRecordService;
 
     /**
      * 查询曲目统计汇总信息
      */
-    @ApiOperation(value = "曲目统计汇总信息", notes = "传入id")
+    @ApiOperation(value = "曲目统计汇总信息", notes = "")
     @PostMapping(value = "/record/stat", consumes="application/json", produces="application/json")
-    public HttpResponseResult<MusicCompareVo.RecordStat> detail(@RequestBody MusicCompareVo.StatQueryRequest info) {
+    public HttpResponseResult<MusicCompareVo.RecordStat> musicCompareRecordStatInfo(@RequestBody MusicCompareVo.StatQueryRequest request) {
 
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null  || sysUser.getId() == null) {
             return failed("用户信息获取失败");
         }
 
-        if (info.invalidParam()) {
+        if (request.invalidParam()) {
             return failed("无效的请求参数");
         }
 
         MusicCompareWrapper.RecordStat records = musicCompareRecordStatService.findMusicCompareRecordStatInfo(sysUser.getId(),
-                MusicCompareWrapper.StatQueryInfo.from(info.jsonString()));
+                MusicCompareWrapper.StatQueryInfo.from(request.jsonString()));
 
         return succeed(MusicCompareVo.RecordStat.from(records.jsonString()));
     }
 
+    /**
+     * 查询曲目统计汇总信息
+     */
+    @ApiOperation(value = "曲目统计信息查询", notes = "")
+    @PostMapping(value = "/record/page", consumes="application/json", produces="application/json")
+    public HttpResponseResult<PageInfo<MusicCompareVo.RecordInfo>> musicCompareRecordPageInfo(@RequestBody MusicCompareVo.StatQueryRequest request) {
+
+        if (request.invalidParam()) {
+            return failed("无效的请求参数");
+        }
+
+        // 曲目统计信息
+        IPage<MusicCompareWrapper.RecordInfo> wrapper = musicCompareRecordStatService.findMusicCompareRecordPage(PageUtil.getPage(request),
+                MusicCompareWrapper.StatQueryInfo.from(request.jsonString()));
+
+        // 数据转换
+        List<MusicCompareVo.RecordInfo> pageInfos = JSON.parseArray(JSON.toJSONString(wrapper.getRecords()),
+                MusicCompareVo.RecordInfo.class);
+
+        return succeed(PageUtil.getPageInfo(wrapper, pageInfos));
+    }
+
+    /**
+     * 查询曲目统计汇总信息
+     */
+    @ApiOperation(value = "曲目评测信息查询")
+    @PostMapping(value = "/evaluate/page", consumes="application/json", produces="application/json")
+    public HttpResponseResult<PageInfo<MusicCompareWrapper.RecordEvaluate>> musicCompareEvaluatePageInfo(@RequestBody MusicCompareVo.EvaluateQueryInfo request) {
+
+        if (request.invalidParam()) {
+            return failed("无效的请求参数");
+        }
+
+        // 曲目统计信息
+        IPage<MusicCompareWrapper.RecordEvaluate> wrapper = musicCompareRecordStatService.findMusicCompareRecordEvaluatePage(PageUtil.getPage(request),
+                MusicCompareWrapper.EvaluteQueryInfo.from(request.jsonString()));
+
+        return succeed(PageUtil.pageInfo(wrapper));
+    }
+
+    /**
+     * 用户最近一次评测报告
+     * @param recordId 评测记录ID
+     * @return HttpResponseResult<Object>
+     */
+    @ApiOperation(value = "用户最后一次评测数据")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "recordId", value = "评测记录ID", required = true, dataType = "Integer")
+    })
+    @GetMapping("evaluate/report")
+    public HttpResponseResult<Object> getLastEvaluationMusicalNotesPlayStats(@RequestParam("recordId") Long recordId){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(sysUser == null){
+            throw new BizException("请登录");
+        }
+        return succeed(sysMusicCompareRecordService.getLastEvaluationMusicalNotesPlayStats(sysUser.getId(), recordId));
+    }
 }

+ 31 - 5
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/ImUserFriendController.java

@@ -1,20 +1,24 @@
 package com.yonge.cooleshow.admin.controller.open;
 
+import com.yonge.cooleshow.admin.io.request.course.CourseRelationVo;
 import com.yonge.cooleshow.admin.io.request.im.IMNotifyMessageVO;
 import com.yonge.cooleshow.admin.io.request.im.UserFriendInfoVO;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.service.CourseRelationMusicAlbumService;
 import com.yonge.cooleshow.biz.dal.service.ImUserFriendService;
 import com.yonge.cooleshow.biz.dal.wrapper.im.CustomerService;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import org.springframework.beans.factory.annotation.Value;
+import org.springframework.beans.factory.annotation.Autowired;
 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.RestController;
 
 import javax.annotation.Resource;
+import java.util.Objects;
 
 /**
  * 用户通讯录表(ImUserFriend)表控制层
@@ -24,7 +28,7 @@ import javax.annotation.Resource;
  */
 @Api(tags = "用户通讯录表")
 @RestController
-@RequestMapping("/open/im")
+@RequestMapping("/open")
 public class ImUserFriendController extends BaseController {
 
     /**
@@ -32,9 +36,11 @@ public class ImUserFriendController extends BaseController {
      */
     @Resource
     private ImUserFriendService imUserFriendService;
+    @Autowired
+    private CourseRelationMusicAlbumService courseRelationMusicAlbumService;
 
     @ApiOperation("新用户添加客服")
-    @PostMapping(value = "/customerService")
+    @PostMapping(value = "/im/customerService")
     public HttpResponseResult<Boolean> customerService(@RequestBody UserFriendInfoVO info) {
 
         if (info.invalidRequestParam()) {
@@ -42,7 +48,8 @@ public class ImUserFriendController extends BaseController {
         }
 
         // 新用户自动绑定系统客服
-        int ret = imUserFriendService.registerUserBindCustomerService(info.getUserId(), info.getFriendIds());
+        int ret = imUserFriendService.registerUserBindCustomerService(info.getUserId(),
+                info.getFriendIds(), ClientEnum.valueOf(info.getClientType()));
 
         return succeed(ret > 0);
     }
@@ -52,7 +59,7 @@ public class ImUserFriendController extends BaseController {
      * @param info IMNotifyMessageVO
      * @return HttpResponseResult<Boolean>
      */
-    @PostMapping(value = "/message")
+    @PostMapping(value = "/im/message")
     public HttpResponseResult<Boolean> sendSysCustomerServiceMessage(@RequestBody IMNotifyMessageVO info) {
 
         if (info.invalidRequestParam()) {
@@ -65,5 +72,24 @@ public class ImUserFriendController extends BaseController {
 
         return succeed();
     }
+
+    /**
+     * 同步用户购买课程赠送数据
+     * @param query CourseRelationVo.CourseRelationQuery
+     * @return HttpResponseResult<Boolean>
+     */
+    @ApiOperation("已购买课程赠送同步")
+    @PostMapping(value = "/course/sync")
+    public HttpResponseResult<Boolean> syncUserPurchaseRelationMusicAlbum(@RequestBody CourseRelationVo.CourseRelationQuery query) {
+
+        if (Objects.isNull(query.getCourseGroupId()) || Objects.isNull(query.getCourseType())) {
+            return failed("无效的请求参数");
+        }
+
+        // 同步数据
+        courseRelationMusicAlbumService.asyncUpdateCourseRelationMusicAlbumInfo(query.getCourseGroupId(), query.getCourseType());
+
+        return succeed();
+    }
 }
 

+ 15 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/OpenUserAccountController.java

@@ -1,10 +1,13 @@
 package com.yonge.cooleshow.admin.controller.open;
 
+import com.yonge.cooleshow.biz.dal.dto.MusicImgDto;
+import com.yonge.cooleshow.biz.dal.service.MusicSheetService;
 import com.yonge.cooleshow.biz.dal.service.UserAccountService;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.entity.MallOrderItemDto;
 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;
@@ -13,6 +16,7 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.validation.Valid;
 import java.util.List;
 
 @RestController
@@ -26,6 +30,8 @@ public class OpenUserAccountController extends BaseController {
     @Autowired
     private UserAccountService userAccountService;
 
+    @Autowired
+    private MusicSheetService musicSheetService;
 
     /**
      * 设置商城收入分润
@@ -45,4 +51,13 @@ public class OpenUserAccountController extends BaseController {
         userAccountService.mallTeacherRecordState(shareDto);
         return succeed();
     }
+
+
+
+    @ApiOperation(value = "新增曲谱渲染图")
+    @PostMapping(value="/music/sheet/img")
+    public HttpResponseResult<Boolean> img(@RequestBody @Valid MusicImgDto musicImgDto) {
+        return succeed(musicSheetService.updateMusicImg(musicImgDto.getMusicImg(),musicImgDto.getMusicSheetId()));
+    }
+
 }

+ 6 - 3
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/coupon/CouponInfoVO.java

@@ -49,10 +49,10 @@ public class CouponInfoVO {
         @ApiModelProperty("客户类型")
         private ClientEnum clientType;
 
-        @ApiModelProperty("优惠券类型")
+        @ApiModelProperty("优惠券类型 FULL_DISCOUNT(满减券) VOUCHER(代金券)")
         private CouponTypeEnum couponType;
 
-        @ApiModelProperty("可用品类")
+        @ApiModelProperty("可用品类 UNIVERSAL(全场通用) VIP(小酷Ai) PIANO(云酷琴房) MALL(商场购物券) MUSIC(单曲点播券) ALBUM(专辑优惠券) SPARRING(陪练课购买券) LIVE(直播课购买券) ")
         private CouponCategoryEnum category;
 
         @ApiModelProperty("优惠券状态")
@@ -180,7 +180,10 @@ public class CouponInfoVO {
         @ApiModelProperty("客户端类型: TEACHER(老师端), STUDENT(学生端)")
         private ClientEnum clientType;
 
-        @ApiModelProperty("可用品类: UNIVERSAL(全场通用) VIP(小酷Ai) PIANO(云酷琴房) MALL(商场购物券) MUSIC(单曲点播券) SPARRING(陪练课购买券) LIVE(直播课购买券) VIDEO(视频课购买券) ")
+        @ApiModelProperty("可用品类: UNIVERSAL(全场通用) VIP(小酷Ai) " +
+                "PIANO(云酷琴房) MALL(商场购物券) MUSIC(单曲点播券) " +
+                "SPARRING(陪练课购买券) LIVE(直播课购买券) VIDEO(视频课购买券) " +
+                "VIDEO(视频课购买券)")
         private CouponCategoryEnum category;
 
         @ApiModelProperty("使用门槛")

+ 166 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/course/CourseRelationVo.java

@@ -0,0 +1,166 @@
+package com.yonge.cooleshow.admin.io.request.course;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.yonge.cooleshow.biz.dal.enums.course.CourseTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.course.RelationMusicAlbumEnum;
+import com.yonge.toolset.base.page.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-10-25
+ */
+public class CourseRelationVo {
+
+    @ApiModel("CourseRelationQuery-课程推荐/赠送内容查询")
+    public static class CourseRelationQuery extends QueryInfo{
+
+        @ApiModelProperty("课程组id")
+        private Long courseGroupId;
+
+        @ApiModelProperty("关联类型, MUSIC, ALBUM ")
+        private RelationMusicAlbumEnum relationType;
+
+
+        @ApiModelProperty("课程类型 ")
+        private CourseTypeEnum courseType;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+
+        public Long getCourseGroupId() {
+            return courseGroupId;
+        }
+
+        public void setCourseGroupId(Long courseGroupId) {
+            this.courseGroupId = courseGroupId;
+        }
+
+        public RelationMusicAlbumEnum getRelationType() {
+            return relationType;
+        }
+
+        public void setRelationType(RelationMusicAlbumEnum relationType) {
+            this.relationType = relationType;
+        }
+
+        public CourseTypeEnum getCourseType() {
+            return courseType;
+        }
+
+        public void setCourseType(CourseTypeEnum courseType) {
+            this.courseType = courseType;
+        }
+    }
+
+    @ApiModel("CourseRelationList-课程推荐/赠送内容列表")
+    public static class CourseRelationList {
+
+        @ApiModelProperty("编号")
+        private Long id;
+
+        @ApiModelProperty("封面")
+        private String img;
+
+        @ApiModelProperty("名称")
+        private String name;
+
+        @ApiModelProperty("标签")
+        private String tagName;
+
+        @ApiModelProperty("声部")
+        private String subjectName;
+
+        @ApiModelProperty("收费类型  VIP:会员,FREE:免费 CHARGE:购买")
+        private String paymentType;
+
+        @ApiModelProperty("价格")
+        private BigDecimal price;
+
+        @ApiModelProperty("关联类型, MUSIC, ALBUM ")
+        private RelationMusicAlbumEnum relationType;
+
+        @ApiModelProperty("课程名")
+        private String courseName;
+
+        public Long getId() {
+            return id;
+        }
+
+        public void setId(Long id) {
+            this.id = id;
+        }
+
+        public String getImg() {
+            return img;
+        }
+
+        public void setImg(String img) {
+            this.img = img;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public void setName(String name) {
+            this.name = name;
+        }
+
+        public String getTagName() {
+            return tagName;
+        }
+
+        public void setTagName(String tagName) {
+            this.tagName = tagName;
+        }
+
+        public String getSubjectName() {
+            return subjectName;
+        }
+
+        public void setSubjectName(String subjectName) {
+            this.subjectName = subjectName;
+        }
+
+        public String getPaymentType() {
+            return paymentType;
+        }
+
+        public void setPaymentType(String paymentType) {
+            this.paymentType = paymentType;
+        }
+
+        public BigDecimal getPrice() {
+            return price;
+        }
+
+        public void setPrice(BigDecimal price) {
+            this.price = price;
+        }
+
+        public RelationMusicAlbumEnum getRelationType() {
+            return relationType;
+        }
+
+        public void setRelationType(RelationMusicAlbumEnum relationType) {
+            this.relationType = relationType;
+        }
+
+        public String getCourseName() {
+            return courseName;
+        }
+
+        public void setCourseName(String courseName) {
+            this.courseName = courseName;
+        }
+    }
+}

+ 3 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/im/UserFriendInfoVO.java

@@ -22,6 +22,9 @@ public class UserFriendInfoVO implements Serializable {
     @ApiModelProperty(value = "新用户ID")
     private Long userId;
 
+    @ApiModelProperty("客户端类型")
+    private String clientType;
+
     @ApiModelProperty(value = "好友ID")
     private List<Long> friendIds;
 

+ 118 - 8
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/music/MusicCompareVo.java

@@ -1,16 +1,24 @@
 package com.yonge.cooleshow.admin.io.request.music;
 
 import com.alibaba.fastjson.JSON;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.HeardLevelEnum;
+import com.yonge.cooleshow.biz.dal.enums.MK;
+import com.yonge.cooleshow.biz.dal.enums.music.MusicCompareType;
 import com.yonge.toolset.base.page.QueryInfo;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
 
 import java.io.Serializable;
+import java.util.Date;
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 
 /**
  * Created by Eric.Shang on 2022/10/17.
@@ -23,15 +31,41 @@ public class MusicCompareVo implements Serializable {
     @Data
     @NoArgsConstructor
     @AllArgsConstructor
+    @EqualsAndHashCode(callSuper = false)
     public static class StatQueryRequest extends QueryInfo {
 
         @ApiModelProperty("客户端类型 TEACHER(老师端) STUDENT(学生端)")
         private ClientEnum clientType;
 
+        @ApiModelProperty("用户ID ")
+        private Long userId;
+
+        @ApiModelProperty("排序类型 TRAIN_DURATION(练习时长) TRAIN_FREQ(练习次数) EVALUATE_DURATION(评测时长) EVALUATE_FREQ(评测次数)")
+        private MusicCompareType compareType;
+
+        @ApiModelProperty("排序方式 升序(ASC) 降序(DESC)")
+        private String sortType;
+
+        @ApiModelProperty("曲目编号/名称")
+        private String keyword;
+
+        @ApiModelProperty("开始时间")
+        @JsonFormat(pattern = MK.TIME_PATTERN, timezone = MK.TIME_ZONE)
+        private Long startTime;
+
+        @ApiModelProperty("结束时间")
+        @JsonFormat(pattern = MK.TIME_PATTERN, timezone = MK.TIME_ZONE)
+        private Long endTime;
+
+        @ApiModelProperty(value = "曲目ID", hidden = true)
+        private Long musicId;
+        @ApiModelProperty(value = "曲目名称", hidden = true)
+        private String musicName;
 
         public boolean invalidParam() {
 
             return Objects.isNull(getClientType())
+                    || Objects.isNull(getUserId())
                     || ClientEnum.invalid(getClientType().getCode());
         }
 
@@ -39,6 +73,33 @@ public class MusicCompareVo implements Serializable {
 
             return JSON.toJSONString(this);
         }
+
+        public MusicCompareType getCompareType() {
+            return Optional.ofNullable(compareType).orElse(MusicCompareType.EVALUATE_DURATION);
+        }
+
+        public String getSortType() {
+            return Optional.ofNullable(sortType).orElse("DESC");
+        }
+
+        public void setKeyword(String keyword) {
+            if (StringUtils.isNotEmpty(keyword)) {
+
+                if (keyword.matches(MK.EXP_INT)) {
+
+                    setMusicId(Long.parseLong(keyword));
+                } else {
+                    setMusicName(keyword);
+                }
+            }
+            this.keyword = keyword;
+        }
+
+        public StatQueryRequest userId(Long userId) {
+            this.userId = userId;
+            return this;
+        }
+
     }
 
     /**
@@ -49,8 +110,8 @@ public class MusicCompareVo implements Serializable {
     @AllArgsConstructor
     public static class RecordStat implements Serializable {
 
-        @ApiModelProperty("曲目总数")
-        private Long musicNums;
+        @ApiModelProperty("练习曲目总数")
+        private Long trainMusicNums;
 
         @ApiModelProperty("使用时长")
         private Long trainDuration;
@@ -58,20 +119,20 @@ public class MusicCompareVo implements Serializable {
         @ApiModelProperty("使用次数")
         private Long trainFrequency;
 
+        @ApiModelProperty("评测曲目总数")
+        private Long evaluateMusicNums;
+
         @ApiModelProperty("评测时长")
         private Long evaluateDuration;
 
         @ApiModelProperty("评测次数")
         private Long evaluateFrequency;
 
-        @ApiModelProperty("最近使用时间")
-        private Long recentTime;
-
         private List<RecordInfo> recordInfos;
 
-        public static RecordStat from(String recv) {
+        public static RecordStat from(String record) {
 
-            return JSON.parseObject(recv, RecordStat.class);
+            return JSON.parseObject(record, RecordStat.class);
         }
     }
 
@@ -102,6 +163,55 @@ public class MusicCompareVo implements Serializable {
         private Long evaluateFrequency;
 
         @ApiModelProperty("最近使用时间")
-        private Long recentTime;
+        @JsonFormat(pattern = MK.TIME_PATTERN, timezone = MK.TIME_ZONE)
+        private Date recentTime;
+
+        @ApiModelProperty("作曲人")
+        private String composer;
+
+        @ApiModelProperty("音乐标签")
+        private String musicTagName;
+    }
+
+    /**
+     * 评测记录查询
+     */
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @EqualsAndHashCode(callSuper = false)
+    public static class EvaluateQueryInfo extends QueryInfo {
+
+        @ApiModelProperty("客户端类型 TEACHER(老师端) STUDENT(学生端)")
+        private ClientEnum clientType;
+
+        @ApiModelProperty("用户ID ")
+        private Long userId;
+
+        @ApiModelProperty("曲目ID ")
+        private Long musicId;
+
+        @ApiModelProperty("评测难度")
+        private HeardLevelEnum heardLevel;
+
+        @ApiModelProperty("开始时间")
+        @JsonFormat(pattern = MK.TIME_PATTERN, timezone = MK.TIME_ZONE)
+        private Long startTime;
+
+        @ApiModelProperty("结束时间")
+        @JsonFormat(pattern = MK.TIME_PATTERN, timezone = MK.TIME_ZONE)
+        private Long endTime;
+
+        public boolean invalidParam() {
+
+            return Objects.isNull(getClientType())
+                    || Objects.isNull(getUserId())
+                    || Objects.isNull(getMusicId());
+        }
+
+        public String jsonString() {
+
+            return JSON.toJSONString(this);
+        }
     }
 }

+ 32 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/task/TaskController.java

@@ -46,6 +46,18 @@ public class TaskController extends BaseController {
     @Value("${app.blacklist:}")
     private String blacklistFilePath;
 
+    @Autowired
+    private MusicSheetService musicSheetService;
+
+    @Autowired
+    private MusicAlbumService musicAlbumService;
+
+    @Autowired
+    private TeacherStyleVideoService teacherStyleVideoService;
+
+    @Autowired
+    private VideoLessonGroupService videoLessonGroupService;
+
     /***
      * 轮询用户订单
      * @author liweifan
@@ -126,4 +138,24 @@ public class TaskController extends BaseController {
         activityPlanEvaluationService.successActivity(activityId);
         return HttpResponseResult.succeed();
     }
+
+
+    /**
+     * 每日增加收藏/热度人数
+     */
+    @GetMapping("/virtualNumber")
+    public HttpResponseResult<Object> virtualNumber() {
+
+        // 曲目
+        musicSheetService.setVirtualNumber();
+        // 专辑
+        musicAlbumService.setVirtualNumber();
+        // 视频课 暂时不做课程数据
+        // videoLessonGroupService.setVirtualNumber();
+        // 个人风采
+        teacherStyleVideoService.setVirtualNumber();
+
+        return HttpResponseResult.succeed();
+    }
+
 }

+ 34 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseCoursewareDao.java

@@ -0,0 +1,34 @@
+package com.yonge.cooleshow.biz.dal.dao;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import com.yonge.cooleshow.biz.dal.entity.CourseCourseware;
+import com.yonge.cooleshow.biz.dal.vo.CourseCoursewareVo;
+import com.yonge.cooleshow.biz.dal.dto.search.CourseCoursewareSearch;
+
+
+public interface CourseCoursewareDao extends BaseMapper<CourseCourseware>{
+	/**
+	 * 查询详情
+     * @author liweifan
+     * @date 2022-11-02 10:17:44
+     * @return: com.yonge.cooleshow.biz.dal.vo.CourseCoursewareVo
+	 */
+	CourseCoursewareVo detail(@Param("id") Long id);
+
+	/**
+	 * 分页查询
+     * @author liweifan
+     * @date 2022-11-02 10:17:44
+     * @return: com.yonge.cooleshow.biz.dal.vo.CourseCoursewareVo
+	 */
+	List<CourseCoursewareVo> selectPage(@Param("page") IPage page, @Param("param") CourseCoursewareSearch courseCourseware);
+
+	/**
+	 * 查询被购买够的课件信息
+	 */
+	List<Long> selectPayMusic(@Param("coursewareIdList") List<Long> coursewareIdList);
+}

+ 23 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseRelationMusicAlbumDao.java

@@ -0,0 +1,23 @@
+package com.yonge.cooleshow.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yonge.cooleshow.biz.dal.entity.CourseRelationMusicAlbum;
+import com.yonge.cooleshow.biz.dal.entity.UserOrder;
+import com.yonge.cooleshow.biz.dal.wrapper.course.CourseRelationWrapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+
+public interface CourseRelationMusicAlbumDao extends BaseMapper<CourseRelationMusicAlbum>{
+
+
+    /**
+     * 课程用户购买记录
+     * @param page Page<UserOrder>
+     * @param queryInfo CourseRelationWrapper.PurchaseRecordQueryInfo
+     * @return List<UserOrder>
+     */
+    List<UserOrder> selectCoursePurchaseUserInfo(@Param("page") Page<UserOrder> page, @Param("record") CourseRelationWrapper.PurchaseRecordQueryInfo queryInfo);
+}

+ 4 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ImGroupMemberDao.java

@@ -2,6 +2,8 @@ package com.yonge.cooleshow.biz.dal.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.yonge.cooleshow.biz.dal.entity.ImGroupMember;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.ImGroupMemberRoleType;
 import io.rong.models.group.GroupMember;
 import org.apache.ibatis.annotations.Param;
 
@@ -45,9 +47,9 @@ public interface ImGroupMemberDao extends BaseMapper<ImGroupMember> {
                                            @Param("userIds") Set<Long> userIds,
                                            @Param("roleType") String roleType);
 
-    ImGroupMember findByUserIdAndGroupId(@Param("userId") Long userId, @Param("groupId") String groupId);
+    ImGroupMember findByUserIdAndGroupId(@Param("userId") Long userId, @Param("groupId") String groupId, @Param("clientType") ClientEnum clientType);
 
     //删除群成员
-    int delByGroupIdAndUserId(@Param("groupId") String groupId, @Param("userId") Long userId);
+    int delByGroupIdAndUserId(@Param("groupId") String groupId, @Param("userId") Long userId, @Param("roleType") ImGroupMemberRoleType roleType);
 }
 

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

@@ -18,11 +18,11 @@ public interface ImNetworkRoomMemberDao extends BaseMapper<ImNetworkRoomMember>
 
     int insert(@Param("entity") ImNetworkRoomMember roomMember);
 
-    ImNetworkRoomMember findByRidAndUid(@Param("roomId") String roomId, @Param("userId") Long userId);
+    ImNetworkRoomMember findByRidAndUid(@Param("roomId") String roomId, @Param("userId") Long userId, @Param("userRole") Integer userRole);
 
     List<ImNetworkRoomMember> queryByRoomId(@Param("roomId") String roomId);
 
-    void delByRidAndUid(@Param("roomId") String roomId, @Param("userId") Long userId);
+    void delByRidAndUid(@Param("roomId") String roomId, @Param("userId") Long userId, @Param("userRole") Integer userRole);
 
     int countByRoomId(@Param("roomId") String roomId);
 

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

@@ -3,11 +3,13 @@ package com.yonge.cooleshow.biz.dal.dao;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicAlbumSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicSheetOrderSearch;
 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.vo.StudentMusicAlbumOrderVo;
 import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -74,4 +76,7 @@ public interface MusicAlbumDao extends BaseMapper<MusicAlbum> {
      * @return List<StatGroupWrapper>
      */
     List<StatGroupWrapper> selectAlbumMusicSheetStatInfo(@Param("albumId") Long albumId, @Param("paymentType") ChargeTypeEnum paymentType);
+
+    List<StudentMusicAlbumOrderVo> selectStudentOrderPage(@Param("page") IPage<StudentMusicAlbumOrderVo> page, @Param(
+            "param") StudentMusicSheetOrderSearch query);
 }

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

@@ -13,11 +13,4 @@ import org.apache.ibatis.annotations.Param;
  **/
 public interface MusicFavoriteDao extends BaseMapper<MusicFavorite> {
 
-    /**
-     * 曲目收藏数
-     *
-     * @param musicSheetId 曲目id
-     * @return
-     */
-    long selectMusicSheetFavoriteNum(@Param("musicSheetId") Long musicSheetId);
 }

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

@@ -7,6 +7,7 @@ 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 com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -170,4 +171,9 @@ public interface MusicSheetDao extends BaseMapper<MusicSheet> {
      * @return List<StatGroupWrapper>
      */
     List<StatGroupWrapper> selectMusicAlbumStatInfo(@Param("musicIds") List<Long> musicIds);
+
+    /**
+     * 修改收藏数
+     */
+    void updateFavoriteCount(@Param("musicSheetId") Long musicSheetId, @Param("state") YesOrNoEnum state);
 }

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

@@ -1,7 +1,11 @@
 package com.yonge.cooleshow.biz.dal.dao;
 
+import com.yonge.cooleshow.biz.dal.entity.CourseRelationMusicAlbum;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheetPurchaseRecord;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * MusicSheetPurchaseRecordDao数据库访问类
@@ -11,4 +15,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  **/
 public interface MusicSheetPurchaseRecordDao extends BaseMapper<MusicSheetPurchaseRecord> {
 
+    void updateCourseMusicAlbum(@Param("items") List<CourseRelationMusicAlbum> updateCourseRelationMusicAlbums);
 }

+ 1 - 12
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicTagDao.java

@@ -31,17 +31,6 @@ public interface MusicTagDao extends BaseMapper<MusicTag> {
 	List<MusicTagVo> selectPage(@Param("page") IPage page, @Param("param") MusicTagSearch musicTag);
 
 	/**
-	 * 根据父级id查询子级列表
-	 *
-	 * @param id        父级id
-	 * @param state     状态
-	 * @param idAndName 标签编号/名称
-	 * @return List
-	 */
-	List<MusicTagVo> getChildren(@Param("id") Long id, @Param("state") YesOrNoEnum state, @Param("idAndName") String idAndName);
-
-
-	/**
 	 * 根据父级id集合查询子集标签
 	 *
 	 * @param longList 父级id集合
@@ -65,5 +54,5 @@ public interface MusicTagDao extends BaseMapper<MusicTag> {
 	 * @param longs
 	 * @return
 	 */
-    Integer checkTagBeUsedMusicAblum(@Param("longs") List<Long> longs);
+    Integer checkTagBeUsedMusicAlbum(@Param("longs") List<Long> longs);
 }

+ 30 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ReturnVisitDao.java

@@ -0,0 +1,30 @@
+package com.yonge.cooleshow.biz.dal.dao;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import com.yonge.cooleshow.biz.dal.entity.ReturnVisit;
+import com.yonge.cooleshow.biz.dal.vo.ReturnVisitVo;
+import com.yonge.cooleshow.biz.dal.dto.search.ReturnVisitSearch;
+
+
+public interface ReturnVisitDao extends BaseMapper<ReturnVisit>{
+	/**
+	 * 查询详情
+     * @author liweifan
+     * @date 2022-11-08 15:27:08
+     * @return: com.yonge.cooleshow.biz.dal.vo.ReturnVisitVo
+	 */
+	ReturnVisitVo detail(@Param("id") Long id);
+
+	/**
+	 * 分页查询
+     * @author liweifan
+     * @date 2022-11-08 15:27:08
+     * @return: com.yonge.cooleshow.biz.dal.vo.ReturnVisitVo
+	 */
+	List<ReturnVisitVo> selectPage(@Param("page") IPage page, @Param("param") ReturnVisitSearch returnVisit);
+	
+}

+ 20 - 8
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/SysMusicCompareRecordDao.java

@@ -3,6 +3,8 @@ package com.yonge.cooleshow.biz.dal.dao;
 import java.util.List;
 import java.util.Map;
 
+import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.music.MusicCompareWrapper;
 import org.apache.ibatis.annotations.Param;
 
 import com.yonge.cooleshow.biz.dal.dto.StudentTrainChartDto;
@@ -23,24 +25,27 @@ public interface SysMusicCompareRecordDao extends BaseDAO<Long, SysMusicCompareR
 	SysMusicCompareRecord getUserLastEvaluationData(@Param("userId") Long userId);
 
 	/**
+	 * @param userId   :
+	 * @param clientId
+	 * @return com.ym.mec.biz.dal.dto.StudentTrainOverviewDto
 	 * @describe 获取用户训练总览
 	 * @author Joburgess
 	 * @date 2021/8/11 0011
-	 * @param userId:
-	 * @return com.ym.mec.biz.dal.dto.StudentTrainOverviewDto
 	 */
-	StudentTrainOverviewDto getUserTrainOverView(@Param("userId") Long userId);
+	StudentTrainOverviewDto getUserTrainOverView(@Param("userId") Long userId, @Param("clientId") String clientId);
 
 	/**
+	 * @param userId    :
+	 * @param startTime :
+	 * @param endTime   :
+	 * @param clientId
+	 * @return java.util.List<com.ym.mec.biz.dal.dto.StudentTrainChartDto>
 	 * @describe 获取用户训练图表数据
 	 * @author Joburgess
 	 * @date 2021/8/12 0012
-	 * @param userId:
-	 * @param startTime:
-	 * @param endTime:
-	 * @return java.util.List<com.ym.mec.biz.dal.dto.StudentTrainChartDto>
 	 */
-	List<StudentTrainChartDto> getUserTrainChartData(@Param("userId") Long userId, @Param("startTime") String startTime, @Param("endTime") String endTime);
+	List<StudentTrainChartDto> getUserTrainChartData(@Param("userId") Long userId, @Param(
+			"startTime") String startTime, @Param("endTime") String endTime, @Param("clientId") String clientId);
 
 	int countMusicGroupStudentTrainData(Map<String, Object> params);
 
@@ -67,4 +72,11 @@ public interface SysMusicCompareRecordDao extends BaseDAO<Long, SysMusicCompareR
 	 * @return java.lang.Integer
 	 */
 	Integer getUserWeekMaxMusicScoreId(@Param("userId") Long userId, @Param("monday") String monday, @Param("heardLevel") HeardLevelEnum heardLevel);
+
+	/**
+	 * 曲目练习记录统计
+	 * @param queryInfo MusicCompareWrapper.RecordQueryInfo
+	 * @return List<StatGroupWrapper>
+	 */
+	List<StatGroupWrapper> selectMusicCompareRecordStatInfo(@Param("record") MusicCompareWrapper.RecordQueryInfo queryInfo);
 }

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

@@ -2,6 +2,9 @@ package com.yonge.cooleshow.biz.dal.dao;
 
 import java.util.List;
 
+import com.yonge.cooleshow.biz.dal.queryInfo.CouponInfoQuery;
+import com.yonge.cooleshow.biz.dal.queryInfo.CourseRelationQueryInfo;
+import com.yonge.cooleshow.biz.dal.wrapper.course.CourseRelationWrapper;
 import org.apache.ibatis.annotations.Param;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;

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

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.dao;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.biz.dal.dto.VideoLessonGroupDetailDto;
 import com.yonge.cooleshow.biz.dal.dto.search.VideoLessonSearch;
 import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroupDetail;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@@ -19,13 +20,13 @@ import java.util.List;
  **/
 public interface VideoLessonGroupDetailDao extends BaseMapper<VideoLessonGroupDetail> {
     //查询视频课
-    List<VideoLessonGroupDetail> selectPage(IPage page,@Param("param") VideoLessonSearch query);
+    List<VideoLessonGroupDetailDto> selectPage(IPage page,@Param("param") VideoLessonSearch query);
 
     //根据组id查询购买用户
     List<VideoLessonPurchaseStudent> selectPageStudent(IPage page,@Param("param")  VideoLessonSearch query);
 
     //新增视频课
-    void insertVideoLesson(List<VideoLessonGroupDetail> list);
+    void insertVideoLesson(List<VideoLessonGroupDetailDto> list);
 
     //修改视频课
     void updateDetail(VideoLessonGroupDetailUpVo detailUpVo);
@@ -35,5 +36,5 @@ public interface VideoLessonGroupDetailDao extends BaseMapper<VideoLessonGroupDe
 
     List<VideoLessonGroupDetailVo> selectPageAuth(IPage page, @Param("param") VideoLessonSearch query);
     
-    List<VideoLessonGroupDetail> queryByVideoLessonGroupId(Long videoLessonGroupId);
+    List<VideoLessonGroupDetailDto> queryByVideoLessonGroupId(Long videoLessonGroupId);
 }

+ 51 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/AppMusicSheetVo.java

@@ -0,0 +1,51 @@
+package com.yonge.cooleshow.biz.dal.dto;
+
+import com.yonge.cooleshow.biz.dal.vo.MusicSheetVo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-10-18
+ */
+@ApiModel("app首页曲目信息")
+public class AppMusicSheetVo {
+
+    @ApiModelProperty("推荐曲目")
+    private List<MusicSheetVo> topMusicSheet;
+
+
+    @ApiModelProperty("最新曲目")
+    private List<MusicSheetVo> newMusicSheet;
+
+    @ApiModelProperty("最热曲目")
+    private List<MusicSheetVo> hotMusicSheet;
+
+    public List<MusicSheetVo> getHotMusicSheet() {
+        return hotMusicSheet;
+    }
+
+    public void setHotMusicSheet(List<MusicSheetVo> hotMusicSheet) {
+        this.hotMusicSheet = hotMusicSheet;
+    }
+
+    public List<MusicSheetVo> getTopMusicSheet() {
+        return topMusicSheet;
+    }
+
+    public void setTopMusicSheet(List<MusicSheetVo> topMusicSheet) {
+        this.topMusicSheet = topMusicSheet;
+    }
+
+    public List<MusicSheetVo> getNewMusicSheet() {
+        return newMusicSheet;
+    }
+
+    public void setNewMusicSheet(List<MusicSheetVo> newMusicSheet) {
+        this.newMusicSheet = newMusicSheet;
+    }
+}

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

@@ -20,6 +20,9 @@ public class BasicUserInfo {
     @ApiModelProperty(value = "用户头像", required = true)
     private String avatar;
 
+    @ApiModelProperty("IM用户ID")
+    private String imUserId;
+
     public String getAvatar() {
         return avatar;
     }
@@ -51,4 +54,12 @@ public class BasicUserInfo {
     public void setRealName(String realName) {
         this.realName = realName;
     }
+
+    public String getImUserId() {
+        return imUserId;
+    }
+
+    public void setImUserId(String imUserId) {
+        this.imUserId = imUserId;
+    }
 }

+ 13 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/CourseCoursewareDto.java

@@ -0,0 +1,13 @@
+package com.yonge.cooleshow.biz.dal.dto;
+
+import com.yonge.cooleshow.biz.dal.entity.CourseCourseware;
+import io.swagger.annotations.ApiModel;
+
+/**
+ * @Author: liweifan
+ * @Data: 2022-11-02 10:17:44
+ */
+@ApiModel(value = "CourseCoursewareDto对象", description = "课件表数据传输对象")
+public class CourseCoursewareDto extends CourseCourseware{
+	private static final long serialVersionUID = 1L;
+}

+ 58 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/CourseMusicAlbumRelationDto.java

@@ -0,0 +1,58 @@
+package com.yonge.cooleshow.biz.dal.dto;
+
+import com.yonge.cooleshow.biz.dal.enums.course.CourseRelationTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.course.RelationMusicAlbumEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-10-24
+ */
+public class CourseMusicAlbumRelationDto {
+
+    @ApiModelProperty("关联id")
+    private Long relationId;
+
+    @ApiModelProperty("曲目或专辑id")
+    private Long musicAlbumId;
+
+    @ApiModelProperty("关联类型 RECOMMEND:推荐 GIFT:赠品")
+    private CourseRelationTypeEnum useRelationType;
+
+    @ApiModelProperty("类型 MUSIC:曲目 ALBUM:专辑")
+    private RelationMusicAlbumEnum relationMusicAlbum;
+
+    public CourseRelationTypeEnum getUseRelationType() {
+        return useRelationType;
+    }
+
+    public void setUseRelationType(CourseRelationTypeEnum useRelationType) {
+        this.useRelationType = useRelationType;
+    }
+
+    public Long getRelationId() {
+        return relationId;
+    }
+
+    public void setRelationId(Long relationId) {
+        this.relationId = relationId;
+    }
+
+    public Long getMusicAlbumId() {
+        return musicAlbumId;
+    }
+
+    public void setMusicAlbumId(Long musicAlbumId) {
+        this.musicAlbumId = musicAlbumId;
+    }
+
+    public RelationMusicAlbumEnum getRelationMusicAlbum() {
+        return relationMusicAlbum;
+    }
+
+    public void setRelationMusicAlbum(RelationMusicAlbumEnum relationMusicAlbum) {
+        this.relationMusicAlbum = relationMusicAlbum;
+    }
+}

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkBaseDto.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.dto;
 
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import io.swagger.annotations.ApiModelProperty;
 
 public class ImNetworkBaseDto {
@@ -7,6 +8,9 @@ public class ImNetworkBaseDto {
     @ApiModelProperty(value = "房间号(课程编号)",required = true)
     private Long roomId;
 
+    @ApiModelProperty("客户端类型 ")
+    private ClientEnum clientType;
+
     public Long getRoomId() {
         return roomId;
     }
@@ -14,4 +18,12 @@ public class ImNetworkBaseDto {
     public void setRoomId(Long roomId) {
         this.roomId = roomId;
     }
+
+    public ClientEnum getClientType() {
+        return clientType;
+    }
+
+    public void setClientType(ClientEnum clientType) {
+        this.clientType = clientType;
+    }
 }

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkCustomMessage.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.dto;
 
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import io.rong.messages.BaseMessage;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.StringUtils;
@@ -23,6 +24,9 @@ public class ImNetworkCustomMessage extends BaseMessage {
     @ApiModelProperty(value = "房间号(课程编号)",required = true)
     private Long roomId;
 
+    @ApiModelProperty("客户端类型")
+    private ClientEnum clientType;
+
     public Long getRoomId() {
         return roomId;
     }
@@ -71,6 +75,14 @@ public class ImNetworkCustomMessage extends BaseMessage {
         this.userId = userId;
     }
 
+    public ClientEnum getClientType() {
+        return clientType;
+    }
+
+    public void setClientType(ClientEnum clientType) {
+        this.clientType = clientType;
+    }
+
     @Override
     public String getType() {
         return "DY:PlayMidiMessage";

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

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.dto;
 
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.ImNetworkDeviceTypeEnum;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -13,8 +14,8 @@ public class ImNetworkDeviceControlDto {
 	@ApiModelProperty(value = "房间号",required = true)
 	private String roomId;
 
-	@ApiModelProperty(value = "用户编号",required = true)
-	private Long userId;
+	@ApiModelProperty(value = "IM用户ID",required = true)
+	private String userId;
 
 	@ApiModelProperty(value = "ticket",required = true)
 	private String ticket;
@@ -31,6 +32,9 @@ public class ImNetworkDeviceControlDto {
 	@ApiModelProperty(value = "伴奏音量",required = true)
 	private Integer soundVolume = 100;
 
+	@ApiModelProperty("客户端类型 ")
+	private ClientEnum clientType;
+
 	public ImNetworkDeviceTypeEnum getDeviceType() {
 		return deviceType;
 	}
@@ -55,11 +59,11 @@ public class ImNetworkDeviceControlDto {
 		this.roomId = roomId;
 	}
 
-	public Long getUserId() {
+	public String getUserId() {
 		return userId;
 	}
 
-	public void setUserId(Long userId) {
+	public void setUserId(String userId) {
 		this.userId = userId;
 	}
 
@@ -102,4 +106,12 @@ public class ImNetworkDeviceControlDto {
 	public void setSoundVolume(Integer soundVolume) {
 		this.soundVolume = soundVolume;
 	}
+
+	public ClientEnum getClientType() {
+		return clientType;
+	}
+
+	public void setClientType(ClientEnum clientType) {
+		this.clientType = clientType;
+	}
 }

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkDisplayDataDto.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.dto;
 
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.ImNetworkDisplayEnum;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -17,6 +18,9 @@ public class ImNetworkDisplayDataDto {
 	@ApiModelProperty(value = "display uri",required = true)
     private String uri;
 
+	@ApiModelProperty("客户端类型 ")
+	private ClientEnum clientType;
+
 	public String getRoomId() {
 		return roomId;
 	}
@@ -49,6 +53,14 @@ public class ImNetworkDisplayDataDto {
 		this.uri = uri;
 	}
 
+	public ClientEnum getClientType() {
+		return clientType;
+	}
+
+	public void setClientType(ClientEnum clientType) {
+		this.clientType = clientType;
+	}
+
 	@Override
 	public String toString() {
 		return "ImNetworkDisplayDataDto{" +

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

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.dto;
 
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import io.swagger.annotations.ApiModelProperty;
 
 public class ImNetworkMusicSheetDto extends ImNetworkBaseDto{
@@ -10,6 +11,9 @@ public class ImNetworkMusicSheetDto extends ImNetworkBaseDto{
     @ApiModelProperty(value = "伴奏下载状态(1下载成功0下载中2下载失败)",required = true)
     private Integer status;
 
+    @ApiModelProperty("客户端类型 ")
+    private ClientEnum clientType;
+
     public Long getAccompanimentId() {
         return accompanimentId;
     }
@@ -27,6 +31,16 @@ public class ImNetworkMusicSheetDto extends ImNetworkBaseDto{
     }
 
     @Override
+    public ClientEnum getClientType() {
+        return clientType;
+    }
+
+    @Override
+    public void setClientType(ClientEnum clientType) {
+        this.clientType = clientType;
+    }
+
+    @Override
     public String toString() {
         return "ImNetworkMusicSheetDto{" +
                 "accompanimentId=" + accompanimentId +

+ 30 - 22
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/VideoLessonGroupDetailDto.java

@@ -1,40 +1,48 @@
 package com.yonge.cooleshow.biz.dal.dto;
 
+import com.yonge.cooleshow.biz.dal.entity.CourseRelationMusicAlbum;
 import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroupDetail;
+import com.yonge.cooleshow.biz.dal.wrapper.course.CourseRelationWrapper;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+
 
-/**
- * VideoLessonGroupDetailDto
- * @author yzp
- * @date   2022-03-25 23:46:28
- * @version v1.0
- **/
 public class VideoLessonGroupDetailDto extends VideoLessonGroupDetail {
-    private Integer pageNo;
-    private Integer pageSize;
-    private String search;
 
-    public int getPageNo() {
-        return pageNo;
-    }
+    @ApiModelProperty("关联信息(更新或新增)")
+    private List<CourseMusicAlbumRelationDto> relationList;
+
+    @ApiModelProperty("关联曲目/专辑信息(查看) ")
+    private List<CourseRelationWrapper.MusicAlbumInfo> musicAlbumInfos;
 
-    public void setPageNo(int pageNo) {
-        this.pageNo = pageNo;
+
+    @ApiModelProperty(value = "数据库保存json数据",hidden = true)
+    private List<CourseRelationMusicAlbum> courseRelationMusicAlbumList = new ArrayList<>();
+
+
+    public List<CourseRelationMusicAlbum> getCourseRelationMusicAlbumList() {
+        return courseRelationMusicAlbumList;
     }
 
-    public int getPageSize() {
-        return pageSize;
+    public void setCourseRelationMusicAlbumList(List<CourseRelationMusicAlbum> courseRelationMusicAlbumList) {
+        this.courseRelationMusicAlbumList = courseRelationMusicAlbumList;
     }
 
-    public void setPageSize(int pageSize) {
-        this.pageSize = pageSize;
+    public List<CourseMusicAlbumRelationDto> getRelationList() {
+        return relationList;
     }
 
-    public String getSearch() {
-        return search;
+    public void setRelationList(List<CourseMusicAlbumRelationDto> relationList) {
+        this.relationList = relationList;
     }
 
-    public void setSearch(String search) {
-        this.search = search;
+    public List<CourseRelationWrapper.MusicAlbumInfo> getMusicAlbumInfos() {
+        return musicAlbumInfos;
     }
 
+    public void setMusicAlbumInfos(List<CourseRelationWrapper.MusicAlbumInfo> musicAlbumInfos) {
+        this.musicAlbumInfos = musicAlbumInfos;
+    }
 }

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

@@ -0,0 +1,116 @@
+package com.yonge.cooleshow.biz.dal.dto.search;
+
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import com.yonge.toolset.base.page.QueryInfo;
+import com.yonge.toolset.base.util.StringUtil;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.List;
+
+/**
+ * @Author: liweifan
+ * @Data: 2022-11-02 10:17:44
+ */
+@ApiModel(value = "CourseCoursewareSearch对象", description = "课件表查询对象")
+public class CourseCoursewareSearch extends QueryInfo{
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty("老师id")
+	private Long userId;
+
+
+	@ApiModelProperty("曲目编号/名称")
+	private String idAndName;
+
+	@ApiModelProperty("标签id(多个逗号隔开)")
+	private String musicTagIds;
+
+	@ApiModelProperty(hidden = true)
+	private List<Long> musicTagIdList;
+
+	@ApiModelProperty("声部id(多个逗号隔开)")
+	private String subjectIds;
+
+	@ApiModelProperty(hidden = true)
+	private List<Long> subjectIdList;
+
+	@ApiModelProperty("是否有效, 0:失效 1:有效")
+	private YesOrNoEnum status;
+
+	@ApiModelProperty(value = "用户类型 STUDENT,TEACHER ",hidden = true)
+	private ClientEnum clientType;
+
+	public String getIdAndName() {
+		return idAndName;
+	}
+
+	public void setIdAndName(String idAndName) {
+		this.idAndName = idAndName;
+	}
+
+	public String getMusicTagIds() {
+		return musicTagIds;
+	}
+
+	public void setMusicTagIds(String musicTagIds) {
+		this.musicTagIds = musicTagIds;
+	}
+
+	public List<Long> getMusicTagIdList() {
+		return musicTagIdList;
+	}
+
+	public void setMusicTagIdList(List<Long> musicTagIdList) {
+		this.musicTagIdList = musicTagIdList;
+		if (StringUtils.isNotBlank(musicTagIds)) {
+			this.musicTagIdList = StringUtil.toLongList(musicTagIds);
+		}
+	}
+
+	public String getSubjectIds() {
+		return subjectIds;
+	}
+
+	public void setSubjectIds(String subjectIds) {
+		this.subjectIds = subjectIds;
+		if (StringUtils.isNotBlank(subjectIds)) {
+			this.subjectIdList = StringUtil.toLongList(subjectIds);
+		}
+	}
+
+	public List<Long> getSubjectIdList() {
+		return subjectIdList;
+	}
+
+	public void setSubjectIdList(List<Long> subjectIdList) {
+		this.subjectIdList = subjectIdList;
+	}
+
+	public YesOrNoEnum getStatus() {
+		return status;
+	}
+
+	public void setStatus(YesOrNoEnum status) {
+		this.status = status;
+	}
+
+	public ClientEnum getClientType() {
+		return clientType;
+	}
+
+	public void setClientType(ClientEnum clientType) {
+		this.clientType = clientType;
+	}
+
+	public Long getUserId() {
+		return userId;
+	}
+
+	public void setUserId(Long userId) {
+		this.userId = userId;
+	}
+
+}

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

@@ -1,6 +1,8 @@
 package com.yonge.cooleshow.biz.dal.dto.search;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.yonge.cooleshow.biz.dal.enums.course.CourseRelationTypeEnum;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.page.QueryInfo;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -26,7 +28,7 @@ public class CourseGroupSearch extends QueryInfo {
     @ApiModelProperty("课程id")
     private Long courseId;
 
-    @ApiModelProperty(value = "课程状态")
+    @ApiModelProperty(value = "课程状态 DOING UNPASS PASS")
     private String status;
 
     @ApiModelProperty(value = "结算状态")
@@ -51,9 +53,42 @@ public class CourseGroupSearch extends QueryInfo {
     @ApiModelProperty(value = "老师id")
     private Long teacherId;
 
+    @ApiModelProperty(value = "关联曲目专辑类型,RECOMMEND:推荐  GIFT:赠品")
+    private CourseRelationTypeEnum relationType;
+
+    @ApiModelProperty("置顶")
+    private YesOrNoEnum topFlag;
+
     @ApiModelProperty(value = "是否上架 (0:否  1:是)")
     private Integer shelvesFlag;
 
+    @ApiModelProperty(value = "是否草稿 (0:否  1:是)",hidden = true)
+    private Integer draftFlag;
+
+    public CourseRelationTypeEnum getRelationType() {
+        return relationType;
+    }
+
+    public void setRelationType(CourseRelationTypeEnum relationType) {
+        this.relationType = relationType;
+    }
+
+    public YesOrNoEnum getTopFlag() {
+        return topFlag;
+    }
+
+    public void setTopFlag(YesOrNoEnum topFlag) {
+        this.topFlag = topFlag;
+    }
+
+    public Integer getDraftFlag() {
+        return draftFlag;
+    }
+
+    public void setDraftFlag(Integer draftFlag) {
+        this.draftFlag = draftFlag;
+    }
+
     public Long getStudentId() {
         return studentId;
     }

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

@@ -8,9 +8,11 @@ import com.yonge.toolset.base.util.StringUtil;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * Description 专辑查询
@@ -86,7 +88,13 @@ public class MusicAlbumSearch extends QueryInfo{
     public void setSubjectIds(String subjectIds) {
         this.subjectIds = subjectIds;
         if (StringUtils.isNotBlank(subjectIds)) {
-            this.subjectIdList = StringUtil.toLongList(subjectIds);
+            // 过滤掉声部id为 0的
+            List<Long> list = StringUtil.toLongList(subjectIds);
+            this.subjectIdList = list.stream().filter(l -> !l.equals(0L)).collect(Collectors.toList());
+            if (CollectionUtils.isEmpty(this.subjectIdList)) {
+                this.subjectIdList = null;
+                this.subjectIds = null;
+            }
         }
     }
 

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

@@ -4,15 +4,18 @@ import com.yonge.cooleshow.biz.dal.enums.AccompanimentTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.AudioTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
 import com.yonge.cooleshow.biz.dal.enums.ChargeTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.MusicSortType;
 import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.page.QueryInfo;
 import com.yonge.toolset.base.util.StringUtil;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * Description
@@ -78,6 +81,17 @@ public class MusicSheetSearch  extends QueryInfo{
     @ApiModelProperty(value = "伴奏类型 HOMEMODE:自制伴奏  COMMON:普通伴奏")
     private AccompanimentTypeEnum accompanimentType;
 
+    @ApiModelProperty("TOP:推荐曲目 NEW:最新曲目 HOT:最热曲目")
+    private MusicSortType musicSortType;
+
+    public MusicSortType getMusicSortType() {
+        return musicSortType;
+    }
+
+    public void setMusicSortType(MusicSortType musicSortType) {
+        this.musicSortType = musicSortType;
+    }
+
     public AudioTypeEnum getAudioType() {
         return audioType;
     }
@@ -176,7 +190,13 @@ public class MusicSheetSearch  extends QueryInfo{
     public void setSubjectIds(String subjectIds) {
         this.subjectIds = subjectIds;
         if (StringUtils.isNotBlank(subjectIds)) {
-            this.subjectIdList = StringUtil.toLongList(subjectIds);
+            // 过滤掉声部id为 0的
+            List<Long> list = StringUtil.toLongList(subjectIds);
+            this.subjectIdList = list.stream().filter(l -> !l.equals(0L)).collect(Collectors.toList());
+            if (CollectionUtils.isEmpty(this.subjectIdList)) {
+                this.subjectIdList = null;
+                this.subjectIds = null;
+            }
         }
     }
 

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

@@ -0,0 +1,83 @@
+package com.yonge.cooleshow.biz.dal.dto.search;
+
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.toolset.base.page.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+/**
+ * @Author: liweifan
+ * @Data: 2022-11-08 15:37:44
+ */
+@ApiModel(value = "ReturnVisitSearch对象", description = "回访表查询对象")
+public class ReturnVisitSearch extends QueryInfo{
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty("用户id")
+	private Long userId;
+
+	@ApiModelProperty("用户类型  STUDENT  TEACHER")
+	private ClientEnum clientType;
+
+	@ApiModelProperty("回访用户名")
+	private String username;
+
+	@ApiModelProperty("回访标题")
+	private String title;
+
+	@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 Long getUserId() {
+		return userId;
+	}
+
+	public void setUserId(Long userId) {
+		this.userId = userId;
+	}
+
+	public ClientEnum getClientType() {
+		return clientType;
+	}
+
+	public void setClientType(ClientEnum clientType) {
+		this.clientType = clientType;
+	}
+
+	public String getUsername() {
+		return username;
+	}
+
+	public void setUsername(String username) {
+		this.username = username;
+	}
+
+	public String getTitle() {
+		return title;
+	}
+
+	public void setTitle(String title) {
+		this.title = title;
+	}
+}

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

@@ -29,6 +29,9 @@ public class StudentMusicAlbumSearch extends MusicAlbumSearch{
     @ApiModelProperty(value = "购买类型 ", hidden = true)
     private PurchaseRecordTypeEnum purchaseType;
 
+    @ApiModelProperty("课程赠品 0:购买 1:赠品")
+    private Integer courseGift;
+
     @ApiModelProperty(value = "用户类型 TEACHER:老师,STUDENT:学生", hidden = true)
     private ClientEnum clientType;
 
@@ -81,6 +84,14 @@ public class StudentMusicAlbumSearch extends MusicAlbumSearch{
     }
 
 
+    public Integer getCourseGift() {
+        return courseGift;
+    }
+
+    public void setCourseGift(Integer courseGift) {
+        this.courseGift = courseGift;
+    }
+
     public StudentMusicAlbumSearch studentId(Long studentId) {
         this.studentId = studentId;
         return this;
@@ -110,4 +121,9 @@ public class StudentMusicAlbumSearch extends MusicAlbumSearch{
         this.clientType = clientType;
         return this;
     }
+
+    public StudentMusicAlbumSearch courseGift(Integer courseGift) {
+        this.courseGift = courseGift;
+        return this;
+    }
 }

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

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.dto.search;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.page.QueryInfo;
 import com.yonge.toolset.base.util.StringUtil;
@@ -24,13 +25,13 @@ public class StudentMusicSheetOrderSearch extends QueryInfo {
     @NotNull(message = "学生编号不能为空")
     private Long studentId;
 
-    @ApiModelProperty("曲目编号/名称")
+    @ApiModelProperty("编号/名称")
     private String idAndName;
 
     @ApiModelProperty("订单号")
     private String orderNo;
 
-    @ApiModelProperty("曲目标签id,多个逗号隔开")
+    @ApiModelProperty("标签id,多个逗号隔开")
     private String musicTagIds;
 
     @ApiModelProperty(hidden = true)

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

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.dto.search;
 
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
 import io.swagger.annotations.ApiModelProperty;
 
 /**
@@ -24,7 +25,11 @@ public class StudentMusicSheetSearch  extends MusicSheetSearch{
     @ApiModelProperty(value = "用户类型",hidden = true)
     private ClientEnum userType;
 
+    @ApiModelProperty("购买类型 ")
+    private PurchaseRecordTypeEnum purchaseType;
 
+    @ApiModelProperty("课程赠品 0:购买 1:赠品")
+    private Integer courseGift;
 
     @ApiModelProperty(value = "版本号")
     private String version;
@@ -92,4 +97,20 @@ public class StudentMusicSheetSearch  extends MusicSheetSearch{
     public void setClientType(ClientEnum clientType) {
         this.clientType = clientType;
     }
+
+    public PurchaseRecordTypeEnum getPurchaseType() {
+        return purchaseType;
+    }
+
+    public void setPurchaseType(PurchaseRecordTypeEnum purchaseType) {
+        this.purchaseType = purchaseType;
+    }
+
+    public Integer getCourseGift() {
+        return courseGift;
+    }
+
+    public void setCourseGift(Integer courseGift) {
+        this.courseGift = courseGift;
+    }
 }

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

@@ -28,6 +28,13 @@ public class StudentSearch extends QueryInfo{
     private YesOrNoEnum delFlag;
     @ApiModelProperty(value = "是否会员 0否 1是")
     private YesOrNoEnum isVip;
+
+    @ApiModelProperty(value = "是否练习 0否 1是")
+    private YesOrNoEnum trainFlag;
+
+    @ApiModelProperty(value = "是否评测 0否 1是")
+    private YesOrNoEnum evaluateFlag;
+
     @ApiModelProperty(value = "注册开始时间")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@@ -36,10 +43,36 @@ public class StudentSearch extends QueryInfo{
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date endTime;
-    
+
+
+    @ApiModelProperty(value = "会员结束开始时间")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date vipStartTime;
+    @ApiModelProperty(value = "会员结束结束时间")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date vipEndTime;
+
     @ApiModelProperty("用户状态")
     private String userStatus;
 
+    public Date getVipStartTime() {
+        return vipStartTime;
+    }
+
+    public void setVipStartTime(Date vipStartTime) {
+        this.vipStartTime = vipStartTime;
+    }
+
+    public Date getVipEndTime() {
+        return vipEndTime;
+    }
+
+    public void setVipEndTime(Date vipEndTime) {
+        this.vipEndTime = vipEndTime;
+    }
+
     public String getSearch() {
         return search;
     }
@@ -115,4 +148,26 @@ public class StudentSearch extends QueryInfo{
 	public void setDelFlag(YesOrNoEnum delFlag) {
 		this.delFlag = delFlag;
 	}
+
+    public YesOrNoEnum getTrainFlag() {
+        if (YesOrNoEnum.YES == trainFlag) {
+            return trainFlag;
+        }
+        return null;
+    }
+
+    public void setTrainFlag(YesOrNoEnum trainFlag) {
+        this.trainFlag = trainFlag;
+    }
+
+    public YesOrNoEnum getEvaluateFlag() {
+        if (YesOrNoEnum.YES == evaluateFlag) {
+            return evaluateFlag;
+        }
+        return null;
+    }
+
+    public void setEvaluateFlag(YesOrNoEnum evaluateFlag) {
+        this.evaluateFlag = evaluateFlag;
+    }
 }

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

@@ -1,11 +1,14 @@
 package com.yonge.cooleshow.biz.dal.dto.search;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.yonge.cooleshow.common.enums.UserLockFlag;
 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 org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
 
 /**
  * @Author: liweifan
@@ -41,7 +44,39 @@ public class TeacherSearch extends QueryInfo{
     @ApiModelProperty("是否测试用户")
 	private Boolean isTestUser;
 
-    public String getSearch() {
+	@ApiModelProperty(value = "是否练习 0否 1是")
+	private YesOrNoEnum trainFlag;
+
+	@ApiModelProperty(value = "是否评测 0否 1是")
+	private YesOrNoEnum evaluateFlag;
+
+
+	@ApiModelProperty(value = "会员结束开始时间")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private Date vipStartTime;
+	@ApiModelProperty(value = "会员结束结束时间")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private Date vipEndTime;
+
+	public Date getVipStartTime() {
+		return vipStartTime;
+	}
+
+	public void setVipStartTime(Date vipStartTime) {
+		this.vipStartTime = vipStartTime;
+	}
+
+	public Date getVipEndTime() {
+		return vipEndTime;
+	}
+
+	public void setVipEndTime(Date vipEndTime) {
+		this.vipEndTime = vipEndTime;
+	}
+
+	public String getSearch() {
         return search;
     }
 
@@ -120,4 +155,26 @@ public class TeacherSearch extends QueryInfo{
 	public void setIsTestUser(Boolean isTestUser) {
 		this.isTestUser = isTestUser;
 	}
+
+	public YesOrNoEnum getTrainFlag() {
+		if (YesOrNoEnum.YES == trainFlag) {
+			return trainFlag;
+		}
+		return null;
+	}
+
+	public void setTrainFlag(YesOrNoEnum trainFlag) {
+		this.trainFlag = trainFlag;
+	}
+
+	public YesOrNoEnum getEvaluateFlag() {
+		if (YesOrNoEnum.YES == evaluateFlag) {
+			return evaluateFlag;
+		}
+		return null;
+	}
+
+	public void setEvaluateFlag(YesOrNoEnum evaluateFlag) {
+		this.evaluateFlag = evaluateFlag;
+	}
 }

+ 115 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseCourseware.java

@@ -0,0 +1,115 @@
+package com.yonge.cooleshow.biz.dal.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 课件表
+ */
+@TableName("course_courseware")
+@ApiModel(value = "CourseCourseware对象", description = "课件表")
+public class CourseCourseware implements Serializable {
+    private static final long serialVersionUID = 1L;
+    @ApiModelProperty("主键 ")
+    @TableId(value = "id_", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("用户id ")
+    @TableField(value = "user_id_")
+    private Long userId;
+
+    @ApiModelProperty("用户类型 STUDENT,TEACHER ")
+    @TableField(value = "client_type_")
+    private ClientEnum clientType;
+
+    @ApiModelProperty("曲目id ")
+    @TableField(value = "music_sheet_id_")
+    @NotNull(message = "曲目id不能为空")
+    private Long musicSheetId;
+
+    @ApiModelProperty("创建时间 ")
+    @TableField(value = "create_time_")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date createTime;
+
+    @ApiModelProperty("更新时间 ")
+    @TableField(value = "update_time_")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date updateTime;
+
+    @ApiModelProperty("假删除标识 0:未删除 1:已删除 ")
+    @TableField(value = "del_flag_")
+    private Boolean delFlag;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public ClientEnum getClientType() {
+        return clientType;
+    }
+
+    public void setClientType(ClientEnum clientType) {
+        this.clientType = clientType;
+    }
+
+    public Long getMusicSheetId() {
+        return musicSheetId;
+    }
+
+    public void setMusicSheetId(Long musicSheetId) {
+        this.musicSheetId = musicSheetId;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public Boolean getDelFlag() {
+        return delFlag;
+    }
+
+    public void setDelFlag(Boolean delFlag) {
+        this.delFlag = delFlag;
+    }
+
+}

+ 166 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseRelationMusicAlbum.java

@@ -0,0 +1,166 @@
+package com.yonge.cooleshow.biz.dal.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.yonge.cooleshow.biz.dal.enums.course.CourseRelationTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.course.CourseTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.course.RelationMusicAlbumEnum;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * 课程关联曲目专辑
+ */
+@TableName("course_relation_music_album")
+@ApiModel(value = "CourseRelationMusicAlbum对象", description = "课程关联曲目专辑")
+public class CourseRelationMusicAlbum implements Serializable {
+	private static final long serialVersionUID = 1L;
+    @ApiModelProperty("主键 ")
+    @TableId(value = "id_", type = IdType.AUTO)
+    private Long id;
+    @ApiModelProperty("课程组id ")
+	@TableField(value = "course_group_id_")
+    private Long courseGroupId;
+    @ApiModelProperty("课程ID ")
+	@TableField(value = "course_id_")
+    private Long courseId;
+    @ApiModelProperty("课程类型 ")
+	@TableField(value = "course_type_")
+    private CourseTypeEnum courseType;
+    @ApiModelProperty("关联类型, MUSIC, ALBUM ")
+	@TableField(value = "relation_type_")
+    private RelationMusicAlbumEnum relationType;
+
+    @ApiModelProperty("关联类型,RECOMMEND:推荐  GIFT:赠品 ")
+    @TableField(value = "use_relation_type_")
+    private CourseRelationTypeEnum useRelationType;
+
+    @ApiModelProperty("关联曲目专辑ID ")
+	@TableField(value = "music_album_id_")
+    private Long musicAlbumId;
+
+    @ApiModelProperty(" 0 :删除 1:更新 2: 新增")
+    @TableField(value = "del_flag_")
+    private Integer delFlog;
+    @ApiModelProperty("更新用户 ")
+	@TableField(value = "update_by_")
+    private Long updateBy;
+    @ApiModelProperty("更新时间 ")
+	@TableField(value = "update_time_")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date updateTime;
+    @ApiModelProperty("创建用户 ")
+	@TableField(value = "create_by_")
+    private Long createBy;
+    @ApiModelProperty("创建时间 ")
+	@TableField(value = "create_time_")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date createTime;
+
+    public CourseRelationTypeEnum getUseRelationType() {
+        return useRelationType;
+    }
+
+    public void setUseRelationType(CourseRelationTypeEnum useRelationType) {
+        this.useRelationType = useRelationType;
+    }
+
+    public Integer getDelFlog() {
+        return delFlog;
+    }
+
+    public void setDelFlog(Integer delFlog) {
+        this.delFlog = delFlog;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+    
+	public Long getCourseGroupId() {
+        return courseGroupId;
+    }
+
+    public void setCourseGroupId(Long courseGroupId) {
+        this.courseGroupId = courseGroupId;
+    }
+    
+	public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
+    public CourseTypeEnum getCourseType() {
+        return courseType;
+    }
+
+    public void setCourseType(CourseTypeEnum courseType) {
+        this.courseType = courseType;
+    }
+
+    public RelationMusicAlbumEnum getRelationType() {
+        return relationType;
+    }
+
+    public void setRelationType(RelationMusicAlbumEnum relationType) {
+        this.relationType = relationType;
+    }
+
+    public Long getMusicAlbumId() {
+        return musicAlbumId;
+    }
+
+    public void setMusicAlbumId(Long musicAlbumId) {
+        this.musicAlbumId = musicAlbumId;
+    }
+    
+	public Long getUpdateBy() {
+        return updateBy;
+    }
+
+    public void setUpdateBy(Long updateBy) {
+        this.updateBy = updateBy;
+    }
+    
+	public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+    
+	public Long getCreateBy() {
+        return createBy;
+    }
+
+    public void setCreateBy(Long createBy) {
+        this.createBy = createBy;
+    }
+    
+	public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+    
+}

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

@@ -72,6 +72,10 @@ public class ImNetworkRoomMember implements Serializable {
     @ApiModelProperty(value = "当前用户伴奏信息")
     private List<CourseScheduleStudentMusicSheetResult> musicSheetResults;
 
+    @TableField(exist = false)
+    @ApiModelProperty(value = "IM用户ID")
+    private String imUserId;
+
     public List<CourseScheduleStudentMusicSheetResult> getMusicSheetResults() {
         return musicSheetResults;
     }
@@ -175,5 +179,13 @@ public class ImNetworkRoomMember implements Serializable {
     public void setHandFlag(boolean handFlag) {
         this.handFlag = handFlag;
     }
+
+    public String getImUserId() {
+        return imUserId;
+    }
+
+    public void setImUserId(String imUserId) {
+        this.imUserId = imUserId;
+    }
 }
 

+ 16 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImUserFriend.java

@@ -28,18 +28,22 @@ public class ImUserFriend implements Serializable {
     @ApiModelProperty(value = "当前用户编号")
     private Long userId;
 
+    @TableField("client_type_")
+    @ApiModelProperty(value = "客户端类型")
+    private ClientEnum clientType;
+
     @TableField("friend_id_")
     @ApiModelProperty(value = "好友编号")
     private Long friendId;
 
+    @TableField("friend_type_")
+    @ApiModelProperty(value = "好友身份")
+    private ClientEnum friendType;
+
     @TableField(exist = false)
     @ApiModelProperty(value = "融云好友编号")
     private String imFriendId;
 
-    @TableField(exist = false)
-    @ApiModelProperty(value = "好友用户身份")
-    private ClientEnum clientType;
-
     @TableField("friend_avatar_")
     @ApiModelProperty(value = "好友头像")
     private String friendAvatar;
@@ -145,5 +149,13 @@ public class ImUserFriend implements Serializable {
         this.clientType = clientType;
         return this;
     }
+
+    public ClientEnum getFriendType() {
+        return friendType;
+    }
+
+    public void setFriendType(ClientEnum friendType) {
+        this.friendType = friendType;
+    }
 }
 

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

@@ -70,6 +70,12 @@ public class MusicAlbum extends BaseEntity {
     @ApiModelProperty(value = "是否置顶(1:是;0:否)")
     private YesOrNoEnum topFlag;  //是否置顶(1:是;0:否)
 
+
+
+	@ApiModelProperty("虚拟人数 ")
+	@TableField(value = "virtual_number_")
+	private Integer virtualNumber;
+
     @TableField("create_time_")
     @ApiModelProperty(value = "创建时间")
     private java.util.Date createTime;  //创建时间
@@ -98,6 +104,15 @@ public class MusicAlbum extends BaseEntity {
 	@ApiModelProperty("专辑价格 ")
 	private String paymentType;
 
+
+	public Integer getVirtualNumber() {
+		return virtualNumber;
+	}
+
+	public void setVirtualNumber(Integer virtualNumber) {
+		this.virtualNumber = virtualNumber;
+	}
+
 	public String getSubjectId() {
 		return subjectId;
 	}

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

@@ -6,6 +6,8 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import java.io.Serializable;
 import java.util.Date;
+
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Getter;
@@ -37,7 +39,7 @@ public class MusicCompareRecordStat implements Serializable {
 
     @ApiModelProperty("客户端标识")
     @TableField("client_id_")
-    private String clientId;
+    private ClientEnum clientId;
 
     @ApiModelProperty("用户编号")
     @TableField("user_id_")

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

@@ -84,6 +84,16 @@ public class MusicSheet implements Serializable {
 	@ApiModelProperty(value = "mp3类型 MP3:mp3, MP3_METRONOME:MP3_METRONOME,")
 	private AudioTypeEnum mp3Type;
 
+
+	@TableField("favorite_count_")
+	@ApiModelProperty(value = "收藏数")
+	private Integer favoriteCount;
+
+
+	@ApiModelProperty("虚拟人数 ")
+	@TableField(value = "virtual_number_")
+	private Integer virtualNumber;
+
     @NotBlank(message = "曲谱标签不能为空!")
     @TableField("music_tag_")
     @ApiModelProperty(value = "曲谱标签(多个标签用逗号分隔)")
@@ -134,6 +144,10 @@ public class MusicSheet implements Serializable {
 	@ApiModelProperty(value = "提交审核时间")
 	private Date submitAuditTime;
 
+	@TableField("first_pass_audit_time_")
+	@ApiModelProperty(value = "第一次通过审核时间")
+	private Date firstPassAuditTime;
+
     @TableField("sort_number_")
     @ApiModelProperty(value = "排序号")
     private Integer sortNumber;  //排序号
@@ -216,6 +230,30 @@ public class MusicSheet implements Serializable {
 	@ApiModelProperty(value = "假删除标识 0:未删除 1:已删除")
 	private Boolean delFlag;
 
+	public Integer getVirtualNumber() {
+		return virtualNumber;
+	}
+
+	public void setVirtualNumber(Integer virtualNumber) {
+		this.virtualNumber = virtualNumber;
+	}
+
+	public Date getFirstPassAuditTime() {
+		return firstPassAuditTime;
+	}
+
+	public void setFirstPassAuditTime(Date firstPassAuditTime) {
+		this.firstPassAuditTime = firstPassAuditTime;
+	}
+
+	public Integer getFavoriteCount() {
+		return favoriteCount;
+	}
+
+	public void setFavoriteCount(Integer favoriteCount) {
+		this.favoriteCount = favoriteCount;
+	}
+
 	public String getMusicImg() {
 		return musicImg;
 	}

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

@@ -68,10 +68,23 @@ public class MusicSheetPurchaseRecord extends BaseEntity {
     @ApiModelProperty(value = "订单状态(WAIT_PAY:待支付;PAYING:支付中,PAID:已付款)")
     private OrderStatusEnum orderStatus;  //订单状态(1:已完成;0:取消)
 
+
+	@TableField("course_music_album_id_")
+	@ApiModelProperty(value = "课程关联曲目专辑ID")
+	private  Long courseMusicAlbumId;
+
 	@TableField("purchase_type_")
 	@ApiModelProperty("购买类型 ")
 	private PurchaseRecordTypeEnum purchaseType;
 
+	public Long getCourseMusicAlbumId() {
+		return courseMusicAlbumId;
+	}
+
+	public void setCourseMusicAlbumId(Long courseMusicAlbumId) {
+		this.courseMusicAlbumId = courseMusicAlbumId;
+	}
+
 	public ClientEnum getClientType() {
 		return clientType;
 	}

+ 116 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ReturnVisit.java

@@ -0,0 +1,116 @@
+package com.yonge.cooleshow.biz.dal.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.common.enums.SysUserType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 回访表
+ */
+@TableName("return_visit")
+@ApiModel(value = "ReturnVisit对象", description = "回访表")
+public class ReturnVisit implements Serializable {
+    private static final long serialVersionUID = 1L;
+    @ApiModelProperty(value = "主键 ",hidden = true)
+    @TableId(value = "id_", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty(value = "用户id ",required = true)
+    @TableField(value = "user_id_")
+    @NotNull(message = "回访用户不能为空")
+    private Long userId;
+
+    @ApiModelProperty(value = "用户类型 ",required = true)
+    @TableField(value = "client_type_")
+    @NotNull(message = "用户类型不能为空")
+    private SysUserType clientType;
+
+    @ApiModelProperty(value = "回访标题 ",required = true)
+    @TableField(value = "title_")
+    // @NotBlank(message = "回访标题不能为空")
+    private String title;
+
+    @ApiModelProperty(value = "回访内容 ",required = true)
+    @TableField(value = "content_")
+    @NotBlank(message = "回访内容不能为空")
+    private String content;
+
+    @ApiModelProperty(value = "创建时间 ",hidden = true)
+    @TableField(value = "create_time_")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+
+    @ApiModelProperty(value = "创建人 ",hidden = true)
+    @TableField(value = "create_by_")
+    private Long createBy;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public SysUserType getClientType() {
+        return clientType;
+    }
+
+    public void setClientType(SysUserType clientType) {
+        this.clientType = clientType;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Long getCreateBy() {
+        return createBy;
+    }
+
+    public void setCreateBy(Long createBy) {
+        this.createBy = createBy;
+    }
+
+}

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

@@ -1,14 +1,16 @@
 package com.yonge.cooleshow.biz.dal.entity;
 
-import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.yonge.cooleshow.common.enums.UserLockFlag;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
 import java.util.Date;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import org.springframework.format.annotation.DateTimeFormat;
 
 /**
  * 学生表
@@ -64,6 +66,15 @@ public class Student implements Serializable {
     @ApiModelProperty("锁定状态 0-正常, 1=锁定")
     @TableField(value = "lock_flag_")
     private UserLockFlag lockFlag;
+
+    @ApiModelProperty("练习时长 ")
+    @TableField(value = "train_time_")
+    private Long trainTime;
+
+    @ApiModelProperty("评测时长 ")
+    @TableField(value = "evaluate_time_")
+    private Long evaluateTime;
+
 	@TableField(value = "create_time_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
@@ -152,4 +163,20 @@ public class Student implements Serializable {
     public void setLockFlag(UserLockFlag lockFlag) {
         this.lockFlag = lockFlag;
     }
+
+    public Long getTrainTime() {
+        return trainTime;
+    }
+
+    public void setTrainTime(Long trainTime) {
+        this.trainTime = trainTime;
+    }
+
+    public Long getEvaluateTime() {
+        return evaluateTime;
+    }
+
+    public void setEvaluateTime(Long evaluateTime) {
+        this.evaluateTime = evaluateTime;
+    }
 }

+ 39 - 6
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/Teacher.java

@@ -1,21 +1,18 @@
 package com.yonge.cooleshow.biz.dal.entity;
 
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
-
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.yonge.cooleshow.common.enums.UserLockFlag;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
 import java.util.Date;
 
-import com.fasterxml.jackson.annotation.JsonFormat;
-
-import org.springframework.format.annotation.DateTimeFormat;
-
 /**
  * 教师表
  */
@@ -59,6 +56,10 @@ public class Teacher implements Serializable {
     @ApiModelProperty("声部id(支持多个,用逗号分隔) ")
 	@TableField(value = "subject_id_")
     private String subjectId;
+
+    @ApiModelProperty("查询时的默认声部id")
+    @TableField(value = "default_subject_")
+    private Long defaultSubject;
     /**
      * 个人介绍
      */
@@ -222,6 +223,22 @@ public class Teacher implements Serializable {
     @ApiModelProperty("是否测试用户")
 	private Boolean isTestUser;
 
+    @ApiModelProperty("练习时长 ")
+    @TableField(value = "train_time_")
+    private Long trainTime;
+
+    @ApiModelProperty("评测时长 ")
+    @TableField(value = "evaluate_time_")
+    private Long evaluateTime;
+
+
+    public Long getDefaultSubject() {
+        return defaultSubject;
+    }
+
+    public void setDefaultSubject(Long defaultSubject) {
+        this.defaultSubject = defaultSubject;
+    }
 
     public YesOrNoEnum getDegreeFlag() {
         return degreeFlag;
@@ -503,4 +520,20 @@ public class Teacher implements Serializable {
 	public void setIsTestUser(Boolean isTestUser) {
 		this.isTestUser = isTestUser;
 	}
+
+    public Long getTrainTime() {
+        return trainTime;
+    }
+
+    public void setTrainTime(Long trainTime) {
+        this.trainTime = trainTime;
+    }
+
+    public Long getEvaluateTime() {
+        return evaluateTime;
+    }
+
+    public void setEvaluateTime(Long evaluateTime) {
+        this.evaluateTime = evaluateTime;
+    }
 }

+ 18 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TeacherStyleVideo.java

@@ -44,19 +44,29 @@ public class TeacherStyleVideo implements Serializable {
     @ApiModelProperty("审核状态 DOING、审核中 PASS、通过 UNPASS、不通过 ")
     @TableField(value = "auth_status_")
     private AuthStatusEnum authStatus;
+
     @ApiModelProperty("审核人 ")
     @TableField(value = "verify_user_id_")
     private Long verifyUserId;
+
     @ApiModelProperty("审核理由 ")
     @TableField(value = "reason_")
     private String reason;
+
+    @ApiModelProperty("虚拟人数 ")
+    @TableField(value = "virtual_number_")
+    private Integer virtualNumber;
+
+
     @ApiModelProperty("入驻审核视频 0 否 1 是 ")
     @TableField(value = "entry_flag_")
     private YesOrNoEnum entryFlag;
+
     @TableField(value = "create_time_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
     private Date createTime;
+
     @TableField(value = "update_time_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
@@ -65,6 +75,14 @@ public class TeacherStyleVideo implements Serializable {
     @TableField(value = "del_flag_")
     private Boolean delFlag = false;
 
+    public Integer getVirtualNumber() {
+        return virtualNumber;
+    }
+
+    public void setVirtualNumber(Integer virtualNumber) {
+        this.virtualNumber = virtualNumber;
+    }
+
     public String getCover() {
         return cover;
     }

+ 41 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/VideoLessonGroup.java

@@ -1,5 +1,7 @@
 package com.yonge.cooleshow.biz.dal.entity;
 
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.yonge.cooleshow.biz.dal.enums.course.CourseRelationTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -123,10 +125,49 @@ public class VideoLessonGroup extends BaseEntity {
     @ApiModelProperty(value = "审批人id")
     private Integer auditId;
 
+
+    @TableField("draft_flag_")
+    @ApiModelProperty(value = "草稿状态, 0正式1草稿")
+    private YesOrNoEnum draftFlag;
+
+
+    @TableField("relation_type_")
+    @ApiModelProperty(value = "关联曲目专辑类型,RECOMMEND:推荐  GIFT:赠品")
+    private CourseRelationTypeEnum relationType;
+
     @TableField("audit_version_")
     @ApiModelProperty(value = "是否审核时可见 (0:否  1:是)")
     private YesOrNoEnum auditVersion = YesOrNoEnum.NO;
 
+
+    @ApiModelProperty("虚拟人数 ")
+    @TableField(value = "virtual_number_")
+    private Integer virtualNumber;
+
+    public Integer getVirtualNumber() {
+        return virtualNumber;
+    }
+
+    public void setVirtualNumber(Integer virtualNumber) {
+        this.virtualNumber = virtualNumber;
+    }
+
+    public YesOrNoEnum getDraftFlag() {
+        return draftFlag;
+    }
+
+    public void setDraftFlag(YesOrNoEnum draftFlag) {
+        this.draftFlag = draftFlag;
+    }
+
+    public CourseRelationTypeEnum getRelationType() {
+        return relationType;
+    }
+
+    public void setRelationType(CourseRelationTypeEnum relationType) {
+        this.relationType = relationType;
+    }
+
     public Long getId() {
         return id;
     }

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

@@ -1,11 +1,13 @@
 package com.yonge.cooleshow.biz.dal.entity;
 
+import com.yonge.cooleshow.biz.dal.enums.course.CourseRelationTypeEnum;
 import com.yonge.cooleshow.biz.dal.valid.AddGroup;
 import com.yonge.cooleshow.biz.dal.valid.UpdateGroup;
 import com.yonge.cooleshow.common.entity.BaseEntity;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
@@ -20,7 +22,7 @@ import javax.validation.constraints.NotNull;
  * @version v1.0
  **/
 @ApiModel(value = "video_lesson_group_detail-视频课明细表")
-public class 	VideoLessonGroupDetail extends BaseEntity {
+public class VideoLessonGroupDetail extends BaseEntity {
 
     @TableId(value = "id_", type = IdType.AUTO)
     @ApiModelProperty(value = "主键id")
@@ -73,7 +75,6 @@ public class 	VideoLessonGroupDetail extends BaseEntity {
     @ApiModelProperty(value = "更新时间")
     private java.util.Date updateTime;  //更新时间
 
-
 	public VideoLessonGroupDetail setId(Long id) {
 	    this.id = id;
 	    return this;

+ 32 - 5
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/VideoLessonGroupLog.java

@@ -2,6 +2,10 @@ package com.yonge.cooleshow.biz.dal.entity;
 
 import java.util.List;
 
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.yonge.cooleshow.biz.dal.dto.VideoLessonGroupDetailDto;
+import com.yonge.cooleshow.biz.dal.enums.course.CourseRelationTypeEnum;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
 import io.swagger.annotations.ApiModelProperty;
@@ -75,14 +79,37 @@ public class VideoLessonGroupLog {
 	
 	@ApiModelProperty(value = "更新时间",required = false)
 	private java.util.Date updateTime;
-	
+
+	@ApiModelProperty(value = "草稿状态, 0正式1草稿")
+	private YesOrNoEnum draftFlag;
+
+
+	@ApiModelProperty(value = "关联曲目专辑类型,RECOMMEND:推荐  GIFT:赠品")
+	private CourseRelationTypeEnum relationType;
+
 	private Long version;
 	
 	@ApiModelProperty(value = "视频课明细json串",required = false)
 	private String videoDetailJson;
 	
-    private List<VideoLessonGroupDetail> videoList;
-	
+    private List<VideoLessonGroupDetailDto> videoList;
+
+	public YesOrNoEnum getDraftFlag() {
+		return draftFlag;
+	}
+
+	public void setDraftFlag(YesOrNoEnum draftFlag) {
+		this.draftFlag = draftFlag;
+	}
+
+	public CourseRelationTypeEnum getRelationType() {
+		return relationType;
+	}
+
+	public void setRelationType(CourseRelationTypeEnum relationType) {
+		this.relationType = relationType;
+	}
+
 	public VideoLessonGroupLog setId(Long id){
 		this.id = id;
 		return this;
@@ -295,11 +322,11 @@ public class VideoLessonGroupLog {
 		this.videoDetailJson = videoDetailJson;
 	}
 
-	public List<VideoLessonGroupDetail> getVideoList() {
+	public List<VideoLessonGroupDetailDto> getVideoList() {
 		return videoList;
 	}
 
-	public void setVideoList(List<VideoLessonGroupDetail> videoList) {
+	public void setVideoList(List<VideoLessonGroupDetailDto> videoList) {
 		this.videoList = videoList;
 	}
 

+ 9 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/ClientEnum.java

@@ -51,4 +51,13 @@ public enum ClientEnum implements BaseEnum<String, ClientEnum> {
 
         return true;
     }
+
+    /**
+     * 客户端类型匹配
+     * @param dataType 数据类型
+     * @return boolean
+     */
+    public boolean match(String dataType) {
+        return getCode().equals(dataType);
+    }
 }

+ 34 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/CoursewareEnum.java

@@ -0,0 +1,34 @@
+package com.yonge.cooleshow.biz.dal.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.toolset.base.enums.BaseEnum;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-04-28
+ */
+public enum CoursewareEnum implements BaseEnum<String, CoursewareEnum> {
+    AUDIO("音频"),
+    IMG("图片"),
+
+    ;
+    @EnumValue
+    private String code;
+    private String msg;
+
+    CoursewareEnum(String msg) {
+        this.code = this.name();
+        this.msg = msg;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+}

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

@@ -1,11 +1,13 @@
 package com.yonge.cooleshow.biz.dal.enums;
 
+import com.baomidou.mybatisplus.annotation.EnumValue;
 import com.yonge.toolset.base.enums.BaseEnum;
 
 public enum FeatureType implements BaseEnum<String, FeatureType> {
     CLOUD_STUDY_TRAIN("小酷Ai训练"),
     CLOUD_STUDY_EVALUATION("小酷Ai评测");
 
+    @EnumValue
     private String code;
 
     private String desc;

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác