facade-lijin/src/main/java/com/ks/lijin/exception/LiJinGoodsException.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
facade-lijin/src/main/java/com/ks/lijin/utils/taobao/TaoKeApiUtil.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
service-lijin/src/main/java/com/ks/lijin/aspect/RedisCacheAspect.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
service-lijin/src/main/java/com/ks/lijin/config/RedisConfig.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
service-lijin/src/main/java/com/ks/lijin/service/manager/LiJinProviderTaoKeAccountManager.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
service-lijin/src/main/java/com/ks/lijin/service/manager/LijinGoodsManager.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
service-lijin/src/main/java/com/ks/lijin/service/manager/RedisManager.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
service-lijin/src/main/java/com/ks/lijin/service/remote/LijinCreateServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
facade-lijin/src/main/java/com/ks/lijin/exception/LiJinGoodsException.java
@@ -10,6 +10,8 @@ public final static int CODE_GOODS_OFFLINE = 2001; //商品不支持创建淘礼金 public final static int CODE_GOODS_NOT_SUPPORT = 1001; //今日商品创建的礼金次数已超上上限 public final static int CODE_GOODS_CREATED_FULL = 3001; facade-lijin/src/main/java/com/ks/lijin/utils/taobao/TaoKeApiUtil.java
@@ -27,7 +27,7 @@ // 淘礼金创建 public static TaoLiJinDTO createTaoLiJin(Long auctionId, String name, BigDecimal perface, int totalNum, Date sendStartTime, Date sendEndTime, Date useStartTime, Date useEndTime, TaoKeAppInfo app) throws LiJinAccountException, LiJinException, LiJinGoodsException { throws LiJinAccountException, LiJinAmountException, LiJinException, LiJinGoodsException { Map<String, String> map = new HashMap<>(); map.put("method", "taobao.tbk.dg.vegas.tlj.create"); map.put("adzone_id", app.getPid().split("_")[3]); @@ -68,6 +68,7 @@ // 接口返回异常 String msgCode = root.optJSONObject("result").optString("msg_code"); String msgInfo = root.optJSONObject("result").optString("msg_info"); if (!StringUtil.isNullOrEmpty(msgCode)) { // TLJLogHelper.info(auctionId, root.toString());// 淘礼金异常信息记录 TODO switch (msgCode) { @@ -80,7 +81,9 @@ case "ASSET_ACCOUNT_BALANCE_NOT_ENOUGH": throw new LiJinAccountException(LiJinAccountException.CODE_TLJ_NO_MONEY, "账户预算不足"); case "FAIL_CHECK_ITEM_DAILY_SEND_NUM_CHECK_ERROR": throw new LiJinAccountException(LiJinAccountException.CODE_TLJ_NO_GOODS, "今日该商品淘礼金创建数已超上限,请您明日再试"); throw new LiJinGoodsException(LiJinGoodsException.CODE_GOODS_CREATED_FULL, "今日该商品淘礼金创建数已超上限,请您明日再试"); case "FAIL_CHECK_TLJ_MIN_FACE_ERROR": throw new LiJinAmountException(LiJinAmountException.CODE_LIJIN_AMOUNT_OUTOFRANGE, msgInfo); default: throw new LiJinException(Integer.parseInt(msgCode), root.toString()); } @@ -239,6 +242,9 @@ HttpConnectionManagerParams hparams = new HttpConnectionManagerParams(); hparams.setConnectionTimeout(3000); client.getHttpConnectionManager().setParams(hparams); client.executeMethod(method); String result = method.getResponseBodyAsString(); System.out.println(result); return method.getResponseBodyAsString(); } catch (Exception e) { e.printStackTrace(); service-lijin/src/main/java/com/ks/lijin/aspect/RedisCacheAspect.java
@@ -1,6 +1,5 @@ package com.ks.lijin.aspect; import com.ks.lijin.service.manager.RedisManager; import com.ks.lijin.util.annotation.RedisCache; import com.ks.lijin.util.annotation.RedisCacheEvict; import org.aspectj.lang.ProceedingJoinPoint; @@ -12,6 +11,7 @@ import org.slf4j.LoggerFactory; import org.springframework.core.DefaultParameterNameDiscoverer; import org.springframework.core.annotation.Order; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.expression.EvaluationContext; import org.springframework.expression.Expression; import org.springframework.expression.ExpressionParser; @@ -22,6 +22,7 @@ import javax.annotation.Resource; import java.lang.reflect.Method; import java.util.concurrent.TimeUnit; @Component @Aspect @@ -29,7 +30,7 @@ public class RedisCacheAspect { Logger logger = LoggerFactory.getLogger(RedisCacheAspect.class); @Resource private RedisManager redisManager; private RedisTemplate redisTemplate; private ExpressionParser parser = new SpelExpressionParser(); @@ -66,7 +67,7 @@ return cacheKey; } @Around("execution(public * com.ks.app.service..*.*(..))") @Around("execution(public * com.ks.lijin.service..*.*(..))") public Object requestSerializable(ProceedingJoinPoint joinPoint) throws Throwable { Signature signature = joinPoint.getSignature(); MethodSignature methodSignature = (MethodSignature) signature; @@ -93,7 +94,7 @@ String cacheKey = getRedisKey(redisCache, joinPoint); if (!StringUtil.isNullOrEmpty(cacheKey)) { try { Object result = redisManager.getDataFromRedis(cacheKey); Object result = redisTemplate.opsForValue().get(cacheKey); if (result != null) { return result; } @@ -111,7 +112,7 @@ String cacheKey = getRedisKey(redisCache, joinPoint); if (!StringUtil.isNullOrEmpty(cacheKey)) { try { redisManager.setDataToRedis(cacheKey, object, redisCache.second()); redisTemplate.opsForValue().set(cacheKey, object, redisCache.second(), TimeUnit.SECONDS); } catch (Exception e) { logger.error("redis保存缓存数据出错", e.getMessage(), "key:" + cacheKey); } @@ -123,9 +124,9 @@ if (!StringUtil.isNullOrEmpty(cacheKey)) { try { if (!StringUtil.isNullOrEmpty(key)) { redisManager.remove(cacheKey); redisTemplate.delete(cacheKey); } else { redisManager.removePrefix(cacheKey); redisTemplate.delete(cacheKey + "*"); } } catch (Exception e) { logger.error("redis清除缓存数据出错", e.getMessage(), "key:" + cacheKey); service-lijin/src/main/java/com/ks/lijin/config/RedisConfig.java
@@ -1,48 +1,41 @@ package com.ks.lijin.config; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import redis.clients.jedis.JedisPool; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; @Configuration public class RedisConfig { Logger log = LoggerFactory.getLogger(RedisConfig.class); @Value("${redis.host}") private String host; @Value("${redis.port}") private int port; @Value("${redis.password}") private String password; @Value("${redis.timeout}") private int timeout; @Value("${redis.jedis.pool.max-wait}") private int maxWait; @Value("${redis.jedis.pool.max-idle}") private int maxIdle; @Value("${redis.jedis.pool.max-total}") private int maxTotal; @Value("${redis.database}") private int database; @Bean public JedisPool jedisPool() { GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig(); poolConfig.setMaxWaitMillis(maxWait); poolConfig.setMaxIdle(maxIdle); poolConfig.setMaxTotal(maxTotal); JedisPool pool = new JedisPool(poolConfig, host, port, timeout, password, database); return pool; public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); // key采用String的序列化方式 template.setKeySerializer(stringRedisSerializer); // hash的key也采用String的序列化方式 template.setHashKeySerializer(stringRedisSerializer); // value序列化方式采用jackson template.setValueSerializer(jackson2JsonRedisSerializer); // hash的value序列化方式采用jackson template.setHashValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; } } service-lijin/src/main/java/com/ks/lijin/service/manager/LiJinProviderTaoKeAccountManager.java
@@ -48,6 +48,7 @@ LiJinProviderTaoKeAccount account = liJinProviderAccountMapper.selectByPrimaryKeyForUpdate(accountId); if (account != null) { LiJinProviderTaoKeAccount update = new LiJinProviderTaoKeAccount(); update.setId(account.getId()); update.setTodayConsumeMoney(new BigDecimal(todayMoney).divide(new BigDecimal(100), 2, RoundingMode.FLOOR)); update.setTodayConsumeNumber((int) goodsNum); update.setUpdateTime(new Date()); service-lijin/src/main/java/com/ks/lijin/service/manager/LijinGoodsManager.java
New file @@ -0,0 +1,65 @@ package com.ks.lijin.service.manager; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import org.yeshi.utils.TimeUtil; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.Date; import java.util.concurrent.TimeUnit; @Component public class LijinGoodsManager { @Resource private RedisTemplate redisTemplate; /** * 商品今日礼金已经创建满了 * * @param auctionId * @param date */ public void createdFullToday(Long auctionId, Date date) { int expireTime = (int) ((TimeUtil.convertToTimeTemp(TimeUtil.getGernalTime(date.getTime() + 1000 * 60 * 60 * 24L, "yyyyMMdd"), "yyyyMMdd") - date.getTime()) / 1000); String day = TimeUtil.getGernalTime(date.getTime(), "yyyyMMdd"); String key = String.format("lijingoodslimit-%s-%s", day, auctionId); redisTemplate.opsForValue().set(key, "1", expireTime, TimeUnit.SECONDS); } /** * 商品今日是否可以创建礼金 * * @param auctionId * @return */ public boolean todayCanCreate(Long auctionId) { String day = TimeUtil.getGernalTime(System.currentTimeMillis(), "yyyyMMdd"); String key = String.format("lijingoodslimit-%s-%s", day, auctionId); return !redisTemplate.hasKey(key); } /** * 礼金的范围是否正常 * * @param money * @return */ public boolean isLijinMoneyAvaiable(BigDecimal money) { if (money == null) { return false; } int minMoney = 1; int maxMoney = 20; //礼金范围为1-20块 if (money.compareTo(new BigDecimal(minMoney)) >= 0 && money.compareTo(new BigDecimal(maxMoney)) <= 0) { return true; } return false; } } service-lijin/src/main/java/com/ks/lijin/service/manager/RedisManager.java
File was deleted service-lijin/src/main/java/com/ks/lijin/service/remote/LijinCreateServiceImpl.java
@@ -16,6 +16,7 @@ import com.ks.lijin.service.LiJinProviderNoticeService; import com.ks.lijin.service.LijinCreateService; import com.ks.lijin.service.manager.LiJinProviderTaoKeAccountManager; import com.ks.lijin.service.manager.LijinGoodsManager; import com.ks.lijin.util.Constant; import com.ks.lijin.utils.taobao.TaoBaoUtil; import com.ks.lijin.utils.taobao.TaoKeApiUtil; @@ -76,6 +77,9 @@ @Resource private RedisTemplate redisTemplate; @Resource private LijinGoodsManager lijinGoodsManager; @Override public List<MoneyInfo> getMoneyInfo(String uid, List<TaoBaoGoodsBrief> goodsBriefList) { VIPEnum vipRank = null; @@ -100,7 +104,6 @@ } //计算返利比例 BigDecimal rebateRate = potence.getRebatePercent(); BigDecimal couponPrice = TaoBaoUtil.getAfterUseCouplePrice(goods); BigDecimal fanliMoney = TaoBaoUtil.getGoodsHongBaoMoney(goods, rebateRate, false); moneyInfo.setFanliAmount(fanliMoney); moneyInfo.setFirstOrderAmount(null); @@ -113,6 +116,12 @@ @Override public BigDecimal getTBLijinAmount(Long actionId, String uid) throws LiJinGoodsException, LiJinUserException, LiJinAmountException { if (!lijinGoodsManager.todayCanCreate(actionId)) { throw new LiJinGoodsException(LiJinGoodsException.CODE_GOODS_CREATED_FULL, "今日礼金创建次数已达上限"); } // 获取用户等级 VIPEnum vipRank = vipCenterService.getVIPEnumByUid(uid); if (vipRank == null) { @@ -121,6 +130,10 @@ // 1、判断商品 并计算金额 BigDecimal money = getTBLijinAmount(actionId, vipRank); if (!lijinGoodsManager.isLijinMoneyAvaiable(money)) { throw new LiJinAmountException(LiJinAmountException.CODE_LIJIN_AMOUNT_OUTOFRANGE, "礼金未在规定范围内"); } // 2、判断用户 boolean result = userCanCreateTBLijin(uid, money); @@ -133,6 +146,10 @@ @Override public BigDecimal getTBLijinAmount(Long actionId, VIPEnum vipRank) throws LiJinGoodsException, LiJinAmountException { if (!lijinGoodsManager.todayCanCreate(actionId)) { throw new LiJinGoodsException(LiJinGoodsException.CODE_GOODS_CREATED_FULL, "今日礼金创建次数已达上限"); } //获取商品可创建的淘礼金面额,若不能创建需要抛出相关的异常(1.商品不支持礼金创建) BigDecimal money = null; // 1、判断商品 @@ -149,17 +166,17 @@ //券后价 * 商品佣金比例 * 返利比例 VipGradePotence potence = vipGradePotenceService.getPotenceByVipEnum(vipRank); if (potence != null && potence.getRebatePercent() != null) { money = TaoBaoUtil.getGoodsHongBaoMoney(goods, potence.getRebatePercent(), false); if (potence != null && potence.getTaolijinPercent() != null) { money = TaoBaoUtil.getGoodsHongBaoMoney(goods, potence.getTaolijinPercent(), false); } } catch (TaoBaoGoodsDownException e) { throw new LiJinGoodsException(LiJinGoodsException.CODE_GOODS_OFFLINE, "商品下线"); } // 金额为空 或者小于零 则抛出异常 if (money == null || money.compareTo(BigDecimal.valueOf(0)) <= 0) { throw new LiJinAmountException(LiJinAmountException.CODE_LIJIN_AMOUNT_OUTOFRANGE, "礼金创建的金额超出规定范围"); if (!lijinGoodsManager.isLijinMoneyAvaiable(money)) { throw new LiJinAmountException(LiJinAmountException.CODE_LIJIN_AMOUNT_OUTOFRANGE, "礼金未在规定范围内"); } return money; } @@ -246,6 +263,9 @@ @Override @Transactional(rollbackFor = Exception.class) public LiJinExpendRecord createTBLijin(String uid, Long goodsId) throws LiJinException, LiJinGoodsException, LiJinUserException, LiJinAmountException { userCanCreateTBLijin(uid); // 获取用户等级 VIPEnum vipRank = vipCenterService.getVIPEnumByUid(uid); if (vipRank == null) { @@ -272,6 +292,7 @@ //用户创建淘礼金为单线程操作 String key = "createtblijin-" + uid; if (redisTemplate.opsForValue().setIfAbsent(key, "1", 120, TimeUnit.SECONDS)) { Date now = new Date(); try { TaoLijinCreateResultDTO taoLiJinDTO = executeTaoLiJin(goodsId, lijinAmount, params); if (taoLiJinDTO == null) { @@ -279,6 +300,11 @@ } //添加账号的 return addCreateSuccessRecord(uid, goodsId, lijinAmount, params.getTitle(), params.getNum(), taoLiJinDTO); } catch (LiJinGoodsException e) { if (e.getCode() == LiJinGoodsException.CODE_GOODS_CREATED_FULL) { lijinGoodsManager.createdFullToday(goodsId, now); } throw e; } finally { redisTemplate.delete(key); } @@ -328,7 +354,7 @@ * @throws LiJinGoodsException * @throws LiJinException */ private TaoLijinCreateResultDTO executeTaoLiJin(Long goodsId, BigDecimal lijinAmount, LiJinCreateParam params) throws LiJinGoodsException, LiJinException { private TaoLijinCreateResultDTO executeTaoLiJin(Long goodsId, BigDecimal lijinAmount, LiJinCreateParam params) throws LiJinGoodsException, LiJinException, LiJinAmountException { // 查询供应商账号信息 List<LiJinProviderTaoKeAccount> listAccount = liJinProviderAccountService.listValidByProviderId(Constant.PROVIDER_DEFAULT_ID, LiJinProviderTaoKeAccount.ERROR_CODE_NORMAL); if (listAccount == null || listAccount.size() == 0) { @@ -385,7 +411,7 @@ } private TaoLiJinDTO executeTaoLiJinAPI(Long goodsId, BigDecimal lijinAmount, LiJinCreateParam params) throws LiJinException, LiJinGoodsException, LiJinAccountException { private TaoLiJinDTO executeTaoLiJinAPI(Long goodsId, BigDecimal lijinAmount, LiJinCreateParam params) throws LiJinException, LiJinGoodsException, LiJinAccountException, LiJinAmountException { return TaoKeApiUtil.createTaoLiJin(goodsId, params.getTitle(), lijinAmount, params.getNum(), params.getSendStartTime(), params.getSendEndTime(), params.getUseStartTime(), params.getUseEndTime(), new TaoKeAppInfo(params.getAppkey(), params.getAppsecret(), params.getPid())); @@ -403,6 +429,9 @@ */ private BigDecimal getTBLijinAmount(TaoBaoGoodsBrief goods, VIPEnum vipRank) throws LiJinGoodsException, LiJinAmountException { if (!lijinGoodsManager.todayCanCreate(goods.getAuctionId())) { throw new LiJinGoodsException(LiJinGoodsException.CODE_GOODS_CREATED_FULL, "今日礼金创建次数已达上限"); } //获取商品可创建的淘礼金面额,若不能创建需要抛出相关的异常(1.商品不支持礼金创建) BigDecimal money = null; @@ -413,14 +442,14 @@ //券后价 * 商品佣金比例 * 返利比例 VipGradePotence potence = vipGradePotenceService.getPotenceByVipEnum(vipRank); if (potence != null && potence.getRebatePercent() != null) { money = TaoBaoUtil.getGoodsHongBaoMoney(goods, potence.getRebatePercent(), false); if (potence != null && potence.getTaolijinPercent() != null) { money = TaoBaoUtil.getGoodsHongBaoMoney(goods, potence.getTaolijinPercent(), false); } // 金额为空 或者小于零 则抛出异常 if (money == null || money.compareTo(BigDecimal.valueOf(0)) <= 0) { throw new LiJinAmountException(LiJinAmountException.CODE_LIJIN_AMOUNT_OUTOFRANGE, "礼金创建的金额超出规定范围"); if (!lijinGoodsManager.isLijinMoneyAvaiable(money)) { throw new LiJinAmountException(LiJinAmountException.CODE_LIJIN_AMOUNT_OUTOFRANGE, "礼金未在规定范围内"); } return money; }