From 7b08d26da6570d80cd13bb730a44b3b22a4c352a Mon Sep 17 00:00:00 2001 From: "liu.zixi" Date: Wed, 15 Oct 2025 13:26:50 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A1=88=E4=BE=8B=E4=B8=93=E5=AE=B6=EF=BC=9A?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E8=B0=83=E7=94=A8=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../async/CaseAiDocumentAsyncHandler.java | 6 +- .../service/ICaseKnowledgeService.java | 25 +++++ .../impl/CaseKnowledgeServiceImpl.java | 106 ++++++++++-------- 3 files changed, 90 insertions(+), 47 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/async/CaseAiDocumentAsyncHandler.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/async/CaseAiDocumentAsyncHandler.java index 4bc4a7f1..1d573788 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/async/CaseAiDocumentAsyncHandler.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/async/CaseAiDocumentAsyncHandler.java @@ -49,14 +49,14 @@ public class CaseAiDocumentAsyncHandler { try { switch (optTypeEnum) { case UPDATE: - caseKnowledgeService.updateCaseDocument(cases.getId()); + caseKnowledgeService.updateCaseDocument(cases); break; case DELETE: - caseKnowledgeService.deleteCaseDocument(cases.getId()); + caseKnowledgeService.deleteCaseDocument(cases); break; case CREATE: default: - caseKnowledgeService.uploadCaseDocument(cases.getId()); + caseKnowledgeService.uploadCaseDocument(cases); break; } log.info("处理案例成功,caseId: {}, 操作类型: {}", cases.getId(), optTypeEnum.getDesc()); diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/ICaseKnowledgeService.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/ICaseKnowledgeService.java index 9aceef4d..3c32eb49 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/ICaseKnowledgeService.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/ICaseKnowledgeService.java @@ -1,5 +1,6 @@ package com.xboe.module.boecase.service; +import com.xboe.module.boecase.entity.Cases; import org.springframework.transaction.annotation.Transactional; /** @@ -15,6 +16,14 @@ public interface ICaseKnowledgeService { */ boolean uploadCaseDocument(String caseId); + /** + * 上传案例文档 + * + * @param cases 案例 + * @return 是否成功 + */ + boolean uploadCaseDocument(Cases cases); + /** * 删除案例文档 * @@ -23,6 +32,14 @@ public interface ICaseKnowledgeService { */ boolean deleteCaseDocument(String caseId); + /** + * 删除案例文档 + * + * @param cases 案例 + * @return 是否成功 + */ + boolean deleteCaseDocument(Cases cases); + /** * 更新案例文档 * @@ -31,6 +48,14 @@ public interface ICaseKnowledgeService { */ boolean updateCaseDocument(String caseId); + /** + * 更新案例文档 + * + * @param cases 案例 + * @return 是否成功 + */ + boolean updateCaseDocument(Cases cases); + /** * 处理文档上传回调 * 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 1759435b..098dcf1d 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 @@ -85,19 +85,25 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService { // 1. 查询案例信息 Cases caseEntity = casesDao.findOne(FieldFilters.eq("id", caseId)); - if (caseEntity == null || caseEntity.getDeleted()) { + return uploadCaseDocument(caseEntity); + } + + @Override + public boolean uploadCaseDocument(Cases cases) { + String caseId = cases.getId(); + if (cases == null || cases.getDeleted()) { log.error("上传案例文档失败,未找到有效的案例记录,caseId: {}", caseId); return false; } // 2. 检查文件路径 - if (StringUtil.isBlank(caseEntity.getFilePath())) { + if (StringUtil.isBlank(cases.getFilePath())) { log.error("上传案例文档失败,案例文件路径为空,caseId: {}", caseId); return false; } String savePath = fileUploader.getSavePath(); - String filePath = savePath + caseEntity.getFilePath(); + String filePath = savePath + cases.getFilePath(); File file = new File(filePath); if (!file.exists()) { log.error("上传案例文档失败,案例文件不存在,filePath: {}", filePath); @@ -112,11 +118,11 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService { } // 4. 构建上传参数 - String fileName = caseEntity.getFileName(); + String fileName = cases.getFileName(); if (StringUtil.isBlank(fileName)) { fileName = file.getName(); } - + String fileType = getFileType(fileName); String userId = getCurrentUserId(); String uploadUrl = caseAiProperties.getBaseUrl() + "/apigateway/knowledge/v1/file/upload"; @@ -126,12 +132,12 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService { JSONObject requestBody = new JSONObject(); for (int attempt = 1; attempt <= maxRetries; attempt++) { log.info("上传案例文档第{}次尝试,caseId: {}", attempt, caseId); - + try (CloseableHttpClient httpClient = HttpClients.createDefault()) { HttpPost httpPost = new HttpPost(uploadUrl); httpPost.setHeader("X-AI-ApiCode", caseAiProperties.getAiApiCode()); httpPost.setHeader("access_token", accessToken); - + // 构建multipart/form-data请求体 MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.addBinaryBody("file", file); @@ -150,32 +156,32 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService { builder.addTextBody("callbackUrl", caseAiProperties.getFileUploadCallbackUrl(), ContentType.TEXT_PLAIN); requestBody.put("callbackUrl", caseAiProperties.getFileUploadCallbackUrl()); } - + HttpEntity multipart = builder.build(); httpPost.setEntity(multipart); - + try (CloseableHttpResponse response = httpClient.execute(httpPost)) { int statusCode = response.getStatusLine().getStatusCode(); String responseBody = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8); - + if (statusCode == 200) { JSONObject result = JSON.parseObject(responseBody); if (result.getBooleanValue("success")) { // 业务处理成功 JSONObject data = result.getJSONObject("data"); String taskId = data.getString("taskId"); - + // 保存成功的CaseDocumentLog记录 - saveCaseDocumentLog(caseId, caseEntity.getTitle(), CaseDocumentLogOptTypeEnum.CREATE.getCode(), uploadUrl, + saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.CREATE.getCode(), uploadUrl, requestBody.toJSONString(), responseBody, CaseDocumentLogRunStatusEnum.RUNNING.getCode(), null, null, taskId); - + log.info("上传案例文档成功,等待文档状态变更. caseId: {}, taskId: {}, 尝试次数: {}", caseId, taskId, attempt); return true; } else { // 业务处理失败,不重试 log.error("上传案例文档业务处理失败,不重试,response: {}", responseBody); - saveCaseDocumentLog(caseId, caseEntity.getTitle(), CaseDocumentLogOptTypeEnum.CREATE.getCode(), uploadUrl, + saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.CREATE.getCode(), uploadUrl, requestBody.toJSONString(), responseBody, CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.SUCCESS.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null); return false; @@ -185,7 +191,7 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService { log.error("上传案例文档接口调用失败,第{}次尝试,status: {}, response: {}", attempt, statusCode, responseBody); if (attempt == maxRetries) { // 最后一次尝试仍然失败 - saveCaseDocumentLog(caseId, caseEntity.getTitle(), CaseDocumentLogOptTypeEnum.CREATE.getCode(), uploadUrl, + saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.CREATE.getCode(), uploadUrl, requestBody.toJSONString(), responseBody, CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.SUCCESS.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null); return false; @@ -199,7 +205,7 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService { if (attempt == maxRetries) { // 最后一次尝试仍然异常 log.error("上传案例文档最终失败,已重试{}次", maxRetries); - saveCaseDocumentLog(caseId, caseEntity.getTitle(), CaseDocumentLogOptTypeEnum.CREATE.getCode(), uploadUrl, + saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.CREATE.getCode(), uploadUrl, requestBody.toJSONString(), "接口调用异常: " + e.getMessage(), CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null); return false; @@ -207,7 +213,7 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService { // 继续下一次重试 } } - + return false; } @@ -220,7 +226,13 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService { // 1. 查询案例信息 Cases caseEntity = casesDao.findOne(FieldFilters.eq("id", caseId)); - if (caseEntity == null) { + return deleteCaseDocument(caseEntity); + } + + @Override + public boolean deleteCaseDocument(Cases cases) { + String caseId = cases.getId(); + if (cases == null) { log.error("删除案例文档失败,未找到案例记录,caseId: {}", caseId); return false; } @@ -230,7 +242,7 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService { .findList(CaseDocumentLog.class, 1, OrderCondition.desc("sysCreateTime"), FieldFilters.eq("caseId", caseId)); - + if (logList.isEmpty()) { log.error("删除案例文档失败,未找到相关的日志记录,caseId: {}", caseId); return false; @@ -266,30 +278,30 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService { httpDelete.setHeader("access_token", accessToken); httpDelete.setHeader("Content-Type", "application/x-www-form-urlencoded"); - + // StringEntity entity = new StringEntity(params, StandardCharsets.UTF_8); // entity.setContentType("application/x-www-form-urlencoded"); // httpDelete.setEntity(entity); - + try (CloseableHttpResponse response = httpClient.execute(httpDelete)) { int statusCode = response.getStatusLine().getStatusCode(); String responseBody = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8); - + if (statusCode == 200) { JSONObject result = JSON.parseObject(responseBody); if (result.getBooleanValue("success")) { // 接口调用成功,检查业务处理结果 JSONObject data = result.getJSONObject("data"); Boolean deleteSuccess = data.getBoolean(taskId); - + int optStatus = CaseDocumentLogOptStatusEnum.SUCCESS.getCode(); - int caseStatus = (deleteSuccess != null && deleteSuccess) ? + int caseStatus = (deleteSuccess != null && deleteSuccess) ? CaseDocumentLogCaseStatusEnum.SUCCESS.getCode() : CaseDocumentLogCaseStatusEnum.FAILED.getCode(); - - saveCaseDocumentLog(caseId, caseEntity.getTitle(), CaseDocumentLogOptTypeEnum.DELETE.getCode(), deleteUrl, + + saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.DELETE.getCode(), deleteUrl, params, responseBody, CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), optStatus, caseStatus, null); - + if (deleteSuccess != null && deleteSuccess) { log.info("删除案例文档成功,caseId: {}, taskId: {}, 尝试次数: {}", caseId, taskId, attempt); return true; @@ -301,7 +313,7 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService { } else { // 业务处理失败,不重试 log.error("删除案例文档业务处理失败,不重试,response: {}", responseBody); - saveCaseDocumentLog(caseId, caseEntity.getTitle(), CaseDocumentLogOptTypeEnum.DELETE.getCode(), deleteUrl, + saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.DELETE.getCode(), deleteUrl, params, responseBody, CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.SUCCESS.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null); return false; @@ -311,7 +323,7 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService { log.error("删除案例文档接口调用失败,第{}次尝试,status: {}, response: {}", attempt, statusCode, responseBody); if (attempt == maxRetries) { // 最后一次尝试仍然失败 - saveCaseDocumentLog(caseId, caseEntity.getTitle(), CaseDocumentLogOptTypeEnum.DELETE.getCode(), deleteUrl, + saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.DELETE.getCode(), deleteUrl, params, responseBody, CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null); return false; @@ -325,7 +337,7 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService { if (attempt == maxRetries) { // 最后一次尝试仍然异常 log.error("删除案例文档最终失败,已重试{}次", maxRetries); - saveCaseDocumentLog(caseId, caseEntity.getTitle(), CaseDocumentLogOptTypeEnum.DELETE.getCode(), deleteUrl, + saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.DELETE.getCode(), deleteUrl, params, "接口调用异常: " + e.getMessage(), CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null); return false; @@ -333,7 +345,7 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService { // 继续下一次重试 } } - + return false; } @@ -346,7 +358,13 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService { // 1. 查询案例信息 Cases caseEntity = casesDao.findOne(FieldFilters.eq("id", caseId)); - if (caseEntity == null) { + return updateCaseDocument(caseEntity); + } + + @Override + public boolean updateCaseDocument(Cases cases) { + String caseId = cases.getId(); + if (cases == null) { log.error("更新案例文档失败,未找到案例记录,caseId: {}", caseId); return false; } @@ -387,25 +405,25 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService { String deleteParam = "kId=" + caseAiProperties.getCaseKnowledgeId() + "taskId=" + oldTaskId; requestUrl = caseAiProperties.getBaseUrl() + "/apigateway/knowledge/v1/file/delete?" + deleteParam; requestBody = deleteParam; - boolean deleteSuccess = callDeleteInterface(caseId, caseEntity, accessToken); + boolean deleteSuccess = callDeleteInterface(caseId, cases, accessToken); if (!deleteSuccess) { log.error("更新案例文档失败,删除接口调用失败,不继续执行上传操作,caseId: {}", caseId); - saveCaseDocumentLog(caseId, caseEntity.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), requestUrl, + saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), requestUrl, deleteParam, "删除接口:失败,上传接口:未执行", CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null); return false; } - + // 3. 删除成功后,再调用上传接口 requestUrl = caseAiProperties.getBaseUrl() + "/apigateway/knowledge/v1/file/upload"; // 1. 检查文件路径 - if (StringUtil.isBlank(caseEntity.getFilePath())) { + if (StringUtil.isBlank(cases.getFilePath())) { log.error("调用上传接口失败,案例文件路径为空,caseId: {}", caseId); return false; } String savePath = fileUploader.getSavePath(); - String filePath = savePath + caseEntity.getFilePath(); + String filePath = savePath + cases.getFilePath(); File file = new File(filePath); if (!file.exists()) { log.error("调用上传接口失败,案例文件不存在,filePath: {}", filePath); @@ -413,7 +431,7 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService { } // 2. 构建上传参数 - String fileName = caseEntity.getFileName(); + String fileName = cases.getFileName(); if (StringUtil.isBlank(fileName)) { fileName = file.getName(); } @@ -433,29 +451,29 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService { String taskId = callUploadInterface(caseId, file, fileName, fileType, userId, accessToken, requestUrl); boolean uploadSuccess = StringUtil.isNotBlank(taskId); - + // 4. 根据结果保存一条CaseDocumentLog数据 int runStatus = uploadSuccess ? CaseDocumentLogRunStatusEnum.RUNNING.getCode() : CaseDocumentLogRunStatusEnum.COMPLETED.getCode(); Integer optStatus = uploadSuccess ? null : CaseDocumentLogOptStatusEnum.SUCCESS.getCode(); Integer caseStatus = uploadSuccess ? null : CaseDocumentLogCaseStatusEnum.FAILED.getCode(); - String result = String.format("删除接口:成功,上传接口:%s", + String result = String.format("删除接口:成功,上传接口:%s", uploadSuccess ? "成功" : "失败"); - saveCaseDocumentLog(caseId, caseEntity.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), requestUrl, + saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), requestUrl, requestBody, result, runStatus, optStatus, caseStatus, taskId); - + if (uploadSuccess) { log.info("更新案例文档成功,caseId: {}, taskId: {}", caseId, taskId); } else { log.error("更新案例文档失败,上传接口调用失败,caseId: {}", caseId); } - + return uploadSuccess; } catch (Exception e) { log.error("更新案例文档异常", e); - saveCaseDocumentLog(caseId, caseEntity.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), requestUrl, + saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), requestUrl, requestBody, "更新异常: " + e.getMessage(), CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null); return false;