Przeglądaj źródła

Merge branch 'dev_1_3_2_20220815' into online

liujunchi 2 lat temu
rodzic
commit
71b9835fdc
100 zmienionych plików z 3463 dodań i 390 usunięć
  1. 23 3
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/AdminFeignService.java
  2. 11 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/AdminFeignServiceFallback.java
  3. 10 0
      cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/dto/UserSetReq.java
  4. 11 0
      cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/entity/SysUser.java
  5. 6 0
      cooleshow-auth/auth-server/pom.xml
  6. 1 1
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/AuthServerApplication.java
  7. 15 4
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/SysUserServiceImpl.java
  8. 49 14
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/UserController.java
  9. 7 0
      cooleshow-auth/auth-server/src/main/resources/config/mybatis/SysUserMapper.xml
  10. 4 1
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/constant/SysConfigConstant.java
  11. 2 1
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/ActivityTypeEnum.java
  12. 6 4
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/CacheNameEnum.java
  13. 41 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/ConditionEnum.java
  14. 35 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/ConditionMethodEnum.java
  15. 36 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/RewardTypeEnum.java
  16. 38 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/UnitEnum.java
  17. 41 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/UserFirstTimeTypeEnum.java
  18. 19 0
      cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/ActivityIngTask.java
  19. 1 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/config/ResourceServerConfig.java
  20. 0 4
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ActivityEvaluationRecordController.java
  21. 56 2
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ActivityPlanController.java
  22. 101 30
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ActivityRewardController.java
  23. 6 12
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ActivityUserRewardController.java
  24. 14 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/HomeController.java
  25. 2 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/PianoRoomChangeRecordController.java
  26. 51 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/StudentController.java
  27. 66 14
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TeacherController.java
  28. 4 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TeacherStyleVideoController.java
  29. 37 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/AdminClient.java
  30. 7 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/task/TaskController.java
  31. 0 12
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityPlanDao.java
  32. 13 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityPlanEvaluationDao.java
  33. 56 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityPlanRewardDao.java
  34. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityPlanStandardDao.java
  35. 29 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityRewardChangeStockDao.java
  36. 37 10
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityRewardDao.java
  37. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityUserRewardDao.java
  38. 24 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/HomeDao.java
  39. 18 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserFirstTimeDao.java
  40. 22 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ActivityPlanDto.java
  41. 26 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ActivityPlanRewardDto.java
  42. 0 12
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ActivityRewardDto.java
  43. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/MusicSheetExport.java
  44. 39 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/SubjectHomeSearch.java
  45. 13 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/UpdateRewardDto.java
  46. 15 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/TeacherApplyDetailReq.java
  47. 14 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/ActivityPlanRewardSearch.java
  48. 24 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/ActivityPlanSearch.java
  49. 89 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/ActivityRewardChangeStockSearch.java
  50. 46 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/ActivityRewardSearch.java
  51. 69 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/ActivityUserRewardSearch.java
  52. 13 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MusicSheetSearch.java
  53. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/TeacherMusicSheetSearch.java
  54. 22 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/TeacherSearch.java
  55. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/TeacherStyleVideoSearch.java
  56. 75 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/UserFirstTimeSearch.java
  57. 70 61
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityPlan.java
  58. 0 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityPlanEvaluation.java
  59. 88 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityPlanReward.java
  60. 103 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityPlanStandard.java
  61. 98 23
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityReward.java
  62. 110 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityRewardChangeStock.java
  63. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityUserReward.java
  64. 31 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicSheet.java
  65. 24 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/PianoRoomChangeRecord.java
  66. 30 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/StudentTime.java
  67. 43 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/Teacher.java
  68. 14 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TeacherAuthEntryRecord.java
  69. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TeacherStyleVideo.java
  70. 105 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserFirstTime.java
  71. 13 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/VipCardRecord.java
  72. 35 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/AccompanimentTypeEnum.java
  73. 3 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageTypeEnum.java
  74. 6 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/SourceTypeEnum.java
  75. 20 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityPlanEvaluationService.java
  76. 79 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityPlanRewardService.java
  77. 18 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityPlanService.java
  78. 19 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityPlanStandardService.java
  79. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityRegistrationService.java
  80. 41 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityRewardService.java
  81. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityUserRewardService.java
  82. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/HomeService.java
  83. 13 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MemberPriceSettingsService.java
  84. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/PianoRoomChangeRecordService.java
  85. 41 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserFirstTimeService.java
  86. 13 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/VipCardRecordService.java
  87. 102 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanEvaluationServiceImpl.java
  88. 193 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanRewardServiceImpl.java
  89. 191 71
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanServiceImpl.java
  90. 189 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanStandardServiceImpl.java
  91. 2 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityRegistrationServiceImpl.java
  92. 192 32
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityRewardServiceImpl.java
  93. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityUserRewardServiceImpl.java
  94. 19 18
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  95. 78 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/HomeServiceImpl.java
  96. 19 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MemberPriceSettingsServiceImpl.java
  97. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicTagServiceImpl.java
  98. 38 28
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PianoRoomChangeRecordServiceImpl.java
  99. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java
  100. 7 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentTimeServiceImpl.java

+ 23 - 3
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/AdminFeignService.java

@@ -5,11 +5,13 @@ import com.yonge.cooleshow.common.constant.AppConstant;
 import com.yonge.cooleshow.common.entity.ContractDto;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.entity.MallOrderItemDto;
+import com.yonge.cooleshow.common.enums.UserFirstTimeTypeEnum;
 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;
+import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
 
@@ -55,13 +57,13 @@ public interface AdminFeignService {
      * 设置商城收入分润
      */
     @PostMapping("/open/mallRecord")
-    public HttpResponseResult<Boolean> mallRecord(@RequestBody List<MallOrderItemDto> shareDto ) ;
+    public HttpResponseResult<Boolean> mallRecord(@RequestBody List<MallOrderItemDto> shareDto);
 
     /**
      * 设置商城收入状态
      */
     @PostMapping("/open/mallRecordState")
-    public HttpResponseResult<Boolean> mallRecordState(@RequestBody  List<MallOrderItemDto> shareDto ) ;
+    public HttpResponseResult<Boolean> mallRecordState(@RequestBody List<MallOrderItemDto> shareDto);
 
 
     //老师课酬
@@ -78,7 +80,25 @@ public interface AdminFeignService {
     @GetMapping("/open/userOrder/contractRecord")
     HttpResponseResult<Boolean> contractRecord(@RequestBody ContractDto contract);
 
-    //老师课酬
+    /**
+     * 营销活动
+     *
+     * @return
+     */
     @PostMapping(value = "/task/activityState")
     HttpResponseResult activityState();
+
+    /**
+     * 活动中定时轮询
+     *
+     * @return
+     */
+    @PostMapping(value = "/task/activityIng")
+    HttpResponseResult activityIng();
+
+    @GetMapping(value = "/open/adminClient/recordTime")
+    HttpResponseResult recordTime(
+            @RequestParam("userId") Long userId,
+            @RequestParam("userType") String userType,
+            @RequestParam("firstTimeType") UserFirstTimeTypeEnum firstTimeType);
 }

+ 11 - 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.common.entity.ContractDto;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.entity.MallOrderItemDto;
+import com.yonge.cooleshow.common.enums.UserFirstTimeTypeEnum;
 
 import java.util.List;
 
@@ -65,4 +66,14 @@ public class AdminFeignServiceFallback implements AdminFeignService {
     public HttpResponseResult activityState() {
         return null;
     }
+
+    @Override
+    public HttpResponseResult activityIng() {
+        return null;
+    }
+
+    @Override
+    public HttpResponseResult recordTime(Long userId, String userType, UserFirstTimeTypeEnum firstTimeTypeEnum) {
+        return null;
+    }
 }

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

@@ -15,6 +15,8 @@ import java.util.Date;
  */
 @ApiModel(value = "UserSetReq对象", description = "用户设置请求对象")
 public class UserSetReq {
+    @ApiModelProperty(value = "客户端",required = true)
+    private String clientId;
     @ApiModelProperty("头像地址")
     private String avatar;
     @ApiModelProperty("昵称")
@@ -27,6 +29,14 @@ public class UserSetReq {
     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     private Date birthdate;
 
+    public String getClientId() {
+        return clientId;
+    }
+
+    public void setClientId(String clientId) {
+        this.clientId = clientId;
+    }
+
     public String getAvatar() {
         return avatar;
     }

+ 11 - 0
cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/entity/SysUser.java

@@ -98,6 +98,9 @@ public class SysUser implements Serializable{
 	@ApiModelProperty(value = "用户角色")
 	private List<Long> roles;
 
+	@ApiModelProperty(value = "最近一次修改用户名称时间")
+	private Date lastUsernameTime;
+
 	private String certificateType = "IDENTITY";
 
 	public String getCertificateType() {
@@ -303,6 +306,14 @@ public class SysUser implements Serializable{
 		this.roles = roles;
 	}
 
+	public Date getLastUsernameTime() {
+		return lastUsernameTime;
+	}
+
+	public void setLastUsernameTime(Date lastUsernameTime) {
+		this.lastUsernameTime = lastUsernameTime;
+	}
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

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

@@ -107,6 +107,12 @@
             <artifactId>redisson-spring-boot-starter</artifactId>
             <version>${redisson.version}</version>
         </dependency>
+        <dependency>
+            <groupId>com.yonge.cooleshow</groupId>
+            <artifactId>cooleshow-api</artifactId>
+            <version>1.0</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
     <build>

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

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

+ 15 - 4
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/SysUserServiceImpl.java

@@ -2,9 +2,12 @@ package com.yonge.cooleshow.auth.service.impl;
 
 import java.util.List;
 
+import com.yonge.cooleshow.api.feign.AdminFeignService;
 import com.yonge.cooleshow.auth.api.dto.*;
 import com.yonge.cooleshow.auth.config.RongCloudConfig;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
+import com.yonge.cooleshow.common.enums.SysUserType;
+import com.yonge.cooleshow.common.enums.UserFirstTimeTypeEnum;
 import com.yonge.toolset.mybatis.service.impl.BaseServiceImpl;
 import io.rong.models.user.UserModel;
 import org.apache.commons.lang3.StringUtils;
@@ -26,6 +29,8 @@ import com.yonge.cooleshow.common.entity.ImUserModel;
 import com.yonge.toolset.base.exception.BizException;
 import org.springframework.util.CollectionUtils;
 
+import javax.annotation.Resource;
+
 @Service
 public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implements SysUserService {
 
@@ -39,6 +44,8 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
     private SysConfigService sysConfigService;
     @Autowired
     private RedissonClient redissonClient;
+    @Resource
+    private AdminFeignService adminFeignService;
 
     @Override
     public BaseDAO<Long, SysUser> getDAO() {
@@ -148,9 +155,7 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
         sysUser.setUserType("TEACHER");
         sysUserDao.insert(sysUser);
         //创建teacher表
-        sysUserDao.saveTeacher(sysUser.getId());
-        //创建老师账户
-        sysUserDao.createUserAccount(sysUser.getId());
+        saveTeacher(sysUser);
         //用户默认昵称
         sysUser.setUsername("游客" + sysUser.getId());
         sysUserDao.update(sysUser);
@@ -184,6 +189,9 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
     public void saveStudent(SysUser sysUser) {
         sysUserDao.saveStudent(sysUser.getId());
         sysUserDao.createUserAccount(sysUser.getId());
+
+        //记录注册时间
+        adminFeignService.recordTime(sysUser.getId(), SysUserType.STUDENT.getCode(), UserFirstTimeTypeEnum.REGISTER_STUDENT);
     }
 
     @Override
@@ -191,6 +199,9 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
     public void saveTeacher(SysUser sysUser) {
         sysUserDao.saveTeacher(sysUser.getId());
         sysUserDao.createUserAccount(sysUser.getId());
+
+        //记录注册时间
+        adminFeignService.recordTime(sysUser.getId(), SysUserType.TEACHER.getCode(), UserFirstTimeTypeEnum.REGISTER_TEACHER);
     }
 
     @Override
@@ -250,7 +261,7 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
     public void logoffById(Long id) {
         //判断用户是否有未结束的课程
         Integer num = sysUserDao.getUnCompCourseNum(id);
-        if(num>0){
+        if (num > 0) {
             throw new BizException("用户有未完成的课程");
         }
 

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

@@ -1,17 +1,23 @@
 package com.yonge.cooleshow.auth.web.controller;
 
+import com.yonge.cooleshow.common.constant.SysConfigConstant;
+import com.yonge.cooleshow.common.enums.SysUserType;
 import com.yonge.toolset.base.util.StringUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 
+import java.time.Duration;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.util.Date;
 import java.util.List;
 
 import javax.validation.Valid;
 
 import org.apache.commons.lang3.StringUtils;
+import org.joda.time.LocalDate;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.HttpStatus;
@@ -66,12 +72,12 @@ public class UserController extends BaseController {
     @Autowired
     private IdGeneratorService smsCodeService;
 
-	@Autowired
-	private CustomTokenServices tokenService;
-	
+    @Autowired
+    private CustomTokenServices tokenService;
+
     @Value("${message.debugMode}")
     private boolean debugMode;
-    
+
     @Autowired
     private RealnameAuthenticationPlugin realnameAuthenticationPlugin;
     @Autowired
@@ -181,11 +187,14 @@ public class UserController extends BaseController {
         if (sysUser == null) {
             return failed("用户不存在");
         }
-        if(!StringUtil.isEmpty(username)){
+        if (!StringUtil.isEmpty(username)) {
             if (sysUser.getUserType().contains("SYSTEM")) {
                 sysUser.setRealName(username);
             }
             sysUser.setUsername(username);
+            if(SysUserType.TEACHER.getCode().equals(authUser.getClientId().toUpperCase())){
+                sysUser.setLastUsernameTime(new Date());
+            }
         }
 		/*if(StringUtils.isEmpty(sysUser.getImToken())){
 			ImResult register = imFeignService.register(new ImUserModel(sysUser.getId().toString(), username, sysUser.getAvatar()));
@@ -213,7 +222,7 @@ public class UserController extends BaseController {
         if (sysUser == null) {
             return failed("用户不存在");
         }
-        if (smsCodeService.verifyValidCode(mobile, authCode,"SMS_VERIFY_CODE_UPDATE_PSW")) {
+        if (smsCodeService.verifyValidCode(mobile, authCode, "SMS_VERIFY_CODE_UPDATE_PSW")) {
             String password = new BCryptPasswordEncoder().encode(newPassword);
             sysUser.setPassword(password);
             sysUser.setUpdateTime(new Date());
@@ -227,13 +236,13 @@ public class UserController extends BaseController {
     }
 
     private void loginOut(SysUser sysUser) {
-        if(sysUser.getUserType().contains("STUDENT")){
+        if (sysUser.getUserType().contains("STUDENT")) {
             tokenService.revokeToken("student", sysUser.getPhone());
         }
-        if(sysUser.getUserType().contains("TEACHER")){
+        if (sysUser.getUserType().contains("TEACHER")) {
             tokenService.revokeToken("teacher", sysUser.getPhone());
         }
-        if(sysUser.getUserType().contains("SYSTEM")){
+        if (sysUser.getUserType().contains("SYSTEM")) {
             tokenService.revokeToken("system", sysUser.getPhone());
         }
     }
@@ -275,7 +284,7 @@ public class UserController extends BaseController {
         if (newSysUser != null) {
             return failed("手机号被占用");
         }
-        if (smsCodeService.verifyValidCode(newPhone, authCode,"SMS_VERIFY_CODE_UPDATE_PHONE")) {
+        if (smsCodeService.verifyValidCode(newPhone, authCode, "SMS_VERIFY_CODE_UPDATE_PHONE")) {
             sysUser.setPhone(newPhone);
             sysUser.setUpdateTime(new Date());
             sysUserService.update(sysUser);
@@ -329,8 +338,8 @@ public class UserController extends BaseController {
             return failed("非法操作");
         }
         sysUser.setLockFlag(lockFlag);
-        
-        if(lockFlag == 1){
+
+        if (lockFlag == 1) {
             loginOut(sysUser);
         }
         sysUser.setUpdateTime(new Date());
@@ -465,7 +474,7 @@ public class UserController extends BaseController {
         if (user != null) {
             SysUser sysUser = sysUserService.get(user.getUserId());
             if (sysUser.getIsSuperAdmin()) {
-            	RoleQueryInfo queryInfo = new RoleQueryInfo();
+                RoleQueryInfo queryInfo = new RoleQueryInfo();
                 queryInfo.setRows(9999);
                 queryInfo.setIsEnable(true);
                 return succeed(sysRoleService.queryPage(queryInfo).getRows());
@@ -527,7 +536,7 @@ public class UserController extends BaseController {
             if (!verify) {
                 return failed("未通过实名认证");
             }
-        }catch (Exception e){
+        } catch (Exception e) {
             e.printStackTrace();
             return failed("未通过实名认证");
         }
@@ -564,15 +573,41 @@ public class UserController extends BaseController {
         if (authUser == null) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
+        setReq.setClientId(authUser.getClientId().toUpperCase());
+
         SysUser user = sysUserService.get(authUser.getUserId());
         if (user == null || null == user.getId()) {
             return failed("用户不存在");
         }
+
+        if (SysUserType.TEACHER.getCode().equals(authUser.getClientId().toUpperCase())) {
+            //判断用户昵称修改时间
+            if (StringUtils.isNotEmpty(setReq.getUsername())) {
+                checkLastUsernameTime(user, setReq.getUsername());
+            }
+        }
+
         //设置
         sysUserService.submitSetDetail(setReq, user.getId());
         return succeed(sysUserService.getSetDetail(user.getId()));
     }
 
+    private void checkLastUsernameTime(SysUser user, String username) {
+        if (StringUtils.isNotEmpty(username)) {
+            String configValue = sysConfigService.findConfigValue(SysConfigConstant.LAST_USERNAME_MONTH);
+
+            if (null != user.getLastUsernameTime()
+                    && StringUtils.isNotEmpty(configValue)) {
+                Long lastUsernameMonth = Long.parseLong(configValue);
+                Long monthDiff = DateUtil.getMonthDiff(user.getLastUsernameTime(),new Date());
+
+                if (monthDiff < lastUsernameMonth && lastUsernameMonth > 0) {
+                    throw new BizException("每隔" + lastUsernameMonth + "个月可修改一次");
+                }
+            }
+        }
+    }
+
     @PostMapping(value = "/bindOpenId")
     public HttpResponseResult<Boolean> bindOpenId(@RequestBody SysUser param) {
         AuthUser authUser = SecurityUtils.getUser();

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

@@ -30,6 +30,7 @@
         <result column="wechat_id_" property="wechatId"/>
         <result column="is_super_admin_" property="isSuperAdmin"/>
         <result column="certificate_type_" property="certificateType"/>
+        <result column="last_username_time_" property="lastUsernameTime"/>
     </resultMap>
 
     <!-- 查询条件 -->
@@ -150,6 +151,9 @@
             <if test="certificateType != null">
                 certificate_type_ = #{certificateType},
             </if>
+            <if test="lastUsernameTime != null">
+                last_username_time_ = #{lastUsernameTime},
+            </if>
         </set>
         WHERE del_flag_ = 0 and id_ = #{id}
     </update>
@@ -252,6 +256,9 @@
         </if>
         <if test="param.username != null and param.username != ''">
             username_ = #{param.username},
+            <if test="param.clientId != null and param.clientId == 'TEACHER'">
+                last_username_time_ = now(),
+            </if>
         </if>
         <if test="param.gender != null">
             gender_ = #{param.gender},

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

@@ -241,7 +241,10 @@ public interface SysConfigConstant {
      * 敏感词-白名单
      */
     String WHITE_LIST = "white_list";
-
+    /**
+     * 修改用户名间隔天数
+     */
+    String LAST_USERNAME_MONTH = "last_username_month";
 
     /** 老师分享曲目二维码跳转链接 */
     String TEACHER_MUSIC_SHEET_SHARE_PROFIT_URL = "teacher_music_sheet_share_profit_url";

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

@@ -11,7 +11,8 @@ import com.yonge.toolset.base.enums.BaseEnum;
  */
 public enum ActivityTypeEnum implements BaseEnum<String, ActivityTypeEnum> {
 
-    EVALUATION("评测活动")
+    EVALUATION("评测活动"),
+    STANDARD_GIFT("达标赠送"),
     ;
 
     @EnumValue

+ 6 - 4
cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/CacheNameEnum.java

@@ -17,16 +17,18 @@ public enum CacheNameEnum implements BaseEnum<String, CacheNameEnum> {
 
     TEACHER_TOTAL("老师统计缓存"),
     STUDENT_TOTAL("学生统计缓存"),
-    SUBJECT_ITEM("声部下拉缓存", Duration.ofHours(1L)),
-    TEACHER_SUBJECT_ITEM("老师声部下拉缓存", Duration.ofHours(1L)),
-    STUDENT_SUBJECT_ITEM("学生声部下拉缓存", Duration.ofHours(1L)),
+    SUBJECT_ITEM("声部下拉缓存", Duration.ofMinutes(1L)),
+    TEACHER_SUBJECT_ITEM("老师声部下拉缓存", Duration.ofMinutes(1L)),
+    STUDENT_SUBJECT_ITEM("学生声部下拉缓存", Duration.ofMinutes(1L)),
 
     LOCK_EXECUTE_ORDER("用户下单/付款/取消订单锁"),
     LOCK_RECORD_ACCOUNT("账户记录锁"),
     LOCK_CHANGE_ACCOUNT("账户变更锁"),
     LOCK_CHANGE_PIANO_ROOM_ACCOUNT("琴房账户变更锁"),
     LOCK_WITHDRAWAL("锁用户结算"),
-
+    LOCK_REWARD_STOCK("锁奖品库存变更"),
+    LOCK_ACTIVITY_REWARD_STOCK("锁活动奖品变更"),
+    LOCK_ACTIVITY_STOCK("锁活动变更"),
     ;
     /***
      * 缓存描述

+ 41 - 0
cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/ConditionEnum.java

@@ -0,0 +1,41 @@
+package com.yonge.cooleshow.common.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.toolset.base.enums.BaseEnum;
+
+/**
+ * 达标条件
+ *
+ * @Author: liweifan
+ * @Data: 2022/4/7 15:48
+ */
+public enum ConditionEnum implements BaseEnum<String, ConditionEnum> {
+
+    ENTRY("达人认证"),
+    LIVEING("开通直播"),
+    PRACTICE("首次完成陪练课设置"),
+    LIVE("首次创建直播课"),
+    VIDEO("首次创建视频课"),
+    BIND_STUDENT("学员绑定"),
+    REGISTER_STUDENT("学员注册"),
+    REGISTER_TEACHER("老师注册"),
+    ;
+
+    @EnumValue
+    private String code;
+    private String msg;
+
+    ConditionEnum(String msg) {
+        this.code = this.name();
+        this.msg = msg;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+}

+ 35 - 0
cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/ConditionMethodEnum.java

@@ -0,0 +1,35 @@
+package com.yonge.cooleshow.common.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.toolset.base.enums.BaseEnum;
+
+/**
+ * 计算方式
+ *
+ * @Author: liweifan
+ * @Data: 2022/4/7 15:48
+ */
+public enum ConditionMethodEnum implements BaseEnum<String, ConditionMethodEnum> {
+
+    AND("全部满足"),
+    OR("满足其一"),
+    ;
+
+    @EnumValue
+    private String code;
+    private String msg;
+
+    ConditionMethodEnum(String msg) {
+        this.code = this.name();
+        this.msg = msg;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+}

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

@@ -0,0 +1,36 @@
+package com.yonge.cooleshow.common.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.toolset.base.enums.BaseEnum;
+
+/**
+ * 奖品类型
+ *
+ * @Author: liweifan
+ * @Data: 2022/4/7 15:48
+ */
+public enum RewardTypeEnum implements BaseEnum<String, RewardTypeEnum> {
+
+    ACTUAL("实物"),
+    VIP("小酷AI会员"),
+    PIAMO_ROOM("琴房时长"),
+    ;
+
+    @EnumValue
+    private String code;
+    private String msg;
+
+    RewardTypeEnum(String msg) {
+        this.code = this.name();
+        this.msg = msg;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+}

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

@@ -0,0 +1,38 @@
+package com.yonge.cooleshow.common.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.toolset.base.enums.BaseEnum;
+
+/**
+ * 单位枚举
+ *
+ * @Author: liweifan
+ * @Data: 2022/4/7 15:48
+ */
+public enum UnitEnum implements BaseEnum<String, UnitEnum> {
+
+    DAY("天"),
+    MONTH("月"),
+    YEAR("年"),
+    MINUTE("分钟数"),
+    PCS("个"),
+    ;
+
+    @EnumValue
+    private String code;
+    private String msg;
+
+    UnitEnum(String msg) {
+        this.code = this.name();
+        this.msg = msg;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+}

+ 41 - 0
cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/UserFirstTimeTypeEnum.java

@@ -0,0 +1,41 @@
+package com.yonge.cooleshow.common.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.toolset.base.enums.BaseEnum;
+
+/**
+ * 首次时间记录类型
+ *
+ * @Author: liweifan
+ * @Data: 2022/4/7 15:48
+ */
+public enum UserFirstTimeTypeEnum implements BaseEnum<String, UserFirstTimeTypeEnum> {
+
+    ENTRY("达人认证"),
+    LIVEING("开通直播"),
+    PRACTICE("首次完成陪练课设置"),
+    LIVE("首次创建直播课"),
+    VIDEO("首次创建视频课"),
+    BIND_STUDENT("学员绑定"),
+    REGISTER_STUDENT("学员注册"),
+    REGISTER_TEACHER("老师注册"),
+    ;
+
+    @EnumValue
+    private String code;
+    private String msg;
+
+    UserFirstTimeTypeEnum(String msg) {
+        this.code = this.name();
+        this.msg = msg;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+}

+ 19 - 0
cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/ActivityIngTask.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 ActivityIngTask extends BaseTask {
+
+    @Autowired
+    private AdminFeignService adminFeignService;
+
+    @Override
+    public void execute() throws TaskException {
+        Object o = adminFeignService.activityIng();
+    }
+}

+ 1 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/config/ResourceServerConfig.java

@@ -26,6 +26,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
 	public void configure(HttpSecurity http) throws Exception {
 		http.csrf().disable().exceptionHandling().accessDeniedHandler(baseAccessDeniedHandler).authenticationEntryPoint(baseAuthenticationEntryPoint).and()
 				.authorizeRequests().antMatchers("/task/**").hasIpAddress("0.0.0.0/0")
+				// .authorizeRequests().antMatchers("/task/**").permitAll()
 				.antMatchers("/v2/api-docs", "/code/*", "/api/*", "/appVersionInfo/queryByPlatform", "/uploadFile","/open/**").permitAll().anyRequest().authenticated()
 				.and().httpBasic();
 	}

+ 0 - 4
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ActivityEvaluationRecordController.java

@@ -6,17 +6,13 @@ 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.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
-import javax.validation.Valid;
-
 import com.yonge.cooleshow.biz.dal.vo.ActivityEvaluationRecordVo;
 import com.yonge.cooleshow.biz.dal.dto.search.ActivityEvaluationRecordSearch;
-import com.yonge.cooleshow.biz.dal.entity.ActivityEvaluationRecord;
 import com.yonge.cooleshow.biz.dal.service.ActivityEvaluationRecordService;
 
 @RestController

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

@@ -3,17 +3,20 @@ 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.biz.dal.dto.ActivityPlanDto;
+import com.yonge.cooleshow.biz.dal.dto.ActivityPlanRewardDto;
 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.http.HttpStatus;
 import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.util.CollectionUtils;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
@@ -24,6 +27,8 @@ import com.yonge.cooleshow.biz.dal.dto.search.ActivityPlanSearch;
 import com.yonge.cooleshow.biz.dal.entity.ActivityPlan;
 import com.yonge.cooleshow.biz.dal.service.ActivityPlanService;
 
+import java.util.List;
+
 @RestController
 @RequestMapping("/activityPlan")
 @Api(value = "活动计划表", tags = "活动计划表")
@@ -67,7 +72,15 @@ public class ActivityPlanController extends BaseController {
         if (user == null || null == user.getId()) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
-        return HttpResponseResult.succeed(activityPlanService.submit(activityPlan, user));
+        activityPlan.setUserId(user.getId());
+        try {
+            return HttpResponseResult.succeed(activityPlanService.submit(activityPlan));
+        } catch (BizException e) {
+            return HttpResponseResult.failed(e.getMessage());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return HttpResponseResult.failed("变更失败");
+        }
     }
 
     /**
@@ -85,4 +98,45 @@ public class ActivityPlanController extends BaseController {
         }
         return status(activityPlanService.updateActivityState(activityId, activityState, user.getId()));
     }
+
+    /**
+     * 草稿/正式
+     */
+    @GetMapping("/updateDraftFlag")
+    @ApiOperation(value = "草稿/正式")
+    @PreAuthorize("@pcs.hasPermissions('activityPlan/updateDraftFlag')")
+    public HttpResponseResult updateDraftFlag(
+            @ApiParam(value = "活动id", required = true) @RequestParam("activityId") Long activityId,
+            @ApiParam(value = "创建状态 0 正式 1 草稿 ", required = true) @RequestParam("draftFlag") Integer draftFlag) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        return status(activityPlanService.updateDraftFlag(activityId, draftFlag, user.getId()));
+    }
+
+    /**
+     * 修改奖品
+     */
+    @PostMapping("/saveOrUpdateReward")
+    @ApiOperation(value = "修改奖品")
+    @PreAuthorize("@pcs.hasPermissions('activityPlan/saveOrUpdateReward')")
+    public HttpResponseResult saveOrUpdateReward(@Validated @RequestBody List<ActivityPlanRewardDto> updateRewardDtoList) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+
+        if (CollectionUtils.isEmpty(updateRewardDtoList)) {
+            return failed("参数异常");
+        }
+        try {
+            return HttpResponseResult.succeed(activityPlanService.saveOrUpdateReward(updateRewardDtoList));
+        } catch (BizException e) {
+            return HttpResponseResult.failed(e.getMessage());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return HttpResponseResult.failed("变更失败");
+        }
+    }
 }

+ 101 - 30
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ActivityRewardController.java

@@ -3,9 +3,14 @@ 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.biz.dal.dto.ActivityRewardDto;
+import com.yonge.cooleshow.biz.dal.dto.search.ActivityRewardChangeStockSearch;
+import com.yonge.cooleshow.biz.dal.entity.ActivityRewardChangeStock;
+import com.yonge.cooleshow.biz.dal.vo.ActivityRewardChangeStockVo;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+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.mybatis.support.PageUtil;
 
@@ -24,6 +29,8 @@ import com.yonge.cooleshow.biz.dal.dto.search.ActivityRewardSearch;
 import com.yonge.cooleshow.biz.dal.entity.ActivityReward;
 import com.yonge.cooleshow.biz.dal.service.ActivityRewardService;
 
+import java.util.List;
+
 @RestController
 @RequestMapping("/activityReward")
 @Api(value = "活动奖品表", tags = "活动奖品表")
@@ -31,51 +38,115 @@ public class ActivityRewardController extends BaseController {
 
     @Autowired
     private ActivityRewardService activityRewardService;
-	@Resource
-	private SysUserFeignService sysUserFeignService;
+    @Resource
+    private SysUserFeignService sysUserFeignService;
 
-	/**
+    /**
      * 通过奖品id查询单条
      */
     @GetMapping("/detail/{id}")
     @ApiOperation(value = "通过奖品id查询单条", notes = "传入id")
-	@PreAuthorize("@pcs.hasPermissions('activityReward/detail')")
-	public HttpResponseResult<ActivityRewardVo> detail(@PathVariable("id") Long id) {
-    	return succeed(activityRewardService.detail(id));
-	}
-
-	/**
-	 * 通过活动id查询单条
-	 */
-	@GetMapping("/detailByActivityId/{id}")
-	@ApiOperation(value = "通过活动id查询单条", notes = "传入id")
-	@PreAuthorize("@pcs.hasPermissions('activityReward/detailByActivityId')")
-	public HttpResponseResult<ActivityRewardVo> detailByActivityId(@PathVariable("id") Long id) {
-		return succeed(activityRewardService.detailByActivityId(id));
-	}
-    
+    @PreAuthorize("@pcs.hasPermissions('activityReward/detail')")
+    public HttpResponseResult<ActivityRewardVo> detail(@PathVariable("id") Long id) {
+        return succeed(activityRewardService.detail(id));
+    }
+
+    /**
+     * 通过活动id查询单条(弃用)
+     */
+    @GetMapping("/detailByActivityId/{id}")
+    @ApiOperation(value = "通过活动id查询单条(弃用)", notes = "传入id")
+    @PreAuthorize("@pcs.hasPermissions('activityReward/detailByActivityId')")
+    public HttpResponseResult<ActivityRewardVo> detailByActivityId(@PathVariable("id") Long id) {
+        return succeed(activityRewardService.detailByActivityId(id));
+    }
+
     /**
      * 查询分页
      */
     @PostMapping("/page")
     @ApiOperation(value = "查询分页", notes = "传入activityRewardSearch")
-	@PreAuthorize("@pcs.hasPermissions('activityReward/page')")
-	public HttpResponseResult<PageInfo<ActivityRewardVo>> page(@RequestBody ActivityRewardSearch query) {
-		IPage<ActivityRewardVo> pages = activityRewardService.selectPage(PageUtil.getPage(query), query);
+    @PreAuthorize("@pcs.hasPermissions('activityReward/page')")
+    public HttpResponseResult<PageInfo<ActivityRewardVo>> page(@RequestBody ActivityRewardSearch query) {
+        IPage<ActivityRewardVo> pages = activityRewardService.selectPage(PageUtil.getPage(query), query);
         return succeed(PageUtil.pageInfo(pages));
-	}
+    }
 
     /**
-	 * 新增或修改
-	 */
+     * 查询列表
+     */
+    @PostMapping("/list")
+    @ApiOperation(value = "查询列表", notes = "传入activityRewardSearch")
+    @PreAuthorize("@pcs.hasPermissions('activityReward/list')")
+    public HttpResponseResult<List<ActivityRewardVo>> list(@RequestBody ActivityRewardSearch query) {
+        List<ActivityRewardVo> list = activityRewardService.selectAll(query);
+        return succeed(list);
+    }
+
+    /**
+     * 新增或修改
+     */
     @PostMapping("/submit")
     @ApiOperation(value = "新增或修改", notes = "传入activityReward")
-	@PreAuthorize("@pcs.hasPermissions('activityReward/submit')")
-	public HttpResponseResult submit(@Valid @RequestBody ActivityRewardDto activityReward) {
-		SysUser user = sysUserFeignService.queryUserInfo();
-		if (user == null || null == user.getId()) {
-			return failed(HttpStatus.FORBIDDEN, "请登录");
-		}
+    @PreAuthorize("@pcs.hasPermissions('activityReward/submit')")
+    public HttpResponseResult submit(@Valid @RequestBody ActivityRewardDto activityReward) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
         return status(activityRewardService.submit(activityReward, user));
     }
+
+    /**
+     * 启用/停用
+     */
+    @GetMapping("/updateStatus")
+    @ApiOperation(value = "启用/停用")
+    @PreAuthorize("@pcs.hasPermissions('activityReward/updateStatus')")
+    public HttpResponseResult updateStatus(
+            @ApiParam(value = "活动id", required = true) @RequestParam("id") Long id,
+            @ApiParam(value = "活动状态 0 停用 1 启用", required = true) @RequestParam("status") Integer status) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        return status(activityRewardService.updateStatus(id, status, user.getId()));
+    }
+
+    /**
+     * 调整库存
+     */
+    @PostMapping("/updateStock")
+    @ApiOperation(value = "调整库存")
+    @PreAuthorize("@pcs.hasPermissions('activityReward/updateStock')")
+    public HttpResponseResult updateStock(@RequestBody ActivityRewardChangeStock activityRewardChangeStock) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        activityRewardChangeStock.setCreateBy(user.getId());
+        activityRewardChangeStock.setSource("ADMIN");
+        try {
+            activityRewardService.updateStock(activityRewardChangeStock);
+            return HttpResponseResult.succeed();
+        } catch (BizException e) {
+            return HttpResponseResult.failed(e.getMessage());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return HttpResponseResult.failed("变更失败");
+        }
+    }
+
+    /**
+     * 库存变更记录查询分页
+     */
+    @PostMapping("/selectChangeStockPage")
+    @ApiOperation(value = "库存变更记录查询分页", notes = "传入activityRewardChangeStockSearch")
+    @PreAuthorize("@pcs.hasPermissions('activityReward/selectChangeStockPage')")
+    public HttpResponseResult<PageInfo<ActivityRewardChangeStockVo>> selectChangeStockPage(@RequestBody ActivityRewardChangeStockSearch query) {
+        query.setSource("ADMIN");
+        IPage<ActivityRewardChangeStockVo> pages = activityRewardService.selectChangeStockPage(PageUtil.getPage(query), query);
+        return succeed(PageUtil.pageInfo(pages));
+    }
+
 }

+ 6 - 12
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ActivityUserRewardController.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.admin.controller;
 
+import com.yonge.cooleshow.biz.dal.vo.UserRewardVo;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -9,6 +10,7 @@ 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.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
@@ -31,6 +33,7 @@ public class ActivityUserRewardController extends BaseController {
      */
     @GetMapping("/detail/{id}")
     @ApiOperation(value = "详情", notes = "传入id")
+    @PreAuthorize("@pcs.hasPermissions('activityUserReward/detail')")
     public HttpResponseResult<ActivityUserRewardVo> detail(@PathVariable("id") Long id) {
     	return succeed(activityUserRewardService.detail(id));
 	}
@@ -40,18 +43,9 @@ public class ActivityUserRewardController extends BaseController {
      */
     @PostMapping("/page")
     @ApiOperation(value = "查询分页", notes = "传入activityUserRewardSearch")
-    public HttpResponseResult<PageInfo<ActivityUserRewardVo>> page(@RequestBody ActivityUserRewardSearch query) {
-		IPage<ActivityUserRewardVo> pages = activityUserRewardService.selectPage(PageUtil.getPage(query), query);
+    @PreAuthorize("@pcs.hasPermissions('activityUserReward/page')")
+    public HttpResponseResult<PageInfo<UserRewardVo>> page(@RequestBody @Valid ActivityUserRewardSearch query) {
+		IPage<UserRewardVo> pages = activityUserRewardService.selectPage(PageUtil.getPage(query), query);
         return succeed(PageUtil.pageInfo(pages));
 	}
-
-    /**
-	 * 修改
-	 */
-	@PostMapping("/update")
-	@ApiOperation(value = "修改", notes = "传入activityUserReward")
-	public HttpResponseResult update(@Valid @RequestBody ActivityUserReward activityUserReward) {
-        return status(activityUserRewardService.updateById(activityUserReward));
-	}
-
 }

+ 14 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/HomeController.java

@@ -1,21 +1,27 @@
 package com.yonge.cooleshow.admin.controller;
 
+import com.yonge.cooleshow.biz.dal.dto.SubjectHomeSearch;
 import com.yonge.cooleshow.biz.dal.dto.req.TotalReq;
 import com.yonge.cooleshow.biz.dal.service.HomeService;
 import com.yonge.cooleshow.biz.dal.service.MusicSheetService;
 import com.yonge.cooleshow.biz.dal.vo.CourseHomeVo;
 import com.yonge.cooleshow.biz.dal.vo.HomeMusicSheetVo;
+import com.yonge.cooleshow.biz.dal.vo.SubjectHomeVo;
 import com.yonge.cooleshow.biz.dal.vo.res.HomeTotalStudent;
 import com.yonge.cooleshow.biz.dal.vo.res.HomeTotalTeacher;
 import com.yonge.cooleshow.biz.dal.vo.res.HomeUserToDoNum;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.base.page.QueryInfo;
+import com.yonge.toolset.mybatis.support.PageUtil;
 import io.swagger.annotations.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
+import java.util.List;
 import java.util.Map;
 
 @RestController
@@ -68,4 +74,12 @@ public class HomeController extends BaseController {
         return succeed(homeService.queryCourseHomeData(param));
     }
 
+
+
+    @ApiOperation(value = "获取首页- 内容数据-声部数据")
+    @PostMapping("/subjectHome")
+    // @PreAuthorize("@pcs.hasPermissions('home/courseHome')")
+    public HttpResponseResult<PageInfo<SubjectHomeVo>> subjectHome(@RequestBody SubjectHomeSearch query) {
+        return succeed(homeService.subjectHome(PageUtil.getPage(query),query));
+    }
 }

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

@@ -2,6 +2,7 @@ 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.biz.dal.enums.SourceTypeEnum;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -59,6 +60,7 @@ public class PianoRoomChangeRecordController extends BaseController {
 			return failed(HttpStatus.FORBIDDEN, "请登录");
 		}
 		pianoRoomChangeRecord.setCreateBy(user.getId());
+		pianoRoomChangeRecord.setSourceType(SourceTypeEnum.PLATFORM);
     	return status(pianoRoomChangeRecordService.add(pianoRoomChangeRecord));
 	}
 }

+ 51 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/StudentController.java

@@ -1,14 +1,29 @@
 package com.yonge.cooleshow.admin.controller;
 
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Date;
+import java.util.List;
+
+import javax.servlet.http.HttpServletResponse;
+
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.TeacherSearch;
 import com.yonge.cooleshow.biz.dal.service.StudentService;
 import com.yonge.toolset.mybatis.support.PageUtil;
+import com.yonge.toolset.utils.date.DateUtil;
+import com.yonge.toolset.utils.excel.POIUtil;
 import com.yonge.cooleshow.biz.dal.vo.StudentVo;
+import com.yonge.cooleshow.biz.dal.vo.TeacherVo;
 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 io.swagger.annotations.*;
+
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
@@ -39,4 +54,40 @@ public class StudentController extends BaseController {
         return succeed(PageUtil.pageInfo(pages));
 	}
 
+    @ApiOperation(value = "学生列表导出")
+    @PostMapping("export")
+    @PreAuthorize("@pcs.hasPermissions('student/export')")
+    public void export(HttpServletResponse response, @RequestBody StudentSearch queryInfo) throws IOException {
+        queryInfo.setPage(1);
+        queryInfo.setRows(49999);
+        List<StudentVo> rows = studentService.selectPage(PageUtil.getPage(queryInfo), queryInfo).getRecords();
+        if (rows.size() < 1) {
+            throw new BizException("没有可导出数据");
+        }
+        OutputStream outputStream = response.getOutputStream();
+        try {
+            HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"学生编号", "学生姓名", "性别", "出生日期",
+                    "年龄", "专业", "手机号码", "是否是会员", "注册时间"}, new String[]{
+                    "userId", "realName", "gender.msg", "birthdate", "age", "subjectName", "phone",
+                    "isVip.msg", "createTime"}, rows);
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attac:wq" +
+                    "hment;filename=学生列表-" + DateUtil.getDate(new Date()) + ".xls");
+
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+            outputStream.flush();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
 }

+ 66 - 14
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TeacherController.java

@@ -1,28 +1,44 @@
 package com.yonge.cooleshow.admin.controller;
 
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.yonge.cooleshow.biz.dal.entity.TeacherStyleVideo;
-import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
-import com.yonge.cooleshow.common.controller.BaseController;
-import com.yonge.cooleshow.common.entity.HttpResponseResult;
-import com.yonge.toolset.base.page.PageInfo;
-import com.yonge.toolset.mybatis.support.PageUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
 
-import io.swagger.annotations.*;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.util.CollectionUtils;
-import org.springframework.web.bind.annotation.*;
-
-import javax.validation.Valid;
+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.RestController;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.biz.dal.dto.req.TeacherSubmitReq;
 import com.yonge.cooleshow.biz.dal.dto.search.TeacherSearch;
+import com.yonge.cooleshow.biz.dal.entity.TeacherStyleVideo;
+import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
 import com.yonge.cooleshow.biz.dal.service.TeacherService;
 import com.yonge.cooleshow.biz.dal.vo.TeacherVo;
-
-import java.util.List;
-import java.util.stream.Collectors;
+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 com.yonge.toolset.utils.date.DateUtil;
+import com.yonge.toolset.utils.excel.POIUtil;
 
 @RestController
 @RequestMapping("/teacher")
@@ -71,4 +87,40 @@ public class TeacherController extends BaseController {
     public HttpResponseResult<Boolean> submit(@Valid @RequestBody TeacherSubmitReq teacherSubmitReq) {
         return teacherService.submit(teacherSubmitReq);
     }
+
+    @ApiOperation(value = "老师列表导出")
+    @PostMapping("export")
+    @PreAuthorize("@pcs.hasPermissions('teacher/export')")
+    public void export(HttpServletResponse response, @RequestBody TeacherSearch queryInfo) throws IOException {
+        queryInfo.setPage(1);
+        queryInfo.setRows(49999);
+        List<TeacherVo> rows = teacherService.selectPage(PageUtil.getPage(queryInfo), queryInfo).getRecords();
+        if (rows.size() < 1) {
+            throw new BizException("没有可导出数据");
+        }
+        OutputStream outputStream = response.getOutputStream();
+        try {
+            HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"老师编号", "昵称", "姓名", "手机号", "老师类型",
+                    "注册时间", "认证时间", "状态", "是否是会员", "徽章"}, new String[]{
+                    "userId", "username", "realName", "phone", "entryFlag.code == 1 ? '达人' : '游客'", "createTime", "entryAuthDate",
+                    "lockFlag.remark", "isVip.code == 1 ? '是' : '否'", "tag"}, rows);
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attac:wq" +
+                    "hment;filename=老师列表-" + DateUtil.getDate(new Date()) + ".xls");
+
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+            outputStream.flush();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
 }

+ 4 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TeacherStyleVideoController.java

@@ -6,6 +6,7 @@ import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.req.AuthOperaReq;
 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.mybatis.support.PageUtil;
 
 import com.yonge.toolset.base.page.PageInfo;
@@ -45,6 +46,9 @@ public class TeacherStyleVideoController extends BaseController {
     @PostMapping("/page")
     @ApiOperation(value = "查询分页", notes = "传入teacherStyleVideoSearch")
     public HttpResponseResult<PageInfo<TeacherStyleVideoVo>> page(@RequestBody TeacherStyleVideoSearch query) {
+        //后端审核只查询非入驻审核视频
+        query.setEntryFlag(YesOrNoEnum.NO);
+
         IPage<TeacherStyleVideoVo> pages = teacherStyleVideoService.selectPage(PageUtil.getPage(query), query);
         return succeed(PageUtil.pageInfo(pages));
     }

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

@@ -0,0 +1,37 @@
+package com.yonge.cooleshow.admin.controller.open;
+
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.service.UserFirstTimeService;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.ContractDto;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.UserFirstTimeTypeEnum;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/open/adminClient")
+public class AdminClient extends BaseController {
+    private final static Logger log = LoggerFactory.getLogger(UserOrderClient.class);
+
+    @Autowired
+    private UserFirstTimeService userFirstTimeService;
+
+    @GetMapping("/recordTime")
+    public HttpResponseResult<Boolean> recordTime(
+            @RequestParam("userId") Long userId,
+            @RequestParam("userType") String userType,
+            @RequestParam("firstTimeType") UserFirstTimeTypeEnum firstTimeType
+    ) {
+        ClientEnum clientEnum = ClientEnum.valueOf(userType);
+        userFirstTimeService.recordTime(userId, clientEnum, firstTimeType);
+        return succeed(true);
+    }
+
+}

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

@@ -94,4 +94,11 @@ public class TaskController extends BaseController {
         activityPlanService.activityState();
         return HttpResponseResult.succeed();
     }
+
+    //活动中定时轮询
+    @PostMapping(value = "/activityIng")
+    public HttpResponseResult<Object> activityIng() {
+        activityPlanService.activityIng();
+        return HttpResponseResult.succeed();
+    }
 }

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

@@ -59,17 +59,5 @@ public interface ActivityPlanDao extends BaseMapper<ActivityPlan> {
 	 */
     List<ActivityPlan> activityState();
 
-	/**
-	 * 需要发奖的活动
-	 * @return
-	 */
-    List<ActivityPlan> activityReward();
 
-	/**
-	 *
-	 * @param activityPlanId
-	 * @param activityType
-	 * @return
-	 */
-	List<ActivityUserReward> getUserReward(@Param("activityPlanId")Long activityPlanId,@Param("activityType") String activityType);
 }

+ 13 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityPlanEvaluationDao.java

@@ -2,8 +2,21 @@ package com.yonge.cooleshow.biz.dal.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.yonge.cooleshow.biz.dal.entity.ActivityPlanEvaluation;
+import com.yonge.cooleshow.biz.dal.entity.ActivityUserReward;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 
 public interface ActivityPlanEvaluationDao extends BaseMapper<ActivityPlanEvaluation>{
+    /**
+     *
+     * @param activityPlanId
+     * @return
+     */
+    List<ActivityUserReward> getUserReward(@Param("activityPlanId")Long activityPlanId);
+
+
+
 
 }

+ 56 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityPlanRewardDao.java

@@ -0,0 +1,56 @@
+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 com.yonge.cooleshow.biz.dal.dto.ActivityPlanRewardDto;
+import org.apache.ibatis.annotations.Param;
+import com.yonge.cooleshow.biz.dal.entity.ActivityPlanReward;
+import com.yonge.cooleshow.biz.dal.vo.ActivityPlanRewardVo;
+import com.yonge.cooleshow.biz.dal.dto.search.ActivityPlanRewardSearch;
+
+
+public interface ActivityPlanRewardDao extends BaseMapper<ActivityPlanReward>{
+	/**
+	 * 查询详情
+     * @author liweifan
+     * @date 2022-08-17 11:13:13
+     * @return: com.yonge.cooleshow.biz.dal.vo.ActivityPlanRewardVo
+	 */
+	ActivityPlanRewardVo detail(@Param("id") Long id);
+	/**
+	 * 通过活动id和奖品id查询详情
+	 * @author liweifan
+	 * @date 2022-08-17 11:13:13
+	 * @return: com.yonge.cooleshow.biz.dal.vo.ActivityPlanRewardVo
+	 */
+	ActivityPlanReward detailByActivityIdAndRewardId(@Param("activityId") Long activityId,@Param("rewardId") Long rewardId);
+	/**
+	 * 分页查询
+     * @author liweifan
+     * @date 2022-08-17 11:13:13
+     * @return: com.yonge.cooleshow.biz.dal.vo.ActivityPlanRewardVo
+	 */
+	List<ActivityPlanRewardVo> selectPage(@Param("page") IPage page, @Param("param") ActivityPlanRewardSearch activityPlanReward);
+
+	/**
+	 * 查询活动下的奖品
+	 * @param activityId
+	 * @return
+	 */
+    List<ActivityPlanRewardDto> queryActivityPlanReward(@Param("activityId")Long activityId);
+
+	List<ActivityPlanReward> getDelRewardList(@Param("activityId")Long activityId,@Param("rewardIds")  List<Long> rewardIds);
+
+
+
+
+	/**
+	 * 减少库存
+	 *
+	 * @param activityId 活动id
+	 * @param rewardId   奖品id
+	 */
+	int reduceStock(@Param("activityId") Long activityId, @Param("rewardId") Long rewardId);
+}

+ 9 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityPlanStandardDao.java

@@ -0,0 +1,9 @@
+package com.yonge.cooleshow.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yonge.cooleshow.biz.dal.entity.ActivityPlanStandard;
+
+
+public interface ActivityPlanStandardDao extends BaseMapper<ActivityPlanStandard>{
+
+}

+ 29 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityRewardChangeStockDao.java

@@ -0,0 +1,29 @@
+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.ActivityRewardChangeStock;
+import com.yonge.cooleshow.biz.dal.vo.ActivityRewardChangeStockVo;
+import com.yonge.cooleshow.biz.dal.dto.search.ActivityRewardChangeStockSearch;
+
+
+public interface ActivityRewardChangeStockDao extends BaseMapper<ActivityRewardChangeStock>{
+    /**
+     * 查询详情
+     * @author liweifan
+     * @date 2022-08-18 09:36:05
+     * @return: com.yonge.cooleshow.biz.dal.vo.ActivityRewardChangeStockVo
+     */
+    ActivityRewardChangeStockVo detail(@Param("id") Long id);
+
+    /**
+     * 分页查询
+     * @author liweifan
+     * @date 2022-08-18 09:36:05
+     * @return: com.yonge.cooleshow.biz.dal.vo.ActivityRewardChangeStockVo
+     */
+    List<ActivityRewardChangeStockVo> selectPage(@Param("page") IPage page, @Param("param") ActivityRewardChangeStockSearch activityRewardChangeStock);
+}

+ 37 - 10
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityRewardDao.java

@@ -10,22 +10,49 @@ import com.yonge.cooleshow.biz.dal.vo.ActivityRewardVo;
 import com.yonge.cooleshow.biz.dal.dto.search.ActivityRewardSearch;
 
 
-public interface ActivityRewardDao extends BaseMapper<ActivityReward>{
-	/**
-	 * 查询详情
+public interface ActivityRewardDao extends BaseMapper<ActivityReward> {
+    /**
+     * 查询详情
+     *
      * @author liweifan
      * @date 2022-08-04 10:19:49
      * @return: com.yonge.cooleshow.biz.dal.vo.ActivityRewardVo
-	 */
-	ActivityRewardVo detail(@Param("id") Long id);
-	ActivityRewardVo detailByActivityId(@Param("id") Long id);
+     */
+    ActivityRewardVo detail(@Param("id") Long id);
 
-	/**
-	 * 分页查询
+    ActivityRewardVo detailByActivityId(@Param("id") Long id);
+
+    /**
+     * 分页查询
+     *
      * @author liweifan
      * @date 2022-08-04 10:19:49
      * @return: com.yonge.cooleshow.biz.dal.vo.ActivityRewardVo
-	 */
-	List<ActivityRewardVo> selectPage(@Param("page") IPage page, @Param("param") ActivityRewardSearch activityReward);
+     */
+    List<ActivityRewardVo> selectPage(@Param("page") IPage page, @Param("param") ActivityRewardSearch activityReward);
+
+    /**
+     * 列表查询
+     *
+     * @param activityReward
+     * @return
+     */
+    List<ActivityRewardVo> selectAll(@Param("param") ActivityRewardSearch activityReward);
+
+    /**
+     * 活动奖品
+     *
+     * @param activityPlanId 活动id
+     * @return
+     */
+    List<ActivityReward> getActivityReward(@Param("activityPlanId") Long activityPlanId);
 
+    /**
+     * 判断用户是否发过奖
+     *
+     * @param userId
+     * @param activityId
+     * @return
+     */
+    Boolean userRewarded(@Param("userId") Long userId, @Param("activityId") Long activityId);
 }

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

@@ -4,6 +4,7 @@ import java.util.List;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.biz.dal.vo.UserRewardVo;
 import org.apache.ibatis.annotations.Param;
 import com.yonge.cooleshow.biz.dal.entity.ActivityUserReward;
 import com.yonge.cooleshow.biz.dal.vo.ActivityUserRewardVo;
@@ -25,6 +26,6 @@ public interface ActivityUserRewardDao extends BaseMapper<ActivityUserReward>{
      * @date 2022-08-04 10:19:49
      * @return: com.yonge.cooleshow.biz.dal.vo.ActivityUserRewardVo
 	 */
-	List<ActivityUserRewardVo> selectPage(@Param("page") IPage page, @Param("param") ActivityUserRewardSearch activityUserReward);
+	List<UserRewardVo> selectPage(@Param("page") IPage page, @Param("param") ActivityUserRewardSearch activityUserReward);
 	
 }

+ 24 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/HomeDao.java

@@ -1,6 +1,10 @@
 package com.yonge.cooleshow.biz.dal.dao;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.biz.dal.dto.SubjectHomeSearch;
 import com.yonge.cooleshow.biz.dal.dto.req.TotalReq;
+import com.yonge.cooleshow.biz.dal.vo.SubjectHomeVo;
+import com.yonge.cooleshow.biz.dal.vo.TagTotalTeacher;
 import com.yonge.cooleshow.biz.dal.vo.res.HomeTotalStudent;
 import com.yonge.cooleshow.biz.dal.vo.res.HomeTotalTeacher;
 import com.yonge.cooleshow.biz.dal.vo.res.HomeUserToDoNum;
@@ -31,6 +35,7 @@ public interface HomeDao {
      * @return: java.util.List<com.yonge.cooleshow.biz.dal.vo.res.HomeTotalTeacher>
      */
     List<HomeTotalTeacher> totalTeacher(@Param("timeType") String timeType, @Param("param") TotalReq param);
+
     /***
      * 统计查询学生信息
      * @author liweifan
@@ -40,4 +45,23 @@ public interface HomeDao {
      * @return: java.util.List<com.yonge.cooleshow.biz.dal.vo.res.HomeTotalStudent>
      */
     List<HomeTotalStudent> totalStudent(@Param("timeType") String timeType, @Param("param") TotalReq param);
+
+    /**
+     * 点亮图标统计
+     *
+     * @param timeType
+     * @param query
+     * @return
+     */
+    List<TagTotalTeacher> tagTeacher(@Param("timeType") String timeType, @Param("param") TotalReq query);
+
+
+    /**
+     * 内容数据 声部列表
+     *
+     * @param page
+     * @param query
+     * @return
+     */
+    IPage<SubjectHomeVo> selectSubjectHome(@Param("page") IPage<SubjectHomeVo> page, @Param("query") SubjectHomeSearch query);
 }

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

@@ -0,0 +1,18 @@
+package com.yonge.cooleshow.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yonge.cooleshow.biz.dal.dto.search.UserFirstTimeSearch;
+import com.yonge.cooleshow.biz.dal.entity.UserFirstTime;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+
+public interface UserFirstTimeDao extends BaseMapper<UserFirstTime>{
+    /**
+     * 查询集合
+     * @param param
+     * @return
+     */
+    List<UserFirstTime> selectAllList(@Param("param") UserFirstTimeSearch param);
+}

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

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.dto;
 
 import com.yonge.cooleshow.biz.dal.entity.ActivityPlan;
 import com.yonge.cooleshow.biz.dal.entity.ActivityPlanEvaluation;
+import com.yonge.cooleshow.biz.dal.entity.ActivityPlanStandard;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -15,9 +16,22 @@ import javax.validation.Valid;
 public class ActivityPlanDto extends ActivityPlan{
 	private static final long serialVersionUID = 1L;
 
+	@ApiModelProperty(value = "操作人id",hidden = true)
+	private Long userId;
+
 	@ApiModelProperty(value = "活动计划-评测活动拓展")
 	private ActivityPlanEvaluation planEvaluation;
 
+	@ApiModelProperty(value = "活动计划-达标赠送活动拓展")
+	private ActivityPlanStandard planStandard;
+
+	public Long getUserId() {
+		return userId;
+	}
+
+	public void setUserId(Long userId) {
+		this.userId = userId;
+	}
 
 	public ActivityPlanEvaluation getPlanEvaluation() {
 		return planEvaluation;
@@ -26,4 +40,12 @@ public class ActivityPlanDto extends ActivityPlan{
 	public void setPlanEvaluation(ActivityPlanEvaluation planEvaluation) {
 		this.planEvaluation = planEvaluation;
 	}
+
+	public ActivityPlanStandard getPlanStandard() {
+		return planStandard;
+	}
+
+	public void setPlanStandard(ActivityPlanStandard planStandard) {
+		this.planStandard = planStandard;
+	}
 }

+ 26 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ActivityPlanRewardDto.java

@@ -0,0 +1,26 @@
+package com.yonge.cooleshow.biz.dal.dto;
+
+import com.yonge.cooleshow.biz.dal.entity.ActivityPlanReward;
+import com.yonge.cooleshow.biz.dal.entity.ActivityReward;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Author: liweifan
+ * @Data: 2022-08-17 11:13:13
+ */
+@ApiModel(value = "ActivityPlanRewardDto对象", description = "活动计划奖品表数据传输对象")
+public class ActivityPlanRewardDto extends ActivityPlanReward{
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty("奖品对象")
+	private ActivityReward activityReward;
+
+	public ActivityReward getActivityReward() {
+		return activityReward;
+	}
+
+	public void setActivityReward(ActivityReward activityReward) {
+		this.activityReward = activityReward;
+	}
+}

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

@@ -1,9 +1,7 @@
 package com.yonge.cooleshow.biz.dal.dto;
 
-import com.baomidou.mybatisplus.annotation.TableField;
 import com.yonge.cooleshow.biz.dal.entity.ActivityReward;
 import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
 
 /**
  * @Author: liweifan
@@ -13,14 +11,4 @@ import io.swagger.annotations.ApiModelProperty;
 public class ActivityRewardDto extends ActivityReward{
 	private static final long serialVersionUID = 1L;
 
-	@ApiModelProperty("创建状态 0 正式 1 草稿 ")
-	private Integer draftFlag;
-
-	public Integer getDraftFlag() {
-		return draftFlag;
-	}
-
-	public void setDraftFlag(Integer draftFlag) {
-		this.draftFlag = draftFlag;
-	}
 }

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

@@ -44,7 +44,7 @@ public class MusicSheetExport {
     private String musicSubjects;  //曲谱声部(适用的乐器,可能是多个,用逗号分隔)
 
     @ExcelProperty(value = "音乐人")
-    private String composer;  //作曲人
+    private String composer;  //音乐家
 
     @ExcelProperty(value = "指法是否展示",converter = YesOrNoConverter.class)
     @ApiModelProperty(value = "是否展示指法(0:否;1:是)")

+ 39 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/SubjectHomeSearch.java

@@ -0,0 +1,39 @@
+package com.yonge.cooleshow.biz.dal.dto;
+
+import com.yonge.toolset.base.page.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-08-16
+ */
+@ApiModel("内容数据-声部查询")
+public class SubjectHomeSearch extends QueryInfo {
+
+    @ApiModelProperty("排序类型 MUSIC:乐谱 PLATFORM_MUSIC:平台乐谱 TEACHER_MUSIC:老师乐谱 PRACTICE :陪练课 PIANO:琴房课  LIVE:直播课  VIDEO:视频课 ")
+    private String sortType;
+
+    @ApiModelProperty("desc:倒序 asc:正序")
+    private String order;
+
+    public String getSortType() {
+        return sortType;
+    }
+
+    public void setSortType(String sortType) {
+        this.sortType = sortType;
+    }
+
+    @Override
+    public String getOrder() {
+        return order;
+    }
+
+    @Override
+    public void setOrder(String order) {
+        this.order = order;
+    }
+}

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

@@ -0,0 +1,13 @@
+package com.yonge.cooleshow.biz.dal.dto;
+
+import io.swagger.annotations.ApiModel;
+
+import java.io.Serializable;
+
+@ApiModel(value = "UpdateRewardDto对象", description = "奖品修改对象")
+public class UpdateRewardDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+
+
+}

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

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.dto.req;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.yonge.cooleshow.biz.dal.enums.GenderEnum;
 import io.swagger.annotations.ApiModel;
@@ -56,6 +57,10 @@ public class TeacherApplyDetailReq implements Serializable {
     @ApiModelProperty("教师资格证 ")
     private String teacherCertificate;
 
+    @ApiModelProperty("老师风采视频json 格式:[{'videoUrl':'视频地址','cover':'视频封面地址'},{'videoUrl':'视频地址','cover':'视频封面地址'}] ,将单引号替换为双引号")
+    @NotBlank(message = "至少要有一个老师风采视频")
+    private String styleVideoJson;
+
     public Long getUserId() {
         return userId;
     }
@@ -73,7 +78,8 @@ public class TeacherApplyDetailReq implements Serializable {
             this.gender = GenderEnum.valueOf(Integer.parseInt(gender.toString()));
         }
     }
-/*
+
+    /*
     public void setGender(Object gender) {
         if(gender instanceof GenderEnum ){
             this.gender = (GenderEnum) gender;
@@ -82,7 +88,6 @@ public class TeacherApplyDetailReq implements Serializable {
         }
     }*/
 
-
     public Date getBirthdate() {
         return birthdate;
     }
@@ -162,4 +167,12 @@ public class TeacherApplyDetailReq implements Serializable {
     public void setIdCardNo(String idCardNo) {
         this.idCardNo = idCardNo;
     }
+
+    public String getStyleVideoJson() {
+        return styleVideoJson;
+    }
+
+    public void setStyleVideoJson(String styleVideoJson) {
+        this.styleVideoJson = styleVideoJson;
+    }
 }

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

@@ -0,0 +1,14 @@
+package com.yonge.cooleshow.biz.dal.dto.search;
+
+import com.yonge.toolset.base.page.QueryInfo;
+import io.swagger.annotations.ApiModel;
+
+/**
+ * @Author: liweifan
+ * @Data: 2022-08-17 11:13:13
+ */
+@ApiModel(value = "ActivityPlanRewardSearch对象", description = "活动计划奖品表查询对象")
+public class ActivityPlanRewardSearch extends QueryInfo{
+	private static final long serialVersionUID = 1L;
+
+}

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

@@ -1,11 +1,15 @@
 package com.yonge.cooleshow.biz.dal.dto.search;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.common.enums.ActivityTypeEnum;
 import com.yonge.toolset.base.page.QueryInfo;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import org.springframework.format.annotation.DateTimeFormat;
 
+import javax.validation.constraints.NotNull;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.util.Date;
@@ -19,6 +23,10 @@ public class ActivityPlanSearch extends QueryInfo{
 	private static final long serialVersionUID = 1L;
 	@ApiModelProperty("活动名称 ")
 	private String activityName;
+	@ApiModelProperty("客户端:STUDENT 学生端 TEACHER 老师端 ")
+	private ClientEnum activityClient;
+	@ApiModelProperty(value = "活动类型 EVALUATION 评测活动 STANDARD_GIFT 达标赠送")
+	private ActivityTypeEnum activityType;
 	@ApiModelProperty("创建状态 0 正式 1 草稿 ")
 	private Integer draftFlag;
 	@ApiModelProperty("活动状态 0 停用 1 启用 ")
@@ -40,6 +48,22 @@ public class ActivityPlanSearch extends QueryInfo{
 		this.activityName = activityName;
 	}
 
+	public ClientEnum getActivityClient() {
+		return activityClient;
+	}
+
+	public void setActivityClient(ClientEnum activityClient) {
+		this.activityClient = activityClient;
+	}
+
+	public ActivityTypeEnum getActivityType() {
+		return activityType;
+	}
+
+	public void setActivityType(ActivityTypeEnum activityType) {
+		this.activityType = activityType;
+	}
+
 	public Integer getDraftFlag() {
 		return draftFlag;
 	}

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

@@ -0,0 +1,89 @@
+package com.yonge.cooleshow.biz.dal.dto.search;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
+import com.yonge.toolset.base.page.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * @Author: liweifan
+ * @Data: 2022-08-17 16:28:03
+ */
+@ApiModel(value = "ActivityRewardChangeStockSearch对象", description = "活动奖品库存调整记录表查询对象")
+public class ActivityRewardChangeStockSearch extends QueryInfo{
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty(value = "变更来源:ADMIN 后台调整 ACTIVITY 活动分配 ",hidden = true)
+	private String source;
+
+	@ApiModelProperty(value = "奖品id ")
+	private Long rewardId;
+
+	@ApiModelProperty("调整类型: IN 增加 OUT 减少 ")
+	private InOrOutEnum changeType;
+
+	@ApiModelProperty(value = "操作人")
+	private String updateByName;
+
+	@ApiModelProperty(value = "活动开始时间")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private Date startTime;
+
+	@ApiModelProperty(value = "活动结束时间")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private Date endTime;
+
+	public Long getRewardId() {
+		return rewardId;
+	}
+
+	public void setRewardId(Long rewardId) {
+		this.rewardId = rewardId;
+	}
+
+	public InOrOutEnum getChangeType() {
+		return changeType;
+	}
+
+	public void setChangeType(InOrOutEnum changeType) {
+		this.changeType = changeType;
+	}
+
+	public String getSource() {
+		return source;
+	}
+
+	public void setSource(String source) {
+		this.source = source;
+	}
+
+	public String getUpdateByName() {
+		return updateByName;
+	}
+
+	public void setUpdateByName(String updateByName) {
+		this.updateByName = updateByName;
+	}
+
+	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;
+	}
+}

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

@@ -1,7 +1,10 @@
 package com.yonge.cooleshow.biz.dal.dto.search;
 
+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 io.swagger.models.auth.In;
 
 /**
  * @Author: liweifan
@@ -11,4 +14,47 @@ import io.swagger.annotations.ApiModel;
 public class ActivityRewardSearch extends QueryInfo{
 	private static final long serialVersionUID = 1L;
 
+	@ApiModelProperty("奖品名称 ")
+	private String rewardName;
+
+	@ApiModelProperty("状态 0 正常 1停用 ")
+	private Integer status;
+
+	@ApiModelProperty("客户端:STUDENT 学生端 TEACHER 老师端  多选 ")
+	private String rewardClient;
+
+	@ApiModelProperty("是否只查询有库存的数据 0 否 1 是")
+	private YesOrNoEnum hasStock;
+
+	public String getRewardName() {
+		return rewardName;
+	}
+
+	public void setRewardName(String rewardName) {
+		this.rewardName = rewardName;
+	}
+
+	public Integer getStatus() {
+		return status;
+	}
+
+	public void setStatus(Integer status) {
+		this.status = status;
+	}
+
+	public String getRewardClient() {
+		return rewardClient;
+	}
+
+	public void setRewardClient(String rewardClient) {
+		this.rewardClient = rewardClient;
+	}
+
+	public YesOrNoEnum getHasStock() {
+		return hasStock;
+	}
+
+	public void setHasStock(YesOrNoEnum hasStock) {
+		this.hasStock = hasStock;
+	}
 }

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

@@ -1,7 +1,13 @@
 package com.yonge.cooleshow.biz.dal.dto.search;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.yonge.toolset.base.page.QueryInfo;
 import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
 
 /**
  * @Author: liweifan
@@ -11,4 +17,67 @@ import io.swagger.annotations.ApiModel;
 public class ActivityUserRewardSearch extends QueryInfo{
 	private static final long serialVersionUID = 1L;
 
+
+	@ApiModelProperty("活动id")
+	@NotNull(message = "活动id不能为空")
+	private Long activityId;
+
+
+	@ApiModelProperty("真实姓名/编号/手机号")
+	private String search;
+
+	@ApiModelProperty("奖品id")
+	private Long  activityRewardId;
+
+	@ApiModelProperty("开始时间")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private Date startTime;
+
+	@ApiModelProperty("结束时间")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private Date endTime;
+
+	public Long getActivityId() {
+		return activityId;
+	}
+
+	public void setActivityId(Long activityId) {
+		this.activityId = activityId;
+	}
+
+	@Override
+	public String getSearch() {
+		return search;
+	}
+
+	@Override
+	public void setSearch(String search) {
+		this.search = search;
+	}
+
+	public Long getActivityRewardId() {
+		return activityRewardId;
+	}
+
+	public void setActivityRewardId(Long activityRewardId) {
+		this.activityRewardId = activityRewardId;
+	}
+
+	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;
+	}
 }

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

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.dto.search;
 
+import com.yonge.cooleshow.biz.dal.enums.AccompanimentTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
 import com.yonge.cooleshow.biz.dal.enums.ChargeTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
@@ -42,7 +43,7 @@ public class MusicSheetSearch  extends QueryInfo{
     @ApiModelProperty("曲目状态(0:停用,1:启用))")
     private YesOrNoEnum state;
 
-    @ApiModelProperty("曲目审核状态(DOING:待审核;PASS:通过;UNPASS:未通过)")
+    @ApiModelProperty("曲目审核状态(DOING:待审核;PASS:通过;UNPASS:未通过 OUT_SALE : 下架)")
     private AuthStatusEnum auditStatus;
 
     @ApiModelProperty(value = "创建人id (老师id)")
@@ -67,6 +68,17 @@ public class MusicSheetSearch  extends QueryInfo{
     @ApiModelProperty(value = "是否审核时可见 (0:否  1:是)",hidden = true)
     private YesOrNoEnum auditVersion;
 
+    @ApiModelProperty(value = "伴奏类型 HOMEMODE:自制伴奏  COMMON:普通伴奏")
+    private AccompanimentTypeEnum accompanimentType;
+
+    public AccompanimentTypeEnum getAccompanimentType() {
+        return accompanimentType;
+    }
+
+    public void setAccompanimentType(AccompanimentTypeEnum accompanimentType) {
+        this.accompanimentType = accompanimentType;
+    }
+
     public YesOrNoEnum getAuditVersion() {
         return auditVersion;
     }

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

@@ -22,7 +22,7 @@ public class TeacherMusicSheetSearch extends QueryInfo{
     @NotNull(message = "老师ID不为空")
     private Long teacherId;
 
-    @ApiModelProperty("乐谱编号/名称/作曲人")
+    @ApiModelProperty("乐谱编号/名称/音乐家")
     private String idAndName;
 
     @ApiModelProperty(value = "上传开始时间")

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

@@ -14,6 +14,12 @@ public class TeacherSearch extends QueryInfo{
     private String search;
     @ApiModelProperty(value = "老师类型 TOURIST 游客 ENTRY 认证老师 MUSICIAN 平台音乐人")
     private String teacherType;
+    
+    @ApiModelProperty(value = "徽章(STYLE-个人风采  LIVE-直播  VIDEO-视频课  MUSIC-曲谱)")
+    private String tag;
+    
+    @ApiModelProperty(value = "是否会员(0-否 1-是)")
+    private Integer isVip;
 
     public String getSearch() {
         return search;
@@ -30,4 +36,20 @@ public class TeacherSearch extends QueryInfo{
     public void setTeacherType(String teacherType) {
         this.teacherType = teacherType;
     }
+
+	public String getTag() {
+		return tag;
+	}
+
+	public void setTag(String tag) {
+		this.tag = tag;
+	}
+
+	public Integer getIsVip() {
+		return isVip;
+	}
+
+	public void setIsVip(Integer isVip) {
+		this.isVip = isVip;
+	}
 }

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

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.dto.search;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.page.QueryInfo;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -31,6 +32,8 @@ public class TeacherStyleVideoSearch extends QueryInfo{
     private Date endTime;
     @ApiModelProperty(value = "审核状态  UNPAALY、未申请 DOING、审核中 PASS、通过 UNPASS、不通过")
     private AuthStatusEnum authStatus;
+    @ApiModelProperty(value = "入驻视频 0 否 1是 ",hidden = true)
+    private YesOrNoEnum entryFlag;
 
     public String getSearch() {
         return search;
@@ -71,4 +74,12 @@ public class TeacherStyleVideoSearch extends QueryInfo{
     public void setAuthStatus(AuthStatusEnum authStatus) {
         this.authStatus = authStatus;
     }
+
+    public YesOrNoEnum getEntryFlag() {
+        return entryFlag;
+    }
+
+    public void setEntryFlag(YesOrNoEnum entryFlag) {
+        this.entryFlag = entryFlag;
+    }
 }

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

@@ -0,0 +1,75 @@
+package com.yonge.cooleshow.biz.dal.dto.search;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.common.enums.UserFirstTimeTypeEnum;
+import com.yonge.toolset.base.page.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * @Author: liweifan
+ * @Data: 2022-08-18 10:03:38
+ */
+@ApiModel(value = "UserFirstTimeSearch对象", description = "时间记录表查询对象")
+public class UserFirstTimeSearch extends QueryInfo{
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty("用户id ")
+	private Long userId;
+	@ApiModelProperty("用户类型:STUDENT 学生 TEACHER 老师 ")
+	private String userType;
+	@ApiModelProperty("时间类型:ENTRY 达人认证 LIVEING 开通直播 ")
+	private String timeType;
+	@ApiModelProperty(value = "活动开始时间")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private Date startTime;
+	@ApiModelProperty(value = "活动结束时间")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private Date endTime;
+
+	public Long getUserId() {
+		return userId;
+	}
+
+	public void setUserId(Long userId) {
+		this.userId = userId;
+	}
+
+	public String getUserType() {
+		return userType;
+	}
+
+	public void setUserType(String userType) {
+		this.userType = userType;
+	}
+
+	public String getTimeType() {
+		return timeType;
+	}
+
+	public void setTimeType(String timeType) {
+		this.timeType = timeType;
+	}
+
+	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;
+	}
+}

+ 70 - 61
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityPlan.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.common.enums.ActivityTypeEnum;
 import com.yonge.cooleshow.common.enums.RegistrationMethodEnum;
 import io.swagger.annotations.ApiModel;
@@ -11,6 +12,7 @@ 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;
 
@@ -25,218 +27,217 @@ import java.math.BigDecimal;
 @TableName("activity_plan")
 @ApiModel(value = "ActivityPlan对象", description = "活动计划表")
 public class ActivityPlan implements Serializable {
-	private static final long serialVersionUID = 1L;
+    private static final long serialVersionUID = 1L;
     @ApiModelProperty("主键 ")
     @TableId(value = "id_", type = IdType.AUTO)
     private Long id;
-    @ApiModelProperty(value = "活动类型 EVALUATION 评测活动 ",required = true)
-	@TableField(value = "activity_type_")
+    @ApiModelProperty(value = "活动类型 EVALUATION 评测活动 STANDARD_GIFT 达标赠送", required = true)
+    @TableField(value = "activity_type_")
     @NotNull(message = "活动类型不能为空")
     private ActivityTypeEnum activityType;
+    @ApiModelProperty(value = "活动应用:STUDENT 学生端 TEACHER 老师端", required = true)
+    @TableField(value = "activity_client_")
+    @NotNull(message = "活动应用不能为空")
+    private ClientEnum activityClient;
     @ApiModelProperty("活动名称 ")
-	@TableField(value = "activity_name_")
+    @TableField(value = "activity_name_")
     @NotBlank(message = "活动名称不能为空")
     private String activityName;
     @ApiModelProperty("活动描述 ")
-	@TableField(value = "describe_")
+    @TableField(value = "describe_")
     @NotBlank(message = "活动描述不能为空")
     private String describe;
     @ApiModelProperty("规则描述 ")
-	@TableField(value = "rule_describe_")
-    @NotBlank(message = "活动规则不能为空")
+    @TableField(value = "rule_describe_")
     private String ruleDescribe;
     @ApiModelProperty("主题图片 ")
-	@TableField(value = "subject_url_")
-    @NotBlank(message = "主题图片不能为空")
+    @TableField(value = "subject_url_")
     private String subjectUrl;
     @ApiModelProperty("平铺背景 ")
-	@TableField(value = "background_url_")
-    @NotBlank(message = "平铺背景不能为空")
+    @TableField(value = "background_url_")
     private String backgroundUrl;
     @ApiModelProperty("分享图片 ")
     @TableField(value = "share_url_")
-    @NotBlank(message = "分享图片不能为空")
     private String shareUrl;
     @ApiModelProperty("活动链接 ")
     @TableField(value = "activity_url_")
     private String activityUrl;
     @ApiModelProperty("活动时间-开始 ")
-	@TableField(value = "activity_start_")
+    @TableField(value = "activity_start_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     @NotNull(message = "活动开始时间不能为空")
     private Date activityStart;
     @ApiModelProperty("活动时间-结束 ")
-	@TableField(value = "activity_end_")
+    @TableField(value = "activity_end_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     @NotNull(message = "活动结束时间不能为空")
     private Date activityEnd;
     @ApiModelProperty("报名方式 FREE 免费 CHARGE 收费 ")
-	@TableField(value = "registration_method_")
-    @NotNull(message = "报名缴费方式不能为空")
+    @TableField(value = "registration_method_")
     private RegistrationMethodEnum registrationMethod;
     @ApiModelProperty("报名价格 ")
-	@TableField(value = "registration_price_")
+    @TableField(value = "registration_price_")
     private BigDecimal registrationPrice;
     @ApiModelProperty("分润比例 ")
     @TableField(value = "share_rate_")
     private BigDecimal shareRate;
     @ApiModelProperty("创建状态 0 正式 1 草稿 ")
-	@TableField(value = "draft_flag_")
+    @TableField(value = "draft_flag_")
     private Integer draftFlag;
     @ApiModelProperty("活动状态 0 停用 1 启用 ")
-	@TableField(value = "activity_state_")
+    @TableField(value = "activity_state_")
     private Integer activityState;
-    @ApiModelProperty("发奖状态 0 未发奖 1 已发奖 ")
+    @ApiModelProperty("发奖状态(完成状态) 0 未发奖 1 已发奖 ")
     @TableField(value = "reward_flag_")
     private Integer rewardFlag;
     @ApiModelProperty("创建时间 ")
-	@TableField(value = "create_time_")
+    @TableField(value = "create_time_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date createTime;
     @ApiModelProperty("创建人 ")
-	@TableField(value = "create_by_")
+    @TableField(value = "create_by_")
     private Long createBy;
     @ApiModelProperty("更新时间 ")
-	@TableField(value = "update_time_")
+    @TableField(value = "update_time_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date updateTime;
     @ApiModelProperty("更新人 ")
-	@TableField(value = "update_by_")
+    @TableField(value = "update_by_")
     private Long updateBy;
 
-	public Long getId() {
+    public Long getId() {
         return id;
     }
 
     public void setId(Long id) {
         this.id = id;
     }
-    
-	public ActivityTypeEnum getActivityType() {
+
+    public ActivityTypeEnum getActivityType() {
         return activityType;
     }
 
     public void setActivityType(ActivityTypeEnum activityType) {
         this.activityType = activityType;
     }
-    
-	public String getActivityName() {
+
+    public String getActivityName() {
         return activityName;
     }
 
     public void setActivityName(String activityName) {
         this.activityName = activityName;
     }
-    
-	public String getDescribe() {
+
+    public String getDescribe() {
         return describe;
     }
 
     public void setDescribe(String describe) {
         this.describe = describe;
     }
-    
-	public String getRuleDescribe() {
+
+    public String getRuleDescribe() {
         return ruleDescribe;
     }
 
     public void setRuleDescribe(String ruleDescribe) {
         this.ruleDescribe = ruleDescribe;
     }
-    
-	public String getSubjectUrl() {
+
+    public String getSubjectUrl() {
         return subjectUrl;
     }
 
     public void setSubjectUrl(String subjectUrl) {
         this.subjectUrl = subjectUrl;
     }
-    
-	public String getBackgroundUrl() {
+
+    public String getBackgroundUrl() {
         return backgroundUrl;
     }
 
     public void setBackgroundUrl(String backgroundUrl) {
         this.backgroundUrl = backgroundUrl;
     }
-    
-	public Date getActivityStart() {
+
+    public Date getActivityStart() {
         return activityStart;
     }
 
     public void setActivityStart(Date activityStart) {
         this.activityStart = activityStart;
     }
-    
-	public Date getActivityEnd() {
+
+    public Date getActivityEnd() {
         return activityEnd;
     }
 
     public void setActivityEnd(Date activityEnd) {
         this.activityEnd = activityEnd;
     }
-    
-	public RegistrationMethodEnum getRegistrationMethod() {
+
+    public RegistrationMethodEnum getRegistrationMethod() {
         return registrationMethod;
     }
 
     public void setRegistrationMethod(RegistrationMethodEnum registrationMethod) {
         this.registrationMethod = registrationMethod;
     }
-    
-	public BigDecimal getRegistrationPrice() {
+
+    public BigDecimal getRegistrationPrice() {
         return registrationPrice;
     }
 
     public void setRegistrationPrice(BigDecimal registrationPrice) {
         this.registrationPrice = registrationPrice;
     }
-    
-	public Integer getDraftFlag() {
+
+    public Integer getDraftFlag() {
         return draftFlag;
     }
 
     public void setDraftFlag(Integer draftFlag) {
         this.draftFlag = draftFlag;
     }
-    
-	public Integer getActivityState() {
+
+    public Integer getActivityState() {
         return activityState;
     }
 
     public void setActivityState(Integer activityState) {
         this.activityState = activityState;
     }
-    
-	public Date getCreateTime() {
+
+    public Date getCreateTime() {
         return createTime;
     }
 
     public void setCreateTime(Date createTime) {
         this.createTime = createTime;
     }
-    
-	public Long getCreateBy() {
+
+    public Long getCreateBy() {
         return createBy;
     }
 
     public void setCreateBy(Long createBy) {
         this.createBy = createBy;
     }
-    
-	public Date getUpdateTime() {
+
+    public Date getUpdateTime() {
         return updateTime;
     }
 
     public void setUpdateTime(Date updateTime) {
         this.updateTime = updateTime;
     }
-    
-	public Long getUpdateBy() {
+
+    public Long getUpdateBy() {
         return updateBy;
     }
 
@@ -275,4 +276,12 @@ public class ActivityPlan implements Serializable {
     public void setRewardFlag(Integer rewardFlag) {
         this.rewardFlag = rewardFlag;
     }
+
+    public ClientEnum getActivityClient() {
+        return activityClient;
+    }
+
+    public void setActivityClient(ClientEnum activityClient) {
+        this.activityClient = activityClient;
+    }
 }

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

@@ -1,6 +1,5 @@
 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;

+ 88 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityPlanReward.java

@@ -0,0 +1,88 @@
+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 java.io.Serializable;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Positive;
+import javax.validation.constraints.PositiveOrZero;
+
+/**
+ * 活动计划奖品表
+ */
+@TableName("activity_plan_reward")
+@ApiModel(value = "ActivityPlanReward对象", description = "活动计划奖品表")
+public class ActivityPlanReward implements Serializable {
+	private static final long serialVersionUID = 1L;
+    @ApiModelProperty("主键 ")
+    @TableId(value = "id_", type = IdType.AUTO)
+    private Long id;
+    @ApiModelProperty("活动id ")
+	@TableField(value = "activity_id_")
+    @NotNull(message = "活动id不能为空")
+    private Long activityId;
+    @ApiModelProperty("奖品id ")
+	@TableField(value = "reward_id_")
+    @NotNull(message = "奖品id不能为空")
+    private Long rewardId;
+    @ApiModelProperty("奖品数量 ")
+	@TableField(value = "reward_num_")
+    @NotNull(message = "奖品数量不能为空")
+    @PositiveOrZero(message = "奖品数量必须大于等于0")
+    private Integer rewardNum;
+    @ApiModelProperty("创建时间 ")
+	@TableField(value = "create_time_")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date createTime;
+
+	public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+    
+	public Long getActivityId() {
+        return activityId;
+    }
+
+    public void setActivityId(Long activityId) {
+        this.activityId = activityId;
+    }
+    
+	public Long getRewardId() {
+        return rewardId;
+    }
+
+    public void setRewardId(Long rewardId) {
+        this.rewardId = rewardId;
+    }
+    
+	public Integer getRewardNum() {
+        return rewardNum;
+    }
+
+    public void setRewardNum(Integer rewardNum) {
+        this.rewardNum = rewardNum;
+    }
+    
+	public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+    
+}

+ 103 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityPlanStandard.java

@@ -0,0 +1,103 @@
+package com.yonge.cooleshow.biz.dal.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.yonge.cooleshow.common.enums.ConditionMethodEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * 活动计划-达标赠送活动拓展字段表
+ */
+@TableName("activity_plan_standard")
+@ApiModel(value = "ActivityPlanStandard对象", description = "活动计划-达标赠送活动拓展字段表")
+public class ActivityPlanStandard implements Serializable {
+	private static final long serialVersionUID = 1L;
+    @ApiModelProperty("主键 ")
+    @TableId(value = "id_")
+    private Long id;
+    @ApiModelProperty("达标条件:ENTRY 达人认证 LIVEING 开通直播 PRACTICE 首次完成陪练课设置 LIVE 首次创建直播课 VIDEO 首次创建视频课 BIND_STUDENT 学员绑定 REGISTER_STUDENT 学员注册 REGISTER_TEACHER 老师注册")
+	@TableField(value = "condition_")
+    private String condition;
+    @ApiModelProperty("计算方式:AND 全部满足 OR 满足其一 ")
+	@TableField(value = "calculation_method")
+    private ConditionMethodEnum calculationMethod;
+    @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 = "create_by_")
+    private Long createBy;
+    @ApiModelProperty("更新时间 ")
+    @TableField(value = "update_time_")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date updateTime;
+    @ApiModelProperty("更新人 ")
+    @TableField(value = "update_by_")
+    private Long updateBy;
+
+	public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+	public String getCondition() {
+        return condition;
+    }
+
+    public void setCondition(String condition) {
+        this.condition = condition;
+    }
+    
+	public ConditionMethodEnum getCalculationMethod() {
+        return calculationMethod;
+    }
+
+    public void setCalculationMethod(ConditionMethodEnum calculationMethod) {
+        this.calculationMethod = calculationMethod;
+    }
+    
+	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;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public Long getUpdateBy() {
+        return updateBy;
+    }
+
+    public void setUpdateBy(Long updateBy) {
+        this.updateBy = updateBy;
+    }
+}

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

@@ -4,6 +4,9 @@ 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.RewardTypeEnum;
+import com.yonge.cooleshow.common.enums.UnitEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -14,6 +17,9 @@ import org.springframework.format.annotation.DateTimeFormat;
 
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Positive;
+import javax.validation.constraints.PositiveOrZero;
+
 
 /**
  * 活动奖品表
@@ -21,33 +27,54 @@ import javax.validation.constraints.NotNull;
 @TableName("activity_reward")
 @ApiModel(value = "ActivityReward对象", description = "活动奖品表")
 public class ActivityReward implements Serializable {
-	private static final long serialVersionUID = 1L;
+    private static final long serialVersionUID = 1L;
+
     @ApiModelProperty("主键 ")
     @TableId(value = "id_", type = IdType.AUTO)
     private Long id;
-    @ApiModelProperty("活动id ")
-	@TableField(value = "activity_id_")
-    @NotNull(message = "活动id不能为空")
+    @ApiModelProperty("活动id(评测活动冗余) ")
+    @TableField(value = "activity_id_")
     private Long activityId;
+    @ApiModelProperty("客户端:STUDENT 学生端 TEACHER 老师端  多选 ")
+    @TableField(value = "reward_client_")
+    @NotBlank(message = "客户端不能为空")
+    private String rewardClient;
     @ApiModelProperty("奖品名称 ")
-	@TableField(value = "reward_name_")
+    @TableField(value = "reward_name_")
     @NotBlank(message = "奖品名称不能为空")
     private String rewardName;
+    @ApiModelProperty("奖品类型:  ACTUAL 实物 VIP 小酷AI会员 PIAMO_ROOM 琴房时长 ")
+    @TableField(value = "reward_type_")
+    @NotNull(message = "奖品类型不能为空")
+    private RewardTypeEnum rewardType;
     @ApiModelProperty("奖品描述 ")
-	@TableField(value = "reward_describe_")
-    @NotBlank(message = "奖品描述不能为空")
+    @TableField(value = "reward_describe_")
     private String rewardDescribe;
     @ApiModelProperty("奖品图片 ")
-	@TableField(value = "img_url_")
+    @TableField(value = "img_url_")
     @NotBlank(message = "奖品图片不能为空")
     private String imgUrl;
+    @ApiModelProperty("库存数 ")
+    @TableField(value = "stock_")
+    @NotNull(message = "库存数不能为空")
+    @PositiveOrZero(message = "库存数必须大于等于0")
+    private Integer stock;
+    @ApiModelProperty("数量(每个奖品) ")
+    @TableField(value = "num_")
+    private Integer num;
+    @ApiModelProperty("单位 DAY 天 MONTH 月 YEAR 年")
+    @TableField(value = "unit_")
+    private UnitEnum unit;
+    @ApiModelProperty("状态 0 正常 1停用 ")
+    @TableField(value = "status_")
+    private Integer status;
     @ApiModelProperty("创建时间 ")
-	@TableField(value = "create_time_")
+    @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 = "create_by_")
+    @TableField(value = "create_by_")
     private Long createBy;
     @ApiModelProperty("更新时间 ")
     @TableField(value = "update_time_")
@@ -58,55 +85,103 @@ public class ActivityReward implements Serializable {
     @TableField(value = "update_by_")
     private Long updateBy;
 
-	public Long getId() {
+    public Long getId() {
         return id;
     }
 
     public void setId(Long id) {
         this.id = id;
     }
-    
-	public Long getActivityId() {
+
+    public Long getActivityId() {
         return activityId;
     }
 
     public void setActivityId(Long activityId) {
         this.activityId = activityId;
     }
-    
-	public String getRewardName() {
+
+    public String getRewardClient() {
+        return rewardClient;
+    }
+
+    public void setRewardClient(String rewardClient) {
+        this.rewardClient = rewardClient;
+    }
+
+    public String getRewardName() {
         return rewardName;
     }
 
     public void setRewardName(String rewardName) {
         this.rewardName = rewardName;
     }
-    
-	public String getRewardDescribe() {
+
+    public RewardTypeEnum getRewardType() {
+        return rewardType;
+    }
+
+    public void setRewardType(RewardTypeEnum rewardType) {
+        this.rewardType = rewardType;
+    }
+
+    public String getRewardDescribe() {
         return rewardDescribe;
     }
 
     public void setRewardDescribe(String rewardDescribe) {
         this.rewardDescribe = rewardDescribe;
     }
-    
-	public String getImgUrl() {
+
+    public String getImgUrl() {
         return imgUrl;
     }
 
     public void setImgUrl(String imgUrl) {
         this.imgUrl = imgUrl;
     }
-    
-	public Date getCreateTime() {
+
+    public Integer getStock() {
+        return stock;
+    }
+
+    public void setStock(Integer stock) {
+        this.stock = stock;
+    }
+
+    public Integer getNum() {
+        return num;
+    }
+
+    public void setNum(Integer num) {
+        this.num = num;
+    }
+
+    public UnitEnum getUnit() {
+        return unit;
+    }
+
+    public void setUnit(UnitEnum unit) {
+        this.unit = unit;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Date getCreateTime() {
         return createTime;
     }
 
     public void setCreateTime(Date createTime) {
         this.createTime = createTime;
     }
-    
-	public Long getCreateBy() {
+
+    public Long getCreateBy() {
         return createBy;
     }
 

+ 110 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityRewardChangeStock.java

@@ -0,0 +1,110 @@
+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.InOrOutEnum;
+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;
+import javax.validation.constraints.Positive;
+
+/**
+ * 活动奖品库存调整记录表
+ */
+@TableName("activity_reward_change_stock")
+@ApiModel(value = "ActivityRewardChangeStock对象", description = "活动奖品库存调整记录表")
+public class ActivityRewardChangeStock implements Serializable {
+	private static final long serialVersionUID = 1L;
+    @ApiModelProperty("主键 ")
+    @TableId(value = "id_", type = IdType.AUTO)
+    private Long id;
+    @ApiModelProperty("奖品id ")
+	@TableField(value = "reward_id_")
+    @NotNull(message = "奖品id不能为空")
+    private Long rewardId;
+    @ApiModelProperty("调整库存数 ")
+	@TableField(value = "stock_")
+    @NotNull(message = "调整库存数不能为空")
+    @Positive(message = "调整库存数必须大于0")
+    private Integer stock;
+    @ApiModelProperty("调整类型: IN 增加 OUT 减少 ")
+	@TableField(value = "change_type_")
+    @NotNull(message = "调整类型不能为空")
+    private InOrOutEnum changeType;
+    @ApiModelProperty("变更来源:ADMIN 后台调整 ACTIVITY 活动分配 ")
+    @TableField(value = "source_")
+    private String source;
+    @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 = "create_by_")
+    private Long createBy;
+
+	public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+    
+	public Long getRewardId() {
+        return rewardId;
+    }
+
+    public void setRewardId(Long rewardId) {
+        this.rewardId = rewardId;
+    }
+    
+	public Integer getStock() {
+        return stock;
+    }
+
+    public void setStock(Integer stock) {
+        this.stock = stock;
+    }
+    
+	public InOrOutEnum getChangeType() {
+        return changeType;
+    }
+
+    public void setChangeType(InOrOutEnum changeType) {
+        this.changeType = changeType;
+    }
+
+    public String getSource() {
+        return source;
+    }
+
+    public void setSource(String source) {
+        this.source = source;
+    }
+
+    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;
+    }
+    
+}

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

@@ -34,6 +34,9 @@ public class ActivityUserReward implements Serializable {
     @ApiModelProperty("奖品id ")
     @TableField(value = "reward_id_")
     private Long rewardId;
+    @ApiModelProperty("是否成功发放 0 否 1 是")
+    @TableField(value = "grant_flag_")
+    private Integer grantFlag;
     @ApiModelProperty("是否领取奖品 0 否 1 是 ")
     @TableField(value = "receive_flag_")
     private Integer receiveFlag;
@@ -88,6 +91,14 @@ public class ActivityUserReward implements Serializable {
         this.rewardId = rewardId;
     }
 
+    public Integer getGrantFlag() {
+        return grantFlag;
+    }
+
+    public void setGrantFlag(Integer grantFlag) {
+        this.grantFlag = grantFlag;
+    }
+
     public Integer getReceiveFlag() {
         return receiveFlag;
     }

+ 31 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicSheet.java

@@ -34,6 +34,12 @@ public class MusicSheet implements Serializable {
     @ApiModelProperty(value = "曲谱名称")
     private String musicSheetName;  //曲谱名称
 
+
+	@NotBlank(message = "曲谱封面图不能为空!")
+	@TableField("title_img_")
+	@ApiModelProperty(value = "封面图")
+	private String titleImg;  //曲谱名称
+
     @TableField("user_id_")
     @ApiModelProperty(value = "曲谱来源(平台用户ID或者是老师ID)")
     private Long userId;  //曲谱来源(平台用户ID或者是老师ID)
@@ -46,11 +52,11 @@ public class MusicSheet implements Serializable {
 	@ApiModelProperty(value = "曲目来源类型 TEACHER 老师 PLATFORM 平台")
 	private SourceTypeEnum sourceType;
 
-    @NotBlank(message = "音乐人不能为空!")
-    @Size(max = 32, message = "音乐人长度不能超过32位!")
+    @NotBlank(message = "艺术家不能为空!")
+    @Size(max = 32, message = "艺术家长度不能超过32位!")
     @TableField("composer_")
-    @ApiModelProperty(value = "音乐人")
-    private String composer;  //作曲人
+    @ApiModelProperty(value = "艺术家")
+    private String composer;  //音乐家
 
     @TableField("music_subject_")
     @ApiModelProperty(value = "曲谱声部(适用的乐器,可能是多个,用逗号分隔)")
@@ -70,6 +76,11 @@ public class MusicSheet implements Serializable {
     @ApiModelProperty(value = "曲谱标签(多个标签用逗号分隔)")
     private String musicTag;  //曲谱标签(多个标签用逗号分隔)
 
+	@NotNull(message = "伴奏类型不能为空!")
+	@TableField("accompaniment_type_")
+	@ApiModelProperty(value = "伴奏类型 HOMEMODE:自制伴奏  COMMON:普通伴奏")
+	private AccompanimentTypeEnum accompanimentType;
+
     @TableField("play_speed_")
 	// @NotNull(message = "默认播放速度不能为空!")
     @ApiModelProperty(value = "默认播放速度")
@@ -183,6 +194,22 @@ public class MusicSheet implements Serializable {
 	@ApiModelProperty(value = "假删除标识 0:未删除 1:已删除")
 	private Boolean delFlag;
 
+	public AccompanimentTypeEnum getAccompanimentType() {
+		return accompanimentType;
+	}
+
+	public void setAccompanimentType(AccompanimentTypeEnum accompanimentType) {
+		this.accompanimentType = accompanimentType;
+	}
+
+	public String getTitleImg() {
+		return titleImg;
+	}
+
+	public void setTitleImg(String titleImg) {
+		this.titleImg = titleImg;
+	}
+
 	public String getReason() {
 		return reason;
 	}

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

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
+import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -53,6 +54,29 @@ public class PianoRoomChangeRecord implements Serializable {
     @TableField(value = "create_by_")
     private Long createBy;
 
+    @ApiModelProperty("来源   ACTIVITY:活动  PLATFORM:平台")
+    @TableField(value = "source_type_")
+    private SourceTypeEnum sourceType;
+
+    @ApiModelProperty("活动id ")
+    @TableField(value = "biz_id_")
+    private String bizId;
+
+    public SourceTypeEnum getSourceType() {
+        return sourceType;
+    }
+
+    public void setSourceType(SourceTypeEnum sourceType) {
+        this.sourceType = sourceType;
+    }
+
+    public String getBizId() {
+        return bizId;
+    }
+
+    public void setBizId(String bizId) {
+        this.bizId = bizId;
+    }
 
     public Long getId() {
         return id;

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

@@ -1,6 +1,5 @@
 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;
@@ -52,6 +51,36 @@ public class StudentTime implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
     private Date firstMallTime;
 
+    @ApiModelProperty("第一次购买时间 ")
+    @TableField(value = "first_pay_time_")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date firstPayTime;
+
+
+
+    @ApiModelProperty("第一次活动购买时间 ")
+    @TableField(value = "first_activity_time_")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date firstActivityTime;
+
+    public Date getFirstActivityTime() {
+        return firstActivityTime;
+    }
+
+    public void setFirstActivityTime(Date firstActivityTime) {
+        this.firstActivityTime = firstActivityTime;
+    }
+
+    public Date getFirstPayTime() {
+        return firstPayTime;
+    }
+
+    public void setFirstPayTime(Date firstPayTime) {
+        this.firstPayTime = firstPayTime;
+    }
+
     public Long getUserId() {
         return userId;
     }

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

@@ -131,6 +131,24 @@ public class Teacher implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
     private Date liveDate;
 
+    @ApiModelProperty("曲目点亮时间 ")
+    @TableField(value = "music_date_")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date musicDate;
+
+    @ApiModelProperty("视频课图标点亮时间 ")
+    @TableField(value = "video_date_")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date videoDate;
+
+    @ApiModelProperty("个人风采图标点亮时间 ")
+    @TableField(value = "style_date_")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date styleDate;
+
     /**
      * 会员等级
      */
@@ -169,6 +187,31 @@ public class Teacher implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
     private Date updateTime;
 
+
+    public Date getMusicDate() {
+        return musicDate;
+    }
+
+    public void setMusicDate(Date musicDate) {
+        this.musicDate = musicDate;
+    }
+
+    public Date getVideoDate() {
+        return videoDate;
+    }
+
+    public void setVideoDate(Date videoDate) {
+        this.videoDate = videoDate;
+    }
+
+    public Date getStyleDate() {
+        return styleDate;
+    }
+
+    public void setStyleDate(Date styleDate) {
+        this.styleDate = styleDate;
+    }
+
     public String getTag() {
         return tag;
     }

+ 14 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TeacherAuthEntryRecord.java

@@ -78,6 +78,12 @@ public class TeacherAuthEntryRecord implements Serializable {
 	@TableField(value = "teacher_certificate_")
     private String teacherCertificate;
 
+    @ApiModelProperty("老师风采视频json 格式:[{'videoUrl':'视频地址','cover':'视频地址'},{'videoUrl':'视频地址','cover':'视频地址'}] ,将单引号替换为双引号")
+    @TableField(value = "style_video_json_")
+    private String styleVideoJson;
+    /**
+     * 达人认证审核状态 UNPAALY、未申请 DOING、审核中 PASS、通过 UNPASS、不通过
+     */
     @ApiModelProperty("达人认证审核状态 UNPAALY、未申请 DOING、审核中 PASS、通过 UNPASS、不通过")
 	@TableField(value = "teacher_auth_status_")
     private AuthStatusEnum teacherAuthStatus;
@@ -176,6 +182,14 @@ public class TeacherAuthEntryRecord implements Serializable {
         this.teacherCertificate = teacherCertificate;
     }
 
+    public String getStyleVideoJson() {
+        return styleVideoJson;
+    }
+
+    public void setStyleVideoJson(String styleVideoJson) {
+        this.styleVideoJson = styleVideoJson;
+    }
+
     public AuthStatusEnum getTeacherAuthStatus() {
         return teacherAuthStatus;
     }

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

@@ -50,6 +50,9 @@ public class TeacherStyleVideo implements Serializable {
     @ApiModelProperty("审核理由 ")
     @TableField(value = "reason_")
     private String reason;
+    @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")
@@ -142,6 +145,14 @@ public class TeacherStyleVideo implements Serializable {
         this.reason = reason;
     }
 
+    public YesOrNoEnum getEntryFlag() {
+        return entryFlag;
+    }
+
+    public void setEntryFlag(YesOrNoEnum entryFlag) {
+        this.entryFlag = entryFlag;
+    }
+
     public Date getCreateTime() {
         return createTime;
     }

+ 105 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserFirstTime.java

@@ -0,0 +1,105 @@
+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.UserFirstTimeTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * 时间记录表
+ */
+@TableName("user_first_time")
+@ApiModel(value = "UserFirstTime对象", description = "时间记录表")
+public class UserFirstTime 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 = "user_type_")
+    private ClientEnum userType;
+    @ApiModelProperty("时间类型:ENTRY 达人认证 LIVEING 开通直播 ")
+	@TableField(value = "time_type_")
+    private UserFirstTimeTypeEnum timeType;
+    @ApiModelProperty("时间点 ")
+	@TableField(value = "time_")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date time;
+    @ApiModelProperty("创建时间 ")
+	@TableField(value = "create_time_")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date createTime;
+
+    public UserFirstTime() {
+    }
+
+    public UserFirstTime(Long userId, ClientEnum userType, UserFirstTimeTypeEnum timeType, Date time) {
+        this.userId = userId;
+        this.userType = userType;
+        this.timeType = timeType;
+        this.time = time;
+    }
+
+    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 getUserType() {
+        return userType;
+    }
+
+    public void setUserType(ClientEnum userType) {
+        this.userType = userType;
+    }
+
+    public UserFirstTimeTypeEnum getTimeType() {
+        return timeType;
+    }
+
+    public void setTimeType(UserFirstTimeTypeEnum timeType) {
+        this.timeType = timeType;
+    }
+    
+	public Date getTime() {
+        return time;
+    }
+
+    public void setTime(Date time) {
+        this.time = time;
+    }
+    
+	public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+    
+}

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

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -26,7 +27,7 @@ public class VipCardRecord implements Serializable {
     @ApiModelProperty("用户id ")
 	@TableField(value = "user_id_")
     private Long userId;
-    @ApiModelProperty("订单号 ")
+    @ApiModelProperty("订单号 活动id")
 	@TableField(value = "order_no_")
     private String orderNo;
     @ApiModelProperty("订单详情号 ")
@@ -40,6 +41,9 @@ public class VipCardRecord implements Serializable {
     @ApiModelProperty("用户类型 学生:STUDENT 老师 :TEACHER")
     private ClientEnum clientType;
 
+    @ApiModelProperty("来源类型 : ACTIVITY :活动 ,ORDER:订单")
+    @TableField(value = "source_type_")
+    private SourceTypeEnum sourceType;
 
     @ApiModelProperty("会员卡开始时间 ")
 	@TableField(value = "start_time_")
@@ -69,6 +73,14 @@ public class VipCardRecord implements Serializable {
     @TableField(value = "msg_status_")
     private Integer msgStatus;
 
+    public SourceTypeEnum getSourceType() {
+        return sourceType;
+    }
+
+    public void setSourceType(SourceTypeEnum sourceType) {
+        this.sourceType = sourceType;
+    }
+
     public ClientEnum getClientType() {
         return clientType;
     }

+ 35 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/AccompanimentTypeEnum.java

@@ -0,0 +1,35 @@
+package com.yonge.cooleshow.biz.dal.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.toolset.base.enums.BaseEnum;
+
+/**
+ * Description 曲目音频类型 1:mp3,2:midi,3:mp3_metronome
+ *
+ * @author liujunchi
+ * @date 2022-04-01
+ */
+public enum AccompanimentTypeEnum implements BaseEnum<String, AccompanimentTypeEnum> {
+
+
+    HOMEMODE("HOMEMODE"), // 自制
+    COMMON("COMMON"), //普通
+     ;
+    @EnumValue
+    private String code;
+    private String msg;
+
+    AccompanimentTypeEnum(String msg) {
+        this.code = this.name();
+        this.msg = msg;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }
+
+    public String getMsg() {
+        return this.msg;
+    }
+}

+ 3 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageTypeEnum.java

@@ -97,11 +97,12 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     VIDEO_COURSE_OUT_SALE_REASON("老师视频课下架通知"),
     ACTIVITY_JOIN_MESSAGE("活动参与通知"),
 
-    PIANO_ROOM_TIMES_ADD("后台增加琴房时长通知"),
-    PIANO_ROOM_TIMES_SUB("后台扣除琴房时长通知"),
+    PIANO_ROOM_TIMES_ADD("增加琴房时长通知"),
+    PIANO_ROOM_TIMES_SUB("扣除琴房时长通知"),
 
     PIANO_ROOM_ADJUST("琴房课调整"),
     PRACTICE_ADJUST("陪练课调整"),
+    ACTIVITY_WIN("获奖消息"),
 
     ;
 

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

@@ -12,7 +12,12 @@ import com.yonge.toolset.base.enums.BaseEnum;
 public enum SourceTypeEnum implements BaseEnum<String, AuditStatusEnum> {
 
     TEACHER("TEACHER"),
-    PLATFORM("PLATFORM");
+    PLATFORM("PLATFORM"),
+    ACTIVITY("ACTIVITY"),
+    ORDER("ORDER"),
+
+
+    ;
 
     @EnumValue
     private String code;

+ 20 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityPlanEvaluationService.java

@@ -0,0 +1,20 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.dto.ActivityPlanDto;
+import com.yonge.cooleshow.biz.dal.entity.ActivityPlanEvaluation;
+
+/**
+ * 活动计划-评测活动拓展字段表 服务类
+ * @author liweifan
+ * @date 2022-08-17
+ */
+public interface ActivityPlanEvaluationService extends IService<ActivityPlanEvaluation>  {
+
+	boolean createOrUpdate(ActivityPlanDto entity);
+
+	void closeActivity(Long activytyId);
+
+	void successActivity(Long activityId);
+
+}

+ 79 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityPlanRewardService.java

@@ -0,0 +1,79 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.dto.ActivityPlanRewardDto;
+import com.yonge.cooleshow.biz.dal.vo.ActivityPlanRewardVo;
+import com.yonge.cooleshow.biz.dal.dto.search.ActivityPlanRewardSearch;
+import com.yonge.cooleshow.biz.dal.entity.ActivityPlanReward;
+
+import java.util.List;
+
+/**
+ * 活动计划奖品表 服务类
+ *
+ * @author liweifan
+ * @date 2022-08-17
+ */
+public interface ActivityPlanRewardService extends IService<ActivityPlanReward> {
+
+    /**
+     * 查询详情
+     *
+     * @author liweifan
+     * @date 2022-08-17
+     */
+    ActivityPlanRewardVo detail(Long id);
+
+    ActivityPlanReward detailByActivityIdAndRewardId(Long activityId, Long rewardId);
+    /**
+     * 分页查询
+     *
+     * @author liweifan
+     * @date 2022-08-17
+     */
+    IPage<ActivityPlanRewardVo> selectPage(IPage<ActivityPlanRewardVo> page, ActivityPlanRewardSearch query);
+
+    /**
+     * 查询活动下的奖品
+     *
+     * @param activityId
+     * @return
+     */
+    List<ActivityPlanRewardDto> queryActivityPlanReward(Long activityId);
+
+    /**
+     * 查询活动被删除的奖品
+     *
+     * @param activityId 活动id
+     * @param rewardIds 当前奖品
+     * @return
+     */
+    List<ActivityPlanReward> getDelRewardList(Long activityId, List<Long> rewardIds);
+
+    /**
+     * 新增或修改活动奖品
+     * @param rewardDto
+     * @return
+     */
+    Boolean saveOrUpdateReward(ActivityPlanRewardDto rewardDto);
+    /**
+     * 回收活动奖品
+     * @param activityId
+     * @return
+     */
+    Boolean recoveryReward(Long activityId);
+    /**
+     * 回收活动奖品
+     * @param reward
+     * @return
+     */
+    Boolean recoveryReward(ActivityPlanReward reward);
+	/**
+	 * 减少库存
+	 *  @param activityId 活动id
+	 * @param rewardId   奖品id
+	 * @return
+	 */
+    int reduceStock(Long activityId, Long rewardId);
+}

+ 18 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityPlanService.java

@@ -7,6 +7,7 @@ import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.ActivityPlanDto;
 
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dto.ActivityPlanRewardDto;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 
 import com.yonge.cooleshow.biz.dal.vo.ActivityPlanVo;
@@ -17,6 +18,8 @@ import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 
+import java.util.List;
+
 /**
  * 活动计划表 服务类
  * @author liweifan
@@ -39,12 +42,14 @@ public interface ActivityPlanService extends IService<ActivityPlan>  {
 	/**
 	 * 新增活动
 	 * @param activityPlan
-	 * @param user
 	 * @return
 	 */
-	ActivityPlan submit(ActivityPlanDto activityPlan, SysUser user);
+	ActivityPlan submit(ActivityPlanDto activityPlan);
 
 	Boolean updateActivityState(Long activityId, Integer activityState, Long id);
+
+	Boolean updateDraftFlag(Long activityId, Integer draftFlag, Long id);
+
 	/**
 	 * 活动信息
 	 *
@@ -91,4 +96,15 @@ public interface ActivityPlanService extends IService<ActivityPlan>  {
 	 * 定时变更活动状态
 	 */
     void activityState();
+	/**
+	 * 活动中定时轮询
+	 */
+	void activityIng();
+
+	/**
+	 * 变更活动奖品
+	 * @param updateRewardDtoList
+	 * @return
+	 */
+    Boolean saveOrUpdateReward(List<ActivityPlanRewardDto> updateRewardDtoList);
 }

+ 19 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityPlanStandardService.java

@@ -0,0 +1,19 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.dto.ActivityPlanDto;
+import com.yonge.cooleshow.biz.dal.entity.ActivityPlanStandard;
+
+/**
+ * 活动计划-达标赠送活动拓展字段表 服务类
+ * @author liweifan
+ * @date 2022-08-17
+ */
+public interface ActivityPlanStandardService extends IService<ActivityPlanStandard>  {
+
+    boolean createOrUpdate(ActivityPlanDto entity);
+
+    void activityIng(Object param);
+
+    void successActivity(Long activytyId);
+}

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

@@ -32,9 +32,9 @@ public interface ActivityRegistrationService extends IService<ActivityRegistrati
 	 * 是否参与活动
 	 *
 	 * @param userId 用户id
-	 * @param activityPlanId
+	 * @param activityId
 	 * @return
 	 */
-    YesOrNoEnum getRegistration(Long userId, Long activityPlanId);
+    YesOrNoEnum getRegistration(Long userId, Long activityId);
 
 }

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

@@ -4,6 +4,9 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.ActivityRewardDto;
+import com.yonge.cooleshow.biz.dal.dto.search.ActivityRewardChangeStockSearch;
+import com.yonge.cooleshow.biz.dal.entity.ActivityRewardChangeStock;
+import com.yonge.cooleshow.biz.dal.vo.ActivityRewardChangeStockVo;
 import com.yonge.cooleshow.biz.dal.vo.ActivityRewardVo;
 import com.yonge.cooleshow.biz.dal.dto.search.ActivityRewardSearch;
 import com.yonge.cooleshow.biz.dal.entity.ActivityReward;
@@ -37,6 +40,13 @@ public interface ActivityRewardService extends IService<ActivityReward>  {
      */
     IPage<ActivityRewardVo> selectPage(IPage<ActivityRewardVo> page, ActivityRewardSearch query);
 
+	/**
+	 * 列表查询
+	 * @author liweifan
+	 * @date 2022-08-04
+	 */
+	List<ActivityRewardVo> selectAll(ActivityRewardSearch query);
+
 	Boolean submit(ActivityRewardDto activityReward, SysUser user);
 
 	/**
@@ -47,4 +57,35 @@ public interface ActivityRewardService extends IService<ActivityReward>  {
 	 */
     List<ActivityReward> getActivityReward(Long activityPlanId);
 
+	/**
+	 * 启用/停用
+	 * @param id
+	 * @param status
+	 * @param userId
+	 * @return
+	 */
+    Boolean updateStatus(Long id, Integer status, Long userId);
+
+	/**
+	 * 调整库存
+	 * @param activityRewardChangeStock
+	 * @return
+	 */
+	Boolean updateStock(ActivityRewardChangeStock activityRewardChangeStock);
+
+	/**
+	 * 库存变更记录查询分页
+	 * @param page
+	 * @param query
+	 * @return
+	 */
+	IPage<ActivityRewardChangeStockVo> selectChangeStockPage(IPage<ActivityRewardChangeStockVo> page, ActivityRewardChangeStockSearch query);
+
+	/**
+	 * 发放获奖奖品
+	 * @param userId 用户id
+	 * @param activityId 活动id
+	 * @return 返回发放成功奖品id
+	 */
+	List<Long> sendReward(Long userId, Long activityId);
 }

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

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.vo.ActivityUserRewardVo;
 import com.yonge.cooleshow.biz.dal.dto.search.ActivityUserRewardSearch;
 import com.yonge.cooleshow.biz.dal.entity.ActivityUserReward;
+import com.yonge.cooleshow.biz.dal.vo.UserRewardVo;
 
 /**
  * 活动用户获奖表 服务类
@@ -25,5 +26,5 @@ public interface ActivityUserRewardService extends IService<ActivityUserReward>
      * @author liweifan
  	 * @date 2022-08-04
      */
-    IPage<ActivityUserRewardVo> selectPage(IPage<ActivityUserRewardVo> page, ActivityUserRewardSearch query);
+    IPage<UserRewardVo> selectPage(IPage<UserRewardVo> page, ActivityUserRewardSearch query);
 }

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/HomeService.java

@@ -1,11 +1,15 @@
 package com.yonge.cooleshow.biz.dal.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.biz.dal.dto.SubjectHomeSearch;
 import com.yonge.cooleshow.biz.dal.dto.req.TotalReq;
 import com.yonge.cooleshow.biz.dal.vo.CourseHomeVo;
+import com.yonge.cooleshow.biz.dal.vo.SubjectHomeVo;
 import com.yonge.cooleshow.biz.dal.vo.res.HomeTotalStudent;
 import com.yonge.cooleshow.biz.dal.vo.res.HomeTotalTeacher;
 import com.yonge.cooleshow.biz.dal.vo.res.HomeUserToDoNum;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.base.page.PageInfo;
 
 import java.util.Map;
 
@@ -49,4 +53,11 @@ public interface HomeService {
      *              <p> - timeType 时间类型 MONTH、月度 YEAR
      */
     CourseHomeVo queryCourseHomeData(Map<String, Object> param);
+
+    /**
+     * 内容数据 声部列表
+     *
+     * @return
+     */
+    PageInfo<SubjectHomeVo> subjectHome(IPage<SubjectHomeVo> page, SubjectHomeSearch query);
 }

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

@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
+import com.yonge.cooleshow.biz.dal.entity.ActivityReward;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.vo.MemberPriceSettingsVo;
 import com.yonge.cooleshow.biz.dal.dto.search.MemberPriceSettingsSearch;
 import com.yonge.cooleshow.biz.dal.entity.MemberPriceSettings;
@@ -56,6 +58,17 @@ public interface MemberPriceSettingsService extends IService<MemberPriceSettings
     void orderSuccess(UserOrderDetailVo orderDetailVo);
 
     /**
+     * 活动构建vip card record 对象
+     *
+     * @param userId 用户id
+     * @param client 客户端类型
+     * @param activityReward 活动奖品
+     * @param activityId 活动id
+     * @return
+     */
+    void activityReward(Long userId, ClientEnum client, ActivityReward activityReward, Long activityId);
+
+    /**
      * 老师分享VIP 分润
      *
      * @param sysUser 推荐人信息

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

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
 import com.yonge.cooleshow.biz.dal.vo.PianoRoomChangeRecordVo;
 import com.yonge.cooleshow.biz.dal.dto.search.PianoRoomChangeRecordSearch;
 import com.yonge.cooleshow.biz.dal.entity.PianoRoomChangeRecord;

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

@@ -0,0 +1,41 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.dto.search.UserFirstTimeSearch;
+import com.yonge.cooleshow.biz.dal.entity.UserFirstTime;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.common.enums.UserFirstTimeTypeEnum;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 时间记录表 服务类
+ * @author liweifan
+ * @date 2022-08-18
+ */
+public interface UserFirstTimeService extends IService<UserFirstTime>  {
+    /**
+     * 查询集合
+     * @return
+     */
+    List<UserFirstTime> selectAllList(UserFirstTimeSearch param);
+    /**
+     * 记录时间
+     * @param userId(用户id)
+     * @param userType (用户类型)
+     * @param firstTimeTypeEnum (时间类型)
+     * @return
+     */
+    Boolean recordTime(Long userId, ClientEnum userType, UserFirstTimeTypeEnum firstTimeTypeEnum);
+    /**
+     * 记录时间
+     * @param userId(用户id)
+     * @param userType (用户类型)
+     * @param firstTimeTypeEnum (时间类型)
+     * @param time  (记录时间)
+     * @return
+     */
+    Boolean recordTime(Long userId, ClientEnum userType, UserFirstTimeTypeEnum firstTimeTypeEnum, Date time);
+
+}

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

@@ -3,6 +3,8 @@ package com.yonge.cooleshow.biz.dal.service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
+import com.yonge.cooleshow.biz.dal.entity.ActivityReward;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
@@ -42,6 +44,17 @@ public interface VipCardRecordService extends IService<VipCardRecord> {
     VipCardRecord buildVipCardRecordByOrderDetail(UserOrderDetailVo orderDetailVo);
 
     /**
+     * 活动构建vip card record 对象
+     *
+     * @param userId 用户id
+     * @param client 客户端类型
+     * @param activityReward 活动奖品
+     * @param activityId 活动id
+     * @return
+     */
+    VipCardRecord buildVipCardRecordByOrderDetail(Long userId, ClientEnum client, ActivityReward activityReward, Long activityId);
+
+    /**
      * 分页查询
      *
      * @author liweifan

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

@@ -0,0 +1,102 @@
+package com.yonge.cooleshow.biz.dal.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.biz.dal.dto.ActivityPlanDto;
+import com.yonge.cooleshow.biz.dal.dto.req.OrderPayReq;
+import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
+import com.yonge.cooleshow.biz.dal.entity.ActivityPlanReward;
+import com.yonge.cooleshow.biz.dal.entity.ActivityUserReward;
+import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
+import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
+import org.apache.poi.ss.formula.functions.T;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import com.yonge.cooleshow.biz.dal.entity.ActivityPlanEvaluation;
+import com.yonge.cooleshow.biz.dal.dao.ActivityPlanEvaluationDao;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+
+@Service
+public class ActivityPlanEvaluationServiceImpl extends ServiceImpl<ActivityPlanEvaluationDao, ActivityPlanEvaluation> implements ActivityPlanEvaluationService {
+    private final static Logger log = LoggerFactory.getLogger(ActivityPlanEvaluationServiceImpl.class);
+
+    @Autowired
+    private UserOrderService userOrderService;
+    @Autowired
+    private ActivityRewardService activityRewardService;
+    @Autowired
+    private ActivityUserRewardService activityUserRewardService;
+    @Autowired
+    private ActivityPlanRewardService activityPlanRewardService;
+
+    @Override
+    public boolean createOrUpdate(ActivityPlanDto activityPlan) {
+        ActivityPlanEvaluation planExpand = activityPlan.getPlanEvaluation();
+
+        if (null == planExpand.getId()) {
+            planExpand.setId(activityPlan.getId());
+            planExpand.setCreateBy(activityPlan.getUserId());
+            planExpand.setUpdateBy(activityPlan.getUserId());
+            saveOrUpdate(planExpand);
+        } else {
+            planExpand.setUpdateBy(activityPlan.getUserId());
+            updateById(planExpand);
+        }
+        return true;
+    }
+
+    @Override
+    public void closeActivity(Long activytyId) {
+        OrderSearch query = new OrderSearch();
+        query.setOrderType(OrderTypeEnum.ACTI_REGIST.getCode());
+        query.setGoodType(GoodTypeEnum.ACTI_REGIST.getCode());
+        query.setBizId(activytyId);
+        List<UserOrderVo> userOrderVos = userOrderService.selectAllList(query);
+        for (UserOrderVo userOrderVo : userOrderVos) {
+            OrderPayReq payReq = new OrderPayReq();
+            payReq.setOrderNo(userOrderVo.getOrderNo());
+            payReq.setUserId(userOrderVo.getUserId());
+            payReq.setReason("活动已结束");
+            userOrderService.orderCancel(payReq);
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void successActivity(Long activityId) {
+        //关闭未付款订单
+        closeActivity(activityId);
+
+        //活动需要发放的奖品
+        List<ActivityUserReward> activityUserRewardList = baseMapper.getUserReward(activityId);
+
+        Set<Long> userIds = activityUserRewardList.stream().map(ActivityUserReward::getUserId).collect(Collectors.toSet());
+
+        for (Long userId : userIds) {
+            //给用户发放奖品 传入用户id和活动id
+            List<Long> successRewardIds = activityRewardService.sendReward(userId, activityId);
+
+            activityUserRewardList.stream().filter(o -> o.getUserId().equals(userId)).forEach(o -> {
+                for (Long successRewardId : successRewardIds) {
+                    if(o.getRewardId().equals(successRewardId)){
+                        o.setGrantFlag(1);
+                        return;
+                    }
+                }
+                o.setGrantFlag(0);
+            });
+        }
+        activityUserRewardService.saveBatch(activityUserRewardList);
+
+        //发完奖后将库存归还
+        activityPlanRewardService.recoveryReward(activityId);
+    }
+}

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

@@ -0,0 +1,193 @@
+package com.yonge.cooleshow.biz.dal.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.biz.dal.dao.ActivityRewardChangeStockDao;
+import com.yonge.cooleshow.biz.dal.dto.ActivityPlanRewardDto;
+import com.yonge.cooleshow.biz.dal.entity.ActivityRewardChangeStock;
+import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
+import com.yonge.cooleshow.biz.dal.service.ActivityRewardService;
+import com.yonge.cooleshow.biz.dal.vo.ActivityRewardVo;
+import com.yonge.cooleshow.common.enums.ActivityTypeEnum;
+import com.yonge.cooleshow.common.enums.CacheNameEnum;
+import com.yonge.cooleshow.common.enums.RewardTypeEnum;
+import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.payment.util.DistributedLock;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import com.yonge.cooleshow.biz.dal.entity.ActivityPlanReward;
+import com.yonge.cooleshow.biz.dal.vo.ActivityPlanRewardVo;
+import com.yonge.cooleshow.biz.dal.dto.search.ActivityPlanRewardSearch;
+import com.yonge.cooleshow.biz.dal.dao.ActivityPlanRewardDao;
+import com.yonge.cooleshow.biz.dal.service.ActivityPlanRewardService;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Consumer;
+
+
+@Service
+public class ActivityPlanRewardServiceImpl extends ServiceImpl<ActivityPlanRewardDao, ActivityPlanReward> implements ActivityPlanRewardService {
+    private final static Logger log = LoggerFactory.getLogger(ActivityPlanRewardServiceImpl.class);
+
+    @Autowired
+    private RedissonClient redissonClient;
+
+    @Autowired
+    private ActivityRewardService activityRewardService;
+
+    @Resource
+    private ActivityRewardChangeStockDao changeStockDao;
+
+    @Override
+    public ActivityPlanRewardVo detail(Long id) {
+        return baseMapper.detail(id);
+    }
+
+    @Override
+    public ActivityPlanReward detailByActivityIdAndRewardId(Long activityId, Long rewardId) {
+        return baseMapper.detailByActivityIdAndRewardId(activityId, rewardId);
+    }
+
+    @Override
+    public IPage<ActivityPlanRewardVo> selectPage(IPage<ActivityPlanRewardVo> page, ActivityPlanRewardSearch query) {
+        return page.setRecords(baseMapper.selectPage(page, query));
+    }
+
+    @Override
+    public List<ActivityPlanRewardDto> queryActivityPlanReward(Long activityId) {
+        return baseMapper.queryActivityPlanReward(activityId);
+    }
+
+    @Override
+    public List<ActivityPlanReward> getDelRewardList(Long activityId, List<Long> rewardIds) {
+        return baseMapper.getDelRewardList(activityId, rewardIds);
+    }
+
+    @Override
+    public Boolean saveOrUpdateReward(ActivityPlanRewardDto rewardDto) {
+        DistributedLock.of(redissonClient)
+                .runIfLockToFunction(CacheNameEnum.LOCK_ACTIVITY_REWARD_STOCK.getRedisKey(rewardDto.getId())
+                        , (out) -> {
+                            DistributedLock.of(redissonClient)
+                                    .runIfLockToFunction(CacheNameEnum.LOCK_REWARD_STOCK.getRedisKey(out.getId())
+                                            , (param) -> {
+                                                ActivityRewardVo detail = activityRewardService.detail(param.getRewardId());
+
+                                                ActivityPlanReward old = detailByActivityIdAndRewardId(param.getActivityId(), param.getRewardId());
+                                                if (null == old) {
+                                                    Integer stock = detail.getStock() - param.getRewardNum();
+                                                    if (stock < 0) {
+                                                        //库存不足,使用全部库存
+                                                        stock = 0;
+                                                        param.setRewardNum(detail.getStock());
+                                                    }
+
+                                                    save(param);
+
+                                                    //入库存变更记录
+                                                    ActivityRewardChangeStock changeStock = new ActivityRewardChangeStock();
+                                                    changeStock.setRewardId(param.getRewardId());
+                                                    changeStock.setStock(param.getRewardNum());
+                                                    changeStock.setChangeType(InOrOutEnum.OUT);
+                                                    changeStock.setSource("ACTIVITY");
+                                                    changeStockDao.insert(changeStock);
+
+                                                    detail.setStock(stock);
+                                                    activityRewardService.updateById(detail);
+                                                } else {
+                                                    param.setId(old.getId());
+
+                                                    //新增数(能为负)
+                                                    Integer changeStock = param.getRewardNum() - old.getRewardNum();
+                                                    if (changeStock == 0) {
+                                                        return true;
+                                                    }
+
+                                                    //调整后的库存
+                                                    Integer stock = detail.getStock() - changeStock;
+                                                    if (stock < 0) {
+                                                        //库存不足,使用全部库存
+                                                        stock = 0;
+                                                        changeStock = detail.getStock();
+                                                    }
+
+                                                    param.setRewardNum(old.getRewardNum() + changeStock);
+                                                    updateById(param);
+                                                    //入库存变更记录
+                                                    ActivityRewardChangeStock changeStockObj = new ActivityRewardChangeStock();
+                                                    changeStockObj.setRewardId(param.getRewardId());
+                                                    changeStockObj.setStock(Math.abs(changeStock));
+                                                    changeStockObj.setChangeType(
+                                                            changeStock < 0 ? InOrOutEnum.IN : InOrOutEnum.OUT);
+                                                    changeStockObj.setSource("ACTIVITY");
+                                                    changeStockDao.insert(changeStockObj);
+
+                                                    detail.setStock(stock);
+                                                    activityRewardService.updateById(detail);
+                                                }
+                                                return true;
+                                            }, out, 10l);
+                            return true;
+                        }, rewardDto, 10l);
+        return true;
+    }
+
+    @Override
+    public Boolean recoveryReward(Long activityId) {
+        List<ActivityPlanReward> list = list(Wrappers.<ActivityPlanReward>lambdaQuery()
+                .eq(ActivityPlanReward::getActivityId, activityId)
+                .gt(ActivityPlanReward::getRewardNum, 0));
+        for (ActivityPlanReward activityPlanReward : list) {
+            recoveryReward(activityPlanReward);
+        }
+        return true;
+    }
+
+    @Override
+    public Boolean recoveryReward(ActivityPlanReward reward) {
+        DistributedLock.of(redissonClient)
+                .runIfLockToFunction(CacheNameEnum.LOCK_ACTIVITY_REWARD_STOCK.getRedisKey(reward.getId())
+                        , (out) -> {
+                            DistributedLock.of(redissonClient)
+                                    .runIfLockToFunction(CacheNameEnum.LOCK_REWARD_STOCK.getRedisKey(out.getId())
+                                            , (param) -> {
+                                                ActivityRewardVo detail = activityRewardService.detail(param.getRewardId());
+
+                                                ActivityPlanReward old = detailByActivityIdAndRewardId(param.getActivityId(), param.getRewardId());
+
+                                                if (old.getRewardNum() > 0) {
+                                                    //入库存变更记录
+                                                    ActivityRewardChangeStock changeStockObj = new ActivityRewardChangeStock();
+                                                    changeStockObj.setRewardId(param.getRewardId());
+                                                    changeStockObj.setStock(param.getRewardNum());
+                                                    changeStockObj.setChangeType(InOrOutEnum.IN);
+                                                    changeStockObj.setSource("ACTIVITY");
+                                                    changeStockDao.insert(changeStockObj);
+
+                                                    detail.setStock(detail.getStock() + old.getRewardNum());
+                                                    activityRewardService.updateById(detail);
+
+                                                    old.setRewardNum(0);
+                                                    updateById(old);
+                                                }
+                                                return true;
+                                            }, out, 10l);
+                            return true;
+                        }, reward, 10l);
+        return false;
+    }
+
+    @Override
+    public int reduceStock(Long activityId, Long rewardId) {
+        return baseMapper.reduceStock(activityId, rewardId);
+    }
+
+}

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

@@ -2,12 +2,15 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.api.R;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.biz.dal.dao.ActivityPlanDao;
 import com.yonge.cooleshow.biz.dal.dao.ActivityPlanEvaluationDao;
+import com.yonge.cooleshow.biz.dal.dao.ActivityRewardChangeStockDao;
 import com.yonge.cooleshow.biz.dal.dto.ActivityPlanDto;
+import com.yonge.cooleshow.biz.dal.dto.ActivityPlanRewardDto;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderPayReq;
 import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
 import com.yonge.cooleshow.biz.dal.entity.ActivityPlanEvaluation;
@@ -17,14 +20,18 @@ import com.yonge.cooleshow.biz.dal.dto.search.ActivityPlanSearch;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
 import com.yonge.cooleshow.biz.dal.vo.*;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.ActivityTypeEnum;
+import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.cooleshow.common.enums.RegistrationMethodEnum;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.util.StringUtil;
+import com.yonge.toolset.payment.util.DistributedLock;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
+import org.redisson.api.RedissonClient;
 import org.springframework.stereotype.Service;
 import org.apache.commons.collections.CollectionUtils;
 import org.slf4j.Logger;
@@ -35,6 +42,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 
+import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.util.*;
@@ -42,22 +50,27 @@ import java.util.Date;
 
 import java.util.List;
 import java.util.Optional;
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
 
 
 @Service
 public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, ActivityPlan> implements ActivityPlanService {
     private final static Logger log = LoggerFactory.getLogger(ActivityPlanServiceImpl.class);
-    @Resource
-    private ActivityPlanEvaluationDao activityPlanEvaluationDao;
+    @Autowired
+    private ActivityPlanEvaluationService activityPlanEvaluationService;
+
+    @Autowired
+    private ActivityPlanStandardService activityPlanStandardService;
 
     @Autowired
     private ActivityEvaluationService activityEvaluationService;
 
     @Autowired
-    private ActivityRewardService activityRewardService;
+    private ActivityPlanRewardService activityPlanRewardService;
 
     @Autowired
-    private ActivityUserRewardService activityUserRewardService;
+    private ActivityRewardService activityRewardService;
 
     @Resource
     private SysUserFeignService sysUserFeignService;
@@ -72,16 +85,59 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
     private SysMessageService sysMessageService;
 
     @Autowired
-    private UserOrderService userOrderService;
+    private RedissonClient redissonClient;
+
+    //保存/更新拓展字段
+    private static final Map<ActivityTypeEnum, Consumer<ActivityPlanDto>> saveOrUpdateExpand = new HashMap<>();
+    //开始活动(活动刚开始触发)
+    private static final Map<ActivityTypeEnum, Consumer<Long>> startActivity = new HashMap<>();
+    //开启活动(开启活动按钮)
+    private static final Map<ActivityTypeEnum, Consumer<Long>> openActivity = new HashMap<>();
+    //关闭活动(关闭活动按钮)
+    private static final Map<ActivityTypeEnum, Consumer<Long>> closeActivity = new HashMap<>();
+    //活动中定时轮询
+    private static final Map<ActivityTypeEnum, Consumer<Object>> activityIng = new HashMap<>();
+    //活动完成(活动截止时间到触发)
+    private static final Map<ActivityTypeEnum, Consumer<Long>> successActivity = new HashMap<>();
+
+    @PostConstruct
+    private void init() {
+        /**********保存/更新拓展字段******************/
+        //评测活动
+        saveOrUpdateExpand.put(ActivityTypeEnum.EVALUATION, activityPlanEvaluationService::createOrUpdate);
+        //达标赠送活动
+        saveOrUpdateExpand.put(ActivityTypeEnum.STANDARD_GIFT, activityPlanStandardService::createOrUpdate);
+        /**********开始活动(活动刚开始触发)******************/
+
+        /**********开启活动(开启活动按钮)******************/
+
+        /**********关闭活动(关闭活动按钮)******************/
+        //评测活动
+        closeActivity.put(ActivityTypeEnum.EVALUATION, activityPlanEvaluationService::closeActivity);
+        /**********活动中定时轮询******************/
+        //达标赠送活动
+        activityIng.put(ActivityTypeEnum.STANDARD_GIFT, activityPlanStandardService::activityIng);
+        /**********活动完成(活动截止时间到触发)******************/
+        //评测活动
+        successActivity.put(ActivityTypeEnum.EVALUATION, activityPlanEvaluationService::successActivity);
+        //达标赠送活动
+        successActivity.put(ActivityTypeEnum.STANDARD_GIFT, activityPlanStandardService::successActivity);
+    }
 
     @Override
     public ActivityPlanVo detail(Long id) {
         ActivityPlanVo detail = baseMapper.detail(id);
         if (null != detail) {
             if (ActivityTypeEnum.EVALUATION.equals(detail.getActivityType())) {
-                detail.setPlanEvaluation(activityPlanEvaluationDao.selectById(detail.getId()));
+                detail.setPlanEvaluation(activityPlanEvaluationService.getById(id));
+            }
+            if (ActivityTypeEnum.STANDARD_GIFT.equals(detail.getActivityType())) {
+                detail.setPlanStandard(activityPlanStandardService.getById(id));
             }
         }
+        //查询活动奖品
+        List<ActivityPlanRewardDto> activityRewardList = activityPlanRewardService.queryActivityPlanReward(id);
+        detail.setActivityRewardList(activityRewardList);
         return detail;
     }
 
@@ -92,45 +148,38 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public ActivityPlan submit(ActivityPlanDto activityPlan, SysUser user) {
+    public ActivityPlan submit(ActivityPlanDto activityPlan) {
         //验证参数
         if (!validParam(activityPlan)) {
-            return null;
+            throw new BizException("参数异常");
         }
 
         if (null == activityPlan.getId()) {
             activityPlan.setDraftFlag(1);
-            activityPlan.setCreateBy(user.getId());
-            activityPlan.setUpdateBy(user.getId());
+            activityPlan.setCreateBy(activityPlan.getUserId());
+            activityPlan.setUpdateBy(activityPlan.getUserId());
             save(activityPlan);
-
-            ActivityPlanEvaluation planEvaluation = activityPlan.getPlanEvaluation();
-            planEvaluation.setId(activityPlan.getId());
-            planEvaluation.setCreateBy(user.getId());
-            planEvaluation.setUpdateBy(user.getId());
-            activityPlanEvaluationDao.insert(planEvaluation);
-            return activityPlan;
         } else {
             ActivityPlan old = getById(activityPlan.getId());
             //启用状态,只能修改活动结束时间
             if (old.getActivityState().equals(1)) {
                 if (activityPlan.getActivityEnd().after(new Date())) {
                     old.setActivityEnd(activityPlan.getActivityEnd());
-                    old.setUpdateBy(user.getId());
+                    old.setUpdateBy(activityPlan.getUserId());
                     updateById(old);
-                    return old;
                 }
-                return null;
             } else {
-                activityPlan.setUpdateBy(user.getId());
+                activityPlan.setUpdateBy(activityPlan.getUserId());
                 updateById(activityPlan);
-
-                ActivityPlanEvaluation planEvaluation = activityPlan.getPlanEvaluation();
-                planEvaluation.setUpdateBy(user.getId());
-                activityPlanEvaluationDao.updateById(planEvaluation);
-                return activityPlan;
             }
         }
+
+        //修改拓展信息
+        Consumer<ActivityPlanDto> afterFunction = saveOrUpdateExpand.get(activityPlan.getActivityType());
+        if (!Objects.isNull(afterFunction)) {
+            afterFunction.accept(activityPlan);
+        }
+        return activityPlan;
     }
 
     @Override
@@ -148,34 +197,88 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
                 activityPlan.setActivityStart(now);
             }
             activityPlan.setActivityState(activityState);
+            //开启活动
+            Consumer<Long> afterFunction = openActivity.get(activityPlan.getActivityType());
+            if (!Objects.isNull(afterFunction)) {
+                afterFunction.accept(activityPlan.getId());
+            }
         } else {
             activityPlan.setActivityState(2);
-            //取消活动所有订单
-            cancelActivityOrder(detail);
+            //关闭活动
+            Consumer<Long> afterFunction = closeActivity.get(activityPlan.getActivityType());
+            if (!Objects.isNull(afterFunction)) {
+                afterFunction.accept(activityPlan.getId());
+            }
         }
 
         activityPlan.setId(activityId);
         activityPlan.setUpdateBy(id);
         activityPlan.setUpdateTime(new Date());
-
         baseMapper.updateById(activityPlan);
         return true;
     }
 
+    @Override
+    public Boolean updateDraftFlag(Long activityId, Integer draftFlag, Long userId) {
+        ActivityPlan activityPlan = new ActivityPlan();
+        activityPlan.setId(activityId);
+        //更改活动状态
+        activityPlan.setDraftFlag(draftFlag);
+        activityPlan.setUpdateBy(userId);
+        updateById(activityPlan);
+        return true;
+    }
+
     private Boolean validParam(ActivityPlanDto activityPlan) {
         if (null == activityPlan) {
             return false;
         }
-        if (RegistrationMethodEnum.CHARGE.equals(activityPlan.getRegistrationMethod())
-                && (null == activityPlan.getRegistrationPrice() || BigDecimal.ZERO.compareTo(activityPlan.getRegistrationPrice()) > 0)) {
-            throw new BizException("活动收费时,报名金额不能为空");
+
+        if (!ActivityTypeEnum.STANDARD_GIFT.equals(activityPlan.getActivityType())) {
+
+            if (null == activityPlan.getRegistrationMethod()) {
+                throw new BizException("报名缴费方式不能为空");
+            }
+            if (RegistrationMethodEnum.CHARGE.equals(activityPlan.getRegistrationMethod())
+                    && (null == activityPlan.getRegistrationPrice() || BigDecimal.ZERO.compareTo(activityPlan.getRegistrationPrice()) > 0)) {
+                throw new BizException("活动收费时,报名金额不能为空");
+            }
+            if (RegistrationMethodEnum.CHARGE.equals(activityPlan.getRegistrationMethod())
+                    && (null == activityPlan.getShareRate())) {
+                throw new BizException("活动收费时,分润比例不能为空");
+            }
+            if (StringUtil.isEmpty(activityPlan.getSubjectUrl())) {
+                throw new BizException("主题图片不能为空");
+            }
+            if (StringUtil.isEmpty(activityPlan.getBackgroundUrl())) {
+                throw new BizException("平铺背景不能为空");
+            }
+            if (StringUtil.isEmpty(activityPlan.getShareUrl())) {
+                throw new BizException("分享图片不能为空");
+            }
+            if (StringUtil.isEmpty(activityPlan.getRuleDescribe())) {
+                throw new BizException("活动规则不能为空");
+            }
+        }
+
+        if (ActivityTypeEnum.EVALUATION.equals(activityPlan.getActivityType())) {
+            activityPlan.setActivityClient(ClientEnum.STUDENT);
+            if (null == activityPlan.getPlanEvaluation() || null == activityPlan.getPlanEvaluation().getEvaluationDifficulty()) {
+                throw new BizException("活动类型为评测活动时,评测难度不能为空");
+            }
         }
-        if (RegistrationMethodEnum.CHARGE.equals(activityPlan.getRegistrationMethod())
-                && (null == activityPlan.getShareRate())) {
-            throw new BizException("活动收费时,分润比例不能为空");
+
+        if (ActivityTypeEnum.STANDARD_GIFT.equals(activityPlan.getActivityType())) {
+            if (null == activityPlan.getPlanStandard()) {
+                throw new BizException("缺少达标赠送参数");
+            }
+            if (StringUtil.isEmpty(activityPlan.getPlanStandard().getCondition())) {
+                throw new BizException("达标条件不能为空");
+            }
         }
-        if (ActivityTypeEnum.EVALUATION.equals(activityPlan.getActivityType()) && (null == activityPlan.getPlanEvaluation() || null == activityPlan.getPlanEvaluation().getEvaluationDifficulty())) {
-            throw new BizException("活动类型为评测活动时,评测难度不能为空");
+
+        if (null == activityPlan.getActivityClient()) {
+            throw new BizException("活动客户端不能为空");
         }
         return true;
     }
@@ -320,7 +423,6 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
         activityRegistrationService.save(activityRegistration);
 
         sendMessage(activityPlan.getActivityName(), user.getId());
-
         return true;
     }
 
@@ -328,43 +430,63 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
     @Transactional(rollbackFor = Exception.class)
     public void activityState() {
         List<ActivityPlan> list = baseMapper.activityState();
-        for (ActivityPlan activityPlan : list) {
-            if (activityPlan.getActivityState() == 0) {
-                activityPlan.setActivityState(1);
-                baseMapper.updateById(activityPlan);
-            } else {
-                activityPlan.setActivityState(0);
-                baseMapper.updateById(activityPlan);
-                //取消所有活动订单
-                cancelActivityOrder(activityPlan);
-            }
-        }
-        //活动发奖
-        List<ActivityPlan> rewardList = baseMapper.activityReward();
-        for (ActivityPlan activityPlan : rewardList) {
-            List<ActivityUserReward> activityUserRewardList = baseMapper.getUserReward(activityPlan.getId(), activityPlan.getActivityType().getCode());
-            activityUserRewardService.saveBatch(activityUserRewardList);
-            //活动置为已发奖
-            activityPlan.setRewardFlag(1);
-            updateById(activityPlan);
+        for (ActivityPlan plan : list) {
+            DistributedLock.of(redissonClient)
+                    .runIfLockToFunction(CacheNameEnum.LOCK_ACTIVITY_STOCK.getRedisKey(plan.getId())
+                            , (id) -> {
+                                ActivityPlan activityPlan = getById(id);
+                                if (activityPlan.getActivityState() == 0) {
+                                    activityPlan.setActivityState(1);
+                                    baseMapper.updateById(activityPlan);
+
+                                    //开始活动
+                                    Consumer<Long> afterFunction = startActivity.get(activityPlan.getActivityType());
+                                    if (!Objects.isNull(afterFunction)) {
+                                        afterFunction.accept(activityPlan.getId());
+                                    }
+                                } else {
+                                    activityPlan.setActivityState(0);
+                                    activityPlan.setRewardFlag(1);
+                                    baseMapper.updateById(activityPlan);
+
+                                    //完成活动
+                                    Consumer<Long> afterFunction = successActivity.get(activityPlan.getActivityType());
+                                    if (!Objects.isNull(afterFunction)) {
+                                        afterFunction.accept(activityPlan.getId());
+                                    }
+                                }
+                                return true;
+                            }, plan.getId(), 10l);
         }
     }
 
-    private void cancelActivityOrder(ActivityPlan activityPlan) {
-        OrderSearch query = new OrderSearch();
-        query.setOrderType(OrderTypeEnum.ACTI_REGIST.getCode());
-        query.setGoodType(GoodTypeEnum.ACTI_REGIST.getCode());
-        query.setBizId(activityPlan.getId());
-        List<UserOrderVo> userOrderVos = userOrderService.selectAllList(query);
-        for (UserOrderVo userOrderVo : userOrderVos) {
-            OrderPayReq payReq = new OrderPayReq();
-            payReq.setOrderNo(userOrderVo.getOrderNo());
-            payReq.setUserId(userOrderVo.getUserId());
-            payReq.setReason("活动已结束");
-            userOrderService.orderCancel(payReq);
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void activityIng() {
+        for (ActivityTypeEnum activityTypeEnum : activityIng.keySet()) {
+            activityIng.get(activityTypeEnum).accept(null);
         }
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean saveOrUpdateReward(List<ActivityPlanRewardDto> updateRewardDtoList) {
+        Long activityId = updateRewardDtoList.get(0).getActivityId();
+
+        for (ActivityPlanRewardDto rewardDto : updateRewardDtoList) {
+            activityPlanRewardService.saveOrUpdateReward(rewardDto);
+        }
+        //还有删除的
+        List<Long> rewardIds = updateRewardDtoList.stream().map(ActivityPlanRewardDto::getRewardId).collect(Collectors.toList());
+        List<ActivityPlanReward> delList = activityPlanRewardService.getDelRewardList(activityId, rewardIds);
+        for (ActivityPlanReward reward : delList) {
+            //修改库存
+            activityPlanRewardService.recoveryReward(reward);
+            //删除活动奖品
+            activityPlanRewardService.removeById(reward.getId());
+        }
+        return true;
+    }
 
     /**
      * 参与活动消息
@@ -383,8 +505,6 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
         } catch (Exception e) {
             log.error("活动参与发送消息失败--> {}", e.fillInStackTrace());
         }
-
-
     }
 
     private void checkActivityPay(Long planId) {

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

@@ -0,0 +1,189 @@
+package com.yonge.cooleshow.biz.dal.service.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.biz.dal.dto.ActivityPlanDto;
+import com.yonge.cooleshow.biz.dal.dto.ActivityPlanRewardDto;
+import com.yonge.cooleshow.biz.dal.dto.search.UserFirstTimeSearch;
+import com.yonge.cooleshow.biz.dal.entity.*;
+import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
+import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
+import com.yonge.cooleshow.biz.dal.vo.ActivityPlanVo;
+import com.yonge.cooleshow.common.enums.*;
+import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.payment.util.DistributedLock;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import com.yonge.cooleshow.biz.dal.dao.ActivityPlanStandardDao;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+
+@Service
+public class ActivityPlanStandardServiceImpl extends ServiceImpl<ActivityPlanStandardDao, ActivityPlanStandard> implements ActivityPlanStandardService {
+    private final static Logger log = LoggerFactory.getLogger(ActivityPlanStandardServiceImpl.class);
+
+    @Autowired
+    private ActivityPlanService activityPlanService;
+    @Autowired
+    private ActivityPlanRewardService activityPlanRewardService;
+    @Autowired
+    private UserFirstTimeService userFirstTimeService;
+    @Autowired
+    private ActivityRewardService activityRewardService;
+    @Autowired
+    private ActivityUserRewardService activityUserRewardService;
+    @Autowired
+    private ActivityRegistrationService activityRegistrationService;
+    @Autowired
+    private RedissonClient redissonClient;
+
+    @Override
+    public boolean createOrUpdate(ActivityPlanDto activityPlan) {
+        ActivityPlanStandard planExpand = activityPlan.getPlanStandard();
+        if (null == planExpand.getCalculationMethod()) {
+            planExpand.setCalculationMethod(ConditionMethodEnum.AND);
+        }
+
+        if (null == planExpand.getId()) {
+            planExpand.setId(activityPlan.getId());
+            planExpand.setCreateBy(activityPlan.getUserId());
+            planExpand.setUpdateBy(activityPlan.getUserId());
+            saveOrUpdate(planExpand);
+        } else {
+            planExpand.setUpdateBy(activityPlan.getUserId());
+            updateById(planExpand);
+        }
+        return true;
+    }
+
+    @Override
+    public void activityIng(Object param) {
+        //查询当前进行的活动
+        List<ActivityPlan> activityIds = activityPlanService.list(Wrappers.<ActivityPlan>lambdaQuery()
+                .eq(ActivityPlan::getActivityType, ActivityTypeEnum.STANDARD_GIFT)
+                .eq(ActivityPlan::getActivityState, 1)
+                .select(ActivityPlan::getId));
+
+        for (ActivityPlan activityPlan : activityIds) {
+            DistributedLock.of(redissonClient)
+                    .runIfLockToFunction(CacheNameEnum.LOCK_ACTIVITY_STOCK.getRedisKey(activityPlan.getId())
+                            , this::dealActivityIng, activityPlan.getId(), 10l);
+        }
+    }
+
+    private Boolean dealActivityIng(Long activityId) {
+        ActivityPlanVo detail = activityPlanService.detail(activityId);
+        if (null == detail) {
+            return true;
+        }
+
+        ActivityPlanStandard planStandard = detail.getPlanStandard();
+        if (null == planStandard) {
+            return true;
+        }
+
+        UserFirstTimeSearch search = new UserFirstTimeSearch();
+        search.setStartTime(detail.getActivityStart());
+        search.setEndTime(detail.getActivityEnd());
+        search.setUserType(detail.getActivityClient().getCode());
+
+        String timeType = planStandard.getCondition();
+        search.setTimeType(timeType);
+        List<String> timeTypes = WrapperUtil.toList(timeType);
+
+        List<UserFirstTime> userFirstTimes = userFirstTimeService.selectAllList(search);
+        if (CollectionUtils.isEmpty(userFirstTimes)) {
+            return true;
+        }
+        Map<Long, Date> userIdSortMap = new LinkedHashMap<>();
+        if (ConditionMethodEnum.OR.equals(planStandard.getCalculationMethod())) {
+            for (int i = 0; i < userFirstTimes.size(); i++) {
+                UserFirstTime userFirstTime = userFirstTimes.get(i);
+                if (null == userIdSortMap.get(userFirstTime.getUserId())) {
+                    userIdSortMap.put(userFirstTime.getUserId(), userFirstTime.getTime());
+                }
+            }
+        } else {
+            for (int i = (userFirstTimes.size() - 1); i >= 0; i--) {
+                UserFirstTime userFirstTime = userFirstTimes.get(i);
+                if (null == userIdSortMap.get(userFirstTime.getUserId())) {
+                    userIdSortMap.put(userFirstTime.getUserId(), userFirstTime.getTime());
+                }
+            }
+        }
+
+        List<ActivityPlanRewardDto> activityPlanRewardDtos = activityPlanRewardService.queryActivityPlanReward(activityId);
+        Map<Long, List<UserFirstTime>> userMap = userFirstTimes.stream().collect(Collectors.groupingBy(UserFirstTime::getUserId));
+
+        if (ConditionMethodEnum.OR.equals(planStandard.getCalculationMethod())) {
+            for (Long userId : userIdSortMap.keySet()) {
+                Date createTime = userIdSortMap.get(userId);
+                //给用户发奖
+                sendUserReward(userId, detail.getId(), createTime, activityPlanRewardDtos);
+            }
+        } else {
+            List<Long> mainList = new ArrayList<>();
+            mainList.addAll(userIdSortMap.keySet());
+            Collections.reverse(mainList);
+
+            for (Long userId : mainList) {
+                Date createTime = userIdSortMap.get(userId);
+                List<UserFirstTime> firstTimes = userMap.get(userId);
+                if (firstTimes.size() == timeTypes.size()) {
+                    //给用户发奖
+                    sendUserReward(userId, detail.getId(), createTime, activityPlanRewardDtos);
+                }
+            }
+        }
+        return true;
+    }
+
+    private void sendUserReward(Long userId, Long activityId, Date createTime, List<ActivityPlanRewardDto> activityPlanRewardDtos) {
+        //给用户发奖
+        List<Long> successRewardIds = activityRewardService.sendReward(userId, activityId);
+
+        for (ActivityPlanRewardDto dto : activityPlanRewardDtos) {
+            ActivityUserReward userReward = new ActivityUserReward();
+            userReward.setActivityId(activityId);
+            userReward.setUserId(userId);
+            userReward.setRewardId(dto.getRewardId());
+
+            Optional<Long> first = successRewardIds.stream().filter(o -> o.equals(dto.getRewardId())).findFirst();
+            userReward.setGrantFlag(first.isPresent() ? 1 : 0);
+            userReward.setCreateTime(createTime);
+
+            ActivityUserReward one = activityUserRewardService.getOne(Wrappers.<ActivityUserReward>lambdaQuery()
+                    .eq(ActivityUserReward::getUserId, userId)
+                    .eq(ActivityUserReward::getActivityId, activityId)
+                    .eq(ActivityUserReward::getRewardId, dto.getRewardId()));
+            if(null == one){
+                activityUserRewardService.save(userReward);
+            }
+        }
+
+        //若没有报名则给用户报名
+        YesOrNoEnum yesOrNoEnum = activityRegistrationService.getRegistration(userId, activityId);
+        if (YesOrNoEnum.NO.equals(yesOrNoEnum)) {
+            ActivityRegistration registration = new ActivityRegistration();
+            registration.setActivityId(activityId);
+            registration.setUserId(userId);
+            activityRegistrationService.save(registration);
+        }
+    }
+
+    @Override
+    public void successActivity(Long activytyId) {
+        //处理活动发奖
+        dealActivityIng(activytyId);
+        //归还库存
+        activityPlanRewardService.recoveryReward(activytyId);
+    }
+}

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

@@ -28,11 +28,10 @@ public class ActivityRegistrationServiceImpl extends ServiceImpl<ActivityRegistr
     }
 
     @Override
-    public YesOrNoEnum getRegistration(Long userId, Long activityPlanId) {
-
+    public YesOrNoEnum getRegistration(Long userId, Long activityId) {
         Integer count = this.lambdaQuery()
                             .eq(ActivityRegistration::getUserId, userId)
-                            .eq(ActivityRegistration::getActivityId, activityPlanId)
+                            .eq(ActivityRegistration::getActivityId, activityId)
                             .count();
         return count>0? YesOrNoEnum.YES:YesOrNoEnum.NO;
 

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

@@ -1,26 +1,45 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
-import com.yonge.cooleshow.biz.dal.dao.ActivityPlanDao;
+import com.yonge.cooleshow.biz.dal.dao.ActivityRewardChangeStockDao;
+import com.yonge.cooleshow.biz.dal.dto.ActivityPlanRewardDto;
 import com.yonge.cooleshow.biz.dal.dto.ActivityRewardDto;
+import com.yonge.cooleshow.biz.dal.dto.search.ActivityRewardChangeStockSearch;
 import com.yonge.cooleshow.biz.dal.entity.ActivityPlan;
+import com.yonge.cooleshow.biz.dal.entity.ActivityRewardChangeStock;
+import com.yonge.cooleshow.biz.dal.entity.*;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
+import com.yonge.cooleshow.biz.dal.vo.ActivityRewardChangeStockVo;
+import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
+import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.common.enums.CacheNameEnum;
+import com.yonge.cooleshow.common.enums.RewardTypeEnum;
+import com.yonge.cooleshow.common.enums.UnitEnum;
+import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.base.util.StringUtil;
+import com.yonge.toolset.payment.util.DistributedLock;
+import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
+import org.apache.commons.collections.CollectionUtils;
+import org.redisson.RedissonMultiLock;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import com.yonge.cooleshow.biz.dal.entity.ActivityReward;
 import com.yonge.cooleshow.biz.dal.vo.ActivityRewardVo;
 import com.yonge.cooleshow.biz.dal.dto.search.ActivityRewardSearch;
 import com.yonge.cooleshow.biz.dal.dao.ActivityRewardDao;
-import com.yonge.cooleshow.biz.dal.service.ActivityRewardService;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
+import java.util.stream.Collectors;
 
 
 @Service
@@ -28,9 +47,29 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
     private final static Logger log = LoggerFactory.getLogger(ActivityRewardServiceImpl.class);
 
     @Resource
-    private ActivityPlanDao activityPlanDao;
+    private ActivityRewardChangeStockDao changeStockDao;
 
-	@Override
+    @Autowired
+    private RedissonClient redissonClient;
+
+    @Autowired
+    private ActivityPlanService activityPlanService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private SysMessageService sysMessageService;
+    @Autowired
+    private PianoRoomChangeRecordService pianoRoomChangeRecordService;
+
+
+    @Autowired
+    private ActivityPlanRewardService activityPlanRewardService;
+
+    @Autowired
+    private MemberPriceSettingsService memberPriceSettingsService;
+
+    @Override
     public ActivityRewardVo detail(Long id) {
         return baseMapper.detail(id);
     }
@@ -41,52 +80,173 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
     }
 
     @Override
-    public IPage<ActivityRewardVo> selectPage(IPage<ActivityRewardVo> page, ActivityRewardSearch query){
+    public IPage<ActivityRewardVo> selectPage(IPage<ActivityRewardVo> page, ActivityRewardSearch query) {
         return page.setRecords(baseMapper.selectPage(page, query));
     }
 
     @Override
+    public List<ActivityRewardVo> selectAll(ActivityRewardSearch query) {
+        return baseMapper.selectAll(query);
+    }
+
+    @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean submit(ActivityRewardDto activityReward, SysUser user) {
-        ActivityPlan activityPlan = new ActivityPlan();
-        activityPlan.setId(activityReward.getActivityId());
-        //更改活动状态
-        if(activityReward.getDraftFlag() == 0){
-            activityPlan.setDraftFlag(activityReward.getDraftFlag());
+        if (RewardTypeEnum.ACTUAL.equals(activityReward.getRewardType())) {
+            activityReward.setNum(1);
+            activityReward.setUnit(UnitEnum.PCS);
+        } else if (RewardTypeEnum.PIAMO_ROOM.equals(activityReward.getRewardType())) {
+            activityReward.setUnit(UnitEnum.MINUTE);
         }
-        activityPlan.setUpdateBy(user.getId());
-        activityPlanDao.updateById(activityPlan);
 
-        if(null == activityReward.getId()){
+        if (null == activityReward.getId()) {
             activityReward.setCreateBy(user.getId());
-            return createActivityReward(activityReward);
-        }else{
             activityReward.setUpdateBy(user.getId());
-            return updateActivityReward(activityReward);
+
+            baseMapper.insert(activityReward);
+        } else {
+            activityReward.setStock(null);
+            activityReward.setUpdateBy(user.getId());
+
+            baseMapper.updateById(activityReward);
         }
+        return true;
     }
 
-    private Boolean createActivityReward(ActivityReward activityReward) {
-        baseMapper.delete(Wrappers.<ActivityReward>lambdaQuery()
-                .eq(ActivityReward::getActivityId, activityReward.getActivityId())
-        );
-        baseMapper.insert(activityReward);
+    @Override
+    public List<ActivityReward> getActivityReward(Long activityPlanId) {
+        return baseMapper.getActivityReward(activityPlanId);
+    }
 
+    @Override
+    public Boolean updateStatus(Long id, Integer status, Long userId) {
+        ActivityReward activityReward = new ActivityReward();
+        activityReward.setId(id);
+        //更改活动状态
+        activityReward.setStatus(status);
+        activityReward.setUpdateBy(userId);
+        updateById(activityReward);
         return true;
     }
 
-    private Boolean updateActivityReward(ActivityReward activityReward) {
-        baseMapper.updateById(activityReward);
-        return true;
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean updateStock(ActivityRewardChangeStock changeStock) {
+        return DistributedLock.of(redissonClient)
+                .runIfLockToFunction(CacheNameEnum.LOCK_REWARD_STOCK.getRedisKey(changeStock.getRewardId())
+                        , (param) -> {
+                            ActivityReward activityReward = getById(param.getRewardId());
+                            Integer stock = (InOrOutEnum.IN.equals(param.getChangeType()))
+                                    ? (activityReward.getStock() + param.getStock()) : (activityReward.getStock() - param.getStock());
+                            if (stock < 0) {
+                                throw new BizException("库存不足");
+                            }
+                            activityReward.setStock(stock);
+                            activityReward.setUpdateBy(param.getCreateBy());
+                            baseMapper.updateById(activityReward);
+
+                            changeStockDao.insert(param);
+                            return true;
+                        }, changeStock, 10l);
     }
 
     @Override
-    public List<ActivityReward> getActivityReward(Long activityPlanId) {
+    public IPage<ActivityRewardChangeStockVo> selectChangeStockPage(IPage<ActivityRewardChangeStockVo> page, ActivityRewardChangeStockSearch query) {
+        return page.setRecords(changeStockDao.selectPage(page, query));
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public List<Long> sendReward(Long userId, Long activityId) {
+        if (userRewarded(userId, activityId)) {
+            return new ArrayList<>();
+        }
+        ActivityPlan activityPlan = activityPlanService.getById(activityId);
+        if (activityPlan == null) {
+            log.warn("活动不存在");
+            return null;
+        }
+
+        List<ActivityPlanRewardDto> activityPlanRewardDtos = activityPlanRewardService.queryActivityPlanReward(
+                activityId);
+
+        if (CollectionUtils.isEmpty(activityPlanRewardDtos)) {
+            return new ArrayList<>();
+        }
 
-        return this.lambdaQuery()
-                .eq(ActivityReward::getActivityId,activityPlanId)
-                .list();
+        // 级联锁同时处理奖品库存
+        List<RLock> lockList = new ArrayList<>();
+        for (ActivityPlanRewardDto activityReward : activityPlanRewardDtos) {
+            lockList.add(redissonClient.getLock(CacheNameEnum.LOCK_ACTIVITY_REWARD_STOCK.getRedisKey(activityReward.getId())));
+        }
+
+        RedissonMultiLock lock = new RedissonMultiLock(lockList.toArray(new RLock[lockList.size()]));
+
+        List<Long> activityRewardIdList = new ArrayList<>();
+        List<String> rewardNameList = new ArrayList<>();
+        try {
+            lock.lock();
+            for (ActivityPlanRewardDto activityReward : activityPlanRewardDtos) {
+                int update = activityPlanRewardService.reduceStock(activityId, activityReward.getActivityReward().getId());
+                if (update == 0) {
+                    continue;
+                }
+                if (activityReward.getActivityReward().getRewardType().equals(RewardTypeEnum.PIAMO_ROOM)) {
+                    PianoRoomChangeRecord pianoRoomChangeRecord = new PianoRoomChangeRecord();
+                    pianoRoomChangeRecord.setUserId(userId);
+                    pianoRoomChangeRecord.setInOrOut(InOrOutEnum.IN);
+                    pianoRoomChangeRecord.setSourceType(SourceTypeEnum.ACTIVITY);
+                    pianoRoomChangeRecord.setTimes(activityReward.getActivityReward().getNum());
+                    pianoRoomChangeRecord.setBizId(activityId.toString());
+                    pianoRoomChangeRecord.setCreateTime(new Date());
+                    pianoRoomChangeRecord.setReason(activityPlan.getActivityName());
+                    pianoRoomChangeRecordService.add(pianoRoomChangeRecord);
+                } else if (activityReward.getActivityReward().getRewardType().equals(RewardTypeEnum.VIP)) {
+                    memberPriceSettingsService.activityReward(userId, activityPlan.getActivityClient(), activityReward.getActivityReward(), activityId);
+                }
+                rewardNameList.add(activityReward.getActivityReward().getRewardName());
+                activityRewardIdList.add(activityReward.getActivityReward().getId());
+            }
+            // 发送活动获奖推送
+            if (!CollectionUtils.isEmpty(rewardNameList)) {
+                String name = String.join(",", rewardNameList);
+                sendActivityMessage(userId, activityPlan.getActivityName(),name, activityPlan.getActivityClient());
+            }
+        } finally {
+            lock.unlock();
+        }
 
+        return activityRewardIdList;
     }
 
+    private Boolean userRewarded(Long userId, Long activityId) {
+        return baseMapper.userRewarded(userId, activityId);
+    }
+
+    /**
+     * 获奖人员发送
+     *
+     * @param userId             用户id
+     * @param activityName       活动名
+     * @param activityRewardName 活动奖品名
+     */
+    private void sendActivityMessage(Long userId, String activityName, String activityRewardName, ClientEnum clientType) {
+        SysUser user = sysUserFeignService.queryUserById(userId);
+        if (user == null) {
+            log.warn("用户未找到");
+            return;
+        }
+
+        try {
+            Map<Long, String> receivers = new HashMap<>();
+            receivers.put(userId, user.getPhone());
+
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.ACTIVITY_WIN, receivers, null,
+                    0, null, clientType.getCode(), activityName, activityRewardName);
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("获奖消息发送失败,{}", e.getMessage());
+        }
+
+    }
 }

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

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.biz.dal.vo.UserRewardVo;
 import org.springframework.stereotype.Service;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -22,7 +23,7 @@ public class ActivityUserRewardServiceImpl extends ServiceImpl<ActivityUserRewar
     }
     
     @Override
-    public IPage<ActivityUserRewardVo> selectPage(IPage<ActivityUserRewardVo> page, ActivityUserRewardSearch query){
+    public IPage<UserRewardVo> selectPage(IPage<UserRewardVo> page, ActivityUserRewardSearch query){
         return page.setRecords(baseMapper.selectPage(page, query));
     }
 	

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

@@ -898,25 +898,26 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
                     teacherInfo.getUsername(), courseGroup.getName(), smsLiveBuyUrl);
             log.info("buyLiveCourseSuccess buyLiveSendMessage SMS_BUY_LIVE ok");
 
-            //极光-消息推送-老师端-通知老师有学生购买课程-跳转到APP
-            MessageTypeEnum studentBuyLive = MessageTypeEnum.STUDENT_BUY_LIVE;
-            //查询推送跳转的url
-            String studentBuyLiveUrl = sysMessageService.selectConfigUrl(studentBuyLive.getCode(), courseGroup.getId());
-            Map<Long, String> teacherReceivers = new HashMap<>();
-            teacherReceivers.put(teacherInfo.getId(), teacherInfo.getPhone());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, studentBuyLive,
-                    teacherReceivers, null, 0, studentBuyLiveUrl, ClientEnum.TEACHER.getCode(),
-                    studentInfo.getUsername(), courseGroup.getName());
-            log.info("buyLiveCourseSuccess buyLiveSendMessage STUDENT_BUY_LIVE ok");
-
-            //短信-消息推送-老师端-通知老师有学生购买课程-无需跳转到APP
-            Map<Long, String> smsTeacherReceivers = new HashMap<>();
-            smsTeacherReceivers.put(teacherInfo.getId(), teacherInfo.getPhone());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_BUY_LIVE,
-                    smsTeacherReceivers, null, 0, null, null,
-                    studentInfo.getUsername(), courseGroup.getName());
-            log.info("buyLiveCourseSuccess buyLiveSendMessage SMS_BUY_LIVE ok");
+            if (studentPayment.getActualPrice().compareTo(BigDecimal.ZERO) >0) {
+                //极光-消息推送-老师端-通知老师有学生购买课程-跳转到APP
+                MessageTypeEnum studentBuyLive = MessageTypeEnum.STUDENT_BUY_LIVE;
+                //查询推送跳转的url
+                String studentBuyLiveUrl = sysMessageService.selectConfigUrl(studentBuyLive.getCode(), courseGroup.getId());
+                Map<Long, String> teacherReceivers = new HashMap<>();
+                teacherReceivers.put(teacherInfo.getId(), teacherInfo.getPhone());
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, studentBuyLive,
+                                                   teacherReceivers, null, 0, studentBuyLiveUrl, ClientEnum.TEACHER.getCode(),
+                                                   studentInfo.getUsername(), courseGroup.getName());
+                log.info("buyLiveCourseSuccess buyLiveSendMessage STUDENT_BUY_LIVE ok");
+
+                //短信-消息推送-老师端-通知老师有学生购买课程-无需跳转到APP
+                Map<Long, String> smsTeacherReceivers = new HashMap<>();
+                smsTeacherReceivers.put(teacherInfo.getId(), teacherInfo.getPhone());
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_BUY_LIVE,
+                                                   smsTeacherReceivers, null, 0, null, null, studentInfo.getUsername(), courseGroup.getName());
+                log.info("buyLiveCourseSuccess buyLiveSendMessage SMS_BUY_LIVE ok");
 
+            }
             //判断是否到达最低成课人数
             if (Objects.equals(courseGroup.getPreStudentNum(), courseGroup.getMixStudentNum())) {
                 //极光-消息推送-老师端-通知老师课程最小开课人数已达标

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

@@ -1,17 +1,24 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.biz.dal.dao.CourseScheduleDao;
 import com.yonge.cooleshow.biz.dal.dao.HomeDao;
+import com.yonge.cooleshow.biz.dal.dto.SubjectHomeSearch;
 import com.yonge.cooleshow.biz.dal.dto.req.TotalReq;
 import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
+import com.yonge.cooleshow.biz.dal.enums.TeacherTagEnum;
 import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
 import com.yonge.cooleshow.biz.dal.service.HomeService;
 import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
 import com.yonge.cooleshow.biz.dal.vo.CourseHomeVo;
+import com.yonge.cooleshow.biz.dal.vo.SubjectHomeVo;
+import com.yonge.cooleshow.biz.dal.vo.TagTotalTeacher;
 import com.yonge.cooleshow.biz.dal.vo.res.HomeTotalStudent;
 import com.yonge.cooleshow.biz.dal.vo.res.HomeTotalTeacher;
 import com.yonge.cooleshow.biz.dal.vo.res.HomeUserToDoNum;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.mybatis.support.PageUtil;
 import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -48,26 +55,83 @@ public class HomeServiceImpl implements HomeService {
     public HttpResponseResult<HomeTotalTeacher> totalTeacher(TotalReq query) {
         //统计查询
         List<HomeTotalTeacher> totalList = baserMapper.totalTeacher(query.getTimeType().getCode(), query);
+
+        // 点亮图标
+        List<TagTotalTeacher> tagList = baserMapper.tagTeacher(query.getTimeType().getCode(), query);
+
+        Map<String, Map<String, List<TagTotalTeacher>>> tagTimeTypeGroup = tagList.stream()
+                                                                         .collect(Collectors.groupingBy(
+                                                                                 TagTotalTeacher::getTimeStr,
+                                                                                 Collectors.groupingBy(
+                                                                                         TagTotalTeacher::getTagType)));
+        Map<String, Map<Long, List<TagTotalTeacher>>> tagTimeUserGroup = tagList.stream()
+                                                                       .collect(Collectors.groupingBy(
+                                                                               TagTotalTeacher::getTimeStr,
+                                                                               Collectors.groupingBy(
+                                                                                       TagTotalTeacher::getUserId)));
+
         Integer registerNum = 0;
         Integer entryNum = 0;
         Integer liveNum = 0;
         Integer musicianNum = 0;
+        Integer tagNum  = tagList.stream().collect(Collectors.groupingBy(TagTotalTeacher::getUserId)).size();
+        Integer styleTagNum = 0;
+        Integer videoTagNum = 0;
+        Integer liveTagNum = 0;
+        Integer musicTagNum = 0;
         for (HomeTotalTeacher totalTeacher : totalList) {
             totalTeacher.setRegisterNum(null == totalTeacher.getRegisterNum() ? 0 : totalTeacher.getRegisterNum());
             totalTeacher.setEntryNum(null == totalTeacher.getEntryNum() ? 0 : totalTeacher.getEntryNum());
             totalTeacher.setLiveNum(null == totalTeacher.getLiveNum() ? 0 : totalTeacher.getLiveNum());
             totalTeacher.setMusicianNum(null == totalTeacher.getMusicianNum() ? 0 : totalTeacher.getMusicianNum());
 
+            Map<String, List<TagTotalTeacher>> typeGroup = tagTimeTypeGroup.get(totalTeacher.getTimeStr());
+            if (typeGroup != null) {
+                List<TagTotalTeacher> liveTagList = typeGroup.get(TeacherTagEnum.LIVE.getCode());
+                List<TagTotalTeacher> musicTagList = typeGroup.get(TeacherTagEnum.MUSIC.getCode());
+                List<TagTotalTeacher> styleTagList = typeGroup.get(TeacherTagEnum.STYLE.getCode());
+                List<TagTotalTeacher> videoTagList = typeGroup.get(TeacherTagEnum.VIDEO.getCode());
+                totalTeacher.setLiveTagNum(CollectionUtils.isEmpty(liveTagList) ? 0:liveTagList.size());
+                totalTeacher.setMusicTagNum(CollectionUtils.isEmpty(musicTagList) ? 0:musicTagList.size());
+                totalTeacher.setStyleTagNum(CollectionUtils.isEmpty(styleTagList) ? 0:styleTagList.size());
+                totalTeacher.setVideoTagNum(CollectionUtils.isEmpty(videoTagList) ? 0:videoTagList.size());
+            } else {
+                totalTeacher.setLiveTagNum(0);
+                totalTeacher.setMusicTagNum(0);
+                totalTeacher.setStyleTagNum(0);
+                totalTeacher.setVideoTagNum(0);
+            }
+
+
+            Map<Long, List<TagTotalTeacher>> userGroup = tagTimeUserGroup.get(totalTeacher.getTimeStr());
+
+            if (userGroup != null) {
+
+                totalTeacher.setTagNum(userGroup.size());
+            } else {
+                totalTeacher.setTagNum(0);
+            }
+
+
             registerNum += totalTeacher.getRegisterNum();
             entryNum += totalTeacher.getEntryNum();
             liveNum += totalTeacher.getLiveNum();
             musicianNum += totalTeacher.getMusicianNum();
+            styleTagNum += totalTeacher.getStyleTagNum();
+            videoTagNum += totalTeacher.getVideoTagNum();
+            liveTagNum += totalTeacher.getLiveTagNum();
+            musicTagNum += totalTeacher.getMusicTagNum();
         }
         HomeTotalTeacher total = new HomeTotalTeacher();
         total.setRegisterNum(registerNum);
         total.setEntryNum(entryNum);
         total.setLiveNum(liveNum);
         total.setMusicianNum(musicianNum);
+        total.setTagNum(tagNum);
+        total.setStyleTagNum(styleTagNum);
+        total.setVideoTagNum(videoTagNum);
+        total.setLiveTagNum(liveTagNum);
+        total.setMusicTagNum(musicTagNum);
         total.setInfoList(totalList);
         return HttpResponseResult.succeed(total);
     }
@@ -82,6 +146,7 @@ public class HomeServiceImpl implements HomeService {
         Integer liveNum = 0;
         Integer musicNum = 0;
         Integer shoppingNum = 0;
+        Integer payStudentNum = 0;
 
         for (HomeTotalStudent totalStudent : totalList) {
             totalStudent.setRegisterNum(null == totalStudent.getRegisterNum() ? 0 : totalStudent.getRegisterNum());
@@ -91,6 +156,7 @@ public class HomeServiceImpl implements HomeService {
             totalStudent.setLiveNum(null == totalStudent.getLiveNum() ? 0 : totalStudent.getLiveNum());
             totalStudent.setMusicNum(null == totalStudent.getMusicNum() ? 0 : totalStudent.getMusicNum());
             totalStudent.setShoppingNum(null == totalStudent.getShoppingNum() ? 0 : totalStudent.getShoppingNum());
+            totalStudent.setPayStudentNum(null == totalStudent.getPayStudentNum() ? 0 : totalStudent.getPayStudentNum());
 
             registerNum += totalStudent.getRegisterNum();
             vipNum += totalStudent.getVipNum();
@@ -99,6 +165,7 @@ public class HomeServiceImpl implements HomeService {
             liveNum += totalStudent.getLiveNum();
             musicNum += totalStudent.getMusicNum();
             shoppingNum += totalStudent.getShoppingNum();
+            payStudentNum += totalStudent.getPayStudentNum();
         }
         HomeTotalStudent total = new HomeTotalStudent();
         total.setRegisterNum(registerNum);
@@ -108,6 +175,7 @@ public class HomeServiceImpl implements HomeService {
         total.setLiveNum(liveNum);
         total.setMusicNum(musicNum);
         total.setShoppingNum(shoppingNum);
+        total.setPayStudentNum(payStudentNum);
 
         total.setInfoList(totalList);
         return HttpResponseResult.succeed(total);
@@ -198,4 +266,14 @@ public class HomeServiceImpl implements HomeService {
         return result;
     }
 
+    @Override
+    public PageInfo<SubjectHomeVo> subjectHome(IPage<SubjectHomeVo> page, SubjectHomeSearch query) {
+        PageInfo<SubjectHomeVo> subjectHomeVoPageInfo = PageUtil.pageInfo(baserMapper.selectSubjectHome(page, query));
+        List<SubjectHomeVo> rows = subjectHomeVoPageInfo.getRows();
+        for (int i = 0; i < rows.size(); i++) {
+            rows.get(i).setIndex((subjectHomeVoPageInfo.getPageNo() -1) * subjectHomeVoPageInfo.getLimit() + i + 1);
+        }
+        return subjectHomeVoPageInfo;
+    }
+
 }

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

@@ -7,9 +7,7 @@ import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
-import com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord;
 import com.yonge.cooleshow.biz.dal.entity.VipCardRecord;
-import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.service.*;
 
 import com.yonge.cooleshow.biz.dal.vo.ShareProfitVo;
@@ -21,8 +19,8 @@ import com.yonge.cooleshow.biz.dal.vo.*;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.string.MessageFormatter;
-import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import com.yonge.toolset.utils.date.DateUtil;
 import org.springframework.beans.BeanUtils;
@@ -93,10 +91,26 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
 
         VipCardRecord vipCardRecord = vipCardRecordService.buildVipCardRecordByOrderDetail(orderDetailVo);
 
-        UserVipInfoVo userVipInfoVo = getVipInfo(orderDetailVo.getOrderClient(),orderDetailVo.getUserId());
+        UserVipInfoVo userVipInfoVo = getUserVipInfoVo(vipCardRecord);
+        //会员购买消息推送
+        authSend(userVipInfoVo.getUserId(), userVipInfoVo.getPhone(), DateUtil.format(vipCardRecord.getEndTime(), DateUtil.DEFAULT_PATTERN),orderDetailVo.getOrderClient());
+    }
+
+
+    @Override
+    public void activityReward(Long userId, ClientEnum client, ActivityReward activityReward, Long activityId) {
+
+        VipCardRecord vipCardRecord = vipCardRecordService.buildVipCardRecordByOrderDetail(userId,client,activityReward,activityId);
+
+        getUserVipInfoVo(vipCardRecord);
+    }
+
+    private UserVipInfoVo getUserVipInfoVo(VipCardRecord vipCardRecord) {
+        UserVipInfoVo userVipInfoVo = getVipInfo(vipCardRecord.getClientType(), vipCardRecord.getUserId());
 
         if (userVipInfoVo == null) {
             log.error("未找到用户信息");
+            throw new BizException("未找到用户信息");
         }
 
         if (null == userVipInfoVo.getMembershipEndTime() || userVipInfoVo.getMembershipEndTime().before(new Date())) {
@@ -113,8 +127,7 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
 
         //会员购买记录入库
         vipCardRecordService.save(vipCardRecord);
-        //会员购买消息推送
-        authSend(userVipInfoVo.getUserId(), userVipInfoVo.getPhone(), DateUtil.format(vipCardRecord.getEndTime(), DateUtil.DEFAULT_PATTERN),orderDetailVo.getOrderClient());
+        return userVipInfoVo;
     }
 
     private void updateUser(UserVipInfoVo userVipInfoVo) {

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

@@ -60,6 +60,12 @@ public class MusicTagServiceImpl extends ServiceImpl<MusicTagDao, MusicTag> impl
          musicTagVoIPage.getRecords()
                  .forEach(musicTagVo -> {
                      List<MusicTagVo> childrenList = musicTagMap.get(musicTagVo.getId().toString());
+                     childrenList.forEach(children -> {
+                         musicTagVo.setEnablePlatformMusicSheetNum(musicTagVo.getEnablePlatformMusicSheetNum() + children.getEnablePlatformMusicSheetNum());
+                         musicTagVo.setEnableTeacherMusicSheetNum(musicTagVo.getEnableTeacherMusicSheetNum() + children.getEnableTeacherMusicSheetNum());
+                         musicTagVo.setMusicPlatformSheetNum(musicTagVo.getMusicPlatformSheetNum() + children.getMusicPlatformSheetNum());
+                         musicTagVo.setMusicTeacherSheetNum(musicTagVo.getMusicTeacherSheetNum() + children.getMusicTeacherSheetNum());
+                     });
                      // 如果没有按名称/编号查询 或 父级标签包含了名称/编号 , 展示所有子集 标签列表子集收起
                      if (StringUtil.isBlank(query.getIdAndName())
                              || musicTagVo.getName().contains(query.getIdAndName())

+ 38 - 28
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PianoRoomChangeRecordServiceImpl.java

@@ -9,10 +9,9 @@ import com.yonge.cooleshow.biz.dal.entity.PianoRoomTime;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
 import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.PianoRoomTimeService;
 import com.yonge.cooleshow.biz.dal.service.SysMessageService;
-import com.yonge.cooleshow.biz.dal.vo.VideoLessonGroupVo;
-import com.yonge.cooleshow.biz.dal.vo.VideoLessonShelvesVo;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.payment.util.DistributedLock;
@@ -63,36 +62,47 @@ public class PianoRoomChangeRecordServiceImpl extends ServiceImpl<PianoRoomChang
         //保存记录
         save(pianoRoomChangeRecord);
         //入琴房账户
+        setPianoRoomTime(pianoRoomChangeRecord.getUserId(), pianoRoomChangeRecord.getTimes(), pianoRoomChangeRecord.getInOrOut());
+        //琴房推送
+        sendMessage(pianoRoomChangeRecord);
+        return true;
+    }
+
+    /**
+     * 增/减老师琴房课时长
+     *
+     * @param userId 老师id
+     * @param times 时长
+     * @param inOrOut 增/减
+     */
+    private void setPianoRoomTime(Long userId, Integer times, InOrOutEnum inOrOut) {
         DistributedLock.of(redissonClient)
-                .runIfLockToFunction(CacheNameEnum.LOCK_CHANGE_PIANO_ROOM_ACCOUNT.getRedisKey(pianoRoomChangeRecord.getUserId())
-                        , (o) -> {
-                            PianoRoomTime pianoRoomTime = pianoRoomTimeService.getOne(Wrappers.<PianoRoomTime>lambdaQuery()
-                                    .eq(PianoRoomTime::getTeacherId, pianoRoomChangeRecord.getUserId()));
+                       .runIfLockToFunction(CacheNameEnum.LOCK_CHANGE_PIANO_ROOM_ACCOUNT.getRedisKey(userId)
+                               , (o) -> {
+                                        PianoRoomTime pianoRoomTime = pianoRoomTimeService.getOne(Wrappers.<PianoRoomTime>lambdaQuery()
+                                                .eq(PianoRoomTime::getTeacherId, userId));
 
-                            if (null == pianoRoomTime) {
-                                pianoRoomTime = new PianoRoomTime();
-                                pianoRoomTime.setRemainTime(0);
-                                pianoRoomTime.setFrozenTime(0);
-                                pianoRoomTime.setTeacherId(pianoRoomChangeRecord.getUserId());
-                                pianoRoomTimeService.save(pianoRoomTime);
-                            }
+                                        if (null == pianoRoomTime) {
+                                            pianoRoomTime = new PianoRoomTime();
+                                            pianoRoomTime.setRemainTime(0);
+                                            pianoRoomTime.setFrozenTime(0);
+                                            pianoRoomTime.setTeacherId(userId);
+                                            pianoRoomTimeService.save(pianoRoomTime);
+                                        }
 
-                            if (InOrOutEnum.IN.equals(pianoRoomChangeRecord.getInOrOut())) {
-                                pianoRoomTime.setRemainTime(pianoRoomTime.getRemainTime() + pianoRoomChangeRecord.getTimes());
-                            } else {
-                                pianoRoomTime.setRemainTime(pianoRoomTime.getRemainTime() - pianoRoomChangeRecord.getTimes());
-                            }
+                                        if (InOrOutEnum.IN.equals(inOrOut)) {
+                                            pianoRoomTime.setRemainTime(pianoRoomTime.getRemainTime() + times);
+                                        } else {
+                                            pianoRoomTime.setRemainTime(pianoRoomTime.getRemainTime() - times);
+                                        }
 
-                            if (pianoRoomTime.getRemainTime() < 0) {
-                                throw new BizException("扣除时长超过老师可用时长");
-                            }
-                            pianoRoomTime.setUpdateTime(new Date());
-                            pianoRoomTimeService.updateById(pianoRoomTime);
-                            return null;
-                        }, null, 10l);
-        //琴房推送
-        sendMessage(pianoRoomChangeRecord);
-        return true;
+                                        if (pianoRoomTime.getRemainTime() < 0) {
+                                            throw new BizException("扣除时长超过老师可用时长");
+                                        }
+                                        pianoRoomTime.setUpdateTime(new Date());
+                                        pianoRoomTimeService.updateById(pianoRoomTime);
+                                        return null;
+                               }, null, 10l);
     }
 
 

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

@@ -121,8 +121,8 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
     private List<Subject> getCacheByType(Long userId, String type) {
         RMap<String, List<Subject>> map = redissonClient.getMap(CacheNameEnum.STUDENT_SUBJECT_ITEM.getRedisKey(userId));
         //设置过期时间
-        map.expire(CacheNameEnum.STUDENT_SUBJECT_ITEM.getDuration().toHours(),
-                TimeUnit.HOURS);
+        map.expire(CacheNameEnum.STUDENT_SUBJECT_ITEM.getDuration().toMinutes(),
+                TimeUnit.MINUTES);
 
         if (StringUtil.isEmpty(type)) {
             List<Subject> subjectList = map.get("ALL");

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

@@ -19,6 +19,7 @@ import com.yonge.cooleshow.biz.dal.dao.StudentTimeDao;
 import com.yonge.cooleshow.biz.dal.service.StudentTimeService;
 import org.springframework.util.CollectionUtils;
 
+import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
@@ -70,6 +71,9 @@ public class StudentTimeServiceImpl extends ServiceImpl<StudentTimeDao, StudentT
             List<UserOrderDetailVo> orderDetilListByOrderNo = orderDetailService.getOrderDetilListByOrderNo(userOrder.getOrderNo());
 
             for (UserOrderDetailVo detailVo : orderDetilListByOrderNo) {
+                if (detailVo.getActualPrice() != null && detailVo.getActualPrice().compareTo(BigDecimal.ZERO) > 0 && studentTime.getFirstPayTime() == null) {
+                    studentTime.setFirstPayTime(now);
+                }
                 if (null == studentTime.getFirstVipTime() && GoodTypeEnum.VIP.equals(detailVo.getGoodType())) {
                     studentTime.setFirstVipTime(now);
                 }
@@ -85,6 +89,9 @@ public class StudentTimeServiceImpl extends ServiceImpl<StudentTimeDao, StudentT
                 if (null == studentTime.getFirstMusicTime() && GoodTypeEnum.MUSIC.equals(detailVo.getGoodType())) {
                     studentTime.setFirstMusicTime(now);
                 }
+                if (null == studentTime.getFirstActivityTime() && GoodTypeEnum.ACTI_REGIST.equals(detailVo.getGoodType())) {
+                    studentTime.setFirstActivityTime(now);
+                }
             }
 
             StudentTime old = baseMapper.selectById(userOrder.getUserId());

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików