chore: initialize qiming workspace repository
This commit is contained in:
@@ -0,0 +1,99 @@
|
||||
package com.xspaceagi.log.web.controller;
|
||||
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.xspaceagi.log.sdk.request.DocumentSearchRequest;
|
||||
import com.xspaceagi.log.sdk.service.ISearchRpcService;
|
||||
import com.xspaceagi.log.sdk.vo.LogDocument;
|
||||
import com.xspaceagi.log.sdk.vo.SearchResult;
|
||||
import com.xspaceagi.log.web.controller.base.BaseController;
|
||||
import com.xspaceagi.log.web.controller.dto.LogDetailQueryDto;
|
||||
import com.xspaceagi.log.web.controller.dto.LogQueryDto;
|
||||
import com.xspaceagi.system.sdk.permission.SpacePermissionService;
|
||||
import com.xspaceagi.system.spec.annotation.RequireResource;
|
||||
import com.xspaceagi.system.spec.common.RequestContext;
|
||||
import com.xspaceagi.system.spec.dto.ReqResult;
|
||||
import com.xspaceagi.system.spec.page.PageQueryVo;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import jakarta.annotation.Resource;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMethod;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import static com.xspaceagi.system.spec.enums.ResourceEnum.SPACE_LOG_QUERY_DETAIL;
|
||||
import static com.xspaceagi.system.spec.enums.ResourceEnum.SPACE_LOG_QUERY_LIST;
|
||||
|
||||
@Tag(name = "日志平台-搜索接口")
|
||||
@RestController
|
||||
@RequestMapping("/api/requestLogs")
|
||||
@Slf4j
|
||||
public class LogQueryController extends BaseController {
|
||||
|
||||
@Resource
|
||||
private ISearchRpcService iSearchRpcService;
|
||||
|
||||
@Resource
|
||||
private SpacePermissionService spacePermissionService;
|
||||
|
||||
@RequireResource(SPACE_LOG_QUERY_LIST)
|
||||
@Operation(summary = "统一日志查询(工作空间)")
|
||||
@RequestMapping(path = "/list", method = RequestMethod.POST)
|
||||
public ReqResult<IPage<LogDocument>> search(@RequestBody PageQueryVo<LogQueryDto> pageQueryVo) {
|
||||
var filter = pageQueryVo.getQueryFilter();
|
||||
if (filter == null) {
|
||||
return ReqResult.error("查询条件不能为空");
|
||||
}
|
||||
if (filter.getSpaceId() == null) {
|
||||
return ReqResult.error("空间ID不能为空");
|
||||
}
|
||||
|
||||
spacePermissionService.checkSpaceUserPermission(filter.getSpaceId());
|
||||
return search0(pageQueryVo);
|
||||
}
|
||||
|
||||
@Operation(summary = "统一日志查询(API调用)")
|
||||
@RequestMapping(path = "/apikey/list", method = RequestMethod.POST)
|
||||
public ReqResult<IPage<LogDocument>> apiInvokeSearch(@RequestBody PageQueryVo<LogQueryDto> pageQueryVo) {
|
||||
var filter = pageQueryVo.getQueryFilter();
|
||||
if (filter == null) {
|
||||
pageQueryVo.setQueryFilter(new LogQueryDto());
|
||||
filter = pageQueryVo.getQueryFilter();
|
||||
}
|
||||
filter.setTargetType("ApiKey");
|
||||
filter.setUserId(RequestContext.get().getUserId());
|
||||
return search0(pageQueryVo);
|
||||
}
|
||||
|
||||
|
||||
@RequireResource(SPACE_LOG_QUERY_DETAIL)
|
||||
@Operation(summary = "日志详情")
|
||||
@RequestMapping(path = "/detail", method = RequestMethod.POST)
|
||||
public ReqResult<LogDocument> detail(@RequestBody LogDetailQueryDto logDetailQueryDto) {
|
||||
|
||||
DocumentSearchRequest.DocumentSearchRequestBuilder builder = DocumentSearchRequest.builder();
|
||||
builder.searchDocumentClazz(LogDocument.class);
|
||||
List<Map<String, Object>> filterFieldsAndValues = new ArrayList<>();
|
||||
builder.filterFieldsAndValues(filterFieldsAndValues);
|
||||
if (StringUtils.isNoneBlank(logDetailQueryDto.getId())) {
|
||||
filterFieldsAndValues.add(Map.of("id", logDetailQueryDto.getId()));
|
||||
}
|
||||
|
||||
SearchResult search = iSearchRpcService.search(builder.build());
|
||||
LogDocument logDocument = search.getItems().stream().map(item -> (LogDocument) item.getDocument()).findFirst().orElse(null);
|
||||
if (logDocument == null) {
|
||||
return ReqResult.error("日志不存在");
|
||||
}
|
||||
if (!RequestContext.get().getUserId().equals(logDocument.getUserId())) {
|
||||
spacePermissionService.checkSpaceUserPermission(logDocument.getSpaceId());
|
||||
}
|
||||
return ReqResult.success(logDocument);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
package com.xspaceagi.log.web.controller;
|
||||
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.xspaceagi.log.sdk.request.DocumentSearchRequest;
|
||||
import com.xspaceagi.log.sdk.service.ISearchRpcService;
|
||||
import com.xspaceagi.log.sdk.vo.LogDocument;
|
||||
import com.xspaceagi.log.sdk.vo.SearchResult;
|
||||
import com.xspaceagi.log.web.controller.base.BaseController;
|
||||
import com.xspaceagi.log.web.controller.dto.LogDetailQueryDto;
|
||||
import com.xspaceagi.log.web.controller.dto.LogQueryDto;
|
||||
import com.xspaceagi.system.spec.annotation.RequireResource;
|
||||
import com.xspaceagi.system.spec.common.RequestContext;
|
||||
import com.xspaceagi.system.spec.dto.ReqResult;
|
||||
import com.xspaceagi.system.spec.exception.LogPlatformException;
|
||||
import com.xspaceagi.system.spec.page.PageQueryVo;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import jakarta.annotation.Resource;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMethod;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static com.xspaceagi.system.spec.enums.ResourceEnum.SYSTEM_RUNNING_LOG_QUERY_DETAIL;
|
||||
import static com.xspaceagi.system.spec.enums.ResourceEnum.SYSTEM_RUNNING_LOG_QUERY_LIST;
|
||||
|
||||
@Tag(name = "日志平台管理端-搜索接口")
|
||||
@RestController
|
||||
@RequestMapping("/api/system/requestLogs")
|
||||
@Slf4j
|
||||
public class LogQueryManController extends BaseController {
|
||||
|
||||
@Resource
|
||||
private ISearchRpcService iSearchRpcService;
|
||||
|
||||
@RequireResource({SYSTEM_RUNNING_LOG_QUERY_LIST})
|
||||
@Operation(summary = "统一日志查询")
|
||||
@RequestMapping(path = "/list", method = RequestMethod.POST)
|
||||
public ReqResult<IPage<LogDocument>> search(@RequestBody PageQueryVo<LogQueryDto> pageQueryVo) {
|
||||
return search0(pageQueryVo);
|
||||
}
|
||||
|
||||
@RequireResource({SYSTEM_RUNNING_LOG_QUERY_DETAIL})
|
||||
@Operation(summary = "日志详情")
|
||||
@RequestMapping(path = "/detail", method = RequestMethod.POST)
|
||||
public ReqResult<LogDocument> detail(@RequestBody LogDetailQueryDto logDetailQueryDto) {
|
||||
|
||||
DocumentSearchRequest.DocumentSearchRequestBuilder builder = DocumentSearchRequest.builder();
|
||||
builder.searchDocumentClazz(LogDocument.class);
|
||||
List<Map<String, Object>> filterFieldsAndValues = new ArrayList<>();
|
||||
builder.filterFieldsAndValues(filterFieldsAndValues);
|
||||
if (StringUtils.isNoneBlank(logDetailQueryDto.getId())) {
|
||||
filterFieldsAndValues.add(Map.of("id", logDetailQueryDto.getId()));
|
||||
}
|
||||
|
||||
SearchResult search = iSearchRpcService.search(builder.build());
|
||||
LogDocument logDocument = search.getItems().stream().map(item -> (LogDocument) item.getDocument()).findFirst().orElse(null);
|
||||
if (logDocument == null) {
|
||||
return ReqResult.error("日志不存在");
|
||||
}
|
||||
return ReqResult.success(logDocument);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,116 @@
|
||||
package com.xspaceagi.log.web.controller;
|
||||
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.xspaceagi.domain.model.AgentLogModel;
|
||||
import com.xspaceagi.domain.model.valueobj.AgentLogSearchParams;
|
||||
import com.xspaceagi.log.app.service.LogPlatformApplicationService;
|
||||
import com.xspaceagi.log.sdk.request.AgentLogDetailParamsRequest;
|
||||
import com.xspaceagi.log.web.controller.base.BaseController;
|
||||
import com.xspaceagi.log.web.controller.dto.AgentLogSearchParamsRequest;
|
||||
import com.xspaceagi.system.sdk.operate.ActionType;
|
||||
import com.xspaceagi.system.sdk.operate.OperationLogReporter;
|
||||
import com.xspaceagi.system.sdk.operate.SystemEnum;
|
||||
import com.xspaceagi.system.spec.dto.ReqResult;
|
||||
import com.xspaceagi.system.spec.exception.LogPlatformException;
|
||||
import com.xspaceagi.system.spec.page.PageQueryVo;
|
||||
import com.xspaceagi.system.application.service.SpaceApplicationService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import jakarta.annotation.Resource;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMethod;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
@Tag(name = "日志平台-搜索接口")
|
||||
@RestController
|
||||
@RequestMapping("/api/logPlatform/agent")
|
||||
@Slf4j
|
||||
public class LogSearchController extends BaseController {
|
||||
|
||||
@Resource
|
||||
private SpaceApplicationService spaceApplicationService;
|
||||
|
||||
@Resource
|
||||
private LogPlatformApplicationService logPlatformApplicationService;
|
||||
|
||||
@OperationLogReporter(actionType = ActionType.QUERY, action = "数据列表查询", objectName = "智能体日志", systemCode = SystemEnum.LOG_PLATFORM)
|
||||
@Operation(summary = "日志查询")
|
||||
@RequestMapping(path = "/list", method = RequestMethod.POST)
|
||||
public ReqResult<IPage<AgentLogModel>> search(
|
||||
@RequestBody PageQueryVo<AgentLogSearchParamsRequest> pageQueryVo) {
|
||||
var userContext = this.getUser();
|
||||
var userId = userContext.getUserId();
|
||||
|
||||
var filter = pageQueryVo.getQueryFilter();
|
||||
if (filter == null) {
|
||||
return ReqResult.error("查询条件不能为空");
|
||||
}
|
||||
|
||||
// 查询用户有权限的空间,限制访问空间
|
||||
var spaceList = this.spaceApplicationService.queryListByUserId(userId);
|
||||
var authSpaceIds = spaceList.stream().map(space -> String.valueOf(space.getId())).toList();
|
||||
|
||||
var tenantId = userContext.getTenantId();
|
||||
|
||||
// 转换前端请求为领域模型
|
||||
AgentLogSearchParams searchParams = AgentLogSearchParamsRequest.convertFrom(filter);
|
||||
|
||||
// 设置租户ID(从用户上下文获取)
|
||||
searchParams.setTenantId(tenantId.toString());
|
||||
searchParams.setSpaceId(authSpaceIds);
|
||||
|
||||
try {
|
||||
// 使用 logPlatformApplicationService 接口查询日志
|
||||
IPage<AgentLogModel> result = logPlatformApplicationService.searchAgentLogs(
|
||||
searchParams,
|
||||
pageQueryVo.getCurrent(),
|
||||
pageQueryVo.getPageSize());
|
||||
|
||||
return ReqResult.success(result);
|
||||
} catch (LogPlatformException e) {
|
||||
log.error("Log search failed: {}", e.getMessage(), e);
|
||||
return ReqResult.error(e.getCode(), e.getMessage());
|
||||
} catch (Exception e) {
|
||||
log.error("Unknown error during log search", e);
|
||||
return ReqResult.error("日志搜索发生未知错误: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@OperationLogReporter(actionType = ActionType.QUERY, action = "数据列表查询", objectName = "智能体日志", systemCode = SystemEnum.LOG_PLATFORM)
|
||||
@Operation(summary = "日志详情")
|
||||
@RequestMapping(path = "/detail", method = RequestMethod.POST)
|
||||
public ReqResult<AgentLogModel> detail(
|
||||
@RequestBody AgentLogDetailParamsRequest request) {
|
||||
var userContext = this.getUser();
|
||||
var userId = userContext.getUserId();
|
||||
|
||||
// 查询用户有权限的空间,限制访问空间
|
||||
var spaceList = this.spaceApplicationService.queryListByUserId(userId);
|
||||
var authSpaceIds = spaceList.stream().map(space -> String.valueOf(space.getId())).toList();
|
||||
|
||||
var tenantId = userContext.getTenantId();
|
||||
|
||||
// 转换前端请求为领域模型
|
||||
AgentLogSearchParams searchParams = AgentLogSearchParamsRequest.convertFrom(request);
|
||||
|
||||
// 设置租户ID(从用户上下文获取)
|
||||
searchParams.setTenantId(tenantId.toString());
|
||||
searchParams.setSpaceId(authSpaceIds);
|
||||
|
||||
try {
|
||||
// 使用 logPlatformApplicationService 接口查询日志
|
||||
AgentLogModel result = logPlatformApplicationService.queryOneAgentLog(searchParams);
|
||||
|
||||
return ReqResult.success(result);
|
||||
} catch (LogPlatformException e) {
|
||||
log.error("日志详情失败: {}", e.getMessage(), e);
|
||||
return ReqResult.error(e.getCode(), e.getMessage());
|
||||
} catch (Exception e) {
|
||||
log.error("Unknown error while loading log detail", e);
|
||||
return ReqResult.error("日志搜索发生未知错误: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,149 @@
|
||||
package com.xspaceagi.log.web.controller.base;
|
||||
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.xspaceagi.log.sdk.request.DocumentSearchRequest;
|
||||
import com.xspaceagi.log.sdk.service.ISearchRpcService;
|
||||
import com.xspaceagi.log.sdk.vo.LogDocument;
|
||||
import com.xspaceagi.log.web.controller.dto.LogQueryDto;
|
||||
import com.xspaceagi.system.spec.common.RequestContext;
|
||||
import com.xspaceagi.system.spec.common.UserContext;
|
||||
import com.xspaceagi.system.application.dto.UserDto;
|
||||
import com.xspaceagi.system.infra.dao.entity.User;
|
||||
import com.xspaceagi.system.spec.dto.ReqResult;
|
||||
import com.xspaceagi.system.spec.exception.LogPlatformException;
|
||||
import com.xspaceagi.system.spec.page.PageQueryVo;
|
||||
import jakarta.annotation.Resource;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Slf4j
|
||||
public abstract class BaseController {
|
||||
|
||||
@Resource
|
||||
private ISearchRpcService iSearchRpcService;
|
||||
|
||||
/**
|
||||
* 获取当前登录用户信息
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public UserContext getUser() {
|
||||
var userDto = (UserDto) RequestContext.get().getUser();
|
||||
return UserContext.builder()
|
||||
.userId(userDto.getId())
|
||||
.userName(userDto.getUserName())
|
||||
.nickName(userDto.getNickName())
|
||||
.email(userDto.getEmail())
|
||||
.phone(userDto.getPhone())
|
||||
.status(userDto.getStatus() == User.Status.Enabled ? 1 : -1)
|
||||
.tenantId(userDto.getTenantId())
|
||||
.tenantName(null)
|
||||
.orgId(null)
|
||||
.orgName(null)
|
||||
.roleType(null)
|
||||
.build();
|
||||
}
|
||||
|
||||
|
||||
protected ReqResult<IPage<LogDocument>> search0(@RequestBody PageQueryVo<LogQueryDto> pageQueryVo) {
|
||||
var filter = pageQueryVo.getQueryFilter();
|
||||
if (filter == null) {
|
||||
filter = new LogQueryDto();
|
||||
}
|
||||
if (pageQueryVo.getPageSize() == null || pageQueryVo.getPageSize() <= 0) {
|
||||
pageQueryVo.setPageSize(10L);
|
||||
}
|
||||
if (pageQueryVo.getCurrent() == null || pageQueryVo.getCurrent() <= 0) {
|
||||
pageQueryVo.setCurrent(1L);
|
||||
}
|
||||
// 避免到最后一页报错
|
||||
if (pageQueryVo.getCurrent() * pageQueryVo.getPageSize() > 10000) {
|
||||
pageQueryVo.setCurrent(pageQueryVo.getCurrent() - 1);
|
||||
}
|
||||
DocumentSearchRequest.DocumentSearchRequestBuilder builder = DocumentSearchRequest.builder();
|
||||
builder.searchDocumentClazz(LogDocument.class);
|
||||
builder.from((int) (pageQueryVo.getPageSize() * (pageQueryVo.getCurrent() - 1)));
|
||||
builder.size(pageQueryVo.getPageSize().intValue());
|
||||
List<Map<String, Object>> filterFieldsAndValues = new ArrayList<>();
|
||||
builder.filterFieldsAndValues(filterFieldsAndValues);
|
||||
filterFieldsAndValues.add(Map.of("tenantId", RequestContext.get().getTenantId()));
|
||||
if (StringUtils.isNoneBlank(filter.getInput())) {
|
||||
filterFieldsAndValues.add(Map.of("input", Map.of("express", "match", "query", filter.getInput())));
|
||||
}
|
||||
if (StringUtils.isNoneBlank(filter.getOutput())) {
|
||||
filterFieldsAndValues.add(Map.of("output", Map.of("express", "match", "query", filter.getOutput())));
|
||||
}
|
||||
if (StringUtils.isNoneBlank(filter.getProcessData())) {
|
||||
filterFieldsAndValues.add(Map.of("processData", filter.getProcessData()));
|
||||
}
|
||||
if (StringUtils.isNoneBlank(filter.getRequestId())) {
|
||||
filterFieldsAndValues.add(Map.of("requestId", filter.getRequestId()));
|
||||
}
|
||||
if (StringUtils.isNoneBlank(filter.getResultCode())) {
|
||||
filterFieldsAndValues.add(Map.of("resultCode", filter.getResultCode()));
|
||||
}
|
||||
if (StringUtils.isNoneBlank(filter.getConversationId())) {
|
||||
filterFieldsAndValues.add(Map.of("conversationId", filter.getConversationId()));
|
||||
}
|
||||
if (StringUtils.isNoneBlank(filter.getTargetId())) {
|
||||
filterFieldsAndValues.add(Map.of("targetId", filter.getTargetId()));
|
||||
}
|
||||
if (StringUtils.isNoneBlank(filter.getTargetName())) {
|
||||
filterFieldsAndValues.add(Map.of("targetName", filter.getTargetName()));
|
||||
}
|
||||
if (StringUtils.isNoneBlank(filter.getTargetType())) {
|
||||
filterFieldsAndValues.add(Map.of("targetType", filter.getTargetType()));
|
||||
}
|
||||
if (StringUtils.isNoneBlank(filter.getUserName())) {
|
||||
filterFieldsAndValues.add(Map.of("userName", filter.getUserName()));
|
||||
}
|
||||
if (StringUtils.isNoneBlank(filter.getFrom())) {
|
||||
filterFieldsAndValues.add(Map.of("from", filter.getFrom()));
|
||||
}
|
||||
if (filter.getUserId() != null) {
|
||||
filterFieldsAndValues.add(Map.of("userId", filter.getUserId()));
|
||||
}
|
||||
if (filter.getSpaceId() != null) {
|
||||
filterFieldsAndValues.add(Map.of("spaceId", filter.getSpaceId()));
|
||||
}
|
||||
Map<String, Object> createTimeRange = new HashMap<>();
|
||||
if (filter.getCreateTimeGt() != null) {
|
||||
createTimeRange.put("gt", filter.getCreateTimeGt());
|
||||
}
|
||||
if (filter.getCreateTimeLt() != null) {
|
||||
createTimeRange.put("lt", filter.getCreateTimeLt());
|
||||
}
|
||||
if (!createTimeRange.isEmpty()) {
|
||||
createTimeRange.put("express", "range");
|
||||
filterFieldsAndValues.add(Map.of("createTime", createTimeRange));
|
||||
}
|
||||
builder.sortFieldsAndValues(Map.of("createTime", "Desc"));
|
||||
var result = iSearchRpcService.search(builder.build());
|
||||
|
||||
try {
|
||||
IPage<LogDocument> page = new Page<>(pageQueryVo.getCurrent().intValue(), pageQueryVo.getPageSize().intValue());
|
||||
page.setTotal(result.getTotal());
|
||||
page.setRecords(result.getItems().stream().map(item -> {
|
||||
LogDocument document = (LogDocument) item.getDocument();
|
||||
document.setProcessData(null);
|
||||
return document;
|
||||
}).collect(Collectors.toList()));
|
||||
return ReqResult.success(page);
|
||||
} catch (LogPlatformException e) {
|
||||
log.error("Log search failed: {}", e.getMessage(), e);
|
||||
return ReqResult.error(e.getCode(), e.getMessage());
|
||||
} catch (Exception e) {
|
||||
log.error("Unknown error during log search", e);
|
||||
return ReqResult.error("日志搜索发生未知错误: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,173 @@
|
||||
package com.xspaceagi.log.web.controller.dto;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
||||
import com.xspaceagi.domain.model.valueobj.AgentLogSearchParams;
|
||||
import com.xspaceagi.log.sdk.request.AgentLogDetailParamsRequest;
|
||||
import com.xspaceagi.log.spec.FlexibleDateTimeDeserializer;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 日志搜索请求参数
|
||||
* 对应 Rust 的 AgentLogSearchParams 结构
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class AgentLogSearchParamsRequest {
|
||||
|
||||
/**
|
||||
* 请求ID
|
||||
*/
|
||||
@Schema(description = "请求ID")
|
||||
private String requestId;
|
||||
|
||||
/**
|
||||
* 消息ID
|
||||
*/
|
||||
@Schema(description = "消息ID")
|
||||
private String messageId;
|
||||
|
||||
/**
|
||||
* 智能体ID
|
||||
*/
|
||||
@Schema(description = "智能体ID")
|
||||
private String agentId;
|
||||
|
||||
/**
|
||||
* 会话ID
|
||||
*/
|
||||
@Schema(description = "会话ID")
|
||||
private String conversationId;
|
||||
|
||||
/**
|
||||
* 用户UID
|
||||
*/
|
||||
@Schema(description = "用户UID")
|
||||
private String userUid;
|
||||
|
||||
/**
|
||||
* 用户输入,需要支持全文检索,支持多个关键字(AND关系)
|
||||
*/
|
||||
@Schema(description = "用户输入,需要支持全文检索,支持多个关键字(AND关系)")
|
||||
private List<String> userInput;
|
||||
|
||||
/**
|
||||
* 系统输出,需要支持全文检索,支持多个关键字(AND关系)
|
||||
*/
|
||||
@Schema(description = "系统输出,需要支持全文检索,支持多个关键字(AND关系)")
|
||||
private List<String> output;
|
||||
|
||||
/**
|
||||
* 开始时间
|
||||
*/
|
||||
@Schema(description = "开始时间,支持RFC 3339格式,例如:2024-05-15T10:30:00Z")
|
||||
@JsonDeserialize(using = FlexibleDateTimeDeserializer.class)
|
||||
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss'Z'", shape = JsonFormat.Shape.STRING)
|
||||
private LocalDateTime startTime;
|
||||
|
||||
/**
|
||||
* 结束时间
|
||||
*/
|
||||
@Schema(description = "结束时间,支持RFC 3339格式,例如:2024-05-15T10:30:00Z")
|
||||
@JsonDeserialize(using = FlexibleDateTimeDeserializer.class)
|
||||
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss'Z'", shape = JsonFormat.Shape.STRING)
|
||||
private LocalDateTime endTime;
|
||||
|
||||
/**
|
||||
* 租户ID,用于租户隔离,确保只查询特定租户的日志
|
||||
*/
|
||||
@Schema(description = "租户ID,用于租户隔离,确保只查询特定租户的日志")
|
||||
private String tenantId;
|
||||
|
||||
/**
|
||||
* 空间ID,可选,用于查询特定空间的日志,支持多个ID(OR关系)
|
||||
*/
|
||||
@Schema(description = "空间ID,可选,用于查询特定空间的日志,支持多个ID(OR关系)")
|
||||
private List<String> spaceId;
|
||||
|
||||
public static AgentLogSearchParams convertFrom(AgentLogSearchParamsRequest request) {
|
||||
if (request == null) {
|
||||
return null;
|
||||
}
|
||||
// request 处理下面的String字段的2边的空白,使用trim(),如果不为空的话
|
||||
if (request.getRequestId() != null) {
|
||||
request.setRequestId(request.getRequestId().trim());
|
||||
}
|
||||
if (request.getMessageId() != null) {
|
||||
request.setMessageId(request.getMessageId().trim());
|
||||
}
|
||||
if (request.getAgentId() != null) {
|
||||
request.setAgentId(request.getAgentId().trim());
|
||||
}
|
||||
if (request.getConversationId() != null) {
|
||||
request.setConversationId(request.getConversationId().trim());
|
||||
}
|
||||
if (request.getUserUid() != null) {
|
||||
request.setUserUid(request.getUserUid().trim());
|
||||
}
|
||||
if (request.getTenantId() != null) {
|
||||
request.setTenantId(request.getTenantId().trim());
|
||||
}
|
||||
if (request.getSpaceId() != null) {
|
||||
var spaceId = request.getSpaceId().stream().map(item -> {
|
||||
if (item != null) {
|
||||
item = item.trim();
|
||||
}
|
||||
return item;
|
||||
}).toList();
|
||||
request.setSpaceId(spaceId);
|
||||
}
|
||||
if (request.getUserInput() != null) {
|
||||
var userInput = request.getUserInput().stream().map(item -> {
|
||||
if (item != null) {
|
||||
item = item.trim();
|
||||
}
|
||||
return item;
|
||||
}).toList();
|
||||
request.setUserInput(userInput);
|
||||
}
|
||||
if (request.getOutput() != null) {
|
||||
var output = request.getOutput().stream().map(item -> {
|
||||
if (item != null) {
|
||||
item = item.trim();
|
||||
}
|
||||
return item;
|
||||
}).toList();
|
||||
request.setOutput(output);
|
||||
}
|
||||
return AgentLogSearchParams.builder()
|
||||
.requestId(request.getRequestId())
|
||||
.messageId(request.getMessageId())
|
||||
.agentId(request.getAgentId())
|
||||
.conversationId(request.getConversationId())
|
||||
.userUid(request.getUserUid())
|
||||
.tenantId(request.getTenantId())
|
||||
.spaceId(request.getSpaceId())
|
||||
.userInput(request.getUserInput())
|
||||
.output(request.getOutput())
|
||||
.startTime(request.getStartTime())
|
||||
.endTime(request.getEndTime())
|
||||
.build();
|
||||
}
|
||||
|
||||
public static AgentLogSearchParams convertFrom(AgentLogDetailParamsRequest request) {
|
||||
return AgentLogSearchParams.builder()
|
||||
.requestId(request.getRequestId())
|
||||
.messageId(null)
|
||||
.agentId(request.getAgentId())
|
||||
.conversationId(null)
|
||||
.userUid(null)
|
||||
.tenantId(null)
|
||||
.spaceId(null)
|
||||
.build();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package com.xspaceagi.log.web.controller.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class LogDetailQueryDto {
|
||||
private String id;
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
package com.xspaceagi.log.web.controller.dto;
|
||||
|
||||
import com.xspaceagi.log.sdk.annotation.SearchField;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class LogQueryDto {
|
||||
@Schema(description = "请求唯一标识可以用于关联一次请求中所有相关的操作")
|
||||
@SearchField(keyword = true)
|
||||
private String requestId;
|
||||
|
||||
@Schema(description = "日志产生对象所在的空间ID")
|
||||
private Long spaceId;
|
||||
|
||||
@Schema(description = "请求发起的用户ID")
|
||||
private Long userId;
|
||||
|
||||
@Schema(description = "用户名")
|
||||
@SearchField(keyword = true)
|
||||
private String userName;
|
||||
|
||||
@Schema(description = "日志对象类型,Agent、Plugin、Workflow、Mcp")
|
||||
@SearchField(keyword = true)
|
||||
private String targetType;
|
||||
|
||||
@Schema(description = "日志对象名称")
|
||||
@SearchField(keyword = true)
|
||||
private String targetName;
|
||||
|
||||
@Schema(description = "日志对象ID")
|
||||
@SearchField(keyword = true)
|
||||
private String targetId;
|
||||
|
||||
@Schema(description = "会话ID")
|
||||
@SearchField(keyword = true)
|
||||
private String conversationId;
|
||||
|
||||
@Schema(description = "输入参数")
|
||||
@SearchField(store = true)
|
||||
private String input;
|
||||
|
||||
@Schema(description = "执行结果")
|
||||
@SearchField(store = true)
|
||||
private String output;
|
||||
|
||||
@Schema(description = "执行过程数据")
|
||||
@SearchField(store = true)
|
||||
private String processData;
|
||||
|
||||
@Schema(description = "执行结果码 0000为成功")
|
||||
@SearchField(keyword = true)
|
||||
private String resultCode;
|
||||
|
||||
@Schema(description = "日志产生时间(大于)")
|
||||
private Long createTimeGt;
|
||||
|
||||
@Schema(description = "日志产生时间(小于)")
|
||||
private Long createTimeLt;
|
||||
|
||||
@Schema(description = "日志产生来源,task_center 任务中心(从任务中心点击查看详情时带上该参数)")
|
||||
private String from;
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">
|
||||
<id>repack</id>
|
||||
<formats>
|
||||
<format>jar</format>
|
||||
</formats>
|
||||
|
||||
<includeBaseDirectory>false</includeBaseDirectory>
|
||||
<dependencySets>
|
||||
<dependencySet>
|
||||
<!--
|
||||
重新打包需要包含的jar包,这个过程会解压所有的jar包并按照jar的规则重新组合成一个jar包
|
||||
这里需要包含当前这个工程 ,格式是{groupId}:{artifactId}
|
||||
-->
|
||||
<includes>
|
||||
<!-- 包含项目自己 -->
|
||||
<include>com.xspaceagi:app-platform-log-web</include>
|
||||
<include>com.xspaceagi:app-platform-log-application</include>
|
||||
<include>com.xspaceagi:app-platform-log-domain</include>
|
||||
<include>com.xspaceagi:app-platform-log-infra</include>
|
||||
<include>com.xspaceagi:app-platform-log-spec</include>
|
||||
</includes>
|
||||
<!-- 打包结果目录:/ 表示target/ -->
|
||||
<outputDirectory>/</outputDirectory>
|
||||
<!-- 是否解压依赖 -->
|
||||
<unpack>true</unpack>
|
||||
<!-- 打包的scope -->
|
||||
<!-- <scope>system</scope>-->
|
||||
</dependencySet>
|
||||
</dependencySets>
|
||||
</assembly>
|
||||
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>app-platform-log-web</artifactId>
|
||||
<groupId>com.xspaceagi</groupId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>app-platform-log-web</artifactId>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
Reference in New Issue
Block a user