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 098dcf1d..8616159e 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 @@ -90,15 +90,28 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService { @Override public boolean uploadCaseDocument(Cases cases) { + String uploadUrl = caseAiProperties.getBaseUrl() + "/apigateway/knowledge/v1/file/upload"; + JSONObject requestBody = new JSONObject(); + String userId = getCurrentUserId(); + requestBody.put("userId", userId); + requestBody.put("kId", caseAiProperties.getCaseKnowledgeId()); + requestBody.put("parseType", "AUTO"); + String caseId = cases.getId(); if (cases == null || cases.getDeleted()) { log.error("上传案例文档失败,未找到有效的案例记录,caseId: {}", caseId); + saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.CREATE.getCode(), uploadUrl, + requestBody.toJSONString(), "上传案例文档失败,未找到有效的案例记录", + CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null); return false; } // 2. 检查文件路径 if (StringUtil.isBlank(cases.getFilePath())) { log.error("上传案例文档失败,案例文件路径为空,caseId: {}", caseId); + saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.CREATE.getCode(), uploadUrl, + requestBody.toJSONString(), "上传案例文档失败,案例文件路径为空", + CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null); return false; } @@ -107,13 +120,9 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService { File file = new File(filePath); if (!file.exists()) { log.error("上传案例文档失败,案例文件不存在,filePath: {}", filePath); - return false; - } - - // 3. 获取access_token - String accessToken = aiAccessTokenService.getAccessToken(); - if (StringUtil.isBlank(accessToken)) { - log.error("上传案例文档失败,获取access_token失败"); + saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.CREATE.getCode(), uploadUrl, + requestBody.toJSONString(), "上传案例文档失败,案例文件不存在,filePath: " + filePath, + CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null); return false; } @@ -124,12 +133,35 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService { } String fileType = getFileType(fileName); - String userId = getCurrentUserId(); - String uploadUrl = caseAiProperties.getBaseUrl() + "/apigateway/knowledge/v1/file/upload"; // 5. 重试逻辑:最多3次机会 int maxRetries = 3; - JSONObject requestBody = new JSONObject(); + + // 构建multipart/form-data请求体 + MultipartEntityBuilder builder = MultipartEntityBuilder.create(); + builder.addBinaryBody("file", file); + builder.addTextBody("userId", userId, ContentType.TEXT_PLAIN); + builder.addTextBody("kId", caseAiProperties.getCaseKnowledgeId(), ContentType.TEXT_PLAIN); + builder.addTextBody("fileName", fileName, ContentType.TEXT_PLAIN); + requestBody.put("fileName", fileName); + builder.addTextBody("fileType", fileType, ContentType.TEXT_PLAIN); + requestBody.put("fileType", fileType); + builder.addTextBody("parseType", "AUTO", ContentType.TEXT_PLAIN); + // 由于接口权限,目前采用不回调,而是通过批处理的方式,处理文件状态 + if (caseAiProperties.isFileUploadUseCallback()) { + builder.addTextBody("callbackUrl", caseAiProperties.getFileUploadCallbackUrl(), ContentType.TEXT_PLAIN); + requestBody.put("callbackUrl", caseAiProperties.getFileUploadCallbackUrl()); + } + + // 3. 获取access_token + String accessToken = aiAccessTokenService.getAccessToken(); + if (StringUtil.isBlank(accessToken)) { + log.error("上传案例文档失败,获取access_token失败"); + saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.CREATE.getCode(), uploadUrl, + requestBody.toJSONString(), "上传案例文档失败,获取access_token失败", + CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null); + return false; + } for (int attempt = 1; attempt <= maxRetries; attempt++) { log.info("上传案例文档第{}次尝试,caseId: {}", attempt, caseId); @@ -138,25 +170,6 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService { httpPost.setHeader("X-AI-ApiCode", caseAiProperties.getAiApiCode()); httpPost.setHeader("access_token", accessToken); - // 构建multipart/form-data请求体 - MultipartEntityBuilder builder = MultipartEntityBuilder.create(); - builder.addBinaryBody("file", file); - builder.addTextBody("userId", userId, ContentType.TEXT_PLAIN); - requestBody.put("userId", userId); - builder.addTextBody("kId", caseAiProperties.getCaseKnowledgeId(), ContentType.TEXT_PLAIN); - requestBody.put("kId", caseAiProperties.getCaseKnowledgeId()); - builder.addTextBody("fileName", fileName, ContentType.TEXT_PLAIN); - requestBody.put("fileName", fileName); - builder.addTextBody("fileType", fileType, ContentType.TEXT_PLAIN); - requestBody.put("fileType", fileType); - builder.addTextBody("parseType", "AUTO", ContentType.TEXT_PLAIN); - requestBody.put("parseType", "AUTO"); - // 由于接口权限,目前采用不回调,而是通过批处理的方式,处理文件状态 - if (caseAiProperties.isFileUploadUseCallback()) { - builder.addTextBody("callbackUrl", caseAiProperties.getFileUploadCallbackUrl(), ContentType.TEXT_PLAIN); - requestBody.put("callbackUrl", caseAiProperties.getFileUploadCallbackUrl()); - } - HttpEntity multipart = builder.build(); httpPost.setEntity(multipart); @@ -231,9 +244,14 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService { @Override public boolean deleteCaseDocument(Cases cases) { + String deleteUrl = caseAiProperties.getBaseUrl() + "/apigateway/knowledge/v1/file/delete"; + String caseId = cases.getId(); if (cases == null) { log.error("删除案例文档失败,未找到案例记录,caseId: {}", caseId); + saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.DELETE.getCode(), deleteUrl, + "", "删除案例文档失败,未找到案例记录", + CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null); return false; } @@ -245,6 +263,9 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService { if (logList.isEmpty()) { log.error("删除案例文档失败,未找到相关的日志记录,caseId: {}", caseId); + saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.DELETE.getCode(), deleteUrl, + "", "删除案例文档失败,未找到相关的日志记录", + CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null); return false; } @@ -252,26 +273,31 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService { String taskId = latestLog.getTaskId(); if (StringUtil.isBlank(taskId)) { log.error("删除案例文档失败,日志记录中taskId为空,caseId: {}", caseId); + saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.DELETE.getCode(), deleteUrl, + "kId=" + caseAiProperties.getCaseKnowledgeId() + + "&taskIds=", "删除案例文档失败,日志记录中taskId为空", + CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null); return false; } + // 构建请求参数 + String params = "kId=" + caseAiProperties.getCaseKnowledgeId() + + "&taskIds=" + taskId; // 3. 获取access_token String accessToken = aiAccessTokenService.getAccessToken(); if (StringUtil.isBlank(accessToken)) { log.error("删除案例文档失败,获取access_token失败"); + saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.DELETE.getCode(), deleteUrl, + params, "删除案例文档失败,获取access_token失败", + CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null); return false; } - String deleteUrl = caseAiProperties.getBaseUrl() + "/apigateway/knowledge/v1/file/delete"; - // 4. 重试逻辑:最多3次机会 int maxRetries = 3; for (int attempt = 1; attempt <= maxRetries; attempt++) { log.info("删除案例文档第{}次尝试,caseId: {}, taskId: {}", attempt, caseId, taskId); - // 构建请求参数 - String params = "kId=" + caseAiProperties.getCaseKnowledgeId() + - "&taskIds=" + taskId; try (CloseableHttpClient httpClient = HttpClients.createDefault()) { HttpDelete httpDelete = new HttpDelete(deleteUrl + "?" + params); httpDelete.setHeader("X-AI-ApiCode", caseAiProperties.getAiApiCode()); @@ -363,9 +389,15 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService { @Override public boolean updateCaseDocument(Cases cases) { + String requestBody = ""; + String requestUrl = caseAiProperties.getBaseUrl() + "/apigateway/knowledge/v1/file/delete"; + String caseId = cases.getId(); if (cases == null) { log.error("更新案例文档失败,未找到案例记录,caseId: {}", caseId); + saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), requestUrl, + requestBody, "更新案例文档失败,未找到案例记录", + CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null); return false; } @@ -375,8 +407,9 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService { String accessToken = aiAccessTokenService.getAccessToken(); if (StringUtil.isBlank(accessToken)) { log.error("更新案例文档失败,获取access_token失败"); -// saveCaseDocumentLog(caseId, caseEntity.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), "", -// "更新案例文档", "获取access_token失败", CaseDocumentLogOptStatusEnum.FAILED.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null); + saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), requestUrl, + requestBody, "更新案例文档失败,获取access_token失败", + CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null); return false; } @@ -388,6 +421,9 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService { if (logList.isEmpty()) { log.error("调用删除接口时未找到相关的日志记录,caseId: {}", caseId); + saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), requestUrl, + requestBody, "调用删除接口时未找到相关的日志记录", + CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null); return false; } @@ -395,10 +431,11 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService { String oldTaskId = latestLog.getTaskId(); if (StringUtil.isBlank(oldTaskId)) { log.error("调用删除接口时日志记录中taskId为空,caseId: {}", caseId); + saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), requestUrl, + requestBody, "调用删除接口时日志记录中taskId为空", + CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null); return false; } - String requestBody = ""; - String requestUrl = ""; try { // 2. 先调用删除接口 @@ -419,6 +456,9 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService { // 1. 检查文件路径 if (StringUtil.isBlank(cases.getFilePath())) { log.error("调用上传接口失败,案例文件路径为空,caseId: {}", caseId); + saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), requestUrl, + requestBody, "调用上传接口失败,案例文件路径为空", + CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null); return false; } @@ -427,6 +467,9 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService { File file = new File(filePath); if (!file.exists()) { log.error("调用上传接口失败,案例文件不存在,filePath: {}", filePath); + saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), requestUrl, + requestBody, "调用上传接口失败,案例文件不存在", + CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null); return false; }