DrugService.java 4.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package com.pharmacopoeia.service;
  2. import com.pharmacopoeia.dto.DrugDetailResponse;
  3. import com.pharmacopoeia.repository.DrugRepository;
  4. import org.springframework.data.domain.PageRequest;
  5. import org.springframework.stereotype.Service;
  6. import java.util.List;
  7. import java.util.Map;
  8. import java.util.stream.Collectors;
  9. @Service
  10. public class DrugService {
  11. private final DrugRepository drugRepository;
  12. public DrugService(DrugRepository drugRepository) {
  13. this.drugRepository = drugRepository;
  14. }
  15. public DrugDetailResponse getDrugDetail(String drugId) {
  16. return drugRepository.findByDrugId(drugId)
  17. .map(d -> DrugDetailResponse.builder()
  18. .id(d.getId())
  19. .drugId(d.getDrugId())
  20. .name(d.getName())
  21. .nameEn(d.getNameEn())
  22. .pinyin(d.getPinyin())
  23. .category(d.getCategory())
  24. .subcategory(d.getSubcategory())
  25. .approvalNumber(d.getApprovalNumber())
  26. .sections(d.getSections())
  27. .sourceVersion(d.getSourceVersion())
  28. .sourceVolume(d.getSourceVolume())
  29. .sourcePage(d.getSourcePage())
  30. .isActive(d.getIsActive())
  31. .createdAt(d.getCreatedAt())
  32. .updatedAt(d.getUpdatedAt())
  33. .build())
  34. .orElse(null);
  35. }
  36. public Map<String, Object> searchDrugs(String keyword, String category, int page, int pageSize) {
  37. var pageable = PageRequest.of(page - 1, pageSize);
  38. var result = (keyword != null && !keyword.isBlank())
  39. ? drugRepository.searchByKeyword(keyword, pageable)
  40. : (category != null && !category.isBlank())
  41. ? drugRepository.findByCategoryAndIsActiveTrue(category, pageable)
  42. : drugRepository.findByIsActiveTrue(pageable);
  43. var items = result.getContent().stream()
  44. .filter(d -> !"通则".equals(d.getCategory()) && !"凡例与纲要".equals(d.getCategory()))
  45. .map(d -> {
  46. Map<String, Object> m = new java.util.LinkedHashMap<>();
  47. m.put("drug_id", d.getDrugId());
  48. m.put("name", d.getName());
  49. m.put("name_en", d.getNameEn() != null ? d.getNameEn() : "");
  50. m.put("pinyin", d.getPinyin() != null ? d.getPinyin() : "");
  51. m.put("category", d.getCategory() != null ? d.getCategory() : "");
  52. m.put("subcategory", d.getSubcategory() != null ? d.getSubcategory() : "");
  53. m.put("source_version", d.getSourceVersion() != null ? d.getSourceVersion() : "");
  54. m.put("source_volume", d.getSourceVolume() != null ? d.getSourceVolume() : "");
  55. m.put("source_page", d.getSourcePage() != null ? d.getSourcePage() : "");
  56. m.put("is_active", d.getIsActive());
  57. return m;
  58. })
  59. .collect(Collectors.toList());
  60. return Map.of(
  61. "items", items,
  62. "total", result.getTotalElements(),
  63. "page", page,
  64. "page_size", pageSize,
  65. "total_pages", result.getTotalPages()
  66. );
  67. }
  68. public List<Map<String, Object>> getCategoryTree() {
  69. // 返回层次化分类树(与 Python 一致的格式)
  70. List<Object[]> pairs = drugRepository.findCategorySubcategoryPairs();
  71. Map<String, List<String>> tree = new java.util.LinkedHashMap<>();
  72. for (Object[] row : pairs) {
  73. String cat = (String) row[0];
  74. String sub = (String) row[1];
  75. tree.computeIfAbsent(cat, k -> new java.util.ArrayList<>());
  76. if (sub != null && !sub.isBlank() && !tree.get(cat).contains(sub)) {
  77. tree.get(cat).add(sub);
  78. }
  79. }
  80. return tree.entrySet().stream()
  81. .map(e -> Map.<String, Object>of("name", e.getKey(), "children", e.getValue()))
  82. .collect(Collectors.toList());
  83. }
  84. }