admin
2021-05-29 61229e527688452c3dc67a219c6017e034ec7dd6
礼金创建优化
1个文件已删除
6个文件已修改
1个文件已添加
351 ■■■■■ 已修改文件
facade-lijin/src/main/java/com/ks/lijin/exception/LiJinGoodsException.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
facade-lijin/src/main/java/com/ks/lijin/utils/taobao/TaoKeApiUtil.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lijin/src/main/java/com/ks/lijin/aspect/RedisCacheAspect.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lijin/src/main/java/com/ks/lijin/config/RedisConfig.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lijin/src/main/java/com/ks/lijin/service/manager/LiJinProviderTaoKeAccountManager.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lijin/src/main/java/com/ks/lijin/service/manager/LijinGoodsManager.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lijin/src/main/java/com/ks/lijin/service/manager/RedisManager.java 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lijin/src/main/java/com/ks/lijin/service/remote/LijinCreateServiceImpl.java 55 ●●●● 补丁 | 查看 | 原始文档 | 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;
    }