From 1e7cc6dea29cb6588de89f725bd57df78276c140 Mon Sep 17 00:00:00 2001 From: duhui Date: Thu, 14 Oct 2021 11:12:23 +0800 Subject: [PATCH 01/11] =?UTF-8?q?=E5=BE=A1=E5=89=91=E9=A3=9E=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gamecommon/src/main/java/util/TimeUtils.java | 10 +- .../main/java/com/ljsd/GameApplication.java | 4 + .../core/function/CarDelayFunction.java | 2 +- .../com/ljsd/jieling/db/redis/RedisKey.java | 6 + .../com/ljsd/jieling/db/redis/RedisUtil.java | 8 +- .../com/ljsd/jieling/exception/ErrorCode.java | 1 + .../com/ljsd/jieling/globals/BIReason.java | 2 + .../RidingSwardActivityHandler.java | 28 + .../ridingsward/RidingSwardBetHandler.java | 27 + .../ridingsward/RidingSwardInfoHandler.java | 29 + .../ridingsward/RidingSwardRewardHandler.java | 27 + .../jieling/logic/GlobalDataManaager.java | 3 + .../ljsd/jieling/logic/GlobleSystemLogic.java | 71 ++- .../jieling/logic/activity/ActivityType.java | 1 + .../logic/activity/ActivityTypeEnum.java | 1 + .../ljsd/jieling/logic/dao/PlayerManager.java | 12 + .../jieling/logic/help/HelpHeroLogic.java | 11 +- .../logic/ridingSward/RidingSwardLogic.java | 544 ++++++++++++++++++ .../logic/ridingSward/RidingSwardRecord.java | 84 +++ .../ljsd/jieling/thread/task/MinuteTask.java | 44 +- .../java/com/ljsd/jieling/util/TaskKit.java | 189 ++++++ .../main/java/config/SRidingSwardConfig.java | 67 +++ .../main/java/config/SRidingSwardResult.java | 34 ++ 23 files changed, 1132 insertions(+), 73 deletions(-) create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/handler/ridingsward/RidingSwardActivityHandler.java create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/handler/ridingsward/RidingSwardBetHandler.java create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/handler/ridingsward/RidingSwardInfoHandler.java create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/handler/ridingsward/RidingSwardRewardHandler.java create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardLogic.java create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardRecord.java create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/util/TaskKit.java create mode 100644 tablemanager/src/main/java/config/SRidingSwardConfig.java create mode 100644 tablemanager/src/main/java/config/SRidingSwardResult.java diff --git a/gamecommon/src/main/java/util/TimeUtils.java b/gamecommon/src/main/java/util/TimeUtils.java index 9657185bc..8854399a6 100644 --- a/gamecommon/src/main/java/util/TimeUtils.java +++ b/gamecommon/src/main/java/util/TimeUtils.java @@ -302,6 +302,11 @@ public class TimeUtils { return new SimpleDateFormat(ymdhms_Format_new).format(new Date(time)); } + public static Date dateFormat(String time) throws ParseException { + DateFormat format1 = new SimpleDateFormat(ymdhms_Format_new); + return format1.parse(time); + } + // /** // * 是否是同一天 // * @@ -725,7 +730,7 @@ public class TimeUtils { } /** - * 获取几天后的当前时间点 + * 获取明天零点 * @return */ public static long getTomorrowZero() { @@ -738,7 +743,7 @@ public class TimeUtils { } /** - * 获取几天后的当前时间点 + * 获取明天零点 * @return */ public static long getTomorrowZero2() { @@ -842,7 +847,6 @@ public class TimeUtils { /** * 获得当前周星期几的0点时间 - * @param now * @param targetWeekday * @return */ diff --git a/serverlogic/src/main/java/com/ljsd/GameApplication.java b/serverlogic/src/main/java/com/ljsd/GameApplication.java index ab99e8a12..f5c2a8c7a 100644 --- a/serverlogic/src/main/java/com/ljsd/GameApplication.java +++ b/serverlogic/src/main/java/com/ljsd/GameApplication.java @@ -5,6 +5,7 @@ import com.ljsd.jieling.config.json.ServerProperties; import com.ljsd.jieling.db.mongo.MongoUtil; import com.ljsd.jieling.db.redis.RedisKey; import com.ljsd.jieling.db.redis.RedisUtil; +import com.ljsd.jieling.hotfix.HotfixUtil; import com.ljsd.jieling.logic.dao.ServerConfig; import com.ljsd.jieling.logic.family.CrossDeathPathLogic; import com.ljsd.jieling.logic.rank.CrossRankManager; @@ -63,6 +64,9 @@ public class GameApplication { SkyEyeService.getInstance().onStart(); CrossDeathPathLogic.getInstance().serverInit(); CrossRankManager.getInstance().guildCacheHandle(); + HotfixUtil.getInstance(); + // 开启定时任务 +// TaskKit.reset(); //控制台gm Scanner sc = new Scanner(System.in); while(sc.hasNext()) diff --git a/serverlogic/src/main/java/com/ljsd/jieling/core/function/CarDelayFunction.java b/serverlogic/src/main/java/com/ljsd/jieling/core/function/CarDelayFunction.java index e4d28e185..c3fe12ff0 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/core/function/CarDelayFunction.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/core/function/CarDelayFunction.java @@ -38,7 +38,7 @@ public class CarDelayFunction implements FunctionManager { } }); MongoUtil.getLjsdMongoTemplate().lastUpdate(); - RedisUtil.getInstence().rename(delKeys.toArray(new String[0])); + RedisUtil.getInstence().rename(60*60*24-60,delKeys.toArray(new String[0])); // RedisUtil.getInstence().del(delKeys.toArray(new String[0])); } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisKey.java b/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisKey.java index 045d0b198..da492a65c 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisKey.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisKey.java @@ -396,6 +396,12 @@ public class RedisKey { * 网页支付特殊处理用 */ public static final String WEB_PAY = "WEB_PAY"; + // 御剑飞行排行 + public static final String RIDING_SWARD_RANK = "RIDING_SWARD_RANK"; + // 御剑飞行记录 + public static final String RIDING_SWARD_RECORD = "RIDING_SWARD_RECORD"; + // 御剑飞行时间锁 + public static final String RIDING_SWARD_TIME_LOCK = "RIDING_SWARD_TIME_LOCK"; public static Set newAreaCacChe = new HashSet<>();//进程排行 合区统一 diff --git a/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisUtil.java b/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisUtil.java index 2cc2f32e8..489ea5123 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisUtil.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisUtil.java @@ -164,22 +164,24 @@ public class RedisUtil { /** * redis重命名 + * @param time 过期时间 * @param key,数组 */ - public void rename(String... key) { + public void rename(long time, String... key) { if (key != null && key.length > 0) { for (int i = 0; i < key.length; i++) { // 旧名字 String oldName = key[i]; // 新名字 - String newName = oldName+"BACK:"+System.currentTimeMillis(); + String timeStamp2 = TimeUtils.getTimeStamp2(TimeUtils.now()); + String newName = oldName+":BACK:"+timeStamp2; // key是否存在 boolean aBoolean = hasKey(oldName); if (aBoolean){ // 重命名 redisTemplate.rename(oldName,newName); // 设置过期时间 - expire(newName,60*60*24-60); + expire(newName,time); } } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/exception/ErrorCode.java b/serverlogic/src/main/java/com/ljsd/jieling/exception/ErrorCode.java index 4d312b3bc..3c6c03926 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/exception/ErrorCode.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/exception/ErrorCode.java @@ -173,6 +173,7 @@ public enum ErrorCode implements IErrorCode { HONGMENG_ING(142,"英雄在鸿蒙阵中,操作失败"), CHAT_NOT_CROSS(143,"聊天检查,没有跨服分组"), SIXIANG_UP_LIMIT(144,"强化已达上限"), + RIDING_SWARD_BET_TWO(145,"一轮比赛最多押注两次!"), ; private static final Set CodeSet = new HashSet<>(); diff --git a/serverlogic/src/main/java/com/ljsd/jieling/globals/BIReason.java b/serverlogic/src/main/java/com/ljsd/jieling/globals/BIReason.java index d438fc66d..7177fc7ac 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/globals/BIReason.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/globals/BIReason.java @@ -357,5 +357,7 @@ public interface BIReason { int SEVEN_WORLD_TREASURE = 1214;//七界秘宝 + int RIDING_SWARD_REWARD = 1215;//御剑行领取奖励 + int RIDING_SWARD_BET = 1216;//御剑行押注消耗 } \ No newline at end of file diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/ridingsward/RidingSwardActivityHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/ridingsward/RidingSwardActivityHandler.java new file mode 100644 index 000000000..958c5c4c4 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/ridingsward/RidingSwardActivityHandler.java @@ -0,0 +1,28 @@ +package com.ljsd.jieling.handler.ridingsward; + +import com.google.protobuf.GeneratedMessage; +import com.ljsd.jieling.handler.BaseHandler; +import com.ljsd.jieling.logic.ridingSward.RidingSwardLogic; +import com.ljsd.jieling.network.session.ISession; +import org.springframework.stereotype.Component; +import rpc.protocols.ActivityProto; +import rpc.protocols.MessageTypeProto; + +/** + * @Author hj + * @Date 2021/10/11 10:30:33 + * @Description: + * @Version 1.0 + */ +@Component +public class RidingSwardActivityHandler extends BaseHandler { + @Override + public MessageTypeProto.MessageType getMessageCode() { + return MessageTypeProto.MessageType.RidingSwardActivityRequest; + } + + @Override + public void processWithProto(ISession iSession, ActivityProto.RidingSwardActivityRequest proto) throws Exception { + RidingSwardLogic.getInstance().getRidingSwardActivity(iSession.getUid(),proto); + } +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/ridingsward/RidingSwardBetHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/ridingsward/RidingSwardBetHandler.java new file mode 100644 index 000000000..5f4f8c8a9 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/ridingsward/RidingSwardBetHandler.java @@ -0,0 +1,27 @@ +package com.ljsd.jieling.handler.ridingsward; + +import com.ljsd.jieling.handler.BaseHandler; +import com.ljsd.jieling.logic.ridingSward.RidingSwardLogic; +import com.ljsd.jieling.network.session.ISession; +import org.springframework.stereotype.Component; +import rpc.protocols.ActivityProto; +import rpc.protocols.MessageTypeProto; + +/** + * @Author hj + * @Date 2021/10/12 10:50:16 + * @Description: 投注 + * @Version 1.0 + */ +@Component +public class RidingSwardBetHandler extends BaseHandler { + @Override + public MessageTypeProto.MessageType getMessageCode() { + return MessageTypeProto.MessageType.RidingSwardBetRequest; + } + + @Override + public void processWithProto(ISession iSession, ActivityProto.RidingSwardBetRequest proto) throws Exception { + RidingSwardLogic.getInstance().ridingSwardBet(iSession.getUid(),proto); + } +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/ridingsward/RidingSwardInfoHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/ridingsward/RidingSwardInfoHandler.java new file mode 100644 index 000000000..cb8daef9f --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/ridingsward/RidingSwardInfoHandler.java @@ -0,0 +1,29 @@ +package com.ljsd.jieling.handler.ridingsward; + +import com.ljsd.jieling.exception.ErrorCode; +import com.ljsd.jieling.exception.ErrorCodeException; +import com.ljsd.jieling.handler.BaseHandler; +import com.ljsd.jieling.logic.ridingSward.RidingSwardLogic; +import com.ljsd.jieling.network.session.ISession; +import org.springframework.stereotype.Component; +import rpc.protocols.ActivityProto; +import rpc.protocols.MessageTypeProto; + +/** + * @Author hj + * @Date 2021/10/11 15:55:32 + * @Description: + * @Version 1.0 + */ +@Component +public class RidingSwardInfoHandler extends BaseHandler { + @Override + public MessageTypeProto.MessageType getMessageCode() { + return MessageTypeProto.MessageType.RidingSwardInfoRequest; + } + + @Override + public void processWithProto(ISession iSession, ActivityProto.RidingSwardInfoRequest proto) throws Exception { + RidingSwardLogic.getInstance().sendRidingSwardInfo(iSession.getUid()); + } +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/ridingsward/RidingSwardRewardHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/ridingsward/RidingSwardRewardHandler.java new file mode 100644 index 000000000..0febcea20 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/ridingsward/RidingSwardRewardHandler.java @@ -0,0 +1,27 @@ +package com.ljsd.jieling.handler.ridingsward; + +import com.ljsd.jieling.handler.BaseHandler; +import com.ljsd.jieling.logic.ridingSward.RidingSwardLogic; +import com.ljsd.jieling.network.session.ISession; +import org.springframework.stereotype.Component; +import rpc.protocols.ActivityProto; +import rpc.protocols.MessageTypeProto; + +/** + * @Author hj + * @Date 2021/10/12 10:50:16 + * @Description: + * @Version 1.0 + */ +@Component +public class RidingSwardRewardHandler extends BaseHandler { + @Override + public MessageTypeProto.MessageType getMessageCode() { + return MessageTypeProto.MessageType.RidingSwardRewardRequest; + } + + @Override + public void processWithProto(ISession iSession, ActivityProto.RidingSwardRewardRequest proto) throws Exception { + RidingSwardLogic.getInstance().getRidingSwardReward(iSession.getUid(),proto); + } +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobalDataManaager.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobalDataManaager.java index f5b5bee32..64c8f28f6 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobalDataManaager.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobalDataManaager.java @@ -38,6 +38,7 @@ import com.ljsd.jieling.logic.mission.data.DataManagerDistributor; import com.ljsd.jieling.logic.mission.event.MissionEventDistributor; import com.ljsd.jieling.logic.player.PlayerLogic; import com.ljsd.jieling.logic.redpacket.WelfareRedPackSendHandler; +import com.ljsd.jieling.logic.ridingSward.RidingSwardLogic; import com.ljsd.jieling.logic.sevenworld.SevenWorldLogic; import com.ljsd.jieling.logic.store.BuyGoodsNewLogic; import com.ljsd.jieling.logic.store.StoreLogic; @@ -427,6 +428,8 @@ public class GlobalDataManaager implements IManager { HelpHeroLogic.getInstance().clearHelpInfo(user); // 七界推送 SevenWorldLogic.getInstance().sevenWorldInfoIndication(session); + // 御剑行 + RidingSwardLogic.getInstance().zeroClearRidingSwardByUser(user); // GuildChallengeLogic.getInstance().resetBossDamage(user); if(TimeUtils.isSpanTime(user.getPlayerInfoManager().getLoginTime(),TimeUtils.now(),1,0)){ diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobleSystemLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobleSystemLogic.java index 25bda1672..6d2a6a400 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobleSystemLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobleSystemLogic.java @@ -153,45 +153,44 @@ public class GlobleSystemLogic implements IEventHandler { * 2 高于50名 */ public void calCulRank() { - //开服前7天不开放跨服功能 - /*if(isOpenServer7()){ - return; - }*/ - //不参与跨服,不用计算世界等级 - if(!GameApplication.serverProperties.isArenaCross()){ - return; - } - SMServerArenaSetting setting = STableManager.getConfig(SMServerArenaSetting.class).get(1); - int rankEndLine = setting.getWorldLevLimit(); - double sum=0; - int level = 1; - //直接从库里查 - Query query = new Query(); - query.with(new Sort(Sort.Direction.DESC,"playerManager.level")); - query.fields().include("playerManager.level"); - query.limit(rankEndLine); - List users = new ArrayList<>(); try { - users = MongoUtil.getLjsdMongoTemplate().findAllByCondition(query, User.class); - } catch (Exception e) { + //开服前7天不开放跨服功能 + /*if(isOpenServer7()){ + return; + }*/ + //不参与跨服,不用计算世界等级 + if(!GameApplication.serverProperties.isArenaCross()){ + return; + } + SMServerArenaSetting setting = STableManager.getConfig(SMServerArenaSetting.class).get(1); + int rankEndLine = setting.getWorldLevLimit(); + double sum=0; + int level = 1; + //直接从库里查 + Query query = new Query(); + query.with(new Sort(Sort.Direction.DESC,"playerManager.level")); + query.fields().include("playerManager.level"); + query.limit(rankEndLine); + List users = new ArrayList<>(); + try { + users = MongoUtil.getLjsdMongoTemplate().findAllByCondition(query, User.class); + } catch (Exception e) { + e.printStackTrace(); + } + //如果达不到这些人,世界等级就为1 + if(users.size()>=rankEndLine) { + for (int j = 0; j {}",users.size(),level); + }catch (Exception e){ + LOGGER.error("计算世界等级报错,{}",e.getMessage()); e.printStackTrace(); } - //如果达不到这些人,世界等级就为1 - if(users.size()>=rankEndLine) { - for (int j = 0; j {}",users.size(),level); - - - - - } public static int getGlobalWorldLevelCache() { diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ActivityType.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ActivityType.java index 86c1527de..a1fc8cbfa 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ActivityType.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ActivityType.java @@ -112,4 +112,5 @@ public interface ActivityType { int XUN_BAO_MI_ZONG = 82;//寻宝迷踪 int SEVEN_WORLD_TREASURE = 83;//七界秘宝 + int RIDING_SWARD = 84;//御剑飞行 } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ActivityTypeEnum.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ActivityTypeEnum.java index 4dfc20183..cc4d2686e 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ActivityTypeEnum.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ActivityTypeEnum.java @@ -85,6 +85,7 @@ public enum ActivityTypeEnum { XUN_BAO_MI_ZONG(ActivityType.XUN_BAO_MI_ZONG,XunBaoMiZongActivity::new), SEVEN_WORLD_TREASURE(ActivityType.SEVEN_WORLD_TREASURE,SevenWorldActivity::new), LING_LONG_PAVILION(ActivityType.LING_LONG_PAVILION,DefaultEmptyActivity::new), + RIDING_SWARD(ActivityType.RIDING_SWARD,DefaultEmptyActivity::new), ; private int type; diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/PlayerManager.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/PlayerManager.java index f6d5e8059..0950f922c 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/PlayerManager.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/PlayerManager.java @@ -186,6 +186,9 @@ public class PlayerManager extends MongoBase { */ private Map sevenWorldRelic = new HashMap<>(); + // 御剑行游玩次数 + private int ridingSwardNum; + public PlayerManager(){ this.setRootCollection(User._COLLECTION_NAME); } @@ -1278,4 +1281,13 @@ public class PlayerManager extends MongoBase { this.sevenWorldRelic.put(id,status); updateString("sevenWorldRelic",sevenWorldRelic); } + + public int getRidingSwardNum() { + return ridingSwardNum; + } + + public void setRidingSwardNum(int ridingSwardNum) { + this.ridingSwardNum = ridingSwardNum; + updateString("ridingSwardNum",ridingSwardNum); + } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/help/HelpHeroLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/help/HelpHeroLogic.java index 584c0f5ef..30cd3b749 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/help/HelpHeroLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/help/HelpHeroLogic.java @@ -330,12 +330,13 @@ public class HelpHeroLogic { * 零点清理redis数据 */ public void zeroClearRedisHelp(){ - // 不是零点 - if (TimeUtils.getHourOfDay() != 0 || TimeUtils.getMiunte() != 0){ - return; + try { + String pattern = GameApplication.serverId +":" + RedisKey.HELP_FIGHT + ".*"; + RedisUtil.getInstence().delVague(RedisKey.HELP_FIGHT_DELETE,pattern); + }catch (Exception e){ + LOGGER.error("零点清理助战信息报错,{}",e.getMessage()); + e.printStackTrace(); } - String pattern = GameApplication.serverId +":" + RedisKey.HELP_FIGHT + ".*"; - RedisUtil.getInstence().delVague(RedisKey.HELP_FIGHT_DELETE,pattern); } /** diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardLogic.java new file mode 100644 index 000000000..7d91224a3 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardLogic.java @@ -0,0 +1,544 @@ +package com.ljsd.jieling.logic.ridingSward; + +import com.google.gson.reflect.TypeToken; +import com.ljsd.jieling.db.redis.RedisKey; +import com.ljsd.jieling.db.redis.RedisUtil; +import com.ljsd.jieling.exception.ErrorCode; +import com.ljsd.jieling.exception.ErrorCodeException; +import com.ljsd.jieling.globals.BIReason; +import com.ljsd.jieling.jbean.ActivityMission; +import com.ljsd.jieling.logic.activity.ActivityType; +import com.ljsd.jieling.logic.activity.crossService.CrossServiceLogic; +import com.ljsd.jieling.logic.dao.UserManager; +import com.ljsd.jieling.logic.dao.gm.ArenaOfUser; +import com.ljsd.jieling.logic.dao.root.User; +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.tools.Utils; +import com.ljsd.jieling.util.ItemUtil; +import com.ljsd.jieling.util.MessageUtil; +import config.SGlobalActivity; +import config.SRidingSwardConfig; +import config.SRidingSwardResult; +import manager.STableManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.redis.core.ZSetOperations; +import rpc.protocols.ActivityProto; +import rpc.protocols.CommonProto; +import rpc.protocols.MessageTypeProto; +import util.MathUtils; +import util.TimeUtils; + +import java.lang.reflect.Type; +import java.util.*; + +/** + * @Author hj + * @Date 2021/9/28 10:19:37 + * @Description: 御剑飞行 + * @Version 1.0 + */ +@SuppressWarnings("ALL") +public class RidingSwardLogic{ + // 日志 + private static final Logger LOGGER = LoggerFactory.getLogger(RidingSwardLogic.class); + // 获取单例 + public static RidingSwardLogic instance = new RidingSwardLogic(); + private RidingSwardLogic(){} + public static RidingSwardLogic getInstance() { + return instance; + } + + //当前状态,0:关闭,1:投注,2:比赛中 + public static int state = 0; + private static long startTime = 0L; + private static long endTime = 0L; + private static long nextTime = 0L; + + public void checkState(){ + try { + // 活动过期 + if (TimeUtils.now() > endTime || TimeUtils.now() < startTime){ + state = 0; + } + // 关闭中,不进行处理 + if (state == 0){ + return; + } + long now = TimeUtils.now(); + // 配置表 + SRidingSwardConfig config = STableManager.getConfig(SRidingSwardConfig.class).get(1); + // 投注时间 + long bet = config.getTime()[0] * TimeUtils.ONE_SECOND; + // 比赛时间 + long competition = config.getTime()[1] * TimeUtils.ONE_SECOND; + // 活动开始到现在经过了多少时间,计算第几轮, 取模,小于60000是比赛中,大于60000是投注 + long time = (now - startTime) % (bet + competition); + long num = (now - startTime) / (bet + competition); + if (time > bet){ + // 比赛阶段 + state = 2; + nextTime = (num + 1) * (bet + competition) + startTime; + }else{ + // 投注阶段 + state = 1; + nextTime = num * (bet + competition) + bet + startTime; + } + }catch (Exception e){ + e.printStackTrace(); + } + } + + /** + * 初始化比赛数据 + */ + public void createExecuteScript(){ + // 处理状态 + checkState(); + if (state == 0){ + return; + } + RedisUtil redisUtil = RedisUtil.getInstence(); + // 时间锁,同一天只会执行一次 + String key = redisUtil.getKey(RedisKey.RIDING_SWARD_TIME_LOCK, ""); + String timeLock = Optional.ofNullable(redisUtil.get(key)).map(Object::toString).orElse("0"); + if (TimeUtils.now() < Long.parseLong(timeLock)){ + return; + } + // 配置表 + SRidingSwardConfig config = STableManager.getConfig(SRidingSwardConfig.class).get(1); + TreeMap treeMap = new TreeMap<>(STableManager.getConfig(SRidingSwardResult.class)); + + // 开始时间计算 + boolean sameDay = TimeUtils.isSameDay(TimeUtils.now(), startTime); + long start = sameDay ? startTime : TimeUtils.getTodayZero(); + // 结束时间计算 + boolean sameDay2 = TimeUtils.isSameDay(TimeUtils.now(), endTime); + long end = sameDay2 ? endTime : TimeUtils.getTomorrowZero(); + // 投注时间获取 + long bet = config.getTime()[0] * TimeUtils.ONE_SECOND; + // 比赛时间获取 + long competition = config.getTime()[1] * TimeUtils.ONE_SECOND; + + // 今日比赛次数 + long num = (end - start) / (bet + competition); + // 总权重 + int sum = treeMap.values().stream().mapToInt(SRidingSwardResult::getRate).sum(); + + // map存储结果 + HashMap result = new HashMap<>(); + long time = start; + for (int i = 0; i < num; i++) { + // 比赛开始时间 + long competitionIng = time += bet; + // 计算随机权重 + int randomInt = MathUtils.randomInt(sum); + // 计算比赛脚本 + for (SRidingSwardResult value : treeMap.values()) { + if (randomInt <= value.getRate()) { + // 存储 + result.put(String.valueOf(competitionIng),value.getId()); + break; + } + randomInt-=value.getRate(); + } + // 加上比赛用时,获得下一场投注开始时间 + time = competitionIng + competition; + } + redisUtil.putMapEntrys(RedisKey.RIDING_SWARD_RANK, "", result); + LOGGER.info("御剑行日志:结果:{}", result.toString()); + // 覆盖锁 + redisUtil.set(key,String.valueOf(end)); + } + + /** + * 验证客户端信息,返回用户 + * @param uid + * @return + * @throws Exception + */ + private User verifyUser(int uid) throws Exception { + // 用户信息 + User user = UserManager.getUser(uid); + if (user == null) { + throw new ErrorCodeException(ErrorCode.UNKNOWN); + } + return user; + } + + /** + * 获取活动信息 + * @param uid + * @param proto + * @return + */ + public void getRidingSwardActivity(int uid, ActivityProto.RidingSwardActivityRequest proto) throws Exception { + User user = verifyUser(uid); + ActivityProto.RidingSwardActivityResponse.Builder build = ActivityProto.RidingSwardActivityResponse.newBuilder(); + + // 活动未开启 + ActivityMission mission = user.getActivityManager().getActivityMissionMap().get(proto.getActivityId()); + if (mission == null || mission.getActivityState() != ActivityType.OPEN_STATE){ + build.setState(0); + } + else { + // 初始化状态信息 + if (state == 0) { + // 初始化活动数据 + SGlobalActivity activity = SGlobalActivity.getsGlobalActivityMap().get(proto.getActivityId()); + state = 1; + startTime = TimeUtils.stringToTimeLong(activity.getStartTime(), "yyyyMMdd HHmmss"); + endTime = TimeUtils.stringToTimeLong(activity.getEndtime(), "yyyyMMdd HHmmss"); + // 定时器启动 + getInstance().createExecuteScript(); + } + // 处理缓存 + checkState(); + // 活动未到开启时间 + if (state == 0){ + build.setState(0); + } + else { + // 跨服排行榜玩家排名玩家信息 + ArrayList infos = new ArrayList<>(4); + // 跨服排行数据 + AbstractRank rank = RankContext.getRankEnum(RankEnum.CROSS_FORCE_CURR_RANK.getType()); + Set> tupleSet = rank.getCrossRankByKey("", 1, 4); + for (ZSetOperations.TypedTuple tuple : tupleSet) { + // 跨服排行榜玩家数据 + ArenaOfUser query = CrossServiceLogic.getInstance().query(Integer.parseInt(tuple.getValue())); + CommonProto.ModelUserInfo.Builder builder = CommonProto.ModelUserInfo.newBuilder() + .setUserName(query.getPlayerManager().getName()) + .setSex(query.getPlayerManager().getGender()) + .setPracticeLevel(query.getPlayerManager().getPracticeLevel()); + infos.add(builder.build()); + } + build.addAllModelInfo(infos); + build.setState(state); + build.setTime(nextTime); + build.setRankId(getMatchRankId()); + build.setBetCount(user.getPlayerInfoManager().getRidingSwardNum()); + } + } + MessageUtil.sendMessage(uid,1, MessageTypeProto.MessageType.RidingSwardActivityResponse_VALUE,build.build(),true); + } + + /** + * 获取当前比赛剧本id + * @return + */ + private int getMatchRankId(){ + if (state == 2){ + // 配置 + SRidingSwardConfig config = STableManager.getConfig(SRidingSwardConfig.class).get(1); + long time = nextTime - config.getTime()[1] * TimeUtils.ONE_SECOND; + return getRankMap().getOrDefault(time,0); + } + return 0; + } + + /** + * 领取奖励 + * @param uid + * @param proto + * @throws Exception + */ + public void getRidingSwardReward(int uid,ActivityProto.RidingSwardRewardRequest proto) throws Exception { + // 玩家信息 + User user = verifyUser(uid); + // 场次时间 + long time = proto.getTime(); + // 投注记录,key:时间戳,value:竞猜记录信息 + Map> recordMap = getRecordList(uid); + // 配置 + SRidingSwardConfig config = STableManager.getConfig(SRidingSwardConfig.class).get(1); + List result = new ArrayList<>(); + if (time == 0){ + for (Map.Entry> entry : recordMap.entrySet()) { + for (RidingSwardRecord record : entry.getValue()) { + // 未领取奖励 + if (record.getState() == 0){ + int[] reward = {config.getMaxRaiseNum()[0],record.getGetNum()}; + result.add(reward); + record.setState(1); + } + } + RedisUtil.getInstence().putMapEntry(RedisKey.RIDING_SWARD_RECORD, String.valueOf(uid),String.valueOf(entry.getKey()),entry.getValue()); + } + }else { + // 单场领取 + int swardId = proto.getSwardId(); + List records = recordMap.get(time); + if (records == null || records.isEmpty() || swardId == 0){ + throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE,"比赛场次不存在,领取失败"); + } + for (RidingSwardRecord record : records) { + if (record.getState() == 0 && record.getBetSwardId() == swardId){ + int[] reward = {config.getMaxRaiseNum()[0],record.getGetNum()}; + result.add(reward); + record.setState(1); + } + } + RedisUtil.getInstence().putMapEntry(RedisKey.RIDING_SWARD_RECORD, String.valueOf(uid),String.valueOf(time),records); + } + // 奖励计算 + int[][] changeList = Utils.changeList(result); + CommonProto.Drop.Builder drop = ItemUtil.drop(user, changeList, BIReason.RIDING_SWARD_REWARD); + ActivityProto.RidingSwardRewardResponse.Builder builder = ActivityProto.RidingSwardRewardResponse.newBuilder().setDrop(drop); + MessageUtil.sendMessage(uid,1, MessageTypeProto.MessageType.RidingSwardRewardResponse_VALUE,builder.build(),true); + } + + /** + * 投注 + * @param uid + * @param proto + */ + public void ridingSwardBet(int uid,ActivityProto.RidingSwardBetRequest proto) throws Exception { + if (state != 1){ + throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE,"活动关闭或正在比赛中,无法投标"); + } + User user = verifyUser(uid); + // 配置 + SRidingSwardConfig config = STableManager.getConfig(SRidingSwardConfig.class).get(1); + // 投注记录,key:时间戳,value:竞猜记录信息 + Map> recordMap = getRecordList(uid); + // 获取下一场 + List records = recordMap.getOrDefault(nextTime,new ArrayList<>()); + // 首次押注,验证次数消耗 + if (records.isEmpty()){ + // 验证押注次数 + int betNum = user.getPlayerInfoManager().getRidingSwardNum(); + if (betNum >= config.getJoinCount() && false){ + throw new ErrorCodeException(ErrorCode.REFRESH_WHEL_TIME_NOT); + } + // 验证道具数量 + if (proto.getCostNum() > config.getMaxRaiseNum()[1] || proto.getCostNum() < config.getJoinCost()[1]){ + throw new ErrorCodeException(ErrorCode.ITEM_NOT_ENOUGH,"押注道具不满足最低或最高上限"); + } + // 道具消耗 + HashMap map = new HashMap<>(); + map.put(config.getMaxRaiseNum()[0],proto.getCostNum()); + boolean checkCost = ItemUtil.itemCost(user, map, BIReason.RIDING_SWARD_BET,0); + if (!checkCost){ + throw new ErrorCodeException(ErrorCode.ITEM_NOT_ENOUGH); + } + RidingSwardRecord record = new RidingSwardRecord(nextTime,proto.getSwardId(),proto.getCostNum()); + records.add(record); + // 记录押注次数 + user.getPlayerInfoManager().setRidingSwardNum(betNum + 1); + } + // 第二次押注,验证是否重复 + else if (records.size() < 2){ + for (RidingSwardRecord record : records) { + if (record.getBetSwardId() == proto.getSwardId()){ + throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE,"不能重复押注"); + } + } + RidingSwardRecord record = new RidingSwardRecord(nextTime,proto.getSwardId(),proto.getCostNum()); + records.add(record); + }else { + throw new ErrorCodeException(ErrorCode.RIDING_SWARD_BET_TWO,"一轮最大押注两次"); + } + if (!records.isEmpty()){ + RedisUtil.getInstence().putMapEntry(RedisKey.RIDING_SWARD_RECORD, String.valueOf(uid),String.valueOf(nextTime),records); + } + // 返回消息 + sendRidingSwardInfo(uid); + } + + /** + * 返回御剑飞行信息 + * @param uid + */ + public void sendRidingSwardInfo(int uid) throws Exception { + User user = verifyUser(uid); + ActivityProto.RidingSwardInfoResponse.Builder builder = ActivityProto.RidingSwardInfoResponse.newBuilder(); + builder.addAllRecordLsit(getRidingSwardRecord(uid)); + builder.addAllBetList(getRidingSwardBet(uid)); + builder.setLastRank(getRidingSwardLastRank()); + builder.setBetCount(user.getPlayerInfoManager().getRidingSwardNum()); + MessageUtil.sendMessage(uid,1, MessageTypeProto.MessageType.RidingSwardInfoResponse_VALUE,builder.build(),true); + } + + /** + * 获取上一次排名,也就是最后一次比赛 + * @return + */ + private CommonProto.RidingSwardLastRank getRidingSwardLastRank() throws ErrorCodeException { + Map map = RedisUtil.getInstence().getMapValues(RedisKey.RIDING_SWARD_RANK, "", Long.class, Integer.class); + // 配置 + SRidingSwardConfig config = STableManager.getConfig(SRidingSwardConfig.class).get(1); + long time = 0; + // 押注阶段,返回上一层比赛结果 + if (state == 1){ + time = nextTime - (config.getTime()[0] + config.getTime()[1]) * TimeUtils.ONE_SECOND; + } + // 比赛阶段,返回当前比赛结果 + else if (state == 2){ + time = nextTime - (config.getTime()[0] + config.getTime()[1]*2) * TimeUtils.ONE_SECOND; + }else { + throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE); + } + Integer integer = map.getOrDefault(time,0); + return CommonProto.RidingSwardLastRank.newBuilder() + .setRankTime(time) + .setRankId(integer) + .build(); + } + + /** + * 获取投注记录 + * @param uid + * @return + */ + private List getRidingSwardRecord(int uid){ + // 返回值 + List list = new ArrayList<>(); + // 投注记录,key:时间戳,value:竞猜记录信息list + Type valueType = new TypeToken>() {}.getType(); + Map> recordMap = getRecordList(uid); + // 比赛记录,key:场次时间戳,value:剧本id + Map rankMap = getRankMap(); + // 配置表 + Map resultMap = STableManager.getConfig(SRidingSwardResult.class); + SRidingSwardConfig config = STableManager.getConfig(SRidingSwardConfig.class).get(1); + // 异常可以投注两次,所以最多会有两次记录 + for (Map.Entry> entry : recordMap.entrySet()) { + boolean judge = false; + for (RidingSwardRecord record : entry.getValue()) { + // 当前比赛结果不能显示 + if (record.getTime() >= (nextTime-config.getTime()[1]*TimeUtils.ONE_SECOND)){ + break; + } + // -1是未计算过的参数,需要算值 + if (record.getState() == -1){ + // 根据场次获取剧本id + Integer scriptId = rankMap.get(record.getTime()); + if (scriptId == null){ + break; + } + // 剧本信息 + SRidingSwardResult swardResult = resultMap.get(scriptId); + int winnerId = 0; + for (int i = 0; i < swardResult.getResult().length; i++) { + if (swardResult.getResult()[i][0] == 1){ + winnerId = i+1; + break; + } + } + // 获胜剑id + record.setWinnerId(winnerId); + // 竞猜结果 + int result = winnerId == record.getBetSwardId()?1:0; + record.setResult(result); + // 可领取得奖励数量 + int getNum = (config.getLoseRate()/10000) * record.getBetNum(); + if (result == 1){ + getNum = record.getBetNum() * (config.getRateList()[winnerId-1]/10000); + } + record.setGetNum(getNum); + // 领取状态 + record.setState(0); + judge = true; + } + // 结果 + CommonProto.RidingSwardRecord.Builder builder = CommonProto.RidingSwardRecord.newBuilder() + .setTime(record.getTime())// 赛场时间 + .setCostNum(record.getBetNum())// 投注数量 + .setBetSwardId(record.getBetSwardId())// 押注的剑 + .setState(record.getState())// 领取状态 + .setWinnerId(record.getWinnerId())// 获胜的剑 + .setGetNum(record.getGetNum())// 可领取数量 + .setResult(record.getResult()); // 输赢结果 + list.add(builder.build()); + } + + // 更新缓存对象类型 + if (judge){ + RedisUtil.getInstence().putMapEntry(RedisKey.RIDING_SWARD_RECORD, String.valueOf(uid),String.valueOf(entry.getKey()),entry.getValue()); + } + } + return list; + } + + /** + * 获取当前竞猜信息 + * @param uid + * @return + */ + private List getRidingSwardBet(int uid){ + List list = new ArrayList<>(); + // 比赛记录,key:场次时间戳,value:剧本id + List records = getRecordList(uid).get(nextTime); + if (records != null){ + for (RidingSwardRecord record : records) { + // 竞猜信息 + CommonProto.RidingSwardBet.Builder builder = CommonProto.RidingSwardBet.newBuilder(); + builder.setSwardId(record.getBetSwardId()); + builder.setCostNum(record.getBetNum()); + list.add(builder.build()); + } + } + return list; + } + + + /** + * 获取排行榜 + * @return + */ + private Map getRankMap(){ + Map map = RedisUtil.getInstence().getMapValues(RedisKey.RIDING_SWARD_RANK, "", Long.class, Integer.class); + if (map == null){ + return new HashMap<>(); + } + return map; + } + + /** + * 投注记录,key:场次时间戳,value:竞猜记录信息 + */ + private Map> getRecordList(int uid){ + Type valueType = new TypeToken>() {}.getType(); + Map> map = RedisUtil.getInstence().getMapValues(RedisKey.RIDING_SWARD_RECORD, String.valueOf(uid), Long.class, valueType); + if (map == null){ + map = new HashMap<>(); + } + return map; + } + + private String getRankKey(){ + return RedisUtil.getInstence().getKey(RedisKey.RIDING_SWARD_RANK, ""); + } + private String getRecordKey(int uid){ + return RedisUtil.getInstence().getKey(RedisKey.RIDING_SWARD_RECORD, String.valueOf(uid)); + } + + /** + * 零点清理御剑行数据 + * @param user + */ + public void zeroClearRidingSwardByUser(User user){ + // 玩家信息清理 + user.getPlayerInfoManager().setRidingSwardNum(0); + // 玩家记录信息 + RedisUtil.getInstence().rename(TimeUtils.ONE_DAY*7/1000,getRecordKey(user.getId())); + } + + /** + * 零点清理御剑行数据 + * @param user + */ + public void zeroClearRidingSwardByRank(){ + try { + RedisUtil.getInstence().rename(TimeUtils.ONE_DAY*7/1000,getRankKey()); + // 初始化第二天的比赛数据 + getInstance().createExecuteScript(); + }catch (Exception e){ + LOGGER.error("零点处理御剑行排行数据报错,{}",e.getMessage()); + e.printStackTrace(); + } + } +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardRecord.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardRecord.java new file mode 100644 index 000000000..abbf28236 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardRecord.java @@ -0,0 +1,84 @@ +package com.ljsd.jieling.logic.ridingSward; + +/** + * @Author hj + * @Date 2021/10/11 17:27:10 + * @Description: + * @Version 1.0 + */ +public class RidingSwardRecord { + private long time; + private int betSwardId; + private int betNum; + // 领取状态,0:未领取,1:已领取 + private int state; + private int result; + private int winnerId; + private int getNum; + + public RidingSwardRecord(long time, int betSwardId, int betNum) { + this.time = time; + this.betSwardId = betSwardId; + this.betNum = betNum; + this.state = -1; + } + + public RidingSwardRecord() { + } + + public long getTime() { + return time; + } + + public void setTime(long time) { + this.time = time; + } + + public int getBetSwardId() { + return betSwardId; + } + + public void setBetSwardId(int betSwardId) { + this.betSwardId = betSwardId; + } + + public int getBetNum() { + return betNum; + } + + public void setBetNum(int betNum) { + this.betNum = betNum; + } + + public int getState() { + return state; + } + + public void setState(int state) { + this.state = state; + } + + public int getResult() { + return result; + } + + public void setResult(int result) { + this.result = result; + } + + public int getWinnerId() { + return winnerId; + } + + public void setWinnerId(int winnerId) { + this.winnerId = winnerId; + } + + public int getGetNum() { + return getNum; + } + + public void setGetNum(int getNum) { + this.getNum = getNum; + } +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java b/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java index 3aa0d45c1..b8677434e 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java @@ -32,6 +32,7 @@ import com.ljsd.jieling.logic.help.HelpHeroLogic; import com.ljsd.jieling.logic.mail.MailLogic; import com.ljsd.jieling.logic.question.QuestionLogic; import com.ljsd.jieling.logic.rank.CrossRankManager; +import com.ljsd.jieling.logic.ridingSward.RidingSwardLogic; import com.ljsd.jieling.logic.sevenworld.SevenWorldLogic; import com.ljsd.jieling.logic.store.BuyGoodsNewLogic; import com.ljsd.jieling.logic.store.StoreLogic; @@ -61,7 +62,6 @@ public class MinuteTask extends Thread { LOGGER.info("MinuteTask start..."); LOGGER.info("online use num::"+ OnlineUserManager.sessionMap.entrySet().size()); //TODO 每分钟逻辑通过监听事件处理 已经迁移活动和热更新 - HotfixUtil.getInstance(); Poster.getPoster().dispatchEvent(new MinuteTaskEvent()); AreaManager.getInstance().processAddServerAreaIsChange(); @@ -81,20 +81,6 @@ public class MinuteTask extends Thread { }catch (Exception e){ LOGGER.error("Exception::=>{}",e.toString()); } - try { - // 四灵试炼开启状态刷新 - if (TimeUtils.getHourOfDay() == 0 && TimeUtils.getMiunte() == 0){ - FourChallengeLogic.getInstance().check(); - } - }catch (Exception e){ - LOGGER.error("Exception::=>{}",e.toString()); - } - try { - // 助战英雄,redis缓存清空,此清理需要在everyZeroTask()之后,在everyZeroTask中有调用redis缓存得东西 - HelpHeroLogic.getInstance().zeroClearRedisHelp(); - }catch (Exception e){ - LOGGER.error("Exception::=>{}",e.toString()); - } try { everyZeroTask(); }catch (Exception e){ @@ -218,29 +204,37 @@ public class MinuteTask extends Thread { //每日凌晨零点执行 private void everyZeroTask(){ - Calendar calendar = Calendar.getInstance(); - int hour = calendar.get(Calendar.HOUR_OF_DAY); - int minute = calendar.get(Calendar.MINUTE); - if(hour == 0 && minute ==0){ - + if(TimeUtils.getHourOfDay() == 0 && TimeUtils.getMiunte() == 0){ //保证每分钟线程 try { + // 计算世界等级 GlobleSystemLogic.getInstence().calCulRank(); + // 四灵开启状态检查 + FourChallengeLogic.getInstance().check(); + // 助战 + HelpHeroLogic.getInstance().zeroClearRedisHelp(); + // 御剑行处理 + RidingSwardLogic.getInstance().zeroClearRidingSwardByRank(); + + // 公会信息处理 Map guildInfoMap = GuilidManager.guildInfoMap; for(Map.Entry guildInfoEntry:guildInfoMap.entrySet()){ + // 公会红包排行处理 RedisUtil.getInstence().del(RedisKey.getKey(RedisKey.GUILD_RED_PACKAGE_RANK,String.valueOf(guildInfoEntry.getKey()),false)); + // 公会祭祀处理 guildInfoEntry.getValue().reSetFete(); LOGGER.info("{}更新公会祭祀完毕",guildInfoEntry.getValue().getName()); + // 公会援助日志处理 GuildInfo guildInfo = guildInfoEntry.getValue(); - // 公会援助日志 guildInfo.clearGuildHelpLog(); // 公会援助刷新 Set sendUids = new HashSet<>(); - for (Set items : guildInfo.getMembers().values()) { - sendUids.addAll(items); - } + guildInfo.getMembers().values().forEach(sendUids::addAll); for (Integer sendUid : sendUids) { - User target = UserManager.getUserInMem(sendUid); + User target = UserManager.getUserNotCache(sendUid); + if (target == null){ + continue; + } AyyncWorker ayyncWorker = new AyyncWorker(target, true, user -> { GuildLogic.sendGuildHelpRewardEmail(target); GuildMyInfo guildMyInfo = target.getGuildMyInfo(); diff --git a/serverlogic/src/main/java/com/ljsd/jieling/util/TaskKit.java b/serverlogic/src/main/java/com/ljsd/jieling/util/TaskKit.java new file mode 100644 index 000000000..e0b21329f --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/util/TaskKit.java @@ -0,0 +1,189 @@ +package com.ljsd.jieling.util; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import util.TimeUtils; + +import java.text.ParseException; +import java.util.*; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 定时任务 + * + * @author biezhi + * @since 1.0 + */ +public abstract class TaskKit { + + private static final Logger LOGGER = LoggerFactory.getLogger(TaskKit.class); + + private static ScheduledThreadPoolExecutor taskScheduler = new ScheduledThreadPoolExecutor(getBestPoolSize()); + private static List timerList = new ArrayList<>(); + + /** + * 立即启动,并以固定的频率来运行任务。后续任务的启动时间不受前次任务延时影响。 + * @param task 具体待执行的任务 + * @param periodSeconds 每次执行任务的间隔时间(单位秒) + */ + public static ScheduledFuture scheduleAtFixedRate(Runnable task, long periodSeconds) { + return scheduleAtFixedRate(task, 0, periodSeconds, TimeUnit.SECONDS); + } + + /** + * 在指定的延时之后开始以固定的频率来运行任务。后续任务的启动时间不受前次任务延时影响。 + * @param task 具体待执行的任务 + * @param initialDelay 首次执行任务的延时时间 + * @param period 每次执行任务的间隔时间(单位秒) + * @param unit 时间单位 + */ + public static ScheduledFuture scheduleAtFixedRate(Runnable task, long initialDelay, long period, TimeUnit unit) { + return taskScheduler.scheduleAtFixedRate(task, initialDelay, period, unit); + } + + /** + * 在指定的时间点开始以固定的频率运行任务。后续任务的启动时间不受前次任务延时影响。 + * @param task 具体待执行的任务 + * @param startTime 首次运行的时间点,支持 "yyyy-MM-dd HH:mm:ss" 格式 + * @param period 每次执行任务的间隔时间 + * @param unit 时间单位 + */ + public static void scheduleAtFixedRate(Runnable task, String startTime, long period, TimeUnit unit) throws ParseException { + Date dt = TimeUtils.dateFormat(startTime); + scheduleAtFixedRate(task, dt, period, unit); + } + + /** + * 在指定的时间点开始以固定的频率运行任务。后续任务的启动时间不受前次任务延时影响。 + * @param task 具体待执行的任务 + * @param startTime 首次运行的时间点 + * @param period 每次执行任务的间隔时间 + * @param unit 时间单位 + */ + public static void scheduleAtFixedRate(final Runnable task, Date startTime, final long period, final TimeUnit unit) { + final Timer timer = new Timer(); + timer.schedule(new TimerTask() { + @Override + public void run() { + taskScheduler.scheduleAtFixedRate(task, 0, period, unit); + timer.cancel(); + timerList.remove(timer); + } + }, startTime); + timerList.add(timer); + } + + /** + * 立即启动,两次任务间保持固定的时间间隔 + * @param task 具体待执行的任务 + * @param periodSeconds 两次任务的间隔时间(单位秒) + */ + public static ScheduledFuture scheduleWithFixedDelay(Runnable task, long periodSeconds) { + return scheduleWithFixedDelay(task, 0, periodSeconds, TimeUnit.SECONDS); + } + + /** + * 在指定的延时之后启动,两次任务间保持固定的时间间隔 + * @param task 具体待执行的任务 + * @param initialDelay 首次执行任务的延时时间 + * @param period 两次任务的间隔时间(单位秒) + * @param unit 时间单位 + */ + public static ScheduledFuture scheduleWithFixedDelay(Runnable task, long initialDelay, long period, TimeUnit unit) { + return taskScheduler.scheduleWithFixedDelay(task, initialDelay, period, unit); + } + + /** + * 在指定的时间点启动,两次任务间保持固定的时间间隔 + * @param task 具体待执行的任务 + * @param startTime 首次运行的时间点,支持 "yyyy-MM-dd HH:mm:ss" 格式 + * @param period 两次任务的间隔时间 + * @param unit 时间单位 + */ + public static void scheduleWithFixedDelay(Runnable task, String startTime, long period, TimeUnit unit) throws ParseException { + Date dt = TimeUtils.dateFormat(startTime); + scheduleWithFixedDelay(task, dt, period, unit); + } + + /** + * 在指定的时间点启动,两次任务间保持固定的时间间隔 + * @param task 具体待执行的任务 + * @param startTime 首次运行的时间点 + * @param period 两次任务的间隔时间 + * @param unit 时间单位 + */ + public static void scheduleWithFixedDelay(final Runnable task, Date startTime, final long period, final TimeUnit unit) { + final Timer timer = new Timer(); + timer.schedule(new TimerTask() { + @Override + public void run() { + taskScheduler.scheduleWithFixedDelay(task, 0, period, unit); + timer.cancel(); + timerList.remove(timer); + } + }, startTime); + timerList.add(timer); + } + + /** + * 调整线程池大小 + * @param threadPoolSize + */ + public static void resizeThreadPool(int threadPoolSize) { + taskScheduler.setCorePoolSize(threadPoolSize); + } + + /** + * 返回定时任务线程池,可做更高级的应用 + * @return + */ + public static ScheduledThreadPoolExecutor getTaskScheduler() { + return taskScheduler; + } + + /** + * 关闭定时任务服务 + *

系统关闭时可调用此方法终止正在执行的定时任务,一旦关闭后不允许再向线程池中添加任务,否则会报RejectedExecutionException异常

+ */ + public static void depose() { + int timerNum = timerList.size(); + //清除Timer + synchronized (timerList) { + for (Timer t: timerList) + t.cancel(); + timerList.clear(); + } + + List awaitingExecution = taskScheduler.shutdownNow(); + LOGGER.info("Tasks stopping. Tasks awaiting execution: {}", timerNum + awaitingExecution.size()); + } + + /** + * 重启动定时任务服务 + */ + public static void reset() { + depose(); + taskScheduler = new ScheduledThreadPoolExecutor(3); + LOGGER.info("定时器线程启动,线程数量:{}",3); + } + + /** + * 根据 Java 虚拟机可用处理器数目返回最佳的线程数。
+ * 最佳的线程数 = CPU可用核心数 / (1 - 阻塞系数),其中阻塞系数这里设为0.9 + */ + private static int getBestPoolSize() { + try { + // JVM可用处理器的个数 + final int cores = Runtime.getRuntime().availableProcessors(); + // 最佳的线程数 = CPU可用核心数 / (1 - 阻塞系数) + // TODO 阻塞系数是不是需要有个setter方法能让使用者自由设置呢? + return (int)(cores / (1 - 0.9)); + } + catch (Throwable e) { + // 异常发生时姑且返回10个任务线程池 + return 5; + } + } +} diff --git a/tablemanager/src/main/java/config/SRidingSwardConfig.java b/tablemanager/src/main/java/config/SRidingSwardConfig.java new file mode 100644 index 000000000..3e96e49a8 --- /dev/null +++ b/tablemanager/src/main/java/config/SRidingSwardConfig.java @@ -0,0 +1,67 @@ +package config; + +import manager.STableManager; +import manager.Table; + +import java.util.Map; + +@Table(name ="RidingSwardConfig") +public class SRidingSwardConfig implements BaseConfig { + + private int id; + + private int joinCount; + + private int[] joinCost; + + private int[] maxRaiseNum; + + private int winRate; + + private int loseRate; + + private int[] rateList; + + private int[] time; + + + @Override + public void init() throws Exception { + + } + + + public int getId() { + return id; + } + + public int getJoinCount() { + return joinCount; + } + + public int[] getJoinCost() { + return joinCost; + } + + public int[] getMaxRaiseNum() { + return maxRaiseNum; + } + + public int getWinRate() { + return winRate; + } + + public int getLoseRate() { + return loseRate; + } + + public int[] getRateList() { + return rateList; + } + + public int[] getTime() { + return time; + } + + +} \ No newline at end of file diff --git a/tablemanager/src/main/java/config/SRidingSwardResult.java b/tablemanager/src/main/java/config/SRidingSwardResult.java new file mode 100644 index 000000000..d6fad9c24 --- /dev/null +++ b/tablemanager/src/main/java/config/SRidingSwardResult.java @@ -0,0 +1,34 @@ +package config; + +import manager.Table; + +@Table(name ="RidingSwardResult") +public class SRidingSwardResult implements BaseConfig { + + private int id; + + private int[][] result; + + private int rate; + + + @Override + public void init() throws Exception { + + } + + + public int getId() { + return id; + } + + public int[][] getResult() { + return result; + } + + public int getRate() { + return rate; + } + + +} \ No newline at end of file From 2c1e22ee0d08f108cc87100a1e38b62e9bbc57d0 Mon Sep 17 00:00:00 2001 From: duhui Date: Thu, 14 Oct 2021 17:08:03 +0800 Subject: [PATCH 02/11] =?UTF-8?q?=E6=AC=A1=E6=95=B0=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ljsd/jieling/logic/ridingSward/RidingSwardLogic.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardLogic.java index 7d91224a3..7ef7ef18b 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardLogic.java @@ -310,7 +310,7 @@ public class RidingSwardLogic{ if (records.isEmpty()){ // 验证押注次数 int betNum = user.getPlayerInfoManager().getRidingSwardNum(); - if (betNum >= config.getJoinCount() && false){ + if (betNum >= config.getJoinCount()){ throw new ErrorCodeException(ErrorCode.REFRESH_WHEL_TIME_NOT); } // 验证道具数量 From a6416fb8402ce1027ee320498da51db798171e73 Mon Sep 17 00:00:00 2001 From: duhui Date: Thu, 14 Oct 2021 18:21:40 +0800 Subject: [PATCH 03/11] =?UTF-8?q?=E6=B4=BB=E5=8A=A8=E7=BB=93=E6=9D=9F?= =?UTF-8?q?=E5=8F=91=E9=80=81=E9=82=AE=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ljsd/jieling/globals/Global.java | 1 - .../ridingsward/RidingSwardRewardHandler.java | 4 +- .../logic/activity/ActivityTypeEnum.java | 2 +- .../logic/activity/RidingSwardActivity.java | 51 +++++++++++++++++++ .../logic/ridingSward/RidingSwardLogic.java | 28 ++-------- .../ljsd/jieling/thread/task/MinuteTask.java | 2 - 6 files changed, 60 insertions(+), 28 deletions(-) create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/logic/activity/RidingSwardActivity.java diff --git a/serverlogic/src/main/java/com/ljsd/jieling/globals/Global.java b/serverlogic/src/main/java/com/ljsd/jieling/globals/Global.java index 60a9819fe..0bebf29f2 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/globals/Global.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/globals/Global.java @@ -74,7 +74,6 @@ public interface Global { int LUXURYMONTHCARDID =11;//6豪华月卡 废弃 改版 int WEEKCARDID = 10; //月卡 - int MONTHCARDID =1;//1月卡 int LMONTHCARDID =2;//2豪华月卡 } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/ridingsward/RidingSwardRewardHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/ridingsward/RidingSwardRewardHandler.java index 0febcea20..3b49a4663 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/handler/ridingsward/RidingSwardRewardHandler.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/ridingsward/RidingSwardRewardHandler.java @@ -3,6 +3,7 @@ package com.ljsd.jieling.handler.ridingsward; import com.ljsd.jieling.handler.BaseHandler; import com.ljsd.jieling.logic.ridingSward.RidingSwardLogic; import com.ljsd.jieling.network.session.ISession; +import com.ljsd.jieling.util.MessageUtil; import org.springframework.stereotype.Component; import rpc.protocols.ActivityProto; import rpc.protocols.MessageTypeProto; @@ -22,6 +23,7 @@ public class RidingSwardRewardHandler extends BaseHandler getRidingSwardRecord(int uid){ + public List getRidingSwardRecord(int uid){ // 返回值 List list = new ArrayList<>(); // 投注记录,key:时间戳,value:竞猜记录信息list @@ -509,10 +508,10 @@ public class RidingSwardLogic{ return map; } - private String getRankKey(){ + public static String getRankKey(){ return RedisUtil.getInstence().getKey(RedisKey.RIDING_SWARD_RANK, ""); } - private String getRecordKey(int uid){ + public static String getRecordKey(int uid){ return RedisUtil.getInstence().getKey(RedisKey.RIDING_SWARD_RECORD, String.valueOf(uid)); } @@ -523,22 +522,5 @@ public class RidingSwardLogic{ public void zeroClearRidingSwardByUser(User user){ // 玩家信息清理 user.getPlayerInfoManager().setRidingSwardNum(0); - // 玩家记录信息 - RedisUtil.getInstence().rename(TimeUtils.ONE_DAY*7/1000,getRecordKey(user.getId())); - } - - /** - * 零点清理御剑行数据 - * @param user - */ - public void zeroClearRidingSwardByRank(){ - try { - RedisUtil.getInstence().rename(TimeUtils.ONE_DAY*7/1000,getRankKey()); - // 初始化第二天的比赛数据 - getInstance().createExecuteScript(); - }catch (Exception e){ - LOGGER.error("零点处理御剑行排行数据报错,{}",e.getMessage()); - e.printStackTrace(); - } } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java b/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java index b8677434e..205dc0d7a 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java @@ -213,8 +213,6 @@ public class MinuteTask extends Thread { FourChallengeLogic.getInstance().check(); // 助战 HelpHeroLogic.getInstance().zeroClearRedisHelp(); - // 御剑行处理 - RidingSwardLogic.getInstance().zeroClearRidingSwardByRank(); // 公会信息处理 Map guildInfoMap = GuilidManager.guildInfoMap; From a30b83494a9de719ab76fb1182314bfd873672b8 Mon Sep 17 00:00:00 2001 From: duhui Date: Thu, 14 Oct 2021 18:23:47 +0800 Subject: [PATCH 04/11] =?UTF-8?q?=E9=82=AE=E4=BB=B6=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ljsd/jieling/logic/activity/RidingSwardActivity.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/RidingSwardActivity.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/RidingSwardActivity.java index 0a30523ef..d56e88e40 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/RidingSwardActivity.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/RidingSwardActivity.java @@ -41,9 +41,9 @@ public class RidingSwardActivity extends AbstractActivity{ // 奖励 String rewards = StringUtil.parseArrayToString(drop); // 标题 - String title = SErrorCodeEerverConfig.getI18NMessage("Qijie_mail_title"); + String title = SErrorCodeEerverConfig.getI18NMessage("RidingSwordReward_mail_title"); // 内容 - String content = SErrorCodeEerverConfig.getI18NMessage("Qijie_mail_txt"); + String content = SErrorCodeEerverConfig.getI18NMessage("RidingSwordReward_mail_txt"); // 发送邮件 MailLogic.getInstance().sendMail(user.getId(),title,content,rewards,TimeUtils.nowInt(),Global.MAIL_EFFECTIVE_TIME); RedisUtil.getInstence().rename(TimeUtils.ONE_DAY*3/1000,RidingSwardLogic.getRecordKey(user.getId())); From 93a4f47466707b9d40a70695f0d0f3588cecab76 Mon Sep 17 00:00:00 2001 From: duhui Date: Fri, 15 Oct 2021 10:38:59 +0800 Subject: [PATCH 05/11] =?UTF-8?q?=E9=9A=94=E5=A4=A9=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java b/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java index 205dc0d7a..482b46dcd 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java @@ -213,6 +213,8 @@ public class MinuteTask extends Thread { FourChallengeLogic.getInstance().check(); // 助战 HelpHeroLogic.getInstance().zeroClearRedisHelp(); + // 御剑行创建新脚本 + RidingSwardLogic.getInstance().createExecuteScript(); // 公会信息处理 Map guildInfoMap = GuilidManager.guildInfoMap; From a7cbcf2323048ee1468567f3040adf43205ae9bb Mon Sep 17 00:00:00 2001 From: duhui Date: Fri, 15 Oct 2021 11:45:02 +0800 Subject: [PATCH 06/11] =?UTF-8?q?=E6=8E=92=E8=A1=8C=E6=A6=9C=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/ljsd/jieling/db/redis/RedisUtil.java | 4 ++-- .../ljsd/jieling/logic/activity/RidingSwardActivity.java | 6 ------ .../ljsd/jieling/logic/ridingSward/RidingSwardLogic.java | 3 ++- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisUtil.java b/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisUtil.java index 489ea5123..ae92c3297 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisUtil.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisUtil.java @@ -173,8 +173,8 @@ public class RedisUtil { // 旧名字 String oldName = key[i]; // 新名字 - String timeStamp2 = TimeUtils.getTimeStamp2(TimeUtils.now()); - String newName = oldName+":BACK:"+timeStamp2; + String timeStamp2 = TimeUtils.getTimeStamp(TimeUtils.now()); + String newName = oldName+"BACK_"+timeStamp2; // key是否存在 boolean aBoolean = hasKey(oldName); if (aBoolean){ diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/RidingSwardActivity.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/RidingSwardActivity.java index d56e88e40..f00286474 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/RidingSwardActivity.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/RidingSwardActivity.java @@ -17,12 +17,6 @@ public class RidingSwardActivity extends AbstractActivity{ super(id); } - @Override - public void initActivity(User user) throws Exception { - // 清理押注记录和排名记录 - RedisUtil.getInstence().rename(TimeUtils.ONE_DAY*3/1000,RidingSwardLogic.getRankKey()); - } - @Override public void onActivityEndOnMySelf(User user) throws Exception { // 处理一下数据 diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardLogic.java index 17b90c920..bc3b7cdd9 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardLogic.java @@ -191,6 +191,8 @@ public class RidingSwardLogic{ state = 1; startTime = TimeUtils.stringToTimeLong(activity.getStartTime(), "yyyyMMdd HHmmss"); endTime = TimeUtils.stringToTimeLong(activity.getEndtime(), "yyyyMMdd HHmmss"); + // 清理旧榜数据 + RedisUtil.getInstence().rename(TimeUtils.ONE_DAY*7,getRankKey()); // 定时器启动 getInstance().createExecuteScript(); } @@ -396,7 +398,6 @@ public class RidingSwardLogic{ // 返回值 List list = new ArrayList<>(); // 投注记录,key:时间戳,value:竞猜记录信息list - Type valueType = new TypeToken>() {}.getType(); Map> recordMap = getRecordList(uid); // 比赛记录,key:场次时间戳,value:剧本id Map rankMap = getRankMap(); From c44cbff18104ff1de813b2967b575946089dd3c3 Mon Sep 17 00:00:00 2001 From: duhui Date: Fri, 15 Oct 2021 11:58:48 +0800 Subject: [PATCH 07/11] =?UTF-8?q?=E4=B8=8D=E5=88=A0=E6=8E=92=E8=A1=8C?= =?UTF-8?q?=E6=A6=9C=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ljsd/jieling/logic/ridingSward/RidingSwardLogic.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardLogic.java index bc3b7cdd9..fce9234a3 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardLogic.java @@ -191,8 +191,6 @@ public class RidingSwardLogic{ state = 1; startTime = TimeUtils.stringToTimeLong(activity.getStartTime(), "yyyyMMdd HHmmss"); endTime = TimeUtils.stringToTimeLong(activity.getEndtime(), "yyyyMMdd HHmmss"); - // 清理旧榜数据 - RedisUtil.getInstence().rename(TimeUtils.ONE_DAY*7,getRankKey()); // 定时器启动 getInstance().createExecuteScript(); } From f61459300773ab4a3bb2fe0b2c7448f07f126486 Mon Sep 17 00:00:00 2001 From: duhui Date: Fri, 15 Oct 2021 13:57:09 +0800 Subject: [PATCH 08/11] =?UTF-8?q?=E4=BA=8C=E6=AC=A1=E6=8A=BC=E6=B3=A8?= =?UTF-8?q?=E4=B8=8D=E6=B6=88=E8=80=97=E9=81=93=E5=85=B7=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../logic/ridingSward/RidingSwardLogic.java | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardLogic.java index fce9234a3..7d46bcf20 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardLogic.java @@ -301,6 +301,17 @@ public class RidingSwardLogic{ User user = verifyUser(uid); // 配置 SRidingSwardConfig config = STableManager.getConfig(SRidingSwardConfig.class).get(1); + // 验证道具数量 + if (proto.getCostNum() > config.getMaxRaiseNum()[1] || proto.getCostNum() < config.getJoinCost()[1]){ + throw new ErrorCodeException(ErrorCode.ITEM_NOT_ENOUGH,"押注道具不满足最低或最高上限"); + } + // 道具消耗检验 + HashMap map = new HashMap<>(); + map.put(config.getMaxRaiseNum()[0],proto.getCostNum()); + boolean cost = ItemUtil.checkCost(user, map); + if (!cost){ + throw new ErrorCodeException(ErrorCode.ITEM_NOT_ENOUGH); + } // 投注记录,key:时间戳,value:竞猜记录信息 Map> recordMap = getRecordList(uid); // 获取下一场 @@ -312,17 +323,6 @@ public class RidingSwardLogic{ if (betNum >= config.getJoinCount()){ throw new ErrorCodeException(ErrorCode.REFRESH_WHEL_TIME_NOT); } - // 验证道具数量 - if (proto.getCostNum() > config.getMaxRaiseNum()[1] || proto.getCostNum() < config.getJoinCost()[1]){ - throw new ErrorCodeException(ErrorCode.ITEM_NOT_ENOUGH,"押注道具不满足最低或最高上限"); - } - // 道具消耗 - HashMap map = new HashMap<>(); - map.put(config.getMaxRaiseNum()[0],proto.getCostNum()); - boolean checkCost = ItemUtil.itemCost(user, map, BIReason.RIDING_SWARD_BET,0); - if (!checkCost){ - throw new ErrorCodeException(ErrorCode.ITEM_NOT_ENOUGH); - } RidingSwardRecord record = new RidingSwardRecord(nextTime,proto.getSwardId(),proto.getCostNum()); records.add(record); // 记录押注次数 @@ -343,6 +343,8 @@ public class RidingSwardLogic{ if (!records.isEmpty()){ RedisUtil.getInstence().putMapEntry(RedisKey.RIDING_SWARD_RECORD, String.valueOf(uid),String.valueOf(nextTime),records); } + // 道具消耗 + ItemUtil.itemCost(user, map, BIReason.RIDING_SWARD_BET,0); // 返回消息 sendRidingSwardInfo(uid); } From da8f356de5034ac80056cfd27730dd33f4920137 Mon Sep 17 00:00:00 2001 From: duhui Date: Fri, 15 Oct 2021 15:15:59 +0800 Subject: [PATCH 09/11] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=8E=92=E8=A1=8C?= =?UTF-8?q?=E6=A6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ljsd/jieling/tools/Utils.java | 31 +++- .../com/ljsd/jieling/db/redis/RedisUtil.java | 12 +- .../jieling/logic/activity/ActivityLogic.java | 2 +- .../logic/activity/ExpectRankActivity.java | 15 +- .../logic/activity/RidingSwardActivity.java | 70 ++++++---- .../logic/activity/SevenWorldActivity.java | 4 +- .../logic/ridingSward/RidingSwardLogic.java | 132 +++++++++++------- 7 files changed, 177 insertions(+), 89 deletions(-) diff --git a/netty/src/main/java/com/ljsd/jieling/tools/Utils.java b/netty/src/main/java/com/ljsd/jieling/tools/Utils.java index c7d6898f8..7597d1d00 100644 --- a/netty/src/main/java/com/ljsd/jieling/tools/Utils.java +++ b/netty/src/main/java/com/ljsd/jieling/tools/Utils.java @@ -4,8 +4,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.*; +import java.lang.reflect.Array; import java.security.MessageDigest; +import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Random; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -131,7 +134,12 @@ public class Utils { return cloneObj; } - public static int[][] changeList(List list){ + /** + * int数组list转二维数组 + * @param list + * @return + */ + public static int[][] getTwoArrayObject(List list){ int[][] objects = new int[list.size()][]; for (int i = 0; i < list.size(); i++) { objects[i] = list.get(i); @@ -139,4 +147,25 @@ public class Utils { return objects; } + /** + * map转二维数组 + */ + public static Object[][] getTwoArrayObject(Map map) { + Object[][] object = null; + if (map != null && !map.isEmpty()) { + int size = map.size(); + object = new Object[size][2]; + + Iterator iterator = map.entrySet().iterator(); + for (int i = 0; i < size; i++) { + Map.Entry entry = (Map.Entry) iterator.next(); + Object key = entry.getKey(); + Object value = entry.getValue(); + object[i][0] = key; + object[i][1] = value; + } + } + return object; + } + } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisUtil.java b/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisUtil.java index ae92c3297..9a7ee41fe 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisUtil.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisUtil.java @@ -1,28 +1,26 @@ package com.ljsd.jieling.db.redis; import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; import com.ljsd.GameApplication; import com.ljsd.common.mogodb.util.GlobalData; import com.ljsd.jieling.db.mongo.AreaManager; import com.ljsd.jieling.util.ConfigurableApplicationContextManager; -import org.springframework.data.redis.RedisConnectionFailureException; -import org.springframework.data.redis.core.*; -import org.springframework.data.redis.serializer.RedisSerializer; -import util.StringUtil; -import util.TimeUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.data.redis.RedisConnectionFailureException; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.ReturnType; +import org.springframework.data.redis.core.*; +import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.util.CollectionUtils; import redis.clients.jedis.Protocol; +import util.StringUtil; +import util.TimeUtils; import java.io.IOException; import java.lang.reflect.Type; import java.util.*; import java.util.concurrent.TimeUnit; -import java.util.function.BiFunction; import java.util.regex.Pattern; @SuppressWarnings("ALL") diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ActivityLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ActivityLogic.java index 6a3bbae2e..6fbda979e 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ActivityLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ActivityLogic.java @@ -1761,7 +1761,7 @@ public class ActivityLogic implements IEventHandler{ } } // 处理奖励 - int[][] rewards = Utils.changeList(list); + int[][] rewards = Utils.getTwoArrayObject(list); CommonProto.Drop.Builder drop = ItemUtil.dropPer(user, rewards, BIReason.QIMENDUNJIA_DRAW); // 事件分发 Poster.getPoster().dispatchEvent(new QiMenDunJiaEvent(user.getId(),activityId,num)); diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ExpectRankActivity.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ExpectRankActivity.java index 582d0a7f1..6646e9407 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ExpectRankActivity.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ExpectRankActivity.java @@ -1,8 +1,6 @@ package com.ljsd.jieling.logic.activity; -import com.ljsd.jieling.db.redis.RedisKey; -import com.ljsd.jieling.db.redis.RedisUtil; import com.ljsd.jieling.globals.Global; import com.ljsd.jieling.jbean.ActivityMission; import com.ljsd.jieling.jbean.ActivityProgressInfo; @@ -15,14 +13,19 @@ import com.ljsd.jieling.logic.rank.rankImpl.AbstractRank; import com.ljsd.jieling.network.server.ProtocolsManager; import com.ljsd.jieling.network.session.ISession; import com.ljsd.jieling.thread.ThreadManager; -import com.ljsd.jieling.util.AyncWorkerRunnable; import com.ljsd.jieling.util.AyyncWorker; import com.ljsd.jieling.util.ItemUtil; -import util.TimeUtils; -import config.*; +import config.SActivityRankingReward; +import config.SActivityRewardConfig; +import config.SErrorCodeEerverConfig; +import config.SGlobalActivity; import org.springframework.data.redis.core.ZSetOperations; +import util.TimeUtils; -import java.util.*; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; class ExpectRankActivity extends AbstractActivity { diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/RidingSwardActivity.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/RidingSwardActivity.java index f00286474..a82ffd40d 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/RidingSwardActivity.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/RidingSwardActivity.java @@ -5,12 +5,19 @@ import com.ljsd.jieling.globals.Global; import com.ljsd.jieling.logic.dao.root.User; import com.ljsd.jieling.logic.mail.MailLogic; import com.ljsd.jieling.logic.ridingSward.RidingSwardLogic; +import com.ljsd.jieling.logic.ridingSward.RidingSwardRecord; import config.SErrorCodeEerverConfig; -import rpc.protocols.ActivityProto; -import rpc.protocols.CommonProto; -import util.StringUtil; +import config.SRidingSwardConfig; +import manager.STableManager; import util.TimeUtils; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +/** + * @author hj + * + */ public class RidingSwardActivity extends AbstractActivity{ public RidingSwardActivity(int id) { @@ -18,28 +25,43 @@ public class RidingSwardActivity extends AbstractActivity{ } @Override - public void onActivityEndOnMySelf(User user) throws Exception { - // 处理一下数据 - RidingSwardLogic.getInstance().getRidingSwardRecord(user.getId()); - // 获取奖励内容 - ActivityProto.RidingSwardRewardRequest.Builder builder = ActivityProto.RidingSwardRewardRequest.newBuilder().setTime(0); - ActivityProto.RidingSwardRewardResponse reward = RidingSwardLogic.getInstance().getRidingSwardReward(user.getId(), builder.build()); - // 奖励长度 - int size = reward.getDrop().getItemlistList().size(); - int[][] drop = new int[size][]; - for (int i = 0; i < size; i++) { - CommonProto.Item item = reward.getDrop().getItemlist(i); - drop[i][0] = item.getItemId(); - drop[i][1] = (int)item.getItemNum(); + public void onActivityEndOnMySelf(User user){ + // 关闭活动 + RidingSwardLogic.getInstance().checkState(); + // 记录数据 + Map> list = RidingSwardLogic.getRecordList(user.getId()); + // 配置 + SRidingSwardConfig config = STableManager.getConfig(SRidingSwardConfig.class).get(1); + + HashMap map = new HashMap<>(); + for (Map.Entry> entry : list.entrySet()) { + for (RidingSwardRecord record : entry.getValue()) { + // 处理记录 + RidingSwardLogic.recordBuild(record,RidingSwardLogic.getRankBack()); + // 未领取的记录 + if (record.getState() == 0){ + Integer num = map.getOrDefault(config.getMaxRaiseNum()[0], 0); + map.put(config.getMaxRaiseNum()[0],num+record.getGetNum()); + record.setState(1); + } + } + // 更新数据 + RidingSwardLogic.putRecordList(user.getId(),entry.getKey(),entry.getValue()); } - // 奖励 - String rewards = StringUtil.parseArrayToString(drop); - // 标题 - String title = SErrorCodeEerverConfig.getI18NMessage("RidingSwordReward_mail_title"); - // 内容 - String content = SErrorCodeEerverConfig.getI18NMessage("RidingSwordReward_mail_txt"); - // 发送邮件 - MailLogic.getInstance().sendMail(user.getId(),title,content,rewards,TimeUtils.nowInt(),Global.MAIL_EFFECTIVE_TIME); + // 有未领取的奖励,发送邮件 + if (!map.isEmpty()){ + StringBuilder builder = new StringBuilder(); + for (Map.Entry entry : map.entrySet()) { + builder.append(entry.getKey()).append("#").append(entry.getValue()).append("|"); + } + String reward = builder.substring(0, builder.length() - 1); + // 标题和内容 + String title = SErrorCodeEerverConfig.getI18NMessage("RidingSwordReward_mail_title"); + String content = SErrorCodeEerverConfig.getI18NMessage("RidingSwordReward_mail_txt"); + // 发送邮件 + MailLogic.getInstance().sendMail(user.getId(),title,content,reward,TimeUtils.nowInt(),Global.MAIL_EFFECTIVE_TIME); + } + // 删除key RedisUtil.getInstence().rename(TimeUtils.ONE_DAY*3/1000,RidingSwardLogic.getRecordKey(user.getId())); } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/SevenWorldActivity.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/SevenWorldActivity.java index 2e5027546..a338fff80 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/SevenWorldActivity.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/SevenWorldActivity.java @@ -7,12 +7,10 @@ import com.ljsd.jieling.jbean.ActivityMission; import com.ljsd.jieling.jbean.ActivityProgressInfo; import com.ljsd.jieling.logic.activity.event.IEvent; import com.ljsd.jieling.logic.activity.event.Poster; -import com.ljsd.jieling.logic.activity.event.SevenWorldIntegralEvent; import com.ljsd.jieling.logic.activity.event.SuperBoxEvent; import com.ljsd.jieling.logic.dao.Item; import com.ljsd.jieling.logic.dao.UserManager; import com.ljsd.jieling.logic.dao.root.User; -import com.ljsd.jieling.logic.item.ItemLogic; import com.ljsd.jieling.logic.store.newRechargeInfo.bean.ReceiveWelfareBag; import com.ljsd.jieling.network.session.ISession; import com.ljsd.jieling.tools.Utils; @@ -142,7 +140,7 @@ public class SevenWorldActivity extends AbstractActivity { if (rewardList.isEmpty()){ throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE); } - int[][] rewards = Utils.changeList(rewardList); + int[][] rewards = Utils.getTwoArrayObject(rewardList); ItemUtil.drop(user, rewards, drop, BIReason.SEVEN_WORLD_TREASURE); reportTakeActivityReward(user,treasure.getTreasureReward(),missionId); // 更新数据库 diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardLogic.java index 7d46bcf20..96c2b3034 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardLogic.java @@ -62,6 +62,7 @@ public class RidingSwardLogic{ // 活动过期 if (TimeUtils.now() > endTime || TimeUtils.now() < startTime){ state = 0; + putRankBack(); } // 关闭中,不进行处理 if (state == 0){ @@ -265,7 +266,7 @@ public class RidingSwardLogic{ record.setState(1); } } - RedisUtil.getInstence().putMapEntry(RedisKey.RIDING_SWARD_RECORD, String.valueOf(uid),String.valueOf(entry.getKey()),entry.getValue()); + putRecordList(uid,entry.getKey(),entry.getValue()); } }else { // 单场领取 @@ -281,10 +282,10 @@ public class RidingSwardLogic{ record.setState(1); } } - RedisUtil.getInstence().putMapEntry(RedisKey.RIDING_SWARD_RECORD, String.valueOf(uid),String.valueOf(time),records); + putRecordList(uid,time,records); } // 奖励计算 - int[][] changeList = Utils.changeList(result); + int[][] changeList = Utils.getTwoArrayObject(result); CommonProto.Drop.Builder drop = ItemUtil.drop(user, changeList, BIReason.RIDING_SWARD_REWARD); return ActivityProto.RidingSwardRewardResponse.newBuilder().setDrop(drop).build(); } @@ -341,7 +342,7 @@ public class RidingSwardLogic{ throw new ErrorCodeException(ErrorCode.RIDING_SWARD_BET_TWO,"一轮最大押注两次"); } if (!records.isEmpty()){ - RedisUtil.getInstence().putMapEntry(RedisKey.RIDING_SWARD_RECORD, String.valueOf(uid),String.valueOf(nextTime),records); + putRecordList(uid,nextTime,records); } // 道具消耗 ItemUtil.itemCost(user, map, BIReason.RIDING_SWARD_BET,0); @@ -368,7 +369,7 @@ public class RidingSwardLogic{ * @return */ private CommonProto.RidingSwardLastRank getRidingSwardLastRank() throws ErrorCodeException { - Map map = RedisUtil.getInstence().getMapValues(RedisKey.RIDING_SWARD_RANK, "", Long.class, Integer.class); + Map map = getRankMap(); // 配置 SRidingSwardConfig config = STableManager.getConfig(SRidingSwardConfig.class).get(1); long time = 0; @@ -399,10 +400,6 @@ public class RidingSwardLogic{ List list = new ArrayList<>(); // 投注记录,key:时间戳,value:竞猜记录信息list Map> recordMap = getRecordList(uid); - // 比赛记录,key:场次时间戳,value:剧本id - Map rankMap = getRankMap(); - // 配置表 - Map resultMap = STableManager.getConfig(SRidingSwardResult.class); SRidingSwardConfig config = STableManager.getConfig(SRidingSwardConfig.class).get(1); // 异常可以投注两次,所以最多会有两次记录 for (Map.Entry> entry : recordMap.entrySet()) { @@ -412,37 +409,7 @@ public class RidingSwardLogic{ if (record.getTime() >= (nextTime-config.getTime()[1]*TimeUtils.ONE_SECOND)){ break; } - // -1是未计算过的参数,需要算值 - if (record.getState() == -1){ - // 根据场次获取剧本id - Integer scriptId = rankMap.get(record.getTime()); - if (scriptId == null){ - break; - } - // 剧本信息 - SRidingSwardResult swardResult = resultMap.get(scriptId); - int winnerId = 0; - for (int i = 0; i < swardResult.getResult().length; i++) { - if (swardResult.getResult()[i][0] == 1){ - winnerId = i+1; - break; - } - } - // 获胜剑id - record.setWinnerId(winnerId); - // 竞猜结果 - int result = winnerId == record.getBetSwardId()?1:0; - record.setResult(result); - // 可领取得奖励数量 - int getNum = (config.getLoseRate()/10000) * record.getBetNum(); - if (result == 1){ - getNum = record.getBetNum() * (config.getRateList()[winnerId-1]/10000); - } - record.setGetNum(getNum); - // 领取状态 - record.setState(0); - judge = true; - } + judge = recordBuild(record,getRankMap()); // 结果 CommonProto.RidingSwardRecord.Builder builder = CommonProto.RidingSwardRecord.newBuilder() .setTime(record.getTime())// 赛场时间 @@ -454,15 +421,55 @@ public class RidingSwardLogic{ .setResult(record.getResult()); // 输赢结果 list.add(builder.build()); } - // 更新缓存对象类型 if (judge){ - RedisUtil.getInstence().putMapEntry(RedisKey.RIDING_SWARD_RECORD, String.valueOf(uid),String.valueOf(entry.getKey()),entry.getValue()); + putRecordList(uid,entry.getKey(),entry.getValue()); } } return list; } + /** + * 记录数据处理 + */ + public static boolean recordBuild(RidingSwardRecord record,Map rankMap){ + // 配置表 + Map resultMap = STableManager.getConfig(SRidingSwardResult.class); + SRidingSwardConfig config = STableManager.getConfig(SRidingSwardConfig.class).get(1); + // 不需要处理的数据 + if (record.getState() != -1){ + return false; + } + // 根据场次获取剧本id + Integer scriptId = rankMap.get(record.getTime()); + if (scriptId == null){ + return false; + } + // 剧本信息 + SRidingSwardResult swardResult = resultMap.get(scriptId); + int winnerId = 0; + for (int i = 0; i < swardResult.getResult().length; i++) { + if (swardResult.getResult()[i][0] == 1){ + winnerId = i+1; + break; + } + } + // 获胜剑id + record.setWinnerId(winnerId); + // 竞猜结果 + int result = winnerId == record.getBetSwardId()?1:0; + record.setResult(result); + // 可领取得奖励数量 + int getNum = (config.getLoseRate()/10000) * record.getBetNum(); + if (result == 1){ + getNum = record.getBetNum() * (config.getRateList()[winnerId-1]/10000); + } + record.setGetNum(getNum); + // 领取状态 + record.setState(0); + return true; + } + /** * 获取当前竞猜信息 * @param uid @@ -484,13 +491,43 @@ public class RidingSwardLogic{ return list; } + /** + * 获取排行榜 + * @return + */ + public static Map getRankMap(){ + Map map = RedisUtil.getInstence().getMapValues(RedisKey.RIDING_SWARD_RANK, "", Long.class, Integer.class); + if (map == null){ + return new HashMap<>(); + } + return map; + } + + public static String getRankKey(){ + return RedisUtil.getInstence().getKey(RedisKey.RIDING_SWARD_RANK, ""); + } + + /** + * 排行榜备份 + */ + public void putRankBack(){ + // 获取当前排行榜数据 + Map rankMap = RedisUtil.getInstence().getMapValues(RedisKey.RIDING_SWARD_RANK, "", String.class, Integer.class); + // 备份数据 + RedisUtil.getInstence().putMapEntrys(RedisKey.RIDING_SWARD_RANK, "BACK", rankMap); + // 设置过期时间 + String key = RedisUtil.getInstence().getKey(RedisKey.RIDING_SWARD_RANK, "BACK"); + RedisUtil.getInstence().expire(key, TimeUtils.ONE_DAY*15/1000); + // 删除旧榜 + RedisUtil.getInstence().del(getRankKey()); + } /** * 获取排行榜 * @return */ - private Map getRankMap(){ - Map map = RedisUtil.getInstence().getMapValues(RedisKey.RIDING_SWARD_RANK, "", Long.class, Integer.class); + public static Map getRankBack(){ + Map map = RedisUtil.getInstence().getMapValues(RedisKey.RIDING_SWARD_RANK, "BACK", Long.class, Integer.class); if (map == null){ return new HashMap<>(); } @@ -500,7 +537,7 @@ public class RidingSwardLogic{ /** * 投注记录,key:场次时间戳,value:竞猜记录信息 */ - private Map> getRecordList(int uid){ + public static Map> getRecordList(int uid){ Type valueType = new TypeToken>() {}.getType(); Map> map = RedisUtil.getInstence().getMapValues(RedisKey.RIDING_SWARD_RECORD, String.valueOf(uid), Long.class, valueType); if (map == null){ @@ -509,9 +546,10 @@ public class RidingSwardLogic{ return map; } - public static String getRankKey(){ - return RedisUtil.getInstence().getKey(RedisKey.RIDING_SWARD_RANK, ""); + public static void putRecordList(int uid,long time,List records){ + RedisUtil.getInstence().putMapEntry(RedisKey.RIDING_SWARD_RECORD, String.valueOf(uid),String.valueOf(time),records); } + public static String getRecordKey(int uid){ return RedisUtil.getInstence().getKey(RedisKey.RIDING_SWARD_RECORD, String.valueOf(uid)); } From 082952c1cca606f3c69c585b87f4614670f894da Mon Sep 17 00:00:00 2001 From: duhui Date: Fri, 15 Oct 2021 15:55:02 +0800 Subject: [PATCH 10/11] =?UTF-8?q?=E8=8E=B7=E5=BE=97=E9=81=93=E5=85=B7?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ljsd/jieling/logic/ridingSward/RidingSwardLogic.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardLogic.java index 96c2b3034..834bc1088 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardLogic.java @@ -460,11 +460,11 @@ public class RidingSwardLogic{ int result = winnerId == record.getBetSwardId()?1:0; record.setResult(result); // 可领取得奖励数量 - int getNum = (config.getLoseRate()/10000) * record.getBetNum(); + double getNum = (config.getLoseRate()/10000.0) * record.getBetNum(); if (result == 1){ - getNum = record.getBetNum() * (config.getRateList()[winnerId-1]/10000); + getNum = record.getBetNum() * (config.getRateList()[winnerId-1]/10000.0); } - record.setGetNum(getNum); + record.setGetNum((int) Math.ceil(getNum)); // 领取状态 record.setState(0); return true; From b60d589ee93efbc29d8f762fd4df91a517f35399 Mon Sep 17 00:00:00 2001 From: duhui Date: Tue, 19 Oct 2021 00:13:21 +0800 Subject: [PATCH 11/11] =?UTF-8?q?=E5=BE=A1=E5=89=91=E8=A1=8C=E5=89=A7?= =?UTF-8?q?=E6=9C=AC=E4=B8=80=E5=91=A8=E6=9C=9F=E4=B8=80=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../logic/ridingSward/RidingSwardLogic.java | 14 +++++++------- .../com/ljsd/jieling/thread/task/MinuteTask.java | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardLogic.java index 834bc1088..f1592cd61 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/ridingSward/RidingSwardLogic.java @@ -113,24 +113,24 @@ public class RidingSwardLogic{ TreeMap treeMap = new TreeMap<>(STableManager.getConfig(SRidingSwardResult.class)); // 开始时间计算 - boolean sameDay = TimeUtils.isSameDay(TimeUtils.now(), startTime); - long start = sameDay ? startTime : TimeUtils.getTodayZero(); +// boolean sameDay = TimeUtils.isSameDay(TimeUtils.now(), startTime); +// long start = sameDay ? startTime : TimeUtils.getTodayZero(); // 结束时间计算 - boolean sameDay2 = TimeUtils.isSameDay(TimeUtils.now(), endTime); - long end = sameDay2 ? endTime : TimeUtils.getTomorrowZero(); +// boolean sameDay2 = TimeUtils.isSameDay(TimeUtils.now(), endTime); +// long end = sameDay2 ? endTime : TimeUtils.getTomorrowZero(); // 投注时间获取 long bet = config.getTime()[0] * TimeUtils.ONE_SECOND; // 比赛时间获取 long competition = config.getTime()[1] * TimeUtils.ONE_SECOND; // 今日比赛次数 - long num = (end - start) / (bet + competition); + long num = (endTime - startTime) / (bet + competition); // 总权重 int sum = treeMap.values().stream().mapToInt(SRidingSwardResult::getRate).sum(); // map存储结果 HashMap result = new HashMap<>(); - long time = start; + long time = startTime; for (int i = 0; i < num; i++) { // 比赛开始时间 long competitionIng = time += bet; @@ -151,7 +151,7 @@ public class RidingSwardLogic{ redisUtil.putMapEntrys(RedisKey.RIDING_SWARD_RANK, "", result); LOGGER.info("御剑行日志:结果:{}", result.toString()); // 覆盖锁 - redisUtil.set(key,String.valueOf(end)); + redisUtil.set(key,String.valueOf(endTime)); } /** diff --git a/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java b/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java index 482b46dcd..a80be4d5f 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java @@ -214,7 +214,7 @@ public class MinuteTask extends Thread { // 助战 HelpHeroLogic.getInstance().zeroClearRedisHelp(); // 御剑行创建新脚本 - RidingSwardLogic.getInstance().createExecuteScript(); +// RidingSwardLogic.getInstance().createExecuteScript(); // 公会信息处理 Map guildInfoMap = GuilidManager.guildInfoMap;