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.*;
|
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.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.0")
|
public class LuckyActivityJoinServiceImpl implements LuckyActivityJoinService {
|
|
@Resource
|
private LuckyActivityJoinManager luckyActivityJoinManager;
|
|
@Resource
|
private LuckyActivityManager luckyActivityManager;
|
|
@Resource
|
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, Long appId, String uid, Integer weight, JoinInfo joinInfo) throws LuckyActivityException, LuckyActivityJoinException {
|
luckyActivityManager.canJoin(activityId);
|
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);
|
record.setCreateTime(new Date());
|
record.setJoinInfo(joinInfo.toString());
|
record.setUid(uid);
|
record.setUserType(LuckyActivityJoinRecord.USER_TYPE_REAL);
|
record.setWeight(weight);
|
record.setCreateTime(new Date());
|
luckyActivityJoinRecordMapper.insertSelective(record);
|
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, 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;
|
}
|
|
}
|