admin
2022-08-25 c9db68e33f90231b064b8864fc69ccf7d25f5e0b
service-lijin/src/main/java/com/ks/lijin/service/remote/LijinCreateServiceImpl.java
@@ -1,10 +1,11 @@
package com.ks.lijin.service.remote;
import com.ks.lijin.exception.*;
import com.ks.lijin.mapper.LiJinExpendRecordMapper;
import com.ks.lijin.pojo.DO.LiJinExpendRecord;
import com.ks.lijin.pojo.DO.LiJinProviderTaoKeAccount;
import com.ks.lijin.pojo.DO.LiJinProviderNotice;
import com.ks.lijin.pojo.DO.LiJinProviderTaoKeAccount;
import com.ks.lijin.pojo.DTO.LiJinCreateParam;
import com.ks.lijin.pojo.DTO.MoneyInfo;
import com.ks.lijin.pojo.DTO.TaoLijinCreateResultDTO;
@@ -15,24 +16,30 @@
import com.ks.lijin.service.LiJinProviderAccountService;
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.service.manager.*;
import com.ks.lijin.util.Constant;
import com.ks.lijin.utils.taobao.TaoBaoUtil;
import com.ks.lijin.utils.taobao.TaoKeApiUtil;
import com.ks.vip.exception.LijinBalanceException;
import com.ks.vip.pojo.DO.UserLijinRecord;
import com.ks.vip.pojo.DO.VipGradePotence;
import com.ks.vip.pojo.Enums.VIPEnum;
import com.ks.vip.service.LijinBalanceService;
import com.ks.vip.service.VipCenterService;
import com.ks.vip.service.VipGradePotenceService;
import com.ks.vip.service.VipGradeService;
import com.yeshi.goods.facade.entity.taobao.TaoBaoGoodsBrief;
import org.apache.dubbo.config.annotation.Reference;
import org.apache.dubbo.config.annotation.Service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.task.TaskExecutor;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.transaction.annotation.Transactional;
import org.yeshi.utils.MoneyBigDecimalUtil;
import org.yeshi.utils.StringUtil;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import javax.annotation.Resource;
import java.math.BigDecimal;
@@ -47,6 +54,8 @@
@Service(version = "1.0")
public class LijinCreateServiceImpl implements LijinCreateService {
    Logger logger = LoggerFactory.getLogger(LijinCreateService.class);
    @Resource(name = "taskExecutor")
    private TaskExecutor executor;
@@ -59,14 +68,17 @@
    @Resource
    private LiJinProviderAccountService liJinProviderAccountService;
    @Reference(version = "1.0")
    @Reference(version = "1.0", check = false)
    private VipCenterService vipCenterService;
    @Reference(version = "1.0")
    @Reference(version = "1.0", check = false)
    private VipGradePotenceService vipGradePotenceService;
    @Reference(version = "1.0")
    @Reference(version = "1.0", check = false)
    private VipGradeService vipGradeService;
    @Reference(version = "1.0", check = false)
    private LijinBalanceService lijinBalanceService;
    @Resource
    private LiJinExpendRecordService liJinExpendRecordService;
@@ -79,6 +91,18 @@
    @Resource
    private LijinGoodsManager lijinGoodsManager;
    @Resource
    private LijinDangerGoodsManager lijinDangerGoodsManager;
    @Resource
    private LijinDangerSellerManager lijinDangerSellerManager;
    @Resource
    private LijinConfigManager lijinConfigManager;
    @Resource
    private JedisPool jedisPool;
    @Override
    public List<MoneyInfo> getMoneyInfo(String uid, List<TaoBaoGoodsBrief> goodsBriefList) {
@@ -115,7 +139,7 @@
    }
    @Override
    public BigDecimal getTBLijinAmount(Long actionId, String uid) throws LiJinGoodsException, LiJinUserException, LiJinAmountException {
    public BigDecimal getTBLijinAmount(String actionId, String uid) throws LiJinGoodsException, LiJinUserException, LiJinAmountException {
        if (!lijinGoodsManager.todayCanCreate(actionId)) {
            throw new LiJinGoodsException(LiJinGoodsException.CODE_GOODS_CREATED_FULL, "今日礼金创建次数已达上限");
@@ -145,7 +169,7 @@
    @Override
    public BigDecimal getTBLijinAmount(Long actionId, VIPEnum vipRank) throws LiJinGoodsException, LiJinAmountException {
    public BigDecimal getTBLijinAmount(String actionId, VIPEnum vipRank) throws LiJinGoodsException, LiJinAmountException {
        if (!lijinGoodsManager.todayCanCreate(actionId)) {
            throw new LiJinGoodsException(LiJinGoodsException.CODE_GOODS_CREATED_FULL, "今日礼金创建次数已达上限");
        }
@@ -182,11 +206,45 @@
    }
    @Override
    public boolean userCanCreateTBLijin(String uid) throws LiJinUserException {
    public int getTodayLeftCount(String uid, Date registerDate) {
        VipGradePotence potence = vipCenterService.getVipPotence(uid);
        if (potence == null) {
            return 0;
        }
        // 每日最大次数判断
        Integer numMax = potence.getTaolijinMaxNumber();
        if (numMax == null || numMax.intValue() <= 0) {
            return 0;
        }
        // 使用次数已经超过最大次数
        int numExpend = liJinExpendRecordService.countTodayNumByExpend(uid);
        if (registerDate != null) {
            //判断新用户
            String newerHour = lijinConfigManager.getConfigValue("newer-hour");
            String dayPlusCount = lijinConfigManager.getConfigValue("newer-everyday-plus-lijin-count");
            if (!StringUtil.isNullOrEmpty(newerHour) && !StringUtil.isNullOrEmpty(dayPlusCount)) {
                //新用户每日附加次数
                if (System.currentTimeMillis() - registerDate.getTime() < 1000 * 60 * 60L * Integer.parseInt(dayPlusCount)) {
                    numMax += Integer.parseInt(dayPlusCount);
                }
            }
        }
        if (numMax.intValue() > numExpend) {
            return numMax.intValue() - numExpend;
        } else {
            return 0;
        }
    }
    @Override
    public boolean userCanCreateTBLijin(String uid, Date registerDate) throws LiJinUserException {
        VipGradePotence potence = vipCenterService.getVipPotence(uid);
        if (potence == null) {
            return false;
        }
        // 每日最大次数判断
        Integer numMax = potence.getTaolijinMaxNumber();
@@ -202,7 +260,19 @@
        // 使用次数已经超过最大次数
        int numExpend = liJinExpendRecordService.countTodayNumByExpend(uid);
        if (numMax.intValue() < numExpend) {
        if (registerDate != null) {
            //判断新用户
            String newerHour = lijinConfigManager.getConfigValue("newer-hour");
            String dayPlusCount = lijinConfigManager.getConfigValue("newer-everyday-plus-lijin-count");
            if (!StringUtil.isNullOrEmpty(newerHour) && !StringUtil.isNullOrEmpty(dayPlusCount)) {
                //新用户每日附加次数
                if (System.currentTimeMillis() - registerDate.getTime() < 1000 * 60 * 60L * Integer.parseInt(dayPlusCount)) {
                    numMax += Integer.parseInt(dayPlusCount);
                }
            }
        }
        if (numMax.intValue() <= numExpend) {
            throw new LiJinUserException(LiJinUserException.CODE_USER_CREATE_NUM_LIMIT, "用户创建淘礼金的次数超限");
        }
@@ -225,6 +295,14 @@
        if (potence == null) {
            return false;
        }
        //查询礼金余额
        BigDecimal balance = lijinBalanceService.getBalance(uid);
        if (balance != null) {
            if (money.compareTo(balance) > 0) {
                throw new LiJinUserException(LiJinUserException.CODE_USER_BALANCE_NOT_ENOUGH, "礼金余额不足");
            }
        }
        // 每日最大次数判断
        Integer numMax = potence.getTaolijinMaxNumber();
@@ -262,12 +340,27 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public LiJinExpendRecord createTBLijin(String uid, Long goodsId) throws LiJinException, LiJinGoodsException, LiJinUserException, LiJinAmountException {
    public LiJinExpendRecord createTBLijin(String uid, String goodsId) throws LiJinException, LiJinGoodsException, LiJinUserException, LiJinAmountException {
        return createTBLijin(uid, null, goodsId);
    }
        userCanCreateTBLijin(uid);
    @Override
    public LiJinExpendRecord createTBLijin(String uid, Date registerDate, String auctionId) throws LiJinException, LiJinGoodsException, LiJinUserException, LiJinAmountException {
        //用户是否有创建权限
        userCanCreateTBLijin(uid, registerDate);
        //商品是否在危险商品中
        boolean dangerous = lijinDangerGoodsManager.isDangerous(auctionId + "", 1);
        if (dangerous) {
            throw new LiJinGoodsException(LiJinGoodsException.CODE_GOODS_NOT_SUPPORT, "该商品暂无法创建礼金");
        }
        // 获取用户等级
        VIPEnum vipRank = vipCenterService.getVIPEnumByUid(uid);
        if (vipRank == null) {
            vipRank = vipGradeService.getDefaultGrade().getIdentity();
        }
        if (vipRank == null) {
            throw new LiJinUserException(LiJinUserException.CODE_USER_CREATE_NUM_LIMIT, "用户创建淘礼金的次数超限");
        }
@@ -275,7 +368,7 @@
        //淘礼金创建
        TaoBaoGoodsBrief goods = null;
        try {
            goods = TaoKeApiUtil.searchGoodsDetail(goodsId);
            goods = TaoKeApiUtil.searchGoodsDetail(auctionId);
        } catch (TaoBaoGoodsDownException e) {
            throw new LiJinGoodsException(LiJinGoodsException.CODE_GOODS_OFFLINE, "商品下线");
        }
@@ -283,33 +376,59 @@
            throw new LiJinGoodsException(LiJinGoodsException.CODE_GOODS_OFFLINE, "商品下线");
        }
        dangerous = lijinDangerSellerManager.isDangerous(goods.getSellerId() + "", 1);
        if (dangerous) {
            throw new LiJinGoodsException(LiJinGoodsException.CODE_GOODS_NOT_SUPPORT, "该店铺商品暂无法创建礼金");
        }
        // 创建的淘礼金-金额
        BigDecimal lijinAmount = getTBLijinAmount(goods, vipRank);
        //查询礼金余额
        BigDecimal balance = lijinBalanceService.getBalance(uid);
        if (balance != null && lijinAmount != null) {
            if (lijinAmount.compareTo(balance) > 0) {
                throw new LiJinUserException(LiJinUserException.CODE_USER_BALANCE_NOT_ENOUGH, "礼金余额不足");
            }
        }
        // 执行创建淘礼金
        LiJinCreateParam params = getLiJinCreateBaseParam();
        //用户创建淘礼金为单线程操作
        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) {
                    throw new LiJinException(1, "淘宝API推广红包创建失败");
        Jedis jedis = jedisPool.getResource();
        try {
            if (jedis.setnx(key, "1") > 0) {
                jedis.expire(key, 120);
                logger.error("淘礼金创建,用户锁定成功 key:{}", key);
                Date now = new Date();
                try {
                    TaoLijinCreateResultDTO taoLiJinDTO = executeTaoLiJin(auctionId, lijinAmount, params);
                    if (taoLiJinDTO == null) {
                        throw new LiJinException(1, "淘宝API推广红包创建失败");
                    }
                    logger.info("淘礼金创建成功");
                    //添加账号的
                    return addCreateSuccessRecord(uid, auctionId, lijinAmount, params.getTitle(), params.getNum(), taoLiJinDTO);
                } catch (LiJinGoodsException e) {
                    if (e.getCode() == LiJinGoodsException.CODE_GOODS_CREATED_FULL) {
                        lijinGoodsManager.createdFullToday(auctionId, now);
                    }
                    jedis.del(key);
                    logger.info("淘礼金创建,删除锁定成功1 key:{}", key);
                    throw e;
                } finally {
                    jedis.del(key);
                    logger.info("淘礼金创建,删除锁定成功2 key:{}", key);
                }
                //添加账号的
                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);
            } else {
                logger.error("淘礼金创建,用户锁定失败 key:{}", key);
                throw new LiJinException(LiJinException.CODE_SERVER_BUSY, "服务器繁忙,请稍后再试");
            }
        } else {
            throw new LiJinException(LiJinException.CODE_SERVER_BUSY, "服务器繁忙,请稍后再试");
        } finally {
            jedis.close();
        }
    }
@@ -324,7 +443,7 @@
     * @param num
     * @param taoLiJinDTO
     */
    private LiJinExpendRecord addCreateSuccessRecord(String uid, Long goodsId, BigDecimal lijinAmount, String title, int num, TaoLijinCreateResultDTO taoLiJinDTO) {
    private LiJinExpendRecord addCreateSuccessRecord(String uid, String goodsId, BigDecimal lijinAmount, String title, int num, TaoLijinCreateResultDTO taoLiJinDTO) {
        Date now = new Date();
        // 保存记录
        LiJinExpendRecord record = new LiJinExpendRecord();
@@ -338,8 +457,20 @@
        record.setSendUrl(taoLiJinDTO.getTaoLiJin().getSendUrl());
        record.setCreateTime(new Date());
        liJinExpendRecordMapper.insertSelective(record);
        logger.info("添加到创建记录成功");
        //添加
        liJinProviderTaoKeAccountManager.createLijinSuccess(taoLiJinDTO.getAccount().getId(), goodsId, lijinAmount.multiply(new BigDecimal(num)), now);
        logger.info("执行淘礼金创建成功事件成功");
        //礼金余额扣除
        try {
            lijinBalanceService.consumeLijin(uid, lijinAmount, "购物抵现", UserLijinRecord.Category.createGoodsLijin.name(), record.getId() + "");
            logger.info("扣除账户余额成功");
        } catch (LijinBalanceException e) {
            e.printStackTrace();
            logger.info("扣除账户余额失败:{}", e.getMessage());
        }
        return record;
    }
@@ -354,12 +485,13 @@
     * @throws LiJinGoodsException
     * @throws LiJinException
     */
    private TaoLijinCreateResultDTO executeTaoLiJin(Long goodsId, BigDecimal lijinAmount, LiJinCreateParam params) throws LiJinGoodsException, LiJinException, LiJinAmountException {
    private TaoLijinCreateResultDTO executeTaoLiJin(String 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) {
            throw new LiJinException(1, "没有可用的供应商账号");
        }
        logger.info("获取供应商淘礼金账号成功");
        // 遍历账号 用可使用账号
        for (LiJinProviderTaoKeAccount account : listAccount) {
@@ -370,6 +502,7 @@
                //创建礼金
                return new TaoLijinCreateResultDTO(account, executeTaoLiJinAPI(goodsId, lijinAmount, params));
            } catch (LiJinAccountException e) {// 账号问题
                logger.info("获取供应商淘礼账号出错:{}", e.getMessage());
                //更新账号的错误信息
                LiJinProviderTaoKeAccount update = new LiJinProviderTaoKeAccount();
                update.setId(account.getId());
@@ -411,7 +544,7 @@
    }
    private TaoLiJinDTO executeTaoLiJinAPI(Long goodsId, BigDecimal lijinAmount, LiJinCreateParam params) throws LiJinException, LiJinGoodsException, LiJinAccountException, LiJinAmountException {
    private TaoLiJinDTO executeTaoLiJinAPI(String 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()));