dev fix add count
Test Workflow / test (push) Has been cancelled

This commit is contained in:
2026-04-28 13:30:00 +07:00
parent b67fb403e6
commit cb01e24d87
4 changed files with 47 additions and 18 deletions
@@ -14,6 +14,12 @@ public class ViolationStatisticsResponse {
@JsonProperty("new_violations")
private long newViolations;
@JsonProperty("total_complaints")
private int totalComplaints;
@JsonProperty("total_law_cases")
private int totalLawCases;
@JsonProperty("in_progress_violations")
private long inProgressViolations;
@@ -41,6 +41,9 @@ public interface ComplaintEntityRepository extends JpaRepository<ComplaintEntity
""")
Long getComplaintsWithoutLawCaseCount();
@Query("SELECT COUNT(*) FROM ComplaintEntity c WHERE c.violation.id IN :violations")
int countComplaintByViolations(@Param("violations") List<Long> violations);
@Query("SELECT c FROM ComplaintEntity c WHERE c.email IN :emails")
Page<ComplaintEntity> getComplaintsByUserEmails(@Param("emails") List<String> emails, Pageable pageable);
}
@@ -44,5 +44,8 @@ public interface LawCaseRepository extends JpaRepository<LawCase, Long> {
@Query("SELECT COUNT(lc.id) FROM LawCase lc")
Long getTotalLawCasesCount();
@Query("SELECT COUNT(*) FROM LawCase l WHERE l.violationId IN :violationIds")
int countLawCaseByViolationIds(@Param("violationIds") List<Long> violationIds);
Optional<LawCase> getLawCaseByViolationIdAndType(Long violationId, LawCaseType type);
}
@@ -2,19 +2,19 @@ package ru.soune.nocopy.service.violation;
import lombok.AllArgsConstructor;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.*;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import ru.soune.nocopy.dto.file.YandexSearchResponse;
import ru.soune.nocopy.dto.violation.FileViolationSummaryDTO;
import ru.soune.nocopy.dto.violation.ViolationStatisticsResponse;
import ru.soune.nocopy.entity.file.FileEntity;
import ru.soune.nocopy.entity.file.FileStatus;
import ru.soune.nocopy.entity.search.GlobalSearchResult;
import ru.soune.nocopy.entity.violation.Violation;
import ru.soune.nocopy.repository.ComplaintEntityRepository;
import ru.soune.nocopy.repository.FileEntityRepository;
import ru.soune.nocopy.repository.LawCaseRepository;
import ru.soune.nocopy.repository.ViolationRepository;
import ru.soune.nocopy.service.file.FileEntityService;
@@ -32,6 +32,10 @@ public class ViolationService {
private final FileEntityService fileEntityService;
private final ComplaintEntityRepository complaintRepository;
private final LawCaseRepository lawCaseRepository;
public void processViolation(YandexSearchResponse.ImageResult imageResult, FileEntity file,
GlobalSearchResult result) {
String url = imageResult.getUrl();
@@ -61,22 +65,26 @@ public class ViolationService {
return violationRepository.findById(violationId).orElse(null);
}
public List<FileViolationSummaryDTO> getFileViolationsSummary(Long userId) {
List<FileEntity> userFiles = fileEntityService.getAllUserFiles(userId);
List<Violation> violations = violationRepository.findByFileEntityInAndStatusNot(userFiles,
ViolationStatus.NOT_OWNER_FILE.name());
public Page<FileViolationSummaryDTO> getFileViolationsSummary(Long userId, String fileName, String sortDirection, Integer page,
Integer size, LocalDateTime start, LocalDateTime end) {
List<FileEntity> userFiles = fileName == null || fileName.isEmpty() ? fileEntityService.getAllUserFiles(userId)
: fileEntityService.getAllUserFilesWithFileName(userId, fileName,
List.of(FileStatus.ACTIVE, FileStatus.BLOCKED, FileStatus.MODERATION));
Map<String, List<Violation>> violationsByFileId = violations.stream()
Sort sort = Sort.by(sortDirection.equalsIgnoreCase("desc") ? Sort.Direction.DESC : Sort.Direction.ASC,
"createdDate");
Pageable pageable = PageRequest.of(page, size, sort);
Page<Violation> violations = violationRepository.findByFileEntityInAndStatusNotAndCreatedDateBetween(
userFiles, ViolationStatus.NOT_OWNER_FILE.name(), start, end, pageable);
Map<String, List<Violation>> violationsByFileId = violations.getContent().stream()
.collect(Collectors.groupingBy(v -> v.getFileEntity().getId()));
return userFiles.stream()
.map(file -> {
List<Violation> fileViolations = violationsByFileId.getOrDefault(file.getId(),
Collections.emptyList());
if (fileViolations.isEmpty()) {
return null;
}
List<FileViolationSummaryDTO> dtoList = violationsByFileId.entrySet().stream()
.map(entry -> {
List<Violation> fileViolations = entry.getValue();
FileEntity file = fileViolations.get(0).getFileEntity();
LocalDateTime latestDate = fileViolations.stream()
.map(Violation::getCreatedDate)
@@ -95,8 +103,9 @@ public class ViolationService {
.latestViolationDate(latestDate)
.build();
})
.filter(Objects::nonNull)
.collect(Collectors.toList());
return new PageImpl<>(dtoList, pageable, violations.getTotalElements());
}
@Transactional
@@ -226,11 +235,19 @@ public class ViolationService {
.filter(v -> v.getStatus().equals(ViolationStatus.AUTHORIZED_USE.name()))
.count();
List<Long> violationIds = violations.stream().map(Violation::getId).toList();
int totalComplaints = complaintRepository.countComplaintByViolations(violationIds);
int totalLawCases = lawCaseRepository.countLawCaseByViolationIds(violationIds);
return ViolationStatisticsResponse.builder()
.totalViolations(violations.size())
.newViolations(newViolations)
.inProgressViolations(inProgressViolations)
.resolvedViolations(resolvedViolations)
.totalComplaints(totalComplaints)
.totalLawCases(totalLawCases)
.build();
}