admin
2021-06-30 0912f56a392bdf48315747c64ec0c18bf0aa29a6
fanli/src/main/java/com/yeshi/fanli/service/impl/dynamic/GoodsEvaluateServiceImpl.java
@@ -1,42 +1,15 @@
package com.yeshi.fanli.service.impl.dynamic;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import javax.annotation.Resource;
import javax.imageio.ImageIO;
import com.yeshi.fanli.entity.SystemEnum;
import com.yeshi.fanli.exception.taobao.TaoBaoConvertLinkException;
import com.yeshi.fanli.service.manger.goods.TaoBaoLinkManager;
import org.apache.commons.beanutils.PropertyUtils;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.core.task.TaskExecutor;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.yeshi.utils.DateUtil;
import org.yeshi.utils.ImageCropUtil;
import org.yeshi.utils.tencentcloud.COSManager;
import com.yeshi.common.vo.ClientTextStyleVO;
import com.yeshi.fanli.dao.dynamic.GoodsEvaluateDao;
import com.yeshi.fanli.dto.GoodsMoneyConfigParamsDTO;
import com.yeshi.fanli.dto.jd.JDCouponInfo;
import com.yeshi.fanli.dto.pdd.PDDGoodsDetail;
import com.yeshi.fanli.dto.suning.SuningGoodsInfo;
import com.yeshi.fanli.dto.vip.goods.VIPGoodsInfo;
import com.yeshi.fanli.entity.SystemEnum;
import com.yeshi.fanli.entity.SystemFunction;
import com.yeshi.fanli.entity.SystemPIDInfo;
import com.yeshi.fanli.entity.bus.activity.ActivityRuleUser;
import com.yeshi.fanli.entity.bus.activity.ActivityUser;
import com.yeshi.fanli.entity.bus.clazz.GoodsClass;
@@ -49,13 +22,13 @@
import com.yeshi.fanli.entity.dynamic.SimpleGoods;
import com.yeshi.fanli.entity.jd.JDGoods;
import com.yeshi.fanli.entity.system.ConfigKeyEnum;
import com.yeshi.goods.facade.entity.taobao.TaoBaoGoodsBrief;
import com.yeshi.fanli.entity.taobao.TaoBaoLink;
import com.yeshi.goods.facade.entity.taobao.dataoke.DaTaoKeDetailV2;
import com.yeshi.fanli.exception.dynamic.ActivityUserException;
import com.yeshi.fanli.exception.dynamic.GoodsEvaluateException;
import com.yeshi.fanli.exception.goods.ConvertLinkExceptionException;
import com.yeshi.fanli.exception.taobao.TaoBaoConvertLinkException;
import com.yeshi.fanli.exception.taobao.TaobaoGoodsDownException;
import com.yeshi.fanli.lijin.manager.GoodsLijinMnager;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.activity.ActivityUserService;
import com.yeshi.fanli.service.inter.config.ConfigService;
@@ -63,26 +36,50 @@
import com.yeshi.fanli.service.inter.goods.ShareGoodsService;
import com.yeshi.fanli.service.inter.order.OrderHongBaoMoneyComputeService;
import com.yeshi.fanli.service.inter.order.config.HongBaoManageService;
import com.yeshi.goods.facade.service.DaTaoKeGoodsDetailV2Service;
import com.yeshi.fanli.service.manger.PIDManager;
import com.yeshi.fanli.service.manger.goods.ConvertLinkManager;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.FilePathEnum;
import com.yeshi.fanli.util.FileUtil;
import org.yeshi.utils.MoneyBigDecimalUtil;
import com.yeshi.fanli.util.RedisManager;
import com.yeshi.fanli.util.StringUtil;
import org.yeshi.utils.TimeUtil;
import com.yeshi.fanli.service.manger.goods.TaoBaoLinkManager;
import com.yeshi.fanli.service.manger.goods.tb.DaTaoKeTipOffManager;
import com.yeshi.fanli.util.*;
import com.yeshi.fanli.util.cache.JDGoodsCacheUtil;
import com.yeshi.fanli.util.cache.PinDuoDuoCacheUtil;
import com.yeshi.fanli.util.factory.CommonGoodsFactory;
import com.yeshi.fanli.util.factory.goods.GoodsDetailVOFactory;
import com.yeshi.fanli.util.jd.JDApiUtil;
import com.yeshi.fanli.util.jd.JDUtil;
import com.yeshi.fanli.util.pinduoduo.PinDuoDuoApiUtil;
import com.yeshi.fanli.util.taobao.DaTaoKeTipOffUtil;
import com.yeshi.fanli.util.taobao.DaTaoKeUtil;
import com.yeshi.fanli.util.taobao.TaoBaoUtil;
import com.yeshi.fanli.util.taobao.TaoKeApiUtil;
import com.yeshi.fanli.vo.goods.CouponInfoVO;
import com.yeshi.fanli.vo.goods.GoodsDetailVO;
import com.yeshi.common.vo.ClientTextStyleVO;
import com.yeshi.goods.facade.dto.taobao.dataoke.DaTaoKeListTopOffDTO;
import com.yeshi.goods.facade.entity.taobao.TaoBaoGoodsBrief;
import com.yeshi.goods.facade.entity.taobao.dataoke.DaTaoKeDetailV2;
import com.yeshi.goods.facade.service.DaTaoKeGoodsDetailV2Service;
import org.apache.commons.beanutils.PropertyUtils;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.core.task.TaskExecutor;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.yeshi.utils.DateUtil;
import org.yeshi.utils.ImageCropUtil;
import org.yeshi.utils.MoneyBigDecimalUtil;
import org.yeshi.utils.TimeUtil;
import org.yeshi.utils.tencentcloud.COSManager;
import javax.annotation.Resource;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;
@Service
public class GoodsEvaluateServiceImpl implements GoodsEvaluateService {
@@ -125,6 +122,13 @@
    @Resource
    private DaTaoKeGoodsDetailV2Service daTaoKeGoodsDetailV2Service;
    @Resource
    private PIDManager pidManager;
    @Resource
    private GoodsLijinMnager goodsLijinMnager;
    @Override
    public void switchState(String id) throws GoodsEvaluateException {
@@ -340,6 +344,9 @@
                }
            }
        }
        if (oldGoodsVO != null) {
            oldGoodsVO.setCreatetime(null);
        }
        // 视频部分
        if (fileRequest != null) {
@@ -447,6 +454,8 @@
            throw new GoodsEvaluateException(1, "该商品信息不存在");
        }
        goodsDetailVO.setCreatetime(null);
        List<ImgInfo> tempList = new ArrayList<ImgInfo>();
        int totalImg = 0;
        if (listpic != null && listpic.size() > 0) {
@@ -546,7 +555,7 @@
        String commentText = "";
        if (addComment) {
            if (goodsType == Constant.SOURCE_TYPE_TAOBAO) {
                TaoBaoLink taoBaoLink = taoBaoLinkManager.getTaoBaoLinkForShare(1L, Long.parseLong(goodsId), "0", null);
                TaoBaoLink taoBaoLink = taoBaoLinkManager.getTaoBaoLinkForShare(system, 1L, Long.parseLong(goodsId), "0", null);
                String template = configService.getValue(ConfigKeyEnum.quickShareTBCommentText.getKey(), system);
                commentText = template.replace("[淘口令]", TaoBaoUtil.filterTaoToken(taoBaoLink.getTaoToken()));
            } else if (goodsType == Constant.SOURCE_TYPE_JD) {
@@ -557,15 +566,16 @@
                }
                String materialId = "https://item.jd.com/" + goodsId + ".html";
                String jumpLink = JDApiUtil.convertLinkWithSubUnionId(materialId, couponUrl, null,
                        JDApiUtil.POSITION_SHARE + "", "1");
                        pidManager.getPidCache(system, Constant.SOURCE_TYPE_JD, SystemPIDInfo.PidType.share), "1");
                String template = configService.getValue(ConfigKeyEnum.quickShareJDCommentText.getKey(), system);
                if (jumpLink == null) {
                    throw new GoodsEvaluateException(1, "该商品转链失败");
                }
                commentText = template.replace("[链接]", jumpLink);
            } else if (goodsType == Constant.SOURCE_TYPE_PDD) {
                PDDGoodsDetail goodsDetail = PinDuoDuoApiUtil.getGoodsDetail(Long.parseLong(goodsId), PinDuoDuoApiUtil.PID_SHARE + "", "1");
                String jumpLink = PinDuoDuoApiUtil.getPromotionUrl(goodsDetail.getGoodsSign(), PinDuoDuoApiUtil.PID_SHARE + "", "1");
                String sharePid = pidManager.getPidCache(system, Constant.SOURCE_TYPE_PDD, SystemPIDInfo.PidType.share);
                PDDGoodsDetail goodsDetail = PinDuoDuoApiUtil.getGoodsDetail(Long.parseLong(goodsId), sharePid, "1");
                String jumpLink = PinDuoDuoApiUtil.getPromotionUrl(goodsDetail.getGoodsSign(), sharePid, "1");
                if (jumpLink == null) {
                    throw new GoodsEvaluateException(1, "该商品转链失败");
                }
@@ -613,7 +623,7 @@
    private String createTokenAndLink(GoodsDetailVO goodsDetailVO, SystemEnum system) throws Exception {
        String commentText = "";
        if (goodsDetailVO.getGoodsType() == Constant.SOURCE_TYPE_TAOBAO) {
            TaoBaoLink taoBaoLink = taoBaoLinkManager.getTaoBaoLinkForShare(1L, Long.parseLong(goodsDetailVO.getGoodsId()), "0", null);
            TaoBaoLink taoBaoLink = taoBaoLinkManager.getTaoBaoLinkForShare(system, 1L, Long.parseLong(goodsDetailVO.getGoodsId()), "0", null);
            String template = configService.getValue(ConfigKeyEnum.quickShareTBCommentText.getKey(), system);
            commentText = template.replace("[淘口令]", TaoBaoUtil.filterTaoToken(taoBaoLink.getTaoToken()));
        } else if (goodsDetailVO.getGoodsType() == Constant.SOURCE_TYPE_JD) {
@@ -625,16 +635,19 @@
                couponUrl = couponInfo.getLink();
            }
            String materialId = "https://item.jd.com/" + goodsDetailVO.getGoodsId() + ".html";
            String jumpLink = JDApiUtil.convertLinkWithSubUnionId(materialId, couponUrl, null, JDApiUtil.POSITION_SHARE + "",
            String jumpLink = JDApiUtil.convertLinkWithSubUnionId(materialId, couponUrl, null, pidManager.getPidCache(system, Constant.SOURCE_TYPE_JD, SystemPIDInfo.PidType.share),
                    "1");
            String template = configService.getValue(ConfigKeyEnum.quickShareJDCommentText.getKey(), system);
            commentText = template.replace("[链接]", jumpLink);
        } else if (goodsDetailVO.getGoodsType() == Constant.SOURCE_TYPE_PDD) {
            String sharePid = pidManager.getPidCache(system, Constant.SOURCE_TYPE_PDD, SystemPIDInfo.PidType.share);
            PDDGoodsDetail goodsDetail = PinDuoDuoApiUtil.getGoodsDetail(Long.parseLong(goodsDetailVO.getGoodsId()),
                    PinDuoDuoApiUtil.PID_SHARE + "", "1");
                    sharePid, "1");
            String jumpLink = PinDuoDuoApiUtil.getPromotionUrl(goodsDetail.getGoodsSign(),
                    PinDuoDuoApiUtil.PID_SHARE + "", "1");
                    sharePid, "1");
            String template = configService.getValue(ConfigKeyEnum.quickSharePDDCommentText.getKey(), system);
            commentText = template.replace("[链接]", jumpLink);
        }
@@ -672,6 +685,8 @@
            PDDGoodsDetail goodsInfo = pinDuoDuoCacheUtil.getGoodsInfo(goodsId);
            goodsDetail = GoodsDetailVOFactory.convertPDDGoods(goodsInfo, params);
        }
        if (goodsDetail != null)
            goodsDetail.setCreatetime(null);
        return goodsDetail;
    }
@@ -911,7 +926,7 @@
                }
            } else if (i == 0 && kind == 1) {
                try {
                    convertLinkManager.convertLinkFromText(content, Constant.LINK_TOKEN_VERIFY_UID, true, false);
                    convertLinkManager.convertLinkFromText(system, content, Constant.LINK_TOKEN_VERIFY_UID, true, false);
                } catch (Exception e) {
                    throw new GoodsEvaluateException(1, "不包含可转链的口令与链接");
                }
@@ -936,7 +951,7 @@
    }
    @Override
    public void saveCurrencyCoupon(String pid, int kind, CommentInfo commentInfo)
    public void saveCurrencyCoupon(SystemEnum system, String pid, int kind, CommentInfo commentInfo)
            throws GoodsEvaluateException, Exception {
        if (StringUtil.isNullOrEmpty(pid)) {
            throw new GoodsEvaluateException(1, "请保存第一部分信息");
@@ -981,7 +996,7 @@
        String content = commentInfo.getContent();
        if (!StringUtil.isNullOrEmpty(content) && commentInfo.getNeedSpin()) {
            try {
                convertLinkManager.convertLinkFromText(content, Constant.LINK_TOKEN_VERIFY_UID, true, false);
                convertLinkManager.convertLinkFromText(system, content, Constant.LINK_TOKEN_VERIFY_UID, true, false);
            } catch (ConvertLinkExceptionException e) {
                if (ConvertLinkExceptionException.CODE_NONE != e.getCode()) {
                    throw new GoodsEvaluateException(1, "包含不可转链的口令与链接");
@@ -1686,6 +1701,7 @@
                    if (typeEnum != null && typeEnum == EvaluateEnum.single) {
                        GoodsDetailVO goods = evaluateNew.getGoods();
                        goods.setCreatetime(null);
                        if (goods != null) {
                            String content = commentInfoNew.getContent();
                            if (!StringUtil.isNullOrEmpty(content)) {
@@ -1705,6 +1721,9 @@
                                for (String st : activityIdList)
                                    content = content.replace(st, "");
                                content = content.replace("{relationId}", "");
                                if (system == SystemEnum.yhqjx) {
                                    content = content.replace("\n", "<br>");
                                }
                                commentInfoNew.setContent(content);
                            }
                        }
@@ -1723,6 +1742,7 @@
                    CommentInfoEnum typeComment = commentInfoNew.getTypeEnum();
                    if (typeComment != null && typeComment == CommentInfoEnum.goodsCoupon) {
                        GoodsDetailVO goods = evaluateNew.getGoods();
                        goods.setCreatetime(null);
                        if (goods != null && goods.isHasCoupon()) {
                            commentNew.add(commentInfoNew);
                            continue;
@@ -1764,9 +1784,23 @@
                evaluateNew.setComments(commentNew);
                if (typeEnum != null && typeEnum == EvaluateEnum.single) {
                    if (!SystemInfoUtil.hasFunctions(system, SystemFunction.share)) {
                        List<ImgInfo> imgList = evaluateNew.getImgList();
                        if (imgList != null) {
                            for (ImgInfo imgInfo : imgList) {
                                imgInfo.setGoods(null);
                                if (imgInfo.getType() == ImgEnum.goods)
                                    imgInfo.setType(ImgEnum.img);
                            }
                        }
                    }
                    if (!currencyCoupon && !singleCoupn) { // 所有券评论下架
                        GoodsDetailVO goods = evaluateNew.getGoods();
                        if (goods != null) {
                            goods.setCreatetime(null);
                            goods.setState(1); // 评论不存在 下架
                            evaluateNew.setRemarks("评论验证下架");
                        }
@@ -1778,6 +1812,9 @@
                                if (simpleGoods != null) {
                                    simpleGoods.setState(1);
                                    simpleGoods.setRemarks("评论验证下架");
                                }
                                if (system == SystemEnum.yhqjx) {
                                    imgInfo.setGoods(null);
                                }
                            }
@@ -1791,17 +1828,19 @@
        List<GoodsEvaluate> listOBJ = list;
        // 更新商品信息
        executor.execute(new Runnable() {
            @Override
            public void run() {
                updateGoodInfo(listOBJ);
        executor.execute(new
                // 删除已过期
                removeOverdue();
                                 Runnable() {
                                     @Override
                                     public void run() {
                                         updateGoodInfo(listOBJ);
                removeDownGoods();
            }
        });
                                         // 删除已过期
                                         removeOverdue();
                                         removeDownGoods();
                                     }
                                 });
        return listNew;
    }
@@ -2148,7 +2187,7 @@
        // 生成口令
        String token = null;
        try {
            TaoBaoLink taoBaoLink = taoBaoLinkManager.getTaoBaoLinkForShare(Constant.LINK_TOKEN_VERIFY_UID, goodsBrief.getAuctionId(), "1", null);
            TaoBaoLink taoBaoLink = taoBaoLinkManager.getTaoBaoLinkForShare(system, Constant.LINK_TOKEN_VERIFY_UID, goodsBrief.getAuctionId(), "1", null);
            token = taoBaoLink.getTaoToken();
        } catch (TaoBaoConvertLinkException e) {
            e.printStackTrace();
@@ -2242,6 +2281,152 @@
        return result;
    }
    @Resource
    private DaTaoKeTipOffManager daTaoKeTipOffManager;
    @Override
    public int addGoodsEvaluate(DaTaoKeListTopOffDTO dto, ActivityUser user, SystemEnum system) throws GoodsEvaluateException {
        if (dto == null || user == null || system == null) {
            throw new GoodsEvaluateException(1, "相关参数不能为空");
        }
        String title = null;
        try {
            title = daTaoKeTipOffManager.convertLinkForEvaluateWithEncode(dto, system);
        } catch (Exception e) {
            throw new GoodsEvaluateException(1, "转链出错");
        }
        Date limitDate = DateUtil.reduceDay(new Date(), 7);
        String identifyCode = "dataoke-" + StringUtil.Md5(DaTaoKeTipOffUtil.getRecoomendDesc(dto));
        GoodsEvaluate evaluate = goodsEvaluateDao.selectExistLimitTime(identifyCode, limitDate);
        if (evaluate != null)
            throw new GoodsEvaluateException(1, "线报已存在");
        List<String> imgs = new ArrayList<>();
        if (dto.getImageList() != null && dto.getImageList().size() > 0) {
            imgs.addAll(dto.getImageList());
        }
        GoodsDetailVO goods = null;
        //获取图片
        if (dto.getIdList() != null && dto.getIdList().size() > 0) {
            Set<String> imgSet = new HashSet<>();
            imgSet.addAll(imgs);
            String id = dto.getIdList().get(0);
            String source = dto.getPlatformType();
            switch (source) {
                case "tb":
                    try {
                        TaoBaoGoodsBrief goodsBrief = TaoKeApiUtil.searchGoodsDetail(Long.parseLong(id));
                        if (goodsBrief != null && goodsBrief.getImgList() != null) {
                            GoodsMoneyConfigParamsDTO params = orderHongBaoMoneyComputeService.getShowComputeRate("android", "55", system);
                            goods = GoodsDetailVOFactory.convertTaoBao(goodsBrief, params);
                            goods = goodsLijinMnager.loadTBMoneyInfo(system, null, goodsBrief, goods);
                            for (String img : goodsBrief.getImgList()) {
                                if (!imgSet.contains(img) && imgs.size() < 9) {
                                    imgSet.add(img);
                                    imgs.add(img);
                                }
                            }
                        }
                    } catch (TaobaoGoodsDownException e) {
                        e.printStackTrace();
                    }
                    break;
                case "jd": {
                    JDGoods jdGoods = JDApiUtil.queryGoodsDetail(Long.parseLong(id));
                    if (jdGoods != null && jdGoods.getImageList() != null) {
                        GoodsMoneyConfigParamsDTO params = orderHongBaoMoneyComputeService.getShowComputeRate("android", "55", system);
                        goods = GoodsDetailVOFactory.convertJDGoods(jdGoods, params);
                        goods = goodsLijinMnager.loadOtherMoneyInfo(system, null, CommonGoodsFactory.create(jdGoods), goods);
                        for (String img : jdGoods.getImageList()) {
                            if (!imgSet.contains(img) && imgs.size() < 9) {
                                imgSet.add(img);
                                imgs.add(img);
                            }
                        }
                    }
                }
                break;
                case "pdd": {
                    PDDGoodsDetail goodsDetail = PinDuoDuoApiUtil.getGoodsDetail(Long.parseLong(id));
                    if (goodsDetail != null && goodsDetail.getGoodsGalleryUrls() != null) {
                        GoodsMoneyConfigParamsDTO params = orderHongBaoMoneyComputeService.getShowComputeRate("android", "55", system);
                        goods = GoodsDetailVOFactory.convertPDDGoods(goodsDetail, params);
                        goods = goodsLijinMnager.loadOtherMoneyInfo(system, null, CommonGoodsFactory.create(goodsDetail), goods);
                        for (String img : goodsDetail.getGoodsGalleryUrls()) {
                            if (!imgSet.contains(img) && imgs.size() < 9) {
                                imgSet.add(img);
                                imgs.add(img);
                            }
                        }
                    }
                }
                break;
                default:
                    throw new GoodsEvaluateException(1, "不支持的source:" + source);
            }
        }
        // 商品图片信息
        List<ImgInfo> imgList = new ArrayList<>();
        for (String img : imgs) {
            ImgInfo imgInfo = new ImgInfo();
            imgInfo.setH(1);
            imgInfo.setW(1);
            imgInfo.setLarge(false);
            imgInfo.setUrl(img);
            imgInfo.setUrlHD(img);
            imgInfo.setType(ImgEnum.img);
            imgList.add(imgInfo);
        }
        // 一行显示多少个图片
        int lineNum = 3;
        int result = 0;
        int zeroPoint = 0;
        Date startTime = new Date();
        GoodsEvaluate goodsEvaluate = new GoodsEvaluate();
        goodsEvaluate.setId(UUID.randomUUID().toString().replace("-", ""));
        goodsEvaluate.setUser(user);
        goodsEvaluate.setTitle(title);
        goodsEvaluate.setState(1);
        goodsEvaluate.setZeroPoint(zeroPoint);
        goodsEvaluate.setDynamicType(1);
        goodsEvaluate.setType(EvaluateEnum.single);
        goodsEvaluate.setShareNum((int) (Math.random() * 5000) + 1000);
        goodsEvaluate.setShareNumReal(0);
        goodsEvaluate.setWeight(0.0);
        goodsEvaluate.setStartTime(startTime);
        goodsEvaluate.setEndTime(DateUtil.plusDayDate(3, startTime));
        goodsEvaluate.setPublishTime(new Date());
        goodsEvaluate.setCreateTime(new Date());
        goodsEvaluate.setUpdateTime(new Date());
        //线报不显示商品
        if (goods != null && goods.getGoodsType() == Constant.SOURCE_TYPE_TAOBAO) {
            goods.setCreatetime(null);
            goodsEvaluate.setGoods(goods);
        }
        goodsEvaluate.setLineNum(lineNum);
        goodsEvaluate.setImgList(imgList);
        goodsEvaluate.setComments(null);
        goodsEvaluate.setSystem(system);
        goodsEvaluate.setIdentifyCode(identifyCode);
        goodsEvaluateDao.save(goodsEvaluate);
        return result;
    }
    @Override
    public void addGoodsEvaluateByDaTaoKe(SystemEnum system) {
        List<Long> listId = null;