mirror of
https://codeup.aliyun.com/67762337eccfc218f6110e0e/per-boe/java-servers.git
synced 2025-12-07 01:46:47 +08:00
案例专家:修正调用逻辑
This commit is contained in:
@@ -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());
|
||||
|
||||
@@ -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);
|
||||
|
||||
/**
|
||||
* 处理文档上传回调
|
||||
*
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user