diff --git a/gamecommon/src/main/java/util/TimeUtils.java b/gamecommon/src/main/java/util/TimeUtils.java index 3df7e48de..0a23866ae 100644 --- a/gamecommon/src/main/java/util/TimeUtils.java +++ b/gamecommon/src/main/java/util/TimeUtils.java @@ -767,6 +767,20 @@ public class TimeUtils { return c.getTimeInMillis(); } + /** + * 获取指定时间,几天后的零点 + * @return + */ + public static long getTomorrowZero(String time, int day) { + Calendar c = Calendar.getInstance(); + c.setTimeInMillis(stringToTimeLong2(time)); + c.add(Calendar.DATE, day); + c.set(Calendar.HOUR_OF_DAY, 0); + c.set(Calendar.MINUTE, 0); + c.set(Calendar.SECOND, 0); + return c.getTimeInMillis(); + } + /** * 获取明天零点 * @return 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 11bb0b76b..6ba03d888 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 @@ -379,6 +379,7 @@ public class RedisKey { public static final String CROSS_LINGMAISECRET_RECORD = "CROSS_LINGMAISECRET_RECORD";//灵脉记录 public static final String CROSS_LINGMAI_RANK_PERSON = "CROSS_LINGMAI_RANK_PERSON";//灵脉积分排行 + public static final String GM_ACTIVITY_INFO = "GM_ACTIVITY_INFO";//GM活动信息 public static Set familyKey = 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 e0b70f067..89010589e 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 @@ -1394,6 +1394,18 @@ public class RedisUtil { return result; } + public Map getMapValues2(String type,String key,Class keyClazz,Class valueClazz){ + Map result = new HashMap<>(); + String rkey = getKey(type, key, false); + Map entries = redisTemplate.opsForHash().entries(rkey); + for(Map.Entry item : entries.entrySet()){ + Object key1 = item.getKey(); + Object value = item.getValue(); + result.put(gson.fromJson(gson.toJson(key1),keyClazz),gson.fromJson(value.toString(),valueClazz)); + } + return result; + } + public Map getMapValues(String key,Class keyClazz,Class valueClazz){ Map result = new HashMap<>(); Map entries = redisTemplate.opsForHash().entries(key); diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/GetPlayerInfoHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/GetPlayerInfoHandler.java index 00848f1b0..72c45c50c 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/handler/GetPlayerInfoHandler.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/GetPlayerInfoHandler.java @@ -20,7 +20,6 @@ import com.ljsd.jieling.logic.activity.ActivityLogic; import com.ljsd.jieling.logic.activity.ActivityTypeEnum; import com.ljsd.jieling.logic.activity.ChoiceDrawCardActivity; import com.ljsd.jieling.logic.activity.LimitRandomSpecialMonsterActivityNew; -import com.ljsd.jieling.logic.activity.activityLogic.GmActivityLogic; import com.ljsd.jieling.logic.activity.event.HeroUpStarEvent; import com.ljsd.jieling.logic.activity.event.Poster; import com.ljsd.jieling.logic.activity.event.SaveHeroForceEvent; @@ -83,7 +82,6 @@ public class GetPlayerInfoHandler extends BaseHandler{ PlayerLogic.getInstance().checkOldMonthCard(user); ActivityLogic.getInstance().flushForLogin(user,iSession); GlobalDataManaager.checkNeedReFlush(iSession,user,null); - GmActivityLogic.getInstance().updateGmActivity(user); BuyGoodsNewLogic.refreshWelfareState(user); user.getUserMissionManager().onGameEvent(user, GameEvent.LOGIN_GAME,0); long now = TimeUtils.now(); diff --git a/serverlogic/src/main/java/com/ljsd/jieling/jbean/gm/GmActivity.java b/serverlogic/src/main/java/com/ljsd/jieling/jbean/gm/GmActivity.java index 22b689e71..7656b758d 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/jbean/gm/GmActivity.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/jbean/gm/GmActivity.java @@ -1,6 +1,7 @@ package com.ljsd.jieling.jbean.gm; import com.ljsd.common.mogodb.MongoBase; +import com.ljsd.jieling.db.mongo.gmActivity.ARBActivity; import com.ljsd.jieling.logic.dao.root.User; import java.util.HashMap; @@ -16,14 +17,19 @@ public class GmActivity extends MongoBase { private String id; private int type; private int value; - private String startTime; - private String endTime; public GmActivity() { //绑定关系 this.setRootCollection(User._COLLECTION_NAME); } + public GmActivity(ARBActivity arbActivity) { + this.id = arbActivity.getId(); + this.type = arbActivity.getType(); + //绑定关系 + this.setRootCollection(User._COLLECTION_NAME); + } + public String getId() { return id; } @@ -64,22 +70,4 @@ public class GmActivity extends MongoBase { this.value = value; updateString("value",value); } - - public String getStartTime() { - return startTime; - } - - public void setStartTime(String startTime) { - this.startTime = startTime; - updateString("startTime",startTime); - } - - public String getEndTime() { - return endTime; - } - - public void setEndTime(String endTime) { - this.endTime = endTime; - updateString("endTime",endTime); - } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/jbean/gm/GmActivityManager.java b/serverlogic/src/main/java/com/ljsd/jieling/jbean/gm/GmActivityManager.java index 32db7c916..f74d66de0 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/jbean/gm/GmActivityManager.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/jbean/gm/GmActivityManager.java @@ -13,8 +13,6 @@ import java.util.HashMap; public class GmActivityManager extends MongoBase { private HashMap activityMap = new HashMap<>(); - private int updateVersion; - public HashMap getActivityMap() { return activityMap; } @@ -33,13 +31,4 @@ public class GmActivityManager extends MongoBase { this.activityMap.remove(activityId); updateString("activityMap",activityMap); } - - public int getUpdateVersion() { - return updateVersion; - } - - public void setUpdateVersion(int updateVersion) { - this.updateVersion = updateVersion; - updateString("updateVersion",updateVersion); - } } \ No newline at end of file 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 ba34d4220..7e6c62e79 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobalDataManaager.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobalDataManaager.java @@ -304,8 +304,7 @@ public class GlobalDataManaager implements IManager { new SummonTreasureHandler(); new ArchitectureUnLockHandler(); new SaveHeroForceEventHandler(); - // 四灵试炼转移数据,只执行一次 -// FourChallengeLogic.getInstance().redisToMongoDB(); + new GmActivityLogic(); ChampionshipLogic.minuteCheck(true); GuildFightLogic.minuteCheckForCarFight(); } catch (Exception e) { 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 990d10018..d65387d19 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 @@ -830,7 +830,7 @@ public class ActivityLogic implements IEventHandler{ } - public void checkActivityIsFinish(User user) { + public void checkActivityIsFinish(User user) throws Exception { ActivityManager activityManager = user.getActivityManager(); Map activityMissionMap = activityManager.getActivityMissionMap(); for (Map.Entry item : activityMissionMap.entrySet()) { @@ -839,9 +839,6 @@ public class ActivityLogic implements IEventHandler{ } ActivityMission activityMission = item.getValue(); //7201活动弃用 - if(activityMission == null){ - continue; - } if(item.getKey() == 7201){ continue; } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/activityLogic/GmActivityLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/activityLogic/GmActivityLogic.java index b021bb492..b57151561 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/activityLogic/GmActivityLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/activityLogic/GmActivityLogic.java @@ -10,20 +10,14 @@ import com.ljsd.jieling.globals.Global; import com.ljsd.jieling.jbean.gm.GmActivity; import com.ljsd.jieling.jbean.gm.GmActivityManager; import com.ljsd.jieling.jbean.gm.GmMission; -import com.ljsd.jieling.logic.OnlineUserManager; import com.ljsd.jieling.logic.activity.IEventHandler; import com.ljsd.jieling.logic.activity.event.AutoRechargeBackEvent; import com.ljsd.jieling.logic.activity.event.IEvent; import com.ljsd.jieling.logic.activity.event.Poster; -import com.ljsd.jieling.logic.activity.event.SuperBoxEvent; import com.ljsd.jieling.logic.dao.UserManager; import com.ljsd.jieling.logic.dao.root.User; import com.ljsd.jieling.logic.mail.MailLogic; -import com.ljsd.jieling.network.server.ProtocolsManager; -import com.ljsd.jieling.network.session.ISession; -import com.ljsd.jieling.util.AyyncWorker; import com.ljsd.jieling.util.ItemUtil; -import config.SErrorCodeEerverConfig; import config.SRechargeCommodityNewConfig; import org.bson.types.ObjectId; import org.slf4j.Logger; @@ -34,6 +28,7 @@ import org.springframework.data.mongodb.core.query.Query; import util.StringUtil; import util.TimeUtils; +import java.text.ParseException; import java.util.*; import java.util.stream.Collectors; @@ -59,8 +54,6 @@ public class GmActivityLogic implements IEventHandler { public final static GmActivityLogic instance = new GmActivityLogic(); } - private static int gameUpdateVersion = 0; - @Override public void onEvent(IEvent event) throws Exception { if (!(event instanceof AutoRechargeBackEvent)){ @@ -76,54 +69,83 @@ public class GmActivityLogic implements IEventHandler { } User user = UserManager.getUser(rechargeBackEvent.getUserId()); GmActivityManager manager = user.getGmActivityManager(); - HashMap activityMap = manager.getActivityMap(); - // 邮件信息 - String title = SErrorCodeEerverConfig.getI18NMessage("zidongfanli_mail_title"); - String content = SErrorCodeEerverConfig.getI18NMessage("zidongfanli_mail_text"); + Map arbActivityMap = getArbActivity(); - for (Map.Entry entry : activityMap.entrySet()) { - GmActivity gmActivity = entry.getValue(); + for (Map.Entry entry : arbActivityMap.entrySet()) { + ARBActivity arbActivity = entry.getValue(); // 时间校验 - long start = TimeUtils.dateFormat2(gmActivity.getStartTime()); - long end = TimeUtils.dateFormat2(gmActivity.getEndTime()); + long start = getStartTime(arbActivity); + long end = getEndTime(arbActivity); long now = TimeUtils.now(); if (start > now || end <= now){ continue; } - List rewards = new ArrayList<>(); + // 获取全部活动信息 + GmActivity gmActivity = manager.getActivityMap().getOrDefault(entry.getKey(), new GmActivity(arbActivity)); switch (gmActivity.getType()){ - case 1: - case 3: - case 5://单笔累充,多日累充,永久大充 - getDefaultReward(gmActivity,config.getPrice(),rewards); - break; case 2://妖晶返利 - getRewardToMonsterCurrencyBack(gmActivity,config.getPrice(),rewards); + getRewardToMonsterCurrencyBack(user, gmActivity,config.getPrice()); break; case 4://单笔充值 - getRewardToSingleRecharge(gmActivity,config.getPrice(),rewards); + getRewardToSingleRecharge(user, gmActivity,config.getPrice()); break; - default: - LOGGER.error("充值返利,未找到得活动类型,uid:{}, activityId:{}", user.getId(), gmActivity.getId()); + default://1、3、5、6(单笔累充,多日累充,永久大充,开服首日累充) + getDefaultReward(user, gmActivity,config.getPrice()); continue; } manager.putActivityMap(gmActivity.getId(),gmActivity); - // 验证奖励非空 - String mailReward = ItemUtil.getMailReward(rewards); - if (StringUtil.isEmpty(mailReward)){ - continue; - } - MailLogic.getInstance().sendMail(user.getId(),title,content,mailReward,TimeUtils.nowInt(),Global.MAIL_EFFECTIVE_TIME); } } + /** + * 获取开始时间 + * @param arbActivity + * @return + * @throws ParseException + */ + private long getStartTime(ARBActivity arbActivity) throws ParseException { + long start = TimeUtils.dateFormat2(arbActivity.getStartTime()); + if (arbActivity.getType() == 6){ + start = TimeUtils.stringToTimeLong2(GameApplication.serverConfig.getOpenTime()); + } + return start; + } + + /** + * 获取结束时间 + * @param arbActivity + * @return + * @throws ParseException + */ + private long getEndTime(ARBActivity arbActivity) throws ParseException { + long end = TimeUtils.dateFormat2(arbActivity.getEndTime()); + if (arbActivity.getType() == 6){ + end = TimeUtils.getTomorrowZero(GameApplication.serverConfig.getOpenTime(),1); + } + return end; + } + + /** + * 获取gm活动 + * @return + */ + private Map getArbActivity(){ + HashMap map = new HashMap<>(); + // 单属于本服的活动 + Map arbActivityMap = RedisUtil.getInstence().getMapValues2(RedisKey.GM_ACTIVITY_INFO, String.valueOf(GameApplication.serverId), String.class, ARBActivity.class); + map.putAll(arbActivityMap); + // 全部服务器的活动 + Map allActivityMap = RedisUtil.getInstence().getMapValues2(RedisKey.GM_ACTIVITY_INFO, "0", String.class, ARBActivity.class); + map.putAll(allActivityMap); + return map; + } + /** * 默认奖励 * @param gmActivity * @param price - * @param rewards */ - private void getDefaultReward(GmActivity gmActivity, double price, List rewards){ + private void getDefaultReward(User user, GmActivity gmActivity, double price) throws Exception { List gmMissionList = findAllGmMission(gmActivity.getId()); int num = gmActivity.getValue() + (int) price; for (ARBMission arbMission : gmMissionList) { @@ -136,8 +158,11 @@ public class GmActivityLogic implements IEventHandler { if (num < arbMission.getRechargeNum()){ continue; } - // 奖励 - rewards.add(arbMission.getReward()); + // 发邮件 + String mailReward = ItemUtil.getMailReward(arbMission.getReward()); + if (!StringUtil.isEmpty(mailReward)){ + MailLogic.getInstance().sendMail(user.getId(),arbMission.getActivity().getName(),arbMission.getTitle(),mailReward,TimeUtils.nowInt(),Global.MAIL_EFFECTIVE_TIME); + } // 记录到库 gmMission.setId(arbMission.getId()); gmMission.setState(1); @@ -150,9 +175,8 @@ public class GmActivityLogic implements IEventHandler { * 单笔充值奖励 * @param gmActivity * @param price - * @param rewards */ - private void getRewardToSingleRecharge(GmActivity gmActivity, double price, List rewards){ + private void getRewardToSingleRecharge(User user, GmActivity gmActivity, double price) throws Exception { List gmMissionList = findAllGmMission(gmActivity.getId()); for (ARBMission arbMission : gmMissionList) { GmMission gmMission = gmActivity.getMissionMap().getOrDefault(arbMission.getId(), new GmMission()); @@ -164,8 +188,11 @@ public class GmActivityLogic implements IEventHandler { if (price != arbMission.getRechargeNum()){ continue; } - // 奖励 - rewards.add(arbMission.getReward()); + // 发邮件 + String mailReward = ItemUtil.getMailReward(arbMission.getReward()); + if (!StringUtil.isEmpty(mailReward)){ + MailLogic.getInstance().sendMail(user.getId(),arbMission.getActivity().getName(),arbMission.getTitle(),mailReward,TimeUtils.nowInt(),Global.MAIL_EFFECTIVE_TIME); + } // 记录到库 gmMission.setId(arbMission.getId()); gmMission.setState(1); @@ -177,9 +204,8 @@ public class GmActivityLogic implements IEventHandler { * 妖晶返利奖励 * @param gmActivity * @param price - * @param rewards */ - private void getRewardToMonsterCurrencyBack(GmActivity gmActivity, double price, List rewards){ + private void getRewardToMonsterCurrencyBack(User user, GmActivity gmActivity, double price) throws Exception { List gmMissionList = findAllGmMission(gmActivity.getId()); List arbMissions = gmMissionList.stream().sorted(Comparator.comparing(ARBMission::getSort)).collect(Collectors.toList()); int num = gmActivity.getValue() + (int) price; @@ -205,7 +231,12 @@ public class GmActivityLogic implements IEventHandler { int rewardNum = (int) (arbMission.getBackRatio()/100d*1000*min); // 返利妖晶 int[][] reward = {{16,rewardNum}}; - rewards.add(reward); + + // 发邮件 + String mailReward = ItemUtil.getMailReward(reward); + if (!StringUtil.isEmpty(mailReward)){ + MailLogic.getInstance().sendMail(user.getId(),arbMission.getActivity().getName(),arbMission.getTitle(),mailReward,TimeUtils.nowInt(),Global.MAIL_EFFECTIVE_TIME); + } // 档位信息更新 gmMission.setId(arbMission.getId()); if (num - min > 0){ @@ -218,46 +249,20 @@ public class GmActivityLogic implements IEventHandler { } } - /** - * 校验活动开关 - * @param user - */ - public void updateGmActivity(User user){ - GmActivityManager gmActivityManager = user.getGmActivityManager(); - int version = getRedisUpdateVersion(); - if (gmActivityManager.getUpdateVersion() == version){ - return; - } - List list = findServerActivityList(String.valueOf(GameApplication.serverId)); - HashMap activityMap = gmActivityManager.getActivityMap(); - // 删除不存在得活动 - Set gmKeys = list.stream().map(ARBActivity::getId).collect(Collectors.toSet()); - Set gameKeys = new HashSet<>(activityMap.keySet()); - for (String key : gameKeys) { - if (!gmKeys.contains(key)){ - gmActivityManager.removeActivity(key); - } - } - // 更新活动信息 - for (ARBActivity arbActivity : list) { - GmActivity gmActivity = activityMap.getOrDefault(arbActivity.getId(),new GmActivity()); - gmActivity.setId(arbActivity.getId()); - gmActivity.setType(arbActivity.getType()); - gmActivity.setStartTime(arbActivity.getStartTime()); - gmActivity.setEndTime(arbActivity.getEndTime()); - gmActivityManager.putActivityMap(gmActivity.getId(),gmActivity); - } - gmActivityManager.setUpdateVersion(version); - } - /** * 零点更新活动信息 * @param user */ public void zeroUpdateGmActivity(User user){ - updateGmActivity(user); + Map arbActivityMap = getArbActivity(); GmActivityManager manager = user.getGmActivityManager(); for (GmActivity gmActivity : manager.getActivityMap().values()) { + ARBActivity arbActivity = arbActivityMap.get(gmActivity.getId()); + // 活动已经从gm上删除了,在这里删除数据库中的 + if (arbActivity == null){ + manager.removeActivity(gmActivity.getId()); + continue; + } // 单笔累充和妖晶返利每日清零 if (gmActivity.getType() == 1 || gmActivity.getType() == 2){ gmActivity.setValue(0); @@ -266,35 +271,11 @@ public class GmActivityLogic implements IEventHandler { } } - /** - * 每分钟处理 - */ - public static void minuteTask(){ - int version = getRedisUpdateVersion(); - if (gameUpdateVersion == version){ - return; - } - gameUpdateVersion = version; - try { - for (ISession session : OnlineUserManager.sessionMap.values()) { - User user = UserManager.getUser(session.getUid()); - AyyncWorker ayyncWorker = new AyyncWorker(user, true, user1 -> { - GmActivityLogic.getInstance().updateGmActivity(user); - }); - ProtocolsManager.getInstance().updateAyncWorker(ayyncWorker); - } - MongoUtil.getInstence().lastUpdate(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - public List findAllGmActivity() { MongoTemplate coreMonoTemplate = MongoUtil.getCoreMongoTemplate(); return coreMonoTemplate.findAll(ARBActivity.class); } - public List findServerActivityList(String serverId) { List resultList = new ArrayList<>(); for (ARBActivity activity : findAllGmActivity()) { @@ -311,16 +292,4 @@ public class GmActivityLogic implements IEventHandler { return coreMonoTemplate.find(query, ARBMission.class); } - /** - * 从redis获取更新号码(秒级时间戳格式) - * @return - */ - public static int getRedisUpdateVersion(){ - String updateVersion = (String) RedisUtil.getInstence().get(RedisKey.GM_ACTIVITY_UPDATE); - if (updateVersion == null){ - return 0; - } - return Integer.parseInt(updateVersion); - } - } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/player/PlayerLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/player/PlayerLogic.java index 2badc229d..c6781796b 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/player/PlayerLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/player/PlayerLogic.java @@ -1992,7 +1992,7 @@ public class PlayerLogic { return 0; } int lv = 0; - List list = typeMap.values().stream().collect(Collectors.toList()); + List list = new ArrayList<>(typeMap.values()); Item item = user.getItemManager().getItem(list.get(0).getExperience()[0]); long num = Optional.ofNullable(item).map(Item::getItemNum).orElse(0L); for (SPrestigeConfig value : list) { 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 878715004..e0e23fc28 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 @@ -175,13 +175,6 @@ public class MinuteTask extends Thread { LOGGER.error("跨服排行榜初始化异常,Exception::=>{}",e.toString()); } - try { - GmActivityLogic.minuteTask(); - }catch (Exception e){ - e.printStackTrace(); - LOGGER.error("自动返利初始化异常,Exception::=>{}",e.toString()); - } - try { ArenaLogic.getInstance().worldSendReward(); }catch (Exception e){