From 8ac93bd9b45e3d25783798e1fe8cfc26bedd57d2 Mon Sep 17 00:00:00 2001 From: admin <weikou2014> Date: 星期六, 05 十二月 2020 17:17:48 +0800 Subject: [PATCH] 完善天天抽奖 --- service-lucky/src/main/java/com/ks/lucky/service/impl/remote/LuckyActivityJoinServiceImpl.java | 223 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 217 insertions(+), 6 deletions(-) diff --git a/service-lucky/src/main/java/com/ks/lucky/service/impl/remote/LuckyActivityJoinServiceImpl.java b/service-lucky/src/main/java/com/ks/lucky/service/impl/remote/LuckyActivityJoinServiceImpl.java index 7613fbd..ef28222 100644 --- a/service-lucky/src/main/java/com/ks/lucky/service/impl/remote/LuckyActivityJoinServiceImpl.java +++ b/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.LuckyActivity; +import com.ks.lucky.pojo.DO.LuckyActivityAwards; import com.ks.lucky.pojo.DO.LuckyActivityJoinRecord; -import com.ks.lucky.pojo.DTO.JoinInfo; +import com.ks.lucky.pojo.DO.LuckyActivityUserWeightRecord; +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.service.impl.LuckyActivityJoinManager; import com.ks.lucky.service.impl.LuckyActivityManager; +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") public class LuckyActivityJoinServiceImpl implements LuckyActivityJoinService { @@ -26,18 +40,20 @@ private LuckyActivityManager luckyActivityManager; @Resource - private AppManager appManager; + private LuckyActivityUserWeightRecordManager luckyActivityUserWeightRecordManager; @Resource private LuckyActivityJoinRecordMapper luckyActivityJoinRecordMapper; + + @Resource + private LuckyActivityAwardsMapper luckyActivityAwardsMapper; @Transactional(rollbackFor = Exception.class) @Validated @Override - public void join(Long activityId, String appKey, String uid, Integer weight, 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, "宸茬粡鍙傚姞"); @@ -58,12 +74,207 @@ 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, 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 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; + //濂栭」鏁伴噺 + int awardCount = 0; + List<LuckyActivityAwards> awards = luckyActivityAwardsMapper.list(awardQuery); + if (awards != null && awards.size() > 0) { + for (LuckyActivityAwards award : awards) { + awardCount += award.getCount(); + } + + } + //骞冲潎涓姒傜巼 + 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), 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; + } + } -- Gitblit v1.8.0