| | |
| | | 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.pojo.DTO.mq.ActivityJoinMsgDTO; |
| | | 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.LoggerUtil; |
| | | import com.ks.lucky.util.factory.LuckyActivityUserWeightRecordFactory; |
| | | import com.ks.lucky.util.mq.CMQManager; |
| | | 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 |
| | |
| | | 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, int userType) 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); |
| | | record.setCreateTime(new Date()); |
| | | record.setJoinInfo(joinInfo.toString()); |
| | | record.setUid(uid); |
| | | record.setUserType(LuckyActivityJoinRecord.USER_TYPE_REAL); |
| | | record.setWeight(1); |
| | | record.setUserType(userType); |
| | | 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, "添加记录出错"); |
| | | } |
| | | |
| | | LoggerUtil.activityJoinLogger.info("参加活动成功:activityId-{} uid-{}", activityId, uid); |
| | | |
| | | CMQManager.getInstance().publishActivityJoinMsg(ActivityJoinMsgDTO.create(record)); |
| | | } |
| | | |
| | | @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, Integer userType, int page, int count) { |
| | | ActivityJoinRecordQuery query = new ActivityJoinRecordQuery(); |
| | | query.activityId = activityId; |
| | | query.sortList = Arrays.asList(new String[]{"id asc"}); |
| | | query.userType = userType; |
| | | 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 long countJoiner(Long activityId, Integer userType) { |
| | | ActivityJoinRecordQuery query = new ActivityJoinRecordQuery(); |
| | | query.activityId = activityId; |
| | | query.userType = userType; |
| | | return luckyActivityJoinRecordMapper.count(query); |
| | | } |
| | | |
| | | @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; |
| | | |
| | | long joinerCountCompute = joinerCount < openInfo.getMinPersonCount() ? (openInfo.getMinPersonCount()) : joinerCount; |
| | | |
| | | //平均中奖概率 |
| | | BigDecimal averageProbability = new BigDecimal(awardCount).divide(new BigDecimal(joinerCountCompute), 8, BigDecimal.ROUND_DOWN); |
| | | statistic.setAverageDrawnProbability(averageProbability); |
| | | LuckyActivityJoinRecord record=null; |
| | | if (!StringUtil.isNullOrEmpty(uid)) { |
| | | query.appId = appId; |
| | | query.uid = uid; |
| | | 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); |
| | | } |
| | | } |
| | | //超过了多少人 |
| | | query = new ActivityJoinRecordQuery(); |
| | | query.activityId = activityId; |
| | | query.maxWeight=record.getWeight(); |
| | | long lessCount = luckyActivityJoinRecordMapper.count(query); |
| | | statistic.setExceedPersonPercent(new BigDecimal(lessCount).multiply(new BigDecimal(100).divide(new BigDecimal(joinerCount), 2, BigDecimal.ROUND_DOWN))); |
| | | |
| | | 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; |
| | | } |
| | | |
| | | } |