fix: 密级高于内部的案例处理

This commit is contained in:
liu.zixi
2025-12-18 15:23:26 +08:00
parent 395dd3244f
commit d2ddb9d469

View File

@@ -765,186 +765,191 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService {
} }
} }
JSONObject requestBody = new JSONObject(); if (StringUtils.equals(cases.getConfidentialityLevel(), "内部")) {
String userId = getCurrentUserId(); JSONObject requestBody = new JSONObject();
requestBody.put("userId", userId); String userId = getCurrentUserId();
requestBody.put("kId", caseAiProperties.getCaseKnowledgeId()); requestBody.put("userId", userId);
requestBody.put("parseType", "AUTO"); requestBody.put("kId", caseAiProperties.getCaseKnowledgeId());
// 2. 检查文件路径 requestBody.put("parseType", "AUTO");
if (StringUtil.isBlank(cases.getFilePath())) { // 2. 检查文件路径
log.error("上传案例文档失败案例文件路径为空caseId: {}", caseId); if (StringUtil.isBlank(cases.getFilePath())) {
saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), CaseAiConstants.CASE_DOC_UPLOAD_INTERFACE_NAME, log.error("上传案例文档失败案例文件路径为空caseId: {}", caseId);
requestBody.toJSONString(), "上传案例文档失败,案例文件路径为空", saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), CaseAiConstants.CASE_DOC_UPLOAD_INTERFACE_NAME,
CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), null, null); requestBody.toJSONString(), "上传案例文档失败,案例文件路径为空",
return false; CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), null, null);
} return false;
}
String savePath = fileUploader.getSavePath(); String savePath = fileUploader.getSavePath();
String filePath = savePath + cases.getFilePath(); String filePath = savePath + cases.getFilePath();
File file = new File(filePath); File file = new File(filePath);
if (!file.exists()) { if (!file.exists()) {
log.error("上传案例文档失败案例文件不存在filePath: {}", filePath); log.error("上传案例文档失败案例文件不存在filePath: {}", filePath);
saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), CaseAiConstants.CASE_DOC_UPLOAD_INTERFACE_NAME, saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), CaseAiConstants.CASE_DOC_UPLOAD_INTERFACE_NAME,
requestBody.toJSONString(), "上传案例文档失败案例文件不存在filePath: " + filePath, requestBody.toJSONString(), "上传案例文档失败案例文件不存在filePath: " + filePath,
CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), null, null); CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), null, null);
return false; return false;
} }
// 4. 构建上传参数 // 4. 构建上传参数
String fileName = file.getName(); String fileName = file.getName();
String fileType = getFileType(fileName); String fileType = getFileType(fileName);
// 5. 重试逻辑最多3次机会 // 5. 重试逻辑最多3次机会
int uploadMaxRetries = 3; int uploadMaxRetries = 3;
// 构建multipart/form-data请求体 // 构建multipart/form-data请求体
MultipartEntityBuilder builder = MultipartEntityBuilder.create(); MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addBinaryBody("file", file); builder.addBinaryBody("file", file);
builder.addTextBody("userId", userId, ContentType.TEXT_PLAIN); builder.addTextBody("userId", userId, ContentType.TEXT_PLAIN);
builder.addTextBody("kId", caseAiProperties.getCaseKnowledgeId(), ContentType.TEXT_PLAIN); builder.addTextBody("kId", caseAiProperties.getCaseKnowledgeId(), ContentType.TEXT_PLAIN);
builder.addTextBody("fileName", fileName, ContentType.TEXT_PLAIN); builder.addTextBody("fileName", fileName, ContentType.TEXT_PLAIN);
requestBody.put("fileName", fileName); requestBody.put("fileName", fileName);
builder.addTextBody("fileType", fileType, ContentType.TEXT_PLAIN); builder.addTextBody("fileType", fileType, ContentType.TEXT_PLAIN);
requestBody.put("fileType", fileType); requestBody.put("fileType", fileType);
builder.addTextBody("parseType", "AUTO", ContentType.TEXT_PLAIN); builder.addTextBody("parseType", "AUTO", ContentType.TEXT_PLAIN);
String url = caseAiProperties.getCaseDetailUrlBase() + caseId; String url = caseAiProperties.getCaseDetailUrlBase() + caseId;
requestBody.put("url", url); requestBody.put("url", url);
String downloadUrl = fileUploader.getHttpPath() + cases.getFilePath(); String downloadUrl = fileUploader.getHttpPath() + cases.getFilePath();
requestBody.put("downloadUrl", downloadUrl); requestBody.put("downloadUrl", downloadUrl);
builder.addTextBody("url", url, ContentType.TEXT_PLAIN); builder.addTextBody("url", url, ContentType.TEXT_PLAIN);
builder.addTextBody("downloadUrl", downloadUrl, ContentType.TEXT_PLAIN); builder.addTextBody("downloadUrl", downloadUrl, ContentType.TEXT_PLAIN);
// metadata // metadata
JSONObject fileMetaData = new JSONObject(); JSONObject fileMetaData = new JSONObject();
fileMetaData.put("标题", cases.getTitle()); fileMetaData.put("标题", cases.getTitle());
fileMetaData.put("作者", cases.getAuthorName()); fileMetaData.put("作者", cases.getAuthorName());
fileMetaData.put("年份", String.valueOf(cases.getSysCreateTime().getYear())); fileMetaData.put("年份", String.valueOf(cases.getSysCreateTime().getYear()));
fileMetaData.put("摘要", cases.getSummary()); fileMetaData.put("摘要", cases.getSummary());
// 组织领域orgDomainParent // 组织领域orgDomainParent
String orgDomainParent = cases.getOrgDomainParent(); String orgDomainParent = cases.getOrgDomainParent();
List<DictItem> orgDomainParentItems = sysDictionaryService.findByKey("org_domain"); List<DictItem> orgDomainParentItems = sysDictionaryService.findByKey("org_domain");
Optional<DictItem> orgDomainParentItem = orgDomainParentItems.stream() Optional<DictItem> orgDomainParentItem = orgDomainParentItems.stream()
.filter(item -> StringUtils.equals(orgDomainParent, item.getCode())) .filter(item -> StringUtils.equals(orgDomainParent, item.getCode()))
.findFirst(); .findFirst();
if (orgDomainParentItem.isPresent()) { if (orgDomainParentItem.isPresent()) {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
sb.append(orgDomainParentItem.get().getName()); sb.append(orgDomainParentItem.get().getName());
if (StringUtils.isNotBlank(cases.getOrgDomainParent2())) { if (StringUtils.isNotBlank(cases.getOrgDomainParent2())) {
Optional<DictItem> orgDomainParent2Item = orgDomainParentItems.stream() Optional<DictItem> orgDomainParent2Item = orgDomainParentItems.stream()
.filter(item -> StringUtils.equals(cases.getOrgDomainParent2(), item.getCode())) .filter(item -> StringUtils.equals(cases.getOrgDomainParent2(), item.getCode()))
.findFirst();
orgDomainParent2Item.ifPresent(dictItem -> sb.append(" - ").append(dictItem.getName()));
if (StringUtils.isNotBlank(cases.getOrgDomainParent3())) {
Optional<DictItem> orgDomainParent3Item = orgDomainParentItems.stream()
.filter(item -> StringUtils.equals(cases.getOrgDomainParent3(), item.getCode()))
.findFirst(); .findFirst();
orgDomainParent3Item.ifPresent(dictItem -> sb.append(" - ").append(dictItem.getName())); orgDomainParent2Item.ifPresent(dictItem -> sb.append(" - ").append(dictItem.getName()));
if (StringUtils.isNotBlank(cases.getOrgDomainParent3())) {
Optional<DictItem> 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<CasesMajorType> cmtList = casesMajorTypeDao.findList(FieldFilters.eq("caseId", cases.getId()));
if (cmtList != null && !cmtList.isEmpty()) {
List<String> majorIds = cmtList.stream().map(CasesMajorType::getMajorId).collect(Collectors.toList());
List<DictItem> majorItems = sysDictionaryService.findByKey("major_type");
if (majorItems != null && !majorItems.isEmpty()) {
List<String> 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<CasesMajorType> cmtList = casesMajorTypeDao.findList(FieldFilters.eq("caseId", cases.getId()));
if (cmtList != null && !cmtList.isEmpty()) {
List<String> majorIds = cmtList.stream().map(CasesMajorType::getMajorId).collect(Collectors.toList());
List<DictItem> majorItems = sysDictionaryService.findByKey("major_type"); ContentType contentType = ContentType.create("text/plain", StandardCharsets.UTF_8);
if (majorItems != null && !majorItems.isEmpty()) { builder.addTextBody("fileMetaData", fileMetaData.toJSONString(), contentType);
List<String> majorNames = majorItems.stream() requestBody.put("fileMetaData", fileMetaData);
.filter(item -> majorIds.contains(item.getCode())) // 由于接口权限,目前采用不回调,而是通过批处理的方式,处理文件状态
.map(DictItem::getName) if (caseAiProperties.isFileUploadUseCallback()) {
.collect(Collectors.toList()); builder.addTextBody("callbackUrl", caseAiProperties.getFileUploadCallbackUrl(), ContentType.TEXT_PLAIN);
fileMetaData.put("组织领域", String.join(", ", majorNames)); requestBody.put("callbackUrl", caseAiProperties.getFileUploadCallbackUrl());
} }
}
ContentType contentType = ContentType.create("text/plain", StandardCharsets.UTF_8); String uploadUrl = caseAiProperties.getBaseUrl() + "/apigateway/knowledge/v1/file/upload";
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"; // 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 try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
String accessToken = aiAccessTokenService.getAccessToken(); HttpPost httpPost = new HttpPost(uploadUrl);
if (StringUtil.isBlank(accessToken)) { httpPost.setHeader("X-AI-ApiCode", caseAiProperties.getAiApiCode());
log.error("上传案例文档失败,获取access_token失败"); httpPost.setHeader("access_token", accessToken);
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()) { HttpEntity multipart = builder.build();
HttpPost httpPost = new HttpPost(uploadUrl); httpPost.setEntity(multipart);
httpPost.setHeader("X-AI-ApiCode", caseAiProperties.getAiApiCode());
httpPost.setHeader("access_token", accessToken);
HttpEntity multipart = builder.build(); try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
httpPost.setEntity(multipart); int statusCode = response.getStatusLine().getStatusCode();
String responseBody = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);
try (CloseableHttpResponse response = httpClient.execute(httpPost)) { if (statusCode == 200) {
int statusCode = response.getStatusLine().getStatusCode(); JSONObject result = JSON.parseObject(responseBody);
String responseBody = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8); if (result.getBooleanValue("success")) {
// 业务处理成功
JSONObject data = result.getJSONObject("data");
String taskId = data.getString("taskId");
if (statusCode == 200) { // 保存成功的CaseDocumentLog记录
JSONObject result = JSON.parseObject(responseBody);
if (result.getBooleanValue("success")) {
// 业务处理成功
JSONObject data = result.getJSONObject("data");
String taskId = data.getString("taskId");
// 保存成功的CaseDocumentLog记录
// saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), CaseAiConstants.CASE_DOC_UPLOAD_INTERFACE_NAME, // saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), CaseAiConstants.CASE_DOC_UPLOAD_INTERFACE_NAME,
// requestBody.toJSONString(), responseBody, // requestBody.toJSONString(), responseBody,
// CaseDocumentLogRunStatusEnum.RUNNING.getCode(), null, null, taskId); // CaseDocumentLogRunStatusEnum.RUNNING.getCode(), null, null, taskId);
saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), CaseAiConstants.CASE_DOC_UPLOAD_INTERFACE_NAME, saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), CaseAiConstants.CASE_DOC_UPLOAD_INTERFACE_NAME,
requestBody.toJSONString(), responseBody, requestBody.toJSONString(), responseBody,
CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.SUCCESS.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), taskId); CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.SUCCESS.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), taskId);
log.info("上传案例文档成功,等待文档状态变更. caseId: {}, taskId: {}, 尝试次数: {}", caseId, taskId, attempt); log.info("上传案例文档成功,等待文档状态变更. caseId: {}, taskId: {}, 尝试次数: {}", caseId, taskId, attempt);
return true; 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 { } 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, saveCaseDocumentLog(caseId, cases.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), CaseAiConstants.CASE_DOC_UPLOAD_INTERFACE_NAME,
requestBody.toJSONString(), responseBody, requestBody.toJSONString(), responseBody,
CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.SUCCESS.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null); CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), null, null);
return false; 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; return false;