抽取统计打印方法

This commit is contained in:
Leo
2025-03-16 16:51:55 +08:00
parent caa0a24c24
commit a0d185da73

View File

@@ -474,11 +474,22 @@ public class JDUtil {
private StringBuilder buildStatsContent(String title, OrderStats stats) { private StringBuilder buildStatsContent(String title, OrderStats stats) {
StringBuilder content = new StringBuilder(); StringBuilder content = new StringBuilder();
content.append(title).append("\r\n").append("订单总数:").append(stats.getTotalOrders()).append("\r").append("订单总数(不含取消)").append(stats.getValidOrders()).append("\r\n").append("已付款:").append(stats.getPaidOrders()).append("\r").append("已付款佣金:").append(stats.getPaidCommission()).append("\r\n").append("待付款:").append(stats.getPendingOrders()).append("\r") // 修正了原代码中的Stream未终止问题 content.append(title).append("\r\n")
.append("待付款佣金").append(stats.getPendingCommission()).append("\r\n").append("已取消:").append(stats.getCanceledOrders()).append("\r").append("已完成:").append(stats.getCompletedOrders()).append("\r").append("已完成佣金:").append(stats.getCompletedCommission()).append("\r").append("违规:").append(stats.getViolations()).append("\r").append("违规佣金:").append(stats.getViolationCommission()); .append("订单总数").append(stats.getTotalOrders())
.append("\r订单总数(不含取消)").append(stats.getValidOrders())
.append("\r\n已付款").append(stats.getPaidOrders())
.append("\r已付款佣金").append(String.format("%.2f", stats.getPaidCommission()))
.append("\r\n待付款").append(stats.getPendingOrders())
.append("\r待付款佣金").append(String.format("%.2f", stats.getPendingCommission()))
.append("\r\n已取消").append(stats.getCanceledOrders())
.append("\r已完成").append(stats.getCompletedOrders())
.append("\r已完成佣金").append(String.format("%.2f", stats.getCompletedCommission()))
.append("\r违规").append(stats.getViolations())
.append("\r违规佣金").append(String.format("%.2f", stats.getViolationCommission()));
return content; return content;
} }
/** /**
* 接收京粉指令指令 * 接收京粉指令指令
*/ */
@@ -705,11 +716,12 @@ public class JDUtil {
} }
} }
/**
/**
* 接收京粉指令指令 * 接收京粉指令指令
* 高级菜单 * 高级菜单
*/ */
public void sendOrderToWxByOrderJDAdvanced(String order, String fromWxid) { public void sendOrderToWxByOrderJDAdvanced(String order, String fromWxid) {
int[] param = {-1}; int[] param = {-1};
WXUtil.SuperAdmin superAdmin = super_admins.get(fromWxid); WXUtil.SuperAdmin superAdmin = super_admins.get(fromWxid);
String unionId = superAdmin.getUnionId(); String unionId = superAdmin.getUnionId();
@@ -848,9 +860,9 @@ public void sendOrderToWxByOrderJDAdvanced(String order, String fromWxid) {
wxUtil.sendTextMessage(fromWxid, stringBuilder.toString(), 1, fromWxid); wxUtil.sendTextMessage(fromWxid, stringBuilder.toString(), 1, fromWxid);
} }
} }
} }
/** /**
* 获取订单列表 * 获取订单列表
* *
* @param start 开始时间 * @param start 开始时间
@@ -858,7 +870,7 @@ public void sendOrderToWxByOrderJDAdvanced(String order, String fromWxid) {
* @return * @return
* @throws Exception * @throws Exception
*/ */
public UnionOpenOrderRowQueryResponse getUnionOpenOrderRowQueryResponse(LocalDateTime start, LocalDateTime end, Integer pageIndex, String appKey, String secretKey) throws Exception { public UnionOpenOrderRowQueryResponse getUnionOpenOrderRowQueryResponse(LocalDateTime start, LocalDateTime end, Integer pageIndex, String appKey, String secretKey) throws Exception {
String startTime = start.format(DATE_TIME_FORMATTER); String startTime = start.format(DATE_TIME_FORMATTER);
String endTime = end.format(DATE_TIME_FORMATTER); String endTime = end.format(DATE_TIME_FORMATTER);
// 模拟 API 调用 // 模拟 API 调用
@@ -885,13 +897,13 @@ public UnionOpenOrderRowQueryResponse getUnionOpenOrderRowQueryResponse(LocalDat
return client.execute(request); return client.execute(request);
} }
/** /**
* 接口描述:通过商品链接、领券链接、活动链接获取普通推广链接或优惠券二合一推广链接 * 接口描述:通过商品链接、领券链接、活动链接获取普通推广链接或优惠券二合一推广链接
* jd.union.open.promotion.bysubunionid.get * jd.union.open.promotion.bysubunionid.get
*/ */
String transfer(String url) throws Exception { String transfer(String url) throws Exception {
JdClient client = new DefaultJdClient(SERVER_URL, ACCESS_TOKEN, LPF_APP_KEY_DG, LPF_SECRET_KEY_DG); JdClient client = new DefaultJdClient(SERVER_URL, ACCESS_TOKEN, LPF_APP_KEY_DG, LPF_SECRET_KEY_DG);
UnionOpenPromotionBysubunionidGetRequest request = new UnionOpenPromotionBysubunionidGetRequest(); UnionOpenPromotionBysubunionidGetRequest request = new UnionOpenPromotionBysubunionidGetRequest();
@@ -927,13 +939,13 @@ String transfer(String url) throws Exception {
} }
return result; return result;
} }
/** /**
* 消毒柜部分的业务逻辑 * 消毒柜部分的业务逻辑
*/ */
@Scheduled(fixedRate = 60000) // 每分钟执行一次 @Scheduled(fixedRate = 60000) // 每分钟执行一次
public void cleanUpTimeoutStates() { public void cleanUpTimeoutStates() {
LocalDateTime now = LocalDateTime.now(); LocalDateTime now = LocalDateTime.now();
redisTemplate.keys(INTERACTION_STATE_PREFIX + "*").forEach(key -> { redisTemplate.keys(INTERACTION_STATE_PREFIX + "*").forEach(key -> {
String stateJson = redisTemplate.opsForValue().get(key); String stateJson = redisTemplate.opsForValue().get(key);
@@ -948,7 +960,7 @@ public void cleanUpTimeoutStates() {
logger.error("Error parsing interaction state: {}", e.getMessage()); logger.error("Error parsing interaction state: {}", e.getMessage());
} }
}); });
} }
//public UnionOpenGoodsBigfieldQueryResponse getUnionOpenGoodsBigfieldQueryResponse(){ //public UnionOpenGoodsBigfieldQueryResponse getUnionOpenGoodsBigfieldQueryResponse(){
// JdClient client = new DefaultJdClient(SERVER_URL, ACCESS_TOKEN, APP_KEY, SECRET_KEY); // JdClient client = new DefaultJdClient(SERVER_URL, ACCESS_TOKEN, APP_KEY, SECRET_KEY);
// //
@@ -966,7 +978,7 @@ public void cleanUpTimeoutStates() {
// return response; // return response;
//} //}
public void handleUserInteraction(String fromWxid, String message) { public void handleUserInteraction(String fromWxid, String message) {
String key = INTERACTION_STATE_PREFIX + fromWxid; String key = INTERACTION_STATE_PREFIX + fromWxid;
String stateJson = redisTemplate.opsForValue().get(key); String stateJson = redisTemplate.opsForValue().get(key);
UserInteractionState state; UserInteractionState state;
@@ -1026,10 +1038,10 @@ public void handleUserInteraction(String fromWxid, String message) {
} catch (Exception e) { } catch (Exception e) {
logger.error("Error saving interaction state: {}", e.getMessage()); logger.error("Error saving interaction state: {}", e.getMessage());
} }
} }
// 新增礼金流程处理方法 // 新增礼金流程处理方法
private void handleGiftMoneyFlow(String fromWxid, String message, UserInteractionState state) { private void handleGiftMoneyFlow(String fromWxid, String message, UserInteractionState state) {
if ("礼金".equals(message)) { if ("礼金".equals(message)) {
state.reset(); // 重置流程 state.reset(); // 重置流程
wxUtil.sendTextMessage(fromWxid, "流程已重置,请重新开始", 1, fromWxid); wxUtil.sendTextMessage(fromWxid, "流程已重置,请重新开始", 1, fromWxid);
@@ -1079,32 +1091,32 @@ private void handleGiftMoneyFlow(String fromWxid, String message, UserInteractio
wxUtil.sendTextMessage(fromWxid, "系统异常,流程已终止", 1, fromWxid); wxUtil.sendTextMessage(fromWxid, "系统异常,流程已终止", 1, fromWxid);
state.reset(); state.reset();
} }
} }
private String parseSkuFromUrl(String url) { private String parseSkuFromUrl(String url) {
// 实现从URL中解析SKU的逻辑 // 实现从URL中解析SKU的逻辑
return "123456"; // 示例返回值 return "123456"; // 示例返回值
} }
private boolean isValidAmount(String input) { private boolean isValidAmount(String input) {
return input.matches("^\\d+(\\.\\d{1,2})?$"); return input.matches("^\\d+(\\.\\d{1,2})?$");
} }
private Map<String, String> queryProductInfo(String skuId) { private Map<String, String> queryProductInfo(String skuId) {
// 调用京东商品查询API需要实现 // 调用京东商品查询API需要实现
return Map.of("name", "示例商品", "price", "299.00"); return Map.of("name", "示例商品", "price", "299.00");
} }
private boolean isValidQuantity(String input) { private boolean isValidQuantity(String input) {
return input.matches("^\\d+$"); return input.matches("^\\d+$");
} }
private boolean activateGiftMoney(String skuId, double amount, int quantity) { private boolean activateGiftMoney(String skuId, double amount, int quantity) {
// 实现实际的开通接口调用 // 实现实际的开通接口调用
return true; return true;
} }
private void handleProductOrderRegistration(String fromWxid, String message, UserInteractionState state) { private void handleProductOrderRegistration(String fromWxid, String message, UserInteractionState state) {
switch (state.getCurrentProductOrderStep()) { switch (state.getCurrentProductOrderStep()) {
case STEP_ORDER_ID: case STEP_ORDER_ID:
if (!message.matches("^\\d{10,20}$")) { if (!message.matches("^\\d{10,20}$")) {
@@ -1156,13 +1168,13 @@ private void handleProductOrderRegistration(String fromWxid, String message, Use
} }
break; break;
} }
} }
private String buildConfirmMessage(UserInteractionState state) { private String buildConfirmMessage(UserInteractionState state) {
return "📋 请确认登记信息:\n" + "────────────────\n" + "▪ 订单号:" + state.getCollectedFields().get("orderId") + "\n" + "▪ 商品名称:" + state.getCollectedFields().get("skuName") + "\n" + "▪ 商品类型:" + getTypeDesc(state.getCollectedFields().get("skuType")) + "\n" + "▪ 收件人:" + state.getCollectedFields().get("recipientName") + "\n" + "▪ 联系方式:" + state.getCollectedFields().get("recipientPhone") + "\n" + "▪ 收货地址:" + state.getCollectedFields().get("recipientAddress") + "\n" + "────────────────\n" + "回复【确认】提交,其他内容重新开始"; return "📋 请确认登记信息:\n" + "────────────────\n" + "▪ 订单号:" + state.getCollectedFields().get("orderId") + "\n" + "▪ 商品名称:" + state.getCollectedFields().get("skuName") + "\n" + "▪ 商品类型:" + getTypeDesc(state.getCollectedFields().get("skuType")) + "\n" + "▪ 收件人:" + state.getCollectedFields().get("recipientName") + "\n" + "▪ 联系方式:" + state.getCollectedFields().get("recipientPhone") + "\n" + "▪ 收货地址:" + state.getCollectedFields().get("recipientAddress") + "\n" + "────────────────\n" + "回复【确认】提交,其他内容重新开始";
} }
private boolean saveFullProductOrder(UserInteractionState state, String fromWxid) { private boolean saveFullProductOrder(UserInteractionState state, String fromWxid) {
try { try {
ProductOrder order = new ProductOrder(); ProductOrder order = new ProductOrder();
order.setOrderId(state.getCollectedFields().get("orderId")); order.setOrderId(state.getCollectedFields().get("orderId"));
@@ -1184,44 +1196,27 @@ private boolean saveFullProductOrder(UserInteractionState state, String fromWxid
logger.error("订单保存异常:{}", e.getMessage()); logger.error("订单保存异常:{}", e.getMessage());
return false; return false;
} }
} }
private String getTypeDesc(String skuType) { private String getTypeDesc(String skuType) {
return switch (skuType) { return switch (skuType) {
case "1" -> "家电"; case "1" -> "家电";
case "2" -> "数码"; case "2" -> "数码";
case "3" -> "服饰"; case "3" -> "服饰";
default -> "未知类型"; default -> "未知类型";
}; };
} }
// 定义一个内部类来存储用户交互状态 // 定义一个内部类来存储用户交互状态
@Getter @Getter
@Setter @Setter
static class UserInteractionState { static class UserInteractionState {
// 推荐使用枚举管理状态
public enum ProcessState {
INIT, GIFT_MONEY_FLOW, DISINFECTANT_CABINET,PRODUCT_ORDER_REGISTRATION
}
public enum GiftMoneyStep {
STEP_PRODUCT_LINK, STEP_AMOUNT, STEP_QUANTITY
}
// 在UserInteractionState类中新增步骤枚举
public enum ProductOrderStep {
STEP_ORDER_ID,
STEP_PRODUCT_INFO,
STEP_RECIPIENT_INFO,
STEP_REVIEW_CONFIRM,
STEP_CASHBACK_TRACK
}
private GiftMoneyStep currentStep; // 新增当前步骤字段 private GiftMoneyStep currentStep; // 新增当前步骤字段
private String lastInteractionTime; private String lastInteractionTime;
private ProcessState currentState; private ProcessState currentState;
private Map<String, String> collectedFields; // 用于存储收集到的字段值 private Map<String, String> collectedFields; // 用于存储收集到的字段值
private String currentField; // 当前正在询问的字段 private String currentField; // 当前正在询问的字段
private ProductOrderStep currentProductOrderStep; private ProductOrderStep currentProductOrderStep;
public UserInteractionState() { public UserInteractionState() {
this.lastInteractionTime = LocalDateTime.now().format(DATE_TIME_FORMATTER); this.lastInteractionTime = LocalDateTime.now().format(DATE_TIME_FORMATTER);
this.currentState = INIT; this.currentState = INIT;
@@ -1242,25 +1237,43 @@ private String getTypeDesc(String skuType) {
updateLastInteractionTime(); updateLastInteractionTime();
} }
// 推荐使用枚举管理状态
public enum ProcessState {
INIT, GIFT_MONEY_FLOW, DISINFECTANT_CABINET, PRODUCT_ORDER_REGISTRATION
}
} public enum GiftMoneyStep {
STEP_PRODUCT_LINK, STEP_AMOUNT, STEP_QUANTITY
}
// 限流异常类(需自定义) // 在UserInteractionState类中新增步骤枚举
public static class RateLimitExceededException extends RuntimeException { public enum ProductOrderStep {
STEP_ORDER_ID,
STEP_PRODUCT_INFO,
STEP_RECIPIENT_INFO,
STEP_REVIEW_CONFIRM,
STEP_CASHBACK_TRACK
}
}
// 限流异常类(需自定义)
public static class RateLimitExceededException extends RuntimeException {
public RateLimitExceededException(String message) { public RateLimitExceededException(String message) {
super(message); super(message);
} }
} }
@Setter @Setter
@Getter @Getter
public static class OrderInfo { public static class OrderInfo {
private String skuName; private String skuName;
private Long count; private Long count;
private Long orderId; private Long orderId;
private Date orderDate; private Date orderDate;
} }
// 统计指标DTO // 统计指标DTO