admin
2025-02-25 30d8e227e8d823b6c38c3b9c90ac2df03b63befe
fanli/src/main/java/com/yeshi/fanli/service/impl/jd/JDGoodsServiceImpl.java
@@ -1,236 +1,238 @@
package com.yeshi.fanli.service.impl.jd;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.yeshi.fanli.dto.jd.JDFilter;
import com.yeshi.fanli.dto.jd.JDSearchFilter;
import com.yeshi.fanli.dto.jd.JDSearchResult;
import com.yeshi.fanli.entity.bus.clazz.GoodsClass;
import com.yeshi.fanli.entity.jd.JDGoods;
import com.yeshi.fanli.exception.jd.JDGoodsException;
import com.yeshi.fanli.service.inter.config.ConfigService;
import com.yeshi.fanli.service.inter.jd.JDGoodsService;
import com.yeshi.fanli.service.inter.order.config.HongBaoManageService;
import com.yeshi.fanli.tag.PageEntity;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.jd.JDApiUtil;
import com.yeshi.fanli.util.jd.JDUtil;
@Service
public class JDGoodsServiceImpl implements JDGoodsService {
   @Resource
   private ConfigService configService;
   @Resource
   private HongBaoManageService hongBaoManageService;
   private Map<String, Long> countMap = new HashMap<String, Long>();
   private static final Map<Long, String> cidMap = new HashMap<Long, String>();
   static {
      cidMap.put(1L, "2,16,1,3");// 精选
      cidMap.put(2L, "737");// 电器: 家用电器
      cidMap.put(3L, "652,670");// 数码: 数码/电脑、办公
      cidMap.put(4L, "9987");// 手机:手机通讯
      cidMap.put(5L, "12218");// 生鲜
      cidMap.put(6L, "1315");// 服饰: 服饰内衣
      cidMap.put(7L, "1319,6233");// 母婴: 母婴/玩具乐器
      cidMap.put(8L, "1713");// 图书
      cidMap.put(9L, "6196");// 厨具
      cidMap.put(10L, "1320");// 食品: 食品饮料
      cidMap.put(11L, "1316,16750");// 美妆: 美妆护肤/个人护理
      cidMap.put(12L, "15901,1620,1672,12259,9192");// 百货:家庭清洁、纸品/居家日用/礼品/酒类/医药保健
      cidMap.put(13L, "11729");// 鞋靴
      cidMap.put(14L, "1318");// 运动:运动户外
      cidMap.put(15L, "17329");// 箱包: 箱包皮具
      cidMap.put(16L, "6994");// 宠物: 宠物生活
      cidMap.put(17L, "9855,9847,15248");// 家居: 家装建材/家具/家纺
      cidMap.put(18L, "6728");// 汽车:汽车用品
   }
   @Override
   public List<GoodsClass> getSpecialClass() {
      List<GoodsClass> list = new ArrayList<GoodsClass>();
      list.add(new GoodsClass(1L, "精选"));
      list.add(new GoodsClass(2L, "电器"));
      list.add(new GoodsClass(3L, "数码"));
      list.add(new GoodsClass(4L, "手机"));
      list.add(new GoodsClass(5L, "生鲜"));
      list.add(new GoodsClass(6L, "服饰"));
      list.add(new GoodsClass(7L, "母婴"));
      list.add(new GoodsClass(8L, "图书"));
      list.add(new GoodsClass(9L, "厨具"));
      list.add(new GoodsClass(10L, "食品"));
      list.add(new GoodsClass(11L, "美妆"));
      list.add(new GoodsClass(12L, "百货"));
      list.add(new GoodsClass(13L, "鞋靴"));
      list.add(new GoodsClass(14L, "运动"));
      list.add(new GoodsClass(15L, "箱包"));
      list.add(new GoodsClass(16L, "宠物"));
      list.add(new GoodsClass(17L, "家居"));
      list.add(new GoodsClass(18L, "汽车"));
      return list;
   }
   @Cacheable(value = "jdSpecialCache", key = "'specialSearch-'+#page+'-'+#cid")
   @Override
   @Transactional(rollbackFor=Exception.class)
   public List<JDGoods> specialSearch(Integer page, Long cid) throws JDGoodsException {
      if (cid == null) {
         throw new JDGoodsException(1, "分类id为空");
      }
      String jdcid = cidMap.get(cid);
      if (StringUtil.isNullOrEmpty(jdcid)) {
         throw new JDGoodsException(1, "分类id不存在");
      }
      // 精选
      if (cid == 1) {
         Integer categoryId = null;
         int pageTemp = 0;
         long addCount = 0;
         long totalCount = (long) (page * Constant.PAGE_SIZE);
         String[] arrayId = jdcid.split(",");
         for (int i = 0; i < arrayId.length; i++) {
            String id = arrayId[i];
            Long count = countMap.get(cid + "-" + id);
            if (count != null) {
               addCount += count;
            }
            if (count != null && totalCount > addCount) {
               pageTemp = (int) (addCount / Constant.PAGE_SIZE);
               continue; // 当前分类商品不足
            } else {
               page = page - pageTemp;
               categoryId = Integer.parseInt(id);
               break;
            }
         }
         if (categoryId == null) {
            return null;
         }
         JDSearchResult result = JDApiUtil.getJingFenGoods(page, categoryId);
         long count = 0;
         if (result != null) {
            PageEntity pageEntity = result.getPageEntity();
            if (pageEntity != null) {
               count = pageEntity.getTotalCount();
            }
         }
         long mcount = (count / Constant.PAGE_SIZE) * Constant.PAGE_SIZE;
         if (mcount == 0) {
            mcount = 20;
         }
         countMap.put(cid + "-" + categoryId, mcount);
         if (result == null) {
            return null;
         } else {
            return filterJDGoods(result.getGoodsList());
         }
      }
      if (!jdcid.contains(",")) {
         return search(page, Constant.PAGE_SIZE, jdcid);
      }
      // 多个分类id处理
      List<JDGoods> list = new ArrayList<JDGoods>();
      String[] arrayId = jdcid.split(",");
      for (int i = 0; i < arrayId.length; i++) {
         if (i >= 3) {
            break;
         }
         List<JDGoods> listGoods = search(page, 10, arrayId[i]);
         if (listGoods != null && listGoods.size() > 0) {
            list.addAll(listGoods);
         }
      }
      return filterJDGoods(list);
   }
   /**
    * 过滤商品
    *
    * @param goodsList
    * @return
    */
   private List<JDGoods> filterJDGoods(List<JDGoods> goodsList) {
      List<Long> skuIds = new ArrayList<>();
      for (JDGoods goods : goodsList) {
         skuIds.add(goods.getSkuId());
      }
      List<JDGoods> newGoodsList = JDApiUtil.listGoodsDetail(skuIds);
      if (newGoodsList != null && newGoodsList.size() > 0)
         return newGoodsList;
      return goodsList;
   }
   private List<JDGoods> search(int page, int pageSize, String jdcid) {
      JDSearchResult result = null;
      String way = configService.get("jd_api_search_key");
      if ("1".equals(way)) { // API搜索
         JDFilter filterAPI = new JDFilter();
         filterAPI.setPageIndex(page);
         filterAPI.setPageSize(pageSize);
         filterAPI.setCid1(Long.parseLong(jdcid));
         result = JDApiUtil.queryByKey(filterAPI);
      } else { // 网页爬取
         JDSearchFilter jdfilter = new JDSearchFilter();
         jdfilter.setPageNo(page);
         jdfilter.setPageSize(pageSize);
         jdfilter.setCategoryId(Integer.parseInt(jdcid));
         result = JDUtil.searchByKey(jdfilter);
      }
      if (result == null) {
         return null;
      } else {
         return result.getGoodsList();
      }
   }
   @Cacheable(value = "jdCache", key = "'getIndexJDGoods-'+#page")
   @Override
   public JDSearchResult getIndexJDGoods(int page) {
      JDSearchResult result = null;
      String way = configService.get("jd_api_search_key");
      // TODO 需要调整规则
      way = "0";
      if ("1".equals(way)) {
         JDFilter filterAPI = new JDFilter();
         filterAPI.setPageIndex(page);
         filterAPI.setPageSize(20);
         result = JDApiUtil.queryByKey(filterAPI);
      } else {
         // 网页爬取
         JDSearchFilter jdfilter = new JDSearchFilter();
         jdfilter.setPageNo(page);
         jdfilter.setPageSize(Constant.PAGE_SIZE);
         result =JDApiUtil.getJingFenGoods(page,15); //JDUtil.searchByKey(jdfilter);
      }
      if (result != null && result.getGoodsList() != null)
         Collections.shuffle(result.getGoodsList());
      return result;
   }
}
package com.yeshi.fanli.service.impl.jd;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import com.yeshi.fanli.entity.SystemEnum;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.yeshi.fanli.dto.jd.JDFilter;
import com.yeshi.fanli.dto.jd.JDSearchFilter;
import com.yeshi.fanli.dto.jd.JDSearchResult;
import com.yeshi.fanli.entity.bus.clazz.GoodsClass;
import com.yeshi.fanli.entity.jd.JDGoods;
import com.yeshi.fanli.entity.system.ConfigKeyEnum;
import com.yeshi.fanli.exception.jd.JDGoodsException;
import com.yeshi.fanli.service.inter.config.ConfigService;
import com.yeshi.fanli.service.inter.jd.JDGoodsService;
import com.yeshi.fanli.service.inter.order.config.HongBaoManageService;
import com.yeshi.common.entity.PageEntity;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.jd.JDApiUtil;
import com.yeshi.fanli.util.jd.JDUtil;
@Service
public class JDGoodsServiceImpl implements JDGoodsService {
   @Resource
   private ConfigService configService;
   @Resource
   private HongBaoManageService hongBaoManageService;
   private Map<String, Long> countMap = new HashMap<String, Long>();
   private static final Map<Long, String> cidMap = new HashMap<Long, String>();
   static {
      cidMap.put(1L, "2,16,1,3");// 精选
      cidMap.put(2L, "737");// 电器: 家用电器
      cidMap.put(3L, "652,670");// 数码: 数码/电脑、办公
      cidMap.put(4L, "9987");// 手机:手机通讯
      cidMap.put(5L, "12218");// 生鲜
      cidMap.put(6L, "1315");// 服饰: 服饰内衣
      cidMap.put(7L, "1319,6233");// 母婴: 母婴/玩具乐器
      cidMap.put(8L, "1713");// 图书
      cidMap.put(9L, "6196");// 厨具
      cidMap.put(10L, "1320");// 食品: 食品饮料
      cidMap.put(11L, "1316,16750");// 美妆: 美妆护肤/个人护理
      cidMap.put(12L, "15901,1620,1672,12259,9192");// 百货:家庭清洁、纸品/居家日用/礼品/酒类/医药保健
      cidMap.put(13L, "11729");// 鞋靴
      cidMap.put(14L, "1318");// 运动:运动户外
      cidMap.put(15L, "17329");// 箱包: 箱包皮具
      cidMap.put(16L, "6994");// 宠物: 宠物生活
      cidMap.put(17L, "9855,9847,15248");// 家居: 家装建材/家具/家纺
      cidMap.put(18L, "6728");// 汽车:汽车用品
   }
   @Override
   public List<GoodsClass> getSpecialClass() {
      List<GoodsClass> list = new ArrayList<GoodsClass>();
      list.add(new GoodsClass(1L, "精选"));
      list.add(new GoodsClass(2L, "电器"));
      list.add(new GoodsClass(3L, "数码"));
      list.add(new GoodsClass(4L, "手机"));
      list.add(new GoodsClass(5L, "生鲜"));
      list.add(new GoodsClass(6L, "服饰"));
      list.add(new GoodsClass(7L, "母婴"));
      list.add(new GoodsClass(8L, "图书"));
      list.add(new GoodsClass(9L, "厨具"));
      list.add(new GoodsClass(10L, "食品"));
      list.add(new GoodsClass(11L, "美妆"));
      list.add(new GoodsClass(12L, "百货"));
      list.add(new GoodsClass(13L, "鞋靴"));
      list.add(new GoodsClass(14L, "运动"));
      list.add(new GoodsClass(15L, "箱包"));
      list.add(new GoodsClass(16L, "宠物"));
      list.add(new GoodsClass(17L, "家居"));
      list.add(new GoodsClass(18L, "汽车"));
      return list;
   }
   @Cacheable(value = "jdSpecialCache", key = "'specialSearch-'+#page+'-'+#cid")
   @Override
   @Transactional(rollbackFor=Exception.class)
   public List<JDGoods> specialSearch(Integer page, Long cid,SystemEnum system) throws JDGoodsException {
      if (cid == null) {
         throw new JDGoodsException(1, "分类id为空");
      }
      String jdcid = cidMap.get(cid);
      if (StringUtil.isNullOrEmpty(jdcid)) {
         throw new JDGoodsException(1, "分类id不存在");
      }
      // 精选
      if (cid == 1) {
         Integer categoryId = null;
         int pageTemp = 0;
         long addCount = 0;
         long totalCount = (long) (page * Constant.PAGE_SIZE);
         String[] arrayId = jdcid.split(",");
         for (int i = 0; i < arrayId.length; i++) {
            String id = arrayId[i];
            Long count = countMap.get(cid + "-" + id);
            if (count != null) {
               addCount += count;
            }
            if (count != null && totalCount > addCount) {
               pageTemp = (int) (addCount / Constant.PAGE_SIZE);
               continue; // 当前分类商品不足
            } else {
               page = page - pageTemp;
               categoryId = Integer.parseInt(id);
               break;
            }
         }
         if (categoryId == null) {
            return null;
         }
         JDSearchResult result = JDApiUtil.getJingFenGoods(page, categoryId);
         long count = 0;
         if (result != null) {
            PageEntity pageEntity = result.getPageEntity();
            if (pageEntity != null) {
               count = pageEntity.getTotalCount();
            }
         }
         long mcount = (count / Constant.PAGE_SIZE) * Constant.PAGE_SIZE;
         if (mcount == 0) {
            mcount = 20;
         }
         countMap.put(cid + "-" + categoryId, mcount);
         if (result == null) {
            return null;
         } else {
            return filterJDGoods(result.getGoodsList());
         }
      }
      if (!jdcid.contains(",")) {
         return search(page, Constant.PAGE_SIZE, jdcid,system);
      }
      // 多个分类id处理
      List<JDGoods> list = new ArrayList<JDGoods>();
      String[] arrayId = jdcid.split(",");
      for (int i = 0; i < arrayId.length; i++) {
         if (i >= 3) {
            break;
         }
         List<JDGoods> listGoods = search(page, 10, arrayId[i],system);
         if (listGoods != null && listGoods.size() > 0) {
            list.addAll(listGoods);
         }
      }
      return filterJDGoods(list);
   }
   /**
    * 过滤商品
    *
    * @param goodsList
    * @return
    */
   private List<JDGoods> filterJDGoods(List<JDGoods> goodsList) {
      List<String> skuIds = new ArrayList<>();
      for (JDGoods goods : goodsList) {
         skuIds.add(goods.getItemId());
      }
      List<JDGoods> newGoodsList = JDApiUtil.listGoodsDetail(skuIds);
      if (newGoodsList != null && newGoodsList.size() > 0)
         return newGoodsList;
      return goodsList;
   }
   private List<JDGoods> search(int page, int pageSize, String jdcid, SystemEnum system) {
      JDSearchResult result = null;
      String way = configService.getValue(ConfigKeyEnum.jdApiSearchKey.getKey(),system);
      if ("1".equals(way)) { // API搜索
         JDFilter filterAPI = new JDFilter();
         filterAPI.setPageIndex(page);
         filterAPI.setPageSize(pageSize);
         filterAPI.setCid1(Long.parseLong(jdcid));
         result = JDApiUtil.queryByKey(filterAPI);
      } else { // 网页爬取
         JDSearchFilter jdfilter = new JDSearchFilter();
         jdfilter.setPageNo(page);
         jdfilter.setPageSize(pageSize);
         jdfilter.setCategoryId(Integer.parseInt(jdcid));
         result = JDUtil.searchByKey(jdfilter);
      }
      if (result == null) {
         return null;
      } else {
         return result.getGoodsList();
      }
   }
   @Cacheable(value = "jdCache", key = "'getIndexJDGoods-'+#page")
   @Override
   public JDSearchResult getIndexJDGoods(int page,SystemEnum system) {
      JDSearchResult result = null;
      String way = configService.getValue(ConfigKeyEnum.jdApiSearchKey.getKey(),system);
      // TODO 需要调整规则
      way = "0";
      if ("1".equals(way)) {
         JDFilter filterAPI = new JDFilter();
         filterAPI.setPageIndex(page);
         filterAPI.setPageSize(20);
         result = JDApiUtil.queryByKey(filterAPI);
      } else {
         // 网页爬取
         JDSearchFilter jdfilter = new JDSearchFilter();
         jdfilter.setPageNo(page);
         jdfilter.setPageSize(Constant.PAGE_SIZE);
         result =JDApiUtil.getJingFenGoods(page,125); //JDUtil.searchByKey(jdfilter);
      }
      if (result != null && result.getGoodsList() != null)
         Collections.shuffle(result.getGoodsList());
      return result;
   }
}