Przeglądaj źródła

Merge branch 'dev_1_3_2_20220815'

liweifan 3 lat temu
rodzic
commit
f5cbe94094
33 zmienionych plików z 686 dodań i 162 usunięć
  1. 11 1
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/AdminFeignService.java
  2. 1 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/CacheNameEnum.java
  3. 19 0
      cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/ActivityIngTask.java
  4. 1 1
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ActivityUserRewardController.java
  5. 7 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/task/TaskController.java
  6. 0 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityPlanDao.java
  7. 43 34
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityRewardDao.java
  8. 10 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserFirstTimeDao.java
  9. 69 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/ActivityUserRewardSearch.java
  10. 75 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/UserFirstTimeSearch.java
  11. 0 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityPlanEvaluation.java
  12. 5 16
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityPlanStandard.java
  13. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityUserReward.java
  14. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityPlanEvaluationService.java
  15. 7 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityPlanRewardService.java
  16. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityPlanService.java
  17. 3 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityPlanStandardService.java
  18. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityRewardService.java
  19. 7 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserFirstTimeService.java
  20. 32 11
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanEvaluationServiceImpl.java
  21. 16 9
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanRewardServiceImpl.java
  22. 84 52
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanServiceImpl.java
  23. 96 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanStandardServiceImpl.java
  24. 15 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityRewardServiceImpl.java
  25. 7 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserFirstTimeServiceImpl.java
  26. 85 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserRewardVo.java
  27. 2 4
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityPlanEvaluationMapper.xml
  28. 0 4
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityPlanMapper.xml
  29. 5 3
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityPlanStandardMapper.xml
  30. 5 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityRewardMapper.xml
  31. 31 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityUserRewardMapper.xml
  32. 1 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/HomeMapper.xml
  33. 24 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserFirstTimeMapper.xml

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

+ 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("锁活动变更"),
     ;
     /***
      * 缓存描述

+ 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 - 1
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ActivityUserRewardController.java

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

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

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

+ 10 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserFirstTimeDao.java

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

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

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

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

@@ -81,5 +81,11 @@ public interface ActivityRewardService extends IService<ActivityReward>  {
 	 */
 	IPage<ActivityRewardChangeStockVo> selectChangeStockPage(IPage<ActivityRewardChangeStockVo> page, ActivityRewardChangeStockSearch query);
 
+	/**
+	 * 发放获奖奖品
+	 * @param userId 用户id
+	 * @param activityId 活动id
+	 * @return 返回发放成功奖品id
+	 */
 	List<Long> sendReward(Long userId, Long activityId);
 }

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

@@ -1,11 +1,13 @@
 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;
 
 /**
  * 时间记录表 服务类
@@ -14,6 +16,11 @@ import java.util.Date;
  */
 public interface UserFirstTimeService extends IService<UserFirstTime>  {
     /**
+     * 查询集合
+     * @return
+     */
+    List<UserFirstTime> selectAllList(UserFirstTimeSearch param);
+    /**
      * 记录时间
      * @param userId(用户id)
      * @param userType (用户类型)

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

@@ -4,12 +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.ActivityRewardService;
-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;
@@ -18,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
@@ -34,11 +34,14 @@ public class ActivityPlanEvaluationServiceImpl extends ServiceImpl<ActivityPlanE
     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());
@@ -51,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());
@@ -69,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
-            activityRewardService.sendReward(reward.getUserId(),reward.getActivityId());
+        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);
     }
 
 }

+ 84 - 52
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());
             }
@@ -225,8 +233,9 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
             return false;
         }
 
-        if(!ActivityTypeEnum.STANDARD_GIFT.equals(activityPlan.getActivityType())){
-            if(null == activityPlan.getRegistrationMethod()){
+        if (!ActivityTypeEnum.STANDARD_GIFT.equals(activityPlan.getActivityType())) {
+
+            if (null == activityPlan.getRegistrationMethod()) {
                 throw new BizException("报名缴费方式不能为空");
             }
             if (RegistrationMethodEnum.CHARGE.equals(activityPlan.getRegistrationMethod())
@@ -237,25 +246,42 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
                     && (null == activityPlan.getShareRate())) {
                 throw new BizException("活动收费时,分润比例不能为空");
             }
-            if(StringUtil.isEmpty(activityPlan.getSubjectUrl())){
+            if (StringUtil.isEmpty(activityPlan.getSubjectUrl())) {
                 throw new BizException("主题图片不能为空");
             }
-            if(StringUtil.isEmpty(activityPlan.getBackgroundUrl())){
+            if (StringUtil.isEmpty(activityPlan.getBackgroundUrl())) {
                 throw new BizException("平铺背景不能为空");
             }
-            if(StringUtil.isEmpty(activityPlan.getShareUrl())){
+            if (StringUtil.isEmpty(activityPlan.getShareUrl())) {
                 throw new BizException("分享图片不能为空");
             }
-            if(StringUtil.isEmpty(activityPlan.getRuleDescribe())){
+            if (StringUtil.isEmpty(activityPlan.getRuleDescribe())) {
                 throw new BizException("活动规则不能为空");
             }
         }
 
         if (ActivityTypeEnum.EVALUATION.equals(activityPlan.getActivityType())) {
-            if(null == activityPlan.getPlanEvaluation() || null == activityPlan.getPlanEvaluation().getEvaluationDifficulty()){
+            activityPlan.setActivityClient(ClientEnum.STUDENT);
+            if (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;
     }
 
@@ -406,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);
         }
     }
 

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

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

@@ -153,6 +153,9 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
     @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("活动不存在");
@@ -164,7 +167,7 @@ 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())));
         }
@@ -189,7 +192,7 @@ 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());
@@ -200,21 +203,25 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
                 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("用户未找到");
@@ -226,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());
         }
 
     }

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

@@ -2,6 +2,7 @@ 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;
@@ -12,6 +13,7 @@ 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
@@ -19,6 +21,11 @@ public class UserFirstTimeServiceImpl extends ServiceImpl<UserFirstTimeDao, User
     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());
     }

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

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

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

@@ -412,7 +412,7 @@
 				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

+ 24 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserFirstTimeMapper.xml

@@ -16,7 +16,30 @@
         , t.user_id_ as userId
         , t.user_type_ as userType
         , t.time_type_ as timeType
-        , t.time_ as time
+        , 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>