diff --git a/backend-single/src/main/java/com/emotion/controller/AiRoutingController.java b/backend-single/src/main/java/com/emotion/controller/AiRoutingController.java index 4ec9bc1..6c11e0c 100644 --- a/backend-single/src/main/java/com/emotion/controller/AiRoutingController.java +++ b/backend-single/src/main/java/com/emotion/controller/AiRoutingController.java @@ -1,8 +1,11 @@ package com.emotion.controller; import com.alibaba.fastjson2.JSONObject; +import com.emotion.common.PageResult; import com.emotion.common.Result; +import com.emotion.dto.request.ai.AiCallLogQueryRequest; import com.emotion.dto.request.ai.AiRuntimeRequest; +import javax.validation.Valid; import com.emotion.dto.response.ai.AiTestTemplateResponse; import com.emotion.dto.response.ai.AiRuntimeTestResponse; import com.emotion.dto.response.ai.AiStreamEvent; @@ -160,6 +163,12 @@ public class AiRoutingController { return Result.success(callLogService.latest(limit)); } + @Operation(summary = "分页查询调用日志", description = "分页查询 AI 调用日志,支持多条件筛选和关键词搜索。") + @PostMapping("/call-logs") + public Result> queryCallLogs(@RequestBody @Valid AiCallLogQueryRequest request) { + return Result.success(callLogService.query(request)); + } + @Operation(summary = "运行时测试", description = "对指定的 AI 配置进行运行时连通性测试,支持同步和流式模式。") @PostMapping("/runtime/test") public Result runtimeTest(@RequestBody JSONObject payload) { diff --git a/backend-single/src/main/java/com/emotion/service/AiCallLogService.java b/backend-single/src/main/java/com/emotion/service/AiCallLogService.java index 1268348..e63e615 100644 --- a/backend-single/src/main/java/com/emotion/service/AiCallLogService.java +++ b/backend-single/src/main/java/com/emotion/service/AiCallLogService.java @@ -3,9 +3,14 @@ package com.emotion.service; import com.baomidou.mybatisplus.extension.service.IService; import com.emotion.entity.AiCallLog; +import com.emotion.common.PageResult; +import com.emotion.dto.request.ai.AiCallLogQueryRequest; + import java.util.List; public interface AiCallLogService extends IService { List latest(Integer limit); + + PageResult query(AiCallLogQueryRequest request); } diff --git a/backend-single/src/main/java/com/emotion/service/impl/AiCallLogServiceImpl.java b/backend-single/src/main/java/com/emotion/service/impl/AiCallLogServiceImpl.java index ca92f5a..9582de4 100644 --- a/backend-single/src/main/java/com/emotion/service/impl/AiCallLogServiceImpl.java +++ b/backend-single/src/main/java/com/emotion/service/impl/AiCallLogServiceImpl.java @@ -1,10 +1,15 @@ package com.emotion.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.emotion.common.PageResult; +import com.emotion.dto.request.ai.AiCallLogQueryRequest; import com.emotion.entity.AiCallLog; import com.emotion.mapper.AiCallLogMapper; import com.emotion.service.AiCallLogService; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import java.util.List; @@ -20,4 +25,28 @@ public class AiCallLogServiceImpl extends ServiceImpl query(AiCallLogQueryRequest request) { + Page pageParam = new Page<>(request.getPageNum(), request.getPageSize()); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + + wrapper.eq(AiCallLog::getIsDeleted, 0) + .eq(StringUtils.isNotBlank(request.getStatus()), AiCallLog::getStatus, request.getStatus()) + .eq(StringUtils.isNotBlank(request.getSceneCode()), AiCallLog::getSceneCode, request.getSceneCode()) + .eq(StringUtils.isNotBlank(request.getProviderCode()), AiCallLog::getProviderCode, request.getProviderCode()) + .eq(StringUtils.isNotBlank(request.getEndpointCode()), AiCallLog::getEndpointCode, request.getEndpointCode()) + .ge(request.getStartTime() != null, AiCallLog::getCreateTime, request.getStartTime()) + .le(request.getEndTime() != null, AiCallLog::getCreateTime, request.getEndTime()) + .orderByDesc(AiCallLog::getCreateTime); + + if (StringUtils.isNotBlank(request.getKeyword())) { + wrapper.and(w -> w.like(AiCallLog::getInputText, request.getKeyword()) + .or() + .like(AiCallLog::getOutputText, request.getKeyword())); + } + + IPage page = page(pageParam, wrapper); + return PageResult.of(page); + } }