Browse Source

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

yonge 3 years ago
parent
commit
d9f95fb099
49 changed files with 1188 additions and 230 deletions
  1. 11 1
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/AdminFeignService.java
  2. 5 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/AdminFeignServiceFallback.java
  3. 1 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/CacheNameEnum.java
  4. 35 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/UserFirstTimeTypeEnum.java
  5. 19 0
      cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/ActivityIngTask.java
  6. 1 2
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ActivityPlanController.java
  7. 0 1
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ActivityRewardController.java
  8. 1 11
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ActivityUserRewardController.java
  9. 7 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/task/TaskController.java
  10. 0 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityPlanDao.java
  11. 21 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityRewardChangeStockDao.java
  12. 43 34
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityRewardDao.java
  13. 18 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserFirstTimeDao.java
  14. 67 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/ActivityRewardChangeStockSearch.java
  15. 69 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/ActivityUserRewardSearch.java
  16. 75 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/UserFirstTimeSearch.java
  17. 0 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityPlan.java
  18. 0 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityPlanEvaluation.java
  19. 5 16
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityPlanStandard.java
  20. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityUserReward.java
  21. 3 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicSheet.java
  22. 102 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserFirstTime.java
  23. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityPlanEvaluationService.java
  24. 7 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityPlanRewardService.java
  25. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityPlanService.java
  26. 3 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityPlanStandardService.java
  27. 15 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityRewardService.java
  28. 41 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserFirstTimeService.java
  29. 33 9
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanEvaluationServiceImpl.java
  30. 16 9
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanRewardServiceImpl.java
  31. 106 55
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanServiceImpl.java
  32. 96 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanStandardServiceImpl.java
  33. 24 18
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityRewardServiceImpl.java
  34. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicTagServiceImpl.java
  35. 39 16
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/SysMessageServiceImpl.java
  36. 7 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherAuthEntryRecordServiceImpl.java
  37. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java
  38. 51 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserFirstTimeServiceImpl.java
  39. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/ActivityRewardChangeStockVo.java
  40. 85 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserRewardVo.java
  41. 2 4
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityPlanEvaluationMapper.xml
  42. 0 4
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityPlanMapper.xml
  43. 5 3
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityPlanStandardMapper.xml
  44. 38 4
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityRewardChangeStockMapper.xml
  45. 5 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityRewardMapper.xml
  46. 31 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityUserRewardMapper.xml
  47. 8 7
      cooleshow-user/user-biz/src/main/resources/config/mybatis/HomeMapper.xml
  48. 45 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserFirstTimeMapper.xml
  49. 10 8
      toolset/thirdparty-component/src/main/java/com/yonge/toolset/thirdparty/message/MessageSenderPluginContext.java

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

@@ -78,7 +78,17 @@ 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();
 }

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

@@ -65,4 +65,9 @@ public class AdminFeignServiceFallback implements AdminFeignService {
     public HttpResponseResult activityState() {
         return null;
     }
+
+    @Override
+    public HttpResponseResult activityIng() {
+        return null;
+    }
 }

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

@@ -28,6 +28,7 @@ public enum CacheNameEnum implements BaseEnum<String, CacheNameEnum> {
     LOCK_WITHDRAWAL("锁用户结算"),
     LOCK_REWARD_STOCK("锁奖品库存变更"),
     LOCK_ACTIVITY_REWARD_STOCK("锁活动奖品变更"),
+    LOCK_ACTIVITY_STOCK("锁活动变更"),
     ;
     /***
      * 缓存描述

+ 35 - 0
cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/UserFirstTimeTypeEnum.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 UserFirstTimeTypeEnum implements BaseEnum<String, UserFirstTimeTypeEnum> {
+
+    ENTRY("达人认证"),
+    LIVEING("开通直播"),
+    ;
+
+    @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 - 2
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ActivityPlanController.java

@@ -126,6 +126,7 @@ public class ActivityPlanController extends BaseController {
         if (user == null || null == user.getId()) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
+
         if (CollectionUtils.isEmpty(updateRewardDtoList)) {
             return failed("参数异常");
         }
@@ -138,6 +139,4 @@ public class ActivityPlanController extends BaseController {
             return HttpResponseResult.failed("变更失败");
         }
     }
-
-
 }

+ 0 - 1
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ActivityRewardController.java

@@ -146,5 +146,4 @@ public class ActivityRewardController extends BaseController {
         return succeed(PageUtil.pageInfo(pages));
     }
 
-
 }

+ 1 - 11
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ActivityUserRewardController.java

@@ -40,18 +40,8 @@ public class ActivityUserRewardController extends BaseController {
      */
     @PostMapping("/page")
     @ApiOperation(value = "查询分页", notes = "传入activityUserRewardSearch")
-    public HttpResponseResult<PageInfo<ActivityUserRewardVo>> page(@RequestBody ActivityUserRewardSearch query) {
+    public HttpResponseResult<PageInfo<ActivityUserRewardVo>> page(@RequestBody @Valid ActivityUserRewardSearch query) {
 		IPage<ActivityUserRewardVo> 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));
-	}
-
 }

+ 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 - 6
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityPlanDao.java

@@ -59,11 +59,5 @@ public interface ActivityPlanDao extends BaseMapper<ActivityPlan> {
 	 */
     List<ActivityPlan> activityState();
 
-	/**
-	 * 需要发奖的活动
-	 * @return
-	 */
-    List<ActivityPlan> activityReward();
-
 
 }

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

@@ -1,8 +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);
 }

+ 43 - 34
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityRewardDao.java

@@ -11,39 +11,48 @@ import com.yonge.cooleshow.biz.dal.dto.search.ActivityRewardSearch;
 
 
 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);
-
-	/**
-	 * 分页查询
-	 *
-	 * @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);
-
-	/**
-	 * 列表查询
-	 *
-	 * @param activityReward
-	 * @return
-	 */
-	List<ActivityRewardVo> selectAll(@Param("param") ActivityRewardSearch activityReward);
-
-	/**
-	 * 活动奖品
-	 *
-	 * @param activityPlanId 活动id
-	 * @return
-	 */
+    /**
+     * 查询详情
+     *
+     * @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);
+
+    /**
+     * 分页查询
+     *
+     * @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);
+
+    /**
+     * 列表查询
+     *
+     * @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);
 }

+ 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);
+}

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

@@ -1,7 +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.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 javax.validation.constraints.NotNull;
+import java.util.Date;
 
 /**
  * @Author: liweifan
@@ -11,4 +19,63 @@ import io.swagger.annotations.ApiModel;
 public class ActivityRewardChangeStockSearch extends QueryInfo{
 	private static final long serialVersionUID = 1L;
 
+	@ApiModelProperty(value = "变更来源:ADMIN 后台调整 ACTIVITY 活动分配 ",hidden = true)
+	private String source;
+
+	@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 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;
+	}
 }

+ 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;
+	}
 }

+ 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;
+	}
+}

+ 0 - 5
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityPlan.java

@@ -49,19 +49,15 @@ public class ActivityPlan implements Serializable {
     private String describe;
     @ApiModelProperty("规则描述 ")
     @TableField(value = "rule_describe_")
-    @NotBlank(message = "活动规则不能为空")
     private String ruleDescribe;
     @ApiModelProperty("主题图片 ")
     @TableField(value = "subject_url_")
-    @NotBlank(message = "主题图片不能为空")
     private String subjectUrl;
     @ApiModelProperty("平铺背景 ")
     @TableField(value = "background_url_")
-    @NotBlank(message = "平铺背景不能为空")
     private String backgroundUrl;
     @ApiModelProperty("分享图片 ")
     @TableField(value = "share_url_")
-    @NotBlank(message = "分享图片不能为空")
     private String shareUrl;
     @ApiModelProperty("活动链接 ")
     @TableField(value = "activity_url_")
@@ -80,7 +76,6 @@ public class ActivityPlan implements Serializable {
     private Date activityEnd;
     @ApiModelProperty("报名方式 FREE 免费 CHARGE 收费 ")
     @TableField(value = "registration_method_")
-    @NotNull(message = "报名缴费方式不能为空")
     private RegistrationMethodEnum registrationMethod;
     @ApiModelProperty("报名价格 ")
     @TableField(value = "registration_price_")

+ 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;

+ 5 - 16
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityPlanStandard.java

@@ -1,9 +1,9 @@
 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.common.enums.ConditionMethodEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -20,17 +20,14 @@ import org.springframework.format.annotation.DateTimeFormat;
 public class ActivityPlanStandard implements Serializable {
 	private static final long serialVersionUID = 1L;
     @ApiModelProperty("主键 ")
-    @TableId(value = "id_", type = IdType.AUTO)
+    @TableId(value = "id_")
     private Long id;
-    @ApiModelProperty("活动id ")
-	@TableField(value = "activity_id_")
-    private Long activityId;
     @ApiModelProperty("达标条件:ENTRY 达人认证 LIVEING 开通直播 PRACTICE 首次完成陪练课设置 LIVE 首次创建直播课 VIDEO 首次创建视频课 BIND_STUDENT 学员绑定 ")
 	@TableField(value = "condition_")
     private String condition;
     @ApiModelProperty("计算方式:AND 全部满足 OR 满足其一 ")
 	@TableField(value = "calculation_method")
-    private String calculationMethod;
+    private ConditionMethodEnum calculationMethod;
     @ApiModelProperty("创建时间 ")
 	@TableField(value = "create_time_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@@ -55,15 +52,7 @@ public class ActivityPlanStandard implements Serializable {
     public void setId(Long id) {
         this.id = id;
     }
-    
-	public Long getActivityId() {
-        return activityId;
-    }
 
-    public void setActivityId(Long activityId) {
-        this.activityId = activityId;
-    }
-    
 	public String getCondition() {
         return condition;
     }
@@ -72,11 +61,11 @@ public class ActivityPlanStandard implements Serializable {
         this.condition = condition;
     }
     
-	public String getCalculationMethod() {
+	public ConditionMethodEnum getCalculationMethod() {
         return calculationMethod;
     }
 
-    public void setCalculationMethod(String calculationMethod) {
+    public void setCalculationMethod(ConditionMethodEnum calculationMethod) {
         this.calculationMethod = calculationMethod;
     }
     

+ 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;
     }

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

@@ -52,10 +52,10 @@ 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 = "音乐人")
+    @ApiModelProperty(value = "艺术家")
     private String composer;  //音乐家
 
     @TableField("music_subject_")

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

@@ -0,0 +1,102 @@
+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(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;
+    }
+    
+}

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

@@ -13,7 +13,8 @@ public interface ActivityPlanEvaluationService extends IService<ActivityPlanEval
 
 	boolean createOrUpdate(ActivityPlanDto entity);
 
-	void cancelActivity(Long activityId);
+	void closeActivity(Long activytyId);
 
 	void successActivity(Long activityId);
+
 }

+ 7 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityPlanRewardService.java

@@ -58,7 +58,13 @@ public interface ActivityPlanRewardService extends IService<ActivityPlanReward>
      */
     Boolean saveOrUpdateReward(ActivityPlanRewardDto rewardDto);
     /**
-     * 回收活动奖品数
+     * 回收活动奖品
+     * @param activityId
+     * @return
+     */
+    Boolean recoveryReward(Long activityId);
+    /**
+     * 回收活动奖品
      * @param reward
      * @return
      */

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

@@ -96,6 +96,10 @@ public interface ActivityPlanService extends IService<ActivityPlan>  {
 	 * 定时变更活动状态
 	 */
     void activityState();
+	/**
+	 * 活动中定时轮询
+	 */
+	void activityIng();
 
 	/**
 	 * 变更活动奖品
@@ -103,4 +107,6 @@ public interface ActivityPlanService extends IService<ActivityPlan>  {
 	 * @return
 	 */
     Boolean saveOrUpdateReward(List<ActivityPlanRewardDto> updateRewardDtoList);
+
+
 }

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

@@ -13,5 +13,7 @@ public interface ActivityPlanStandardService extends IService<ActivityPlanStanda
 
     boolean createOrUpdate(ActivityPlanDto entity);
 
-    void cancelActivity(Long aLong);
+    void activityIng(Object param);
+
+    void successActivity(Long activytyId);
 }

+ 15 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityRewardService.java

@@ -73,5 +73,19 @@ public interface ActivityRewardService extends IService<ActivityReward>  {
 	 */
 	Boolean updateStock(ActivityRewardChangeStock activityRewardChangeStock);
 
-	IPage<ActivityRewardChangeStockVo> selectChangeStockPage(IPage<ActivityRewardChangeStockSearch> page, ActivityRewardChangeStockSearch query);
+	/**
+	 * 库存变更记录查询分页
+	 * @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);
 }

+ 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);
+
+}

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

@@ -4,11 +4,11 @@ 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.ActivityUserRewardService;
-import com.yonge.cooleshow.biz.dal.service.UserOrderService;
+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;
@@ -17,10 +17,11 @@ 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 com.yonge.cooleshow.biz.dal.service.ActivityPlanEvaluationService;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 
 @Service
@@ -30,12 +31,17 @@ public class ActivityPlanEvaluationServiceImpl extends ServiceImpl<ActivityPlanE
     @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 == activityPlan.getId()) {
+
+        if (null == planExpand.getId()) {
             planExpand.setId(activityPlan.getId());
             planExpand.setCreateBy(activityPlan.getUserId());
             planExpand.setUpdateBy(activityPlan.getUserId());
@@ -48,7 +54,7 @@ public class ActivityPlanEvaluationServiceImpl extends ServiceImpl<ActivityPlanE
     }
 
     @Override
-    public void cancelActivity(Long activytyId) {
+    public void closeActivity(Long activytyId) {
         OrderSearch query = new OrderSearch();
         query.setOrderType(OrderTypeEnum.ACTI_REGIST.getCode());
         query.setGoodType(GoodTypeEnum.ACTI_REGIST.getCode());
@@ -66,13 +72,31 @@ public class ActivityPlanEvaluationServiceImpl extends ServiceImpl<ActivityPlanE
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void successActivity(Long activityId) {
+        //关闭未付款订单
+        closeActivity(activityId);
+
+        //活动需要发放的奖品
         List<ActivityUserReward> activityUserRewardList = baseMapper.getUserReward(activityId);
-        activityUserRewardService.saveBatch(activityUserRewardList);
 
-        //调用奖品发奖逻辑
-        for (ActivityUserReward reward : activityUserRewardList) {
-            //传入用户id和活动id
+        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);
     }
 }

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

@@ -1,6 +1,7 @@
 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;
@@ -45,14 +46,6 @@ public class ActivityPlanRewardServiceImpl extends ServiceImpl<ActivityPlanRewar
     @Resource
     private ActivityRewardChangeStockDao changeStockDao;
 
-    //奖品发放
-    public static final Map<RewardTypeEnum, Consumer<Long>> rewardGrant = new HashMap<>();
-
-    @PostConstruct
-    private void init() {
-
-    }
-
     @Override
     public ActivityPlanRewardVo detail(Long id) {
         return baseMapper.detail(id);
@@ -140,6 +133,17 @@ public class ActivityPlanRewardServiceImpl extends ServiceImpl<ActivityPlanRewar
     }
 
     @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())
@@ -162,6 +166,9 @@ public class ActivityPlanRewardServiceImpl extends ServiceImpl<ActivityPlanRewar
 
                                                     detail.setStock(detail.getStock() + old.getRewardNum());
                                                     activityRewardService.updateById(detail);
+
+                                                    old.setRewardNum(0);
+                                                    updateById(old);
                                                 }
                                                 return true;
                                             }, out, 10l);
@@ -172,7 +179,7 @@ public class ActivityPlanRewardServiceImpl extends ServiceImpl<ActivityPlanRewar
 
     @Override
     public int reduceStock(Long activityId, Long rewardId) {
-        return baseMapper.reduceStock(activityId,rewardId);
+        return baseMapper.reduceStock(activityId, rewardId);
     }
 
 }

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

@@ -83,17 +83,20 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
     @Autowired
     private SysMessageService sysMessageService;
 
-    @Resource
-    private ActivityRewardChangeStockDao changeStockDao;
-
     @Autowired
     private RedissonClient redissonClient;
 
     //保存/更新拓展字段
     private static final Map<ActivityTypeEnum, Consumer<ActivityPlanDto>> saveOrUpdateExpand = new HashMap<>();
-    //取消活动
-    private static final Map<ActivityTypeEnum, Consumer<Long>> cancelActivity = 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
@@ -103,13 +106,21 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
         saveOrUpdateExpand.put(ActivityTypeEnum.EVALUATION, activityPlanEvaluationService::createOrUpdate);
         //达标赠送活动
         saveOrUpdateExpand.put(ActivityTypeEnum.STANDARD_GIFT, activityPlanStandardService::createOrUpdate);
+        /**********开始活动(活动刚开始触发)******************/
+
+        /**********开启活动(开启活动按钮)******************/
 
-        /**********取消活动******************/
+        /**********关闭活动(关闭活动按钮)******************/
         //评测活动
-        cancelActivity.put(ActivityTypeEnum.EVALUATION, activityPlanEvaluationService::cancelActivity);
-        /**********活动完成(结束)******************/
+        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
@@ -142,14 +153,6 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
             throw new BizException("参数异常");
         }
 
-        if (ActivityTypeEnum.EVALUATION.equals(activityPlan.getActivityType())) {
-            activityPlan.setActivityClient(ClientEnum.STUDENT);
-        } else {
-            if (null == activityPlan.getActivityClient()) {
-                throw new BizException("活动客户端不能为空");
-            }
-        }
-
         if (null == activityPlan.getId()) {
             activityPlan.setDraftFlag(1);
             activityPlan.setCreateBy(activityPlan.getUserId());
@@ -193,10 +196,15 @@ 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);
-            //取消活动
-            Consumer<Long> afterFunction = cancelActivity.get(activityPlan.getActivityType());
+            //关闭活动
+            Consumer<Long> afterFunction = closeActivity.get(activityPlan.getActivityType());
             if (!Objects.isNull(afterFunction)) {
                 afterFunction.accept(activityPlan.getId());
             }
@@ -224,16 +232,55 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
         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 (RegistrationMethodEnum.CHARGE.equals(activityPlan.getRegistrationMethod())
-                && (null == activityPlan.getShareRate())) {
-            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 (ActivityTypeEnum.EVALUATION.equals(activityPlan.getActivityType()) && (null == activityPlan.getPlanEvaluation() || null == activityPlan.getPlanEvaluation().getEvaluationDifficulty())) {
-            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 (StringUtil.isEmpty(activityPlan.getPlanStandard().getCalculationMethod())) {
+                throw new BizException("计算方式不能为空");
+            }
+        }
+
+        if (null == activityPlan.getActivityClient()) {
+            throw new BizException("活动客户端不能为空");
         }
         return true;
     }
@@ -385,34 +432,40 @@ 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);
-
-                //关闭活动
-                Consumer<Long> afterFunction = cancelActivity.get(activityPlan.getActivityType());
-                if (!Objects.isNull(afterFunction)) {
-                    afterFunction.accept(activityPlan.getId());
-                }
-            }
+        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);
         }
+    }
 
-        //活动完成
-        List<ActivityPlan> rewardList = baseMapper.activityReward();
-        for (ActivityPlan activityPlan : rewardList) {
-            //活动置为已发奖(已完成)
-            activityPlan.setRewardFlag(1);
-            updateById(activityPlan);
-
-            //完成活动
-            Consumer<Long> afterFunction = successActivity.get(activityPlan.getActivityType());
-            if (!Objects.isNull(afterFunction)) {
-                afterFunction.accept(activityPlan.getId());
-            }
+    @Override
+    public void activityIng() {
+        for (ActivityTypeEnum activityTypeEnum : activityIng.keySet()) {
+            activityIng.get(activityTypeEnum).accept(null);
         }
     }
 
@@ -453,8 +506,6 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
         } catch (Exception e) {
             log.error("活动参与发送消息失败--> {}", e.fillInStackTrace());
         }
-
-
     }
 
     private void checkActivityPay(Long planId) {

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

@@ -1,28 +1,60 @@
 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.search.UserFirstTimeSearch;
+import com.yonge.cooleshow.biz.dal.entity.ActivityPlan;
+import com.yonge.cooleshow.biz.dal.entity.ActivityReward;
+import com.yonge.cooleshow.biz.dal.entity.UserFirstTime;
+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.ActivityTypeEnum;
+import com.yonge.cooleshow.common.enums.CacheNameEnum;
+import com.yonge.cooleshow.common.enums.ConditionEnum;
+import com.yonge.cooleshow.common.enums.ConditionMethodEnum;
+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.ActivityPlanStandard;
 import com.yonge.cooleshow.biz.dal.dao.ActivityPlanStandardDao;
-import com.yonge.cooleshow.biz.dal.service.ActivityPlanStandardService;
+
+import java.util.List;
+import java.util.Map;
+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 RedissonClient redissonClient;
+
     @Override
     public boolean createOrUpdate(ActivityPlanDto activityPlan) {
         ActivityPlanStandard planExpand = activityPlan.getPlanStandard();
-        if (null == activityPlan.getId()) {
+        if (null == planExpand.getId()) {
             planExpand.setId(activityPlan.getId());
             planExpand.setCreateBy(activityPlan.getUserId());
             planExpand.setUpdateBy(activityPlan.getUserId());
             save(planExpand);
-        }else{
+        } else {
             planExpand.setUpdateBy(activityPlan.getUserId());
             updateById(planExpand);
         }
@@ -30,7 +62,67 @@ public class ActivityPlanStandardServiceImpl extends ServiceImpl<ActivityPlanSta
     }
 
     @Override
-    public void cancelActivity(Long aLong) {
+    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, List<UserFirstTime>> userMap = userFirstTimes.stream().collect(Collectors.groupingBy(UserFirstTime::getUserId));
+        if (ConditionMethodEnum.OR.equals(planStandard.getCalculationMethod())) {
+            for (Long userId : userMap.keySet()) {
+                //给用户发奖
+                activityRewardService.sendReward(userId, detail.getId());
+            }
+        } else {
+            for (Long userId : userMap.keySet()) {
+                List<UserFirstTime> firstTimes = userMap.get(userId);
+                if (firstTimes.size() == timeTypes.size()) {
+                    //给用户发奖
+                    activityRewardService.sendReward(userId, detail.getId());
+                }
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public void successActivity(Long activytyId) {
+        //处理活动发奖
+        dealActivityIng(activytyId);
+        //归还库存
+        activityPlanRewardService.recoveryReward(activytyId);
     }
 }

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

@@ -4,13 +4,11 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 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.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.UserOrder;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
@@ -18,7 +16,6 @@ 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.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.cooleshow.common.enums.RewardTypeEnum;
 import com.yonge.cooleshow.common.enums.UnitEnum;
@@ -40,8 +37,6 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.util.*;
-import java.util.concurrent.locks.Lock;
-import java.util.stream.Collectors;
 
 
 @Service
@@ -151,16 +146,20 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
     }
 
     @Override
-    public IPage<ActivityRewardChangeStockVo> selectChangeStockPage(IPage<ActivityRewardChangeStockSearch> page, ActivityRewardChangeStockSearch query) {
-        return null;
+    public IPage<ActivityRewardChangeStockVo> selectChangeStockPage(IPage<ActivityRewardChangeStockVo> page, ActivityRewardChangeStockSearch query) {
+        return page.setRecords(changeStockDao.selectPage(page, query));
     }
 
-
-    private void sendReward(Long userId,Long activityId) {
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public List<Long> sendReward(Long userId, Long activityId) {
+        if (userRewarded(userId, activityId)) {
+            return null;
+        }
         ActivityPlan activityPlan = activityPlanService.getById(activityId);
         if (activityPlan == null) {
             log.warn("活动不存在");
-            return;
+            return null;
         }
 
         List<ActivityReward> activityRewardList = getActivityReward(activityId);
@@ -168,13 +167,14 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
 
 
         // 级联锁同时处理奖品库存
-        List<RLock>  lockList = new ArrayList<>();
+        List<RLock> lockList = new ArrayList<>();
         for (ActivityReward activityReward : activityRewardList) {
             lockList.add(redissonClient.getLock(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(activityReward.getId())));
         }
 
         RedissonMultiLock lock = new RedissonMultiLock(lockList.toArray(new RLock[lockList.size()]));
 
+        List<Long> activityRewardIdList = new ArrayList<>();
         try {
             lock.lock();
             for (ActivityReward activityReward : activityRewardList) {
@@ -192,30 +192,36 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
                     pianoRoomChangeRecord.setReason(activityPlan.getActivityName());
                     pianoRoomChangeRecordService.add(pianoRoomChangeRecord);
                 } else if (activityReward.getRewardType().equals(RewardTypeEnum.VIP)) {
-                    memberPriceSettingsService.activityReward(userId,activityPlan.getActivityClient(),activityReward,activityId);
+                    memberPriceSettingsService.activityReward(userId, activityPlan.getActivityClient(), activityReward, activityId);
                 }
 
                 activityRewardName.append(activityReward.getRewardName());
+                activityRewardIdList.add(activityReward.getId());
             }
             // 发送活动获奖推送
             if (!StringUtil.isEmpty(activityRewardName)) {
                 sendActivityMessage(userId, activityPlan.getActivityName(), activityRewardName.toString(), activityPlan.getActivityClient());
             }
         } finally {
-            if (lock.getHoldCount() >0)
+            if (lock.getHoldCount() > 0)
                 lock.unlock();
         }
 
+        return activityRewardIdList;
+    }
+
+    private Boolean userRewarded(Long userId, Long activityId) {
+        return baseMapper.userRewarded(userId, activityId);
     }
 
     /**
      * 获奖人员发送
      *
-     * @param userId  用户id
-     * @param activityName 活动名
+     * @param userId             用户id
+     * @param activityName       活动名
      * @param activityRewardName 活动奖品名
      */
-    private void sendActivityMessage(Long userId, String activityName, String activityRewardName,ClientEnum clientType) {
+    private void sendActivityMessage(Long userId, String activityName, String activityRewardName, ClientEnum clientType) {
         SysUser user = sysUserFeignService.queryUserById(userId);
         if (user == null) {
             log.warn("用户未找到");
@@ -227,10 +233,10 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
             receivers.put(userId, user.getPhone());
 
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.PRACTICE_ADJUST, receivers, null,
-                                               0, null,clientType.getCode(), user.getUsername(), "陪练课", activityName, activityRewardName);
+                    0, null, clientType.getCode(), user.getUsername(), "陪练课", activityName, activityRewardName);
         } catch (Exception e) {
             e.printStackTrace();
-            log.error("获奖消息发送失败,{}",e.getMessage());
+            log.error("获奖消息发送失败,{}", e.getMessage());
         }
 
     }

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

@@ -61,7 +61,7 @@ public class MusicTagServiceImpl extends ServiceImpl<MusicTagDao, MusicTag> impl
                  .forEach(musicTagVo -> {
                      List<MusicTagVo> childrenList = musicTagMap.get(musicTagVo.getId().toString());
                      childrenList.forEach(children -> {
-                         musicTagVo.setEnablePlatformMusicSheetNum(musicTagVo.getEnableTeacherMusicSheetNum() + children.getEnablePlatformMusicSheetNum());
+                         musicTagVo.setEnablePlatformMusicSheetNum(musicTagVo.getEnablePlatformMusicSheetNum() + children.getEnablePlatformMusicSheetNum());
                          musicTagVo.setEnableTeacherMusicSheetNum(musicTagVo.getEnableTeacherMusicSheetNum() + children.getEnableTeacherMusicSheetNum());
                          musicTagVo.setMusicPlatformSheetNum(musicTagVo.getMusicPlatformSheetNum() + children.getMusicPlatformSheetNum());
                          musicTagVo.setMusicTeacherSheetNum(musicTagVo.getMusicTeacherSheetNum() + children.getMusicTeacherSheetNum());

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

@@ -73,6 +73,10 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 	@Value("${message.debugMode}")
 	private boolean debugMode;
 
+
+	@Value("${message.debugJigaung}")
+	private boolean debugJigaung;
+
 	@Value("${message.authCode}")
 	private boolean authCode;
 
@@ -243,12 +247,16 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 		if (triggerTime == null || date.after(triggerTime)) {
 			status = SendStatusEnum.SENDING;
 			try {
-				if (debugMode == true
-						|| messageSenderPluginContext.batchSend(messageSender, messageConfig.getDescription(),
-								MessageFormatter.arrayFormat(messageConfig.getContent(), args), tos, url,jpushType,"default",null)) {
-					status = SendStatusEnum.SUCCESSED;
-				} else {
-					status = SendStatusEnum.FAILED;
+
+				if (isSendRemoteMessage(messageSender)) {
+					errorMsg = messageSenderPluginContext.batchSend(messageSender, messageConfig.getDescription(),
+														 MessageFormatter.arrayFormat(messageConfig.getContent(), args), tos, url,jpushType,"default",null);
+					if (StringUtils.isEmpty(errorMsg)) {
+						status = SendStatusEnum.SUCCESSED;
+					}  else {
+						status = SendStatusEnum.FAILED;
+					}
+
 				}
 			} catch (Exception e) {
 				status = SendStatusEnum.FAILED;
@@ -266,6 +274,15 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 				url, messageConfig.getGroup(),jpushType,messageConfig.getId());
 	}
 
+	private boolean isSendRemoteMessage(MessageSender messageSender) {
+		if (messageSender.getSendMode().equals(MessageSender.JIGUANG.getSendMode()) && !debugJigaung) {
+			return true;
+		} else if (messageSender.getSendMode().equals(MessageSender.AWSMS.getSendMode()) && !debugMode) {
+			return true;
+		}
+		return false;
+	}
+
 	@Override
 	public void batchPushMessage(MessageTypeEnum type, Map<Long, String> receivers, Date triggerTime, Integer readStatus,
 			String url,String jpushType,String sound,String channelId, Object... args) {
@@ -286,12 +303,14 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 		if (triggerTime == null || date.after(triggerTime)) {
 			status = SendStatusEnum.SENDING;
 			try {
-				if (debugMode == true
-						|| messageSenderPluginContext.batchSend(MessageSender.JIGUANG, messageConfig.getDescription(),
-								MessageFormatter.arrayFormat(messageConfig.getContent(), args), tos, url,jpushType,sound,channelId)) {
-					status = SendStatusEnum.SUCCESSED;
-				} else {
-					status = SendStatusEnum.FAILED;
+				if (isSendRemoteMessage(MessageSender.JIGUANG)) {
+					errorMsg = messageSenderPluginContext.batchSend(MessageSender.JIGUANG, messageConfig.getDescription(),
+														 MessageFormatter.arrayFormat(messageConfig.getContent(), args), tos, url,jpushType,sound,channelId);
+					if (StringUtils.isEmpty(errorMsg)) {
+						status = SendStatusEnum.SUCCESSED;
+					}  else {
+						status = SendStatusEnum.FAILED;
+					}
 				}
 			} catch (Exception e) {
 				status = SendStatusEnum.FAILED;
@@ -317,10 +336,14 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 		if (triggerTime == null || date.after(triggerTime)) {
 			status = SendStatusEnum.SENDING;
 			try {
-				if (debugMode == true || messageSenderPluginContext.send(messageSender, receiver, title, content, url,jpushType,"default",null)) {
-					status = SendStatusEnum.SUCCESSED;
-				} else {
-					status = SendStatusEnum.FAILED;
+				if (isSendRemoteMessage(messageSender)) {
+					errorMsg = messageSenderPluginContext.send(messageSender, receiver, title, content, url,
+																	  jpushType, "default", null);
+					if (StringUtils.isEmpty(errorMsg)) {
+						status = SendStatusEnum.SUCCESSED;
+					}  else {
+						status = SendStatusEnum.FAILED;
+					}
 				}
 			} catch (Exception e) {
 				status = SendStatusEnum.FAILED;

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

@@ -17,10 +17,12 @@ import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.SysMessageService;
 import com.yonge.cooleshow.biz.dal.service.TeacherStyleVideoService;
+import com.yonge.cooleshow.biz.dal.service.UserFirstTimeService;
 import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
 import com.yonge.cooleshow.biz.dal.vo.TeacherAuthEntryRecordVo;
 import com.yonge.cooleshow.biz.dal.vo.TeacherVo;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.UserFirstTimeTypeEnum;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.string.StringPool;
 import com.yonge.toolset.base.util.StringUtil;
@@ -46,10 +48,10 @@ public class TeacherAuthEntryRecordServiceImpl extends ServiceImpl<TeacherAuthEn
 
     @Autowired
     private SysMessageService sysMessageService;
-
     @Autowired
     private TeacherStyleVideoService teacherStyleVideoService;
-
+    @Autowired
+    private UserFirstTimeService userFirstTimeService;
     @Resource
     private TeacherDao teacherDao;
 
@@ -98,6 +100,9 @@ public class TeacherAuthEntryRecordServiceImpl extends ServiceImpl<TeacherAuthEn
                 //老师风采视频
                 String styleVideoJson = build.getStyleVideoJson();
                 saveStyleVideo(styleVideoJson, build.getUserId(), sysUser.getId());
+
+                //记录达人认证时间
+                userFirstTimeService.recordTime(build.getUserId(),ClientEnum.TEACHER, UserFirstTimeTypeEnum.ENTRY);
             }
             teacher.setEntryFlag(authOperaReq.getPass() ? YesOrNoEnum.YES : YesOrNoEnum.NO);
             teacher.setEntryAuthDate(new Date());

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

@@ -22,6 +22,7 @@ import com.yonge.cooleshow.biz.dal.vo.TeacherHomeVo;
 import com.yonge.cooleshow.biz.dal.vo.TeacherVo;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
+import com.yonge.cooleshow.common.enums.UserFirstTimeTypeEnum;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.util.StringUtil;
@@ -67,6 +68,8 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
     @Autowired
     private UserAccountService userAccountService;
     @Autowired
+    private UserFirstTimeService userFirstTimeService;
+    @Autowired
     private TeacherTotalService totalService;
 
     @Override
@@ -190,6 +193,9 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
 
             // 添加标签
             this.setTeacherTag(id, TeacherTagEnum.LIVE);
+
+            //记录首次开通直播时间
+            userFirstTimeService.recordTime(id,ClientEnum.TEACHER, UserFirstTimeTypeEnum.LIVEING);
             return HttpResponseResult.status(true);
         } else {
             return HttpResponseResult.failed("不满足开通条件");

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

@@ -0,0 +1,51 @@
+package com.yonge.cooleshow.biz.dal.service.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.biz.dal.dto.search.UserFirstTimeSearch;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.common.enums.UserFirstTimeTypeEnum;
+import org.springframework.stereotype.Service;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import com.yonge.cooleshow.biz.dal.entity.UserFirstTime;
+import com.yonge.cooleshow.biz.dal.dao.UserFirstTimeDao;
+import com.yonge.cooleshow.biz.dal.service.UserFirstTimeService;
+
+import java.util.Date;
+import java.util.List;
+
+
+@Service
+public class UserFirstTimeServiceImpl extends ServiceImpl<UserFirstTimeDao, UserFirstTime> implements UserFirstTimeService {
+    private final static Logger log = LoggerFactory.getLogger(UserFirstTimeServiceImpl.class);
+
+    @Override
+    public List<UserFirstTime> selectAllList(UserFirstTimeSearch param) {
+        return baseMapper.selectAllList(param);
+    }
+
+    @Override
+    public Boolean recordTime(Long userId, ClientEnum userType, UserFirstTimeTypeEnum firstTimeTypeEnum) {
+        return recordTime(userId, userType, firstTimeTypeEnum, new Date());
+    }
+
+    @Override
+    public Boolean recordTime(Long userId, ClientEnum userType, UserFirstTimeTypeEnum firstTimeTypeEnum, Date time) {
+        if (null == userId || null == userType || null == firstTimeTypeEnum) {
+            return false;
+        }
+
+        UserFirstTime old = getOne(Wrappers.<UserFirstTime>lambdaQuery()
+                .eq(UserFirstTime::getId, userId)
+                .eq(UserFirstTime::getUserType, userType)
+                .eq(UserFirstTime::getTimeType, firstTimeTypeEnum)
+        );
+        if (old != null) {
+            return true;
+        }
+        UserFirstTime userFirstTime = new UserFirstTime(userId, userType, firstTimeTypeEnum, time);
+        save(userFirstTime);
+        return true;
+    }
+}

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

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.vo;
 
 import com.yonge.cooleshow.biz.dal.entity.ActivityRewardChangeStock;
 import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 
 /**
  * @Author: liweifan
@@ -10,4 +11,15 @@ import io.swagger.annotations.ApiModel;
 @ApiModel(value = "ActivityRewardChangeStockVo对象", description = "活动奖品库存调整记录表查询视图对象")
 public class ActivityRewardChangeStockVo extends ActivityRewardChangeStock{
 	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty(value = "操作人")
+	private String updateByName;
+
+	public String getUpdateByName() {
+		return updateByName;
+	}
+
+	public void setUpdateByName(String updateByName) {
+		this.updateByName = updateByName;
+	}
 }

+ 85 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserRewardVo.java

@@ -0,0 +1,85 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+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-04 10:19:49
+ */
+@ApiModel(value = "UserRewardVo对象", description = "获奖名单")
+public class UserRewardVo{
+
+
+	@ApiModelProperty("用户id")
+	private Long userId;
+
+	@ApiModelProperty("真实姓名")
+	private String realName;
+
+	@ApiModelProperty("昵称")
+	private String username;
+
+	@ApiModelProperty("手机号")
+	private String phone;
+
+	@ApiModelProperty("获奖时间")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private Date  createTime;
+
+	@ApiModelProperty("奖品名 逗号隔开")
+	private String rewardNames;
+
+	public Long getUserId() {
+		return userId;
+	}
+
+	public void setUserId(Long userId) {
+		this.userId = userId;
+	}
+
+	public String getRealName() {
+		return realName;
+	}
+
+	public void setRealName(String realName) {
+		this.realName = realName;
+	}
+
+	public String getUsername() {
+		return username;
+	}
+
+	public void setUsername(String username) {
+		this.username = username;
+	}
+
+	public String getPhone() {
+		return phone;
+	}
+
+	public void setPhone(String phone) {
+		this.phone = phone;
+	}
+
+	public Date getCreateTime() {
+		return createTime;
+	}
+
+	public void setCreateTime(Date createTime) {
+		this.createTime = createTime;
+	}
+
+	public String getRewardNames() {
+		return rewardNames;
+	}
+
+	public void setRewardNames(String rewardNames) {
+		this.rewardNames = rewardNames;
+	}
+}

+ 2 - 4
cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityPlanEvaluationMapper.xml

@@ -28,7 +28,7 @@
                 c.id_ as rewardId
             from (
                 select
-                    a.activity_id_,a.evaluation_id_,a.score_,min(b.create_time_) as create_time_
+                    a.activity_id_,a.evaluation_id_,a.score_,min(b.id_) as id_
                 from(
                     select
                     activity_id_,evaluation_id_, max(score_) as score_
@@ -38,9 +38,7 @@
                 left join activity_evaluation_record b on a.activity_id_ = b.activity_id_ and a.evaluation_id_ = b.evaluation_id_ and a.score_ = b.score_
                 GROUP BY a.activity_id_,a.evaluation_id_,a.score_
             ) a
-            left join activity_evaluation_record b
-                on a.activity_id_ = b.activity_id_ and a.evaluation_id_ = b.evaluation_id_
-                and a.score_ = b.score_ and a.create_time_ = b.create_time_
+            left join activity_evaluation_record b on a.id_ = b.id_
             left join activity_plan_reward c on a.activity_id_ = c.activity_id_
     </select>
 </mapper>

+ 0 - 4
cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityPlanMapper.xml

@@ -106,8 +106,4 @@
             or (t.activity_end_ &lt;= now() and activity_state_ = 1)
         )
     </select>
-
-    <select id="activityReward" resultType="com.yonge.cooleshow.biz.dal.entity.ActivityPlan">
-        select <include refid="baseColumns"/> from activity_plan t where t.reward_flag_ = 0 and t.activity_end_ &lt;= now()
-    </select>
 </mapper>

+ 5 - 3
cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityPlanStandardMapper.xml

@@ -3,21 +3,23 @@
 <mapper namespace="com.yonge.cooleshow.biz.dal.dao.ActivityPlanStandardDao">
 	<resultMap id="BaseResultMap" type="com.yonge.cooleshow.biz.dal.entity.ActivityPlanStandard">
             <result column="id_" property="id" />
-	        <result column="activity_id_" property="activityId" />
 	        <result column="condition_" property="condition" />
 	        <result column="calculation_method" property="calculationMethod" />
 	        <result column="create_time_" property="createTime" />
 	        <result column="create_by_" property="createBy" />
+            <result column="update_time_" property="updateTime" />
+            <result column="update_by_" property="updateBy" />
 		</resultMap>  
     
     <!-- 表字段 -->
     <sql id="baseColumns">
          t.id_ as id
-        , t.activity_id_ as activityId
-        , t.condition_ as condition
+        , t.condition_ as `condition`
         , t.calculation_method as calculationMethod
         , t.create_time_ as createTime
         , t.create_by_ as createBy
+        , t.update_time_ as updateTime
+        , t.update_by_ as updateBy
         </sql> 
 
 </mapper>

+ 38 - 4
cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityRewardChangeStockMapper.xml

@@ -6,17 +6,51 @@
 	        <result column="reward_id_" property="rewardId" />
 	        <result column="stock_" property="stock" />
 	        <result column="change_type_" property="changeType" />
-	        <result column="create_time_" property="createTime" />
+            <result column="source_" property="source" />
+            <result column="create_time_" property="createTime" />
 	        <result column="create_by_" property="createBy" />
 		</resultMap>  
-    
+
     <!-- 表字段 -->
     <sql id="baseColumns">
-         t.id_ as id
+        t.id_ as id
         , t.reward_id_ as rewardId
         , t.stock_ as stock
         , t.change_type_ as changeType
+        , t.source_ as `source`
         , t.create_time_ as createTime
         , t.create_by_ as createBy
-        </sql> 
+    </sql>
+
+    <select id="detail" resultType="com.yonge.cooleshow.biz.dal.vo.ActivityRewardChangeStockVo">
+        SELECT
+        <include refid="baseColumns"/>
+        FROM activity_reward_change_stock t
+        where t.id_ = #{id}
+    </select>
+
+    <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.vo.ActivityRewardChangeStockVo">
+        SELECT
+            <include refid="baseColumns" />,
+            u.username_ as updateByName
+        FROM activity_reward_change_stock t
+        left join sys_user u on t.create_by_ = u.id_
+        <where>
+            <if test="param.source != null and param.source != ''">
+                and t.source_ = #{param.source}
+            </if>
+            <if test="param.changeType != null">
+                and t.change_type_ = #{param.changeType}
+            </if>
+            <if test="param.updateByName != null and param.updateByName != ''">
+                and u.username_ like CONCAT('%',#{param.updateByName},'%')
+            </if>
+            <if test="param.startTime !=null">
+                and t.create_time_ &gt;= #{param.startTime}
+            </if>
+            <if test="param.endTime !=null">
+                and t.create_time_ &lt;= #{param.endTime}
+            </if>
+        </where>
+    </select>
 </mapper>

+ 5 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityRewardMapper.xml

@@ -85,4 +85,9 @@
         left join activity_reward ar on apr.reward_id_ = ar.id_
         where apr.activity_id_ = #{activityPlanId}
     </select>
+
+    <select id="userRewarded" resultType="java.lang.Boolean">
+        select (count(1)>0) as flag from activity_user_reward
+        where activity_id_ = #{activityId} and user_id_ = #{userId}
+    </select>
 </mapper>

+ 31 - 2
cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityUserRewardMapper.xml

@@ -7,6 +7,7 @@
         <result column="biz_id_" property="bizId" />
         <result column="user_id_" property="userId" />
         <result column="reward_id_" property="rewardId" />
+        <result column="grant_flag_" property="grantFlag" />
         <result column="receive_flag_" property="receiveFlag" />
         <result column="create_time_" property="createTime" />
         <result column="update_time_" property="updateTime" />
@@ -19,6 +20,7 @@
         , t.biz_id_ as bizId
         , t.user_id_ as userId
         , t.reward_id_ as rewardId
+        , t.grant_flag_ as grantFlag
         , t.receive_flag_ as receiveFlag
         , t.create_time_ as createTime
         , t.update_time_ as updateTime
@@ -31,9 +33,36 @@
         where t.id_ = #{id}
     </select>
 
-    <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.vo.ActivityUserRewardVo">
+    <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.vo.UserRewardVo">
         SELECT
-        <include refid="baseColumns" />
+        su.id_ as userId,
+        su.real_name_ as realName,
+        su.username_ as username,
+        su.phone_ as phone,
+        t.create_time_ as createTime,
+        group_concat(if(t.grant_flag_ = 1,ar.reward_name_,null)) as rewardNames
         FROM activity_user_reward t
+        left join activity_reward ar on ar.id_ = t.reward_id_
+        left join sys_user su on t.user_id_ = su.id_
+        <where>
+            <if test="param.activityId != null">
+                and t.activity_id_ = #{param.activityId}
+            </if>
+            <if test="param.search !=null and param.search != ''">
+                and (su.real_name_ like concat('%',#{param.search},'%')
+                    or su.phone_ like concat('%',#{param.search},'%')
+                    or su.id_ like concat('%',#{param.search},'%'))
+            </if>
+            <if test="param.activityRewardId != null">
+                and t.reward_id_ = #{param.activityRewardId}
+            </if>
+            <if test="param.startTime != null">
+                and t.create_time_ &gt;= #{param.startTime}
+            </if>
+            <if test="param.endTime != null">
+                and  t.create_time_ &lt;= #{param.endTime}
+            </if>
+        </where>
+        GROUP BY t.user_id_,t.activity_id_
     </select>
 </mapper>

+ 8 - 7
cooleshow-user/user-biz/src/main/resources/config/mybatis/HomeMapper.xml

@@ -50,7 +50,7 @@
 		) a on t.sys_day_ymd_ = a.timeStr
 		left join (
 			select
-				DATE_FORMAT(t.create_time_,'%Y-%m-%d') as timeStr,
+				DATE_FORMAT(t.entry_auth_date_,'%Y-%m-%d') as timeStr,
 				count(1) as entryNum
 			from teacher t
 			<where>
@@ -62,11 +62,11 @@
 					<![CDATA[AND t.entry_auth_date_ < #{param.endTime} ]]>
 				</if>
 			</where>
-			group by DATE_FORMAT(t.create_time_,'%Y-%m-%d')
+			group by DATE_FORMAT(t.entry_auth_date_,'%Y-%m-%d')
 		) b on t.sys_day_ymd_ = b.timeStr
 		left join (
 			select
-				DATE_FORMAT(t.create_time_,'%Y-%m-%d') as timeStr,
+				DATE_FORMAT(t.live_date_,'%Y-%m-%d') as timeStr,
 				count(1) as liveNum
 			from teacher t
 			<where>
@@ -77,11 +77,11 @@
 					<![CDATA[AND t.live_date_ < #{param.endTime} ]]>
 				</if>
 			</where>
-			group by DATE_FORMAT(t.create_time_,'%Y-%m-%d')
+			group by DATE_FORMAT(t.live_date_,'%Y-%m-%d')
 		) c on t.sys_day_ymd_ = c.timeStr
 		left join (
 			select
-				DATE_FORMAT(t.create_time_,'%Y-%m-%d') as timeStr,
+				DATE_FORMAT(t.musician_date_,'%Y-%m-%d') as timeStr,
 				count(1) as musicianNum
 			from teacher t
 			<where>
@@ -93,7 +93,7 @@
 					<![CDATA[AND t.musician_date_ < #{param.endTime} ]]>
 				</if>
 			</where>
-			group by DATE_FORMAT(t.create_time_,'%Y-%m-%d')
+			group by DATE_FORMAT(t.musician_date_,'%Y-%m-%d')
 		) d on t.sys_day_ymd_ = d.timeStr
 		<where>
 			<if test="param.startTime !=null">
@@ -412,9 +412,10 @@
 				vlg.lesson_subject_,
 				count(1) as videoNum
 			from video_lesson_group vlg
-			where vlg.shelves_flag_ = 1
+			where vlg.shelves_flag_ = 1 and vlg.audit_status_ = 'PASS'
 			group by vlg.lesson_subject_
 		) e on e.lesson_subject_ = s.id_
+		where s.parent_subject_id_ !=0 and s.parent_subject_id_ is not null
 		order by
 		<choose>
 			<when test="query.sortType == 'MUSIC'">

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

@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE  mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.yonge.cooleshow.biz.dal.dao.UserFirstTimeDao">
+	<resultMap id="BaseResultMap" type="com.yonge.cooleshow.biz.dal.entity.UserFirstTime">
+            <result column="id_" property="id" />
+	        <result column="user_id_" property="userId" />
+	        <result column="user_type_" property="userType" />
+	        <result column="time_type_" property="timeType" />
+	        <result column="time_" property="time" />
+	        <result column="create_time_" property="createTime" />
+		</resultMap>  
+    
+    <!-- 表字段 -->
+    <sql id="baseColumns">
+         t.id_ as id
+        , t.user_id_ as userId
+        , t.user_type_ as userType
+        , t.time_type_ as timeType
+        , t.time_ as `time`
+        , t.create_time_ as createTime
+        </sql>
+
+    <select id="selectAllList" resultType="com.yonge.cooleshow.biz.dal.entity.UserFirstTime">
+        SELECT
+            <include refid="baseColumns"/>
+        FROM user_first_time t
+        <where>
+            <if test="param.userId != null">
+                and t.user_id_ = #{param.userId}
+            </if>
+            <if test="param.userType != null and param.userType != ''">
+                and find_in_set(t.user_type_ , #{param.userType})
+            </if>
+            <if test="param.timeType != null and param.userType != ''">
+                and find_in_set(t.time_type_ , #{param.timeType})
+            </if>
+            <if test="param.startTime != null">
+                and t.time_ &gt;= #{param.startTime}
+            </if>
+            <if test="param.endTime != null">
+                and t.time_ &lt;= #{param.endTime}
+            </if>
+        </where>
+    </select>
+</mapper>

+ 10 - 8
toolset/thirdparty-component/src/main/java/com/yonge/toolset/thirdparty/message/MessageSenderPluginContext.java

@@ -66,16 +66,17 @@ public class MessageSenderPluginContext implements ApplicationContextAware {
 	 * @return 是否发送成功
 	 * @throws IOException
 	 */
-	public boolean send(MessageSender messageSender, String subject, String content, String receiver, String url, String jpushType,String sound,String channelId) throws Exception {
+	public String send(MessageSender messageSender, String subject, String content, String receiver, String url, String jpushType,String sound,String channelId) throws Exception {
 		ExecutorService executor = Executors.newFixedThreadPool(5);
-		CompletableFuture<Boolean> future = CompletableFuture.supplyAsync(()->{
+		CompletableFuture<String> future = CompletableFuture.supplyAsync(()->{
 			messageSenderPlugin = getMessageSenderPlugin(messageSender);
 			try {
-				return messageSenderPlugin.send(subject, content, receiver, url, jpushType,sound,channelId);
+				messageSenderPlugin.send(subject, content, receiver, url, jpushType,sound,channelId);
 			} catch (Exception e) {
 				e.printStackTrace();
+				return e.getMessage();
 			}
-			return false;
+			return "";
 		},executor);
 		executor.shutdown();
 		return future.join();
@@ -91,16 +92,17 @@ public class MessageSenderPluginContext implements ApplicationContextAware {
 	 * @return 是否发送成功
 	 * @throws IOException
 	 */
-	public boolean batchSend(MessageSender messageSender, String subject, String content, String[] receivers, String url, String jpushType,String sound,String channelId) throws Exception {
+	public String batchSend(MessageSender messageSender, String subject, String content, String[] receivers, String url, String jpushType,String sound,String channelId) throws Exception {
 		ExecutorService executor = Executors.newFixedThreadPool(5);
-		CompletableFuture<Boolean> future = CompletableFuture.supplyAsync(()->{
+		CompletableFuture<String> future = CompletableFuture.supplyAsync(()->{
 			messageSenderPlugin = getMessageSenderPlugin(messageSender);
 			try {
-				return messageSenderPlugin.batchSend(subject, content, receivers, url, jpushType,sound,channelId);
+				messageSenderPlugin.batchSend(subject, content, receivers, url, jpushType,sound,channelId);
 			} catch (Exception e) {
 				e.printStackTrace();
+				return e.getMessage();
 			}
-			return false;
+			return "";
 		},executor);
 		executor.shutdown();
 		return future.join();