From 7a6cbc2f7ddeb35cacfc5d5ae05387d7bbc17867 Mon Sep 17 00:00:00 2001 From: Leo Date: Mon, 18 Nov 2024 00:03:09 +0800 Subject: [PATCH] 1 --- .idea/misc.xml | 3 + .../java/cn/van/business/util/JDUtils.java | 294 ++++++++++-------- 2 files changed, 169 insertions(+), 128 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index 0e5a600..c081774 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -11,4 +11,7 @@ + + \ No newline at end of file diff --git a/src/main/java/cn/van/business/util/JDUtils.java b/src/main/java/cn/van/business/util/JDUtils.java index 9523f91..916a766 100644 --- a/src/main/java/cn/van/business/util/JDUtils.java +++ b/src/main/java/cn/van/business/util/JDUtils.java @@ -17,12 +17,14 @@ import com.jd.open.api.sdk.request.kplunion.UnionOpenOrderRowQueryRequest; import com.jd.open.api.sdk.request.kplunion.UnionOpenPromotionCommonGetRequest; import com.jd.open.api.sdk.response.kplunion.UnionOpenOrderRowQueryResponse; import com.jd.open.api.sdk.response.kplunion.UnionOpenPromotionCommonGetResponse; -import org.springframework.beans.factory.annotation.Autowired; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; 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 javax.annotation.Resource; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.LocalDateTime; @@ -59,13 +61,14 @@ public class JDUtils { private static final String ACCESS_TOKEN = ""; //标记唯一订单行:订单+sku维度的唯一标识 private static final String ORDER_ROW_KEY = "jd:order:row:"; + private static final Logger logger = LoggerFactory.getLogger(JDUtils.class); private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - @Autowired + @Resource private StringRedisTemplate redisTemplate; - @Autowired + @Resource private OrderRowRepository orderRowRepository; - @Autowired + @Resource private WXUtil wxUtil; /** @@ -215,6 +218,126 @@ public class JDUtils { } + /** + * 每小时拉取过去两个月的订单 + * 因为有的延迟发货,而接口只能拉取两个月前的数据 + */ + @Scheduled(cron = "0 0 * * * ?") + public void fetchHistoricalOrders() throws Exception { + // 从设定的开始日期到昨天的同一时间 + System.out.println("开始拉取历史订单"); + // 拉最近两个月的订单 + // 获取当前时间,并调整为整点开始 + LocalDateTime startDate = LocalDateTime.now().minusMonths(2).truncatedTo(ChronoUnit.HOURS); + + LocalDateTime now = LocalDateTime.now(); + LocalDateTime lastHour = now.truncatedTo(ChronoUnit.HOURS); + + + while (!startDate.isEqual(lastHour)) { + startDate = startDate.plusHours(1); + 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); + } + } + } + } + + + } + } + + /** + * 手动调用 将订单发送到微信 + */ + private void orderToWx(OrderRow orderRow, Boolean isAutoFlush) { + // 查询订单状态 + Integer newValidCode = orderRow.getValidCode(); + String oldValidCode = redisTemplate.opsForValue().get(ORDER_ROW_KEY + orderRow.getId()); + Integer lastValidCode = 0; + // 更新 Redis 状态 + redisTemplate.opsForValue().set(ORDER_ROW_KEY + orderRow.getId(), String.valueOf(orderRow.getValidCode())); + + if (Util.isNotEmpty(oldValidCode)) { + lastValidCode = Integer.valueOf(oldValidCode); + } + // 如果订单状态没变化,就不发送 + if (isAutoFlush && lastValidCode.equals(newValidCode)) { + } else { + String content; + content = getFormattedOrderInfo(orderRow, Util.isEmpty(oldValidCode) ? -100 : Integer.parseInt(oldValidCode)); + // 推送 + wxUtil.sendTextMessage(WXUtil.super_admin_wxid, content, 1, WXUtil.super_admin_wxid); + } + + } + + /** + * 将数据库订单转化成微信所需要文本 + */ + public String getFormattedOrderInfo(OrderRow orderRow, Integer oldValidCode) { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + ValidCodeConverter converter = new ValidCodeConverter(); + String orderInfo = + //+ "订单+sku:" + orderRow.getId() + "\r" + "订单号:" + orderRow.getOrderId() + "(" + (orderRow.getPlus() == 1 ? "plus" : "非plus") + ")\r" + + + "最新订单状态:" + (converter.getCodeDescription(orderRow.getValidCode())) + "\r" + + + "商品名称:" + orderRow.getSkuName() + "\r" + + "商品单价:" + orderRow.getPrice() + "\r" + + "商品数量:" + orderRow.getSkuNum() + "\r" + + "商品总价:" + (orderRow.getPrice() * orderRow.getSkuNum()) + "\r" + + "预估计佣金额:" + orderRow.getEstimateCosPrice() + "\n" + + + "佣金比例:" + orderRow.getCommissionRate() + "%\r\r" + + "推客的预估佣金:" + orderRow.getEstimateFee() + "\r" + + "实际计算佣金的金额:" + orderRow.getActualCosPrice() + "\r" + + "下单时间:" + formatter.format(orderRow.getOrderTime()) + "\r" + + "完成时间:" + (orderRow.getFinishTime() != null ? formatter.format(orderRow.getFinishTime()) : "未完成") + "\r\n"; + if (oldValidCode != -100) { + orderInfo = "订单状态从 :" + (converter.getCodeDescription(oldValidCode)) + " --变成-- " + + (converter.getCodeDescription(orderRow.getValidCode())) + "\r" + orderInfo; + } + + + return orderInfo; + } + + /** + * 根据指定的日期时间拉取订单 + */ + public UnionOpenOrderRowQueryResponse fetchOrdersForDateTime(LocalDateTime startTime, boolean isRealTime) throws Exception { + + LocalDateTime endTime = isRealTime ? startTime.plusMinutes(10) : startTime.plusHours(1); + String key = startTime.format(DATE_TIME_FORMATTER); + String hourRange = isRealTime ? "minute" : "hour"; + + SetOperations setOps = redisTemplate.opsForSet(); + + // 调用 API 以拉取订单 + UnionOpenOrderRowQueryResponse unionOpenOrderRowQueryResponse = getUnionOpenOrderRowQueryResponse(startTime, endTime); + + // 标记已拉取 + setOps.add(key, hourRange); + // 打印方法调用和开始结束时间 + + logger.info("拉取订单:开始时间:{}结束时间:{}", startTime.format(DATE_TIME_FORMATTER), endTime.format(DATE_TIME_FORMATTER)); + return unionOpenOrderRowQueryResponse; + } + /** * 接收京粉指令指令 */ @@ -240,6 +363,8 @@ public class JDUtils { content.append("一个月统计\r"); content.append("两个月统计\r"); content.append("三个月统计\r"); + content.append("这个月统计\r"); + content.append("上个月统计\r"); content.append("今日订单\r"); content.append("昨日订单\r"); content.append("刷新三天\r"); @@ -343,6 +468,42 @@ public class JDUtils { content.append("\r" + "违规佣金:").append(getStreamForWeiGui(last90DaysOrders).mapToDouble(orderRow -> orderRow.getEstimateCosPrice() * orderRow.getCommissionRate() * 0.01).sum()); break; } + case "这个月统计": { + // 计算出距离1号有几天 + int days = LocalDate.now().getDayOfMonth(); + List thisMonthOrders = filterOrdersByDate(orderRows, days); + + content.append("本月统计:\n"); + content.append("订单总数:").append(thisMonthOrders.size()).append("\r"); + content.append("已付款:").append(thisMonthOrders.stream().filter(orderRow -> orderRow.getValidCode() == 16).count()).append("\r"); + content.append("已取消:").append(thisMonthOrders.stream().filter(orderRow -> orderRow.getValidCode() != 16 && orderRow.getValidCode() != 17).count()).append("\r"); + content.append("已完成:").append(thisMonthOrders.stream().filter(orderRow -> orderRow.getValidCode() == 17).count()).append("\r"); + content.append("违规:").append(getStreamForWeiGui(thisMonthOrders).count()).append("\r"); + content.append("已付款佣金:").append(thisMonthOrders.stream().filter(orderRow -> orderRow.getValidCode() == 16).mapToDouble(OrderRow::getEstimateFee).sum()).append("\r"); + content.append("已完成佣金:").append(thisMonthOrders.stream().filter(orderRow -> orderRow.getValidCode() == 17).mapToDouble(OrderRow::getEstimateFee).sum()); + content.append("\r" + "违规佣金:").append(getStreamForWeiGui(thisMonthOrders).mapToDouble(orderRow -> orderRow.getEstimateCosPrice() * orderRow.getCommissionRate() * 0.01).sum()); + break; + } + case "上个月统计": { + LocalDate lastMonth = LocalDate.now().minusMonths(1); + int days = LocalDate.now().getDayOfMonth(); + + List lastMonthOrders = filterOrdersByDate(orderRows, lastMonth.lengthOfMonth() + days); + List thisMonthOrders = filterOrdersByDate(orderRows, days); + lastMonthOrders = lastMonthOrders.stream().filter(orderRow -> !thisMonthOrders.contains(orderRow)).collect(Collectors.toList()); + + content.append("上个月统计:\n"); + content.append("订单总数:").append(lastMonthOrders.size()).append("\r"); + content.append("已付款:").append(lastMonthOrders.stream().filter(orderRow -> orderRow.getValidCode() == 16).count()).append("\r"); + content.append("已取消:").append(lastMonthOrders.stream().filter(orderRow -> orderRow.getValidCode() != 16 && orderRow.getValidCode() != 17).count()).append("\r"); + content.append("已完成:").append(lastMonthOrders.stream().filter(orderRow -> orderRow.getValidCode() == 17).count()).append("\r"); + content.append("违规:").append(getStreamForWeiGui(lastMonthOrders).count()).append("\r"); + content.append("已付款佣金:").append(lastMonthOrders.stream().filter(orderRow -> orderRow.getValidCode() == 16).mapToDouble(OrderRow::getEstimateFee).sum()).append("\r"); + content.append("已完成佣金:").append(lastMonthOrders.stream().filter(orderRow -> orderRow.getValidCode() == 17).mapToDouble(OrderRow::getEstimateFee).sum()); + content.append("\r" + "违规佣金:").append(getStreamForWeiGui(lastMonthOrders).mapToDouble(orderRow -> orderRow.getEstimateCosPrice() * orderRow.getCommissionRate() * 0.01).sum()); + break; + + } case "今日订单": { List todayOrders = filterOrdersByDate(orderRows, 0); // 订单总数,已付款,已取消,佣金总计 @@ -432,7 +593,7 @@ public class JDUtils { * 接收京粉指令指令 * 高级菜单 */ - public void sendOrderToWxByOrderJDAdvanced(String order) throws Exception { + public void sendOrderToWxByOrderJDAdvanced(String order) { int[] parm = {-1}; List orderRows = orderRowRepository.findByValidCodeNotInOrderByOrderTimeDesc(parm); @@ -476,90 +637,6 @@ public class JDUtils { } } - /** - * 手动调用 将订单发送到微信 - */ - private void orderToWx(OrderRow orderRow, Boolean isAutoFlush) { - // 查询订单状态 - Integer newValidCode = orderRow.getValidCode(); - String oldValidCode = redisTemplate.opsForValue().get(ORDER_ROW_KEY + orderRow.getId()); - Integer lastValidCode = 0; - // 更新 Redis 状态 - redisTemplate.opsForValue().set(ORDER_ROW_KEY + orderRow.getId(), String.valueOf(orderRow.getValidCode())); - - if (Util.isNotEmpty(oldValidCode)) { - lastValidCode = Integer.valueOf(oldValidCode); - } - // 如果订单状态没变化,就不发送 - if (isAutoFlush && lastValidCode.equals(newValidCode)) { - } else { - String content; - content = getFormattedOrderInfo(orderRow, Util.isEmpty(oldValidCode) ? -100 : Integer.parseInt(oldValidCode)); - // 推送 - wxUtil.sendTextMessage(WXUtil.super_admin_wxid, content, 1, WXUtil.super_admin_wxid); - } - - } - - /** - * 将数据库订单转化成微信所需要文本 - */ - public String getFormattedOrderInfo(OrderRow orderRow, Integer oldValidCode) { - SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - ValidCodeConverter converter = new ValidCodeConverter(); - String orderInfo = - //+ "订单+sku:" + orderRow.getId() + "\r" - "订单号:" + orderRow.getOrderId() + "(" + (orderRow.getPlus() == 1 ? "plus" : "非plus") + ")\r" + - - "最新订单状态:" + (converter.getCodeDescription(orderRow.getValidCode())) + "\r" + - - "商品名称:" + orderRow.getSkuName() + "\r" - + "商品单价:" + orderRow.getPrice() + "\r" - + "商品数量:" + orderRow.getSkuNum() + "\r" - + "商品总价:" + (orderRow.getPrice() * orderRow.getSkuNum()) + "\r" - + "预估计佣金额:" + orderRow.getEstimateCosPrice() + "\n" - - + "佣金比例:" + orderRow.getCommissionRate() + "%\r\r" - + "推客的预估佣金:" + orderRow.getEstimateFee() + "\r" - + "实际计算佣金的金额:" + orderRow.getActualCosPrice() + "\r" - + "下单时间:" + formatter.format(orderRow.getOrderTime()) + "\r" - + "完成时间:" + (orderRow.getFinishTime() != null ? formatter.format(orderRow.getFinishTime()) : "未完成") + "\r\n"; - if (oldValidCode != -100) { - orderInfo = "订单状态从 :" + (converter.getCodeDescription(oldValidCode)) + " --变成-- " + - (converter.getCodeDescription(orderRow.getValidCode())) + "\r" + orderInfo; - } - - - return orderInfo; - } - - /** - * 根据指定的日期时间拉取订单 - */ - public UnionOpenOrderRowQueryResponse fetchOrdersForDateTime(LocalDateTime startTime, boolean isRealTime) throws Exception { - - LocalDateTime endTime = isRealTime ? startTime.plusMinutes(10) : startTime.plusHours(1); - String key = startTime.format(DATE_TIME_FORMATTER); - String hourRange = isRealTime ? "minute" : "hour"; - - SetOperations 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(startTime, endTime); - - // 标记已拉取 - setOps.add(key, hourRange); - // 打印方法调用和开始结束时间 - - System.out.println("拉取订单:" + "开始时间:" + startTime.format(DATE_TIME_FORMATTER) + "结束时间:" + endTime.format(DATE_TIME_FORMATTER)); - return unionOpenOrderRowQueryResponse; - } /** * 获取订单列表 @@ -634,44 +711,5 @@ public class JDUtils { return response.getGetResult().getData().getClickURL(); } - /** - * 每小时拉取过去两个月的订单 - * 因为有的延迟发货,而接口只能拉取两个月前的数据 - */ - @Scheduled(cron = "0 0 * * * ?") - public void fetchHistoricalOrders() throws Exception { - // 从设定的开始日期到昨天的同一时间 - System.out.println("开始拉取历史订单"); - // 拉最近两个月的订单 - // 获取当前时间,并调整为整点开始 - LocalDateTime startDate = LocalDateTime.now().minusMonths(2).truncatedTo(ChronoUnit.HOURS); - LocalDateTime now = LocalDateTime.now(); - LocalDateTime lastHour = now.truncatedTo(ChronoUnit.HOURS); - - - while (!startDate.isEqual(lastHour)) { - startDate = startDate.plusHours(1); - 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); - } - } - } - } - - - } - } }