|
@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.service.impl;
|
|
|
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
|
|
|
import com.yonge.cooleshow.auth.api.entity.SysUser;
|
|
|
import com.yonge.cooleshow.biz.dal.dao.ActivityPlanDao;
|
|
|
import com.yonge.cooleshow.biz.dal.dao.ActivityRewardChangeStockDao;
|
|
@@ -10,28 +11,37 @@ import com.yonge.cooleshow.biz.dal.dto.search.ActivityRewardChangeStockSearch;
|
|
|
import com.yonge.cooleshow.biz.dal.entity.ActivityPlan;
|
|
|
import com.yonge.cooleshow.biz.dal.entity.ActivityRewardChangeStock;
|
|
|
import com.yonge.cooleshow.biz.dal.entity.UserOrder;
|
|
|
+import com.yonge.cooleshow.biz.dal.entity.*;
|
|
|
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
|
|
|
import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
|
|
|
import com.yonge.cooleshow.biz.dal.vo.ActivityRewardChangeStockVo;
|
|
|
+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.common.entity.HttpResponseResult;
|
|
|
import com.yonge.cooleshow.common.enums.CacheNameEnum;
|
|
|
import com.yonge.cooleshow.common.enums.RewardTypeEnum;
|
|
|
import com.yonge.cooleshow.common.enums.UnitEnum;
|
|
|
import com.yonge.toolset.base.exception.BizException;
|
|
|
+import com.yonge.toolset.base.util.StringUtil;
|
|
|
import com.yonge.toolset.payment.util.DistributedLock;
|
|
|
+import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
|
|
|
+import org.redisson.RedissonMultiLock;
|
|
|
+import org.redisson.api.RLock;
|
|
|
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.ActivityReward;
|
|
|
import com.yonge.cooleshow.biz.dal.vo.ActivityRewardVo;
|
|
|
import com.yonge.cooleshow.biz.dal.dto.search.ActivityRewardSearch;
|
|
|
import com.yonge.cooleshow.biz.dal.dao.ActivityRewardDao;
|
|
|
-import com.yonge.cooleshow.biz.dal.service.ActivityRewardService;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
-import java.util.List;
|
|
|
+import java.util.*;
|
|
|
+import java.util.concurrent.locks.Lock;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
@Service
|
|
@@ -44,6 +54,23 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
|
|
|
@Autowired
|
|
|
private RedissonClient redissonClient;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private ActivityPlanService activityPlanService;
|
|
|
+ @Autowired
|
|
|
+ private SysUserFeignService sysUserFeignService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private SysMessageService sysMessageService;
|
|
|
+ @Autowired
|
|
|
+ private PianoRoomChangeRecordService pianoRoomChangeRecordService;
|
|
|
+
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ActivityPlanRewardService activityPlanRewardService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private MemberPriceSettingsService memberPriceSettingsService;
|
|
|
+
|
|
|
@Override
|
|
|
public ActivityRewardVo detail(Long id) {
|
|
|
return baseMapper.detail(id);
|
|
@@ -88,10 +115,7 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
|
|
|
|
|
|
@Override
|
|
|
public List<ActivityReward> getActivityReward(Long activityPlanId) {
|
|
|
- return this.lambdaQuery()
|
|
|
- .eq(ActivityReward::getActivityId, activityPlanId)
|
|
|
- .list();
|
|
|
-
|
|
|
+ return baseMapper.getActivityReward(activityPlanId);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -130,4 +154,84 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
|
|
|
public IPage<ActivityRewardChangeStockVo> selectChangeStockPage(IPage<ActivityRewardChangeStockSearch> page, ActivityRewardChangeStockSearch query) {
|
|
|
return null;
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+ private void sendReward(Long userId,Long activityId) {
|
|
|
+ ActivityPlan activityPlan = activityPlanService.getById(activityId);
|
|
|
+ if (activityPlan == null) {
|
|
|
+ log.warn("活动不存在");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ List<ActivityReward> activityRewardList = getActivityReward(activityId);
|
|
|
+ StringBuilder activityRewardName = new StringBuilder();
|
|
|
+
|
|
|
+
|
|
|
+ // 级联锁同时处理奖品库存
|
|
|
+ List<RLock> lockList = new ArrayList<>();
|
|
|
+ for (ActivityReward activityReward : activityRewardList) {
|
|
|
+ lockList.add(redissonClient.getLock(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(activityReward.getId())));
|
|
|
+ }
|
|
|
+
|
|
|
+ RedissonMultiLock lock = new RedissonMultiLock(lockList.toArray(new RLock[lockList.size()]));
|
|
|
+
|
|
|
+ try {
|
|
|
+ lock.lock();
|
|
|
+ for (ActivityReward activityReward : activityRewardList) {
|
|
|
+ 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);
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+
|
|
|
+ activityRewardName.append(activityReward.getRewardName());
|
|
|
+ }
|
|
|
+ // 发送活动获奖推送
|
|
|
+ if (!StringUtil.isEmpty(activityRewardName)) {
|
|
|
+ sendActivityMessage(userId, activityPlan.getActivityName(), activityRewardName.toString(), activityPlan.getActivityClient());
|
|
|
+ }
|
|
|
+ } finally {
|
|
|
+ if (lock.getHoldCount() >0)
|
|
|
+ lock.unlock();
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获奖人员发送
|
|
|
+ *
|
|
|
+ * @param userId 用户id
|
|
|
+ * @param activityName 活动名
|
|
|
+ * @param activityRewardName 活动奖品名
|
|
|
+ */
|
|
|
+ private void sendActivityMessage(Long userId, String activityName, String activityRewardName,ClientEnum clientType) {
|
|
|
+ SysUser user = sysUserFeignService.queryUserById(userId);
|
|
|
+ if (user == null) {
|
|
|
+ log.warn("用户未找到");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ Map<Long, String> receivers = new HashMap<>();
|
|
|
+ receivers.put(userId, user.getPhone());
|
|
|
+
|
|
|
+ sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.PRACTICE_ADJUST, receivers, null,
|
|
|
+ 0, null,clientType.getCode(), user.getUsername(), "陪练课", activityName, activityRewardName);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ log.error("获奖消息发送失败,{}",e.getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
}
|