package com.ard.agent.controller; import com.ard.agent.service.KnowledgeBaseService; import com.ard.agent.service.RagChatService; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import reactor.core.publisher.Flux; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 知识库独立接口 * * @author lsy * @date 2026/5/11 */ @Slf4j @RestController @RequestMapping("/api/knowledge") public class knowledgeBaseController { @Resource private RagChatService ragChatService; @Resource private KnowledgeBaseService knowledgeBaseService; /** * 上传文档到知识库 */ @PostMapping("/upload") public ResponseEntity> uploadDocument(@RequestParam("file") MultipartFile file) { log.info("收到文档上传请求: {}", file.getOriginalFilename()); if (file.isEmpty()) { Map error = new HashMap<>(); error.put("success", false); error.put("message", "文件不能为空"); return ResponseEntity.badRequest().body(error); } Map result = knowledgeBaseService.uploadDocument(file); if (Boolean.TRUE.equals(result.get("success"))) { return ResponseEntity.ok(result); } else { return ResponseEntity.badRequest().body(result); } } /** * 批量上传文档 */ @PostMapping("/batch-upload") public ResponseEntity> batchUploadDocuments(@RequestParam("files") List files) { log.info("收到批量文档上传请求,共 {} 个文件", files.size()); Map batchResult = new HashMap<>(); List> results = new ArrayList<>(); int successCount = 0; int failCount = 0; for (MultipartFile file : files) { Map result = knowledgeBaseService.uploadDocument(file); results.add(result); if (Boolean.TRUE.equals(result.get("success"))) { successCount++; } else { failCount++; } } batchResult.put("total", files.size()); batchResult.put("success", successCount); batchResult.put("fail", failCount); batchResult.put("details", results); return ResponseEntity.ok(batchResult); } /** * 流式接口(新增) * 访问示例:/chat/stream?question=什么是Spring */ @GetMapping(value = "/chat/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux chatStream(@RequestParam("question") String question) { return ragChatService.chatStream(question); } }