diff --git a/src/main/java/ru/soune/nocopy/configuration/HandlerConfig.java b/src/main/java/ru/soune/nocopy/configuration/HandlerConfig.java index a582f44..c7cfec7 100644 --- a/src/main/java/ru/soune/nocopy/configuration/HandlerConfig.java +++ b/src/main/java/ru/soune/nocopy/configuration/HandlerConfig.java @@ -42,7 +42,8 @@ public class HandlerConfig { StatisticUserFilesHandler statisticUserHandler, StatisticTariffInfoFileHandler statisticTariffInfoFileHandler, StatisticUserDynamicHandler statisticUserDynamicHandler, - StatisticProtectedFilesHandler statisticProtectedFilesHandler + StatisticProtectedFilesHandler statisticProtectedFilesHandler, + StatisticViolationHandler statisticViolationHandler ) { Map map = new HashMap<>(); @@ -77,6 +78,7 @@ public class HandlerConfig { map.put(30020, statisticTariffInfoFileHandler); map.put(30021, statisticUserDynamicHandler); map.put(30022, statisticProtectedFilesHandler); + map.put(30023, statisticViolationHandler); return map; } diff --git a/src/main/java/ru/soune/nocopy/dto/statistic/ViolationStatisticRequest.java b/src/main/java/ru/soune/nocopy/dto/statistic/ViolationStatisticRequest.java new file mode 100644 index 0000000..9cbd1ab --- /dev/null +++ b/src/main/java/ru/soune/nocopy/dto/statistic/ViolationStatisticRequest.java @@ -0,0 +1,7 @@ +package ru.soune.nocopy.dto.statistic; + +import lombok.Data; + +@Data +public class ViolationStatisticRequest { +} diff --git a/src/main/java/ru/soune/nocopy/dto/statistic/ViolationStatisticResponse.java b/src/main/java/ru/soune/nocopy/dto/statistic/ViolationStatisticResponse.java new file mode 100644 index 0000000..f0e7dce --- /dev/null +++ b/src/main/java/ru/soune/nocopy/dto/statistic/ViolationStatisticResponse.java @@ -0,0 +1,32 @@ +package ru.soune.nocopy.dto.statistic; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class ViolationStatisticResponse { + + @JsonProperty("total_violations") + private Long totalViolations; + + @JsonProperty("total_complaints") + private Long totalComplaints; + + @JsonProperty("total_law_cases") + private Long totalLawCases; + + @JsonProperty("complaints_without_case") + private Long complaintsWithoutCase; + + @JsonProperty("violations_with_complaint") + private Long violationsWithComplaint; + + @JsonProperty("violations_without_complaint") + private Long violationsWithoutComplaint; +} diff --git a/src/main/java/ru/soune/nocopy/handler/StatisticViolationHandler.java b/src/main/java/ru/soune/nocopy/handler/StatisticViolationHandler.java new file mode 100644 index 0000000..194fe61 --- /dev/null +++ b/src/main/java/ru/soune/nocopy/handler/StatisticViolationHandler.java @@ -0,0 +1,34 @@ +package ru.soune.nocopy.handler; + +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import ru.soune.nocopy.dto.BaseRequest; +import ru.soune.nocopy.dto.BaseResponse; +import ru.soune.nocopy.dto.MessageCode; +import ru.soune.nocopy.dto.statistic.ViolationStatisticResponse; +import ru.soune.nocopy.service.statistic.ViolationStatisticService; + +@Component +@RequiredArgsConstructor +@Slf4j +public class StatisticViolationHandler implements RequestHandler { + + private final ObjectMapper objectMapper; + private final ViolationStatisticService statisticService; + + @Override + public BaseResponse handle(BaseRequest request) throws Exception { + log.debug("Handling violation statistic request, msgId: {}", request.getMsgId()); + + ViolationStatisticResponse statistics = statisticService.getViolationStatistics(); + + return new BaseResponse( + request.getMsgId(), + MessageCode.SUCCESS.getCode(), + MessageCode.SUCCESS.getDescription(), + statistics + ); + } +} diff --git a/src/main/java/ru/soune/nocopy/repository/ComplaintEntityRepository.java b/src/main/java/ru/soune/nocopy/repository/ComplaintEntityRepository.java index 159d388..3a31d59 100644 --- a/src/main/java/ru/soune/nocopy/repository/ComplaintEntityRepository.java +++ b/src/main/java/ru/soune/nocopy/repository/ComplaintEntityRepository.java @@ -25,4 +25,16 @@ public interface ComplaintEntityRepository extends JpaRepository { @Param("priority") LawCasePriority priority, @Param("violationId") Long violationId, Pageable pageable); + + @Query("SELECT COUNT(lc.id) FROM LawCase lc") + Long getTotalLawCasesCount(); } diff --git a/src/main/java/ru/soune/nocopy/repository/ViolationRepository.java b/src/main/java/ru/soune/nocopy/repository/ViolationRepository.java index 0834914..250f50d 100644 --- a/src/main/java/ru/soune/nocopy/repository/ViolationRepository.java +++ b/src/main/java/ru/soune/nocopy/repository/ViolationRepository.java @@ -74,4 +74,10 @@ public interface ViolationRepository extends JpaRepository { List findByFileEntityInAndStatusAndCreatedDateBetween(List files, String status, LocalDateTime startDate, LocalDateTime endDate, Sort sort); + + @Query("SELECT COUNT(v.id) FROM Violation v") + Long getTotalViolationsCount(); + + @Query("SELECT COUNT(DISTINCT c.violation.id) FROM ComplaintEntity c WHERE c.violation IS NOT NULL") + Long getViolationsWithComplaintCount(); } \ No newline at end of file diff --git a/src/main/java/ru/soune/nocopy/service/statistic/ViolationStatisticService.java b/src/main/java/ru/soune/nocopy/service/statistic/ViolationStatisticService.java new file mode 100644 index 0000000..e56c995 --- /dev/null +++ b/src/main/java/ru/soune/nocopy/service/statistic/ViolationStatisticService.java @@ -0,0 +1,40 @@ +package ru.soune.nocopy.service.statistic; + + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import ru.soune.nocopy.dto.statistic.ViolationStatisticResponse; +import ru.soune.nocopy.repository.ComplaintEntityRepository; +import ru.soune.nocopy.repository.LawCaseRepository; +import ru.soune.nocopy.repository.ViolationRepository; + +@Service +@RequiredArgsConstructor +@Slf4j +public class ViolationStatisticService { + private final ViolationRepository violationRepository; + + private final ComplaintEntityRepository complaintRepository; + + private final LawCaseRepository lawCaseRepository; + + public ViolationStatisticResponse getViolationStatistics() { + Long totalViolations = violationRepository.getTotalViolationsCount(); + Long totalComplaints = complaintRepository.getTotalComplaintsCount(); + Long totalLawCases = lawCaseRepository.getTotalLawCasesCount(); + Long complaintsWithoutCase = complaintRepository.getComplaintsWithoutLawCaseCount(); + Long violationsWithComplaint = violationRepository.getViolationsWithComplaintCount(); + + Long violationsWithoutComplaint = totalViolations - violationsWithComplaint; + + return ViolationStatisticResponse.builder() + .totalViolations(totalViolations != null ? totalViolations : 0L) + .totalComplaints(totalComplaints != null ? totalComplaints : 0L) + .totalLawCases(totalLawCases != null ? totalLawCases : 0L) + .complaintsWithoutCase(complaintsWithoutCase != null ? complaintsWithoutCase : 0L) + .violationsWithComplaint(violationsWithComplaint != null ? violationsWithComplaint : 0L) + .violationsWithoutComplaint(violationsWithoutComplaint) + .build(); + } +}