From 4ce354caa5a6d073c879671baca870d716873391 Mon Sep 17 00:00:00 2001 From: xuexinpeng Date: Fri, 25 Feb 2022 11:52:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=88=98=E5=8A=9B=E5=86=B2=E5=88=BA=E6=8E=92?= =?UTF-8?q?=E8=A1=8C=E6=A6=9C=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../logic/activity/PowerRiceActivity.java | 24 +++- .../logic/rank/rankImpl/AbstractRank.java | 2 +- .../logic/rank/rankImpl/PowerRiceRank.java | 107 +++++++++++++++++- .../java/config/SActivityRankingReward.java | 6 +- 4 files changed, 128 insertions(+), 11 deletions(-) diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/PowerRiceActivity.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/PowerRiceActivity.java index 19bf1d600..fa870e890 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/PowerRiceActivity.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/PowerRiceActivity.java @@ -12,6 +12,7 @@ import com.ljsd.jieling.logic.mail.MailLogic; import com.ljsd.jieling.logic.rank.RankContext; import com.ljsd.jieling.logic.rank.RankEnum; import com.ljsd.jieling.logic.rank.rankImpl.AbstractRank; +import com.ljsd.jieling.logic.rank.rankImpl.PowerRiceRank; import com.ljsd.jieling.network.session.ISession; import config.SActivityRankingReward; import config.SActivityRewardConfig; @@ -20,6 +21,7 @@ import org.springframework.data.redis.core.ZSetOperations; import util.StringUtil; import util.TimeUtils; import java.util.List; +import java.util.Map; import java.util.Set; public class PowerRiceActivity extends AbstractActivity{ @@ -71,13 +73,23 @@ public class PowerRiceActivity extends AbstractActivity{ @Override public void onActivityPreEnd() throws Exception { - AbstractRank powerRank = RankContext.getRankEnum(RankEnum.POWER_RICE_RANK.getType()); - Set> rankInfos = powerRank.getRankByKey("", 0,-1); - List sActivityRankingReward = SActivityRankingReward.getsActivityRankingRewardMapByActivityId(id); if(sActivityRankingReward == null || sActivityRankingReward.size() ==0 ){ return; } + Map powerRankMap = PowerRiceRank.getSpecailRank(); + for(Map.Entry keval:powerRankMap.entrySet()){ + final int rankIndex = keval.getKey(); + String title = SErrorCodeEerverConfig.getI18NMessage("battlecapacityrank_mail_title"); + String content = SErrorCodeEerverConfig.getFormatMessage("battlecapacityrank_mail_txt", new Object[]{rankIndex}); + SActivityRankingReward activityReward =sActivityRankingReward.stream().filter(n->rankIndex>=n.getMinRank() && rankIndex>=n.getMaxRank()).findFirst().orElse(null); + if(activityReward == null){ + continue; + } + MailLogic.getInstance().sendMail(keval.getValue(), title, content, StringUtil.parseArrayToString(activityReward.getRankingReward()), TimeUtils.nowInt(), Global.MAIL_EFFECTIVE_TIME); + } + /* AbstractRank powerRank = RankContext.getRankEnum(RankEnum.POWER_RICE_RANK.getType()); + Set> rankInfos = powerRank.getRankByKey("", 0,-1); int index = 1; for(ZSetOperations.TypedTuple rankInfo:rankInfos){ String title = SErrorCodeEerverConfig.getI18NMessage("battlecapacityrank_mail_title"); @@ -89,9 +101,13 @@ public class PowerRiceActivity extends AbstractActivity{ } MailLogic.getInstance().sendMail(Integer.parseInt(rankInfo.getValue()), title, content, StringUtil.parseArrayToString(activityReward.getRankingReward()), TimeUtils.nowInt(), Global.MAIL_EFFECTIVE_TIME); index++; - } + }*/ GlobalSystemControl globalSystemControl = GlobalSystemControl.getGlobalSystemControl(); globalSystemControl.addActivityPreEnd(id,TimeUtils.now()); GlobalSystemControl.save(globalSystemControl); } + public List getRankReward() throws Exception{ + List sActivityRankingReward = SActivityRankingReward.getsActivityRankingRewardMapByActivityId(id); + return sActivityRankingReward; + } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/rankImpl/AbstractRank.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/rankImpl/AbstractRank.java index 1c1eb8e2b..fcfbf4716 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/rankImpl/AbstractRank.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/rankImpl/AbstractRank.java @@ -195,7 +195,7 @@ public abstract class AbstractRank implements IRank { return builder; } - private PlayerInfoProto.RankResponse.Builder getAllUserResponse(Set> zsetreverseRangeWithScores, int start){ + public PlayerInfoProto.RankResponse.Builder getAllUserResponse(Set> zsetreverseRangeWithScores, int start){ PlayerInfoProto.RankResponse.Builder builder = PlayerInfoProto.RankResponse.newBuilder(); forEach(start,zsetreverseRangeWithScores,(index,data)->{ try { diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/rankImpl/PowerRiceRank.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/rankImpl/PowerRiceRank.java index 36f1ce5d2..14729cd3d 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/rankImpl/PowerRiceRank.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/rankImpl/PowerRiceRank.java @@ -1,20 +1,26 @@ package com.ljsd.jieling.logic.rank.rankImpl; -import com.ljsd.jieling.logic.activity.ActivityLogic; -import com.ljsd.jieling.logic.activity.ActivityType; -import com.ljsd.jieling.logic.activity.IEventHandler; +import com.ljsd.jieling.db.redis.RedisUtil; +import com.ljsd.jieling.exception.ErrorCode; +import com.ljsd.jieling.exception.ErrorCodeException; +import com.ljsd.jieling.logic.activity.*; import com.ljsd.jieling.logic.activity.event.IEvent; import com.ljsd.jieling.logic.activity.event.Poster; import com.ljsd.jieling.logic.activity.event.UserMainTeamForceEvent; import com.ljsd.jieling.logic.dao.UserManager; import com.ljsd.jieling.logic.dao.root.User; import com.ljsd.jieling.logic.hero.HeroLogic; +import com.ljsd.jieling.logic.rank.RankEnum; +import config.SActivityRankingReward; import config.SGlobalActivity; +import org.springframework.data.redis.core.ZSetOperations; +import rpc.protocols.PlayerInfoProto; import util.TimeUtils; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.function.BiConsumer; +import java.util.stream.Collectors; public class PowerRiceRank extends AbstractRank implements IEventHandler { @@ -70,4 +76,95 @@ public class PowerRiceRank extends AbstractRank implements IEventHandler { } } } + + + @Override + public PlayerInfoProto.RankResponse.Builder getAllUserResponse(Set> zsetreverseRangeWithScores, int start){ + PlayerInfoProto.RankResponse.Builder builder = PlayerInfoProto.RankResponse.newBuilder(); + forEach(start,zsetreverseRangeWithScores,(index,data)->{ + try { + getOptional(index,data,builder); + } catch (Exception e) { + e.printStackTrace(); + } + }); + return builder; + + } + protected static void forEach(int startIndex,Iterable elements, BiConsumer action) { + Objects.requireNonNull(elements); + Objects.requireNonNull(action); + try { + Map mapSpecailRank = getSpecailRank(); + for (T element : elements) { + int rank =0; + for(Map.Entry keyVal :mapSpecailRank.entrySet()){ + int key = keyVal.getKey(); + if(((ZSetOperations.TypedTuple)element).getValue().equals(String.valueOf(keyVal.getValue()))){ + rank = key; + break; + } + } + //int rank = mapSpecailRank.entrySet().stream().filter(entry -> ((ZSetOperations.TypedTuple)element).getValue().equals(entry.getValue())).map(Map.Entry::getKey).findFirst().orElse(null); + action.accept(rank, element);} + }catch (Exception e){ + e.printStackTrace(); + } + } + + + //map<名次,uid> + public static Map getSpecailRank() throws Exception { + Set> zsetreverseRangeWithScores = RedisUtil.getInstence().getZsetreverseRangeWithScores(RankEnum.POWER_RICE_RANK.getRedisKey(), "", 0, -1); + Map newMap = new HashMap<>(); + AbstractActivity activityType = ActivityTypeEnum.getActicityType(9701); + if(!(activityType instanceof PowerRiceActivity)){ + throw new ErrorCodeException(ErrorCode.ACTIVITY_NOT_OPEN); + } + List sActivityRankingReward = ((PowerRiceActivity)activityType).getRankReward(); + int ranIndex =0; + SActivityRankingReward activityReward =sActivityRankingReward.stream().filter(n->n.getRankLimit()== null).sorted(Comparator.comparing(SActivityRankingReward::getId)).findFirst().orElse(null); + if(activityReward != null){ + ranIndex = activityReward.getMinRank(); + }else{ + ranIndex = 4; + } + for(ZSetOperations.TypedTuple operation :zsetreverseRangeWithScores){ + boolean isRank = false; + for(SActivityRankingReward config:sActivityRankingReward.stream().filter(n->n.getRankLimit()!= null).collect(Collectors.toList())){ + if(config.getRankLimit()!=null && config.getRankLimit().length>0){ + if(operation.getScore()>= config.getRankLimit()[0] && operation.getScore()<= config.getRankLimit()[1]){ + //if(operation.getScore()>= 4000 && operation.getScore()<= 1500000){ + for(int i= config.getMinRank();i<=config.getMaxRank();i++){ + /*if(!newList.contains(i)){ + newList.add(i,Integer.parseInt(operation.getValue())); + isRank = true; + break;//结束此次排序 + }*/ + if(!newMap.containsKey(i)){ + newMap.put(i,Integer.parseInt(operation.getValue())); + isRank = true; + break;//结束此次排序 + } + } + }else{ + } + } + if(isRank){ + break; + } + } + if(!isRank){ + if(!newMap.containsKey(ranIndex)){ + newMap.put(ranIndex,Integer.parseInt(operation.getValue())); + }else{ + //https://blog.csdn.net/long243416336/article/details/84876476 + int currentMaxRank = newMap.keySet().stream().min(Integer::min).get(); + newMap.put(++currentMaxRank,Integer.parseInt(operation.getValue())); + } + } + //newList.add(Integer.parseInt(operation.getValue())); + } + return newMap; + } } diff --git a/tablemanager/src/main/java/config/SActivityRankingReward.java b/tablemanager/src/main/java/config/SActivityRankingReward.java index 5dc4922c2..5b31f9ada 100644 --- a/tablemanager/src/main/java/config/SActivityRankingReward.java +++ b/tablemanager/src/main/java/config/SActivityRankingReward.java @@ -21,6 +21,8 @@ public class SActivityRankingReward implements BaseConfig { private int[][] rankingReward; + private int[] rankLimit; + private static Map sActivityRankingRewardMap; private static Map> sActivityRankingRewardMapByActivityId; @@ -67,5 +69,7 @@ public class SActivityRankingReward implements BaseConfig { return rankingReward; } - + public int[] getRankLimit() { + return rankLimit; + } } \ No newline at end of file