Преглед на файлове

Merge branch 'dev_v1.3.4_20220919' into online

Eric преди 2 години
родител
ревизия
16221b5757
променени са 52 файла, в които са добавени 1123 реда и са изтрити 159 реда
  1. 9 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/AdminFeignService.java
  2. 27 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/dto/UserFriendInfoVO.java
  3. 12 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/AdminFeignServiceFallback.java
  4. 1 1
      cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/dto/UserSetReq.java
  5. 26 0
      cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/config/CustomerServiceConfig.java
  6. 1 1
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/AuthServerApplication.java
  7. 6 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/provider/PhoneAuthenticationProvider.java
  8. 6 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/SysUserService.java
  9. 81 21
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/SysUserServiceImpl.java
  10. 14 3
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/UserController.java
  11. 1 1
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/AdminApplication.java
  12. 21 9
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/AdminClient.java
  13. 48 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/ImUserFriendController.java
  14. 32 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/im/UserFriendInfoVO.java
  15. 4 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicAlbumDao.java
  16. 4 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicSheetDao.java
  17. 79 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/TeacherMusicSheetAuditReq.java
  18. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MusicAlbumDetailSearch.java
  19. 10 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/StudentMusicSheetSearch.java
  20. 13 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/AlbumFavorite.java
  21. 13 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicFavorite.java
  22. 56 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicSheet.java
  23. 19 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/ClientEnum.java
  24. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MK.java
  25. 5 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/AlbumFavoriteService.java
  26. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImUserFriendService.java
  27. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/LiveRoomService.java
  28. 9 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicAlbumService.java
  29. 3 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicFavoriteService.java
  30. 9 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetService.java
  31. 9 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/AlbumFavoriteServiceImpl.java
  32. 74 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImUserFriendServiceImpl.java
  33. 41 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/LiveRoomServiceImpl.java
  34. 11 9
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicAlbumServiceImpl.java
  35. 3 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicFavoriteServiceImpl.java
  36. 30 10
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  37. 17 10
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  38. 77 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/liveroom/LiveRoomWrapper.java
  39. 4 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicAlbumMapper.xml
  40. 7 3
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml
  41. 12 6
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/MusicAlbumController.java
  42. 12 5
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/MusicSheetController.java
  43. 26 0
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/open/OpenClient.java
  44. 90 0
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/io/request/LiveRoomVO.java
  45. 16 8
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/MusicAlbumController.java
  46. 52 3
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/MusicSheetController.java
  47. 9 12
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/SubjectController.java
  48. 5 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherController.java
  49. 16 4
      cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/MusicAlbumController.java
  50. 27 6
      cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/MusicSheetController.java
  51. 19 6
      cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/open/OpenMusicAlbumController.java
  52. 22 5
      cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/open/OpenMusicSheetController.java

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

@@ -4,6 +4,7 @@ import com.yonge.cooleshow.api.feign.dto.CouponInfoApi;
 import com.yonge.cooleshow.api.feign.dto.EmployeeApi;
 import com.yonge.cooleshow.api.feign.dto.StudentApi;
 import com.yonge.cooleshow.api.feign.dto.TeacherApi;
+import com.yonge.cooleshow.api.feign.dto.UserFriendInfoVO;
 import com.yonge.cooleshow.api.feign.fallback.AdminFeignServiceFallback;
 import com.yonge.cooleshow.common.constant.AppConstant;
 import com.yonge.cooleshow.common.entity.ContractDto;
@@ -128,4 +129,12 @@ public interface AdminFeignService {
                                                                @RequestParam("issueIds") String issueIds,
                                                                @RequestParam("orderAmount") BigDecimal orderAmount,
                                                                @RequestParam("client") String client);
+
+    /**
+     * 新用户添加客服好友
+     * @param info UserFriendInfoVO
+     * @return HttpResponseResult<Boolean>
+     */
+    @PostMapping(value = "/open/im/customerService")
+    HttpResponseResult<Boolean> customerService(@RequestBody UserFriendInfoVO info);
 }

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

@@ -0,0 +1,27 @@
+package com.yonge.cooleshow.api.feign.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 用户IM好友信息
+ * Created by Eric.Shang on 2022/9/20.
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserFriendInfoVO implements Serializable {
+
+    // 新用户ID
+    private Long userId;
+
+    // 好友ID
+    private List<Long> friendIds;
+
+}

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

@@ -5,6 +5,7 @@ import com.yonge.cooleshow.api.feign.dto.CouponInfoApi;
 import com.yonge.cooleshow.api.feign.dto.EmployeeApi;
 import com.yonge.cooleshow.api.feign.dto.StudentApi;
 import com.yonge.cooleshow.api.feign.dto.TeacherApi;
+import com.yonge.cooleshow.api.feign.dto.UserFriendInfoVO;
 import com.yonge.cooleshow.common.entity.ContractDto;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.entity.MallOrderItemDto;
@@ -106,4 +107,15 @@ public class AdminFeignServiceFallback implements AdminFeignService {
     public HttpResponseResult<CouponInfoApi> queryCouponOrderPageInfo(Long userId, String issueIds, BigDecimal orderAmount, String client) {
         return null;
     }
+
+    /**
+     * 新用户添加客服好友
+     *
+     * @param info UserFriendInfoVO
+     * @return HttpResponseResult<Boolean>
+     */
+    @Override
+    public HttpResponseResult<Boolean> customerService(UserFriendInfoVO info) {
+        return null;
+    }
 }

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

@@ -20,7 +20,7 @@ public class UserSetReq {
     @ApiModelProperty("头像地址")
     private String avatar;
     @ApiModelProperty("昵称")
-    @Size(max = 7, message = "昵称长度不能超过7个字")
+    @Size(max = 12, message = "昵称长度不能超过12个字")
     private String username;
     @ApiModelProperty(value = "性别 0女 1男")
     private Integer gender;

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

@@ -0,0 +1,26 @@
+package com.yonge.cooleshow.auth.config;
+
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.stereotype.Component;
+
+import java.io.Serializable;
+
+/**
+ * 系统客服配置
+ * Created by Eric.Shang on 2022/9/21.
+ */
+@Data
+@RefreshScope
+@Component
+public class CustomerServiceConfig implements Serializable {
+
+    @Value("${app.customer.service:17740683946}")
+    private String customerService;
+    @Value("${app.customer.message:}")
+    private String customerMessage;
+    @Value("${app.customer.title:}")
+    private String customerTitle;
+
+}

+ 1 - 1
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/AuthServerApplication.java

@@ -19,7 +19,7 @@ import com.spring4all.swagger.EnableSwagger2Doc;
 @EnableDiscoveryClient
 @EnableFeignClients("com.yonge.cooleshow")
 @MapperScan("com.yonge.cooleshow.auth.dal.dao")
-@ComponentScan(basePackages = {"com.yonge.cooleshow", "com.yonge.toolset"})
+@ComponentScan(basePackages = {"com.yonge.cooleshow", "com.yonge.toolset", "com.yonge.cooleshow.auth.config"})
 @Configuration
 @EnableSwagger2Doc
 @EnableAsync

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

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.auth.core.provider;
 
 import java.util.Date;
+import java.util.Objects;
 
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.security.authentication.BadCredentialsException;
@@ -77,6 +78,11 @@ public class PhoneAuthenticationProvider extends AbstractAuthenticationProvider
 
             userInfo = sysUserService.registerUser(loginEntity.getPhone(), clientId, loginUserType);
 
+            if (Objects.nonNull(userInfo.getSysUser())) {
+                // 自动添加系统默认IM帐号为好友,并自动发送通知消息
+                sysUserService.sendSysCustomerServiceFriendMessage(userInfo.getSysUser());
+            }
+
             if (StringUtils.isNotBlank(deviceNum)) {
                 sysUserDeviceService.bindDevice(clientId, userInfo.getSysUser().getId(), deviceNum);
             }

+ 6 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/SysUserService.java

@@ -121,6 +121,12 @@ public interface SysUserService extends BaseService<Long, SysUser> {
     SysUserInfo registerUser(String phone, String clientId, String loginUserType);
 
     /**
+     * 添加系统客服好友消息
+     * @param sysUser SysUser
+     */
+    void sendSysCustomerServiceFriendMessage(SysUser sysUser);
+
+    /**
      * 刷新token
      *
      * @param sysUser

+ 81 - 21
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/SysUserServiceImpl.java

@@ -1,38 +1,54 @@
 package com.yonge.cooleshow.auth.service.impl;
 
-import java.util.List;
-
+import com.alibaba.fastjson.JSON;
+import com.google.common.collect.Lists;
 import com.yonge.cooleshow.api.feign.AdminFeignService;
-import com.yonge.cooleshow.auth.api.dto.*;
+import com.yonge.cooleshow.api.feign.dto.UserFriendInfoVO;
+import com.yonge.cooleshow.auth.api.dto.QRLoginDto;
+import com.yonge.cooleshow.auth.api.dto.RealnameAuthReq;
+import com.yonge.cooleshow.auth.api.dto.SysUserInfo;
+import com.yonge.cooleshow.auth.api.dto.SysUserQueryInfo;
+import com.yonge.cooleshow.auth.api.dto.UserSetReq;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.auth.api.vo.UserSetVo;
+import com.yonge.cooleshow.auth.config.CustomerServiceConfig;
 import com.yonge.cooleshow.auth.config.RongCloudConfig;
+import com.yonge.cooleshow.auth.dal.dao.SysUserDao;
+import com.yonge.cooleshow.auth.service.SysConfigService;
+import com.yonge.cooleshow.auth.service.SysRoleMenuService;
+import com.yonge.cooleshow.auth.service.SysUserRoleService;
+import com.yonge.cooleshow.auth.service.SysUserService;
+import com.yonge.cooleshow.common.constant.SysConfigConstant;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.entity.ImUserModel;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.cooleshow.common.enums.SysUserType;
 import com.yonge.cooleshow.common.enums.UserFirstTimeTypeEnum;
-import com.yonge.cooleshow.common.enums.UserLockFlag;
+import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.base.util.ThreadPool;
+import com.yonge.toolset.mybatis.dal.BaseDAO;
 import com.yonge.toolset.mybatis.service.impl.BaseServiceImpl;
 import io.rong.models.user.UserModel;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-
-import com.yonge.cooleshow.auth.api.entity.SysUser;
-import com.yonge.cooleshow.auth.api.vo.UserSetVo;
-import com.yonge.cooleshow.auth.dal.dao.SysUserDao;
-import com.yonge.cooleshow.auth.service.SysConfigService;
-import com.yonge.cooleshow.auth.service.SysRoleMenuService;
-import com.yonge.cooleshow.auth.service.SysUserRoleService;
-import com.yonge.cooleshow.auth.service.SysUserService;
-import com.yonge.cooleshow.common.constant.SysConfigConstant;
-import com.yonge.toolset.mybatis.dal.BaseDAO;
-import com.yonge.cooleshow.common.entity.ImUserModel;
-import com.yonge.toolset.base.exception.BizException;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
 import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.Random;
+import java.util.stream.Collectors;
 
+@Slf4j
 @Service
+@RefreshScope
 public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implements SysUserService {
 
     @Autowired
@@ -47,6 +63,8 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
     private RedissonClient redissonClient;
     @Resource
     private AdminFeignService adminFeignService;
+    @Autowired
+    private CustomerServiceConfig customerServiceConfig;
 
     @Override
     public BaseDAO<Long, SysUser> getDAO() {
@@ -135,16 +153,19 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
     @Override
     @Transactional(rollbackFor = Exception.class)
     public SysUserInfo registerUser(String phone, String clientId, String loginUserType) {
+
+        SysUserInfo userInfo = null;
         if (StringUtils.equalsIgnoreCase(loginUserType, "TEACHER")) {
-            return registerTeacher(phone);
+            userInfo = registerTeacher(phone);
         } else if (StringUtils.equalsIgnoreCase(loginUserType, "STUDENT")) {
-            return registerStudent(phone);
+            userInfo = registerStudent(phone);
         } else if (StringUtils.equalsIgnoreCase(clientId, "TEACHER")) {
-            return registerTeacher(phone);
+            userInfo = registerTeacher(phone);
         } else if (StringUtils.equalsIgnoreCase(clientId, "STUDENT")) {
-            return registerStudent(phone);
+            userInfo = registerStudent(phone);
         }
-        return null;
+
+        return userInfo;
     }
 
     private SysUserInfo registerTeacher(String phone) {
@@ -160,6 +181,7 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
         //用户默认昵称
         sysUser.setUsername("游客" + sysUser.getId());
         sysUserDao.update(sysUser);
+
         return queryUserInfoByPhone(phone);
     }
 
@@ -176,9 +198,47 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
         //用户默认昵称
         sysUser.setUsername("游客" + sysUser.getId());
         sysUserDao.update(sysUser);
+
         return queryUserInfoByPhone(phone);
     }
 
+    /**
+     * 添加系统客服好友消息
+     * @param sysUser SysUser
+     */
+    public void sendSysCustomerServiceFriendMessage(SysUser sysUser) {
+
+        try {
+
+            ThreadPool.getExecutor().submit(() -> {
+
+                String customerService = customerServiceConfig.getCustomerService();
+                if (StringUtils.isNotEmpty(customerService)) {
+
+                    List<String> collect = Arrays.stream(customerService.split(",")).collect(Collectors.toList());
+
+                    Random rand = new Random();
+                    String mobile = collect.get(rand.nextInt(collect.size()));
+
+                    // 系统客服好友
+                    SysUser friend = sysUserDao.queryByPhone(mobile);
+
+                    // 发送添加系统客服好友消息
+                    HttpResponseResult<Boolean> result = adminFeignService.customerService(UserFriendInfoVO.builder()
+                            .userId(sysUser.getId())
+                            .friendIds(Lists.newArrayList(friend.getId()))
+                            .build());
+                    log.info("sendSysCustomerServiceFriendMessage mobile={}, ret={}", mobile, JSON.toJSONString(result));
+                }
+
+            });
+
+        } catch (Exception e) {
+            log.error("sendSysCustomerServiceFriendMessage userId={}", sysUser.getId(), e);
+        }
+
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void refreshImToken(SysUser sysUser) {

+ 14 - 3
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/UserController.java

@@ -7,6 +7,7 @@ import io.swagger.annotations.ApiOperation;
 
 import java.util.Date;
 import java.util.List;
+import java.util.Objects;
 
 import javax.validation.Valid;
 
@@ -170,9 +171,12 @@ public class UserController extends BaseController {
 
     @ApiOperation(value = "设置用户名密码")
     @PostMapping(value = "/setUsernameAndPassword", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
-    @ApiImplicitParams({@ApiImplicitParam(name = "password", value = "密码", required = true, dataType = "String"),
-            @ApiImplicitParam(name = "username", value = "用户名", dataType = "String")})
-    public Object setPassword(String password, String username) {
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "password", value = "密码", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "username", value = "用户名", dataType = "String"),
+            @ApiImplicitParam(name = "gender", value = "性别0女1男", dataType = "Integer")
+    })
+    public Object setPassword(String password, String username, Integer gender) {
         if (StringUtils.isEmpty(password)) {
             return failed("参数校验失败");
         }
@@ -184,6 +188,13 @@ public class UserController extends BaseController {
         if (sysUser == null) {
             return failed("用户不存在");
         }
+
+        // 设置用户性别
+        if (Objects.nonNull(gender)) {
+            sysUser.setGender(gender);
+        }
+
+        // 设置用户名称、昵称
         if (!StringUtil.isEmpty(username)) {
             if (sysUser.getUserType().contains("SYSTEM")) {
                 sysUser.setRealName(username);

+ 1 - 1
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/AdminApplication.java

@@ -16,7 +16,7 @@ import org.springframework.scheduling.annotation.EnableScheduling;
 @EnableDiscoveryClient
 @EnableFeignClients("com.yonge.cooleshow")
 @MapperScan(basePackages = {"com.yonge.cooleshow.biz.dal.dao", "com.yonge.cooleshow.biz.dal.mapper", "com.yonge.toolset.payment.core.dao"})
-@ComponentScan(basePackages = {"com.yonge.cooleshow", "com.yonge.toolset"})
+@ComponentScan(basePackages = {"com.yonge.cooleshow", "com.yonge.toolset", "com.yonge.cooleshow.auth.config"})
 @Configuration
 @EnableSwagger2Doc
 @EnableScheduling

+ 21 - 9
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/AdminClient.java

@@ -1,6 +1,5 @@
 package com.yonge.cooleshow.admin.controller.open;
 
-import com.alibaba.fastjson.JSON;
 import com.yonge.cooleshow.admin.io.request.coupon.CouponOrderVO;
 import com.yonge.cooleshow.api.feign.dto.CouponInfoApi;
 import com.yonge.cooleshow.api.feign.dto.EmployeeApi;
@@ -10,23 +9,30 @@ import com.yonge.cooleshow.biz.dal.entity.Employee;
 import com.yonge.cooleshow.biz.dal.entity.Student;
 import com.yonge.cooleshow.biz.dal.entity.Teacher;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
-import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.coupon.CouponCategoryEnum;
 import com.yonge.cooleshow.biz.dal.enums.coupon.CouponUseStateEnum;
 import com.yonge.cooleshow.biz.dal.queryInfo.CouponInfoQuery;
-import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.service.CouponInfoService;
+import com.yonge.cooleshow.biz.dal.service.EmployeeService;
+import com.yonge.cooleshow.biz.dal.service.StudentService;
+import com.yonge.cooleshow.biz.dal.service.TeacherService;
+import com.yonge.cooleshow.biz.dal.service.UserFirstTimeService;
 import com.yonge.cooleshow.biz.dal.wrapper.coupon.CouponOrderWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
-import com.yonge.cooleshow.common.entity.ContractDto;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.UserFirstTimeTypeEnum;
 import io.swagger.annotations.ApiOperation;
+import org.apache.commons.collections.CollectionUtils;
 import org.joda.time.DateTime;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
 
 import java.math.BigDecimal;
 import java.util.Arrays;
@@ -111,11 +117,17 @@ public class AdminClient extends BaseController {
         request.setTimestamp(DateTime.now().getMillis());
         request.setAmount(orderAmount.doubleValue());
 
-        // 订单优惠券信息
-        CouponOrderWrapper wrapper = couponInfoService.queryUserOrderCouponInfo(request.getUserId(),
-                                                                                CouponInfoQuery.CouponOrderQuery.from(request.jsonString()));
         CouponInfoApi couponInfoApi = new CouponInfoApi();
-        couponInfoApi.setDiscountedPrices(BigDecimal.valueOf(wrapper.getDiscountedPrices()));
+        couponInfoApi.setDiscountedPrices(BigDecimal.ZERO);
+
+        if (CollectionUtils.isNotEmpty(collect)) {
+
+            // 订单优惠券信息
+            CouponOrderWrapper wrapper = couponInfoService.queryUserOrderCouponInfo(request.getUserId(),
+                    CouponInfoQuery.CouponOrderQuery.from(request.jsonString()));
+
+            couponInfoApi.setDiscountedPrices(BigDecimal.valueOf(wrapper.getDiscountedPrices()));
+        }
 
         return succeed(couponInfoApi);
     }

+ 48 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/ImUserFriendController.java

@@ -0,0 +1,48 @@
+package com.yonge.cooleshow.admin.controller.open;
+
+import com.yonge.cooleshow.admin.io.request.im.UserFriendInfoVO;
+import com.yonge.cooleshow.biz.dal.service.ImUserFriendService;
+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.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;
+
+/**
+ * 用户通讯录表(ImUserFriend)表控制层
+ *
+ * @author zx
+ * @since 2022-03-22 10:45:59
+ */
+@Api(tags = "用户通讯录表")
+@RestController
+@RequestMapping("/open/im")
+public class ImUserFriendController extends BaseController {
+
+    /**
+     * 服务对象
+     */
+    @Resource
+    private ImUserFriendService imUserFriendService;
+
+    @ApiOperation("新用户添加客服")
+    @PostMapping(value = "/customerService")
+    public HttpResponseResult<Boolean> customerService(@RequestBody UserFriendInfoVO info) {
+
+        if (info.invalidRequestParam()) {
+            return failed("无效的请求参数");
+        }
+
+        // 新用户自动绑定系统客服
+        int ret = imUserFriendService.registerUserBindCustomerService(info.getUserId(), info.getFriendIds());
+
+        return succeed(ret > 0);
+    }
+}
+

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

@@ -0,0 +1,32 @@
+package com.yonge.cooleshow.admin.io.request.im;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.collections.CollectionUtils;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * 用户IM好友信息
+ * Created by Eric.Shang on 2022/9/20.
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserFriendInfoVO implements Serializable {
+
+    @ApiModelProperty(value = "新用户ID")
+    private Long userId;
+
+    @ApiModelProperty(value = "好友ID")
+    private List<Long> friendIds;
+
+    public boolean invalidRequestParam() {
+
+        return Optional.ofNullable(getUserId()).orElse(0L) <= 0 || CollectionUtils.isEmpty(getFriendIds());
+    }
+}

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

@@ -5,6 +5,7 @@ import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicAlbumSearch;
 import com.yonge.cooleshow.biz.dal.entity.MusicAlbum;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.vo.MusicAlbumVo;
 import org.apache.ibatis.annotations.Param;
 
@@ -35,8 +36,7 @@ public interface MusicAlbumDao extends BaseMapper<MusicAlbum> {
      * @param search 查询条件
      * @return
      */
-    List<MusicAlbumVo> selectFavoritePage(@Param("page") IPage<MusicAlbumVo> page, @Param(
-            "query") StudentMusicAlbumSearch search);
+    List<MusicAlbumVo> selectFavoritePage(@Param("page") IPage<MusicAlbumVo> page, @Param("query") StudentMusicAlbumSearch search, @Param("clientType") ClientEnum clientType);
 
     /**
      * 查询收藏专辑的收藏数和曲谱数
@@ -60,7 +60,8 @@ public interface MusicAlbumDao extends BaseMapper<MusicAlbum> {
      *
      * @param page  分页信息
      * @param query 查询条件
+     * @param clientType ClientEnum
      * @return page
      */
-    List<MusicAlbumVo> selectStudentPage(@Param("page") IPage<MusicAlbumVo> page, @Param("query") MusicAlbumSearch query);
+    List<MusicAlbumVo> selectStudentPage(@Param("page") IPage<MusicAlbumVo> page, @Param("query") MusicAlbumSearch query, @Param("clientType") ClientEnum clientType);
 }

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

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.biz.dal.dto.search.*;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.vo.*;
 import org.apache.ibatis.annotations.Param;
 
@@ -44,8 +45,7 @@ public interface MusicSheetDao extends BaseMapper<MusicSheet> {
     /**
      * 分页查询
      */
-    List<MusicSheetVo> selectStudentMusicPage(@Param("page") IPage<MusicSheetVo> page, @Param(
-            "param") StudentMusicSheetSearch query);
+    List<MusicSheetVo> selectStudentMusicPage(@Param("page") IPage<MusicSheetVo> page, @Param("param") StudentMusicSheetSearch query, @Param("clientType") ClientEnum clientType);
 
     /**
      * 我的单曲
@@ -62,10 +62,10 @@ public interface MusicSheetDao extends BaseMapper<MusicSheet> {
      *
      * @param page  分页信息
      * @param query 查询条件
+     * @param clientType ClientEnum
      * @return list
      */
-    List<MusicSheetVo> selectFavoriteMusicPage(@Param("page") IPage<MusicSheetVo> page, @Param(
-            "param") StudentMusicSheetSearch query);
+    List<MusicSheetVo> selectFavoriteMusicPage(@Param("page") IPage<MusicSheetVo> page, @Param("param") StudentMusicSheetSearch query, @Param("clientType") ClientEnum clientType);
 
     /**
      * 最近练习曲目

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

@@ -1,7 +1,9 @@
 package com.yonge.cooleshow.biz.dal.dto.req;
 
 
+import com.yonge.cooleshow.biz.dal.enums.AudioTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -32,6 +34,27 @@ public class TeacherMusicSheetAuditReq {
     @NotBlank(message = "审核理由不能为空 ")
     private String remark;
 
+    @ApiModelProperty("是否可以转简谱(0:否,1:是)")
+    private YesOrNoEnum notation;
+
+    @ApiModelProperty(value = "是否可以评测(0:否;1:是)")
+    private YesOrNoEnum canEvaluate;  //是否可以评测(0:否;1:是)
+
+    @ApiModelProperty(value = "是否展示指法(0:否;1:是)")
+    private YesOrNoEnum showFingering;  //是否展示指法(0:否;1:是)
+
+    @ApiModelProperty(value = "是否自带节拍器(0:否;1:是)")
+    private YesOrNoEnum hasBeat;  //是否自带节拍器(0:否;1:是)
+
+    @ApiModelProperty(value = "mp3类型 MP3:mp3, MP3_METRONOME:MP3_METRONOME,")
+    private AudioTypeEnum mp3Type;
+
+    @ApiModelProperty(value = "曲目音频类型 MP3:mp3, MIDI:midi,")
+    private AudioTypeEnum audioType;
+
+    @ApiModelProperty(value = "音频文件存储路径")
+    private String audioFileUrl;  //音频文件存储路径
+
     public String getMusicImg() {
         return musicImg;
     }
@@ -63,4 +86,60 @@ public class TeacherMusicSheetAuditReq {
     public void setRemark(String remark) {
         this.remark = remark;
     }
+
+    public YesOrNoEnum getNotation() {
+        return notation;
+    }
+
+    public void setNotation(YesOrNoEnum notation) {
+        this.notation = notation;
+    }
+
+    public YesOrNoEnum getCanEvaluate() {
+        return canEvaluate;
+    }
+
+    public void setCanEvaluate(YesOrNoEnum canEvaluate) {
+        this.canEvaluate = canEvaluate;
+    }
+
+    public YesOrNoEnum getShowFingering() {
+        return showFingering;
+    }
+
+    public void setShowFingering(YesOrNoEnum showFingering) {
+        this.showFingering = showFingering;
+    }
+
+    public YesOrNoEnum getHasBeat() {
+        return hasBeat;
+    }
+
+    public void setHasBeat(YesOrNoEnum hasBeat) {
+        this.hasBeat = hasBeat;
+    }
+
+    public AudioTypeEnum getMp3Type() {
+        return mp3Type;
+    }
+
+    public void setMp3Type(AudioTypeEnum mp3Type) {
+        this.mp3Type = mp3Type;
+    }
+
+    public AudioTypeEnum getAudioType() {
+        return audioType;
+    }
+
+    public void setAudioType(AudioTypeEnum audioType) {
+        this.audioType = audioType;
+    }
+
+    public String getAudioFileUrl() {
+        return audioFileUrl;
+    }
+
+    public void setAudioFileUrl(String audioFileUrl) {
+        this.audioFileUrl = audioFileUrl;
+    }
 }

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

@@ -1,9 +1,11 @@
 package com.yonge.cooleshow.biz.dal.dto.search;
 
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
 import javax.validation.constraints.NotNull;
+import java.util.Optional;
 
 /**
  * Description 专辑详情下的曲目查询
@@ -30,6 +32,8 @@ public class MusicAlbumDetailSearch extends MusicSheetSearch {
     @ApiModelProperty("相关专辑数,默认4")
     private Integer relatedNum = 4;
 
+    @ApiModelProperty("客户端类型")
+    private ClientEnum clientType;
 
     public Integer getRelatedNum() {
         return relatedNum;
@@ -55,6 +59,14 @@ public class MusicAlbumDetailSearch extends MusicSheetSearch {
         this.type = type;
     }
 
+    public ClientEnum getClientType() {
+        return Optional.ofNullable(clientType).orElse(ClientEnum.STUDENT);
+    }
+
+    public void setClientType(ClientEnum clientType) {
+        this.clientType = clientType;
+    }
+
     @Override
     public Boolean getDelFlag() {
         return delFlag;

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

@@ -1,7 +1,6 @@
 package com.yonge.cooleshow.biz.dal.dto.search;
 
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
-import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import io.swagger.annotations.ApiModelProperty;
 
 /**
@@ -33,6 +32,8 @@ public class StudentMusicSheetSearch  extends MusicSheetSearch{
     @ApiModelProperty(value = "平台")
     private String platform;
 
+    // 客户端类型
+    private ClientEnum clientType;
 
 
     public ClientEnum getUserType() {
@@ -83,4 +84,12 @@ public class StudentMusicSheetSearch  extends MusicSheetSearch{
     public void setStudentId(Long studentId) {
         this.studentId = studentId;
     }
+
+    public ClientEnum getClientType() {
+        return clientType;
+    }
+
+    public void setClientType(ClientEnum clientType) {
+        this.clientType = clientType;
+    }
 }

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

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.entity;
 
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.common.entity.BaseEntity;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
@@ -22,6 +23,10 @@ public class AlbumFavorite extends BaseEntity {
     @ApiModelProperty(value = "主键id")
     private Long id;  //主键ID
 
+	@TableField("client_type_")
+	@ApiModelProperty(value = "客户端类型")
+	private ClientEnum clientType;
+
     @TableField("user_id_")
     @ApiModelProperty(value = "用户ID(目前只是学生ID)")
     private Long userId;  //用户ID(目前只是学生ID)
@@ -84,8 +89,15 @@ public class AlbumFavorite extends BaseEntity {
 	    return this.favoriteFlag;
 	}
 
+	public ClientEnum getClientType() {
+		return clientType;
+	}
+
+	public void setClientType(ClientEnum clientType) {
+		this.clientType = clientType;
+	}
 
-    @Override
+	@Override
     public String toString() {
         return ToStringBuilder.reflectionToString(this);
     }

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

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.entity;
 
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.common.entity.BaseEntity;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
@@ -22,6 +23,10 @@ public class MusicFavorite extends BaseEntity {
     @ApiModelProperty(value = "主键id")
     private Long id;  //主键ID
 
+	@TableField("client_type_")
+	@ApiModelProperty(value = "客户端类型")
+	private ClientEnum clientType;
+
     @TableField("user_id_")
     @ApiModelProperty(value = "用户ID(目前只是学生ID)")
     private Long userId;  //用户ID(目前只是学生ID)
@@ -84,8 +89,15 @@ public class MusicFavorite extends BaseEntity {
 	    return this.favoriteFlag;
 	}
 
+	public ClientEnum getClientType() {
+		return clientType;
+	}
+
+	public void setClientType(ClientEnum clientType) {
+		this.clientType = clientType;
+	}
 
-    @Override
+	@Override
     public String toString() {
         return ToStringBuilder.reflectionToString(this);
     }

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

@@ -6,6 +6,8 @@ import io.swagger.annotations.ApiModelProperty;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
+import java.util.Objects;
+import java.util.Optional;
 
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
@@ -20,6 +22,7 @@ import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
 import com.yonge.cooleshow.biz.dal.enums.ChargeTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import org.apache.commons.lang3.StringUtils;
 
 /**
  * 曲谱表
@@ -104,11 +107,16 @@ public class MusicSheet implements Serializable {
     @ApiModelProperty(value = "是否展示指法(0:否;1:是)")
     private YesOrNoEnum showFingering;  //是否展示指法(0:否;1:是)
 
-    @NotNull(message = "收费类型不能为空!")
+    // @NotNull(message = "收费类型不能为空!")
     @TableField("charge_type_")
     @ApiModelProperty(value = "收费类型(FREE:免费;VIP:会员;CHARGE:单曲收费)")
     private ChargeTypeEnum chargeType;  //收费类型(0:免费;1:会员;2:单曲收费)
 
+	@NotNull(message = "收费类型不能为空!")
+	@TableField("payment_type_")
+	@ApiModelProperty(value = "收费类型(FREE:免费;VIP:会员;CHARGE:单曲收费)")
+	private String paymentType;
+
 
 	@TableField("state_")
 	@ApiModelProperty(value = "曲目状态(0:停用,1:启用)")
@@ -361,6 +369,10 @@ public class MusicSheet implements Serializable {
 	}
 
 	public ChargeTypeEnum getChargeType() {
+		if (Objects.isNull(this.chargeType) && StringUtils.isNotEmpty(getPaymentType())) {
+
+			return ChargeTypeEnum.valueOf(getPaymentType().split(",")[0]);
+		}
 		return chargeType;
 	}
 
@@ -527,4 +539,47 @@ public class MusicSheet implements Serializable {
 	public void setAuditVersion(YesOrNoEnum auditVersion) {
 		this.auditVersion = auditVersion;
 	}
+
+	public String getPaymentType() {
+		return paymentType;
+	}
+
+	public void setPaymentType(String paymentType) {
+		this.paymentType = paymentType;
+	}
+
+	public MusicSheet notation(YesOrNoEnum notation) {
+		this.notation = notation;
+		return this;
+	}
+
+	public MusicSheet canEvaluate(YesOrNoEnum canEvaluate) {
+		this.canEvaluate = canEvaluate;
+		return this;
+	}
+
+	public MusicSheet showFingering(YesOrNoEnum showFingering) {
+		this.showFingering = showFingering;
+		return this;
+	}
+
+	public MusicSheet hasBeat(YesOrNoEnum hasBeat) {
+		this.hasBeat = hasBeat;
+		return this;
+	}
+
+	public MusicSheet mp3Type(AudioTypeEnum mp3Type) {
+		this.mp3Type = mp3Type;
+		return this;
+	}
+
+	public MusicSheet audioType(AudioTypeEnum audioType) {
+		this.audioType = audioType;
+		return this;
+	}
+
+	public MusicSheet audioFileUrl(String audioFileUrl) {
+		this.audioFileUrl = audioFileUrl;
+		return this;
+	}
 }

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

@@ -32,4 +32,23 @@ public enum ClientEnum implements BaseEnum<String, ClientEnum> {
     public String getMsg() {
         return msg;
     }
+
+    /**
+     * 校验客户端类型合法性
+     * @param clientType 客户端类型
+     * @return boolean
+     */
+    public static boolean invalid(String clientType) {
+
+        ClientEnum[] values = ClientEnum.values();
+
+        for (ClientEnum item : values) {
+
+            if (item.getCode().equals(clientType)) {
+                return false;
+            }
+        }
+
+        return true;
+    }
 }

+ 5 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MK.java

@@ -16,4 +16,9 @@ public interface MK {
     String TIME_ZONE = "GMT+8";
     // 时间戳
     String YYYYMMDD = "yyyyMMdd";
+
+    // 客服消息
+    String IM_SYS_FRIEND = "你好!我是你的专属客服~有任何问题都可以与我联系哦!";
+    // 推送消息标题
+    String IM_SYS_TITLE = "客服消息";
 }

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

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.service;
 
 import com.yonge.cooleshow.biz.dal.entity.AlbumFavorite;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 
 import java.util.List;
 
@@ -18,16 +19,18 @@ public interface AlbumFavoriteService extends IService<AlbumFavorite> {
      *
      * @param studentId 学生id
      * @param albumId 专辑id
+     * @param clientType ClientEnum
      * @return list
      */
-    List<AlbumFavorite> getFavorite(Long studentId, Long albumId);
+    List<AlbumFavorite> getFavorite(Long studentId, Long albumId, ClientEnum clientType);
 
     /**
      * 获取收藏信息
      *
      * @param userId 用户id
      * @param albumIds 专辑id
+     * @param clientType ClientEnum
      * @return
      */
-    List<Long> selectFavorite(Long userId, List<Long> albumIds);
+    List<Long> selectFavorite(Long userId, List<Long> albumIds, ClientEnum clientType);
 }

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

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.dao.ImUserFriendDao;
 import com.yonge.cooleshow.biz.dal.entity.ImUserFriend;
 
+import java.util.List;
 import java.util.Set;
 
 /**
@@ -34,5 +35,13 @@ public interface ImUserFriendService extends IService<ImUserFriend> {
     * @date 2022/3/24 12:03
     */
     ImUserFriend getDetail(Long userId);
+
+    /**
+     * 新用户自动添加客服
+     * @param userId 新用户ID
+     * @param friendIds 好友ID
+     * @return Integer
+     */
+    Integer registerUserBindCustomerService(Long userId, List<Long> friendIds);
 }
 

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

@@ -10,6 +10,7 @@ import com.yonge.cooleshow.biz.dal.entity.ImUserStateSync;
 import com.yonge.cooleshow.biz.dal.entity.LiveRoom;
 import com.yonge.cooleshow.biz.dal.entity.RoomInfoCache;
 import com.yonge.cooleshow.biz.dal.vo.TeacherLivingInfoVo;
+import com.yonge.cooleshow.biz.dal.wrapper.liveroom.LiveRoomWrapper;
 import com.yonge.toolset.base.page.PageInfo;
 
 /**
@@ -136,5 +137,13 @@ public interface LiveRoomService extends IService<LiveRoom> {
      * @param whetherMic 是否连麦 0: 是 1:否
      */
     void whetherMic(String roomUid, Integer whetherMic);
+
+    /**
+     * 直播间详情信息
+     * @param liveRoomId 直播间编号
+     * @param userId 分享用户ID
+     * @return LiveRoomWrapper
+     */
+    LiveRoomWrapper findLiveRoomDetailInfoByRoomId(String liveRoomId, Long userId);
 }
 

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

@@ -8,6 +8,7 @@ import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumDetailSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicAlbumSearch;
 import com.yonge.cooleshow.biz.dal.entity.MusicAlbum;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.vo.AlbumDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.MusicAlbumVo;
 import com.yonge.cooleshow.biz.dal.vo.MusicSheetVo;
@@ -87,27 +88,30 @@ public interface MusicAlbumService extends IService<MusicAlbum> {
      *
      * @param studentId 学生id
      * @param albumId 专辑id
+     * @param clientType ClientEnum
      * @return YesOrNoEnum
      */
-    YesOrNoEnum checkFavorite(Long studentId, Long albumId);
+    YesOrNoEnum checkFavorite(Long studentId, Long albumId, ClientEnum clientType);
 
     /**
      * 设置学生收藏/取消收藏 专辑
      *
      * @param studentId 学生id
      * @param albumId 专辑id
+     * @param clientType ClientEnum
      * @return boolean
      */
-    Boolean setFavorite(Long studentId, Long albumId);
+    Boolean setFavorite(Long studentId, Long albumId, ClientEnum clientType);
 
     /**
      * 收藏专辑列表
      *
      * @param page 分页
      * @param search 查询条件
+     * @param clientType ClientEnum
      * @return list
      */
-    IPage<MusicAlbumVo> favoriteAlbum(IPage<MusicAlbumVo> page, StudentMusicAlbumSearch search);
+    IPage<MusicAlbumVo> favoriteAlbum(IPage<MusicAlbumVo> page, StudentMusicAlbumSearch search, ClientEnum clientType);
 
     /**
      * 删除专辑
@@ -122,9 +126,10 @@ public interface MusicAlbumService extends IService<MusicAlbum> {
      *
      * @param page 分页
      * @param query 查询条件
+     * @param clientType ClientEnum
      * @return
      */
-    IPage<MusicAlbumVo> selectStudentPage(IPage<MusicAlbumVo> page, MusicAlbumSearch query);
+    IPage<MusicAlbumVo> selectStudentPage(IPage<MusicAlbumVo> page, MusicAlbumSearch query, ClientEnum clientType);
 
     /**
      * 修改专辑中 曲目的排序值

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

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.service;
 
 import com.yonge.cooleshow.biz.dal.entity.MusicFavorite;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 
 import java.util.List;
 
@@ -18,9 +19,10 @@ public interface MusicFavoriteService extends IService<MusicFavorite> {
      *
      * @param userId 学生id
      * @param musicSheetId 专辑id
+     * @param clientType 客户端类型
      * @return list
      */
-    List<MusicFavorite> getFavorite(Long userId, Long musicSheetId);
+    List<MusicFavorite> getFavorite(Long userId, Long musicSheetId, ClientEnum clientType);
 
     /**
      * 获取曲目收藏数量

+ 9 - 6
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetService.java

@@ -18,7 +18,6 @@ import com.yonge.cooleshow.biz.dal.dto.search.TeacherMusicSheetAuditSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.TeacherMusicSheetSearch;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
-import com.yonge.cooleshow.biz.dal.enums.MusicSheetType;
 import com.yonge.cooleshow.biz.dal.vo.HomeMusicSheetVo;
 import com.yonge.cooleshow.biz.dal.vo.MusicSheetDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.MusicSheetShareVo;
@@ -96,18 +95,20 @@ public interface MusicSheetService extends IService<MusicSheet> {
      *
      * @param page 分页
      * @param query 查询条件
+     * @param clientType ClientEnum
      * @return iPage 分页信息
      */
-    IPage<MusicSheetVo> selectStudentPage(IPage<MusicSheetVo> page, StudentMusicSheetSearch query);
+    IPage<MusicSheetVo> selectStudentPage(IPage<MusicSheetVo> page, StudentMusicSheetSearch query, ClientEnum clientType);
 
     /**
      * 收藏/取消收藏 曲目
      *
      * @param userId 用户id , 学生id
      * @param musicSheetId 曲目id
+     * @param clientType 客户端类型
      * @return boolean
      */
-    boolean setFavorite(Long userId, Long musicSheetId);
+    boolean setFavorite(Long userId, Long musicSheetId, ClientEnum clientType);
 
     /**
      * 我的单曲
@@ -124,9 +125,10 @@ public interface MusicSheetService extends IService<MusicSheet> {
      *
      * @param page 分页信息
      * @param query 查询条件
+     * @param clientType ClientEnum
      * @return
      */
-    IPage<MusicSheetVo> favoriteMusic(IPage<MusicSheetVo> page, StudentMusicSheetSearch query);
+    IPage<MusicSheetVo> favoriteMusic(IPage<MusicSheetVo> page, StudentMusicSheetSearch query, ClientEnum clientType);
 
     /**
      * 最近练习曲目
@@ -261,10 +263,11 @@ public interface MusicSheetService extends IService<MusicSheet> {
      * 官网曲目详情
      *
      * @param musicSheetId 曲目id
-     * @param sysUser
+     * @param sysUser SysUser
+     * @param clientType 客户端类型
      * @return
      */
-    MusicSheetWebsiteDetailVo websiteDetail(Long musicSheetId, SysUser sysUser);
+    MusicSheetWebsiteDetailVo websiteDetail(Long musicSheetId, SysUser sysUser, ClientEnum clientType);
 
     /**
      * 查询老师曲目审核数量

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

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.yonge.cooleshow.biz.dal.entity.AlbumFavorite;
 import com.yonge.cooleshow.biz.dal.dao.AlbumFavoriteDao;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.service.AlbumFavoriteService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -33,20 +34,23 @@ public class AlbumFavoriteServiceImpl extends ServiceImpl<AlbumFavoriteDao,Album
     }
 
     @Override
-    public List<AlbumFavorite> getFavorite(Long studentId, Long albumId) {
+    public List<AlbumFavorite> getFavorite(Long studentId, Long albumId, ClientEnum clientType) {
 
         return this.lambdaQuery()
                     .eq(AlbumFavorite::getAlbumId, albumId)
                     .eq(AlbumFavorite::getUserId, studentId)
+                    .eq(AlbumFavorite::getClientType, clientType)
                     .list();
     }
 
     @Override
-    public List<Long> selectFavorite(Long userId, List<Long> albumIds) {
+    public List<Long> selectFavorite(Long userId, List<Long> albumIds, ClientEnum clientType) {
+
         List<AlbumFavorite> list = this.lambdaQuery()
-                                       .in(AlbumFavorite::getAlbumId, albumIds)
-                                       .eq(AlbumFavorite::getUserId, userId)
-                                       .list();
+                .in(AlbumFavorite::getAlbumId, albumIds)
+                .eq(AlbumFavorite::getUserId, userId)
+                .eq(AlbumFavorite::getClientType, clientType)
+                .list();
 
         if (CollectionUtils.isEmpty(list)) {
             return new ArrayList<>();

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

@@ -1,21 +1,35 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.collect.Sets;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.auth.config.CustomerServiceConfig;
+import com.yonge.cooleshow.biz.dal.config.RongCloudConfig;
 import com.yonge.cooleshow.biz.dal.dao.ImUserFriendDao;
 import com.yonge.cooleshow.biz.dal.dao.TeacherDao;
 import com.yonge.cooleshow.biz.dal.dto.BasicUserInfo;
 import com.yonge.cooleshow.biz.dal.entity.ImUserFriend;
+import com.yonge.cooleshow.biz.dal.enums.MK;
 import com.yonge.cooleshow.biz.dal.service.ImUserFriendService;
+import io.rong.messages.TxtMessage;
+import io.rong.models.message.PrivateMessage;
+import io.rong.models.message.PushExt;
+import io.rong.models.response.ResponseResult;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -24,15 +38,17 @@ import java.util.stream.Collectors;
  * @author zx
  * @since 2022-03-22 10:46:00
  */
+@Slf4j
 @Service("imUserFriendService")
 public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUserFriend> implements ImUserFriendService {
 
-    private final static Logger log = LoggerFactory.getLogger(ImUserFriendServiceImpl.class);
-
     @Resource
     private TeacherDao teacherDao;
     @Resource
     private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private CustomerServiceConfig customerServiceConfig;
+
     @Override
     public ImUserFriendDao getDao() {
         return this.baseMapper;
@@ -99,5 +115,58 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
         return imUserFriend;
     }
 
+    /**
+     * 新用户自动添加客服
+     *
+     * @param userId    新用户ID
+     * @param friendIds 好友ID
+     * @return Integer
+     */
+    @Override
+    public Integer registerUserBindCustomerService(Long userId, List<Long> friendIds) {
+
+        // 添加新用户好友
+        saveUserFriend(userId, Sets.newHashSet(friendIds));
+
+        try {
+
+            // 设置默认值
+            String customerMessage = customerServiceConfig.getCustomerMessage();
+            if (StringUtils.isEmpty(customerMessage)) {
+                customerMessage = MK.IM_SYS_FRIEND;
+            }
+
+            String customerTitle = customerServiceConfig.getCustomerTitle();
+            if (StringUtils.isEmpty(customerTitle)) {
+                customerTitle = MK.IM_SYS_TITLE;
+            }
+
+            // 发送消息
+            TxtMessage txtMessage = new TxtMessage(customerMessage, "");
+
+            // 拓展消息
+            PushExt pushExt = PushExt.build(customerTitle, 1,
+                    new PushExt.HW("channelId", "NORMAL"), new PushExt.VIVO("1"),
+                    new PushExt.APNs("", ""),
+                    new PushExt.OPPO(""));
+
+            // 发送用户IM通知消息
+            PrivateMessage privateMessage = new PrivateMessage()
+                    .setSenderId(String.valueOf(friendIds.get(0)))
+                    .setTargetId(new String[]{String.valueOf(userId)})
+                    .setObjectName(txtMessage.getType())
+                    .setContent(txtMessage)
+                    .setPushExt(pushExt)
+                    .setIsIncludeSender(1);
+
+            ResponseResult privateResult = RongCloudConfig.rongCloud.message.msgPrivate.send(privateMessage);
+            log.info("registerUserBindCustomerService userId={}, ret={}", userId, privateResult.getCode());
+        } catch (Exception e) {
+            log.error("registerUserBindCustomerService userId={}", userId, e);
+        }
+
+        return CollectionUtils.size(friendIds);
+    }
+
 }
 

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

@@ -30,6 +30,9 @@ import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
+import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
+import com.yonge.cooleshow.biz.dal.wrapper.liveroom.LiveRoomWrapper;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.redisson.api.RBucket;
@@ -126,6 +129,8 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
 
     @Autowired
     private LiveBroadcastRoomMemberService liveBroadcastRoomMemberService;
+    @Autowired
+    private SysUserMapper sysUserMapper;
     /**
      * 生成房间UID
      *
@@ -1140,5 +1145,41 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
         roomInfo.setWhether_mic(whetherMic);
         roomInfoCache.set(roomInfo);
     }
+
+    /**
+     * 直播间详情信息
+     *
+     * @param liveRoomId 直播间编号
+     * @param userId 分享用户ID
+     * @return LiveRoomWrapper
+     */
+    @Override
+    public LiveRoomWrapper findLiveRoomDetailInfoByRoomId(String liveRoomId, Long userId) {
+
+        // 直播间信息
+        LiveRoom liveRoom = getBaseMapper().selectOne(Wrappers.<LiveRoom>lambdaQuery()
+                .eq(LiveRoom::getRoomUid, liveRoomId));
+        if (Objects.isNull(liveRoom)) {
+            return null;
+        }
+
+        LiveRoomWrapper roomWrapper = LiveRoomWrapper.from(JSON.toJSONString(liveRoom));
+
+        // 直播老师信息
+        com.yonge.cooleshow.biz.dal.entity.SysUser teacher = sysUserMapper.selectById(roomWrapper.getSpeakerId());
+        if (Objects.nonNull(teacher)) {
+
+            roomWrapper.setTeacher(JSON.parseObject(JSON.toJSONString(teacher), LiveRoomWrapper.UserInfo.class));
+        }
+
+        // 分享同学信息
+        if (Optional.ofNullable(userId).orElse(0L) > 0) {
+
+            com.yonge.cooleshow.biz.dal.entity.SysUser student = sysUserMapper.selectById(userId);
+            roomWrapper.setStudent(JSON.parseObject(JSON.toJSONString(student), LiveRoomWrapper.UserInfo.class));
+        }
+
+        return roomWrapper;
+    }
 }
 

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

@@ -4,6 +4,7 @@ import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
 
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -160,19 +161,20 @@ public class MusicAlbumServiceImpl extends ServiceImpl<MusicAlbumDao,MusicAlbum>
     }
 
     @Override
-    public YesOrNoEnum checkFavorite(Long studentId, Long albumId) {
-        List<AlbumFavorite> albumFavorites = albumFavoriteService.getFavorite(studentId,albumId);
+    public YesOrNoEnum checkFavorite(Long studentId, Long albumId, ClientEnum clientType) {
+        List<AlbumFavorite> albumFavorites = albumFavoriteService.getFavorite(studentId,albumId, clientType);
 
         return CollectionUtils.isEmpty(albumFavorites)?YesOrNoEnum.NO:YesOrNoEnum.YES;
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public Boolean setFavorite(Long studentId, Long albumId) {
-        List<AlbumFavorite> albumFavorites = albumFavoriteService.getFavorite(studentId,albumId);
+    public Boolean setFavorite(Long studentId, Long albumId, ClientEnum clientType) {
+        List<AlbumFavorite> albumFavorites = albumFavoriteService.getFavorite(studentId,albumId, clientType);
         if (CollectionUtils.isEmpty(albumFavorites)) {
             AlbumFavorite albumFavorite = new AlbumFavorite();
             albumFavorite.setAlbumId(albumId);
+            albumFavorite.setClientType(clientType);
             albumFavorite.setUserId(studentId);
             albumFavorite.setFavoriteTime(new Date());
             return albumFavoriteService.save(albumFavorite);
@@ -183,9 +185,9 @@ public class MusicAlbumServiceImpl extends ServiceImpl<MusicAlbumDao,MusicAlbum>
     }
 
     @Override
-    public IPage<MusicAlbumVo> favoriteAlbum(IPage<MusicAlbumVo> page, StudentMusicAlbumSearch search) {
+    public IPage<MusicAlbumVo> favoriteAlbum(IPage<MusicAlbumVo> page, StudentMusicAlbumSearch search, ClientEnum clientType) {
 
-        IPage<MusicAlbumVo> iPage = page.setRecords(baseMapper.selectFavoritePage(page, search));
+        IPage<MusicAlbumVo> iPage = page.setRecords(baseMapper.selectFavoritePage(page, search, clientType));
         List<MusicAlbumVo> records = iPage.getRecords();
         if (CollectionUtils.isEmpty(records)) {
             return iPage;
@@ -209,8 +211,8 @@ public class MusicAlbumServiceImpl extends ServiceImpl<MusicAlbumDao,MusicAlbum>
     }
 
     @Override
-    public IPage<MusicAlbumVo> selectStudentPage(IPage<MusicAlbumVo> page, MusicAlbumSearch query) {
-    	List<MusicAlbumVo> records = baseMapper.selectStudentPage(page, query);
+    public IPage<MusicAlbumVo> selectStudentPage(IPage<MusicAlbumVo> page, MusicAlbumSearch query, ClientEnum clientType) {
+    	List<MusicAlbumVo> records = baseMapper.selectStudentPage(page, query, clientType);
     	/*if(records == null || records.size() == 0){
     		query.setSubjectIdList(null);
     		records = baseMapper.selectStudentPage(page, query);
@@ -221,7 +223,7 @@ public class MusicAlbumServiceImpl extends ServiceImpl<MusicAlbumDao,MusicAlbum>
         if (query.getUserId() == null || CollectionUtils.isEmpty(albumIds)) {
             return iPage;
         }
-        albumIds = albumFavoriteService.selectFavorite(query.getUserId(),albumIds);
+        albumIds = albumFavoriteService.selectFavorite(query.getUserId(), albumIds, clientType);
         for (MusicAlbumVo record : records) {
             if(albumIds.contains(record.getId())) {
                 record.setFavorite(YesOrNoEnum.YES);

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

@@ -3,6 +3,7 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 import com.yonge.cooleshow.biz.dal.entity.AlbumFavorite;
 import com.yonge.cooleshow.biz.dal.entity.MusicFavorite;
 import com.yonge.cooleshow.biz.dal.dao.MusicFavoriteDao;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.service.MusicFavoriteService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -31,10 +32,11 @@ public class MusicFavoriteServiceImpl extends ServiceImpl<MusicFavoriteDao,Music
     }
 
     @Override
-    public List<MusicFavorite> getFavorite(Long userId, Long musicSheetId) {
+    public List<MusicFavorite> getFavorite(Long userId, Long musicSheetId, ClientEnum clientType) {
         return this.lambdaQuery()
                    .eq(MusicFavorite::getMusicSheetId, musicSheetId)
                    .eq(MusicFavorite::getUserId, userId)
+                   .eq(MusicFavorite::getClientType, clientType)
                    .list();
 
     }

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

@@ -316,8 +316,8 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
     }
 
     @Override
-    public IPage<MusicSheetVo> selectStudentPage(IPage<MusicSheetVo> page, StudentMusicSheetSearch query) {
-    	List<MusicSheetVo> records = baseMapper.selectStudentMusicPage(page, query);
+    public IPage<MusicSheetVo> selectStudentPage(IPage<MusicSheetVo> page, StudentMusicSheetSearch query, ClientEnum clientType) {
+    	List<MusicSheetVo> records = baseMapper.selectStudentMusicPage(page, query, clientType);
     	
     	/*if(query.getMyself() != null && query.getMyself() == false){//首页
         	if(records == null || records.size() == 0){
@@ -345,11 +345,12 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public boolean setFavorite(Long userId, Long musicSheetId) {
-        List<MusicFavorite> musicFavorites = musicFavoriteService.getFavorite(userId, musicSheetId);
+    public boolean setFavorite(Long userId, Long musicSheetId, ClientEnum clientType) {
+        List<MusicFavorite> musicFavorites = musicFavoriteService.getFavorite(userId, musicSheetId, clientType);
         if (CollectionUtils.isEmpty(musicFavorites)) {
             MusicFavorite musicFavorite = new MusicFavorite();
             musicFavorite.setMusicSheetId(musicSheetId);
+            musicFavorite.setClientType(clientType);
             musicFavorite.setUserId(userId);
             musicFavorite.setFavoriteTime(new Date());
             return musicFavoriteService.save(musicFavorite);
@@ -366,8 +367,8 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
     }
 
     @Override
-    public IPage<MusicSheetVo> favoriteMusic(IPage<MusicSheetVo> page, StudentMusicSheetSearch query) {
-        return page.setRecords(baseMapper.selectFavoriteMusicPage(page, query));
+    public IPage<MusicSheetVo> favoriteMusic(IPage<MusicSheetVo> page, StudentMusicSheetSearch query, ClientEnum clientType) {
+        return page.setRecords(baseMapper.selectFavoriteMusicPage(page, query, clientType));
     }
 
     @Override
@@ -380,6 +381,9 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
             page.setRecords(new ArrayList<>());
             return page;
         }
+
+        // 设置学生端收藏联系
+        query.setClientType(ClientEnum.STUDENT);
         // 构建分页信息
         page.setRecords(baseMapper.selectPracticeMusicPage(query, practiceMusicIdList));
         page.setPages(practiceMusicIdPage.getPages());
@@ -427,7 +431,17 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
         musicSheet.setUpdateBy(userId);
         musicSheet.setUpdateTime(new Date());
         if (AuthStatusEnum.PASS.getCode().equals(param.getAuthStatus().getCode())) {
-            musicSheet.setState(YesOrNoEnum.YES);
+
+            // 更新曲谱评测,指法、简谱、节拍器状态
+            musicSheet
+                    .notation(param.getNotation())
+                    .canEvaluate(param.getCanEvaluate())
+                    .showFingering(param.getShowFingering())
+                    //.hasBeat(param.getHasBeat())
+                    .mp3Type(param.getMp3Type())
+                    //.audioType(param.getAudioType())
+                    //.audioFileUrl(param.getAudioFileUrl())
+                    .setState(YesOrNoEnum.YES);
             // 替换曲目id
             replaceMusicSheet(param, musicSheet, originalMusicSheetId);
 
@@ -547,10 +561,16 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
         if (musicSheetDto.getAuditVersion() == null) {
             musicSheetDto.setAuditVersion(YesOrNoEnum.NO);
         }
-        if (musicSheetDto.getChargeType().equals(ChargeTypeEnum.VIP) || musicSheetDto.getChargeType().equals(ChargeTypeEnum.FREE)) {
+        List<String> collect = Arrays.stream(musicSheetDto.getPaymentType().split(",")).collect(Collectors.toList());
+        // 非付费方式,默认曲目价格为0
+        if (!collect.contains(ChargeTypeEnum.CHARGE.getCode())) {
             musicSheetDto.setMusicPrice(BigDecimal.ZERO);
         }
 
+        /*if (musicSheetDto.getChargeType().equals(ChargeTypeEnum.VIP) || musicSheetDto.getChargeType().equals(ChargeTypeEnum.FREE)) {
+            musicSheetDto.setMusicPrice(BigDecimal.ZERO);
+        }*/
+
         // 删除曲目专辑关联
         if (oldMusicSheet != null && !oldMusicSheet.getMusicSubject().equals(musicSheetDto.getMusicSubject())) {
             delAlbumSheetRef(musicSheetDto.getId(), musicSheetDto.getMusicSubject());
@@ -943,7 +963,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
     }
 
     @Override
-    public MusicSheetWebsiteDetailVo websiteDetail(Long musicSheetId, SysUser sysUser) {
+    public MusicSheetWebsiteDetailVo websiteDetail(Long musicSheetId, SysUser sysUser, ClientEnum clientType) {
         MusicSheetDetailVo detail = detail(musicSheetId, null, null);
         MusicSheetWebsiteDetailVo musicSheetWebsiteDetailVo = new MusicSheetWebsiteDetailVo();
         BeanUtils.copyProperties(detail, musicSheetWebsiteDetailVo);
@@ -976,7 +996,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
             }
 
             // 曲目收藏
-            List<MusicFavorite> favorite = musicFavoriteService.getFavorite(sysUser.getId(), detail.getId());
+            List<MusicFavorite> favorite = musicFavoriteService.getFavorite(sysUser.getId(), detail.getId(), clientType);
             if (!CollectionUtils.isEmpty(favorite)) {
                 musicSheetWebsiteDetailVo.setFavorite(YesOrNoEnum.YES);
             }

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

@@ -66,6 +66,7 @@ import com.yonge.toolset.payment.core.service.PaymentClient;
 import com.yonge.toolset.payment.util.DistributedLock;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.joda.time.DateTime;
 import org.redisson.api.RedissonClient;
 import org.springframework.beans.BeanUtils;
@@ -337,7 +338,10 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         //验证参数,必须验证参数
         BigDecimal actualPrice = BigDecimal.ZERO;
         // 订单优惠券信息
-        CouponOrderWrapper couponOrderWrapper = CouponOrderWrapper.builder().couponInfos(Lists.newArrayList()).build();
+        CouponOrderWrapper couponOrderWrapper = CouponOrderWrapper.builder()
+                .discountedPrices(0D)
+                .couponInfos(Lists.newArrayList())
+                .build();
 
         for (OrderReq.OrderReqInfo info : orderReq.getOrderInfos()) {
             Function<OrderReq.OrderReqInfo, HttpResponseResult<OrderCreateRes>> createFunction = orderCreate.get(info.getGoodType());
@@ -364,15 +368,18 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             }
 
             // 计算优惠券金额
-            couponOrderWrapper = couponInfoService.queryUserOrderCouponInfo(orderReq.getUserId(),
-                    CouponInfoQuery.CouponOrderQuery.builder()
-                            .clientType(orderReq.getOrderClient())
-                            .couponTypes(CouponCategoryEnum.getCategory(orderReq.getOrderType().getCode()))
-                            .useState(CouponUseStateEnum.USABLE)
-                            .timestamp(DateTime.now().getMillis())
-                            .amount(createRes.getExpectPrice().doubleValue())
-                            .build()
-                            .issueIds(orderReq.getCouponId()));
+            if (StringUtils.isNotEmpty(orderReq.getCouponId())) {
+
+                couponOrderWrapper = couponInfoService.queryUserOrderCouponInfo(orderReq.getUserId(),
+                        CouponInfoQuery.CouponOrderQuery.builder()
+                                .clientType(orderReq.getOrderClient())
+                                .couponTypes(CouponCategoryEnum.getCategory(orderReq.getOrderType().getCode()))
+                                .useState(CouponUseStateEnum.USABLE)
+                                .timestamp(DateTime.now().getMillis())
+                                .amount(createRes.getExpectPrice().doubleValue())
+                                .build()
+                                .issueIds(orderReq.getCouponId()));
+            }
 
             //log.info("executeOrder couponId={}, wrapper={}", orderReq.getCouponId(), couponOrderWrapper.jsonString());
 

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

@@ -0,0 +1,77 @@
+package com.yonge.cooleshow.biz.dal.wrapper.liveroom;
+
+import com.alibaba.fastjson.JSON;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 直播间详情信息
+ * Created by Eric.Shang on 2022/9/22.
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class LiveRoomWrapper implements Serializable {
+
+    // 课程组id
+    private Long courseGroupId;
+    // 课程id
+    private Long courseId;
+    // 主讲人id/老师id
+    private Long speakerId;
+    // 房间编号
+    private String roomUid;
+    private String roomTitle;
+    private Date liveStartTime;
+    private Date liveEndTime;
+    private String liveRemark;
+    private Integer liveState;
+    private Integer roomState;
+    private String type;
+    private String coverPic;
+
+    // 直播老师信息
+    private UserInfo teacher;
+
+    // 分享同学信息
+    private UserInfo student;
+
+    public static LiveRoomWrapper from(String jsonString) {
+        return JSON.parseObject(jsonString, LiveRoomWrapper.class);
+    }
+
+    public String jsonString() {
+        return JSON.toJSONString(this);
+    }
+
+    public LiveRoomWrapper teacher(UserInfo teacher) {
+        this.teacher = teacher;
+        return this;
+    }
+
+    public LiveRoomWrapper student(UserInfo student) {
+        this.student = student;
+        return this;
+    }
+
+
+    /**
+     * 直播间老师信息
+     */
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class UserInfo implements Serializable {
+
+        private String username;
+        private String phone;
+        private String avatar;
+        private String realName;
+    }
+}

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

@@ -108,6 +108,9 @@
             <if test="query.studentId != null">
                 and af2.user_id_ = #{query.studentId}
             </if>
+            <if test="clientType != null">
+                AND af2.client_type_ = #{clientType}
+            </if>
             <if test="query.idAndName != null and query.idAndName != ''">
                 and (t.id_ like concat('%',#{query.idAndName},'%') or
                 t.album_name_ like concat('%',#{query.idAndName},'%'))
@@ -204,7 +207,7 @@
         ,if(t2.num >0,t2.num,0) as albumFavoriteCount
         from music_album t
         left join (select count(1) as num,af.album_id_ from album_favorite af
-            left join sys_user su on af.user_id_ = su.id_
+            left join sys_user su on (af.user_id_ = su.id_ <if test="clientType != null"> AND af.client_type_ = #{clientType} </if>)
             where su.del_flag_ = 0 group by af.album_id_
         ) t2 on t2.album_id_ = t.id_
         <where>

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

@@ -46,6 +46,7 @@
         t.can_evaluate_ as canEvaluate,
         t.show_fingering_ as showFingering,
         t.charge_type_ as chargeType,
+        t.payment_type_ as paymentType,
         t.state_ as state,
         t.audit_status_ as auditStatus,
         t.sort_number_ as sortNumber,
@@ -133,7 +134,7 @@
             and t.source_type_ = #{param.sourceType}
         </if>
         <if test="param.chargeType != null">
-            and t.charge_type_ = #{param.chargeType}
+            and (t.charge_type_ = #{param.chargeType} OR FIND_IN_SET(#{param.chargeType}, t.payment_type_))
         </if>
         <if test="param.topFlag != null">
             and t.top_flag_ = #{param.topFlag}
@@ -319,7 +320,7 @@
 <!--                on mspr.music_sheet_id_ = t.id_-->
 <!--                and mspr.student_id_ = #{param.studentId}-->
 <!--                and order_status_ = 'PAID'-->
-            left join music_favorite mf on t.id_ = mf.music_sheet_id_ and mf.user_id_ = #{param.studentId}
+            left join music_favorite mf on (t.id_ = mf.music_sheet_id_ and mf.user_id_ = #{param.studentId} <if test="clientType != null"> AND mf.client_type_ = #{clientType}</if> )
         </if>
         <where>
             su.del_flag_ = 0
@@ -376,6 +377,9 @@
         <where>
             su.del_flag_ = 0
             <include refid="QueryInfo"/>
+            <if test="clientType != null">
+                AND mf.client_type_ = #{clientType}
+            </if>
             <if test="param.studentId != null">
                 and mf.user_id_ = #{param.studentId}
             </if>
@@ -394,7 +398,7 @@
         from music_sheet_practice_record mspr
         left join music_sheet t on mspr.music_sheet_id_ = t.id_
         left join sys_user su on t.create_by_ = su.id_
-        left join music_favorite mf on t.id_ = mf.music_sheet_id_ and mspr.user_id_ = mf.user_id_
+        left join music_favorite mf on (t.id_ = mf.music_sheet_id_ and mspr.user_id_ = mf.user_id_ <if test="param.clientType != null"> AND mf.client_type_ = #{param.clientType}</if> )
         <where>
             su.del_flag_ = 0
             <include refid="QueryInfo"/>

+ 12 - 6
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/MusicAlbumController.java

@@ -11,6 +11,7 @@ import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumDetailSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicAlbumSearch;
 import com.yonge.cooleshow.biz.dal.entity.Student;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.service.AppVersionInfoService;
 import com.yonge.cooleshow.biz.dal.service.MusicAlbumService;
 import com.yonge.cooleshow.biz.dal.service.StudentService;
@@ -83,7 +84,7 @@ public class MusicAlbumController extends BaseController {
         // query.setSubjectIds(student.getSubjectId());
         query.setAlbumStatus(YesOrNoEnum.YES);
         query.setSortBy(1);
-        IPage<MusicAlbumVo> iPage = musicAlbumService.selectStudentPage(PageUtil.getPage(query),query);
+        IPage<MusicAlbumVo> iPage = musicAlbumService.selectStudentPage(PageUtil.getPage(query),query, ClientEnum.STUDENT);
         return succeed(PageUtil.pageInfo(iPage));
     }
 
@@ -100,7 +101,7 @@ public class MusicAlbumController extends BaseController {
         }
         query.setType(2);
         query.setState(YesOrNoEnum.YES);
-        YesOrNoEnum yesOrNoEnum = musicAlbumService.checkFavorite(sysUser.getId(),query.getId() );
+        YesOrNoEnum yesOrNoEnum = musicAlbumService.checkFavorite(sysUser.getId(),query.getId(), ClientEnum.STUDENT);
         AlbumDetailVo albumDetailVo = musicAlbumService.detail(PageUtil.getPage(query), query);
         albumDetailVo.setFavorite(yesOrNoEnum);
 
@@ -112,7 +113,7 @@ public class MusicAlbumController extends BaseController {
         musicAlbumSearch.setPage(1);
         musicAlbumSearch.setRows(query.getRelatedNum() +1);
         musicAlbumSearch.setAlbumTagIds(albumDetailVo.getAlbumTag());
-        IPage<MusicAlbumVo> relatedMusicAlbum = musicAlbumService.selectStudentPage(PageUtil.getPage(musicAlbumSearch),musicAlbumSearch);
+        IPage<MusicAlbumVo> relatedMusicAlbum = musicAlbumService.selectStudentPage(PageUtil.getPage(musicAlbumSearch),musicAlbumSearch, ClientEnum.STUDENT);
         List<MusicAlbumVo> musicAlbumVos1 = relatedMusicAlbum.getRecords()
                                                       .stream()
                                                       .filter(musicAlbumVo -> !musicAlbumVo.getId()
@@ -130,13 +131,18 @@ public class MusicAlbumController extends BaseController {
      */
     @PostMapping("/favorite/{id}")
     @ApiOperation(value = "专辑收藏/取消收藏")
-    public HttpResponseResult<Boolean> favorite(@ApiParam(value = "专辑编号", required = true) @PathVariable("id") Long id) {
+    public HttpResponseResult<Boolean> favorite(@ApiParam(value = "专辑编号", required = true) @PathVariable("id") Long id,
+                                                @ApiParam(value = "客户端类型") @RequestParam(value = "clientType", required = false, defaultValue = "STUDENT") String clientType) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null  || sysUser.getId() == null) {
             return failed("用户信息获取失败");
         }
 
-        return succeed(musicAlbumService.setFavorite(sysUser.getId(),id));
+        if (ClientEnum.invalid(clientType)) {
+            return failed("无效的客户端类型");
+        }
+
+        return succeed(musicAlbumService.setFavorite(sysUser.getId(), id, ClientEnum.valueOf(clientType)));
     }
 
 
@@ -153,7 +159,7 @@ public class MusicAlbumController extends BaseController {
         StudentMusicAlbumSearch search = new StudentMusicAlbumSearch();
         search.setStudentId(sysUser.getId());
         search.setAlbumStatus(YesOrNoEnum.YES);
-        IPage<MusicAlbumVo> albumVoIPage = musicAlbumService.favoriteAlbum(PageUtil.getPage(query), search);
+        IPage<MusicAlbumVo> albumVoIPage = musicAlbumService.favoriteAlbum(PageUtil.getPage(query), search, ClientEnum.STUDENT);
         return succeed(PageUtil.pageInfo(albumVoIPage));
     }
 }

+ 12 - 5
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/MusicSheetController.java

@@ -13,6 +13,7 @@ import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -119,7 +120,7 @@ public class MusicSheetController extends BaseController {
             query.setMyself(false);
         }
 
-        IPage<MusicSheetVo> musicSheetVoIPage = musicSheetService.selectStudentPage(PageUtil.getPage(query), query);
+        IPage<MusicSheetVo> musicSheetVoIPage = musicSheetService.selectStudentPage(PageUtil.getPage(query), query, ClientEnum.STUDENT);
         return succeed(PageUtil.pageInfo(musicSheetVoIPage));
     }
 
@@ -146,7 +147,7 @@ public class MusicSheetController extends BaseController {
 
         // query.setSubjectIds(student.getSubjectId());
         query.setRows(query.getSheetRow());
-        IPage<MusicSheetVo> musicSheetVoIPage = musicSheetService.selectStudentPage(PageUtil.getPage(query), query);
+        IPage<MusicSheetVo> musicSheetVoIPage = musicSheetService.selectStudentPage(PageUtil.getPage(query), query, ClientEnum.STUDENT);
 
         MusicAlbumSearch musicAlbumSearch = new MusicAlbumSearch();
         musicAlbumSearch.setAlbumStatus(YesOrNoEnum.YES);
@@ -170,12 +171,18 @@ public class MusicSheetController extends BaseController {
      */
     @PostMapping("/favorite/{id}")
     @ApiOperation(value = "曲目收藏/取消收藏")
-    public HttpResponseResult<Boolean> favorite(@ApiParam(value = "曲目编号", required = true) @PathVariable("id") Long id) {
+    public HttpResponseResult<Boolean> favorite(@ApiParam(value = "曲目编号", required = true) @PathVariable("id") Long id,
+                                                @ApiParam(value = "客户端类型") @RequestParam(value = "clientType", required = false, defaultValue = "STUDENT") String clientType) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null  || sysUser.getId() == null) {
             return failed("用户信息获取失败");
         }
-        return succeed(musicSheetService.setFavorite(sysUser.getId(),id));
+
+        if (ClientEnum.invalid(clientType)) {
+            return failed("无效的客户端类型");
+        }
+
+        return succeed(musicSheetService.setFavorite(sysUser.getId(),id, ClientEnum.valueOf(clientType)));
     }
 
 
@@ -214,7 +221,7 @@ public class MusicSheetController extends BaseController {
         search.setStudentId(sysUser.getId());
         search.setState(YesOrNoEnum.YES);
         search.setAuditStatus(AuthStatusEnum.PASS);
-        IPage<MusicSheetVo> sheetVoIPage = musicSheetService.favoriteMusic(PageUtil.getPage(query),search);
+        IPage<MusicSheetVo> sheetVoIPage = musicSheetService.favoriteMusic(PageUtil.getPage(query),search, ClientEnum.STUDENT);
         return succeed(PageUtil.pageInfo(sheetVoIPage));
     }
 

+ 26 - 0
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/open/OpenClient.java

@@ -5,7 +5,9 @@ import com.yonge.cooleshow.biz.dal.entity.SysConfig;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.vo.CheckVo;
 import com.yonge.cooleshow.biz.dal.vo.MemberPriceVo;
+import com.yonge.cooleshow.biz.dal.wrapper.liveroom.LiveRoomWrapper;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import com.yonge.cooleshow.student.io.request.LiveRoomVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -15,9 +17,11 @@ import io.swagger.annotations.ApiParam;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 
 import javax.validation.Valid;
 
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -63,6 +67,8 @@ public class OpenClient extends BaseController {
 
     @Autowired
     private ActivityPlanService activityPlanService;
+    @Autowired
+    private LiveRoomService liveRoomService;
 
     @ApiOperation(value = "查询老师头像昵称信息")
     @GetMapping("/getTeacher")
@@ -165,4 +171,24 @@ public class OpenClient extends BaseController {
         List<SysConfig> configs = sysConfigService.findAll(params);
         return succeed(configs);
     }
+
+    @ApiOperation(value = "直播间详情信息", notes = "直播间ID")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "userId", value = "分享用户ID", dataType = "Long")
+    })
+    @GetMapping("/liveRoom/detail/{ID}")
+    public HttpResponseResult<LiveRoomVO> liveRoomDetailInfo(@PathVariable("ID") String liveRoomId,
+                                                             @RequestParam(value = "userId", required = false) Long userId) {
+
+        if (StringUtils.isEmpty(liveRoomId)) {
+            return failed("无效的直播间编号");
+        }
+
+        LiveRoomWrapper roomWrapper = liveRoomService.findLiveRoomDetailInfoByRoomId(liveRoomId, userId);
+        if (Objects.isNull(roomWrapper)) {
+            return failed("无效的直播间编号");
+        }
+
+        return succeed(LiveRoomVO.from(roomWrapper.jsonString()));
+    }
 }

+ 90 - 0
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/io/request/LiveRoomVO.java

@@ -0,0 +1,90 @@
+package com.yonge.cooleshow.student.io.request;
+
+import com.alibaba.fastjson.JSON;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.yonge.cooleshow.biz.dal.enums.MK;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * Created by Eric.Shang on 2022/9/22.
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class LiveRoomVO implements Serializable {
+
+    @ApiModelProperty(value = "课程组id")
+    private Long courseGroupId;
+
+    @ApiModelProperty(value = "课程id")
+    private Long courseId;
+
+    @ApiModelProperty(value = "主讲人id/老师id")
+    private Long speakerId;
+
+    @ApiModelProperty(value = "房间编号")
+    private String roomUid;
+
+    @ApiModelProperty(value = "房间标题/最多12个字")
+    private String roomTitle;
+
+    @ApiModelProperty(value = "直播开始时间")
+    @JsonFormat(pattern = MK.TIME_PATTERN, timezone = MK.TIME_ZONE)
+    private Date liveStartTime;
+
+    @ApiModelProperty(value = "直播结束时间")
+    @JsonFormat(pattern = MK.TIME_PATTERN, timezone = MK.TIME_ZONE)
+    private Date liveEndTime;
+
+    @ApiModelProperty(value = "直播内容/最多200个字")
+    private String liveRemark;
+
+    @ApiModelProperty(value = "直播状态 0未开始 1已开始 2已结束")
+    private Integer liveState;
+
+    @ApiModelProperty(value = "房间状态 0正常 1已删除 2已销毁")
+    private Integer roomState;
+
+    @ApiModelProperty(value = "房间类型 live直播课  temp临时直播间")
+    private String type;
+
+    @ApiModelProperty(value = "封面图片")
+    private String coverPic;
+
+    @ApiModelProperty(value = "直播老师信息")
+    private UserInfo teacher;
+
+    @ApiModelProperty(value = "分享同学信息")
+    private UserInfo student;
+
+    public static LiveRoomVO from(String jsonString) {
+        return JSON.parseObject(jsonString, LiveRoomVO.class);
+    }
+
+    /**
+     * 直播间老师信息
+     */
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class UserInfo implements Serializable {
+
+        @ApiModelProperty("用户名")
+        private String username;
+
+        @ApiModelProperty("手机号")
+        private String phone;
+
+        @ApiModelProperty("头像")
+        private String avatar;
+
+        @ApiModelProperty("真实姓名")
+        private String realName;
+    }
+}

+ 16 - 8
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/MusicAlbumController.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.teacher.controller;
 
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -12,10 +13,12 @@ import javax.validation.Valid;
 
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+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.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -88,7 +91,7 @@ public class MusicAlbumController extends BaseController {
 
         query.setAlbumStatus(YesOrNoEnum.YES);
         query.setSortBy(1);
-        IPage<MusicAlbumVo> iPage = musicAlbumService.selectStudentPage(PageUtil.getPage(query),query);
+        IPage<MusicAlbumVo> iPage = musicAlbumService.selectStudentPage(PageUtil.getPage(query),query, ClientEnum.TEACHER);
         return succeed(PageUtil.pageInfo(iPage));
     }
 
@@ -105,7 +108,7 @@ public class MusicAlbumController extends BaseController {
         }
         query.setType(2);
         query.setState(YesOrNoEnum.YES);
-        YesOrNoEnum yesOrNoEnum = musicAlbumService.checkFavorite(sysUser.getId(),query.getId() );
+        YesOrNoEnum yesOrNoEnum = musicAlbumService.checkFavorite(sysUser.getId(),query.getId(), ClientEnum.TEACHER);
         AlbumDetailVo albumDetailVo = musicAlbumService.detail(PageUtil.getPage(query), query);
         albumDetailVo.setFavorite(yesOrNoEnum);
 
@@ -117,7 +120,7 @@ public class MusicAlbumController extends BaseController {
         musicAlbumSearch.setPage(1);
         musicAlbumSearch.setRows(query.getRelatedNum() +1);
         musicAlbumSearch.setAlbumTagIds(albumDetailVo.getAlbumTag());
-        IPage<MusicAlbumVo> relatedMusicAlbum = musicAlbumService.selectStudentPage(PageUtil.getPage(musicAlbumSearch),musicAlbumSearch);
+        IPage<MusicAlbumVo> relatedMusicAlbum = musicAlbumService.selectStudentPage(PageUtil.getPage(musicAlbumSearch),musicAlbumSearch, ClientEnum.TEACHER);
         List<MusicAlbumVo> musicAlbumVos1 = relatedMusicAlbum.getRecords()
                                                       .stream()
                                                       .filter(musicAlbumVo -> !musicAlbumVo.getId()
@@ -133,22 +136,27 @@ public class MusicAlbumController extends BaseController {
     /**
      * 专辑收藏
      */
-    // @PostMapping("/favorite/{id}")
+     @PostMapping("/favorite/{id}")
     @ApiOperation(value = "专辑收藏/取消收藏")
-    public HttpResponseResult<Boolean> favorite(@ApiParam(value = "专辑编号", required = true) @PathVariable("id") Long id) {
+    public HttpResponseResult<Boolean> favorite(@ApiParam(value = "专辑编号", required = true) @PathVariable("id") Long id,
+                                                @ApiParam(value = "客户端类型") @RequestParam(value = "clientType", required = false, defaultValue = "TEACHER") String clientType) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null  || sysUser.getId() == null) {
             return failed("用户信息获取失败");
         }
 
-        return succeed(musicAlbumService.setFavorite(sysUser.getId(),id));
+         if (ClientEnum.invalid(clientType)) {
+             return failed("无效的客户端类型");
+         }
+
+        return succeed(musicAlbumService.setFavorite(sysUser.getId(), id, ClientEnum.valueOf(clientType)));
     }
 
 
     /**
      * 专辑收藏
      */
-    // @GetMapping("/favorite")
+    @GetMapping("/favorite")
     @ApiOperation(value = "收藏专辑列表")
     public HttpResponseResult<PageInfo<MusicAlbumVo>> favoriteAlbum(QueryInfo query) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
@@ -158,7 +166,7 @@ public class MusicAlbumController extends BaseController {
         StudentMusicAlbumSearch search = new StudentMusicAlbumSearch();
         search.setStudentId(sysUser.getId());
         search.setAlbumStatus(YesOrNoEnum.YES);
-        IPage<MusicAlbumVo> albumVoIPage = musicAlbumService.favoriteAlbum(PageUtil.getPage(query), search);
+        IPage<MusicAlbumVo> albumVoIPage = musicAlbumService.favoriteAlbum(PageUtil.getPage(query), search, ClientEnum.TEACHER);
         return succeed(PageUtil.pageInfo(albumVoIPage));
     }
 }

+ 52 - 3
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/MusicSheetController.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.teacher.controller;
 
+import com.yonge.toolset.base.page.QueryInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -15,6 +16,7 @@ import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -74,7 +76,17 @@ public class MusicSheetController extends BaseController {
         if (sysUser == null  || sysUser.getId() == null) {
             return failed("用户信息获取失败");
         }
-        return succeed(musicSheetService.detail(id, sysUser, ClientEnum.TEACHER));
+
+        MusicSheetDetailVo detail = musicSheetService.detail(id, sysUser, ClientEnum.TEACHER);
+
+        // 设置返回默认值
+        if (StringUtil.isEmpty(detail.getAudioFileUrl())) {
+            detail.setAudioFileUrl("");
+        }
+        if (StringUtils.isEmpty(detail.getMusicImg())) {
+            detail.setMusicImg("");
+        }
+        return succeed(detail);
     }
 
 	@ApiOperation(value = "新增", httpMethod="POST", consumes="application/json", produces="application/json")
@@ -172,7 +184,7 @@ public class MusicSheetController extends BaseController {
             query.setMyself(false);
         }
 
-        IPage<MusicSheetVo> musicSheetVoIPage = musicSheetService.selectStudentPage(PageUtil.getPage(query), query);
+        IPage<MusicSheetVo> musicSheetVoIPage = musicSheetService.selectStudentPage(PageUtil.getPage(query), query, ClientEnum.TEACHER);
         return succeed(PageUtil.pageInfo(musicSheetVoIPage));
     }
 
@@ -197,7 +209,26 @@ public class MusicSheetController extends BaseController {
     }
 
     /**
-     * 我的单曲,收藏单曲
+     * 曲目收藏
+     */
+    @PostMapping("/favorite/{id}")
+    @ApiOperation(value = "曲目收藏/取消收藏")
+    public HttpResponseResult<Boolean> favorite(@ApiParam(value = "曲目编号", required = true) @PathVariable("id") Long id,
+                                                @ApiParam(value = "客户端类型") @RequestParam(value = "clientType", required = false, defaultValue = "TEACHER") String clientType) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null  || sysUser.getId() == null) {
+            return failed("用户信息获取失败");
+        }
+
+        if (ClientEnum.invalid(clientType)) {
+            return failed("无效的客户端类型");
+        }
+
+        return succeed(musicSheetService.setFavorite(sysUser.getId(),id, ClientEnum.valueOf(clientType)));
+    }
+
+    /**
+     * 我的单曲
      */
     @PostMapping("/my")
     @ApiOperation(value = "我的单曲")
@@ -214,6 +245,24 @@ public class MusicSheetController extends BaseController {
         return succeed(PageUtil.pageInfo(sheetVoIPage));
     }
 
+    /**
+     * 收藏单曲
+     */
+    @GetMapping("/favorite")
+    @ApiOperation(value = "收藏单曲")
+    public HttpResponseResult<PageInfo<MusicSheetVo>> favoriteMusic(QueryInfo query) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null  || sysUser.getId() == null) {
+            return failed("用户信息获取失败");
+        }
+        StudentMusicSheetSearch search = new StudentMusicSheetSearch();
+        search.setStudentId(sysUser.getId());
+        search.setState(YesOrNoEnum.YES);
+        search.setAuditStatus(AuthStatusEnum.PASS);
+        IPage<MusicSheetVo> sheetVoIPage = musicSheetService.favoriteMusic(PageUtil.getPage(query),search, ClientEnum.TEACHER);
+        return succeed(PageUtil.pageInfo(sheetVoIPage));
+    }
+
     @ApiOperation(value = "乐谱分享")
     @GetMapping(value="/share")
     public HttpResponseResult<MusicSheetShareVo> shareMusicSheet() {

+ 9 - 12
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/SubjectController.java

@@ -1,26 +1,23 @@
 package com.yonge.cooleshow.teacher.controller;
 
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.entity.Subject;
+import com.yonge.cooleshow.biz.dal.entity.Teacher;
+import com.yonge.cooleshow.biz.dal.service.SubjectService;
+import com.yonge.cooleshow.biz.dal.service.TeacherService;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
-
-import java.util.List;
-
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
-import com.yonge.cooleshow.auth.api.entity.SysUser;
-import com.yonge.cooleshow.biz.dal.entity.Student;
-import com.yonge.cooleshow.biz.dal.entity.Subject;
-import com.yonge.cooleshow.biz.dal.entity.Teacher;
-import com.yonge.cooleshow.biz.dal.service.SubjectService;
-import com.yonge.cooleshow.biz.dal.service.TeacherService;
-import com.yonge.cooleshow.common.controller.BaseController;
-import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import java.util.List;
 
 @RequestMapping("subject")
 @Api(tags = "声部服务")

+ 5 - 0
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherController.java

@@ -76,6 +76,11 @@ public class TeacherController extends BaseController {
         if (StringUtil.isEmpty(subjectIds)) {
             return failed("参数不能为空");
         }
+
+        if (subjectIds.split(",").length > 5) {
+            return failed("最多选择5个乐器");
+        }
+
         SysUser user = sysUserFeignService.queryUserInfo();
         if (user == null || null == user.getId()) {
             return failed(HttpStatus.FORBIDDEN, "请登录");

+ 16 - 4
cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/MusicAlbumController.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicAlbumSearch;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.service.MusicAlbumService;
 import com.yonge.cooleshow.biz.dal.vo.MusicAlbumVo;
 import com.yonge.cooleshow.common.controller.BaseController;
@@ -40,13 +41,18 @@ public class MusicAlbumController extends BaseController {
      */
     @PostMapping("/favorite/{id}")
     @ApiOperation(value = "专辑收藏/取消收藏")
-    public HttpResponseResult<Boolean> favorite(@ApiParam(value = "专辑编号", required = true) @PathVariable("id") Long id) {
+    public HttpResponseResult<Boolean> favorite(@ApiParam(value = "专辑编号", required = true) @PathVariable("id") Long id,
+                                                @ApiParam(value = "客户端类型") @RequestParam(value = "clientType", required = false, defaultValue = "STUDENT") String clientType) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null  || sysUser.getId() == null) {
             return failed("用户信息获取失败");
         }
 
-        return succeed(musicAlbumService.setFavorite(sysUser.getId(),id));
+        if (ClientEnum.invalid(clientType)) {
+            return failed("无效的客户端类型");
+        }
+
+        return succeed(musicAlbumService.setFavorite(sysUser.getId(), id, ClientEnum.valueOf(clientType)));
     }
 
 
@@ -55,15 +61,21 @@ public class MusicAlbumController extends BaseController {
      */
     @GetMapping("/favorite")
     @ApiOperation(value = "学生-收藏专辑列表")
-    public HttpResponseResult<PageInfo<MusicAlbumVo>> favoriteAlbum(QueryInfo query) {
+    public HttpResponseResult<PageInfo<MusicAlbumVo>> favoriteAlbum(@ApiParam(value = "客户端类型") @RequestParam(value = "clientType", required = false, defaultValue = "STUDENT") String clientType,
+                                                                    QueryInfo query) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null  || sysUser.getId() == null) {
             return failed("用户信息获取失败");
         }
+
+        if (ClientEnum.invalid(clientType)) {
+            return failed("无效的客户端类型");
+        }
+
         StudentMusicAlbumSearch search = new StudentMusicAlbumSearch();
         search.setStudentId(sysUser.getId());
         search.setAlbumStatus(YesOrNoEnum.YES);
-        IPage<MusicAlbumVo> albumVoIPage = musicAlbumService.favoriteAlbum(PageUtil.getPage(query), search);
+        IPage<MusicAlbumVo> albumVoIPage = musicAlbumService.favoriteAlbum(PageUtil.getPage(query), search, ClientEnum.valueOf(clientType));
         return succeed(PageUtil.pageInfo(albumVoIPage));
     }
 }

+ 27 - 6
cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/MusicSheetController.java

@@ -4,16 +4,19 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 
+import java.io.File;
 import java.util.Date;
 
 import javax.validation.Valid;
 
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 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.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -64,12 +67,18 @@ public class MusicSheetController extends BaseController {
      */
     @PostMapping("/favorite/{id}")
     @ApiOperation(value = "曲目收藏/取消收藏")
-    public HttpResponseResult<Boolean> favorite(@ApiParam(value = "曲目编号", required = true) @PathVariable("id") Long id) {
+    public HttpResponseResult<Boolean> favorite(@ApiParam(value = "曲目编号", required = true) @PathVariable("id") Long id,
+                                                @ApiParam(value = "客户端类型") @RequestParam(value = "clientType", required = false, defaultValue = "STUDENT") String clientType) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null  || sysUser.getId() == null) {
             return failed("用户信息获取失败");
         }
-        return succeed(musicSheetService.setFavorite(sysUser.getId(),id));
+
+        if (ClientEnum.invalid(clientType)) {
+            return failed("无效的客户端类型");
+        }
+
+        return succeed(musicSheetService.setFavorite(sysUser.getId(), id, ClientEnum.valueOf(clientType)));
     }
 
 
@@ -79,15 +88,21 @@ public class MusicSheetController extends BaseController {
      */
     @GetMapping("/my")
     @ApiOperation(value = "学生-我的单曲")
-    public HttpResponseResult<PageInfo<MusicSheetVo>> myMusic(QueryInfo query) {
+    public HttpResponseResult<PageInfo<MusicSheetVo>> myMusic(@ApiParam(value = "客户端类型") @RequestParam(value = "clientType", required = false, defaultValue = "STUDENT") String clientType,
+                                                              QueryInfo query) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null  || sysUser.getId() == null) {
             return failed("用户信息获取失败");
         }
+
+        if (ClientEnum.invalid(clientType)) {
+            return failed("无效的客户端类型");
+        }
+
         StudentMusicSheetSearch search = new StudentMusicSheetSearch();
         search.setStudentId(sysUser.getId());
         search.setAuditStatus(AuthStatusEnum.PASS);
-        search.setUserType(ClientEnum.STUDENT);
+        search.setUserType(ClientEnum.valueOf(clientType));
         IPage<MusicSheetVo> sheetVoIPage = musicSheetService.myMusic(PageUtil.getPage(query),search);
         return succeed(PageUtil.pageInfo(sheetVoIPage));
     }
@@ -98,16 +113,22 @@ public class MusicSheetController extends BaseController {
      */
     @GetMapping("/favorite")
     @ApiOperation(value = "学生-收藏单曲")
-    public HttpResponseResult<PageInfo<MusicSheetVo>> favoriteMusic(QueryInfo query) {
+    public HttpResponseResult<PageInfo<MusicSheetVo>> favoriteMusic(@ApiParam(value = "客户端类型") @RequestParam(value = "clientType", required = false, defaultValue = "STUDENT") String clientType,
+                                                                    QueryInfo query) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null  || sysUser.getId() == null) {
             return failed("用户信息获取失败");
         }
+
+        if (ClientEnum.invalid(clientType)) {
+            return failed("无效的客户端类型");
+        }
+
         StudentMusicSheetSearch search = new StudentMusicSheetSearch();
         search.setStudentId(sysUser.getId());
         search.setState(YesOrNoEnum.YES);
         search.setAuditStatus(AuthStatusEnum.PASS);
-        IPage<MusicSheetVo> sheetVoIPage = musicSheetService.favoriteMusic(PageUtil.getPage(query),search);
+        IPage<MusicSheetVo> sheetVoIPage = musicSheetService.favoriteMusic(PageUtil.getPage(query),search, ClientEnum.valueOf(clientType));
         return succeed(PageUtil.pageInfo(sheetVoIPage));
     }
 

+ 19 - 6
cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/open/OpenMusicAlbumController.java

@@ -22,11 +22,13 @@ import com.yonge.toolset.base.page.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 
+import io.swagger.annotations.ApiParam;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
@@ -59,7 +61,8 @@ public class OpenMusicAlbumController extends BaseController {
 
     @ApiOperation(value = "热门专辑", httpMethod="POST", consumes="application/json", produces="application/json")
     @PostMapping(value="/list", consumes="application/json", produces="application/json")
-    public HttpResponseResult<PageInfo<MusicAlbumVo>> list(@RequestBody MusicAlbumSearch query) {
+    public HttpResponseResult<PageInfo<MusicAlbumVo>> list(@ApiParam(value = "客户端类型") @RequestParam(value = "clientType", required = false, defaultValue = "STUDENT") String clientType,
+                                                           @RequestBody MusicAlbumSearch query) {
 
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser != null && sysUser.getId() != null) {
@@ -80,11 +83,15 @@ public class OpenMusicAlbumController extends BaseController {
             }
         }
 
+        if (ClientEnum.invalid(clientType)) {
+            return failed("无效的客户端类型");
+        }
+
         // 检查app版本
         query.setAuditVersion(YesOrNoEnum.NO);
         query.setAlbumStatus(YesOrNoEnum.YES);
         query.setSortBy(1);
-        IPage<MusicAlbumVo> iPage = musicAlbumService.selectStudentPage(PageUtil.getPage(query),query);
+        IPage<MusicAlbumVo> iPage = musicAlbumService.selectStudentPage(PageUtil.getPage(query),query, ClientEnum.valueOf(clientType));
         return succeed(PageUtil.pageInfo(iPage));
     }
 
@@ -94,11 +101,17 @@ public class OpenMusicAlbumController extends BaseController {
      */
     @PostMapping(value = "/detail",  consumes="application/json", produces="application/json")
     @ApiOperation(value = "专辑详情",httpMethod="POST", consumes="application/json", produces="application/json")
-    public HttpResponseResult<AlbumDetailVo> detail(@Valid @RequestBody MusicAlbumDetailSearch query) {
+    public HttpResponseResult<AlbumDetailVo> detail(@ApiParam(value = "客户端类型") @RequestParam(value = "clientType", required = false, defaultValue = "STUDENT") String clientType,
+                                                    @Valid @RequestBody MusicAlbumDetailSearch query) {
+
+        if (ClientEnum.invalid(clientType)) {
+            return failed("无效的客户端类型");
+        }
+
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         YesOrNoEnum favorite = YesOrNoEnum.NO;
         if (sysUser != null && sysUser.getId() != null) {
-            favorite = musicAlbumService.checkFavorite(sysUser.getId(),query.getId() );
+            favorite = musicAlbumService.checkFavorite(sysUser.getId(),query.getId(), query.getClientType());
         }
         query.setType(2);
         query.setState(YesOrNoEnum.YES);
@@ -112,7 +125,7 @@ public class OpenMusicAlbumController extends BaseController {
         musicAlbumSearch.setSortBy(1);
         musicAlbumSearch.setPage(1);
         musicAlbumSearch.setRows(query.getRelatedNum() + 1);
-        IPage<MusicAlbumVo> hotMusicAlbum = musicAlbumService.selectStudentPage(PageUtil.getPage(musicAlbumSearch),musicAlbumSearch);
+        IPage<MusicAlbumVo> hotMusicAlbum = musicAlbumService.selectStudentPage(PageUtil.getPage(musicAlbumSearch),musicAlbumSearch, ClientEnum.valueOf(clientType));
         List<MusicAlbumVo> musicAlbumVos = hotMusicAlbum.getRecords()
                                                   .stream()
                                                   .filter(musicAlbumVo -> !musicAlbumVo.getId()
@@ -125,7 +138,7 @@ public class OpenMusicAlbumController extends BaseController {
 
         // 相关专辑
         musicAlbumSearch.setAlbumTagIds(albumDetailVo.getAlbumTag());
-        IPage<MusicAlbumVo> relatedMusicAlbum = musicAlbumService.selectStudentPage(PageUtil.getPage(musicAlbumSearch),musicAlbumSearch);
+        IPage<MusicAlbumVo> relatedMusicAlbum = musicAlbumService.selectStudentPage(PageUtil.getPage(musicAlbumSearch),musicAlbumSearch, ClientEnum.valueOf(clientType));
         List<MusicAlbumVo> musicAlbumVos1 = relatedMusicAlbum.getRecords()
                                                       .stream()
                                                       .filter(musicAlbumVo -> !musicAlbumVo.getId()

+ 22 - 5
cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/open/OpenMusicSheetController.java

@@ -8,6 +8,7 @@ import com.yonge.cooleshow.biz.dal.dto.search.HotSearchSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicSheetSearch;
 import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.HotSearchEnum;
 import com.yonge.cooleshow.biz.dal.service.HotSearchService;
 import com.yonge.cooleshow.biz.dal.service.MusicAlbumService;
@@ -21,6 +22,7 @@ import com.yonge.toolset.base.page.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -54,15 +56,25 @@ public class OpenMusicSheetController extends BaseController {
      */
     @GetMapping("/detail/{id}")
     @ApiOperation(value = "曲目详情", notes = "传入musicTag")
-    public HttpResponseResult<MusicSheetWebsiteDetailVo> detail(@ApiParam(value = "曲谱编号", required = true) @PathVariable("id") Long id) {
+    public HttpResponseResult<MusicSheetWebsiteDetailVo> detail(@ApiParam(value = "曲谱编号", required = true) @PathVariable("id") Long id,
+                                                                @ApiParam(value = "客户端类型") @RequestParam(value = "clientType", required = false) String clientType) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
-        MusicSheetWebsiteDetailVo detail = musicSheetService.websiteDetail(id,sysUser);
+
+        if (StringUtils.isEmpty(clientType)) {
+            clientType = ClientEnum.STUDENT.getCode();
+        }
+        if (ClientEnum.invalid(clientType)) {
+            return failed("无效的客户端类型");
+        }
+
+        MusicSheetWebsiteDetailVo detail = musicSheetService.websiteDetail(id, sysUser, ClientEnum.valueOf(clientType));
         return succeed(detail);
     }
 
     @ApiOperation(value = "首页曲目分页查询", httpMethod="POST", consumes="application/json", produces="application/json")
     @PostMapping(value="/list", consumes="application/json", produces="application/json")
-    public HttpResponseResult<PageInfo<MusicSheetVo>> list(@RequestBody StudentMusicSheetSearch query) {
+    public HttpResponseResult<PageInfo<MusicSheetVo>> list(@ApiParam(value = "客户端类型") @RequestParam(value = "clientType", required = false, defaultValue = "STUDENT") String clientType,
+                                                           @RequestBody StudentMusicSheetSearch query) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
 
         // 检查app版本
@@ -75,7 +87,12 @@ public class OpenMusicSheetController extends BaseController {
         if (sysUser != null) {
             query.setStudentId(sysUser.getId());
         }
-        IPage<MusicSheetVo> musicSheetVoIPage = musicSheetService.selectStudentPage(PageUtil.getPage(query), query);
+
+        if (ClientEnum.invalid(clientType)) {
+            return failed("无效的客户端类型");
+        }
+
+        IPage<MusicSheetVo> musicSheetVoIPage = musicSheetService.selectStudentPage(PageUtil.getPage(query), query, ClientEnum.valueOf(clientType));
         return succeed(PageUtil.pageInfo(musicSheetVoIPage));
     }
 
@@ -93,7 +110,7 @@ public class OpenMusicSheetController extends BaseController {
             query.setStudentId(sysUser.getId());
         }
         query.setRows(query.getSheetRow());
-        IPage<MusicSheetVo> musicSheetVoIPage = musicSheetService.selectStudentPage(PageUtil.getPage(query), query);
+        IPage<MusicSheetVo> musicSheetVoIPage = musicSheetService.selectStudentPage(PageUtil.getPage(query), query, ClientEnum.STUDENT);
 
         MusicAlbumSearch musicAlbumSearch = new MusicAlbumSearch();
         musicAlbumSearch.setAlbumStatus(YesOrNoEnum.YES);