From 78865292a9839d907059bdb0061b61f9bb4aa057 Mon Sep 17 00:00:00 2001 From: Leo Date: Fri, 4 Apr 2025 01:50:27 +0800 Subject: [PATCH] 1 --- .../java/cn/van/business/util/JDUtil.java | 209 +++++++++--------- 1 file changed, 108 insertions(+), 101 deletions(-) diff --git a/src/main/java/cn/van/business/util/JDUtil.java b/src/main/java/cn/van/business/util/JDUtil.java index 750fea6..2dbdf69 100644 --- a/src/main/java/cn/van/business/util/JDUtil.java +++ b/src/main/java/cn/van/business/util/JDUtil.java @@ -44,7 +44,8 @@ import java.util.stream.Collectors; 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.ProcessState.DISINFECTANT_CABINET; +import static cn.van.business.util.JDUtil.UserInteractionState.ProcessState.INIT; import static cn.van.business.util.JDUtil.UserInteractionState.ProductOrderStep.*; import static cn.van.business.util.WXUtil.super_admins; @@ -524,7 +525,7 @@ public class JDUtil { * 接口描述:通过商品链接、领券链接、活动链接获取普通推广链接或优惠券二合一推广链接 * jd.union.open.promotion.bysubunionid.get */ - String transfer(String url) { + String transfer(String url) { JdClient client = new DefaultJdClient(SERVER_URL, ACCESS_TOKEN, LPF_APP_KEY_DG, LPF_SECRET_KEY_DG); UnionOpenPromotionBysubunionidGetRequest request = new UnionOpenPromotionBysubunionidGetRequest(); @@ -606,103 +607,104 @@ public class JDUtil { // return response; //} -private void handleUserInteraction(String fromWxid, String message) { - String key = INTERACTION_STATE_PREFIX + fromWxid; - String stateJson = redisTemplate.opsForValue().get(key); - UserInteractionState state; + private void handleUserInteraction(String fromWxid, String message) { + String key = INTERACTION_STATE_PREFIX + fromWxid; + String stateJson = redisTemplate.opsForValue().get(key); + UserInteractionState state; - if (stateJson == null) { - state = new UserInteractionState(); - logger.debug("New interaction state created for user: {}", fromWxid); - } else { - try { - state = objectMapper.readValue(stateJson, UserInteractionState.class); - // 检查是否超时 - LocalDateTime now = LocalDateTime.now(); - LocalDateTime lastInteractionTime = LocalDateTime.parse(state.getLastInteractionTime(), DATE_TIME_FORMATTER); - if (ChronoUnit.MINUTES.between(lastInteractionTime, now) > TIMEOUT_MINUTES) { - redisTemplate.delete(key); - logger.debug("Deleted timeout state for user: {}", fromWxid); + if (stateJson == null) { + state = new UserInteractionState(); + logger.debug("New interaction state created for user: {}", fromWxid); + } else { + try { + state = objectMapper.readValue(stateJson, UserInteractionState.class); + // 检查是否超时 + LocalDateTime now = LocalDateTime.now(); + LocalDateTime lastInteractionTime = LocalDateTime.parse(state.getLastInteractionTime(), DATE_TIME_FORMATTER); + if (ChronoUnit.MINUTES.between(lastInteractionTime, now) > TIMEOUT_MINUTES) { + redisTemplate.delete(key); + logger.debug("Deleted timeout state for user: {}", fromWxid); + state = new UserInteractionState(); + } + } catch (Exception e) { + logger.error("Error parsing interaction state: {}", e.getMessage()); state = new UserInteractionState(); } + } + + state.updateLastInteractionTime(); + + switch (state.getCurrentState()) { + case INIT: + if ("转链".equals(message)) { + state.setCurrentState(UserInteractionState.ProcessState.PRODUCT_PROMOTION); + state.setCurrentField("content"); + wxUtil.sendTextMessage(fromWxid, "请输入推广文案(包含商品链接):", 1, fromWxid); + logger.info("进入转链流程 - 文案输入步骤"); + } else if ("礼金".equals(message)) { + state.setCurrentState(UserInteractionState.ProcessState.PRODUCT_PROMOTION); + state.setCurrentField("content"); + wxUtil.sendTextMessage(fromWxid, "请输入推广文案(包含商品链接):", 1, fromWxid); + logger.info("进入转链流程 - 文案输入步骤"); + + } else if ("登记".equals(message)) { + state.setCurrentState(DISINFECTANT_CABINET); + state.setCurrentField("orderId"); + wxUtil.sendTextMessage(fromWxid, "请输入订单号:", 1, fromWxid); + logger.debug("User {} entered DISINFECTANT_CABINET state", fromWxid); + } + break; + + case PRODUCT_PROMOTION: + if ("content".equals(state.getCurrentField())) { + // 第一次输入文案,直接生成内容 + List messages = generatePromotionContent(message); // 不需要图片和SKU名称 + for (String s : messages) { + wxUtil.sendTextMessage(fromWxid, s, 1, fromWxid); + } + + // 询问是否需要继续转链 + state.setCurrentField("confirm"); + wxUtil.sendTextMessage(fromWxid, "是否需要继续进行转链?\n回复 1 - 是\n回复 2 - 否", 1, fromWxid); + logger.info("转链流程 - 等待用户确认是否继续转链"); + } else if ("confirm".equals(state.getCurrentField())) { + if ("1".equals(message)) { + // 继续转链逻辑 + String transferredContent = transferContentWithLinks(message); + wxUtil.sendTextMessage(fromWxid, "转链完成:\n" + transferredContent, 1, fromWxid); + } else if ("2".equals(message)) { + wxUtil.sendTextMessage(fromWxid, "转链流程已取消", 1, fromWxid); + } else { + wxUtil.sendTextMessage(fromWxid, "无效的选择,请重新输入:\n回复 1 - 是\n回复 2 - 否", 1, fromWxid); + } + state.reset(); // 重置状态 + } + break; + + + case GIFT_MONEY_FLOW: + handleGiftMoneyFlow(fromWxid, message, state); + break; + + case PRODUCT_ORDER_REGISTRATION: + handleProductOrderRegistration(fromWxid, message, state); + break; + + default: + wxUtil.sendTextMessage(fromWxid, "无效的状态,请重新开始对话", 1, fromWxid); + state.setCurrentState(INIT); + logger.debug("User {} reset to INIT state due to invalid state", fromWxid); + break; + } + + try { + redisTemplate.opsForValue().set(key, objectMapper.writeValueAsString(state), TIMEOUT_MINUTES, TimeUnit.MINUTES); + logger.debug("Saved interaction state for user {}: {}", fromWxid, state); } catch (Exception e) { - logger.error("Error parsing interaction state: {}", e.getMessage()); - state = new UserInteractionState(); + logger.error("Error saving interaction state: {}", e.getMessage()); } } - state.updateLastInteractionTime(); - - switch (state.getCurrentState()) { - case INIT: - if ("转链".equals(message)) { - state.setCurrentState(UserInteractionState.ProcessState.PRODUCT_PROMOTION); - state.setCurrentField("content"); - wxUtil.sendTextMessage(fromWxid, "请输入推广文案(包含商品链接):", 1, fromWxid); - logger.info("进入转链流程 - 文案输入步骤"); - } else if ("礼金".equals(message)) { - state.setCurrentState(UserInteractionState.ProcessState.PRODUCT_PROMOTION); - state.setCurrentField("content"); - wxUtil.sendTextMessage(fromWxid, "请输入推广文案(包含商品链接):", 1, fromWxid); - logger.info("进入转链流程 - 文案输入步骤"); - - } else if ("登记".equals(message)) { - state.setCurrentState(DISINFECTANT_CABINET); - state.setCurrentField("orderId"); - wxUtil.sendTextMessage(fromWxid, "请输入订单号:", 1, fromWxid); - logger.debug("User {} entered DISINFECTANT_CABINET state", fromWxid); - } - break; - - case PRODUCT_PROMOTION: - if ("content".equals(state.getCurrentField())) { - // 第一次输入文案,直接生成内容 - List messages = generatePromotionContent(message); // 不需要图片和SKU名称 - for (String s : messages) { - wxUtil.sendTextMessage(fromWxid, s , 1, fromWxid); - } - - // 询问是否需要继续转链 - state.setCurrentField("confirm"); - wxUtil.sendTextMessage(fromWxid, "是否需要继续进行转链?\n回复 1 - 是\n回复 2 - 否", 1, fromWxid); - logger.info("转链流程 - 等待用户确认是否继续转链"); - } else if ("confirm".equals(state.getCurrentField())) { - if ("1".equals(message)) { - // 继续转链逻辑 - String transferredContent = transferContentWithLinks(message); - wxUtil.sendTextMessage(fromWxid, "转链完成:\n" + transferredContent, 1, fromWxid); - } else if ("2".equals(message)) { - wxUtil.sendTextMessage(fromWxid, "转链流程已取消", 1, fromWxid); - } else { - wxUtil.sendTextMessage(fromWxid, "无效的选择,请重新输入:\n回复 1 - 是\n回复 2 - 否", 1, fromWxid); - } - state.reset(); // 重置状态 - } - break; - - - case GIFT_MONEY_FLOW: - handleGiftMoneyFlow(fromWxid, message, state); - break; - - case PRODUCT_ORDER_REGISTRATION: - handleProductOrderRegistration(fromWxid, message, state); - break; - - default: - wxUtil.sendTextMessage(fromWxid, "无效的状态,请重新开始对话", 1, fromWxid); - state.setCurrentState(INIT); - logger.debug("User {} reset to INIT state due to invalid state", fromWxid); - break; - } - - try { - redisTemplate.opsForValue().set(key, objectMapper.writeValueAsString(state), TIMEOUT_MINUTES, TimeUnit.MINUTES); - logger.debug("Saved interaction state for user {}: {}", fromWxid, state); - } catch (Exception e) { - logger.error("Error saving interaction state: {}", e.getMessage()); - } -} // 新增方法:处理文案中的链接并进行转链 private String transferContentWithLinks(String message) { List urls = extractUJDUrls(message); @@ -1126,29 +1128,34 @@ private void handleUserInteraction(String fromWxid, String message) { StringBuilder images = new StringBuilder(); if (productInfo.getData()[0].getImageInfo() != null) { images.append(" ").append("图片信息:\n"); + int index = 1; for (UrlInfo image : productInfo.getData()[0].getImageInfo().getImageList()) { - images.append(" ").append(image.getUrl()).append("\n"); + images.append("图片 ").append(index++).append("\n").append(image.getUrl()).append("\n"); } } results.add(String.valueOf(images)); + resultList.add(itemMap); } results.add(String.valueOf(couponInfo)); + } catch (Exception e) { logger.error("处理商品链接时发生异常:{}", url, e); - couponInfo.append("❌ 处理商品链接时发生异常:").append(url).append("\n"); + couponInfo.append(" 处理商品链接时发生异常:").append(url).append("\n"); } } StringBuilder wenan = new StringBuilder().append("文案生成: \n"); // 完成转链后替换链接为u.jd.com链接,文案不修改就返回 - for (String s : urls) { - String transferUrl = transfer(s); - wenan = new StringBuilder(message.replace(s, transferUrl)); - } - results.add(String.valueOf(wenan)); + for (HashMap stringStringHashMap : resultList) { + String transferUrl = transfer(stringStringHashMap.get("materialUrl")); + wenan = new StringBuilder(message.replace(stringStringHashMap.get("url"), transferUrl)); - return results; + } + + results.add(String.valueOf(wenan)); + + return results; } @@ -1493,7 +1500,7 @@ private void handleUserInteraction(String fromWxid, String message) { // 推荐使用枚举管理状态 public enum ProcessState { - INIT, GIFT_MONEY_FLOW, DISINFECTANT_CABINET, PRODUCT_ORDER_REGISTRATION,PRODUCT_PROMOTION + INIT, GIFT_MONEY_FLOW, DISINFECTANT_CABINET, PRODUCT_ORDER_REGISTRATION, PRODUCT_PROMOTION } public enum GiftMoneyStep {