|  | @@ -10,6 +10,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;
 | 
	
	
		
			
				|  | @@ -22,6 +23,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.*;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.mapper.CouponInfoMapper;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.service.ActivityPlanRewardService;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.service.ActivityPlanService;
 | 
	
	
		
			
				|  | @@ -56,6 +58,7 @@ import java.util.List;
 | 
	
		
			
				|  |  |  import java.util.Map;
 | 
	
		
			
				|  |  |  import java.util.Optional;
 | 
	
		
			
				|  |  |  import java.util.stream.Collectors;
 | 
	
		
			
				|  |  | +import java.util.*;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  @Service
 | 
	
	
		
			
				|  | @@ -85,8 +88,14 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
 | 
	
		
			
				|  |  |      private ActivityPlanRewardService activityPlanRewardService;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @Autowired
 | 
	
		
			
				|  |  | +    private ActivityRewardService activityRewardService;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  |      private MemberPriceSettingsService memberPriceSettingsService;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private CouponIssueService couponIssueService;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      @Override
 | 
	
		
			
				|  |  |      public ActivityRewardVo detail(Long id) {
 | 
	
		
			
				|  |  |          return baseMapper.detail(id);
 | 
	
	
		
			
				|  | @@ -218,26 +227,29 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @Override
 | 
	
		
			
				|  |  |      @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | -    public List<Long> sendReward(Long userId, Long activityId) {
 | 
	
		
			
				|  |  | +    public List<Long> sendReward(Long userId, Long activityId,List<Long> rewardIdList) {
 | 
	
		
			
				|  |  |          if (userRewarded(userId, activityId)) {
 | 
	
		
			
				|  |  |              return new ArrayList<>();
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          ActivityPlan activityPlan = activityPlanService.getById(activityId);
 | 
	
		
			
				|  |  |          if (activityPlan == null) {
 | 
	
		
			
				|  |  |              log.warn("活动不存在");
 | 
	
		
			
				|  |  | -            return null;
 | 
	
		
			
				|  |  | +            return new ArrayList<>();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (CollectionUtils.isEmpty(rewardIdList)) {
 | 
	
		
			
				|  |  | +            log.warn("奖品不存在");
 | 
	
		
			
				|  |  | +            return new ArrayList<>();
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        List<ActivityPlanRewardDto> activityPlanRewardDtos = activityPlanRewardService.queryActivityPlanReward(
 | 
	
		
			
				|  |  | -                activityId);
 | 
	
		
			
				|  |  | +        Collection<ActivityReward> activityRewards = activityRewardService.listByIds(rewardIdList);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        if (CollectionUtils.isEmpty(activityPlanRewardDtos)) {
 | 
	
		
			
				|  |  | +        if (CollectionUtils.isEmpty(activityRewards)) {
 | 
	
		
			
				|  |  |              return new ArrayList<>();
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          // 级联锁同时处理奖品库存
 | 
	
		
			
				|  |  |          List<RLock> lockList = new ArrayList<>();
 | 
	
		
			
				|  |  | -        for (ActivityPlanRewardDto activityReward : activityPlanRewardDtos) {
 | 
	
		
			
				|  |  | +        for (ActivityReward activityReward : activityRewards) {
 | 
	
		
			
				|  |  |              lockList.add(redissonClient.getLock(CacheNameEnum.LOCK_ACTIVITY_REWARD_STOCK.getRedisKey(activityReward.getId())));
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -246,28 +258,40 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
 | 
	
		
			
				|  |  |          List<Long> activityRewardIdList = new ArrayList<>();
 | 
	
		
			
				|  |  |          List<String> rewardNameList = new ArrayList<>();
 | 
	
		
			
				|  |  |          try {
 | 
	
		
			
				|  |  | -            lock.lock();
 | 
	
		
			
				|  |  | -            for (ActivityPlanRewardDto activityReward : activityPlanRewardDtos) {
 | 
	
		
			
				|  |  | -                int update = activityPlanRewardService.reduceStock(activityId, activityReward.getActivityReward().getId());
 | 
	
		
			
				|  |  | +            // lock.lock();
 | 
	
		
			
				|  |  | +            for (ActivityReward activityReward : activityRewards) {
 | 
	
		
			
				|  |  | +                int update = activityPlanRewardService.reduceStock(activityId, activityReward.getId());
 | 
	
		
			
				|  |  |                  if (update == 0) {
 | 
	
		
			
				|  |  |                      continue;
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  | -                if (activityReward.getActivityReward().getRewardType().equals(RewardTypeEnum.PIAMO_ROOM)) {
 | 
	
		
			
				|  |  | +                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.getActivityReward().getNum());
 | 
	
		
			
				|  |  | +                    pianoRoomChangeRecord.setTimes(activityReward.getNum());
 | 
	
		
			
				|  |  |                      pianoRoomChangeRecord.setBizId(activityId.toString());
 | 
	
		
			
				|  |  |                      pianoRoomChangeRecord.setCreateTime(new Date());
 | 
	
		
			
				|  |  |                      pianoRoomChangeRecord.setReason(activityPlan.getActivityName());
 | 
	
		
			
				|  |  |                      pianoRoomChangeRecordService.add(pianoRoomChangeRecord);
 | 
	
		
			
				|  |  | -                } else if (activityReward.getActivityReward().getRewardType().equals(RewardTypeEnum.VIP)) {
 | 
	
		
			
				|  |  | +                } else if (activityReward.getRewardType().equals(RewardTypeEnum.VIP)) {
 | 
	
		
			
				|  |  |                      memberPriceSettingsService.activityReward(userId, activityPlan.getActivityClient(),
 | 
	
		
			
				|  |  | -                                                              activityReward.getActivityReward(), activityId,activityPlan.getActivityName());
 | 
	
		
			
				|  |  | +                                                              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.getActivityReward().getRewardName());
 | 
	
		
			
				|  |  | -                activityRewardIdList.add(activityReward.getActivityReward().getId());
 | 
	
		
			
				|  |  | +                rewardNameList.add(activityReward.getRewardName());
 | 
	
		
			
				|  |  | +                activityRewardIdList.add(activityReward.getId());
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              // 发送活动获奖推送
 | 
	
		
			
				|  |  |              if (!CollectionUtils.isEmpty(rewardNameList)) {
 | 
	
	
		
			
				|  | @@ -281,7 +305,8 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
 | 
	
		
			
				|  |  |          return activityRewardIdList;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    private Boolean userRewarded(Long userId, Long activityId) {
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public Boolean userRewarded(Long userId, Long activityId) {
 | 
	
		
			
				|  |  |          return baseMapper.userRewarded(userId, activityId);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 |