admin
2025-02-25 30d8e227e8d823b6c38c3b9c90ac2df03b63befe
fanli/src/main/java/com/yeshi/fanli/service/impl/user/cloud/UserCloudServiceImpl.java
@@ -1,1115 +1,1372 @@
package com.yeshi.fanli.service.impl.user.cloud;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.yeshi.utils.BigDecimalUtil;
import com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.Producer;
import com.yeshi.fanli.dao.mybatis.user.cloud.UserCloudMapper;
import com.yeshi.fanli.dto.aitaoker.RobotInfoDTO;
import com.yeshi.fanli.dto.aitaoker.WeiXinGroupDTO;
import com.yeshi.fanli.dto.jd.JDCouponInfo;
import com.yeshi.fanli.dto.jd.JDPingouInfo;
import com.yeshi.fanli.dto.mq.user.UserTopicTagEnum;
import com.yeshi.fanli.dto.mq.user.body.UserCloudMQMsg;
import com.yeshi.fanli.dto.pdd.PDDGoodsDetail;
import com.yeshi.fanli.dto.suning.SuningGoodsImg;
import com.yeshi.fanli.dto.suning.SuningGoodsInfo;
import com.yeshi.fanli.dto.vip.VIPConvertResultDTO;
import com.yeshi.fanli.dto.vip.goods.VIPGoodsInfo;
import com.yeshi.fanli.entity.bus.user.UserExtraTaoBaoInfo;
import com.yeshi.fanli.entity.bus.user.UserInfo;
import com.yeshi.fanli.entity.bus.user.cloud.CloudOrderMenuEnum;
import com.yeshi.fanli.entity.bus.user.cloud.UserCloud;
import com.yeshi.fanli.entity.bus.user.cloud.UserCloudGoods;
import com.yeshi.fanli.entity.bus.user.cloud.UserCloudGroup;
import com.yeshi.fanli.entity.bus.user.cloud.UserCloudManage;
import com.yeshi.fanli.entity.bus.user.cloud.UserCloudSendContent;
import com.yeshi.fanli.entity.bus.user.cloud.UserCloudSendRecord;
import com.yeshi.fanli.entity.dynamic.CommentInfo;
import com.yeshi.fanli.entity.dynamic.GoodsEvaluate;
import com.yeshi.fanli.entity.dynamic.GoodsEvaluate.EvaluateEnum;
import com.yeshi.fanli.entity.dynamic.ImgInfo;
import com.yeshi.fanli.entity.dynamic.ImgInfo.ImgEnum;
import com.yeshi.fanli.entity.goods.CommonGoods;
import com.yeshi.fanli.entity.jd.JDGoods;
import com.yeshi.fanli.entity.system.ConfigKeyEnum;
import com.yeshi.fanli.entity.taobao.TaoBaoGoodsBrief;
import com.yeshi.fanli.entity.taobao.TaoBaoLink;
import com.yeshi.fanli.exception.goods.ConvertLinkExceptionException;
import com.yeshi.fanli.exception.share.ShareGoodsException;
import com.yeshi.fanli.exception.user.cloud.UserCloudException;
import com.yeshi.fanli.exception.user.cloud.UserCloudGoodsException;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.config.ConfigService;
import com.yeshi.fanli.service.inter.dynamic.GoodsEvaluateService;
import com.yeshi.fanli.service.inter.goods.CommonGoodsService;
import com.yeshi.fanli.service.inter.goods.ShareGoodsService;
import com.yeshi.fanli.service.inter.goods.ShareGoodsTextTemplateService;
import com.yeshi.fanli.service.inter.order.OrderHongBaoMoneyComputeService;
import com.yeshi.fanli.service.inter.order.config.HongBaoManageService;
import com.yeshi.fanli.service.inter.user.QrCodeService;
import com.yeshi.fanli.service.inter.user.UserInfoExtraService;
import com.yeshi.fanli.service.inter.user.UserInfoService;
import com.yeshi.fanli.service.inter.user.cloud.UserCloudGoodsService;
import com.yeshi.fanli.service.inter.user.cloud.UserCloudGroupService;
import com.yeshi.fanli.service.inter.user.cloud.UserCloudManageService;
import com.yeshi.fanli.service.inter.user.cloud.UserCloudSendContentService;
import com.yeshi.fanli.service.inter.user.cloud.UserCloudSendRecordService;
import com.yeshi.fanli.service.inter.user.cloud.UserCloudService;
import com.yeshi.fanli.service.inter.user.tb.UserExtraTaoBaoInfoService;
import com.yeshi.fanli.service.manger.goods.ConvertLinkManager;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.ImageToBase64;
import com.yeshi.fanli.util.MoneyBigDecimalUtil;
import com.yeshi.fanli.util.RedisManager;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.aitaoker.AitaokerApiUtil;
import com.yeshi.fanli.util.cache.JDGoodsCacheUtil;
import com.yeshi.fanli.util.cache.PinDuoDuoCacheUtil;
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.rocketmq.MQMsgBodyFactory;
import com.yeshi.fanli.util.rocketmq.MQTopicName;
import com.yeshi.fanli.util.suning.SuningApiUtil;
import com.yeshi.fanli.util.suning.SuningUtil;
import com.yeshi.fanli.util.taobao.TaoBaoUtil;
import com.yeshi.fanli.util.vipshop.VipShopApiUtil;
import com.yeshi.fanli.util.vipshop.VipShopUtil;
import com.yeshi.fanli.vo.goods.GoodsDetailVO;
@Service
public class UserCloudServiceImpl implements UserCloudService {
   @Resource
   private UserCloudMapper userCloudMapper;
   @Resource
   private UserCloudGroupService userCloudGroupService;
   @Resource
   private GoodsEvaluateService goodsEvaluateService;
   @Resource
   private ConvertLinkManager convertLinkManager;
   @Resource
   private UserCloudGoodsService userCloudGoodsService;
   @Resource
   private UserInfoExtraService userInfoExtraService;
   @Resource
   private UserExtraTaoBaoInfoService userExtraTaoBaoInfoService;
   @Resource
   private UserInfoService userInfoService;
   @Resource
   private ShareGoodsService shareGoodsService;
   @Resource
   private ConfigService configService;
   @Resource
   private JDGoodsCacheUtil jdGoodsCacheUtil;
   @Resource
   private PinDuoDuoCacheUtil pinDuoDuoCacheUtil;
   @Resource
   private QrCodeService qrCodeService;
   @Resource
   private RedisManager redisManager;
   @Resource
   private OrderHongBaoMoneyComputeService orderHongBaoMoneyComputeService;
   @Resource
   private HongBaoManageService hongBaoManageService;
   @Resource
   private ShareGoodsTextTemplateService shareGoodsTextTemplateService;
   @Resource
   private CommonGoodsService commonGoodsService;
   @Resource
   private UserCloudSendRecordService userCloudSendRecordService;
   @Resource
   private UserCloudSendContentService userCloudSendContentService;
   @Resource
   private UserCloudManageService userCloudManageService;
   @Resource(name = "producer")
   private Producer producer;
   @Override
   public UserCloud getValidByUid(Long uid) {
      return userCloudMapper.getValidByUid(uid);
   }
   @Override
   public UserCloud getLastByUid(Long uid) {
      return userCloudMapper.getLastByUid(uid);
   }
   @Override
   public long countByUid(Long uid) {
      Long count = userCloudMapper.countByUid(uid);
      return count;
   }
   @Override
   public List<UserCloud> query(int page, int count,String key, Integer state) {
      return userCloudMapper.query((page-1)* count, count, key, state);
   }
   @Override
   public long count(String key, Integer state) {
      Long count = userCloudMapper.count(key, state);
      if (count == null)
         count = 0L;
      return count;
   }
   @Override
   @Transactional(rollbackFor = Exception.class)
   public void updateWXInfo(Long uid, String wxId, String wxName, String wxPortrait) throws UserCloudException {
      UserCloud userCloud = userCloudMapper.getValidByUid(uid);
      if (userCloud == null)
         throw new UserCloudException(1, "云发单已过期");
      // 更新信息
      UserCloud update = new UserCloud();
      update.setId(userCloud.getId());
      update.setWxId(wxId);
      update.setWxName(wxName);
      update.setWxPortrait(wxPortrait);
      userCloudMapper.updateByPrimaryKeySelective(update);
      // 微信号变化-清空群信息
      if (!wxId.equals(userCloud.getWxId())) {
         userCloudGroupService.deleteGroupByUid(uid);
      }
      // 加入朋友圈
      if (StringUtil.isNullOrEmpty(userCloud.getWxId())) {
         userCloudGroupService.addCircle(uid);
      }
   }
   @Override
   @Transactional(rollbackFor = Exception.class)
   public void openCloud(Long uid, Long orderId, CloudOrderMenuEnum menuEnum) throws UserCloudException {
      UserCloud existCloud = userCloudMapper.getByOrderId(orderId);
      if (existCloud != null) {
         return; // 该订单已处理完成
      }
      boolean renew = false;
      UserCloud userCloud = userCloudMapper.getLastByUid(uid);
      if (userCloud != null) {
         // 续费
         if (userCloud.getEndTime().getTime() > java.lang.System.currentTimeMillis())
            renew = true;
         // 验证套餐是否相同
         if (renew && userCloud.getRobotType() != menuEnum.getType()) {
            LogHelper.cloudInfo("方法openCloud: [uid=" + uid + "][订单ID=" + orderId + "]已有其他云发单套餐还未结束");
            throw new UserCloudException(1, "已有其他云发单套餐还未结束");
         }
      }
//      RobotInfoDTO dto = null;
//      if (renew) { // 续费
//         dto = AitaokerApiUtil.robotRenewals(userCloud.getRobotId(), menuEnum.getMonth());
//      } else { // 创建机器人
//         dto = AitaokerApiUtil.robotCreate(menuEnum.getMonth(), menuEnum.getType(), "wechatrobot", null);
//      }
//
//      if (dto == null) {
//         LogHelper.cloudInfo("方法openCloud: [uid=" + uid + "][订单ID=" + orderId + "]机器人失败: 返回空值");
//         throw new UserCloudException(1, "机器人获取失败");
//      }
//
//      String endTimeStr = dto.getEndTime();
//      if (StringUtil.isNullOrEmpty(endTimeStr)) {
//         LogHelper.cloudInfo("方法openCloud: [uid=" + uid + "][订单ID=" + orderId + "]机器人失败: 返回时间为空");
//         throw new UserCloudException(1, "机器人返回时间为空");
//      }
//
//      long endTime = 0;
//      try {
//         endTime = Long.parseLong(endTimeStr);
//      } catch (Exception e) {
//         LogHelper.cloudInfo("方法openCloud: [uid=" + uid + "][订单ID=" + orderId + "]机器人失败: 返回时间格式不正确");
//         throw new UserCloudException(1, "机器人返回时间格式不正确");
//      }
//
//      Integer robotId = dto.getId();
//      if (robotId == null) {
//         LogHelper.cloudInfo("方法openCloud: [uid=" + uid + "][订单ID=" + orderId + "]机器人失败: 机器人ID返回为空");
//         throw new UserCloudException(1, "机器人ID返回为空");
//      }
//
//      Integer groupNum = dto.getGroupNum();
//      if (groupNum == null) {
//         LogHelper.cloudInfo("方法openCloud: [uid=" + uid + "][订单ID=" + orderId + "]机器人失败: groupNum返回为空");
//         throw new UserCloudException(1, "groupNum返回为空");
//      }
      UserCloud newCloud = new UserCloud();
      newCloud.setUid(uid);
      newCloud.setOrderId(orderId);
//      newCloud.setGroupNum(groupNum);
//      newCloud.setRobotId(robotId);
      newCloud.setRobotType(menuEnum.getType());
//      if (renew) {
//         newCloud.setStartTime(userCloud.getStartTime());
//      } else {
//         newCloud.setStartTime(new Date());
//      }
//      newCloud.setEndTime(new Date(endTime * 1000)); // Unix 转换 普通时间
      newCloud.setCreateTime(new Date());
      userCloudMapper.insertSelective(newCloud);
      // 开启发圈功能
      userCloudManageService.save(uid, null, null);
   }
   @Override
   public void searchGroup(Long uid) throws UserCloudException {
      UserCloud userCloud = userCloudMapper.getValidByUid(uid);
      if (userCloud == null)
         throw new UserCloudException(1, "云发单已过期");
      Integer robotId = userCloud.getRobotId();
      if (robotId == null)
         throw new UserCloudException(1, "云发单机器人不存在");
      List<WeiXinGroupDTO> list = AitaokerApiUtil.getContract(robotId);
      if (list == null || list.size() == 0)
         throw new UserCloudException(1, "未检索到对应群");
      for (WeiXinGroupDTO dto : list) {
         userCloudGroupService.addGroup(uid, dto.getGroupId(), dto.getGroupName(), userCloud.getGroupNum());
      }
   }
   @Override
   public void sendByDynamic(Long uid, String id) throws UserCloudException{
      sendCircleByDynamic(uid, id, UserCloudSendRecord.SEND_WAY_MANUAL);
   }
   @Override
   @Transactional(rollbackFor = Exception.class)
   public void autoSendByDynamic(Long uid, String id) {
      boolean official = false;
      UserCloudManage cloudManage = userCloudManageService.selectByPrimaryKey(uid);
      if (cloudManage != null) {
         if (cloudManage.getOfficial() != null)
            official = cloudManage.getOfficial();
      }
      if (!official)
         return;
      try {
         sendCircleByDynamic(uid, id, UserCloudSendRecord.SEND_WAY_AUTO);
      } catch (UserCloudException e) {
         LogHelper.cloudInfo("autoSendByDynamic - [uid:" +uid + " 动态id:"+  id +  "]原因:"+ e.getMsg());
      }
   }
   private void sendCircleByDynamic(Long uid, String id, int way) throws UserCloudException {
      UserInfo user = userInfoService.getUserByIdWithMybatis(uid);
      if (user == null)
         throw new UserCloudException(1, "用户信息不存在");
      if (user != null && user.getState() != UserInfo.STATE_NORMAL) {
         throw new UserCloudException(Constant.CODE_FORBIDDEN_USER, Constant.FORBIDDEN_USER_REASON_DESC);
      }
      String inviteCode = userInfoExtraService.getInviteCodeByUid(uid);
      if (StringUtil.isNullOrEmpty(inviteCode))
         throw new UserCloudException(3, "邀请码未激活");
      UserExtraTaoBaoInfo taoBaoInfo = userExtraTaoBaoInfoService.getByUid(uid);
      String relationId = null;
      if (taoBaoInfo != null && taoBaoInfo.getRelationId() != null && taoBaoInfo.getRelationValid() != null
            && taoBaoInfo.getRelationValid() == true)
         relationId = taoBaoInfo.getRelationId();
      if (StringUtil.isNullOrEmpty(relationId))
         throw new UserCloudException(2, "淘宝未授权,请前往\"我的\"绑定淘宝账号");
      // 验证是否开通
      UserCloud userCloud = userCloudMapper.getValidByUid(uid);
      if (userCloud == null)
         throw new UserCloudException(1001, "云发单已过期");
      Integer robotId = userCloud.getRobotId();
      if (robotId == null)
         throw new UserCloudException(1002, "云发单机器人不存在");
      String wxId = userCloud.getWxId();
      if (StringUtil.isNullOrEmpty(wxId))
         throw new UserCloudException(1003, "微信号不存在,请先微信登录");
      // 验证开启状态
      List<UserCloudGroup> listGroup = userCloudGroupService.listByUid(uid);
      if (listGroup == null || listGroup.size() == 0)
         throw new UserCloudException(1004, "请先微信登录");
      List<UserCloudGroup> listOpen = new ArrayList<>();
      for (UserCloudGroup cloudGrou : listGroup) {
         if (cloudGrou.getState()) {
            listOpen.add(cloudGrou);
         }
      }
      if (listOpen.size() == 0)
         throw new UserCloudException(1005, "请先开启云发单群功能");
      // 验证发圈是否可行
      GoodsEvaluate evaluate = goodsEvaluateService.getById(id);
      if (evaluate == null || evaluate.getState() == 0)
         throw new UserCloudException(1, "该内容已下架");
      if (evaluate.getType() != EvaluateEnum.single && evaluate.getType() != EvaluateEnum.activity)
         throw new UserCloudException(1, "该内容不支持云发单");
      // 验证是否可转链
      List<CommentInfo> comments = evaluate.getComments();
      if (comments == null || comments.size() == 0)
         throw new UserCloudException(1, "该内容不能转链");
      // 检测微信是否登录状态
      if (!AitaokerApiUtil.onlineCheck(robotId)) {
         throw new UserCloudException(1003, "请重新登录微信");
      }
      boolean hasToken = false;
      List<String> listComment = new ArrayList<>();
      for (CommentInfo commentInfo : comments) {
         String comment = null;
         try {
            comment = convertLinkManager.convertLinkFromText(commentInfo.getContent(), uid, true);
            hasToken = true;
         } catch (ConvertLinkExceptionException e) {
            if (e.getCode() != ConvertLinkExceptionException.CODE_NONE) {
               throw new UserCloudException(1, e.getMsg());
            }
         } catch (Exception e) {
            LogHelper.errorDetailInfo(e);
            throw new UserCloudException(1, "该内容包含可转链口令或链接");
         }
         if (StringUtil.isNullOrEmpty(comment))
            comment = commentInfo.getContent();
         // 替换价格
         if (evaluate.getType() == EvaluateEnum.single) {
            GoodsDetailVO goods = evaluate.getGoods();
            comment = comment.replace("[原价]", MoneyBigDecimalUtil.getWithNoZera(goods.getZkPrice()) + "");
            if (!goods.isHasCoupon()) {
               comment = comment.replace("领券抢购", "抢购");
               comment = comment.replace("【券后价】[券后价]元", "");
            } else {
               comment = comment.replace("[券后价]", MoneyBigDecimalUtil.getWithNoZera(goods.getCouponPrice()) + "");
            }
            comment = comment.replace("\r\n\r\n", "\r\n").replace("\r\n\r\n", "\r\n").replace("\r\n\r\n", "\r\n");
         }
         listComment.add(comment);
      }
      if (!hasToken)
         throw new UserCloudException(1, "该内容包含可转链口令或链接");
      String qrCode = null;
      String cloudPic = null;
      ImgInfo imgVideo = null;
      List<String> listImg = new ArrayList<>();
      List<ImgInfo> imgs = evaluate.getImgList();
      if (imgs != null && imgs.size() > 0) {
         for (ImgInfo imgInfo : imgs) {
            if (imgInfo.getType() == ImgEnum.video) {
               imgVideo = imgInfo;
               continue;
            }
            if (imgInfo.getType() == ImgEnum.goods) {
               cloudPic = imgInfo.getUrl();
            }
            listImg.add(imgInfo.getUrl());
            // 取消二维码图
//            GoodsDetailVO goodsVO = imgInfo.getGoodsVO();
//            if (goodsVO == null) {
//               listImg.add(imgInfo.getUrl());
//            } else {
//               String jumpLink = getJumpLink(goodsVO, user, relationId, inviteCode, imgInfo.getUrl());
//               if (!StringUtil.isNullOrEmpty(jumpLink)) {
//                  qrCode = jumpLink;
//               }
//            }
         }
         if (cloudPic == null) {
            cloudPic = imgs.get(0).getUrl();
         }
      }
      // 保存发送记录
      UserCloudSendRecord sendRecord = new UserCloudSendRecord();
      sendRecord.setUid(uid);
      sendRecord.setSendId(id);
      sendRecord.setSendWay(way);
      sendRecord.setWxId(wxId);
      sendRecord.setRobotId(robotId);
      sendRecord.setSendTime(new Date());
      sendRecord.setSendOrigin(UserCloudSendRecord.ORIGIN_STORE);
      UserCloudSendRecord result = userCloudSendRecordService.save(sendRecord);
      String pid = result.getId();
      for (UserCloudGroup cloudGroup: listOpen) {
         String title = evaluate.getTitle();
         UserCloudSendContent sendContent = new UserCloudSendContent();
         sendContent.setPid(pid);
         sendContent.setUid(uid);
         sendContent.setGroupId(cloudGroup.getGroupId());
         sendContent.setCreateTime(new Date());
         if(cloudGroup.getType() == UserCloudGroup.TYPE_CIRCLE) { // 朋友圈
            String circleId = null;
            sendContent.setType(UserCloudSendContent.TYPE_CIRCLE);
            if (imgVideo == null) {
               String picUrl = "";
               if (!StringUtil.isNullOrEmpty(qrCode))
                  picUrl += qrCode;
               if (listImg.size() > 0) {
                  for (String img: listImg) {
                     picUrl +=  img + ";" ;
                  }
               }
               if (picUrl.endsWith(";"))
                  picUrl = picUrl.substring(0, picUrl.length()-1);
               sendContent.setTitle(title);
               sendContent.setPicUrl(picUrl);
               // 发送图文
               circleId = AitaokerApiUtil.macsendCircle(robotId, title, picUrl);
            } else {
               sendContent.setPicUrl(imgVideo.getUrl());
               sendContent.setVideoUrl(imgVideo.getVideoUrl());
               // 发送视频
               circleId = AitaokerApiUtil.macsendCircleVideo(robotId, imgVideo.getVideoUrl(), imgVideo.getUrl());
            }
            // 评论文本
            if (!StringUtil.isNullOrEmpty(circleId)) {
               sendContent.setState(true);
               List<String> list = new ArrayList<>();
               for (String comment: listComment) {
                  boolean macsend = AitaokerApiUtil.macsendCircleComment(robotId, wxId, circleId, comment);
                  if (macsend) {
                     list.add(comment);
                  }
               }
               sendContent.setComments(list);
            }
         } else { // 群
            sendContent.setType(UserCloudSendContent.TYPE_GROUP);
            // 发送文本
            if (!StringUtil.isNullOrEmpty(title)) {
               boolean macsend = AitaokerApiUtil.macsendText(robotId, cloudGroup.getGroupId(), title);
               if (macsend)
                  sendContent.setTitle(title);
            }
            // 发送图片
            if (!StringUtil.isNullOrEmpty(cloudPic)) {
               try {
                  String imgBase64 = ImageToBase64.NetImageToBase64(cloudPic);
                  boolean macsend = AitaokerApiUtil.macsendImgBase64(robotId, cloudGroup.getGroupId(), imgBase64);
                  if (macsend)
                     sendContent.setPicUrl(cloudPic);
               } catch (Exception e) {
                  LogHelper.errorDetailInfo(e);
               }
            }
            // 评论文本
            List<String> list = new ArrayList<>();
            for (String comment: listComment) {
               boolean macsend = AitaokerApiUtil.macsendText(robotId, cloudGroup.getGroupId(), comment);
               if (macsend) {
                  list.add(comment);
               }
            }
            sendContent.setState(true);
            sendContent.setComments(list);
         }
         userCloudSendContentService.save(sendContent);
      }
   }
   @Override
   @Transactional(rollbackFor = Exception.class)
   public void sendCustomGoods(Long uid, Long goodsId, Integer goodsType, Long sellerId) throws UserCloudException{
      sendCircleByGoods(uid, goodsId, goodsType, null, sellerId);
   }
   @Override
   @Transactional(rollbackFor = Exception.class)
   public void autoSendCustomGoods(Long uid, Long id) {
      boolean custom = false;
      UserCloudManage cloudManage = userCloudManageService.selectByPrimaryKey(uid);
      if (cloudManage != null) {
         if (cloudManage.getCustom() != null)
            custom = cloudManage.getCustom();
      }
      if (!custom) {
         return;
      }
      UserCloudGoods cloudGoods = userCloudGoodsService.selectByPrimaryKey(id);
      if (cloudGoods == null) {
         return;
      }
      CommonGoods cgoods = cloudGoods.getCommonGoods();
      if (cgoods == null)
         return;
      try {
         // 发送商品
         sendCircleByGoods(uid, cgoods.getGoodsId(), cgoods.getGoodsType(), id, cgoods.getSellerId());
      } catch (UserCloudException e) {
         LogHelper.cloudInfo("autoSendCustomGoods - [uid:" +uid + " 库id:"+  id +  "]原因:"+ e.getMsg());
      }
   }
   private void sendCircleByGoods(Long uid, Long goodsId, Integer goodsType, Long storeId, Long sellerId) throws UserCloudException {
      // 验证是否授权
      UserInfo user = userInfoService.getUserByIdWithMybatis(uid);
      if (user == null)
         throw new UserCloudException(1, "用户信息不存在");
      if (user != null && user.getState() != UserInfo.STATE_NORMAL) {
         throw new UserCloudException(Constant.CODE_FORBIDDEN_USER, Constant.FORBIDDEN_USER_REASON_DESC);
      }
      String inviteCode = userInfoExtraService.getInviteCodeByUid(uid);
      if (StringUtil.isNullOrEmpty(inviteCode))
         throw new UserCloudException(3, "邀请码未激活");
      UserExtraTaoBaoInfo taoBaoInfo = userExtraTaoBaoInfoService.getByUid(uid);
      String relationId = null;
      if (taoBaoInfo != null && taoBaoInfo.getRelationId() != null && taoBaoInfo.getRelationValid() != null
            && taoBaoInfo.getRelationValid() == true)
         relationId = taoBaoInfo.getRelationId();
      if (StringUtil.isNullOrEmpty(relationId))
         throw new UserCloudException(2, "淘宝未授权,请前往\"我的\"绑定淘宝账号");
      // 验证是否开通
      UserCloud userCloud = userCloudMapper.getValidByUid(uid);
      if (userCloud == null)
         throw new UserCloudException(1001, "云发单已过期");
      // 加入我的备选库
      if (storeId == null) {
         try {
            UserCloudGoods cloudGoods = userCloudGoodsService.addGoods(uid, goodsId, goodsType, sellerId);
            if (cloudGoods != null)
               storeId =cloudGoods.getId();
         } catch (UserCloudGoodsException e) {
            LogHelper.cloudInfo("sendCustomGoods - [uid:" +uid + "goodsId:"+  goodsId +  "goodsType" + goodsType +"]原因:"+ e.getMsg());
            throw new UserCloudException(1, "加入云发单备选库失败");
         }
      }
      // 自选库商品是否打开
      boolean custom = false;
      UserCloudManage cloudManage = userCloudManageService.selectByPrimaryKey(uid);
      if (cloudManage != null) {
         if (cloudManage.getCustom() != null)
            custom = cloudManage.getCustom();
      }
      if (!custom) {
         throw new UserCloudException(0, "成功加入云发单库");
      }
      Integer robotId = userCloud.getRobotId();
      if (robotId == null)
         throw new UserCloudException(1, "云发单机器人不存在");
      String wxId = userCloud.getWxId();
      if (StringUtil.isNullOrEmpty(wxId))
         throw new UserCloudException(1002, "请先登录微信");
      // 验证开启状态
      List<UserCloudGroup> listGroup = userCloudGroupService.listByUid(uid);
      if (listGroup == null || listGroup.size() == 0)
         throw new UserCloudException(1003, "请先登录微信");
      List<UserCloudGroup> listOpen = new ArrayList<>();
      for (UserCloudGroup cloudGrou : listGroup) {
         if (cloudGrou.getState()) {
            listOpen.add(cloudGrou);
         }
      }
      if (listOpen.size() == 0)
         throw new UserCloudException(1004, "请先开启云发单群功能");
      // 检测微信是否登录状态
      if (!AitaokerApiUtil.onlineCheck(robotId)) {
         throw new UserCloudException(1003, "请重新登录微信");
      }
      // 保存发送记录
      UserCloudSendRecord sendRecord = new UserCloudSendRecord();
      sendRecord.setUid(uid);
      sendRecord.setGoodsId(goodsId + "");
      sendRecord.setGoodsType(goodsType + "");
      sendRecord.setWxId(wxId);
      sendRecord.setRobotId(robotId);
      sendRecord.setSendTime(new Date());
      if (storeId != null) {
         sendRecord.setSendId(storeId + "");
         sendRecord.setSendOrigin(UserCloudSendRecord.ORIGIN_STORE);
         sendRecord.setSendWay(UserCloudSendRecord.SEND_WAY_AUTO);
      } else {
         sendRecord.setSendWay(UserCloudSendRecord.SEND_WAY_MANUAL);
      }
      UserCloudSendRecord result = userCloudSendRecordService.save(sendRecord);
      if (goodsType == Constant.SOURCE_TYPE_TAOBAO) {
         sendTaoBaoGoods(user, robotId, wxId, goodsId, relationId, listOpen, result.getId());
      } else if (goodsType == Constant.SOURCE_TYPE_JD) {
         sendJDGoods(user, robotId, wxId, goodsId, relationId, listOpen, result.getId());
      } else if (goodsType == Constant.SOURCE_TYPE_PDD) {
         sendPDDGoods(user, robotId, wxId, goodsId, relationId, listOpen, result.getId());
      } else if (goodsType == Constant.SOURCE_TYPE_VIP) {
         sendVIPGoods(user, robotId, wxId, goodsId, relationId, listOpen, result.getId());
      } else if (goodsType == Constant.SOURCE_TYPE_SUNING) {
         sendSuNingGoods(user, robotId, wxId, goodsId, sellerId, relationId, listOpen, result.getId());
      }
      // 更新发单记录
      if (storeId != null) {
         UserCloudGoods record = new UserCloudGoods();
         record.setId(storeId);
         record.setState(UserCloudGoods.STATE_SHARED);
         record.setSendTime(new Date());
         record.setUpdateTime(new Date());
         userCloudGoodsService.updateByPrimaryKeySelective(record);
      }
   }
   /**
    * 淘宝商品信息处理
    * @param user
    * @param inviteCode
    * @param robotId
    * @param wxId
    * @param goodsId
    * @param relationId
    * @param listOpen
    * @throws UserCloudException
    */
   private void sendTaoBaoGoods(UserInfo user, int robotId, String wxId, Long goodsId, String relationId,
         List<UserCloudGroup> listOpen, String pid) throws UserCloudException {
      TaoBaoLink taoBaoLink = null;
      try {
         taoBaoLink = shareGoodsService.getTaoBaoLinkForShare(user.getId(), goodsId, relationId);
      } catch (ShareGoodsException e) {
         LogHelper.errorDetailInfo(e);
         throw new UserCloudException(1, "该商品已下架");
      }
      if (taoBaoLink == null)
         throw new UserCloudException(1, "该商品已下架");
      TaoBaoGoodsBrief goods = taoBaoLink.getGoods();
      boolean coupon = false;
      if (!StringUtil.isNullOrEmpty(goods.getCouponInfo())) {
         coupon = true;
      }
      String quanPrice = "";
      String description = "";
      String couponAmount = "";
      if (coupon) {
         description = goods.getDescription();
         quanPrice = TaoBaoUtil.getAfterUseCouplePrice(goods) + "";
         couponAmount = MoneyBigDecimalUtil.getWithNoZera(goods.getCouponAmount()).toString();
      }
      String sales = TaoBaoUtil.getSaleCount(goods.getBiz30day());
      // 获取推荐语
      String recommendText = shareGoodsTextTemplateService.getRecommendText(coupon, goods.getTitle(), sales,
            couponAmount, description);
      // 获取评论语
      String commentText = shareGoodsTextTemplateService.getCommentTextByTaoToken(coupon, taoBaoLink.getTaoToken(),
            goods.getZkPrice().toString(), quanPrice);
      // 云发单
      sendGoods(robotId, wxId, listOpen, recommendText, commentText,  goods.getImgList(), user.getId(), pid);
   }
   /**
    * 京东商品云发单
    * @param user
    * @param robotId
    * @param wxId
    * @param goodsId
    * @param relationId
    * @param listOpen
    * @throws UserCloudException
    */
   private void sendJDGoods(UserInfo user, int robotId, String wxId, Long goodsId, String relationId,
         List<UserCloudGroup> listOpen, String pid) throws UserCloudException {
      JDGoods jdGoods = jdGoodsCacheUtil.getGoodsInfo(goodsId);
      if (jdGoods == null)
         throw new UserCloudException(1, "该商品已下架");
      String couponUrl = null;
      JDCouponInfo couponInfo = JDUtil.getShowCouponInfo(jdGoods);
      if (couponInfo != null) {
         couponUrl = couponInfo.getLink();
      }
      String materialId = "https://item.jd.com/" + goodsId + ".html";
      String jumpLink = JDApiUtil.convertLinkWithSubUnionId(materialId, couponUrl, JDApiUtil.POSITION_SHARE + "",user.getId() + "");
      boolean coupon = false;
      if (couponInfo != null) {
         coupon = true;
      }
      String quanPrice = "";
      String couponAmount = "";
      if (coupon) {
         quanPrice = BigDecimalUtil.getWithNoZera(JDUtil.getQuanPrice(jdGoods)).toString() + "";
         couponAmount = BigDecimalUtil.getWithNoZera(couponInfo.getDiscount()).toString();
      }
      String sales = JDUtil.getSaleCount(jdGoods.getInOrderCount30Days());
      // 获取推荐语
      String recommendText = shareGoodsTextTemplateService.getRecommendText(coupon, jdGoods.getSkuName(), sales,
            couponAmount, null);
      // 获取评论语
      BigDecimal price = jdGoods.getPrice();
      JDPingouInfo pinGouInfo = jdGoods.getPinGouInfo();
      if (pinGouInfo != null) {
         price = pinGouInfo.getPingouPrice();
      }
      String zkPrice = BigDecimalUtil.getWithNoZera(price).toString();
      String commentText = shareGoodsTextTemplateService.getCommentTextByLink(coupon, jumpLink, zkPrice, quanPrice,
            ConfigKeyEnum.quickShareJDCommentText);
      // 云发单
      sendGoods(robotId, wxId, listOpen, recommendText, commentText,  jdGoods.getImageList(), user.getId(), pid);
   }
   /**
    * 京东商品云发单
    * @param user
    * @param robotId
    * @param wxId
    * @param goodsId
    * @param relationId
    * @param listOpen
    * @throws UserCloudException
    */
   private void sendPDDGoods(UserInfo user, int robotId, String wxId, Long goodsId, String relationId,
         List<UserCloudGroup> listOpen, String pid) throws UserCloudException {
      PDDGoodsDetail goods = pinDuoDuoCacheUtil.getGoodsInfo(goodsId);
      if (goods == null)
         throw new UserCloudException(1, "该商品已下架");
      String jumpLink = PinDuoDuoApiUtil.getPromotionUrl(goodsId, PinDuoDuoApiUtil.PID_SHARE + "", user.getId() + "");
      boolean coupon = true;
      if (goods.getHasCoupon() == null || !goods.getHasCoupon()) {
         coupon = false;
      }
      String quanPrice = "";
      String couponAmount = "";
      if (coupon) {
         BigDecimal hundred = new BigDecimal(100);
         BigDecimal amount = MoneyBigDecimalUtil.div(new BigDecimal(goods.getCouponDiscount()), hundred);
         quanPrice = BigDecimalUtil.getWithNoZera(amount).toString();
         couponAmount = BigDecimalUtil.getWithNoZera(PinDuoDuoUtil.getQuanPrice(goods)).toString();
      }
      String sales = goods.getSalesTip();
      if (StringUtil.isNullOrEmpty(sales)) {
         sales = "0";
      }
      // 获取推荐语
      String recommendText = shareGoodsTextTemplateService.getRecommendText(coupon, goods.getGoodsName(), sales,
            couponAmount, null);
      // 获取评论语
      String zkPrice =  MoneyBigDecimalUtil.div(new BigDecimal(goods.getMinGroupPrice()), new BigDecimal(100)).setScale(2).toString();
      String commentText = shareGoodsTextTemplateService.getCommentTextByLink(coupon, jumpLink, zkPrice, quanPrice,
            ConfigKeyEnum.quickSharePDDCommentText);
      List<String> list = null;
      String[] goodsGalleryUrls = goods.getGoodsGalleryUrls();
      if (goodsGalleryUrls != null && goodsGalleryUrls.length > 0) {
         list = Arrays.asList(goodsGalleryUrls);
      }
      // 云发单
      sendGoods(robotId, wxId, listOpen, recommendText, commentText, list, user.getId(), pid );
   }
   /**
    * 唯品会商品
    * @param user
    * @param robotId
    * @param wxId
    * @param goodsId
    * @param relationId
    * @param listOpen
    * @param pid
    * @throws UserCloudException
    */
   private void sendVIPGoods(UserInfo user, int robotId, String wxId, Long goodsId, String relationId,
         List<UserCloudGroup> listOpen, String pid) throws UserCloudException {
      VIPGoodsInfo goods = VipShopApiUtil.getGoodsDetail(goodsId + "");
      if (goods == null)
         throw new UserCloudException(1, "该商品已下架");
      VIPConvertResultDTO resultDTO = VipShopApiUtil.convertLink(goodsId + "", VipShopUtil.getShareChanTag(user.getId()));
      String jumpLink = resultDTO.getUrl();
      boolean coupon = false;
      String quanPrice = "";
      String couponAmount = "";
      // 获取推荐语
      String recommendText = shareGoodsTextTemplateService.getRecommendText(coupon, goods.getGoodsName(), null,
            couponAmount, null);
      // 获取评论语
      String commentText = shareGoodsTextTemplateService.getCommentTextByLink(coupon, jumpLink, goods.getMarketPrice(),
            quanPrice, ConfigKeyEnum.quickShareVIPCommentText);
      // 云发单
      sendGoods(robotId, wxId, listOpen, recommendText, commentText, goods.getGoodsDetailPictures(), user.getId(), pid);
   }
   /**
    * 京东商品云发单
    * @param user
    * @param robotId
    * @param wxId
    * @param goodsId
    * @param relationId
    * @param listOpen
    * @throws UserCloudException
    */
   private void sendSuNingGoods(UserInfo user, int robotId, String wxId, Long goodsId, Long sellerId, String relationId,
         List<UserCloudGroup> listOpen, String pid) throws UserCloudException {
      SuningGoodsInfo goods = SuningApiUtil.getGoodsDetail(goodsId +"", sellerId +"");
      if (goods == null)
         throw new UserCloudException(1, "该商品已下架");
      String couponLink = goods.getCouponInfo().getCouponUrl();
      String jumpLink = SuningApiUtil.convertLink(SuningUtil.getProductUrl(sellerId +"", goodsId +""),
            StringUtil.isNullOrEmpty(couponLink) ? null : couponLink, SuningApiUtil.PID_SHARE, user.getId() + "");
      boolean coupon = false;
      String couponAmount = "";
      String sales = null;
      if (goods.getCouponInfo() != null && !StringUtil.isNullOrEmpty(goods.getCouponInfo().getCouponUrl())) {// 有券
         couponAmount = new BigDecimal(goods.getCouponInfo().getCouponValue()).toString();
         coupon = true;
      }
      // 获取推荐语
      String recommendText = shareGoodsTextTemplateService.getRecommendText(coupon, goods.getCommodityInfo().getCommodityName(), sales,
            couponAmount, null);
      // 生成快捷分享内容
      String template = configService.get(ConfigKeyEnum.quickShareSuNingCommentText.getKey());
      String commentText = shareGoodsTextTemplateService.createQuickShareTextSuNing(template, goods, jumpLink);
      List<String> imgList = new ArrayList<>();
      for (SuningGoodsImg img : goods.getCommodityInfo().getPictureUrl()) {
         imgList.add(img.getPicUrl());
      }
      // 云发单
      sendGoods(robotId, wxId, listOpen, recommendText, commentText, imgList, user.getId(), pid);
   }
   /**
    * 发送商品
    * @param robotId
    * @param title
    * @param comment
    * @param listImg
    * @param wxId
    * @param listOpen
    */
   private void sendGoods(int robotId,String wxId, List<UserCloudGroup> listOpen, String title,
         String comment, List<String> listImg, Long uid, String pid) {
      // 遍历群-朋友圈
      for (UserCloudGroup cloudGroup: listOpen) {
         UserCloudSendContent sendContent = new UserCloudSendContent();
         sendContent.setPid(pid);
         sendContent.setUid(uid);
         sendContent.setGroupId(cloudGroup.getGroupId());
         sendContent.setCreateTime(new Date());
         if(cloudGroup.getType() == UserCloudGroup.TYPE_CIRCLE) { // 朋友圈
            sendContent.setType(UserCloudSendContent.TYPE_CIRCLE);
            String picUrl = "";
            if (listImg.size() > 0) {
               for (String img: listImg) {
                  picUrl +=  img + ";" ;
               }
            }
            if (picUrl.endsWith(";"))
               picUrl = picUrl.substring(0, picUrl.length()-1);
            sendContent.setTitle(title);
            sendContent.setPicUrl(picUrl);
            // 发圈内容
            String circleId = AitaokerApiUtil.macsendCircle(robotId, title, picUrl);
            // 评论文本
            if (!StringUtil.isNullOrEmpty(circleId)) {
               sendContent.setState(true);
               List<String> list = new ArrayList<>();
               boolean macsend = AitaokerApiUtil.macsendCircleComment(robotId, wxId, circleId, comment);
               if (macsend) {
                  list.add(comment);
               }
               sendContent.setComments(list);
            }
         } else {
            sendContent.setType(UserCloudSendContent.TYPE_GROUP);
            // 发送文本
            if (!StringUtil.isNullOrEmpty(title)) {
               boolean macsend = AitaokerApiUtil.macsendText(robotId, cloudGroup.getGroupId(), title);
               if (macsend)
                  sendContent.setTitle(title);
            }
            // 发送图片
            String picurl = listImg.get(0);
            if (!StringUtil.isNullOrEmpty(picurl)) {
               try {
                  String imgBase64 = ImageToBase64.NetImageToBase64(picurl);
                  boolean macsend = AitaokerApiUtil.macsendImgBase64(robotId, cloudGroup.getGroupId(), imgBase64);
                  if (macsend)
                     sendContent.setPicUrl(picurl);
               } catch (Exception e) {
                  LogHelper.errorDetailInfo(e);
               }
            }
            // 评论文本
            List<String> list = new ArrayList<>();
            boolean macsend = AitaokerApiUtil.macsendText(robotId, cloudGroup.getGroupId(), comment);
            if (macsend) {
               list.add(comment);
            }
            sendContent.setState(true);
            sendContent.setComments(list);
         }
         userCloudSendContentService.save(sendContent);
      }
   }
   @Override
   public void fixedTimeSend(String id) {
      if (StringUtil.isNullOrEmpty(id))
         return;
      // 一个小时之前
      long time = java.lang.System.currentTimeMillis() -  1000 * 60 * 60 ;
      Date lastTime =  new Date(time);
      for (int i = 0; i < 1000; i ++) {
         List<Long> list = userCloudMapper.listValidUid((i-1)*1000, 1000);
         if (list == null || list.size() == 0) {
            break;
         }
         for (Long uid: list) {
            try {
               UserCloudSendRecord record = userCloudSendRecordService.getByUidAndSendId(uid, id);
               if (record != null)
                  continue;
               UserCloudSendRecord last = userCloudSendRecordService.getLastByUid(uid, lastTime);
               if (last != null)
                  continue;
               boolean official = false;
               UserCloudManage cloudManage = userCloudManageService.selectByPrimaryKey(uid);
               if (cloudManage != null) {
                  if (cloudManage.getOfficial() != null)
                     official = cloudManage.getOfficial();
               }
               if (!Constant.IS_TEST && official) {
                  UserCloudMQMsg msg = new UserCloudMQMsg(uid, id, UserCloudMQMsg.TYPE_EVALUATE);
                  Message message = MQMsgBodyFactory.create(MQTopicName.TOPIC_USER, UserTopicTagEnum.userCloud, msg);
                  producer.send(message);
               }
            } catch (Exception e) {
               LogHelper.errorDetailInfo(e);
            }
         }
      }
   }
package com.yeshi.fanli.service.impl.user.cloud;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import com.yeshi.fanli.entity.SystemEnum;
import com.yeshi.fanli.entity.SystemPIDInfo;
import com.yeshi.fanli.exception.taobao.TaoBaoConvertLinkException;
import com.yeshi.fanli.service.manger.PIDManager;
import com.yeshi.fanli.service.manger.goods.TaoBaoLinkManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.task.TaskExecutor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.yeshi.utils.BigDecimalUtil;
import org.yeshi.utils.taobao.TbImgUtil;
import com.aliyun.openservices.ons.api.Message;
import com.yeshi.fanli.dao.mybatis.user.cloud.UserCloudMapper;
import com.yeshi.fanli.dto.aitaoker.RobotInfoDTO;
import com.yeshi.fanli.dto.aitaoker.WeiXinGroupDTO;
import com.yeshi.fanli.dto.jd.JDCouponInfo;
import com.yeshi.fanli.dto.jd.JDPingouInfo;
import com.yeshi.fanli.dto.mq.user.UserTopicTagEnum;
import com.yeshi.fanli.dto.mq.user.body.UserCloudMQMsg;
import com.yeshi.fanli.dto.pdd.PDDGoodsDetail;
import com.yeshi.fanli.dto.suning.SuningGoodsImg;
import com.yeshi.fanli.dto.suning.SuningGoodsInfo;
import com.yeshi.fanli.dto.vip.VIPConvertResultDTO;
import com.yeshi.fanli.dto.vip.goods.VIPGoodsInfo;
import com.yeshi.fanli.entity.bus.user.UserExtraTaoBaoInfo;
import com.yeshi.fanli.entity.bus.user.UserInfo;
import com.yeshi.fanli.entity.bus.user.cloud.CloudOrderMenuEnum;
import com.yeshi.fanli.entity.bus.user.cloud.UserCloud;
import com.yeshi.fanli.entity.bus.user.cloud.UserCloudGoods;
import com.yeshi.fanli.entity.bus.user.cloud.UserCloudGroup;
import com.yeshi.fanli.entity.bus.user.cloud.UserCloudManage;
import com.yeshi.fanli.entity.bus.user.cloud.UserCloudSendContent;
import com.yeshi.fanli.entity.bus.user.cloud.UserCloudSendRecord;
import com.yeshi.fanli.entity.dynamic.CommentInfo;
import com.yeshi.fanli.entity.dynamic.GoodsEvaluate;
import com.yeshi.fanli.entity.dynamic.GoodsEvaluate.EvaluateEnum;
import com.yeshi.fanli.entity.dynamic.ImgInfo;
import com.yeshi.fanli.entity.dynamic.ImgInfo.ImgEnum;
import com.yeshi.fanli.entity.goods.CommonGoods;
import com.yeshi.fanli.entity.jd.JDGoods;
import com.yeshi.fanli.entity.system.ConfigKeyEnum;
import com.yeshi.goods.facade.entity.taobao.TaoBaoGoodsBrief;
import com.yeshi.fanli.entity.taobao.TaoBaoLink;
import com.yeshi.fanli.exception.goods.ConvertLinkException;
import com.yeshi.fanli.exception.user.cloud.UserCloudException;
import com.yeshi.fanli.exception.user.cloud.UserCloudGoodsException;
import com.yeshi.fanli.log.LogHelper;
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.goods.ShareGoodsTextTemplateService;
import com.yeshi.fanli.service.inter.msg.UserOtherMsgNotificationService;
import com.yeshi.fanli.service.inter.push.PushService;
import com.yeshi.fanli.service.inter.user.UserInfoExtraService;
import com.yeshi.fanli.service.inter.user.UserInfoService;
import com.yeshi.fanli.service.inter.user.cloud.UserCloudGoodsService;
import com.yeshi.fanli.service.inter.user.cloud.UserCloudGroupService;
import com.yeshi.fanli.service.inter.user.cloud.UserCloudManageService;
import com.yeshi.fanli.service.inter.user.cloud.UserCloudSendContentService;
import com.yeshi.fanli.service.inter.user.cloud.UserCloudSendRecordService;
import com.yeshi.fanli.service.inter.user.cloud.UserCloudService;
import com.yeshi.fanli.service.inter.user.tb.UserExtraTaoBaoInfoService;
import com.yeshi.fanli.service.manger.goods.ConvertLinkManager;
import com.yeshi.fanli.service.manger.msg.RocketMQManager;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.ImageToBase64;
import org.yeshi.utils.MoneyBigDecimalUtil;
import com.yeshi.fanli.util.RedisKeyEnum;
import com.yeshi.fanli.util.RedisManager;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.aitaoker.AitaokerApiUtil;
import com.yeshi.fanli.util.cache.JDGoodsCacheUtil;
import com.yeshi.fanli.util.cache.PinDuoDuoCacheUtil;
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.rocketmq.MQMsgBodyFactory;
import com.yeshi.fanli.util.rocketmq.MQTopicName;
import com.yeshi.fanli.util.suning.SuningApiUtil;
import com.yeshi.fanli.util.suning.SuningUtil;
import com.yeshi.fanli.util.taobao.TaoBaoUtil;
import com.yeshi.fanli.util.vipshop.VipShopApiUtil;
import com.yeshi.fanli.util.vipshop.VipShopUtil;
import com.yeshi.fanli.vo.goods.GoodsDetailVO;
@Service
public class UserCloudServiceImpl implements UserCloudService {
    Logger logger = LoggerFactory.getLogger(UserCloudService.class);
    @Resource
    private UserCloudMapper userCloudMapper;
    @Resource
    private UserCloudGroupService userCloudGroupService;
    @Resource
    private GoodsEvaluateService goodsEvaluateService;
    @Resource
    private ConvertLinkManager convertLinkManager;
    @Resource
    private UserCloudGoodsService userCloudGoodsService;
    @Resource
    private UserInfoExtraService userInfoExtraService;
    @Resource
    private UserExtraTaoBaoInfoService userExtraTaoBaoInfoService;
    @Resource
    private UserInfoService userInfoService;
    @Resource
    private ShareGoodsService shareGoodsService;
    @Resource
    private ConfigService configService;
    @Resource
    private JDGoodsCacheUtil jdGoodsCacheUtil;
    @Resource
    private PinDuoDuoCacheUtil pinDuoDuoCacheUtil;
    @Resource
    private RedisManager redisManager;
    @Resource
    private ShareGoodsTextTemplateService shareGoodsTextTemplateService;
    @Resource
    private UserCloudSendRecordService userCloudSendRecordService;
    @Resource
    private UserCloudSendContentService userCloudSendContentService;
    @Resource
    private UserCloudManageService userCloudManageService;
    @Resource
    private RocketMQManager rocketMQManager;
    @Resource
    private UserOtherMsgNotificationService userOtherMsgNotificationService;
    @Resource
    private PushService pushService;
    @Resource(name = "taskExecutor")
    private TaskExecutor executor;
    @Resource
    private TaoBaoLinkManager taoBaoLinkManager;
    @Resource
    private PIDManager pidManager;
    @Override
    public UserCloud getValidByUid(Long uid) {
        return userCloudMapper.getValidByUid(uid);
    }
    @Override
    public UserCloud getLastByUid(Long uid) {
        return userCloudMapper.getLastByUid(uid);
    }
    @Override
    public long countByUid(Long uid) {
        Long count = userCloudMapper.countByUid(uid);
        return count;
    }
    @Override
    public List<UserCloud> query(int page, int count, String key, Integer state) {
        return userCloudMapper.query((page - 1) * count, count, key, state);
    }
    @Override
    public long count(String key, Integer state) {
        Long count = userCloudMapper.count(key, state);
        if (count == null)
            count = 0L;
        return count;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateWXInfo(Long uid, String wxId, String wxName, String wxPortrait) throws UserCloudException {
        UserCloud userCloud = userCloudMapper.getValidByUid(uid);
        if (userCloud == null)
            throw new UserCloudException(1, "云发单已过期");
        // 检测是否需要更新 - 1分钟间隔
        String key = "cloudLogin_" + uid;
        String result = redisManager.getCommonString(key);
        if (!StringUtil.isNullOrEmpty(result)) {
            return;
        }
        redisManager.cacheCommonString(key, "true", 60);
        // 更新信息
        UserCloud update = new UserCloud();
        update.setId(userCloud.getId());
        update.setWxId(wxId);
        update.setWxName(wxName);
        update.setWxPortrait(wxPortrait);
        userCloudMapper.updateByPrimaryKeySelective(update);
        try {
            userOtherMsgNotificationService.cloudMsg(uid, "云发单微信账号", "微信账号登录成功", "可以开启你的群发单了");
        } catch (Exception e) {
            LogHelper.errorDetailInfo(e);
        }
        // 更新提醒状态
        UserCloudManage cloudManage = userCloudManageService.selectForUpdate(uid);
        if (cloudManage == null) {
            userCloudManageService.save(uid, false, false);
        } else {
            UserCloudManage updateManage = new UserCloudManage();
            updateManage.setId(uid);
            updateManage.setOfflineNotice(false);
            userCloudManageService.updateByPrimaryKeySelective(updateManage);
        }
        // 微信号变化-清空群信息
        if (!wxId.equals(userCloud.getWxId())) {
            userCloudGroupService.deleteGroupByUid(uid);
        }
        // 加入朋友圈
        if (StringUtil.isNullOrEmpty(userCloud.getWxId())) {
            userCloudGroupService.addCircle(uid);
        }
    }
    @Override
    public void openCloud(Long uid, Long orderId, CloudOrderMenuEnum menuEnum) throws UserCloudException {
        UserCloud existCloud = userCloudMapper.getByOrderId(orderId);
        if (existCloud != null) {
            return; // 该订单已处理完成
        }
        boolean renew = false;
        UserCloud userCloud = userCloudMapper.getLastByUid(uid);
        if (userCloud != null) {
            // 续费
            if (userCloud.getEndTime().getTime() > java.lang.System.currentTimeMillis())
                renew = true;
            // 验证套餐是否相同
            if (renew && userCloud.getRobotType() != menuEnum.getRobotType()) {
                LogHelper.cloudInfo("方法openCloud: [uid=" + uid + "][订单ID=" + orderId + "]已有其他云发单套餐还未结束");
                throw new UserCloudException(1, "已有其他云发单套餐还未结束");
            }
        }
        RobotInfoDTO dto = null;
        if (renew) { // 续费
            dto = AitaokerApiUtil.robotRenewals(userCloud.getRobotId(), menuEnum.getMonth());
        } else { // 创建机器人
            dto = AitaokerApiUtil.robotCreate(menuEnum.getMonth(), menuEnum.getRobotType(), "wechatrobot", null);
        }
        if (dto == null) {
            LogHelper.cloudInfo("方法openCloud: [uid=" + uid + "][订单ID=" + orderId + "]机器人失败: 机器人创建失败");
        }
        Integer robotId = dto.getId();
        if (robotId == null) {
            LogHelper.cloudInfo("方法openCloud: [uid=" + uid + "][订单ID=" + orderId + "]机器人失败: 机器人ID返回为空");
        }
        String endTimeStr = dto.getEndTime();
        if (StringUtil.isNullOrEmpty(endTimeStr)) {
            LogHelper.cloudInfo("方法openCloud: [uid=" + uid + "][订单ID=" + orderId + "]机器人失败: 返回时间为空");
        }
        long endTime = 0;
        try {
            endTime = Long.parseLong(endTimeStr);
        } catch (Exception e) {
            LogHelper.cloudInfo("方法openCloud: [uid=" + uid + "][订单ID=" + orderId + "]机器人失败: 返回时间格式不正确");
        }
        Integer groupNum = dto.getGroupNum();
        if (groupNum == null) {
            LogHelper.cloudInfo("方法openCloud: [uid=" + uid + "][订单ID=" + orderId + "]机器人失败: groupNum返回为空");
        }
        UserCloud newCloud = new UserCloud();
        newCloud.setUid(uid);
        newCloud.setOrderId(orderId);
        newCloud.setGroupNum(groupNum);
        newCloud.setRobotId(robotId);
        newCloud.setRobotType(menuEnum.getRobotType());
        if (renew) {
            newCloud.setWxId(userCloud.getWxId());
            newCloud.setWxName(userCloud.getWxName());
            newCloud.setWxPortrait(userCloud.getPortrait());
            newCloud.setStartTime(userCloud.getStartTime());
        } else {
            newCloud.setStartTime(new Date());
        }
        newCloud.setEndTime(new Date(endTime * 1000)); // Unix 转换 普通时间
        newCloud.setCreateTime(new Date());
        userCloudMapper.insertSelective(newCloud);
        // 开启发圈功能
        userCloudManageService.save(uid, null, null);
        try {
            String item = null;
            if (renew) {
                item = "成功续费" + menuEnum.getDescShow();
            } else {
                item = "成功开通" + menuEnum.getDescShow();
            }
            String desc = "完成充值支付" + BigDecimal.valueOf(menuEnum.getMoney()).setScale(2, BigDecimal.ROUND_DOWN) + "元";
            userOtherMsgNotificationService.cloudMsg(uid, "云发单充值", item, desc);
        } catch (Exception e) {
            LogHelper.errorDetailInfo(e);
        }
    }
    @Override
    public void searchGroup(Long uid) throws UserCloudException {
        UserCloud userCloud = userCloudMapper.getValidByUid(uid);
        if (userCloud == null)
            throw new UserCloudException(1, "云发单已过期");
        Integer robotId = userCloud.getRobotId();
        if (robotId == null)
            throw new UserCloudException(1, "云发单机器人不存在");
        List<String> list = AitaokerApiUtil.getContract(robotId);
        if (list == null || list.size() == 0)
            throw new UserCloudException(1, "未检索到对应群");
        String wxId = userCloud.getWxId();
        for (String roomId : list) {
            String key = RedisKeyEnum.cloudMatchGroup.getKey() + StringUtil.Md5(wxId + "_" + roomId);
            String result = redisManager.getCommonString(key);
            if (!StringUtil.isNullOrEmpty(result)) {
                String groupName = null;
                WeiXinGroupDTO groupDetail = AitaokerApiUtil.getGroupDetail(robotId, roomId);
                if (groupDetail != null) {
                    groupName = groupDetail.getGroupName();
                }
                userCloudGroupService.addGroup(uid, roomId, groupName, userCloud.getGroupNum());
            }
        }
    }
    @Override
    public void cacheMatchGroup(String wxId, String groupId) {
        if (StringUtil.isNullOrEmpty(wxId) || StringUtil.isNullOrEmpty(groupId))
            return;
        String key = RedisKeyEnum.cloudMatchGroup.getKey() + StringUtil.Md5(wxId + "_" + groupId);
        redisManager.cacheCommonString(key, "true", 60 * 20);
    }
    @Override
    public void sendByDynamic(Long uid, String id) throws UserCloudException {
        sendCircleByDynamic(uid, id, UserCloudSendRecord.SEND_WAY_MANUAL);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void autoSendByDynamic(Long uid, String id) {
        boolean official = false;
        UserCloudManage cloudManage = userCloudManageService.selectByPrimaryKey(uid);
        if (cloudManage != null) {
            if (cloudManage.getOfficial() != null)
                official = cloudManage.getOfficial();
        }
        if (!official)
            return;
        try {
            sendCircleByDynamic(uid, id, UserCloudSendRecord.SEND_WAY_AUTO);
        } catch (UserCloudException e) {
            LogHelper.cloudInfo("autoSendByDynamic - [uid:" + uid + " 动态id:" + id + "]原因:" + e.getMsg());
        }
    }
    private void sendCircleByDynamic(Long uid, String id, int way) throws UserCloudException {
        long time1 = java.lang.System.currentTimeMillis();
        UserInfo user = userInfoService.getUserByIdWithMybatis(uid);
        if (user == null)
            throw new UserCloudException(1, "用户信息不存在");
        if (user != null && user.getState() != UserInfo.STATE_NORMAL) {
            throw new UserCloudException(Constant.CODE_FORBIDDEN_USER, Constant.FORBIDDEN_USER_REASON_DESC);
        }
        String inviteCode = userInfoExtraService.getInviteCodeByUid(uid);
        if (StringUtil.isNullOrEmpty(inviteCode))
            throw new UserCloudException(3, "邀请码未激活");
        UserExtraTaoBaoInfo taoBaoInfo = userExtraTaoBaoInfoService.getByUid(uid);
        String relationId = null;
        if (taoBaoInfo != null && taoBaoInfo.getRelationId() != null && taoBaoInfo.getRelationValid() != null
                && taoBaoInfo.getRelationValid() == true)
            relationId = taoBaoInfo.getRelationId();
        if (StringUtil.isNullOrEmpty(relationId))
            throw new UserCloudException(2, "淘宝未授权,请前往\"我的\"绑定淘宝账号");
        long time2 = java.lang.System.currentTimeMillis();
        LogHelper.test("sendCircleByDynamic保验证用户状态:" + (time2 - time1));
        // 验证是否开通
        UserCloud userCloud = userCloudMapper.getValidByUid(uid);
        if (userCloud == null)
            throw new UserCloudException(1001, "云发单已过期");
        Integer robotId = userCloud.getRobotId();
        if (robotId == null)
            throw new UserCloudException(1002, "云发单机器人不存在");
        String wxId = userCloud.getWxId();
        if (StringUtil.isNullOrEmpty(wxId))
            throw new UserCloudException(1003, "微信号不存在,请先微信登录");
        long time3 = java.lang.System.currentTimeMillis();
        LogHelper.test("sendCircleByDynamic验证是否满足开通:" + (time3 - time2));
        // 验证开启状态
        List<UserCloudGroup> listGroup = userCloudGroupService.listByUid(uid);
        if (listGroup == null || listGroup.size() == 0)
            throw new UserCloudException(1004, "请先微信登录");
        List<UserCloudGroup> listOpen = new ArrayList<>();
        for (UserCloudGroup cloudGrou : listGroup) {
            if (cloudGrou.getState()) {
                listOpen.add(cloudGrou);
            }
        }
        if (listOpen.size() == 0)
            throw new UserCloudException(1005, "请先开启云发单群功能");
        long time4 = java.lang.System.currentTimeMillis();
        LogHelper.test("sendCircleByDynamic验证是否开启:" + (time4 - time3));
        // 验证发圈是否可行
        GoodsEvaluate evaluate = goodsEvaluateService.getById(id);
        if (evaluate == null || evaluate.getState() == 0)
            throw new UserCloudException(1, "该内容已下架");
        if (evaluate.getType() != EvaluateEnum.single && evaluate.getType() != EvaluateEnum.activity)
            throw new UserCloudException(1, "该内容不支持云发单");
        // 验证是否可转链
        List<CommentInfo> comments = evaluate.getComments();
        if (comments == null || comments.size() == 0)
            throw new UserCloudException(1, "该内容不能转链");
        long time5 = java.lang.System.currentTimeMillis();
        LogHelper.test("sendCircleByDynamic验证发圈内容是否满足:" + (time5 - time4));
        // 检测微信是否登录状态
        if (!AitaokerApiUtil.onlineCheck(robotId)) {
            // 通知登录微信
            offlineNotification(uid);
            throw new UserCloudException(1003, "微信已掉线,需要重新扫描二维码登录");
        }
        long time6 = java.lang.System.currentTimeMillis();
        LogHelper.test("sendCircleByDynamic验证发是否登录:" + (time6 - time5));
        boolean hasToken = false;
        List<String> listComment = new ArrayList<>();
        for (CommentInfo commentInfo : comments) {
            String comment = null;
            try {
                comment = convertLinkManager.convertLinkFromText(user.getSystem(), commentInfo.getContent(), uid, true, false);
                hasToken = true;
            } catch (ConvertLinkException e) {
                if (e.getCode() != ConvertLinkException.CODE_NONE) {
                    throw new UserCloudException(1, e.getMsg());
                }
            } catch (Exception e) {
                LogHelper.errorDetailInfo(e);
                throw new UserCloudException(1, "该内容包含可转链口令或链接");
            }
            if (StringUtil.isNullOrEmpty(comment))
                comment = commentInfo.getContent();
            // 替换价格
            if (evaluate.getType() == EvaluateEnum.single) {
                GoodsDetailVO goods = evaluate.getGoods();
                comment = comment.replace("[原价]", MoneyBigDecimalUtil.getWithNoZera(goods.getZkPrice()) + "");
                if (!goods.isHasCoupon()) {
                    comment = comment.replace("领券抢购", "抢购");
                    comment = comment.replace("【券后价】[券后价]元", "");
                } else {
                    comment = comment.replace("[券后价]", MoneyBigDecimalUtil.getWithNoZera(goods.getCouponPrice()) + "");
                }
                comment = comment.replace("\r\n\r\n", "\r\n").replace("\r\n\r\n", "\r\n").replace("\r\n\r\n", "\r\n");
            }
            listComment.add(comment);
        }
        if (!hasToken)
            throw new UserCloudException(1, "该内容包含可转链口令或链接");
        // 异步执行发送
        executor.execute(new Runnable() {
            @Override
            public void run() {
                sendEvaluate(uid, evaluate, way, userCloud, listOpen, listComment);
            }
        });
    }
    private void sendEvaluate(Long uid, GoodsEvaluate evaluate, int way, UserCloud userCloud,
                              List<UserCloudGroup> listOpen, List<String> listComment) {
        ImgInfo imgVideo = null;
        List<String> listImg = new ArrayList<>();
        List<ImgInfo> imgs = evaluate.getImgList();
        if (imgs != null && imgs.size() > 0) {
            for (ImgInfo imgInfo : imgs) {
                if (imgInfo.getType() == ImgEnum.video) {
                    imgVideo = imgInfo;
                    continue;
                }
                listImg.add(imgInfo.getUrl());
            }
        }
        String wxId = userCloud.getWxId();
        Integer robotId = userCloud.getRobotId();
        // 保存发送记录
        UserCloudSendRecord sendRecord = new UserCloudSendRecord();
        sendRecord.setUid(uid);
        sendRecord.setSendId(evaluate.getId());
        sendRecord.setSendWay(way);
        sendRecord.setWxId(wxId);
        sendRecord.setRobotId(robotId);
        sendRecord.setSendTime(new Date());
        sendRecord.setSendOrigin(UserCloudSendRecord.ORIGIN_EVALUATE);
        UserCloudSendRecord result = userCloudSendRecordService.save(sendRecord);
        String pid = result.getId();
        for (UserCloudGroup cloudGroup : listOpen) {
            String title = evaluate.getTitle();
            UserCloudSendContent sendContent = new UserCloudSendContent();
            sendContent.setPid(pid);
            sendContent.setUid(uid);
            sendContent.setGroupId(cloudGroup.getGroupId());
            sendContent.setCreateTime(new Date());
            if (cloudGroup.getType() == UserCloudGroup.TYPE_CIRCLE) { // 朋友圈
                String circleId = null;
                sendContent.setType(UserCloudSendContent.TYPE_CIRCLE);
                if (imgVideo == null) {
                    // 发送图文
                    String picUrl = "";
                    if (listImg.size() > 0) {
                        for (String img : listImg) {
                            picUrl += img + ";";
                        }
                        if (picUrl.endsWith(";"))
                            picUrl = picUrl.substring(0, picUrl.length() - 1);
                    }
                    String picUrlUpload = AitaokerApiUtil.macsendUpload(robotId, picUrl);
                    sendContent.setPicUrlUpload(picUrlUpload);
                    sendContent.setTitle(title);
                    sendContent.setPicUrl(picUrl);
                    circleId = AitaokerApiUtil.macsendCircle(robotId, title, picUrlUpload);
                } else {
                    // 发送视频
                    sendContent.setPicUrl(imgVideo.getUrl());
                    sendContent.setVideoUrl(imgVideo.getVideoUrl());
                    circleId = AitaokerApiUtil.macsendCircleVideo(robotId, imgVideo.getVideoUrl(), imgVideo.getUrl());
                }
                // 评论文本
                if (!StringUtil.isNullOrEmpty(circleId)) {
                    sendContent.setState(true);
                    List<String> list = new ArrayList<>();
                    for (String comment : listComment) {
                        boolean macsend = AitaokerApiUtil.macsendCircleComment(robotId, wxId, circleId, comment);
                        if (macsend) {
                            list.add(comment);
                        }
                    }
                    sendContent.setComments(list);
                }
            } else { // 群
                sendContent.setType(UserCloudSendContent.TYPE_GROUP);
                // 发送文本
                if (!StringUtil.isNullOrEmpty(title)) {
                    boolean macsend = AitaokerApiUtil.macsendText(robotId, cloudGroup.getGroupId(), title);
                    if (macsend)
                        sendContent.setTitle(title);
                }
                SystemEnum system = userInfoService.getUserSystem(uid);
                // 发送图片
                int num = 1;
                String picNum = configService.getValue(ConfigKeyEnum.robotCloudGroupPictureNum.getKey(), system);
                if (!StringUtil.isNullOrEmpty(picNum)) {
                    num = Integer.parseInt(picNum);
                }
                if (listImg.size() > 0)
                    for (int i = 0; i < num && i < listImg.size(); i++) {
                        try {
                            String imgBase64 = ImageToBase64.NetImageToBase64(listImg.get(i));
                            boolean macsend = AitaokerApiUtil.macsendImgBase64(robotId, cloudGroup.getGroupId(),
                                    imgBase64);
                            if (macsend)
                                sendContent.setPicUrl(listImg.get(i));
                        } catch (Exception e) {
                            LogHelper.errorDetailInfo(e);
                        }
                    }
                // 评论文本
                List<String> list = new ArrayList<>();
                for (String comment : listComment) {
                    boolean macsend = AitaokerApiUtil.macsendText(robotId, cloudGroup.getGroupId(), comment);
                    if (macsend) {
                        list.add(comment);
                    }
                }
                sendContent.setState(true);
                sendContent.setComments(list);
            }
            userCloudSendContentService.save(sendContent);
        }
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void sendCustomGoods(Long uid, String goodsId, Integer goodsType, Long sellerId) throws UserCloudException {
        sendCircleByGoods(uid, goodsId, goodsType, null, sellerId, UserCloudSendRecord.SEND_WAY_MANUAL);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void autoSendCustomGoods(Long uid, Long id) {
        boolean custom = false;
        UserCloudManage cloudManage = userCloudManageService.selectByPrimaryKey(uid);
        if (cloudManage != null) {
            if (cloudManage.getCustom() != null)
                custom = cloudManage.getCustom();
        }
        if (!custom) {
            return;
        }
        UserCloudGoods cloudGoods = userCloudGoodsService.selectByPrimaryKey(id);
        if (cloudGoods == null) {
            return;
        }
        CommonGoods cgoods = cloudGoods.getCommonGoods();
        if (cgoods == null)
            return;
        try {
            // 发送商品
            sendCircleByGoods(uid, cgoods.getGoodsId(), cgoods.getGoodsType(), id, cgoods.getSellerId(),
                    UserCloudSendRecord.SEND_WAY_AUTO);
        } catch (UserCloudException e) {
            LogHelper.cloudInfo("autoSendCustomGoods - [uid:" + uid + " 库id:" + id + "]原因:" + e.getMsg());
        }
    }
    private void sendCircleByGoods(Long uid, String goodsId, Integer goodsType, Long storeId, Long sellerId, int way)
            throws UserCloudException {
        long begainTime = java.lang.System.currentTimeMillis();
        // 验证是否授权
        UserInfo user = userInfoService.getUserByIdWithMybatis(uid);
        if (user == null)
            throw new UserCloudException(1, "用户信息不存在");
        if (user != null && user.getState() != UserInfo.STATE_NORMAL) {
            throw new UserCloudException(Constant.CODE_FORBIDDEN_USER, Constant.FORBIDDEN_USER_REASON_DESC);
        }
        String inviteCode = userInfoExtraService.getInviteCodeByUid(uid);
        if (StringUtil.isNullOrEmpty(inviteCode))
            throw new UserCloudException(3, "邀请码未激活");
        UserExtraTaoBaoInfo taoBaoInfo = userExtraTaoBaoInfoService.getByUid(uid);
        String relationId = null;
        if (taoBaoInfo != null && taoBaoInfo.getRelationId() != null && taoBaoInfo.getRelationValid() != null
                && taoBaoInfo.getRelationValid() == true)
            relationId = taoBaoInfo.getRelationId();
        if (StringUtil.isNullOrEmpty(relationId))
            throw new UserCloudException(2, "淘宝未授权,请前往\"我的\"绑定淘宝账号");
        long time2 = java.lang.System.currentTimeMillis();
        LogHelper.test("sendCircleByGoods验证用户耗时:" + (time2 - begainTime));
        // 验证是否开通
        UserCloud userCloud = userCloudMapper.getValidByUid(uid);
        if (userCloud == null)
            throw new UserCloudException(1001, "云发单已过期");
        long time3 = java.lang.System.currentTimeMillis();
        LogHelper.test("sendCircleByGoods验证是否开通:" + (time3 - time2));
        long time4 = time3;
        // 加入我的备选库
        if (storeId == null) {
            try {
                UserCloudGoods cloudGoods = userCloudGoodsService.addGoods(uid, goodsId, goodsType, sellerId);
                if (cloudGoods != null)
                    storeId = cloudGoods.getId();
            } catch (UserCloudGoodsException e) {
                LogHelper.cloudInfo("sendCustomGoods - [uid:" + uid + "goodsId:" + goodsId + "goodsType" + goodsType
                        + "]原因:" + e.getMsg());
                throw new UserCloudException(1, "加入云发单备选库失败");
            }
            time4 = java.lang.System.currentTimeMillis();
            LogHelper.test("sendCircleByGoods加入备选库:" + (time4 - time3));
        }
        // 自选库商品是否打开
        boolean custom = false;
        UserCloudManage cloudManage = userCloudManageService.selectByPrimaryKey(uid);
        if (cloudManage != null) {
            if (cloudManage.getCustom() != null)
                custom = cloudManage.getCustom();
        }
        if (!custom) {
            return;
        }
        Integer robotId = userCloud.getRobotId();
        if (robotId == null)
            throw new UserCloudException(1, "云发单机器人不存在");
        String wxId = userCloud.getWxId();
        if (StringUtil.isNullOrEmpty(wxId))
            throw new UserCloudException(1002, "请先登录微信");
        // 验证开启状态
        List<UserCloudGroup> listGroup = userCloudGroupService.listByUid(uid);
        if (listGroup == null || listGroup.size() == 0)
            throw new UserCloudException(1003, "请先登录微信");
        long time5 = java.lang.System.currentTimeMillis();
        LogHelper.test("sendCircleByGoods验证是否绑定微信:" + (time5 - time4));
        List<UserCloudGroup> listOpen = new ArrayList<>();
        for (UserCloudGroup cloudGrou : listGroup) {
            if (cloudGrou.getState()) {
                listOpen.add(cloudGrou);
            }
        }
        if (listOpen.size() == 0)
            throw new UserCloudException(1004, "请先开启云发单群功能");
        // 检测微信是否登录状态
        if (!AitaokerApiUtil.onlineCheck(robotId)) {
            // 通知登录微信
            offlineNotification(uid);
            throw new UserCloudException(1003, "微信已掉线,需要重新扫描二维码登录");
        }
        long time6 = java.lang.System.currentTimeMillis();
        LogHelper.test("sendCircleByGoods验证是否登录微信:" + (time6 - time5));
        // 保存发送记录
        UserCloudSendRecord sendRecord = new UserCloudSendRecord();
        sendRecord.setUid(uid);
        sendRecord.setGoodsId(goodsId + "");
        sendRecord.setGoodsType(goodsType + "");
        sendRecord.setWxId(wxId);
        sendRecord.setRobotId(robotId);
        sendRecord.setSendTime(new Date());
        if (storeId != null) {
            sendRecord.setSendId(storeId + "");
            sendRecord.setSendOrigin(UserCloudSendRecord.ORIGIN_STORE);
            sendRecord.setSendWay(UserCloudSendRecord.SEND_WAY_AUTO);
        } else {
            sendRecord.setSendWay(UserCloudSendRecord.SEND_WAY_MANUAL);
        }
        UserCloudSendRecord result = userCloudSendRecordService.save(sendRecord);
        long time7 = java.lang.System.currentTimeMillis();
        LogHelper.test("sendCircleByGoods保存发送记录:" + (time7 - time6));
        try {
            if (goodsType == Constant.SOURCE_TYPE_TAOBAO) {
                sendTaoBaoGoods(user, robotId, wxId, goodsId, relationId, listOpen, result.getId());
            } else if (goodsType == Constant.SOURCE_TYPE_JD) {
                sendJDGoods(user, robotId, wxId, goodsId, relationId, listOpen, result.getId());
            } else if (goodsType == Constant.SOURCE_TYPE_PDD) {
                sendPDDGoods(user, robotId, wxId,  goodsId, relationId, listOpen, result.getId());
            } else if (goodsType == Constant.SOURCE_TYPE_VIP) {
                sendVIPGoods(user, robotId, wxId,  Long.parseLong(goodsId), relationId, listOpen, result.getId());
            } else if (goodsType == Constant.SOURCE_TYPE_SUNING) {
                sendSuNingGoods(user, robotId, wxId,  Long.parseLong(goodsId), sellerId, relationId, listOpen, result.getId());
            }
            // 更新发单记录
            if (storeId != null) {
                UserCloudGoods record = new UserCloudGoods();
                record.setId(storeId);
                record.setState(UserCloudGoods.STATE_SHARED);
                record.setSendTime(new Date());
                record.setUpdateTime(new Date());
                userCloudGoodsService.updateByPrimaryKeySelective(record);
            }
            long time8 = java.lang.System.currentTimeMillis();
            LogHelper.test("sendCircleByGoods执行发送:" + (time8 - time7));
        } catch (UserCloudException e) {
            LogHelper.cloudInfo("autoSendCustomGoods - [uid:" + uid + " 库id:" + storeId + "]原因:" + e.getMsg());
            // 更新发单记录
            if (storeId != null) {
                UserCloudGoods record = new UserCloudGoods();
                record.setId(storeId);
                record.setState(UserCloudGoods.STATE_INVALID);
                record.setSendTime(new Date());
                record.setUpdateTime(new Date());
                userCloudGoodsService.updateByPrimaryKeySelective(record);
            }
        }
    }
    /**
     * 淘宝商品信息处理
     *
     * @param user
     * @param robotId
     * @param wxId
     * @param goodsId
     * @param relationId
     * @param listOpen
     * @throws UserCloudException
     */
    private void sendTaoBaoGoods(UserInfo user, int robotId, String wxId, String goodsId, String relationId,
                                 List<UserCloudGroup> listOpen, String pid) throws UserCloudException {
        TaoBaoLink taoBaoLink = null;
        try {
            taoBaoLink = taoBaoLinkManager.getTaoBaoLinkForShare(user.getSystem(), user.getId(), goodsId, relationId, null);
        } catch (TaoBaoConvertLinkException e) {
            LogHelper.errorDetailInfo(e);
            throw new UserCloudException(1, "该商品已下架");
        }
        if (taoBaoLink == null)
            throw new UserCloudException(1, "该商品已下架");
        TaoBaoGoodsBrief goods = taoBaoLink.getGoods();
        boolean coupon = false;
        if (!StringUtil.isNullOrEmpty(goods.getCouponInfo())) {
            coupon = true;
        }
        String quanPrice = "";
        String description = "";
        String couponAmount = "";
        if (coupon) {
            description = goods.getDescription();
            quanPrice = TaoBaoUtil.getCouponPrice(goods) + "";
            couponAmount = MoneyBigDecimalUtil.getWithNoZera(goods.getCouponAmount()).toString();
        }
        String sales = TaoBaoUtil.getSaleCount(goods.getBiz30day());
        SystemEnum system = userInfoService.getUserSystem(user.getId());
        // 获取推荐语
        String recommendText = shareGoodsTextTemplateService.getRecommendText(coupon, goods.getTitle(), sales,
                couponAmount, description, system);
        // 获取评论语
        String commentText = shareGoodsTextTemplateService.getCommentTextByTaoToken(coupon, taoBaoLink.getTaoToken(),
                goods.getZkPrice().toString(), quanPrice, system);
        // 异步执行发送
        executor.execute(new Runnable() {
            @Override
            public void run() {
                sendGoods(robotId, wxId, listOpen, recommendText, commentText, goods.getImgList(), user.getId(), pid);
            }
        });
    }
    /**
     * 京东商品云发单
     *
     * @param user
     * @param robotId
     * @param wxId
     * @param goodsId
     * @param relationId
     * @param listOpen
     * @throws UserCloudException
     */
    private void sendJDGoods(UserInfo user, int robotId, String wxId, String goodsId, String relationId,
                             List<UserCloudGroup> listOpen, String pid) throws UserCloudException {
        JDGoods jdGoods = jdGoodsCacheUtil.getGoodsInfo(goodsId);
        if (jdGoods == null)
            throw new UserCloudException(1, "该商品已下架");
        String couponUrl = null;
        JDCouponInfo couponInfo = JDUtil.getShowCouponInfo(jdGoods);
        if (couponInfo != null) {
            couponUrl = couponInfo.getLink();
        }
        String materialId = "https://item.jd.com/" + goodsId + ".html";
        String jumpLink = null;
        try {
            jumpLink = JDApiUtil.convertLinkWithSubUnionId(materialId, couponUrl, null, pidManager.getPidCache(user.getSystem(), Constant.SOURCE_TYPE_JD, SystemPIDInfo.PidType.share),
                    user.getId() + "");
        } catch (Exception e) {
            logger.warn(String.format("京东转链出错:materialId-%s  couponUrl-%s", materialId, couponUrl), e);
        }
        boolean coupon = false;
        if (couponInfo != null) {
            coupon = true;
        }
        String quanPrice = "";
        String couponAmount = "";
        if (coupon) {
            quanPrice = BigDecimalUtil.getWithNoZera(JDUtil.getCouponPrice(jdGoods)).toString() + "";
            couponAmount = BigDecimalUtil.getWithNoZera(couponInfo.getDiscount()).toString();
        }
        String sales = JDUtil.getSaleCount(jdGoods.getInOrderCount30Days());
        SystemEnum system = userInfoService.getUserSystem(user.getId());
        // 获取推荐语
        String recommendText = shareGoodsTextTemplateService.getRecommendText(coupon, jdGoods.getSkuName(), sales,
                couponAmount, null, system);
        // 获取评论语
        BigDecimal price = jdGoods.getPrice();
        JDPingouInfo pinGouInfo = jdGoods.getPinGouInfo();
        if (pinGouInfo != null) {
            price = pinGouInfo.getPingouPrice();
        }
        String zkPrice = BigDecimalUtil.getWithNoZera(price).toString();
        String commentText = shareGoodsTextTemplateService.getCommentTextByLink(coupon, jumpLink, zkPrice, quanPrice,
                ConfigKeyEnum.quickShareJDCommentText, system);
        // 异步执行发送
        executor.execute(new Runnable() {
            @Override
            public void run() {
                sendGoods(robotId, wxId, listOpen, recommendText, commentText, jdGoods.getImageList(), user.getId(), pid);
            }
        });
    }
    /**
     * 京东商品云发单
     *
     * @param user
     * @param robotId
     * @param wxId
     * @param goodsId
     * @param relationId
     * @param listOpen
     * @throws UserCloudException
     */
    private void sendPDDGoods(UserInfo user, int robotId, String wxId, String goodsId, String relationId,
                              List<UserCloudGroup> listOpen, String pid) throws UserCloudException {
        PDDGoodsDetail goods = pinDuoDuoCacheUtil.getGoodsInfo(goodsId);
        if (goods == null)
            throw new UserCloudException(1, "该商品已下架");
        String jumpLink = PinDuoDuoApiUtil.getPromotionUrl(goods.getGoodsSign(), pidManager.getPidCache(user.getSystem(), Constant.SOURCE_TYPE_PDD, SystemPIDInfo.PidType.share), user.getId() + "");
        boolean coupon = true;
        if (goods.getHasCoupon() == null || !goods.getHasCoupon()) {
            coupon = false;
        }
        String quanPrice = "";
        String couponAmount = "";
        if (coupon) {
            BigDecimal hundred = new BigDecimal(100);
            BigDecimal amount = MoneyBigDecimalUtil.div(new BigDecimal(goods.getCouponDiscount()), hundred);
            quanPrice = BigDecimalUtil.getWithNoZera(amount).toString();
            couponAmount = BigDecimalUtil.getWithNoZera(PinDuoDuoUtil.getCouponPrice(goods)).toString();
        }
        String sales = goods.getSalesTip();
        if (StringUtil.isNullOrEmpty(sales)) {
            sales = "0";
        }
        SystemEnum system = userInfoService.getUserSystem(user.getId());
        // 获取推荐语
        String recommendText = shareGoodsTextTemplateService.getRecommendText(coupon, goods.getGoodsName(), sales,
                couponAmount, null, system);
        // 获取评论语
        String zkPrice = MoneyBigDecimalUtil.div(new BigDecimal(goods.getMinGroupPrice()), new BigDecimal(100))
                .setScale(2).toString();
        String commentText = shareGoodsTextTemplateService.getCommentTextByLink(coupon, jumpLink, zkPrice, quanPrice,
                ConfigKeyEnum.quickSharePDDCommentText, system);
        List<String> list = null;
        String[] goodsGalleryUrls = goods.getGoodsGalleryUrls();
        if (goodsGalleryUrls != null && goodsGalleryUrls.length > 0) {
            list = Arrays.asList(goodsGalleryUrls);
        }
        List<String> list2 = list;
        // 异步执行发送
        executor.execute(new Runnable() {
            @Override
            public void run() {
                sendGoods(robotId, wxId, listOpen, recommendText, commentText, list2, user.getId(), pid);
            }
        });
    }
    /**
     * 唯品会商品
     *
     * @param user
     * @param robotId
     * @param wxId
     * @param goodsId
     * @param relationId
     * @param listOpen
     * @param pid
     * @throws UserCloudException
     */
    private void sendVIPGoods(UserInfo user, int robotId, String wxId, Long goodsId, String relationId,
                              List<UserCloudGroup> listOpen, String pid) throws UserCloudException {
        VIPGoodsInfo goods = VipShopApiUtil.getGoodsDetail(goodsId + "");
        if (goods == null)
            throw new UserCloudException(1, "该商品已下架");
        VIPConvertResultDTO resultDTO = VipShopApiUtil.convertLink(goodsId + "",
                VipShopUtil.getShareChanTag(user.getId()));
        String jumpLink = resultDTO.getUrl();
        boolean coupon = false;
        String quanPrice = "";
        String couponAmount = "";
        SystemEnum system = userInfoService.getUserSystem(user.getId());
        // 获取推荐语
        String recommendText = shareGoodsTextTemplateService.getRecommendText(coupon, goods.getGoodsName(), null,
                couponAmount, null, system);
        // 获取评论语
        String commentText = shareGoodsTextTemplateService.getCommentTextByLink(coupon, jumpLink,
                goods.getMarketPrice(), quanPrice, ConfigKeyEnum.quickShareVIPCommentText, system);
        // 异步执行发送
        executor.execute(new Runnable() {
            @Override
            public void run() {
                sendGoods(robotId, wxId, listOpen, recommendText, commentText, goods.getGoodsDetailPictures(), user.getId(),
                        pid);
            }
        });
    }
    /**
     * 京东商品云发单
     *
     * @param user
     * @param robotId
     * @param wxId
     * @param goodsId
     * @param relationId
     * @param listOpen
     * @throws UserCloudException
     */
    private void sendSuNingGoods(UserInfo user, int robotId, String wxId, Long goodsId, Long sellerId,
                                 String relationId, List<UserCloudGroup> listOpen, String pid) throws UserCloudException {
        SuningGoodsInfo goods = SuningApiUtil.getGoodsDetail(goodsId + "", sellerId + "");
        if (goods == null)
            throw new UserCloudException(1, "该商品已下架");
        String couponLink = goods.getCouponInfo().getCouponUrl();
        String jumpLink = SuningApiUtil.convertLink(SuningUtil.getProductUrl(sellerId + "", goodsId + ""),
                StringUtil.isNullOrEmpty(couponLink) ? null : couponLink, pidManager.getPidCache(user.getSystem(), Constant.SOURCE_TYPE_SUNING, SystemPIDInfo.PidType.share), user.getId() + "");
        boolean coupon = false;
        String couponAmount = "";
        String sales = null;
        if (goods.getCouponInfo() != null && !StringUtil.isNullOrEmpty(goods.getCouponInfo().getCouponUrl())) {// 有券
            couponAmount = new BigDecimal(goods.getCouponInfo().getCouponValue()).toString();
            coupon = true;
        }
        SystemEnum system = userInfoService.getUserSystem(user.getId());
        // 获取推荐语
        String recommendText = shareGoodsTextTemplateService.getRecommendText(coupon,
                goods.getCommodityInfo().getCommodityName(), sales, couponAmount, null, system);
        // 生成快捷分享内容
        String template = configService.getValue(ConfigKeyEnum.quickShareSuNingCommentText.getKey(), system);
        String commentText = shareGoodsTextTemplateService.createQuickShareTextSuNing(template, goods, jumpLink);
        List<String> imgList = new ArrayList<>();
        for (SuningGoodsImg img : goods.getCommodityInfo().getPictureUrl()) {
            imgList.add(img.getPicUrl());
        }
        executor.execute(new Runnable() {
            @Override
            public void run() {
                // 云发单
                sendGoods(robotId, wxId, listOpen, recommendText, commentText, imgList, user.getId(), pid);
            }
        });
    }
    /**
     * 发送商品
     *
     * @param robotId
     * @param title
     * @param comment
     * @param listImg
     * @param wxId
     * @param listOpen
     */
    private void sendGoods(int robotId, String wxId, List<UserCloudGroup> listOpen, String title, String comment,
                           List<String> listImg, Long uid, String pid) {
        // 遍历群-朋友圈
        for (UserCloudGroup cloudGroup : listOpen) {
            UserCloudSendContent sendContent = new UserCloudSendContent();
            sendContent.setPid(pid);
            sendContent.setUid(uid);
            sendContent.setGroupId(cloudGroup.getGroupId());
            sendContent.setCreateTime(new Date());
            if (cloudGroup.getType() == UserCloudGroup.TYPE_CIRCLE) { // 朋友圈
                sendContent.setType(UserCloudSendContent.TYPE_CIRCLE);
                String picUrl = "";
                if (listImg.size() > 0) {
                    for (String img : listImg) {
                        picUrl += TbImgUtil.getTBSize220Img(img) + ";";
                    }
                    if (picUrl.endsWith(";"))
                        picUrl = picUrl.substring(0, picUrl.length() - 1);
                }
                String picUrlUpload = AitaokerApiUtil.macsendUpload(robotId, picUrl);
                sendContent.setPicUrlUpload(picUrlUpload);
                sendContent.setTitle(title);
                sendContent.setPicUrl(picUrl);
                // 发圈内容
                String circleId = AitaokerApiUtil.macsendCircle(robotId, title, picUrlUpload);
                // 评论文本
                if (!StringUtil.isNullOrEmpty(circleId)) {
                    sendContent.setState(true);
                    List<String> list = new ArrayList<>();
                    boolean macsend = AitaokerApiUtil.macsendCircleComment(robotId, wxId, circleId, comment);
                    if (macsend) {
                        list.add(comment);
                    }
                    sendContent.setComments(list);
                }
            } else {
                sendContent.setType(UserCloudSendContent.TYPE_GROUP);
                // 发送文本
                if (!StringUtil.isNullOrEmpty(title)) {
                    boolean macsend = AitaokerApiUtil.macsendText(robotId, cloudGroup.getGroupId(), title);
                    if (macsend)
                        sendContent.setTitle(title);
                }
                SystemEnum system = userInfoService.getUserSystem(uid);
                // 发送图片
                int num = 1;
                String picNum = configService.getValue(ConfigKeyEnum.robotCloudGroupPictureNum.getKey(), system);
                if (!StringUtil.isNullOrEmpty(picNum)) {
                    num = Integer.parseInt(picNum);
                }
                if (listImg.size() > 0)
                    for (int i = 0; i < num && i < listImg.size(); i++) {
                        try {
                            String imgBase64 = ImageToBase64.NetImageToBase64(listImg.get(i));
                            boolean macsend = AitaokerApiUtil.macsendImgBase64(robotId, cloudGroup.getGroupId(),
                                    imgBase64);
                            if (macsend)
                                sendContent.setPicUrl(listImg.get(i));
                        } catch (Exception e) {
                            LogHelper.errorDetailInfo(e);
                        }
                    }
                // 评论文本
                List<String> list = new ArrayList<>();
                boolean macsend = AitaokerApiUtil.macsendText(robotId, cloudGroup.getGroupId(), comment);
                if (macsend) {
                    list.add(comment);
                }
                sendContent.setState(true);
                sendContent.setComments(list);
            }
            userCloudSendContentService.save(sendContent);
        }
    }
    @Override
    public void fixedTimeSend(List<GoodsEvaluate> listActivity, List<GoodsEvaluate> listGoods, boolean timeLimit) {
        if (listGoods == null && listActivity == null)
            return;
        // 一个小时之前
        Date lastTime = new Date(java.lang.System.currentTimeMillis() - 1000 * 60 * 60);
        for (int i = 0; i < 1000; i++) {
            // 查询哪些用户开通
            List<Long> listUser = userCloudMapper.listValidUid(i * 1000, 1000);
            if (listUser == null || listUser.size() == 0) {
                break;
            }
            // 遍历用户
            for (Long uid : listUser) {
                try {// 判断是否开通官方采集
                    UserCloudManage cloudManage = userCloudManageService.selectByPrimaryKey(uid);
                    if (cloudManage == null || cloudManage.getOfficial() == null || !cloudManage.getOfficial()) {
                        continue;
                    }
                    // 时间间隔:是否在一个小时内已发送过
                    if (timeLimit) {
                        UserCloudSendRecord last = userCloudSendRecordService.getLastByUid(uid, lastTime);
                        if (last != null)
                            continue;
                    }
                    String evaluateId = null;
                    // 活动
                    if (listActivity != null && listActivity.size() > 0) {
                        for (GoodsEvaluate evaluate : listActivity) {
                            UserCloudSendRecord record = userCloudSendRecordService.getByUidAndSendId(uid,
                                    evaluate.getId());
                            if (record != null)
                                continue;
                            evaluateId = evaluate.getId();
                            break;
                        }
                    }
                    // 单品
                    if (StringUtil.isNullOrEmpty(evaluateId) && listGoods != null && listGoods.size() > 0) {
                        for (GoodsEvaluate evaluate : listGoods) {
                            UserCloudSendRecord record = userCloudSendRecordService.getByUidAndSendId(uid,
                                    evaluate.getId());
                            if (record != null)
                                continue;
                            evaluateId = evaluate.getId();
                            break;
                        }
                    }
                    if (!StringUtil.isNullOrEmpty(evaluateId)) {
                        UserCloudMQMsg msg = new UserCloudMQMsg(uid, evaluateId, UserCloudMQMsg.TYPE_EVALUATE);
                        Message message = MQMsgBodyFactory.create(MQTopicName.TOPIC_USER, UserTopicTagEnum.userCloud,
                                msg);
                        rocketMQManager.sendNormalMsg(message, null);
                    }
                } catch (Exception e) {
                    LogHelper.errorDetailInfo(e);
                }
            }
        }
    }
    private void offlineNotification(Long uid) {
        UserCloudManage cloudManage = userCloudManageService.selectForUpdate(uid);
        if (cloudManage == null) {
            return;
        }
        Boolean offlineNotice = cloudManage.getOfflineNotice();
        if (offlineNotice != null && offlineNotice) {
            return;
        }
        try {
            userOtherMsgNotificationService.cloudMsg(uid, "云发单微信账号", "微信账号掉线", "需要你重新扫描二维码登录");
        } catch (Exception e) {
            LogHelper.errorDetailInfo(e);
        }
        // 站内信通知
        offlineNotificationZNX(uid);
        // 延迟10分钟再次提醒
        if (!Constant.IS_TEST) {
            UserCloudMQMsg msg = new UserCloudMQMsg(uid, UserCloudMQMsg.TYPE_PUSH);
            Message message = MQMsgBodyFactory.create(MQTopicName.TOPIC_USER, UserTopicTagEnum.userCloud, msg);
            message.setStartDeliverTime(java.lang.System.currentTimeMillis() + 1000 * 60 * 10);
            rocketMQManager.sendNormalMsg(message, null);
        }
        // 更新已提醒
        UserCloudManage updateManage = new UserCloudManage();
        updateManage.setId(uid);
        updateManage.setOfflineNotice(true);
        userCloudManageService.updateByPrimaryKeySelective(updateManage);
    }
    // 站内信通知
    @Override
    public void offlineNotificationZNX(Long uid) {
        // 验证是否开通
        UserCloud userCloud = userCloudMapper.getValidByUid(uid);
        if (userCloud == null)
            return;
        Integer robotId = userCloud.getRobotId();
        if (robotId == null)
            return;
        // 登录状态
        if (AitaokerApiUtil.onlineCheck(robotId)) {
            return;
        }
        SystemEnum system = userInfoService.getUserSystem(uid);
        try {
            pushService.pushZNX(uid, "【重要通知】你的云发单微信已掉线。", "需要你重新扫描二维码登录", null, null, system);
        } catch (Exception e) {
            LogHelper.errorDetailInfo(e);
        }
    }
}