From 8979f04c6e1ce3c6580421170c64bcd0f40ef1b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8D=92?= Date: Thu, 30 Oct 2025 16:50:57 +0800 Subject: [PATCH] 1 --- .../jarvis/BatchPublishController.java | 10 +++ .../jarvis/service/IBatchPublishService.java | 6 ++ .../service/impl/BatchPublishServiceImpl.java | 77 +++++++++++++++---- 3 files changed, 79 insertions(+), 14 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/jarvis/BatchPublishController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/jarvis/BatchPublishController.java index 9ea4a13..4131562 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/jarvis/BatchPublishController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/jarvis/BatchPublishController.java @@ -91,5 +91,15 @@ public class BatchPublishController extends BaseController List items = batchPublishService.getItemsByTaskId(taskId); return AjaxResult.success(items); } + + /** + * 手动重试任务(重新调度待发布/发布失败的明细) + */ + @PostMapping("/task/retry/{taskId}") + public AjaxResult retryTask(@PathVariable("taskId") Long taskId) + { + batchPublishService.retryTask(taskId); + return AjaxResult.success("已触发重试"); + } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/IBatchPublishService.java b/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/IBatchPublishService.java index a24e495..f289079 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/IBatchPublishService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/IBatchPublishService.java @@ -63,5 +63,11 @@ public interface IBatchPublishService * @param delaySeconds 延迟秒数 */ void schedulePublish(Long itemId, Integer delaySeconds); + + /** + * 重新调度执行某个任务的未完成明细 + * @param taskId 任务ID + */ + void retryTask(Long taskId); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/impl/BatchPublishServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/impl/BatchPublishServiceImpl.java index 9534997..e41a702 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/impl/BatchPublishServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/impl/BatchPublishServiceImpl.java @@ -25,6 +25,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -59,6 +60,11 @@ public class BatchPublishServiceImpl implements IBatchPublishService @Autowired private IOuterIdGeneratorService outerIdGeneratorService; + // 为了使 @Async 生效,需通过代理调用自身异步方法 + @Autowired + @Lazy + private BatchPublishServiceImpl self; + /** * 清理文本中的所有URL链接(保留换行符) * @@ -488,8 +494,8 @@ public class BatchPublishServiceImpl implements IBatchPublishService itemMapper.batchInsertBatchPublishItem(items); } - // 异步执行发品任务 - asyncBatchPublish(taskId, items, request); + // 异步执行发品任务(通过代理调用,确保@Async生效) + self.asyncBatchPublish(taskId, items, request); return taskId; } @@ -571,11 +577,14 @@ public class BatchPublishServiceImpl implements IBatchPublishService throw new RuntimeException("未找到ERP账号: " + item.getTargetAccount()); } - // 【修改】获取对应的商品配置(包含自定义价格和文案) - BatchPublishRequest.ProductItem productConfig = request.getProducts().stream() - .filter(p -> p.getSkuid().equals(item.getSkuid())) - .findFirst() - .orElseThrow(() -> new RuntimeException("未找到商品配置: " + item.getSkuid())); + // 获取对应的商品配置(包含自定义价格和文案);如果不存在,使用回退策略 + BatchPublishRequest.ProductItem productConfig = null; + if (request != null && request.getProducts() != null) { + productConfig = request.getProducts().stream() + .filter(p -> item.getSkuid().equals(p.getSkuid())) + .findFirst() + .orElse(null); + } // 获取通用参数 BatchPublishRequest.CommonParams commonParams = request.getCommonParams(); @@ -587,9 +596,14 @@ public class BatchPublishServiceImpl implements IBatchPublishService erpShop.setSpBizType(commonParams.getSpBizType()); // 【修改】使用自定义的发布价格 - Double publishPrice = productConfig.getPublishPrice() != null ? - productConfig.getPublishPrice() : - (productConfig.getPrice() != null ? productConfig.getPrice() : 0.0); + Double publishPrice = null; + if (productConfig != null) { + publishPrice = productConfig.getPublishPrice() != null ? productConfig.getPublishPrice() : productConfig.getPrice(); + } + if (publishPrice == null) { + // 回退到明细中的价格(分转元) + publishPrice = item.getPublishPrice() != null ? item.getPublishPrice() / 100.0 : 0.0; + } erpShop.setPrice(Math.round(publishPrice * 100)); // 价格转分 erpShop.setExpressFee(Math.round(commonParams.getExpressFee() * 100)); // 邮费转分 @@ -615,21 +629,21 @@ public class BatchPublishServiceImpl implements IBatchPublishService shop.setTitle(truncateByCodePoints(title, 60)); // 【修改】使用用户选择的文案 - String content = getSelectedWenanContent(productConfig); + String content = productConfig != null ? getSelectedWenanContent(productConfig) : null; if (StringUtils.isEmpty(content)) { // 如果没有选择文案,使用默认描述 content = "【正品保障】" + item.getProductName() + "\n\n" + "SKUID: " + item.getSkuid() + "\n" + - "店铺信息: " + (productConfig.getShopName() != null ? productConfig.getShopName() : "京东商城"); + "店铺信息: " + ((productConfig != null && productConfig.getShopName() != null) ? productConfig.getShopName() : "京东商城"); } shop.setContent(content); // 【修改】使用商品配置中的图片数组 - List images = productConfig.getImages(); + List images = productConfig != null ? productConfig.getImages() : null; if (images == null || images.isEmpty()) { // 如果没有图片,使用主图 images = new ArrayList<>(); - if (productConfig.getProductImage() != null) { + if (productConfig != null && productConfig.getProductImage() != null) { images.add(productConfig.getProductImage()); } } @@ -861,5 +875,40 @@ public class BatchPublishServiceImpl implements IBatchPublishService public List selectTaskList(BatchPublishTask task) { return taskMapper.selectBatchPublishTaskList(task); } + + @Override + public void retryTask(Long taskId) { + BatchPublishTask task = taskMapper.selectBatchPublishTaskById(taskId); + if (task == null) { + throw new RuntimeException("任务不存在: " + taskId); + } + + // 仅重试 待发布(0)/发布失败(3) 的明细 + List allItems = itemMapper.selectBatchPublishItemByTaskId(taskId); + List itemsToRetry = new ArrayList<>(); + for (BatchPublishItem it : allItems) { + if (it.getStatus() != null && (it.getStatus() == 0 || it.getStatus() == 3)) { + itemsToRetry.add(it); + } + } + + if (itemsToRetry.isEmpty()) { + log.info("任务{} 无需重试,未发现待发布/失败的明细", taskId); + return; + } + + // 构造最小请求对象,仅提供通用参数用于发布 + BatchPublishRequest req = new BatchPublishRequest(); + try { + BatchPublishRequest.CommonParams commonParams = JSON.parseObject( + task.getCommonParams(), BatchPublishRequest.CommonParams.class); + req.setCommonParams(commonParams); + } catch (Exception e) { + log.warn("解析任务通用参数失败,将使用默认参数: {}", task.getCommonParams(), e); + } + + log.info("开始重试任务{} 的 {} 条明细", taskId, itemsToRetry.size()); + self.asyncBatchPublish(taskId, itemsToRetry, req); + } }