From 258c70642c059461cde623557acf9c9982e5e4b7 Mon Sep 17 00:00:00 2001 From: zhangshanxue Date: Thu, 12 Sep 2019 18:06:28 +0800 Subject: [PATCH 1/2] cdk --- .../com/ljsd/common/mogodb/MongoConfig.java | 20 ++- .../main/java/com/ljsd/GameApplication.java | 3 + .../java/com/ljsd/jieling/core/CoreLogic.java | 52 +++++++ .../com/ljsd/jieling/db/mongo/MongoUtil.java | 22 +-- .../com/ljsd/jieling/db/redis/RedisKey.java | 2 + .../com/ljsd/jieling/db/redis/RedisUtil.java | 3 +- .../jieling/handler/LoginRequestHandler.java | 5 +- .../handler/core/ExchangeCdkHandler.java | 124 ++++++++++++++++ .../com/ljsd/jieling/logic/dao/CdkInfo.java | 42 ++++++ .../ljsd/jieling/logic/dao/CdkUseInfo.java | 76 ++++++++++ .../ljsd/jieling/logic/dao/PlayerManager.java | 11 ++ .../com/ljsd/jieling/logic/dao/SCdkInfo.java | 133 ++++++++++++++++++ .../ljsd/jieling/logic/dao/UserManager.java | 11 +- .../ljsd/jieling/thread/task/MinuteTask.java | 2 + .../java/com/ljsd/jieling/util/UUIDEnum.java | 3 +- 15 files changed, 489 insertions(+), 20 deletions(-) create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/core/CoreLogic.java create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/handler/core/ExchangeCdkHandler.java create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/logic/dao/CdkInfo.java create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/logic/dao/CdkUseInfo.java create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/logic/dao/SCdkInfo.java diff --git a/common/src/main/java/com/ljsd/common/mogodb/MongoConfig.java b/common/src/main/java/com/ljsd/common/mogodb/MongoConfig.java index 514f01758..b14f0bf77 100644 --- a/common/src/main/java/com/ljsd/common/mogodb/MongoConfig.java +++ b/common/src/main/java/com/ljsd/common/mogodb/MongoConfig.java @@ -33,6 +33,9 @@ public class MongoConfig { @Value("${spring.data.mongodb.uri}") private String MONGO_URI; + @Value("${spring.data.mongodbcore.uri}") + private String MONGO_CORE_URI; + // 覆盖默认的MongoDbFactory @Bean @@ -72,8 +75,23 @@ public class MongoConfig { return new MongoTemplate(this.mongoDbFactory(), this.mappingMongoConverter1()); } - @Bean + @Bean(name = "LjsdMongoTemplate") public LjsdMongoTemplate ljsdMongoTemplate() throws Exception { return new LjsdMongoTemplate(this.mongoTemplate()); } + + /** + * 默认简单配置 查询core配置 + * @return + * @throws UnknownHostException + */ + @Bean + public MongoDbFactory dbFactory2() throws UnknownHostException { + return new SimpleMongoDbFactory(new MongoClientURI(MONGO_CORE_URI)); + } + + @Bean(name = "coreMongoTemplate") + public MongoTemplate coreMongoTemplate() throws Exception { + return new MongoTemplate(dbFactory2()); + } } diff --git a/serverlogic/src/main/java/com/ljsd/GameApplication.java b/serverlogic/src/main/java/com/ljsd/GameApplication.java index be1aa93ee..b826587ac 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.ServerConfig; import com.ljsd.jieling.config.json.CoreSettings; import com.ljsd.jieling.config.json.ServerConfiguration; import com.ljsd.jieling.config.json.ServerProperties; +import com.ljsd.jieling.core.CoreLogic; import com.ljsd.jieling.db.mongo.MongoUtil; import com.ljsd.jieling.db.redis.RedisUtil; import com.ljsd.jieling.handler.BaseHandler; @@ -111,6 +112,8 @@ public class GameApplication { KeyGenUtils.setMachineNum(serverConfiguration.getServerProperties().getNum()); ActivityLogic.getInstance().checkActiviyStatus(); + //初始化cdk + CoreLogic.getInstance().checkCoreCdk(); ThriftPoolUtils.getInstance().initContext(configurableApplicationContext); GlobalDataManaager.getInstance().whenServerStart(configurableApplicationContext); HeroLogic.getInstance().afterSet(); diff --git a/serverlogic/src/main/java/com/ljsd/jieling/core/CoreLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/core/CoreLogic.java new file mode 100644 index 000000000..92a226735 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/core/CoreLogic.java @@ -0,0 +1,52 @@ +package com.ljsd.jieling.core; + +import com.ljsd.jieling.db.mongo.MongoUtil; +import com.ljsd.jieling.logic.dao.SCdkInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class CoreLogic { + + private static final Logger LOGGER = LoggerFactory.getLogger(CoreLogic.class); + + private Map sCdkInfosCacheMap = new HashMap<>(); + + private CoreLogic() {} + + public static CoreLogic getInstance() { + return Instance.instance; + } + + public static class Instance { + public final static CoreLogic instance = new CoreLogic(); + } + + + public void checkCoreCdk() throws Exception{ + try { + List all = MongoUtil.getCoreMongoTemplate().findAll(SCdkInfo.class); + if(!all.isEmpty()){ + Map sCdkInfosMap = new HashMap<>(all.size()); + for(SCdkInfo sCdkInfo: all){ + sCdkInfosMap.put(sCdkInfo.getId(),sCdkInfo); + } + sCdkInfosCacheMap = sCdkInfosMap; + } + }catch (Exception e){ + LOGGER.error("cdkErr:"+e.toString()); + } + + } + + public Map getsCdkInfosCacheMap() { + return sCdkInfosCacheMap; + } + + public void setsCdkInfosCacheMap(Map sCdkInfosCacheMap) { + this.sCdkInfosCacheMap = sCdkInfosCacheMap; + } +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/db/mongo/MongoUtil.java b/serverlogic/src/main/java/com/ljsd/jieling/db/mongo/MongoUtil.java index 490aed682..e5f7adcd0 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/db/mongo/MongoUtil.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/db/mongo/MongoUtil.java @@ -2,24 +2,17 @@ package com.ljsd.jieling.db.mongo; import com.google.gson.Gson; import com.ljsd.common.mogodb.LjsdMongoTemplate; -import com.ljsd.common.mogodb.test.pojo.PlayerForTest; -import com.ljsd.jieling.logic.dao.PlayerManager; import com.ljsd.jieling.logic.dao.root.User; import com.ljsd.jieling.util.MathUtils; -import com.mongodb.DBObject; -import com.mongodb.MongoClientURI; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.data.mongodb.core.MongoTemplate; -import org.springframework.data.mongodb.core.SimpleMongoDbFactory; -import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver; -import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper; -import org.springframework.data.mongodb.core.convert.MappingMongoConverter; -import org.springframework.data.mongodb.core.mapping.MongoMappingContext; import org.springframework.data.mongodb.core.query.Criteria; -import org.springframework.data.mongodb.core.query.Field; import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Component; import java.net.UnknownHostException; import java.util.List; @@ -47,9 +40,12 @@ public class MongoUtil { private LjsdMongoTemplate myMongoTemplate; + private MongoTemplate coreMongoTemplate; + public void init(ConfigurableApplicationContext configurableApplicationContext){ myMongoTemplate =configurableApplicationContext.getBean(LjsdMongoTemplate.class); + coreMongoTemplate = (MongoTemplate)configurableApplicationContext.getBean("coreMongoTemplate"); } public LjsdMongoTemplate getMyMongoTemplate() { @@ -82,6 +78,11 @@ public class MongoUtil { return this.myMongoTemplate.findAllByCondition(query, User.class) ; } + public static MongoTemplate getCoreMongoTemplate() throws UnknownHostException { + + return MongoUtil.getInstence().coreMongoTemplate; + } + public static void main(String[] args) { try { LjsdMongoTemplate ljsdMongoTemplate = getLjsdMongoTemplate(); @@ -109,4 +110,5 @@ public class MongoUtil { + } 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 f0668e294..6b65db3a3 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 @@ -173,6 +173,8 @@ public class RedisKey { public static final String BLOODY_PERSON_BATTLE_INFO = "BLOODY_PERSON_BATTLE_INFO"; public static final String MATCH_SERVER_INFO = "MATCH_SERVER_INFO"; + public final static String CDKEY = "CDKEY"; + public static String getKey(String type, String key, boolean withoutServerId) { if(RedisKey.TOKEN.equals(type)||RedisKey.USER_SERVER_INFO.equals(type)){ return type + RedisKey.Delimiter_colon + key; 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 e53a68deb..cfa45115f 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 @@ -996,7 +996,8 @@ public class RedisUtil { if(RedisKey.BLOODY_RANK.equals(type) || RedisKey.BLOODY_TEAM.equals(type) || RedisKey.PLAYER_INFO_CACHE.equals(type) || RedisKey.BLOODY_PERSON_BATTLE_INFO.equals(type)) { return type + RedisKey.Delimiter_colon + key; } - if(RedisKey.TOKEN.equals(type)||RedisKey.USER_SERVER_INFO.equals(type)){ + if(RedisKey.TOKEN.equals(type)||RedisKey.USER_SERVER_INFO.equals(type)|| + RedisKey.CDKEY.equals(type)){ return type + RedisKey.Delimiter_colon + key; } return GameApplication.serverId + RedisKey.Delimiter_colon + type + RedisKey.Delimiter_colon + key; diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/LoginRequestHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/LoginRequestHandler.java index 6e84b085a..1f1c9dc49 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/handler/LoginRequestHandler.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/LoginRequestHandler.java @@ -76,6 +76,7 @@ public class LoginRequestHandler extends BaseHandler=2){ String openId = split[0]; String chanel = split[1]; - user = UserManager.userLogin(userId,openId,chanel); + user = UserManager.userLogin(userId,openId,chanel,pid); }else{ - user = UserManager.userLogin(userId,openIdFront,""); + user = UserManager.userLogin(userId,openIdFront,"",pid); } // String newToken = UserManager.getNewToken(userId); diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/core/ExchangeCdkHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/core/ExchangeCdkHandler.java new file mode 100644 index 000000000..bc54f6851 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/core/ExchangeCdkHandler.java @@ -0,0 +1,124 @@ +package com.ljsd.jieling.handler.core; + +import com.ljsd.GameApplication; +import com.ljsd.jieling.config.SErrorCodeEerverConfig; +import com.ljsd.jieling.core.CoreLogic; +import com.ljsd.jieling.core.GlobalsDef; +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.globals.Global; +import com.ljsd.jieling.handler.BaseHandler; +import com.ljsd.jieling.logic.dao.CdkInfo; +import com.ljsd.jieling.logic.dao.CdkUseInfo; +import com.ljsd.jieling.logic.dao.SCdkInfo; +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.session.ISession; +import com.ljsd.jieling.protocols.MessageTypeProto; +import com.ljsd.jieling.protocols.PlayerInfoProto; +import com.ljsd.jieling.util.*; +import com.mongodb.BasicDBObject; +import org.springframework.data.mongodb.core.query.BasicQuery; +import org.springframework.data.mongodb.core.query.BasicUpdate; +import org.springframework.stereotype.Component; +import sun.misc.MessageUtils; + +import java.util.Map; + +@Component +public class ExchangeCdkHandler extends BaseHandler { + + + @Override + public MessageTypeProto.MessageType getMessageCode() { + return MessageTypeProto.MessageType.EXCHANGE_CDK_REQUEST; + } + + @Override + public void processWithProto(ISession session, PlayerInfoProto.ExchangeCdkRequest proto) throws Exception { + + String cdk = proto.getKey(); + int uid = session.getUid(); + User user = UserManager.getUser(session.getUid()); + Map sCdkInfosCacheMap = CoreLogic.getInstance().getsCdkInfosCacheMap(); + if (cdk.length() != 18 || sCdkInfosCacheMap == null || sCdkInfosCacheMap.isEmpty()) { + MessageUtil.sendErrorResponse(session, 0, MessageTypeProto.MessageType.EXCHANGE_CDK_RESPONSE_VALUE, "cdk.wrong"); + return; + } + boolean distributedLock = RedisUtil.getInstence().tryGetDistributedLock(RedisKey.CDKEY,cdk , Integer.toString(uid),500); + if (!distributedLock) { + MessageUtil.sendErrorResponse(session, 0, MessageTypeProto.MessageType.EXCHANGE_CDK_RESPONSE_VALUE, "兑换失败,请重试"); + return; + } + //兑换码信息 + CdkInfo cdkInfo; + int goodsId; + try { + cdkInfo = MongoUtil.getCoreMongoTemplate().findById(cdk, CdkInfo.class); + if (cdkInfo == null) { + MessageUtil.sendErrorResponse(session, 0, MessageTypeProto.MessageType.EXCHANGE_CDK_RESPONSE_VALUE, "cdk.wrong"); + return; + } + goodsId = cdkInfo.getGoodsId(); + //礼包信息 + SCdkInfo scdkInfo = sCdkInfosCacheMap.get(goodsId); + if (scdkInfo == null) { + MessageUtil.sendErrorResponse(session, 0, MessageTypeProto.MessageType.EXCHANGE_CDK_RESPONSE_VALUE, "cdk.wrong"); + return; + } + + //pid + if(user.getPlayerInfoManager().getPid()!=scdkInfo.getPid()) + { + MessageUtil.sendErrorResponse(session,0, MessageTypeProto.MessageType.EXCHANGE_CDK_REQUEST_VALUE,"cdk wrong"); + return; + } + int usetype = scdkInfo.getUsetype(); + if (usetype == 0) {//只能兑换一次 + if (cdkInfo.getStatus() == 1) { + MessageUtil.sendErrorResponse(session, 0, MessageTypeProto.MessageType.EXCHANGE_CDK_RESPONSE_VALUE, "cdk.used"); + return; + } + } else { + boolean exists = MongoUtil.getCoreMongoTemplate().exists(new BasicQuery(new BasicDBObject("uid", uid).append("cdk_num", cdk)), CdkUseInfo.class); + if(exists){ + MessageUtil.sendErrorResponse(session, 0, MessageTypeProto.MessageType.EXCHANGE_CDK_RESPONSE_VALUE, "cdk.role used"); + return; + } + } + + long size = MongoUtil.getCoreMongoTemplate().count(new BasicQuery(new BasicDBObject("uid", uid).append("goodsId", goodsId)), CdkUseInfo.class); + if (size >= scdkInfo.getRoleUseNum()) { + MessageUtil.sendErrorResponse(session, 0, MessageTypeProto.MessageType.EXCHANGE_CDK_RESPONSE_VALUE, "已达角色兑换上线"); + return; + } + + BasicDBObject basicDBObject = new BasicDBObject(); + basicDBObject.put("$set", new BasicDBObject("status", 1)); + BasicUpdate basicUpdate = new BasicUpdate(basicDBObject); + MongoUtil.getCoreMongoTemplate().updateFirst(new BasicQuery(new BasicDBObject("_id", cdk)), basicUpdate, CdkInfo.class); + updataCdkUseInfo(uid, cdk, goodsId); + MessageUtil.sendMessage(session, 1, MessageTypeProto.MessageType.EXCHANGE_CDK_RESPONSE_VALUE, null, true); + + String title = SErrorCodeEerverConfig.getI18NMessage("Conversion_title"); + String content = SErrorCodeEerverConfig.getI18NMessage("Conversion_txt"); + + MailLogic.getInstance().sendMail(uid, title, content, scdkInfo.getReward(), (int) (TimeUtils.now() / 1000), Global.MAIL_EFFECTIVE_TIME); + } finally { + RedisUtil.getInstence().releaseDistributedLock(RedisKey.CDKEY, cdk, Integer.toString(uid)); + } + } + + private void updataCdkUseInfo(int uid, String cdk, int goodsId) throws Exception { + CdkUseInfo cdkUseInfo = new CdkUseInfo(); + cdkUseInfo.setId(KeyGenUtils.produceIdByModule(UUIDEnum.CDK, uid)); + cdkUseInfo.setCdk(cdk); + cdkUseInfo.setUid(uid); + cdkUseInfo.setGoodsId(goodsId); + cdkUseInfo.setServerId(GameApplication.serverId); + cdkUseInfo.setCreateTime(System.currentTimeMillis()); + MongoUtil.getCoreMongoTemplate().insert(cdkUseInfo); + } +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/CdkInfo.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/CdkInfo.java new file mode 100644 index 000000000..ae780083b --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/CdkInfo.java @@ -0,0 +1,42 @@ +package com.ljsd.jieling.logic.dao; + +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; +import org.springframework.data.mongodb.core.mapping.Field; + +@Document(collection = "cdk_info") +public class CdkInfo { + @Id + private String id; // 生成的序列号id + + @Field(value = "goodsId") + private int goodsId; //所属的商品id + + @Field(value = "status") + private int status; // 是否兑换 0:未兑换 1:已兑换 + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getGoodsId() { + return goodsId; + } + + public void setGoodsId(int goodsId) { + this.goodsId = goodsId; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } +} + diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/CdkUseInfo.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/CdkUseInfo.java new file mode 100644 index 000000000..9246eab50 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/CdkUseInfo.java @@ -0,0 +1,76 @@ +package com.ljsd.jieling.logic.dao; + +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; +import org.springframework.data.mongodb.core.mapping.Field; + +@Document(collection = "cdk_use_info") +public class CdkUseInfo { + + @Id + private String id; + + @Field(value = "cdk_num") + private String cdk; + + @Field(value = "uid") + private int uid; + + @Field(value = "create_time") + private long createTime; + + @Field(value = "serverId") + private int serverId; + + + @Field(value = "goodsId") + private int goodsId; + + public String getId() { + return id; + } + + public String getCdk() { + return cdk; + } + + public int getUid() { + return uid; + } + + public long getCreateTime() { + return createTime; + } + + public int getServerId() { + return serverId; + } + + public void setId(String id) { + this.id = id; + } + + public void setCdk(String cdk) { + this.cdk = cdk; + } + + public void setUid(int uid) { + this.uid = uid; + } + + public void setCreateTime(long createTime) { + this.createTime = createTime; + } + + public void setServerId(int serverId) { + this.serverId = serverId; + } + + public int getGoodsId() { + return goodsId; + } + + public void setGoodsId(int goodsId) { + this.goodsId = goodsId; + } +} \ No newline at end of file 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 1d80b116e..15e1c2877 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 @@ -22,6 +22,8 @@ public class PlayerManager extends MongoBase { private String openId; + private int pid; + private String nickName; private int level; @@ -490,4 +492,13 @@ public class PlayerManager extends MongoBase { updateString("phoneBindInfo",phoneBindInfo); this.phoneBindInfo = phoneBindInfo; } + + public void setPid(int pid) { + updateString("pid",pid); + this.pid = pid; + } + + public int getPid() { + return pid; + } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/SCdkInfo.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/SCdkInfo.java new file mode 100644 index 000000000..c249d3350 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/SCdkInfo.java @@ -0,0 +1,133 @@ +package com.ljsd.jieling.logic.dao; + +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; +import org.springframework.data.mongodb.core.mapping.Field; + +@Document(collection = "cdk_add_info") +public class SCdkInfo { + @Id + private int id; //所属的商品id + /** + * 0:兌換一次。 + * 1:兌換多次。 + */ + @Field(value = "usetype") + private int usetype; + + @Field(value = "pid") + private int pid; + + @Field(value = "role_use_num") + private int roleUseNum; + + @Field(value = "start_time") + private long startTime; + + @Field(value = "end_time") + private long endTime; + + @Field(value = "reward") + private String reward; + + @Field(value = "goods_name") + private String goodsName; + + @Field(value = "goods_info") + private String goodsInfo; + + @Field(value = "goods_sum") + private int goodsSum; + + @Field(value = "isAdd") + private int isAdd; // 1: 已生成过 ,0: 未生成过 + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getUsetype() { + return usetype; + } + + public void setUsetype(int usetype) { + this.usetype = usetype; + } + + public long getStartTime() { + return startTime; + } + + public void setStartTime(long startTime) { + this.startTime = startTime; + } + + public long getEndTime() { + return endTime; + } + + public void setEndTime(long endTime) { + this.endTime = endTime; + } + + public String getReward() { + return reward; + } + + public void setReward(String reward) { + this.reward = reward; + } + + public String getGoodsName() { + return goodsName; + } + + public void setGoodsName(String goodsName) { + this.goodsName = goodsName; + } + + public String getGoodsInfo() { + return goodsInfo; + } + + public void setGoodsInfo(String goodsInfo) { + this.goodsInfo = goodsInfo; + } + + public int getGoodsSum() { + return goodsSum; + } + + public void setGoodsSum(int goodsSum) { + this.goodsSum = goodsSum; + } + + public int getIsAdd() { + return isAdd; + } + + public void setIsAdd(int isAdd) { + this.isAdd = isAdd; + } + + public int getPid() { + return pid; + } + + public void setPid(int pid) { + this.pid = pid; + } + + public int getRoleUseNum() { + return roleUseNum; + } + + public void setRoleUseNum(int roleUseNum) { + this.roleUseNum = roleUseNum; + } +} + diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/UserManager.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/UserManager.java index 860cfdcd8..eee3dbcfb 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/UserManager.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/UserManager.java @@ -31,12 +31,12 @@ public class UserManager { return userMap.containsKey(uid); } - public static User userLogin(int uid,String openId,String channel) throws Exception { + public static User userLogin(int uid,String openId,String channel,int pid) throws Exception { User user = null; if (!UserManager.isUserExist(uid)){ user = MongoUtil.getInstence().getMyMongoTemplate().findById(User.getCollectionName(), uid, User.class); if (user == null) { - user = registerUser(uid,openId,channel); + user = registerUser(uid,openId,channel,pid); } UserManager.addUser(user); }else{ @@ -46,16 +46,16 @@ public class UserManager { } - private static User registerUser(int uid,String openId,String channel) throws Exception { + private static User registerUser(int uid,String openId,String channel,int pid) throws Exception { User user = new User(uid); - initPlayer(user,openId,channel); + initPlayer(user,openId,channel,pid); UserManager.addUser(user); MongoUtil.getInstence().getMyMongoTemplate().save(user); PlayerLogic.getInstance().sendTestWelfareMail(user,1,1); return user; } - private static void initPlayer(User user,String openId,String channel) throws Exception { + private static void initPlayer(User user,String openId,String channel,int pid) throws Exception { SGameSetting gameSetting = SGameSetting.getGameSetting(); PlayerManager playerManager = user.getPlayerInfoManager(); long now = TimeUtils.now(); @@ -72,6 +72,7 @@ public class UserManager { playerManager.setRechargeInfo(new RechargeInfo()); playerManager.setPhoneBindInfo(new PhoneBindInfo("")); playerManager.setChannel(channel); + playerManager.setPid(pid); playerManager.setHeadFrame(SGameSetting.getGameSetting().getDefaultPicture()); SPlayerLevelConfig sPlayerLevelConfig = SPlayerLevelConfig.getsPlayerLevelConfigMap().get(1); playerManager.setMaxStamina(sPlayerLevelConfig.getMaxEnergy()); 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 430c7136f..6eece0ba6 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 @@ -2,6 +2,7 @@ package com.ljsd.jieling.thread.task; import com.ljsd.GameApplication; import com.ljsd.jieling.config.reportData.DataMessageUtils; +import com.ljsd.jieling.core.CoreLogic; import com.ljsd.jieling.core.GlobalsDef; import com.ljsd.jieling.db.mongo.MongoUtil; import com.ljsd.jieling.db.redis.RedisKey; @@ -60,6 +61,7 @@ public class MinuteTask extends Thread { QuestionLogic.getInstence().checkQuestion(); MailLogic.getInstance().checkReadyToMail(); ProtocolsManager.getInstance().minuteCheckForbidUser(); + CoreLogic.getInstance().checkCoreCdk(); RedisUtil.getInstence().set(RedisKey.ONLINE_NUM+RedisKey.Delimiter_colon+GameApplication.serverId, String.valueOf(OnlineUserManager.sessionMap.entrySet().size())); LOGGER.info("MinuteTask end..."); } catch (Exception e) { diff --git a/serverlogic/src/main/java/com/ljsd/jieling/util/UUIDEnum.java b/serverlogic/src/main/java/com/ljsd/jieling/util/UUIDEnum.java index b8be3a936..a1689c433 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/util/UUIDEnum.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/util/UUIDEnum.java @@ -8,7 +8,8 @@ public enum UUIDEnum { ADVENTUREBOSS(4), GUILDLOG(5), ESPECIAL_EQUIP(6), - SOUL_EQUIP(7)//魂印 + SOUL_EQUIP(7),//魂印 + CDK(8)//cdk ; private int value; From 678c06c99800cf3a1fa3c757bfd585304530c168 Mon Sep 17 00:00:00 2001 From: wangyuan Date: Thu, 12 Sep 2019 18:15:23 +0800 Subject: [PATCH 2/2] fix reconnect --- .../network/server/ProtocolsManager.java | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/serverlogic/src/main/java/com/ljsd/jieling/network/server/ProtocolsManager.java b/serverlogic/src/main/java/com/ljsd/jieling/network/server/ProtocolsManager.java index 7ec7b1e82..ee442af83 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/network/server/ProtocolsManager.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/network/server/ProtocolsManager.java @@ -297,6 +297,8 @@ public class ProtocolsManager implements ProtocolsAbstract { ISession iSession = OnlineUserManager.getSessionByUid(uid); MessageUtil.sendErrorCode(iSession, ErrorCode.reloginCode,"您的账号已经在其他设备上登陆,请确认账号安全!"); iSession.setOfflineType(ErrorCode.reloginCode); + backUpMsgToRedis(iSession); + offLine(iSession); return 1; } return 0; @@ -311,7 +313,7 @@ public class ProtocolsManager implements ProtocolsAbstract { byte[] message = iSession.getCacheMessage(index); if (message==null){ //TODO error - LOGGER.info("the uid={},the msg={} is processing",iSession.getUid(), MessageTypeProto.MessageType.valueOf(packetNetData.getMsgId())); + LOGGER.info("the uid={},the msg={} is processing,the index={},the sessionIndex={}",iSession.getUid(), MessageTypeProto.MessageType.valueOf(packetNetData.getMsgId()),index,iSession.getIndex()); return 1; }else { LOGGER.info("the uid={},the msg={} reback",iSession.getUid(), MessageTypeProto.MessageType.valueOf(packetNetData.getMsgId())); @@ -349,7 +351,6 @@ public class ProtocolsManager implements ProtocolsAbstract { LOGGER.info("player offLine ..."); ISession session = (ISession) gameSession; synchronized (session) { - OnlineUserManager.userOffline(session.getUid()); User user = UserManager.getUserInMem(session.getUid()); if(user == null){ return; @@ -360,6 +361,7 @@ public class ProtocolsManager implements ProtocolsAbstract { if(session.getOfflineType() == ErrorCode.reloginCode){ return; } + OnlineUserManager.userOffline(session.getUid()); if (session.getCtx() != null) { GameMessageHandler.allChannels.remove(session.getCtx().channel()); } @@ -380,14 +382,7 @@ public class ProtocolsManager implements ProtocolsAbstract { ActivityLogic.getInstance().updateActivityMissionProgress(user, ActivityType.OnlineReward,(int)(onlineTime/TimeUtils.ONE_SECOND)); GuildLogic.updateMyPos(user); MongoUtil.getInstence().lastUpdate(); - ConcurrentHashMap indexToIndication = session.getIndexToIndication(); - if(!indexToIndication.isEmpty() ){ - String key = RedisUtil.getInstence().getKey(RedisKey.INDICATION_OFFLINE, Integer.toString(session.getUid())); - RedisUtil.getInstence().set(key,gson.toJson(indexToIndication)); - } - - String key = RedisUtil.getInstence().getKey(RedisKey.RESPONSE_OFFLINE, Integer.toString(session.getUid())); - RedisUtil.getInstence().set(key,gson.toJson(session.getIndexToMessage())); + backUpMsgToRedis(session); // 下线处理的逻辑需要添加在这里 } catch (Exception e) { e.printStackTrace(); @@ -397,6 +392,18 @@ public class ProtocolsManager implements ProtocolsAbstract { } } + private void backUpMsgToRedis(ISession session){ + ConcurrentHashMap indexToIndication = session.getIndexToIndication(); + if(!indexToIndication.isEmpty() ){ + String key = RedisUtil.getInstence().getKey(RedisKey.INDICATION_OFFLINE, Integer.toString(session.getUid())); + RedisUtil.getInstence().set(key,gson.toJson(indexToIndication)); + } + + String key = RedisUtil.getInstence().getKey(RedisKey.RESPONSE_OFFLINE, Integer.toString(session.getUid())); + LOGGER.info("the uid={},the offlineIndex={},",session.getUid(),session.getIndexToMessage().keySet().iterator().next()); + RedisUtil.getInstence().set(key,gson.toJson(session.getIndexToMessage())); + } + public boolean kickOldUser(int uid, String uToken, int errorCode, String errorMsg, long requestTime) { if (GameMessageHandler.currentSessions.size() != 0 && GameMessageHandler.currentSessions.keySet().contains(uid)) {