菜单优化
This commit is contained in:
@@ -43,6 +43,7 @@ import java.util.stream.Stream;
|
||||
|
||||
import static cn.van.business.util.JDUtil.UserInteractionState.GiftMoneyStep.*;
|
||||
import static cn.van.business.util.JDUtil.UserInteractionState.ProcessState.*;
|
||||
import static cn.van.business.util.JDUtil.UserInteractionState.ProductOrderStep.*;
|
||||
import static cn.van.business.util.WXUtil.super_admins;
|
||||
|
||||
/**
|
||||
@@ -1241,6 +1242,117 @@ public class JDUtil {
|
||||
// 实现实际的开通接口调用
|
||||
return true;
|
||||
}
|
||||
public void handleProductOrderRegistration(String fromWxid, String message, UserInteractionState state) {
|
||||
switch (state.getCurrentProductOrderStep()) {
|
||||
case STEP_ORDER_ID:
|
||||
if (!message.matches("^\\d{10,20}$")) {
|
||||
wxUtil.sendTextMessage(fromWxid, "⚠️ 订单号格式错误(需10-20位数字)", 1, fromWxid);
|
||||
return;
|
||||
}
|
||||
state.getCollectedFields().put("orderId", message);
|
||||
state.setCurrentProductOrderStep(STEP_PRODUCT_INFO);
|
||||
wxUtil.sendTextMessage(fromWxid,
|
||||
"请输入商品信息(格式:商品名称-类型编号)\n类型对照:1-家电 2-数码 3-服饰\n示例:格力空调-1", 1, fromWxid);
|
||||
break;
|
||||
|
||||
case STEP_PRODUCT_INFO:
|
||||
String[] productInfo = message.split("-");
|
||||
if (productInfo.length != 2 || !productInfo[1].matches("[1-3]")) {
|
||||
wxUtil.sendTextMessage(fromWxid, "❌ 格式错误或类型编号无效", 1, fromWxid);
|
||||
return;
|
||||
}
|
||||
state.getCollectedFields().put("skuName", productInfo[0]);
|
||||
state.getCollectedFields().put("skuType", productInfo[1]);
|
||||
|
||||
state.setCurrentProductOrderStep(UserInteractionState.ProductOrderStep.STEP_RECIPIENT_INFO);
|
||||
wxUtil.sendTextMessage(fromWxid,
|
||||
"请输入收件信息(格式:姓名-电话-地址)\n示例:张三-13812345678-北京市朝阳区", 1, fromWxid);
|
||||
break;
|
||||
|
||||
case STEP_RECIPIENT_INFO:
|
||||
String[] recipientInfo = message.split("-");
|
||||
if (recipientInfo.length < 3) {
|
||||
wxUtil.sendTextMessage(fromWxid, "❌ 格式错误,请按示例格式输入", 1, fromWxid);
|
||||
return;
|
||||
}
|
||||
state.getCollectedFields().put("recipientName", recipientInfo[0]);
|
||||
state.getCollectedFields().put("recipientPhone", recipientInfo[1]);
|
||||
state.getCollectedFields().put("recipientAddress", String.join("-", Arrays.copyOfRange(recipientInfo, 2, recipientInfo.length)));
|
||||
|
||||
// 生成确认信息
|
||||
String confirmMsg = buildConfirmMessage(state);
|
||||
wxUtil.sendTextMessage(fromWxid, confirmMsg, 1, fromWxid);
|
||||
state.setCurrentProductOrderStep(STEP_REVIEW_CONFIRM);
|
||||
break;
|
||||
|
||||
case STEP_REVIEW_CONFIRM:
|
||||
if ("确认".equals(message)) {
|
||||
boolean success = saveFullProductOrder(state, fromWxid);
|
||||
wxUtil.sendTextMessage(fromWxid,
|
||||
success ? "✅ 订单登记成功!" : "❌ 保存失败,请联系管理员", 1, fromWxid);
|
||||
state.reset();
|
||||
} else {
|
||||
state.setCurrentProductOrderStep(STEP_ORDER_ID);
|
||||
wxUtil.sendTextMessage(fromWxid, "请重新输入订单号:", 1, fromWxid);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// 构建确认信息模板
|
||||
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" +
|
||||
"回复【确认】提交,其他内容重新开始";
|
||||
}
|
||||
|
||||
// 保存完整订单
|
||||
private boolean saveFullProductOrder(UserInteractionState state, String fromWxid) {
|
||||
try {
|
||||
ProductOrder order = new ProductOrder();
|
||||
order.setOrderId(state.getCollectedFields().get("orderId"));
|
||||
order.setSkuName(state.getCollectedFields().get("skuName"));
|
||||
order.setSkuType(Integer.valueOf(state.getCollectedFields().get("skuType")));
|
||||
order.setRecipientName(state.getCollectedFields().get("recipientName"));
|
||||
order.setRecipientPhone(state.getCollectedFields().get("recipientPhone"));
|
||||
order.setRecipientAddress(state.getCollectedFields().get("recipientAddress"));
|
||||
order.setOrderTime(new Date()); // 设置下单时间为当前时间
|
||||
order.setWhoOrder(state.getCollectedFields().get("recipientName")); // 关联管理员信息
|
||||
order.setIsReviewed(false); // 默认是否晒图登记
|
||||
order.setIsCashbackReceived(false); // 默认是否返现到账
|
||||
order.setFromWxid(fromWxid); // 设置当前交互的wxid
|
||||
|
||||
productOrderRepository.save(order);
|
||||
logger.info("订单登记成功:{}", order);
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
logger.error("订单保存异常:{}", e.getMessage());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// 获取商品类型描述
|
||||
private String getTypeDesc(String skuType) {
|
||||
switch (skuType) {
|
||||
case "1":
|
||||
return "家电";
|
||||
case "2":
|
||||
return "数码";
|
||||
case "3":
|
||||
return "服饰";
|
||||
default:
|
||||
return "未知类型";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// 定义一个内部类来存储用户交互状态
|
||||
@Getter
|
||||
@@ -1248,19 +1360,27 @@ public class JDUtil {
|
||||
static class UserInteractionState {
|
||||
// 推荐使用枚举管理状态
|
||||
public enum ProcessState {
|
||||
INIT, GIFT_MONEY_FLOW, DISINFECTANT_CABINET
|
||||
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 String lastInteractionTime;
|
||||
private ProcessState currentState;
|
||||
private Map<String, String> collectedFields; // 用于存储收集到的字段值
|
||||
private String currentField; // 当前正在询问的字段
|
||||
private ProductOrderStep currentProductOrderStep;
|
||||
|
||||
public UserInteractionState() {
|
||||
this.lastInteractionTime = LocalDateTime.now().format(DATE_TIME_FORMATTER);
|
||||
|
||||
Reference in New Issue
Block a user