This commit is contained in:
2025-11-04 00:29:19 +08:00
parent bf9464de54
commit 0146e0776a

View File

@@ -424,9 +424,127 @@ public class JDOrderController extends BaseController {
}
/**
* 文本替换将文本中的URL替换为包含礼金的推广链接
* 入参:{ content, skuId/materialUrl, amount, quantity, owner, skuName }
* 注意batchSize会根据文本中解析出的URL数量自动计算
* 从文案中提取u.jd链接并查询商品信息
* 入参:{ content }
* 返回:商品信息列表
*/
@PostMapping("/extractUrlsAndQueryProducts")
public AjaxResult extractUrlsAndQueryProducts(@RequestBody Map<String, Object> body) {
try {
String content = (String) body.get("content");
if (content == null || content.trim().isEmpty()) {
return AjaxResult.error("content is required");
}
logger.info("提取URL并查询商品 - content长度={}", content.length());
// 提取文本中的所有u.jd链接
java.util.List<String> urls = new java.util.ArrayList<>();
java.util.regex.Pattern urlPattern = java.util.regex.Pattern.compile(
"(?:https?://)?u\\.jd\\.com/[^\\s]+",
java.util.regex.Pattern.CASE_INSENSITIVE);
java.util.regex.Matcher matcher = urlPattern.matcher(content);
while (matcher.find()) {
String url = matcher.group(0);
if (url != null && !url.trim().isEmpty()) {
// 如果没有协议添加https://
String fullUrl = url.trim();
if (!fullUrl.startsWith("http://") && !fullUrl.startsWith("https://")) {
fullUrl = "https://" + fullUrl;
}
urls.add(fullUrl);
}
}
logger.info("提取URL并查询商品 - 提取到{}个u.jd链接", urls.size());
if (urls.isEmpty()) {
return AjaxResult.success(new JSONObject()
.fluentPut("products", new JSONArray())
.fluentPut("urls", new JSONArray())
.fluentPut("message", "未找到u.jd链接"));
}
// 去重
java.util.Set<String> uniqueUrls = new java.util.LinkedHashSet<>(urls);
urls = new java.util.ArrayList<>(uniqueUrls);
// 为每个URL查询商品信息
JSONArray products = new JSONArray();
for (String url : urls) {
try {
logger.info("查询商品信息 - URL: {}", url);
String queryUrl = requestUrl + "generatePromotionContent";
JSONObject param = new JSONObject();
param.put("skey", skey);
param.put("promotionContent", url);
String result = HttpUtils.sendJsonPost(queryUrl, param.toJSONString());
logger.debug("商品查询响应: {}", result);
try {
Object parsed = JSON.parse(result);
if (parsed instanceof JSONArray) {
JSONArray arr = (JSONArray) parsed;
for (int i = 0; i < arr.size(); i++) {
JSONObject product = arr.getJSONObject(i);
if (product != null) {
product.put("originalUrl", url); // 保存原始URL
products.add(product);
}
}
} else if (parsed instanceof JSONObject) {
JSONObject obj = (JSONObject) parsed;
if (obj.get("list") instanceof JSONArray) {
JSONArray list = obj.getJSONArray("list");
for (int i = 0; i < list.size(); i++) {
JSONObject product = list.getJSONObject(i);
if (product != null) {
product.put("originalUrl", url);
products.add(product);
}
}
} else if (obj.get("data") instanceof JSONArray) {
JSONArray data = obj.getJSONArray("data");
for (int i = 0; i < data.size(); i++) {
JSONObject product = data.getJSONObject(i);
if (product != null) {
product.put("originalUrl", url);
products.add(product);
}
}
} else if (obj.containsKey("materialUrl") || obj.containsKey("skuName")) {
obj.put("originalUrl", url);
products.add(obj);
}
}
} catch (Exception e) {
logger.warn("解析商品信息失败 - URL: {}, error: {}", url, e.getMessage());
}
} catch (Exception e) {
logger.error("查询商品信息异常 - URL: {}", url, e);
}
}
logger.info("提取URL并查询商品完成 - 找到{}个商品", products.size());
JSONObject response = new JSONObject();
response.put("products", products);
response.put("urls", urls);
response.put("totalUrls", urls.size());
response.put("totalProducts", products.size());
return AjaxResult.success(response);
} catch (Exception e) {
logger.error("提取URL并查询商品异常", e);
return AjaxResult.error("提取URL并查询商品失败: " + e.getMessage());
}
}
/**
* 文本替换根据选中的商品创建礼金并替换文案中的URL
* 入参:{ content, selectedProducts: [{skuId/materialUrl, amount, quantity, owner, skuName, originalUrl}], ... }
* 返回:替换后的文本和礼金信息
*/
@PostMapping("/replaceUrlsWithGiftCoupons")