diff --git a/src/main/java/com/sampoom/backend/api/bom/repository/BomRepository.java b/src/main/java/com/sampoom/backend/api/bom/repository/BomRepository.java index 6e2e17d..dbbbda7 100644 --- a/src/main/java/com/sampoom/backend/api/bom/repository/BomRepository.java +++ b/src/main/java/com/sampoom/backend/api/bom/repository/BomRepository.java @@ -20,15 +20,16 @@ public interface BomRepository extends JpaRepository { JOIN p.partGroup g JOIN g.category c WHERE ( - COALESCE(:keyword, '') = '' + COALESCE(:keyword, '') = '' OR p.name ILIKE CONCAT('%', :keyword, '%') OR p.code ILIKE CONCAT('%', :keyword, '%') + OR b.bomCode ILIKE CONCAT('%', :keyword, '%') ) AND (:categoryId IS NULL OR c.id = :categoryId) AND (:groupId IS NULL OR g.id = :groupId) AND (:status IS NULL OR b.status = :status) AND (:complexity IS NULL OR b.complexity = :complexity) -ORDER BY b.createdAt DESC +ORDER BY b.bomCode ASC """) Page findByFilters( @Param("keyword") String keyword, diff --git a/src/main/java/com/sampoom/backend/api/bom/service/BomService.java b/src/main/java/com/sampoom/backend/api/bom/service/BomService.java index 0d2f979..ad7f7e9 100644 --- a/src/main/java/com/sampoom/backend/api/bom/service/BomService.java +++ b/src/main/java/com/sampoom/backend/api/bom/service/BomService.java @@ -149,7 +149,8 @@ public BomResponseDTO createBom(BomRequestDTO requestDTO) { @Transactional(readOnly = true) public PageResponseDTO getBoms(int page, int size) { - Pageable pageable = PageRequest.of(page, size, Sort.by(Sort.Direction.DESC, "createdAt")); + // BOM 코드 기준 오름차순 정렬 + Pageable pageable = PageRequest.of(page, size, Sort.by("bomCode").ascending()); Page bomPage = bomRepository.findAll(pageable); return PageResponseDTO.builder() @@ -318,7 +319,8 @@ public PageResponseDTO searchBoms( int page, int size ) { - Pageable pageable = PageRequest.of(page, size, Sort.by(Sort.Direction.DESC, "createdAt")); + // BOM 코드 기준 오름차순 정렬 + Pageable pageable = PageRequest.of(page, size, Sort.by("bomCode").ascending()); Page bomPage = bomRepository.findByFilters( keyword, categoryId, diff --git a/src/main/java/com/sampoom/backend/api/item/service/ItemService.java b/src/main/java/com/sampoom/backend/api/item/service/ItemService.java index 364fa79..1c698da 100644 --- a/src/main/java/com/sampoom/backend/api/item/service/ItemService.java +++ b/src/main/java/com/sampoom/backend/api/item/service/ItemService.java @@ -76,7 +76,7 @@ private PageResponseDTO convertMaterials(PageResponseDTO searchAllItems( String keyword, Long partCategoryId, @@ -85,17 +85,20 @@ private PageResponseDTO searchAllItems( int page, int size ) { - // 전체 데이터를 한 번에 가져와서 병합 후 페이지네이션 + // 각각 적절한 크기로 데이터 가져오기 (페이지 크기의 2배씩) + int fetchSize = size * 2; - // 부품 데이터를 모두 가져오기 (부품 관련 필터만 적용) - PageResponseDTO allParts = partService.searchParts(keyword, partCategoryId, partGroupId, 0, Integer.MAX_VALUE); - List partItems = allParts.getContent().stream() + // 부품 데이터 가져오기 + PageResponseDTO partResponse = partService.searchParts( + keyword, partCategoryId, partGroupId, 0, fetchSize); + List partItems = partResponse.getContent().stream() .map(ItemResponseDTO::ofPart) .toList(); - // 자재 데이터를 모두 가져오기 (자재 관련 필터만 적용) - PageResponseDTO allMaterials = materialService.searchMaterials(keyword, materialCategoryId, 0, Integer.MAX_VALUE); - List materialItems = allMaterials.getContent().stream() + // 자재 데이터 가져오기 + PageResponseDTO materialResponse = materialService.searchMaterials( + keyword, materialCategoryId, 0, fetchSize); + List materialItems = materialResponse.getContent().stream() .map(ItemResponseDTO::ofMaterial) .toList(); @@ -104,8 +107,18 @@ private PageResponseDTO searchAllItems( allItems.addAll(partItems); allItems.addAll(materialItems); - // 전체 개수 - long totalElements = allItems.size(); + // 코드순으로 정렬 (이미 각각은 정렬되어 있지만 병합 후 다시 정렬 필요) + allItems.sort((item1, item2) -> { + String code1 = item1.getCode(); + String code2 = item2.getCode(); + if (code1 == null && code2 == null) return 0; + if (code1 == null) return 1; + if (code2 == null) return -1; + return code1.compareTo(code2); + }); + + // 전체 개수 계산 (실제 DB에서 가져온 총 개수) + long totalElements = partResponse.getTotalElements() + materialResponse.getTotalElements(); int totalPages = (int) Math.ceil((double) totalElements / size); // 현재 페이지에 해당하는 데이터 추출 diff --git a/src/main/java/com/sampoom/backend/api/material/service/MaterialService.java b/src/main/java/com/sampoom/backend/api/material/service/MaterialService.java index 1626dcd..7b0fd7d 100644 --- a/src/main/java/com/sampoom/backend/api/material/service/MaterialService.java +++ b/src/main/java/com/sampoom/backend/api/material/service/MaterialService.java @@ -16,6 +16,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -250,15 +251,17 @@ public PageResponseDTO searchMaterials( int page, int size ) { - PageRequest pageable = PageRequest.of(page, size); + // 자재 코드순 정렬 추가 + PageRequest pageable = PageRequest.of(page, size, Sort.by("materialCode").ascending()); Page materials = materialRepository.findAll((root, query, cb) -> { List predicates = new ArrayList<>(); - // keyword + // keyword (대소문자 구분 없음) if (keyword != null && !keyword.isBlank()) { - Predicate nameLike = cb.like(root.get("name"), "%" + keyword + "%"); - Predicate codeLike = cb.like(root.get("materialCode"), "%" + keyword + "%"); + String lowerKeyword = "%" + keyword.toLowerCase() + "%"; + Predicate nameLike = cb.like(cb.lower(root.get("name")), lowerKeyword); + Predicate codeLike = cb.like(cb.lower(root.get("materialCode")), lowerKeyword); predicates.add(cb.or(nameLike, codeLike)); } diff --git a/src/main/java/com/sampoom/backend/api/part/service/PartService.java b/src/main/java/com/sampoom/backend/api/part/service/PartService.java index c8c55a0..2529ce4 100644 --- a/src/main/java/com/sampoom/backend/api/part/service/PartService.java +++ b/src/main/java/com/sampoom/backend/api/part/service/PartService.java @@ -21,6 +21,7 @@ import org.springframework.dao.DataIntegrityViolationException; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -308,7 +309,8 @@ public PageResponseDTO searchParts( int page, int size ) { - PageRequest pageable = PageRequest.of(page, size); + // 코드순 정렬 추가 + PageRequest pageable = PageRequest.of(page, size, Sort.by("code").ascending()); Page parts = partRepository.findAll((root, query, cb) -> { List predicates = new ArrayList<>(); @@ -316,10 +318,11 @@ public PageResponseDTO searchParts( // 상태 필터 predicates.add(cb.equal(root.get("status"), PartStatus.ACTIVE)); - // keyword 검색 + // keyword 검색 (대소문자 구분 없음) if (keyword != null && !keyword.isBlank()) { - Predicate nameLike = cb.like(root.get("name"), "%" + keyword + "%"); - Predicate codeLike = cb.like(root.get("code"), "%" + keyword + "%"); + String lowerKeyword = "%" + keyword.toLowerCase() + "%"; + Predicate nameLike = cb.like(cb.lower(root.get("name")), lowerKeyword); + Predicate codeLike = cb.like(cb.lower(root.get("code")), lowerKeyword); predicates.add(cb.or(nameLike, codeLike)); } diff --git a/src/main/java/com/sampoom/backend/api/process/service/ProcessService.java b/src/main/java/com/sampoom/backend/api/process/service/ProcessService.java index 171490a..4487c5d 100644 --- a/src/main/java/com/sampoom/backend/api/process/service/ProcessService.java +++ b/src/main/java/com/sampoom/backend/api/process/service/ProcessService.java @@ -102,7 +102,8 @@ public PageResponseDto search(String q, ProcessStatus status int safePage = Math.max(page, 0); int safeSize = Math.min(Math.max(size, 1), 100); - Pageable pageable = PageRequest.of(safePage, safeSize, Sort.by(Sort.Direction.DESC, "id")); + // 공정 코드 기준 오름차순 정렬 + Pageable pageable = PageRequest.of(safePage, safeSize, Sort.by("code").ascending()); String keyword = (q == null || q.isBlank()) ? null : q.trim(); Page result = processRepository.search(keyword, status, categoryId, groupId, pageable);