Sfoglia il codice sorgente

Merge remote-tracking branch 'origin/online' into online

zouxuan 2 anni fa
parent
commit
de547b9133
100 ha cambiato i file con 3376 aggiunte e 125 eliminazioni
  1. 1 1
      audio-analysis/src/main/java/com/yonge/netty/dto/NoteAnalysis.java
  2. 8 0
      audio-analysis/src/main/java/com/yonge/netty/dto/UserChannelContext.java
  3. 5 0
      audio-analysis/src/main/java/com/yonge/netty/server/handler/NettyServerHandler.java
  4. 18 1
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/AdminFeignService.java
  5. 5 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/StudentFeignService.java
  6. 67 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/dto/StudentWrapper.java
  7. 20 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/AdminFeignServiceFallback.java
  8. 5 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/StudentFeignServiceFallback.java
  9. 10 0
      cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/entity/LoginEntity.java
  10. 16 0
      cooleshow-auth/auth-server/pom.xml
  11. 11 10
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/filter/PhoneLoginAuthenticationFilter.java
  12. 37 12
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/provider/PhoneAuthenticationProvider.java
  13. 10 0
      cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/controller/NewsController.java
  14. 10 0
      cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/controller/queryinfo/NewsInformationQueryInfo.java
  15. 5 0
      cooleshow-common/pom.xml
  16. 24 1
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/constant/SysConfigConstant.java
  17. 1 1
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/RewardTypeEnum.java
  18. 6 0
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/PmsProductServiceImpl.java
  19. 1 1
      cooleshow-mall/mall-admin/src/main/resources/config/mybatis/PmsProductDao.xml
  20. 2 0
      cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/OmsOrderMapper.java
  21. 8 0
      cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/PmsProductMapper.java
  22. 1 0
      cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/PmsSkuStockMapper.java
  23. 12 0
      cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/PmsSkuStock.java
  24. 7 0
      cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/OmsOrderMapper.xml
  25. 5 0
      cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/PmsProductMapper.xml
  26. 22 3
      cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/PmsSkuStockMapper.xml
  27. 132 1
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/open/OpenShareController.java
  28. 6 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dao/PortalOrderDao.java
  29. 2 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dao/PortalProductDao.java
  30. 185 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dto/OrderCreate.java
  31. 35 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsPortalOrderService.java
  32. 27 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/PmsPortalProductService.java
  33. 4 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/UmsMemberService.java
  34. 215 8
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java
  35. 63 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/PmsPortalProductServiceImpl.java
  36. 28 18
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/UmsMemberServiceImpl.java
  37. 20 0
      cooleshow-mall/mall-portal/src/main/resources/config/mybatis/PortalOrderDao.xml
  38. 21 0
      cooleshow-mall/mall-portal/src/main/resources/config/mybatis/PortalProductDao.xml
  39. 22 0
      cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/BatchSendingTask.java
  40. 24 0
      cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/StudentFirstBuyTask.java
  41. 19 0
      cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/VirtualNumberTask.java
  42. 80 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/CourseCoursewareController.java
  43. 175 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/CustomerServiceBatchSendingController.java
  44. 91 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/CustomerServiceReceiveController.java
  45. 15 16
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/MusicAlbumController.java
  46. 35 4
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/MusicSheetController.java
  47. 94 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ReturnVisitController.java
  48. 3 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UserAccountRecordController.java
  49. 35 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/AdminClient.java
  50. 25 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/OpenUserAccountController.java
  51. 1 1
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/UserOrderClient.java
  52. 106 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/im/CustomerServiceBatchSendingVo.java
  53. 59 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/im/CustomerServiceReceiveVo.java
  54. 7 2
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/im/IMNotifyMessageVO.java
  55. 58 1
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/task/TaskController.java
  56. 14 0
      cooleshow-user/user-biz/pom.xml
  57. 34 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseCoursewareDao.java
  58. 3 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/PlatformCashAccountRecordDao.java
  59. 30 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ReturnVisitDao.java
  60. 10 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/SubjectDao.java
  61. 13 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/CourseCoursewareDto.java
  62. 22 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/MusicImgDto.java
  63. 54 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/MusicSheetRenderDto.java
  64. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderReq.java
  65. 22 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/TeacherMusicSheetAuditReq.java
  66. 116 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/CourseCoursewareSearch.java
  67. 34 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MusicSheetSearch.java
  68. 83 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/ReturnVisitSearch.java
  69. 41 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/StudentSearch.java
  70. 28 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/TeacherSearch.java
  71. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/UserAccountRecordSearch.java
  72. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityReward.java
  73. 115 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseCourseware.java
  74. 95 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CustomerServiceBatchSending.java
  75. 44 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CustomerServiceReceive.java
  76. 15 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicAlbum.java
  77. 113 14
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicSheet.java
  78. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/PlatformCashAccountRecord.java
  79. 116 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ReturnVisit.java
  80. 54 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/Student.java
  81. 27 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/Teacher.java
  82. 18 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TeacherStyleVideo.java
  83. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrder.java
  84. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderDetail.java
  85. 13 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/VideoLessonGroup.java
  86. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/AccountBizTypeEnum.java
  87. 34 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/CoursewareEnum.java
  88. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/GoodTypeEnum.java
  89. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/OrderTypeEnum.java
  90. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/coupon/CouponCategoryEnum.java
  91. 28 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/im/EImReceiveType.java
  92. 30 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/im/EImSendStatus.java
  93. 28 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/im/EImSendType.java
  94. 36 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/CustomerServiceBatchSendingMapper.java
  95. 25 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/CustomerServiceReceiveMapper.java
  96. 11 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/SysUserMapper.java
  97. 45 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseCoursewareService.java
  98. 61 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CustomerServiceBatchSendingService.java
  99. 43 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CustomerServiceReceiveService.java
  100. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicAlbumService.java

+ 1 - 1
audio-analysis/src/main/java/com/yonge/netty/dto/NoteAnalysis.java

@@ -43,7 +43,7 @@ public class NoteAnalysis {
 
 	private int tempo = 0;
 
-	private NoteErrorType noteErrorType = NoteErrorType.RIGHT;
+	private NoteErrorType noteErrorType = NoteErrorType.NOT_PLAY;
 
 	private int score;
 	

+ 8 - 0
audio-analysis/src/main/java/com/yonge/netty/dto/UserChannelContext.java

@@ -533,6 +533,10 @@ public class UserChannelContext {
 
 	public void evaluateForNote(MusicXmlNote musicXmlNote, NoteAnalysis noteAnalysis) {
 		
+		if(noteAnalysis.isIgnore()){
+			return;
+		}
+		
 		double floatingRange = musicXmlNote.getDuration() * hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator(), musicXmlNote.getDuration()) / 100;
 		
 		double endTime = musicXmlNote.getTimeStamp() + dynamicOffset + floatingRange;
@@ -545,6 +549,10 @@ public class UserChannelContext {
 		
 		chunkAnalysisList = totalChunkAnalysisList.stream().filter(t -> Double.doubleToLongBits(t.getStartTime()) >= Double.doubleToLongBits(correctedStartTime) && Double.doubleToLongBits(t.getEndTime()) <= Double.doubleToLongBits(correctedEndTime)).collect(Collectors.toList());
 		
+		if(chunkAnalysisList.size() == 0){
+			return;
+		}
+		
 		double durationTime = chunkAnalysisList.get(chunkAnalysisList.size() - 1).getEndTime() - chunkAnalysisList.get(0).getStartTime();
 		
 		double playDurationTime = 0;

+ 5 - 0
audio-analysis/src/main/java/com/yonge/netty/server/handler/NettyServerHandler.java

@@ -1,5 +1,6 @@
 package com.yonge.netty.server.handler;
 
+import com.yonge.netty.server.service.UserChannelContextService;
 import io.netty.channel.Channel;
 import io.netty.channel.ChannelHandler;
 import io.netty.channel.ChannelHandlerContext;
@@ -23,6 +24,8 @@ public class NettyServerHandler extends ChannelInboundHandlerAdapter {
 	@Autowired
 	private NettyChannelManager channelManager;
 
+	@Autowired
+	private UserChannelContextService userChannelContextService;
 	@Override
 	public void channelActive(ChannelHandlerContext ctx) {
 		// 从管理器中添加
@@ -31,6 +34,7 @@ public class NettyServerHandler extends ChannelInboundHandlerAdapter {
 
 	@Override
 	public void channelUnregistered(ChannelHandlerContext ctx) {
+		userChannelContextService.remove(ctx.channel());
 		// 从管理器中移除
 		channelManager.remove(ctx.channel());
 	}
@@ -38,6 +42,7 @@ public class NettyServerHandler extends ChannelInboundHandlerAdapter {
 	@Override
 	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
 		LOGGER.error("[exceptionCaught][连接({}) 发生异常]", ctx.channel().id(), cause);
+		userChannelContextService.remove(ctx.channel());
 		// 断开连接
 		ctx.channel().close();
 	}

+ 18 - 1
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/AdminFeignService.java

@@ -3,6 +3,7 @@ package com.yonge.cooleshow.api.feign;
 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.StudentWrapper;
 import com.yonge.cooleshow.api.feign.dto.TeacherApi;
 import com.yonge.cooleshow.api.feign.dto.UserFriendInfoVO;
 import com.yonge.cooleshow.api.feign.fallback.AdminFeignServiceFallback;
@@ -20,7 +21,6 @@ import org.springframework.web.bind.annotation.RequestParam;
 
 import java.math.BigDecimal;
 import java.util.List;
-import java.util.Map;
 
 /**
  * Description
@@ -137,4 +137,21 @@ public interface AdminFeignService {
      */
     @PostMapping(value = "/open/im/customerService")
     HttpResponseResult<Boolean> customerService(@RequestBody UserFriendInfoVO info);
+
+
+    /**
+     *  每日增加收藏/热度人数
+     */
+    @GetMapping("/task/virtualNumber")
+    HttpResponseResult<Boolean> virtualNumber();
+
+    /**
+     * 群发消息
+     */
+    @GetMapping("/task/batchSending")
+    HttpResponseResult<Boolean> batchSending();
+
+
+    @PostMapping("/open/adminClient/unionStudent")
+    HttpResponseResult<StudentWrapper.UnionStudentResp> unionStudent(@RequestBody StudentWrapper.UnionStudent info);
 }

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

@@ -1,11 +1,14 @@
 package com.yonge.cooleshow.api.feign;
 
+import com.yonge.cooleshow.api.feign.dto.StudentWrapper;
 import com.yonge.cooleshow.api.feign.fallback.StudentFeignServiceFallback;
 import com.yonge.cooleshow.common.constant.AppConstant;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.feign.config.FeignConfiguration;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 
 @FeignClient(name = AppConstant.APPLICATION_STUDENT + AppConstant.SERVER, configuration = FeignConfiguration.class, fallback = StudentFeignServiceFallback.class)
 public interface StudentFeignService {
@@ -28,6 +31,8 @@ public interface StudentFeignService {
     @GetMapping(value = "/task/halfHourTask")
     Object halfHourTask();
 
+    @GetMapping("/task/studentFirstBuy")
+    HttpResponseResult<Boolean> studentFirstBuy();
 
     /**
      * @Description: 当日陪练课未对老师评价(每晚9点,已评价不发)

+ 67 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/dto/StudentWrapper.java

@@ -0,0 +1,67 @@
+package com.yonge.cooleshow.api.feign.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 学生封装类
+ * Created by Eric.Shang on 2023/1/6.
+ */
+public class StudentWrapper {
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class UnionStudent implements Serializable {
+
+        private Long unionId;
+
+        private String token;
+
+        private String mobile;
+
+        private String subjectName;
+
+        private String username;
+
+        private Integer gender;
+
+        private Boolean tokenCheck;
+
+
+        private Integer lockFlag;
+    }
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class UnionStudentResp implements Serializable {
+
+        private Long unionId;
+
+        private String mobile;
+
+        private Long userId;
+
+        private String username;
+
+        private Boolean updateFlag;
+
+        private Object sysUser;
+        public UnionStudentResp userId(Long userId) {
+            this.userId = userId;
+            return this;
+        }
+
+        public UnionStudentResp username(String username) {
+            this.username = username;
+            return this;
+        }
+    }
+}

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

@@ -4,6 +4,7 @@ import com.yonge.cooleshow.api.feign.AdminFeignService;
 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.StudentWrapper;
 import com.yonge.cooleshow.api.feign.dto.TeacherApi;
 import com.yonge.cooleshow.api.feign.dto.UserFriendInfoVO;
 import com.yonge.cooleshow.common.entity.ContractDto;
@@ -118,4 +119,23 @@ public class AdminFeignServiceFallback implements AdminFeignService {
     public HttpResponseResult<Boolean> customerService(UserFriendInfoVO info) {
         return null;
     }
+
+    @Override
+    public HttpResponseResult<Boolean> virtualNumber() {
+        return null;
+    }
+
+    /**
+     * 群发消息
+     */
+    @Override
+    public HttpResponseResult<Boolean> batchSending() {
+        return null;
+    }
+
+
+    @Override
+    public HttpResponseResult<StudentWrapper.UnionStudentResp> unionStudent(StudentWrapper.UnionStudent info) {
+        return null;
+    }
 }

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

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.api.feign.fallback;
 
 import com.yonge.cooleshow.api.feign.StudentFeignService;
+import com.yonge.cooleshow.api.feign.dto.StudentWrapper;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import org.springframework.stereotype.Component;
 
@@ -17,6 +18,10 @@ public class StudentFeignServiceFallback implements StudentFeignService {
         return null;
     }
 
+    @Override
+    public HttpResponseResult<Boolean> studentFirstBuy() {
+        return null;
+    }
 
 
     @Override

+ 10 - 0
cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/entity/LoginEntity.java

@@ -18,6 +18,8 @@ public class LoginEntity {
     private String deviceNum;
     //二维码code
     private String qrCode;
+    //关联帐号授权码
+    private String authToken;
     
     public Boolean getIsSurportRegister() {
 		return isSurportRegister;
@@ -82,4 +84,12 @@ public class LoginEntity {
     public void setQrCode(String qrCode) {
         this.qrCode = qrCode;
     }
+
+    public String getAuthToken() {
+        return authToken;
+    }
+
+    public void setAuthToken(String authToken) {
+        this.authToken = authToken;
+    }
 }

+ 16 - 0
cooleshow-auth/auth-server/pom.xml

@@ -17,6 +17,22 @@
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     </properties>
     <dependencies>
+
+        <dependency>
+            <groupId>com.microsvc.toolkit.config</groupId>
+            <artifactId>microsvc-config-jwt</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.security</groupId>
+            <artifactId>spring-security-jwt</artifactId>
+            <version>1.0.9.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.79</version>
+        </dependency>
+
         <dependency>
             <groupId>com.yonge.toolset</groupId>
             <artifactId>toolset-mybatis</artifactId>

+ 11 - 10
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/filter/PhoneLoginAuthenticationFilter.java

@@ -1,12 +1,8 @@
 package com.yonge.cooleshow.auth.core.filter;
 
-import java.io.IOException;
-
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import com.yonge.cooleshow.auth.api.entity.LoginEntity;
+import com.yonge.cooleshow.auth.config.token.PhoneAuthenticationToken;
+import com.yonge.cooleshow.common.security.SecurityConstants;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.security.authentication.AbstractAuthenticationToken;
 import org.springframework.security.authentication.AuthenticationServiceException;
@@ -15,9 +11,11 @@ import org.springframework.security.core.AuthenticationException;
 import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;
 import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
 
-import com.yonge.cooleshow.auth.api.entity.LoginEntity;
-import com.yonge.cooleshow.auth.config.token.PhoneAuthenticationToken;
-import com.yonge.cooleshow.common.security.SecurityConstants;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 
 public class PhoneLoginAuthenticationFilter extends AbstractAuthenticationProcessingFilter {
 
@@ -27,6 +25,7 @@ public class PhoneLoginAuthenticationFilter extends AbstractAuthenticationProces
 	private static final String IS_SURPORT_REGISTER = "isSurportRegister";
 	private static final String LOGIN_USER_TYPE = "loginUserType";
 	private static final String QR_CODE = "qrCode";
+	private static final String AUTH_TOKEN = "token";
 
 	private static final String DEVICE_NUM = "deviceNum";
 
@@ -51,6 +50,7 @@ public class PhoneLoginAuthenticationFilter extends AbstractAuthenticationProces
 		boolean isRegister = StringUtils.equals("true", request.getParameter(IS_SURPORT_REGISTER));
 		String loginUserType = obtainParameter(request, LOGIN_USER_TYPE);
 		String qrCode = obtainParameter(request, QR_CODE);
+		String authToken = obtainParameter(request, AUTH_TOKEN);
 
 		String clientId = request.getParameter(clientIdParameter).toUpperCase();
 
@@ -70,6 +70,7 @@ public class PhoneLoginAuthenticationFilter extends AbstractAuthenticationProces
 		loginEntity.setLoginUserType(loginUserType);
 		loginEntity.setDeviceNum(deviceNum);
 		loginEntity.setQrCode(qrCode);
+		loginEntity.setAuthToken(authToken);
 
 		authRequest = new PhoneAuthenticationToken(SecurityConstants.PHONE_PRINCIPAL_PREFIX + principal, loginEntity);
 

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

@@ -1,8 +1,15 @@
 package com.yonge.cooleshow.auth.core.provider;
 
-import java.util.Date;
-import java.util.Objects;
-
+import com.microsvc.toolkit.config.jwt.utils.RsaKeyHelper;
+import com.yonge.cooleshow.auth.api.dto.SysUserInfo;
+import com.yonge.cooleshow.auth.api.entity.LoginEntity;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.auth.config.token.PhoneAuthenticationToken;
+import com.yonge.cooleshow.auth.service.SysUserDeviceService;
+import com.yonge.cooleshow.auth.service.SysUserService;
+import com.yonge.cooleshow.common.service.IdGeneratorService;
+import com.yonge.toolset.base.exception.BizException;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.security.authentication.BadCredentialsException;
 import org.springframework.security.authentication.InternalAuthenticationServiceException;
@@ -12,16 +19,15 @@ import org.springframework.security.core.AuthenticationException;
 import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.security.core.userdetails.UserDetailsService;
 import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.security.jwt.Jwt;
+import org.springframework.security.jwt.JwtHelper;
+import org.springframework.security.jwt.crypto.sign.RsaVerifier;
 import org.springframework.transaction.annotation.Transactional;
 
-import com.yonge.cooleshow.auth.api.dto.SysUserInfo;
-import com.yonge.cooleshow.auth.api.entity.LoginEntity;
-import com.yonge.cooleshow.auth.api.entity.SysUser;
-import com.yonge.cooleshow.auth.config.token.PhoneAuthenticationToken;
-import com.yonge.cooleshow.auth.service.SysUserDeviceService;
-import com.yonge.cooleshow.auth.service.SysUserService;
-import com.yonge.cooleshow.common.service.IdGeneratorService;
-
+import java.security.interfaces.RSAPublicKey;
+import java.util.Date;
+import java.util.Objects;
+@Slf4j
 public class PhoneAuthenticationProvider extends AbstractAuthenticationProvider {
 
     private UserDetailsService userDetailsService;
@@ -49,13 +55,32 @@ public class PhoneAuthenticationProvider extends AbstractAuthenticationProvider
 
         String smsCode = loginEntity.getSmsCode();
         String phone = loginEntity.getPhone();
+        // 二维码登录
         String qrCode = loginEntity.getQrCode();
-        if (StringUtils.isNotEmpty(qrCode) && StringUtils.isEmpty(smsCode)) {
+        // 授权Token登录
+        String authToken = loginEntity.getAuthToken();
+        if (StringUtils.isNotEmpty(qrCode)) {
             // 二维码验证
             boolean b = sysUserService.verifyQrCode(phone, qrCode);
             if (!b) {
                 throw new BadCredentialsException("二维码校验失败");
             }
+        } else if (StringUtils.isNotEmpty(authToken)) {
+            // 授权authToken登录
+            try {
+                RSAPublicKey rsaPublicKey = RsaKeyHelper.getRSAPublicKey("jmedu", "dayaedu", "jmedu.jks", "dayaedu");
+                Jwt jwt = JwtHelper.decodeAndVerify(authToken, new RsaVerifier(rsaPublicKey));
+
+                //获取jwt原始内容
+                String claims = jwt.getClaims();
+                if (StringUtils.isEmpty(claims)) {
+                    throw new BizException("三方授权校验失败");
+                }
+                log.info("retrieveUser claims={}", claims);
+            } catch (Exception e) {
+                log.error("retrieveUser authToken={}", authToken, e);
+            }
+
         } else {
             // 验证码验证
             boolean b = smsCodeService.verifyValidCode(phone, smsCode, "SMS_VERIFY_CODE_LOGIN");

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

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

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

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

+ 5 - 0
cooleshow-common/pom.xml

@@ -49,6 +49,11 @@
 			<groupId>org.springframework.cloud</groupId>
 			<artifactId>spring-cloud-starter-oauth2</artifactId>
 		</dependency>
+		<dependency>
+			<groupId>org.springframework.security.oauth</groupId>
+			<artifactId>spring-security-oauth2</artifactId>
+			<version>2.3.3.RELEASE</version>
+		</dependency>
 
 		<dependency>
 			<groupId>com.baomidou</groupId>

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

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

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

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

+ 6 - 0
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/PmsProductServiceImpl.java

@@ -11,6 +11,7 @@ import com.yonge.cooleshow.admin.dto.PmsProductResult;
 import com.yonge.cooleshow.admin.service.PmsProductService;
 import com.yonge.cooleshow.mbg.mapper.*;
 import com.yonge.cooleshow.mbg.model.*;
+import com.yonge.toolset.base.exception.BizException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -192,6 +193,11 @@ public class PmsProductServiceImpl implements PmsProductService {
         }
         //删除sku
         if(CollUtil.isNotEmpty(removeSkuList)){
+            for (PmsSkuStock pmsSkuStock : removeSkuList) {
+                if (org.apache.commons.lang3.StringUtils.isNotBlank(pmsSkuStock.getPlatformLock())) {
+                    throw new BizException("该商品已被锁定,不能删除");
+                }
+            }
             List<Long> removeSkuIds = removeSkuList.stream().map(PmsSkuStock::getId).collect(Collectors.toList());
             PmsSkuStockExample removeExample = new PmsSkuStockExample();
             removeExample.createCriteria().andIdIn(removeSkuIds);

+ 1 - 1
cooleshow-mall/mall-admin/src/main/resources/config/mybatis/PmsProductDao.xml

@@ -24,7 +24,7 @@
             l.id ladder_id,l.product_id ladder_product_id,l.discount ladder_discount,l.count ladder_count,l.price ladder_price,
             pf.id full_id,pf.product_id full_product_id,pf.full_price full_full_price,pf.reduce_price full_reduce_price,
             m.id member_id,m.product_id member_product_id,m.member_level_id member_member_level_id,m.member_price member_member_price,m.member_level_name member_member_level_name,
-            s.id sku_id,s.product_id sku_product_id,s.price sku_price,s.low_stock sku_low_stock,s.pic sku_pic,s.sale sku_sale,s.sku_code sku_sku_code,s.stock sku_stock,s.sp_data sku_sp_data,
+            s.id as  sku_id,s.product_id sku_product_id,s.price sku_price,s.low_stock sku_low_stock,s.pic sku_pic,s.sale sku_sale,s.sku_code sku_sku_code,s.stock sku_stock,s.sp_data sku_sp_data,s.platform_lock sku_platform_lock,
             a.id attribute_id,a.product_id attribute_product_id,a.product_attribute_id attribute_product_attribute_id,a.value attribute_value
         FROM pms_product p
         LEFT JOIN pms_product_category pc on pc.id = p.product_category_id

+ 2 - 0
cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/OmsOrderMapper.java

@@ -27,4 +27,6 @@ public interface OmsOrderMapper {
     int updateByPrimaryKeySelective(OmsOrder record);
 
     int updateByPrimaryKey(OmsOrder record);
+
+    OmsOrder getByOrderSn(String orderNo);
 }

+ 8 - 0
cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/PmsProductMapper.java

@@ -37,4 +37,12 @@ public interface PmsProductMapper {
     int updateByPrimaryKey(PmsProduct record);
 
     int lockStock(@Param("productId") Long productId, @Param("sum") int sum);
+
+    /**
+     * 解锁商品锁定库存
+     *
+     * @param productId  商品id
+     * @param num 解锁数量
+     */
+    int unLockStock(@Param("productId") Long productId, @Param("sum") int sum);
 }

+ 1 - 0
cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/PmsSkuStockMapper.java

@@ -39,4 +39,5 @@ public interface PmsSkuStockMapper {
      */
     int lockStock(@Param("productSkuId") Long productSkuId, @Param("quantity") Integer quantity);
 
+    int unLockStock(@Param("productSkuId") Long productSkuId, @Param("quantity") Integer quantity);
 }

+ 12 - 0
cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/PmsSkuStock.java

@@ -35,8 +35,20 @@ public class PmsSkuStock implements Serializable {
     @ApiModelProperty(value = "商品销售属性,json格式")
     private String spData;
 
+    @ApiModelProperty("平台锁定 被其他平台使用,不许删除")
+    private String platformLock;
+
     private static final long serialVersionUID = 1L;
 
+
+    public String getPlatformLock() {
+        return platformLock;
+    }
+
+    public void setPlatformLock(String platformLock) {
+        this.platformLock = platformLock;
+    }
+
     public Long getId() {
         return id;
     }

+ 7 - 0
cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/OmsOrderMapper.xml

@@ -870,4 +870,11 @@
       modify_time = #{modifyTime,jdbcType=TIMESTAMP}
     where id = #{id,jdbcType=BIGINT}
   </update>
+
+  <select id="getByOrderSn" resultMap="BaseResultMap">
+    select
+    <include refid="Base_Column_List" />
+    from oms_order
+    where order_sn = #{orderSn}
+  </select>
 </mapper>

+ 5 - 0
cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/PmsProductMapper.xml

@@ -923,4 +923,9 @@
   <update id="lockStock">
     update pms_product set lock_stock = lock_stock + #{sum} where  id = #{productId} and stock &gt;= ( lock_stock + #{sum})
   </update>
+
+  <update id="unLockStock">
+
+    update pms_product set lock_stock = lock_stock - #{sum} where  id = #{productId} and lock_stock &gt;= #{sum}
+    </update>
 </mapper>

+ 22 - 3
cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/PmsSkuStockMapper.xml

@@ -13,6 +13,7 @@
     <result column="promotion_price" jdbcType="DECIMAL" property="promotionPrice" />
     <result column="lock_stock" jdbcType="INTEGER" property="lockStock" />
     <result column="sp_data" jdbcType="VARCHAR" property="spData" />
+    <result column="platform_lock" jdbcType="VARCHAR" property="platformLock" />
   </resultMap>
   <sql id="Example_Where_Clause">
     <where>
@@ -73,7 +74,7 @@
     </where>
   </sql>
   <sql id="Base_Column_List">
-    id, product_id, sku_code, price, stock, low_stock, pic, sale, promotion_price, lock_stock, 
+    id, product_id, sku_code, price, stock, low_stock, pic, sale, promotion_price, lock_stock, platform_lock,
     sp_data
   </sql>
   <select id="selectByExample" parameterType="com.yonge.cooleshow.mbg.model.PmsSkuStockExample" resultMap="BaseResultMap">
@@ -112,11 +113,11 @@
     </selectKey>
     insert into pms_sku_stock (product_id, sku_code, price, 
       stock, low_stock, pic, 
-      sale, promotion_price, lock_stock, 
+      sale, promotion_price, lock_stock, platform_lock,
       sp_data)
     values (#{productId,jdbcType=BIGINT}, #{skuCode,jdbcType=VARCHAR}, #{price,jdbcType=DECIMAL}, 
       #{stock,jdbcType=INTEGER}, #{lowStock,jdbcType=INTEGER}, #{pic,jdbcType=VARCHAR}, 
-      #{sale,jdbcType=INTEGER}, #{promotionPrice,jdbcType=DECIMAL}, #{lockStock,jdbcType=INTEGER}, 
+      #{sale,jdbcType=INTEGER}, #{promotionPrice,jdbcType=DECIMAL}, #{lockStock,jdbcType=INTEGER}, #{platformLock},
       #{spData,jdbcType=VARCHAR})
   </insert>
   <insert id="insertSelective" parameterType="com.yonge.cooleshow.mbg.model.PmsSkuStock">
@@ -155,6 +156,9 @@
       <if test="spData != null">
         sp_data,
       </if>
+      <if test="platformLock != null">
+        platform_lock,
+      </if>
     </trim>
     <trim prefix="values (" suffix=")" suffixOverrides=",">
       <if test="productId != null">
@@ -187,6 +191,9 @@
       <if test="spData != null">
         #{spData,jdbcType=VARCHAR},
       </if>
+      <if test="platformLock != null">
+        #{platformLock,jdbcType=VARCHAR},
+      </if>
     </trim>
   </insert>
   <select id="countByExample" parameterType="com.yonge.cooleshow.mbg.model.PmsSkuStockExample" resultType="java.lang.Long">
@@ -231,6 +238,9 @@
       <if test="record.spData != null">
         sp_data = #{record.spData,jdbcType=VARCHAR},
       </if>
+      <if test="record.spData != null">
+        platform_lock = #{record.platformLock,jdbcType=VARCHAR},
+      </if>
     </set>
     <if test="_parameter != null">
       <include refid="Update_By_Example_Where_Clause" />
@@ -248,6 +258,7 @@
       sale = #{record.sale,jdbcType=INTEGER},
       promotion_price = #{record.promotionPrice,jdbcType=DECIMAL},
       lock_stock = #{record.lockStock,jdbcType=INTEGER},
+      platform_lock = #{record.platformLock,jdbcType=VARCHAR},
       sp_data = #{record.spData,jdbcType=VARCHAR}
     <if test="_parameter != null">
       <include refid="Update_By_Example_Where_Clause" />
@@ -286,6 +297,9 @@
       <if test="spData != null">
         sp_data = #{spData,jdbcType=VARCHAR},
       </if>
+      <if test="spData != null">
+        platform_lock = #{platformLock,jdbcType=VARCHAR},
+      </if>
     </set>
     where id = #{id,jdbcType=BIGINT}
   </update>
@@ -300,6 +314,7 @@
       sale = #{sale,jdbcType=INTEGER},
       promotion_price = #{promotionPrice,jdbcType=DECIMAL},
       lock_stock = #{lockStock,jdbcType=INTEGER},
+    platform_lock = #{platformLock,jdbcType=VARCHAR},
       sp_data = #{spData,jdbcType=VARCHAR}
     where id = #{id,jdbcType=BIGINT}
   </update>
@@ -307,4 +322,8 @@
   <update id="lockStock">
     update pms_sku_stock set lock_stock = lock_stock + #{quantity} where  id = #{productSkuId} and stock &gt;= ( lock_stock + #{quantity})
     </update>
+
+  <update id="unLockStock">
+    update pms_sku_stock set lock_stock = lock_stock - #{quantity} where  id = #{productSkuId} and  lock_stock &gt;= #{quantity}
+  </update>
 </mapper>

+ 132 - 1
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/open/OpenShareController.java

@@ -2,13 +2,24 @@ package com.yonge.cooleshow.portal.controller.open;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.api.IErrorCode;
+import com.baomidou.mybatisplus.extension.api.R;
+import com.baomidou.mybatisplus.extension.enums.ApiErrorCode;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.mall.common.api.CommonPage;
 import com.yonge.cooleshow.mall.common.api.CommonResult;
 import com.yonge.cooleshow.mall.common.courier.domain.CourierInfo;
 import com.yonge.cooleshow.mall.common.courier.service.CourierService;
+import com.yonge.cooleshow.mbg.mapper.PmsSkuStockMapper;
+import com.yonge.cooleshow.mbg.model.OmsOrderCourier;
+import com.yonge.cooleshow.mbg.model.PmsProduct;
+import com.yonge.cooleshow.portal.domain.OmsOrderDetail;
+import com.yonge.cooleshow.portal.domain.PmsPortalProductDetail;
+import com.yonge.cooleshow.portal.dto.OrderCreate;
+import com.yonge.cooleshow.portal.dto.ProductSearch;
 import com.yonge.cooleshow.portal.dto.ShareProductVo;
 import com.yonge.cooleshow.portal.dto.ShareProfitParam;
 import com.yonge.cooleshow.portal.service.OmsOrderCourierService;
@@ -23,7 +34,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 
-import javax.annotation.Resource;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -41,9 +51,15 @@ public class OpenShareController extends BaseController {
     private PmsPortalProductService portalProductService;
 
     @Autowired
+    private PmsSkuStockMapper skuStockMapper;
+
+    @Autowired
     private OmsOrderCourierService orderCourierService;
 
     @Autowired
+    private OmsPortalOrderService portalOrderService;
+
+    @Autowired
     private CourierService courierService;
 
     @ApiOperation(value = "老师商品分享分润")
@@ -88,4 +104,119 @@ public class OpenShareController extends BaseController {
     }
 
 
+    @ApiOperation(value = "综合搜索、筛选、排序")
+    @RequestMapping(value = "/product/search", method = RequestMethod.POST)
+    @ResponseBody
+    public CommonResult<CommonPage<PmsProduct>> search(@RequestBody ProductSearch search) {
+        List<PmsProduct> productList = portalProductService.search(search.getKeyword(),search.getBrandId(),search.getProductCategoryId(),
+                                                                   search.getProductAttributeCategoryId(), search.getPageNum(), search.getPageSize(), search.getSort());
+        return CommonResult.success(CommonPage.restPage(productList));
+    }
+
+
+    @ApiOperation("获取前台商品详情")
+    @RequestMapping(value = "/product/detail/{id}", method = RequestMethod.GET)
+    @ResponseBody
+    public CommonResult<PmsPortalProductDetail> detail(@PathVariable Long id) {
+        PmsPortalProductDetail productDetail = portalProductService.detail(id);
+        return CommonResult.success(productDetail);
+    }
+
+    @PostMapping(value = "/product/queryNameMap", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    public CommonResult<Map<Long,String>> queryNameMap(@RequestBody List<Long> goodsIds) {
+        return CommonResult.success(portalProductService.queryNameMap(goodsIds));
+
+    }
+
+
+    /**
+     * 商品库存查询
+     * @param goodsSkuId 商品存储Id
+     * @return String
+     */
+    @GetMapping(value = "/product/stocks/{id}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<Integer> productStocks(@PathVariable(name = "id") Long goodsSkuId) {
+        log.info("商品库存查询 skuId:{}",goodsSkuId);
+        return R.ok(portalProductService.getProductStockAndSkuStock(goodsSkuId));
+
+    }
+
+    @PostMapping(value = "/product/stocksLock/{id}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<Boolean> productStocksLock(@PathVariable(name = "id") Long goodsSkuId, @RequestParam("lockState") Boolean lockState) {
+        log.info("商品库存锁定 goodsSkuId:{},lockState:{}",goodsSkuId,lockState);
+        return R.ok(portalProductService.lockStock(goodsSkuId,lockState));
+
+    }
+
+    /**
+     * 查询商品订单状态
+     * @param orderNo 订单编号
+     * @return String
+     */
+    @GetMapping(value = "/product/orderStatus/{id}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<Boolean> productOrderStatus(@PathVariable(name = "id") String orderNo){
+        log.info("查询商品订单状态:{}",orderNo);
+        OmsOrderDetail detail = portalOrderService.detail(orderNo);
+
+        return R.restResult(detail.getStatus().equals(1), ApiErrorCode.SUCCESS);
+    }
+
+
+    /**
+     * 设置商品退款
+     *
+     * @param orderNo 订单编号
+     * @return String
+     */
+    @GetMapping(value = "/product/orderRefund/{id}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<Boolean> productOrderRefund(@PathVariable(name = "id") String orderNo) {
+
+        log.info("设置订单退款:{}",orderNo);
+        return R.restResult(portalOrderService.jmeduOrderRefund(orderNo), ApiErrorCode.SUCCESS);
+    }
+
+
+    /**
+     * 查询商品订单生成
+     * @param order ProductWrapper.OrderCreate
+     * @return String
+     */
+    @PostMapping(value = "/product/orderCreate", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<Boolean> productOrderCreate(@RequestBody OrderCreate order) {
+
+        log.info("创建管乐团订单:{}",JSON.toJSONString(order));
+
+        portalOrderService.jmeduProductOrderCreate(order);
+
+
+        return R.ok(true);
+    }
+
+
+
+    /**
+     * 查询订单快递信息
+     * @return
+     */
+    @GetMapping(value = "/product/orderCourier/{id}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<OmsOrderCourier> productOrderCourier(@PathVariable(name = "id") String orderNo) {
+        log.info("查询订单快递信息 : {}",orderNo);
+        return R.ok(portalOrderService.productOrderCourier(orderNo));
+
+    }
+
+
+
+
+
+    /**
+     * 锁定/解锁 sku
+     *
+     */
+    @GetMapping(value = "/product/lockSku/{id}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<Boolean> productOrderCourier(@PathVariable(name = "id") Long skuId,@RequestParam("platform") String platform,@RequestParam("lockState") Boolean lockState) {
+        log.info("锁定/解锁 skuId : {},platform:{},lockState:{}",skuId,platform,lockState);
+        return R.restResult(portalOrderService.lockSku(skuId,platform,lockState), ApiErrorCode.SUCCESS);
+
+    }
 }

+ 6 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dao/PortalOrderDao.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.portal.dao;
 
+import com.yonge.cooleshow.mbg.model.OmsOrder;
 import com.yonge.cooleshow.mbg.model.OmsOrderItem;
 import com.yonge.cooleshow.portal.domain.OmsOrderDetail;
 import com.yonge.cooleshow.portal.domain.ProductStock;
@@ -23,6 +24,10 @@ public interface PortalOrderDao {
     int updateSkuStock(@Param("itemList") List<OmsOrderItem> orderItemList);
 
     /**
+     * 修改 pms_sku_stock表的锁定库存及真实库存
+     */
+    int updateRefundSkuStock(@Param("itemList") List<OmsOrderItem> orderItemList);
+    /**
      * 获取超时订单
      * @param minute 超时时间(分)
      */
@@ -39,4 +44,5 @@ public interface PortalOrderDao {
     int releaseSkuStockLock(@Param("itemList") List<OmsOrderItem> orderItemList);
 
     int releaseProductStockLock(@Param("itemList") List<ProductStock> orderItemList);
+
 }

+ 2 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dao/PortalProductDao.java

@@ -32,4 +32,6 @@ public interface PortalProductDao {
      * 改库存
      */
     void updateProductStock(@Param("itemList") List<ProductStock> productStockList);
+
+    int refundProductStock(@Param("itemList") List<ProductStock> productStockList);
 }

+ 185 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dto/OrderCreate.java

@@ -0,0 +1,185 @@
+package com.yonge.cooleshow.portal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2023-01-10
+ */
+public class OrderCreate {
+
+    @ApiModelProperty("下单手机号")
+    private String mobile;
+
+    @ApiModelProperty("订单编号")
+    private String orderNo;
+
+    @ApiModelProperty("订单总金额")
+    private BigDecimal totalAmount;
+
+    @ApiModelProperty("支付类型  1->支付宝;2->微信")
+    private Integer payType;
+
+    @ApiModelProperty(value = "收货人姓名")
+    private String receiverName;
+
+    @ApiModelProperty(value = "收货人电话")
+    private String receiverPhone;
+
+    @ApiModelProperty(value = "收货人邮编")
+    private String receiverPostCode;
+
+    @ApiModelProperty(value = "省份/直辖市")
+    private String receiverProvince;
+
+    @ApiModelProperty(value = "城市")
+    private String receiverCity;
+
+    @ApiModelProperty(value = "区")
+    private String receiverRegion;
+
+    @ApiModelProperty(value = "详细地址")
+    private String receiverDetailAddress;
+
+    @ApiModelProperty("商品详情")
+    private List<OrderItem> orderItemList;
+
+    public static class OrderItem implements Serializable {
+
+
+        @ApiModelProperty(value = "购买数量")
+        private Integer productQuantity;
+
+        @ApiModelProperty(value = "商品sku编号")
+        private Long productSkuId;
+
+        @ApiModelProperty(value = "该商品经过优惠后的分解金额")
+        private BigDecimal realAmount;
+
+        public Integer getProductQuantity() {
+            return productQuantity;
+        }
+
+        public void setProductQuantity(Integer productQuantity) {
+            this.productQuantity = productQuantity;
+        }
+
+        public Long getProductSkuId() {
+            return productSkuId;
+        }
+
+        public void setProductSkuId(Long productSkuId) {
+            this.productSkuId = productSkuId;
+        }
+
+        public BigDecimal getRealAmount() {
+            return realAmount;
+        }
+
+        public void setRealAmount(BigDecimal realAmount) {
+            this.realAmount = realAmount;
+        }
+    }
+
+    public String getMobile() {
+        return mobile;
+    }
+
+    public void setMobile(String mobile) {
+        this.mobile = mobile;
+    }
+
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public BigDecimal getTotalAmount() {
+        return totalAmount;
+    }
+
+    public void setTotalAmount(BigDecimal totalAmount) {
+        this.totalAmount = totalAmount;
+    }
+
+    public Integer getPayType() {
+        return payType;
+    }
+
+    public void setPayType(Integer payType) {
+        this.payType = payType;
+    }
+
+    public String getReceiverName() {
+        return receiverName;
+    }
+
+    public void setReceiverName(String receiverName) {
+        this.receiverName = receiverName;
+    }
+
+    public String getReceiverPhone() {
+        return receiverPhone;
+    }
+
+    public void setReceiverPhone(String receiverPhone) {
+        this.receiverPhone = receiverPhone;
+    }
+
+    public String getReceiverPostCode() {
+        return receiverPostCode;
+    }
+
+    public void setReceiverPostCode(String receiverPostCode) {
+        this.receiverPostCode = receiverPostCode;
+    }
+
+    public String getReceiverProvince() {
+        return receiverProvince;
+    }
+
+    public void setReceiverProvince(String receiverProvince) {
+        this.receiverProvince = receiverProvince;
+    }
+
+    public String getReceiverCity() {
+        return receiverCity;
+    }
+
+    public void setReceiverCity(String receiverCity) {
+        this.receiverCity = receiverCity;
+    }
+
+    public String getReceiverRegion() {
+        return receiverRegion;
+    }
+
+    public void setReceiverRegion(String receiverRegion) {
+        this.receiverRegion = receiverRegion;
+    }
+
+    public String getReceiverDetailAddress() {
+        return receiverDetailAddress;
+    }
+
+    public void setReceiverDetailAddress(String receiverDetailAddress) {
+        this.receiverDetailAddress = receiverDetailAddress;
+    }
+
+    public List<OrderItem> getOrderItemList() {
+        return orderItemList;
+    }
+
+    public void setOrderItemList(List<OrderItem> orderItemList) {
+        this.orderItemList = orderItemList;
+    }
+}

+ 35 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsPortalOrderService.java

@@ -2,9 +2,11 @@ package com.yonge.cooleshow.portal.service;
 
 import com.yonge.cooleshow.mall.common.api.CommonPage;
 import com.yonge.cooleshow.mbg.model.OmsOrder;
+import com.yonge.cooleshow.mbg.model.OmsOrderCourier;
 import com.yonge.cooleshow.portal.domain.ConfirmOrderResult;
 import com.yonge.cooleshow.portal.domain.OmsOrderDetail;
 import com.yonge.cooleshow.portal.domain.OrderParam;
+import com.yonge.cooleshow.portal.dto.OrderCreate;
 import com.yonge.cooleshow.portal.dto.OrderPayReq;
 import com.yonge.cooleshow.portal.dto.OrderPayRes;
 import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
@@ -126,4 +128,37 @@ public interface OmsPortalOrderService {
      */
     @Transactional
     Integer shareProfit();
+
+    /**
+     * 订单退款
+     *
+     * @param orderNo 订单号
+     * @return
+     */
+    Boolean jmeduOrderRefund(String orderNo);
+
+    /**
+     * 创建管乐团订单
+     *
+     * @param order
+     */
+    void jmeduProductOrderCreate(OrderCreate order);
+
+    /**
+     * 查询
+     *
+     * @param orderNo
+     * @return
+     */
+    OmsOrderCourier productOrderCourier(String orderNo);
+
+    /**
+     * 锁定/ 解锁 sku
+     *
+     * @param skuId skuId
+     * @param platform 平台
+     * @param lockState 锁定状态
+     * @return
+     */
+    Boolean lockSku(Long skuId, String platform, Boolean lockState);
 }

+ 27 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/PmsPortalProductService.java

@@ -8,6 +8,7 @@ import com.yonge.cooleshow.portal.dto.ProductSearchConditionVo;
 import com.yonge.cooleshow.portal.dto.ShareProductVo;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 前台商品管理Service
@@ -43,4 +44,30 @@ public interface PmsPortalProductService {
      * @param productId 商品id
      */
     ShareProductVo shareProductProfit(SysUser sysUser, Long productId);
+
+    /**
+     * 商品编号名称
+     *
+     * @param goodsIds
+     * @return
+     */
+    Map<Long,String> queryNameMap(List<Long> goodsIds);
+
+    /**
+     * 查询商品和商品sku库存
+     *
+     * @param goodsSkuId skuId
+     * @return
+     */
+    Integer getProductStockAndSkuStock(Long goodsSkuId);
+
+    /**
+     * 锁定 解锁库存
+     *
+     * @param goodsSkuId
+     * @param lockState
+     * @return
+     */
+    Boolean lockStock(Long goodsSkuId, Boolean lockState);
+
 }

+ 4 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/UmsMemberService.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.portal.service;
 
+import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.mbg.model.UmsMember;
 import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.transaction.annotation.Transactional;
@@ -25,6 +26,9 @@ public interface UmsMemberService {
      */
     UmsMember getCurrentMember();
 
+    @Transactional
+    UmsMember createUmsMember(SysUser sysUser);
+
     /**
      * 根据会员id修改会员积分
      */

+ 215 - 8
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java

@@ -5,7 +5,11 @@ import cn.hutool.core.collection.CollUtil;
 import com.alibaba.fastjson.JSON;
 import com.github.pagehelper.PageHelper;
 import com.yonge.cooleshow.api.feign.AdminFeignService;
+import com.yonge.cooleshow.api.feign.StudentFeignService;
 import com.yonge.cooleshow.api.feign.dto.CouponInfoApi;
+import com.yonge.cooleshow.api.feign.dto.StudentWrapper;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.entity.MallOrderItemDto;
 import com.yonge.cooleshow.common.enums.PostStatusEnum;
@@ -22,6 +26,7 @@ import com.yonge.cooleshow.portal.dao.PortalOrderDao;
 import com.yonge.cooleshow.portal.dao.PortalOrderItemDao;
 import com.yonge.cooleshow.portal.dao.PortalProductDao;
 import com.yonge.cooleshow.portal.domain.*;
+import com.yonge.cooleshow.portal.dto.OrderCreate;
 import com.yonge.cooleshow.portal.dto.OrderPayReq;
 import com.yonge.cooleshow.portal.dto.OrderPayRes;
 import com.yonge.cooleshow.portal.service.*;
@@ -111,13 +116,17 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
 
     @Autowired
     private PmsProductMapper pmsProductMapper;
-
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
     @Autowired
     private UserOrderRefundMapper userOrderRefundMapper;
 
     @Autowired
     private RedissonClient redissonClient;
 
+    @Autowired
+    private OmsOrderCourierService orderCourierService;
+
 
     @Autowired
     private PortalProductDao productDao;
@@ -352,7 +361,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         int count = portalOrderDao.updateSkuStock(orderDetail.getOrderItemList());
 
         // 减商品库存
-        updateProductStock(orderDetail);
+        updateProductStock(orderDetail,true);
 
         // 查询订单
         OmsOrderDetail detail = detail(orderId);
@@ -377,7 +386,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
 
         List<MallOrderItemDto> list = new ArrayList<>();
         for (OmsOrderItem omsOrderItem : orderItemList) {
-            if (omsOrderItem.getReturnStatus() != -1) {
+            if (!omsOrderItem.getReturnStatus().equals( -1)) {
                 continue;
             }
             MallOrderItemDto teacherShareDto = new MallOrderItemDto();
@@ -398,7 +407,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             result = adminFeignService.mallRecordState(list);
         }
         if (result.getStatus()) {
-            LOG.debug("分润记录写入成功,json: {}",JSON.toJSONString(list));
+            LOG.info("分润记录写入成功,json: {}",JSON.toJSONString(list));
         } else {
             LOG.error("分润记录写入失败,json: {}",JSON.toJSONString(list));
         }
@@ -407,7 +416,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
     /**
      * 减商品库存
      */
-    private void updateProductStock(OmsOrderDetail orderDetail) {
+    private void updateProductStock(OmsOrderDetail orderDetail,Boolean status) {
         Map<Long, List<OmsOrderItem>> collect = orderDetail.getOrderItemList()
                                                            .stream()
                                                            .collect(Collectors.groupingBy(OmsOrderItem::getProductId));
@@ -424,7 +433,11 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             stock.setStock(sum);
             productStockList.add(stock);
         }
-        productDao.updateProductStock(productStockList);
+        if (status) {
+            productDao.updateProductStock(productStockList);
+        } else {
+            productDao.refundProductStock(productStockList);
+        }
     }
 
     @Override
@@ -881,6 +894,190 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         return omsOrders.size();
     }
 
+    @Override
+    @Transactional
+    public Boolean jmeduOrderRefund(String orderNo) {
+        OmsOrderDetail detail = detail(orderNo);
+        if (detail == null) {
+            throw new BizException("订单不存在");
+        }
+        if(detail.getStatus() != 1) {
+            throw new BizException("当前订单不能退款");
+        }
+        OmsOrder order = new OmsOrder();
+        order.setStatus(4);
+        order.setId(detail.getId());
+        orderMapper.updateByPrimaryKeySelective(order);
+
+        // 减sku库存
+        portalOrderDao.updateRefundSkuStock(detail.getOrderItemList());
+
+        // 减商品库存
+        updateProductStock(detail,false);
+
+        return true;
+    }
+
+    @Override
+    @Transactional
+    public void jmeduProductOrderCreate(OrderCreate order) {
+
+
+        // 查询订单是否已存在
+        OmsOrder detail = orderMapper.getByOrderSn(order.getOrderNo());
+        if (detail != null) {
+            throw new BizException("订单已存在");
+        }
+
+
+
+        // 1.查询酷乐秀学生账户
+        HttpResponseResult<StudentWrapper.UnionStudentResp> unionStudent = adminFeignService.unionStudent(
+            StudentWrapper.UnionStudent.builder().tokenCheck(false).lockFlag(1).mobile(order.getMobile()).build());
+
+        Long userId = unionStudent.getData().getUserId();
+        UmsMember umsMember = memberService.getById(userId);
+        if (umsMember == null) {
+            umsMember = memberService.createUmsMember(
+                JSON.parseObject(JSON.toJSONString(unionStudent.getData().getSysUser()), SysUser.class));
+        }
+
+
+        // 创建订单
+
+        //设置自动收货天数
+        List<OmsOrderSetting> orderSettings = orderSettingMapper.selectByExample(new OmsOrderSettingExample());
+
+
+        detail = new OmsOrder();
+        detail.setMemberId(umsMember.getId());
+        detail.setPlatformType("JMEDU");
+        detail.setOrderSn(order.getOrderNo());
+        detail.setCreateTime(new Date());
+        detail.setMemberUsername(umsMember.getUsername());
+        detail.setTotalAmount(order.getTotalAmount());
+        detail.setPayAmount(order.getTotalAmount());
+        detail.setFreightAmount(BigDecimal.ZERO);
+        detail.setPromotionAmount(BigDecimal.ZERO);
+        detail.setIntegrationAmount(BigDecimal.ZERO);
+        detail.setCouponAmount(BigDecimal.ZERO);
+        detail.setDiscountAmount(BigDecimal.ZERO);
+        detail.setPayType(order.getPayType());
+        detail.setConfirmStatus(0);
+        detail.setSourceType(1);
+        detail.setStatus(1);
+        detail.setOrderType(0);
+        if (CollUtil.isNotEmpty(orderSettings)) {
+            detail.setAutoConfirmDay(orderSettings.get(0).getConfirmOvertime());
+        }
+        detail.setReceiverName(order.getReceiverName());
+        detail.setReceiverPhone(order.getReceiverPhone());
+        detail.setReceiverPostCode(order.getReceiverPostCode());
+        detail.setReceiverProvince(order.getReceiverProvince());
+        detail.setReceiverCity(order.getReceiverCity());
+        detail.setReceiverRegion(order.getReceiverRegion());
+        detail.setReceiverDetailAddress(order.getReceiverDetailAddress());
+        detail.setDeleteStatus(0);
+        detail.setPaymentTime(new Date());
+        detail.setAfterSale(1);
+        detail.setModifyTime(new Date());
+        orderMapper.insert(detail);
+
+        List<OmsOrderItem> orderItemList = new ArrayList<>();
+        // 创建订单详情
+        for (OrderCreate.OrderItem orderItem : order.getOrderItemList()) {
+
+            // 获取商品信息
+            PmsSkuStock pmsSkuStock = skuStockMapper.selectByPrimaryKey(orderItem.getProductSkuId());
+            if (pmsSkuStock == null) {
+                throw new BizException("商品规格不存在");
+            }
+            PmsProduct pmsProduct = pmsProductMapper.selectByPrimaryKey(pmsSkuStock.getProductId());
+
+            if (pmsProduct == null) {
+                throw new BizException("商品不存在");
+            }
+
+            OmsOrderItem omsOrderItem = new OmsOrderItem();
+            omsOrderItem.setOrderId(detail.getId());
+            omsOrderItem.setOrderSn(detail.getOrderSn());
+            omsOrderItem.setProductId(pmsProduct.getId());
+            omsOrderItem.setProductPic(pmsProduct.getPic());
+            omsOrderItem.setProductName(pmsProduct.getName());
+            omsOrderItem.setProductBrand(pmsProduct.getBrandName());
+            omsOrderItem.setProductPrice(pmsProduct.getPrice());
+            omsOrderItem.setProductQuantity(1);
+            omsOrderItem.setProductSkuId(pmsSkuStock.getId());
+            omsOrderItem.setProductSkuCode(pmsSkuStock.getSkuCode());
+            omsOrderItem.setProductCategoryId(pmsProduct.getProductCategoryId());
+            omsOrderItem.setPromotionAmount(BigDecimal.ZERO);
+            omsOrderItem.setCouponAmount(BigDecimal.ZERO);
+            omsOrderItem.setIntegrationAmount(BigDecimal.ZERO);
+            omsOrderItem.setRealAmount(orderItem.getRealAmount());
+            omsOrderItem.setProductAttr(pmsSkuStock.getSpData());
+            omsOrderItem.setReturnStatus(-1);
+
+            orderItemList.add(omsOrderItem);
+        }
+
+
+        // 保存数据
+        if (!CollectionUtils.isEmpty(orderItemList)) {
+            orderItemDao.insertList(orderItemList);
+            // 减sku库存
+            OmsOrderDetail orderDetail = detail(order.getOrderNo());
+            portalOrderDao.updateSkuStock(orderDetail.getOrderItemList());
+
+            // 减商品库存
+            updateProductStock(orderDetail,true);
+        }
+
+
+
+
+    }
+
+    @Override
+    public OmsOrderCourier productOrderCourier(String orderNo) {
+        OmsOrderDetail detail = detail(orderNo);
+        if (!StringUtil.isEmpty(detail.getDeliverySn()) ) {
+            return orderCourierService.getCourierInfo(orderNo);
+        }
+        return null;
+    }
+
+    @Override
+    @Transactional
+    public Boolean lockSku(Long skuId, String platform, Boolean lockState) {
+
+        PmsSkuStock pmsSkuStock = skuStockMapper.selectByPrimaryKey(skuId);
+        if (pmsSkuStock == null) {
+            throw new BizException("商品规格不存在");
+        }
+        String platformLock = pmsSkuStock.getPlatformLock();
+        if (StringUtil.isEmpty(platformLock)) {
+            platformLock = platform;
+        } else {
+            if (lockState) {
+                if (platformLock.contains(platform)) {
+                    // throw new BizException("商品已锁定");
+                    return true;
+                }
+                platformLock = platformLock + "," + platform;
+            } else {
+                if (!platformLock.contains(platform)) {
+                    // throw new BizException("商品未锁定");
+                    return true;
+                }
+                platformLock = platformLock.replace(platform, "");
+            }
+        }
+        pmsSkuStock.setPlatformLock(platformLock);
+        skuStockMapper.updateByPrimaryKeySelective(pmsSkuStock);
+        return true;
+
+    }
+
     private void FinishReceiveOrder(Long orderId) {
 
         // UmsMember member = memberService.getCurrentMember();
@@ -1342,8 +1539,18 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         BigDecimal reduce = orderItemList.stream()
                                          .map(omsOrderItem -> omsOrderItem.getCouponAmount().multiply(BigDecimal.valueOf(omsOrderItem.getProductQuantity())))
                                          .reduce(BigDecimal.ZERO, BigDecimal::add);
-        OmsOrderItem omsOrderItem = orderItemList.get(0);
-        omsOrderItem.setPrecisionAmount(coupon.subtract(reduce));
+        BigDecimal precisionAmount = coupon.subtract(reduce);
+        for (OmsOrderItem omsOrderItem : orderItemList) {
+            BigDecimal multiply = omsOrderItem.getProductPrice()
+                                              .multiply(BigDecimal.valueOf(omsOrderItem.getProductQuantity())).subtract(omsOrderItem.getCouponAmount().multiply(BigDecimal.valueOf(omsOrderItem.getProductQuantity())));
+            if (multiply.compareTo(precisionAmount) >=0) {
+                omsOrderItem.setPrecisionAmount(precisionAmount);
+                break;
+            } else {
+                omsOrderItem.setPrecisionAmount(multiply);
+                precisionAmount = precisionAmount.subtract(multiply);
+            }
+        }
 
     }
 

+ 63 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/PmsPortalProductServiceImpl.java

@@ -15,10 +15,12 @@ import com.yonge.cooleshow.portal.dto.ProductCategorySmallVo;
 import com.yonge.cooleshow.portal.dto.ProductSearchConditionVo;
 import com.yonge.cooleshow.portal.dto.ShareProductVo;
 import com.yonge.cooleshow.portal.service.PmsPortalProductService;
+import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.string.MessageFormatter;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 import java.util.ArrayList;
@@ -214,6 +216,67 @@ public class PmsPortalProductServiceImpl implements PmsPortalProductService {
         return shareProductVo;
     }
 
+    @Override
+    public Map<Long, String> queryNameMap(List<Long> goodsIds) {
+        PmsProductExample example = new PmsProductExample();
+        PmsProductExample.Criteria criteria = example.createCriteria();
+        criteria.andIdIn(goodsIds);
+        List<PmsProduct> goodsList = productMapper.selectByExample(example);
+        return goodsList.stream().collect(Collectors.toMap(PmsProduct::getId, PmsProduct::getName));
+    }
+
+    @Override
+    public Integer getProductStockAndSkuStock(Long goodsSkuId) {
+
+        PmsSkuStock pmsSkuStock = skuStockMapper.selectByPrimaryKey(goodsSkuId);
+        if (pmsSkuStock == null) {
+            throw new BizException("商品信息不存在");
+        }
+        // 查询商品
+        PmsProduct pmsProduct = productMapper.selectByPrimaryKey(pmsSkuStock.getProductId());
+        if (pmsProduct == null) {
+            throw new BizException("商品信息不存在");
+        }
+        int skuStock = pmsSkuStock.getStock() - pmsSkuStock.getLockStock();
+        int productStock = pmsProduct.getStock() - pmsProduct.getLockStock();
+        return Math.min(skuStock, productStock);
+
+    }
+
+    @Override
+    @Transactional
+    public Boolean lockStock(Long goodsSkuId, Boolean lockState) {
+        PmsSkuStock pmsSkuStock = skuStockMapper.selectByPrimaryKey(goodsSkuId);
+        if (pmsSkuStock == null) {
+            throw new BizException("商品sku信息不存在");
+        }
+        // 查询商品
+        PmsProduct pmsProduct = productMapper.selectByPrimaryKey(pmsSkuStock.getProductId());
+        if (pmsProduct == null) {
+            throw new BizException("商品信息不存在");
+        }
+        // 锁定库存 直接使用for update 更新 判断是否更新成功
+        if (lockState) {
+            int lock = productMapper.lockStock(pmsProduct.getId(), 1);
+            if (lock <=0) {
+                throw new BizException("商品库存不足");
+            }
+            lock = skuStockMapper.lockStock(pmsSkuStock.getId(), 1);
+            if (lock <=0) {
+                throw new BizException("商品sku库存不足");
+            }
+        } else {
+            productMapper.unLockStock(pmsProduct.getId(),1);
+            skuStockMapper.unLockStock(pmsSkuStock.getId(),1);
+        }
+
+        // 解锁库存 直接解锁
+        return true;
+
+    }
+
+
+
 
     private  List<PmsProductAttributeCategory>  getHomeProductAttributeCategory() {
         PmsProductAttributeCategoryExample example = new PmsProductAttributeCategoryExample();

+ 28 - 18
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/UmsMemberServiceImpl.java

@@ -18,6 +18,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.security.core.userdetails.UsernameNotFoundException;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 import java.util.List;
@@ -60,6 +61,7 @@ public class UmsMemberServiceImpl implements UmsMemberService {
     }
 
     @Override
+    @Transactional
     public UmsMember getCurrentMember() {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null || sysUser.getId() == null) {
@@ -68,24 +70,7 @@ public class UmsMemberServiceImpl implements UmsMemberService {
         UmsMember umsMember = getById(sysUser.getId());
         // 商城库用户不存在-> 创建
         if (umsMember == null || umsMember.getId() == null) {
-            umsMember = new UmsMember();
-            umsMember.setId(sysUser.getId());
-            umsMember.setCreateTime(sysUser.getCreateTime());
-            umsMember.setUsername(sysUser.getUsername());
-            umsMember.setPassword(sysUser.getPassword());
-            umsMember.setPhone(sysUser.getPhone());
-            umsMember.setStatus(sysUser.getLockFlag());
-            umsMember.setIcon(sysUser.getAvatar());
-            umsMember.setGender(sysUser.getGender());
-            umsMember.setBirthday(sysUser.getBirthdate());
-            //获取默认会员等级并设置
-            UmsMemberLevelExample levelExample = new UmsMemberLevelExample();
-            levelExample.createCriteria().andDefaultStatusEqualTo(1);
-            List<UmsMemberLevel> memberLevelList = memberLevelMapper.selectByExample(levelExample);
-            if (!CollectionUtils.isEmpty(memberLevelList)) {
-                umsMember.setMemberLevelId(memberLevelList.get(0).getId());
-            }
-            memberMapper.insert(umsMember);
+            umsMember = createUmsMember(sysUser);
         } else {
             boolean flag = false;
             if (sysUser.getUsername() != null && !sysUser.getUsername().equals(umsMember.getUsername())) {
@@ -108,6 +93,31 @@ public class UmsMemberServiceImpl implements UmsMemberService {
     }
 
     @Override
+    @Transactional
+    public UmsMember createUmsMember(SysUser sysUser) {
+        UmsMember umsMember;
+        umsMember = new UmsMember();
+        umsMember.setId(sysUser.getId());
+        umsMember.setCreateTime(sysUser.getCreateTime());
+        umsMember.setUsername(sysUser.getUsername());
+        umsMember.setPassword(sysUser.getPassword());
+        umsMember.setPhone(sysUser.getPhone());
+        umsMember.setStatus(sysUser.getLockFlag());
+        umsMember.setIcon(sysUser.getAvatar());
+        umsMember.setGender(sysUser.getGender());
+        umsMember.setBirthday(sysUser.getBirthdate());
+        //获取默认会员等级并设置
+        UmsMemberLevelExample levelExample = new UmsMemberLevelExample();
+        levelExample.createCriteria().andDefaultStatusEqualTo(1);
+        List<UmsMemberLevel> memberLevelList = memberLevelMapper.selectByExample(levelExample);
+        if (!CollectionUtils.isEmpty(memberLevelList)) {
+            umsMember.setMemberLevelId(memberLevelList.get(0).getId());
+        }
+        memberMapper.insert(umsMember);
+        return umsMember;
+    }
+
+    @Override
     public void updateIntegration(Long id, Integer integration) {
         UmsMember record=new UmsMember();
         record.setId(id);

+ 20 - 0
cooleshow-mall/mall-portal/src/main/resources/config/mybatis/PortalOrderDao.xml

@@ -109,4 +109,24 @@
             #{item.productId}
         </foreach>
     </update>
+
+    <update id="updateRefundSkuStock">
+        UPDATE pms_sku_stock
+        SET
+        stock = CASE id
+        <foreach collection="itemList" item="item">
+            WHEN #{item.productSkuId} THEN stock + #{item.productQuantity}
+        </foreach>
+        END,
+        sale = CASE id
+        <foreach collection="itemList" item="item">
+            WHEN #{item.productSkuId} THEN pms_sku_stock.sale - #{item.productQuantity}
+        </foreach>
+        END
+        WHERE
+        id IN
+        <foreach collection="itemList" item="item" separator="," open="(" close=")">
+            #{item.productSkuId}
+        </foreach>
+    </update>
 </mapper>

+ 21 - 0
cooleshow-mall/mall-portal/src/main/resources/config/mybatis/PortalProductDao.xml

@@ -120,4 +120,25 @@
             #{item.productId}
         </foreach>
     </update>
+
+
+    <update id="refundProductStock">
+        UPDATE pms_product
+        SET
+        stock = CASE id
+        <foreach collection="itemList" item="item">
+            WHEN #{item.productId} THEN stock + #{item.stock}
+        </foreach>
+        END,
+        sale = CASE id
+        <foreach collection="itemList" item="item">
+            WHEN #{item.productId} THEN sale - #{item.stock}
+        </foreach>
+        END
+        WHERE
+        id IN
+        <foreach collection="itemList" item="item" separator="," open="(" close=")">
+            #{item.productId}
+        </foreach>
+    </update>
 </mapper>

+ 22 - 0
cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/BatchSendingTask.java

@@ -0,0 +1,22 @@
+package com.yonge.cooleshow.task.jobs;
+
+import com.yonge.cooleshow.api.feign.AdminFeignService;
+import com.yonge.cooleshow.task.core.BaseTask;
+import com.yonge.cooleshow.task.core.TaskException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 消息定时群发
+ */
+@Service
+public class BatchSendingTask extends BaseTask {
+
+    @Autowired
+    private AdminFeignService adminFeignService;
+
+    @Override
+    public void execute() throws TaskException {
+        Object o = adminFeignService.batchSending();
+    }
+}

+ 24 - 0
cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/StudentFirstBuyTask.java

@@ -0,0 +1,24 @@
+package com.yonge.cooleshow.task.jobs;
+
+import com.yonge.cooleshow.api.feign.StudentFeignService;
+import com.yonge.cooleshow.task.core.BaseTask;
+import com.yonge.cooleshow.task.core.TaskException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2023-02-23
+ */
+@Service
+public class StudentFirstBuyTask  extends BaseTask {
+    @Autowired
+    private StudentFeignService studentFeignService;
+
+    @Override
+    public void execute() throws TaskException {
+        Object o = studentFeignService.studentFirstBuy();
+    }
+}

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

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

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

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

+ 175 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/CustomerServiceBatchSendingController.java

@@ -0,0 +1,175 @@
+package com.yonge.cooleshow.admin.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.admin.io.request.im.CustomerServiceBatchSendingVo;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.enums.im.EImReceiveType;
+import com.yonge.cooleshow.biz.dal.enums.im.EImSendStatus;
+import com.yonge.cooleshow.biz.dal.service.CustomerServiceBatchSendingService;
+import com.yonge.cooleshow.biz.dal.wrapper.im.CustomerServiceBatchSendingWrapper;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.mybatis.support.PageUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Objects;
+
+@Slf4j
+@Validated
+@RestController
+@RequestMapping("/batchSending")
+@Api(tags = "客服群发")
+public class CustomerServiceBatchSendingController extends BaseController {
+
+    @Autowired
+    private CustomerServiceBatchSendingService customerServiceBatchSendingService;
+	@Autowired
+	private SysUserFeignService sysUserFeignService;
+
+	/**
+	 * 查询单条
+	 * @param id 详情ID
+	 * @return R<CustomerServiceBatchSendingVo.CustomerServiceBatchSending>
+	 */
+	@ApiOperation(value = "详情", notes = "客服群发-根据详情ID查询单条, 传入id")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "id", dataType = "long")
+    })
+    @GetMapping("/detail/{id}")
+    public HttpResponseResult<CustomerServiceBatchSendingWrapper.CustomerServiceBatchSending> detail(@PathVariable("id") Long id) {
+
+		CustomerServiceBatchSendingWrapper.CustomerServiceBatchSending wrapper = customerServiceBatchSendingService.detail(id);
+        
+        return HttpResponseResult.succeed(wrapper);
+	}
+    
+    /**
+	 * 查询分页
+	 * @param query CustomerServiceBatchSendingVo.CustomerServiceBatchSendingQuery
+	 * @return R<PageInfo<CustomerServiceBatchSendingVo.CustomerServiceBatchSending>>
+	 */
+    @ApiOperation(value = "查询分页", notes = "客服群发- 传入 CustomerServiceBatchSendingVo.CustomerServiceBatchSendingQuery") 
+    @PostMapping("/page")
+    public HttpResponseResult<PageInfo<CustomerServiceBatchSendingWrapper.CustomerServiceBatchSending>> page(@RequestBody CustomerServiceBatchSendingWrapper.CustomerServiceBatchSendingQuery query) {
+    
+        // 查询数据
+        IPage<CustomerServiceBatchSendingWrapper.CustomerServiceBatchSending> pages = customerServiceBatchSendingService.selectPage(PageUtil.getPage(query), query);
+
+        return HttpResponseResult.succeed(PageUtil.pageInfo(pages));
+	}
+    
+    /**
+	 * 新增
+	 * @param info CustomerServiceBatchSendingVo.CustomerServiceBatchSending
+	 * @return R<Boolean>
+	 */
+    @ApiOperation(value = "新增", notes = "客服群发- 传入 CustomerServiceBatchSendingVo.CustomerServiceBatchSending")
+	@PostMapping("/save")
+	public HttpResponseResult<Boolean> add(@RequestBody CustomerServiceBatchSendingVo.CustomerServiceBatchSending info) {
+
+		// 获取当前用户ID
+		SysUser user = sysUserFeignService.queryUserInfo();
+		if (user == null || null == user.getId()) {
+			return failed(HttpStatus.FORBIDDEN, "请登录");
+		}
+		info.setCreateBy(user.getId());
+
+		if (EImReceiveType.PORTION == info.getReceiveType()
+				&& CollectionUtils.isEmpty(info.getReceives())) {
+			throw new BizException("接收用户不能为空");
+		}
+		// 设置默认参数
+		info.setSendStatus(EImSendStatus.WAIT);
+
+        // 新增数据
+        customerServiceBatchSendingService.add(JSON.parseObject(info.jsonString(),
+				CustomerServiceBatchSendingWrapper.CustomerServiceBatchSending.class));
+        
+        return HttpResponseResult.succeed();
+	}
+    
+    /**
+	 * 修改
+	 * @param info CustomerServiceBatchSendingVo.CustomerServiceBatchSending
+	 * @return R<Boolean>
+	 */
+    @ApiOperation(value = "修改", notes = "客服群发- 传入 CustomerServiceBatchSendingVo.CustomerServiceBatchSending")
+	@PostMapping("/update")
+	public HttpResponseResult<Boolean> update(@Validated @RequestBody CustomerServiceBatchSendingVo.CustomerServiceBatchSending info) {
+
+		if (Objects.isNull(info.getId())) {
+			throw new BizException("请求参数异常");
+		}
+
+        // 更新数据
+        customerServiceBatchSendingService.update(JSON.parseObject(info.jsonString(),
+				CustomerServiceBatchSendingWrapper.CustomerServiceBatchSending.class));
+        
+        return HttpResponseResult.succeed();
+	}
+
+ 	/**
+	 * 删除
+	 * @param id 详情ID
+	 * @return R<Boolean>
+	 */
+	@ApiOperation(value = "删除", notes = "客服群发- 传入id")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "id", dataType = "long")
+    })
+	@PostMapping("/remove")
+	public HttpResponseResult<Boolean> remove(@RequestParam Long id) {
+    
+		return HttpResponseResult.succeed(customerServiceBatchSendingService.removeById(id));
+	}
+
+	@ApiOperation(value = "更新消息状态", notes = "客服群发- 传入id")
+	@ApiImplicitParams({
+			@ApiImplicitParam(name = "id", value = "主键Id", dataType = "long"),
+			@ApiImplicitParam(name = "sendStatus", value = "发送状态", dataType = "String")
+	})
+	@PostMapping("/status/{id}")
+	public HttpResponseResult<Boolean> status(@PathVariable("id") Long id, EImSendStatus sendStatus) {
+
+		if (Objects.isNull(sendStatus)) {
+			throw new BizException("发送状态不能为空");
+		}
+
+		// 更新群发消息状态
+		customerServiceBatchSendingService.status(id, sendStatus);
+
+		return HttpResponseResult.succeed(true);
+	}
+
+	@ApiOperation(value = "立即发送", notes = "客服群发- 传入id")
+	@ApiImplicitParams({
+			@ApiImplicitParam(name = "id", value = "主键Id", dataType = "long")
+	})
+	@PostMapping("/send/{id}")
+	public HttpResponseResult<Boolean> send(@PathVariable("id") Long id) {
+
+		// 更新群发消息状态
+		customerServiceBatchSendingService.sendMessage(id);
+
+		return HttpResponseResult.succeed(true);
+	}
+}

+ 91 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/CustomerServiceReceiveController.java

@@ -0,0 +1,91 @@
+package com.yonge.cooleshow.admin.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.admin.io.request.im.CustomerServiceReceiveVo;
+import com.yonge.cooleshow.biz.dal.entity.CustomerServiceReceive;
+import com.yonge.cooleshow.biz.dal.service.CustomerServiceReceiveService;
+import com.yonge.cooleshow.biz.dal.wrapper.im.CustomerServiceReceiveWrapper;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.mybatis.support.PageUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+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 java.util.List;
+import java.util.Objects;
+
+@Slf4j
+@Validated
+@RestController
+@RequestMapping("/batchReceive")
+@Api(tags = "客服群发接收")
+public class CustomerServiceReceiveController {
+
+    @Autowired
+    private CustomerServiceReceiveService customerServiceReceiveService;
+
+    
+    /**
+	 * 查询分页
+	 * @param query CustomerServiceReceiveVo.CustomerServiceReceiveQuery
+	 * @return R<PageInfo<CustomerServiceReceiveVo.CustomerServiceReceive>>
+	 */
+    @ApiOperation(value = "查询分页", notes = "客服群发接收- 传入 CustomerServiceReceiveVo.CustomerServiceReceiveQuery") 
+    @PostMapping("/page")
+    public HttpResponseResult<PageInfo<CustomerServiceReceiveWrapper.CustomerServiceReceive>> page(@RequestBody CustomerServiceReceiveWrapper.CustomerServiceReceiveQuery query) {
+    
+        // 查询数据
+        IPage<CustomerServiceReceiveWrapper.CustomerServiceReceive> pages = customerServiceReceiveService.selectPage(PageUtil.getPage(query), query);
+
+        return HttpResponseResult.succeed(PageUtil.pageInfo(pages));
+	}
+    
+    /**
+	 * 新增
+	 * @param info CustomerServiceReceiveVo.CustomerServiceReceive
+	 * @return R<Boolean>
+	 */
+    @ApiOperation(value = "新增", notes = "客服群发接收- 传入 CustomerServiceReceiveVo.CustomerServiceReceive")
+	@PostMapping("/save")
+	public HttpResponseResult<Boolean> add(@Validated @RequestBody List<CustomerServiceReceiveVo.CustomerServiceReceive> info) {
+
+		if (CollectionUtils.isEmpty(info)
+				|| info.stream().anyMatch(x -> Objects.isNull(x.getBatchSendingId()))) {
+			throw new BizException("无效的请求参数");
+		}
+
+		List<CustomerServiceReceive> receives = JSON.parseArray(JSON.toJSONString(info), CustomerServiceReceive.class);
+		// 新增数据
+        customerServiceReceiveService.saveBatch(receives);
+        
+        return HttpResponseResult.succeed();
+	}
+    
+ 	/**
+	 * 删除
+	 * @param id 详情ID
+	 * @return R<Boolean>
+	 */
+	@ApiOperation(value = "删除", notes = "客服群发接收- 传入id")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "id", dataType = "long")
+    })
+	@PostMapping("/remove")
+	public HttpResponseResult<Boolean> remove(@RequestParam Long id) {
+    
+		return HttpResponseResult.succeed(customerServiceReceiveService.removeById(id));
+	}
+}

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

@@ -3,36 +3,35 @@ package com.yonge.cooleshow.admin.controller;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dto.AdjustModel;
 import com.yonge.cooleshow.biz.dal.dto.MusicAlbumSheetDto;
 import com.yonge.cooleshow.biz.dal.dto.MusicAlbumSheetSortDto;
-import com.yonge.cooleshow.biz.dal.dto.AdjustModel;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumDetailSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumSearch;
-import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicAlbumSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicSheetOrderSearch;
 import com.yonge.cooleshow.biz.dal.entity.MusicAlbum;
-import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
-import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
-import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
-import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.MusicAlbumService;
-import com.yonge.cooleshow.biz.dal.vo.StudentMusicAlbumOrderVo;
-import com.yonge.cooleshow.biz.dal.vo.StudentMusicSheetOrderVo;
-import com.yonge.cooleshow.common.enums.YesOrNoEnum;
-import com.yonge.toolset.base.exception.BizException;
-import com.yonge.toolset.base.page.QueryInfo;
-import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.vo.AlbumDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.MusicAlbumVo;
+import com.yonge.cooleshow.biz.dal.vo.StudentMusicAlbumOrderVo;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.base.util.StringUtil;
-import io.swagger.annotations.*;
+import com.yonge.toolset.mybatis.support.PageUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
 import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.*;
+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.RestController;
 
 import javax.validation.Valid;
 import java.util.Date;
@@ -99,10 +98,10 @@ public class MusicAlbumController extends BaseController {
         if (musicAlbum.getId()==null){
             return failed("缺少ID");
         }
-        MusicAlbum service = musicAlbumService.getById(musicAlbum.getId());
+        /*MusicAlbum service = musicAlbumService.getById(musicAlbum.getId());
         if (YesOrNoEnum.YES.getCode().equals(service.getAlbumStatus().getCode())) {
             return failed("启用状态不许修改");
-        }
+        }*/
 
         String[] split = musicAlbum.getAlbumTag().split(",");
         if (split.length >3) {

+ 35 - 4
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/MusicSheetController.java

@@ -1,7 +1,5 @@
 package com.yonge.cooleshow.admin.controller;
 
-import com.yonge.cooleshow.biz.dal.dto.AdjustModel;
-import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -26,8 +24,10 @@ import org.springframework.web.multipart.MultipartFile;
 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.AdjustModel;
 import com.yonge.cooleshow.biz.dal.dto.MusicSheetDto;
 import com.yonge.cooleshow.biz.dal.dto.MusicSheetExport;
+import com.yonge.cooleshow.biz.dal.dto.MusicSheetRenderDto;
 import com.yonge.cooleshow.biz.dal.dto.ReasonDto;
 import com.yonge.cooleshow.biz.dal.dto.req.TeacherMusicSheetAuditReq;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicSheetSearch;
@@ -38,6 +38,7 @@ import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
 import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
 import com.yonge.cooleshow.biz.dal.enums.ChargeTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.MusicSheetService;
 import com.yonge.cooleshow.biz.dal.service.MusicTagService;
@@ -167,10 +168,10 @@ public class MusicSheetController extends BaseController {
         if (musicSheet.getId()==null){
             return failed("缺少ID");
         }
-        MusicSheet service = musicSheetService.getById(musicSheet.getId());
+        /*MusicSheet service = musicSheetService.getById(musicSheet.getId());
         if (YesOrNoEnum.YES.getCode().equals(service.getState().getCode())) {
             return failed("启用状态不许修改");
-        }
+        }*/
 
         if (musicSheet.getNotation() == null) {
             musicSheet.setNotation(YesOrNoEnum.NO);
@@ -190,6 +191,36 @@ public class MusicSheetController extends BaseController {
         }
     }
 
+    @ApiOperation(value = "修改", httpMethod="POST", consumes="application/json", produces="application/json")
+    @PostMapping(value="/updateRenderFile", consumes="application/json", produces="application/json")
+    @PreAuthorize("@pcs.hasPermissions('music/sheet/updateRenderFile')")
+    public HttpResponseResult<Object> updateRenderFile(@Valid @RequestBody MusicSheetRenderDto musicSheetRenderDto) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null  || sysUser.getId() == null) {
+            return failed("用户信息获取失败");
+        }
+        if (musicSheetRenderDto.getMusicSheetId()==null){
+            return failed("缺少ID");
+        }
+        MusicSheet musicSheet = musicSheetService.getById(musicSheetRenderDto.getMusicSheetId());
+        
+        if(musicSheet == null){
+        	return failed("参数异常");
+        }
+        musicSheet.setMusicFirstSvg(musicSheetRenderDto.getMusicFirstSvg());
+        musicSheet.setMusicJianSvg(musicSheetRenderDto.getMusicJianSvg());
+        musicSheet.setMusicJSON(musicSheetRenderDto.getMusicJSON());
+        musicSheet.setMusicSvg(musicSheetRenderDto.getMusicSvg());
+
+        musicSheet.setUpdateBy(sysUser.getId());
+        musicSheet.setUpdateTime(new Date());
+        if ( musicSheetService.updateById(musicSheet)){
+            return succeed("修改成功");
+        } else {
+            return failed("修改失败");
+        }
+    }
+
     @ApiOperation(value = "分页查询", httpMethod="POST", consumes="application/json", produces="application/json")
     @PostMapping(value="/list", consumes="application/json", produces="application/json")
     @PreAuthorize("@pcs.hasPermissions('music/sheet/list')")

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

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

+ 3 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UserAccountRecordController.java

@@ -57,6 +57,9 @@ public class UserAccountRecordController extends BaseController {
     @ApiOperation(value = "查询分页", notes = "传入userAccountRecordSearch")
     @PreAuthorize("@pcs.hasPermissions('userAccountRecord/page')")
     public HttpResponseResult<PageInfo<UserAccountRecordVo>> page(@RequestBody UserAccountRecordSearch query) {
+        if (query.getInOrOut() == null) {
+            query.setInOrOut(InOrOutEnum.IN);
+        }
         IPage<UserAccountRecordVo> pages = userAccountRecordService.selectPage(PageUtil.getPage(query), query);
         return succeed(PageUtil.pageInfo(pages));
     }

+ 35 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/AdminClient.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.admin.controller.open;
 
+import com.microsvc.toolkit.config.jwt.utils.RsaKeyHelper;
 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;
@@ -17,24 +18,32 @@ 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.StudentWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.coupon.CouponOrderWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.UserFirstTimeTypeEnum;
+import com.yonge.toolset.base.exception.BizException;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
 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.security.jwt.Jwt;
+import org.springframework.security.jwt.JwtHelper;
+import org.springframework.security.jwt.crypto.sign.RsaVerifier;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.math.BigDecimal;
+import java.security.interfaces.RSAPublicKey;
 import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -88,6 +97,32 @@ public class AdminClient extends BaseController {
         return succeed(studentApi);
     }
 
+    @ApiOperation(value = "学生帐号关联Id", notes = "CouponOrderVO.PageRequest")
+    @PostMapping("/unionStudent")
+    public HttpResponseResult<StudentWrapper.UnionStudentResp> unionStudent(@RequestBody StudentWrapper.UnionStudent info) {
+
+        if (info.getTokenCheck() == null || info.getTokenCheck()) {
+            if (StringUtils.isAnyBlank(info.getToken(), info.getMobile())) {
+                throw new BizException("请求参数错误");
+            }
+
+            // 校验三方帐号关联请求合法性
+            RSAPublicKey rsaPublicKey = RsaKeyHelper.getRSAPublicKey("jmedu", "dayaedu", "jmedu.jks", "dayaedu");
+            Jwt jwt = JwtHelper.decodeAndVerify(info.getToken(), new RsaVerifier(rsaPublicKey));
+
+            //获取jwt原始内容
+            String claims = jwt.getClaims();
+            if (StringUtils.isEmpty(claims)) {
+                throw new BizException("三方授权校验失败");
+            }
+
+        }
+        // 学生帐号关联
+        StudentWrapper.UnionStudentResp studentResp = studentService.unionStudent(info);
+
+        return succeed(studentResp);
+    }
+
     @GetMapping("/getEmployee")
     public HttpResponseResult<EmployeeApi> getEmployee(@RequestParam("userId") Long userId) {
         Employee employee = employeeService.get(userId);

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

@@ -1,10 +1,13 @@
 package com.yonge.cooleshow.admin.controller.open;
 
+import com.yonge.cooleshow.biz.dal.dto.MusicImgDto;
+import com.yonge.cooleshow.biz.dal.service.MusicSheetService;
 import com.yonge.cooleshow.biz.dal.service.UserAccountService;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.entity.MallOrderItemDto;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -13,7 +16,9 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.validation.Valid;
 import java.util.List;
+import java.util.Objects;
 
 @RestController
 @RequestMapping("/open")
@@ -26,6 +31,8 @@ public class OpenUserAccountController extends BaseController {
     @Autowired
     private UserAccountService userAccountService;
 
+    @Autowired
+    private MusicSheetService musicSheetService;
 
     /**
      * 设置商城收入分润
@@ -45,4 +52,22 @@ public class OpenUserAccountController extends BaseController {
         userAccountService.mallTeacherRecordState(shareDto);
         return succeed();
     }
+
+
+
+    @ApiOperation(value = "新增曲谱渲染图")
+    @PostMapping(value="/music/sheet/img")
+    public HttpResponseResult<Boolean> img(@RequestBody @Valid MusicImgDto musicImgDto) {
+        return succeed(musicSheetService.updateMusicImg(musicImgDto, musicImgDto.getMusicSheetId()));
+    }
+
+    @ApiOperation(value = "曲目数据修复")
+    @PostMapping(value="/music/sheet/musicCorrect")
+    public HttpResponseResult<Boolean> musicCorrect(@RequestBody MusicImgDto musicImgDto) {
+        if (Objects.isNull(musicImgDto.getMusicSheetId())) {
+            failed("曲目Id参数错误");
+        }
+        return succeed(musicSheetService.updateMusicCorrect(musicImgDto, musicImgDto.getMusicSheetId()));
+    }
+
 }

+ 1 - 1
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/UserOrderClient.java

@@ -120,7 +120,7 @@ public class UserOrderClient extends BaseController {
             } catch (BizException e) {
                 log.error("回调业务异常,data is {}, msg is {}", JSONObject.toJSONString(data), e.getMessage());
             } catch (Exception e) {
-                log.error("回调业务异常,data is {}", JSONObject.toJSONString(data));
+                log.error("回调业务异常,data is {} , msg is {}", JSONObject.toJSONString(data),e.getMessage());
                 e.printStackTrace();
             }
         }

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

@@ -0,0 +1,106 @@
+package com.yonge.cooleshow.admin.io.request.im;
+
+import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.biz.dal.enums.im.EImReceiveType;
+import com.yonge.cooleshow.biz.dal.enums.im.EImSendStatus;
+import com.yonge.cooleshow.biz.dal.enums.im.EImSendType;
+import com.yonge.toolset.base.page.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 客服群发
+ * 2022-12-09 10:49:10
+ */
+@ApiModel(value = "CustomerServiceBatchSendingVo对象", description = "客服群发查询视图对象")
+public class CustomerServiceBatchSendingVo {
+
+    @ApiModel(" CustomerServiceBatchSendingQuery-客服群发")
+    public static class CustomerServiceBatchSendingQuery extends QueryInfo {
+    
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static CustomerServiceBatchSendingQuery from(String json) {
+            return JSON.parseObject(json, CustomerServiceBatchSendingQuery.class);
+        }
+    }
+    
+    @Data
+    @ApiModel(" CustomerServiceBatchSending-客服群发")
+    public static class CustomerServiceBatchSending {
+    	
+                
+		@ApiModelProperty("主键ID") 
+        private Long id;
+                
+		@ApiModelProperty("目标群体")
+        private String targetGroup;
+                
+		@ApiModelProperty("发送声部")
+        private String sendSubject;
+
+        @ApiModelProperty("发送人数")
+        private Integer sendNumber;
+
+		@ApiModelProperty("接收人数")
+        private Integer receiveNumber;
+                
+		@ApiModelProperty("目标人群")
+        private EImReceiveType receiveType;
+                
+		@ApiModelProperty("发送方式")
+        private EImSendType sendType;
+                
+		@ApiModelProperty("发送状态")
+        private EImSendStatus sendStatus;
+                
+		@ApiModelProperty("发送时间")
+        private Date sendTime;
+
+        @ApiModelProperty("消息标题")
+        private String condition;
+
+		@ApiModelProperty("消息标题")
+        private String title;
+                
+		@ApiModelProperty("文本消息")
+        private String textMessage;
+                
+		@ApiModelProperty("图片消息")
+        private String imgMessage;
+                
+		@ApiModelProperty("图片地址")
+        private String imgUrl;
+                
+		@ApiModelProperty("创建用户")
+        private Long createBy;
+                
+		@ApiModelProperty("创建时间")
+        private Date createTime;
+
+        @ApiModelProperty("客服人员")
+        private String sender;
+        @ApiModelProperty("客服联系方式")
+        private String mobile;
+
+        @ApiModelProperty("目标人群")
+        private List<CustomerServiceReceiveVo.CustomerServiceReceive> receives;
+                
+                
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static CustomerServiceBatchSending from(String json) {
+            return JSON.parseObject(json, CustomerServiceBatchSending.class);
+        }
+    }
+    
+}

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

@@ -0,0 +1,59 @@
+package com.yonge.cooleshow.admin.io.request.im;
+
+import com.alibaba.fastjson.JSON;
+import com.yonge.toolset.base.page.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 客服群发接收
+ * 2022-12-09 10:49:10
+ */
+@ApiModel(value = "CustomerServiceReceiveVo对象", description = "客服群发接收查询视图对象")
+public class CustomerServiceReceiveVo {
+
+    @ApiModel(" CustomerServiceReceiveQuery-客服群发接收")
+    public static class CustomerServiceReceiveQuery extends QueryInfo {
+    
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static CustomerServiceReceiveQuery from(String json) {
+            return JSON.parseObject(json, CustomerServiceReceiveQuery.class);
+        }
+    }
+    
+    @Data
+    @ApiModel(" CustomerServiceReceive-客服群发接收")
+    public static class CustomerServiceReceive {
+    	
+                
+		@ApiModelProperty("主键ID") 
+        private Long id;
+
+        @ApiModelProperty("群发消息ID")
+        private Long batchSendingId;
+                
+		@ApiModelProperty("用户ID") 
+        private Long userId;
+                
+		@ApiModelProperty("用户身份")
+        private String clientType;
+                
+		@ApiModelProperty("创建时间")
+        private Date createTime;
+                
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static CustomerServiceReceive from(String json) {
+            return JSON.parseObject(json, CustomerServiceReceive.class);
+        }
+    }
+    
+}

+ 7 - 2
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/im/IMNotifyMessageVO.java

@@ -1,16 +1,15 @@
 package com.yonge.cooleshow.admin.io.request.im;
 
 import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
-import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 
 import java.io.Serializable;
 import java.util.List;
-import java.util.Optional;
 
 /**
  * 系统IM通知信息
@@ -39,6 +38,12 @@ public class IMNotifyMessageVO implements Serializable {
     @ApiModelProperty(value = "图片文件地址")
     private String imgUrl;
 
+    @ApiModelProperty("用户身份")
+    private ClientEnum clientType;
+
+    @ApiModelProperty("声部ID")
+    private String subjectId;
+
     public String jsonString() {
 
         return JSON.toJSONString(this);

+ 58 - 1
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/task/TaskController.java

@@ -1,6 +1,17 @@
 package com.yonge.cooleshow.admin.task;
 
-import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.service.ActivityPlanEvaluationService;
+import com.yonge.cooleshow.biz.dal.service.ActivityPlanService;
+import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
+import com.yonge.cooleshow.biz.dal.service.CustomerServiceBatchSendingService;
+import com.yonge.cooleshow.biz.dal.service.MusicAlbumService;
+import com.yonge.cooleshow.biz.dal.service.MusicSheetService;
+import com.yonge.cooleshow.biz.dal.service.PlatformCashAccountRecordService;
+import com.yonge.cooleshow.biz.dal.service.TeacherStyleVideoService;
+import com.yonge.cooleshow.biz.dal.service.UserAccountRecordService;
+import com.yonge.cooleshow.biz.dal.service.UserBindingTeacherService;
+import com.yonge.cooleshow.biz.dal.service.UserOrderService;
+import com.yonge.cooleshow.biz.dal.service.VideoLessonGroupService;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
@@ -46,6 +57,20 @@ public class TaskController extends BaseController {
     @Value("${app.blacklist:}")
     private String blacklistFilePath;
 
+    @Autowired
+    private MusicSheetService musicSheetService;
+
+    @Autowired
+    private MusicAlbumService musicAlbumService;
+
+    @Autowired
+    private TeacherStyleVideoService teacherStyleVideoService;
+
+    @Autowired
+    private VideoLessonGroupService videoLessonGroupService;
+    @Autowired
+    private CustomerServiceBatchSendingService customerServiceBatchSendingService;
+
     /***
      * 轮询用户订单
      * @author liweifan
@@ -126,4 +151,36 @@ public class TaskController extends BaseController {
         activityPlanEvaluationService.successActivity(activityId);
         return HttpResponseResult.succeed();
     }
+
+
+    /**
+     * 每日增加收藏/热度人数
+     */
+    @GetMapping("/virtualNumber")
+    public HttpResponseResult<Object> virtualNumber() {
+
+        // 曲目
+        musicSheetService.setVirtualNumber();
+        // 专辑
+        musicAlbumService.setVirtualNumber();
+        // 视频课 暂时不做课程数据
+        // videoLessonGroupService.setVirtualNumber();
+        // 个人风采
+        teacherStyleVideoService.setVirtualNumber();
+
+        return HttpResponseResult.succeed();
+    }
+
+    /**
+     * 群发消息
+     */
+    @GetMapping("/batchSending")
+    public HttpResponseResult<Object> batchSending() {
+
+        // 群发消息定时
+        customerServiceBatchSendingService.scheduleSendMessage();
+
+        return HttpResponseResult.succeed();
+    }
+
 }

+ 14 - 0
cooleshow-user/user-biz/pom.xml

@@ -23,6 +23,20 @@
             <artifactId>cooleshow-common</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>com.microsvc.toolkit.config</groupId>
+            <artifactId>microsvc-config-jwt</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.security</groupId>
+            <artifactId>spring-security-jwt</artifactId>
+            <version>1.0.9.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.79</version>
+        </dependency>
 
         <dependency>
             <groupId>com.spring4all</groupId>

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

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

+ 3 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/PlatformCashAccountRecordDao.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.PlatformCashAccountRecordSearch;
 import com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord;
+import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
 import com.yonge.cooleshow.biz.dal.vo.PlatformCashAccountRecordSummaryVo;
 
 import io.swagger.models.auth.In;
@@ -33,7 +34,8 @@ public interface PlatformCashAccountRecordDao extends BaseMapper<PlatformCashAcc
 
     List<PlatformCashAccountRecord> queryByBizTypeAndPaymentDays(@Param("bizType")String bizType, @Param("paymentDays")int paymentDays);
 
-    Integer cancelRecord(@Param("orderNo")String orderNo,@Param("bizType") String bizType, @Param("bizId") Long bizId);
+    Integer cancelRecord(@Param("orderNo") String orderNo, @Param("bizType") String bizType, @Param(
+            "bizId") Long bizId, @Param("type") InOrOutEnum type);
 
     Integer mallRecordedRecord(@Param("orderNo")String orderNo,@Param("bizType") String bizType, @Param("bizId") Long bizId);
 

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

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

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

@@ -1,11 +1,10 @@
 package com.yonge.cooleshow.biz.dal.dao;
 
-import java.util.List;
-
-import org.apache.ibatis.annotations.Param;
-
 import com.yonge.cooleshow.biz.dal.entity.Subject;
 import com.yonge.toolset.mybatis.dal.BaseDAO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 public interface SubjectDao extends BaseDAO<Long, Subject> {
     /***
@@ -55,4 +54,11 @@ public interface SubjectDao extends BaseDAO<Long, Subject> {
     Subject queryByName(@Param("name") String name);
 
     List<Subject> subjectSelect(@Param("type") String type);
+
+    /**
+     * 声部模糊匹配
+     * @param subjectName 声部匹配
+     * @return Subject
+     */
+    Subject getSubjectMatchByName(@Param("name") String subjectName);
 }

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

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

+ 22 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/MusicImgDto.java

@@ -23,6 +23,12 @@ public class MusicImgDto {
     @ApiModelProperty("曲目id")
     private Long musicSheetId;
 
+    @ApiModelProperty("首调")
+    private String firstTone;
+
+    @ApiModelProperty("固定调")
+    private String fixedTone;
+
     public String getMusicImg() {
         return musicImg;
     }
@@ -38,4 +44,20 @@ public class MusicImgDto {
     public void setMusicSheetId(Long musicSheetId) {
         this.musicSheetId = musicSheetId;
     }
+
+    public String getFirstTone() {
+        return firstTone;
+    }
+
+    public void setFirstTone(String firstTone) {
+        this.firstTone = firstTone;
+    }
+
+    public String getFixedTone() {
+        return fixedTone;
+    }
+
+    public void setFixedTone(String fixedTone) {
+        this.fixedTone = fixedTone;
+    }
 }

+ 54 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/MusicSheetRenderDto.java

@@ -0,0 +1,54 @@
+package com.yonge.cooleshow.biz.dal.dto;
+
+public class MusicSheetRenderDto {
+
+	private Long musicSheetId;
+	
+	private String musicJSON;
+	
+	private String musicSvg;
+	
+	private String musicJianSvg;
+	
+	private String musicFirstSvg;
+
+	public Long getMusicSheetId() {
+		return musicSheetId;
+	}
+
+	public void setMusicSheetId(Long musicSheetId) {
+		this.musicSheetId = musicSheetId;
+	}
+
+	public String getMusicJSON() {
+		return musicJSON;
+	}
+
+	public void setMusicJSON(String musicJSON) {
+		this.musicJSON = musicJSON;
+	}
+
+	public String getMusicSvg() {
+		return musicSvg;
+	}
+
+	public void setMusicSvg(String musicSvg) {
+		this.musicSvg = musicSvg;
+	}
+
+	public String getMusicJianSvg() {
+		return musicJianSvg;
+	}
+
+	public void setMusicJianSvg(String musicJianSvg) {
+		this.musicJianSvg = musicJianSvg;
+	}
+
+	public String getMusicFirstSvg() {
+		return musicFirstSvg;
+	}
+
+	public void setMusicFirstSvg(String musicFirstSvg) {
+		this.musicFirstSvg = musicFirstSvg;
+	}
+}

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

@@ -33,7 +33,7 @@ public class OrderReq {
     @ApiModelProperty(value = "订单名称 ", required = true)
     private String orderName;
     @NotNull(message = "订单类型不能为空")
-    @ApiModelProperty(value = "订单类型: 学生端( VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ACTI_REGIST、活动报名 ) 老师端(VIP、开通会员 PINAO_ROOM、琴房时长 ACTI_REGIST 活动报名)", required = true)
+    @ApiModelProperty(value = "订单类型: 学生端( VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ACTI_REGIST、活动报名 ) 老师端(VIP、开通会员 PIANO_ROOM、琴房时长 ACTI_REGIST 活动报名)", required = true)
     private OrderTypeEnum orderType;
     @ApiModelProperty(value = "订单描述信息 ")
     private String orderDesc;
@@ -68,7 +68,7 @@ public class OrderReq {
         @ApiModelProperty(value = "订单详情号", hidden = true)
         private String subOrderNo;
         @NotNull(message = "商品类型不能为空")
-        @ApiModelProperty(value = "商品类型: 学生端( VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ACTI_REGIST、活动报名) 老师端( PINAO_ROOM、琴房时长 ACTI_REGIST 活动报名)", required = true)
+        @ApiModelProperty(value = "商品类型: 学生端( VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ACTI_REGIST、活动报名) 老师端( PIANO_ROOM、琴房时长 ACTI_REGIST 活动报名)", required = true)
         private GoodTypeEnum goodType;
         @ApiModelProperty("商品名称 ")
         private String goodName;

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

@@ -26,6 +26,12 @@ public class TeacherMusicSheetAuditReq {
     @ApiModelProperty(value = "曲谱渲染图",required = true)
     private String musicImg;
 
+    @ApiModelProperty("首调")
+    private String firstTone;
+
+    @ApiModelProperty("固定调")
+    private String fixedTone;
+
     @ApiModelProperty(value = "审批状态(PASS:通过,UNPASS:不通过)",required = true)
     @NotNull(message = "审批状态不为空 ")
     private AuthStatusEnum authStatus;
@@ -142,4 +148,20 @@ public class TeacherMusicSheetAuditReq {
     public void setAudioFileUrl(String audioFileUrl) {
         this.audioFileUrl = audioFileUrl;
     }
+
+    public String getFirstTone() {
+        return firstTone;
+    }
+
+    public void setFirstTone(String firstTone) {
+        this.firstTone = firstTone;
+    }
+
+    public String getFixedTone() {
+        return fixedTone;
+    }
+
+    public void setFixedTone(String fixedTone) {
+        this.fixedTone = fixedTone;
+    }
 }

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

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

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

@@ -15,6 +15,7 @@ import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 
 import java.util.List;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 /**
@@ -84,6 +85,15 @@ public class MusicSheetSearch  extends QueryInfo{
     @ApiModelProperty("TOP:推荐曲目 NEW:最新曲目 HOT:最热曲目")
     private MusicSortType musicSortType;
 
+    @ApiModelProperty("数据恢复")
+    private String dataRecovery;
+
+    @ApiModelProperty("是否可以转简谱(0:否,1:是)")
+    private YesOrNoEnum notation;
+
+    @ApiModelProperty("数据修复标识")
+    private Boolean DataCorrect;
+
     public MusicSortType getMusicSortType() {
         return musicSortType;
     }
@@ -247,4 +257,28 @@ public class MusicSheetSearch  extends QueryInfo{
     public void setActivityId(Long activityId) {
         this.activityId = activityId;
     }
+
+    public String getDataRecovery() {
+        return Optional.ofNullable(dataRecovery).filter(StringUtils::isNotBlank).orElse(null);
+    }
+
+    public void setDataRecovery(String dataRecovery) {
+        this.dataRecovery = dataRecovery;
+    }
+
+    public YesOrNoEnum getNotation() {
+        return notation;
+    }
+
+    public void setNotation(YesOrNoEnum notation) {
+        this.notation = notation;
+    }
+
+    public Boolean getDataCorrect() {
+        return Optional.ofNullable(DataCorrect).filter(x -> x).orElse(null);
+    }
+
+    public void setDataCorrect(Boolean dataCorrect) {
+        DataCorrect = dataCorrect;
+    }
 }

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

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

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

@@ -10,6 +10,7 @@ import io.swagger.annotations.ApiModelProperty;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.util.Date;
+import java.util.Optional;
 
 /**
  * @Author: liweifan
@@ -28,6 +29,13 @@ public class StudentSearch extends QueryInfo{
     private YesOrNoEnum delFlag;
     @ApiModelProperty(value = "是否会员 0否 1是")
     private YesOrNoEnum isVip;
+
+    @ApiModelProperty(value = "是否练习 0否 1是")
+    private YesOrNoEnum trainFlag;
+
+    @ApiModelProperty(value = "是否评测 0否 1是")
+    private YesOrNoEnum evaluateFlag;
+
     @ApiModelProperty(value = "注册开始时间")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@@ -50,6 +58,9 @@ public class StudentSearch extends QueryInfo{
     @ApiModelProperty("用户状态")
     private String userStatus;
 
+    @ApiModelProperty("隐藏标识")
+    private Integer hideFlag;
+
     public Date getVipStartTime() {
         return vipStartTime;
     }
@@ -141,4 +152,34 @@ public class StudentSearch extends QueryInfo{
 	public void setDelFlag(YesOrNoEnum delFlag) {
 		this.delFlag = delFlag;
 	}
+
+    public YesOrNoEnum getTrainFlag() {
+        if (YesOrNoEnum.YES == trainFlag) {
+            return trainFlag;
+        }
+        return null;
+    }
+
+    public void setTrainFlag(YesOrNoEnum trainFlag) {
+        this.trainFlag = trainFlag;
+    }
+
+    public YesOrNoEnum getEvaluateFlag() {
+        if (YesOrNoEnum.YES == evaluateFlag) {
+            return evaluateFlag;
+        }
+        return null;
+    }
+
+    public void setEvaluateFlag(YesOrNoEnum evaluateFlag) {
+        this.evaluateFlag = evaluateFlag;
+    }
+
+    public Integer getHideFlag() {
+        return Optional.ofNullable(hideFlag).orElse(0);
+    }
+
+    public void setHideFlag(Integer hideFlag) {
+        this.hideFlag = hideFlag;
+    }
 }

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

@@ -4,7 +4,6 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 import com.yonge.cooleshow.common.enums.UserLockFlag;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.page.QueryInfo;
-
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import org.springframework.format.annotation.DateTimeFormat;
@@ -45,6 +44,12 @@ public class TeacherSearch extends QueryInfo{
     @ApiModelProperty("是否测试用户")
 	private Boolean isTestUser;
 
+	@ApiModelProperty(value = "是否练习 0否 1是")
+	private YesOrNoEnum trainFlag;
+
+	@ApiModelProperty(value = "是否评测 0否 1是")
+	private YesOrNoEnum evaluateFlag;
+
 
 	@ApiModelProperty(value = "会员结束开始时间")
 	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@@ -150,4 +155,26 @@ public class TeacherSearch extends QueryInfo{
 	public void setIsTestUser(Boolean isTestUser) {
 		this.isTestUser = isTestUser;
 	}
+
+	public YesOrNoEnum getTrainFlag() {
+		if (YesOrNoEnum.YES == trainFlag) {
+			return trainFlag;
+		}
+		return null;
+	}
+
+	public void setTrainFlag(YesOrNoEnum trainFlag) {
+		this.trainFlag = trainFlag;
+	}
+
+	public YesOrNoEnum getEvaluateFlag() {
+		if (YesOrNoEnum.YES == evaluateFlag) {
+			return evaluateFlag;
+		}
+		return null;
+	}
+
+	public void setEvaluateFlag(YesOrNoEnum evaluateFlag) {
+		this.evaluateFlag = evaluateFlag;
+	}
 }

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

@@ -27,7 +27,7 @@ public class UserAccountRecordSearch extends QueryInfo{
 	private String orderNo;
 
 	@ApiModelProperty("收支类型:IN、收入 OUT、支出 ")
-	private InOrOutEnum inOrOut;
+	private InOrOutEnum inOrOut ;
 
 	@ApiModelProperty(value = "入账状态 WAIT 待入账 FROZEN 冻结入账 RECORDED 已入账 CANCEL 退费 ")
 	private PostStatusEnum postStatus;

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

@@ -41,7 +41,7 @@ public class ActivityReward implements Serializable {
     @TableField(value = "reward_name_")
     @NotBlank(message = "奖品名称不能为空")
     private String rewardName;
-    @ApiModelProperty("奖品类型:  ACTUAL 实物 VIP 小酷AI会员 PIAMO_ROOM 琴房时长 COUPON(优惠券)")
+    @ApiModelProperty("奖品类型:  ACTUAL 实物 VIP 小酷AI会员 PIANO_ROOM 琴房时长 COUPON(优惠券)")
     @TableField(value = "reward_type_")
     @NotNull(message = "奖品类型不能为空")
     private RewardTypeEnum rewardType;

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

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

+ 95 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CustomerServiceBatchSending.java

@@ -0,0 +1,95 @@
+package com.yonge.cooleshow.biz.dal.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.yonge.cooleshow.biz.dal.enums.im.EImReceiveType;
+import com.yonge.cooleshow.biz.dal.enums.im.EImSendStatus;
+import com.yonge.cooleshow.biz.dal.enums.im.EImSendType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 客服群发
+ * 2022-12-09 10:49:10
+ */
+@Data
+@ApiModel(" CustomerServiceBatchSending-客服群发")
+@TableName("customer_service_batch_sending")
+public class CustomerServiceBatchSending implements Serializable {
+
+    @ApiModelProperty("主键ID") 
+    @TableId(value = "id_", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("目标群体") 
+	@TableField(value = "target_group_")
+    private String targetGroup;
+
+    @ApiModelProperty("发送声部") 
+	@TableField(value = "send_subject_")
+    private String sendSubject;
+
+    @ApiModelProperty("发送人数")
+    @TableField(value = "send_number_")
+    private Integer sendNumber;
+
+    @ApiModelProperty("接收人数") 
+	@TableField(value = "receive_number_")
+    private Integer receiveNumber;
+
+    @ApiModelProperty("目标人群") 
+	@TableField(value = "receive_type_")
+    private EImReceiveType receiveType;
+
+    @ApiModelProperty("发送方式") 
+	@TableField(value = "send_type_")
+    private EImSendType sendType;
+
+    @ApiModelProperty("发送状态") 
+	@TableField(value = "send_status_")
+    private EImSendStatus sendStatus;
+
+    @ApiModelProperty("发送时间") 
+	@TableField(value = "send_time_")
+    private Date sendTime;
+
+    @ApiModelProperty("发送条件")
+    @TableField(value = "condition_")
+    private String condition;
+
+    @ApiModelProperty("消息标题") 
+	@TableField(value = "title_")
+    private String title;
+
+    @ApiModelProperty("文本消息") 
+	@TableField(value = "text_message_")
+    private String textMessage;
+
+    @ApiModelProperty("图片消息") 
+	@TableField(value = "img_message_")
+    private String imgMessage;
+
+    @ApiModelProperty("图片地址") 
+	@TableField(value = "img_url_")
+    private String imgUrl;
+
+    @ApiModelProperty("客户ID")
+    @TableField(value = "sender_id_")
+    private Long senderId;
+
+    @ApiModelProperty("创建用户") 
+	@TableField(value = "create_by_")
+    private Long createBy;
+
+    @ApiModelProperty("创建时间") 
+	@TableField(value = "create_time_")
+    private Date createTime;
+
+}

+ 44 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CustomerServiceReceive.java

@@ -0,0 +1,44 @@
+package com.yonge.cooleshow.biz.dal.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 客服群发接收
+ * 2022-12-09 10:49:10
+ */
+@Data
+@ApiModel(" CustomerServiceReceive-客服群发接收")
+@TableName("customer_service_receive")
+public class CustomerServiceReceive implements Serializable {
+
+    @ApiModelProperty("主键ID") 
+    @TableId(value = "id_", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("群发消息ID")
+    @TableField(value = "batch_sending_id_")
+    private Long batchSendingId;
+
+    @ApiModelProperty("用户ID") 
+	@TableField(value = "user_id_")
+    private Long userId;
+
+    @ApiModelProperty("用户身份") 
+	@TableField(value = "client_type_")
+    private String clientType;
+
+    @ApiModelProperty("创建时间") 
+	@TableField(value = "create_time_")
+    private Date createTime;
+
+}

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

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

+ 113 - 14
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicSheet.java

@@ -1,18 +1,5 @@
 package com.yonge.cooleshow.biz.dal.entity;
 
-import io.swagger.annotations.ApiModel;
-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;
-import javax.validation.constraints.Size;
-
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
@@ -22,8 +9,18 @@ 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 io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.StringUtils;
 
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.Objects;
+
 /**
  * 曲谱表
  * @author yzp
@@ -89,6 +86,11 @@ public class MusicSheet implements Serializable {
 	@ApiModelProperty(value = "收藏数")
 	private Integer favoriteCount;
 
+
+	@ApiModelProperty("虚拟人数 ")
+	@TableField(value = "virtual_number_")
+	private Integer virtualNumber;
+
     @NotBlank(message = "曲谱标签不能为空!")
     @TableField("music_tag_")
     @ApiModelProperty(value = "曲谱标签(多个标签用逗号分隔)")
@@ -219,12 +221,43 @@ public class MusicSheet implements Serializable {
 	@TableField("ext_config_json_")
 	@ApiModelProperty("曲目配置信息")
 	private String extConfigJson;
-
+	
+	@TableField("music_json_")
+	private String musicJSON;
+	
+	@TableField("music_svg_")
+	private String musicSvg;
+	
+	@TableField("music_jian_svg_")
+	private String musicJianSvg;
+	
+	@TableField("music_first_svg_")
+	private String musicFirstSvg;
+
+	@TableField("first_tone_")
+	@ApiModelProperty("首调")
+	private String firstTone;
+
+	@TableField("fixed_tone_")
+	@ApiModelProperty("固定调")
+	private String fixedTone;
 
 	@TableField("del_flag_")
 	@ApiModelProperty(value = "假删除标识 0:未删除 1:已删除")
 	private Boolean delFlag;
 
+	@TableField("correct_time_")
+	@ApiModelProperty(value = "数据修复时间")
+	private Date correctTime;
+
+	public Integer getVirtualNumber() {
+		return virtualNumber;
+	}
+
+	public void setVirtualNumber(Integer virtualNumber) {
+		this.virtualNumber = virtualNumber;
+	}
+
 	public Date getFirstPassAuditTime() {
 		return firstPassAuditTime;
 	}
@@ -573,6 +606,22 @@ public class MusicSheet implements Serializable {
 		this.paymentType = paymentType;
 	}
 
+	public String getFirstTone() {
+		return firstTone;
+	}
+
+	public void setFirstTone(String firstTone) {
+		this.firstTone = firstTone;
+	}
+
+	public String getFixedTone() {
+		return fixedTone;
+	}
+
+	public void setFixedTone(String fixedTone) {
+		this.fixedTone = fixedTone;
+	}
+
 	public MusicSheet notation(YesOrNoEnum notation) {
 		this.notation = notation;
 		return this;
@@ -607,4 +656,54 @@ public class MusicSheet implements Serializable {
 		this.audioFileUrl = audioFileUrl;
 		return this;
 	}
+
+	public String getMusicJSON() {
+		return musicJSON;
+	}
+
+	public void setMusicJSON(String musicJSON) {
+		this.musicJSON = musicJSON;
+	}
+
+	public String getMusicSvg() {
+		return musicSvg;
+	}
+
+	public void setMusicSvg(String musicSvg) {
+		this.musicSvg = musicSvg;
+	}
+
+	public String getMusicJianSvg() {
+		return musicJianSvg;
+	}
+
+	public void setMusicJianSvg(String musicJianSvg) {
+		this.musicJianSvg = musicJianSvg;
+	}
+
+	public String getMusicFirstSvg() {
+		return musicFirstSvg;
+	}
+
+	public void setMusicFirstSvg(String musicFirstSvg) {
+		this.musicFirstSvg = musicFirstSvg;
+	}
+
+	public MusicSheet firstTone(String firstTone) {
+		this.firstTone = firstTone;
+		return this;
+	}
+
+	public MusicSheet fixedTone(String fixedTone) {
+		this.fixedTone = fixedTone;
+		return this;
+	}
+
+	public Date getCorrectTime() {
+		return correctTime;
+	}
+
+	public void setCorrectTime(Date correctTime) {
+		this.correctTime = correctTime;
+	}
 }

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

@@ -44,11 +44,11 @@ public class PlatformCashAccountRecord implements Serializable {
     private PostStatusEnum postStatus;
 
     @TableField("biz_type_")
-    @ApiModelProperty(value = "业务类型:PRACTICE、陪练课 LIVE、直播课 VIDEO、视频课 MUSIC、乐谱 VIP、会员充值 MALL、商品购买 PIAON_ROOM、琴房充值 ACTI_REGIST、活动报名 LIVE_SHARE、直播课分润 VIDEO_SHARE、视频课分润  MUSIC_SHARE、乐谱分润  VIP_SHARE、会员分润  MALL_SHARE、商品分润")
+    @ApiModelProperty(value = "业务类型:PRACTICE、陪练课 LIVE、直播课 VIDEO、视频课 MUSIC、乐谱 VIP、会员充值 MALL、商品购买 PIANO_ROOM、琴房充值 ACTI_REGIST、活动报名 LIVE_SHARE、直播课分润 VIDEO_SHARE、视频课分润  MUSIC_SHARE、乐谱分润  VIP_SHARE、会员分润  MALL_SHARE、商品分润")
     private AccountBizTypeEnum bizType;
 
     @TableField("biz_id_")
-    @ApiModelProperty(value = "业务id(PRACTICE,LIVE,LIVE_SHARE为课程组id | VIDEO,VIDEO_SHARE为视频组id |MUSIC,MUSIC_SHARE为曲谱id | VIP,VIP_SHARE,PIAON_ROOM为会员琴房价格表id | MALL,MALL_SHARE为商品id | ACTI_REGIST为活动id )")
+    @ApiModelProperty(value = "业务id(PRACTICE,LIVE,LIVE_SHARE为课程组id | VIDEO,VIDEO_SHARE为视频组id |MUSIC,MUSIC_SHARE为曲谱id | VIP,VIP_SHARE,PIANO_ROOM为会员琴房价格表id | MALL,MALL_SHARE为商品id | ACTI_REGIST为活动id )")
     private Long bizId;
 
     @TableField("memo_")

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

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

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

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

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

@@ -1,21 +1,18 @@
 package com.yonge.cooleshow.biz.dal.entity;
 
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
-
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.yonge.cooleshow.common.enums.UserLockFlag;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
 import java.util.Date;
 
-import com.fasterxml.jackson.annotation.JsonFormat;
-
-import org.springframework.format.annotation.DateTimeFormat;
-
 /**
  * 教师表
  */
@@ -226,6 +223,14 @@ public class Teacher implements Serializable {
     @ApiModelProperty("是否测试用户")
 	private Boolean isTestUser;
 
+    @ApiModelProperty("练习时长 ")
+    @TableField(value = "train_time_")
+    private Long trainTime;
+
+    @ApiModelProperty("评测时长 ")
+    @TableField(value = "evaluate_time_")
+    private Long evaluateTime;
+
 
     public Long getDefaultSubject() {
         return defaultSubject;
@@ -515,4 +520,20 @@ public class Teacher implements Serializable {
 	public void setIsTestUser(Boolean isTestUser) {
 		this.isTestUser = isTestUser;
 	}
+
+    public Long getTrainTime() {
+        return trainTime;
+    }
+
+    public void setTrainTime(Long trainTime) {
+        this.trainTime = trainTime;
+    }
+
+    public Long getEvaluateTime() {
+        return evaluateTime;
+    }
+
+    public void setEvaluateTime(Long evaluateTime) {
+        this.evaluateTime = evaluateTime;
+    }
 }

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

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

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

@@ -51,7 +51,7 @@ public class UserOrder implements Serializable {
     @ApiModelProperty("下单应用:STUDENT 学生端 TEACHER 老师端")
     @TableField(value = "order_client_")
     private ClientEnum orderClient;
-    @ApiModelProperty("订单类型: 学生端( VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ACTI_REGIST、活动报名) 老师端(VIP、开通会员 PINAO_ROOM、琴房时长)")
+    @ApiModelProperty("订单类型: 学生端( VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ACTI_REGIST、活动报名) 老师端(VIP、开通会员 PIANO_ROOM、琴房时长)")
     @TableField(value = "order_type_")
     private OrderTypeEnum orderType;
     @ApiModelProperty("订单描述信息 ")

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

@@ -32,7 +32,7 @@ public class UserOrderDetail implements Serializable {
     @ApiModelProperty("卖家id ")
     @TableField(value = "merch_id_")
     private Long merchId;
-    @ApiModelProperty("订单类型: 学生端( VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ACTI_REGIST、活动报名) 老师端(VIP、开通会员 PINAO_ROOM、琴房时长)")
+    @ApiModelProperty("订单类型: 学生端( VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ACTI_REGIST、活动报名) 老师端(VIP、开通会员 PIANO_ROOM、琴房时长)")
     @TableField(value = "good_type_")
     private GoodTypeEnum goodType;
     @ApiModelProperty("业务id ")

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

@@ -139,6 +139,19 @@ public class VideoLessonGroup extends BaseEntity {
     @ApiModelProperty(value = "是否审核时可见 (0:否  1:是)")
     private YesOrNoEnum auditVersion = YesOrNoEnum.NO;
 
+
+    @ApiModelProperty("虚拟人数 ")
+    @TableField(value = "virtual_number_")
+    private Integer virtualNumber;
+
+    public Integer getVirtualNumber() {
+        return virtualNumber;
+    }
+
+    public void setVirtualNumber(Integer virtualNumber) {
+        this.virtualNumber = virtualNumber;
+    }
+
     public YesOrNoEnum getDraftFlag() {
         return draftFlag;
     }

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

@@ -17,7 +17,7 @@ public enum AccountBizTypeEnum implements BaseEnum<String, AccountBizTypeEnum> {
     MUSIC("乐谱"),
     VIP("会员充值"),
     MALL("商品购买"),
-    PIAON_ROOM("琴房充值"),
+    PIANO_ROOM("琴房充值"),
     ACTI_REGIST("活动报名"),
     WITHDRAWAL("结算"),
     ALBUM("专辑"),

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

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

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

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

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

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

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

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

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

@@ -0,0 +1,28 @@
+package com.yonge.cooleshow.biz.dal.enums.im;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.toolset.base.enums.BaseEnum;
+import lombok.Getter;
+
+/**
+ * IM群发接收方式
+ * Created by Eric.Shang on 2022/12/9.
+ */
+@Getter
+public enum EImReceiveType implements BaseEnum<String, EImReceiveType> {
+
+    ALL("全部"),
+    PORTION("一部分"),
+    ;
+
+    @EnumValue
+    private final String code;
+
+    private final String msg;
+
+    EImReceiveType(String msg) {
+        this.msg = msg;
+
+        this.code = this.name();
+    }
+}

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

@@ -0,0 +1,30 @@
+package com.yonge.cooleshow.biz.dal.enums.im;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.toolset.base.enums.BaseEnum;
+import lombok.Getter;
+
+/**
+ * IM群发消息状态
+ * Created by Eric.Shang on 2022/12/9.
+ */
+@Getter
+public enum EImSendStatus implements BaseEnum<String, EImSendStatus> {
+
+    WAIT("待发送"),
+    SEND("已发送"),
+    DISABLE("已停用"),
+    EXPIRE("已失效"),
+    ;
+
+    @EnumValue
+    private final String code;
+
+    private final String msg;
+
+    EImSendStatus(String msg) {
+        this.msg = msg;
+
+        this.code = this.name();
+    }
+}

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

@@ -0,0 +1,28 @@
+package com.yonge.cooleshow.biz.dal.enums.im;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.toolset.base.enums.BaseEnum;
+import lombok.Getter;
+
+/**
+ * IM群发方式
+ * Created by Eric.Shang on 2022/12/9.
+ */
+@Getter
+public enum EImSendType implements BaseEnum<String, EImSendType> {
+
+    IMMEDIATELY("即时发送"),
+    SCHEDULED("定时发送"),
+    ;
+
+    @EnumValue
+    private final String code;
+
+    private final String msg;
+
+    EImSendType(String msg) {
+        this.msg = msg;
+
+        this.code = this.name();
+    }
+}

+ 36 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/CustomerServiceBatchSendingMapper.java

@@ -0,0 +1,36 @@
+package com.yonge.cooleshow.biz.dal.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.biz.dal.entity.CustomerServiceBatchSending;
+import com.yonge.cooleshow.biz.dal.wrapper.im.CustomerService;
+import com.yonge.cooleshow.biz.dal.wrapper.im.CustomerServiceBatchSendingWrapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 客服群发
+ * 2022-12-09 10:49:10
+ */
+public interface CustomerServiceBatchSendingMapper extends BaseMapper<CustomerServiceBatchSending> {
+
+	/**
+	 * 分页查询
+	 * @param page IPage<CustomerServiceBatchSendingWrapper.CustomerServiceBatchSending>
+	 * @param param CustomerServiceBatchSendingWrapper.CustomerServiceBatchSendingQuery
+	 * @return List<CustomerServiceBatchSendingWrapper.CustomerServiceBatchSending>
+	 */
+	List<CustomerServiceBatchSendingWrapper.CustomerServiceBatchSending> selectPage(@Param("page") IPage<CustomerServiceBatchSendingWrapper.CustomerServiceBatchSending> page,
+																					@Param("param") CustomerServiceBatchSendingWrapper.CustomerServiceBatchSendingQuery param);
+
+	/**
+	 * 客服消息接收者
+	 * @param message 客服消息
+	 * @return List<CustomerService.MessageReceives>
+	 */
+	List<CustomerService.MessageReceives> selectMessageReceives(@Param("page") IPage<CustomerService.MessageReceives> page,
+																@Param("param") CustomerService.NotifyMessage message);
+
+	
+}

+ 25 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/CustomerServiceReceiveMapper.java

@@ -0,0 +1,25 @@
+package com.yonge.cooleshow.biz.dal.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.biz.dal.entity.CustomerServiceReceive;
+import com.yonge.cooleshow.biz.dal.wrapper.im.CustomerServiceReceiveWrapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 客服群发接收
+ * 2022-12-09 10:49:10
+ */
+public interface CustomerServiceReceiveMapper extends BaseMapper<CustomerServiceReceive> {
+
+	/**
+	 * 分页查询
+	 * @param page IPage<CustomerServiceReceiveWrapper.CustomerServiceReceive>
+	 * @param param CustomerServiceReceiveWrapper.CustomerServiceReceiveQuery
+	 * @return List<CustomerServiceReceiveWrapper.CustomerServiceReceive>
+	 */
+	List<CustomerServiceReceiveWrapper.CustomerServiceReceive> selectPage(@Param("page") IPage<CustomerServiceReceiveWrapper.CustomerServiceReceive> page, @Param("param") CustomerServiceReceiveWrapper.CustomerServiceReceiveQuery param);
+	
+}

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

@@ -1,11 +1,12 @@
 package com.yonge.cooleshow.biz.dal.mapper;
 
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.auth.api.dto.RealnameAuthReq;
 import com.yonge.cooleshow.biz.dal.entity.SysUser;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.vo.CouponIssueUserVo;
+import com.yonge.cooleshow.biz.dal.wrapper.im.CustomerService;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
 
@@ -30,8 +31,8 @@ public interface SysUserMapper extends BaseMapper<SysUser> {
      * @param keyword 查询条件
      * @return
      */
-    List<CouponIssueUserVo> queryCouponIssueUser(@Param("iPage") IPage<CouponIssueUserVo> iPage, @Param(
-            "client") ClientEnum client, @Param("keyword") String keyword);
+    List<CouponIssueUserVo> queryCouponIssueUser(@Param("iPage") IPage<CouponIssueUserVo> iPage,
+                                                 @Param("client") ClientEnum client, @Param("keyword") String keyword);
 
 
     /***
@@ -42,4 +43,11 @@ public interface SysUserMapper extends BaseMapper<SysUser> {
      * @return: java.lang.Integer
      */
     Integer updateUserCard(@Param("param") RealnameAuthReq param);
+
+    /**
+     * 客服消息接收者
+     * @param message 客服消息
+     * @return List<CustomerService.MessageReceives>
+     */
+    List<CustomerService.MessageReceives> selectMessageReceives(@Param("param") CustomerService.NotifyMessage message);
 }

+ 45 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseCoursewareService.java

@@ -0,0 +1,45 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.vo.CourseCoursewareVo;
+import com.yonge.cooleshow.biz.dal.dto.search.CourseCoursewareSearch;
+import com.yonge.cooleshow.biz.dal.entity.CourseCourseware;
+
+import java.io.Serializable;
+import java.util.Collection;
+
+/**
+ * 课件表 服务类
+ * @author liweifan
+ * @date 2022-11-02
+ */
+public interface CourseCoursewareService extends IService<CourseCourseware>  {
+
+	/**
+     * 查询详情
+     * @author liweifan
+ 	 * @date 2022-11-02
+     */
+	CourseCoursewareVo detail(Long id);
+
+    /**
+     * 分页查询
+     * @author liweifan
+ 	 * @date 2022-11-02
+     */
+    IPage<CourseCoursewareVo> selectPage(IPage<CourseCoursewareVo> page, CourseCoursewareSearch query);
+
+	@Override
+	boolean removeById(Serializable id);
+
+	/**
+	 * 保存课件数据
+	 * @return
+	 */
+	CourseCourseware submit(CourseCourseware courseCourseware);
+
+
+	@Override
+	boolean removeByIds(Collection<? extends Serializable> idList);
+}

+ 61 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CustomerServiceBatchSendingService.java

@@ -0,0 +1,61 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.entity.CustomerServiceBatchSending;
+import com.yonge.cooleshow.biz.dal.enums.im.EImSendStatus;
+import com.yonge.cooleshow.biz.dal.wrapper.im.CustomerServiceBatchSendingWrapper;
+
+/**
+ * 客服群发
+ * 2022-12-09 10:49:10
+ */
+public interface CustomerServiceBatchSendingService extends IService<CustomerServiceBatchSending>  {
+
+	/**
+     * 查询详情
+     * @param id 详情ID
+     * @return CustomerServiceBatchSendingWrapper.CustomerServiceBatchSending
+     */
+    CustomerServiceBatchSendingWrapper.CustomerServiceBatchSending detail(Long id);
+
+    /**
+     * 分页查询
+     * @param page IPage<CustomerServiceBatchSending>
+     * @param query CustomerServiceBatchSendingWrapper.CustomerServiceBatchSendingQuery
+     * @return IPage<CustomerServiceBatchSendingWrapper.CustomerServiceBatchSending>
+     */
+    IPage<CustomerServiceBatchSendingWrapper.CustomerServiceBatchSending> selectPage(IPage<CustomerServiceBatchSendingWrapper.CustomerServiceBatchSending> page, CustomerServiceBatchSendingWrapper.CustomerServiceBatchSendingQuery query);
+	
+    /**
+     * 添加
+     * @param customerServiceBatchSending CustomerServiceBatchSendingWrapper.CustomerServiceBatchSending
+     * @return Boolean
+     */
+     Boolean add(CustomerServiceBatchSendingWrapper.CustomerServiceBatchSending customerServiceBatchSending);   
+
+    /**
+     * 更新
+     * @param customerServiceBatchSending CustomerServiceBatchSendingWrapper.CustomerServiceBatchSending
+     * @return Boolean
+     */
+     Boolean update(CustomerServiceBatchSendingWrapper.CustomerServiceBatchSending customerServiceBatchSending);
+
+    /**
+     * 更新消息状态
+     * @param id 消息Id
+     * @param sendStatus EImSendStatus
+     */
+    void status(Long id, EImSendStatus sendStatus);
+
+    /**
+     * 发送消息
+     * @param id 群发消息ID
+     */
+    void sendMessage(Long id);
+
+    /**
+     * 定时发送消息
+     */
+    void scheduleSendMessage();
+}

+ 43 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CustomerServiceReceiveService.java

@@ -0,0 +1,43 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.entity.CustomerServiceReceive;
+import com.yonge.cooleshow.biz.dal.wrapper.im.CustomerServiceReceiveWrapper;
+
+/**
+ * 客服群发接收
+ * 2022-12-09 10:49:10
+ */
+public interface CustomerServiceReceiveService extends IService<CustomerServiceReceive>  {
+
+	/**
+     * 查询详情
+     * @param id 详情ID
+     * @return CustomerServiceReceive
+     */
+	CustomerServiceReceive detail(Long id);
+
+    /**
+     * 分页查询
+     * @param page IPage<CustomerServiceReceiveWrapper.CustomerServiceReceive>
+     * @param query CustomerServiceReceiveWrapper.CustomerServiceReceiveQuery
+     * @return IPage<CustomerServiceReceiveWrapper.CustomerServiceReceive>
+     */
+    IPage<CustomerServiceReceiveWrapper.CustomerServiceReceive> selectPage(IPage<CustomerServiceReceiveWrapper.CustomerServiceReceive> page, CustomerServiceReceiveWrapper.CustomerServiceReceiveQuery query);
+	
+    /**
+     * 添加
+     * @param customerServiceReceive CustomerServiceReceiveWrapper.CustomerServiceReceive
+     * @return Boolean
+     */
+     Boolean add(CustomerServiceReceiveWrapper.CustomerServiceReceive customerServiceReceive);   
+
+    /**
+     * 更新
+     * @param customerServiceReceive CustomerServiceReceiveWrapper.CustomerServiceReceive
+     * @return Boolean
+     */
+     Boolean update(CustomerServiceReceiveWrapper.CustomerServiceReceive customerServiceReceive);
+     
+}

+ 5 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicAlbumService.java

@@ -152,4 +152,9 @@ public interface MusicAlbumService extends IService<MusicAlbum> {
     ShareProfitVo albumShareProfit(SysUser sysUser, Long albumId);
 
     IPage<StudentMusicAlbumOrderVo>  selectStudentOrderPage(IPage<StudentMusicAlbumOrderVo> page, StudentMusicSheetOrderSearch query);
+
+    /**
+     * 设置专辑收藏的虚拟人数
+     */
+    void setVirtualNumber();
 }

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