admin
2021-02-06 6c09cbd70388ae53ec593de253f69cfa1a3eeda7
service-lucky/src/main/java/com/ks/lucky/service/impl/remote/LuckyActivityOpenServiceImpl.java
@@ -4,6 +4,7 @@
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;
@@ -14,10 +15,9 @@
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 {
@@ -105,11 +105,42 @@
            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());
        }
@@ -130,12 +161,7 @@
            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);