package com.ipsen.medical.controller; import com.ipsen.medical.dto.ApiResponse; import com.ipsen.medical.dto.ClinicalTrialDTO; import com.ipsen.medical.dto.DataSourceSelectionDTO; import com.ipsen.medical.dto.InquiryRequestDTO; import com.ipsen.medical.dto.KeywordConfirmationDTO; import com.ipsen.medical.service.AutoSearchService; import com.ipsen.medical.service.ClinicalTrialsService; import com.ipsen.medical.service.InquiryService; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.util.List; /** * 查询请求控制器 */ @RestController @RequestMapping("/inquiries") @RequiredArgsConstructor @CrossOrigin(origins = "*") public class InquiryController { private final InquiryService inquiryService; private final ClinicalTrialsService clinicalTrialsService; private final AutoSearchService autoSearchService; /** * 上传查询表格 */ @PostMapping("/upload") public ResponseEntity> uploadInquiry( @RequestParam("file") MultipartFile file) { InquiryRequestDTO result = inquiryService.uploadInquiry(file); return ResponseEntity.ok(ApiResponse.success(result)); } /** * 创建查询请求 */ @PostMapping public ResponseEntity> createInquiry( @RequestBody InquiryRequestDTO inquiryRequestDTO) { InquiryRequestDTO result = inquiryService.createInquiry(inquiryRequestDTO); return ResponseEntity.ok(ApiResponse.success(result)); } /** * 获取查询请求详情 */ @GetMapping("/{id}") public ResponseEntity> getInquiry(@PathVariable Long id) { InquiryRequestDTO result = inquiryService.getInquiry(id); return ResponseEntity.ok(ApiResponse.success(result)); } /** * 获取所有查询请求 */ @GetMapping public ResponseEntity>> getAllInquiries( @RequestParam(required = false) String status) { List results = inquiryService.getAllInquiries(status); return ResponseEntity.ok(ApiResponse.success(results)); } /** * 提取关键词 */ @PostMapping("/{id}/extract-keywords") public ResponseEntity> extractKeywords(@PathVariable Long id) { InquiryRequestDTO result = inquiryService.extractKeywords(id); return ResponseEntity.ok(ApiResponse.success(result)); } /** * 确认和更新关键词 */ @PostMapping("/{id}/confirm-keywords") public ResponseEntity> confirmKeywords( @PathVariable Long id, @RequestBody KeywordConfirmationDTO keywordDTO) { InquiryRequestDTO result = inquiryService.confirmKeywords(id, keywordDTO); return ResponseEntity.ok(ApiResponse.success(result)); } /** * 选择数据源 */ @PostMapping("/{id}/select-data-sources") public ResponseEntity> selectDataSources( @PathVariable Long id, @RequestBody DataSourceSelectionDTO dataSourceDTO) { InquiryRequestDTO result = inquiryService.selectDataSources(id, dataSourceDTO); return ResponseEntity.ok(ApiResponse.success(result)); } /** * 执行信息检索 */ @PostMapping("/{id}/search") public ResponseEntity> performSearch(@PathVariable Long id) { InquiryRequestDTO result = inquiryService.performSearch(id); return ResponseEntity.ok(ApiResponse.success(result)); } /** * 生成回复内容 */ @PostMapping("/{id}/generate-response") public ResponseEntity> generateResponse(@PathVariable Long id) { InquiryRequestDTO result = inquiryService.generateResponse(id); return ResponseEntity.ok(ApiResponse.success(result)); } /** * 审核回复 */ @PostMapping("/{id}/review") public ResponseEntity> reviewResponse( @PathVariable Long id, @RequestParam Boolean approved, @RequestParam(required = false) String comments) { InquiryRequestDTO result = inquiryService.reviewResponse(id, approved, comments); return ResponseEntity.ok(ApiResponse.success(result)); } /** * 完成查询请求 */ @PostMapping("/{id}/complete") public ResponseEntity> completeInquiry(@PathVariable Long id) { InquiryRequestDTO result = inquiryService.completeInquiry(id); return ResponseEntity.ok(ApiResponse.success(result)); } /** * 搜索临床试验 */ @PostMapping("/{id}/clinical-trials/search") public ResponseEntity>> searchClinicalTrials( @PathVariable Long id, @RequestParam String keyword) { List results = clinicalTrialsService.searchAndSaveForInquiry(id, keyword); return ResponseEntity.ok(ApiResponse.success(results)); } /** * 获取查询请求的临床试验列表 */ @GetMapping("/{id}/clinical-trials") public ResponseEntity>> getClinicalTrials(@PathVariable Long id) { List results = clinicalTrialsService.getClinicalTrialsByInquiry(id); return ResponseEntity.ok(ApiResponse.success(results)); } /** * 导出临床试验为CSV */ @GetMapping("/{id}/clinical-trials/export") public ResponseEntity exportClinicalTrialsToCsv(@PathVariable Long id) { byte[] csvData = clinicalTrialsService.exportToCsv(id); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.parseMediaType("text/csv")); headers.setContentDispositionFormData("attachment", "clinical_trials_" + id + ".csv"); return ResponseEntity.ok() .headers(headers) .body(csvData); } /** * 删除查询请求的临床试验数据 */ @DeleteMapping("/{id}/clinical-trials") public ResponseEntity> deleteClinicalTrials(@PathVariable Long id) { clinicalTrialsService.deleteClinicalTrials(id); return ResponseEntity.ok(ApiResponse.success(null)); } /** * 基于AI识别的关键词执行自动检索 * 包括:临床试验、文献数据库等 */ @PostMapping("/{id}/auto-search") public ResponseEntity> performAutoSearch(@PathVariable Long id) { InquiryRequestDTO result = autoSearchService.performAutoSearch(id); return ResponseEntity.ok(ApiResponse.success(result)); } /** * 执行完整的AI工作流 * 1. 提取关键词 * 2. 自动检索(临床试验、知识库) * 3. 生成回复 */ @PostMapping("/{id}/full-workflow") public ResponseEntity> executeFullWorkflow(@PathVariable Long id) { InquiryRequestDTO result = autoSearchService.executeFullWorkflow(id); return ResponseEntity.ok(ApiResponse.success(result)); } /** * 根据选中的检索结果生成下载任务 */ @PostMapping("/{id}/downloads") public ResponseEntity> generateDownloadTasks( @PathVariable Long id, @RequestBody List searchResultItemIds) { InquiryRequestDTO result = inquiryService.generateDownloadTasks(id, searchResultItemIds); return ResponseEntity.ok(ApiResponse.success(result)); } }