From d2ddb9d469ffe912f8a38df81b73949702e0f085 Mon Sep 17 00:00:00 2001 From: "liu.zixi" Date: Thu, 18 Dec 2025 15:23:26 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=AF=86=E7=BA=A7=E9=AB=98=E4=BA=8E?= =?UTF-8?q?=E5=86=85=E9=83=A8=E7=9A=84=E6=A1=88=E4=BE=8B=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/CaseKnowledgeServiceImpl.java | 307 +++++++++--------- 1 file changed, 156 insertions(+), 151 deletions(-) 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 0ea1f611..9a1b5f11 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 @@ -765,186 +765,191 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService { } } - JSONObject requestBody = new JSONObject(); - String userId = getCurrentUserId(); - requestBody.put("userId", userId); - requestBody.put("kId", caseAiProperties.getCaseKnowledgeId()); - requestBody.put("parseType", "AUTO"); - // 2. 检查文件路径 - if (StringUtil.isBlank(cases.getFilePath())) { - log.error("上传案例文档失败,案例文件路径为空,caseId: {}", caseId); - saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), CaseAiConstants.CASE_DOC_UPLOAD_INTERFACE_NAME, - requestBody.toJSONString(), "上传案例文档失败,案例文件路径为空", - CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), null, null); - return false; - } + if (StringUtils.equals(cases.getConfidentialityLevel(), "内部")) { + JSONObject requestBody = new JSONObject(); + String userId = getCurrentUserId(); + requestBody.put("userId", userId); + requestBody.put("kId", caseAiProperties.getCaseKnowledgeId()); + requestBody.put("parseType", "AUTO"); + // 2. 检查文件路径 + if (StringUtil.isBlank(cases.getFilePath())) { + log.error("上传案例文档失败,案例文件路径为空,caseId: {}", caseId); + saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), CaseAiConstants.CASE_DOC_UPLOAD_INTERFACE_NAME, + requestBody.toJSONString(), "上传案例文档失败,案例文件路径为空", + CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), null, null); + return false; + } - String savePath = fileUploader.getSavePath(); - String filePath = savePath + cases.getFilePath(); - File file = new File(filePath); - if (!file.exists()) { - log.error("上传案例文档失败,案例文件不存在,filePath: {}", filePath); - saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), CaseAiConstants.CASE_DOC_UPLOAD_INTERFACE_NAME, - requestBody.toJSONString(), "上传案例文档失败,案例文件不存在,filePath: " + filePath, - CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), null, null); - return false; - } + String savePath = fileUploader.getSavePath(); + String filePath = savePath + cases.getFilePath(); + File file = new File(filePath); + if (!file.exists()) { + log.error("上传案例文档失败,案例文件不存在,filePath: {}", filePath); + saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), CaseAiConstants.CASE_DOC_UPLOAD_INTERFACE_NAME, + requestBody.toJSONString(), "上传案例文档失败,案例文件不存在,filePath: " + filePath, + CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), null, null); + return false; + } - // 4. 构建上传参数 - String fileName = file.getName(); + // 4. 构建上传参数 + String fileName = file.getName(); - String fileType = getFileType(fileName); + String fileType = getFileType(fileName); - // 5. 重试逻辑:最多3次机会 - int uploadMaxRetries = 3; + // 5. 重试逻辑:最多3次机会 + int uploadMaxRetries = 3; - // 构建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); + // 构建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); - String url = caseAiProperties.getCaseDetailUrlBase() + caseId; - requestBody.put("url", url); - String downloadUrl = fileUploader.getHttpPath() + cases.getFilePath(); - requestBody.put("downloadUrl", downloadUrl); - builder.addTextBody("url", url, ContentType.TEXT_PLAIN); - builder.addTextBody("downloadUrl", downloadUrl, ContentType.TEXT_PLAIN); - // metadata - JSONObject fileMetaData = new JSONObject(); - fileMetaData.put("标题", cases.getTitle()); - fileMetaData.put("作者", cases.getAuthorName()); - fileMetaData.put("年份", String.valueOf(cases.getSysCreateTime().getYear())); - fileMetaData.put("摘要", cases.getSummary()); - // 组织领域:orgDomainParent - String orgDomainParent = cases.getOrgDomainParent(); - List orgDomainParentItems = sysDictionaryService.findByKey("org_domain"); - Optional orgDomainParentItem = orgDomainParentItems.stream() - .filter(item -> StringUtils.equals(orgDomainParent, item.getCode())) - .findFirst(); - if (orgDomainParentItem.isPresent()) { - StringBuilder sb = new StringBuilder(); - sb.append(orgDomainParentItem.get().getName()); - if (StringUtils.isNotBlank(cases.getOrgDomainParent2())) { - Optional orgDomainParent2Item = orgDomainParentItems.stream() - .filter(item -> StringUtils.equals(cases.getOrgDomainParent2(), item.getCode())) - .findFirst(); - orgDomainParent2Item.ifPresent(dictItem -> sb.append(" - ").append(dictItem.getName())); - if (StringUtils.isNotBlank(cases.getOrgDomainParent3())) { - Optional orgDomainParent3Item = orgDomainParentItems.stream() - .filter(item -> StringUtils.equals(cases.getOrgDomainParent3(), item.getCode())) + String url = caseAiProperties.getCaseDetailUrlBase() + caseId; + requestBody.put("url", url); + String downloadUrl = fileUploader.getHttpPath() + cases.getFilePath(); + requestBody.put("downloadUrl", downloadUrl); + builder.addTextBody("url", url, ContentType.TEXT_PLAIN); + builder.addTextBody("downloadUrl", downloadUrl, ContentType.TEXT_PLAIN); + // metadata + JSONObject fileMetaData = new JSONObject(); + fileMetaData.put("标题", cases.getTitle()); + fileMetaData.put("作者", cases.getAuthorName()); + fileMetaData.put("年份", String.valueOf(cases.getSysCreateTime().getYear())); + fileMetaData.put("摘要", cases.getSummary()); + // 组织领域:orgDomainParent + String orgDomainParent = cases.getOrgDomainParent(); + List orgDomainParentItems = sysDictionaryService.findByKey("org_domain"); + Optional orgDomainParentItem = orgDomainParentItems.stream() + .filter(item -> StringUtils.equals(orgDomainParent, item.getCode())) + .findFirst(); + if (orgDomainParentItem.isPresent()) { + StringBuilder sb = new StringBuilder(); + sb.append(orgDomainParentItem.get().getName()); + if (StringUtils.isNotBlank(cases.getOrgDomainParent2())) { + Optional orgDomainParent2Item = orgDomainParentItems.stream() + .filter(item -> StringUtils.equals(cases.getOrgDomainParent2(), item.getCode())) .findFirst(); - orgDomainParent3Item.ifPresent(dictItem -> sb.append(" - ").append(dictItem.getName())); + orgDomainParent2Item.ifPresent(dictItem -> sb.append(" - ").append(dictItem.getName())); + if (StringUtils.isNotBlank(cases.getOrgDomainParent3())) { + Optional orgDomainParent3Item = orgDomainParentItems.stream() + .filter(item -> StringUtils.equals(cases.getOrgDomainParent3(), item.getCode())) + .findFirst(); + orgDomainParent3Item.ifPresent(dictItem -> sb.append(" - ").append(dictItem.getName())); + } + } + fileMetaData.put("组织领域", sb.toString()); + } + // 分类:majorIds + List cmtList = casesMajorTypeDao.findList(FieldFilters.eq("caseId", cases.getId())); + if (cmtList != null && !cmtList.isEmpty()) { + List majorIds = cmtList.stream().map(CasesMajorType::getMajorId).collect(Collectors.toList()); + + List majorItems = sysDictionaryService.findByKey("major_type"); + if (majorItems != null && !majorItems.isEmpty()) { + List majorNames = majorItems.stream() + .filter(item -> majorIds.contains(item.getCode())) + .map(DictItem::getName) + .collect(Collectors.toList()); + fileMetaData.put("组织领域", String.join(", ", majorNames)); } } - fileMetaData.put("组织领域", sb.toString()); - } - // 分类:majorIds - List cmtList = casesMajorTypeDao.findList(FieldFilters.eq("caseId", cases.getId())); - if (cmtList != null && !cmtList.isEmpty()) { - List majorIds = cmtList.stream().map(CasesMajorType::getMajorId).collect(Collectors.toList()); - List majorItems = sysDictionaryService.findByKey("major_type"); - if (majorItems != null && !majorItems.isEmpty()) { - List majorNames = majorItems.stream() - .filter(item -> majorIds.contains(item.getCode())) - .map(DictItem::getName) - .collect(Collectors.toList()); - fileMetaData.put("组织领域", String.join(", ", majorNames)); + ContentType contentType = ContentType.create("text/plain", StandardCharsets.UTF_8); + builder.addTextBody("fileMetaData", fileMetaData.toJSONString(), contentType); + requestBody.put("fileMetaData", fileMetaData); + // 由于接口权限,目前采用不回调,而是通过批处理的方式,处理文件状态 + if (caseAiProperties.isFileUploadUseCallback()) { + builder.addTextBody("callbackUrl", caseAiProperties.getFileUploadCallbackUrl(), ContentType.TEXT_PLAIN); + requestBody.put("callbackUrl", caseAiProperties.getFileUploadCallbackUrl()); } - } - ContentType contentType = ContentType.create("text/plain", StandardCharsets.UTF_8); - builder.addTextBody("fileMetaData", fileMetaData.toJSONString(), contentType); - requestBody.put("fileMetaData", fileMetaData); - // 由于接口权限,目前采用不回调,而是通过批处理的方式,处理文件状态 - if (caseAiProperties.isFileUploadUseCallback()) { - builder.addTextBody("callbackUrl", caseAiProperties.getFileUploadCallbackUrl(), ContentType.TEXT_PLAIN); - requestBody.put("callbackUrl", caseAiProperties.getFileUploadCallbackUrl()); - } + String uploadUrl = caseAiProperties.getBaseUrl() + "/apigateway/knowledge/v1/file/upload"; - String uploadUrl = caseAiProperties.getBaseUrl() + "/apigateway/knowledge/v1/file/upload"; + // 3. 获取access_token + String accessToken = aiAccessTokenService.getAccessToken(); + if (StringUtil.isBlank(accessToken)) { + log.error("上传案例文档失败,获取access_token失败"); + saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), CaseAiConstants.CASE_DOC_UPLOAD_INTERFACE_NAME, + requestBody.toJSONString(), "上传案例文档失败,获取access_token失败", + CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), null, null); + return false; + } + for (int attempt = 1; attempt <= uploadMaxRetries; attempt++) { + log.info("上传案例文档第{}次尝试,caseId: {}", attempt, caseId); - // 3. 获取access_token - String accessToken = aiAccessTokenService.getAccessToken(); - if (StringUtil.isBlank(accessToken)) { - log.error("上传案例文档失败,获取access_token失败"); - saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), CaseAiConstants.CASE_DOC_UPLOAD_INTERFACE_NAME, - requestBody.toJSONString(), "上传案例文档失败,获取access_token失败", - CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), null, null); - return false; - } - for (int attempt = 1; attempt <= uploadMaxRetries; 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); - try (CloseableHttpClient httpClient = HttpClients.createDefault()) { - HttpPost httpPost = new HttpPost(uploadUrl); - httpPost.setHeader("X-AI-ApiCode", caseAiProperties.getAiApiCode()); - httpPost.setHeader("access_token", accessToken); + HttpEntity multipart = builder.build(); + httpPost.setEntity(multipart); - 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); - 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"); - if (statusCode == 200) { - JSONObject result = JSON.parseObject(responseBody); - if (result.getBooleanValue("success")) { - // 业务处理成功 - JSONObject data = result.getJSONObject("data"); - String taskId = data.getString("taskId"); - - // 保存成功的CaseDocumentLog记录 + // 保存成功的CaseDocumentLog记录 // saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), CaseAiConstants.CASE_DOC_UPLOAD_INTERFACE_NAME, // requestBody.toJSONString(), responseBody, // CaseDocumentLogRunStatusEnum.RUNNING.getCode(), null, null, taskId); - saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), CaseAiConstants.CASE_DOC_UPLOAD_INTERFACE_NAME, - requestBody.toJSONString(), responseBody, - CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.SUCCESS.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), taskId); + saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), CaseAiConstants.CASE_DOC_UPLOAD_INTERFACE_NAME, + requestBody.toJSONString(), responseBody, + CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.SUCCESS.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), taskId); - log.info("上传案例文档成功,等待文档状态变更. caseId: {}, taskId: {}, 尝试次数: {}", caseId, taskId, attempt); - return true; + log.info("上传案例文档成功,等待文档状态变更. caseId: {}, taskId: {}, 尝试次数: {}", caseId, taskId, attempt); + return true; + } else { + // 业务处理失败,不重试 + log.error("上传案例文档业务处理失败,不重试,response: {}", responseBody); + saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), CaseAiConstants.CASE_DOC_UPLOAD_INTERFACE_NAME, + requestBody.toJSONString(), responseBody, + CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.SUCCESS.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null); + return false; + } } else { - // 业务处理失败,不重试 - log.error("上传案例文档业务处理失败,不重试,response: {}", responseBody); + // 接口调用失败 + log.error("上传案例文档接口调用失败,第{}次尝试,status: {}, response: {}", attempt, statusCode, responseBody); saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), CaseAiConstants.CASE_DOC_UPLOAD_INTERFACE_NAME, requestBody.toJSONString(), responseBody, - CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.SUCCESS.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null); - return false; + CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), null, null); + if (attempt == uploadMaxRetries) { + // 最后一次尝试仍然失败 + return false; + } + // 继续下一次重试 } - } else { - // 接口调用失败 - log.error("上传案例文档接口调用失败,第{}次尝试,status: {}, response: {}", attempt, statusCode, responseBody); - saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), CaseAiConstants.CASE_DOC_UPLOAD_INTERFACE_NAME, - requestBody.toJSONString(), responseBody, - CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), null, null); - if (attempt == uploadMaxRetries) { - // 最后一次尝试仍然失败 - return false; - } - // 继续下一次重试 } + } catch (Exception e) { + // 接口调用异常 + log.error("上传案例文档接口调用异常,第{}次尝试", attempt, e); + saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), CaseAiConstants.CASE_DOC_UPLOAD_INTERFACE_NAME, + requestBody.toJSONString(), "接口调用异常: " + e.getMessage(), + CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), null, null); + if (attempt == uploadMaxRetries) { + // 最后一次尝试仍然异常 + log.error("上传案例文档最终失败,已重试{}次", uploadMaxRetries); + return false; + } + // 继续下一次重试 } - } catch (Exception e) { - // 接口调用异常 - log.error("上传案例文档接口调用异常,第{}次尝试", attempt, e); - saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), CaseAiConstants.CASE_DOC_UPLOAD_INTERFACE_NAME, - requestBody.toJSONString(), "接口调用异常: " + e.getMessage(), - CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), null, null); - if (attempt == uploadMaxRetries) { - // 最后一次尝试仍然异常 - log.error("上传案例文档最终失败,已重试{}次", uploadMaxRetries); - return false; - } - // 继续下一次重试 } + } else { + log.info("非【内部】密级案例,不进行上传"); + return true; } return false;