admin
2025-02-25 30d8e227e8d823b6c38c3b9c90ac2df03b63befe
fanli/src/main/java/com/yeshi/fanli/service/manger/goods/TaoBaoLinkManager.java
@@ -1,10 +1,12 @@
package com.yeshi.fanli.service.manger.goods;
import com.yeshi.common.entity.taobao.TaoKeAppInfo;
import com.yeshi.goods.facade.dto.taobao.dataoke.DaTaoKeFilterResult;
import com.yeshi.fanli.entity.taobao.*;
import com.yeshi.goods.facade.entity.taobao.TaoBaoGoodsBrief;
import com.yeshi.goods.facade.entity.taobao.dataoke.DaTaoKeDetailV2;
import com.yeshi.fanli.entity.SystemEnum;
import com.yeshi.fanli.entity.SystemPIDInfo;
import com.yeshi.fanli.entity.taobao.PidUser;
import com.yeshi.fanli.entity.taobao.TBPid;
import com.yeshi.fanli.entity.taobao.TaoBaoLink;
import com.yeshi.fanli.entity.taobao.TaoBaoUnionConfig;
import com.yeshi.fanli.exception.taobao.TaoBaoConvertLinkException;
import com.yeshi.fanli.exception.taobao.TaobaoGoodsDownException;
import com.yeshi.fanli.exception.tlj.UserTaoLiJinNewbiesException;
@@ -12,21 +14,25 @@
import com.yeshi.fanli.log.LogType;
import com.yeshi.fanli.service.inter.redpack.UserTaoLiJinNewbiesService;
import com.yeshi.fanli.service.inter.taobao.TaoBaoUnionConfigService;
import com.yeshi.goods.facade.service.DaTaoKeGoodsDetailV2Service;
import com.yeshi.fanli.service.inter.user.TBPidService;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.RedisManager;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.TaoBaoConstant;
import com.yeshi.fanli.service.manger.PIDManager;
import com.yeshi.fanli.util.*;
import com.yeshi.fanli.util.cache.TaoBaoGoodsCacheUtil;
import com.yeshi.goods.facade.utils.taobao.DaTaoKeApiUtil;
import com.yeshi.fanli.util.taobao.DaTaoKeUtil;
import com.yeshi.fanli.util.taobao.TaoBaoUtil;
import com.yeshi.fanli.util.taobao.TaoKeApiUtil;
import com.yeshi.goods.facade.dto.taobao.dataoke.DaTaoKeFilterResult;
import com.yeshi.goods.facade.entity.taobao.TaoBaoCouponCache;
import com.yeshi.goods.facade.entity.taobao.TaoBaoGoodsBrief;
import com.yeshi.goods.facade.service.DaTaoKeGoodsDetailV2Service;
import com.yeshi.goods.facade.service.TaoBaoCouponCacheService;
import com.yeshi.goods.facade.utils.factory.TaoBaoCouponCacheFactory;
import com.yeshi.goods.facade.utils.taobao.DaTaoKeApiUtil;
import org.springframework.stereotype.Component;
import org.yeshi.utils.TimeUtil;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.Date;
@Component
public class TaoBaoLinkManager {
@@ -52,27 +58,33 @@
    @Resource
    private UserTaoLiJinNewbiesService userTaoLiJinNewbiesService;
    @Resource
    private TaoBaoCouponCacheService taoBaoCouponCacheService;
    @Resource
    private PIDManager pidManager;
    /**
     * 获取淘宝购买链接
     * 只领券
     *
     * @param uid
     * @param auctionId
     * @param specialId
     * @param pid
     * @return
     */
    public TaoBaoLink getTaoBaoLinkForBuy(Long uid, Long auctionId, String specialId, String pid) throws TaoBaoConvertLinkException {
        if (uid == null || uid <= 0) {
            throw new TaoBaoConvertLinkException(1, "用户ID不能为空");
        }
        if (auctionId == null || auctionId <= 0) {
    public TaoBaoLink getTaoBaoLinkForRecieveCoupon(SystemEnum system, String auctionId, String specialId, String pid) throws TaoBaoConvertLinkException {
        if (StringUtil.isNullOrEmpty(auctionId)) {
            throw new TaoBaoConvertLinkException(2, "商品ID不能为空");
        }
        TaoKeAppInfo app = new TaoKeAppInfo();
        app.setAppKey(TaoBaoConstant.TAOBAO_AUTH_APPKEY);
        app.setAppSecret(TaoBaoConstant.TAOBAO_AUTH_APPSECRET);
        app.setPid(TaoBaoConstant.TAOBAO_SPECIAL_PID_DEFAULT);
        if (pid == null)
            app.setPid(pidManager.getPidCache(system, Constant.SOURCE_TYPE_TAOBAO, SystemPIDInfo.PidType.fanli));
        else
            app.setPid(pid);
        TaoBaoLink taoBaoLink = new TaoBaoLink();
        taoBaoLink.setAuctionId(auctionId);
@@ -88,23 +100,8 @@
        String link = null;
        try {
            link = DaTaoKeApiUtil.convertLink(auctionId, app.getPid());
            link = DaTaoKeApiUtil.convertLink(auctionId, app.getPid(),false);
        } catch (Exception e) {
        }
        DaTaoKeDetailV2 v2 = daTaoKeGoodsDetailV2Service.selectByAuctionId(auctionId);
        if (v2 != null) {
            try {
                TaoBaoGoodsBrief goods = redisManager.getTaoBaoGoodsBrief(auctionId);
                if (goods != null) {
                    if (DaTaoKeUtil.canFilterCouponInfo(goods, v2)) {
                        // link = DaTaoKeApiUtil.convertLink(auctionId,
                        // app.getPid());
                    }
                }
            } catch (TaobaoGoodsDownException e) {
                throw new TaoBaoConvertLinkException(4, "商品ID不能为空");
            }
        }
        if (!StringUtil.isNullOrEmpty(link)) {
@@ -113,10 +110,14 @@
        if (!StringUtil.isNullOrEmpty(link)) {
            taoBaoLink.setCouponLink(link);
            //缓存
            cacheCouponInfo(auctionId, link, app.getPid());
            return taoBaoLink;
        }
        TaoBaoGoodsBrief goods = TaoKeApiUtil.specialConvertCoupon(auctionId, app, specialId, null);
        TaoBaoGoodsBrief goods = TaoKeApiUtil.specialConvertCouponV2(auctionId, app, specialId, null);
        if (goods == null) {
            throw new TaoBaoConvertLinkException(1, "");
        }
@@ -127,7 +128,105 @@
        if (!StringUtil.isNullOrEmpty(goods.getYsylClickUrl()))
            taoBaoLink.setCouponLink(goods.getYsylClickUrl());
        taoBaoLink.setGoods(goods);
        //缓存
        goods.setCouponLink(taoBaoLink.getCouponLink());
        cacheCouponInfo(auctionId, taoBaoLink.getCouponLink(), app.getPid());
        return taoBaoLink;
    }
    /**
     * 获取淘宝购买链接
     *
     * @param uid
     * @param auctionId
     * @param pid
     * @return
     */
    public TaoBaoLink getTaoBaoLinkForBuy(SystemEnum system, Long uid, String auctionId, String specialId, String pid) throws TaoBaoConvertLinkException {
        if (uid == null || uid <= 0) {
            throw new TaoBaoConvertLinkException(1, "用户ID不能为空");
        }
        return getTaoBaoLinkForRecieveCoupon(system, auctionId, specialId, pid);
    }
    /**
     * 记录淘宝转链的券信息
     *
     * @param goods
     * @param pid
     */
    private void cacheCouponInfo(TaoBaoGoodsBrief goods, String pid) {
        if (goods.getCouponAmount() == null || goods.getCouponAmount().compareTo(new BigDecimal(0)) <= 0) {
            return;
        }
        if (StringUtil.isNullOrEmpty(goods.getCouponLink()))
            return;
        if (StringUtil.isNullOrEmpty(goods.getCouponEffectiveStartTime()) || StringUtil.isNullOrEmpty(goods.getCouponEffectiveEndTime()))
            return;
        try {
            TaoBaoCouponCache cache = TaoBaoCouponCacheFactory.create(goods.getAuctionId(), goods.getCouponActivityId(), goods.getCouponAmount(), goods.getCouponStartFee(), new Date(TimeUtil.convertToTimeTemp(goods.getCouponEffectiveStartTime(), "yyyy-MM-dd")), new Date(TimeUtil.convertToTimeTemp(goods.getCouponEffectiveEndTime(), "yyyy-MM-dd")), pid, goods.getCouponLink());
            if (cache != null) {
                //异步保存
                ThreadUtil.run(new Runnable() {
                    @Override
                    public void run() {
                        taoBaoCouponCacheService.save(cache);
                    }
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private void cacheCouponInfo(String auctionId, String link, String pid) {
        String activityId = TaoBaoUtil.getActivityIdFromCouponLink(link);
        if (StringUtil.isNullOrEmpty(activityId))
            return;
        //异步保存
        ThreadUtil.run(new Runnable() {
            @Override
            public void run() {
                TaoKeApiUtil.QuanInfo coupon = TaoKeApiUtil.getQuanInfo(auctionId, activityId);
                if (coupon == null)
                    return;
                TaoBaoGoodsBrief goods = new TaoBaoGoodsBrief();
                goods.setCouponLink(link);
                goods.setCouponAmount(coupon.coupon_amount);
                goods.setCouponStartFee(coupon.coupon_start_fee);
                goods.setCouponEffectiveStartTime(coupon.coupon_start_time);
                goods.setCouponEffectiveEndTime(coupon.coupon_end_time);
                goods.setAuctionId(auctionId);
                goods.setCouponActivityId(activityId);
                if (goods.getCouponAmount() == null || goods.getCouponAmount().compareTo(new BigDecimal(0)) <= 0) {
                    return;
                }
                if (StringUtil.isNullOrEmpty(goods.getCouponLink()))
                    return;
                if (StringUtil.isNullOrEmpty(goods.getCouponEffectiveStartTime()) || StringUtil.isNullOrEmpty(goods.getCouponEffectiveEndTime()))
                    return;
                try {
                    TaoBaoCouponCache cache = TaoBaoCouponCacheFactory.create(goods.getAuctionId(), goods.getCouponActivityId(), goods.getCouponAmount(), goods.getCouponStartFee(), new Date(TimeUtil.convertToTimeTemp(goods.getCouponEffectiveStartTime(), "yyyy-MM-dd")), new Date(TimeUtil.convertToTimeTemp(goods.getCouponEffectiveEndTime(), "yyyy-MM-dd") + 1000 * 60 * 60 * 24L), pid, goods.getCouponLink());
                    if (cache != null) {
                        taoBaoCouponCacheService.save(cache);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    /**
@@ -139,12 +238,13 @@
     * @param pid
     * @return
     */
    public TaoBaoLink getTaoBaoLinkForShare(Long uid, Long auctionId, String relationId, String pid) throws TaoBaoConvertLinkException {
    public TaoBaoLink getTaoBaoLinkForShare(SystemEnum system, Long uid, String auctionId, String relationId, String pid) throws
            TaoBaoConvertLinkException {
        if (uid == null || uid <= 0) {
            throw new TaoBaoConvertLinkException(1, "用户ID不能为空");
        }
        if (auctionId == null || auctionId <= 0) {
        if (StringUtil.isNullOrEmpty(auctionId)) {
            throw new TaoBaoConvertLinkException(2, "商品ID不能为空");
        }
@@ -152,7 +252,7 @@
        if (!StringUtil.isNullOrEmpty(relationId)) {
            if (StringUtil.isNullOrEmpty(pid))
                pid = TaoBaoConstant.TAOBAO_RELATION_PID_DEFAULT;
                pid = pidManager.getPidCache(system, Constant.SOURCE_TYPE_TAOBAO, SystemPIDInfo.PidType.share);
            String appId = pid.split("_")[2];
            String adzoneId = pid.split("_")[3];
            TaoBaoUnionConfig taoBaoUnionConfig = taoBaoUnionConfigService.getConfigByAppIdCache(appId);
@@ -186,7 +286,7 @@
        if (StringUtil.isNullOrEmpty(goods.getCouponLink()) && !goods.getAuctionUrl().contains("s.click.taobao.com")) {
            TaoBaoGoodsBrief taoBaoLink = TaoKeApiUtil.specialConvertCoupon(auctionId, info, null, relationId);
            TaoBaoGoodsBrief taoBaoLink = TaoKeApiUtil.specialConvertCouponV2(auctionId, info, null, relationId);
            if (taoBaoLink == null) {
                throw new TaoBaoConvertLinkException(201, "商品转链失败");
            }
@@ -195,29 +295,31 @@
        }
        String link = taoBaoGoodsCacheUtil.getBaseConvertLink(auctionId, info.getPid());
        if (link != null) {
        if (link != null) {//有缓存
            goods.setCouponLink(link);
        } else {// 缓存
        } else {// 没有缓存
            DaTaoKeFilterResult result = daTaoKeGoodsDetailV2Service.filterTaoBaoGoods(goods);
            if (result.getFilterType() == DaTaoKeFilterResult.FILTER_TYPE_COUPON
                    || result.getFilterType() == DaTaoKeFilterResult.FILTER_TYPE_PRICE_AND_COUPON) {
                link = DaTaoKeApiUtil.convertLink(auctionId, info.getPid());
                link = DaTaoKeApiUtil.convertLink(auctionId, info.getPid(),true);
            } else if (goods.getCouponAmount() != null && goods.getCouponAmount().compareTo(new BigDecimal(0)) > 0) {// 有券
                link = DaTaoKeApiUtil.convertLink(auctionId, info.getPid());
                link = DaTaoKeApiUtil.convertLink(auctionId, info.getPid(),true);
            }
            if (!StringUtil.isNullOrEmpty(link)) {
                goods.setCouponLink(link);
                taoBaoGoodsCacheUtil.cacheBaseConvertLink(auctionId, info.getPid(), link);
            }
            if (StringUtil.isNullOrEmpty(link)) {
                TaoBaoGoodsBrief taoBaoLink = TaoKeApiUtil.specialConvertCoupon(auctionId, info, null, relationId);
                //保存券链接
                cacheCouponInfo(goods, info.getPid());
            } else {
                TaoBaoGoodsBrief taoBaoLink = TaoKeApiUtil.specialConvertCouponV2(auctionId, info, null, relationId);
                if (taoBaoLink == null) {
                    throw new TaoBaoConvertLinkException(201, "商品转链失败");
                }
                goods.setCouponLink(taoBaoLink.getCouponLink());
                goods.setAuctionUrl(taoBaoLink.getAuctionUrl());
                //保存券链接
                cacheCouponInfo(goods, info.getPid());
            }
        }
@@ -238,13 +340,13 @@
        if (!StringUtil.isNullOrEmpty(tbLink.getCouponLink())) {// 通过立即推广方式获取淘口令成功
            String quanToken = convertLinkManager.createTaoBaoToken(uid, goods.getPictUrl(), goods.getTitle(),
                    tbLink.getCouponLink());
                    tbLink.getCouponLink(), false);
            if (!StringUtil.isNullOrEmpty(quanToken)) {
                tbLink.setTaoToken(quanToken);
            }
        } else if (!StringUtil.isNullOrEmpty(tbLink.getClickUrl())) {
            String quanToken = convertLinkManager.createTaoBaoToken(uid, goods.getPictUrl(), goods.getTitle(),
                    tbLink.getClickUrl());
                    tbLink.getClickUrl(), false);
            if (!StringUtil.isNullOrEmpty(quanToken)) {
                tbLink.setTaoToken(quanToken);
            }
@@ -271,11 +373,11 @@
     * @param pid
     * @return
     */
    public TaoBaoLink getTaoLiJinLinkForBuy(Long uid, Long auctionId, String pid) throws TaoBaoConvertLinkException {
    public TaoBaoLink getTaoLiJinLinkForBuy(Long uid, String auctionId, String pid) throws TaoBaoConvertLinkException {
        if (uid == null || uid <= 0)
            throw new TaoBaoConvertLinkException(1, "用户ID不能为空");
        if (auctionId == null || auctionId <= 0)
        if (StringUtil.isNullOrEmpty(auctionId))
            throw new TaoBaoConvertLinkException(1, "商品ID不能为空");
        TaoBaoGoodsBrief goods = null;
@@ -313,12 +415,13 @@
     * @param pid
     * @return
     */
    public TaoBaoLink getTaoLiJinLinkForShare(Long uid, Long auctionId, String relationId, String pid) throws TaoBaoConvertLinkException {
    public TaoBaoLink getTaoLiJinLinkForShare(SystemEnum system, Long uid, String auctionId, String relationId, String pid) throws
            TaoBaoConvertLinkException {
        if (uid == null || uid <= 0) {
            throw new TaoBaoConvertLinkException(1, "用户ID不能为空");
        }
        if (auctionId == null || auctionId <= 0) {
        if (StringUtil.isNullOrEmpty(auctionId)) {
            throw new TaoBaoConvertLinkException(2, "商品ID不能为空");
        }
@@ -326,7 +429,7 @@
        if (!StringUtil.isNullOrEmpty(relationId)) {
            if (StringUtil.isNullOrEmpty(pid))
                pid = TaoBaoConstant.TAOBAO_RELATION_PID_DEFAULT;
                pid = pidManager.getPidCache(system, Constant.SOURCE_TYPE_TAOBAO, SystemPIDInfo.PidType.share);
            String appId = pid.split("_")[2];
            String adzoneId = pid.split("_")[3];
            TaoBaoUnionConfig taoBaoUnionConfig = taoBaoUnionConfigService.getConfigByAppIdCache(appId);
@@ -361,7 +464,7 @@
        if (StringUtil.isNullOrEmpty(goods.getCouponLink()) && !goods.getAuctionUrl().contains("s.click.taobao.com")) {
            TaoBaoUnionConfig taoBaoUnionConfig = taoBaoUnionConfigService
                    .getConfigByAppIdCache(info.getPid().split("_")[2]);
            TaoBaoGoodsBrief taoBaoLink = TaoKeApiUtil.specialConvertCoupon(auctionId, info, null, relationId);
            TaoBaoGoodsBrief taoBaoLink = TaoKeApiUtil.specialConvertCouponV2(auctionId, info, null, relationId);
            if (taoBaoLink == null) {
                throw new TaoBaoConvertLinkException(201, "商品转链失败");
            }