Kaynağa Gözat

京东API退货拉取

yzc 1 yıl önce
ebeveyn
işleme
34d0fb0d4f

+ 1 - 0
hx-admin/src/main/resources/application.yml

@@ -98,6 +98,7 @@ spring:
         testOnReturn: false
         poolPreparedStatements: true
         maxPoolPreparedStatementPerConnectionSize: 20
+        queryTimeout: 30000
 
     druid:
       webStatFilter:

+ 24 - 2
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/entity/jd/po/JdBack.java

@@ -1,11 +1,13 @@
 package com.fjhx.victoriatourist.entity.jd.po;
 
-import com.ruoyi.common.core.domain.BasePo;
 import com.baomidou.mybatisplus.annotation.TableName;
-import java.util.Date;
+import com.ruoyi.common.core.domain.BasePo;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.math.BigDecimal;
+import java.util.Date;
+
 /**
  * <p>
  * 京东退货
@@ -44,4 +46,24 @@ public class JdBack extends BasePo {
      */
     private Long batchFlag;
 
+    //----------------------------京东字段开始-------------------------------------
+    private Long returnId;
+    private String providerCode;
+    private String providerName;
+    private Date createDate;
+    private String fromDeliverCenterName;
+    private String toDeliverCenterName;
+    private String returnStateName;
+    private Integer totalNum;
+    private BigDecimal totalPrice;
+    private String stockName;
+    private String wareHouseAddress;
+    private String wareHouseCell;
+    private String wareHouseContact;
+    private Date outStoreRoomDate;
+    private Integer wareVariety;
+    private String balanceStateName;
+    private Date balanceDate;
+    //----------------------------京东字段结束-------------------------------------
+
 }

+ 14 - 0
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/entity/jd/po/JdBackDetails.java

@@ -99,4 +99,18 @@ public class JdBackDetails extends BasePo {
     @ExcelProperty("备注")
     private String remark;
 
+    //----------------------------京东字段开始-------------------------------------
+    private Long wareId;
+    private String wareName;
+    private String brandName;
+    private BigDecimal returnsPrice;
+    private Integer returnsNum;
+    private Integer factNum;
+    private BigDecimal totalPrice;
+    private String isbn;
+    private BigDecimal discount;
+    private BigDecimal makePrice;
+    private String bizCode;
+    //----------------------------京东字段结束-------------------------------------
+
 }

+ 117 - 56
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/service/jd/impl/JdApiServiceImpl.java

@@ -5,22 +5,28 @@ import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.extra.spring.SpringUtil;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.fjhx.victoriatourist.entity.jd.po.JdBack;
+import com.fjhx.victoriatourist.entity.jd.po.JdBackDetails;
 import com.fjhx.victoriatourist.entity.jd.po.JdOrder;
 import com.fjhx.victoriatourist.entity.jd.po.JdOrderDetails;
-import com.fjhx.victoriatourist.service.jd.JdApiService;
-import com.fjhx.victoriatourist.service.jd.JdOrderDetailsService;
-import com.fjhx.victoriatourist.service.jd.JdOrderService;
+import com.fjhx.victoriatourist.service.jd.*;
 import com.jd.open.api.sdk.DefaultJdClient;
 import com.jd.open.api.sdk.JdClient;
 import com.jd.open.api.sdk.domain.supplier.PoQueryForJosWebService.response.getdetailbyorderid.JOSDetailResultDto;
 import com.jd.open.api.sdk.domain.supplier.PoQueryForJosWebService.response.getdetailbyorderid.PurchaseAllocationDetailDto;
 import com.jd.open.api.sdk.domain.supplier.PoQueryForJosWebService.response.getpurchaseorderlist.JOSOrderResultDto;
 import com.jd.open.api.sdk.domain.supplier.PoQueryForJosWebService.response.getpurchaseorderlist.PurchaseOrderDto;
+import com.jd.open.api.sdk.domain.supplier.ReturnOrderForJosWebService.response.detail.DetailResultDto;
+import com.jd.open.api.sdk.domain.supplier.ReturnOrderForJosWebService.response.get.RoDto;
+import com.jd.open.api.sdk.domain.supplier.ReturnOrderForJosWebService.response.get.RoResultDto;
+import com.jd.open.api.sdk.request.supplier.VcGetReturnOrderDetailRequest;
 import com.jd.open.api.sdk.request.supplier.VcGetdetailbyorderidRequest;
 import com.jd.open.api.sdk.request.supplier.VcGetpurchaseorderlistRequest;
+import com.jd.open.api.sdk.request.supplier.VcReturnOrderListPageGetRequest;
+import com.jd.open.api.sdk.response.supplier.VcGetReturnOrderDetailResponse;
 import com.jd.open.api.sdk.response.supplier.VcGetdetailbyorderidResponse;
 import com.jd.open.api.sdk.response.supplier.VcGetpurchaseorderlistResponse;
-import com.ruoyi.framework.mybatis.holder.TenantHolder;
+import com.jd.open.api.sdk.response.supplier.VcReturnOrderListPageGetResponse;
 import com.ruoyi.system.utils.ConfigUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.IOUtils;
@@ -37,10 +43,7 @@ import org.springframework.stereotype.Service;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -48,14 +51,18 @@ import java.util.stream.Collectors;
 public class JdApiServiceImpl implements JdApiService {
 
     private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-
     private static final String appKey = "ECCD5CE82A501C7E0D8BB41C030C447D";
     private static final String appSecret = "5b55c3f3eb874b0d8746ff28e7f91f64";
+    private final String tenantId = "prod".equals(SpringUtil.getActiveProfile()) ? "wdly" : "wdlytest";
 
     @Autowired
     private JdOrderService jdOrderService;
     @Autowired
     private JdOrderDetailsService jdOrderDetailsService;
+    @Autowired
+    private JdBackService jdBackService;
+    @Autowired
+    private JdBackDetailsService jdBackDetailsService;
 
     /**
      * 获取AccessToken
@@ -118,7 +125,6 @@ public class JdApiServiceImpl implements JdApiService {
         // 每1分钟执行一次
 //    @Scheduled(cron = "0 0/1 *  * * ? ")
     void orderSync() throws Exception {
-        String tenantId = "prod".equals(SpringUtil.getActiveProfile()) ? "wdly" : "wdlytest";
 
         JSONObject jdTokenJson = JSONObject.parseObject(ConfigUtil.get("jd_token_json"));
         if (ObjectUtil.isEmpty(jdTokenJson)) {
@@ -128,24 +134,37 @@ public class JdApiServiceImpl implements JdApiService {
 
         JdClient client = new DefaultJdClient("http://api.jd.com/routerjson", jdTokenJson.getString("access_token"), appKey, appSecret);
 
+
+    }
+
+    /**
+     * 获取京东订单信息分页
+     */
+    private JOSOrderResultDto getJdOrderInfo(Integer pageIndex, Integer pageSize, Date startTime, Date endTime, JdClient client) throws Exception {
+        VcGetpurchaseorderlistRequest request = new VcGetpurchaseorderlistRequest();
+        request.setCreatedDateStart(startTime);
+        request.setCreatedDateEnd(endTime);
+        request.setPageIndex(pageIndex);
+        request.setPageSize(pageSize);
+        VcGetpurchaseorderlistResponse response = client.execute(request);
+        return response.getJosOrderResultDto();
+    }
+
+    /**
+     * 获取京东订单
+     */
+    private void getJdOrder(JdClient client) throws Exception {
         //获取开始同步的时间
         Date startTime = sdf.parse("2023-11-01 00:00:00");
-        TenantHolder.setIgnore(true);//忽略租户
+        Date endTime = new Date();
+        //根据下单时间获取数据库里最后一个订单
         JdOrder lastJdOrder = jdOrderService.getOne(q -> q.isNotNull(JdOrder::getCreatedDate).orderByDesc(JdOrder::getCreatedDate));
-        TenantHolder.clear();
         if (ObjectUtil.isNotEmpty(lastJdOrder)) {
             //将最后一个下单时间减1个小时设置为开始时间
-            Calendar calendar = Calendar.getInstance();
-            calendar.setTime(lastJdOrder.getCreatedDate());
-            calendar.add(Calendar.HOUR_OF_DAY, -1);
-
-            startTime = calendar.getTime();
+            startTime = calculateTime(lastJdOrder.getCreatedDate(),Calendar.HOUR_OF_DAY, -1);
         }
-
-        Date endTime = new Date();
-
+        //计算总页数
         Integer recordCount = getJdOrderInfo(1, 1, startTime, endTime, client).getRecordCount();
-
         int pageSize = 50;
         int pageCount = (recordCount + pageSize - 1) / pageSize;
 
@@ -153,15 +172,16 @@ public class JdApiServiceImpl implements JdApiService {
         //数据返回订单是倒序反过来按正顺保存
         for (int i = pageCount; i > 0; i--) {
             JOSOrderResultDto josOrderResultDto = getJdOrderInfo(i, pageSize, startTime, endTime, client);
-            purchaseOrderList.addAll(josOrderResultDto.getPurchaseOrderList());
+            List<PurchaseOrderDto> purchaseOrderList1 = josOrderResultDto.getPurchaseOrderList();
+            //京东回来的数据是按时间倒序的,使用reverse方法将list中的数据翻转为正序
+            Collections.reverse(purchaseOrderList1);
+            purchaseOrderList.addAll(purchaseOrderList1);
         }
 
         //处理数据(过滤已存在的数据)
         List<Long> jdOrderIds = purchaseOrderList.stream().map(PurchaseOrderDto::getOrderId).collect(Collectors.toList());
-        TenantHolder.setIgnore(true);//忽略租户
         //获取已同步的京东订单id
         List<Long> jdOrderIds1 = jdOrderService.listObject(JdOrder::getOrderId, q -> q.in(JdOrder::getOrderId, jdOrderIds));
-        TenantHolder.clear();
 
         //过滤出未同步的数据
         List<PurchaseOrderDto> purchaseOrderListFilter = purchaseOrderList.stream().filter(item -> !jdOrderIds1.contains(item.getOrderId())).collect(Collectors.toList());
@@ -171,9 +191,7 @@ public class JdApiServiceImpl implements JdApiService {
         //赋值租户id
         jdOrderList.forEach(item -> item.setTenantId(tenantId));
         //将数据存储到库
-        TenantHolder.setIgnore(true);//忽略租户
         jdOrderService.saveBatch(jdOrderList);
-        TenantHolder.clear();
 
         //获取明细
         List<JdOrderDetails> jdOrderDetailsList = new ArrayList<>();
@@ -193,24 +211,75 @@ public class JdApiServiceImpl implements JdApiService {
         }
         //赋值租户id
         jdOrderList.forEach(item -> item.setTenantId(tenantId));
-        TenantHolder.setIgnore(true);//忽略租户
         jdOrderDetailsService.saveBatch(jdOrderDetailsList);
-        TenantHolder.clear();
     }
 
+
     /**
-     * 获取京东单信息分页
+     * 获取京东退货单信息分页
      */
-    private JOSOrderResultDto getJdOrderInfo(Integer pageIndex, Integer pageSize, Date startTime, Date endTime, JdClient client) throws Exception {
-        VcGetpurchaseorderlistRequest request = new VcGetpurchaseorderlistRequest();
-        request.setCreatedDateStart(startTime);
-        request.setCreatedDateEnd(endTime);
-        request.setPageIndex(pageIndex);
-        request.setPageSize(pageSize);
-        VcGetpurchaseorderlistResponse response = client.execute(request);
-        return response.getJosOrderResultDto();
+    private static RoResultDto getJdBackOrderInfo(Integer pageIndex, Integer pageSize, Date startTime, Date endTime, JdClient client) throws Exception {
+        VcReturnOrderListPageGetRequest request = new VcReturnOrderListPageGetRequest();
+        request.setCreateDateBegin(startTime);
+        request.setCreateDateEnd(endTime);
+        request.setPageSize(pageIndex);
+        request.setPageIndex(pageSize);
+        VcReturnOrderListPageGetResponse response = client.execute(request);
+        return response.getRoResultDto();
+    }
+
+    /**
+     * 获取京东退货订单
+     */
+    private void getJdBackOrder(JdClient client) throws Exception {
+        //获取开始同步的时间
+        //获取开始同步的时间
+        Date startTime = sdf.parse("2023-11-01 00:00:00");
+        Date endTime = new Date();
+        //根据下单时间获取数据库里最后一个订单
+        JdBack lastJdBack = jdBackService.getOne(q -> q.isNotNull(JdBack::getCreateDate).orderByDesc(JdBack::getCreateDate));
+        if (ObjectUtil.isNotEmpty(lastJdBack)) {
+            //将最后一个下单时间减1个小时设置为开始时间
+            startTime = calculateTime(lastJdBack.getCreateDate(),Calendar.HOUR_OF_DAY, -1);
+        }
+
+        //获取数据总页数
+        RoResultDto jdBackOrderInfo = getJdBackOrderInfo(1, 1, startTime, endTime, client);
+        Integer recordCount = jdBackOrderInfo.getRecordCount();
+        int pageSize = 50;
+        int pageCount = (recordCount + pageSize - 1) / pageSize;
+        //获取最后一页数据
+        RoResultDto jdBackOrderInfo1 = getJdBackOrderInfo(pageCount, pageSize, startTime, endTime, client);
+        List<RoDto> roDtoList = jdBackOrderInfo1.getRoDtoList();
+        //京东回来的数据是按时间倒序的,使用reverse方法将list中的数据翻转为正序
+        Collections.reverse(roDtoList);
+
+        //过滤出不在数据库里的新数据
+        List<Long> returnIds = roDtoList.stream().map(RoDto::getReturnId).collect(Collectors.toList());
+        List<Long> existReturnIds = jdBackService.listObject(JdBack::getReturnId, q -> q.in(JdBack::getReturnId, returnIds));
+        roDtoList = roDtoList.stream().filter(item -> !existReturnIds.contains(item.getReturnId())).collect(Collectors.toList());
+        //转成我们自己的实体类
+        List<JdBack> jdBackList = BeanUtil.copyToList(roDtoList, JdBack.class);
+        jdBackService.saveBatch(jdBackList);
+        //获取明细
+        List<JdBackDetails> JdBackDetailsList = new ArrayList<>();
+        for (JdBack jdBack : jdBackList) {
+            VcGetReturnOrderDetailRequest request = new VcGetReturnOrderDetailRequest();
+            request.setReturnId(jdBack.getReturnId());
+            VcGetReturnOrderDetailResponse response = client.execute(request);
+            DetailResultDto detailResultDto = response.getDetailResultDto();
+
+            List<JdBackDetails> jdBackDetails = BeanUtil.copyToList(detailResultDto.getDetailDtoList(), JdBackDetails.class);
+            jdBackDetails.forEach(item -> item.setJdBackId(jdBack.getId()));
+            JdBackDetailsList.addAll(jdBackDetails);
+        }
+        jdBackDetailsService.saveBatch(JdBackDetailsList);
     }
 
+
+    /**
+     * 请求API工具方法
+     */
     private static JSONObject getJSON(HttpRequestBase httpRequestBase) throws IOException {
         HttpClient client = HttpClients.createDefault();
         httpRequestBase.setConfig(RequestConfig.custom().setConnectTimeout(3000).build());
@@ -224,28 +293,20 @@ public class JdApiServiceImpl implements JdApiService {
         return JSONObject.parseObject(responseStr);
     }
 
+    /**
+     * 计算时间公共方法
+     */
+    private Date calculateTime(Date date,Integer field, Integer amount){
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        calendar.add(field, amount);
+        return calendar.getTime();
+    }
+
     public static void main(String[] args) throws Exception {
         JdClient client = new DefaultJdClient("http://api.jd.com/routerjson", "a1f79f4670fd43a28fa2de02abd86f03ytfm", appKey, appSecret);
 
 
-        {
-            VcGetpurchaseorderlistRequest request = new VcGetpurchaseorderlistRequest();
-            request.setCreatedDateStart(sdf.parse("2023-11-01 00:00:00"));
-            request.setCreatedDateEnd(new Date());
-            request.setPageIndex(1);
-            request.setPageSize(10);
-            VcGetpurchaseorderlistResponse response = client.execute(request);
-            System.out.println(JSONObject.toJSONString(response));
-        }
-
-
-        {
-            VcGetdetailbyorderidRequest request = new VcGetdetailbyorderidRequest();
-            request.setOrderId(1490391996L);
-            request.setIsPage(false);
-            VcGetdetailbyorderidResponse response = client.execute(request);
-            System.out.println(JSONObject.toJSONString(response));
-        }
-
     }
+
 }