admin
2021-05-24 c85aa240db8fa4fd53d774b58ce6a3fc0ddb3580
service-lijin/src/main/java/com/ks/lijin/service/remote/LijinCreateServiceImpl.java
@@ -6,6 +6,7 @@
import com.ks.lijin.pojo.DO.LiJinProviderAccount;
import com.ks.lijin.pojo.DO.LiJinProviderNotice;
import com.ks.lijin.pojo.DTO.LiJinCreateParam;
import com.ks.lijin.pojo.DTO.MoneyInfo;
import com.ks.lijin.pojo.DTO.taobao.TaoKeAppInfo;
import com.ks.lijin.pojo.DTO.taobao.TaoLiJinDTO;
import com.ks.lijin.pojo.Enums.NoticeTypeEnum;
@@ -13,23 +14,30 @@
import com.ks.lijin.service.LiJinProviderAccountService;
import com.ks.lijin.service.LiJinProviderNoticeService;
import com.ks.lijin.service.LijinCreateService;
import com.ks.lijin.util.Constant;
import com.ks.lijin.utils.taobao.TaoBaoUtil;
import com.ks.lijin.utils.taobao.TaoKeApiUtil;
import com.ks.vip.pojo.DO.VipGradePotence;
import com.ks.vip.pojo.Enums.VIPEnum;
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.springframework.core.task.TaskExecutor;
import org.springframework.transaction.annotation.Transactional;
import org.yeshi.utils.MoneyBigDecimalUtil;
import org.yeshi.utils.StringUtil;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Service(version = "1.0")
@@ -47,15 +55,53 @@
    @Resource
    private LiJinProviderAccountService liJinProviderAccountService;
    @Resource
    @Reference(version = "1.0")
    private VipCenterService vipCenterService;
    @Resource
    @Reference(version = "1.0")
    private VipGradePotenceService vipGradePotenceService;
    @Reference(version = "1.0")
    private VipGradeService vipGradeService;
    @Resource
    private LiJinExpendRecordService liJinExpendRecordService;
    @Override
    public List<MoneyInfo> getMoneyInfo(String uid, List<TaoBaoGoodsBrief> goodsBriefList) {
        VIPEnum vipRank = null;
        if (!StringUtil.isNullOrEmpty(uid)) {
            vipRank = vipCenterService.getVIPEnumByUid(uid);
        }
        if (vipRank == null) {
            vipRank = vipGradeService.getDefaultGrade().getIdentity();
        }
        VipGradePotence potence = vipGradePotenceService.getPotenceByVipEnum(vipRank);
        List<MoneyInfo> list = new ArrayList<>();
        for (TaoBaoGoodsBrief goods : goodsBriefList) {
            MoneyInfo moneyInfo = new MoneyInfo();
            moneyInfo.setGoodsId(goods.getAuctionId() + "");
            moneyInfo.setGoodsType(1);
            try {
                moneyInfo.setLijinAmount(getTBLijinAmount(goods, vipRank));
            } catch (LiJinGoodsException e) {
                e.printStackTrace();
            } catch (LiJinAmountException e) {
                e.printStackTrace();
            }
            //计算返利比例
            BigDecimal rebateRate = potence.getRebatePercent();
            BigDecimal couponPrice = TaoBaoUtil.getAfterUseCouplePrice(goods);
            BigDecimal fanliMoney = TaoBaoUtil.getGoodsHongBaoMoney(goods,rebateRate,false);
            moneyInfo.setFanliAmount(fanliMoney);
            moneyInfo.setFirstOrderAmount(null);
            list.add(moneyInfo);
        }
        //获取
        return list;
    }
    @Override
    public BigDecimal getTBLijinAmount(Long actionId, String uid) throws LiJinGoodsException, LiJinUserException, LiJinAmountException {
@@ -78,11 +124,11 @@
    @Override
    public BigDecimal getTBLijinAmount(Long actionId, VIPEnum vipRank) throws LiJinGoodsException,LiJinAmountException {
    public BigDecimal getTBLijinAmount(Long actionId, VIPEnum vipRank) throws LiJinGoodsException, LiJinAmountException {
        //获取商品可创建的淘礼金面额,若不能创建需要抛出相关的异常(1.商品不支持礼金创建)
        BigDecimal money = null;
        // 1、判断商品
        try{
        try {
            TaoBaoGoodsBrief goods = TaoKeApiUtil.searchGoodsDetail(actionId);
            if (goods == null) {
                throw new LiJinGoodsException(LiJinGoodsException.CODE_GOODS_OFFLINE, "商品下线");
@@ -95,16 +141,16 @@
            //券后价 * 商品佣金比例 * 返利比例
            VipGradePotence potence = vipGradePotenceService.getPotenceByVipEnum(vipRank);
            if (potence != null && potence.getRebatePercent()!= null) {
                money = TaoBaoUtil.getGoodsHongBaoMoney(goods,potence.getRebatePercent(),false);
            if (potence != null && potence.getRebatePercent() != null) {
                money = TaoBaoUtil.getGoodsHongBaoMoney(goods, potence.getRebatePercent(), false);
            }
        } catch (TaoBaoGoodsDownException e){
        } 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,"礼金创建的金额超出规定范围");
            throw new LiJinAmountException(LiJinAmountException.CODE_LIJIN_AMOUNT_OUTOFRANGE, "礼金创建的金额超出规定范围");
        }
        return money;
@@ -119,8 +165,8 @@
        // 每日最大次数判断
        Integer numMax = potence.getTaolijinMaxNumber();
        if(numMax == null || numMax.intValue() <= 0) {
           throw new LiJinUserException(LiJinUserException.CODE_USER_CREATE_NUM_LIMIT, "用户创建淘礼金的次数超限");
        if (numMax == null || numMax.intValue() <= 0) {
            throw new LiJinUserException(LiJinUserException.CODE_USER_CREATE_NUM_LIMIT, "用户创建淘礼金的次数超限");
        }
        // 每日最大金额判断
@@ -131,13 +177,13 @@
        // 使用次数已经超过最大次数
        int numExpend = liJinExpendRecordService.countTodayNumByExpend(uid);
        if (numMax.intValue() < numExpend){
        if (numMax.intValue() < numExpend) {
            throw new LiJinUserException(LiJinUserException.CODE_USER_CREATE_NUM_LIMIT, "用户创建淘礼金的次数超限");
        }
        // 统计已使用金额
        BigDecimal moneyExpend = liJinExpendRecordService.countTodayMoneyByExpend(uid);
        if(moneyExpend != null) {
        if (moneyExpend != null) {
            moneyExpend = BigDecimal.valueOf(0);
        }
        // 消耗金额已经超过最大金额
@@ -146,7 +192,6 @@
        }
        return true;
    }
    @Override
@@ -158,25 +203,25 @@
        // 每日最大次数判断
        Integer numMax = potence.getTaolijinMaxNumber();
        if(numMax == null || numMax.intValue() <= 0) {
        if (numMax == null || numMax.intValue() <= 0) {
            throw new LiJinUserException(LiJinUserException.CODE_USER_CREATE_NUM_LIMIT, "用户创建淘礼金的次数超限");
        }
        // 每日最大金额判断
        BigDecimal moneyMax = potence.getTaolijinMaxMoney();
        if (moneyMax == null || moneyMax.compareTo(BigDecimal.valueOf(0)) <= 0 || moneyMax.compareTo(money) <= 0 ) {
        if (moneyMax == null || moneyMax.compareTo(BigDecimal.valueOf(0)) <= 0 || moneyMax.compareTo(money) <= 0) {
            throw new LiJinUserException(LiJinUserException.CODE_USER_CREATE_MONEY_LIMIT, "用户创建淘礼金的金额超限");
        }
        // 使用次数已经超过最大次数
        int numExpend = liJinExpendRecordService.countTodayNumByExpend(uid);
        if (numMax.intValue() < numExpend){
        if (numMax.intValue() < numExpend) {
            throw new LiJinUserException(LiJinUserException.CODE_USER_CREATE_NUM_LIMIT, "用户创建淘礼金的次数超限");
        }
        // 统计已使用金额
        BigDecimal moneyExpend = liJinExpendRecordService.countTodayMoneyByExpend(uid);
        if(moneyExpend != null) {
        if (moneyExpend != null) {
            moneyExpend = BigDecimal.valueOf(0);
        }
        // 加上本次需要使用金额
@@ -190,7 +235,6 @@
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public LiJinExpendRecord createTBLijin(String uid, Long goodsId) throws LiJinException, LiJinGoodsException, LiJinUserException, LiJinAmountException {
@@ -202,9 +246,9 @@
        //淘礼金创建
        TaoBaoGoodsBrief goods = null;
        try{
        try {
            goods = TaoKeApiUtil.searchGoodsDetail(goodsId);
        } catch (TaoBaoGoodsDownException e){
        } catch (TaoBaoGoodsDownException e) {
            throw new LiJinGoodsException(LiJinGoodsException.CODE_GOODS_OFFLINE, "商品下线");
        }
        if (goods == null) {
@@ -217,16 +261,11 @@
        // 执行创建淘礼金
        LiJinCreateParam params = getLiJinCreateParam();
        // TODO
       // params.setAppkey();
       //  params.setAppsecret();
        TaoLiJinDTO taoLiJinDTO = executeTaoLiJinAPI(uid, goodsId, lijinAmount, params);
        if (taoLiJinDTO == null) {
            throw new LiJinException(1, "淘宝API推广红包创建失败");
        }
        // 保存记录
        LiJinExpendRecord record = new LiJinExpendRecord();
@@ -243,49 +282,73 @@
    }
    // 创建淘礼金
    private TaoLiJinDTO executeTaoLiJinAPI(String uid, Long goodsId, BigDecimal lijinAmount, LiJinCreateParam params) throws LiJinGoodsException {
        String appkey =params.getAppkey();
        String appsecret = params.getAppsecret();
    /**
     * 调用账号以及淘宝API
     *
     * @param uid
     * @param goodsId
     * @param lijinAmount
     * @param params
     * @return
     * @throws LiJinGoodsException
     * @throws LiJinException
     */
    private TaoLiJinDTO executeTaoLiJinAPI(String uid, Long goodsId, BigDecimal lijinAmount, LiJinCreateParam params) throws LiJinGoodsException, LiJinException {
        // 查询供应商账号信息
        List<LiJinProviderAccount> listAccount = liJinProviderAccountService.listByProviderId(Constant.PROVIDER_DEFAULT_ID);
        if (listAccount == null || listAccount.size() == 0) {
            throw new LiJinException(1, "供应商账号不存在");
        }
        TaoLiJinDTO taoLiJinDTO = null;
        // 遍历账号 用可使用账号
        for (LiJinProviderAccount account : listAccount) {
            params.setAppkey(account.getAppKey());
            params.setAppsecret(account.getAppSecret());
            try {
                taoLiJinDTO = executeTaoLiJinAPI(uid, goodsId, lijinAmount, params);
                if (taoLiJinDTO != null) {
                    break;
                }
            } catch (LiJinException e) {
                // 通知相应供应商  TODO
                executor.execute(new Runnable() {
                    @Override
                    public void run() {
                        LiJinProviderNotice notice = new LiJinProviderNotice();
                        notice.setRead(false);
                        notice.setProviderId(account.getProviderId());
                        if (e.getCode() == LiJinException.CODE_TLJ_NO_MONEY) {
                            // 官方玩法钱包余额不足
                            notice.setTitle("玩法钱包余额不足");
                            notice.setContent("账号:" + account.getAccountName() + "官方玩法钱包余额不足");
                            notice.setType(NoticeTypeEnum.noMoney.name());
                            liJinProviderNoticeService.save(notice);
                        } else if (e.getCode() == LiJinException.CODE_TLJ_UN_PAID) {
                            // 未创建账户
                        }
                    }
                });
            }
        }
        // 创建淘礼金红包
        TaoLiJinDTO taoLiJinDTO = null;
        try {
            taoLiJinDTO = TaoKeApiUtil.createTaoLiJin(goodsId, params.getTitle(), lijinAmount,
                    params.getNum(), params.getSendStartTime(), params.getSendEndTime(),
                    params.getUseStartTime(), params.getUseEndTime(), new TaoKeAppInfo(appkey, appsecret, params.getPid()));
        } catch (LiJinException e) {
            // 通知相应供应商  TODO
            executor.execute(new Runnable() {
                @Override
                public void run() {
                    LiJinProviderAccount account  = liJinProviderAccountService.getByAppInfo(appkey, appsecret);
                    if (account == null) {
                        return;
                    }
                    LiJinProviderNotice notice = new LiJinProviderNotice();
                    notice.setRead(false);
                    notice.setProviderId(account.getProviderId());
                    if (e.getCode() == LiJinException.CODE_TLJ_FORBIDDEN) {
                        // 该商品不支持创建淘礼金红包
                    } else if (e.getCode() == LiJinException.CODE_TLJ_NO_MONEY) {
                        // 官方玩法钱包余额不足
                        notice.setTitle("玩法钱包余额不足");
                        notice.setContent("账号:"+ appkey +"官方玩法钱包余额不足");
                        notice.setType(NoticeTypeEnum.noMoney.name());
                        liJinProviderNoticeService.save(notice);
                    } else if (e.getCode() == LiJinException.CODE_TLJ_UN_PAID) {
                        // 未创建账户
                    }
                }
            });
        }
        return taoLiJinDTO;
        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()));
    }
    private BigDecimal getTBLijinAmount(TaoBaoGoodsBrief goods, VIPEnum vipRank) throws LiJinGoodsException,LiJinAmountException {
    /**
     * 获取商品可创建的礼金金额
     *
     * @param goods   商品
     * @param vipRank 会员等级
     * @return
     * @throws LiJinGoodsException
     * @throws LiJinAmountException
     */
    private BigDecimal getTBLijinAmount(TaoBaoGoodsBrief goods, VIPEnum vipRank) throws
            LiJinGoodsException, LiJinAmountException {
        //获取商品可创建的淘礼金面额,若不能创建需要抛出相关的异常(1.商品不支持礼金创建)
        BigDecimal money = null;
@@ -296,19 +359,20 @@
        //券后价 * 商品佣金比例 * 返利比例
        VipGradePotence potence = vipGradePotenceService.getPotenceByVipEnum(vipRank);
        if (potence != null && potence.getRebatePercent()!= null) {
            money = TaoBaoUtil.getGoodsHongBaoMoney(goods,potence.getRebatePercent(),false);
        if (potence != null && potence.getRebatePercent() != null) {
            money = TaoBaoUtil.getGoodsHongBaoMoney(goods, potence.getRebatePercent(), false);
        }
        // 金额为空 或者小于零 则抛出异常
        if (money == null || money.compareTo(BigDecimal.valueOf(0)) <= 0) {
            throw new LiJinAmountException(LiJinAmountException.CODE_LIJIN_AMOUNT_OUTOFRANGE,"礼金创建的金额超出规定范围");
            throw new LiJinAmountException(LiJinAmountException.CODE_LIJIN_AMOUNT_OUTOFRANGE, "礼金创建的金额超出规定范围");
        }
        return money;
    }
    /**
     * 创建淘礼金基本参数
     *
     * @return
     */
    private LiJinCreateParam getLiJinCreateParam() {