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:
@@ -0,0 +1,50 @@
|
||||
package com.xboe.enums;
|
||||
|
||||
/**
|
||||
* AI调用日志接口运行状态枚举
|
||||
*/
|
||||
public enum CaseDocumentLogRunStatusEnum {
|
||||
|
||||
RUNNING(0, "运行中"),
|
||||
COMPLETED(1, "运行完成");
|
||||
|
||||
private final Integer code;
|
||||
private final String desc;
|
||||
|
||||
CaseDocumentLogRunStatusEnum(Integer code, String desc) {
|
||||
this.code = code;
|
||||
this.desc = desc;
|
||||
}
|
||||
|
||||
public Integer getCode() {
|
||||
return code;
|
||||
}
|
||||
|
||||
public String getDesc() {
|
||||
return desc;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据code获取描述
|
||||
*/
|
||||
public static String getDescByCode(Integer code) {
|
||||
for (CaseDocumentLogRunStatusEnum statusEnum : values()) {
|
||||
if (statusEnum.getCode().equals(code)) {
|
||||
return statusEnum.getDesc();
|
||||
}
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据code获取枚举
|
||||
*/
|
||||
public static CaseDocumentLogRunStatusEnum getByCode(Integer code) {
|
||||
for (CaseDocumentLogRunStatusEnum statusEnum : values()) {
|
||||
if (statusEnum.getCode().equals(code)) {
|
||||
return statusEnum;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -67,6 +67,13 @@ public class CaseDocumentLog extends BaseEntity {
|
||||
@Column(name = "opt_time")
|
||||
private LocalDateTime optTime;
|
||||
|
||||
/**
|
||||
* 接口运行状态
|
||||
* 0-运行中, 1-运行完毕
|
||||
*/
|
||||
@Column(name = "run_status")
|
||||
private Integer runStatus;
|
||||
|
||||
/**
|
||||
* 接口调用状态
|
||||
* 0-调用中, 1-调用成功, 2-调用失败
|
||||
|
||||
@@ -37,6 +37,11 @@ public class CaseAiProperties {
|
||||
*/
|
||||
private String caseKnowledgeId;
|
||||
|
||||
/**
|
||||
* 文件上传是否使用回调接口
|
||||
*/
|
||||
private boolean fileUploadUseCallback;
|
||||
|
||||
/**
|
||||
* 文档上传回调接口地址
|
||||
*/
|
||||
|
||||
@@ -38,4 +38,9 @@ public interface ICaseKnowledgeService {
|
||||
* @return 是否处理成功
|
||||
*/
|
||||
boolean handleUploadCallback(String taskId, String message, String fileStatus);
|
||||
|
||||
/**
|
||||
* 批量检查文件状态
|
||||
*/
|
||||
void batchCheckFileStatus();
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ import com.xboe.common.PageList;
|
||||
import com.xboe.core.orm.FieldFilters;
|
||||
import com.xboe.core.orm.IFieldFilter;
|
||||
import com.xboe.core.orm.LikeMatchMode;
|
||||
import com.xboe.enums.CaseDocumentLogRunStatusEnum;
|
||||
import com.xboe.module.boecase.dao.CaseDocumentLogDao;
|
||||
import com.xboe.module.boecase.dto.CaseDocumentLogQueryDto;
|
||||
import com.xboe.module.boecase.entity.CaseDocumentLog;
|
||||
@@ -47,16 +48,9 @@ public class CaseDocumentLogServiceImpl implements ICaseDocumentLogService {
|
||||
public PageList<CaseDocumentLogVo> pageQuery(int pageIndex, int pageSize, CaseDocumentLogQueryDto queryDto) {
|
||||
// 构建查询条件
|
||||
List<IFieldFilter> filters = new ArrayList<>();
|
||||
|
||||
// 删除标识过滤
|
||||
filters.add(FieldFilters.eq("deleted", false));
|
||||
|
||||
// 接口调用状态
|
||||
if (queryDto.getOptStatus() != null) {
|
||||
filters.add(FieldFilters.eq("optStatus", queryDto.getOptStatus()));
|
||||
} else {
|
||||
filters.add(FieldFilters.ge("optStatus", 1));
|
||||
}
|
||||
// 运行状态过滤
|
||||
filters.add(FieldFilters.eq("runStatus", CaseDocumentLogRunStatusEnum.COMPLETED.getCode()));
|
||||
|
||||
// 案例标题模糊查询
|
||||
if (StringUtil.isNotBlank(queryDto.getCaseTitle())) {
|
||||
@@ -76,11 +70,19 @@ public class CaseDocumentLogServiceImpl implements ICaseDocumentLogService {
|
||||
filters.add(FieldFilters.le("optTime", queryDto.getOptTimeEnd()));
|
||||
}
|
||||
|
||||
// 接口调用状态
|
||||
if (queryDto.getOptStatus() != null) {
|
||||
filters.add(FieldFilters.eq("optStatus", queryDto.getOptStatus()));
|
||||
}
|
||||
|
||||
// 业务处理状态
|
||||
if (queryDto.getCaseStatus() != null) {
|
||||
filters.add(FieldFilters.eq("caseStatus", queryDto.getCaseStatus()));
|
||||
}
|
||||
|
||||
// 删除标识过滤
|
||||
filters.add(FieldFilters.eq("deleted", false));
|
||||
|
||||
// 按创建时间降序排序
|
||||
OrderCondition order = OrderCondition.desc("sysCreateTime");
|
||||
|
||||
@@ -106,16 +108,9 @@ public class CaseDocumentLogServiceImpl implements ICaseDocumentLogService {
|
||||
public int clearLogsByCondition(CaseDocumentLogQueryDto queryDto) {
|
||||
// 构建查询条件(与分页查询相同的逻辑)
|
||||
List<IFieldFilter> filters = new ArrayList<>();
|
||||
|
||||
// 删除标识过滤
|
||||
filters.add(FieldFilters.eq("deleted", false));
|
||||
|
||||
// 接口调用状态
|
||||
if (queryDto.getOptStatus() != null) {
|
||||
filters.add(FieldFilters.eq("optStatus", queryDto.getOptStatus()));
|
||||
} else {
|
||||
filters.add(FieldFilters.ge("optStatus", 1));
|
||||
}
|
||||
// 运行状态过滤
|
||||
filters.add(FieldFilters.eq("runStatus", CaseDocumentLogRunStatusEnum.COMPLETED.getCode()));
|
||||
|
||||
// 案例标题模糊查询
|
||||
if (StringUtil.isNotBlank(queryDto.getCaseTitle())) {
|
||||
@@ -135,11 +130,19 @@ public class CaseDocumentLogServiceImpl implements ICaseDocumentLogService {
|
||||
filters.add(FieldFilters.le("optTime", queryDto.getOptTimeEnd()));
|
||||
}
|
||||
|
||||
// 接口调用状态
|
||||
if (queryDto.getOptStatus() != null) {
|
||||
filters.add(FieldFilters.eq("optStatus", queryDto.getOptStatus()));
|
||||
}
|
||||
|
||||
// 业务处理状态
|
||||
if (queryDto.getCaseStatus() != null) {
|
||||
filters.add(FieldFilters.eq("caseStatus", queryDto.getCaseStatus()));
|
||||
}
|
||||
|
||||
// 删除标识过滤
|
||||
filters.add(FieldFilters.eq("deleted", false));
|
||||
|
||||
// 查询符合条件的所有记录
|
||||
IFieldFilter[] filtersArray = filters.toArray(new IFieldFilter[0]);
|
||||
List<CaseDocumentLog> logsToDelete = caseDocumentLogDao.getGenericDao()
|
||||
@@ -273,8 +276,6 @@ public class CaseDocumentLogServiceImpl implements ICaseDocumentLogService {
|
||||
return "";
|
||||
}
|
||||
switch (optStatus) {
|
||||
case 0:
|
||||
return "调用中";
|
||||
case 1:
|
||||
return "调用成功";
|
||||
case 2:
|
||||
|
||||
@@ -10,6 +10,7 @@ import com.xboe.core.upload.XFileUploader;
|
||||
import com.xboe.enums.CaseDocumentLogCaseStatusEnum;
|
||||
import com.xboe.enums.CaseDocumentLogOptStatusEnum;
|
||||
import com.xboe.enums.CaseDocumentLogOptTypeEnum;
|
||||
import com.xboe.enums.CaseDocumentLogRunStatusEnum;
|
||||
import com.xboe.module.boecase.dao.CaseDocumentLogDao;
|
||||
import com.xboe.module.boecase.dao.CasesDao;
|
||||
import com.xboe.module.boecase.entity.CaseDocumentLog;
|
||||
@@ -139,8 +140,11 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService {
|
||||
requestBody.put("fileType", fileType);
|
||||
builder.addTextBody("parseType", "AUTO", ContentType.TEXT_PLAIN);
|
||||
requestBody.put("parseType", "AUTO");
|
||||
builder.addTextBody("callbackUrl", caseAiProperties.getFileUploadCallbackUrl(), ContentType.TEXT_PLAIN);
|
||||
requestBody.put("callbackUrl", caseAiProperties.getFileUploadCallbackUrl());
|
||||
// 由于接口权限,目前采用不回调,而是通过批处理的方式,处理文件状态
|
||||
if (caseAiProperties.isFileUploadUseCallback()) {
|
||||
builder.addTextBody("callbackUrl", caseAiProperties.getFileUploadCallbackUrl(), ContentType.TEXT_PLAIN);
|
||||
requestBody.put("callbackUrl", caseAiProperties.getFileUploadCallbackUrl());
|
||||
}
|
||||
|
||||
HttpEntity multipart = builder.build();
|
||||
httpPost.setEntity(multipart);
|
||||
@@ -158,15 +162,17 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService {
|
||||
|
||||
// 保存成功的CaseDocumentLog记录
|
||||
saveCaseDocumentLog(caseId, caseEntity.getTitle(), CaseDocumentLogOptTypeEnum.CREATE.getCode(), uploadUrl,
|
||||
requestBody.toJSONString(), responseBody, CaseDocumentLogOptStatusEnum.CALLING.getCode(), CaseDocumentLogCaseStatusEnum.SUCCESS.getCode(), taskId);
|
||||
requestBody.toJSONString(), responseBody,
|
||||
CaseDocumentLogRunStatusEnum.RUNNING.getCode(), null, null, taskId);
|
||||
|
||||
log.info("上传案例文档成功,caseId: {}, taskId: {}, 尝试次数: {}", caseId, taskId, attempt);
|
||||
log.info("上传案例文档成功,等待文档状态变更. caseId: {}, taskId: {}, 尝试次数: {}", caseId, taskId, attempt);
|
||||
return true;
|
||||
} else {
|
||||
// 业务处理失败,不重试
|
||||
log.error("上传案例文档业务处理失败,不重试,response: {}", responseBody);
|
||||
saveCaseDocumentLog(caseId, caseEntity.getTitle(), CaseDocumentLogOptTypeEnum.CREATE.getCode(), uploadUrl,
|
||||
requestBody.toJSONString(), responseBody, CaseDocumentLogOptStatusEnum.CALLING.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null);
|
||||
requestBody.toJSONString(), responseBody,
|
||||
CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.SUCCESS.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null);
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
@@ -175,7 +181,8 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService {
|
||||
if (attempt == maxRetries) {
|
||||
// 最后一次尝试仍然失败
|
||||
saveCaseDocumentLog(caseId, caseEntity.getTitle(), CaseDocumentLogOptTypeEnum.CREATE.getCode(), uploadUrl,
|
||||
requestBody.toJSONString(), responseBody, CaseDocumentLogOptStatusEnum.FAILED.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null);
|
||||
requestBody.toJSONString(), responseBody,
|
||||
CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.SUCCESS.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null);
|
||||
return false;
|
||||
}
|
||||
// 继续下一次重试
|
||||
@@ -188,7 +195,8 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService {
|
||||
// 最后一次尝试仍然异常
|
||||
log.error("上传案例文档最终失败,已重试{}次", maxRetries);
|
||||
saveCaseDocumentLog(caseId, caseEntity.getTitle(), CaseDocumentLogOptTypeEnum.CREATE.getCode(), uploadUrl,
|
||||
requestBody.toJSONString(), "接口调用异常: " + e.getMessage(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null);
|
||||
requestBody.toJSONString(), "接口调用异常: " + e.getMessage(),
|
||||
CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null);
|
||||
return false;
|
||||
}
|
||||
// 继续下一次重试
|
||||
@@ -274,7 +282,8 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService {
|
||||
CaseDocumentLogCaseStatusEnum.SUCCESS.getCode() : CaseDocumentLogCaseStatusEnum.FAILED.getCode();
|
||||
|
||||
saveCaseDocumentLog(caseId, caseEntity.getTitle(), CaseDocumentLogOptTypeEnum.DELETE.getCode(), deleteUrl,
|
||||
params, responseBody, optStatus, caseStatus, null);
|
||||
params, responseBody,
|
||||
CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), optStatus, caseStatus, null);
|
||||
|
||||
if (deleteSuccess != null && deleteSuccess) {
|
||||
log.info("删除案例文档成功,caseId: {}, taskId: {}, 尝试次数: {}", caseId, taskId, attempt);
|
||||
@@ -288,7 +297,8 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService {
|
||||
// 业务处理失败,不重试
|
||||
log.error("删除案例文档业务处理失败,不重试,response: {}", responseBody);
|
||||
saveCaseDocumentLog(caseId, caseEntity.getTitle(), CaseDocumentLogOptTypeEnum.DELETE.getCode(), deleteUrl,
|
||||
params, responseBody, CaseDocumentLogOptStatusEnum.SUCCESS.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null);
|
||||
params, responseBody,
|
||||
CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.SUCCESS.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null);
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
@@ -297,7 +307,8 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService {
|
||||
if (attempt == maxRetries) {
|
||||
// 最后一次尝试仍然失败
|
||||
saveCaseDocumentLog(caseId, caseEntity.getTitle(), CaseDocumentLogOptTypeEnum.DELETE.getCode(), deleteUrl,
|
||||
params, responseBody, CaseDocumentLogOptStatusEnum.FAILED.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null);
|
||||
params, responseBody,
|
||||
CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null);
|
||||
return false;
|
||||
}
|
||||
// 继续下一次重试
|
||||
@@ -310,7 +321,8 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService {
|
||||
// 最后一次尝试仍然异常
|
||||
log.error("删除案例文档最终失败,已重试{}次", maxRetries);
|
||||
saveCaseDocumentLog(caseId, caseEntity.getTitle(), CaseDocumentLogOptTypeEnum.DELETE.getCode(), deleteUrl,
|
||||
params, "接口调用异常: " + e.getMessage(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null);
|
||||
params, "接口调用异常: " + e.getMessage(),
|
||||
CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null);
|
||||
return false;
|
||||
}
|
||||
// 继续下一次重试
|
||||
@@ -374,7 +386,8 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService {
|
||||
if (!deleteSuccess) {
|
||||
log.error("更新案例文档失败,删除接口调用失败,不继续执行上传操作,caseId: {}", caseId);
|
||||
saveCaseDocumentLog(caseId, caseEntity.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), requestUrl,
|
||||
deleteParam, "删除接口:失败,上传接口:未执行", CaseDocumentLogOptStatusEnum.FAILED.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null);
|
||||
deleteParam, "删除接口:失败,上传接口:未执行",
|
||||
CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -408,20 +421,24 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService {
|
||||
uploadRequestBody.put("fileName", fileName);
|
||||
uploadRequestBody.put("fileType", fileType);
|
||||
uploadRequestBody.put("parseType", "AUTO");
|
||||
uploadRequestBody.put("callbackUrl", caseAiProperties.getFileUploadCallbackUrl());
|
||||
if (caseAiProperties.isFileUploadUseCallback()) {
|
||||
uploadRequestBody.put("callbackUrl", caseAiProperties.getFileUploadCallbackUrl());
|
||||
}
|
||||
requestBody = uploadRequestBody.toJSONString();
|
||||
|
||||
String taskId = callUploadInterface(caseId, file, fileName, fileType, userId, accessToken, requestUrl);
|
||||
boolean uploadSuccess = StringUtil.isNotBlank(taskId);
|
||||
|
||||
// 4. 根据结果保存一条CaseDocumentLog数据
|
||||
int optStatus = uploadSuccess ? CaseDocumentLogOptStatusEnum.SUCCESS.getCode() : CaseDocumentLogOptStatusEnum.FAILED.getCode();
|
||||
int caseStatus = uploadSuccess ? CaseDocumentLogCaseStatusEnum.SUCCESS.getCode() : CaseDocumentLogCaseStatusEnum.FAILED.getCode();
|
||||
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",
|
||||
uploadSuccess ? "成功" : "失败");
|
||||
|
||||
saveCaseDocumentLog(caseId, caseEntity.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), requestUrl,
|
||||
requestBody, result, optStatus, caseStatus, taskId);
|
||||
requestBody, result,
|
||||
runStatus, optStatus, caseStatus, taskId);
|
||||
|
||||
if (uploadSuccess) {
|
||||
log.info("更新案例文档成功,caseId: {}, taskId: {}", caseId, taskId);
|
||||
@@ -434,7 +451,8 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService {
|
||||
} catch (Exception e) {
|
||||
log.error("更新案例文档异常", e);
|
||||
saveCaseDocumentLog(caseId, caseEntity.getTitle(), CaseDocumentLogOptTypeEnum.UPDATE.getCode(), requestUrl,
|
||||
requestBody, "更新异常: " + e.getMessage(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null);
|
||||
requestBody, "更新异常: " + e.getMessage(),
|
||||
CaseDocumentLogRunStatusEnum.COMPLETED.getCode(), CaseDocumentLogOptStatusEnum.FAILED.getCode(), CaseDocumentLogCaseStatusEnum.FAILED.getCode(), null);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -515,6 +533,81 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void batchCheckFileStatus() {
|
||||
log.info("开始批量检查文件状态");
|
||||
|
||||
// 1. 查询CaseDocumentLog表中所有run_status等于0的数据
|
||||
List<CaseDocumentLog> runningLogs = caseDocumentLogDao.getGenericDao()
|
||||
.findList(CaseDocumentLog.class,
|
||||
FieldFilters.eq("runStatus", CaseDocumentLogRunStatusEnum.RUNNING.getCode()));
|
||||
|
||||
// 2. 如果没有符合条件的数据,完成
|
||||
if (runningLogs.isEmpty()) {
|
||||
log.info("没有需要检查状态的文档,批量检查完成");
|
||||
return;
|
||||
}
|
||||
|
||||
log.info("找到{}条需要检查状态的文档记录", runningLogs.size());
|
||||
|
||||
// 3. 把这些数据的taskId聚合成一个List<String>
|
||||
List<String> taskIds = runningLogs.stream()
|
||||
.map(CaseDocumentLog::getTaskId)
|
||||
.filter(StringUtil::isNotBlank)
|
||||
.distinct()
|
||||
.collect(java.util.stream.Collectors.toList());
|
||||
|
||||
if (taskIds.isEmpty()) {
|
||||
log.warn("所有运行中的记录都没有有效的taskId");
|
||||
return;
|
||||
}
|
||||
|
||||
log.info("需要检查状态的taskId数量: {}", taskIds.size());
|
||||
|
||||
// 4. 获取access_token
|
||||
String accessToken = aiAccessTokenService.getAccessToken();
|
||||
if (StringUtil.isBlank(accessToken)) {
|
||||
log.error("批量检查文件状态失败,获取access_token失败");
|
||||
return;
|
||||
}
|
||||
|
||||
// 5. 调用三方接口检查状态
|
||||
try {
|
||||
String statusUrl = caseAiProperties.getBaseUrl() + "/apigateway/knowledge/v1/file/status";
|
||||
String kId = caseAiProperties.getCaseKnowledgeId();
|
||||
String taskIdsParam = String.join(",", taskIds);
|
||||
String queryParams = "kId=" + URLEncoder.encode(kId, StandardCharsets.UTF_8.name()) +
|
||||
"&taskIds=" + URLEncoder.encode(taskIdsParam, StandardCharsets.UTF_8.name());
|
||||
|
||||
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
|
||||
HttpGet httpGet = new HttpGet(statusUrl + "?" + queryParams);
|
||||
httpGet.setHeader("X-AI-ApiCode", caseAiProperties.getAiApiCode());
|
||||
httpGet.setHeader("access_token", accessToken);
|
||||
|
||||
try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
|
||||
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")) {
|
||||
// 6. 解析返回结果并更新状态
|
||||
processFileStatusResponse(result, runningLogs);
|
||||
} else {
|
||||
log.error("调用文件状态接口业务处理失败,response: {}", responseBody);
|
||||
}
|
||||
} else {
|
||||
log.error("调用文件状态接口失败,status: {}, response: {}", statusCode, responseBody);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("批量检查文件状态异常", e);
|
||||
}
|
||||
|
||||
log.info("批量检查文件状态完成");
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据文件名获取文件类型
|
||||
*/
|
||||
@@ -668,7 +761,9 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService {
|
||||
builder.addTextBody("fileName", fileName, ContentType.TEXT_PLAIN);
|
||||
builder.addTextBody("fileType", fileType, ContentType.TEXT_PLAIN);
|
||||
builder.addTextBody("parseType", "AUTO", ContentType.TEXT_PLAIN);
|
||||
builder.addTextBody("callbackUrl", caseAiProperties.getFileUploadCallbackUrl(), ContentType.TEXT_PLAIN);
|
||||
if (caseAiProperties.isFileUploadUseCallback()) {
|
||||
builder.addTextBody("callbackUrl", caseAiProperties.getFileUploadCallbackUrl(), ContentType.TEXT_PLAIN);
|
||||
}
|
||||
|
||||
HttpEntity multipart = builder.build();
|
||||
httpPost.setEntity(multipart);
|
||||
@@ -714,12 +809,94 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理文件状态接口响应
|
||||
*/
|
||||
private void processFileStatusResponse(JSONObject result, List<CaseDocumentLog> runningLogs) {
|
||||
try {
|
||||
com.alibaba.fastjson.JSONArray dataArray = result.getJSONArray("data");
|
||||
if (dataArray == null || dataArray.isEmpty()) {
|
||||
log.warn("文件状态接口返回的data为空");
|
||||
return;
|
||||
}
|
||||
|
||||
// 创建taskId到状态的映射
|
||||
java.util.Map<String, String> taskStatusMap = new java.util.HashMap<>();
|
||||
for (int i = 0; i < dataArray.size(); i++) {
|
||||
JSONObject statusItem = dataArray.getJSONObject(i);
|
||||
String taskId = statusItem.getString("taskId");
|
||||
String fileStatus = statusItem.getString("fileStatus");
|
||||
if (StringUtil.isNotBlank(taskId) && StringUtil.isNotBlank(fileStatus)) {
|
||||
taskStatusMap.put(taskId, fileStatus);
|
||||
}
|
||||
}
|
||||
|
||||
// 根据状态更新对应的CaseDocumentLog记录
|
||||
for (CaseDocumentLog caseDocumentLog : runningLogs) {
|
||||
String taskId = caseDocumentLog.getTaskId();
|
||||
if (StringUtil.isBlank(taskId)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
String fileStatus = taskStatusMap.get(taskId);
|
||||
if (StringUtil.isBlank(fileStatus)) {
|
||||
log.warn("未找到taskId对应的文件状态: {}", taskId);
|
||||
continue;
|
||||
}
|
||||
|
||||
updateLogStatusByFileStatus(caseDocumentLog, fileStatus);
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("处理文件状态响应异常", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据文件状态更新日志记录
|
||||
*/
|
||||
private void updateLogStatusByFileStatus(CaseDocumentLog caseLog, String fileStatus) {
|
||||
try {
|
||||
boolean needUpdate = false;
|
||||
|
||||
if ("vectored".equals(fileStatus)) {
|
||||
// 状态为vectored,将run_status、opt_status和case_status都变更为1
|
||||
caseLog.setRunStatus(CaseDocumentLogRunStatusEnum.COMPLETED.getCode());
|
||||
caseLog.setOptStatus(CaseDocumentLogOptStatusEnum.SUCCESS.getCode());
|
||||
caseLog.setCaseStatus(CaseDocumentLogCaseStatusEnum.SUCCESS.getCode());
|
||||
needUpdate = true;
|
||||
log.info("文档向量化成功,更新状态,taskId: {}, caseId: {}", caseLog.getTaskId(), caseLog.getCaseId());
|
||||
} else if ("failed".equals(fileStatus)) {
|
||||
// 状态为failed,run_status、opt_status变更为1,case_status变更为2
|
||||
caseLog.setRunStatus(CaseDocumentLogRunStatusEnum.COMPLETED.getCode());
|
||||
caseLog.setOptStatus(CaseDocumentLogOptStatusEnum.SUCCESS.getCode());
|
||||
caseLog.setCaseStatus(CaseDocumentLogCaseStatusEnum.FAILED.getCode());
|
||||
needUpdate = true;
|
||||
log.warn("文档处理失败,更新状态,taskId: {}, caseId: {}", caseLog.getTaskId(), caseLog.getCaseId());
|
||||
} else {
|
||||
// 其他状态(uploaded、texted、vectoring),不做数据变更
|
||||
log.debug("文档状态为{},暂不更新数据库,taskId: {}", fileStatus, caseLog.getTaskId());
|
||||
}
|
||||
|
||||
// 如果需要更新,执行update操作
|
||||
if (needUpdate) {
|
||||
caseLog.setSysUpdateTime(LocalDateTime.now());
|
||||
caseDocumentLogDao.save(caseLog);
|
||||
log.info("更新CaseDocumentLog成功,logId: {}, taskId: {}, fileStatus: {}",
|
||||
caseLog.getId(), caseLog.getTaskId(), fileStatus);
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("更新日志状态异常,taskId: {}, fileStatus: {}", caseLog.getTaskId(), fileStatus, e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存CaseDocumentLog记录
|
||||
*/
|
||||
private void saveCaseDocumentLog(String caseId, String caseTitle, String optType,
|
||||
String requestUrl, String requestBody, String responseBody,
|
||||
Integer optStatus, Integer caseStatus, String taskId) {
|
||||
Integer runStatus, Integer optStatus, Integer caseStatus, String taskId) {
|
||||
try {
|
||||
CaseDocumentLog caseDocumentLog = new CaseDocumentLog();
|
||||
caseDocumentLog.setId(IDGenerator.generate());
|
||||
@@ -731,6 +908,7 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService {
|
||||
caseDocumentLog.setRequestBody(requestBody);
|
||||
caseDocumentLog.setResponseBody(responseBody);
|
||||
caseDocumentLog.setOptTime(LocalDateTime.now());
|
||||
caseDocumentLog.setRunStatus(runStatus);
|
||||
caseDocumentLog.setOptStatus(optStatus);
|
||||
caseDocumentLog.setCaseStatus(caseStatus);
|
||||
caseDocumentLog.setExecuteDuration(0L);
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
package com.xboe.module.boecase.task;
|
||||
|
||||
import com.xboe.module.boecase.service.ICaseKnowledgeService;
|
||||
import com.xxl.job.core.handler.annotation.XxlJob;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
@Slf4j
|
||||
public class CaseDocumentLogTask {
|
||||
|
||||
@Autowired
|
||||
private ICaseKnowledgeService caseKnowledgeService;
|
||||
|
||||
// @XxlJob("batchCheckFileStatus")
|
||||
public void batchCheckFileStatus() {
|
||||
log.info("开始批量查询文件状态");
|
||||
caseKnowledgeService.batchCheckFileStatus();
|
||||
log.info("结束批量查询文件状态");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package com.xboe.module.boecase.task;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* 旧案例上传
|
||||
*/
|
||||
@Component
|
||||
@Slf4j
|
||||
public class CaseUploadTask {
|
||||
}
|
||||
@@ -119,6 +119,8 @@ xboe:
|
||||
ai-api-code: 30800
|
||||
case-knowledge-id: de2e006e-82fb-4ace-8813-f25c316be4ff
|
||||
file-upload-callback-url: http://10.251.186.27:9090/xboe/m/boe/caseDocumentLog/uploadCallback
|
||||
use-white-list: true
|
||||
white-user-code-list: 00004409
|
||||
jasypt:
|
||||
encryptor:
|
||||
algorithm: PBEWithMD5AndDES
|
||||
|
||||
Reference in New Issue
Block a user