浏览代码

Merge branch 'dev_v1.3.4_20220914' into online

Eric 2 年之前
父节点
当前提交
4f4cb1eb83
共有 15 个文件被更改,包括 243 次插入126 次删除
  1. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityPlanRewardDao.java
  2. 20 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityPlanReward.java
  3. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityUserReward.java
  4. 3 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityPlanRewardService.java
  5. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityRewardService.java
  6. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityEvaluationServiceImpl.java
  7. 12 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanEvaluationServiceImpl.java
  8. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanRewardServiceImpl.java
  9. 13 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanServiceImpl.java
  10. 77 54
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanStandardServiceImpl.java
  11. 66 51
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityRewardServiceImpl.java
  12. 1 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityUserRewardServiceImpl.java
  13. 30 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserRewardVo.java
  14. 3 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityPlanRewardMapper.xml
  15. 1 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityUserRewardMapper.xml

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

@@ -50,7 +50,7 @@ public interface ActivityPlanRewardDao extends BaseMapper<ActivityPlanReward>{
 	 * 减少库存
 	 *
 	 * @param activityId 活动id
-	 * @param rewardId   奖品id
+	 * @param activityRewardId   活动关闻奖品id
 	 */
-	int reduceStock(@Param("activityId") Long activityId, @Param("rewardId") Long rewardId);
+	int reduceStock(@Param("activityId") Long activityId, @Param("activityRewardId") Long activityRewardId);
 }

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

@@ -37,6 +37,11 @@ public class ActivityPlanReward implements Serializable {
     @NotNull(message = "奖品数量不能为空")
     @PositiveOrZero(message = "奖品数量必须大于等于0")
     private Integer rewardNum;
+
+    @ApiModelProperty("奖品库存 ")
+    @TableField(value = "reward_stock_")
+    private Integer rewardStock;
+
     @ApiModelProperty("创建时间 ")
 	@TableField(value = "create_time_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@@ -47,7 +52,15 @@ public class ActivityPlanReward implements Serializable {
     @TableField(value = "group_")
     private String group;
 
-	public Long getId() {
+    public Integer getRewardStock() {
+        return rewardStock;
+    }
+
+    public void setRewardStock(Integer rewardStock) {
+        this.rewardStock = rewardStock;
+    }
+
+    public Long getId() {
         return id;
     }
 
@@ -94,4 +107,10 @@ public class ActivityPlanReward implements Serializable {
     public void setGroup(String group) {
         this.group = group;
     }
+
+
+    public ActivityPlanReward rewardStock(Integer rewardStock) {
+        this.rewardStock = rewardStock;
+        return this;
+    }
 }

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

@@ -52,6 +52,9 @@ public class ActivityUserReward implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
     private Date updateTime;
 
+    @ApiModelProperty("获奖时间 ")
+    @TableField(value = "winning_time_")
+    private Date winningTime;
 
     @ApiModelProperty("奖品单位 同奖品表")
     @TableField(value = "unit_")
@@ -162,4 +165,11 @@ public class ActivityUserReward implements Serializable {
         this.updateTime = updateTime;
     }
 
+    public Date getWinningTime() {
+        return winningTime;
+    }
+
+    public void setWinningTime(Date winningTime) {
+        this.winningTime = winningTime;
+    }
 }

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

@@ -71,9 +71,9 @@ public interface ActivityPlanRewardService extends IService<ActivityPlanReward>
     Boolean recoveryReward(ActivityPlanReward reward);
 	/**
 	 * 减少库存
-	 *  @param activityId 活动id
-	 * @param rewardId   奖品id
+	 * @param activityId 活动id
+	 * @param activityRewardId  活动关闻奖品id
 	 * @return
 	 */
-    int reduceStock(Long activityId, Long rewardId);
+    int reduceStock(Long activityId, Long activityRewardId);
 }

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

@@ -86,10 +86,11 @@ public interface ActivityRewardService extends IService<ActivityReward>  {
 	 * 发放获奖奖品
 	 * @param userId 用户id
 	 * @param activityId 活动id
+	 * @param activityRewardIds 活动关联奖品ID
 	 * @param date
 	 * @return 返回发放成功奖品id
 	 */
-	List<Long> sendReward(Long userId, Long activityId, List<Long> rewardIdList, Date date);
+	List<Long> sendReward(Long userId, Long activityId, List<Long> activityRewardIds, Date date);
 
 	Boolean userRewarded(Long userId, Long activityId);
 }

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

@@ -169,6 +169,7 @@ public class ActivityEvaluationServiceImpl extends ServiceImpl<ActivityEvaluatio
 
             activityPlanRewardService.update(Wrappers.<ActivityPlanReward>lambdaUpdate()
                             .set(ActivityPlanReward::getRewardNum, ret)
+                            .set(ActivityPlanReward::getRewardStock, ret)
                     .eq(ActivityPlanReward::getActivityId, activity.getId()));
         }
 

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

@@ -123,15 +123,16 @@ public class ActivityPlanEvaluationServiceImpl extends ServiceImpl<ActivityPlanE
                     continue;
                 }
 
-                List<Long> rewardIdList = activityPlanRewardDtos.stream()
-                                   .map(activityPlanRewardDto -> activityPlanRewardDto.getActivityReward().getId())
-                                   .collect(Collectors.toList());
+                // 活动关联奖品ID
+                List<Long> activityRewardIds = activityPlanRewardDtos.stream()
+                                   .map(ActivityPlanReward::getId).collect(Collectors.toList());
 
                 //给用户发放奖品 传入用户id和活动id
-                List<Long> successRewardIds = activityRewardService.sendReward(activityRankingVo.getUserId(), activityId,rewardIdList,date);
+                List<Long> collect = activityRewardService.sendReward(activityRankingVo.getUserId(), activityId, activityRewardIds, date);
 
                 // 保存奖品发放记录
-                for (Long rewardId : rewardIdList) {
+                for (ActivityPlanRewardDto item : activityPlanRewardDtos) {
+
                     ActivityUserReward activityUserReward = new ActivityUserReward();
                     activityUserReward.setActivityId(activityId);
                     activityUserReward.setBizId(activityEvaluation.getId());
@@ -139,14 +140,18 @@ public class ActivityPlanEvaluationServiceImpl extends ServiceImpl<ActivityPlanE
                     activityUserReward.setRankingRule(detail.getRankingRule());
                     activityUserReward.setRanking(i+1);
                     activityUserReward.setGrantFlag(0);
+                    activityUserReward.setWinningTime(activityRankingVo.getJoinDate());
                     activityUserReward.setCreateTime(date);
                     activityUserReward.setUpdateTime(date);
-                    activityUserReward.setRewardId(rewardId);
-                    if (successRewardIds.contains(rewardId)) {
+                    activityUserReward.setRewardId(item.getRewardId());
+
+                    // 奖品发送状态
+                    if (collect.contains(item.getId())) {
                         activityUserReward.setGrantFlag(1);
                     }
                     activityUserRewardList.add(activityUserReward);
                 }
+
             }
         }
         if (!CollectionUtils.isEmpty(activityUserRewardList)) {

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

@@ -186,8 +186,8 @@ public class ActivityPlanRewardServiceImpl extends ServiceImpl<ActivityPlanRewar
     }
 
     @Override
-    public int reduceStock(Long activityId, Long rewardId) {
-        return baseMapper.reduceStock(activityId, rewardId);
+    public int reduceStock(Long activityId, Long activityRewardId) {
+        return baseMapper.reduceStock(activityId, activityRewardId);
     }
 
 }

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

@@ -631,6 +631,17 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
             throw new BizException("无效的活动ID");
         }
 
+        // 校验添加奖品与当前客户端是否匹配
+        List<Long> collect = saveOrUpdateRewardDto.getUpdateRewardDtoList().stream()
+                .map(ActivityPlanReward::getRewardId).distinct().collect(Collectors.toList());
+
+        long validRewardNums = activityRewardService.listByIds(collect).stream()
+                .filter(x -> x.getRewardClient().equals(activityPlan.getActivityClient().getCode()))
+                .count();
+        if (saveOrUpdateRewardDto.getUpdateRewardDtoList().size() != validRewardNums) {
+            throw new BizException("添加奖品与活动客户端不匹配");
+        }
+
         int ret = 0;
         if (ActivityTypeEnum.EVALUATION == activityPlan.getActivityType()) {
 
@@ -649,9 +660,10 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
                 item.setGroup("1");
             }
 
+            item.setRewardStock(item.getRewardNum());
             // 评测活动
             if (ActivityTypeEnum.EVALUATION == activityPlan.getActivityType()) {
-                item.setRewardNum(ret);
+                item.rewardStock(ret).setRewardNum(ret);
             }
             planReward = activityPlanRewardService.detailByActivityIdAndRewardId(item.getActivityId(), item.getRewardId(), item.getGroup());
 

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

@@ -1,25 +1,44 @@
 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.dao.ActivityPlanStandardDao;
 import com.yonge.cooleshow.biz.dal.dto.ActivityPlanDto;
 import com.yonge.cooleshow.biz.dal.dto.ActivityPlanRewardDto;
 import com.yonge.cooleshow.biz.dal.dto.search.UserFirstTimeSearch;
-import com.yonge.cooleshow.biz.dal.entity.*;
-import com.yonge.cooleshow.biz.dal.service.*;
-import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
+import com.yonge.cooleshow.biz.dal.entity.ActivityPlan;
+import com.yonge.cooleshow.biz.dal.entity.ActivityPlanReward;
+import com.yonge.cooleshow.biz.dal.entity.ActivityPlanStandard;
+import com.yonge.cooleshow.biz.dal.entity.ActivityRegistration;
+import com.yonge.cooleshow.biz.dal.entity.ActivityUserReward;
+import com.yonge.cooleshow.biz.dal.entity.UserFirstTime;
+import com.yonge.cooleshow.biz.dal.service.ActivityPlanRewardService;
+import com.yonge.cooleshow.biz.dal.service.ActivityPlanService;
+import com.yonge.cooleshow.biz.dal.service.ActivityPlanStandardService;
+import com.yonge.cooleshow.biz.dal.service.ActivityRegistrationService;
+import com.yonge.cooleshow.biz.dal.service.ActivityRewardService;
+import com.yonge.cooleshow.biz.dal.service.ActivityUserRewardService;
+import com.yonge.cooleshow.biz.dal.service.UserFirstTimeService;
 import com.yonge.cooleshow.biz.dal.vo.ActivityPlanVo;
-import com.yonge.cooleshow.common.enums.*;
+import com.yonge.cooleshow.common.enums.ActivityTypeEnum;
+import com.yonge.cooleshow.common.enums.CacheNameEnum;
+import com.yonge.cooleshow.common.enums.ConditionMethodEnum;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.payment.util.DistributedLock;
+import org.apache.commons.collections.MapUtils;
+import org.joda.time.DateTime;
 import org.redisson.api.RedissonClient;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import com.yonge.cooleshow.biz.dal.dao.ActivityPlanStandardDao;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
 
-import java.util.*;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 
@@ -94,62 +113,66 @@ public class ActivityPlanStandardServiceImpl extends ServiceImpl<ActivityPlanSta
 
         String timeType = planStandard.getCondition();
         search.setTimeType(timeType);
-        List<String> timeTypes = WrapperUtil.toList(timeType);
 
-        List<UserFirstTime> userFirstTimes = userFirstTimeService.selectAllList(search);
-        if (CollectionUtils.isEmpty(userFirstTimes)) {
+        // 达标活动匹配条件数
+        int conditionNum = planStandard.getCondition().split(",").length;
+
+        // 用户激活时间
+        Map<Long, List<Long>> userActiveTimeMap = userFirstTimeService.selectAllList(search).stream()
+                .collect(Collectors.groupingBy(UserFirstTime::getUserId,
+                        Collectors.mapping(x -> new DateTime(x.getTime()).getMillis(), Collectors.toList())));
+
+        if (MapUtils.isEmpty(userActiveTimeMap)) {
             return true;
         }
-        Map<Long, Date> userIdSortMap = new LinkedHashMap<>();
-        if (ConditionMethodEnum.OR.equals(planStandard.getCalculationMethod())) {
-            for (int i = 0; i < userFirstTimes.size(); i++) {
-                UserFirstTime userFirstTime = userFirstTimes.get(i);
-                if (null == userIdSortMap.get(userFirstTime.getUserId())) {
-                    userIdSortMap.put(userFirstTime.getUserId(), userFirstTime.getTime());
-                }
-            }
-        } else {
-            for (int i = (userFirstTimes.size() - 1); i >= 0; i--) {
-                UserFirstTime userFirstTime = userFirstTimes.get(i);
-                if (null == userIdSortMap.get(userFirstTime.getUserId())) {
-                    userIdSortMap.put(userFirstTime.getUserId(), userFirstTime.getTime());
-                }
-            }
-        }
 
         List<ActivityPlanRewardDto> activityPlanRewardDtos = activityPlanRewardService.queryActivityPlanReward(activityId);
-        Map<Long, List<UserFirstTime>> userMap = userFirstTimes.stream().collect(Collectors.groupingBy(UserFirstTime::getUserId));
 
-        if (ConditionMethodEnum.OR.equals(planStandard.getCalculationMethod())) {
-            for (Long userId : userIdSortMap.keySet()) {
-                Date createTime = userIdSortMap.get(userId);
-                //给用户发奖
-                sendUserReward(userId, detail.getId(), createTime, activityPlanRewardDtos);
-            }
-        } else {
-            List<Long> mainList = new ArrayList<>();
-            mainList.addAll(userIdSortMap.keySet());
-            Collections.reverse(mainList);
-
-            for (Long userId : mainList) {
-                Date createTime = userIdSortMap.get(userId);
-                List<UserFirstTime> firstTimes = userMap.get(userId);
-                if (firstTimes.size() == timeTypes.size()) {
+        // 用户信息
+        for (Map.Entry<Long, List<Long>> entry : userActiveTimeMap.entrySet()) {
+
+            if (ConditionMethodEnum.OR.equals(planStandard.getCalculationMethod())) {
+
+                // 满足其一
+                long timestamp = entry.getValue().stream().mapToLong(Long::longValue).min().orElse(0L);
+
+                if (timestamp > 0) {
                     //给用户发奖
-                    sendUserReward(userId, detail.getId(), createTime, activityPlanRewardDtos);
+                    sendUserReward(entry.getKey(), detail.getId(), new Date(timestamp), activityPlanRewardDtos);
+                }
+
+            } else {
+
+                // 全部满足
+                long timestamp = entry.getValue().stream().mapToLong(Long::longValue).max().orElse(0L);
+
+                if (timestamp > 0 && entry.getValue().size() == conditionNum) {
+                    //给用户发奖
+                    sendUserReward(entry.getKey(), detail.getId(), new Date(timestamp), activityPlanRewardDtos);
                 }
             }
+
         }
+
         return true;
     }
 
-    private void sendUserReward(Long userId, Long activityId, Date createTime, List<ActivityPlanRewardDto> activityPlanRewardDtos) {
-        List<Long> rewardIdList = activityPlanRewardDtos.stream()
-                                                   .map(activityPlanRewardDto -> activityPlanRewardDto.getActivityReward()
-                                                                                                      .getId())
-                                                   .collect(Collectors.toList());
+    private void sendUserReward(Long userId, Long activityId, Date winningTime, List<ActivityPlanRewardDto> activityPlanRewardDtos) {
+
+        Date date = DateTime.now().toDate(); // 发奖时间
+        try {
+            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            date = formatter.parse(formatter.format(date));
+        } catch (ParseException e) {
+            log.warn("sendUserReward TIME_CONVERT, userId={}, activityId={}, winningTime={}", userId, activityId, winningTime);
+        }
+
+        // 活动关联奖品ID
+        List<Long> activityRewardIds = activityPlanRewardDtos.stream()
+                .map(ActivityPlanReward::getId).collect(Collectors.toList());
+
         //给用户发奖
-        List<Long> successRewardIds = activityRewardService.sendReward(userId, activityId, rewardIdList, new Date());
+        List<Long> collect = activityRewardService.sendReward(userId, activityId, activityRewardIds, date);
 
         for (ActivityPlanRewardDto dto : activityPlanRewardDtos) {
             ActivityUserReward userReward = new ActivityUserReward();
@@ -157,9 +180,9 @@ public class ActivityPlanStandardServiceImpl extends ServiceImpl<ActivityPlanSta
             userReward.setUserId(userId);
             userReward.setRewardId(dto.getRewardId());
 
-            Optional<Long> first = successRewardIds.stream().filter(o -> o.equals(dto.getRewardId())).findFirst();
-            userReward.setGrantFlag(first.isPresent() ? 1 : 0);
-            userReward.setCreateTime(createTime);
+            userReward.setGrantFlag(collect.contains(dto.getId()) ? 1 : 0);
+            userReward.setWinningTime(winningTime); // 获将时间
+            userReward.setCreateTime(date); // 发奖时间
 
             ActivityUserReward one = activityUserRewardService.getOne(Wrappers.<ActivityUserReward>lambdaQuery()
                     .eq(ActivityUserReward::getUserId, userId)

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

@@ -38,6 +38,7 @@ import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.payment.util.DistributedLock;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
 import org.redisson.RedissonMultiLock;
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
@@ -55,6 +56,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 
@@ -236,7 +238,7 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public List<Long> sendReward(Long userId, Long activityId, List<Long> rewardIdList, Date date) {
+    public List<Long> sendReward(Long userId, Long activityId, List<Long> activityRewardIds, Date date) {
         if (userRewarded(userId, activityId)) {
             return new ArrayList<>();
         }
@@ -245,69 +247,82 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
             log.warn("活动不存在");
             return new ArrayList<>();
         }
-        if (CollectionUtils.isEmpty(rewardIdList)) {
+        if (CollectionUtils.isEmpty(activityRewardIds)) {
             log.warn("奖品不存在");
             return new ArrayList<>();
         }
 
-        Collection<ActivityReward> activityRewards = activityRewardService.listByIds(rewardIdList);
+        // 根据活动关联奖品ID,查询奖品信息
+        Collection<ActivityPlanReward> activityRewards = activityPlanRewardService.listByIds(activityRewardIds);
 
-        if (CollectionUtils.isEmpty(activityRewards)) {
-            return new ArrayList<>();
-        }
+        // 活动奖品信息
+        List<Long> rewardIds = activityRewards.stream()
+                .map(ActivityPlanReward::getRewardId).distinct().collect(Collectors.toList());
 
-        // 级联锁同时处理奖品库存
-        List<RLock> lockList = new ArrayList<>();
-        for (ActivityReward activityReward : activityRewards) {
-            lockList.add(redissonClient.getLock(CacheNameEnum.LOCK_ACTIVITY_REWARD_STOCK.getRedisKey(activityReward.getId())));
-        }
+        Map<Long, ActivityReward> rewardInfoMap = activityRewardService.listByIds(rewardIds).stream()
+                .collect(Collectors.toMap(ActivityReward::getId, Function.identity(), (o, n) -> n));
 
-        RedissonMultiLock lock = new RedissonMultiLock(lockList.toArray(new RLock[lockList.size()]));
+        if (MapUtils.isEmpty(rewardInfoMap)) {
+            return new ArrayList<>();
+        }
 
         List<Long> activityRewardIdList = new ArrayList<>();
         List<String> rewardNameList = new ArrayList<>();
-        try {
-            lock.lock();
-            for (ActivityReward activityReward : activityRewards) {
-                int update = activityPlanRewardService.reduceStock(activityId, activityReward.getId());
-                if (update == 0) {
+
+        ActivityReward activityReward;
+        for (ActivityPlanReward item : activityRewards) {
+
+            if (!rewardInfoMap.containsKey(item.getRewardId())) {
+                // 没有匹配奖品信息,读取下一行数据
+                continue;
+            }
+
+            activityReward = rewardInfoMap.get(item.getRewardId());
+
+            // 扣减奖品库存
+            int update = activityPlanRewardService.reduceStock(activityId, item.getId());
+            if (update == 0) {
+                continue;
+            }
+
+            if (activityReward.getRewardType().equals(RewardTypeEnum.PIAMO_ROOM)) {
+                // 琴房课时
+                PianoRoomChangeRecord pianoRoomChangeRecord = new PianoRoomChangeRecord();
+                pianoRoomChangeRecord.setUserId(userId);
+                pianoRoomChangeRecord.setInOrOut(InOrOutEnum.IN);
+                pianoRoomChangeRecord.setSourceType(SourceTypeEnum.ACTIVITY);
+                pianoRoomChangeRecord.setTimes(activityReward.getNum());
+                pianoRoomChangeRecord.setBizId(activityId.toString());
+                pianoRoomChangeRecord.setCreateTime(new Date());
+                pianoRoomChangeRecord.setReason(activityPlan.getActivityName());
+                pianoRoomChangeRecordService.add(pianoRoomChangeRecord);
+            } else if (activityReward.getRewardType().equals(RewardTypeEnum.VIP)) {
+                // VIP
+                memberPriceSettingsService.activityReward(userId, activityPlan.getActivityClient(),
+                        activityReward, activityId,activityPlan.getActivityName());
+            } else if (activityReward.getRewardType().equals(RewardTypeEnum.COUPON)) {
+                // 优惠券
+                List<UserParam> list = new ArrayList<>();
+                UserParam userParam = new UserParam();
+                userParam.setUserId(userId);
+                userParam.setClientType(activityPlan.getActivityClient());
+                list.add(userParam);
+                Boolean issueCoupon = couponIssueService.issueCoupon(activityReward.getCouponId(), list, null, activityPlan.getActivityName(),
+                        false, false, SendTypeEnum.ACTIVITY,date);
+                if (!issueCoupon) {
                     continue;
                 }
-                if (activityReward.getRewardType().equals(RewardTypeEnum.PIAMO_ROOM)) {
-                    PianoRoomChangeRecord pianoRoomChangeRecord = new PianoRoomChangeRecord();
-                    pianoRoomChangeRecord.setUserId(userId);
-                    pianoRoomChangeRecord.setInOrOut(InOrOutEnum.IN);
-                    pianoRoomChangeRecord.setSourceType(SourceTypeEnum.ACTIVITY);
-                    pianoRoomChangeRecord.setTimes(activityReward.getNum());
-                    pianoRoomChangeRecord.setBizId(activityId.toString());
-                    pianoRoomChangeRecord.setCreateTime(new Date());
-                    pianoRoomChangeRecord.setReason(activityPlan.getActivityName());
-                    pianoRoomChangeRecordService.add(pianoRoomChangeRecord);
-                } else if (activityReward.getRewardType().equals(RewardTypeEnum.VIP)) {
-                    memberPriceSettingsService.activityReward(userId, activityPlan.getActivityClient(),
-                                                              activityReward, activityId,activityPlan.getActivityName());
-                } else if (activityReward.getRewardType().equals(RewardTypeEnum.COUPON)) {
-                    List<UserParam> list = new ArrayList<>();
-                    UserParam userParam = new UserParam();
-                    userParam.setUserId(userId);
-                    userParam.setClientType(activityPlan.getActivityClient());
-                    list.add(userParam);
-                    Boolean issueCoupon = couponIssueService.issueCoupon(activityReward.getCouponId(), list, null, activityPlan.getActivityName(),
-                                                                         false, false, SendTypeEnum.ACTIVITY,date);
-                    if (!issueCoupon) {
-                        continue;
-                    }
-                }
-                rewardNameList.add(activityReward.getRewardName());
-                activityRewardIdList.add(activityReward.getId());
-            }
-            // 发送活动获奖推送
-            if (!CollectionUtils.isEmpty(rewardNameList)) {
-                String name = String.join(",", rewardNameList);
-                sendActivityMessage(userId, activityPlan.getActivityName(),name, activityPlan.getActivityClient());
             }
-        } finally {
-            lock.unlock();
+            // 获取推送奖品消息信息
+            rewardNameList.add(activityReward.getRewardName());
+            // 关联返回数据,更新用户奖品发送状态
+            activityRewardIdList.add(item.getId());
+        }
+
+        // 发送活动获奖推送
+        if (!CollectionUtils.isEmpty(rewardNameList)) {
+            String name = String.join(",", rewardNameList);
+            sendActivityMessage(userId, activityPlan.getActivityName(),name, activityPlan.getActivityClient());
         }
 
         return activityRewardIdList;

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

@@ -9,11 +9,10 @@ import com.yonge.cooleshow.biz.dal.dto.search.ActivityUserRewardSearch;
 import com.yonge.cooleshow.biz.dal.entity.ActivityEvaluationRecord;
 import com.yonge.cooleshow.biz.dal.entity.ActivityPlan;
 import com.yonge.cooleshow.biz.dal.entity.ActivityReward;
+import com.yonge.cooleshow.biz.dal.entity.ActivityUserReward;
 import com.yonge.cooleshow.biz.dal.service.ActivityEvaluationRecordService;
 import com.yonge.cooleshow.biz.dal.service.ActivityPlanService;
 import com.yonge.cooleshow.biz.dal.service.ActivityRewardService;
-import com.yonge.cooleshow.biz.dal.entity.ActivityUserReward;
-import com.yonge.cooleshow.biz.dal.service.ActivityPlanService;
 import com.yonge.cooleshow.biz.dal.service.ActivityUserRewardService;
 import com.yonge.cooleshow.biz.dal.vo.ActivityUserRewardVo;
 import com.yonge.cooleshow.biz.dal.vo.UserRewardVo;

+ 30 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserRewardVo.java

@@ -31,11 +31,16 @@ public class UserRewardVo implements Serializable {
 	@ApiModelProperty("手机号")
 	private String phone;
 
-	@ApiModelProperty("获奖/达标时间")
+	@ApiModelProperty("发奖时间")
 	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
 	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
 	private Date  createTime;
 
+	@ApiModelProperty("获奖/达标时间")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private Date winningTime;
+
 	@ApiModelProperty("评测时间")
 	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
 	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@@ -180,6 +185,30 @@ public class UserRewardVo implements Serializable {
 		this.evaluationTime = evaluationTime;
 	}
 
+	public Date getWinningTime() {
+		return winningTime;
+	}
+
+	public void setWinningTime(Date winningTime) {
+		this.winningTime = winningTime;
+	}
+
+	public Double getScore() {
+		return score;
+	}
+
+	public void setScore(Double score) {
+		this.score = score;
+	}
+
+	public int getTimes() {
+		return times;
+	}
+
+	public void setTimes(int times) {
+		this.times = times;
+	}
+
 	public UserRewardVo teacherName(String teacherName) {
 		this.teacherName = teacherName;
 		return this;

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

@@ -6,6 +6,7 @@
 	        <result column="activity_id_" property="activityId" />
 	        <result column="reward_id_" property="rewardId" />
 	        <result column="reward_num_" property="rewardNum" />
+	        <result column="reward_stock_" property="rewardStock" />
 	        <result column="create_time_" property="createTime" />
 		</resultMap>  
     
@@ -15,6 +16,7 @@
         , t.activity_id_ as activityId
         , t.reward_id_ as rewardId
         , t.reward_num_ as rewardNum
+        , t.reward_stock_ as rewardStock
         , t.group_ AS `group`
         , t.create_time_ as createTime
         </sql>
@@ -84,6 +86,6 @@
 
 
 	<update id="reduceStock">
-        update activity_plan_reward set reward_num_ = reward_num_ - 1 where #{activityId} = activity_id_ and #{rewardId} = reward_id_ and reward_num_ > 0
+        update activity_plan_reward set reward_stock_ = reward_stock_ - 1 where id_ = #{activityRewardId} AND activity_id_ = #{activityId} and reward_stock_ > 0
     </update>
 </mapper>

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

@@ -45,6 +45,7 @@
             <choose>
                 <when test="param.activityGroupBy == 1">
                     /*按用户、活动分组统计*/
+                    IFNULL(t.winning_time_, t.create_time_) AS winningTime,
                     MIN(t.create_time_) as createTime,
                     COUNT(DISTINCT t.id_) AS amount,
                     group_concat(if(t.grant_flag_ = 1,ar.reward_name_,null)) as rewardNames,