| | |
| | | package com.yeshi.fanli.service.impl.taobao.dataoke;
|
| | |
|
| | | import java.util.ArrayList;
|
| | | import java.util.Collections;
|
| | | import java.util.Comparator;
|
| | | import java.util.Date;
|
| | | import java.util.HashMap;
|
| | | import java.util.List;
|
| | | import java.util.Map;
|
| | |
|
| | | import javax.annotation.Resource;
|
| | |
|
| | | import org.springframework.stereotype.Service;
|
| | | import org.springframework.transaction.annotation.Transactional;
|
| | |
|
| | | import com.yeshi.fanli.dao.mybatis.taobao.dataoke.DaTaoKeDetailMapper;
|
| | | import com.yeshi.fanli.dto.dataoke.DaTaoKeApiResult;
|
| | | import com.yeshi.fanli.dto.dataoke.DaTaoKeGoodsResult;
|
| | | import com.yeshi.fanli.entity.taobao.dataoke.DaTaoKeDetail;
|
| | | import com.yeshi.fanli.entity.taobao.dataoke.DaTaoKeDetailV2;
|
| | | import com.yeshi.fanli.log.LogHelper;
|
| | | import com.yeshi.fanli.service.inter.taobao.dataoke.DaTaoKeGoodsDetailService;
|
| | | import com.yeshi.fanli.service.inter.taobao.dataoke.DaTaoKeGoodsService;
|
| | | import com.yeshi.fanli.util.RedisManager;
|
| | | import com.yeshi.fanli.util.dataoke.DaTaoKeApiUtil;
|
| | | import com.yeshi.fanli.util.taobao.DaTaoKeUtil;
|
| | |
|
| | | @Service
|
| | | public class DaTaoKeGoodsServiceImpl implements DaTaoKeGoodsService {
|
| | |
|
| | | @Resource
|
| | | private DaTaoKeDetailMapper daTaoKeDetailMapper;
|
| | |
|
| | | @Resource
|
| | | private DaTaoKeGoodsDetailService daTaoKeGoodsDetailService;
|
| | |
|
| | | @Resource
|
| | | private RedisManager redisManager;
|
| | |
|
| | | @Override
|
| | | public void startSyncGoods() {
|
| | | // 判断是否有正在进行的更新
|
| | | String key1 = "dataoke-updating";
|
| | | // if (!StringUtil.isNullOrEmpty(redisManager.getCommonString(key1)))
|
| | | // return;
|
| | |
|
| | | // 开始更新
|
| | | redisManager.cacheCommonString(key1, "1", 60 * 20);
|
| | | long firstTime = System.currentTimeMillis() - 1000 * 60 * 5L;
|
| | | int totalCount = 0;
|
| | | for (int p = 1; p <= 2000; p++) {// 10W数据
|
| | | DaTaoKeApiResult result = DaTaoKeApiUtil.goodsList(p);
|
| | | if (result.getDetailList().size() < 50)// 更新完成
|
| | | {
|
| | | redisManager.removeCommonString(key1);
|
| | | break;
|
| | | }
|
| | | addGoodsList(result.getDetailList());
|
| | | totalCount += result.getDetailList().size();
|
| | | }
|
| | |
|
| | | LogHelper.test("大淘客总共更新数据数量:" + totalCount);
|
| | | // 清除过期数据
|
| | | if (totalCount > 50000)// 保证有5w数据再清除过期
|
| | | {
|
| | | daTaoKeDetailMapper.deleteByMinUpdateTime(firstTime);
|
| | | LogHelper.test("删除大淘客过期数据:" + totalCount);
|
| | | }
|
| | | }
|
| | |
|
| | | @Transactional
|
| | | private void addGoodsList(List<DaTaoKeDetail> goodsList) {
|
| | | private List<DaTaoKeDetail> reSearchDetails(List<DaTaoKeDetail> list) {
|
| | | Map<Long, DaTaoKeDetail> map = new HashMap<>();
|
| | | List<Long> idList = new ArrayList<>();
|
| | | for (DaTaoKeDetail goods : goodsList) {
|
| | | goods.setUpdateTime(new Date());
|
| | | idList.add(goods.getId());
|
| | | }
|
| | | // 批量删除
|
| | | daTaoKeDetailMapper.deleteByIdList(idList);
|
| | | // 批量插入
|
| | | daTaoKeDetailMapper.insertByBatch(goodsList);
|
| | | if (list != null) {
|
| | | for (DaTaoKeDetail detail : list) {
|
| | | idList.add(detail.getId());
|
| | | map.put(detail.getId(), detail);
|
| | | }
|
| | | List<DaTaoKeDetail> detailList = daTaoKeGoodsDetailService.listByIds(idList);
|
| | | if (detailList != null)
|
| | | for (DaTaoKeDetail dk : detailList) {
|
| | | dk.setUpdateTime(new Date());// 增加更新时间
|
| | | dk.setSalesNum(map.get(dk.getId()).getSalesNum());// 更改销量);
|
| | | }
|
| | | return detailList;
|
| | | } else
|
| | | return null;
|
| | | }
|
| | |
|
| | | @Override
|
| | | public List<DaTaoKeDetail> getCurrentSalesRankGoodsList(Integer cid) {
|
| | | // 缓存
|
| | | String key = "dataoke-goods-shishirexiao-" + cid;
|
| | | List<DaTaoKeDetail> list = redisManager.getObjList(DaTaoKeDetail.class, key);
|
| | | if ((list != null && list.size() > 0
|
| | | && System.currentTimeMillis() - list.get(0).getUpdateTime().getTime() > 1000 * 60 * 20) || list == null
|
| | | || list.size() == 0)// 超过20分钟未更新
|
| | | {
|
| | | list = DaTaoKeUtil.getCurrentSalesRank(cid);
|
| | | list = reSearchDetails(list);
|
| | | if (list != null && list.size() > 0)
|
| | | redisManager.saveObjList(list, key, null);// 长期缓存
|
| | | return list;
|
| | | } else
|
| | | return list;
|
| | |
|
| | | }
|
| | |
|
| | | @Override
|
| | | public List<DaTaoKeDetail> getCurrentDaySalesRankGoodsList(Integer cid) {
|
| | |
|
| | | // 缓存
|
| | | String key = "dataoke-goods-jinrirexiao-" + cid;
|
| | | List<DaTaoKeDetail> list = redisManager.getObjList(DaTaoKeDetail.class, key);
|
| | | if ((list != null && list.size() > 0
|
| | | && System.currentTimeMillis() - list.get(0).getUpdateTime().getTime() > 1000 * 60 * 20) || list == null
|
| | | || list.size() == 0)// 超过20分钟未更新
|
| | | {
|
| | | list = DaTaoKeUtil.getCurrentDaySalesRank(cid);
|
| | | list = reSearchDetails(list);
|
| | | if (list != null && list.size() > 0)
|
| | | redisManager.saveObjList(list, key, null);// 长期缓存
|
| | | return list;
|
| | | } else
|
| | | return list;
|
| | |
|
| | | }
|
| | |
|
| | | @Override
|
| | | public List<DaTaoKeDetail> getCurrentHotSalesRankGoodsList() {
|
| | | // 缓存
|
| | | String key = "dataoke-goods-rexiao";
|
| | | List<DaTaoKeDetail> list = redisManager.getObjList(DaTaoKeDetail.class, key);
|
| | | if ((list != null && list.size() > 0
|
| | | && System.currentTimeMillis() - list.get(0).getUpdateTime().getTime() > 1000 * 60 * 20) || list == null
|
| | | || list.size() == 0)// 超过20分钟未更新
|
| | | {
|
| | | list = DaTaoKeUtil.getCurrentHotSalesRank();
|
| | | LogHelper.test("热销数量:" + list.size());
|
| | | list = reSearchDetails(list);
|
| | | if (list != null && list.size() > 0)
|
| | | redisManager.saveObjList(list, key, null);// 长期缓存
|
| | | return list;
|
| | | } else
|
| | | return list;
|
| | | }
|
| | |
|
| | | @Override
|
| | | public List<DaTaoKeDetail> getGoodsNotInList(Long cid, List<Long> listId, int count) {
|
| | | return daTaoKeDetailMapper.getGoodsNotInList(cid, listId, count);
|
| | | }
|
| | |
|
| | | @Override
|
| | | public List<DaTaoKeDetail> listBySellerId(long start, int count, Long sellerId){
|
| | | return daTaoKeDetailMapper.listBySellerId(start, count, sellerId);
|
| | | }
|
| | | |
| | | @Override
|
| | | public List<DaTaoKeDetailV2> getSearchDiscoveryGoods(String keyWords){
|
| | | String key = "dataoke-goods-searchdiscovery-"+ keyWords;
|
| | | List<DaTaoKeDetailV2> list = redisManager.getObjList(DaTaoKeDetailV2.class, key);
|
| | | if ( list == null || list.size() == 0) {
|
| | | DaTaoKeGoodsResult search = DaTaoKeApiUtil.search(keyWords, null, null, null, 1, 10, 0);
|
| | | if (search != null) {
|
| | | list = search.getGoodsList();
|
| | | if (list != null && list.size() > 0) {
|
| | | Comparator<DaTaoKeDetailV2> cm = new Comparator<DaTaoKeDetailV2>() {
|
| | | @Override
|
| | | public int compare(DaTaoKeDetailV2 o1, DaTaoKeDetailV2 o2) {
|
| | | int diff = o1.getHotPush() - o2.getHotPush();
|
| | | if (diff > 0) {
|
| | | return -1;
|
| | | } else if (diff < 0) {
|
| | | return 1;
|
| | | }
|
| | | return 0;
|
| | | }
|
| | | };
|
| | | |
| | | Collections.sort(list, cm);
|
| | | |
| | | if (list.size() > 3) |
| | | list = list.subList(0, 3);
|
| | | |
| | | // 缓存 20分钟
|
| | | redisManager.saveObjList(list, key, 1000 * 60 * 20);
|
| | | }
|
| | | return list;
|
| | | }
|
| | | } |
| | | return list;
|
| | | }
|
| | | |
| | | }
|