This commit is contained in:
雷欧(林平凡)
2025-05-30 13:57:16 +08:00
parent 9ffc04d496
commit 91f17c017d
5 changed files with 309 additions and 120 deletions

View File

@@ -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.UnionOpenCouponGiftGetResponse;
import com.jd.open.api.sdk.response.kplunion.UnionOpenGoodsQueryResponse; import com.jd.open.api.sdk.response.kplunion.UnionOpenGoodsQueryResponse;
import com.jd.open.api.sdk.response.kplunion.UnionOpenPromotionBysubunionidGetResponse; import com.jd.open.api.sdk.response.kplunion.UnionOpenPromotionBysubunionidGetResponse;
import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import org.slf4j.Logger; import org.slf4j.Logger;
@@ -286,12 +285,32 @@ public class JDUtil {
List<OrderRow> todayOrders = filterOrdersByDate(orderRows, 0); List<OrderRow> todayOrders = filterOrdersByDate(orderRows, 0);
OrderStats stats = calculateStats(todayOrders); OrderStats stats = calculateStats(todayOrders);
contents.add(buildStatsContent("今日统计", stats)); 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; break;
} }
case "昨日统计": { case "昨日统计": {
List<OrderRow> yesterdayOrders = filterOrdersByDate(orderRows, 1); List<OrderRow> yesterdayOrders = filterOrdersByDate(orderRows, 1);
OrderStats stats = calculateStats(yesterdayOrders); OrderStats stats = calculateStats(yesterdayOrders);
contents.add(buildStatsContent("昨日统计", stats)); 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; break;
} }
@@ -299,30 +318,82 @@ public class JDUtil {
List<OrderRow> last3DaysOrders = filterOrdersByDate(orderRows, 3); List<OrderRow> last3DaysOrders = filterOrdersByDate(orderRows, 3);
OrderStats stats = calculateStats(last3DaysOrders); OrderStats stats = calculateStats(last3DaysOrders);
contents.add(buildStatsContent("三日统计", stats)); 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; break;
} }
case "七日统计": { case "七日统计": {
List<OrderRow> last7DaysOrders = filterOrdersByDate(orderRows, 7); List<OrderRow> last7DaysOrders = filterOrdersByDate(orderRows, 7);
OrderStats stats = calculateStats(last7DaysOrders); OrderStats stats = calculateStats(last7DaysOrders);
contents.add(buildStatsContent("七日统计", stats)); 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; break;
} }
case "一个月统计": { case "一个月统计": {
List<OrderRow> last30DaysOrders = filterOrdersByDate(orderRows, 30); List<OrderRow> last30DaysOrders = filterOrdersByDate(orderRows, 30);
OrderStats stats = calculateStats(last30DaysOrders); OrderStats stats = calculateStats(last30DaysOrders);
contents.add(buildStatsContent("一个月统计", stats)); 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; break;
} }
case "两个月统计": { case "两个月统计": {
List<OrderRow> last60DaysOrders = filterOrdersByDate(orderRows, 60); List<OrderRow> last60DaysOrders = filterOrdersByDate(orderRows, 60);
OrderStats stats = calculateStats(last60DaysOrders); OrderStats stats = calculateStats(last60DaysOrders);
contents.add(buildStatsContent("两个月统计", stats)); 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; break;
} }
case "三个月统计": { case "三个月统计": {
List<OrderRow> last90DaysOrders = filterOrdersByDate(orderRows, 90); List<OrderRow> last90DaysOrders = filterOrdersByDate(orderRows, 90);
OrderStats stats = calculateStats(last90DaysOrders); OrderStats stats = calculateStats(last90DaysOrders);
contents.add(buildStatsContent("三个月统计", stats)); 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; break;
} }
case "这个月统计": { case "这个月统计": {
@@ -331,6 +402,16 @@ public class JDUtil {
List<OrderRow> thisMonthOrders = filterOrdersByDate(orderRows, days); List<OrderRow> thisMonthOrders = filterOrdersByDate(orderRows, days);
OrderStats stats = calculateStats(thisMonthOrders); OrderStats stats = calculateStats(thisMonthOrders);
contents.add(buildStatsContent("这个月统计", stats)); 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; break;
} }
case "上个月统计": { case "上个月统计": {
@@ -343,6 +424,16 @@ public class JDUtil {
OrderStats stats = calculateStats(lastMonthOrders); OrderStats stats = calculateStats(lastMonthOrders);
contents.add(buildStatsContent("上个月统计", stats)); 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; break;
} }
@@ -351,6 +442,16 @@ public class JDUtil {
case "总统计": { case "总统计": {
OrderStats stats = calculateStats(orderRows); OrderStats stats = calculateStats(orderRows);
contents.add(buildStatsContent("总统计", stats)); 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; 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) { public void LD(String input, String fromWxid) {
if (input.equals("")) { if (input.equals("")) {
// 获取今天的日期 // 获取今天的日期
LocalDate today = LocalDate.now(); LocalDate today = LocalDate.now();
LocalDateTime startOfDay = today.atStartOfDay(); LocalDateTime startOfDay = today.atStartOfDay();
@@ -2030,7 +2114,7 @@ public class JDUtil {
wxUtil.sendTextMessage(fromWxid, info, 1, null, true); wxUtil.sendTextMessage(fromWxid, info, 1, null, true);
wxUtil.sendTextMessage(fromWxid, sb.toString(), 1, null, true); wxUtil.sendTextMessage(fromWxid, sb.toString(), 1, null, true);
} }
} }
public JDOrder parseOrderFromText(String input) { public JDOrder parseOrderFromText(String input) {

View 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;// 违规佣金
}

View 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);
}
}

View File

@@ -38,6 +38,7 @@ public class WXUtil {
public static Map<String, SuperAdmin> super_admins = new HashMap<>(); public static Map<String, SuperAdmin> super_admins = new HashMap<>();
public static Map<String, String> jdidToWxidMap = new HashMap<>(); public static Map<String, String> jdidToWxidMap = new HashMap<>();
public static Map<String, String> jdidToRemarkMap = 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<>(); public static List<String> chatRoom_admin = new ArrayList<>();
@@ -226,14 +227,17 @@ public class WXUtil {
String messageContent = "Jarvis 更新完成 [亲亲][亲亲][亲亲] "; String messageContent = "Jarvis 更新完成 [亲亲][亲亲][亲亲] ";
String fromWxid = default_bot_wxid; // 来源为机器人自身 String fromWxid = default_bot_wxid; // 来源为机器人自身
for (SuperAdmin admin : super_admins.values()) { for (SuperAdmin admin : super_admins.values()) {
if (!notify_wx.contains(admin.getWxid())){
try { try {
// 异步发送,不影响启动流程 sendTextMessage(admin.getWxid(), messageContent, 1, fromWxid, false);
CompletableFuture.runAsync(() -> sendTextMessage(admin.getWxid(), messageContent, 1, fromWxid, false)); notify_wx.add(admin.getWxid());
} catch (Exception e) { } catch (Exception e) {
logger.warn("发送重启通知失败,目标 wxid: {}", admin.getWxid(), e); logger.warn("发送重启通知失败,目标 wxid: {}", admin.getWxid(), e);
} }
} }
}
restartNoticeSent = true; restartNoticeSent = true;
} }

View File

@@ -112,7 +112,7 @@ public class WxMessageConsumer {
} }
// 录单群 // 录单群
if (fromWxid.equals(chatRoom_JD_Order)){ if (fromWxid.equals(chatRoom_JD_Order)){
if (msg.startsWith("")) { if (msg.startsWith("") || msg.equals("慢单")) {
//logger.info("录单"); //logger.info("录单");
jdUtils.LD(msg, fromWxid); jdUtils.LD(msg, fromWxid);
return; return;