1
This commit is contained in:
@@ -1,22 +1,32 @@
|
||||
package cn.van.business.util;
|
||||
|
||||
|
||||
import cn.van.business.model.GoodsInfoVO;
|
||||
import cn.van.business.model.OrderRow;
|
||||
import cn.van.business.repository.OrderRowRepository;
|
||||
import com.alibaba.fastjson2.util.DateUtils;
|
||||
import com.jd.open.api.sdk.DefaultJdClient;
|
||||
import com.jd.open.api.sdk.JdClient;
|
||||
import com.jd.open.api.sdk.domain.kplunion.OrderService.request.query.OrderRowReq;
|
||||
import com.jd.open.api.sdk.domain.kplunion.OrderService.response.query.GoodsInfo;
|
||||
import com.jd.open.api.sdk.domain.kplunion.OrderService.response.query.OrderRowResp;
|
||||
import com.jd.open.api.sdk.request.kplunion.UnionOpenOrderRowQueryRequest;
|
||||
import com.jd.open.api.sdk.response.kplunion.UnionOpenOrderRowQueryResponse;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.redis.core.SetOperations;
|
||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||
import org.springframework.scheduling.annotation.Scheduled;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.LocalTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.Date;
|
||||
|
||||
import static java.lang.Thread.sleep;
|
||||
|
||||
/**
|
||||
* @author Leo
|
||||
* @version 1.0
|
||||
@@ -36,49 +46,172 @@ public class JDUtils {
|
||||
@Autowired
|
||||
private OrderRowRepository orderRowRepository;
|
||||
|
||||
private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||
private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||
|
||||
/**
|
||||
* 写两个方法,一个拉最新的订单。一个拉历史订单
|
||||
* 拉取最新的订单
|
||||
*/
|
||||
@Scheduled(cron = "0 0 * * * ?")
|
||||
public void getHistoryOrder() {
|
||||
// 因为只能一小时一小时的拉取订单,所以要循环的倒推去拉取历史订单,存到数据库
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||
// 当前是2024-10-10 11:46:00 , 则生成一个 2024-10-10 11:00:00
|
||||
@Scheduled(cron = "0 * * * * ?") // 每分钟执行一次
|
||||
public void fetchLatestOrder() throws Exception {
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
LocalDateTime lastMinute = now.minusMinutes(1).withSecond(0).withNano(0);
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Scheduled(cron = "0 * * * * ?")
|
||||
public void getNewOrder() throws Exception {
|
||||
//一分钟一分钟拉取 2020-01-02 21:23:00
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||
String startTime = sdf.format(new Date(System.currentTimeMillis() - 1000 * 60));
|
||||
String endTime = sdf.format(new Date());
|
||||
UnionOpenOrderRowQueryResponse response = getUnionOpenOrderRowQueryResponse(startTime, endTime);
|
||||
int code = response.getQueryResult().getCode();
|
||||
System.out.println("响应码:" + code);
|
||||
if (code == 200) {
|
||||
if (response.getQueryResult().getCode() == 200) {
|
||||
OrderRowResp[] orderRowResps = response.getQueryResult().getData();
|
||||
if (orderRowResps == null) {
|
||||
return;
|
||||
}
|
||||
for (OrderRowResp orderRowResp : orderRowResps) {
|
||||
// 固化到数据库
|
||||
OrderRow orderRow = new OrderRow();
|
||||
orderRow.setOrderId(orderRowResp.getOrderId());
|
||||
orderRow.setSkuId(orderRowResp.getSkuId());
|
||||
orderRow.setSkuName(orderRowResp.getSkuName());
|
||||
|
||||
orderRowRepository.save(orderRowResp);
|
||||
UnionOpenOrderRowQueryResponse response = fetchOrdersForDateTime(lastMinute, true); // 真实代表实时订单
|
||||
if (response != null){
|
||||
int code = response.getQueryResult().getCode();
|
||||
if (code == 200) {
|
||||
if (response.getQueryResult().getCode() == 200) {
|
||||
OrderRowResp[] orderRowResps = response.getQueryResult().getData();
|
||||
if (orderRowResps == null) {
|
||||
return;
|
||||
}
|
||||
for (OrderRowResp orderRowResp : orderRowResps) {
|
||||
// 固化到数据库
|
||||
OrderRow orderRow = createOrderRow(orderRowResp);
|
||||
// 订单号不存在就保存,存在就更新订单状态
|
||||
orderRowRepository.save(orderRow);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 拉取历史订单
|
||||
*/
|
||||
public void fetchHistoricalOrders() throws Exception {
|
||||
// 从设定的开始日期到昨天的同一时间
|
||||
LocalDateTime startDate = LocalDateTime.of(2024, 7, 1, 0, 0);
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
LocalDateTime lastHour = now.minusHours(1).withMinute(0).withSecond(0).withNano(0);
|
||||
|
||||
|
||||
while (!startDate.isEqual(lastHour)) {
|
||||
UnionOpenOrderRowQueryResponse response = fetchOrdersForDateTime(startDate, false); // 假的代表历史订单
|
||||
|
||||
if (response != null){
|
||||
int code = response.getQueryResult().getCode();
|
||||
if (code == 200) {
|
||||
if (response.getQueryResult().getCode() == 200) {
|
||||
OrderRowResp[] orderRowResps = response.getQueryResult().getData();
|
||||
if (orderRowResps == null) {
|
||||
continue;
|
||||
}
|
||||
for (OrderRowResp orderRowResp : orderRowResps) {
|
||||
// 固化到数据库
|
||||
OrderRow orderRow = createOrderRow(orderRowResp);
|
||||
// 订单号不存在就保存,存在就更新订单状态
|
||||
orderRowRepository.save(orderRow);
|
||||
}
|
||||
}
|
||||
}
|
||||
sleep(1000);
|
||||
}
|
||||
startDate = startDate.plusHours(1);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据指定的日期时间拉取订单
|
||||
*/
|
||||
public UnionOpenOrderRowQueryResponse fetchOrdersForDateTime(LocalDateTime dateTime, boolean isRealTime) throws Exception {
|
||||
LocalDateTime endTime = isRealTime ? dateTime.plusMinutes(1) : dateTime.plusHours(1);
|
||||
String key = dateTime.format(DATE_TIME_FORMATTER);
|
||||
String hourRange = isRealTime ? "minute" : "hour";
|
||||
|
||||
SetOperations<String, String> setOps = redisTemplate.opsForSet();
|
||||
|
||||
// 检查是否标记为已拉取
|
||||
if (Boolean.TRUE.equals(setOps.isMember(key, hourRange))) {
|
||||
System.out.println(dateTime.format(DATE_TIME_FORMATTER) + " 已经拉取,跳过");
|
||||
return null;
|
||||
}
|
||||
|
||||
// 调用 API 以拉取订单
|
||||
UnionOpenOrderRowQueryResponse unionOpenOrderRowQueryResponse = getUnionOpenOrderRowQueryResponse(dateTime, endTime);
|
||||
|
||||
// 标记已拉取
|
||||
setOps.add(key, hourRange);
|
||||
return unionOpenOrderRowQueryResponse;
|
||||
}
|
||||
|
||||
/**
|
||||
* 将 响应参数转化为 OrderRow,并返回
|
||||
* */
|
||||
private static OrderRow createOrderRow(OrderRowResp orderRowResp) {
|
||||
OrderRow orderRow = new OrderRow();
|
||||
orderRow.setOrderId(orderRowResp.getOrderId());
|
||||
orderRow.setSkuId(orderRowResp.getSkuId());
|
||||
orderRow.setSkuName(orderRowResp.getSkuName());
|
||||
orderRow.setItemId(orderRowResp.getItemId());
|
||||
orderRow.setSkuNum(orderRowResp.getSkuNum());
|
||||
orderRow.setPrice(orderRowResp.getPrice());
|
||||
orderRow.setActualCosPrice(orderRowResp.getActualCosPrice());
|
||||
orderRow.setActualFee(orderRowResp.getActualFee());
|
||||
orderRow.setEstimateCosPrice(orderRowResp.getEstimateCosPrice());
|
||||
orderRow.setEstimateFee(orderRowResp.getEstimateFee());
|
||||
orderRow.setSubSideRate(orderRowResp.getSubSideRate());
|
||||
orderRow.setSubsidyRate(orderRowResp.getSubsidyRate());
|
||||
orderRow.setCommissionRate(orderRowResp.getCommissionRate());
|
||||
orderRow.setFinalRate(orderRowResp.getFinalRate());
|
||||
|
||||
orderRow.setOrderTime(DateUtils.parseDate(orderRowResp.getOrderTime()));
|
||||
orderRow.setFinishTime(DateUtils.parseDate(orderRowResp.getFinishTime()));
|
||||
orderRow.setOrderTag(orderRowResp.getOrderTag());
|
||||
orderRow.setOrderEmt(orderRowResp.getOrderEmt());
|
||||
orderRow.setUnionId(orderRowResp.getUnionId());
|
||||
orderRow.setUnionRole(orderRowResp.getUnionRole());
|
||||
orderRow.setUnionAlias(orderRowResp.getUnionAlias());
|
||||
orderRow.setUnionTag(orderRowResp.getUnionTag());
|
||||
orderRow.setTraceType(orderRowResp.getTraceType());
|
||||
orderRow.setValidCode(orderRowResp.getValidCode());
|
||||
orderRow.setPayMonth(orderRowResp.getPayMonth());
|
||||
orderRow.setSiteId(orderRowResp.getSiteId());
|
||||
orderRow.setParentId(orderRowResp.getParentId());
|
||||
GoodsInfo goodsInfo = orderRowResp.getGoodsInfo();
|
||||
GoodsInfoVO goodsInfoVO = new GoodsInfoVO();
|
||||
goodsInfoVO.setShopId(String.valueOf(goodsInfo.getShopId()));
|
||||
goodsInfoVO.setShopName(goodsInfo.getShopName());
|
||||
goodsInfoVO.setOwner(goodsInfo.getOwner());
|
||||
goodsInfoVO.setProductId(String.valueOf(goodsInfo.getProductId()));
|
||||
goodsInfoVO.setImageUrl(goodsInfo.getImageUrl());
|
||||
orderRow.setGoodsInfo(goodsInfoVO);
|
||||
orderRow.setCallerItemId(orderRowResp.getCallerItemId());
|
||||
orderRow.setPid(orderRowResp.getPid());
|
||||
orderRow.setCid1(orderRowResp.getCid1());
|
||||
orderRow.setCid2(orderRowResp.getCid2());
|
||||
orderRow.setCid3(orderRowResp.getCid3());
|
||||
orderRow.setChannelId(orderRowResp.getChannelId());
|
||||
orderRow.setProPriceAmount(orderRowResp.getProPriceAmount());
|
||||
orderRow.setSkuFrozenNum(orderRowResp.getSkuFrozenNum());
|
||||
orderRow.setSkuReturnNum(orderRowResp.getSkuReturnNum());
|
||||
orderRow.setSkuTag(orderRowResp.getSkuTag());
|
||||
orderRow.setPositionId(orderRowResp.getPositionId());
|
||||
orderRow.setPopId(orderRowResp.getPopId());
|
||||
orderRow.setRid(orderRowResp.getRid());
|
||||
orderRow.setPlus(orderRowResp.getPlus());
|
||||
orderRow.setCpActId(orderRowResp.getCpActId());
|
||||
orderRow.setGiftCouponKey(orderRowResp.getGiftCouponKey());
|
||||
|
||||
orderRow.setModifyTime(new Date());
|
||||
orderRow.setSign(orderRowResp.getSign());
|
||||
orderRow.setBalanceExt(orderRowResp.getBalanceExt());
|
||||
orderRow.setExpressStatus(orderRowResp.getExpressStatus());
|
||||
orderRow.setExt1(orderRowResp.getExt1());
|
||||
orderRow.setSubUnionId(orderRowResp.getSubUnionId());
|
||||
orderRow.setGiftCouponOcsAmount(orderRowResp.getGiftCouponOcsAmount());
|
||||
orderRow.setTraceType(orderRowResp.getTraceType());
|
||||
orderRow.setExpressStatus(orderRowResp.getExpressStatus());
|
||||
orderRow.setTraceType(orderRowResp.getTraceType());
|
||||
orderRow.setId(orderRowResp.getId());
|
||||
orderRow.setValidCode(orderRowResp.getValidCode());
|
||||
orderRow.setExpressStatus(orderRowResp.getExpressStatus());
|
||||
orderRow.setTraceType(orderRowResp.getTraceType());
|
||||
return orderRow;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取订单列表
|
||||
*
|
||||
@@ -87,7 +220,13 @@ public class JDUtils {
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
public UnionOpenOrderRowQueryResponse getUnionOpenOrderRowQueryResponse(String startTime, String endTime) throws Exception {
|
||||
public UnionOpenOrderRowQueryResponse getUnionOpenOrderRowQueryResponse(LocalDateTime start, LocalDateTime end) throws Exception {
|
||||
String startTime = start.format(DATE_TIME_FORMATTER);
|
||||
String endTime = end.format(DATE_TIME_FORMATTER);
|
||||
// 模拟 API 调用
|
||||
System.out.println("调用API - 从 " + startTime
|
||||
+ " 到 " + endTime);
|
||||
// 实际的 API 调用逻辑应在这里进行
|
||||
String accessToken = "";
|
||||
JdClient client = new DefaultJdClient(SERVER_URL, accessToken, APP_KEY, SECRET_KEY);
|
||||
UnionOpenOrderRowQueryRequest request = new UnionOpenOrderRowQueryRequest();
|
||||
|
||||
Reference in New Issue
Block a user