1
This commit is contained in:
@@ -69,7 +69,6 @@ public class JDUtil {
|
||||
private static final String LL_SECRET_KEY_DG = "3ceddff403e544a8a2eacc727cf05dab";
|
||||
|
||||
|
||||
|
||||
private static final String SERVER_URL = "https://api.jd.com/routerjson";
|
||||
//accessToken
|
||||
private static final String ACCESS_TOKEN = "";
|
||||
@@ -88,8 +87,6 @@ public class JDUtil {
|
||||
private final ObjectMapper objectMapper = new ObjectMapper();
|
||||
|
||||
|
||||
|
||||
|
||||
// 构造函数中注入StringRedisTemplate
|
||||
@Autowired
|
||||
public JDUtil(StringRedisTemplate redisTemplate, ProductOrderRepository productOrderRepository, OrderRowRepository orderRowRepository, WXUtil wxUtil, OrderUtil orderUtil) {
|
||||
@@ -134,31 +131,23 @@ public class JDUtil {
|
||||
private StringBuilder buildStatsContent(String title, OrderStats stats) {
|
||||
StringBuilder content = new StringBuilder();
|
||||
content//[爱心][Wow][Packet][Party][Broken][心碎][亲亲][色]
|
||||
.append("* ").append(title).append(" *\n")
|
||||
.append("━━━━━━━━━━━━\n")
|
||||
.append("[爱心] 订单总数:").append(stats.getTotalOrders()).append("\n") // [文件]
|
||||
.append("* ").append(title).append(" *\n").append("━━━━━━━━━━━━\n").append("[爱心] 订单总数:").append(stats.getTotalOrders()).append("\n") // [文件]
|
||||
.append("[Party] 有效订单:").append(stats.getValidOrders()).append("\n") // [OK]
|
||||
.append("[心碎]已取消:").append(stats.getCanceledOrders()).append("\n") // [禁止]
|
||||
|
||||
.append("────────────\n")
|
||||
.append("[爱心]已付款:").append(stats.getPaidOrders()).append("\n") // [钱袋]
|
||||
.append("────────────\n").append("[爱心]已付款:").append(stats.getPaidOrders()).append("\n") // [钱袋]
|
||||
.append("[Packet] 已付款佣金:").append(String.format("%.2f", stats.getPaidCommission())).append("\n") // [钞票]
|
||||
.append("────────────\n")
|
||||
.append("[Wow] 待付款:").append(stats.getPendingOrders()).append("\n") // [时钟]
|
||||
.append("────────────\n").append("[Wow] 待付款:").append(stats.getPendingOrders()).append("\n") // [时钟]
|
||||
.append("[Packet] 待付款佣金:").append(String.format("%.2f", stats.getPendingCommission())).append("\n") // [钱]
|
||||
.append("────────────\n")
|
||||
.append("[亲亲] 已完成:").append(stats.getCompletedOrders()).append("\n") // [旗帜]
|
||||
.append("────────────\n").append("[亲亲] 已完成:").append(stats.getCompletedOrders()).append("\n") // [旗帜]
|
||||
.append("[Packet] 已完成佣金:").append(String.format("%.2f", stats.getCompletedCommission())).append("\n") // [信用卡]
|
||||
.append("────────────\n")
|
||||
.append("[Emm] 违规订单:").append(stats.getViolations()).append("\n") // [警告]
|
||||
.append("────────────\n").append("[Emm] 违规订单:").append(stats.getViolations()).append("\n") // [警告]
|
||||
.append("[Broken] 违规佣金:").append(String.format("%.2f", stats.getViolationCommission())).append("\n") // [炸弹]
|
||||
.append("━━━━━━━━━━━━");
|
||||
return content;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 接收京粉指令指令
|
||||
*/
|
||||
@@ -670,6 +659,11 @@ private StringBuilder buildStatsContent(String title, OrderStats stats) {
|
||||
|
||||
// 新增礼金流程处理方法
|
||||
private void handleGiftMoneyFlow(String fromWxid, String message, UserInteractionState state) {
|
||||
if (state.getCurrentStep() == null) {
|
||||
state.setCurrentStep(STEP_PRODUCT_LINK);
|
||||
wxUtil.sendTextMessage(fromWxid, "流程异常,已重置。请输入商品链接:", 1, fromWxid);
|
||||
return;
|
||||
}
|
||||
if ("礼金".equals(message)) {
|
||||
state.reset();
|
||||
logger.debug("用户 {} 重置礼金流程", fromWxid); // 新增
|
||||
@@ -705,35 +699,31 @@ private void handleGiftMoneyFlow(String fromWxid, String message, UserInteractio
|
||||
//logger.debug("商品信息已收集:SKU={}, Owner={}, WDIS={}", skuId, owner, productInfo.getBaseBigFieldInfo().getWdis()); // 新增
|
||||
String productInfo = skuId;
|
||||
state.setCurrentStep(STEP_AMOUNT);
|
||||
String prompt = String.format("商品信息:\n%s请输入开通金额(元):",
|
||||
productInfo);
|
||||
String prompt = String.format("商品SKU:\n %s\n 请输入开通金额(元):", productInfo);
|
||||
wxUtil.sendTextMessage(fromWxid, prompt, 1, fromWxid);
|
||||
break;
|
||||
|
||||
case STEP_AMOUNT:
|
||||
logger.debug("用户 {} 输入金额:{}", fromWxid, message);
|
||||
// 新增:先检查 message 是否为 null 或空字符串
|
||||
// 强制检查空值
|
||||
if (message == null || message.trim().isEmpty()) {
|
||||
wxUtil.sendTextMessage(fromWxid, "❌ 金额不能为空,请输入数字", 1, fromWxid);
|
||||
wxUtil.sendTextMessage(fromWxid, "❌ 金额不能为空,请输入数字(如:100.00)", 1, fromWxid);
|
||||
return;
|
||||
}
|
||||
// 校验格式
|
||||
if (!isValidAmount(message)) {
|
||||
wxUtil.sendTextMessage(fromWxid, "❌ 金额格式错误,请输入数字(如:100.00)", 1, fromWxid);
|
||||
return;
|
||||
}
|
||||
// 转换并保留两位小数
|
||||
amount = Double.parseDouble(message);
|
||||
// 格式化后输出日志
|
||||
String formattedAmount = String.format("%.2f", amount);
|
||||
logger.debug("校验金额:{} 元(商品价格的80%:{})", formattedAmount, 0.8 * Double.parseDouble(state.getCollectedFields().get("price"))); // 新增
|
||||
if (amount < 1 || amount > 0.8 * Double.parseDouble(state.getCollectedFields().get("price"))) {
|
||||
wxUtil.sendTextMessage(fromWxid, "❌ 金额需≥1元且≤商品价格的80%", 1, fromWxid);
|
||||
return;
|
||||
}
|
||||
|
||||
state.getCollectedFields().put("amount", formattedAmount);
|
||||
state.setCurrentStep(STEP_QUANTITY);
|
||||
wxUtil.sendTextMessage(fromWxid, "请输入数量(1-1000):", 1, fromWxid);
|
||||
break;
|
||||
|
||||
|
||||
case STEP_QUANTITY:
|
||||
logger.debug("用户 {} 输入数量:{}", fromWxid, message); // 新增
|
||||
if (!isValidQuantity(message)) {
|
||||
@@ -747,23 +737,17 @@ private void handleGiftMoneyFlow(String fromWxid, String message, UserInteractio
|
||||
return;
|
||||
}
|
||||
|
||||
logger.debug("礼金参数准备完成:SKU={},金额={}元,数量={},Owner={}",
|
||||
state.getCollectedFields().get("skuId"),
|
||||
amount,
|
||||
quantity,
|
||||
state.getCollectedFields().get("owner")); // 新增
|
||||
logger.debug("礼金参数准备完成:SKU={},金额={}元,数量={},Owner={}", state.getCollectedFields().get("skuId"), amount, quantity, state.getCollectedFields().get("owner")); // 新增
|
||||
|
||||
String giftKey = createGiftCoupon(skuId, amount, quantity, owner);
|
||||
if (giftKey == null) {
|
||||
logger.error("用户 {} 礼金创建失败:SKU={}, 金额={}, 数量={}, Owner={}",
|
||||
fromWxid, skuId, amount, quantity, owner); // 新增
|
||||
logger.error("用户 {} 礼金创建失败:SKU={}, 金额={}, 数量={}, Owner={}", fromWxid, skuId, amount, quantity, owner); // 新增
|
||||
wxUtil.sendTextMessage(fromWxid, "❌ 礼金创建失败,请检查商品是否符合要求", 1, fromWxid);
|
||||
state.reset();
|
||||
return;
|
||||
}
|
||||
|
||||
logger.info("用户 {} 礼金创建成功:批次ID={}, 参数:SKU={}, 金额={}元,数量={}, Owner={}",
|
||||
fromWxid, giftKey, skuId, amount, quantity, owner); // 新增关键成功日志
|
||||
logger.info("用户 {} 礼金创建成功:批次ID={}, 参数:SKU={}, 金额={}元,数量={}, Owner={}", fromWxid, giftKey, skuId, amount, quantity, owner); // 新增关键成功日志
|
||||
state.getCollectedFields().put("giftKey", giftKey);
|
||||
break;
|
||||
}
|
||||
@@ -902,23 +886,18 @@ public boolean stopGiftCoupon(String giftKey) throws Exception {
|
||||
}
|
||||
|
||||
|
||||
|
||||
private boolean isValidAmount(String input) {
|
||||
if (Util.isNotEmpty(input)) {
|
||||
// 新增:直接处理 null 或空字符串
|
||||
if (input == null || input.trim().isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
double amount = Double.parseDouble(input);
|
||||
// 校验是否为两位小数(可选)
|
||||
BigDecimal bd = new BigDecimal(input);
|
||||
if (bd.scale() > 2) return false; // 精度超过两位返回 false
|
||||
return amount >= 1 && amount <= 50;
|
||||
return amount > 1 && amount <= 50;
|
||||
} catch (NumberFormatException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
private boolean isValidQuantity(String input) {
|
||||
@@ -1027,6 +1006,7 @@ private boolean isValidAmount(String input) {
|
||||
private Map<String, String> collectedFields; // 用于存储收集到的字段值
|
||||
private String currentField; // 当前正在询问的字段
|
||||
private ProductOrderStep currentProductOrderStep;
|
||||
|
||||
public UserInteractionState() {
|
||||
this.lastInteractionTime = LocalDateTime.now().format(DATE_TIME_FORMATTER);
|
||||
this.currentState = INIT;
|
||||
@@ -1039,14 +1019,15 @@ private boolean isValidAmount(String input) {
|
||||
this.lastInteractionTime = LocalDateTime.now().format(DATE_TIME_FORMATTER);
|
||||
}
|
||||
|
||||
// UserInteractionState类缺少reset方法
|
||||
public void reset() {
|
||||
this.currentState = INIT;
|
||||
this.collectedFields.clear();
|
||||
this.currentStep = null;
|
||||
this.currentStep = STEP_PRODUCT_LINK; // 明确重置步骤
|
||||
this.currentProductOrderStep = null;
|
||||
updateLastInteractionTime();
|
||||
}
|
||||
|
||||
|
||||
// 推荐使用枚举管理状态
|
||||
public enum ProcessState {
|
||||
INIT, GIFT_MONEY_FLOW, DISINFECTANT_CABINET, PRODUCT_ORDER_REGISTRATION
|
||||
@@ -1058,11 +1039,7 @@ private boolean isValidAmount(String input) {
|
||||
|
||||
// 在UserInteractionState类中新增步骤枚举
|
||||
public enum ProductOrderStep {
|
||||
STEP_ORDER_ID,
|
||||
STEP_PRODUCT_INFO,
|
||||
STEP_RECIPIENT_INFO,
|
||||
STEP_REVIEW_CONFIRM,
|
||||
STEP_CASHBACK_TRACK
|
||||
STEP_ORDER_ID, STEP_PRODUCT_INFO, STEP_RECIPIENT_INFO, STEP_REVIEW_CONFIRM, STEP_CASHBACK_TRACK
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user