This commit is contained in:
Leo
2025-04-04 01:50:27 +08:00
parent 3be388f8e8
commit 78865292a9

View File

@@ -44,7 +44,8 @@ import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
import static cn.van.business.util.JDUtil.UserInteractionState.GiftMoneyStep.*; 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.JDUtil.UserInteractionState.ProductOrderStep.*;
import static cn.van.business.util.WXUtil.super_admins; import static cn.van.business.util.WXUtil.super_admins;
@@ -524,7 +525,7 @@ public class JDUtil {
* 接口描述:通过商品链接、领券链接、活动链接获取普通推广链接或优惠券二合一推广链接 * 接口描述:通过商品链接、领券链接、活动链接获取普通推广链接或优惠券二合一推广链接
* jd.union.open.promotion.bysubunionid.get * 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); JdClient client = new DefaultJdClient(SERVER_URL, ACCESS_TOKEN, LPF_APP_KEY_DG, LPF_SECRET_KEY_DG);
UnionOpenPromotionBysubunionidGetRequest request = new UnionOpenPromotionBysubunionidGetRequest(); UnionOpenPromotionBysubunionidGetRequest request = new UnionOpenPromotionBysubunionidGetRequest();
@@ -606,103 +607,104 @@ public class JDUtil {
// return response; // return response;
//} //}
private void handleUserInteraction(String fromWxid, String message) { private 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;
if (stateJson == null) { if (stateJson == null) {
state = new UserInteractionState(); state = new UserInteractionState();
logger.debug("New interaction state created for user: {}", fromWxid); logger.debug("New interaction state created for user: {}", fromWxid);
} else { } else {
try { try {
state = objectMapper.readValue(stateJson, UserInteractionState.class); state = objectMapper.readValue(stateJson, UserInteractionState.class);
// 检查是否超时 // 检查是否超时
LocalDateTime now = LocalDateTime.now(); LocalDateTime now = LocalDateTime.now();
LocalDateTime lastInteractionTime = LocalDateTime.parse(state.getLastInteractionTime(), DATE_TIME_FORMATTER); LocalDateTime lastInteractionTime = LocalDateTime.parse(state.getLastInteractionTime(), DATE_TIME_FORMATTER);
if (ChronoUnit.MINUTES.between(lastInteractionTime, now) > TIMEOUT_MINUTES) { if (ChronoUnit.MINUTES.between(lastInteractionTime, now) > TIMEOUT_MINUTES) {
redisTemplate.delete(key); redisTemplate.delete(key);
logger.debug("Deleted timeout state for user: {}", fromWxid); 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 = 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<String> 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) { } catch (Exception e) {
logger.error("Error parsing interaction state: {}", e.getMessage()); logger.error("Error saving 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<String> 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) { private String transferContentWithLinks(String message) {
List<String> urls = extractUJDUrls(message); List<String> urls = extractUJDUrls(message);
@@ -1126,29 +1128,34 @@ private void handleUserInteraction(String fromWxid, String message) {
StringBuilder images = new StringBuilder(); StringBuilder images = new StringBuilder();
if (productInfo.getData()[0].getImageInfo() != null) { if (productInfo.getData()[0].getImageInfo() != null) {
images.append(" ").append("图片信息:\n"); images.append(" ").append("图片信息:\n");
int index = 1;
for (UrlInfo image : productInfo.getData()[0].getImageInfo().getImageList()) { 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)); results.add(String.valueOf(images));
resultList.add(itemMap);
} }
results.add(String.valueOf(couponInfo)); results.add(String.valueOf(couponInfo));
} catch (Exception e) { } catch (Exception e) {
logger.error("处理商品链接时发生异常:{}", url, e); logger.error("处理商品链接时发生异常:{}", url, e);
couponInfo.append(" 处理商品链接时发生异常:").append(url).append("\n"); couponInfo.append(" 处理商品链接时发生异常:").append(url).append("\n");
} }
} }
StringBuilder wenan = new StringBuilder().append("文案生成: \n"); StringBuilder wenan = new StringBuilder().append("文案生成: \n");
// 完成转链后替换链接为u.jd.com链接文案不修改就返回 // 完成转链后替换链接为u.jd.com链接文案不修改就返回
for (String s : urls) { for (HashMap<String, String> stringStringHashMap : resultList) {
String transferUrl = transfer(s); String transferUrl = transfer(stringStringHashMap.get("materialUrl"));
wenan = new StringBuilder(message.replace(s, transferUrl)); wenan = new StringBuilder(message.replace(stringStringHashMap.get("url"), transferUrl));
}
results.add(String.valueOf(wenan));
return results; }
results.add(String.valueOf(wenan));
return results;
} }
@@ -1493,7 +1500,7 @@ private void handleUserInteraction(String fromWxid, String message) {
// 推荐使用枚举管理状态 // 推荐使用枚举管理状态
public enum ProcessState { 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 { public enum GiftMoneyStep {