|
@@ -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));
|
|
|
- }
|
|
|
-
|
|
|
}
|
|
|
+
|
|
|
}
|