From ef3f50259eaa41fa9012081f234d73789dbd58e7 Mon Sep 17 00:00:00 2001 From: Leo Date: Tue, 8 Apr 2025 16:00:57 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=BD=E7=A6=BB=E7=A4=BC=E9=87=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/van/business/util/JDUtil.java | 180 +++++++----------- 1 file changed, 74 insertions(+), 106 deletions(-) diff --git a/src/main/java/cn/van/business/util/JDUtil.java b/src/main/java/cn/van/business/util/JDUtil.java index dc38f6b..7fcd169 100644 --- a/src/main/java/cn/van/business/util/JDUtil.java +++ b/src/main/java/cn/van/business/util/JDUtil.java @@ -186,13 +186,15 @@ public void sendOrderToWxByOrderDefault(String order, String fromWxid) { logger.info("执行 sendOrderToWxByOrderDefault 方法,order: {}, fromWxid: {}", order, fromWxid); if ("礼".equals(order)) { - // 确保缓存中有消息内容 - String cachedMessage = cacheMap.get("giftMessage" + fromWxid); - if (cachedMessage == null || cachedMessage.trim().isEmpty()) { - wxUtil.sendTextMessage(fromWxid, "未找到商品链接,请重新输入包含商品链接的消息。", 1, fromWxid, false); - return; - } - handleGiftCommand(fromWxid); + // 设置状态为等待文案输入 + String key = INTERACTION_STATE_PREFIX + fromWxid; + UserInteractionState state = loadOrCreateState(key); + state.setCurrentState(UserInteractionState.ProcessState.GIFT_MONEY_FLOW); + state.setCurrentStep(UserInteractionState.GiftMoneyStep.STEP_WAIT_FOR_CONTENT); + saveState(key, state); + + // 提示用户输入文案 + wxUtil.sendTextMessage(fromWxid, "请输入包含商品链接的文案:", 1, fromWxid, false); } else { handleUserInteraction(fromWxid, order); } @@ -200,6 +202,7 @@ public void sendOrderToWxByOrderDefault(String order, String fromWxid) { + /** * 处理“礼”指令,直接进入礼金创建流程 */ @@ -264,80 +267,47 @@ private void handleGiftCommand(String fromWxid) { */ private void processGiftMoneyFlow(String wxid, String message, UserInteractionState state) { try { - // 获取缓存的商品信息 - String cachedData = cacheMap.get("validProducts" + wxid); - if (cachedData == null) { - wxUtil.sendTextMessage(wxid, "数据丢失,请重新开始流程", 1, wxid, false); - resetState(wxid, state); + // 提取文案中的 u.jd.com 链接 + List urls = extractUJDUrls(message); + if (urls.isEmpty()) { + wxUtil.sendTextMessage(wxid, "未找到有效的商品链接,请重新输入包含商品链接的文案。", 1, wxid, false); return; } - List validProducts = JSON.parseArray(cachedData, GoodsQueryResult.class); - int currentIndex = Integer.parseInt(state.getCollectedFields().get("productIndex")); - int totalProducts = Integer.parseInt(state.getCollectedFields().get("totalProducts")); - - // 根据当前步骤处理 - switch (state.getCurrentStep()) { - case STEP_AMOUNT: - if (!isValidAmount(message)) { - wxUtil.sendTextMessage(wxid, "金额格式错误,请输入1-50元", 1, wxid, false); - return; + // 查询商品信息,筛选有效商品 + List validProducts = new ArrayList<>(); + for (String url : urls) { + try { + GoodsQueryResult productInfo = queryProductInfoByUJDUrl(url); + if (productInfo != null && productInfo.getCode() == 200 && productInfo.getTotalCount() > 0) { + validProducts.add(productInfo); } - state.getCollectedFields().put("amount", message); - state.setCurrentStep(UserInteractionState.GiftMoneyStep.STEP_QUANTITY); - wxUtil.sendTextMessage(wxid, "请输入数量(1-100):", 1, wxid, false); - break; - - case STEP_QUANTITY: - if (!isValidQuantity(message)) { - wxUtil.sendTextMessage(wxid, "数量格式错误,请输入1-100的整数", 1, wxid, false); - return; - } - - // 记录数量 - state.getCollectedFields().put("quantity", message); - - // 开始循环创建礼金 - double amount = Double.parseDouble(state.getCollectedFields().get("amount")); - int quantity = Integer.parseInt(message); - - StringBuilder result = new StringBuilder(); - for (int i = currentIndex; i < totalProducts; i++) { - GoodsQueryResult product = validProducts.get(i); - JSONObject productInfo = JSONObject.parseObject(JSON.toJSONString(product.getData()[0])); - - String skuId = productInfo.getString("materialUrl"); - String owner = productInfo.getString("owner"); - String skuName = productInfo.getString("skuName"); - - // 调用礼金创建接口 - String giftKey = createGiftCoupon(skuId, amount, quantity, owner, skuName); - if (giftKey != null) { - result.append("商品:").append(skuName).append("\n") - .append("礼金创建成功,批次ID:").append(giftKey).append("\n\n"); - } else { - result.append("商品:").append(skuName).append("\n") - .append("礼金创建失败,请稍后重试。\n\n"); - } - - // 更新当前索引 - state.getCollectedFields().put("productIndex", String.valueOf(i + 1)); - saveState(INTERACTION_STATE_PREFIX + wxid, state); - } - - // 返回结果 - wxUtil.sendTextMessage(wxid, "礼金创建完成:\n" + result.toString(), 1, wxid, false); - resetState(wxid, state); - break; - - default: - wxUtil.sendTextMessage(wxid, "流程异常,请重新开始", 1, wxid, false); - resetState(wxid, state); + } catch (Exception e) { + logger.error("查询商品信息失败:{}", url, e); + } } + if (validProducts.isEmpty()) { + wxUtil.sendTextMessage(wxid, "未找到有效的商品信息,请检查链接是否正确。", 1, wxid, false); + return; + } + + // 缓存商品信息 + cacheMap.put("validProducts" + wxid, JSON.toJSONString(validProducts)); + + // 更新状态 + state.setCurrentStep(UserInteractionState.GiftMoneyStep.STEP_AMOUNT); + state.getCollectedFields().clear(); + state.getCollectedFields().put("productIndex", "0"); // 当前处理的商品索引 + state.getCollectedFields().put("totalProducts", String.valueOf(validProducts.size())); // 总商品数 + saveState(INTERACTION_STATE_PREFIX + wxid, state); + + // 提示用户输入金额 + wxUtil.sendTextMessage(wxid, "请输入开通金额(1-50元,支持小数点后两位):", 1, wxid, false); + } catch (Exception e) { - logger.error("礼金创建流程异常 - 用户: {}", wxid, e); - wxUtil.sendTextMessage(wxid, "处理异常,请重试", 1, wxid, false); + logger.error("处理礼金文案异常 - 用户: {}", wxid, e); + wxUtil.sendTextMessage(wxid, "处理请求时发生异常,请重试", 1, wxid, false); resetState(wxid, state); } } @@ -878,39 +848,39 @@ private void processGiftMoneyFlow(String wxid, String message, UserInteractionSt }); } - private void handleUserInteraction(String fromWxid, String message) { - String key = INTERACTION_STATE_PREFIX + fromWxid; - UserInteractionState state = loadOrCreateState(key); +private void handleUserInteraction(String fromWxid, String message) { + String key = INTERACTION_STATE_PREFIX + fromWxid; + UserInteractionState state = loadOrCreateState(key); - try { - switch (state.getCurrentState()) { - case INIT: - handleInitState(fromWxid, message, state); - break; + try { + switch (state.getCurrentState()) { + case INIT: + handleInitState(fromWxid, message, state); + break; - case PRODUCT_PROMOTION: - handlePromotionState(fromWxid, message, state); - break; + case PRODUCT_PROMOTION: + handlePromotionState(fromWxid, message, state); + break; - case GIFT_MONEY_FLOW: - processGiftMoneyFlow(fromWxid, message, state); - break; + case GIFT_MONEY_FLOW: + processGiftMoneyFlow(fromWxid, message, state); + break; - default: - resetState(fromWxid, state); - wxUtil.sendTextMessage(fromWxid, "流程异常,请重新开始", 1, fromWxid, false); - } - } catch (Exception e) { - logger.error("流程处理异常 - 用户: {}, 状态: {}", fromWxid, state, e); - resetState(fromWxid, state); - wxUtil.sendTextMessage(fromWxid, "处理异常,请重新开始", 1, fromWxid, false); - } finally { - saveState(key, state); - } + default: + resetState(fromWxid, state); + wxUtil.sendTextMessage(fromWxid, "流程异常,请重新开始", 1, fromWxid, false); + } + } catch (Exception e) { + logger.error("流程处理异常 - 用户: {}, 状态: {}", fromWxid, state, e); + resetState(fromWxid, state); + wxUtil.sendTextMessage(fromWxid, "处理异常,请重试", 1, fromWxid, false); + } finally { + saveState(key, state); + } - userInteractionStates.put(key, state); - logger.debug("Updated interaction state for user {}: {}", fromWxid, JSON.toJSONString(state)); - } + userInteractionStates.put(key, state); + logger.debug("Updated interaction state for user {}: {}", fromWxid, JSON.toJSONString(state)); +} private UserInteractionState loadOrCreateState(String key) { UserInteractionState state = loadState(key); @@ -1556,7 +1526,9 @@ public HashMap> generatePromotionContent(String message) { INIT, GIFT_MONEY_FLOW, PRODUCT_PROMOTION } + @Getter public enum GiftMoneyStep { + STEP_WAIT_FOR_CONTENT(3), STEP_CONFIRM_GIFT(0), // 显式指定序号 STEP_AMOUNT(1), STEP_QUANTITY(2); private final int code; @@ -1565,10 +1537,6 @@ public HashMap> generatePromotionContent(String message) { this.code = code; } - public int getCode() { - return code; - } - }