| | |
| | | import com.ks.lucky.mapper.LuckyActivityMapper; |
| | | import com.ks.lucky.pojo.DO.LuckyActivity; |
| | | import com.ks.lucky.pojo.DO.LuckyActivityAwards; |
| | | import com.ks.lucky.pojo.DO.LuckyActivityJoinRecord; |
| | | import com.ks.lucky.pojo.DO.LuckyActivityOpenInfo; |
| | | import com.ks.lucky.pojo.DTO.ActivityMQMsg; |
| | | import com.ks.lucky.remote.service.LuckyActivityOpenService; |
| | |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Set; |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.util.*; |
| | | |
| | | @Service(version = "1.0.0") |
| | | public class LuckyActivityOpenServiceImpl implements LuckyActivityOpenService { |
| | |
| | | throw new LuckyActivityAwardException(LuckyActivityAwardException.CODE_NOT_EXIST, "无奖项信息"); |
| | | } |
| | | |
| | | //获取用户数据 |
| | | Map<String, Integer> data = luckyActivityJoinManager.getJoinData(activityId); |
| | | |
| | | Set<String> drawnUserSet = new HashSet<>(); |
| | | |
| | | //虚拟用户先中奖 |
| | | Map<String, Integer> data = luckyActivityJoinManager.getJoinData(activityId, LuckyActivityJoinRecord.USER_TYPE_VIRTUAL); |
| | | for (LuckyActivityAwards awards : awardsList) { |
| | | if (awards.getRealDrawnPercent().compareTo(new BigDecimal(1)) >= 0) { |
| | | //完全真实情况 |
| | | continue; |
| | | } |
| | | BigDecimal virtualRate = new BigDecimal(1).subtract(awards.getRealDrawnPercent()); |
| | | int count = virtualRate.multiply(new BigDecimal(awards.getCount())).setScale(0, RoundingMode.UP).intValue(); |
| | | Set<String> uids = LuckyRunUtil.compute(data, count); |
| | | for (String uid : uids) { |
| | | data.remove(uid); |
| | | } |
| | | drawnUserSet.addAll(uids); |
| | | //保存开奖结果 |
| | | luckyActivityAwardResultManager.addRecord(uids, awards.getActivityId(), awards.getId()); |
| | | //剩余奖品数量 |
| | | awards.setCount(awards.getCount() - count); |
| | | } |
| | | |
| | | //除去已经中奖的用户再次中奖 |
| | | data = luckyActivityJoinManager.getJoinData(activityId, null); |
| | | for (String uid : drawnUserSet) { |
| | | data.remove(uid); |
| | | } |
| | | |
| | | for (LuckyActivityAwards awards : awardsList) { |
| | | //获取中奖用户ID |
| | | Set<String> uids = LuckyRunUtil.compute(data, awards.getCount()); |
| | | //移除已经中奖了的用户 |
| | | for (String uid : uids) { |
| | | data.remove(uid); |
| | | } |
| | | //保存开奖结果 |
| | | luckyActivityAwardResultManager.addRecord(uids, awards.getActivityId(), awards.getId()); |
| | | } |
| | | |
| | | |
| | | //更新状态 |
| | | luckyActivityManager.setState(activityId,LuckyActivity.STATE_PRE_OPENED,"预开奖成功"); |
| | | luckyActivityManager.setState(activityId, LuckyActivity.STATE_PRE_OPENED, "预开奖成功"); |
| | | |
| | | //添加消息 |
| | | CMQManager.getInstance().addActivityMsg(new ActivityMQMsg(activityId, ActivityMQMsg.TYPE_OPEN_SHOW, new Date())); |
| | |
| | | throw new LuckyActivityException(1, "尚未开奖"); |
| | | } |
| | | |
| | | LuckyActivity update = new LuckyActivity(); |
| | | update.setId(activityId); |
| | | update.setUpdateTime(new Date()); |
| | | update.setState(LuckyActivity.STATE_OPENED); |
| | | update.setStateRemarks("已开奖"); |
| | | luckyActivityManager.updateSelectiveByPrimaryKey(update); |
| | | luckyActivityManager.setState(activityId, LuckyActivity.STATE_OPENED, "已开奖"); |
| | | |
| | | //设置实际开奖时间 |
| | | LuckyActivityOpenInfo openInfo = luckyActivityOpenInfoManager.getOpenInfo(activityId); |