admin
2020-03-06 ce2c33ba07d0b0cbb14ec6b37b72b19d073b15af
fanli/src/main/java/com/yeshi/fanli/service/impl/dynamic/GoodsEvaluateServiceImpl.java
@@ -1,6 +1,8 @@
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;
@@ -14,13 +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.JsonUtil;
import org.yeshi.utils.ImageCropUtil;
import org.yeshi.utils.tencentcloud.COSManager;
import com.yeshi.fanli.dao.dynamic.GoodsEvaluateDao;
@@ -43,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;
@@ -53,6 +57,7 @@
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;
@@ -89,17 +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 {
@@ -112,7 +115,7 @@
      if (StringUtil.isNullOrEmpty(tilte)) {
         throw new GoodsEvaluateException(1, "推荐语不能为空");
      }
      try {
         ActivityUser activityUser = activityUserService.getActivityUserByNickName(record.getUser(), file);
         if (activityUser == null)
@@ -123,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();
@@ -135,15 +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();
@@ -179,6 +182,39 @@
   private String uploadPicture(MultipartFile file) throws Exception {
      InputStream inputStream = file.getInputStream();
      String contentType = file.getContentType();
      String type = contentType.substring(contentType.indexOf("/") + 1);
      String filePath = FilePathEnum.goodsEvaluate.getPath() + UUID.randomUUID().toString().replace("-", "") + "."
            + type;
      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;
@@ -221,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());
            }
         }
@@ -237,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());
         }
      }
@@ -329,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);
@@ -361,12 +395,17 @@
               }
               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) {
@@ -399,30 +438,29 @@
      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 (comments != null && comments.size() > 0) {
         for (CommentInfo commentInfo : comments) {
            if (commentInfo.getTypeEnum() == CommentInfoEnum.goodsCoupon) {
               if (oldGoodsVO != null && oldGoodsVO.getGoodsId().longValue() == goodsId.longValue()
               if (oldGoodsVO != null && oldGoodsVO.getGoodsId().longValue() == goodsId.longValue()
                     && oldGoodsVO.getGoodsType() == goodsType) {
                  addComment = false;
               }
               }
               continue;
            }
            }
            commentsNew.add(commentInfo);
         }
      }
      CouponInfoVO couponInfo1 = goodsDetailVO.getCouponInfo();
      if (couponInfo1 == null) {
         addComment = false;
      }
      /*
       * // 无券不能自动 生成评论 CouponInfoVO couponInfo1 =
       * goodsDetailVO.getCouponInfo(); if (couponInfo1 == null) { addComment
       * = false; }
       */
      if (addComment) {
         String commentText = "";
         if (goodsType == Constant.SOURCE_TYPE_TAOBAO) {
@@ -436,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("领券抢购", "抢购");
@@ -452,10 +491,10 @@
         } 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");
         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);
@@ -475,6 +514,43 @@
      }
   }
   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 {
      GoodsDetailVO goodsDetail = null;
      BigDecimal fanLiRate = hongBaoManageService.getFanLiRate();
@@ -484,6 +560,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, "商品已下架");
@@ -535,31 +615,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());
         }
      }
@@ -592,6 +670,7 @@
               }
               String picUrl = goodsDetailVO.getPicUrl();
               if (fileRequest != null) {
                  MultipartFile file = fileRequest.getFile("file" + i);
                  if (file != null) {
@@ -622,7 +701,7 @@
               }
               imgInfo0.setGoods(simpleGoods);
               imgInfo0.setGoodsVO(goodsDetailVO);
               listImg.add(imgInfo0);
               totalImg++;
            }
@@ -695,6 +774,68 @@
   }
   @Override
   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, "请保存第一部分信息");
@@ -719,6 +860,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());
@@ -726,7 +876,7 @@
            commentInfo.setId(UUID.randomUUID().toString().replace("-", ""));
         }
         commentInfo.setContent(content);
         commentInfo.setType(CommentInfoEnum.goodsCoupon.getDesc());
         commentInfo.setType(commentInfo.getTags());
         commentInfo.setTypeEnum(CommentInfoEnum.goodsCoupon);
         comments.add(commentInfo);
      }
@@ -740,23 +890,23 @@
   }
   @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) ) {
      if (StringUtil.isNullOrEmpty(tagUrl) && StringUtil.isNullOrEmpty(content)) {
         throw new GoodsEvaluateException(1, "评论语和链接不能同时为空");
      }
@@ -771,35 +921,34 @@
      } else {
         throw new GoodsEvaluateException(1, "请填写券截止时间");
      }
      if(!StringUtil.isNullOrEmpty(content)) {
      if (!StringUtil.isNullOrEmpty(content) && kind != 3) { // 活动不验证
         try {
            convertLinkManager.convertLinkFromText(content, 1L, true);
            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, "转链失败");
            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.getTypeEnum()) {
               goodsCoupon = info;
               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) {
@@ -809,15 +958,10 @@
            commentInfo.setId(UUID.randomUUID().toString().replace("-", ""));
         }
         // 券类型
         String tags = commentInfo.getTags();
         if (StringUtil.isNullOrEmpty(tags)) {
            commentInfo.setType(CommentInfoEnum.currencyCoupon.getDesc());
         } else {
            commentInfo.setType(tags);
         }
         commentInfo.setType(commentInfo.getTags());
         commentInfo.setTypeEnum(CommentInfoEnum.currencyCoupon);
         // 标签信息
         List<ClientTextStyleVO> tagList = new ArrayList<>();
         String couponSource = commentInfo.getCouponSource();
@@ -840,7 +984,6 @@
      }
      resultObj.setComments(comments);
      goodsEvaluateDao.save(resultObj);
   }
@@ -882,12 +1025,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");
@@ -1001,31 +1144,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");
@@ -1301,10 +1441,95 @@
   }
   @Override
   @Cacheable(value = "dynamicCache", key = "'queryMaterialsCache-'+#start+'-'+#type")
   // @Cacheable(value = "dynamicCache", key =
   // "'queryMaterialsCache-'+#start+'-'+#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");
      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) {
               comment++;
               CommentInfoEnum typeComment = commentInfo.getTypeEnum();
               if (typeComment != null && typeComment == CommentInfoEnum.goodsCoupon) {
                  GoodsDetailVO goods = evaluateNew.getGoods();
                  if (goods.isHasCoupon()) {
                     commentNew.add(commentInfo);
                     continue;
                  }
               }
               String coupon = commentInfo.getCoupon();
               String endTime = commentInfo.getEndTime();
               if (!StringUtil.isNullOrEmpty(coupon) && !StringUtil.isNullOrEmpty(endTime)) {
                  Date endDay = sdf.parse(endTime);
                  if (endDay.getTime() > now.getTime()) {
                     int daysBetween = DateUtil.daysBetween(now, endDay);
                     if (daysBetween > 0) {
                        ClientTextStyleVO styleVO = new ClientTextStyleVO();
                        styleVO.setColor("#E5005C");
                        styleVO.setContent(daysBetween + "天后过期");
                        List<ClientTextStyleVO> tagList = commentInfo.getTagList();
                        tagList.add(styleVO);
                        commentInfo.setTagList(tagList);
                        commentNew.add(commentInfo);
                        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() {
@@ -1314,90 +1539,7 @@
         }
      });
      if (list == null) {
         list = new ArrayList<>();
      }
      Date now = new Date();
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
      for (GoodsEvaluate goodsEvaluate: list) {
         List<CommentInfo> comments = goodsEvaluate.getComments();
         if (comments != null) {
            EvaluateEnum typeEnum = goodsEvaluate.getType();
            List<CommentInfo> commentNew = new ArrayList<>();
            for (CommentInfo commentInfo: comments) {
               String typeCoupon = commentInfo.getType();
               if (StringUtil.isNullOrEmpty(typeCoupon)) {
                  if (commentInfo.getTypeEnum() == null) {
                     commentInfo.setType("");
                  } else {
                     commentInfo.setType(commentInfo.getTypeEnum().getDesc());
                  }
               } else if (typeCoupon.equals(CommentInfoEnum.goodsCoupon.name())) {
                  commentInfo.setType("商品优惠券");
               } else if (typeCoupon.equals(CommentInfoEnum.currencyCoupon.name())) {
                  commentInfo.setType("通用优惠券");
               }
               CommentInfoEnum typeComment = commentInfo.getTypeEnum();
               if (typeComment != null && typeComment ==CommentInfoEnum.goodsCoupon) {
                  GoodsDetailVO goods = goodsEvaluate.getGoods();
                  if (goods.isHasCoupon()) {
                     commentNew.add(commentInfo);
                     continue;
                  }
               }
               String coupon = commentInfo.getCoupon();
               String endTime = commentInfo.getEndTime();
               if (!StringUtil.isNullOrEmpty(coupon) && !StringUtil.isNullOrEmpty(endTime)) {
                  Date endDay = sdf.parse(endTime);
                  if (endDay.getTime() > now.getTime()) {
                     int daysBetween = DateUtil.daysBetween(endDay, now);
                     if (daysBetween > 0) {
                        ClientTextStyleVO styleVO = new ClientTextStyleVO();
                        styleVO.setColor("#E5005C");
                        styleVO.setContent(daysBetween + "天后过期");
                        styleVO.setContent(coupon);
                        List<ClientTextStyleVO> tagList = commentInfo.getTagList();
                        tagList.add(styleVO);
                        commentInfo.setTagList(tagList);
                        if (typeEnum != null && typeEnum == EvaluateEnum.single) {
                           //新增
                           commentNew.add(commentInfo);
                        }
                     }
                  }
               }
            }
            goodsEvaluate.setComments(commentNew);
            if (typeEnum != null && typeEnum == EvaluateEnum.single) {
                if (commentNew.size() == 0) {
                   GoodsDetailVO goods = goodsEvaluate.getGoods();
                   if (goods != null) {
                      goods.setState(1); // 评论不存在 下架
                   }
                   List<ImgInfo> imgList = goodsEvaluate.getImgList();
                   if (imgList != null) {
                     for (ImgInfo imgInfo: imgList) {
                        SimpleGoods simpleGoods = imgInfo.getGoods();
                        if (simpleGoods != null) {
                           simpleGoods.setState(1);
                        }
                     }
                   }
                }
            }
         }
      }
      return list;
      return listNew;
   }
   @Override
@@ -1440,25 +1582,25 @@
            }
            EvaluateEnum type = goodsEvaluate.getType();
            if (type != null &&  type == EvaluateEnum.activity) {
            if (type != null && type == EvaluateEnum.activity) {
               List<CommentInfo> comments = goodsEvaluate.getComments();
               if (comments != null) {
                  for (CommentInfo commentInfo: comments) {
                  for (CommentInfo commentInfo : comments) {
                     CommentInfoEnum commentInfoEnum = commentInfo.getTypeEnum();
                     if (commentInfoEnum != null && commentInfoEnum== CommentInfoEnum.currencyCoupon) {
                     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(1); // 活动过期
                              goodsEvaluate.setState(0); // 活动过期
                           }
                        }
                     }
                  }
               }
            }
            GoodsDetailVO goods = goodsEvaluate.getGoods();
            if (goods != null) {
               GoodsDetailVO goodsNew = getGoodsNewInfo(goods.getGoodsId(), goods.getGoodsType(), paramsDTO);
@@ -1518,6 +1660,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);
@@ -1534,6 +1685,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("-", ""));
@@ -1550,7 +1709,7 @@
         goodsEvaluate.setUpdateTime(new Date());
         goodsEvaluate.setWeight(0.0);
         goodsEvaluate.setStartTime(new Date());
         goodsEvaluate.setEndTime(DateUtil.plusDayDate(3,new Date()));
         goodsEvaluate.setEndTime(DateUtil.plusDayDate(3, new Date()));
         List<ClientTextStyleVO> titles = info.getTitle();
         if (titles != null) {
@@ -1585,34 +1744,35 @@
               } else {
                  simpleGoods.setPrice(goodsVO.getCouponPrice());
                  simpleGoods.setAmount(couponInfo.getAmount());
                  TaoBaoLink taoBaoLink = shareGoodsService.getTaoBaoLinkForShare(1L, goodsVO.getGoodsId(), null);
                  String template = configService.get(ConfigKeyEnum.quickShareTBCommentText.getKey());
                  String commentText = template.replace("[淘口令]", TaoBaoUtil.filterTaoToken(taoBaoLink.getTaoToken()));
                  commentText = commentText.replace("[原价]", goodsVO.getZkPrice().toString());
                  if (!goodsVO.isHasCoupon()) {
                     commentText = commentText.replace("领券抢购", "抢购");
                     commentText = commentText.replace("【券后价】[券后价]元", "");
                  } 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.setTypeEnum(CommentInfoEnum.goodsCoupon);
                  commentInfo.setType(CommentInfoEnum.goodsCoupon.getDesc());
                  List<CommentInfo> commentsNew = new ArrayList<>();
                  commentsNew.add(commentInfo);
                  goodsEvaluate.setComments(commentsNew);
               }
               imgInfo.setGoods(simpleGoods);
               TaoBaoLink taoBaoLink = shareGoodsService.getTaoBaoLinkForShare(1L, goodsVO.getGoodsId(), null);
               String template = configService.get(ConfigKeyEnum.quickShareTBCommentText.getKey());
               String commentText = template.replace("[淘口令]", TaoBaoUtil.filterTaoToken(taoBaoLink.getTaoToken()));
               commentText = commentText.replace("[原价]", goodsVO.getZkPrice().toString());
               if (!goodsVO.isHasCoupon()) {
                  commentText = commentText.replace("领券抢购", "抢购");
                  commentText = commentText.replace("【券后价】[券后价]元", "");
               } 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.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);
         }