抽取统计打印方法
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user