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