录单
This commit is contained in:
@@ -28,7 +28,6 @@ import com.jd.open.api.sdk.request.kplunion.UnionOpenPromotionBysubunionidGetReq
|
||||
import com.jd.open.api.sdk.response.kplunion.UnionOpenCouponGiftGetResponse;
|
||||
import com.jd.open.api.sdk.response.kplunion.UnionOpenGoodsQueryResponse;
|
||||
import com.jd.open.api.sdk.response.kplunion.UnionOpenPromotionBysubunionidGetResponse;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.slf4j.Logger;
|
||||
@@ -286,12 +285,32 @@ public class JDUtil {
|
||||
List<OrderRow> todayOrders = filterOrdersByDate(orderRows, 0);
|
||||
OrderStats stats = calculateStats(todayOrders);
|
||||
contents.add(buildStatsContent("今日统计", stats));
|
||||
Map<Long, OrderStats> statsByUnionId = OrderStatsUtil.groupByUnionIdAndCalculateStats(todayOrders);
|
||||
StringBuilder stringBuilder = new StringBuilder().append("详:");
|
||||
if (statsByUnionId != null) {
|
||||
for (Map.Entry<Long, OrderStats> entry : statsByUnionId.entrySet()) {
|
||||
OrderStats statsDetail = entry.getValue();
|
||||
String remarkFromJdid = getRemarkFromJdid(String.valueOf(entry.getKey()));
|
||||
stringBuilder.append(buildStatsContent("\n粉:" + remarkFromJdid + "\n", statsDetail));
|
||||
}
|
||||
}
|
||||
contents.add(stringBuilder);
|
||||
break;
|
||||
}
|
||||
case "昨日统计": {
|
||||
List<OrderRow> yesterdayOrders = filterOrdersByDate(orderRows, 1);
|
||||
OrderStats stats = calculateStats(yesterdayOrders);
|
||||
contents.add(buildStatsContent("昨日统计", stats));
|
||||
Map<Long, OrderStats> statsByUnionId = OrderStatsUtil.groupByUnionIdAndCalculateStats(yesterdayOrders);
|
||||
StringBuilder stringBuilder = new StringBuilder().append("详:");
|
||||
if (statsByUnionId != null) {
|
||||
for (Map.Entry<Long, OrderStats> entry : statsByUnionId.entrySet()) {
|
||||
OrderStats statsDetail = entry.getValue();
|
||||
String remarkFromJdid = getRemarkFromJdid(String.valueOf(entry.getKey()));
|
||||
stringBuilder.append(buildStatsContent("\n粉:" + remarkFromJdid + "\n", statsDetail));
|
||||
}
|
||||
}
|
||||
contents.add(stringBuilder);
|
||||
|
||||
break;
|
||||
}
|
||||
@@ -299,30 +318,82 @@ public class JDUtil {
|
||||
List<OrderRow> last3DaysOrders = filterOrdersByDate(orderRows, 3);
|
||||
OrderStats stats = calculateStats(last3DaysOrders);
|
||||
contents.add(buildStatsContent("三日统计", stats));
|
||||
Map<Long, OrderStats> statsByUnionId = OrderStatsUtil.groupByUnionIdAndCalculateStats(last3DaysOrders);
|
||||
StringBuilder stringBuilder = new StringBuilder().append("详:");
|
||||
if (statsByUnionId != null) {
|
||||
for (Map.Entry<Long, OrderStats> entry : statsByUnionId.entrySet()) {
|
||||
OrderStats statsDetail = entry.getValue();
|
||||
String remarkFromJdid = getRemarkFromJdid(String.valueOf(entry.getKey()));
|
||||
stringBuilder.append(buildStatsContent("\n粉:" + remarkFromJdid + "\n", statsDetail));
|
||||
}
|
||||
}
|
||||
contents.add(stringBuilder);
|
||||
|
||||
break;
|
||||
}
|
||||
case "七日统计": {
|
||||
List<OrderRow> last7DaysOrders = filterOrdersByDate(orderRows, 7);
|
||||
OrderStats stats = calculateStats(last7DaysOrders);
|
||||
contents.add(buildStatsContent("七日统计", stats));
|
||||
Map<Long, OrderStats> statsByUnionId = OrderStatsUtil.groupByUnionIdAndCalculateStats(last7DaysOrders);
|
||||
StringBuilder stringBuilder = new StringBuilder().append("详:");
|
||||
if (statsByUnionId != null) {
|
||||
for (Map.Entry<Long, OrderStats> entry : statsByUnionId.entrySet()) {
|
||||
OrderStats statsDetail = entry.getValue();
|
||||
String remarkFromJdid = getRemarkFromJdid(String.valueOf(entry.getKey()));
|
||||
stringBuilder.append(buildStatsContent("\n粉:" + remarkFromJdid + "\n", statsDetail));
|
||||
}
|
||||
}
|
||||
contents.add(stringBuilder);
|
||||
|
||||
break;
|
||||
}
|
||||
case "一个月统计": {
|
||||
List<OrderRow> last30DaysOrders = filterOrdersByDate(orderRows, 30);
|
||||
OrderStats stats = calculateStats(last30DaysOrders);
|
||||
contents.add(buildStatsContent("一个月统计", stats));
|
||||
Map<Long, OrderStats> statsByUnionId = OrderStatsUtil.groupByUnionIdAndCalculateStats(last30DaysOrders);
|
||||
StringBuilder stringBuilder = new StringBuilder().append("详:");
|
||||
if (statsByUnionId != null) {
|
||||
for (Map.Entry<Long, OrderStats> entry : statsByUnionId.entrySet()) {
|
||||
OrderStats statsDetail = entry.getValue();
|
||||
String remarkFromJdid = getRemarkFromJdid(String.valueOf(entry.getKey()));
|
||||
stringBuilder.append(buildStatsContent("\n粉:" + remarkFromJdid + "\n", statsDetail));
|
||||
}
|
||||
}
|
||||
contents.add(stringBuilder);
|
||||
break;
|
||||
}
|
||||
case "两个月统计": {
|
||||
List<OrderRow> last60DaysOrders = filterOrdersByDate(orderRows, 60);
|
||||
OrderStats stats = calculateStats(last60DaysOrders);
|
||||
contents.add(buildStatsContent("两个月统计", stats));
|
||||
Map<Long, OrderStats> statsByUnionId = OrderStatsUtil.groupByUnionIdAndCalculateStats(last60DaysOrders);
|
||||
StringBuilder stringBuilder = new StringBuilder().append("详:");
|
||||
if (statsByUnionId != null) {
|
||||
for (Map.Entry<Long, OrderStats> entry : statsByUnionId.entrySet()) {
|
||||
OrderStats statsDetail = entry.getValue();
|
||||
String remarkFromJdid = getRemarkFromJdid(String.valueOf(entry.getKey()));
|
||||
stringBuilder.append(buildStatsContent("\n粉:" + remarkFromJdid + "\n", statsDetail));
|
||||
}
|
||||
}
|
||||
contents.add(stringBuilder);
|
||||
break;
|
||||
}
|
||||
case "三个月统计": {
|
||||
List<OrderRow> last90DaysOrders = filterOrdersByDate(orderRows, 90);
|
||||
OrderStats stats = calculateStats(last90DaysOrders);
|
||||
contents.add(buildStatsContent("三个月统计", stats));
|
||||
Map<Long, OrderStats> statsByUnionId = OrderStatsUtil.groupByUnionIdAndCalculateStats(last90DaysOrders);
|
||||
StringBuilder stringBuilder = new StringBuilder().append("详:");
|
||||
if (statsByUnionId != null) {
|
||||
for (Map.Entry<Long, OrderStats> entry : statsByUnionId.entrySet()) {
|
||||
OrderStats statsDetail = entry.getValue();
|
||||
String remarkFromJdid = getRemarkFromJdid(String.valueOf(entry.getKey()));
|
||||
stringBuilder.append(buildStatsContent("\n粉:" + remarkFromJdid + "\n", statsDetail));
|
||||
}
|
||||
}
|
||||
contents.add(stringBuilder);
|
||||
break;
|
||||
}
|
||||
case "这个月统计": {
|
||||
@@ -331,6 +402,16 @@ public class JDUtil {
|
||||
List<OrderRow> thisMonthOrders = filterOrdersByDate(orderRows, days);
|
||||
OrderStats stats = calculateStats(thisMonthOrders);
|
||||
contents.add(buildStatsContent("这个月统计", stats));
|
||||
Map<Long, OrderStats> statsByUnionId = OrderStatsUtil.groupByUnionIdAndCalculateStats(thisMonthOrders);
|
||||
StringBuilder stringBuilder = new StringBuilder().append("详:");
|
||||
if (statsByUnionId != null) {
|
||||
for (Map.Entry<Long, OrderStats> entry : statsByUnionId.entrySet()) {
|
||||
OrderStats statsDetail = entry.getValue();
|
||||
String remarkFromJdid = getRemarkFromJdid(String.valueOf(entry.getKey()));
|
||||
stringBuilder.append(buildStatsContent("\n粉:" + remarkFromJdid + "\n", statsDetail));
|
||||
}
|
||||
}
|
||||
contents.add(stringBuilder);
|
||||
break;
|
||||
}
|
||||
case "上个月统计": {
|
||||
@@ -343,6 +424,16 @@ public class JDUtil {
|
||||
|
||||
OrderStats stats = calculateStats(lastMonthOrders);
|
||||
contents.add(buildStatsContent("上个月统计", stats));
|
||||
Map<Long, OrderStats> statsByUnionId = OrderStatsUtil.groupByUnionIdAndCalculateStats(lastMonthOrders);
|
||||
StringBuilder stringBuilder = new StringBuilder().append("详:");
|
||||
if (statsByUnionId != null) {
|
||||
for (Map.Entry<Long, OrderStats> entry : statsByUnionId.entrySet()) {
|
||||
OrderStats statsDetail = entry.getValue();
|
||||
String remarkFromJdid = getRemarkFromJdid(String.valueOf(entry.getKey()));
|
||||
stringBuilder.append(buildStatsContent("\n粉:" + remarkFromJdid + "\n", statsDetail));
|
||||
}
|
||||
}
|
||||
contents.add(stringBuilder);
|
||||
break;
|
||||
|
||||
}
|
||||
@@ -351,6 +442,16 @@ public class JDUtil {
|
||||
case "总统计": {
|
||||
OrderStats stats = calculateStats(orderRows);
|
||||
contents.add(buildStatsContent("总统计", stats));
|
||||
Map<Long, OrderStats> statsByUnionId = OrderStatsUtil.groupByUnionIdAndCalculateStats(orderRows);
|
||||
StringBuilder stringBuilder = new StringBuilder().append("详:");
|
||||
if (statsByUnionId != null) {
|
||||
for (Map.Entry<Long, OrderStats> entry : statsByUnionId.entrySet()) {
|
||||
OrderStats statsDetail = entry.getValue();
|
||||
String remarkFromJdid = getRemarkFromJdid(String.valueOf(entry.getKey()));
|
||||
stringBuilder.append(buildStatsContent("\n粉:" + remarkFromJdid + "\n", statsDetail));
|
||||
}
|
||||
}
|
||||
contents.add(stringBuilder);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1899,25 +2000,8 @@ public class JDUtil {
|
||||
|
||||
}
|
||||
|
||||
// 统计指标DTO
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
class OrderStats {
|
||||
private long totalOrders; // 总订单数
|
||||
private long validOrders; // 有效订单数(不含取消)
|
||||
private long paidOrders; // 已付款订单
|
||||
private double paidCommission; // 已付款佣金
|
||||
private long pendingOrders; // 待付款订单
|
||||
private double pendingCommission; // 待付款佣金
|
||||
private long canceledOrders; // 已取消订单
|
||||
private long completedOrders; // 已完成订单
|
||||
private double completedCommission;// 已完成佣金
|
||||
private long violations; // 违规订单数
|
||||
private double violationCommission;// 违规佣金
|
||||
}
|
||||
|
||||
public void LD(String input, String fromWxid) {
|
||||
if (input.equals("单")) {
|
||||
if (input.equals("慢单")) {
|
||||
// 获取今天的日期
|
||||
LocalDate today = LocalDate.now();
|
||||
LocalDateTime startOfDay = today.atStartOfDay();
|
||||
@@ -2030,7 +2114,7 @@ public class JDUtil {
|
||||
wxUtil.sendTextMessage(fromWxid, info, 1, null, true);
|
||||
wxUtil.sendTextMessage(fromWxid, sb.toString(), 1, null, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public JDOrder parseOrderFromText(String input) {
|
||||
|
||||
26
src/main/java/cn/van/business/util/OrderStats.java
Normal file
26
src/main/java/cn/van/business/util/OrderStats.java
Normal file
@@ -0,0 +1,26 @@
|
||||
package cn.van.business.util;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* @author Leo
|
||||
* @version 1.0
|
||||
* @create 2025/5/30 13:43
|
||||
* @description:
|
||||
*/ // 统计指标DTO
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
class OrderStats {
|
||||
private long totalOrders; // 总订单数
|
||||
private long validOrders; // 有效订单数(不含取消)
|
||||
private long paidOrders; // 已付款订单
|
||||
private double paidCommission; // 已付款佣金
|
||||
private long pendingOrders; // 待付款订单
|
||||
private double pendingCommission; // 待付款佣金
|
||||
private long canceledOrders; // 已取消订单
|
||||
private long completedOrders; // 已完成订单
|
||||
private double completedCommission;// 已完成佣金
|
||||
private long violations; // 违规订单数
|
||||
private double violationCommission;// 违规佣金
|
||||
}
|
||||
75
src/main/java/cn/van/business/util/OrderStatsUtil.java
Normal file
75
src/main/java/cn/van/business/util/OrderStatsUtil.java
Normal file
@@ -0,0 +1,75 @@
|
||||
package cn.van.business.util;
|
||||
|
||||
import cn.van.business.model.jd.OrderRow;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
public class OrderStatsUtil {
|
||||
|
||||
public static Map<Long, OrderStats> groupByUnionIdAndCalculateStats(List<OrderRow> orderRows) {
|
||||
// 按 unionId 分组并统计
|
||||
return orderRows.stream()
|
||||
.collect(Collectors.groupingBy(OrderRow::getUnionId,
|
||||
Collectors.collectingAndThen(Collectors.toList(), OrderStatsUtil::calculateStats)));
|
||||
}
|
||||
|
||||
// 统计逻辑
|
||||
private static OrderStats calculateStats(List<OrderRow> orders) {
|
||||
long totalOrders = orders.size();
|
||||
long validOrders = (int) orders.stream().filter(o -> o.getValidCode() != -1).count();
|
||||
|
||||
long paidOrders = orders.stream().filter(o -> o.getValidCode() == 16).count();
|
||||
double paidCommission = orders.stream()
|
||||
.filter(o -> o.getValidCode() == 16)
|
||||
.mapToDouble(OrderRow::getEstimateFee)
|
||||
.sum();
|
||||
|
||||
long pendingOrders = orders.stream().filter(o -> o.getValidCode() == 15).count();
|
||||
double pendingCommission = orders.stream()
|
||||
.filter(o -> o.getValidCode() == 15)
|
||||
.mapToDouble(OrderRow::getEstimateFee)
|
||||
.sum();
|
||||
|
||||
long canceledOrders = orders.stream()
|
||||
.filter(o -> o.getValidCode() != 16 && o.getValidCode() != 17)
|
||||
.count();
|
||||
|
||||
long completedOrders = orders.stream().filter(o -> o.getValidCode() == 17).count();
|
||||
double completedCommission = orders.stream()
|
||||
.filter(o -> o.getValidCode() == 17)
|
||||
.mapToDouble(OrderRow::getEstimateFee)
|
||||
.sum();
|
||||
|
||||
long violations = getStreamForWeiGui(orders).count();
|
||||
double violationCommission = getStreamForWeiGui(orders)
|
||||
.mapToDouble(o -> o.getEstimateCosPrice() * o.getCommissionRate() * 0.01)
|
||||
.sum();
|
||||
|
||||
return new OrderStats(
|
||||
totalOrders,
|
||||
validOrders,
|
||||
paidOrders,
|
||||
paidCommission,
|
||||
pendingOrders,
|
||||
pendingCommission,
|
||||
canceledOrders,
|
||||
completedOrders,
|
||||
completedCommission,
|
||||
violations,
|
||||
violationCommission
|
||||
);
|
||||
}
|
||||
|
||||
// 获取违规订单流
|
||||
private static Stream<OrderRow> getStreamForWeiGui(List<OrderRow> orderRows) {
|
||||
return orderRows.stream().filter(orderRow ->
|
||||
orderRow.getValidCode() == 13 ||
|
||||
orderRow.getValidCode() == 25 ||
|
||||
orderRow.getValidCode() == 26 ||
|
||||
orderRow.getValidCode() == 27 ||
|
||||
orderRow.getValidCode() == 28 ||
|
||||
orderRow.getValidCode() == 29);
|
||||
}
|
||||
}
|
||||
@@ -38,6 +38,7 @@ public class WXUtil {
|
||||
public static Map<String, SuperAdmin> super_admins = new HashMap<>();
|
||||
public static Map<String, String> jdidToWxidMap = new HashMap<>();
|
||||
public static Map<String, String> jdidToRemarkMap = new HashMap<>();
|
||||
public static List<String> notify_wx = new ArrayList<>();
|
||||
|
||||
// 群聊管理白名单
|
||||
public static List<String> chatRoom_admin = new ArrayList<>();
|
||||
@@ -226,14 +227,17 @@ public class WXUtil {
|
||||
String messageContent = "Jarvis 更新完成 [亲亲][亲亲][亲亲] ";
|
||||
String fromWxid = default_bot_wxid; // 来源为机器人自身
|
||||
for (SuperAdmin admin : super_admins.values()) {
|
||||
if (!notify_wx.contains(admin.getWxid())){
|
||||
try {
|
||||
// 异步发送,不影响启动流程
|
||||
CompletableFuture.runAsync(() -> sendTextMessage(admin.getWxid(), messageContent, 1, fromWxid, false));
|
||||
sendTextMessage(admin.getWxid(), messageContent, 1, fromWxid, false);
|
||||
notify_wx.add(admin.getWxid());
|
||||
} catch (Exception e) {
|
||||
logger.warn("发送重启通知失败,目标 wxid: {}", admin.getWxid(), e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
restartNoticeSent = true;
|
||||
|
||||
}
|
||||
|
||||
@@ -112,7 +112,7 @@ public class WxMessageConsumer {
|
||||
}
|
||||
// 录单群
|
||||
if (fromWxid.equals(chatRoom_JD_Order)){
|
||||
if (msg.startsWith("单")) {
|
||||
if (msg.startsWith("单") || msg.equals("慢单")) {
|
||||
//logger.info("录单");
|
||||
jdUtils.LD(msg, fromWxid);
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user