Browse Source

update:修改发奖逻辑

liujunchi 2 năm trước cách đây
mục cha
commit
60997d782c

+ 1 - 1
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/coupon/CouponIssueController.java

@@ -97,7 +97,7 @@ public class CouponIssueController {
         if (sysUser == null  || sysUser.getId() == null) {
             return failed("用户信息获取失败");
         }
-        couponIssueService.issueCoupon(param.getCouponId(),param.getUserParam(),sysUser.getId(),param.getRemark());
+        couponIssueService.issueCoupon(param.getCouponId(),param.getUserParam(),sysUser.getId(),param.getRemark(),true);
 
         return succeed();
     }

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

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.yonge.cooleshow.biz.dal.enums.activity.ActivityRankingRuleEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -56,6 +57,31 @@ public class ActivityUserReward implements Serializable {
     @TableField(value = "unit_")
     private String unit;
 
+    @ApiModelProperty("活动排名")
+    @TableField(value = "ranking_")
+    private Integer ranking;
+
+
+    @ApiModelProperty("活动排名规则")
+    @TableField(value = "ranking_rule_")
+    private ActivityRankingRuleEnum rankingRule;
+
+    public Integer getRanking() {
+        return ranking;
+    }
+
+    public void setRanking(Integer ranking) {
+        this.ranking = ranking;
+    }
+
+    public ActivityRankingRuleEnum getRankingRule() {
+        return rankingRule;
+    }
+
+    public void setRankingRule(ActivityRankingRuleEnum rankingRule) {
+        this.rankingRule = rankingRule;
+    }
+
     public String getUnit() {
         return unit;
     }

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

@@ -47,7 +47,7 @@ public interface CouponIssueService extends IService<CouponIssue> {
      * @param issuer
      * @param reason
      */
-    void issueCoupon(Long couponId, List<UserParam> userParam, Long issuer, String reason);
+    void issueCoupon(Long couponId, List<UserParam> userParam, Long issuer, String reason,Boolean sendMessage);
 
     /**
      * 查询能发放优惠券的用户列表

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

@@ -5,12 +5,16 @@ import com.yonge.cooleshow.biz.dal.dto.ActivityPlanDto;
 import com.yonge.cooleshow.biz.dal.dto.ActivityPlanRewardDto;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderPayReq;
 import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
+import com.yonge.cooleshow.biz.dal.entity.ActivityEvaluation;
 import com.yonge.cooleshow.biz.dal.entity.ActivityPlanReward;
 import com.yonge.cooleshow.biz.dal.entity.ActivityUserReward;
 import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.vo.ActivityPlanVo;
+import com.yonge.cooleshow.biz.dal.vo.ActivityRankingVo;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
+import com.yonge.cooleshow.common.enums.ActivityResourceEnum;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -21,10 +25,7 @@ import com.yonge.cooleshow.biz.dal.entity.ActivityPlanEvaluation;
 import com.yonge.cooleshow.biz.dal.dao.ActivityPlanEvaluationDao;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 
@@ -41,6 +42,15 @@ public class ActivityPlanEvaluationServiceImpl extends ServiceImpl<ActivityPlanE
     @Autowired
     private ActivityPlanRewardService activityPlanRewardService;
 
+    @Autowired
+    private ActivityPlanService activityPlanService;
+
+    @Autowired
+    private ActivityEvaluationRecordService activityEvaluationRecordService;
+
+    @Autowired
+    private ActivityEvaluationService activityEvaluationService;
+
     @Override
     public boolean createOrUpdate(ActivityPlanDto activityPlan) {
         ActivityPlanEvaluation planExpand = activityPlan.getPlanEvaluation();
@@ -58,11 +68,11 @@ public class ActivityPlanEvaluationServiceImpl extends ServiceImpl<ActivityPlanE
     }
 
     @Override
-    public void closeActivity(Long activytyId) {
+    public void closeActivity(Long activityId) {
         OrderSearch query = new OrderSearch();
         query.setOrderType(OrderTypeEnum.ACTI_REGIST.getCode());
         query.setGoodType(GoodTypeEnum.ACTI_REGIST.getCode());
-        query.setBizId(activytyId);
+        query.setBizId(activityId);
         List<UserOrderVo> userOrderVos = userOrderService.selectAllList(query);
         for (UserOrderVo userOrderVo : userOrderVos) {
             OrderPayReq payReq = new OrderPayReq();
@@ -79,31 +89,59 @@ public class ActivityPlanEvaluationServiceImpl extends ServiceImpl<ActivityPlanE
         //关闭未付款订单
         closeActivity(activityId);
 
+        ActivityPlanVo detail = activityPlanService.detail(activityId);
+        List<ActivityUserReward> activityUserRewardList = new ArrayList<>();
+
+        List<ActivityEvaluation> activityEvaluationList = activityEvaluationService.lambdaQuery()
+                                                                 .eq(ActivityEvaluation::getActivityId, activityId)
+                                                                 .list();
+
         //活动需要发放的奖品
-        List<ActivityPlanRewardDto> activityPlanRewardDtos = activityPlanRewardService.queryActivityPlanReward(
-                activityId);
-        Map<String, List<Long>> collect = activityPlanRewardDtos.stream()
-                                             .collect(Collectors.groupingBy(ActivityPlanReward::getGroup,));
-
-        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;
+        Map<String, List<ActivityPlanRewardDto>> rewardMap = detail.getActivityRewardList().stream()
+                                                                                 .collect(Collectors.groupingBy(
+                                                                                         ActivityPlanReward::getGroup));
+        for (ActivityEvaluation activityEvaluation : activityEvaluationList) {
+
+            List<ActivityRankingVo> activityRankingVos = activityEvaluationRecordService.queryRankingList(activityId,
+                                                              activityEvaluation.getId(),detail.getRanking());
+            for (int i = 0; i < activityRankingVos.size(); i++) {
+
+                ActivityRankingVo activityRankingVo = activityRankingVos.get(i);
+
+                List<ActivityPlanRewardDto> activityPlanRewardDtos = rewardMap.get(i + 1 + "");
+                if (CollectionUtils.isEmpty(activityPlanRewardDtos)) {
+                    continue;
+                }
+
+                List<Long> rewardIdList = activityPlanRewardDtos.stream()
+                                   .map(activityPlanRewardDto -> activityPlanRewardDto.getActivityReward().getId())
+                                   .collect(Collectors.toList());
+
+                //给用户发放奖品 传入用户id和活动id
+                List<Long> successRewardIds = activityRewardService.sendReward(activityRankingVo.getUserId(), activityId,rewardIdList);
+
+                // 保存奖品发放记录
+                for (Long rewardId : rewardIdList) {
+                    ActivityUserReward activityUserReward = new ActivityUserReward();
+                    activityUserReward.setActivityId(activityId);
+                    activityUserReward.setBizId(activityEvaluation.getId());
+                    activityUserReward.setUserId(activityRankingVo.getUserId());
+                    activityUserReward.setRankingRule(detail.getRankingRule());
+                    activityUserReward.setRanking(i+1);
+                    activityUserReward.setCreateTime(new Date());
+                    activityUserReward.setUpdateTime(new Date());
+                    activityUserReward.setRewardId(rewardId);
+                    if (successRewardIds.contains(rewardId)) {
+                        activityUserReward.setGrantFlag(1);
                     }
+                    activityUserRewardList.add(activityUserReward);
                 }
-                o.setGrantFlag(0);
-            });
+            }
+        }
+        if (!CollectionUtils.isEmpty(activityUserRewardList)) {
+            activityUserRewardService.saveBatch(activityUserRewardList);
         }
-        activityUserRewardService.saveBatch(activityUserRewardList);
-
         //发完奖后将库存归还
-        activityPlanRewardService.recoveryReward(activityId);
+        // activityPlanRewardService.recoveryReward(activityId);
     }
 }

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

@@ -147,8 +147,12 @@ public class ActivityPlanStandardServiceImpl extends ServiceImpl<ActivityPlanSta
     }
 
     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());
         //给用户发奖
-        List<Long> successRewardIds = activityRewardService.sendReward(userId, activityId);
+        List<Long> successRewardIds = activityRewardService.sendReward(userId, activityId,rewardIdList);
 
         for (ActivityPlanRewardDto dto : activityPlanRewardDtos) {
             ActivityUserReward userReward = new ActivityUserReward();

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

@@ -8,6 +8,7 @@ import com.yonge.cooleshow.biz.dal.dao.ActivityRewardChangeStockDao;
 import com.yonge.cooleshow.biz.dal.dao.ActivityRewardDao;
 import com.yonge.cooleshow.biz.dal.dto.ActivityPlanRewardDto;
 import com.yonge.cooleshow.biz.dal.dto.ActivityRewardDto;
+import com.yonge.cooleshow.biz.dal.dto.UserParam;
 import com.yonge.cooleshow.biz.dal.dto.search.ActivityRewardChangeStockSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.ActivityRewardSearch;
 import com.yonge.cooleshow.biz.dal.entity.ActivityPlan;
@@ -18,12 +19,7 @@ import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
 import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
-import com.yonge.cooleshow.biz.dal.service.ActivityPlanRewardService;
-import com.yonge.cooleshow.biz.dal.service.ActivityPlanService;
-import com.yonge.cooleshow.biz.dal.service.ActivityRewardService;
-import com.yonge.cooleshow.biz.dal.service.MemberPriceSettingsService;
-import com.yonge.cooleshow.biz.dal.service.PianoRoomChangeRecordService;
-import com.yonge.cooleshow.biz.dal.service.SysMessageService;
+import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.vo.ActivityRewardChangeStockVo;
 import com.yonge.cooleshow.biz.dal.vo.ActivityRewardVo;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
@@ -83,6 +79,9 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
     @Autowired
     private MemberPriceSettingsService memberPriceSettingsService;
 
+    @Autowired
+    private CouponIssueService couponIssueService;
+
     @Override
     public ActivityRewardVo detail(Long id) {
         return baseMapper.detail(id);
@@ -205,22 +204,22 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
         }
 
         // 级联锁同时处理奖品库存
-        // List<RLock> lockList = new ArrayList<>();
-        // for (ActivityPlanRewardDto activityReward : activityPlanRewardDtos) {
-        //     lockList.add(redissonClient.getLock(CacheNameEnum.LOCK_ACTIVITY_REWARD_STOCK.getRedisKey(activityReward.getId())));
-        // }
-        //
-        // RedissonMultiLock lock = new RedissonMultiLock(lockList.toArray(new RLock[lockList.size()]));
+        List<RLock> lockList = new ArrayList<>();
+        for (ActivityReward activityReward : activityRewards) {
+            lockList.add(redissonClient.getLock(CacheNameEnum.LOCK_ACTIVITY_REWARD_STOCK.getRedisKey(activityReward.getId())));
+        }
+
+        RedissonMultiLock lock = new RedissonMultiLock(lockList.toArray(new RLock[lockList.size()]));
 
         List<Long> activityRewardIdList = new ArrayList<>();
         List<String> rewardNameList = new ArrayList<>();
         try {
             // lock.lock();
             for (ActivityReward activityReward : activityRewards) {
-                // int update = activityPlanRewardService.reduceStock(activityId, activityReward.getActivityReward().getId());
-                // if (update == 0) {
-                //     continue;
-                // }
+                int update = activityPlanRewardService.reduceStock(activityId, activityReward.getId());
+                if (update == 0) {
+                    continue;
+                }
                 if (activityReward.getRewardType().equals(RewardTypeEnum.PIAMO_ROOM)) {
                     PianoRoomChangeRecord pianoRoomChangeRecord = new PianoRoomChangeRecord();
                     pianoRoomChangeRecord.setUserId(userId);
@@ -234,6 +233,18 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
                 } 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);
+                    try {
+                        couponIssueService.issueCoupon(activityReward.getCouponId(),list,null,"活动奖品",false);
+                    } catch (BizException e) {
+                        log.warn("send activity coupon {}",e.fillInStackTrace());
+                        continue;
+                    }
                 }
                 rewardNameList.add(activityReward.getRewardName());
                 activityRewardIdList.add(activityReward.getId());
@@ -244,7 +255,7 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
                 sendActivityMessage(userId, activityPlan.getActivityName(),name, activityPlan.getActivityClient());
             }
         } finally {
-            // lock.unlock();
+            lock.unlock();
         }
 
         return activityRewardIdList;

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

@@ -157,7 +157,7 @@ public class CouponIssueServiceImp extends ServiceImpl<CouponIssueMapper, Coupon
 
     @Override
     @Transactional
-    public void issueCoupon(Long couponId, List<UserParam> userParam, Long issuer, String reason) {
+    public void issueCoupon(Long couponId, List<UserParam> userParam, Long issuer, String reason,Boolean sendMessage) {
         CouponInfo couponInfo = couponInfoService.queryCouponInfoById(couponId);
         if (couponInfo == null) {
             throw new BizException("未找到优惠券信息");
@@ -210,7 +210,9 @@ public class CouponIssueServiceImp extends ServiceImpl<CouponIssueMapper, Coupon
         }
 
         // 发送消息
-        sendMessage(couponInfo.getName(),userParam);
+        if (sendMessage) {
+            sendMessage(couponInfo.getName(), userParam);
+        }
     }
 
     private void sendMessage(String couponName,List<UserParam> userParams) {