diff --git a/tao-api/src/main/java/com/qihang/tao/api/GoodsApiHelper.java b/tao-api/src/main/java/com/qihang/tao/api/GoodsApiHelper.java new file mode 100644 index 00000000..58a89af3 --- /dev/null +++ b/tao-api/src/main/java/com/qihang/tao/api/GoodsApiHelper.java @@ -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 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 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 pullSku(TaobaoClient client, String sessionKey, Long numIid) { + try { + List 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; + } + } +} diff --git a/tao-api/src/main/java/com/qihang/tao/controller/GoodsApiController.java b/tao-api/src/main/java/com/qihang/tao/controller/GoodsApiController.java index b368c6a2..8f601ad2 100644 --- a/tao-api/src/main/java/com/qihang/tao/controller/GoodsApiController.java +++ b/tao-api/src/main/java/com/qihang/tao/controller/GoodsApiController.java @@ -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 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 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 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 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 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 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 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 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 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); + + } + +} diff --git a/tao-api/src/main/java/com/qihang/tao/domain/TaoGoods.java b/tao-api/src/main/java/com/qihang/tao/domain/TaoGoods.java index 2c942f8e..fd9e05a7 100644 --- a/tao-api/src/main/java/com/qihang/tao/domain/TaoGoods.java +++ b/tao-api/src/main/java/com/qihang/tao/domain/TaoGoods.java @@ -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 skus; + private static final long serialVersionUID = 1L; + public List getSkus() { + return skus; + } + + public void setSkus(List skus) { + this.skus = skus; + } + /** * */ diff --git a/tao-api/src/main/java/com/qihang/tao/domain/TaoGoodsSku.java b/tao-api/src/main/java/com/qihang/tao/domain/TaoGoodsSku.java index fb82fbbd..e7b89114 100644 --- a/tao-api/src/main/java/com/qihang/tao/domain/TaoGoodsSku.java +++ b/tao-api/src/main/java/com/qihang/tao/domain/TaoGoodsSku.java @@ -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; } diff --git a/tao-api/src/main/java/com/qihang/tao/service/TaoGoodsService.java b/tao-api/src/main/java/com/qihang/tao/service/TaoGoodsService.java index b88fd0ca..c8b0cf2e 100644 --- a/tao-api/src/main/java/com/qihang/tao/service/TaoGoodsService.java +++ b/tao-api/src/main/java/com/qihang/tao/service/TaoGoodsService.java @@ -13,4 +13,6 @@ import com.qihang.tao.domain.bo.TaoGoodsBo; */ public interface TaoGoodsService extends IService { PageResult queryPageList(TaoGoodsBo bo, PageQuery pageQuery); + + int saveAndUpdateGoods(Integer shopId,TaoGoods goods); } diff --git a/tao-api/src/main/java/com/qihang/tao/service/impl/TaoGoodsServiceImpl.java b/tao-api/src/main/java/com/qihang/tao/service/impl/TaoGoodsServiceImpl.java index 32e7e2c8..bb55a999 100644 --- a/tao-api/src/main/java/com/qihang/tao/service/impl/TaoGoodsServiceImpl.java +++ b/tao-api/src/main/java/com/qihang/tao/service/impl/TaoGoodsServiceImpl.java @@ -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 implements TaoGoodsService { private final TaoGoodsMapper mapper; + private final TaoGoodsSkuMapper skuMapper; @Override public PageResult queryPageList(TaoGoodsBo bo, PageQuery pageQuery) { @@ -31,6 +39,43 @@ public class TaoGoodsServiceImpl extends ServiceImpl return PageResult.build(taoGoodsPage); } + + @Transactional + @Override + public int saveAndUpdateGoods(Integer shopId, TaoGoods goods) { + List goodsList = mapper.selectList(new LambdaQueryWrapper().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().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; + } + } }