1
This commit is contained in:
@@ -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<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 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<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) {
|
||||
List<String> 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<String, String> 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 {
|
||||
|
||||
Reference in New Issue
Block a user