fanli/src/main/java/com/yeshi/fanli/dto/dataoke/DingDongQiangDTO.java
New file @@ -0,0 +1,40 @@ package com.yeshi.fanli.dto.dataoke; import java.util.List; import com.yeshi.fanli.entity.taobao.dataoke.DaTaoKeDetail; /** * 大淘客叮咚抢 * * @author Administrator * */ public class DingDongQiangDTO { private String time; private List<DaTaoKeDetail> goodsList; public DingDongQiangDTO(String time, List<DaTaoKeDetail> goodsList) { this.time = time; this.goodsList = goodsList; } public DingDongQiangDTO() { } public String getTime() { return time; } public void setTime(String time) { this.time = time; } public List<DaTaoKeDetail> getGoodsList() { return goodsList; } public void setGoodsList(List<DaTaoKeDetail> goodsList) { this.goodsList = goodsList; } } fanli/src/main/java/com/yeshi/fanli/entity/taobao/dataoke/DaTaoKeDetail.java
@@ -16,9 +16,19 @@ */ @Table("yeshi_ec_goods_dataoke") public class DaTaoKeDetail { public DaTaoKeDetail(Long id) { this.id = id; } public DaTaoKeDetail() { } @Column(name = "id") @SerializedName("ID") private Long id;// 大淘客ID @Column(name = "d_title") @SerializedName("D_title") private String dTitle;// 商品短标题 fanli/src/main/java/com/yeshi/fanli/job/UpdateDaTaoKeJob.java
@@ -1,27 +1,15 @@ package com.yeshi.fanli.job; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.annotation.Resource; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import com.yeshi.fanli.entity.bus.lable.BoutiqueAutoRule; import com.yeshi.fanli.entity.bus.lable.QualityFactory; import com.yeshi.fanli.entity.common.AdminUser; import com.yeshi.fanli.entity.taobao.TaoBaoGoodsBrief; import com.yeshi.fanli.entity.taobao.dataoke.DaTaoKeDetail; import com.yeshi.fanli.log.LogHelper; import com.yeshi.fanli.service.inter.lable.QualityFactoryService; import com.yeshi.fanli.service.inter.taobao.dataoke.DaTaoKeGoodsDetailService; import com.yeshi.fanli.service.inter.taobao.dataoke.DaTaoKeGoodsDetailV2Service; import com.yeshi.fanli.util.Constant; import com.yeshi.fanli.util.taobao.DaTaoKeUtil; import com.yeshi.fanli.util.taobao.TaoBaoUtil; /** * 更新大淘客数据 @@ -39,54 +27,6 @@ @Resource private DaTaoKeGoodsDetailV2Service daTaoKeGoodsDetailV2Service; /** * 限时秒杀 数据更新 */ @Scheduled(cron = "0 0 0/2 * * ?") public void doUpdateJob() { if (!Constant.IS_TASK) return; List<DaTaoKeDetail> listTaoKe = DaTaoKeUtil.getDingDongQiang(); if (listTaoKe == null || listTaoKe.size() == 0) { return; } List<Long> listDaoKeId = new ArrayList<Long>(); for (DaTaoKeDetail daTaoKeDetail : listTaoKe) { listDaoKeId.add(daTaoKeDetail.getId()); } List<DaTaoKeDetail> listDetail = daTaoKeGoodsService.listByIds(listDaoKeId); if (listDetail == null || listDetail.size() == 0) { return; } List<TaoBaoGoodsBrief> listgoods = new ArrayList<TaoBaoGoodsBrief>(); for (DaTaoKeDetail daTaoKeDetail : listDetail) { listgoods.add(TaoBaoUtil.convert(daTaoKeDetail)); } String formatDate = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()); try { /* 操作人: 开发账号 */ AdminUser admin = new AdminUser(2L); BoutiqueAutoRule autoRule = new BoutiqueAutoRule(); autoRule.setAdminUser(admin); autoRule.setCalss9k9(false); autoRule.setFlashSale(true); autoRule.setStartWeight(1); autoRule.setEndWeight(3000); autoRule.setGoodsSource(QualityFactory.SOURCE_TAOBAO_DATAOKE); qualityFactoryService.autoInsertOrUpadateStorage(autoRule, listgoods, null); // 删除之前的 qualityFactoryService.deleteNotUpdateGoods(null, formatDate, autoRule.getGoodsSource()); } catch (Exception e) { LogHelper.errorDetailInfo(e); } } // 1个小时更新一次 @Scheduled(cron = "0 0 0/1 * * ? ") fanli/src/main/java/com/yeshi/fanli/service/impl/taobao/dataoke/DaTaoKeGoodsDetailServiceImpl.java
@@ -9,11 +9,13 @@ 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.dao.mybatis.taobao.dataoke.DaTaoKeDetailMapper; import com.yeshi.fanli.dto.dataoke.DaTaoKeApiResult; import com.yeshi.fanli.dto.dataoke.DingDongQiangDTO; import com.yeshi.fanli.entity.taobao.TaoBaoGoodsBrief; import com.yeshi.fanli.entity.taobao.dataoke.DaTaoKeDetail; import com.yeshi.fanli.log.LogHelper; @@ -151,4 +153,38 @@ return daTaoKeDetailMapper.countByCidAndMaxMinPrice(cid, maxPrice, null); } @Cacheable(value = "daTaoKeGoodsCache", key = "'getDingDongQiangData'") @Override public List<DingDongQiangDTO> getDingDongQiangData() { List<DingDongQiangDTO> list = null; int count = 0; while ((list == null || list.size() == 0) && count < 3) { count++; list = DaTaoKeUtil.getDingDongQiang(); } if (list == null) return null; return list; } @Cacheable(value = "daTaoKeGoodsCache", key = "'getDingDongQiangData-'+#time") @Override public List<DaTaoKeDetail> getDingDongQiangData(String time) { List<DingDongQiangDTO> list = getDingDongQiangData(); if (list == null) return null; Map<String, DingDongQiangDTO> map = new HashMap<>(); for (DingDongQiangDTO dto : list) map.put(dto.getTime(), dto); DingDongQiangDTO dto = map.get(time); if (dto != null) { List<Long> idList = new ArrayList<>(); for (DaTaoKeDetail td : dto.getGoodsList()) idList.add(td.getId()); return listByIds(idList); } return null; } } fanli/src/main/java/com/yeshi/fanli/service/inter/taobao/dataoke/DaTaoKeGoodsDetailService.java
@@ -3,6 +3,7 @@ import java.math.BigDecimal; import java.util.List; import com.yeshi.fanli.dto.dataoke.DingDongQiangDTO; import com.yeshi.fanli.entity.taobao.TaoBaoGoodsBrief; import com.yeshi.fanli.entity.taobao.dataoke.DaTaoKeDetail; @@ -104,9 +105,27 @@ /** * 根据分类ID与最大券后价检索数量 * * @param cid * @param maxPrice * @return */ public Long countByCidAndMaxPrice(Integer cid, BigDecimal maxPrice); /** * 获取叮咚呛数据 * * @return */ public List<DingDongQiangDTO> getDingDongQiangData(); /** * 根据时间查询 * @param time 0712 表示7号12点 * @return */ public List<DaTaoKeDetail> getDingDongQiangData(String time); } fanli/src/main/java/com/yeshi/fanli/util/taobao/DaTaoKeUtil.java
@@ -5,13 +5,19 @@ import java.math.BigDecimal; import java.net.URLEncoder; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import com.yeshi.fanli.dto.dataoke.DingDongQiangDTO; import com.yeshi.fanli.entity.bus.clazz.GoodsClass; import com.yeshi.fanli.entity.taobao.TaoBaoCoupon; import com.yeshi.fanli.entity.taobao.TaoBaoGoodsBrief; @@ -364,28 +370,45 @@ * * @return */ public static List<DaTaoKeDetail> getDingDongQiang() { List<DaTaoKeDetail> goodsList = new ArrayList<>(); public static List<DingDongQiangDTO> getDingDongQiang() { List<DingDongQiangDTO> list = new ArrayList<>(); Document doc = null; try { Document doc = Jsoup.connect("http://www.dataoke.com/ddq") .userAgent( "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Mobile Safari/537.36") .get(); Elements items = doc.getElementsByClass("main").get(0).getElementsByClass("clearfix").get(0) .getElementsByTag("li"); for (int i = 0; i < items.size(); i++) { DaTaoKeDetail detail = new DaTaoKeDetail(); String id = items.get(i).getElementsByTag("a").get(0).attr("href").split("\\?")[1].replace("id=", ""); detail.setId(Long.parseLong(id)); goodsList.add(detail); } } catch (Exception e) { doc = Jsoup.connect("http://www.dataoke.com/ddq").get(); } catch (IOException e1) { e1.printStackTrace(); } return goodsList; Elements els = doc.getElementsByTag("script"); for (int i = 0; i < els.size(); i++) { String content = els.get(i).html(); if (content.indexOf("var dataDef") > -1) { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("javascript"); try { String js = "function getData(){return JSON.stringify(dataDef);}" + content; engine.eval(js); if (engine instanceof Invocable) { Invocable in = (Invocable) engine; String data = in.invokeFunction("getData").toString(); System.out.println(data); JSONObject dataJson = JSONObject.fromObject(data); for (Iterator<String> its = dataJson.keys(); its.hasNext();) { String key = its.next(); JSONArray array = dataJson.optJSONArray(key); List<DaTaoKeDetail> detailList = new ArrayList<>(); for (int n = 0; n < array.size(); n++) { detailList.add(new DaTaoKeDetail(array.optJSONObject(n).optLong("id"))); } list.add(new DingDongQiangDTO(key, detailList)); } } } catch (Exception e) { e.printStackTrace(); } } } return list; } // public static List<TaoBaoCoupon> getRecommendCouple() { List<TaoBaoCoupon> couponList = new ArrayList<>(); fanli/src/main/resource/ehcache.xml
@@ -217,5 +217,13 @@ memoryStoreEvictionPolicy="LRU" /> <!-- 大淘客商品缓存(10分钟) --> <cache name="daTaoKeGoodsCache" maxElementsInMemory="1000" maxElementsOnDisk="10000" eternal="false" timeToIdleSeconds="600" timeToLiveSeconds="600" overflowToDisk="true" memoryStoreEvictionPolicy="LRU" /> </ehcache>