diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/jarvis/JDOrderController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/jarvis/JDOrderController.java index 1ad6e6c..4368229 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/jarvis/JDOrderController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/jarvis/JDOrderController.java @@ -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 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 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 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")