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