admin
2020-12-22 478e6722fd36bf9b5d8608c8cca2000190da5496
service-lucky/src/main/java/com/ks/lucky/service/impl/remote/LuckyActivityJoinServiceImpl.java
@@ -1,20 +1,34 @@
package com.ks.lucky.service.impl.remote;
import com.ks.lib.common.exception.ParamsException;
import com.ks.lucky.exception.LuckyActivityException;
import com.ks.lucky.exception.LuckyActivityJoinException;
import com.ks.lucky.mapper.LuckyActivityAwardsMapper;
import com.ks.lucky.mapper.LuckyActivityJoinRecordMapper;
import com.ks.lucky.pojo.DO.LuckyActivityJoinRecord;
import com.ks.lucky.pojo.DTO.JoinInfo;
import com.ks.lucky.pojo.DO.*;
import com.ks.lucky.pojo.DTO.*;
import com.ks.lucky.query.ActivityAwardQuery;
import com.ks.lucky.query.ActivityJoinRecordQuery;
import com.ks.lucky.remote.service.LuckyActivityJoinService;
import com.ks.lucky.service.impl.AppManager;
import com.ks.lucky.remote.service.LuckyActivityOpenService;
import com.ks.lucky.service.impl.LuckyActivityJoinManager;
import com.ks.lucky.service.impl.LuckyActivityManager;
import com.ks.lucky.service.impl.LuckyActivityOpenInfoManager;
import com.ks.lucky.service.impl.LuckyActivityUserWeightRecordManager;
import com.ks.lucky.util.factory.LuckyActivityUserWeightRecordFactory;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import org.yeshi.utils.StringUtil;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
@Service(version = "1.0")
@Service(version = "1.0.0")
public class LuckyActivityJoinServiceImpl implements LuckyActivityJoinService {
    @Resource
@@ -24,20 +38,33 @@
    private LuckyActivityManager luckyActivityManager;
    @Resource
    private AppManager appManager;
    private LuckyActivityUserWeightRecordManager luckyActivityUserWeightRecordManager;
    @Resource
    private LuckyActivityJoinRecordMapper luckyActivityJoinRecordMapper;
    @Resource
    private LuckyActivityAwardsMapper luckyActivityAwardsMapper;
    @Resource
    private LuckyActivityOpenInfoManager luckyActivityOpenInfoManager;
    @Transactional(rollbackFor = Exception.class)
    @Validated
    @Override
    public void join(Long activityId, String appKey, String uid, JoinInfo joinInfo) throws LuckyActivityException, LuckyActivityJoinException {
    public void join(Long activityId, Long appId, String uid, Integer weight, JoinInfo joinInfo) throws LuckyActivityException, LuckyActivityJoinException {
        luckyActivityManager.canJoin(activityId);
        Long appId = appManager.getAppId(appKey);
        LuckyActivityJoinRecord record = luckyActivityJoinManager.getRecord(activityId, appId, uid);
        if (record != null) {
            throw new LuckyActivityJoinException(1, "已经参加");
        }
        if (weight == null) {
            weight = 1;
        }
        record = new LuckyActivityJoinRecord();
        record.setActivityId(activityId);
        record.setAppId(appId);
@@ -45,16 +72,225 @@
        record.setJoinInfo(joinInfo.toString());
        record.setUid(uid);
        record.setUserType(LuckyActivityJoinRecord.USER_TYPE_REAL);
        record.setWeight(1);
        record.setWeight(weight);
        record.setCreateTime(new Date());
        luckyActivityJoinRecordMapper.insertSelective(record);
        luckyActivityManager.addJoinCount(activityId, record.getWeight());
        luckyActivityManager.addJoinCount(activityId, 1);
        LuckyActivityUserWeightRecord weightRecord = LuckyActivityUserWeightRecordFactory.createJoin(activityId, appId, uid, weight);
        try {
            luckyActivityUserWeightRecordManager.addRecord(weightRecord);
        } catch (ParamsException e) {
            throw new LuckyActivityJoinException(1, "添加记录出错");
        }
    }
    @Override
    public LuckyActivityJoinRecord getJoinInfo(Long activityId, String appKey, String uid) {
        Long appId = appManager.getAppId(appKey);
    public LuckyActivityJoinRecord getJoinInfo(Long activityId, Long appId, String uid) {
        LuckyActivityJoinRecord record = luckyActivityJoinManager.getRecord(activityId, appId, uid);
        return record;
    }
    @Override
    public LuckyActivityJoinRecord getJoinRecord(Long id) {
        return luckyActivityJoinRecordMapper.selectByPrimaryKey(id);
    }
    @Override
    public List<Long> getUnOpenActivityIdList(Long appId, String uid, int page, int pageSize) {
        ActivityJoinRecordQuery query = new ActivityJoinRecordQuery();
        query.appId = appId;
        query.uid = uid;
        query.drawStateList = Arrays.asList(new Integer[]{LuckyActivityJoinRecord.DRAW_STATE_UNOPEN});
        query.start = (page - 1) * pageSize;
        query.count = pageSize;
        return drawActivityId(luckyActivityJoinRecordMapper.listWithActivityState(query, null));
    }
    @Override
    public long countUnOpenActivityIdList(Long appId, String uid) {
        ActivityJoinRecordQuery query = new ActivityJoinRecordQuery();
        query.appId = appId;
        query.uid = uid;
        query.drawStateList = Arrays.asList(new Integer[]{LuckyActivityJoinRecord.DRAW_STATE_UNOPEN});
        return luckyActivityJoinRecordMapper.countWithActivityState(query, null);
    }
    /**
     * 提取活动ID
     *
     * @param list
     * @return
     */
    private List<Long> drawActivityId(List<LuckyActivityJoinRecord> list) {
        List<Long> activityList = new ArrayList<>();
        if (list != null) {
            for (LuckyActivityJoinRecord record : list) {
                activityList.add(record.getActivityId());
            }
        }
        return activityList;
    }
    @Override
    public List<Long> getUnDrawnActivityIdList(Long appId, String uid, int page, int pageSize) {
        ActivityJoinRecordQuery query = new ActivityJoinRecordQuery();
        query.appId = appId;
        query.uid = uid;
        query.drawStateList = Arrays.asList(new Integer[]{LuckyActivityJoinRecord.DRAW_STATE_NOT_DRAWN});
        query.start = (page - 1) * pageSize;
        query.count = pageSize;
        List<LuckyActivityJoinRecord> list = luckyActivityJoinRecordMapper.listWithActivityState(query, Arrays.asList(new Integer[]{LuckyActivity.STATE_OPENED}));
        return drawActivityId(list);
    }
    @Override
    public long countUnDrawnActivityIdList(Long appId, String uid) {
        ActivityJoinRecordQuery query = new ActivityJoinRecordQuery();
        query.appId = appId;
        query.uid = uid;
        query.drawStateList = Arrays.asList(new Integer[]{LuckyActivityJoinRecord.DRAW_STATE_NOT_DRAWN});
        return luckyActivityJoinRecordMapper.countWithActivityState(query, Arrays.asList(new Integer[]{LuckyActivity.STATE_OPENED}));
    }
    @Override
    public List<ActivitySimpleUser> getRecentJoinerList(Long activityId, int count) {
        ActivityJoinRecordQuery query = new ActivityJoinRecordQuery();
        query.activityId = activityId;
        query.sortList = Arrays.asList(new String[]{"id desc"});
        query.count = count;
        List<LuckyActivityJoinRecord> recordList = luckyActivityJoinRecordMapper.list(query);
        List<ActivitySimpleUser> list = new ArrayList<>();
        if (recordList != null) {
            for (LuckyActivityJoinRecord record : recordList) {
                list.add(new ActivitySimpleUser(activityId, record.getUid(), record.getAppId()));
            }
        }
        return list;
    }
    @Override
    public List<ActivitySimpleUser> getRecentJoinerList(List<Long> activityIdList, int count) {
        List<ActivitySimpleUser> list = new ArrayList<>();
        if (activityIdList != null) {
            for (Long activityId : activityIdList) {
                list.addAll(getRecentJoinerList(activityId, count));
            }
        }
        return list;
    }
    @Override
    public List<ActivitySimpleUser> getJoinerList(Long activityId, int page, int count) {
        ActivityJoinRecordQuery query = new ActivityJoinRecordQuery();
        query.activityId = activityId;
        query.sortList = Arrays.asList(new String[]{"id asc"});
        query.count = count;
        query.start = (page - 1) * count;
        List<LuckyActivityJoinRecord> recordList = luckyActivityJoinRecordMapper.list(query);
        List<ActivitySimpleUser> list = new ArrayList<>();
        if (recordList != null) {
            for (LuckyActivityJoinRecord record : recordList) {
                list.add(new ActivitySimpleUser(activityId, record.getUid(), record.getAppId()));
            }
        }
        return list;
    }
    @Override
    public ActivityJoinStatisticInfo getActivityJoinerStatisticInfo(Long activityId, Long appId, String uid) {
        ActivityJoinStatisticInfo info = new ActivityJoinStatisticInfo();
        ActivityJoinRecordQuery query = new ActivityJoinRecordQuery();
        query.activityId = activityId;
        long count = luckyActivityJoinRecordMapper.count(query);
        info.setTotalJoiner((int) count);
        info.setActivityId(activityId);
        if (!StringUtil.isNullOrEmpty(uid)) {
            int position = luckyActivityJoinRecordMapper.getJoinerPosition(activityId, appId, uid);
            info.setMyPosition(position + 1);
        }
        return info;
    }
    @Override
    public ActivityDrawnProbabilityStatistic getActivityDrawnProbabilityStatistic(Long activityId, Long appId, String uid) {
        Long weight = luckyActivityJoinRecordMapper.sumWeight(activityId);
        if (weight == null) {
            weight = 1L;
        }
        ActivityJoinRecordQuery query = new ActivityJoinRecordQuery();
        query.activityId = activityId;
        long joinerCount = luckyActivityJoinRecordMapper.count(query);
        ActivityDrawnProbabilityStatistic statistic = new ActivityDrawnProbabilityStatistic();
        ActivityAwardQuery awardQuery = new ActivityAwardQuery();
        awardQuery.activityId = activityId;
        awardQuery.count = 100;
        //奖项数量
        int awardCount = 0;
        List<LuckyActivityAwards> awards = luckyActivityAwardsMapper.list(awardQuery);
        if (awards != null && awards.size() > 0) {
            for (LuckyActivityAwards award : awards) {
                awardCount += award.getCount();
            }
        }
        LuckyActivityOpenInfo openInfo = luckyActivityOpenInfoManager.getOpenInfo(activityId);
        //还差多少人开奖
        int difJoinnerCount = openInfo.getMinPersonCount() - (int) joinerCount;
        difJoinnerCount = difJoinnerCount > 0 ? difJoinnerCount : 0;
        joinerCount = joinerCount < openInfo.getMinPersonCount() ? (openInfo.getMinPersonCount()) : joinerCount;
        //平均中奖概率
        BigDecimal averageProbability = new BigDecimal(awardCount).divide(new BigDecimal(joinerCount), 8, BigDecimal.ROUND_DOWN);
        statistic.setAverageDrawnProbability(averageProbability);
        if (!StringUtil.isNullOrEmpty(uid)) {
            query.appId = appId;
            query.uid = uid;
            LuckyActivityJoinRecord record = luckyActivityJoinManager.getRecord(activityId, appId, uid);
            if (record != null) {
                //我的中奖概率
                BigDecimal myProbability = new BigDecimal(awardCount * record.getWeight()).divide(new BigDecimal(weight).add(new BigDecimal(difJoinnerCount)), 8, BigDecimal.ROUND_DOWN);
                statistic.setMyDrawnProbability(myProbability);
            }
        }
        statistic.setActivityId(activityId);
        return statistic;
    }
    @Override
    public List<ActivityJoinerRankInfo> getWeightRankList(Long activityId, int page, int pageSize) {
        return luckyActivityJoinRecordMapper.listWeightRank(activityId, (page - 1) * pageSize, pageSize);
    }
    @Override
    public long countWeightRank(Long activityId) {
        return luckyActivityJoinRecordMapper.countWeightRank(activityId);
    }
    @Override
    public ActivityJoinerRankInfo getMyWeightRank(Long activityId, Long appId, String uid) {
        LuckyActivityJoinRecord record = luckyActivityJoinManager.getRecord(activityId, appId, uid);
        if (record == null) {
            return null;
        }
        int rank = luckyActivityJoinRecordMapper.getWeightRankWithRecord(record);
        ActivityJoinerRankInfo rankInfo = new ActivityJoinerRankInfo();
        rankInfo.setAppId(record.getAppId());
        rankInfo.setRank(rank);
        rankInfo.setUid(record.getUid());
        rankInfo.setWeight(record.getWeight());
        return rankInfo;
    }
}