This commit is contained in:
Leo
2025-04-04 01:41:58 +08:00
parent ca5a51d55c
commit 3be388f8e8

View File

@@ -15,6 +15,7 @@ import com.jd.open.api.sdk.domain.kplunion.GoodsService.request.query.BigFieldGo
import com.jd.open.api.sdk.domain.kplunion.GoodsService.request.query.GoodsReq;
import com.jd.open.api.sdk.domain.kplunion.GoodsService.response.query.BigfieldQueryResult;
import com.jd.open.api.sdk.domain.kplunion.GoodsService.response.query.GoodsQueryResult;
import com.jd.open.api.sdk.domain.kplunion.GoodsService.response.query.UrlInfo;
import com.jd.open.api.sdk.domain.kplunion.OrderService.request.query.OrderRowReq;
import com.jd.open.api.sdk.domain.kplunion.promotionbysubunioni.PromotionService.request.get.PromotionCodeReq;
import com.jd.open.api.sdk.request.kplunion.*;
@@ -640,10 +641,11 @@ private void handleUserInteraction(String fromWxid, String message) {
wxUtil.sendTextMessage(fromWxid, "请输入推广文案(包含商品链接):", 1, fromWxid);
logger.info("进入转链流程 - 文案输入步骤");
} else if ("礼金".equals(message)) {
state.setCurrentState(GIFT_MONEY_FLOW);
state.setCurrentStep(STEP_PRODUCT_LINK);
wxUtil.sendTextMessage(fromWxid, "请输入商品链接:", 1, fromWxid);
logger.info("进入礼金开通流程 - 商品链接步骤");
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");
@@ -654,31 +656,31 @@ private void handleUserInteraction(String fromWxid, String message) {
case PRODUCT_PROMOTION:
if ("content".equals(state.getCurrentField())) {
// 第一次输入文案
state.getCollectedFields().put("content", message);
state.setCurrentField("option");
wxUtil.sendTextMessage(fromWxid, "请选择操作:\n回复 1 - 需要图片和 SKU 名称\n回复 2 - 仅进行转链", 1, fromWxid);
logger.info("转链流程 - 等待用户选择操作");
} else if ("option".equals(state.getCurrentField())) {
// 第二次选择操作
if ("1".equals(message)) {
// 需要图片和 SKU 名称
String content = state.getCollectedFields().get("content");
String result = generatePromotionContent(content, true);
wxUtil.sendTextMessage(fromWxid, "处理结果:\n" + result, 1, fromWxid);
state.reset();
} else if ("2".equals(message)) {
// 仅进行转链
String content = state.getCollectedFields().get("content");
String result = generatePromotionContent(content, false);
wxUtil.sendTextMessage(fromWxid, "处理结果:\n" + result, 1, fromWxid);
state.reset();
} else {
wxUtil.sendTextMessage(fromWxid, "无效的选择,请重新输入:\n回复 1 - 需要图片和 SKU 名称\n回复 2 - 仅进行转链", 1, fromWxid);
// 第一次输入文案,直接生成内容
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;
@@ -701,7 +703,25 @@ private void handleUserInteraction(String fromWxid, String message) {
logger.error("Error saving interaction state: {}", e.getMessage());
}
}
// 新增方法:处理文案中的链接并进行转链
private String transferContentWithLinks(String message) {
List<String> urls = extractUJDUrls(message);
if (urls.isEmpty()) {
return "文案中未找到有效的商品链接,请检查格式是否正确。\n" + message;
}
StringBuilder enrichedContent = new StringBuilder();
for (String url : urls) {
String transferUrl = transfer(url);
if (transferUrl != null) {
enrichedContent.append("原链接:").append(url).append("\n")
.append("转链后链接:").append(transferUrl).append("\n");
} else {
enrichedContent.append("链接转链失败:").append(url).append("\n");
}
}
return enrichedContent.toString();
}
// 新增礼金流程处理方法
private void handleGiftMoneyFlow(String fromWxid, String message, UserInteractionState state) {
@@ -813,11 +833,13 @@ private void handleUserInteraction(String fromWxid, String message) {
* @param message 文案内容,包含商品链接
* @return 处理后的文案,附带商品信息
*/
public String generatePromotionContent(String message, Boolean needImagesAndSkuName) {
public List<String> generatePromotionContent(String message) {
List<String> results = new ArrayList<>();
// 提取文案中的所有 u.jd.com 链接
List<String> urls = extractUJDUrls(message);
if (urls.isEmpty()) {
return "文案中未找到有效的商品链接,请检查格式是否正确。\n" + message;
results.add("文案中未找到有效的商品链接,请检查格式是否正确。");
return results;
}
@@ -1059,25 +1081,23 @@ private void handleUserInteraction(String fromWxid, String message) {
* */
// 如果需要图片和SKU名称则代表要把图片下载发过去还有对应的skuName
StringBuilder enrichedContent = new StringBuilder();
StringBuilder couponInfo = new StringBuilder();
ArrayList<HashMap<String, String>> resultList = new ArrayList<>();
for (String url : urls) {
try {
// 查询商品信息
GoodsQueryResult productInfo = queryProductInfoByUJDUrl(url);
if (productInfo == null || productInfo.getCode() != 200) {
enrichedContent.append("商品链接查询失败:").append(url).append("\n");
couponInfo.append("链接查询失败:").append(url).append("\n");
continue;
}
long totalCount = productInfo.getTotalCount();
HashMap<String, String> itemMap = new HashMap<>();
itemMap.put("url", url);
couponInfo.append("链接查询成功:\n").append(" ").append(url).append("\n");
if (totalCount == 0) {
itemMap.put("type", "coupon");
couponInfo.append("链接类型:优惠券");
} else {
itemMap.put("type", "goods");
//itemMap.put("data", JSONObject.toJSONString(productInfo.getData()));
couponInfo.append("链接类型:商品");
//"materialUrl": "jingfen.jd.com/detail/BsrqLq5CfIziE7BSl3ItPp8q_3DFaNVYJqfkRRLc7HR.html",
//"oriItemId": "BMrqLq5CfIz9X04KC3ItPp8q_3DFaNVYJqfkRRLc7HR",
@@ -1090,6 +1110,8 @@ private void handleUserInteraction(String fromWxid, String message) {
//},
//"skuName": "松下Panasonic白月光4.0Ultra 洗烘套装 10kg滚筒洗衣机+变频热泵烘干机 除毛升级2.0 水氧SPA护理 8532N+8532NR",
//"spuid": 100137629936,
HashMap<String, String> itemMap = new HashMap<>();
itemMap.put("materialUrl", productInfo.getData()[0].getMaterialUrl());
itemMap.put("oriItemId", productInfo.getData()[0].getOriItemId());
itemMap.put("owner", productInfo.getData()[0].getOwner());
@@ -1097,32 +1119,37 @@ private void handleUserInteraction(String fromWxid, String message) {
itemMap.put("shopName", productInfo.getData()[0].getShopInfo().getShopName());
itemMap.put("skuName", productInfo.getData()[0].getSkuName());
itemMap.put("spuid", String.valueOf(productInfo.getData()[0].getSpuid()));
couponInfo.append("商品信息:\n");
for (HashMap.Entry<String, String> entry : itemMap.entrySet()) {
couponInfo.append(" ").append(entry.getKey()).append(": ").append(entry.getValue()).append("\n");
}
StringBuilder images = new StringBuilder();
if (productInfo.getData()[0].getImageInfo() != null) {
images.append(" ").append("图片信息:\n");
for (UrlInfo image : productInfo.getData()[0].getImageInfo().getImageList()) {
images.append(" ").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);
enrichedContent.append("❌ 处理商品链接时发生异常:").append(url).append("\n");
couponInfo.append("❌ 处理商品链接时发生异常:").append(url).append("\n");
}
}
if (resultList.isEmpty()){
enrichedContent.append("❌ 处理商品链接时发生异常:").append("\n");
return enrichedContent.toString();
}
if(!needImagesAndSkuName){
// 完成转链后替换链接为u.jd.com链接文案不修改就返回
for (HashMap<String, String> stringStringHashMap : resultList) {
String url = stringStringHashMap.get("url");
String transferUrl = transfer(url);
stringStringHashMap.put("transferUrl", transferUrl);
message = message.replace(url, transferUrl);
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));
//enrichedContent.append("商品推广文案:\n\n").append(message).append("\n\n");
return results;
return enrichedContent.toString();
}
/**