yj
2020-03-07 c6037befc88e7e92e93fb928ce20078b6fe293d8
fanli/src/main/java/com/yeshi/fanli/service/impl/dynamic/GoodsEvaluateServiceImpl.java
@@ -1,8 +1,11 @@
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.Collections;
import java.util.Comparator;
@@ -13,12 +16,14 @@
import javax.annotation.Resource;
import javax.imageio.ImageIO;
import org.apache.commons.beanutils.PropertyUtils;
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.fanli.dao.dynamic.GoodsEvaluateDao;
@@ -41,6 +46,7 @@
import com.yeshi.fanli.entity.taobao.TaoBaoLink;
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.TaobaoGoodsDownException;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.activity.ActivityUserService;
@@ -48,8 +54,10 @@
import com.yeshi.fanli.service.inter.dynamic.GoodsEvaluateService;
import com.yeshi.fanli.service.inter.goods.ShareGoodsService;
import com.yeshi.fanli.service.inter.order.config.HongBaoManageService;
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 com.yeshi.fanli.util.RedisManager;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.cache.JDGoodsCacheUtil;
@@ -86,14 +94,15 @@
   @Resource
   private PinDuoDuoCacheUtil pinDuoDuoCacheUtil;
   @Resource
   private ConfigService configService;
   @Resource
   private ShareGoodsService shareGoodsService;
   @Resource
   private ConvertLinkManager convertLinkManager;
   @Override
   public String saveHead(MultipartFile file, GoodsEvaluate record) throws GoodsEvaluateException {
@@ -117,11 +126,10 @@
      }
      if (record.getEndTime() != null) {
         if (record.getEndTime().getTime() <= java.lang.System.currentTimeMillis())
            throw new GoodsEvaluateException(1, "截止时间必须大于当前时间");
         if (record.getStartTime() != null && record.getEndTime().getTime() <= record.getStartTime().getTime())
            throw new GoodsEvaluateException(1, "截止时间必须大于开始时间");
      } else {
         record.setEndTime(DateUtil.plusDayDate(3, new Date()));
      }
      Integer dynamicType = record.getDynamicType();
@@ -129,14 +137,16 @@
         record.setDynamicType(1);
      }
      if (record.getShareNum() == null)
         record.setShareNum(0);
      if (record.getShareNum() == null || record.getShareNum() <= 0) {
         record.setShareNum((int) (Math.random() * 5000) + 1000);
      }
      if (record.getWeight() == null)
         record.setWeight(0.0);
      if (record.getStartTime() == null)
         record.setStartTime(new Date());
      record.setPublishTime(record.getStartTime());
      String id = record.getId();
@@ -178,6 +188,39 @@
      return COSManager.getInstance().uploadFile(inputStream, filePath).getUrl();
   }
   private ImgInfo uploadVideoPicture(MultipartFile filevideo) {
      try {
         File tempFile = new File(FileUtil.getCacheDir() + "/" + filevideo.getOriginalFilename());
         if (tempFile.exists())
            tempFile.delete();
         tempFile.createNewFile();
         filevideo.transferTo(tempFile);
         File destFile = new File(FileUtil.getCacheDir() + "/temp_" + filevideo.getOriginalFilename());
         // 裁剪视频封面,宽高比为2:1
         ImageCropUtil.centerCrop(tempFile, destFile, 2.0f);
         BufferedImage sourceImg = ImageIO.read(new FileInputStream(destFile));
         ImgInfo info = new ImgInfo();
         int width = sourceImg.getWidth();
         int height = sourceImg.getHeight();
         String picLink = uploadPicture(destFile, filevideo.getContentType());
         info.setH(height);
         info.setW(width);
         info.setUrl(picLink);
         return info;
      } catch (Exception e) {
         e.printStackTrace();
      }
      return null;
   }
   private String uploadPicture(File file, String contentType) throws Exception {
      InputStream inputStream = new FileInputStream(file);
      String type = contentType.substring(contentType.indexOf("/") + 1);
      String filePath = FilePathEnum.goodsEvaluate.getPath() + UUID.randomUUID().toString().replace("-", "") + "."
            + type;
      return COSManager.getInstance().uploadFile(inputStream, filePath).getUrl();
   }
   /**
    * 删除图片
    * 
@@ -191,7 +234,7 @@
   }
   @Override
   public void saveSingleGoods(String pid, Long goodsId, Integer goodsType, String videoUrl, Integer picNum,
   public String saveSingleGoods(String pid, Long goodsId, Integer goodsType, String videoUrl, Integer picNum,
         String picUrls, MultipartHttpServletRequest fileRequest) throws GoodsEvaluateException, Exception {
      if (StringUtil.isNullOrEmpty(pid)) {
         throw new GoodsEvaluateException(1, "请保存第一部分信息");
@@ -214,10 +257,10 @@
            ImgEnum type = info.getType();
            if (type == ImgEnum.video) {
               imgVideo = info;
            } else if (type == ImgEnum.goods ) {
            } else if (type == ImgEnum.goods) {
               listOld.add(info.getUrl());
               oldGoodsVO = info.getGoodsVO();
            } else if (type == ImgEnum.img){
            } else if (type == ImgEnum.img) {
               listOld.add(info.getUrl());
            }
         }
@@ -230,31 +273,28 @@
            if (StringUtil.isNullOrEmpty(videoUrl)) {
               throw new GoodsEvaluateException(1, "视频链接不能为空");
            }
            InputStream inputStream = filevideo.getInputStream();
            BufferedImage sourceImg = ImageIO.read(inputStream);
            int width = sourceImg.getWidth();
            int height = sourceImg.getHeight();
            String picLink = uploadPicture(filevideo);
            ImgInfo info = uploadVideoPicture(filevideo);
            if (info == null)
               throw new GoodsEvaluateException(2, "视频图片上传失败");
            if (imgVideo != null) {
               String url = imgVideo.getUrl();
               if (!StringUtil.isNullOrEmpty(url)) {
                  listDel.add(url);
               }
               imgVideo.setUrl(picLink);
               imgVideo.setUrlHD(picLink);
               imgVideo.setUrl(info.getUrl());
               imgVideo.setUrlHD(info.getUrl());
            } else {
               imgVideo = new ImgInfo();
               imgVideo.setId(UUID.randomUUID().toString().replace("-", ""));
               imgVideo.setLarge(true);
               imgVideo.setPid(pid);
               imgVideo.setUrl(picLink);
               imgVideo.setUrlHD(picLink);
               imgVideo.setUrl(info.getUrl());
               imgVideo.setUrlHD(info.getUrl());
               imgVideo.setVideoUrl(videoUrl);
               imgVideo.setType(ImgEnum.video);
            }
            imgVideo.setW(width);
            imgVideo.setH(height);
            imgVideo.setW(info.getW());
            imgVideo.setH(info.getH());
         }
      }
@@ -322,14 +362,15 @@
         pddGoods = pinDuoDuoCacheUtil.getGoodsInfo(goodsId);
         goodsDetailVO = GoodsDetailVOFactory.convertPDDGoods(pddGoods, params);
      }
      if (goodsDetailVO == null) {
         throw new GoodsEvaluateException(1, "该商品信息不存在");
      }
      List<ImgInfo> tempList = new ArrayList<ImgInfo>();
      int totalImg = 0;
      if (listpic != null && listpic.size() > 0) {
         for (int i = 0; i < listpic.size(); i++) {
         for (int i = 0; i < listpic.size() && i < 9; i++) {
            ImgInfo imgInfo0 = new ImgInfo();
            imgInfo0.setId(UUID.randomUUID().toString().replace("-", ""));
            imgInfo0.setW(1);
@@ -342,26 +383,29 @@
            if (picNum - 1 == i) {
               imgInfo0.setType(ImgEnum.goods);
               SimpleGoods simpleGoods = new SimpleGoods();
               simpleGoods.setState(goodsDetailVO.getState());
               simpleGoods.setGoodsId(goodsId);
               simpleGoods.setGoodsType(goodsType);
               simpleGoods.setPrice(goodsDetailVO.getCouponPrice());
               CouponInfoVO couponInfo = goodsDetailVO.getCouponInfo();
               if (couponInfo == null) {
                  simpleGoods.setPrice(goodsDetailVO.getZkPrice());
                  simpleGoods.setState(1);
               } else {
                  simpleGoods.setPrice(goodsDetailVO.getCouponPrice());
                  simpleGoods.setAmount(couponInfo.getAmount());
                  simpleGoods.setState(0);
               }
               imgInfo0.setGoods(simpleGoods);
               imgInfo0.setGoodsVO(goodsDetailVO);
               listImg.add(imgInfo0);
            } else {
               imgInfo0.setType(ImgEnum.img);
               tempList.add(imgInfo0);
            }
            listImg.add(imgInfo0);
            totalImg++;
         }
      }
      if (tempList.size() > 0) {
         listImg.addAll(tempList);
      }
      if (listOld != null && listOld.size() > 0) {
@@ -394,31 +438,35 @@
      resultObj.setGoods(goodsDetailVO);
      resultObj.setMainPicNum(picNum);
      resultObj.setImgList(listImg);
      boolean addComment = true;
      List<CommentInfo> commentsNew = new ArrayList<>();
      List<CommentInfo> comments = resultObj.getComments();
      if (comments != null) {
         for (CommentInfo commentInfo: comments) {
            if (commentInfo.getType() == CommentInfoEnum.goodsCoupon) {
               if (oldGoodsVO != null && oldGoodsVO.getGoodsId().longValue() == goodsId.longValue()
      if (comments != null && comments.size() > 0) {
         for (CommentInfo commentInfo : comments) {
            if (commentInfo.getTypeEnum() == CommentInfoEnum.goodsCoupon) {
               if (oldGoodsVO != null && oldGoodsVO.getGoodsId().longValue() == goodsId.longValue()
                     && oldGoodsVO.getGoodsType() == goodsType) {
                  addComment = true;
               } else {
                  addComment = false;
               }
               continue;
            }
            }
            commentsNew.add(commentInfo);
         }
      }
      /*
       * // 无券不能自动 生成评论 CouponInfoVO couponInfo1 =
       * goodsDetailVO.getCouponInfo(); if (couponInfo1 == null) { addComment
       * = false; }
       */
      String commentText = "";
      if (addComment) {
         String commentText = "";
         if (goodsType == Constant.SOURCE_TYPE_TAOBAO) {
            TaoBaoLink taoBaoLink = shareGoodsService.getTaoBaoLinkForShare(1L, goodsId, null);
            TaoBaoLink taoBaoLink = shareGoodsService.getTaoBaoLinkForShare(1L, goodsId, "0");
            String template = configService.get(ConfigKeyEnum.quickShareTBCommentText.getKey());
            commentText = template.replace("[口令]", TaoBaoUtil.filterTaoToken(taoBaoLink.getTaoToken()));
            commentText = template.replace("[淘口令]", TaoBaoUtil.filterTaoToken(taoBaoLink.getTaoToken()));
         } else if (goodsType == Constant.SOURCE_TYPE_JD) {
            String couponUrl = null;
            JDCouponInfo couponInfo = JDUtil.getShowCouponInfo(jdGoods);
@@ -426,15 +474,16 @@
               couponUrl = couponInfo.getLink();
            }
            String materialId = "https://item.jd.com/" + goodsId + ".html";
            String jumpLink = JDApiUtil.convertLinkWithSubUnionId(materialId, couponUrl, JDApiUtil.POSITION_SHARE + "","1");
            String jumpLink = JDApiUtil.convertLinkWithSubUnionId(materialId, couponUrl,
                  JDApiUtil.POSITION_SHARE + "", "1");
            String template = configService.get(ConfigKeyEnum.quickShareJDCommentText.getKey());
            commentText = template.replace("[链接]", jumpLink);
            commentText = template.replace("[链接]", jumpLink);
         } else if (goodsType == Constant.SOURCE_TYPE_PDD) {
            String jumpLink = PinDuoDuoApiUtil.getPromotionUrl(goodsId, PinDuoDuoApiUtil.PID_SHARE + "", "1");
            String template = configService.get(ConfigKeyEnum.quickSharePDDCommentText.getKey());
            commentText = template.replace("[链接]", jumpLink);
         }
         commentText = commentText.replace("[原价]", goodsDetailVO.getZkPrice().toString());
         if (!goodsDetailVO.isHasCoupon()) {
            commentText = commentText.replace("领券抢购", "抢购");
@@ -442,11 +491,14 @@
         } else {
            commentText = commentText.replace("[券后价]", goodsDetailVO.getCouponPrice().toString());
         }
         commentText = commentText.replace("\r\n\r\n", "\r\n").replace("\r\n\r\n", "\r\n").replace("\r\n\r\n",
               "\r\n");
         CommentInfo commentInfo = new CommentInfo();
         commentInfo.setId(UUID.randomUUID().toString().replace("-", ""));
         commentInfo.setContent(commentText);
         commentInfo.setType(CommentInfoEnum.goodsCoupon);
         commentInfo.setTypeEnum(CommentInfoEnum.goodsCoupon);
         commentsNew.add(commentInfo);
         resultObj.setComments(commentsNew);
      }
@@ -460,6 +512,45 @@
            }
         }
      }
      return commentText;
   }
   private String createTokenAndLink(GoodsDetailVO goodsDetailVO) throws Exception {
      String commentText = "";
      if (goodsDetailVO.getGoodsType() == Constant.SOURCE_TYPE_TAOBAO) {
         TaoBaoLink taoBaoLink = shareGoodsService.getTaoBaoLinkForShare(1L, goodsDetailVO.getGoodsId(), "0");
         String template = configService.get(ConfigKeyEnum.quickShareTBCommentText.getKey());
         commentText = template.replace("[淘口令]", TaoBaoUtil.filterTaoToken(taoBaoLink.getTaoToken()));
      } else if (goodsDetailVO.getGoodsType() == Constant.SOURCE_TYPE_JD) {
         String couponUrl = null;
         JDGoods jdGoods = jdGoodsCacheUtil.getGoodsInfo(goodsDetailVO.getGoodsId());
         JDCouponInfo couponInfo = JDUtil.getShowCouponInfo(jdGoods);
         if (couponInfo != null) {
            couponUrl = couponInfo.getLink();
         }
         String materialId = "https://item.jd.com/" + goodsDetailVO.getGoodsId() + ".html";
         String jumpLink = JDApiUtil.convertLinkWithSubUnionId(materialId, couponUrl, JDApiUtil.POSITION_SHARE + "",
               "1");
         String template = configService.get(ConfigKeyEnum.quickShareJDCommentText.getKey());
         commentText = template.replace("[链接]", jumpLink);
      } else if (goodsDetailVO.getGoodsType() == Constant.SOURCE_TYPE_PDD) {
         String jumpLink = PinDuoDuoApiUtil.getPromotionUrl(goodsDetailVO.getGoodsId(),
               PinDuoDuoApiUtil.PID_SHARE + "", "1");
         String template = configService.get(ConfigKeyEnum.quickSharePDDCommentText.getKey());
         commentText = template.replace("[链接]", jumpLink);
      }
      commentText = commentText.replace("[原价]", goodsDetailVO.getZkPrice().toString());
      if (!goodsDetailVO.isHasCoupon()) {
         commentText = commentText.replace("领券抢购", "抢购");
         commentText = commentText.replace("【券后价】[券后价]元", "");
      } else {
         commentText = commentText.replace("[券后价]", goodsDetailVO.getCouponPrice().toString());
      }
      return commentText.replace("\r\n\r\n", "\r\n").replace("\r\n\r\n", "\r\n").replace("\r\n\r\n", "\r\n");
   }
   public GoodsDetailVO getGoodsDetailVO(Long goodsId, Integer goodsType) throws GoodsEvaluateException {
@@ -471,6 +562,10 @@
      if (goodsType == Constant.SOURCE_TYPE_TAOBAO) {
         try {
            TaoBaoGoodsBrief goodsBrief = redisManager.getTaoBaoGoodsBrief(goodsId);
            String pictUrlWhite = goodsBrief.getPictUrlWhite();
            if (!StringUtil.isNullOrEmpty(pictUrlWhite)) {
               goodsBrief.setPictUrl(pictUrlWhite);
            }
            goodsDetail = GoodsDetailVOFactory.convertTaoBao(goodsBrief, params);
         } catch (TaobaoGoodsDownException e) {
            throw new GoodsEvaluateException(1, "商品已下架");
@@ -522,31 +617,29 @@
               throw new GoodsEvaluateException(1, "视频链接不能为空");
            }
            InputStream inputStream = filevideo.getInputStream();
            BufferedImage sourceImg = ImageIO.read(inputStream);
            int width = sourceImg.getWidth();
            int height = sourceImg.getHeight();
            ImgInfo info = uploadVideoPicture(filevideo);
            if (info == null)
               throw new GoodsEvaluateException(2, "视频图片上传失败");
            String picLink = uploadPicture(filevideo);
            if (imgVideo != null) {
               String url = imgVideo.getUrl();
               if (!StringUtil.isNullOrEmpty(url)) {
                  listDel.add(url);
               }
               imgVideo.setUrl(picLink);
               imgVideo.setUrlHD(picLink);
               imgVideo.setUrl(info.getUrl());
               imgVideo.setUrlHD(info.getUrl());
            } else {
               imgVideo = new ImgInfo();
               imgVideo.setId(UUID.randomUUID().toString().replace("-", ""));
               imgVideo.setLarge(true);
               imgVideo.setPid(pid);
               imgVideo.setUrl(picLink);
               imgVideo.setUrlHD(picLink);
               imgVideo.setUrl(info.getUrl());
               imgVideo.setUrlHD(info.getUrl());
               imgVideo.setVideoUrl(videoUrl);
               imgVideo.setType(ImgEnum.video);
            }
            imgVideo.setW(width);
            imgVideo.setH(height);
            imgVideo.setW(info.getW());
            imgVideo.setH(info.getH());
         }
      }
@@ -579,6 +672,7 @@
               }
               String picUrl = goodsDetailVO.getPicUrl();
               if (fileRequest != null) {
                  MultipartFile file = fileRequest.getFile("file" + i);
                  if (file != null) {
@@ -597,18 +691,19 @@
               imgInfo0.setType(ImgEnum.goods);
               SimpleGoods simpleGoods = new SimpleGoods();
               simpleGoods.setState(goodsDetailVO.getState());
               simpleGoods.setGoodsId(goodsDetailVO.getGoodsId());
               simpleGoods.setGoodsType(goodsDetailVO.getGoodsType());
               simpleGoods.setPrice(goodsDetailVO.getCouponPrice());
               CouponInfoVO couponInfo = goodsDetailVO.getCouponInfo();
               if (couponInfo == null) {
                  simpleGoods.setState(1);
                  simpleGoods.setPrice(goodsDetailVO.getZkPrice());
               } else {
                  simpleGoods.setPrice(goodsDetailVO.getCouponPrice());
                  simpleGoods.setAmount(couponInfo.getAmount());
                  simpleGoods.setState(0);
               }
               imgInfo0.setGoods(simpleGoods);
               imgInfo0.setGoodsVO(goodsDetailVO);
               listImg.add(imgInfo0);
               totalImg++;
            }
@@ -681,7 +776,69 @@
   }
   @Override
   public void saveGoodsCoupon(String pid, String tags, String content) throws GoodsEvaluateException, Exception {
   public void saveGoodsComment(String id, int kind, List<CommentInfo> comments)
         throws GoodsEvaluateException, Exception {
      if (comments == null || comments.size() == 0) {
         throw new GoodsEvaluateException(1, "内容不能为空");
      }
      GoodsEvaluate resultObj = goodsEvaluateDao.getById(id);
      if (resultObj == null)
         throw new GoodsEvaluateException(1, "第一部分信息缺失");
      GoodsDetailVO goods = resultObj.getGoods();
      if (kind == 1 && goods == null) {
         throw new GoodsEvaluateException(1, "请先录入商品信息");
      }
      CommentInfo currencyCoupon = null;
      List<CommentInfo> oldComments = resultObj.getComments();
      if (oldComments != null) {
         for (int i = 0; i < oldComments.size(); i++) {
            CommentInfo info = oldComments.get(i);
            if (CommentInfoEnum.currencyCoupon == info.getTypeEnum()) {
               currencyCoupon = info;
               continue;
            }
         }
      }
      List<CommentInfo> newList = new ArrayList<>();
      for (int i = 0; i < comments.size(); i++) {
         CommentInfo commentInfo = comments.get(i);
         String content = commentInfo.getContent();
         if (StringUtil.isNullOrEmpty(content)) {
            if (i == 0 && kind == 1) {
               content = createTokenAndLink(goods);
            } else {
               continue;
            }
         } else if (i == 0 && kind == 1) {
            try {
               convertLinkManager.convertLinkFromText(content, Constant.LINK_TOKEN_VERIFY_UID, true);
            } catch (Exception e) {
               throw new GoodsEvaluateException(1, "不包含可转链的口令与链接");
            }
         }
         if (StringUtil.isNullOrEmpty(commentInfo.getId())) {
            commentInfo.setId(UUID.randomUUID().toString().replace("-", ""));
         }
         commentInfo.setType(commentInfo.getTags());
         commentInfo.setTypeEnum(CommentInfoEnum.goodsCoupon);
         newList.add(commentInfo);
      }
      if (currencyCoupon != null) {
         comments.add(currencyCoupon);
      }
      resultObj.setComments(comments);
      goodsEvaluateDao.save(resultObj);
   }
   @Override
   public void saveGoodsCoupon(String pid, String content) throws GoodsEvaluateException, Exception {
      if (StringUtil.isNullOrEmpty(pid)) {
         throw new GoodsEvaluateException(1, "请保存第一部分信息");
      }
@@ -695,9 +852,9 @@
      List<CommentInfo> oldComments = resultObj.getComments();
      if (oldComments != null) {
         for (CommentInfo info : oldComments) {
            if (CommentInfoEnum.goodsCoupon == info.getType()) {
            if (CommentInfoEnum.goodsCoupon == info.getTypeEnum()) {
               goodsCoupon = info;
            } else if (CommentInfoEnum.currencyCoupon == info.getType()) {
            } else if (CommentInfoEnum.currencyCoupon == info.getTypeEnum()) {
               currencyCoupon = info;
            }
         }
@@ -705,6 +862,15 @@
      List<CommentInfo> comments = new ArrayList<>();
      if (!StringUtil.isNullOrEmpty(content)) {
         if (!StringUtil.isNullOrEmpty(content)) {
            try {
               convertLinkManager.convertLinkFromText(content, 1L, true);
            } catch (Exception e) {
               throw new GoodsEvaluateException(1, "不包含可转链的口令与链接");
            }
         }
         CommentInfo commentInfo = new CommentInfo();
         if (goodsCoupon != null) {
            commentInfo.setId(goodsCoupon.getId());
@@ -712,7 +878,8 @@
            commentInfo.setId(UUID.randomUUID().toString().replace("-", ""));
         }
         commentInfo.setContent(content);
         commentInfo.setType(CommentInfoEnum.goodsCoupon);
         commentInfo.setType(commentInfo.getTags());
         commentInfo.setTypeEnum(CommentInfoEnum.goodsCoupon);
         comments.add(commentInfo);
      }
@@ -725,31 +892,65 @@
   }
   @Override
   public void saveSingleGoodsCoupon(String pid, CommentInfo commentInfo) throws GoodsEvaluateException, Exception {
   public void saveCurrencyCoupon(String pid, int kind, CommentInfo commentInfo)
         throws GoodsEvaluateException, Exception {
      if (StringUtil.isNullOrEmpty(pid)) {
         throw new GoodsEvaluateException(1, "请保存第一部分信息");
      }
      if (StringUtil.isNullOrEmpty(commentInfo.getCoupon())) {
         throw new GoodsEvaluateException(1, "券面额不能为空");
      }
      if (StringUtil.isNullOrEmpty(commentInfo.getTagDesc())) {
         throw new GoodsEvaluateException(1, "描述语不能为空");
      }
      String tagUrl = commentInfo.getTagUrl();
      String content = commentInfo.getContent();
      if (StringUtil.isNullOrEmpty(tagUrl) && StringUtil.isNullOrEmpty(content)) {
         throw new GoodsEvaluateException(1, "评论语和链接不能同时为空");
      }
      String endTime = commentInfo.getEndTime();
      if (!StringUtil.isNullOrEmpty(endTime)) {
         try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            sdf.parse(endTime);
         } catch (Exception e) {
            throw new GoodsEvaluateException(1, "请填写正确的时间格式:2020-03-05");
         }
      } else {
         throw new GoodsEvaluateException(1, "请填写券截止时间");
      }
      if (!StringUtil.isNullOrEmpty(content) && kind != 3) { // 活动不验证
         try {
            convertLinkManager.convertLinkFromText(content, Constant.LINK_TOKEN_VERIFY_UID, true);
         } catch (ConvertLinkExceptionException e) {
            if (ConvertLinkExceptionException.CODE_NONE != e.getCode()) {
               throw new GoodsEvaluateException(1, "包含不可转链的口令与链接");
            }
         } catch (Exception e) {
            throw new GoodsEvaluateException(1, "包含不可转链的口令与链接");
         }
      }
      GoodsEvaluate resultObj = goodsEvaluateDao.getById(pid);
      if (resultObj == null)
         throw new GoodsEvaluateException(1, "第一部分信息缺失");
      CommentInfo goodsCoupon = null;
      List<CommentInfo> comments = new ArrayList<>();
      CommentInfo currencyCoupon = null;
      List<CommentInfo> oldComments = resultObj.getComments();
      if (oldComments != null) {
         for (CommentInfo info : oldComments) {
            if (CommentInfoEnum.goodsCoupon == info.getType()) {
               goodsCoupon = info;
            } else if (CommentInfoEnum.currencyCoupon == info.getType()) {
            if (CommentInfoEnum.goodsCoupon == info.getTypeEnum()) {
               comments.add(info);
            } else if (CommentInfoEnum.currencyCoupon == info.getTypeEnum()) {
               currencyCoupon = info;
            }
         }
      }
      List<CommentInfo> comments = new ArrayList<>();
      if (goodsCoupon != null) {
         comments.add(goodsCoupon);
      }
      if (commentInfo != null) {
@@ -758,7 +959,10 @@
         } else {
            commentInfo.setId(UUID.randomUUID().toString().replace("-", ""));
         }
         commentInfo.setType(CommentInfoEnum.currencyCoupon);
         // 券类型
         commentInfo.setType(commentInfo.getTags());
         commentInfo.setTypeEnum(CommentInfoEnum.currencyCoupon);
         // 标签信息
         List<ClientTextStyleVO> tagList = new ArrayList<>();
@@ -782,7 +986,6 @@
      }
      resultObj.setComments(comments);
      goodsEvaluateDao.save(resultObj);
   }
@@ -824,12 +1027,12 @@
         if (filevideo != null) {
            removePicture(videoPic);
            InputStream inputStream = filevideo.getInputStream();
            BufferedImage sourceImg = ImageIO.read(inputStream);
            width = sourceImg.getWidth();
            height = sourceImg.getHeight();
            String picLink = uploadPicture(filevideo);
            videoPic = picLink;
            ImgInfo info = uploadVideoPicture(filevideo);
            if (info == null)
               throw new GoodsEvaluateException(2, "视频图片上传失败");
            videoPic = info.getUrl();
            width=info.getW();
            height=info.getH();
         }
         MultipartFile activityfile = fileRequest.getFile("activityfile");
@@ -869,6 +1072,7 @@
         listImg.add(imgVideo);
      }
      int totalImg = 0;
      if (!StringUtil.isNullOrEmpty(activityPic) || !StringUtil.isNullOrEmpty(imgInfo.getActivityUrl())) {
         if (imgactivity != null) {
            imgactivity.setUrl(activityPic);
@@ -892,8 +1096,21 @@
            imgactivity.setH(imgactivity.getH());
         }
         listImg.add(imgactivity);
         totalImg ++;
      }
      resultObj.setLineNum(1);
      int lineNum = 0;
      if (totalImg > 0) {
         if (totalImg == 1) {
            lineNum = 1;
         } else if (totalImg <= 4) {
            lineNum = 2;
         } else {
            lineNum = 3;
         }
      }
      resultObj.setLineNum(lineNum);
      resultObj.setImgList(listImg);
      goodsEvaluateDao.save(resultObj);
   }
@@ -943,31 +1160,28 @@
            if (StringUtil.isNullOrEmpty(videoUrl)) {
               throw new GoodsEvaluateException(1, "视频链接不能为空");
            }
            InputStream inputStream = filevideo.getInputStream();
            BufferedImage sourceImg = ImageIO.read(inputStream);
            int width = sourceImg.getWidth();
            int height = sourceImg.getHeight();
            String picLink = uploadPicture(filevideo);
            ImgInfo info = uploadVideoPicture(filevideo);
            if (info == null)
               throw new GoodsEvaluateException(2, "视频图片上传失败");
            if (imgVideo != null) {
               String url = imgVideo.getUrl();
               if (!StringUtil.isNullOrEmpty(url)) {
                  listDel.add(url);
               }
               imgVideo.setUrl(picLink);
               imgVideo.setUrlHD(picLink);
               imgVideo.setUrl(info.getUrl());
               imgVideo.setUrlHD(info.getUrl());
            } else {
               imgVideo = new ImgInfo();
               imgVideo.setId(UUID.randomUUID().toString().replace("-", ""));
               imgVideo.setLarge(true);
               imgVideo.setPid(pid);
               imgVideo.setUrl(picLink);
               imgVideo.setUrlHD(picLink);
               imgVideo.setUrl(info.getUrl());
               imgVideo.setUrlHD(info.getUrl());
               imgVideo.setVideoUrl(videoUrl);
               imgVideo.setType(ImgEnum.video);
            }
            imgVideo.setW(width);
            imgVideo.setH(height);
            imgVideo.setW(info.getW());
            imgVideo.setH(info.getH());
         }
         activityFile = fileRequest.getFile("activityFile");
@@ -1013,6 +1227,7 @@
         listImg.add(imgActivity);
      }
      int totalImg = 0;
      // 编辑图片
      if (!StringUtil.isNullOrEmpty(picUrls)) {
         String[] pics = picUrls.split(",");
@@ -1031,9 +1246,10 @@
                     imgInfo0.setUrl(picLink);
                     imgInfo0.setUrlHD(picLink);
                     imgInfo0.setType(ImgEnum.img);
                     imgVideo.setW(1);
                     imgVideo.setH(1);
                     imgInfo0.setW(1);
                     imgInfo0.setH(1);
                     listImg.add(imgInfo0);
                     totalImg ++;
                     continue;
                  }
               }
@@ -1044,6 +1260,7 @@
                        String url = imgInfo.getUrl();
                        if (picLink.equals(url)) {
                           listImg.add(imgInfo);
                           totalImg ++;
                           break;
                        }
                     }
@@ -1067,7 +1284,19 @@
               listDel.add(listOld.get(j));
         }
      }
      resultObj.setLineNum(1);
      int lineNum = 0;
      if (totalImg > 0) {
         if (totalImg == 1) {
            lineNum = 1;
         } else if (totalImg <= 4) {
            lineNum = 2;
         } else {
            lineNum = 3;
         }
      }
      resultObj.setLineNum(lineNum);
      resultObj.setImgList(listImg);
      goodsEvaluateDao.save(resultObj);
@@ -1244,16 +1473,116 @@
   @Override
   @Cacheable(value = "dynamicCache", key = "'queryMaterialsCache-'+#start+'-'+#type")
   public List<GoodsEvaluate> queryMaterialsCache(int start, int count, int type) {
   public List<GoodsEvaluate> queryMaterialsCache(int start, int count, int type) throws Exception {
      List<GoodsEvaluate> list = goodsEvaluateDao.queryValid(start, count, type);
      if (list == null) {
         list = new ArrayList<>();
      }
      Date now = new Date();
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      List<GoodsEvaluate> listNew = new ArrayList<>();
      for (GoodsEvaluate goodsEvaluate : list) {
         GoodsEvaluate evaluateNew = new GoodsEvaluate();
         try {
            PropertyUtils.copyProperties(evaluateNew, goodsEvaluate);
         } catch (Exception e) {
            e.printStackTrace();
            continue;
         }
         int comment = 0;
         List<CommentInfo> comments = evaluateNew.getComments();
         if (comments != null && comments.size() > 0) {
            EvaluateEnum typeEnum = evaluateNew.getType();
            List<CommentInfo> commentNew = new ArrayList<>();
            for (CommentInfo commentInfo : comments) {
               if (StringUtil.isNullOrEmpty(commentInfo.getContent()) &&
                     StringUtil.isNullOrEmpty(commentInfo.getCoupon())) {
                  continue;
               }
               CommentInfo commentInfoNew = new CommentInfo();
               try {
                  PropertyUtils.copyProperties(commentInfoNew, commentInfo);
               } catch (Exception e) {
                  e.printStackTrace();
                  continue;
               }
               comment++;
               CommentInfoEnum typeComment = commentInfoNew.getTypeEnum();
               if (typeComment != null && typeComment == CommentInfoEnum.goodsCoupon) {
                  GoodsDetailVO goods = evaluateNew.getGoods();
                  if (goods != null && goods.isHasCoupon()) {
                     commentNew.add(commentInfoNew);
                     continue;
                  }
               }
               String coupon = commentInfoNew.getCoupon();
               String endTime = commentInfoNew.getEndTime();
               if (!StringUtil.isNullOrEmpty(coupon) && !StringUtil.isNullOrEmpty(endTime)) {
                  Date endDay = sdf.parse(endTime);
                  if (endDay.getTime() > now.getTime()) {
                     String daysBetween = DateUtil.dateDiff5(now, endDay);
                     if (!StringUtil.isNullOrEmpty(daysBetween)) {
                        ClientTextStyleVO styleVO = new ClientTextStyleVO();
                        styleVO.setColor("#E5005C");
                        styleVO.setContent(daysBetween + "后过期");
                        List<ClientTextStyleVO> tagList = commentInfoNew.getTagList();
                        tagList.add(styleVO);
                        commentInfoNew.setTagList(tagList);
                        commentNew.add(commentInfoNew);
                        continue;
                     }
                  }
               }
               commentNew.add(commentInfo);
            }
            evaluateNew.setComments(commentNew);
            if (typeEnum != null && typeEnum == EvaluateEnum.single) {
               if (comment > 0 && commentNew.size() == 0) { // 所有券评论下架
                  GoodsDetailVO goods = evaluateNew.getGoods();
                  if (goods != null) {
                     goods.setState(1); // 评论不存在 下架
                     LogHelper.test("获取列表商品下架1");
                  }
                  List<ImgInfo> imgList = evaluateNew.getImgList();
                  if (imgList != null) {
                     for (ImgInfo imgInfo : imgList) {
                        SimpleGoods simpleGoods = imgInfo.getGoods();
                        if (simpleGoods != null) {
                           simpleGoods.setState(1);
                           LogHelper.test("获取列表商品下架2");
                        }
                     }
                  }
               }
            }
         }
         listNew.add(evaluateNew);
      }
      List<GoodsEvaluate> listOBJ = list;
      // 更新商品信息
      executor.execute(new Runnable() {
         @Override
         public void run() {
            updateGoodInfo(list);
            updateGoodInfo(listOBJ);
         }
      });
      return list;
      return listNew;
   }
   @Override
@@ -1274,6 +1603,8 @@
      }
      try {
         Date now = new Date();
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
         BigDecimal fanLiRate = hongBaoManageService.getFanLiRate();
         BigDecimal shareRate = hongBaoManageService.getShareRate();
         BigDecimal vipFanLiRate = hongBaoManageService.getVIPFanLiRate();
@@ -1293,11 +1624,36 @@
               }
            }
            EvaluateEnum type = goodsEvaluate.getType();
            if (type != null && type == EvaluateEnum.activity) {
               List<CommentInfo> comments = goodsEvaluate.getComments();
               if (comments != null) {
                  for (CommentInfo commentInfo : comments) {
                     CommentInfoEnum commentInfoEnum = commentInfo.getTypeEnum();
                     if (commentInfoEnum != null && commentInfoEnum == CommentInfoEnum.currencyCoupon) {
                        String endTime = commentInfo.getEndTime();
                        if (!StringUtil.isNullOrEmpty(endTime)) {
                           Date endDay = sdf.parse(endTime);
                           if (endDay.getTime() < now.getTime()) {
                              goodsEvaluate.setState(0); // 活动过期
                           }
                        }
                     }
                  }
               }
            }
            GoodsDetailVO goods = goodsEvaluate.getGoods();
            if (goods != null) {
               GoodsDetailVO goodsNew = getGoodsNewInfo(goods.getGoodsId(), goods.getGoodsType(), paramsDTO);
               if (goodsNew != null)
               if (goodsNew != null) {
                  goodsEvaluate.setGoods(goodsNew);
               } else {
                  goodsEvaluate.setState(0); // 已商品下架
                  goods.setState(1);
                  goodsEvaluate.setGoods(goods);
               }
            }
            // 更新商品信息
            List<ImgInfo> imgList = goodsEvaluate.getImgList();
@@ -1315,17 +1671,24 @@
                     paramsDTO);
               if (goodsDetailVO != null) {
                  simpleGoods.setPrice(goodsDetailVO.getCouponPrice());
                  simpleGoods.setState(0);
                  CouponInfoVO couponInfo = goodsDetailVO.getCouponInfo();
                  if (couponInfo == null) {
                     simpleGoods.setPrice(goodsDetailVO.getZkPrice());
                     simpleGoods.setState(1);
                  } else {
                     simpleGoods.setPrice(goodsDetailVO.getCouponPrice());
                     simpleGoods.setAmount(couponInfo.getAmount());
                     simpleGoods.setState(0);
                  }
                  imgInfo.setGoods(simpleGoods);
                  imgInfo.setGoodsVO(goodsDetailVO);
               } else {
                  simpleGoods.setState(1);
                  imgInfo.setGoods(simpleGoods);
                  GoodsDetailVO goodsVO = imgInfo.getGoodsVO();
                  if (goodsVO != null) {
                     goodsVO.setState(1);
                     imgInfo.setGoodsVO(goodsVO);
                  }
               }
            }
@@ -1340,6 +1703,15 @@
   private GoodsDetailVO getGoodsNewInfo(Long goodsId, int goodsType, ConfigParamsDTO paramsDTO) {
      GoodsDetailVO vo = null;
      if (goodsType == Constant.SOURCE_TYPE_TAOBAO) {
         TaoBaoGoodsBrief goods;
         try {
            goods = redisManager.getTaoBaoGoodsBrief(goodsId);
            if (goods != null) {
               vo = GoodsDetailVOFactory.convertTaoBao(goods, paramsDTO);
            }
         } catch (TaobaoGoodsDownException e) {
            e.printStackTrace();
         }
      } else if (goodsType == Constant.SOURCE_TYPE_JD) {
         JDGoods goodsInfo = jdGoodsCacheUtil.getGoodsInfo(goodsId);
@@ -1356,6 +1728,14 @@
   @Override
   public void addGoodsEvaluateByDynamicInfo(DynamicInfo info) {
      if (1 > 0) {
         return; // 暂不启用自动生成
      }
      if (info == null) {
         return;
      }
      try {
         GoodsEvaluate goodsEvaluate = new GoodsEvaluate();
         goodsEvaluate.setId(UUID.randomUUID().toString().replace("-", ""));
@@ -1372,7 +1752,7 @@
         goodsEvaluate.setUpdateTime(new Date());
         goodsEvaluate.setWeight(0.0);
         goodsEvaluate.setStartTime(new Date());
         goodsEvaluate.setEndTime(DateUtil.plusYears(new Date(), 100));
         goodsEvaluate.setEndTime(DateUtil.plusDayDate(3, new Date()));
         List<ClientTextStyleVO> titles = info.getTitle();
         if (titles != null) {
@@ -1400,24 +1780,20 @@
               SimpleGoods simpleGoods = new SimpleGoods();
               simpleGoods.setGoodsId(goodsVO.getGoodsId());
               simpleGoods.setGoodsType(goodsVO.getGoodsType());
               simpleGoods.setState(goodsVO.getState());
               CouponInfoVO couponInfo = goodsVO.getCouponInfo();
               if (couponInfo == null) {
                  simpleGoods.setState(0);
                  simpleGoods.setPrice(goodsVO.getZkPrice());
               } else {
                  simpleGoods.setState(goodsVO.getState());
                  simpleGoods.setPrice(goodsVO.getCouponPrice());
                  simpleGoods.setAmount(couponInfo.getAmount());
               }
               imgInfo.setGoods(simpleGoods);
               goodsEvaluate.setGoods(goodsVO);
               TaoBaoLink taoBaoLink = shareGoodsService.getTaoBaoLinkForShare(0L, goodsVO.getGoodsId(), null);
               TaoBaoLink taoBaoLink = shareGoodsService.getTaoBaoLinkForShare(1L, goodsVO.getGoodsId(), null);
               String template = configService.get(ConfigKeyEnum.quickShareTBCommentText.getKey());
               String commentText = template.replace("[口令]", TaoBaoUtil.filterTaoToken(taoBaoLink.getTaoToken()));
               String commentText = template.replace("[淘口令]", TaoBaoUtil.filterTaoToken(taoBaoLink.getTaoToken()));
               commentText = commentText.replace("[原价]", goodsVO.getZkPrice().toString());
               if (!goodsVO.isHasCoupon()) {
                  commentText = commentText.replace("领券抢购", "抢购");
@@ -1425,15 +1801,21 @@
               } else {
                  commentText = commentText.replace("[券后价]", goodsVO.getCouponPrice().toString());
               }
               commentText = commentText.replace("\r\n\r\n", "\r\n").replace("\r\n\r\n", "\r\n")
                     .replace("\r\n\r\n", "\r\n");
               CommentInfo commentInfo = new CommentInfo();
               commentInfo.setId(UUID.randomUUID().toString().replace("-", ""));
               commentInfo.setContent(commentText);
               commentInfo.setType(CommentInfoEnum.goodsCoupon);
               commentInfo.setTypeEnum(CommentInfoEnum.goodsCoupon);
               commentInfo.setType(CommentInfoEnum.goodsCoupon.getDesc());
               List<CommentInfo> commentsNew = new ArrayList<>();
               commentsNew.add(commentInfo);
               goodsEvaluate.setComments(commentsNew);
               goodsEvaluate.setGoods(goodsVO);
            }
            imgList.add(imgInfo);
         }