diff --git a/servers/boe-server-all/src/main/java/com/xboe/enums/CaseDocumentLogRunStatusEnum.java b/servers/boe-server-all/src/main/java/com/xboe/enums/CaseDocumentLogRunStatusEnum.java new file mode 100644 index 00000000..47b7553b --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/enums/CaseDocumentLogRunStatusEnum.java @@ -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; + } +} \ No newline at end of file diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/entity/CaseDocumentLog.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/entity/CaseDocumentLog.java index f072205e..bbe9ba83 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/entity/CaseDocumentLog.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/entity/CaseDocumentLog.java @@ -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-调用失败 diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/properties/CaseAiProperties.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/properties/CaseAiProperties.java index cba2be47..77ba2ee5 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/properties/CaseAiProperties.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/properties/CaseAiProperties.java @@ -37,6 +37,11 @@ public class CaseAiProperties { */ private String caseKnowledgeId; + /** + * 文件上传是否使用回调接口 + */ + private boolean fileUploadUseCallback; + /** * 文档上传回调接口地址 */ diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/ICaseKnowledgeService.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/ICaseKnowledgeService.java index 68d3f591..f2159e81 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/ICaseKnowledgeService.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/ICaseKnowledgeService.java @@ -38,4 +38,9 @@ public interface ICaseKnowledgeService { * @return 是否处理成功 */ boolean handleUploadCallback(String taskId, String message, String fileStatus); + + /** + * 批量检查文件状态 + */ + void batchCheckFileStatus(); } diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CaseDocumentLogServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CaseDocumentLogServiceImpl.java index 7b62906a..e4d20e0c 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CaseDocumentLogServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CaseDocumentLogServiceImpl.java @@ -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 pageQuery(int pageIndex, int pageSize, CaseDocumentLogQueryDto queryDto) { // 构建查询条件 List 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 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 logsToDelete = caseDocumentLogDao.getGenericDao() @@ -273,8 +276,6 @@ public class CaseDocumentLogServiceImpl implements ICaseDocumentLogService { return ""; } switch (optStatus) { - case 0: - return "调用中"; case 1: return "调用成功"; case 2: 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 2025d22f..b550e72c 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 @@ -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 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 + List 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 runningLogs) { + try { + com.alibaba.fastjson.JSONArray dataArray = result.getJSONArray("data"); + if (dataArray == null || dataArray.isEmpty()) { + log.warn("文件状态接口返回的data为空"); + return; + } + + // 创建taskId到状态的映射 + java.util.Map 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); diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/task/CaseDocumentLogTask.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/task/CaseDocumentLogTask.java new file mode 100644 index 00000000..a6fafbe6 --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/task/CaseDocumentLogTask.java @@ -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("结束批量查询文件状态"); + } +} diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/task/CaseUploadTask.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/task/CaseUploadTask.java new file mode 100644 index 00000000..3239922b --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/task/CaseUploadTask.java @@ -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 { +} diff --git a/servers/boe-server-all/src/main/resources/application-test.yml b/servers/boe-server-all/src/main/resources/application-test.yml index 618ca2b5..8f58426f 100644 --- a/servers/boe-server-all/src/main/resources/application-test.yml +++ b/servers/boe-server-all/src/main/resources/application-test.yml @@ -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