From 38c2784f514e6efada94178682fec3fde84f0897 Mon Sep 17 00:00:00 2001 From: "liu.zixi" Date: Mon, 1 Dec 2025 19:44:01 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E7=9A=84=E6=89=B9=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/boecase/api/CaseUploadTaskApi.java | 14 +++- .../impl/CaseKnowledgeServiceImpl.java | 3 +- .../module/boecase/task/CaseUploadTask.java | 67 +++++++++++++++++-- 3 files changed, 73 insertions(+), 11 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CaseUploadTaskApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CaseUploadTaskApi.java index e8a28a6a..29f2ab54 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CaseUploadTaskApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CaseUploadTaskApi.java @@ -1,5 +1,6 @@ package com.xboe.module.boecase.api; +import com.xboe.module.boecase.task.CaseUploadTask; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; @@ -20,14 +21,21 @@ public class CaseUploadTaskApi { @Autowired private StringRedisTemplate stringRedisTemplate; - private static final String CASE_UPLOAD_LAST_ID_KEY = "case:upload:last:id"; - /** * 清除处理位置标记,使下次任务从头开始执行 */ @PostMapping("/reset") public void resetLastProcessedId() { - stringRedisTemplate.delete(CASE_UPLOAD_LAST_ID_KEY); + stringRedisTemplate.delete(CaseUploadTask.CASE_UPLOAD_LAST_ID_KEY); + log.info("已清除上次处理位置标记"); + } + + /** + * 清除处理位置标记,使下次任务从头开始执行 + */ + @PostMapping("/reload/reset") + public void resetReloadProcessedId() { + stringRedisTemplate.delete(CaseUploadTask.CASE_RELOAD_LAST_ID_KEY); log.info("已清除上次处理位置标记"); } } \ No newline at end of file diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CaseKnowledgeServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CaseKnowledgeServiceImpl.java index ecb96933..597aba93 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CaseKnowledgeServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CaseKnowledgeServiceImpl.java @@ -652,7 +652,8 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService { .findList(CaseDocumentLog.class, 1, OrderCondition.desc("sysCreateTime"), FieldFilters.eq("caseId", caseId), - FieldFilters.eq("requestUrl", CaseAiConstants.CASE_DOC_UPLOAD_INTERFACE_NAME)); + FieldFilters.eq("requestUrl", CaseAiConstants.CASE_DOC_UPLOAD_INTERFACE_NAME), + FieldFilters.eq("caseStatus", CaseDocumentLogCaseStatusEnum.SUCCESS.getCode())); if (logList.isEmpty()) { log.info("删除案例文档失败,未找到相关的日志记录,caseId: {}", caseId); diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/task/CaseUploadTask.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/task/CaseUploadTask.java index b888099b..974a9d4e 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/task/CaseUploadTask.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/task/CaseUploadTask.java @@ -1,6 +1,9 @@ package com.xboe.module.boecase.task; +import com.xboe.common.OrderCondition; import com.xboe.constants.CaseAiConstants; +import com.xboe.core.orm.FieldFilters; +import com.xboe.core.orm.QueryBuilder; import com.xboe.enums.CaseDocumentLogCaseStatusEnum; import com.xboe.enums.CaseDocumentLogOptStatusEnum; import com.xboe.enums.CaseDocumentLogOptTypeEnum; @@ -43,7 +46,39 @@ public class CaseUploadTask { @Autowired private StringRedisTemplate stringRedisTemplate; - private static final String CASE_UPLOAD_LAST_ID_KEY = "case:upload:last:id"; + public static final String CASE_UPLOAD_LAST_ID_KEY = "case:upload:last:id"; + + public static final String CASE_RELOAD_LAST_ID_KEY = "case:reload:last:id"; + + @XxlJob("reloadJob") + public void reloadJob() { + String currentLastId = null; + try { + // 从Redis获取上次处理的最后一条记录ID + String lastProcessedId = stringRedisTemplate.opsForValue().get(CASE_RELOAD_LAST_ID_KEY); + // 查询需要重新加载的案例 + List logsToReload = listToReload(lastProcessedId); + if (logsToReload.isEmpty()) { + return; + } + currentLastId = logsToReload.get(logsToReload.size() - 1).getId(); + for (CaseDocumentLog log : logsToReload) { + String caseId = log.getCaseId(); + Cases cases = casesDao.get(caseId); + if (cases != null && StringUtils.isNotBlank(cases.getFilePath())) { + // 更新 + caseAiDocumentAsyncHandler.process(CaseDocumentLogOptTypeEnum.UPDATE, cases); + } + } + } catch (Exception e) { + log.error("[reload]执行重新上传任务时发生异常", e); + } finally { + if (currentLastId != null) { + stringRedisTemplate.opsForValue().set(CASE_RELOAD_LAST_ID_KEY, currentLastId); + log.info("[reload] 已重新上传案例,最后一条caseDocumentLogId 已更新为: {}", currentLastId); + } + } + } @XxlJob("oldDataUploadJob") public void oldDataUploadJob() { @@ -142,25 +177,43 @@ public class CaseUploadTask { * @return 案例列表 */ private List findCasesToProcess(String lastProcessedId) { - com.xboe.core.orm.QueryBuilder queryBuilder = com.xboe.core.orm.QueryBuilder.from(Cases.class); - queryBuilder.addFilter(com.xboe.core.orm.FieldFilters.eq("deleted", false)); + QueryBuilder queryBuilder = QueryBuilder.from(Cases.class); + queryBuilder.addFilter(FieldFilters.eq("deleted", false)); // 只处理有文件路径的案例 - queryBuilder.addFilter(com.xboe.core.orm.FieldFilters.isNotNull("filePath")); - queryBuilder.addFilter(com.xboe.core.orm.FieldFilters.ne("filePath", "")); + queryBuilder.addFilter(FieldFilters.isNotNull("filePath")); + queryBuilder.addFilter(FieldFilters.ne("filePath", "")); // 如果有上次处理的ID,则从该ID之后开始查询 if (lastProcessedId != null && !lastProcessedId.isEmpty()) { - queryBuilder.addFilter(com.xboe.core.orm.FieldFilters.gt("id", lastProcessedId)); + queryBuilder.addFilter(FieldFilters.gt("id", lastProcessedId)); } // 按创建时间升序排序 - queryBuilder.addOrder(com.xboe.common.OrderCondition.asc("id")); + queryBuilder.addOrder(OrderCondition.asc("id")); // 限制每次处理的数量,避免一次性处理太多数据 queryBuilder.setPageSize(100); return casesDao.findList(queryBuilder.builder()); } + /** + * 获取需要重新加载的案例 + * @param lastProcessedId + * @return + */ + private List listToReload(String lastProcessedId) { + QueryBuilder queryBuilder = QueryBuilder.from(Cases.class); + queryBuilder.addFilter(FieldFilters.eq("deleted", false)); + queryBuilder.addFilter(FieldFilters.eq("requestUrl", CaseAiConstants.CASE_DOC_UPLOAD_INTERFACE_NAME)); + queryBuilder.addFilter(FieldFilters.eq("caseStatus", CaseDocumentLogCaseStatusEnum.SUCCESS.getCode())); + if (lastProcessedId != null && !lastProcessedId.isEmpty()) { + queryBuilder.addFilter(FieldFilters.gt("id", lastProcessedId)); + } + queryBuilder.addOrder(OrderCondition.asc("id")); + queryBuilder.setPageSize(100); + return caseDocumentLogDao.findList(queryBuilder.builder()); + } + private void fixOnLastCase(String currentLastId) { stringRedisTemplate.opsForValue().set(CASE_UPLOAD_LAST_ID_KEY, currentLastId); log.info("已处理案例,最后一条记录ID已更新为: {}", currentLastId);