admin
2020-07-03 651a15c78f668bef3859d9ed1bb7ad0b669d3600
fanli/src/main/java/com/yeshi/fanli/service/impl/dynamic/GoodsEvaluateServiceImpl.java
@@ -7,6 +7,7 @@
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;
@@ -16,7 +17,11 @@
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;
@@ -30,14 +35,15 @@
import com.yeshi.fanli.dto.ConfigParamsDTO;
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.bus.activity.ActivityRuleUser;
import com.yeshi.fanli.entity.bus.activity.ActivityUser;
import com.yeshi.fanli.entity.bus.clazz.GoodsClass;
import com.yeshi.fanli.entity.dynamic.CommentInfo;
import com.yeshi.fanli.entity.dynamic.CommentInfo.CommentInfoEnum;
import com.yeshi.fanli.entity.dynamic.DynamicInfo;
import com.yeshi.fanli.entity.dynamic.GoodsEvaluate;
import com.yeshi.fanli.entity.dynamic.GoodsEvaluate.EvaluateEnum;
import com.yeshi.fanli.entity.dynamic.GoodsPicture;
import com.yeshi.fanli.entity.dynamic.ImgInfo;
import com.yeshi.fanli.entity.dynamic.ImgInfo.ImgEnum;
import com.yeshi.fanli.entity.dynamic.SimpleGoods;
@@ -49,12 +55,14 @@
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.share.ShareGoodsException;
import com.yeshi.fanli.exception.taobao.TaobaoGoodsDownException;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.activity.ActivityUserService;
import com.yeshi.fanli.service.inter.config.ConfigService;
import com.yeshi.fanli.service.inter.dynamic.GoodsEvaluateService;
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.fanli.service.inter.taobao.dataoke.DaTaoKeGoodsDetailV2Service;
import com.yeshi.fanli.service.manger.goods.ConvertLinkManager;
@@ -64,16 +72,15 @@
import com.yeshi.fanli.util.MoneyBigDecimalUtil;
import com.yeshi.fanli.util.RedisManager;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.TimeUtil;
import com.yeshi.fanli.util.cache.JDGoodsCacheUtil;
import com.yeshi.fanli.util.cache.PinDuoDuoCacheUtil;
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.pinduoduo.PinDuoDuoUtil;
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.fanli.vo.msg.ClientTextStyleVO;
@@ -93,6 +100,9 @@
   @Resource
   private HongBaoManageService hongBaoManageService;
   @Resource
   private OrderHongBaoMoneyComputeService orderHongBaoMoneyComputeService;
   @Resource(name = "taskExecutor")
   private TaskExecutor executor;
@@ -109,10 +119,33 @@
   private ShareGoodsService shareGoodsService;
   @Resource
   private TaoBaoLinkManager taoBaoLinkManager;
   @Resource
   private ConvertLinkManager convertLinkManager;
   @Resource
   private DaTaoKeGoodsDetailV2Service daTaoKeGoodsDetailV2Service;
   @Override
   public void switchState(String id) throws GoodsEvaluateException {
      if (id == null) {
         throw new GoodsEvaluateException(1, "请传递正确参数");
      }
      GoodsEvaluate resultObj = goodsEvaluateDao.getById(id);
      if (resultObj == null) {
         throw new GoodsEvaluateException(1, "此内容已不存在");
      }
      Integer state = resultObj.getState();
      if (state == null || state == 0) {
         state = 1;
      } else {
         state = 0;
      }
      goodsEvaluateDao.updateSatate(id, state);
   }
   @Override
   public String saveHead(MultipartFile file, GoodsEvaluate record) throws GoodsEvaluateException {
@@ -140,7 +173,11 @@
         if (record.getStartTime() != null && record.getEndTime().getTime() <= record.getStartTime().getTime())
            throw new GoodsEvaluateException(1, "截止时间必须大于开始时间");
      } else {
         record.setEndTime(DateUtil.plusDayDate(3, new Date()));
         if (record.getStartTime() == null) {
            record.setEndTime(DateUtil.plusDayDate(3, new Date()));
         } else {
            record.setEndTime(DateUtil.plusDayDate(3, record.getStartTime()));
         }
      }
      Integer dynamicType = record.getDynamicType();
@@ -227,6 +264,31 @@
      return null;
   }
   private ImgInfo uploadOriginalPicture(MultipartFile file) {
      try {
         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;
         BufferedImage sourceImg = ImageIO.read(inputStream);
         ImgInfo info = new ImgInfo();
         int width = sourceImg.getWidth();
         int height = sourceImg.getHeight();
         String picLink = COSManager.getInstance().uploadFile(file.getInputStream(), filePath).getUrl();
         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);
@@ -238,7 +300,7 @@
   /**
    * 删除图片
    * 
    * @param record
    * @param picture
    * @throws Exception
    */
   private void removePicture(String picture) throws Exception {
@@ -248,8 +310,8 @@
   }
   @Override
   public String saveSingleGoods(String pid, Long goodsId, Integer goodsType, String videoUrl, Integer picNum,
         String picUrls, MultipartHttpServletRequest fileRequest) throws GoodsEvaluateException, Exception {
   public String saveSingleGoods(String pid, String goodsId, Integer goodsType, String videoUrl, Integer picNum,
                          String picUrls, SystemEnum system, MultipartHttpServletRequest fileRequest) throws GoodsEvaluateException, Exception {
      if (StringUtil.isNullOrEmpty(pid)) {
         throw new GoodsEvaluateException(1, "请保存第一部分信息");
      }
@@ -329,21 +391,28 @@
      }
      // 编辑图片
      List<String> listpic = null;
      List<String> listpic = new ArrayList<>();
      if (!StringUtil.isNullOrEmpty(picUrls)) {
         String[] pics = picUrls.split(",");
         if (pics != null) {
            listpic = new ArrayList<>();
            for (int i = 0; i < pics.length; i++) {
               String picLink = pics[i];
               if (fileRequest != null) {
                  MultipartFile file = fileRequest.getFile("file" + i);
                  if (file != null) {
                     picLink = uploadPicture(file);
                  }
               }
               if (picLink.startsWith("http")) {
                  listpic.add(picLink);
               }
            }
         }
      }
      // 上传文件替换
      if (fileRequest != null) {
         for (int i = 0; i < 9; i++) {
            MultipartFile file = fileRequest.getFile("file" + i);
            if (file != null) {
               String picLink = uploadPicture(file);
               if (i < listpic.size()) {
                  listpic.set(i, picLink);
               } else {
                  listpic.add(picLink);
               }
            }
@@ -358,20 +427,20 @@
      GoodsDetailVO goodsDetailVO = null;
      JDGoods jdGoods = null;
      PDDGoodsDetail pddGoods = null;
      ConfigParamsDTO params = hongBaoManageService.getShowComputeRate("android", "55");
      ConfigParamsDTO params = orderHongBaoMoneyComputeService.getShowComputeRate("android", "55");
      params.setBaseFanliRate(hongBaoManageService.getBaseFanliRate());
      if (goodsType == Constant.SOURCE_TYPE_TAOBAO) {
         try {
            TaoBaoGoodsBrief goodsBrief = redisManager.getTaoBaoGoodsBrief(goodsId);
            TaoBaoGoodsBrief goodsBrief = redisManager.getTaoBaoGoodsBrief(Long.parseLong(goodsId));
            goodsDetailVO = GoodsDetailVOFactory.convertTaoBao(goodsBrief, params);
         } catch (TaobaoGoodsDownException e) {
            throw new GoodsEvaluateException(1, "商品已下架");
         }
      } else if (goodsType == Constant.SOURCE_TYPE_JD) {
         jdGoods = jdGoodsCacheUtil.getGoodsInfo(goodsId);
         jdGoods = jdGoodsCacheUtil.getGoodsInfo(Long.parseLong(goodsId));
         goodsDetailVO = GoodsDetailVOFactory.convertJDGoods(jdGoods, params);
      } else if (goodsType == Constant.SOURCE_TYPE_PDD) {
         pddGoods = pinDuoDuoCacheUtil.getGoodsInfo(goodsId);
         pddGoods = pinDuoDuoCacheUtil.getGoodsInfo(Long.parseLong(goodsId));
         goodsDetailVO = GoodsDetailVOFactory.convertPDDGoods(pddGoods, params);
      }
@@ -441,7 +510,7 @@
            lineNum = 1;
         } else if (totalImg == 3) {
            lineNum = 3;
         } else if (totalImg <= 4) {
         } else if (totalImg == 2 || totalImg == 4) {
            lineNum = 2;
         } else {
            lineNum = 3;
@@ -459,7 +528,7 @@
      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().equalsIgnoreCase(goodsId)
                     && oldGoodsVO.getGoodsType() == goodsType) {
                  addComment = false;
               }
@@ -470,15 +539,16 @@
      }
      /*
       * // 无券不能自动 生成评论 CouponInfoVO couponInfo1 = goodsDetailVO.getCouponInfo(); if
       * (couponInfo1 == null) { addComment = false; }
       * // 无券不能自动 生成评论 CouponInfoVO couponInfo1 =
       * goodsDetailVO.getCouponInfo(); if (couponInfo1 == null) { addComment
       * = false; }
       */
      String commentText = "";
      if (addComment) {
         if (goodsType == Constant.SOURCE_TYPE_TAOBAO) {
            TaoBaoLink taoBaoLink = shareGoodsService.getTaoBaoLinkForShare(1L, goodsId, "0");
            String template = configService.get(ConfigKeyEnum.quickShareTBCommentText.getKey());
            TaoBaoLink taoBaoLink = taoBaoLinkManager.getTaoBaoLinkForShare(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) {
            String couponUrl = null;
@@ -489,29 +559,39 @@
            String materialId = "https://item.jd.com/" + goodsId + ".html";
            String jumpLink = JDApiUtil.convertLinkWithSubUnionId(materialId, couponUrl,
                  JDApiUtil.POSITION_SHARE + "", "1");
            String template = configService.get(ConfigKeyEnum.quickShareJDCommentText.getKey());
            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) {
            String jumpLink = PinDuoDuoApiUtil.getPromotionUrl(goodsId, PinDuoDuoApiUtil.PID_SHARE + "", "1");
            String template = configService.get(ConfigKeyEnum.quickSharePDDCommentText.getKey());
            String jumpLink = PinDuoDuoApiUtil.getPromotionUrl(Long.parseLong(goodsId), PinDuoDuoApiUtil.PID_SHARE + "", "1");
            if (jumpLink == null) {
               throw new GoodsEvaluateException(1, "该商品转链失败");
            }
            String template = configService.getValue(ConfigKeyEnum.quickSharePDDCommentText.getKey(),system);
            commentText = template.replace("[链接]", jumpLink);
         }
//         commentText = commentText.replace("[原价]", MoneyBigDecimalUtil.getWithNoZera(goodsDetailVO.getZkPrice())+"");
//         if (!goodsDetailVO.isHasCoupon()) {
//            commentText = commentText.replace("领券抢购", "抢购");
//            commentText = commentText.replace("【券后价】[券后价]元", "");
//         } else {
//            commentText = commentText.replace("[券后价]",  MoneyBigDecimalUtil.getWithNoZera(goodsDetailVO.getCouponPrice())+"");
//         }
//
//         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("[原价]",
         // MoneyBigDecimalUtil.getWithNoZera(goodsDetailVO.getZkPrice())+"");
         // if (!goodsDetailVO.isHasCoupon()) {
         // commentText = commentText.replace("领券抢购", "抢购");
         // commentText = commentText.replace("【券后价】[券后价]元", "");
         // } else {
         // commentText = commentText.replace("[券后价]",
         // MoneyBigDecimalUtil.getWithNoZera(goodsDetailVO.getCouponPrice())+"");
         // }
         //
         // 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.setNeedSpin(true);
         commentsNew.add(commentInfo);
         resultObj.setComments(commentsNew);
      }
@@ -530,16 +610,16 @@
      return commentText;
   }
   private String createTokenAndLink(GoodsDetailVO goodsDetailVO) throws Exception {
   private String createTokenAndLink(GoodsDetailVO goodsDetailVO,SystemEnum system) 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());
         TaoBaoLink taoBaoLink = taoBaoLinkManager.getTaoBaoLinkForShare(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) {
         String couponUrl = null;
         JDGoods jdGoods = jdGoodsCacheUtil.getGoodsInfo(goodsDetailVO.getGoodsId());
         JDGoods jdGoods = jdGoodsCacheUtil.getGoodsInfo(Long.parseLong(goodsDetailVO.getGoodsId()));
         JDCouponInfo couponInfo = JDUtil.getShowCouponInfo(jdGoods);
         if (couponInfo != null) {
            couponUrl = couponInfo.getLink();
@@ -547,12 +627,12 @@
         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());
         String template = configService.getValue(ConfigKeyEnum.quickShareJDCommentText.getKey(),system);
         commentText = template.replace("[链接]", jumpLink);
      } else if (goodsDetailVO.getGoodsType() == Constant.SOURCE_TYPE_PDD) {
         String jumpLink = PinDuoDuoApiUtil.getPromotionUrl(goodsDetailVO.getGoodsId(),
         String jumpLink = PinDuoDuoApiUtil.getPromotionUrl(Long.parseLong(goodsDetailVO.getGoodsId()),
               PinDuoDuoApiUtil.PID_SHARE + "", "1");
         String template = configService.get(ConfigKeyEnum.quickSharePDDCommentText.getKey());
         String template = configService.getValue(ConfigKeyEnum.quickSharePDDCommentText.getKey(),system);
         commentText = template.replace("[链接]", jumpLink);
      }
@@ -569,7 +649,7 @@
   public GoodsDetailVO getGoodsDetailVO(Long goodsId, Integer goodsType) throws GoodsEvaluateException {
      GoodsDetailVO goodsDetail = null;
      ConfigParamsDTO params = hongBaoManageService.getShowComputeRate("android", "55");
      ConfigParamsDTO params = orderHongBaoMoneyComputeService.getShowComputeRate("android", "55");
      params.setBaseFanliRate(hongBaoManageService.getBaseFanliRate());
      if (goodsType == Constant.SOURCE_TYPE_TAOBAO) {
         try {
@@ -684,7 +764,6 @@
               }
               String picUrl = goodsDetailVO.getPicUrl();
               if (fileRequest != null) {
                  MultipartFile file = fileRequest.getFile("file" + i);
                  if (file != null) {
@@ -731,7 +810,7 @@
            }
            boolean del = false;
            long oldGoodsId = old.getGoods().getGoodsId().longValue();
            String oldGoodsId = old.getGoods().getGoodsId();
            int oldGoodsType = old.getGoods().getGoodsType().intValue();
            for (ImgInfo newInfo : listImg) {
               ImgEnum type2 = old.getType();
@@ -739,7 +818,7 @@
                  continue;
               }
               if (oldGoodsId == newInfo.getGoods().getGoodsId().longValue()
               if (oldGoodsId .equalsIgnoreCase(newInfo.getGoods().getGoodsId())
                     && oldGoodsType == newInfo.getGoods().getGoodsType().intValue()) {
                  String url = newInfo.getUrl();
                  if (url.equals(old.getUrl())) {
@@ -766,7 +845,7 @@
            lineNum = 1;
         } else if (totalImg == 3) {
            lineNum = 3;
         } else if (totalImg <= 4) {
         } else if (totalImg == 2 || totalImg == 4) {
            lineNum = 2;
         } else {
            lineNum = 3;
@@ -790,7 +869,7 @@
   }
   @Override
   public void saveGoodsComment(String id, int kind, List<CommentInfo> comments)
   public void saveGoodsComment(String id, int kind, List<CommentInfo> comments,SystemEnum system)
         throws GoodsEvaluateException, Exception {
      if (comments == null || comments.size() == 0) {
         throw new GoodsEvaluateException(1, "内容不能为空");
@@ -823,7 +902,7 @@
         String content = commentInfo.getContent();
         if (StringUtil.isNullOrEmpty(content)) {
            if (i == 0 && kind == 1) {
               content = createTokenAndLink(goods);
               content = createTokenAndLink(goods,system);
            } else {
               continue;
            }
@@ -839,6 +918,7 @@
            commentInfo.setId(UUID.randomUUID().toString().replace("-", ""));
         }
         commentInfo.setNeedSpin(true);
         commentInfo.setType(commentInfo.getTags());
         commentInfo.setTypeEnum(CommentInfoEnum.goodsCoupon);
         newList.add(commentInfo);
@@ -853,7 +933,8 @@
   }
   @Override
   public void saveGoodsCoupon(String pid, String content) throws GoodsEvaluateException, Exception {
   public void saveCurrencyCoupon(String pid, int kind, CommentInfo commentInfo)
         throws GoodsEvaluateException, Exception {
      if (StringUtil.isNullOrEmpty(pid)) {
         throw new GoodsEvaluateException(1, "请保存第一部分信息");
      }
@@ -862,84 +943,40 @@
      if (resultObj == null)
         throw new GoodsEvaluateException(1, "第一部分信息缺失");
      CommentInfo goodsCoupon = null;
      CommentInfo currencyCoupon = null;
      List<CommentInfo> oldComments = resultObj.getComments();
      if (oldComments != null) {
         for (CommentInfo info : oldComments) {
            if (CommentInfoEnum.goodsCoupon == info.getTypeEnum()) {
               goodsCoupon = info;
            } else if (CommentInfoEnum.currencyCoupon == info.getTypeEnum()) {
               currencyCoupon = info;
            }
      if (EvaluateEnum.activity != resultObj.getType()) {
         if (StringUtil.isNullOrEmpty(commentInfo.getCoupon())) {
            throw new GoodsEvaluateException(1, "券面额不能为空");
         }
      }
      List<CommentInfo> comments = new ArrayList<>();
      if (!StringUtil.isNullOrEmpty(content)) {
         if (StringUtil.isNullOrEmpty(commentInfo.getTagDesc())) {
            throw new GoodsEvaluateException(1, "描述语不能为空");
         }
         if (!StringUtil.isNullOrEmpty(content)) {
         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 {
               convertLinkManager.convertLinkFromText(content, 1L, true);
               SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
               sdf.parse(endTime);
            } catch (Exception e) {
               throw new GoodsEvaluateException(1, "不包含可转链的口令与链接");
               throw new GoodsEvaluateException(1, "请填写正确的时间格式:2020-03-05");
            }
         }
         CommentInfo commentInfo = new CommentInfo();
         if (goodsCoupon != null) {
            commentInfo.setId(goodsCoupon.getId());
         } else {
            commentInfo.setId(UUID.randomUUID().toString().replace("-", ""));
            throw new GoodsEvaluateException(1, "请填写券截止时间");
         }
         commentInfo.setContent(content);
         commentInfo.setType(commentInfo.getTags());
         commentInfo.setTypeEnum(CommentInfoEnum.goodsCoupon);
         comments.add(commentInfo);
      }
      if (currencyCoupon != null) {
         comments.add(currencyCoupon);
      if (commentInfo.getNeedSpin() == null) {
         commentInfo.setNeedSpin(false);
      }
      resultObj.setComments(comments);
      goodsEvaluateDao.save(resultObj);
   }
   @Override
   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) { // 活动不验证
      if (!StringUtil.isNullOrEmpty(content) && commentInfo.getNeedSpin()) {
         try {
            convertLinkManager.convertLinkFromText(content, Constant.LINK_TOKEN_VERIFY_UID, true);
         } catch (ConvertLinkExceptionException e) {
@@ -950,10 +987,6 @@
            throw new GoodsEvaluateException(1, "包含不可转链的口令与链接");
         }
      }
      GoodsEvaluate resultObj = goodsEvaluateDao.getById(pid);
      if (resultObj == null)
         throw new GoodsEvaluateException(1, "第一部分信息缺失");
      List<CommentInfo> comments = new ArrayList<>();
      CommentInfo currencyCoupon = null;
@@ -1005,7 +1038,7 @@
   }
   @Override
   public void saveActivityPic(String pid, ImgInfo imgInfo, MultipartHttpServletRequest fileRequest)
   public void saveActivityPic(String pid, ImgInfo imgInfo, String picUrls, MultipartHttpServletRequest fileRequest)
         throws GoodsEvaluateException, Exception {
      if (StringUtil.isNullOrEmpty(pid)) {
         throw new GoodsEvaluateException(1, "请保存第一部分信息");
@@ -1015,121 +1048,171 @@
      if (resultObj == null)
         throw new GoodsEvaluateException(1, "第一部分信息缺失");
      String videoPic = null;
      String activityPic = null;
      if (imgInfo == null || StringUtil.isNullOrEmpty(imgInfo.getActivityUrl())) {
         throw new GoodsEvaluateException(1, "活动链接不能为空");
      }
      ImgInfo imgVideo = null;
      ImgInfo imgactivity = null;
      List<String> listDel = new ArrayList<String>();
      List<ImgInfo> listOld = new ArrayList<ImgInfo>();
      List<ImgInfo> resultList = resultObj.getImgList();
      if (resultList != null && resultList.size() > 0) {
         for (ImgInfo info : resultList) {
            if (info.getType() == ImgEnum.activity) {
               activityPic = info.getActivityPic();
               imgactivity = info;
            } else {
            if (info.getType() == ImgEnum.video) {
               imgVideo = info;
               videoPic = info.getUrl();
            } else {
               listOld.add(info);
            }
         }
      }
      int width = 0;
      int height = 0;
      int width2 = 0;
      int height2 = 0;
      List<ImgInfo> listImg = new ArrayList<ImgInfo>();
      // 视频部分
      if (fileRequest != null) {
         MultipartFile filevideo = fileRequest.getFile("filevideo");
         if (filevideo != null) {
            removePicture(videoPic);
            if (StringUtil.isNullOrEmpty(imgInfo.getVideoUrl())) {
               throw new GoodsEvaluateException(1, "视频链接不能为空");
            }
            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");
         if (activityfile != null) {
            removePicture(activityPic);
            InputStream inputStream = activityfile.getInputStream();
            BufferedImage sourceImg = ImageIO.read(inputStream);
            width2 = sourceImg.getWidth();
            height2 = sourceImg.getHeight();
            String picLink = uploadPicture(activityfile);
            activityPic = picLink;
            if (imgVideo != null) {
               String url = imgVideo.getUrl();
               if (!StringUtil.isNullOrEmpty(url)) {
                  listDel.add(url);
               }
               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(info.getUrl());
               imgVideo.setUrlHD(info.getUrl());
               imgVideo.setVideoUrl(imgInfo.getVideoUrl());
               imgVideo.setType(ImgEnum.video);
            }
            imgVideo.setW(info.getW());
            imgVideo.setH(info.getH());
         }
      }
      if (!StringUtil.isNullOrEmpty(videoPic) || !StringUtil.isNullOrEmpty(imgInfo.getVideoUrl())) {
         if (imgVideo != null) {
            imgVideo.setUrl(videoPic);
            imgVideo.setUrlHD(videoPic);
      List<ImgInfo> listImg = new ArrayList<ImgInfo>();
      if (imgVideo != null) {
         if (!StringUtil.isNullOrEmpty(imgInfo.getVideoUrl())) {
            if (imgVideo != null && StringUtil.isNullOrEmpty(imgVideo.getUrl())) {
               throw new GoodsEvaluateException(1, "视频封面图不能为空");
            }
            imgVideo.setVideoUrl(imgInfo.getVideoUrl());
            listImg.add(imgVideo);
         } else {
            imgVideo = new ImgInfo();
            imgVideo.setId(UUID.randomUUID().toString().replace("-", ""));
            imgVideo.setLarge(true);
            imgVideo.setPid(pid);
            imgVideo.setUrl(videoPic);
            imgVideo.setUrlHD(videoPic);
            imgVideo.setVideoUrl(imgInfo.getVideoUrl());
            imgVideo.setType(ImgEnum.video);
            String url = imgVideo.getUrl();
            if (!StringUtil.isNullOrEmpty(url)) {
               listDel.add(url);
            }
         }
         if (width > 0) {
            imgVideo.setW(width);
            imgVideo.setH(height);
         } else {
            imgVideo.setW(imgVideo.getW());
            imgVideo.setH(imgVideo.getH());
         }
         listImg.add(imgVideo);
      }
      int totalImg = 0;
      if (!StringUtil.isNullOrEmpty(activityPic) || !StringUtil.isNullOrEmpty(imgInfo.getActivityUrl())) {
         if (imgactivity != null) {
            imgactivity.setUrl(activityPic);
            imgactivity.setUrlHD(activityPic);
            imgactivity.setActivityUrl(imgInfo.getActivityUrl());
         } else {
            imgactivity = new ImgInfo();
            imgactivity.setId(UUID.randomUUID().toString().replace("-", ""));
            imgactivity.setLarge(true);
            imgactivity.setPid(pid);
            imgactivity.setUrl(activityPic);
            imgactivity.setUrlHD(activityPic);
            imgactivity.setActivityUrl(imgInfo.getActivityUrl());
            imgactivity.setType(ImgEnum.activity);
      String activityUrl = imgInfo.getActivityUrl();
      // 编辑图片
      List<ImgInfo> tempList = new ArrayList<ImgInfo>();
      if (!StringUtil.isNullOrEmpty(picUrls)) {
         String[] pics = picUrls.split(",");
         if (pics != null) {
            for (int i = 0; i < pics.length; i++) {
               String picLink = pics[i];
               if (picLink.startsWith("http")) {
                  if (listOld != null) {
                     for (ImgInfo info : listOld) {
                        if (info.getUrl().equals(picLink)) {
                           info.setActivityUrl(activityUrl);
                           tempList.add(info);
                           break;
                        }
                     }
                  }
               }
            }
         }
         if (width2 > 0) {
            imgactivity.setW(width2);
            imgactivity.setH(height2);
         } else {
            imgactivity.setW(imgactivity.getW());
            imgactivity.setH(imgactivity.getH());
      }
      // 上传文件替换
      if (fileRequest != null) {
         for (int i = 0; i < 9; i++) {
            MultipartFile file = fileRequest.getFile("file" + i);
            if (file != null) {
               ImgInfo info = uploadOriginalPicture(file);
               ImgInfo imgInfo0 = new ImgInfo();
               imgInfo0.setId(UUID.randomUUID().toString().replace("-", ""));
               imgInfo0.setLarge(false);
               imgInfo0.setPid(pid);
               imgInfo0.setUrl(info.getUrl());
               imgInfo0.setUrlHD(info.getUrl());
               imgInfo0.setType(ImgEnum.activity);
               imgInfo0.setW(info.getW());
               imgInfo0.setH(info.getH());
               imgInfo0.setActivityUrl(activityUrl);
               if (i < tempList.size()) {
                  tempList.set(i, imgInfo0);
               } else {
                  tempList.add(imgInfo0);
               }
            }
         }
         listImg.add(imgactivity);
         totalImg++;
      }
      int lineNum = 0;
      int totalImg = tempList.size();
      if (totalImg > 0) {
         if (totalImg == 1) {
            lineNum = 1;
         } else if (totalImg == 3) {
            lineNum = 3;
         } else if (totalImg <= 4) {
         } else if (totalImg == 2 || totalImg == 4) {
            lineNum = 2;
         } else {
            lineNum = 3;
         }
      }
      // 一张图显示为大图
      if (tempList.size() == 1) {
         tempList.get(0).setLarge(true);
      }
      if (tempList.size() > 0) {
         listImg.addAll(tempList);
      }
      // 清理老图片
      if (listOld != null && listOld.size() > 0) {
         for (ImgInfo infoOld : listOld) {
            boolean del = true;
            String oldPic = infoOld.getUrl();
            for (ImgInfo info : listImg) {
               if (info.getUrl().equals(oldPic)) {
                  del = false;
               }
            }
            if (del)
               listDel.add(infoOld.getUrl());
         }
      }
      resultObj.setJumpLink(activityUrl);
      resultObj.setLineNum(lineNum);
      resultObj.setImgList(listImg);
      goodsEvaluateDao.save(resultObj);
      // 删除图片
      if (listDel.size() > 0) {
         for (String url : listDel) {
            if (url.contains(FilePathEnum.goodsEvaluate.getPath())) {
               removePicture(url);
            }
         }
      }
   }
   @Override
@@ -1244,49 +1327,51 @@
         listImg.add(imgActivity);
      }
      int totalImg = 0;
      // 编辑图片
      List<String> listpic = new ArrayList<>();
      if (!StringUtil.isNullOrEmpty(picUrls)) {
         String[] pics = picUrls.split(",");
         if (pics != null) {
            for (int i = 0; i < pics.length; i++) {
               String picLink = pics[i];
               if (fileRequest != null) {
                  MultipartFile file = fileRequest.getFile("file" + i);
                  if (file != null) {
                     picLink = uploadPicture(file);
                     ImgInfo imgInfo0 = new ImgInfo();
                     imgInfo0.setId(UUID.randomUUID().toString().replace("-", ""));
                     imgInfo0.setLarge(false);
                     imgInfo0.setPid(pid);
                     imgInfo0.setUrl(picLink);
                     imgInfo0.setUrlHD(picLink);
                     imgInfo0.setType(ImgEnum.img);
                     imgInfo0.setW(1);
                     imgInfo0.setH(1);
                     listImg.add(imgInfo0);
                     totalImg++;
                     continue;
                  }
               }
               if (picLink.startsWith("http")) {
                  if (listOldImgInfo != null) {
                     for (ImgInfo imgInfo : listOldImgInfo) {
                        String url = imgInfo.getUrl();
                        if (picLink.equals(url)) {
                           listImg.add(imgInfo);
                           totalImg++;
                           break;
                        }
                     }
                  }
                  listpic.add(picLink);
               }
            }
         }
      }
      // 上传文件替换
      if (fileRequest != null) {
         for (int i = 0; i < 9; i++) {
            MultipartFile file = fileRequest.getFile("file" + i);
            if (file != null) {
               String picLink = uploadPicture(file);
               if (i < listpic.size()) {
                  listpic.set(i, picLink);
               } else {
                  listpic.add(picLink);
               }
            }
         }
      }
      int totalImg = 0;
      for (String pic : listpic) {
         ImgInfo imgInfo0 = new ImgInfo();
         imgInfo0.setId(UUID.randomUUID().toString().replace("-", ""));
         imgInfo0.setLarge(false);
         imgInfo0.setPid(pid);
         imgInfo0.setUrl(pic);
         imgInfo0.setUrlHD(pic);
         imgInfo0.setType(ImgEnum.img);
         imgInfo0.setW(1);
         imgInfo0.setH(1);
         listImg.add(imgInfo0);
         totalImg++;
      }
      // 清理老图片
      if (listOld != null && listOld.size() > 0) {
         for (int j = 0; j < listOld.size(); j++) {
            boolean del = true;
@@ -1308,7 +1393,7 @@
            lineNum = 1;
         } else if (totalImg == 3) {
            lineNum = 3;
         } else if (totalImg <= 4) {
         } else if (totalImg == 2 || totalImg == 4) {
            lineNum = 2;
         } else {
            lineNum = 3;
@@ -1343,7 +1428,26 @@
   public GoodsEvaluate getById(String id) {
      return goodsEvaluateDao.getById(id);
   }
   @Override
   public List<GoodsEvaluate> listByStartTime(Date date) {
      return goodsEvaluateDao.listByStartTime(date);
   }
   @Override
   public List<GoodsEvaluate> queryValidSortASC(int start, int count, EvaluateEnum tyepEnum, boolean sortDesc) {
      return goodsEvaluateDao.queryValidSortASC(start, count, tyepEnum, sortDesc);
   }
   @Override
   public List<GoodsEvaluate> queryValidZeroPoint(int start, int count) {
      return goodsEvaluateDao.queryValidZeroPoint(start, count);
   }
   @Override
   public void saveComment(String pid, CommentInfo commentInfo) throws GoodsEvaluateException {
      GoodsEvaluate goodsEvaluate = goodsEvaluateDao.getById(pid);
@@ -1460,23 +1564,23 @@
   }
   @Override
   public List<GoodsEvaluate> query(int start, int count, String key, Integer state, int dynamicType) {
      return goodsEvaluateDao.query(start, count, key, state, dynamicType);
   public List<GoodsEvaluate> query(int start, int count, String key, Integer state, int dynamicType,
         String typeEnum) {
      return goodsEvaluateDao.query(start, count, key, state, dynamicType, typeEnum);
   }
   @Override
   public long count(String key, Integer state, int dynamicType) {
      return goodsEvaluateDao.count(key, state, dynamicType);
   public long count(String key, Integer state, int dynamicType, String typeEnum) {
      return goodsEvaluateDao.count(key, state, dynamicType, typeEnum);
   }
   @Override
   public void addRanDomShareCount() {
      // 发圈
      try {
         List<GoodsEvaluate> list = goodsEvaluateDao.queryValid(0, Integer.MAX_VALUE, 1);
         if (list != null) {
            for (GoodsEvaluate goodsEvaluate: list) {
            for (GoodsEvaluate goodsEvaluate : list) {
               Integer shareNum = goodsEvaluate.getShareNum();
               if (shareNum == null) {
                  shareNum = 0;
@@ -1488,12 +1592,12 @@
      } catch (Exception e) {
         LogHelper.errorDetailInfo(e);
      }
      // 素材
      try {
         List<GoodsEvaluate> list = goodsEvaluateDao.queryValid(0, Integer.MAX_VALUE, 2);
         if (list != null) {
            for (GoodsEvaluate goodsEvaluate: list) {
            for (GoodsEvaluate goodsEvaluate : list) {
               Integer shareNum = goodsEvaluate.getShareNum();
               if (shareNum == null) {
                  shareNum = 0;
@@ -1506,8 +1610,7 @@
         LogHelper.errorDetailInfo(e);
      }
   }
   @Override
   @Cacheable(value = "dynamicCache", key = "'queryValidEvaluateCache-'+#start")
   public List<GoodsEvaluate> queryValidEvaluateCache(int start, int count) {
@@ -1517,7 +1620,13 @@
      executor.execute(new Runnable() {
         @Override
         public void run() {
            // 更新信息
            updateGoodInfo(list);
            // 删除已过期
            removeOverdue();
            removeDownGoods();
         }
      });
@@ -1541,7 +1650,6 @@
      List<GoodsEvaluate> listNew = new ArrayList<>();
      for (GoodsEvaluate goodsEvaluate : list) {
         GoodsEvaluate evaluateNew = new GoodsEvaluate();
         try {
            PropertyUtils.copyProperties(evaluateNew, goodsEvaluate);
@@ -1550,7 +1658,9 @@
            continue;
         }
         int comment = 0;
         // 按照发布显示时间段起始时间为准。
         evaluateNew.setPublishTime(evaluateNew.getStartTime());
         List<CommentInfo> comments = evaluateNew.getComments();
         if (comments != null && comments.size() > 0) {
            EvaluateEnum typeEnum = evaluateNew.getType();
@@ -1577,20 +1687,35 @@
                  if (goods != null) {
                     String content = commentInfoNew.getContent();
                     if (!StringUtil.isNullOrEmpty(content)) {
                        content = content.replace("[原价]", MoneyBigDecimalUtil.getWithNoZera(goods.getZkPrice())+"");
                        content = content.replace("[原价]",
                              MoneyBigDecimalUtil.getWithNoZera(goods.getZkPrice()) + "");
                        if (goods.isHasCoupon()) {
                           content = content.replace("[券后价]",MoneyBigDecimalUtil.getWithNoZera(goods.getCouponPrice())+"");
                           content = content.replace("[券后价]",
                                 MoneyBigDecimalUtil.getWithNoZera(goods.getCouponPrice()) + "");
                        } else {
                           singleCoupn = false;
                           content = content.replace("领券抢购", "抢购");
                           content = content.replace("【券后价】[券后价]元", "");
                        }
                        content = content.replace("\r\n\r\n", "\r\n").replace("\r\n\r\n", "\r\n");
                        // 替换淘宝官方活动
                        List<String> activityIdList = convertLinkManager.getTaoBaoOfficialActivityId(content);
                        for (String st : activityIdList)
                           content = content.replace(st, "");
                        commentInfoNew.setContent(content);
                     }
                  }
               }
               if (typeEnum != null && typeEnum == EvaluateEnum.activity) {
                  // 替换淘宝官方活动
                  String content = commentInfoNew.getContent();
                  List<String> activityIdList = convertLinkManager.getTaoBaoOfficialActivityId(content);
                  for (String st : activityIdList)
                     content = content.replace(st, "");
                  commentInfoNew.setContent(content);
               }
               CommentInfoEnum typeComment = commentInfoNew.getTypeEnum();
               if (typeComment != null && typeComment == CommentInfoEnum.goodsCoupon) {
                  GoodsDetailVO goods = evaluateNew.getGoods();
@@ -1666,6 +1791,11 @@
         @Override
         public void run() {
            updateGoodInfo(listOBJ);
            // 删除已过期
            removeOverdue();
            removeDownGoods();
         }
      });
@@ -1691,8 +1821,8 @@
      try {
         Date now = new Date();
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
         ConfigParamsDTO params = hongBaoManageService.getShowComputeRate("android", "55");
         SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         ConfigParamsDTO params = orderHongBaoMoneyComputeService.getShowComputeRate("android", "55");
         params.setBaseFanliRate(hongBaoManageService.getBaseFanliRate());
         for (GoodsEvaluate goodsEvaluate : list) {
            // 是否2个小时之内已更新
@@ -1717,7 +1847,7 @@
                     if (commentInfoEnum != null && commentInfoEnum == CommentInfoEnum.currencyCoupon) {
                        String endTime = commentInfo.getEndTime();
                        if (!StringUtil.isNullOrEmpty(endTime)) {
                           Date endDay = sdf.parse(endTime);
                           Date endDay = format.parse(endTime);
                           if (endDay.getTime() < now.getTime()) {
                              goodsEvaluate.setState(0); // 活动过期
                           }
@@ -1786,12 +1916,12 @@
      }
   }
   private GoodsDetailVO getGoodsNewInfo(Long goodsId, int goodsType, ConfigParamsDTO paramsDTO) {
   private GoodsDetailVO getGoodsNewInfo(String goodsId, int goodsType, ConfigParamsDTO paramsDTO) {
      GoodsDetailVO vo = null;
      if (goodsType == Constant.SOURCE_TYPE_TAOBAO) {
         TaoBaoGoodsBrief goods;
         try {
            goods = redisManager.getTaoBaoGoodsBrief(goodsId);
            goods = redisManager.getTaoBaoGoodsBrief(Long.parseLong(goodsId));
            if (goods != null) {
               vo = GoodsDetailVOFactory.convertTaoBao(goods, paramsDTO);
            }
@@ -1800,12 +1930,12 @@
         }
      } else if (goodsType == Constant.SOURCE_TYPE_JD) {
         JDGoods goodsInfo = jdGoodsCacheUtil.getGoodsInfo(goodsId);
         JDGoods goodsInfo = jdGoodsCacheUtil.getGoodsInfo(Long.parseLong(goodsId));
         if (goodsInfo != null) {
            vo = GoodsDetailVOFactory.convertJDGoods(goodsInfo, paramsDTO);
         }
      } else if (goodsType == Constant.SOURCE_TYPE_PDD) {
         PDDGoodsDetail goodsInfo = pinDuoDuoCacheUtil.getGoodsInfo(goodsId);
         PDDGoodsDetail goodsInfo = pinDuoDuoCacheUtil.getGoodsInfo(Long.parseLong(goodsId));
         if (goodsInfo != null)
            vo = GoodsDetailVOFactory.convertPDDGoods(goodsInfo, paramsDTO);
      }
@@ -1813,53 +1943,58 @@
   }
   @Override
   public void addGoodsEvaluateByDynamicInfo(DynamicInfo info) {
      if (1 > 0) {
         return; // 暂不启用自动生成
   public void addGoodsEvaluate(String goodsId, List<ImgInfo> imgList, ActivityUser user, String title, String comment,
         Date startTime,SystemEnum system) throws GoodsEvaluateException {
      if (goodsId == null || user == null || StringUtil.isNullOrEmpty(title)) {
         throw new GoodsEvaluateException(1, "相关参数不能为空");
      }
      if (info == null) {
         return;
      }
      Date limitDate = DateUtil.reduceDay(new Date(), 7);
      List<GoodsEvaluate> evaluateList = goodsEvaluateDao.queryExistLimitTime(Constant.SOURCE_TYPE_TAOBAO, goodsId, limitDate);
      if (evaluateList != null && evaluateList.size() > 0)
         throw new GoodsEvaluateException(1, "该商品已存在");
      TaoBaoGoodsBrief goodsBrief = null;
      try {
         GoodsEvaluate goodsEvaluate = new GoodsEvaluate();
         goodsEvaluate.setId(UUID.randomUUID().toString().replace("-", ""));
         ActivityUser user = info.getUser();
         goodsEvaluate.setUser(user);
         goodsEvaluate.setState(1);
         goodsEvaluate.setDynamicType(1);
         goodsEvaluate.setType(EvaluateEnum.single);
         goodsEvaluate.setLineNum(2);
         goodsEvaluate.setShareNum(info.getShareCount());
         goodsEvaluate.setShareNumReal(0);
         goodsEvaluate.setPublishTime(info.getCreateTime());
         goodsEvaluate.setCreateTime(new Date());
         goodsEvaluate.setUpdateTime(new Date());
         goodsEvaluate.setWeight(0.0);
         goodsEvaluate.setStartTime(new Date());
         goodsEvaluate.setEndTime(DateUtil.plusDayDate(3, new Date()));
         goodsBrief = redisManager.getTaoBaoGoodsBrief(Long.parseLong(goodsId));
      } catch (TaobaoGoodsDownException e) {
         throw new GoodsEvaluateException(1, "商品已下架");
      }
         List<ClientTextStyleVO> titles = info.getTitle();
         if (titles != null) {
            goodsEvaluate.setTitle(info.getTitle().get(0).getContent());
         } else {
            goodsEvaluate.setTitle("");
         }
      if (goodsBrief == null) {
         throw new GoodsEvaluateException(1, "未找到商品信息");
      }
         List<ImgInfo> imgList = new ArrayList<>();
      BigDecimal couponAmount = goodsBrief.getCouponAmount();
      if (couponAmount == null || couponAmount.compareTo(new BigDecimal(0)) < 1) {
         throw new GoodsEvaluateException(1, "该商品无券");
      }
         List<GoodsPicture> imgs = info.getImgs();
         for (GoodsPicture goodsPicture : imgs) {
      // 白底图
      List<String> imgs = new ArrayList<>();
      imgs.addAll(goodsBrief.getImgList());
      // 商品VO
      ConfigParamsDTO paramsDTO = orderHongBaoMoneyComputeService.getShowComputeRate("android", "55");
      paramsDTO.setBaseFanliRate(hongBaoManageService.getBaseFanliRate());
      GoodsDetailVO goodsVO = GoodsDetailVOFactory.convertTaoBao(goodsBrief, paramsDTO);
      // 商品图片信息
      int i = 0;
      if (imgList == null)
         imgList = new ArrayList<ImgInfo>();
      if (imgList.size() == 0)
         for (String img : imgs) {
            ImgInfo imgInfo = new ImgInfo();
            imgInfo.setH(1);
            imgInfo.setW(1);
            imgInfo.setLarge(false);
            imgInfo.setUrl(goodsPicture.getUrl());
            imgInfo.setUrlHD(goodsPicture.getUrl());
            GoodsDetailVO goodsVO = goodsPicture.getGoodsVO();
            if (goodsVO == null) {
            imgInfo.setUrl(img);
            imgInfo.setUrlHD(img);
            if (i != 0) {
               imgInfo.setType(ImgEnum.img);
            } else {
               imgInfo.setType(ImgEnum.goods);
@@ -1875,47 +2010,234 @@
                  simpleGoods.setAmount(couponInfo.getAmount());
               }
               imgInfo.setGoods(simpleGoods);
               TaoBaoLink taoBaoLink = shareGoodsService.getTaoBaoLinkForShare(1L, goodsVO.getGoodsId(), "0");
//               TaoBaoLink taoBaoLink = shareGoodsService.getTaoBaoLinkForShare(Constant.LINK_TOKEN_VERIFY_UID, 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);
               imgInfo.setGoodsVO(goodsVO);
            }
            imgList.add(imgInfo);
            i++;
         }
         goodsEvaluate.setImgList(imgList);
         goodsEvaluateDao.save(goodsEvaluate);
      } catch (Exception e) {
         LogHelper.errorDetailInfo(e);
      // 评论内容
      CommentInfo commentInfo = new CommentInfo();
      commentInfo.setNeedSpin(true);
      commentInfo.setId(UUID.randomUUID().toString().replace("-", ""));
      commentInfo.setTypeEnum(CommentInfoEnum.goodsCoupon);
      if (!StringUtil.isNullOrEmpty(comment)) {
         commentInfo.setContent(comment);
         commentInfo.setType("");
      } else {
         goodsBrief.setCouponLink(null);
         String token = shareGoodsService.createTaoBaoToken(Constant.LINK_TOKEN_VERIFY_UID, goodsBrief);
         String template = configService.getValue(ConfigKeyEnum.quickShareTBCommentText.getKey(),system);
         String commentText = template.replace("[淘口令]", TaoBaoUtil.filterTaoToken(token));
         if (!goodsVO.isHasCoupon()) {
            commentText = commentText.replace("领券抢购", "抢购");
            commentText = commentText.replace("【券后价】[券后价]元", "");
            commentText = commentText.replace("\r\n\r\n", "\r\n").replace("\r\n\r\n", "\r\n").replace("\r\n\r\n",
                  "\r\n");
         }
         commentInfo.setContent(commentText);
         commentInfo.setType(CommentInfoEnum.goodsCoupon.getDesc());
      }
      List<CommentInfo> commentsNew = new ArrayList<>();
      commentsNew.add(commentInfo);
      // 一行显示多少个图片
      int lineNum = 0;
      if (imgList.size() > 0) {
         if (imgList.size() == 1) {
            lineNum = 1;
         } else if (imgList.size() == 3) {
            lineNum = 3;
         } else if (imgList.size() == 2 || imgList.size() == 4) {
            lineNum = 2;
         } else {
            lineNum = 3;
         }
      }
      GoodsEvaluate goodsEvaluate = new GoodsEvaluate();
      goodsEvaluate.setId(UUID.randomUUID().toString().replace("-", ""));
      goodsEvaluate.setUser(user);
      goodsEvaluate.setTitle(getDescNew(title));
      goodsEvaluate.setState(1);
      goodsEvaluate.setDynamicType(1);
      goodsEvaluate.setType(EvaluateEnum.single);
      goodsEvaluate.setShareNum((int) (Math.random() * 5000) + 1000);
      goodsEvaluate.setShareNumReal(0);
      goodsEvaluate.setWeight(0.0);
      if (startTime == null)
         startTime = new Date();
      goodsEvaluate.setStartTime(startTime);
      goodsEvaluate.setEndTime(DateUtil.plusDayDate(3, new Date()));
      goodsEvaluate.setPublishTime(new Date());
      goodsEvaluate.setCreateTime(new Date());
      goodsEvaluate.setUpdateTime(new Date());
      goodsEvaluate.setGoods(goodsVO);
      goodsEvaluate.setLineNum(lineNum);
      goodsEvaluate.setImgList(imgList);
      goodsEvaluate.setComments(commentsNew);
      goodsEvaluateDao.save(goodsEvaluate);
   }
   @Override
   public void addGoodsEvaluateByDaTaoKe() {
   public int addGoodsEvaluate(TaoBaoGoodsBrief goodsBrief, List<String> imgs, ActivityUser user, String title,SystemEnum system) throws GoodsEvaluateException {
      if (goodsBrief == null || user == null || StringUtil.isNullOrEmpty(title)) {
         throw new GoodsEvaluateException(1, "相关参数不能为空");
      }
      Date limitDate = DateUtil.reduceDay(new Date(), 7);
      Long goodsId = goodsBrief.getAuctionId();
      List<GoodsEvaluate> evaluateList = goodsEvaluateDao.queryExistLimitTime(Constant.SOURCE_TYPE_TAOBAO, goodsId + "", limitDate);
      if (evaluateList != null && evaluateList.size() > 0)
         throw new GoodsEvaluateException(1, "该商品已存在");
      if (imgs == null) {
         imgs = new ArrayList<>();
      }
      if (imgs.size() == 0) {
         imgs.addAll(goodsBrief.getImgList());
      }
      // 商品VO
      ConfigParamsDTO paramsDTO = orderHongBaoMoneyComputeService.getShowComputeRate("android", "55");
      paramsDTO.setBaseFanliRate(hongBaoManageService.getBaseFanliRate());
      GoodsDetailVO goodsVO = GoodsDetailVOFactory.convertTaoBao(goodsBrief, paramsDTO);
      // 商品图片信息
      int i = 0;
      List<ImgInfo> imgList = new ArrayList<ImgInfo>();
      for (String img : imgs) {
         ImgInfo imgInfo = new ImgInfo();
         imgInfo.setH(1);
         imgInfo.setW(1);
         imgInfo.setLarge(false);
         imgInfo.setUrl(img);
         imgInfo.setUrlHD(img);
         if (i != 0) {
            imgInfo.setType(ImgEnum.img);
         } else {
            imgInfo.setType(ImgEnum.goods);
            SimpleGoods simpleGoods = new SimpleGoods();
            simpleGoods.setGoodsId(goodsVO.getGoodsId());
            simpleGoods.setGoodsType(goodsVO.getGoodsType());
            simpleGoods.setState(goodsVO.getState());
            CouponInfoVO couponInfo = goodsVO.getCouponInfo();
            if (couponInfo == null) {
               simpleGoods.setPrice(goodsVO.getZkPrice());
            } else {
               simpleGoods.setPrice(goodsVO.getCouponPrice());
               simpleGoods.setAmount(couponInfo.getAmount());
            }
            imgInfo.setGoods(simpleGoods);
            imgInfo.setGoodsVO(goodsVO);
         }
         imgList.add(imgInfo);
         i++;
      }
      // 生成口令
      String token = null;
      try {
         TaoBaoLink taoBaoLink = taoBaoLinkManager.getTaoBaoLinkForShare(Constant.LINK_TOKEN_VERIFY_UID, goodsBrief.getAuctionId(), "1",null);
         token = taoBaoLink.getTaoToken();
      } catch (TaoBaoConvertLinkException e) {
         e.printStackTrace();
         throw new GoodsEvaluateException(1, "转链失败");
      }
      String template = configService.getValue(ConfigKeyEnum.quickShareTBCommentText.getKey(),system);
      String commentText = template.replace("[淘口令]", TaoBaoUtil.filterTaoToken(token));
      if (!goodsVO.isHasCoupon()) {
         commentText = commentText.replace("领券抢购", "抢购");
         commentText = commentText.replace("【券后价】[券后价]元", "");
         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.setNeedSpin(true);
      commentInfo.setId(UUID.randomUUID().toString().replace("-", ""));
      commentInfo.setTypeEnum(CommentInfoEnum.goodsCoupon);
      commentInfo.setContent(commentText);
      commentInfo.setType(CommentInfoEnum.goodsCoupon.getDesc());
      List<CommentInfo> commentsNew = new ArrayList<>();
      commentsNew.add(commentInfo);
      // 一行显示多少个图片
      int lineNum = 0;
      if (imgList.size() > 0) {
         if (imgList.size() == 1) {
            lineNum = 1;
         } else if (imgList.size() == 3) {
            lineNum = 3;
         } else if (imgList.size() == 2 || imgList.size() == 4) {
            lineNum = 2;
         } else {
            lineNum = 3;
         }
      }
      int result = 0;
      int zeroPoint = 0;
      // ★深夜大福利:先抢券,0点准时下单★
      // 含这种文本的定于每晚10点在动态-发圈 集中发,每晚10点在群发单中只发一条。
      Date startTime = new Date();
      if (!StringUtil.isNullOrEmpty(title)) {
         String value = configService.getValue(ConfigKeyEnum.evaluateZeroKey.getKey(),system);
         if (!StringUtil.isNullOrEmpty(value)) {
            List<String> asList = Arrays.asList(value.split(","));
            if (asList != null && asList.size() > 0) {
               boolean zero = false;
               for (String zerokey: asList) {
                  if(title.contains(zerokey)) {
                     zero = true;
                     break;
                  }
               }
               if (zero) {
                  result = 1;
                  zeroPoint = 1;
                  startTime = TimeUtil.parseYYYYMMDD_HHMM(TimeUtil.getGernalTime(startTime) + " 22:00");
               }
            }
         }
      }
      GoodsEvaluate goodsEvaluate = new GoodsEvaluate();
      goodsEvaluate.setId(UUID.randomUUID().toString().replace("-", ""));
      goodsEvaluate.setUser(user);
      goodsEvaluate.setTitle(getDescNew(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());
      goodsEvaluate.setGoods(goodsVO);
      goodsEvaluate.setLineNum(lineNum);
      goodsEvaluate.setImgList(imgList);
      goodsEvaluate.setComments(commentsNew);
      goodsEvaluateDao.save(goodsEvaluate);
      return result;
   }
   @Override
   public void addGoodsEvaluateByDaTaoKe(SystemEnum system) {
      List<Long> listId = null;
      List<GoodsEvaluate> listExist = goodsEvaluateDao.querySingleExist();
      if (listExist != null && listExist.size() > 0) {
@@ -1923,7 +2245,7 @@
         for (GoodsEvaluate goodsEvaluate : listExist) {
            GoodsDetailVO goods = goodsEvaluate.getGoods();
            if (goods != null && goods.getGoodsType() == 1) {
               listId.add(goods.getGoodsId());
               listId.add(Long.parseLong(goods.getGoodsId()));
            }
         }
      }
@@ -1938,15 +2260,24 @@
      }
      for (int i = 0; i < list.size(); i++) {
         boolean cerateGoods = cerateGoods(list.get(i));
         boolean cerateGoods = addByDaTaoKeGoods(list.get(i),system);
         if (cerateGoods) {
            break;
         }
      }
   }
   private boolean cerateGoods(DaTaoKeDetailV2 daTaoKe) {
   @Override
   public boolean addByDaTaoKeGoods(DaTaoKeDetailV2 daTaoKe,SystemEnum system) {
      try {
         Date limitDate = DateUtil.reduceDay(new Date(), 7);
         List<GoodsEvaluate> evaluateList = goodsEvaluateDao.queryExistLimitTime(Constant.SOURCE_TYPE_TAOBAO,
               daTaoKe.getGoodsId()+"", limitDate);
         if (evaluateList != null && evaluateList.size() > 0)
            return false;
         TaoBaoGoodsBrief goodsBrief = redisManager.getTaoBaoGoodsBrief(daTaoKe.getGoodsId());
         if (goodsBrief == null) {
            return false;
@@ -1957,11 +2288,18 @@
            return false;
         }
         ConfigParamsDTO paramsDTO = hongBaoManageService.getShowComputeRate("android", "55");
         ConfigParamsDTO paramsDTO = orderHongBaoMoneyComputeService.getShowComputeRate("android", "55");
         paramsDTO.setBaseFanliRate(hongBaoManageService.getBaseFanliRate());
         GoodsDetailVO goodsVO = GoodsDetailVOFactory.convertTaoBao(goodsBrief, paramsDTO);
         // 发布用户
         ActivityUser user = activityUserService.getRandomByDaTaoKeCid(daTaoKe.getCid());
         ActivityUser user = null;
         if(daTaoKe.getCid() != null) {
            user = activityUserService.getRandomByDaTaoKeCid(daTaoKe.getCid());
         } else {
            List<ActivityRuleUser> ruleList = activityUserService.listByRuleCode(ActivityRuleUser.RULE_HAOHUO, 1, 20);
            user = ruleList.get((int) (ruleList.size() * Math.random())).getActivityUser();
         }
         String desc = daTaoKe.getDesc().replace(",", ",");
         String[] split = desc.split(",");
@@ -2003,7 +2341,6 @@
         goodsEvaluate.setState(1);
         goodsEvaluate.setDynamicType(1);
         goodsEvaluate.setType(EvaluateEnum.single);
         goodsEvaluate.setShareNum((int) (Math.random() * 5000) + 1000);
         goodsEvaluate.setShareNumReal(0);
         goodsEvaluate.setWeight(0.0);
@@ -2016,24 +2353,7 @@
         List<String> goodsimgs = goodsBrief.getImgList();
         List<String> imgs = new ArrayList<>();
         if (!StringUtil.isNullOrEmpty(goodsBrief.getPictUrlWhite())) {
            imgs.add(goodsBrief.getPictUrlWhite());
         }
         imgs.addAll(goodsimgs);
         int lineNum = 0;
         if (imgs.size() > 0) {
            if (imgs.size() == 1) {
               lineNum = 1;
            } else if (imgs.size() == 3) {
               lineNum = 3;
            } else if (imgs.size() <= 4) {
               lineNum = 2;
            } else {
               lineNum = 3;
            }
         }
         goodsEvaluate.setLineNum(lineNum);
         int i = 0;
         List<ImgInfo> imgList = new ArrayList<>();
@@ -2068,61 +2388,72 @@
               String token = shareGoodsService.createTaoBaoToken(Constant.LINK_TOKEN_VERIFY_UID, goodsBrief);
               String template = configService.get(ConfigKeyEnum.quickShareTBCommentText.getKey());
               String template = configService.getValue(ConfigKeyEnum.quickShareTBCommentText.getKey(),system);
               String commentText = template.replace("[淘口令]", TaoBaoUtil.filterTaoToken(token));
               commentText = commentText.replace("[原价]", MoneyBigDecimalUtil.getWithNoZera(goodsVO.getZkPrice())+"");
               if (!goodsVO.isHasCoupon()) {
                  commentText = commentText.replace("领券抢购", "抢购");
                  commentText = commentText.replace("【券后价】[券后价]元", "");
               } else {
                  commentText = commentText.replace("[券后价]", MoneyBigDecimalUtil.getWithNoZera(goodsVO.getCouponPrice())+"");
                  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.setNeedSpin(true);
               commentInfo.setId(UUID.randomUUID().toString().replace("-", ""));
               commentInfo.setContent(commentText);
               commentInfo.setTypeEnum(CommentInfoEnum.goodsCoupon);
               commentInfo.setType(CommentInfoEnum.goodsCoupon.getDesc());
               String text2 = "";
               String evaluateEmojis = configService.get(ConfigKeyEnum.evaluateEmojis.getKey());
               String evaluateEmojis = configService.getValue(ConfigKeyEnum.evaluateEmojis.getKey(),system);
               if (!StringUtil.isNullOrEmpty(evaluateEmojis)) {
                  text2 = evaluateEmojis + "\n";
               }
               String evaluateText = configService.get(ConfigKeyEnum.evaluateText.getKey());
               String evaluateText = configService.getValue(ConfigKeyEnum.evaluateText.getKey(),system);
               if (!StringUtil.isNullOrEmpty(evaluateText)) {
                  text2 += evaluateText;
               }
               String dtitle = daTaoKe.getDtitle();
               if (!StringUtil.isNullOrEmpty(dtitle)) {
                  text2 = text2 + dtitle +"\n";
                  text2 = text2 + dtitle + "\n";
               } else if (!StringUtil.isNullOrEmpty(evaluateText)) {
                  text2 += "\n";
               }
               text2 += "先领【"+ couponAmount +"元优惠券】下单";
               text2 += "先领【" + couponAmount + "元优惠券】下单";
               CommentInfo commentInfo2 = new CommentInfo();
               commentInfo2.setId(UUID.randomUUID().toString().replace("-", ""));
               commentInfo2.setContent(text2);
               commentInfo2.setTypeEnum(CommentInfoEnum.goodsCoupon);
               commentInfo2.setType("");
               commentInfo2.setNeedSpin(true);
               List<CommentInfo> commentsNew = new ArrayList<>();
               commentsNew.add(commentInfo);
               commentsNew.add(commentInfo2);
               goodsEvaluate.setComments(commentsNew);
               goodsEvaluate.setGoods(goodsVO);
            }
            imgList.add(imgInfo);
            i++;
         }
         int lineNum = 0;
         if (imgList.size() > 0) {
            if (imgList.size() == 1) {
               lineNum = 1;
            } else if (imgList.size() == 3) {
               lineNum = 3;
            } else if (imgList.size() == 2 || imgList.size() == 4) {
               lineNum = 2;
            } else {
               lineNum = 3;
            }
         }
         goodsEvaluate.setLineNum(lineNum);
         goodsEvaluate.setGoods(goodsVO);
         goodsEvaluate.setImgList(imgList);
         goodsEvaluateDao.save(goodsEvaluate);
      } catch (Exception e) {
@@ -2133,170 +2464,145 @@
      return true;
   }
   private String getDesc(String desc) {
      System.out.println(desc);
      String newDesc = "";
      int emoji = 0;
      String content = desc.replace(",", ",");
      while (content.length() > 0) {
         int length = 0;
         boolean end = true;
         for (int i = 0; i < content.length(); i++) {
            if (content.substring(0, i).length() >= 18) {
               length = i;
               end = false;
               break;
            }
         }
         if (end) {
            length = content.length();
         }
         String introduce = content.substring(0, length);
         System.out.println(introduce);
         if (verify(introduce)) {
            if (emoji >= 4) {
               introduce = introduce.replace(",", "\n"); // 需要换行
   /**
    * 发圈标题 加入表情
    * @param desc
    * @return
    */
   private String getDescNew(String desc) {
      String[] split = desc.split(",");
      int max = 1;
      if (Math.random() > 0.5) {
         max = 2;
      }
      int e = 0;
      String emojis = "";
      String descNew = "";
      if (split.length > 0) {
         for (int i = 0; i < split.length; i++) {
            if (Math.random() > 0.5 && e < max) {
               for (int j = 0; j < 10; j++) {
                  String emojisTemp = DaTaoKeUtil.getEvaluateEmojis();
                  if (!emojis.equals(emojisTemp)) {
                     emojis = emojisTemp;
                     break;
                  }
               }
               e++;
               descNew += split[i] + emojis;
            } else {
               emoji++;
               introduce = introduce.replace(",", DaTaoKeUtil.getRandomCommonEmoji() + "\n"); // 需要换行
               descNew += split[i] + ",";
            }
         }
         // 随机替换emoji
         if (emoji <= 4 && Math.random() > 0.5) {
            introduce = introduce.replace(",", DaTaoKeUtil.getRandomCommonEmoji());
            emoji++;
         }
         newDesc += introduce;
         content = content.substring(length);
      } else {
         descNew = desc;
      }
      return newDesc;
      if (descNew.endsWith(",")) {
         descNew = descNew.substring(0, descNew.length() - 1);
      }
      return descNew;
   }
   private boolean verify(String content) {
      // 18个字符内(包含标点也算一个字符)有多个逗号,则不换行
      char d = ',';
      int count = 0;
      char chs[] = content.toCharArray();// 转换成char数组
      for (int i = 0; i < chs.length; i++) {
         if (d == chs[i]) {
            count++;
         }
      }
      if (count > 1) {
         return false;
      }
      // 书名号,大括号,小括号里面的内容不换行
      if (content.contains("[") && content.contains("]")) {
         return false;
      } else if (content.contains("【") && content.contains("】")) {
         return false;
      } else if (content.contains("{") && content.contains("}")) {
         return false;
      } else if (content.contains("(") && content.contains(")")) {
         return false;
      }
      int index = content.lastIndexOf(",");
      // (除开逗号以外的符号)感叹号/句号/问号前面有逗号,不换行
      if (content.contains("!") && index < content.lastIndexOf("!")) {
         return false;
      }
      if (content.contains("!") && index < content.lastIndexOf("!")) {
         return false;
      }
      if (content.contains("。") && index < content.lastIndexOf("。")) {
         return false;
      }
      if (content.contains("?") && index < content.lastIndexOf("?")) {
         return false;
      }
      if (content.contains("?") && index < content.lastIndexOf("?")) {
         return false;
      }
      if (content.contains(":")) {
         return false;
      }
      return true;
   }
   @Override
   public void updateTaoBaoGoods(TaoBaoGoodsBrief goods) {
      try {
         if (goods == null) {
            return;
         }
         List<GoodsEvaluate> queryExist = goodsEvaluateDao.queryExist(Constant.SOURCE_TYPE_TAOBAO, goods.getAuctionId());
         List<GoodsEvaluate> queryExist = goodsEvaluateDao.queryExist(Constant.SOURCE_TYPE_TAOBAO,
               goods.getAuctionId()+"");
         if (queryExist == null || queryExist.size() == 0) {
            return;
         }
         ConfigParamsDTO paramsDTO = hongBaoManageService.getShowComputeRate("android", "55");
         ConfigParamsDTO paramsDTO = orderHongBaoMoneyComputeService.getShowComputeRate("android", "55");
         paramsDTO.setBaseFanliRate(hongBaoManageService.getBaseFanliRate());
         GoodsDetailVO goodsNew = GoodsDetailVOFactory.convertTaoBao(goods, paramsDTO);
         updateGoods(queryExist, goodsNew);
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
   @Override
   public void updateJDGoods(JDGoods jdGoods) {
      if (jdGoods == null) {
         return;
      }
      List<GoodsEvaluate> queryExist = goodsEvaluateDao.queryExist(Constant.SOURCE_TYPE_JD, jdGoods.getSkuId());
      List<GoodsEvaluate> queryExist = goodsEvaluateDao.queryExist(Constant.SOURCE_TYPE_JD, jdGoods.getSkuId()+"");
      if (queryExist == null || queryExist.size() == 0) {
         return;
      }
      ConfigParamsDTO paramsDTO = hongBaoManageService.getShowComputeRate("android", "55");
      ConfigParamsDTO paramsDTO = orderHongBaoMoneyComputeService.getShowComputeRate("android", "55");
      paramsDTO.setBaseFanliRate(hongBaoManageService.getBaseFanliRate());
      GoodsDetailVO goodsNew = GoodsDetailVOFactory.convertJDGoods(jdGoods, paramsDTO);
      updateGoods(queryExist, goodsNew);
   }
   @Override
   public void updatePDDGoods(PDDGoodsDetail pddGoods) {
      if (pddGoods == null) {
         return;
      }
      List<GoodsEvaluate> queryExist = goodsEvaluateDao.queryExist(Constant.SOURCE_TYPE_PDD, pddGoods.getGoodsId());
      List<GoodsEvaluate> queryExist = goodsEvaluateDao.queryExist(Constant.SOURCE_TYPE_PDD, pddGoods.getGoodsId()+"");
      if (queryExist == null || queryExist.size() == 0) {
         return;
      }
      ConfigParamsDTO paramsDTO = hongBaoManageService.getShowComputeRate("android", "55");
      ConfigParamsDTO paramsDTO = orderHongBaoMoneyComputeService.getShowComputeRate("android", "55");
      paramsDTO.setBaseFanliRate(hongBaoManageService.getBaseFanliRate());
      GoodsDetailVO goodsNew = GoodsDetailVOFactory.convertPDDGoods(pddGoods, paramsDTO);
      updateGoods(queryExist, goodsNew);
   }
   @Override
   public void updateVIPGoods(VIPGoodsInfo goods) {
      if (goods == null) {
         return;
      }
      List<GoodsEvaluate> queryExist = goodsEvaluateDao.queryExist(Constant.SOURCE_TYPE_VIP,
            goods.getGoodsId());
      if (queryExist == null || queryExist.size() == 0) {
         return;
      }
      ConfigParamsDTO paramsDTO = orderHongBaoMoneyComputeService.getShowComputeRate("android", "55");
      paramsDTO.setBaseFanliRate(hongBaoManageService.getBaseFanliRate());
      GoodsDetailVO goodsNew = GoodsDetailVOFactory.convertVIPGoods(goods, paramsDTO);
      updateGoods(queryExist, goodsNew);
   }
   @Override
   public void updateSuningGoods(SuningGoodsInfo goods) {
      if (goods == null) {
         return;
      }
      List<GoodsEvaluate> queryExist = goodsEvaluateDao.queryExist(Constant.SOURCE_TYPE_SUNING,
            goods.getCommodityInfo().getCommodityCode());
      if (queryExist == null || queryExist.size() == 0) {
         return;
      }
      ConfigParamsDTO paramsDTO = orderHongBaoMoneyComputeService.getShowComputeRate("android", "55");
      paramsDTO.setBaseFanliRate(hongBaoManageService.getBaseFanliRate());
      GoodsDetailVO goodsNew = GoodsDetailVOFactory.convertSuningGoods(goods, paramsDTO);
      updateGoods(queryExist, goodsNew);
   }
   private void updateGoods(List<GoodsEvaluate> listExist, GoodsDetailVO goodsNew) {
      long goodsId = goodsNew.getGoodsId();
      String goodsId = goodsNew.getGoodsId();
      int goodsType = goodsNew.getGoodsType();
      for (GoodsEvaluate goodsEvaluate: listExist) {
      for (GoodsEvaluate goodsEvaluate : listExist) {
         GoodsDetailVO goodsDetailVO = goodsEvaluate.getGoods();
         if (goodsDetailVO != null && goodsDetailVO.getGoodsId() != null
            && goodsDetailVO.getGoodsId() == goodsId && goodsDetailVO.getGoodsType() == goodsType ) {
            if (goodsDetailVO.getTitle().equalsIgnoreCase(goodsNew.getTitle())) {
               goodsEvaluate.setGoods(goodsNew);
            } else {
               goodsEvaluate.setState(1);
               goodsEvaluate.setRemarks("商品标题发生变化下架:" + goodsDetailVO.getTitle() +" / 新:" + goodsNew.getTitle());
            }
         if (goodsDetailVO != null && goodsDetailVO.getGoodsId() != null && goodsDetailVO.getGoodsId().equalsIgnoreCase(goodsId)
               && goodsDetailVO.getGoodsType() == goodsType) {
            goodsEvaluate.setGoods(goodsNew);
         }
         // 更新商品信息
         List<ImgInfo> imgList = goodsEvaluate.getImgList();
         if (imgList == null || imgList.size() == 0) {
@@ -2305,38 +2611,139 @@
         for (ImgInfo imgInfo : imgList) {
            SimpleGoods simpleGoods = imgInfo.getGoods();
            if (simpleGoods == null || simpleGoods.getGoodsId() != goodsId
            if (simpleGoods == null || !simpleGoods.getGoodsId().equalsIgnoreCase(goodsId)
                  || goodsType != simpleGoods.getGoodsType()) {
               continue;
            }
            GoodsDetailVO goodsVO = imgInfo.getGoodsVO();
            if (goodsVO != null) {
               if (goodsVO.getTitle().equalsIgnoreCase(goodsNew.getTitle())) {
                  simpleGoods.setState(0);
               } else {
                  simpleGoods.setState(1);
                  simpleGoods.setRemarks("商品标题发生变化下架:" + goodsVO.getTitle() +" / 新:" + goodsNew.getTitle());
               }
            }
            simpleGoods.setPrice(goodsDetailVO.getCouponPrice());
            CouponInfoVO couponInfo = goodsDetailVO.getCouponInfo();
            simpleGoods.setState(0);
            simpleGoods.setPrice(goodsNew.getCouponPrice());
            CouponInfoVO couponInfo = goodsNew.getCouponInfo();
            if (couponInfo == null) {
               simpleGoods.setPrice(goodsDetailVO.getZkPrice());
               simpleGoods.setPrice(goodsNew.getZkPrice());
            } else {
               simpleGoods.setPrice(goodsDetailVO.getCouponPrice());
               simpleGoods.setPrice(goodsNew.getCouponPrice());
               simpleGoods.setAmount(couponInfo.getAmount());
            }
            imgInfo.setGoods(simpleGoods);
            imgInfo.setGoodsVO(goodsDetailVO);
            imgInfo.setGoodsVO(goodsNew);
         }
         goodsEvaluate.setImgList(imgList);
         goodsEvaluate.setUpdateTime(new Date());
         goodsEvaluateDao.save(goodsEvaluate);
      }
   }
   @Override
   public void offlineTaoBaoGoods(String goodsId) {
      try {
         if (goodsId == null) {
            return;
         }
         List<GoodsEvaluate> list = goodsEvaluateDao.queryExist(Constant.SOURCE_TYPE_TAOBAO,goodsId);
         if (list == null || list.size() == 0) {
            return;
         }
         // 下架商品
         offlineGoods(list, Constant.SOURCE_TYPE_TAOBAO, goodsId);
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
   @CacheEvict(value = "dynamicCache", allEntries = true)
   public void offlineGoods(List<GoodsEvaluate> list, int goodsType, String goodsId) {
      for (GoodsEvaluate goodsEvaluate : list) {
         // 商品下架
         GoodsDetailVO goodsDetailVO = goodsEvaluate.getGoods();
         goodsDetailVO.setState(1);
         List<ImgInfo> imgList = goodsEvaluate.getImgList();
         if (imgList == null || imgList.size() == 0) {
            goodsEvaluate.setUpdateTime(new Date());
            goodsEvaluateDao.save(goodsEvaluate);
            continue;
         }
         for (ImgInfo imgInfo : imgList) {
            SimpleGoods simpleGoods = imgInfo.getGoods();
            if (simpleGoods == null || simpleGoods.getGoodsId() != goodsId
                  || goodsType != simpleGoods.getGoodsType()) {
               continue;
            }
            simpleGoods.setState(1);
            GoodsDetailVO goodsVO = imgInfo.getGoodsVO();
            goodsVO.setState(1);
            imgInfo.setGoods(simpleGoods);
            imgInfo.setGoodsVO(goodsVO);
         }
         goodsEvaluate.setImgList(imgList);
         goodsEvaluate.setUpdateTime(new Date());
         goodsEvaluateDao.save(goodsEvaluate);
      }
   }
   /**
    * 删除已过期时间
    */
   private void removeOverdue() {
      if (1 > 0)
         return;
      List<GoodsEvaluate> list = goodsEvaluateDao.queryOverdue();
      if (list == null || list.size() == 0) {
         return;
      }
      long nm = 1000 * 60;// 一分钟的毫秒数
      long nh = 1000 * 60 * 60;// 一小时的毫秒数
      long nd = 1000 * 24 * 60 * 60;// 一天的毫秒数
      long time = java.lang.System.currentTimeMillis();
      for (GoodsEvaluate goodsEvaluate : list) {
         long diff = time - goodsEvaluate.getEndTime().getTime();
         long min = diff % nd % nh / nm;
         // 过期超过10分钟就删除
         if (min > 10) {
            goodsEvaluateDao.remove(goodsEvaluate);
         }
      }
   }
   /**
    * 删除商品已下架-单品
    */
   private void removeDownGoods() {
      if (1 > 0)
         return;
      try {
         List<GoodsEvaluate> list = goodsEvaluateDao.removeDownGoods();
         if (list == null || list.size() == 0) {
            return;
         }
         for (GoodsEvaluate goodsEvaluate : list) {
            goodsEvaluateDao.remove(goodsEvaluate);
         }
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
   @Override
   public GoodsEvaluate queryExistSingle(String goodsId, int goodsType) {
      List<GoodsEvaluate> list = goodsEvaluateDao.queryExistSingle(goodsType, goodsId);
      if (list != null && list.size() > 0)
         return list.get(0);
      return null;
   }
   
   
}