taoapigoods

This commit is contained in:
启航 2024-03-01 18:43:36 +08:00
parent a2d4e766cb
commit 6a64f38cd5
6 changed files with 270 additions and 155 deletions

View File

@ -0,0 +1,98 @@
package com.qihang.tao.api;
import com.qihang.tao.domain.TaoGoods;
import com.qihang.tao.domain.TaoGoodsSku;
import com.qihang.tao.domain.TaoOrder;
import com.taobao.api.ApiException;
import com.taobao.api.DefaultTaobaoClient;
import com.taobao.api.TaobaoClient;
import com.taobao.api.domain.Item;
import com.taobao.api.request.ItemSkusGetRequest;
import com.taobao.api.request.ItemsOnsaleGetRequest;
import com.taobao.api.response.ItemSkusGetResponse;
import com.taobao.api.response.ItemsOnsaleGetResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
public class GoodsApiHelper {
private static Logger log = LoggerFactory.getLogger(GoodsApiHelper.class);
private static final String LIST_FIELDS = "approve_status,num_iid,title,nick,type,cid,pic_url,num,props,props_name,valid_thru,list_time,price,has_discount,has_invoice,has_warranty," +
"has_showcase,modified,delist_time,postage_id,seller_cids,outer_id,sold_quantity,skus";
public static ApiResult<TaoGoods> pullGoods(Long pageNo, Long pageSize, String url, String appKey, String appSecret, String sessionKey) throws ApiException {
log.info("=======开始全量商品数据{}=========", LocalDateTime.now());
TaobaoClient client = new DefaultTaobaoClient(url, appKey, appSecret);
ItemsOnsaleGetRequest req = new ItemsOnsaleGetRequest();
req.setFields(LIST_FIELDS);
req.setPageNo(pageNo);
req.setPageSize(pageSize);
ItemsOnsaleGetResponse rsp = client.execute(req, sessionKey);
if (rsp.getItems() == null) {
return new ApiResult(0, new ArrayList());
}
List<TaoGoods> goodsList = new ArrayList<>();
for (Item item : rsp.getItems()) {
TaoGoods goods = new TaoGoods();
goods.setNumIid(item.getNumIid());
goods.setTitle(item.getTitle());
goods.setNick(item.getNick());
goods.setType(item.getType());
goods.setCid(item.getCid());
goods.setSellerCids(item.getSellerCids());
goods.setPicUrl(item.getPicUrl());
goods.setNum(item.getNum().intValue());
goods.setValidThru(item.getValidThru().intValue());
goods.setHasDiscount(item.getHasDiscount() + "");
goods.setHasInvoice(item.getHasInvoice() + "");
goods.setHasWarranty(item.getHasWarranty() + "");
goods.setHasShowcase(item.getHasShowcase() + "");
goods.setModified(item.getModified());
goods.setCreateTime(item.getCreated());
goods.setDelistTime(item.getDelistTime());
goods.setPostageId(item.getPostageId() != null ? item.getPostageId().intValue() : 0);
goods.setOuterId(item.getOuterId());
goods.setListTime(item.getListTime());
goods.setPrice(item.getPrice());
goods.setSoldQuantity(item.getSoldQuantity() == null ? 0 : item.getSoldQuantity().intValue());
goods.setFirstStartsTime(item.getFirstStartsTime());
goods.setSkus(pullSku(client, sessionKey, item.getNumIid()));
goodsList.add(goods);
}
return new ApiResult(rsp.getTotalResults().intValue(), goodsList);
}
private static List<TaoGoodsSku> pullSku(TaobaoClient client, String sessionKey, Long numIid) {
try {
List<TaoGoodsSku> skus = new ArrayList<>();
ItemSkusGetRequest req1 = new ItemSkusGetRequest();
req1.setFields("sku_id,num_iid,properties,properties_name,quantity,price,outer_id,created,modified,status,sku_spec_id,barcode");
req1.setNumIids(numIid + "");
ItemSkusGetResponse rsp1 = client.execute(req1, sessionKey);
if (rsp1.getSkus() != null) {
for (var s : rsp1.getSkus()) {
TaoGoodsSku sku = new TaoGoodsSku();
sku.setNumIid(s.getNumIid());
sku.setSkuId(s.getSkuId());
sku.setProperties(s.getProperties());
sku.setPropertiesName(s.getPropertiesName());
sku.setQuantity(s.getQuantity());
sku.setPrice(StringUtils.hasText(s.getPrice())?Double.parseDouble(s.getPrice()):0.0);
sku.setOuterId(s.getOuterId());
sku.setStatus(s.getStatus());
sku.setCreated(s.getCreated());
sku.setModified(s.getModified());
skus.add(sku);
}
return skus;
} else return null;
} catch (Exception e) {
return null;
}
}
}

View File

@ -1,149 +1,105 @@
//package com.qihang.tao.controller;
//
//import com.qihang.tao.common.ApiResult;
//import org.springframework.util.StringUtils;
//import org.springframework.web.bind.annotation.RequestBody;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RequestMethod;
//import org.springframework.web.bind.annotation.RestController;
//
//import java.util.Map;
//
//@RestController
//public class GoodsApiController {
///**
// * @api {post} /api/v1/pull_goods 更新店铺商品列表
// * @apiVersion 1.0.0
// * @apiName pullGoods
// * @apiGroup taoGood
// * @apiParam {String} startTime 开始时间
// * @apiParam {String} endTime 结束时间
// * @apiParam {Number} shopId 店铺id(东方符号7)
// * @apiSuccessExample {json} Success-Response:
// * HTTP/1.1 200 OK{
// "code": "0成功其他失败",
// "msg": "成功或失败信息"
// }
// */
// @RequestMapping(value = "/pull_goods", method = RequestMethod.POST)
// public ApiResult<Integer> getOrderList(@RequestBody DataRow reqData) throws Exception {
// String startDate = reqData.getString("startTime");
// String endDate = reqData.getString("endTime");
// Integer shopId=reqData.getInt("shopId");
// var checkResult = this.check(shopId);
// if (checkResult.getCode() != EnumResultVo.SUCCESS.getIndex()) {
// return new ApiResult<>(checkResult.getCode(), checkResult.getMsg());
// }
// Integer pageIndex = 1;
// Integer pageSize = 40;
// Long endTime = System.currentTimeMillis() / 1000;//更新结束时间
// Long startTime = endTime-(60 * 60 * 24 * 7);//更新开始时间
// if(!StringUtils.isEmpty(startDate))startTime = DateUtil.dateToStamp(startDate).longValue();
//
// if (!StringUtils.isEmpty(endDate)) endTime = DateUtil.dateTimeToStamp(endDate + " 23:59:00").longValue();
//
// long kaishidaojiesu = endTime - startTime;
// long forSize = (kaishidaojiesu % (60 * 60 * 24 * 7) == 0) ? kaishidaojiesu / (60 * 60 * 24 * 7) : kaishidaojiesu / (60 * 60 * 24 * 7) + 1;//计算需要循环的次数
// for (int i = 0; i < forSize; i++) {
// Long startTime1 = startTime + i * 60 * 60 * 24 * 7;
// Long endTime1 = startTime1 + 60 * 60 * 24 * 7;
// Integer totalCount = pullGoods(checkResult.getData(),pageIndex,pageSize,startTime1,endTime1);
// int totalPage = (totalCount % pageSize == 0) ? totalCount / pageSize : (totalCount / pageSize) + 1;
// while (pageIndex < totalPage) {
// pageIndex++;
// pullGoods(checkResult.getData(),pageIndex,pageSize,startTime1,endTime1);
// }
// pageIndex=1;
// }
// return new ApiResult<>(EnumResultVo.SUCCESS.getIndex(), "SUCCESS");
// }
//
// public Integer pullGoods(DcSysThirdSettingEntity result, Integer pageNo, Integer pageSize, Long startTime, Long endTime) throws Exception{
// String sendUrl="http://gw.api.taobao.com/router/rest";
// Map<String, String> params = new HashMap<>();
// params.put("method","taobao.items.onsale.get");
// params.put("app_key",result.getAppKey());
// params.put("sign_method","md5");
// params.put("timestamp",String.valueOf(System.currentTimeMillis()));
// params.put("session",result.getAccess_token());
// params.put("v","2.0");
// params.put("fields","approve_status,num_iid,title,pic_url,num,list_time,price,delist_time,outer_id,sold_quantity,modified");
// params.put("nick",result.getName());
// params.put("page_no",String.valueOf(pageNo));
// params.put("page_size",String.valueOf(pageSize));
// params.put("start_modified",DateUtil.stampToDateTime(startTime));
// params.put("end_modified",DateUtil.stampToDateTime(endTime));
// params.put("sign",ExpressClient.buildSign(params,result.getAppSecret()));
// HttpResponse<String> response = HttpUtil.doPost(sendUrl,HttpUtil.map2Url(params));
// var dd = XmlUtil.xmlToJson(response.body());
// if(dd.getInteger("total_results").intValue()>0){
// var jsonArray= dd.getJSONObject("items").getJSONArray("item");
// taoGoodService.addTaoGoods(jsonArray);
// }
// return dd.getInteger("total_results");
// }
//
// /**
// * @api {post} /pull_goods_comment 更新商品评价
// * @apiVersion 1.0.0
// * @apiName pullGoodsComment
// * @apiGroup taoGood
// * @apiSuccessExample {json} Success-Response:
// * HTTP/1.1 200 OK
// * {
// * "code": 0:成功,
// * "msg": "信息"
// * }
// */
///* @RequestMapping(value = "/pull_goods_comment", method = RequestMethod.POST)
// public ApiResult<Integer> pullGoodsComments(HttpServletRequest request){
// Integer shopId=7;
// Integer pageIndex = 1;
// Integer pageSize = 100;
// Date startDate=StringUtils.isEmpty(taoGoodService.getGoodCommentDate()) ? DateUtil.beforeDayDate(180) : taoGoodService.getGoodCommentDate();
// System.out.println(startDate);
// var result = pullTaoGoodsComment(shopId,pageIndex,pageSize,startDate);
// if(result.getCode()==0){
// while (result.getData().intValue()>pageSize.intValue()) {
// pageIndex++;
// System.out.println(pageIndex);
// pullTaoGoodsComment(shopId,pageIndex,pageSize,startDate);
// }
// return new ApiResult<>(EnumResultVo.SUCCESS.getIndex(),"成功");
// }else return new ApiResult<>(EnumResultVo.Fail.getIndex(),"失败");
//
// }*/
///* public ApiResult<Integer> pullTaoGoodsComment(Integer shopId,Integer pageIndex,Integer pageSize,Date startDate){
// var result = this.check(shopId).getData();
// TaobaoClient client = new DefaultTaobaoClient(result.getRequest_url(), result.getAppKey(), result.getAppSecret());
// TraderatesGetRequest req = new TraderatesGetRequest();
// req.setFields("tid,oid,role,nick,result,totalResults,hasNext,created,rated_nick,item_title,item_price,content,reply,num_iid");
// req.setRateType("get");
// req.setRole("buyer");
// req.setStartDate(startDate);
// req.setPageNo(pageIndex.longValue());
// req.setPageSize(pageSize.longValue());
// req.setUseHasNext(true);
// try {
// TraderatesGetResponse rsp = client.execute(req, result.getAccess_token());
// if(rsp.getTradeRates().size()>0){
// List<DcTaoGoodsCommentEntity> list =new ArrayList<>();
// rsp.getTradeRates().forEach(c->{
// DcTaoGoodsCommentEntity comment=new DcTaoGoodsCommentEntity();
// comment.setNumIid(c.getNumIid());
// comment.setBuyer(c.getNick());
// comment.setCreated(c.getCreated());
// comment.setTid(c.getTid());
// comment.setOid(c.getOid());
// comment.setComment(c.getContent());
// comment.setResult(c.getResult());
// list.add(comment);
// });
// taoGoodService.addGoodComment(list);
// return new ApiResult<>(EnumResultVo.SUCCESS.getIndex(),"成功",rsp.getTradeRates().size());
// }else return new ApiResult<>(EnumResultVo.SUCCESS.getIndex(),"失败");
// }catch (Exception e){
// return new ApiResult<>(EnumResultVo.Fail.getIndex(),"失败",0);
// }
// }*/
//}
package com.qihang.tao.controller;
import com.qihang.common.common.EnumResultVo;
import com.qihang.common.enums.HttpStatus;
import com.qihang.tao.api.ApiCommon;
import com.qihang.tao.api.ApiResult;
import com.qihang.tao.api.GoodsApiHelper;
import com.qihang.tao.api.OrderApiHelper;
import com.qihang.tao.common.TaoRequest;
import com.qihang.tao.domain.TaoGoods;
import com.qihang.tao.domain.TaoOrder;
import com.qihang.tao.service.TaoGoodsService;
import lombok.AllArgsConstructor;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
@RequestMapping("/goods")
@RestController
@AllArgsConstructor
public class GoodsApiController {
private final ApiCommon apiCommon;
private final TaoGoodsService goodsService;
/**
* @api {post} /api/v1/pull_goods 更新店铺商品列表
* @apiVersion 1.0.0
* @apiName pullGoods
* @apiGroup taoGood
* @apiParam {String} startTime 开始时间
* @apiParam {String} endTime 结束时间
* @apiParam {Number} shopId 店铺id(东方符号7)
* @apiSuccessExample {json} Success-Response:
* HTTP/1.1 200 OK{
"code": "0成功其他失败",
"msg": "成功或失败信息"
}
*/
@RequestMapping(value = "/pull_goods", method = RequestMethod.POST)
public ApiResult<Integer> pullGoodsList(@RequestBody TaoRequest req) throws Exception {
if (req.getShopId() == null || req.getShopId() <= 0) {
return new ApiResult(HttpStatus.PARAMS_ERROR, "参数错误没有店铺Id");
}
var checkResult = apiCommon.checkBefore(req.getShopId());
if (checkResult.getCode() != HttpStatus.SUCCESS) {
return new ApiResult(checkResult.getCode(), checkResult.getMsg());
}
String sessionKey = checkResult.getData().getAccessToken();
String url = checkResult.getData().getApiRequestUrl();
String appKey = checkResult.getData().getAppKey();
String appSecret = checkResult.getData().getAppSecret();
Long pageIndex = 1L;
Long pageSize = 40L;
ApiResult<TaoGoods> listApiResult = GoodsApiHelper.pullGoods(pageIndex, pageSize, url, appKey, appSecret, sessionKey);
int insertSuccess = 0;//新增成功的订单
int totalError = 0;
int hasExistOrder = 0;//已存在的订单数
for (var goods:listApiResult.getList()) {
int result = goodsService.saveAndUpdateGoods(req.getShopId(), goods);
if (result == EnumResultVo.DataExist.getIndex()) {
//已经存在
hasExistOrder++;
} else if (result == EnumResultVo.SUCCESS.getIndex()) {
insertSuccess++;
}else {
totalError++;
}
}
//计算总页数
int totalPage = (listApiResult.getTotalRecords() % pageSize == 0) ? listApiResult.getTotalRecords() / pageSize.intValue() : (listApiResult.getTotalRecords() / pageSize.intValue()) + 1;
pageIndex++;
while (pageIndex <= totalPage) {
ApiResult<TaoGoods> result1 = GoodsApiHelper.pullGoods(pageIndex, pageIndex, url, appKey, appSecret, sessionKey);
//循环插入订单数据到数据库
for (var goods:listApiResult.getList()) {
int result = goodsService.saveAndUpdateGoods(req.getShopId(), goods);
if (result == EnumResultVo.DataExist.getIndex()) {
//已经存在
hasExistOrder++;
} else if (result == EnumResultVo.SUCCESS.getIndex()) {
insertSuccess++;
}else {
totalError++;
}
}
pageIndex++;
}
String msg = "成功,总共找到:" + listApiResult.getTotalRecords() + "条订单,新增:" + insertSuccess + "条,添加错误:" + totalError + "条,更新:" + hasExistOrder + "";
return new ApiResult<>(EnumResultVo.SUCCESS.getIndex(), msg);
}
}

View File

@ -1,7 +1,10 @@
package com.qihang.tao.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
*
@ -168,8 +171,19 @@ public class TaoGoods implements Serializable {
*/
private Date createTime;
@TableField(exist = false)
private List<TaoGoodsSku> skus;
private static final long serialVersionUID = 1L;
public List<TaoGoodsSku> getSkus() {
return skus;
}
public void setSkus(List<TaoGoodsSku> skus) {
this.skus = skus;
}
/**
*
*/

View File

@ -66,12 +66,12 @@ public class TaoGoodsSku implements Serializable {
/**
* sku创建日期 时间格式yyyy-MM-dd HH:mm:ss
*/
private Date created;
private String created;
/**
* sku最后修改日期 时间格式yyyy-MM-dd HH:mm:ss
*/
private Date modified;
private String modified;
/**
* sku状态 normal
@ -262,28 +262,28 @@ public class TaoGoodsSku implements Serializable {
/**
* sku创建日期 时间格式yyyy-MM-dd HH:mm:ss
*/
public Date getCreated() {
public String getCreated() {
return created;
}
/**
* sku创建日期 时间格式yyyy-MM-dd HH:mm:ss
*/
public void setCreated(Date created) {
public void setCreated(String created) {
this.created = created;
}
/**
* sku最后修改日期 时间格式yyyy-MM-dd HH:mm:ss
*/
public Date getModified() {
public String getModified() {
return modified;
}
/**
* sku最后修改日期 时间格式yyyy-MM-dd HH:mm:ss
*/
public void setModified(Date modified) {
public void setModified(String modified) {
this.modified = modified;
}

View File

@ -13,4 +13,6 @@ import com.qihang.tao.domain.bo.TaoGoodsBo;
*/
public interface TaoGoodsService extends IService<TaoGoods> {
PageResult<TaoGoods> queryPageList(TaoGoodsBo bo, PageQuery pageQuery);
int saveAndUpdateGoods(Integer shopId,TaoGoods goods);
}

View File

@ -3,14 +3,21 @@ package com.qihang.tao.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qihang.common.common.EnumResultVo;
import com.qihang.tao.common.PageQuery;
import com.qihang.tao.common.PageResult;
import com.qihang.tao.domain.TaoGoods;
import com.qihang.tao.domain.TaoGoodsSku;
import com.qihang.tao.domain.bo.TaoGoodsBo;
import com.qihang.tao.mapper.TaoGoodsSkuMapper;
import com.qihang.tao.service.TaoGoodsService;
import com.qihang.tao.mapper.TaoGoodsMapper;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
/**
* @author TW
@ -23,6 +30,7 @@ public class TaoGoodsServiceImpl extends ServiceImpl<TaoGoodsMapper, TaoGoods>
implements TaoGoodsService {
private final TaoGoodsMapper mapper;
private final TaoGoodsSkuMapper skuMapper;
@Override
public PageResult<TaoGoods> queryPageList(TaoGoodsBo bo, PageQuery pageQuery) {
@ -31,6 +39,43 @@ public class TaoGoodsServiceImpl extends ServiceImpl<TaoGoodsMapper, TaoGoods>
return PageResult.build(taoGoodsPage);
}
@Transactional
@Override
public int saveAndUpdateGoods(Integer shopId, TaoGoods goods) {
List<TaoGoods> goodsList = mapper.selectList(new LambdaQueryWrapper<TaoGoods>().eq(TaoGoods::getNumIid, goods.getNumIid()));
if(goodsList!=null && goodsList.size()>0){
// 存在更新
goods.setShopId(shopId);
goods.setId(goodsList.get(0).getId());
mapper.updateById(goods);
// 删除sku
skuMapper.delete(new LambdaQueryWrapper<TaoGoodsSku>().eq(TaoGoodsSku::getTaoGoodsId,goods.getId()));
// 重新插入sku
if(goods.getSkus()!=null) {
for (var sku : goods.getSkus()) {
sku.setTaoGoodsId(goods.getId());
skuMapper.insert(sku);
}
}
return EnumResultVo.DataExist.getIndex();
}else {
// 不存在新增
goods.setShopId(shopId);
goods.setCreateTime(new Date());
mapper.insert(goods);
// 插入sku
if(goods.getSkus()!=null) {
for (var sku : goods.getSkus()) {
sku.setTaoGoodsId(goods.getId());
skuMapper.insert(sku);
}
}
return 0;
}
}
}