admin
2025-02-25 30d8e227e8d823b6c38c3b9c90ac2df03b63befe
fanli/src/main/java/com/yeshi/fanli/controller/wxmp/v1/GoodsController.java
@@ -1,922 +1,990 @@
package com.yeshi.fanli.controller.wxmp.v1;
import java.io.InputStream;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import org.json.simple.JSONArray;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.yeshi.utils.HttpUtil;
import org.yeshi.utils.JsonUtil;
import org.yeshi.utils.entity.FileUploadResult;
import org.yeshi.utils.wx.WXUtil;
import org.yeshi.utils.wx.WXXCXUtil;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.yeshi.fanli.dto.ConfigParamsDTO;
import com.yeshi.fanli.dto.WXMPAcceptData;
import com.yeshi.fanli.dto.jd.JDCategoryInfo;
import com.yeshi.fanli.dto.jd.JDCouponInfo;
import com.yeshi.fanli.dto.jd.JDFilter;
import com.yeshi.fanli.dto.jd.JDSearchResult;
import com.yeshi.fanli.dto.pdd.PDDGoodsDetail;
import com.yeshi.fanli.dto.pdd.PDDGoodsResult;
import com.yeshi.fanli.dto.pdd.PDDPromotionUrl;
import com.yeshi.fanli.dto.pdd.PDDSearchFilter;
import com.yeshi.fanli.entity.bus.homemodule.SwiperPicture;
import com.yeshi.fanli.entity.bus.share.UserShareGoodsHistory;
import com.yeshi.fanli.entity.bus.user.ShamUser;
import com.yeshi.fanli.entity.bus.user.UserInfo;
import com.yeshi.fanli.entity.goods.CollectionGoodsV2;
import com.yeshi.fanli.entity.jd.JDGoods;
import com.yeshi.fanli.entity.jd.JDGoodsClass;
import com.yeshi.fanli.exception.share.UserShareGoodsRecordException;
import com.yeshi.fanli.exception.user.UserInfoExtraException;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.common.JumpDetailV2Service;
import com.yeshi.fanli.service.inter.config.ConfigService;
import com.yeshi.fanli.service.inter.goods.CollectionGoodsV2Service;
import com.yeshi.fanli.service.inter.goods.ScanHistoryV2Service;
import com.yeshi.fanli.service.inter.goods.ShareGoodsService;
import com.yeshi.fanli.service.inter.homemodule.SwiperPictureService;
import com.yeshi.fanli.service.inter.jd.JDGoodsClassService;
import com.yeshi.fanli.service.inter.order.config.HongBaoManageService;
import com.yeshi.fanli.service.inter.user.QrCodeService;
import com.yeshi.fanli.service.inter.user.ShamUserService;
import com.yeshi.fanli.service.inter.user.UserInfoExtraService;
import com.yeshi.fanli.service.inter.user.UserInfoService;
import com.yeshi.fanli.service.inter.user.UserShareGoodsRecordService;
import com.yeshi.fanli.service.inter.user.vip.UserVIPInfoService;
import com.yeshi.fanli.tag.PageEntity;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.JumpDetailUtil;
import com.yeshi.fanli.util.MoneyBigDecimalUtil;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.ThreadUtil;
import com.yeshi.fanli.util.VersionUtil;
import com.yeshi.fanli.util.cache.JDGoodsCacheUtil;
import com.yeshi.fanli.util.cache.PinDuoDuoCacheUtil;
import com.yeshi.fanli.util.factory.CommonGoodsFactory;
import com.yeshi.fanli.util.factory.goods.GoodsDetailVOFactory;
import com.yeshi.fanli.util.jd.JDApiUtil;
import com.yeshi.fanli.util.jd.JDUtil;
import com.yeshi.fanli.util.pinduoduo.PinDuoDuoApiUtil;
import com.yeshi.fanli.util.pinduoduo.PinDuoDuoUtil;
import com.yeshi.fanli.vo.goods.CouponInfoVO;
import com.yeshi.fanli.vo.goods.GoodsDetailExtraVO;
import com.yeshi.fanli.vo.goods.GoodsDetailVO;
import com.yeshi.fanli.vo.goods.MoneyInfoVO;
import com.yeshi.fanli.vo.goods.OtherInfo;
import com.yeshi.fanli.vo.goods.RewardCouponVO;
import com.yeshi.fanli.vo.goods.ShareVO;
import com.yeshi.fanli.vo.goods.ShopInfoVO;
import net.sf.json.JSONObject;
@Controller("WXMPGoodsController")
@RequestMapping("/wxmp/api/v1/goods")
public class GoodsController {
   @Resource
   private ConfigService configService;
   @Resource
   private ShamUserService shamUserService;
   @Resource
   private CollectionGoodsV2Service collectionGoodsV2Service;
   @Resource
   private HongBaoManageService hongBaoManageService;
   @Resource
   private UserInfoExtraService userInfoExtraService;
   @Resource
   private ScanHistoryV2Service scanHistoryV2Service;
   @Resource
   private UserInfoService userInfoService;
   @Resource
   private JDGoodsCacheUtil jdGoodsCacheUtil;
   @Resource
   private PinDuoDuoCacheUtil pinDuoDuoCacheUtil;
   @Resource
   private JumpDetailV2Service jumpDetailV2Service;
   @Resource
   private JDGoodsClassService jdGoodsClassService;
   @Resource
   private UserVIPInfoService userVIPInfoService;
   @Resource
   private QrCodeService qrCodeService;
   @Resource
   private ShareGoodsService shareGoodsService;
   @Resource
   private UserShareGoodsRecordService userShareGoodsRecordService;
   @Resource
   private SwiperPictureService swiperPictureService;
   /**
    * 一级分类
    *
    * @param acceptData
    * @param out
    */
   @RequestMapping(value = "getTopCategory", method = RequestMethod.POST)
   public void getTopCategory(WXMPAcceptData acceptData, PrintWriter out) {
      JSONObject data = new JSONObject();
      data.put("list", configService.get("jd_wxmp_class"));
      out.print(JsonUtil.loadTrueResult(data));
   }
   /**
    * 一级分类商品
    *
    * @param acceptData
    * @param out
    */
   @RequestMapping(value = "getCategoryRecommend", method = RequestMethod.POST)
   public void getCategoryRecommend(WXMPAcceptData acceptData, Long cid, Integer page, PrintWriter out) {
      if (cid == null) {
         out.print(JsonUtil.loadFalseResult("分类ID为空"));
         return;
      }
      JSONObject data = new JSONObject();
      if (page == 1) {
         // 轮播图
         String platform = acceptData.getPlatform();
         int version = Integer.parseInt(acceptData.getVersion());
         List<SwiperPicture> picList = swiperPictureService.getByBannerCardAndVersion("index_top", platform,
               version);
         if (picList == null) {
            picList = new ArrayList<>();
         }
         for (SwiperPicture swiper : picList) {
            JSONObject params = null;
            if (StringUtil.isNullOrEmpty(swiper.getParams())) {
               params = JSONObject.fromObject(swiper.getParams());
            }
            swiper.setJumpDetail(JumpDetailUtil.getWXMPJumDetail(swiper.getJumpDetail()));
            swiper.setParams(null);
         }
         data.put("bannerList", JsonUtil.getApiCommonGson().toJson(picList));
      }
      JDFilter filterAPI = new JDFilter();
      filterAPI.setPageIndex(page);
      filterAPI.setPageSize(Constant.PAGE_SIZE);
      filterAPI.setIsCoupon(1); // 有券
      filterAPI.setIsHot(1); // 爆款
      filterAPI.setCid1(cid);
      JDSearchResult result = JDApiUtil.queryByKey(filterAPI);
      long count = 0;
      JSONArray array = new JSONArray();
      if (result != null) {
         PageEntity pageEntity = result.getPageEntity();
         if (pageEntity != null) {
            count = pageEntity.getTotalCount();
         }
         List<JDGoods> goodsList = result.getGoodsList();
         if (goodsList != null && goodsList.size() > 0) {
            Gson gson = JsonUtil.getConvertBigDecimalToStringSubZeroBuilder(new GsonBuilder())
                  .excludeFieldsWithoutExposeAnnotation().setDateFormat("yyyy-MM-dd").create();
            ConfigParamsDTO paramsDTO = hongBaoManageService.getShowComputeRate(acceptData.getPlatform(),
                  acceptData.getVersion());
            for (JDGoods goods : goodsList) {
               GoodsDetailVO goodsDetailVO = GoodsDetailVOFactory.convertJDGoods(goods, paramsDTO);
               if (goodsDetailVO.isHasCoupon()) {
                  array.add(gson.toJson(goodsDetailVO));
               }
            }
         }
      }
      data.put("count", count);
      data.put("list", array);
      out.print(JsonUtil.loadTrueResult(data));
   }
   /**
    * 获取商品详情
    * @param acceptData
    * @param goodsId 商品id
    * @param uid
    * @param code 邀请码
    * @param goodsType 商品类型
    * @param from 页面来源
    * @param out
    */
   @RequestMapping(value = "getGoodsDetial", method = RequestMethod.POST)
   public void getGoodsDetial(WXMPAcceptData acceptData, Long goodsId, Integer goodsType, String from,
          Long uid, PrintWriter out) {
      if (goodsType == null || goodsType < 2 || goodsType > 3) {
         out.print(JsonUtil.loadFalseResult(1, "请传递正确平台参数"));
         return;
      }
      /*--------- 京东商品  -------*/
      if (goodsType.intValue() == Constant.SOURCE_TYPE_JD) {
         getDetialJD(acceptData, goodsId, uid, from, out);
         return;
      }
      /*-------- 拼多多商品  -------*/
      if (goodsType.intValue() == Constant.SOURCE_TYPE_PDD) {
         getDetialPDD(acceptData, goodsId, uid, from, out);
         return;
      }
   }
   /**
    * 京东商品详情
    *
    * @param acceptData
    * @param id
    * @param uid
    * @param from
    * @param out
    */
   private void getDetialJD(WXMPAcceptData acceptData, Long id, Long uid, String from, PrintWriter out) {
      JDGoods jdGoods = JDApiUtil.queryGoodsDetail(id); // 高级接口
      if (jdGoods == null) {
         jdGoods = JDUtil.getGoodsDetail(id); // 爬取网页
         // jdGoods = JDApiUtil.getGoodsDetail(id); // 普通接口
      }
      if (jdGoods == null) {
         out.print(JsonUtil.loadFalseResult(2, "商品不存在"));
         return;
      }
      List<String> imageList = jdGoods.getImageList();
      if (imageList == null) {
         imageList = new ArrayList<String>();
         imageList.add(jdGoods.getPicUrl());
      }
      // 保存缓存
      jdGoodsCacheUtil.saveGoodsInfo(jdGoods);
      ConfigParamsDTO paramsDTO = hongBaoManageService.getShowComputeRate(acceptData.getPlatform(),
            acceptData.getVersion());
      GoodsDetailVO goodsDetail = GoodsDetailVOFactory.convertJDGoods(jdGoods, paramsDTO);
      if (goodsDetail != null && goodsDetail.getMoneyInfo() != null && userVIPInfoService.isVIP(uid)) {
         goodsDetail.getMoneyInfo().setFanliMoney(goodsDetail.getMoneyInfo().getMaxMoney());
         goodsDetail.getMoneyInfo()
               .setShareMoney("¥" + JDUtil.getGoodsFanLiMoney(jdGoods, hongBaoManageService.getVIPShareRate()));
      }
      // 附加信息
      OtherInfo otherInfo = new OtherInfo();
      // 京东plus返利
      String maxMoneyPlus = null;
      JDCategoryInfo categoryInfo = jdGoods.getCategoryInfo();
      if (categoryInfo != null && categoryInfo.getCid3() != null && jdGoods.getCommissionInfo() != null) {
         Long cid3 = categoryInfo.getCid3();
         JDGoodsClass threeClass = jdGoodsClassService.getThreeClassByCid(Integer.parseInt(cid3.toString()));
         if (threeClass != null && threeClass.getSelfComm() != null
               && threeClass.getSelfComm().compareTo(new BigDecimal(0)) > 0) {
            BigDecimal commissionShare = jdGoods.getCommissionInfo().getCommissionShare();
            // plus比例 小于正常比例
            if (commissionShare != null && commissionShare.compareTo(threeClass.getSelfComm()) > 0) {
               jdGoods.setCommissionPlus(threeClass.getSelfComm());
               // plus返利
               BigDecimal fanliMoneyPlus = JDUtil.getGoodsFanLiMoneyPlus(jdGoods,
                     hongBaoManageService.getFanLiRate());
               otherInfo.setFanliMoneyPlus("京东plus返¥" + fanliMoneyPlus);
               // 使用奖励券最高返
               if (VersionUtil.greaterThan_2_0_5(acceptData.getPlatform(), acceptData.getVersion())) {
                  maxMoneyPlus = "(京东plus返¥"
                        + JDUtil.getGoodsFanLiMoneyPlus(jdGoods,
                              hongBaoManageService.getVIPFanLiRate())
                        + ")";
               } else
                  maxMoneyPlus = "(京东plus最高返¥"
                        + fanliMoneyPlus.add(MoneyBigDecimalUtil.mul(fanliMoneyPlus, Constant.MAX_REWARD_RATE))
                        + ")";
            }
         }
      }
      // 奖励券返利
      RewardCouponVO rewardCoupon = new RewardCouponVO();
      rewardCoupon.setMaxMoneyPlus(maxMoneyPlus);
      rewardCoupon.setJumpDetail(jumpDetailV2Service.getByTypeCache("web"));
      goodsDetail.setOtherInfo(otherInfo);
      CouponInfoVO couponInfo = goodsDetail.getCouponInfo();
      if (couponInfo != null) {
         // 券链接处理
         String materialId = "https://item.jd.com/" + id + ".html";
         String url = JDApiUtil.convertLinkWithSubUnionId(materialId, couponInfo.getLink(),
               JDApiUtil.POSITION_COUPON + "", null);
         couponInfo.setLink(url);
      }
      ShopInfoVO shopInfo = goodsDetail.getShopInfo();
      if (shopInfo != null) {
         if (shopInfo.getId() == null || shopInfo.getScoreGoods() == null || shopInfo.getScoreLogistics() == null
               || shopInfo.getScoreSeller() == null) {
            goodsDetail.setShopInfo(null);
         }
      }
      GoodsDetailExtraVO extraVO = new GoodsDetailExtraVO();
      extraVO.setIsNative(false);
      // IOS是否正在上线
      if ("ios".equalsIgnoreCase(acceptData.getPlatform())) {
         String version = acceptData.getVersion();
         extraVO.setIosOnling(configService.iosOnLining(Integer.parseInt(version)));
      }
      Long inOrderCount30Days = jdGoods.getInOrderCount30Days();
      List<ShamUser> listShareUser = new ArrayList<ShamUser>();
      // 京东开启分享
      String open = configService.get("share_jd_open");
      if ("1".equals(open.trim())) {
         extraVO.setShareValid(true);
         MoneyInfoVO moneyInfo = goodsDetail.getMoneyInfo();
         if (moneyInfo != null) {
            String shareMoney = moneyInfo.getShareMoney().replaceAll("¥", "");
            if (Integer.parseInt(inOrderCount30Days.toString()) >= 1000) {
               listShareUser.addAll(shamUserService.listRandShareUser(10, new BigDecimal(shareMoney), 1, 5));
            }
         }
      }
      extraVO.setListShareUser(listShareUser);
      // 领券人列表
      List<ShamUser> listCouponUser = new ArrayList<ShamUser>();
      if (goodsDetail.isHasCoupon() && Integer.parseInt(inOrderCount30Days.toString()) >= 1000) {
         listCouponUser = shamUserService.listRandCouponUser(5, 1, 300);
      }
      extraVO.setListCouponUser(listCouponUser);
      if (uid != null) {
         // 是否加入收藏
         CollectionGoodsV2 collectionGoods = collectionGoodsV2Service.findByUidAndAuctionId(uid, id,
               Constant.SOURCE_TYPE_JD);
         extraVO.setCollected(collectionGoods != null ? true : false);
      }
      // 图文详情
      extraVO.setDetailUrl("https://in.m.jd.com/product/jieshao/video/" + id + ".html");
      // 商品链接
      String h5Url = String.format("http://%s%s?uid=%s&id=%s", configService.getH5Host(),
            Constant.systemCommonConfig.getShareGoodsPagePathJD(), "", id + "");
      try {
         extraVO.setH5Url(HttpUtil.getShortLink(h5Url));
      } catch (Exception e) {
         extraVO.setH5Url(h5Url);
      }
      String helpLink = null;
      extraVO.setFanliValid(true);
      if (StringUtil.isNullOrEmpty(helpLink)) {
         helpLink = configService.get("no_rebate_help_link");
      }
      ShareVO shareInfoVO = new ShareVO();
      shareInfoVO.setHelpLink(helpLink);
      extraVO.setShare(shareInfoVO);
      JSONObject object = new JSONObject();
      object.put("extra", JsonUtil.getApiCommonGson().toJson(extraVO));
      object.put("goods", JsonUtil.getApiCommonGson().toJson(goodsDetail));
      out.print(JsonUtil.loadTrueResult(object.toString()));
      final JDGoods goods = jdGoods;
      ThreadUtil.run(new Runnable() {
         public void run() {
            // 添加浏览记录
            try {
               scanHistoryV2Service.addJDScanHistory(uid, acceptData.getDevice(), goods);
            } catch (Exception e) {
               e.printStackTrace();
            }
         }
      });
   }
   /**
    * 拼多多商品详情
    *
    * @param acceptData
    * @param id
    * @param uid
    * @param from
    * @param out
    */
   private void getDetialPDD(WXMPAcceptData acceptData, Long id, Long uid, String from, PrintWriter out) {
      PDDGoodsDetail pddGoods = PinDuoDuoApiUtil.getGoodsDetail(id);
      if (pddGoods == null) {
         out.print(JsonUtil.loadFalseResult(2, "商品不存在"));
         return;
      }
      ConfigParamsDTO paramsDTO = hongBaoManageService.getShowComputeRate(acceptData.getPlatform(),
            acceptData.getVersion());
      GoodsDetailVO goodsDetail = GoodsDetailVOFactory.convertPDDGoods(pddGoods, paramsDTO);
      if (goodsDetail != null && goodsDetail.getMoneyInfo() != null && userVIPInfoService.isVIP(uid)) {
         goodsDetail.getMoneyInfo().setFanliMoney(goodsDetail.getMoneyInfo().getMaxMoney());
         goodsDetail.getMoneyInfo().setShareMoney(
               "¥" + PinDuoDuoUtil.getGoodsFanLiMoney(pddGoods, hongBaoManageService.getVIPShareRate()));
      }
      CouponInfoVO couponInfo = goodsDetail.getCouponInfo();
      PDDPromotionUrl convertUrl = null;
      if (couponInfo != null) {
         convertUrl = PinDuoDuoApiUtil.convert(id, PinDuoDuoApiUtil.PID_COUPON + "", null);
         if (convertUrl != null)
            couponInfo.setLink(convertUrl.getUrl());
      }
      ShopInfoVO shopInfo = goodsDetail.getShopInfo();
      if (shopInfo != null) {
         if (shopInfo.getId() == null || shopInfo.getScoreGoods() == null || shopInfo.getScoreLogistics() == null
               || shopInfo.getScoreSeller() == null) {
            goodsDetail.setShopInfo(null);
         }
      }
      GoodsDetailExtraVO extraVO = new GoodsDetailExtraVO();
      extraVO.setDetailUrl("http://apph5.yeshitv.com/apppage/goods_img_pdd.html?id=" + id);
      String salesTip = pddGoods.getSalesTip();
      if (!StringUtil.isNullOrEmpty(salesTip)) {
         int indexOf = salesTip.indexOf("+");
         if (indexOf > 0) {
            salesTip = salesTip.substring(0, indexOf);
         }
         int totalSales = 0;
         if (salesTip.contains("万")) {
            salesTip = salesTip.substring(0, salesTip.indexOf("万"));
            totalSales = (int) (Float.parseFloat(salesTip) * 10000);
         } else {
            totalSales = Integer.parseInt(salesTip);
         }
         List<ShamUser> listShareUser = new ArrayList<ShamUser>();
         MoneyInfoVO moneyInfo = goodsDetail.getMoneyInfo();
         if (moneyInfo != null) {
            String shareMoney = moneyInfo.getShareMoney().replaceAll("¥", "");
            if (totalSales >= 50000) {
               listShareUser = shamUserService.listRandShareUser(10, new BigDecimal(shareMoney), 1, 5);
            }
         }
         extraVO.setListShareUser(listShareUser);
         // 领券人列表
         List<ShamUser> listCouponUser = new ArrayList<ShamUser>();
         if (goodsDetail.isHasCoupon() && totalSales >= 50000) {
            listCouponUser = shamUserService.listRandCouponUser(5, 1, 300);
         }
         extraVO.setListCouponUser(listCouponUser);
      }
      if (uid != null) {
         // 是否加入收藏
         CollectionGoodsV2 collectionGoods = collectionGoodsV2Service.findByUidAndAuctionId(uid, id,
               Constant.SOURCE_TYPE_PDD);
         extraVO.setCollected(collectionGoods != null ? true : false);
      }
      // 分享路径
      String h5Url = String.format("http://%s%s?uid=%s&id=%s", configService.getH5Host(),
            Constant.systemCommonConfig.getShareGoodsPagePathPDD(), "", id + "");
      try {
         extraVO.setH5Url(HttpUtil.getShortLink(h5Url));
      } catch (Exception e) {
         extraVO.setH5Url(h5Url);
      }
      String helpLink = null;
      extraVO.setFanliValid(true);
      extraVO.setShareValid(true);
      if (StringUtil.isNullOrEmpty(helpLink)) {
         helpLink = configService.get("no_rebate_help_link");
      }
      ShareVO shareInfoVO = new ShareVO();
      shareInfoVO.setHelpLink(helpLink);
      extraVO.setShare(shareInfoVO);
      if (convertUrl != null) {
         extraVO.setCouponJumpLink(convertUrl.getUrl());
         extraVO.setNativeCouponJumpLink(PinDuoDuoUtil.getAndroidNativeURI(convertUrl.getUrl()));
      }
      JSONObject object = new JSONObject();
      object.put("extra", JsonUtil.getApiCommonGson().toJson(extraVO));
      object.put("goods", JsonUtil.getApiCommonGson().toJson(goodsDetail));
      out.print(JsonUtil.loadTrueResult(object.toString()));
      ThreadUtil.run(new Runnable() {
         public void run() {
            try {
               scanHistoryV2Service.addPDDScanHistory(uid, acceptData.getDevice(), pddGoods);
            } catch (Exception e) {
               e.printStackTrace();
            }
         }
      });
   }
   /**
    * 商品详情推荐(猜你喜欢 + 推荐)
    *
    * @param acceptData
    * @param id
    * @param out
    */
   @RequestMapping(value = "getRecommendGoods", method = RequestMethod.POST)
   public void getRecommendGoods(WXMPAcceptData acceptData, long id, Integer goodsType, PrintWriter out) {
      if (goodsType == null || goodsType < 2 || goodsType > 3) {
         out.print(JsonUtil.loadFalseResult(1, "请传递正确平台参数"));
         return;
      }
      try {
         // 京东
         if (goodsType == Constant.SOURCE_TYPE_JD) {
            JSONObject data = new JSONObject();
            data.put("listGuess", JsonUtil.getApiCommonGson().toJson(new ArrayList<GoodsDetailVO>()));
            List<JDGoods> list = JDUtil.getRecommendGoodsById(id);
            if (list == null) {
               list = new ArrayList<JDGoods>();
            } else if (list.size() > 10) {
               list = list.subList(0, 10);
            }
            ConfigParamsDTO paramsDTO = hongBaoManageService.getShowComputeRate(acceptData.getPlatform(),
                  acceptData.getVersion());
            List<GoodsDetailVO> listDetailVO = new ArrayList<GoodsDetailVO>();
            for (JDGoods goods : list) {
               listDetailVO.add(GoodsDetailVOFactory.convertJDGoods(goods, paramsDTO));
            }
            // 取偶数个数据
            if (listDetailVO.size() % 2 != 0) {
               listDetailVO.remove(listDetailVO.size() - 1);
            }
            data.put("listQuality", JsonUtil.getApiCommonGson().toJson(listDetailVO));
            out.print(JsonUtil.loadTrueResult(data));
            return;
         }
         // 拼多多
         if (goodsType == Constant.SOURCE_TYPE_PDD) {
            JSONObject data = new JSONObject();
            data.put("listGuess", JsonUtil.getApiCommonGson().toJson(new ArrayList<GoodsDetailVO>()));
            List<GoodsDetailVO> listDetailVO = new ArrayList<GoodsDetailVO>();
            List<Long> goodsIdList = PinDuoDuoUtil.getRecommendGoodsId(id);
            if (goodsIdList != null && goodsIdList.size() > 0) {
               PDDSearchFilter pddfilter = new PDDSearchFilter();
               pddfilter.setPage(1);
               pddfilter.setPageSize(Constant.PAGE_SIZE);
               Long[] strings = new Long[goodsIdList.size()];
               pddfilter.setGoodsIdList(goodsIdList.toArray(strings));
               PDDGoodsResult result = PinDuoDuoApiUtil.searchGoods(pddfilter);
               if (result != null) {
                  List<PDDGoodsDetail> goodsList = result.getGoodsList();
                  if (goodsList != null && goodsList.size() > 0) {
                     if (goodsList.size() > 10) {
                        goodsList = goodsList.subList(0, 10);
                     }
                     ConfigParamsDTO paramsDTO = hongBaoManageService
                           .getShowComputeRate(acceptData.getPlatform(), acceptData.getVersion());
                     for (PDDGoodsDetail goods : goodsList) {
                        listDetailVO.add(GoodsDetailVOFactory.convertPDDGoods(goods, paramsDTO));
                     }
                  }
               }
            }
            // 取偶数个数据
            if (listDetailVO.size() % 2 != 0) {
               listDetailVO.remove(listDetailVO.size() - 1);
            }
            data.put("listQuality", JsonUtil.getApiCommonGson().toJson(listDetailVO));
            out.print(JsonUtil.loadTrueResult(data));
            return;
         }
      } catch (Exception e) {
         LogHelper.errorDetailInfo(e);
         JSONObject data = new JSONObject();
         data.put("listQuality", new JSONArray());
         data.put("listGuess", new JSONArray());
         out.print(JsonUtil.loadTrueResult(data));
      }
   }
   /**
    * 获取商品详情
    * @param acceptData
    * @param goodsId 商品id
    * @param uid
    * @param code 邀请码
    * @param goodsType 商品类型
    * @param from 页面来源
    * @param out
    */
   @RequestMapping(value = "getBuyLink", method = RequestMethod.POST)
   public void getBuyLink(WXMPAcceptData acceptData, Long goodsId, Integer goodsType, String from,
         String couponUrl, Long uid, String inviteCode, PrintWriter out) {
      if (goodsId == null || goodsType == null) {
         out.print(JsonUtil.loadFalseResult(1, "商品信息传递错误"));
         return;
      }
      // 判断是自购 还是根据邀请码
      boolean share = false;
      String subUnionId = "";
      if (uid != null) {
         UserInfo user = userInfoService.getUserByIdWithMybatis(uid);
         if (user != null && user.getState() != UserInfo.STATE_NORMAL) {
            out.print(JsonUtil.loadFalseResult(Constant.CODE_FORBIDDEN_USER, Constant.FORBIDDEN_USER_REASON_DESC));
            return;
         }
         subUnionId = uid.toString();
      } else if ((uid == null || uid < 1) && !StringUtil.isNullOrEmpty(inviteCode) ) {
         try {
            UserInfo user = userInfoExtraService.getUserByInviteCode(inviteCode);
            if (user != null && user.getState() == UserInfo.STATE_NORMAL) {
               share = true;
               subUnionId = user.getId().toString();
            }
         } catch (UserInfoExtraException e) {
            e.printStackTrace();
         }
      }
      String jumpLink = null;
      if (goodsType.intValue() == Constant.SOURCE_TYPE_JD) { // 京东
         JDGoods goods = jdGoodsCacheUtil.getGoodsInfo(goodsId);
         if (goods == null) {
            out.print(JsonUtil.loadFalseResult(2, "商品已下架"));
            return;
         }
         String materialId = "https://item.jd.com/" + goodsId + ".html";
         if (StringUtil.isNullOrEmpty(couponUrl)) {
            JDCouponInfo couponInfo = JDUtil.getShowCouponInfo(goods.getCouponInfoList(), goods.getPrice());
            if (couponInfo != null) {
               couponUrl = couponInfo.getLink();
            }
         }
         long position =  JDApiUtil.POSITION_FANLI;
         if (share) {
            position = JDApiUtil.POSITION_SHARE;
         }
         String jdLink = JDApiUtil.convertLinkWithSubUnionId(materialId, couponUrl, position + "", subUnionId);
         try {
            jumpLink = "/pages/union/proxy/proxy?spreadUrl=" + URLEncoder.encode(jdLink, "UTF-8");
         } catch (Exception e) {
            LogHelper.errorDetailInfo(e);
         }
      } else if (goodsType.intValue() == Constant.SOURCE_TYPE_PDD) { // 拼多多
         PDDGoodsDetail goods = pinDuoDuoCacheUtil.getGoodsInfo(goodsId);
         if (goods == null) {
            out.print(JsonUtil.loadFalseResult(2, "商品已下架"));
            return;
         }
         String position = PinDuoDuoApiUtil.PID_FANLI;
         if (share) {
            position = PinDuoDuoApiUtil.PID_SHARE;
         }
         jumpLink = PinDuoDuoApiUtil.convertWXMP(goodsId, position, subUnionId);
      } else {
         out.print(JsonUtil.loadFalseResult(1, "参数传递错误"));
         return;
      }
      if (StringUtil.isNullOrEmpty(jumpLink)) {
         out.print(JsonUtil.loadFalseResult(1, "创建购买信息失败"));
         return;
      }
      JSONObject data = new JSONObject();
      data.put("goodsType", goodsType);
      data.put("jumpLink", jumpLink);
      out.print(JsonUtil.loadTrueResult(data));
   }
   /**
    * 分享商品海报
    * @param acceptData
    * @param goodsId
    * @param goodsType
    * @param from
    * @param type
    * @param uid
    * @param out
    */
   @RequestMapping(value = "sharePoster", method = RequestMethod.POST)
   public void sharePoster(WXMPAcceptData acceptData, Long goodsId, Integer goodsType, String from, Integer type,
         Long uid, PrintWriter out) {
      if (uid == null || uid < 1) {
         out.print(JsonUtil.loadFalseResult(1, "用户未登录"));
         return;
      }
      if (goodsId == null || goodsType == null) {
         out.print(JsonUtil.loadFalseResult(1, "商品信息传递错误"));
         return;
      }
      if (type == null || type < 1 || type > 2) {
         out.print(JsonUtil.loadFalseResult(1, "分享类型错误"));
         return;
      }
      UserInfo user = userInfoService.getUserByIdWithMybatis(uid);
      if (user != null && user.getState() != UserInfo.STATE_NORMAL) {
         out.print(JsonUtil.loadFalseResult(Constant.CODE_FORBIDDEN_USER, Constant.FORBIDDEN_USER_REASON_DESC));
         return;
      }
      String inviteCode = userInfoExtraService.getInviteCodeByUid(uid);
      if (StringUtil.isNullOrEmpty(inviteCode)) {
         out.print(JsonUtil.loadFalseResult(1, "邀请码未激活"));
         return;
      }
      if (goodsType.intValue() == Constant.SOURCE_TYPE_JD) { // 京东
         createPosterJD(acceptData, goodsId, goodsType, from, type, user, inviteCode, out);
      } else if (goodsType.intValue() == Constant.SOURCE_TYPE_PDD) { // 拼多多
         createPosterPDD(acceptData, goodsId, goodsType, from, type, user, inviteCode, out);
      } else {
         out.print(JsonUtil.loadFalseResult(1, "参数传递错误"));
      }
   }
   /**
    * 创建京东分享海报
    */
   private void createPosterJD(WXMPAcceptData acceptData, Long goodsId, Integer goodsType, String from, Integer type, UserInfo user,
         String inviteCode,  PrintWriter out) {
      JDGoods jdGoods = jdGoodsCacheUtil.getGoodsInfo(goodsId);
      if (jdGoods == null) {
         out.print(JsonUtil.loadFalseResult(2, "商品已下架"));
         return;
      }
      ConfigParamsDTO paramsDTO = hongBaoManageService.getShowComputeRate(acceptData.getPlatform(),acceptData.getVersion());
      GoodsDetailVO goods = GoodsDetailVOFactory.convertJDGoods(jdGoods, paramsDTO);
      String scene = goodsType+"#"+goodsId+"#" + inviteCode;
      FileUploadResult uploadResult = null;
      if (type == 1) {
         String erCodeUrl = "https://wxmp.banliapp.com/goods?i="+ scene;
         uploadResult = qrCodeService.drawGoodsPoster(erCodeUrl, user.getPortrait(), goods);
      } else {
         String acessToken = WXUtil.getAcessToken(Constant.WXMP_APP_INFO.getAppId(), Constant.WXMP_APP_INFO.getAppSecret());
         InputStream xcxCode = WXXCXUtil.getXCXCode(acessToken, "/pages/goods/goods", scene);
         uploadResult = qrCodeService.drawGoodsPosterXCX(xcxCode, user, goods);
      }
      try {
         userShareGoodsRecordService.saveShareRecord(user.getId(), CommonGoodsFactory.create(jdGoods));
      } catch (UserShareGoodsRecordException e) {
         e.printStackTrace();
      }
      String posterLink = uploadResult.getUrl();
      JSONObject data = new JSONObject();
      data.put("posterLink", posterLink);
      out.print(JsonUtil.loadTrueResult(data));
      com.yeshi.fanli.util.ThreadUtil.run(new Runnable() {
         @Override
         public void run() {
            // 异步操作 添加分享记录
            UserShareGoodsHistory history = new UserShareGoodsHistory();
            history.setUser(new UserInfo(user.getId()));
            history.setHongbao(new BigDecimal(goods.getMoneyInfo().getShareMoney().replace("¥", "")));
            history.setCreateTime(new Date());
            history.setGoodsType(Constant.SOURCE_TYPE_JD);
            history.setTkCode(null);
            history.setLink(null);
            history.setQuanLink(null);
            history.setGoodsId(goodsId);
            history.setPostPicture(goods.getPicUrl());
            history.setPictures(JsonUtil.getGson().toJson(goods.getImgList()));
            history.setShareImg(posterLink);
            shareGoodsService.addShareGoodsHistory(history);
         }
      });
   }
   /**
    * 创建拼多多分享海报
    */
   private void createPosterPDD(WXMPAcceptData acceptData, Long goodsId, Integer goodsType, String from, Integer type, UserInfo user,
         String inviteCode,  PrintWriter out) {
      PDDGoodsDetail pddGoods = pinDuoDuoCacheUtil.getGoodsInfo(goodsId);
      if (pddGoods == null) {
         out.print(JsonUtil.loadFalseResult(2, "商品已下架"));
         return;
      }
      ConfigParamsDTO paramsDTO = hongBaoManageService.getShowComputeRate(acceptData.getPlatform(), acceptData.getVersion());
      GoodsDetailVO goods = GoodsDetailVOFactory.convertPDDGoods(pddGoods, paramsDTO);
      String scene = goodsType+"#"+goodsId+"#" + inviteCode;
      FileUploadResult uploadResult = null;
      if (type == 1) {
         String erCodeUrl = "https://wxmp.banliapp.com/goods?info="+ scene;
         uploadResult = qrCodeService.drawGoodsPoster(erCodeUrl, user.getPortrait(), goods);
      } else {
         String acessToken = WXUtil.getAcessToken(Constant.WXMP_APP_INFO.getAppId(), Constant.WXMP_APP_INFO.getAppSecret());
         InputStream xcxCode = WXXCXUtil.getXCXCode(acessToken, "/pages/goods/goods", scene);
         uploadResult = qrCodeService.drawGoodsPosterXCX(xcxCode, user, goods);
      }
      try {
         userShareGoodsRecordService.saveShareRecord(user.getId(), CommonGoodsFactory.create(pddGoods));
      } catch (UserShareGoodsRecordException e) {
         e.printStackTrace();
      }
      String posterLink = uploadResult.getUrl();
      JSONObject data = new JSONObject();
      data.put("posterLink", posterLink);
      out.print(JsonUtil.loadTrueResult(data));
      // 异步操作
      com.yeshi.fanli.util.ThreadUtil.run(new Runnable() {
         @Override
         public void run() {
            // 异步操作 添加分享记录
            UserShareGoodsHistory history = new UserShareGoodsHistory();
            history.setUser(new UserInfo(user.getId()));
            history.setHongbao(new BigDecimal(goods.getMoneyInfo().getShareMoney().replace("¥", "")));
            history.setCreateTime(new Date());
            history.setGoodsType(Constant.SOURCE_TYPE_PDD);
            history.setTkCode(null);
            history.setLink(null);
            history.setQuanLink(null);
            history.setGoodsId(goodsId);
            history.setPostPicture(goods.getPicUrl());
            history.setPictures(JsonUtil.getGson().toJson(goods.getImgList()));
            history.setShareImg(posterLink);
            shareGoodsService.addShareGoodsHistory(history);
         }
      });
   }
}
package com.yeshi.fanli.controller.wxmp.v1;
import java.io.InputStream;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.util.ArrayList;
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.service.manger.PIDManager;
import com.yeshi.fanli.util.*;
import com.yeshi.fanli.vo.pdd.PDDConvertLinkResultVO;
import org.json.simple.JSONArray;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.yeshi.utils.HttpUtil;
import org.yeshi.utils.JsonUtil;
import org.yeshi.utils.entity.FileUploadResult;
import org.yeshi.utils.wx.WXUtil;
import org.yeshi.utils.wx.WXXCXUtil;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.yeshi.fanli.dto.GoodsMoneyConfigParamsDTO;
import com.yeshi.fanli.dto.WXMPAcceptData;
import com.yeshi.fanli.dto.jd.JDCategoryInfo;
import com.yeshi.fanli.dto.jd.JDCouponInfo;
import com.yeshi.fanli.dto.jd.JDFilter;
import com.yeshi.fanli.dto.jd.JDSearchResult;
import com.yeshi.fanli.dto.pdd.PDDGoodsDetail;
import com.yeshi.fanli.dto.pdd.PDDGoodsResult;
import com.yeshi.fanli.dto.pdd.PDDSearchFilter;
import com.yeshi.fanli.entity.bus.share.UserShareGoodsHistory;
import com.yeshi.fanli.entity.bus.user.ShamUser;
import com.yeshi.fanli.entity.bus.user.UserInfo;
import com.yeshi.fanli.entity.bus.user.vip.UserLevelEnum;
import com.yeshi.fanli.entity.goods.CollectionGoodsV2;
import com.yeshi.fanli.entity.jd.JDGoods;
import com.yeshi.fanli.entity.jd.JDGoodsClass;
import com.yeshi.fanli.entity.system.ConfigKeyEnum;
import com.yeshi.fanli.exception.share.UserShareGoodsRecordException;
import com.yeshi.fanli.exception.user.UserInfoExtraException;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.common.JumpDetailV2Service;
import com.yeshi.fanli.service.inter.config.ConfigService;
import com.yeshi.fanli.service.inter.count.HongBaoV2CountService;
import com.yeshi.fanli.service.inter.goods.CollectionGoodsV2Service;
import com.yeshi.fanli.service.inter.goods.ScanHistoryV2Service;
import com.yeshi.fanli.service.inter.goods.ShareGoodsService;
import com.yeshi.fanli.service.inter.homemodule.SwiperPictureService;
import com.yeshi.fanli.service.inter.jd.JDGoodsClassService;
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.ShamUserService;
import com.yeshi.fanli.service.inter.user.UserInfoExtraService;
import com.yeshi.fanli.service.inter.user.UserInfoService;
import com.yeshi.fanli.service.inter.user.UserShareGoodsRecordService;
import com.yeshi.fanli.service.inter.user.vip.UserVIPInfoService;
import com.yeshi.common.entity.PageEntity;
import com.yeshi.fanli.util.cache.JDGoodsCacheUtil;
import com.yeshi.fanli.util.cache.PinDuoDuoCacheUtil;
import com.yeshi.fanli.util.factory.CommonGoodsFactory;
import com.yeshi.fanli.util.factory.goods.GoodsDetailVOFactory;
import com.yeshi.fanli.util.jd.JDApiUtil;
import com.yeshi.fanli.util.jd.JDUtil;
import com.yeshi.fanli.util.pinduoduo.PinDuoDuoApiUtil;
import com.yeshi.fanli.util.pinduoduo.PinDuoDuoUtil;
import com.yeshi.fanli.vo.goods.CouponInfoVO;
import com.yeshi.fanli.vo.goods.GoodsDetailExtraVO;
import com.yeshi.fanli.vo.goods.GoodsDetailVO;
import com.yeshi.fanli.vo.goods.MoneyInfoVO;
import com.yeshi.fanli.vo.goods.OtherInfo;
import com.yeshi.fanli.vo.goods.RewardCouponVO;
import com.yeshi.fanli.vo.goods.ShareVO;
import com.yeshi.fanli.vo.goods.ShopInfoVO;
import com.yeshi.fanli.vo.homemodule.BannerVO;
import net.sf.json.JSONObject;
@Controller("WXMPGoodsController")
@RequestMapping("/wxmp/api/v1/goods")
public class GoodsController {
    @Resource
    private ConfigService configService;
    @Resource
    private ShamUserService shamUserService;
    @Resource
    private CollectionGoodsV2Service collectionGoodsV2Service;
    @Resource
    private HongBaoManageService hongBaoManageService;
    @Resource
    private OrderHongBaoMoneyComputeService orderHongBaoMoneyComputeService;
    @Resource
    private UserInfoExtraService userInfoExtraService;
    @Resource
    private ScanHistoryV2Service scanHistoryV2Service;
    @Resource
    private UserInfoService userInfoService;
    @Resource
    private JDGoodsCacheUtil jdGoodsCacheUtil;
    @Resource
    private PinDuoDuoCacheUtil pinDuoDuoCacheUtil;
    @Resource
    private JumpDetailV2Service jumpDetailV2Service;
    @Resource
    private JDGoodsClassService jdGoodsClassService;
    @Resource
    private UserVIPInfoService userVIPInfoService;
    @Resource
    private QrCodeService qrCodeService;
    @Resource
    private ShareGoodsService shareGoodsService;
    @Resource
    private UserShareGoodsRecordService userShareGoodsRecordService;
    @Resource
    private SwiperPictureService swiperPictureService;
    @Resource
    private HongBaoV2CountService hongBaoV2CountService;
    @Resource
    private PIDManager pidManager;
    /**
     * 一级分类
     *
     * @param acceptData
     * @param out
     */
    @RequestMapping(value = "getTopCategory", method = RequestMethod.POST)
    public void getTopCategory(WXMPAcceptData acceptData, Long uid, PrintWriter out) {
        SystemEnum system = SystemInfoUtil.getSystemByWXCXCAppId(acceptData.getAppId());
        JSONObject data = new JSONObject();
        data.put("list", configService.getValue(ConfigKeyEnum.jdWXMPClass.getKey(), system));
        String tips = null;
        if (uid == null || uid <= 0) {
            tips = configService.getValue(ConfigKeyEnum.tipGuideNewUser.getKey(), system);
        } else {
            long rebateOrder = hongBaoV2CountService.countRebateOrder(uid);
            long shareOrInviteOrder = hongBaoV2CountService.countShareOrInviteOrder(uid);
            if (rebateOrder + shareOrInviteOrder >= 3) {
                // 熟客版
            } else if (rebateOrder <= 0 && shareOrInviteOrder <= 0) {
                // 新人版
                tips = configService.getValue(ConfigKeyEnum.tipGuideNewUser.getKey(), system);
            } else if (rebateOrder > 0 && shareOrInviteOrder <= 0) {
                // 省钱版
                tips = configService.getValue(ConfigKeyEnum.tipGuideSaveMoney.getKey(), system);
            } else {
                // 赚钱版
                tips = configService.getValue(ConfigKeyEnum.tipGuideShareInvite.getKey(), system);
            }
        }
        if (!StringUtil.isNullOrEmpty(tips)) {
            JSONObject tipData = JSONObject.fromObject(tips);
            data.put("tipData", tipData);
        }
        out.print(JsonUtil.loadTrueResult(data));
    }
    /**
     * 一级分类商品
     *
     * @param acceptData
     * @param out
     */
    @RequestMapping(value = "getCategoryRecommend", method = RequestMethod.POST)
    public void getCategoryRecommend(WXMPAcceptData acceptData, Long cid, Integer page, PrintWriter out) {
        if (cid == null) {
            out.print(JsonUtil.loadFalseResult("分类ID为空"));
            return;
        }
        JSONObject data = new JSONObject();
        if (page == 1) {
            // 轮播图
            String platform = acceptData.getPlatform();
            int version = Integer.parseInt(acceptData.getVersion());
            List<BannerVO> picList = swiperPictureService.getByBannerCardAndVersion("index_top", platform,
                    version, acceptData.getSystem());
            if (picList == null) {
                picList = new ArrayList<>();
            }
            for (BannerVO swiper : picList) {
                JSONObject params = null;
                if (StringUtil.isNullOrEmpty(swiper.getParams())) {
                    params = JSONObject.fromObject(swiper.getParams());
                }
                swiper.setJumpDetail(JumpDetailUtil.getWXMPJumDetail(swiper.getJumpDetail()));
            }
            data.put("bannerList", JsonUtil.getApiCommonGson().toJson(picList));
        }
        JDFilter filterAPI = new JDFilter();
        filterAPI.setPageIndex(page);
        filterAPI.setPageSize(Constant.PAGE_SIZE);
        filterAPI.setIsCoupon(1); // 有券
        filterAPI.setIsHot(1); // 爆款
        filterAPI.setCid1(cid);
        JDSearchResult result = JDApiUtil.queryByKey(filterAPI);
        long count = 0;
        JSONArray array = new JSONArray();
        if (result != null) {
            PageEntity pageEntity = result.getPageEntity();
            if (pageEntity != null) {
                count = pageEntity.getTotalCount();
            }
            List<JDGoods> goodsList = result.getGoodsList();
            if (goodsList != null && goodsList.size() > 0) {
                Gson gson = JsonUtil.getConvertBigDecimalToStringSubZeroBuilder(new GsonBuilder())
                        .excludeFieldsWithoutExposeAnnotation().setDateFormat("yyyy-MM-dd").create();
                GoodsMoneyConfigParamsDTO paramsDTO = orderHongBaoMoneyComputeService.getShowComputeRate(acceptData.getPlatform(),
                        acceptData.getVersion(), acceptData.getSystem());
                for (JDGoods goods : goodsList) {
                    GoodsDetailVO goodsDetailVO = GoodsDetailVOFactory.convertJDGoods(goods, paramsDTO);
                    if (goodsDetailVO.isHasCoupon()) {
                        array.add(gson.toJson(goodsDetailVO));
                    }
                }
            }
        }
        data.put("count", count);
        data.put("list", array);
        out.print(JsonUtil.loadTrueResult(data));
    }
    /**
     * 获取商品详情
     *
     * @param acceptData
     * @param goodsId    商品id
     * @param uid        邀请码
     * @param goodsType  商品类型
     * @param from       页面来源
     * @param out
     */
    @RequestMapping(value = "getGoodsDetial")
    public void getGoodsDetial(WXMPAcceptData acceptData, String goodsId, Integer goodsType, String from, Long uid,
                               PrintWriter out) {
        if (goodsType == null || goodsType < 2 || goodsType > 3) {
            out.print(JsonUtil.loadFalseResult(1, "请传递正确平台参数"));
            return;
        }
        /*--------- 京东商品  -------*/
        if (goodsType.intValue() == Constant.SOURCE_TYPE_JD) {
            getDetialJD(acceptData, goodsId, uid, from, out);
            return;
        }
        /*-------- 拼多多商品  -------*/
        if (goodsType.intValue() == Constant.SOURCE_TYPE_PDD) {
            getDetialPDD(acceptData, Long.parseLong(goodsId), uid, from, out);
            return;
        }
    }
    /**
     * 京东商品详情
     *
     * @param acceptData
     * @param id
     * @param uid
     * @param from
     * @param out
     */
    private void getDetialJD(WXMPAcceptData acceptData, String id, Long uid, String from, PrintWriter out) {
        JDGoods jdGoods = JDApiUtil.queryGoodsDetail(id); // 高级接口
        if (jdGoods == null) {
//            jdGoods = JDUtil.getGoodsDetail(id); // 爬取网页
            // jdGoods = JDApiUtil.getGoodsDetail(id); // 普通接口
        }
        if (jdGoods == null) {
            out.print(JsonUtil.loadFalseResult(2, "商品不存在"));
            return;
        }
        List<String> imageList = jdGoods.getImageList();
        if (imageList == null) {
            imageList = new ArrayList<String>();
            imageList.add(jdGoods.getPicUrl());
        }
        // 保存缓存
        jdGoodsCacheUtil.saveGoodsInfo(jdGoods);
        GoodsMoneyConfigParamsDTO paramsDTO = orderHongBaoMoneyComputeService.getShowComputeRate(acceptData.getPlatform(),
                acceptData.getVersion(), acceptData.getSystem());
        paramsDTO.setMaxRewardRate(null);
        GoodsDetailVO goodsDetail = GoodsDetailVOFactory.convertJDGoods(jdGoods, paramsDTO);
        if (goodsDetail != null && goodsDetail.getMoneyInfo() != null && userVIPInfoService.isVIP(uid)) {
            goodsDetail.getMoneyInfo().setFanliMoney(goodsDetail.getMoneyInfo().getMaxMoney());
            goodsDetail.getMoneyInfo()
                    .setShareMoney("¥" + JDUtil.getGoodsFanLiMoney(jdGoods, hongBaoManageService.getShareRate(UserLevelEnum.superVIP, acceptData.getSystem())));
            goodsDetail.getMoneyInfo().setRateInfo(goodsDetail.getMoneyInfo().getMaxRateInfo());
            goodsDetail.getMoneyInfo().setCompositionInfo(goodsDetail.getMoneyInfo().getMaxCompositionInfo());
        }
        goodsDetail.getMoneyInfo()
                .setRateInfoHelpUrl(configService.getValue(ConfigKeyEnum.goodsDetailFanliRateHelpUrl.getKey(), acceptData.getSystem()));
        // 附加信息
        OtherInfo otherInfo = new OtherInfo();
        // 京东plus返利
        String maxMoneyPlus = null;
        JDCategoryInfo categoryInfo = jdGoods.getCategoryInfo();
        if (categoryInfo != null && categoryInfo.getCid3() != null && jdGoods.getCommissionInfo() != null) {
            Long cid3 = categoryInfo.getCid3();
            JDGoodsClass threeClass = jdGoodsClassService.getThreeClassByCid(Integer.parseInt(cid3.toString()));
            if (threeClass != null && threeClass.getSelfComm() != null
                    && threeClass.getSelfComm().compareTo(new BigDecimal(0)) > 0) {
                BigDecimal commissionShare = jdGoods.getCommissionInfo().getCommissionShare();
                // plus比例 小于正常比例
                if (commissionShare != null && commissionShare.compareTo(threeClass.getSelfComm()) > 0) {
                    jdGoods.setCommissionPlus(threeClass.getSelfComm());
                    // plus返利
                    BigDecimal fanliMoneyPlus = JDUtil.getGoodsFanLiMoneyPlus(jdGoods,
                            hongBaoManageService.getFanLiRate(acceptData.getSystem()));
                    otherInfo.setFanliMoneyPlus("京东plus返¥" + fanliMoneyPlus);
                    // 使用奖励券最高返
                    maxMoneyPlus = "(京东plus返¥"
                            + JDUtil.getGoodsFanLiMoneyPlus(jdGoods, hongBaoManageService.getFanLiRate(UserLevelEnum.superVIP, acceptData.getSystem())) + ")";
                }
            }
        }
        // 奖励券返利
        RewardCouponVO rewardCoupon = new RewardCouponVO();
        rewardCoupon.setMaxMoneyPlus(maxMoneyPlus);
        rewardCoupon.setMaxMoney(goodsDetail.getMoneyInfo().getMaxMoney());
        rewardCoupon.setDesc("返");
        otherInfo.setRewardCoupon(rewardCoupon);
        goodsDetail.setOtherInfo(otherInfo);
        CouponInfoVO couponInfo = goodsDetail.getCouponInfo();
        if (couponInfo != null) {
            // 券链接处理
            String materialId = "https://item.jd.com/" + id + ".html";
            String url = null;
            try {
                url = JDApiUtil.convertLinkWithSubUnionId(materialId, couponInfo.getLink(),
                        null, pidManager.getPidCache(acceptData.getSystem(), Constant.SOURCE_TYPE_JD, SystemPIDInfo.PidType.coupon), null);
            } catch (Exception e) {
                e.printStackTrace();
            }
            couponInfo.setLink(url);
        }
        ShopInfoVO shopInfo = goodsDetail.getShopInfo();
        if (shopInfo != null) {
            if (shopInfo.getId() == null || shopInfo.getScoreGoods() == null || shopInfo.getScoreLogistics() == null
                    || shopInfo.getScoreSeller() == null) {
                goodsDetail.setShopInfo(null);
            }
        }
        GoodsDetailExtraVO extraVO = new GoodsDetailExtraVO();
        extraVO.setIsNative(false);
        // IOS是否正在上线
        if ("ios".equalsIgnoreCase(acceptData.getPlatform())) {
            String version = acceptData.getVersion();
            extraVO.setIosOnling(configService.iosOnLining(Integer.parseInt(version), acceptData.getSystem()));
        }
        Long inOrderCount30Days = jdGoods.getInOrderCount30Days();
        List<ShamUser> listShareUser = new ArrayList<ShamUser>();
        // 京东开启分享
        String open = configService.getValue(ConfigKeyEnum.shareOpenJD.getKey(), acceptData.getSystem());
        if ("1".equals(open.trim())) {
            extraVO.setShareValid(true);
            MoneyInfoVO moneyInfo = goodsDetail.getMoneyInfo();
            if (moneyInfo != null) {
                String shareMoney = moneyInfo.getShareMoney().replaceAll("¥", "");
                if (Integer.parseInt(inOrderCount30Days.toString()) >= 1000) {
                    listShareUser.addAll(shamUserService.listRandShareUser(10, new BigDecimal(shareMoney), 1, 5));
                }
            }
        }
        extraVO.setListShareUser(listShareUser);
        // 领券人列表
        List<ShamUser> listCouponUser = new ArrayList<>();
        if (goodsDetail.isHasCoupon() && Integer.parseInt(inOrderCount30Days.toString()) >= 1000) {
            listCouponUser = shamUserService.listRandCouponUser(5, 1, 300);
        }
        extraVO.setListCouponUser(listCouponUser);
        if (uid != null) {
            // 是否加入收藏
            CollectionGoodsV2 collectionGoods = collectionGoodsV2Service.findByUidAndAuctionId(uid, id+"",
                    Constant.SOURCE_TYPE_JD);
            extraVO.setCollected(collectionGoods != null ? true : false);
        }
        // 图文详情
        extraVO.setDetailUrl("https://in.m.jd.com/product/jieshao/video/" + id + ".html");
        // 商品链接
        String h5Url = String.format("http://%s%s?uid=%s&id=%s", configService.getH5Host(acceptData.getSystem()),
                Constant.systemCommonConfig.getShareGoodsPagePathJD(), "", id + "");
        try {
            extraVO.setH5Url(HttpUtil.getShortLink(h5Url));
        } catch (Exception e) {
            extraVO.setH5Url(h5Url);
        }
        String helpLink = null;
        extraVO.setFanliValid(true);
        if (StringUtil.isNullOrEmpty(helpLink)) {
            helpLink = configService.getValue(ConfigKeyEnum.noRebateHelpLink.getKey(), acceptData.getSystem());
        }
        ShareVO shareInfoVO = new ShareVO();
        shareInfoVO.setHelpLink(helpLink);
        extraVO.setShare(shareInfoVO);
        // 判断vip
        if (uid != null) {
            extraVO.setVip(userVIPInfoService.isVIP(uid));
        }
        JSONObject object = new JSONObject();
        object.put("extra", JsonUtil.getApiCommonGson().toJson(extraVO));
        object.put("goods", JsonUtil.getApiCommonGson().toJson(goodsDetail));
        out.print(JsonUtil.loadTrueResult(object.toString()));
        final JDGoods goods = jdGoods;
        ThreadUtil.run(new Runnable() {
            public void run() {
                // 添加浏览记录
                try {
                    scanHistoryV2Service.addJDScanHistory(uid, acceptData.getDevice(), goods);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    /**
     * 拼多多商品详情
     *
     * @param acceptData
     * @param id
     * @param uid
     * @param from
     * @param out
     */
    private void getDetialPDD(WXMPAcceptData acceptData, Long id, Long uid, String from, PrintWriter out) {
        PDDGoodsDetail pddGoods = null; //PinDuoDuoApiUtil.getGoodsDetail(id);
        if (pddGoods == null) {
            out.print(JsonUtil.loadFalseResult(2, "商品不存在"));
            return;
        }
        GoodsMoneyConfigParamsDTO paramsDTO = orderHongBaoMoneyComputeService.getShowComputeRate(acceptData.getPlatform(),
                acceptData.getVersion(), acceptData.getSystem());
        paramsDTO.setMaxRewardRate(null);
        GoodsDetailVO goodsDetail = GoodsDetailVOFactory.convertPDDGoods(pddGoods, paramsDTO);
        if (goodsDetail != null && goodsDetail.getMoneyInfo() != null && userVIPInfoService.isVIP(uid)) {
            goodsDetail.getMoneyInfo().setFanliMoney(goodsDetail.getMoneyInfo().getMaxMoney());
            goodsDetail.getMoneyInfo().setShareMoney(
                    "¥" + PinDuoDuoUtil.getGoodsFanLiMoney(pddGoods, hongBaoManageService.getShareRate(UserLevelEnum.superVIP, acceptData.getSystem())));
        }
        if (goodsDetail.getCouponInfo() != null) {
            List<CouponInfoVO> list = new ArrayList<>();
            list.add(goodsDetail.getCouponInfo());
            goodsDetail.setCouponInfoList(list);
        }
        // 奖励券返利
        RewardCouponVO rewardCoupon = new RewardCouponVO();
        rewardCoupon.setMaxMoney(goodsDetail.getMoneyInfo().getMaxMoney());
        rewardCoupon.setDesc("返");
        OtherInfo otherInfo = new OtherInfo();
        otherInfo.setRewardCoupon(rewardCoupon);
        goodsDetail.setOtherInfo(otherInfo);
        CouponInfoVO couponInfo = goodsDetail.getCouponInfo();
        PDDConvertLinkResultVO convertUrl = null;
        if (couponInfo != null) {
            convertUrl = PinDuoDuoApiUtil.convert(pddGoods.getGoodsSign(), pidManager.getPidCache(acceptData.getSystem(), Constant.SOURCE_TYPE_PDD, SystemPIDInfo.PidType.coupon), null, false);
            if (convertUrl != null)
                couponInfo.setLink(convertUrl.getUrl());
        }
        ShopInfoVO shopInfo = goodsDetail.getShopInfo();
        if (shopInfo != null) {
            if (shopInfo.getId() == null || shopInfo.getScoreGoods() == null || shopInfo.getScoreLogistics() == null
                    || shopInfo.getScoreSeller() == null) {
                goodsDetail.setShopInfo(null);
            }
        }
        GoodsDetailExtraVO extraVO = new GoodsDetailExtraVO();
        extraVO.setDetailUrl("http://apph5.banliapp.com/apppage/goods_img_pdd.html?id=" + id);
        String salesTip = pddGoods.getSalesTip();
        if (!StringUtil.isNullOrEmpty(salesTip)) {
            int indexOf = salesTip.indexOf("+");
            if (indexOf > 0) {
                salesTip = salesTip.substring(0, indexOf);
            }
            int totalSales = 0;
            if (salesTip.contains("万")) {
                salesTip = salesTip.substring(0, salesTip.indexOf("万"));
                totalSales = (int) (Float.parseFloat(salesTip) * 10000);
            } else {
                totalSales = Integer.parseInt(salesTip);
            }
            List<ShamUser> listShareUser = new ArrayList<ShamUser>();
            MoneyInfoVO moneyInfo = goodsDetail.getMoneyInfo();
            if (moneyInfo != null) {
                String shareMoney = moneyInfo.getShareMoney().replaceAll("¥", "");
                if (totalSales >= 50000) {
                    listShareUser = shamUserService.listRandShareUser(10, new BigDecimal(shareMoney), 1, 5);
                }
            }
            extraVO.setListShareUser(listShareUser);
            // 领券人列表
            List<ShamUser> listCouponUser = new ArrayList<ShamUser>();
            if (goodsDetail.isHasCoupon() && totalSales >= 50000) {
                listCouponUser = shamUserService.listRandCouponUser(5, 1, 300);
            }
            extraVO.setListCouponUser(listCouponUser);
        }
        if (uid != null) {
            // 是否加入收藏
            CollectionGoodsV2 collectionGoods = collectionGoodsV2Service.findByUidAndAuctionId(uid, id+"",
                    Constant.SOURCE_TYPE_PDD);
            extraVO.setCollected(collectionGoods != null ? true : false);
        }
        // 分享路径
        String h5Url = String.format("http://%s%s?uid=%s&id=%s", configService.getH5Host(acceptData.getSystem()),
                Constant.systemCommonConfig.getShareGoodsPagePathPDD(), "", id + "");
        try {
            extraVO.setH5Url(HttpUtil.getShortLink(h5Url));
        } catch (Exception e) {
            extraVO.setH5Url(h5Url);
        }
        String helpLink = null;
        extraVO.setFanliValid(true);
        extraVO.setShareValid(true);
        if (StringUtil.isNullOrEmpty(helpLink)) {
            helpLink = configService.getValue(ConfigKeyEnum.noRebateHelpLink.getKey(), acceptData.getSystem());
        }
        ShareVO shareInfoVO = new ShareVO();
        shareInfoVO.setHelpLink(helpLink);
        extraVO.setShare(shareInfoVO);
        // 判断vip
        if (uid != null) {
            extraVO.setVip(userVIPInfoService.isVIP(uid));
        }
        if (convertUrl != null) {
            extraVO.setCouponJumpLink(convertUrl.getUrl());
            extraVO.setNativeCouponJumpLink(PinDuoDuoUtil.getAndroidNativeURI(convertUrl.getUrl()));
        }
        JSONObject object = new JSONObject();
        object.put("extra", JsonUtil.getApiCommonGson().toJson(extraVO));
        object.put("goods", JsonUtil.getApiCommonGson().toJson(goodsDetail));
        out.print(JsonUtil.loadTrueResult(object.toString()));
        ThreadUtil.run(new Runnable() {
            public void run() {
                try {
                    scanHistoryV2Service.addPDDScanHistory(uid, acceptData.getDevice(), pddGoods);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    /**
     * 商品详情推荐(猜你喜欢 + 推荐)
     *
     * @param acceptData
     * @param id
     * @param out
     */
    @RequestMapping(value = "getRecommendGoods", method = RequestMethod.POST)
    public void getRecommendGoods(WXMPAcceptData acceptData, long id, Integer goodsType, PrintWriter out) {
        if (goodsType == null || goodsType < 2 || goodsType > 3) {
            out.print(JsonUtil.loadFalseResult(1, "请传递正确平台参数"));
            return;
        }
        try {
            // 京东
            if (goodsType == Constant.SOURCE_TYPE_JD) {
                JSONObject data = new JSONObject();
                data.put("listGuess", JsonUtil.getApiCommonGson().toJson(new ArrayList<GoodsDetailVO>()));
                List<JDGoods> list = JDUtil.getRecommendGoodsById(id);
                if (list == null) {
                    list = new ArrayList<JDGoods>();
                } else if (list.size() > 10) {
                    list = list.subList(0, 10);
                }
                GoodsMoneyConfigParamsDTO paramsDTO = orderHongBaoMoneyComputeService.getShowComputeRate(acceptData.getPlatform(),
                        acceptData.getVersion(), acceptData.getSystem());
                List<GoodsDetailVO> listDetailVO = new ArrayList<GoodsDetailVO>();
                for (JDGoods goods : list) {
                    listDetailVO.add(GoodsDetailVOFactory.convertJDGoods(goods, paramsDTO));
                }
                // 取偶数个数据
                if (listDetailVO.size() % 2 != 0) {
                    listDetailVO.remove(listDetailVO.size() - 1);
                }
                data.put("listQuality", JsonUtil.getApiCommonGson().toJson(listDetailVO));
                out.print(JsonUtil.loadTrueResult(data));
                return;
            }
            // 拼多多
            if (goodsType == Constant.SOURCE_TYPE_PDD) {
                JSONObject data = new JSONObject();
                data.put("listGuess", JsonUtil.getApiCommonGson().toJson(new ArrayList<GoodsDetailVO>()));
                List<GoodsDetailVO> listDetailVO = new ArrayList<GoodsDetailVO>();
                List<Long> goodsIdList = PinDuoDuoUtil.getRecommendGoodsId(id);
                if (goodsIdList != null && goodsIdList.size() > 0) {
                    PDDSearchFilter pddfilter = new PDDSearchFilter();
                    pddfilter.setPage(1);
                    pddfilter.setPageSize(Constant.PAGE_SIZE);
                    Long[] strings = new Long[goodsIdList.size()];
                    pddfilter.setGoodsIdList(goodsIdList.toArray(strings));
                    PDDGoodsResult result = PinDuoDuoApiUtil.searchGoods(pddfilter, Constant.PDD_SEARCH_CUSTOMER_PARAMS);
                    if (result != null) {
                        List<PDDGoodsDetail> goodsList = result.getGoodsList();
                        if (goodsList != null && goodsList.size() > 0) {
                            if (goodsList.size() > 10) {
                                goodsList = goodsList.subList(0, 10);
                            }
                            GoodsMoneyConfigParamsDTO paramsDTO = orderHongBaoMoneyComputeService
                                    .getShowComputeRate(acceptData.getPlatform(), acceptData.getVersion(), acceptData.getSystem());
                            for (PDDGoodsDetail goods : goodsList) {
                                listDetailVO.add(GoodsDetailVOFactory.convertPDDGoods(goods, paramsDTO));
                            }
                        }
                    }
                }
                // 取偶数个数据
                if (listDetailVO.size() % 2 != 0) {
                    listDetailVO.remove(listDetailVO.size() - 1);
                }
                data.put("listQuality", JsonUtil.getApiCommonGson().toJson(listDetailVO));
                out.print(JsonUtil.loadTrueResult(data));
                return;
            }
        } catch (Exception e) {
            LogHelper.errorDetailInfo(e);
            JSONObject data = new JSONObject();
            data.put("listQuality", new JSONArray());
            data.put("listGuess", new JSONArray());
            out.print(JsonUtil.loadTrueResult(data));
        }
    }
    /**
     * 获取商品详情
     *
     * @param acceptData
     * @param goodsId    商品id
     * @param uid        邀请码
     * @param goodsType  商品类型
     * @param from       页面来源
     * @param out
     */
    @RequestMapping(value = "getBuyLink", method = RequestMethod.POST)
    public void getBuyLink(WXMPAcceptData acceptData, String goodsId, Integer goodsType, String from, String couponUrl,
                           Long uid, String inviteCode, PrintWriter out) {
        if (goodsId == null || goodsType == null) {
            out.print(JsonUtil.loadFalseResult(1, "商品信息传递错误"));
            return;
        }
        // 判断是自购 还是根据邀请码
        boolean share = false;
        String subUnionId = "";
        if (uid != null) {
            UserInfo user = userInfoService.getUserByIdWithMybatis(uid);
            if (user != null && user.getState() != UserInfo.STATE_NORMAL) {
                out.print(JsonUtil.loadFalseResult(Constant.CODE_FORBIDDEN_USER, Constant.FORBIDDEN_USER_REASON_DESC));
                return;
            }
            subUnionId = uid.toString();
        } else if ((uid == null || uid < 1) && !StringUtil.isNullOrEmpty(inviteCode)) {
            try {
                UserInfo user = userInfoExtraService.getUserByInviteCode(inviteCode);
                if (user != null && user.getState() == UserInfo.STATE_NORMAL) {
                    share = true;
                    subUnionId = user.getId().toString();
                }
            } catch (UserInfoExtraException e) {
                e.printStackTrace();
            }
        }
        String jumpLink = null;
        if (goodsType.intValue() == Constant.SOURCE_TYPE_JD) { // 京东
            JDGoods goods = jdGoodsCacheUtil.getGoodsInfo(goodsId);
            if (goods == null) {
                out.print(JsonUtil.loadFalseResult(2, "商品已下架"));
                return;
            }
            String materialId = "https://item.jd.com/" + goodsId + ".html";
            if (StringUtil.isNullOrEmpty(couponUrl)) {
                JDCouponInfo couponInfo = JDUtil.getShowCouponInfo(goods.getCouponInfoList(), goods.getPrice());
                if (couponInfo != null) {
                    couponUrl = couponInfo.getLink();
                }
            }
            long position = Long.parseLong(pidManager.getPidCache(acceptData.getSystem(), Constant.SOURCE_TYPE_JD, SystemPIDInfo.PidType.fanli));
            if (share) {
                position = Long.parseLong(pidManager.getPidCache(acceptData.getSystem(), Constant.SOURCE_TYPE_JD, SystemPIDInfo.PidType.share));
            }
            String jdLink = null;
            try {
                jdLink = JDApiUtil.convertLinkWithSubUnionId(materialId, couponUrl, null, position + "", subUnionId);
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                jumpLink = "/pages/union/proxy/proxy?spreadUrl=" + URLEncoder.encode(jdLink, "UTF-8");
            } catch (Exception e) {
                LogHelper.errorDetailInfo(e);
            }
        } else if (goodsType.intValue() == Constant.SOURCE_TYPE_PDD) { // 拼多多
            PDDGoodsDetail goods = pinDuoDuoCacheUtil.getGoodsInfo(goodsId);
            if (goods == null) {
                out.print(JsonUtil.loadFalseResult(2, "商品已下架"));
                return;
            }
            String position = pidManager.getPidCache(acceptData.getSystem(), Constant.SOURCE_TYPE_PDD, SystemPIDInfo.PidType.fanli);
            if (share) {
                position = pidManager.getPidCache(acceptData.getSystem(), Constant.SOURCE_TYPE_PDD, SystemPIDInfo.PidType.share);
            }
            jumpLink = PinDuoDuoApiUtil.convertWXMP(goodsId, position, subUnionId);
        } else {
            out.print(JsonUtil.loadFalseResult(1, "参数传递错误"));
            return;
        }
        if (StringUtil.isNullOrEmpty(jumpLink)) {
            out.print(JsonUtil.loadFalseResult(1, "创建购买信息失败"));
            return;
        }
        JSONObject data = new JSONObject();
        data.put("goodsType", goodsType);
        data.put("jumpLink", jumpLink);
        out.print(JsonUtil.loadTrueResult(data));
    }
    /**
     * 分享商品海报
     *
     * @param acceptData
     * @param goodsId
     * @param goodsType
     * @param from
     * @param type
     * @param uid
     * @param out
     */
    @RequestMapping(value = "sharePoster", method = RequestMethod.POST)
    public void sharePoster(WXMPAcceptData acceptData, String goodsId, Integer goodsType, String from, Integer type,
                            Long uid, PrintWriter out) {
        if (uid == null || uid < 1) {
            out.print(JsonUtil.loadFalseResult(1, "用户未登录"));
            return;
        }
        if (goodsId == null || goodsType == null) {
            out.print(JsonUtil.loadFalseResult(1, "商品信息传递错误"));
            return;
        }
        if (type == null || type < 1 || type > 2) {
            out.print(JsonUtil.loadFalseResult(1, "分享类型错误"));
            return;
        }
        UserInfo user = userInfoService.getUserByIdWithMybatis(uid);
        if (user != null && user.getState() != UserInfo.STATE_NORMAL) {
            out.print(JsonUtil.loadFalseResult(Constant.CODE_FORBIDDEN_USER, Constant.FORBIDDEN_USER_REASON_DESC));
            return;
        }
        String inviteCode = userInfoExtraService.getInviteCodeByUid(uid);
        if (StringUtil.isNullOrEmpty(inviteCode)) {
            out.print(JsonUtil.loadFalseResult(1, "邀请码未激活"));
            return;
        }
        if (goodsType.intValue() == Constant.SOURCE_TYPE_JD) { // 京东
            createPosterJD(acceptData, goodsId, goodsType, from, type, user, inviteCode, out);
        } else if (goodsType.intValue() == Constant.SOURCE_TYPE_PDD) { // 拼多多
            createPosterPDD(acceptData, goodsId, goodsType, from, type, user, inviteCode, out);
        } else {
            out.print(JsonUtil.loadFalseResult(1, "参数传递错误"));
        }
    }
    /**
     * 创建京东分享海报
     */
    private void createPosterJD(WXMPAcceptData acceptData, String goodsId, Integer goodsType, String from, Integer type,
                                UserInfo user, String inviteCode, PrintWriter out) {
        JDGoods jdGoods = jdGoodsCacheUtil.getGoodsInfo(goodsId);
        if (jdGoods == null) {
            out.print(JsonUtil.loadFalseResult(2, "商品已下架"));
            return;
        }
        GoodsMoneyConfigParamsDTO paramsDTO = orderHongBaoMoneyComputeService.getShowComputeRate(acceptData.getPlatform(),
                acceptData.getVersion(), acceptData.getSystem());
        GoodsDetailVO goods = GoodsDetailVOFactory.convertJDGoods(jdGoods, paramsDTO);
        String scene = goodsType + "#" + goodsId + "#" + inviteCode;
        FileUploadResult uploadResult = null;
        if (type == 1) {
            String erCodeUrl = "https://wxmp.banliapp.com/goods?i=" + scene;
            uploadResult = qrCodeService.drawGoodsPoster(erCodeUrl, user.getPortrait(), goods);
        } else {
            String acessToken = WXUtil.getAcessToken(Constant.WXMP_APP_INFO.getAppId(),
                    Constant.WXMP_APP_INFO.getAppSecret());
            InputStream xcxCode = WXXCXUtil.getXCXCode(acessToken, "/pages/goods/goods", scene);
            uploadResult = qrCodeService.drawGoodsPosterXCX(xcxCode, user, goods);
        }
        try {
            userShareGoodsRecordService.saveShareRecord(user.getId(), CommonGoodsFactory.create(jdGoods));
        } catch (UserShareGoodsRecordException e) {
            e.printStackTrace();
        }
        String posterLink = uploadResult.getUrl();
        JSONObject data = new JSONObject();
        data.put("posterLink", posterLink);
        out.print(JsonUtil.loadTrueResult(data));
        com.yeshi.fanli.util.ThreadUtil.run(new Runnable() {
            @Override
            public void run() {
                // 异步操作 添加分享记录
                UserShareGoodsHistory history = new UserShareGoodsHistory();
                history.setUser(new UserInfo(user.getId()));
                history.setHongbao(new BigDecimal(goods.getMoneyInfo().getShareMoney().replace("¥", "")));
                history.setCreateTime(new Date());
                history.setGoodsType(Constant.SOURCE_TYPE_JD);
                history.setTkCode(null);
                history.setLink(null);
                history.setQuanLink(null);
                history.setGoodsId(goodsId+"");
                history.setPostPicture(goods.getPicUrl());
                history.setPictures(JsonUtil.getGson().toJson(goods.getImgList()));
                history.setShareImg(posterLink);
                shareGoodsService.addShareGoodsHistory(history);
            }
        });
    }
    /**
     * 创建拼多多分享海报
     */
    private void createPosterPDD(WXMPAcceptData acceptData, String goodsId, Integer goodsType, String from, Integer type,
                                 UserInfo user, String inviteCode, PrintWriter out) {
        PDDGoodsDetail pddGoods = pinDuoDuoCacheUtil.getGoodsInfo(goodsId);
        if (pddGoods == null) {
            out.print(JsonUtil.loadFalseResult(2, "商品已下架"));
            return;
        }
        GoodsMoneyConfigParamsDTO paramsDTO = orderHongBaoMoneyComputeService.getShowComputeRate(acceptData.getPlatform(),
                acceptData.getVersion(), acceptData.getSystem());
        GoodsDetailVO goods = GoodsDetailVOFactory.convertPDDGoods(pddGoods, paramsDTO);
        String scene = goodsType + "#" + goodsId + "#" + inviteCode;
        FileUploadResult uploadResult = null;
        if (type == 1) {
            String erCodeUrl = "https://wxmp.banliapp.com/goods?info=" + scene;
            uploadResult = qrCodeService.drawGoodsPoster(erCodeUrl, user.getPortrait(), goods);
        } else {
            String acessToken = WXUtil.getAcessToken(Constant.WXMP_APP_INFO.getAppId(),
                    Constant.WXMP_APP_INFO.getAppSecret());
            InputStream xcxCode = WXXCXUtil.getXCXCode(acessToken, "/pages/goods/goods", scene);
            uploadResult = qrCodeService.drawGoodsPosterXCX(xcxCode, user, goods);
        }
        try {
            userShareGoodsRecordService.saveShareRecord(user.getId(), CommonGoodsFactory.create(pddGoods));
        } catch (UserShareGoodsRecordException e) {
            e.printStackTrace();
        }
        String posterLink = uploadResult.getUrl();
        JSONObject data = new JSONObject();
        data.put("posterLink", posterLink);
        out.print(JsonUtil.loadTrueResult(data));
        // 异步操作
        com.yeshi.fanli.util.ThreadUtil.run(new Runnable() {
            @Override
            public void run() {
                // 异步操作 添加分享记录
                UserShareGoodsHistory history = new UserShareGoodsHistory();
                history.setUser(new UserInfo(user.getId()));
                history.setHongbao(new BigDecimal(goods.getMoneyInfo().getShareMoney().replace("¥", "")));
                history.setCreateTime(new Date());
                history.setGoodsType(Constant.SOURCE_TYPE_PDD);
                history.setTkCode(null);
                history.setLink(null);
                history.setQuanLink(null);
                history.setGoodsId(goodsId+"");
                history.setPostPicture(goods.getPicUrl());
                history.setPictures(JsonUtil.getGson().toJson(goods.getImgList()));
                history.setShareImg(posterLink);
                shareGoodsService.addShareGoodsHistory(history);
            }
        });
    }
}