Browse Source

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

liujunchi 3 years ago
parent
commit
76f3bab52d
15 changed files with 346 additions and 73 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. 19 0
      cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/ActivityIngTask.java
  5. 43 34
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityRewardDao.java
  6. 10 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserFirstTimeDao.java
  7. 75 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/UserFirstTimeSearch.java
  8. 4 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityPlanStandard.java
  9. 7 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserFirstTimeService.java
  10. 30 21
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanServiceImpl.java
  11. 90 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanStandardServiceImpl.java
  12. 15 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityRewardServiceImpl.java
  13. 7 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserFirstTimeServiceImpl.java
  14. 5 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityRewardMapper.xml
  15. 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();
 }

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

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

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

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

+ 4 - 4
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;
 
@@ -27,7 +27,7 @@ public class ActivityPlanStandard implements Serializable {
     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")
@@ -61,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;
     }
     

+ 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 (用户类型)

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

@@ -83,6 +83,9 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
     @Autowired
     private SysMessageService sysMessageService;
 
+    @Autowired
+    private RedissonClient redissonClient;
+
     //保存/更新拓展字段
     private static final Map<ActivityTypeEnum, Consumer<ActivityPlanDto>> saveOrUpdateExpand = new HashMap<>();
     //开始活动(活动刚开始触发)
@@ -429,27 +432,33 @@ 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);
-
-                //开始活动
-                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());
-                }
-            }
+        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);
         }
     }
 

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

@@ -1,19 +1,51 @@
 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();
@@ -22,7 +54,7 @@ public class ActivityPlanStandardServiceImpl extends ServiceImpl<ActivityPlanSta
             planExpand.setCreateBy(activityPlan.getUserId());
             planExpand.setUpdateBy(activityPlan.getUserId());
             save(planExpand);
-        }else{
+        } else {
             planExpand.setUpdateBy(activityPlan.getUserId());
             updateById(planExpand);
         }
@@ -31,11 +63,66 @@ public class ActivityPlanStandardServiceImpl extends ServiceImpl<ActivityPlanSta
 
     @Override
     public void activityIng(Object param) {
+        //查询当前进行的活动
+        List<ActivityPlan> activityIds = activityPlanService.list(Wrappers.<ActivityPlan>lambdaQuery()
+                .eq(ActivityPlan::getActivityType, ActivityTypeEnum.STANDARD_GIFT)
+                .eq(ActivityPlan::getActivityState, 1)
+                .select(ActivityPlan::getId));
 
+        for (ActivityPlan activityPlan : activityIds) {
+            DistributedLock.of(redissonClient)
+                    .runIfLockToFunction(CacheNameEnum.LOCK_ACTIVITY_STOCK.getRedisKey(activityPlan.getId())
+                            , this::dealActivityIng, activityPlan.getId(), 10l);
+        }
+    }
+
+    private Boolean dealActivityIng(Long activityId) {
+        ActivityPlanVo detail = activityPlanService.detail(activityId);
+        if (null == detail) {
+            return true;
+        }
+
+        ActivityPlanStandard planStandard = detail.getPlanStandard();
+        if (null == planStandard) {
+            return true;
+        }
+
+        UserFirstTimeSearch search = new UserFirstTimeSearch();
+        search.setStartTime(detail.getActivityStart());
+        search.setEndTime(detail.getActivityEnd());
+        search.setUserType(detail.getActivityClient().getCode());
+
+        String timeType = planStandard.getCondition();
+        search.setTimeType(timeType);
+        List<String> timeTypes = WrapperUtil.toList(timeType);
+
+        List<UserFirstTime> userFirstTimes = userFirstTimeService.selectAllList(search);
+        if (CollectionUtils.isEmpty(userFirstTimes)) {
+            return true;
+        }
+        Map<Long, 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());
     }

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

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