录单
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.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,138 +2000,121 @@ 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();
|
||||||
LocalDateTime endOfDay = today.atTime(23, 59, 59);
|
LocalDateTime endOfDay = today.atTime(23, 59, 59);
|
||||||
|
|
||||||
// 将 LocalDateTime 转换为 Date
|
// 将 LocalDateTime 转换为 Date
|
||||||
Date startDate = Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant());
|
Date startDate = Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant());
|
||||||
Date endDate = Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant());
|
Date endDate = Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant());
|
||||||
|
|
||||||
List<JDOrder> todayOrders = jdOrderRepository.findByOrderTimeBetween(startDate, endDate);
|
List<JDOrder> todayOrders = jdOrderRepository.findByOrderTimeBetween(startDate, endDate);
|
||||||
|
|
||||||
if (todayOrders.isEmpty()) {
|
if (todayOrders.isEmpty()) {
|
||||||
wxUtil.sendTextMessage(fromWxid, "今天没有订单。", 1, fromWxid, false);
|
wxUtil.sendTextMessage(fromWxid, "今天没有订单。", 1, fromWxid, false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 按 remark 升序排序(null 值排最后)
|
// 按 remark 升序排序(null 值排最后)
|
||||||
todayOrders.sort(Comparator.comparing(
|
todayOrders.sort(Comparator.comparing(
|
||||||
JDOrder::getRemark,
|
JDOrder::getRemark,
|
||||||
Comparator.nullsLast(String::compareTo)
|
Comparator.nullsLast(String::compareTo)
|
||||||
));
|
));
|
||||||
|
|
||||||
// 先按 distributionMark 分组,再按 modelNumber 分组
|
// 先按 distributionMark 分组,再按 modelNumber 分组
|
||||||
Map<String, Map<String, List<JDOrder>>> groupedOrders = todayOrders.stream()
|
Map<String, Map<String, List<JDOrder>>> groupedOrders = todayOrders.stream()
|
||||||
.collect(Collectors.groupingBy(JDOrder::getDistributionMark,
|
.collect(Collectors.groupingBy(JDOrder::getDistributionMark,
|
||||||
Collectors.groupingBy(JDOrder::getModelNumber)));
|
Collectors.groupingBy(JDOrder::getModelNumber)));
|
||||||
|
|
||||||
// 遍历每个 distributionMark 分组,生成独立的消息内容并发送
|
// 遍历每个 distributionMark 分组,生成独立的消息内容并发送
|
||||||
for (Map.Entry<String, Map<String, List<JDOrder>>> entry : groupedOrders.entrySet()) {
|
for (Map.Entry<String, Map<String, List<JDOrder>>> entry : groupedOrders.entrySet()) {
|
||||||
String distributionMark = entry.getKey();
|
String distributionMark = entry.getKey();
|
||||||
Map<String, List<JDOrder>> modelGroups = entry.getValue();
|
Map<String, List<JDOrder>> modelGroups = entry.getValue();
|
||||||
|
|
||||||
StringBuilder resultBuilder = new StringBuilder();
|
StringBuilder resultBuilder = new StringBuilder();
|
||||||
|
|
||||||
resultBuilder.append("【").append(distributionMark).append("】").append("\n");
|
resultBuilder.append("【").append(distributionMark).append("】").append("\n");
|
||||||
|
|
||||||
for (Map.Entry<String, List<JDOrder>> modelEntry : modelGroups.entrySet()) {
|
for (Map.Entry<String, List<JDOrder>> modelEntry : modelGroups.entrySet()) {
|
||||||
String modelNumber = modelEntry.getKey();
|
String modelNumber = modelEntry.getKey();
|
||||||
List<JDOrder> orders = modelEntry.getValue();
|
List<JDOrder> orders = modelEntry.getValue();
|
||||||
|
|
||||||
int count = orders.size();
|
int count = orders.size();
|
||||||
|
|
||||||
resultBuilder.append("型号:").append(modelNumber != null ? modelNumber : "未知")
|
resultBuilder.append("型号:").append(modelNumber != null ? modelNumber : "未知")
|
||||||
.append("\n数量:").append(count)
|
.append("\n数量:").append(count)
|
||||||
.append("\n────────────\n");
|
|
||||||
|
|
||||||
for (JDOrder order : orders) {
|
|
||||||
resultBuilder.append("单:").append(order.getRemark() != null ? order.getRemark() : "未提供")
|
|
||||||
.append("\n型号:").append(order.getModelNumber() != null ? order.getModelNumber() : "未提供")
|
|
||||||
.append("\n下单付款:").append(order.getPaymentAmount() != null ? String.format("%.2f", order.getPaymentAmount()) : "0.00")
|
|
||||||
.append(" 元")
|
|
||||||
.append("\n后返金额:").append(order.getRebateAmount() != null ? String.format("%.2f", order.getRebateAmount()) : "0.00")
|
|
||||||
.append(" 元")
|
|
||||||
.append("\n地址:").append(order.getAddress() != null ? order.getAddress() : "未提供")
|
|
||||||
.append("\n物流链接:").append(order.getLogisticsLink() != null ? order.getLogisticsLink() : "无")
|
|
||||||
.append("\n────────────\n");
|
.append("\n────────────\n");
|
||||||
|
|
||||||
|
for (JDOrder order : orders) {
|
||||||
|
resultBuilder.append("单:").append(order.getRemark() != null ? order.getRemark() : "未提供")
|
||||||
|
.append("\n型号:").append(order.getModelNumber() != null ? order.getModelNumber() : "未提供")
|
||||||
|
.append("\n下单付款:").append(order.getPaymentAmount() != null ? String.format("%.2f", order.getPaymentAmount()) : "0.00")
|
||||||
|
.append(" 元")
|
||||||
|
.append("\n后返金额:").append(order.getRebateAmount() != null ? String.format("%.2f", order.getRebateAmount()) : "0.00")
|
||||||
|
.append(" 元")
|
||||||
|
.append("\n地址:").append(order.getAddress() != null ? order.getAddress() : "未提供")
|
||||||
|
.append("\n物流链接:").append(order.getLogisticsLink() != null ? order.getLogisticsLink() : "无")
|
||||||
|
.append("\n────────────\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 发送每条分组的消息到微信
|
||||||
|
wxUtil.sendTextMessage(fromWxid, resultBuilder.toString(), 1, fromWxid, true);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 生成当前日期
|
||||||
|
String date = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
||||||
|
JDOrder jdOrder = parseOrderFromText(input.trim().replace("元", ""));
|
||||||
|
if (jdOrder.getOrderId() == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (Util.isAnyEmpty(jdOrder.getOrderId(), jdOrder.getBuyer(), jdOrder.getOrderTime(), jdOrder.getPaymentAmount(), jdOrder.getRebateAmount(), jdOrder.getAddress(), jdOrder.getLogisticsLink(), jdOrder.getModelNumber(), jdOrder.getLink(), jdOrder.getOrderId(), jdOrder.getBuyer())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
JDOrder byOrderId = jdOrderRepository.findByOrderId(jdOrder.getOrderId());
|
||||||
|
String info = "";
|
||||||
|
if (byOrderId != null) {
|
||||||
|
logger.info("订单已存在:{}", byOrderId);
|
||||||
|
info = "更新成功";
|
||||||
|
jdOrder.setId(byOrderId.getId());
|
||||||
|
} else {
|
||||||
|
info = "新增成功";
|
||||||
|
logger.info("订单不存在,新增:{}", jdOrder);
|
||||||
|
}
|
||||||
|
jdOrderRepository.save(jdOrder);
|
||||||
|
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
// 单号 下单日期 型号 内部订单号 地址 物流 外派给谁 后返金额 谁的单 下单价格
|
||||||
|
String distributionMark = jdOrder.getDistributionMark();
|
||||||
|
String distributionMark2 = "";
|
||||||
|
if (distributionMark != null) {
|
||||||
|
if (distributionMark.startsWith("H")) {
|
||||||
|
distributionMark2 = "鸿";
|
||||||
|
} else if (distributionMark.startsWith("F")) {
|
||||||
|
distributionMark2 = "凡";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
sb.append(jdOrder.getRemark()).append("\t")
|
||||||
|
.append(jdOrder.getOrderId()).append("\t")
|
||||||
|
.append(date).append("\t")
|
||||||
|
.append(jdOrder.getModelNumber()).append("\t")
|
||||||
|
.append(jdOrder.getAddress()).append("\t")
|
||||||
|
.append(jdOrder.getLogisticsLink()).append("\t\t")
|
||||||
|
.append(jdOrder.getBuyer()).append("\t")
|
||||||
|
.append(jdOrder.getPaymentAmount()).append("\t")
|
||||||
|
.append(distributionMark2);
|
||||||
|
|
||||||
// 发送每条分组的消息到微信
|
logger.info("订单信息:{}", sb);
|
||||||
wxUtil.sendTextMessage(fromWxid, resultBuilder.toString(), 1, fromWxid, true);
|
if (fromWxid.isEmpty()) {
|
||||||
}
|
return;
|
||||||
} else {
|
|
||||||
// 生成当前日期
|
|
||||||
String date = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
|
||||||
JDOrder jdOrder = parseOrderFromText(input.trim().replace("元", ""));
|
|
||||||
if (jdOrder.getOrderId() == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (Util.isAnyEmpty(jdOrder.getOrderId(), jdOrder.getBuyer(), jdOrder.getOrderTime(), jdOrder.getPaymentAmount(), jdOrder.getRebateAmount(), jdOrder.getAddress(), jdOrder.getLogisticsLink(), jdOrder.getModelNumber(), jdOrder.getLink(), jdOrder.getOrderId(), jdOrder.getBuyer())) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
JDOrder byOrderId = jdOrderRepository.findByOrderId(jdOrder.getOrderId());
|
|
||||||
String info = "";
|
|
||||||
if (byOrderId != null) {
|
|
||||||
logger.info("订单已存在:{}", byOrderId);
|
|
||||||
info = "更新成功";
|
|
||||||
jdOrder.setId(byOrderId.getId());
|
|
||||||
} else {
|
|
||||||
info = "新增成功";
|
|
||||||
logger.info("订单不存在,新增:{}", jdOrder);
|
|
||||||
}
|
|
||||||
jdOrderRepository.save(jdOrder);
|
|
||||||
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
// 单号 下单日期 型号 内部订单号 地址 物流 外派给谁 后返金额 谁的单 下单价格
|
|
||||||
String distributionMark = jdOrder.getDistributionMark();
|
|
||||||
String distributionMark2 = "";
|
|
||||||
if (distributionMark != null) {
|
|
||||||
if (distributionMark.startsWith("H")) {
|
|
||||||
distributionMark2 = "鸿";
|
|
||||||
} else if (distributionMark.startsWith("F")) {
|
|
||||||
distributionMark2 = "凡";
|
|
||||||
}
|
}
|
||||||
|
wxUtil.sendTextMessage(fromWxid, info, 1, null, true);
|
||||||
|
wxUtil.sendTextMessage(fromWxid, sb.toString(), 1, null, true);
|
||||||
}
|
}
|
||||||
sb.append(jdOrder.getRemark()).append("\t")
|
|
||||||
.append(jdOrder.getOrderId()).append("\t")
|
|
||||||
.append(date).append("\t")
|
|
||||||
.append(jdOrder.getModelNumber()).append("\t")
|
|
||||||
.append(jdOrder.getAddress()).append("\t")
|
|
||||||
.append(jdOrder.getLogisticsLink()).append("\t\t")
|
|
||||||
.append(jdOrder.getBuyer()).append("\t")
|
|
||||||
.append(jdOrder.getPaymentAmount()).append("\t")
|
|
||||||
.append(distributionMark2);
|
|
||||||
|
|
||||||
logger.info("订单信息:{}", sb);
|
|
||||||
if (fromWxid.isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
wxUtil.sendTextMessage(fromWxid, info, 1, null, true);
|
|
||||||
wxUtil.sendTextMessage(fromWxid, sb.toString(), 1, null, true);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public JDOrder parseOrderFromText(String input) {
|
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, 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,12 +227,15 @@ 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()) {
|
||||||
try {
|
if (!notify_wx.contains(admin.getWxid())){
|
||||||
// 异步发送,不影响启动流程
|
try {
|
||||||
CompletableFuture.runAsync(() -> sendTextMessage(admin.getWxid(), messageContent, 1, fromWxid, false));
|
sendTextMessage(admin.getWxid(), messageContent, 1, fromWxid, false);
|
||||||
} catch (Exception e) {
|
notify_wx.add(admin.getWxid());
|
||||||
logger.warn("发送重启通知失败,目标 wxid: {}", admin.getWxid(), e);
|
} catch (Exception e) {
|
||||||
|
logger.warn("发送重启通知失败,目标 wxid: {}", admin.getWxid(), e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
restartNoticeSent = true;
|
restartNoticeSent = true;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user