fanli/src/main/java/com/yeshi/fanli/controller/client/v1/RecommendController.java
@@ -1941,8 +1941,11 @@ finalImgList.add(0, tb.getPictUrlWhite()); // 大淘客商品过滤 goods = daTaoKeGoodsDetailService.filterTaoBaoGoods(goods); try { goods = daTaoKeGoodsDetailService.filterTaoBaoGoods(goods); } catch (Exception e) { LogHelper.errorDetailInfo(e); } JSONObject goodsJson = new JSONObject(); goodsJson.put("auctionId", tb.getAuctionId()); goodsJson.put("imgList", finalImgList); fanli/src/main/java/com/yeshi/fanli/dao/MongodbBaseDao.java
New file @@ -0,0 +1,87 @@ package com.yeshi.fanli.dao; import java.lang.reflect.ParameterizedType; import java.util.List; import javax.annotation.Resource; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import org.springframework.stereotype.Repository; @Repository public abstract class MongodbBaseDao<T> { @Resource protected MongoTemplate mongoTemplate; /** * 插入数据 * * @param bean * @return */ public T save(T bean) { mongoTemplate.save(bean); return bean; } /** * 根据主键更新数据 * * @param query * @param update */ public void update(Query query, Update update) { mongoTemplate.upsert(query, update, this.getEntityClass()); } /** * 查询一个数据 * * @param query * @return */ public T findOne(Query query) { return (T) mongoTemplate.findOne(query, this.getEntityClass()); } /** * 查询多个数据 * * @param query * @return */ public List<T> findList(Query query) { return mongoTemplate.find(query, this.getEntityClass()); } /** * 主键查询 * * @param id * @return */ public T get(Object id) { return (T) mongoTemplate.findById(id, this.getEntityClass()); } /** * 通过主键删除 * * @param id */ public void delete(Object id) { Query query = Query.query(Criteria.where("id").is(id)); mongoTemplate.remove(query, getEntityClass()); } @SuppressWarnings("unchecked") protected Class<T> getEntityClass() { Class<T> tClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()) .getActualTypeArguments()[0]; return tClass; } } fanli/src/main/java/com/yeshi/fanli/dao/goods/taobao/dataoke/DaTaoKeGoodsDetailV2Dao.java
New file @@ -0,0 +1,134 @@ package com.yeshi.fanli.dao.goods.taobao.dataoke; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort.Direction; import org.springframework.data.domain.Sort.Order; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import org.springframework.stereotype.Repository; import com.yeshi.fanli.dao.MongodbBaseDao; import com.yeshi.fanli.entity.taobao.dataoke.DaTaoKeDetailV2; @Repository public class DaTaoKeGoodsDetailV2Dao extends MongodbBaseDao<DaTaoKeDetailV2> { public void updateSelective(DaTaoKeDetailV2 v2) { DaTaoKeDetailV2 old = get(v2.getId()); if (old != null) {// 更新 Query query = new Query(); query.addCriteria(Criteria.where("id").is(v2.getId())); Field[] fields = v2.getClass().getFields(); Update update = new Update(); for (Field f : fields) { f.setAccessible(true); String name = f.getName(); Object value = null; try { value = f.get(v2); } catch (Exception e) { e.printStackTrace(); } if (value != null) update.set(name, value); } update(query, update); } } public DaTaoKeDetailV2 selectLatest() { Query query = new Query(); List<Order> orders = new ArrayList<>(); orders.add(new Order(Direction.DESC, "createTime")); query.with(new Sort(orders)); query.limit(1); List<DaTaoKeDetailV2> list = mongoTemplate.find(query, getEntityClass()); if (list != null && list.size() > 0) return list.get(0); else return null; } public List<DaTaoKeDetailV2> listByGoodsIds(List<Long> goodsIdList) { if (goodsIdList == null || goodsIdList.size() == 0) return null; Query query = new Query(); Criteria[] criterias = new Criteria[goodsIdList.size()]; for (int i = 0; i < goodsIdList.size(); i++) { criterias[i] = Criteria.where("goodsId").is(goodsIdList.get(i)); } query.addCriteria(new Criteria().orOperator(criterias)); return mongoTemplate.find(query, getEntityClass()); } public List<DaTaoKeDetailV2> listByIds(List<Long> idsList) { if (idsList == null || idsList.size() == 0) return null; Query query = new Query(); Criteria[] criterias = new Criteria[idsList.size()]; for (int i = 0; i < idsList.size(); i++) { criterias[i] = Criteria.where("id").is(idsList.get(i)); } query.addCriteria(new Criteria().orOperator(criterias)); return mongoTemplate.find(query, getEntityClass()); } public List<DaTaoKeDetailV2> listByDtitle(String dtitle) { Query query = new Query(); query.addCriteria(Criteria.where("dtitle").is(dtitle)); return mongoTemplate.find(query, getEntityClass()); } public List<DaTaoKeDetailV2> listSearchByTitleWithCid(String key, Long cid, int start, int count) { Pattern pattern = Pattern.compile("^.*" + key + ".*$", Pattern.CASE_INSENSITIVE); List<Criteria> criteriasList = new ArrayList<>(); criteriasList.add(Criteria.where("dtitle").regex(pattern)); criteriasList.add(Criteria.where("title").regex(pattern)); Criteria[] criterias = new Criteria[criteriasList.size()]; Query query = new Query(); if (cid != null) query.addCriteria(new Criteria().andOperator(Criteria.where("cid").is(Integer.parseInt(cid + "")), new Criteria().orOperator(criteriasList.toArray(criterias)))); else query.addCriteria(new Criteria().orOperator(criteriasList.toArray(criterias))); query.skip(start); query.limit(count); return mongoTemplate.find(query, getEntityClass()); } public long countSearchByTitleWithCid(String key, Long cid) { Pattern pattern = Pattern.compile("^.*" + key + ".*$", Pattern.CASE_INSENSITIVE); List<Criteria> criteriasList = new ArrayList<>(); criteriasList.add(Criteria.where("dtitle").regex(pattern)); criteriasList.add(Criteria.where("title").regex(pattern)); Criteria[] criterias = new Criteria[criteriasList.size()]; Query query = new Query(); if (cid != null) query.addCriteria(new Criteria().andOperator(Criteria.where("cid").is(Integer.parseInt(cid + "")), new Criteria().orOperator(criteriasList.toArray(criterias)))); else query.addCriteria(new Criteria().orOperator(criteriasList.toArray(criterias))); return mongoTemplate.count(query, getEntityClass()); } public List<DaTaoKeDetailV2> getGoodsNotInList(Long cid, List<Long> listId, int count) { List<Criteria> criteriasList = new ArrayList<>(); if (cid != null) criteriasList.add(Criteria.where("cid").is(Integer.parseInt(cid + ""))); for (Long id : listId) criteriasList.add(Criteria.where("id").not().is(id)); Criteria[] criterias = new Criteria[criteriasList.size()]; Query query = new Query(); query.addCriteria(new Criteria().andOperator(criteriasList.toArray(criterias))); query.limit(count); return mongoTemplate.find(query, getEntityClass()); } } fanli/src/main/java/com/yeshi/fanli/dto/dataoke/DaTaoKeGoodsResult.java
New file @@ -0,0 +1,45 @@ package com.yeshi.fanli.dto.dataoke; import java.util.List; import com.yeshi.fanli.entity.taobao.dataoke.DaTaoKeDetailV2; public class DaTaoKeGoodsResult { private long totalCount; private String pageId; private List<DaTaoKeDetailV2> goodsList; public DaTaoKeGoodsResult() { } public DaTaoKeGoodsResult(long totalCount, String pageId, List<DaTaoKeDetailV2> goodsList) { this.totalCount = totalCount; this.pageId = pageId; this.goodsList = goodsList; } public long getTotalCount() { return totalCount; } public void setTotalCount(long totalCount) { this.totalCount = totalCount; } public String getPageId() { return pageId; } public void setPageId(String pageId) { this.pageId = pageId; } public List<DaTaoKeDetailV2> getGoodsList() { return goodsList; } public void setGoodsList(List<DaTaoKeDetailV2> goodsList) { this.goodsList = goodsList; } } fanli/src/main/java/com/yeshi/fanli/entity/taobao/TaoKeAppInfo.java
@@ -9,6 +9,14 @@ public class TaoKeAppInfo { private String appKey; private String appSecret; public TaoKeAppInfo(String appKey, String appSecret) { this.appKey = appKey; this.appSecret = appSecret; } public TaoKeAppInfo() { } private String pid; private String adzoneId; fanli/src/main/java/com/yeshi/fanli/entity/taobao/dataoke/DaTaoKeDetailV2.java
New file @@ -0,0 +1,452 @@ package com.yeshi.fanli.entity.taobao.dataoke; import java.math.BigDecimal; import java.util.Date; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; @Document(collection = "daTaoKeGoods") public class DaTaoKeDetailV2 { @Id private Long id;// 商品ID @Field private Long goodsId;// 淘宝商品ID @Field private String title;// 标题 @Field private String dtitle;// 大淘客标题 @Field private BigDecimal originalPrice;// 原价 @Field private BigDecimal actualPrice;// 券后价 @Field private Integer shopType;// 店铺类型,1-天猫,0-淘宝 @Field private Integer goldSellers;// 是否金牌卖家,1-金牌卖家,0-非金牌卖家 @Field private Integer monthSales;// 30天销量 @Field private Integer twoHoursSales;// 2小时销量 @Field private Integer dailySales;// 当日销量 @Field private Integer commissionType;// 佣金类型,0-通用,1-定向,2-高佣,3-营销计划 @Field private String desc;// 推广文案 @Field private Integer couponReceiveNum;// 领券量 @Field private String couponLink;// 领券链接 @Field private Date couponEndTime;// 优惠券结束时间 @Field private Date couponStartTime;// 优惠券开始时间 @Field private BigDecimal couponPrice;// 优惠券金额 @Field private String couponConditions;// 优惠券使用条件 @Field private String couponId;// 券ID @Field private Integer activityType;// 活动类型,1-无活动,2-淘抢购,3-聚划算 @Field private Date createTime;// 商品创建时间 @Field private String mainPic;// 商品主图链接 @Field private String marketingMainPic;// 营销主图链接 @Field private Long sellerId;// 淘宝卖家id @Field private Integer cid;// 商品在大淘客的分类id @Field private BigDecimal discounts;// 折扣力度 @Field private BigDecimal commissionRate;// 佣金比例 @Field private Integer couponTotalNum;// 券总量 @Field private Integer haitao;// 是否海淘,1-海淘商品,0-非海淘商品 @Field private String activityStartTime;// 活动开始时间 @Field private String activityEndTime;// 活动结束时间 @Field private String shopName;// 店铺名称 @Field private Integer shopLevel;// 淘宝店铺等级 @Field private BigDecimal descScore;// 描述分 @Field private Integer brand;// 是否是品牌商品 @Field private String brandId;// 品牌id @Field private String brandName;// 品牌名称 @Field private Integer hotPush;// 热推值 @Field private String teamName;// 放单人名称 @Field private String itemLink;// 商品淘宝链接 @Field private Integer tchaoshi;// 是否天猫超市商品,1-天猫超市商品,0-非天猫超市商品 @Field private Integer tbcid;// 商品在淘宝的二级分类id ,非大淘客的二级分类 @Field private Date updateTime; public Date getUpdateTime() { return updateTime; } public void setUpdateTime(Date updateTime) { this.updateTime = updateTime; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Long getGoodsId() { return goodsId; } public void setGoodsId(Long goodsId) { this.goodsId = goodsId; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getDtitle() { return dtitle; } public void setDtitle(String dtitle) { this.dtitle = dtitle; } public BigDecimal getOriginalPrice() { return originalPrice; } public void setOriginalPrice(BigDecimal originalPrice) { this.originalPrice = originalPrice; } public BigDecimal getActualPrice() { return actualPrice; } public void setActualPrice(BigDecimal actualPrice) { this.actualPrice = actualPrice; } public Integer getShopType() { return shopType; } public void setShopType(Integer shopType) { this.shopType = shopType; } public Integer getGoldSellers() { return goldSellers; } public void setGoldSellers(Integer goldSellers) { this.goldSellers = goldSellers; } public Integer getMonthSales() { return monthSales; } public void setMonthSales(Integer monthSales) { this.monthSales = monthSales; } public Integer getTwoHoursSales() { return twoHoursSales; } public void setTwoHoursSales(Integer twoHoursSales) { this.twoHoursSales = twoHoursSales; } public Integer getDailySales() { return dailySales; } public void setDailySales(Integer dailySales) { this.dailySales = dailySales; } public Integer getCommissionType() { return commissionType; } public void setCommissionType(Integer commissionType) { this.commissionType = commissionType; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } public Integer getCouponReceiveNum() { return couponReceiveNum; } public void setCouponReceiveNum(Integer couponReceiveNum) { this.couponReceiveNum = couponReceiveNum; } public String getCouponLink() { return couponLink; } public void setCouponLink(String couponLink) { this.couponLink = couponLink; } public Date getCouponEndTime() { return couponEndTime; } public void setCouponEndTime(Date couponEndTime) { this.couponEndTime = couponEndTime; } public Date getCouponStartTime() { return couponStartTime; } public void setCouponStartTime(Date couponStartTime) { this.couponStartTime = couponStartTime; } public BigDecimal getCouponPrice() { return couponPrice; } public void setCouponPrice(BigDecimal couponPrice) { this.couponPrice = couponPrice; } public String getCouponConditions() { return couponConditions; } public void setCouponConditions(String couponConditions) { this.couponConditions = couponConditions; } public String getCouponId() { return couponId; } public void setCouponId(String couponId) { this.couponId = couponId; } public Integer getActivityType() { return activityType; } public void setActivityType(Integer activityType) { this.activityType = activityType; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public String getMainPic() { return mainPic; } public void setMainPic(String mainPic) { this.mainPic = mainPic; } public String getMarketingMainPic() { return marketingMainPic; } public void setMarketingMainPic(String marketingMainPic) { this.marketingMainPic = marketingMainPic; } public Long getSellerId() { return sellerId; } public void setSellerId(Long sellerId) { this.sellerId = sellerId; } public Integer getCid() { return cid; } public void setCid(Integer cid) { this.cid = cid; } public BigDecimal getDiscounts() { return discounts; } public void setDiscounts(BigDecimal discounts) { this.discounts = discounts; } public BigDecimal getCommissionRate() { return commissionRate; } public void setCommissionRate(BigDecimal commissionRate) { this.commissionRate = commissionRate; } public Integer getCouponTotalNum() { return couponTotalNum; } public void setCouponTotalNum(Integer couponTotalNum) { this.couponTotalNum = couponTotalNum; } public Integer getHaitao() { return haitao; } public void setHaitao(Integer haitao) { this.haitao = haitao; } public String getActivityStartTime() { return activityStartTime; } public void setActivityStartTime(String activityStartTime) { this.activityStartTime = activityStartTime; } public String getActivityEndTime() { return activityEndTime; } public void setActivityEndTime(String activityEndTime) { this.activityEndTime = activityEndTime; } public String getShopName() { return shopName; } public void setShopName(String shopName) { this.shopName = shopName; } public Integer getShopLevel() { return shopLevel; } public void setShopLevel(Integer shopLevel) { this.shopLevel = shopLevel; } public BigDecimal getDescScore() { return descScore; } public void setDescScore(BigDecimal descScore) { this.descScore = descScore; } public Integer getBrand() { return brand; } public void setBrand(Integer brand) { this.brand = brand; } public String getBrandId() { return brandId; } public void setBrandId(String brandId) { this.brandId = brandId; } public String getBrandName() { return brandName; } public void setBrandName(String brandName) { this.brandName = brandName; } public Integer getHotPush() { return hotPush; } public void setHotPush(Integer hotPush) { this.hotPush = hotPush; } public String getTeamName() { return teamName; } public void setTeamName(String teamName) { this.teamName = teamName; } public String getItemLink() { return itemLink; } public void setItemLink(String itemLink) { this.itemLink = itemLink; } public Integer getTchaoshi() { return tchaoshi; } public void setTchaoshi(Integer tchaoshi) { this.tchaoshi = tchaoshi; } public Integer getTbcid() { return tbcid; } public void setTbcid(Integer tbcid) { this.tbcid = tbcid; } } fanli/src/main/java/com/yeshi/fanli/job/UpdateDaTaoKeJob.java
@@ -103,5 +103,24 @@ LogHelper.errorDetailInfo(e); } } // 每天早上同步一次 public void doSyncJobNew() { if (!Constant.IS_TASK) return; try { new Thread(new Runnable() { @Override public void run() { daTaoKeGoodsService.startSyncGoods(); } }).start(); } catch (Exception e) { LogHelper.errorDetailInfo(e); } } } fanli/src/main/java/com/yeshi/fanli/service/impl/order/OrderProcessServiceImpl.java
@@ -143,18 +143,19 @@ } else if (!StringUtil.isNullOrEmpty(list.get(0).getRelationId())) { shareOrderMap.put(orderId, list); } else { // 通过红包查询 CommonOrder commonOrder = commonOrderService .selectBySourceTypeAndTradeId(Constant.SOURCE_TYPE_TAOBAO, list.get(0).getTradeId()); PidUser pidUser = null;// pidUserMapper.selectByPid(pid); if (pidUser != null && pidUser.getType() == PidUser.TYPE_SHARE_GOODS) {// 商品分享订单 // List<PidOrder> pidOrderList = new ArrayList<>(); // for (TaoBaoOrder order : list) { // pidOrderList.add(TaoBaoOrderUtil.convertToPidOrder(order)); // } // sharePidOrderMap.put(orderId, pidOrderList); shareOrderMap.put(orderId, list); } else {// 普通返利订单 fanliOrderMap.put(orderId, list); if (commonOrder != null) { HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(commonOrder.getId()); if (hongBaoOrder != null && hongBaoOrder.getHongBaoV2() != null && hongBaoOrder.getHongBaoV2().getType() == HongBaoV2.TYPE_SHARE_GOODS) { shareOrderMap.put(orderId, list); continue; } } fanliOrderMap.put(orderId, list); } } } @@ -923,6 +924,20 @@ } // 尚未找到和PID对应的用户 if (uid == null) { // 通过红包查询 CommonOrder commonOrder = commonOrderService.selectBySourceTypeAndTradeId(Constant.SOURCE_TYPE_TAOBAO, orderList.get(0).getTradeId()); if (commonOrder != null) { HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(commonOrder.getId()); if (hongBaoOrder != null && hongBaoOrder.getHongBaoV2() != null && hongBaoOrder.getHongBaoV2().getType() == HongBaoV2.TYPE_SHARE_GOODS) { uid = hongBaoOrder.getHongBaoV2().getUserInfo().getId(); } } } if (uid == null) return; fanli/src/main/java/com/yeshi/fanli/service/impl/taobao/dataoke/DaTaoKeGoodsDetailV2ServiceImpl.java
New file @@ -0,0 +1,189 @@ package com.yeshi.fanli.service.impl.taobao.dataoke; import java.util.ArrayList; 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.goods.taobao.dataoke.DaTaoKeGoodsDetailV2Dao; import com.yeshi.fanli.dto.dataoke.DaTaoKeGoodsResult; import com.yeshi.fanli.entity.taobao.TaoBaoGoodsBrief; import com.yeshi.fanli.entity.taobao.dataoke.DaTaoKeDetailV2; import com.yeshi.fanli.log.LogHelper; import com.yeshi.fanli.service.inter.taobao.dataoke.DaTaoKeGoodsDetailV2Service; import com.yeshi.fanli.util.RedisManager; import com.yeshi.fanli.util.StringUtil; import com.yeshi.fanli.util.TimeUtil; import com.yeshi.fanli.util.dataoke.DaTaoKeApiUtil; import com.yeshi.fanli.util.taobao.DaTaoKeUtil; @Service public class DaTaoKeGoodsDetailV2ServiceImpl implements DaTaoKeGoodsDetailV2Service { @Resource private DaTaoKeGoodsDetailV2Dao daTaoKeGoodsDetailV2Dao; @Resource private RedisManager redisManager; @Override public void startSyncGoods() { LogHelper.test("大淘客同步开始"); DaTaoKeGoodsResult result = DaTaoKeApiUtil.listAll(null); while (!StringUtil.isNullOrEmpty(result.getPageId())) { for (DaTaoKeDetailV2 v2 : result.getGoodsList()) daTaoKeGoodsDetailV2Dao.save(v2); result = DaTaoKeApiUtil.listAll(result.getPageId()); try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } } @Override public void updateData() { DaTaoKeGoodsResult result = DaTaoKeApiUtil.getUpdateGoodsList(null, null, null); while (!StringUtil.isNullOrEmpty(result.getPageId())) { for (DaTaoKeDetailV2 v2 : result.getGoodsList()) { v2.setUpdateTime(new Date()); daTaoKeGoodsDetailV2Dao.updateSelective(v2); } try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } result = DaTaoKeApiUtil.getUpdateGoodsList(result.getPageId(), null, null); } } @Override public void deleteInvalid() { String startTime = null; DaTaoKeDetailV2 latest = daTaoKeGoodsDetailV2Dao.selectLatest(); if (latest != null) { startTime = TimeUtil.getGernalTime(latest.getCreateTime().getTime(), "yyyy-MM-dd HH:mm:ss"); } DaTaoKeGoodsResult result = DaTaoKeApiUtil.getInvalidGoodsList(null, startTime, null); while (!StringUtil.isNullOrEmpty(result.getPageId())) { for (DaTaoKeDetailV2 v2 : result.getGoodsList()) { v2.setUpdateTime(new Date()); daTaoKeGoodsDetailV2Dao.delete(v2.getId()); } result = DaTaoKeApiUtil.getInvalidGoodsList(result.getPageId(), startTime, null); try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } } @Override public void updateNewGoods() { String startTime = null; DaTaoKeDetailV2 latest = daTaoKeGoodsDetailV2Dao.selectLatest(); if (latest != null) { startTime = TimeUtil.getGernalTime(latest.getCreateTime().getTime(), "yyyy-MM-dd HH:mm:ss"); } DaTaoKeGoodsResult result = DaTaoKeApiUtil.getNewGoodsList(null, startTime, null); while (!StringUtil.isNullOrEmpty(result.getPageId())) { for (DaTaoKeDetailV2 v2 : result.getGoodsList()) { v2.setUpdateTime(new Date()); daTaoKeGoodsDetailV2Dao.save(v2); } result = DaTaoKeApiUtil.getNewGoodsList(result.getPageId(), startTime, null); try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } } @Transactional private void addGoodsList(List<DaTaoKeDetailV2> goodsList) { for (DaTaoKeDetailV2 goods : goodsList) { goods.setUpdateTime(new Date()); daTaoKeGoodsDetailV2Dao.save(goods); } } @Override public List<DaTaoKeDetailV2> listByGoodsIds(List<Long> goodsIdList) { if (goodsIdList == null || goodsIdList.size() == 0) return null; List<DaTaoKeDetailV2> goodsList = daTaoKeGoodsDetailV2Dao.listByGoodsIds(goodsIdList); return goodsList; } @Override public List<TaoBaoGoodsBrief> filterTaoBaoGoods(List<TaoBaoGoodsBrief> goodsList) { List<Long> goodsIdList = new ArrayList<>(); for (TaoBaoGoodsBrief goods : goodsList) goodsIdList.add(goods.getAuctionId()); List<DaTaoKeDetailV2> dtList = listByGoodsIds(goodsIdList); Map<Long, DaTaoKeDetailV2> map = new HashMap<>(); for (DaTaoKeDetailV2 goods : dtList) map.put(goods.getGoodsId(), goods); for (TaoBaoGoodsBrief goods : goodsList) { DaTaoKeDetailV2 detail = map.get(goods.getAuctionId()); goods = DaTaoKeUtil.filterTaoBaoGoods(goods, detail); } return goodsList; } @Override public TaoBaoGoodsBrief filterTaoBaoGoods(TaoBaoGoodsBrief goods) { List<Long> goodsIdList = new ArrayList<>(); goodsIdList.add(goods.getAuctionId()); List<DaTaoKeDetailV2> daTaoKeList = listByGoodsIds(goodsIdList); if (daTaoKeList == null || daTaoKeList.size() == 0) return goods; // 重新设置标题与券价格 goods = DaTaoKeUtil.filterTaoBaoGoods(goods, daTaoKeList.get(0)); return goods; } @Override public List<DaTaoKeDetailV2> listByIds(List<Long> idsList) { return daTaoKeGoodsDetailV2Dao.listByIds(idsList); } @Override public List<DaTaoKeDetailV2> listByDtitle(String dtitle) { return daTaoKeGoodsDetailV2Dao.listByDtitle(dtitle.trim()); } @Override public List<DaTaoKeDetailV2> listSearchByTitleWithCid(String title, Long cid, int page, int pageSize) { return daTaoKeGoodsDetailV2Dao.listSearchByTitleWithCid(title, (cid == null || cid == 0 ? null : cid), (page - 1) * pageSize, pageSize); } @Override public Long countSearchByTitleWithCid(String title, Long cid) { return daTaoKeGoodsDetailV2Dao.countSearchByTitleWithCid(title, (cid == null || cid == 0 ? null : cid)); } @Override public List<DaTaoKeDetailV2> getGoodsNotInList(Long cid, List<Long> listId, int count) { return daTaoKeGoodsDetailV2Dao.getGoodsNotInList(cid, listId, count); } } fanli/src/main/java/com/yeshi/fanli/service/inter/taobao/dataoke/DaTaoKeGoodsDetailV2Service.java
New file @@ -0,0 +1,108 @@ package com.yeshi.fanli.service.inter.taobao.dataoke; import java.util.List; import com.yeshi.fanli.entity.taobao.TaoBaoGoodsBrief; import com.yeshi.fanli.entity.taobao.dataoke.DaTaoKeDetailV2; /** * 大淘客商品详情服务 * * @author Administrator * */ public interface DaTaoKeGoodsDetailV2Service { /** * 启动商品同步服务 */ public void startSyncGoods(); /** * 更新数据 */ public void updateData(); /** * 删除无效的 */ public void deleteInvalid(); /** * 增量更新 */ public void updateNewGoods(); /** * 根据商品ID查询 * * @param goodsIdList * @return */ public List<DaTaoKeDetailV2> listByGoodsIds(List<Long> goodsIdList); /** * 过滤淘宝商品信息 * * @param goodsList * @return */ public List<TaoBaoGoodsBrief> filterTaoBaoGoods(List<TaoBaoGoodsBrief> goodsList); /** * 过滤淘宝商品信息 * * @param goods * @return */ public TaoBaoGoodsBrief filterTaoBaoGoods(TaoBaoGoodsBrief goods); /** * 根据主键查询 * * @param idList * @return */ public List<DaTaoKeDetailV2> listByIds(List<Long> idList); /** * 查询一类全部 * * @param cid * @param listId * @param count * @return */ public List<DaTaoKeDetailV2> getGoodsNotInList(Long cid, List<Long> listId, int count); /* * 根据标题查询 * * @param dtitle * * @return */ public List<DaTaoKeDetailV2> listByDtitle(String dtitle); /** * 根据标题类型搜索 * * @param title * -标题 * @param cid * -分类ID * @param page * @param pageSize * @return */ public List<DaTaoKeDetailV2> listSearchByTitleWithCid(String title, Long cid, int page, int pageSize); /** * 获取搜索到的数量 * * @param title * @param cid * @return */ public Long countSearchByTitleWithCid(String title, Long cid); } fanli/src/main/java/com/yeshi/fanli/util/SpringContext.java
@@ -369,7 +369,7 @@ } } } catch (Exception e) { LogHelper.errorDetailInfo(e); } } } fanli/src/main/java/com/yeshi/fanli/util/dataoke/DaTaoKeApiUtil.java
@@ -1,10 +1,16 @@ package com.yeshi.fanli.util.dataoke; import java.io.IOException; import java.lang.reflect.Type; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeMap; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; @@ -13,11 +19,16 @@ import org.yeshi.utils.HttpUtil; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.yeshi.fanli.dto.dataoke.DaTaoKeApiResult; import com.yeshi.fanli.dto.dataoke.DaTaoKeGoodsResult; import com.yeshi.fanli.dto.taobao.TaoBaoShopDTO; import com.yeshi.fanli.entity.taobao.TaoBaoGoodsBrief; import com.yeshi.fanli.entity.taobao.TaoKeAppInfo; import com.yeshi.fanli.entity.taobao.dataoke.DaTaoKeDetail; import com.yeshi.fanli.entity.taobao.dataoke.DaTaoKeDetailV2; import com.yeshi.fanli.util.MoneyBigDecimalUtil; import com.yeshi.fanli.util.StringUtil; import net.sf.json.JSONArray; import net.sf.json.JSONObject; @@ -25,6 +36,28 @@ public class DaTaoKeApiUtil { final static String API_KEY = "a083abb893"; final static String API_KEY_2 = "b7a5ea2cd9"; final static String APP_KEY = "5cf764636d373"; final static String APP_KEY_SECRET = "5ea3c24900743f3aa531fb264f9824f2"; final static String APP_KEY_2 = "5cf75b0f2c0e4"; final static String APP_KEY_SECRET_2 = "b14f1fa115129a447937ca998b311d1e"; // 排序值 final public static int SORT_DEFAULT = 0; final public static int SORT_CREATETIME = 1; final public static int SORT_SALES = 2; final public static int SORT_COUPON_NUM = 3; final public static int SORT_COMMISSION = 4; final public static int SORT_PRICE_HIGH_TO_LOW = 5; final public static int SORT_PRICE_LOW_TO_HIGH = 6; final static TaoKeAppInfo[] APP_KEYS = new TaoKeAppInfo[] { new TaoKeAppInfo(APP_KEY, APP_KEY_SECRET), new TaoKeAppInfo(APP_KEY_2, APP_KEY_SECRET_2) }; final static String[] APP_SECRETS = new String[] { APP_KEY_SECRET, APP_KEY_SECRET_2 }; static Gson gson = new Gson(); public static DaTaoKeApiResult goodsList(int page) { @@ -97,7 +130,218 @@ e.printStackTrace(); } return taoBaoShopDTO; } private static TaoKeAppInfo getRandomApp() { int pos = (int) (Math.random() * APP_KEYS.length); return APP_KEYS[pos]; } public static DaTaoKeGoodsResult listAll(String pageId) { TaoKeAppInfo app = getRandomApp(); DaTaoKeGoodsResult daTaoKeGoodsResult = new DaTaoKeGoodsResult(); Map<String, String> params = new TreeMap<>(); params.put("version", "v1.0.0"); params.put("appKey", app.getAppKey()); params.put("pageSize", 200 + ""); if (!StringUtil.isNullOrEmpty(pageId)) { params.put("pageId", pageId); } params.put("sign", getSign(params, app.getAppSecret())); String result = HttpUtil.get("https://openapi.dataoke.com/api/goods/get-goods-list", params, new HashMap<>()); JSONObject json = JSONObject.fromObject(result); JSONObject dataJson = json.optJSONObject("data"); if (dataJson != null) { JSONArray array = dataJson.optJSONArray("list"); if (array != null) { String data = array.toString(); Type type = new TypeToken<List<DaTaoKeDetailV2>>() { }.getType(); List<DaTaoKeDetailV2> list = gson.fromJson(data, type); daTaoKeGoodsResult.setGoodsList(list); } daTaoKeGoodsResult.setPageId(dataJson.optString("pageId")); daTaoKeGoodsResult.setTotalCount(dataJson.optLong("totalNum")); } return daTaoKeGoodsResult; } /** * 失效商品 * * @param pageId * @return */ public static DaTaoKeGoodsResult getInvalidGoodsList(String pageId, String startTime, String endTime) { TaoKeAppInfo app = getRandomApp(); DaTaoKeGoodsResult daTaoKeGoodsResult = new DaTaoKeGoodsResult(); Map<String, String> params = new TreeMap<>(); params.put("version", "v1.0.0"); params.put("appKey", app.getAppKey()); params.put("pageSize", 200 + ""); if (!StringUtil.isNullOrEmpty(startTime)) params.put("startTime", startTime); if (!StringUtil.isNullOrEmpty(endTime)) params.put("endTime", endTime); if (!StringUtil.isNullOrEmpty(pageId)) params.put("pageId", pageId); params.put("sign", getSign(params, app.getAppSecret())); String result = HttpUtil.get("https://openapi.dataoke.com/api/goods/get-stale-goods-by-time", params, new HashMap<>()); JSONObject json = JSONObject.fromObject(result); JSONObject dataJson = json.optJSONObject("data"); if (dataJson != null) { JSONArray array = dataJson.optJSONArray("list"); if (array != null) { String data = array.toString(); Type type = new TypeToken<List<DaTaoKeDetailV2>>() { }.getType(); List<DaTaoKeDetailV2> list = gson.fromJson(data, type); daTaoKeGoodsResult.setGoodsList(list); } daTaoKeGoodsResult.setPageId(dataJson.optString("pageId")); daTaoKeGoodsResult.setTotalCount(dataJson.optLong("totalNum")); } return daTaoKeGoodsResult; } public static DaTaoKeGoodsResult getNewGoodsList(String pageId, String startTime, String endTime) { TaoKeAppInfo app = getRandomApp(); DaTaoKeGoodsResult daTaoKeGoodsResult = new DaTaoKeGoodsResult(); Map<String, String> params = new TreeMap<>(); params.put("version", "v1.0.0"); params.put("appKey", app.getAppKey()); params.put("pageSize", 200 + ""); if (!StringUtil.isNullOrEmpty(startTime)) params.put("startTime", startTime); if (!StringUtil.isNullOrEmpty(endTime)) params.put("endTime", endTime); if (!StringUtil.isNullOrEmpty(pageId)) params.put("pageId", pageId); params.put("sign", getSign(params, app.getAppSecret())); String result = HttpUtil.get("https://openapi.dataoke.com/api/goods/pull-goods-by-time", params, new HashMap<>()); JSONObject json = JSONObject.fromObject(result); JSONObject dataJson = json.optJSONObject("data"); if (dataJson != null) { JSONArray array = dataJson.optJSONArray("list"); if (array != null) { String data = array.toString(); Type type = new TypeToken<List<DaTaoKeDetailV2>>() { }.getType(); List<DaTaoKeDetailV2> list = gson.fromJson(data, type); daTaoKeGoodsResult.setGoodsList(list); } daTaoKeGoodsResult.setPageId(dataJson.optString("pageId")); daTaoKeGoodsResult.setTotalCount(dataJson.optLong("totalNum")); } return daTaoKeGoodsResult; } public static DaTaoKeGoodsResult getUpdateGoodsList(String pageId, String startTime, String endTime) { TaoKeAppInfo app = getRandomApp(); DaTaoKeGoodsResult daTaoKeGoodsResult = new DaTaoKeGoodsResult(); Map<String, String> params = new TreeMap<>(); params.put("version", "v1.0.0"); params.put("appKey", app.getAppKey()); params.put("pageSize", 200 + ""); if (!StringUtil.isNullOrEmpty(startTime)) params.put("startTime", startTime); if (!StringUtil.isNullOrEmpty(endTime)) params.put("endTime", endTime); if (!StringUtil.isNullOrEmpty(pageId)) params.put("pageId", pageId); params.put("sign", getSign(params, app.getAppSecret())); String result = HttpUtil.get("https://openapi.dataoke.com/api/goods/get-newest-goods", params, new HashMap<>()); JSONObject json = JSONObject.fromObject(result); JSONObject dataJson = json.optJSONObject("data"); if (dataJson != null) { JSONArray array = dataJson.optJSONArray("list"); if (array != null) { String data = array.toString(); Type type = new TypeToken<List<DaTaoKeDetailV2>>() { }.getType(); List<DaTaoKeDetailV2> list = gson.fromJson(data, type); daTaoKeGoodsResult.setGoodsList(list); } daTaoKeGoodsResult.setPageId(dataJson.optString("pageId")); daTaoKeGoodsResult.setTotalCount(dataJson.optLong("totalNum")); } return daTaoKeGoodsResult; } public static DaTaoKeGoodsResult search(String key, List<Integer> cidList, int page, int pageSize, int sort) { TaoKeAppInfo app = getRandomApp(); DaTaoKeGoodsResult daTaoKeGoodsResult = new DaTaoKeGoodsResult(); Map<String, String> params = new TreeMap<>(); params.put("version", "v1.0.0"); params.put("appKey", app.getAppKey()); params.put("pageSize", 200 + ""); params.put("pageId", page + ""); String cids = ""; if (cidList != null && cidList.size() > 0) for (Integer cid : cidList) { cids += cid + ","; } if (cids.endsWith(",")) cids = cids.substring(0, cids.length() - 1); if (!StringUtil.isNullOrEmpty(cids)) params.put("cids", cids); params.put("keyWords", key); params.put("sort", sort + ""); params.put("sign", getSign(params, app.getAppSecret())); String result = HttpUtil.get("https://openapi.dataoke.com/api/goods/get-dtk-search-goods", params, new HashMap<>()); JSONObject json = JSONObject.fromObject(result); JSONObject dataJson = json.optJSONObject("data"); if (dataJson != null) { JSONArray array = dataJson.optJSONArray("list"); if (array != null) { String data = array.toString(); Type type = new TypeToken<List<DaTaoKeDetailV2>>() { }.getType(); List<DaTaoKeDetailV2> list = gson.fromJson(data, type); daTaoKeGoodsResult.setGoodsList(list); } daTaoKeGoodsResult.setPageId(dataJson.optString("pageId")); daTaoKeGoodsResult.setTotalCount(dataJson.optLong("totalNum")); } return daTaoKeGoodsResult; } private static String getSign(Map<String, String> map, String secretKey) { if (map.size() == 0) { return ""; } StringBuffer sb = new StringBuffer(""); Set<String> keySet = map.keySet(); Iterator<String> iter = keySet.iterator(); while (iter.hasNext()) { String key = iter.next(); sb.append("&" + key + "=" + map.get(key)); } sb.deleteCharAt(0); String signStr = ""; signStr = sb.toString() + "&key=" + secretKey; return StringUtil.Md5(signStr).toUpperCase(); } public static TaoBaoShopDTO convertTaoBaoShopDTO(JSONObject data) { fanli/src/main/java/com/yeshi/fanli/util/taobao/DaTaoKeUtil.java
@@ -5,8 +5,6 @@ import java.math.BigDecimal; import java.net.URLEncoder; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.jsoup.Jsoup; @@ -20,10 +18,10 @@ import com.yeshi.fanli.entity.taobao.TaoBaoHead; import com.yeshi.fanli.entity.taobao.TaoBaoSearchResult; import com.yeshi.fanli.entity.taobao.dataoke.DaTaoKeDetail; import com.yeshi.fanli.entity.taobao.dataoke.DaTaoKeDetailV2; import com.yeshi.fanli.tag.PageEntity; import com.yeshi.fanli.util.MoneyBigDecimalUtil; import com.yeshi.fanli.util.StringUtil; import com.yeshi.fanli.util.TimeUtil; import net.sf.json.JSONArray; import net.sf.json.JSONObject; @@ -534,4 +532,19 @@ return goods; } public static TaoBaoGoodsBrief filterTaoBaoGoods(TaoBaoGoodsBrief goods, DaTaoKeDetailV2 detail) { if (detail != null) { // 重新设置标题与券价格 goods.setTitle(detail.getDtitle()); goods.setCouponAmount(detail.getCouponPrice()); goods.setZkPrice(detail.getOriginalPrice()); if (new BigDecimal(detail.getCouponConditions()).compareTo(new BigDecimal(0)) > 0) goods.setCouponInfo(String.format("满%s元减%s元", detail.getCouponConditions(), MoneyBigDecimalUtil.getWithNoZera(detail.getCouponPrice()).toString())); else goods.setCouponInfo(String.format("%s元无条件券", detail.getCouponPrice())); } return goods; } } fanli/src/main/java/com/yeshi/fanli/util/taobao/TaoBaoUtil.java
@@ -53,6 +53,7 @@ import com.yeshi.fanli.entity.taobao.TaoBaoShop; import com.yeshi.fanli.entity.taobao.TaoBaoUnionConfig; import com.yeshi.fanli.entity.taobao.dataoke.DaTaoKeDetail; import com.yeshi.fanli.entity.taobao.dataoke.DaTaoKeDetailV2; import com.yeshi.fanli.exception.taobao.TaobaoGoodsDownException; import com.yeshi.fanli.log.LogHelper; import com.yeshi.fanli.service.inter.goods.TaoBaoLinkService; @@ -64,7 +65,6 @@ import com.yeshi.fanli.util.StringUtil; import com.yeshi.fanli.util.TaoBaoHttpUtil; import com.yeshi.fanli.util.TimeUtil; import com.yeshi.fanli.vo.msg.ClientTextStyleVO; import net.sf.json.JSONArray; import net.sf.json.JSONObject; @@ -1698,6 +1698,32 @@ return taoBaoGoods; } public static TaoBaoGoodsBrief convert(DaTaoKeDetailV2 detail) { TaoBaoGoodsBrief taoBaoGoods = new TaoBaoGoodsBrief(); taoBaoGoods.setAuctionId(detail.getGoodsId()); taoBaoGoods.setBiz30day(detail.getMonthSales()); taoBaoGoods.setCouponAmount(detail.getCouponPrice()); taoBaoGoods.setCouponInfo(String.format("满%s元减%s元", detail.getCouponConditions(), MoneyBigDecimalUtil.getWithNoZera(detail.getCouponPrice()))); if (detail.getCouponTotalNum() != null && detail.getCouponReceiveNum() != null) taoBaoGoods.setCouponLeftCount(detail.getCouponTotalNum() - detail.getCouponReceiveNum()); else taoBaoGoods.setCouponLeftCount(0); taoBaoGoods.setCouponStartFee(new BigDecimal(detail.getCouponConditions())); taoBaoGoods.setCouponTotalCount(detail.getCouponTotalNum()); taoBaoGoods.setPictUrl(detail.getMainPic()); taoBaoGoods.setPictUrlWhite(detail.getMainPic()); taoBaoGoods.setSellerId(detail.getSellerId()); taoBaoGoods.setShopTitle(detail.getShopName()); taoBaoGoods.setTitle(detail.getDtitle()); taoBaoGoods.setUserType(detail.getShopType()); taoBaoGoods.setZkPrice(detail.getOriginalPrice()); taoBaoGoods.setTkRate(detail.getCommissionRate()); taoBaoGoods.setTkCommFee(new BigDecimal("0")); taoBaoGoods.setState(0); return taoBaoGoods; } /** * 获取淘宝联盟的授权链接 *