From 42f05d2b835ed1ee41ca32cf76fe11849a890cb4 Mon Sep 17 00:00:00 2001 From: admin <weikou2014> Date: 星期四, 06 五月 2021 14:26:03 +0800 Subject: [PATCH] 金币完善 --- service-goldcorn/src/main/java/com/ks/goldcorn/service/remote/GoldCornTradeServiceImpl.java | 104 ++++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 76 insertions(+), 28 deletions(-) diff --git a/service-goldcorn/src/main/java/com/ks/goldcorn/service/remote/GoldCornTradeServiceImpl.java b/service-goldcorn/src/main/java/com/ks/goldcorn/service/remote/GoldCornTradeServiceImpl.java index d30a846..5d3a3c4 100644 --- a/service-goldcorn/src/main/java/com/ks/goldcorn/service/remote/GoldCornTradeServiceImpl.java +++ b/service-goldcorn/src/main/java/com/ks/goldcorn/service/remote/GoldCornTradeServiceImpl.java @@ -4,6 +4,7 @@ import com.ks.goldcorn.exception.GoldRecordException; import com.ks.goldcorn.exception.GoldTradeException; import com.ks.goldcorn.exception.GoldUserException; +import com.ks.goldcorn.manager.RedisManager; import com.ks.goldcorn.mapper.GoldCornAppInfoMapper; import com.ks.goldcorn.mapper.GoldCornBalanceMapper; import com.ks.goldcorn.mapper.GoldCornConsumeSourceMapper; @@ -12,12 +13,18 @@ import com.ks.goldcorn.service.GoldCornBalanceManager; import com.ks.goldcorn.service.GoldCornRecordManager; import org.apache.dubbo.config.annotation.Service; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import java.util.concurrent.TimeUnit; @Service(version = "1.0") public class GoldCornTradeServiceImpl implements GoldCornTradeService { + + Logger logger = LoggerFactory.getLogger(GoldCornTradeService.class); @Resource private GoldCornAppInfoMapper goldCornAppInfoMapper; @@ -36,6 +43,12 @@ @Resource private GoldCornRecordManager goldCornRecordManager; + + @Resource + private RedisTemplate<String, Object> redisTemplate; + + @Resource + private RedisManager redisManager; /** * 楠岃瘉绯荤粺涓庣敤鎴� @@ -60,58 +73,95 @@ return appInfo.getId(); } + @Override + public long getNextDoTaskTime(String appCode, String uid, String sourceCode) { + long time = redisManager.getCanAddCornExpireTime(appCode, uid, sourceCode); + if (time <= 0) { + return -1; + } + + return System.currentTimeMillis() + 1000 * time; + } + @Transactional(rollbackFor = Exception.class) @Override - public void addGoldCorn(String appCode, String uid, String sourceCode, String title, String desc) throws GoldAppException, GoldUserException, GoldTradeException { + public void addGoldCorn(String appCode, String uid, String sourceCode, Integer goldCornCount, String title, String desc) throws GoldAppException, GoldUserException, GoldTradeException { Long appId = validateAppAndUser(appCode, uid); GoldCornGetSource source = goldCornGetSourceMapper.selectByAppIdAndSourceCode(appId, sourceCode); if (source == null) { throw new GoldUserException(GoldTradeException.CODE_NOT_EXIST, "source is not exist"); } - //鍔犺褰� - GoldCornRecord record = new GoldCornRecord(); - record.setAppId(appId); - record.setGoldCorn(source.getGoldCorn()); - record.setSourceId(source.getId()); - record.setType(GoldCornRecord.TYPE_GET); - record.setUid(uid); - if (title != null) { - record.setTitle(title); - } else { - record.setTitle(source.getSourceName()); - } - if (desc != null) { - record.setDesc(desc); - } else { - record.setDesc(source.getSourceDesc()); + + String key = appCode + "-" + uid + "-" + sourceCode; + if (!redisTemplate.opsForValue().setIfAbsent(key, 1, 60 * 2, TimeUnit.SECONDS)) { + throw new GoldTradeException(GoldTradeException.CODE_FREQUENCY_LIMIT, "璇锋眰棰戠巼杩囬珮锛岃绋嶅悗鍐嶈瘯"); } try { - goldCornRecordManager.addRecord(record); - } catch (GoldRecordException e) { - throw new GoldTradeException(GoldTradeException.CODE_ADD_RECORD_FAIL, "娣诲姞璁板綍澶辫触"); + int count = redisManager.getGoldCornAddRecordCount(appCode, uid, sourceCode); + if (count >= source.getMaxDayCount()) { + throw new GoldTradeException(GoldTradeException.CODE_COUNT_LIMIT, "娣诲姞娆℃暟瓒呴檺锛岃鏄庢棩鍐嶈瘯"); + } + + if (!redisManager.canAddCornWithTime(appCode, uid, sourceCode)) { + throw new GoldTradeException(GoldTradeException.CODE_FREQUENCY_LIMIT, "娣诲姞鏃堕棿闂撮殧杩囧皬"); + } + //鍔犺褰� + GoldCornRecord record = new GoldCornRecord(); + record.setAppId(appId); + record.setGoldCorn(goldCornCount == null ? source.getGoldCorn() : goldCornCount); + record.setSourceCode(source.getSourceCode()); + record.setType(GoldCornRecord.TYPE_GET); + record.setUid(uid); + if (title != null) { + record.setTitle(title); + } else { + record.setTitle(source.getSourceName()); + } + if (desc != null) { + record.setDesc(desc); + } else { + record.setDesc(source.getSourceDesc()); + } + try { + goldCornRecordManager.addRecord(record); + } catch (GoldRecordException e) { + throw new GoldTradeException(GoldTradeException.CODE_ADD_RECORD_FAIL, "娣诲姞璁板綍澶辫触"); + } + //鍔犱綑棰� + goldCornBalanceManager.addMoney(appId, uid, record.getGoldCorn()); + + redisManager.addCornSuccess(appCode, uid, sourceCode, source.getMinTimeSpan()); + } catch (GoldUserException e) { + throw e; + } catch (GoldTradeException e) { + throw e; + } catch (Exception e) { + logger.error("娣诲姞閲戝竵鏈煡寮傚父锛歿}", e); + } finally { + redisTemplate.delete(key); } - //鍔犱綑棰� - goldCornBalanceManager.addMoney(appId, uid, source.getGoldCorn()); } @Transactional(rollbackFor = Exception.class) @Override - public void consumeGoldCorn(String appCode, String uid, String sourceCode, String title, String desc) throws GoldAppException, GoldUserException, GoldTradeException { + public void consumeGoldCorn(String appCode, String uid, String sourceCode, Integer goldCornCount, String title, String desc) throws GoldAppException, GoldUserException, GoldTradeException { Long appId = validateAppAndUser(appCode, uid); GoldCornConsumeSource source = goldCornConsumeSourceMapper.selectByAppIdAndSourceCode(appId, sourceCode); if (source == null) { throw new GoldUserException(GoldTradeException.CODE_NOT_EXIST, "source is not exist"); } + int goldCorn = goldCornCount == null ? source.getGoldCorn() : goldCornCount; + //鍑忎綑棰� - goldCornBalanceManager.subMoney(appId, uid, source.getGoldCorn()); + goldCornBalanceManager.subMoney(appId, uid, goldCorn); //鍔犺褰� GoldCornRecord record = new GoldCornRecord(); record.setAppId(appId); - record.setGoldCorn(source.getGoldCorn()); - record.setSourceId(source.getId()); + record.setGoldCorn(goldCorn); + record.setSourceCode(source.getSourceCode()); record.setType(GoldCornRecord.TYPE_CONSUME); record.setUid(uid); if (title != null) { @@ -129,7 +179,5 @@ } catch (GoldRecordException e) { throw new GoldTradeException(GoldTradeException.CODE_ADD_RECORD_FAIL, "娣诲姞璁板綍澶辫触"); } - - } } -- Gitblit v1.8.0