diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/DossierTemplateDictionaryStats.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/DossierTemplateDictionaryStats.java new file mode 100644 index 000000000..ed9186690 --- /dev/null +++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/DossierTemplateDictionaryStats.java @@ -0,0 +1,22 @@ +package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate; + +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionarySummary; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.ArrayList; +import java.util.List; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DossierTemplateDictionaryStats { + + private String dossierTemplateId; + private int numberOfDictionaries; // number of Types for the dossierTemplate + private List dictionarySummaryList = new ArrayList<>(); + +} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/DossierTemplateStats.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/DossierTemplateStats.java index 57ebcd6f5..e13d24566 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/DossierTemplateStats.java +++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/DossierTemplateStats.java @@ -1,20 +1,40 @@ package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionarySummary; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; @Data @Builder @NoArgsConstructor @AllArgsConstructor public class DossierTemplateStats { + private String dossierTemplateId; - private int numberOfDictionaries; // number of Types for the dossierTemplate - private List dictionarySummaryList = new ArrayList<>(); + private String name; + + private int numberOfDeletedDossiers; + private int numberOfActiveDossiers; + private int numberOfArchivedDossiers; + + private int numberOfPeople; + private int numberOfActiveFiles; + private int numberOfSoftDeletedFiles; + + private int numberOfPages; + private int numberOfExcludedPages; + + private Map fileCountPerProcessingStatus = new HashMap<>(); + private Map fileCountPerWorkflowStatus = new HashMap<>(); + private Map dossierCountByStatus = new HashMap<>(); + + private List dossiersInTemplate = new ArrayList<>(); } diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierTemplateStatsResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierTemplateStatsResource.java index 5983ba8a2..eff7ccdc4 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierTemplateStatsResource.java +++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierTemplateStatsResource.java @@ -1,7 +1,9 @@ package com.iqser.red.service.persistence.service.v1.api.resources; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplateDictionaryStats; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplateStats; import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -12,6 +14,18 @@ public interface DossierTemplateStatsResource { String REST_PATH = "/dossier-template-stats"; + String DICTIONARY_PATH = "/dictionary"; + + String DOSSIER_TEMPLATE_ID = "dossierTemplateId"; + String DOSSIER_TEMPLATE_ID_PATH_VARIABLE = "/{" + DOSSIER_TEMPLATE_ID + "}"; + + @PostMapping(value = REST_PATH+DICTIONARY_PATH, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + List getDossierTemplateDictionaryStats(@RequestBody Set dossierTemplateIds); + + @PostMapping(value = REST_PATH+DOSSIER_TEMPLATE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE ) + DossierTemplateStats getDossierTemplateStats(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId); + @PostMapping(value = REST_PATH, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) - List getDossierTemplateStats(@RequestBody Set dossierTemplateIds); + List getDossierTemplateStats(); + } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierPersistenceService.java index 0df67bf72..752c00503 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierPersistenceService.java @@ -180,4 +180,5 @@ public class DossierPersistenceService { throw new BadRequestException("Cannot unarchive dossier!"); } } + } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/projection/DossierCountByStatusProjection.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/projection/DossierCountByStatusProjection.java new file mode 100644 index 000000000..47462ae4d --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/projection/DossierCountByStatusProjection.java @@ -0,0 +1,9 @@ +package com.iqser.red.service.persistence.management.v1.processor.service.persistence.projection; + +public interface DossierCountByStatusProjection { + + int getCount(); + + String getDossierStatusId(); + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/projection/FilePageCountsProjection.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/projection/FilePageCountsProjection.java new file mode 100644 index 000000000..98c98c09a --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/projection/FilePageCountsProjection.java @@ -0,0 +1,8 @@ +package com.iqser.red.service.persistence.management.v1.processor.service.persistence.projection; + +public interface FilePageCountsProjection { + + int getNumberOfExcludedPages(); + + int getNumberOfAnalyzedPages(); +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/projection/FileProcessingStatusProjection.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/projection/FileProcessingStatusProjection.java new file mode 100644 index 000000000..444087390 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/projection/FileProcessingStatusProjection.java @@ -0,0 +1,11 @@ +package com.iqser.red.service.persistence.management.v1.processor.service.persistence.projection; + +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus; + +public interface FileProcessingStatusProjection { + + int getCount(); + + ProcessingStatus getProcessingStatus(); + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/projection/FileWorkflowStatusProjection.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/projection/FileWorkflowStatusProjection.java new file mode 100644 index 000000000..96fa4d47f --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/projection/FileWorkflowStatusProjection.java @@ -0,0 +1,11 @@ +package com.iqser.red.service.persistence.management.v1.processor.service.persistence.projection; + +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; + +public interface FileWorkflowStatusProjection { + + int getCount(); + + WorkflowStatus getWorkflowStatus(); + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierRepository.java index 9f0a2fe15..1c7b746c9 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierRepository.java @@ -1,13 +1,13 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository; -import java.time.OffsetDateTime; -import java.util.List; - +import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.projection.DossierCountByStatusProjection; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; -import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity; +import java.time.OffsetDateTime; +import java.util.List; public interface DossierRepository extends JpaRepository { @@ -40,4 +40,19 @@ public interface DossierRepository extends JpaRepository @Modifying @Query("update DossierEntity d set d.lastUpdated = :lastUpdated, d.archivedTime = null where d.id = :dossierId") int unarchiveDossier(String dossierId, OffsetDateTime lastUpdated); + + @Query("select count(d) from DossierEntity d where d.archivedTime is not null and d.dossierTemplateId = :dossierTemplateId") + int countArchived(String dossierTemplateId); + + @Query("select count(d) from DossierEntity d where d.hardDeletedTime is null and d.softDeletedTime is not null and d.dossierTemplateId = :dossierTemplateId") + int countSofDeleted(String dossierTemplateId); + + @Query("select count(d) from DossierEntity d where d.archivedTime is null and d.softDeletedTime is null and d.hardDeletedTime is null and d.dossierTemplateId = :dossierTemplateId") + int countActive(String dossierTemplateId); + + @Query("select d.dossierStatusId, count(d) from DossierEntity d where d.archivedTime is null and d.softDeletedTime is null and d.hardDeletedTime is null and d.dossierTemplateId = :dossierTemplateId group by d.dossierStatusId") + List countByDossierStatus(String dossierTemplateId); + + @Query("select d.id from DossierEntity d where d.dossierTemplateId = :dossierTemplateId") + List findDossierIdsForTemplate(String dossierTemplateId); } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileRepository.java index 5631f5ab5..389f2743c 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileRepository.java @@ -1,15 +1,17 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository; -import java.time.OffsetDateTime; -import java.util.List; - +import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.projection.FilePageCountsProjection; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.projection.FileProcessingStatusProjection; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.projection.FileWorkflowStatusProjection; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; -import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; +import java.time.OffsetDateTime; +import java.util.List; public interface FileRepository extends JpaRepository { @@ -147,7 +149,7 @@ public interface FileRepository extends JpaRepository { @Query("select f from FileEntity f join DossierEntity d on d.id = f.dossierId where f.workflowStatus <> 'APPROVED' and f.excludedFromAutomaticAnalysis = false " + "and ( f.processingStatus = 'PROCESSED' or f.processingStatus = 'UNPROCESSED' or f.processingStatus = 'DELETED' or f.processingStatus = 'ERROR' )" + - "and d.softDeletedTime is null and d.hardDeletedTime is null and d.archivedTime is null " ) + "and d.softDeletedTime is null and d.hardDeletedTime is null and d.archivedTime is null ") List getAllRelevantStatusesForReanalysisScheduler(); @Modifying(clearAutomatically = true) @@ -157,6 +159,33 @@ public interface FileRepository extends JpaRepository { @Query("select f from FileEntity f where f.deleted is not null and f.hardDeletedTime is null and f.dossierId in :dossierIds") List getSoftDeletedFiles(List dossierIds); + @Query("select f.processingStatus, count(f) from FileEntity f " + + "inner join DossierEntity d on d.id = f.dossierId " + + "where f.deleted is null and f.hardDeletedTime is null " + + "and d.softDeletedTime is null and d.hardDeletedTime is null and d.archivedTime is null " + + "and d.dossierTemplateId = :dossierTemplateId " + + "group by f.processingStatus ") + List countFilesByProcessingStatus(String dossierTemplateId); + + @Query("select f.workflowStatus, count(f) from FileEntity f " + + "inner join DossierEntity d on d.id = f.dossierId " + + "where f.deleted is null and f.hardDeletedTime is null " + + "and d.softDeletedTime is null and d.hardDeletedTime is null and d.archivedTime is null " + + "and d.dossierTemplateId = :dossierTemplateId " + + "group by f.processingStatus ") + List countFilesByWorkflowStatus(String dossierTemplateId); + + @Query(value = "select sum(number_of_pages) sum_of_analyzed_pages, sum(json_array_length(cast(excluded_pages AS json))) as sum_of_excluded_pages " + + " from file join dossier on file.dossierId = dossier.id where file.deleted is null and file.hard_deleted_time is null " + + " and dossier.archived_time is null and dossier.soft_deleted_time is null and dossier.hard_deleted_time is null" + + " and dossier.dossier_template_id = :dossierTemplateId", nativeQuery = true) + FilePageCountsProjection countPages(String dossierTemplateId); + + @Query("select count(f) from FileEntity f inner join DossierEntity d on d.id = f.dossierId where " + + "f.hardDeletedTime is not null and f.deleted is not null and " + + "d.dossierTemplateId = :dossierTemplateId and " + + "d.softDeletedTime is null and d.hardDeletedTime is null and d.archivedTime is null") + int countActiveFiles(String dossierTemplateId); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierTemplateStatsController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierTemplateStatsController.java index 0c159bb78..1955cd696 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierTemplateStatsController.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierTemplateStatsController.java @@ -1,6 +1,7 @@ package com.iqser.red.service.peristence.v1.server.controller; import com.iqser.red.service.peristence.v1.server.service.DossierTemplateStatsService; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplateDictionaryStats; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplateStats; import com.iqser.red.service.persistence.service.v1.api.resources.DossierTemplateStatsResource; import lombok.RequiredArgsConstructor; @@ -17,7 +18,17 @@ public class DossierTemplateStatsController implements DossierTemplateStatsResou private final DossierTemplateStatsService dossierTemplateStatsService; @Override - public List getDossierTemplateStats(@RequestBody Set dossierTemplateIds) { + public List getDossierTemplateDictionaryStats(@RequestBody Set dossierTemplateIds) { return dossierTemplateStatsService.getDossierTemplateStats(dossierTemplateIds); } + + @Override + public DossierTemplateStats getDossierTemplateStats(String dossierTemplateId) { + return dossierTemplateStatsService.getDossierTemplateStats(dossierTemplateId); + } + + @Override + public List getDossierTemplateStats() { + return dossierTemplateStatsService.getDossierTemplateStats(); + } } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierTemplateStatsService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierTemplateStatsService.java index dfe95a802..3900a786a 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierTemplateStatsService.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierTemplateStatsService.java @@ -1,7 +1,14 @@ package com.iqser.red.service.peristence.v1.server.service; +import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DictionaryPersistenceService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierTemplatePersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.projection.DossierCountByStatusProjection; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.projection.FileProcessingStatusProjection; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.projection.FileWorkflowStatusProjection; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierTemplateRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileRepository; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplateDictionaryStats; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplateStats; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionarySummary; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionarySummaryResponse; @@ -9,10 +16,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; @Slf4j @@ -21,25 +25,49 @@ import java.util.stream.Collectors; public class DossierTemplateStatsService { private final DictionaryPersistenceService dictionaryPersistenceService; - private final DossierTemplatePersistenceService dossierTemplatePersistenceService; - public List getDossierTemplateStats(Set dossierTemplateIds) { + private final DossierTemplateRepository dossierTemplateRepository; + + private final FileRepository fileRepository; + + private final DossierRepository dossierRepository; + + + public DossierTemplateStats getDossierTemplateStats(String dossierTemplateId) { + + var dossierTemplate = dossierTemplateRepository.findByIdAndNotDeleted(dossierTemplateId).orElseThrow(() -> new NotFoundException("Dossier Template with id: " + dossierTemplateId + " not found.")); + + return getDossierTemplateStats(dossierTemplateId, dossierTemplate.getName()); + } + + public List getDossierTemplateStats() { + var allUnDeletedTemplates = dossierTemplateRepository.findAllWhereDeletedIsFalse(); + + final List dossierTemplateStatsList = Collections.synchronizedList(new ArrayList<>()); + allUnDeletedTemplates.parallelStream().forEach(dt -> dossierTemplateStatsList.add(getDossierTemplateStats(dt.getId(), dt.getName()))); + + dossierTemplateStatsList.sort(Comparator.comparing(DossierTemplateStats::getName)); + + return dossierTemplateStatsList; + } + + public List getDossierTemplateStats(Set dossierTemplateIds) { List dictionarySummaryList = dictionaryPersistenceService.getDictionarySummaryForDossierTemplateId(dossierTemplateIds); Map> dictionarySummaryMap = dictionarySummaryList.stream().collect( Collectors.groupingBy(DictionarySummaryResponse::getDossierTemplateId, - Collectors.mapping(this::getDossierTemplateStats, Collectors.toList()))); - List dossierTemplateStatsList = dictionarySummaryMap.entrySet().stream() + Collectors.mapping(this::getDossierTemplateStats, Collectors.toList()))); + List dossierTemplateStatsList = dictionarySummaryMap.entrySet().stream() .map(e -> - e.getValue().size() == 1 && e.getValue().get(0).getId() == null? - new DossierTemplateStats(e.getKey(), 0, new ArrayList<>()): - new DossierTemplateStats(e.getKey(), e.getValue().size(), e.getValue())) + e.getValue().size() == 1 && e.getValue().get(0).getId() == null ? + new DossierTemplateDictionaryStats(e.getKey(), 0, new ArrayList<>()) : + new DossierTemplateDictionaryStats(e.getKey(), e.getValue().size(), e.getValue())) .collect(Collectors.toList()); // add the dossier templates with no dictionaries but with dossiers - Set dossierTemplatesIdsFounded = dossierTemplateStatsList.stream().map(DossierTemplateStats::getDossierTemplateId).collect(Collectors.toSet()); + Set dossierTemplatesIdsFounded = dossierTemplateStatsList.stream().map(DossierTemplateDictionaryStats::getDossierTemplateId).collect(Collectors.toSet()); dossierTemplateIds.removeAll(dossierTemplatesIdsFounded); - List dossierTemplateStatsListForDossierNotFound = dossierTemplateIds.stream() - .map(e -> new DossierTemplateStats(e, 0, new ArrayList<>())).collect(Collectors.toList()); + List dossierTemplateStatsListForDossierNotFound = dossierTemplateIds.stream() + .map(e -> new DossierTemplateDictionaryStats(e, 0, new ArrayList<>())).collect(Collectors.toList()); dossierTemplateStatsList.addAll(dossierTemplateStatsListForDossierNotFound); return dossierTemplateStatsList; } @@ -47,4 +75,34 @@ public class DossierTemplateStatsService { private DictionarySummary getDossierTemplateStats(DictionarySummaryResponse response) { return new DictionarySummary(response.getId(), response.getType(), response.getName(), response.getEntriesCount()); } + + private DossierTemplateStats getDossierTemplateStats(String dossierTemplateId, String dossierTemplateName) { + + DossierTemplateStats dts = new DossierTemplateStats(); + + dts.setDossierTemplateId(dossierTemplateId); + dts.setName(dossierTemplateName); + dts.setNumberOfArchivedDossiers(dossierRepository.countArchived(dossierTemplateId)); + dts.setNumberOfActiveDossiers(dossierRepository.countActive(dossierTemplateId)); + dts.setNumberOfDeletedDossiers(dossierRepository.countSofDeleted(dossierTemplateId)); + dts.setNumberOfActiveFiles(fileRepository.countActiveFiles(dossierTemplateId)); + dts.setNumberOfActiveFiles(fileRepository.countSoftDeletedFiles(dossierTemplateId)); + + var processingCounts = fileRepository.countFilesByProcessingStatus(dossierTemplateId); + var workflowCounts = fileRepository.countFilesByWorkflowStatus(dossierTemplateId); + var pageCounts = fileRepository.countPages(dossierTemplateId); + + var dossierStatusCounts = dossierRepository.countByDossierStatus(dossierTemplateId); + + dts.setNumberOfPages(pageCounts.getNumberOfAnalyzedPages()); + dts.setNumberOfExcludedPages(pageCounts.getNumberOfExcludedPages()); + + dts.setFileCountPerProcessingStatus(processingCounts.stream().collect(Collectors.toMap(FileProcessingStatusProjection::getProcessingStatus, FileProcessingStatusProjection::getCount))); + dts.setFileCountPerWorkflowStatus(workflowCounts.stream().collect(Collectors.toMap(FileWorkflowStatusProjection::getWorkflowStatus, FileWorkflowStatusProjection::getCount))); + dts.setDossierCountByStatus(dossierStatusCounts.stream().collect(Collectors.toMap(DossierCountByStatusProjection::getDossierStatusId, DossierCountByStatusProjection::getCount))); + + dts.setDossiersInTemplate(dossierRepository.findDossierIdsForTemplate(dossierTemplateId)); + + return dts; + } } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileStatusProcessingUpdateService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileStatusProcessingUpdateService.java index 532d0fefd..026817b65 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileStatusProcessingUpdateService.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileStatusProcessingUpdateService.java @@ -1,16 +1,13 @@ package com.iqser.red.service.peristence.v1.server.service; -import org.springframework.retry.support.RetryTemplate; -import org.springframework.web.bind.annotation.RestController; - import com.iqser.red.service.peristence.v1.server.settings.FileManagementServiceSettings; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierPersistenceService; import com.iqser.red.service.redaction.v1.model.AnalyzeResult; -import com.iqser.red.service.redaction.v1.model.MessageType; import com.iqser.red.service.search.v1.model.IndexMessageType; - import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.retry.support.RetryTemplate; +import org.springframework.web.bind.annotation.RestController; @Slf4j @RestController @@ -86,20 +83,20 @@ public class FileStatusProcessingUpdateService { public void analysisFailed(String dossierId, String fileId) { - setStatusError(dossierId, fileId); + setStatusError(dossierId, fileId, "analysisFailed"); } public void ocrFailed(String dossierId, String fileId) { - setStatusError(dossierId, fileId); + setStatusError(dossierId, fileId, "ocrFailed"); } - private void setStatusError(String dossierId, String fileId) { + private void setStatusError(String dossierId, String fileId, String reason) { retryTemplate.execute(retryContext -> { - log.warn("Retrying {} time to set ERROR status for file {} in dossier {}", retryContext.getRetryCount(), fileId, dossierId); + log.warn("Retrying {} time to set ERROR status for file {} in dossier {} with reason {} ", retryContext.getRetryCount(), fileId, dossierId, reason); fileStatusService.setStatusError(fileId); return null; }); @@ -128,7 +125,7 @@ public class FileStatusProcessingUpdateService { public void indexingFailed(String dossierId, String fileId) { - setStatusError(dossierId, fileId); + setStatusError(dossierId, fileId, "indexingFailed"); } } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateStatsTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateStatsTest.java index 3c9060d09..8e1bc1da1 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateStatsTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateStatsTest.java @@ -10,6 +10,7 @@ import java.util.List; import java.util.Set; import java.util.stream.Collectors; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.*; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -19,10 +20,6 @@ import com.iqser.red.service.peristence.v1.server.integration.client.DossierTemp import com.iqser.red.service.peristence.v1.server.integration.client.DossierTemplateStatsClient; import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.CreateOrUpdateDossierTemplateRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplate; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplateStats; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DownloadFileType; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionaryEntry; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionaryEntryType; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionarySummary; @@ -155,9 +152,9 @@ public class DossierTemplateStatsTest extends AbstractPersistenceServerServiceTe dossierTemplateIds.add(dossierTemplate4.getId()); dossierTemplateIds.add(dossierTemplate5.getId()); - List dossierTemplateStatsList = dossierTemplateStatsClient.getDossierTemplateStats(dossierTemplateIds); + List dossierTemplateStatsList = dossierTemplateStatsClient.getDossierTemplateDictionaryStats(dossierTemplateIds); assertThat(dossierTemplateStatsList.size()).isEqualTo(dossierTemplateIds.size()); - DossierTemplateStats dossierTemplateStats1 = dossierTemplateStatsList.stream().filter(d -> d.getDossierTemplateId().equals(dossierTemplate2.getId())).findAny().get(); + DossierTemplateDictionaryStats dossierTemplateStats1 = dossierTemplateStatsList.stream().filter(d -> d.getDossierTemplateId().equals(dossierTemplate2.getId())).findAny().get(); assertThat(dossierTemplateStats1.getDossierTemplateId()).isEqualTo(dossierTemplate2.getId()); assertThat(dossierTemplateStats1.getNumberOfDictionaries()).isEqualTo(2); @@ -166,7 +163,7 @@ public class DossierTemplateStatsTest extends AbstractPersistenceServerServiceTe assertThat(dictionarySummaryList.stream().filter(d -> d.getType().equals(TYPE_ID_2)).findAny().get().getEntriesCount()).isEqualTo(entries2.size()); // dossier template with no type - DossierTemplateStats dossierTemplateStats3 = dossierTemplateStatsList.stream().filter(d -> d.getDossierTemplateId().equals(dossierTemplate4.getId())).findAny().get(); + DossierTemplateDictionaryStats dossierTemplateStats3 = dossierTemplateStatsList.stream().filter(d -> d.getDossierTemplateId().equals(dossierTemplate4.getId())).findAny().get(); assertThat(dossierTemplateStats3.getDossierTemplateId()).isEqualTo(dossierTemplate4.getId()); assertThat(dossierTemplateStats3.getNumberOfDictionaries()).isZero(); @@ -175,10 +172,10 @@ public class DossierTemplateStatsTest extends AbstractPersistenceServerServiceTe entries22.add(entries2.get(2)); dictionaryClient.deleteEntries(addedType2.getTypeId(), entries22, DictionaryEntryType.ENTRY); - dossierTemplateStatsList = dossierTemplateStatsClient.getDossierTemplateStats(dossierTemplateIds); + dossierTemplateStatsList = dossierTemplateStatsClient.getDossierTemplateDictionaryStats(dossierTemplateIds); assertThat(dossierTemplateStatsList.size()).isEqualTo(dossierTemplateIds.size()); - DossierTemplateStats dossierTemplateStats2 = dossierTemplateStatsList.stream().filter(d -> d.getDossierTemplateId().equals(dossierTemplate2.getId())).findAny().get(); + DossierTemplateDictionaryStats dossierTemplateStats2 = dossierTemplateStatsList.stream().filter(d -> d.getDossierTemplateId().equals(dossierTemplate2.getId())).findAny().get(); dictionarySummaryList = dossierTemplateStats2.getDictionarySummaryList(); assertThat(dictionarySummaryList.stream().filter(d -> d.getType().equals(TYPE_ID_2)).findAny().get().getEntriesCount()).isEqualTo(entries2.size() - entries22.size()); @@ -192,10 +189,10 @@ public class DossierTemplateStatsTest extends AbstractPersistenceServerServiceTe var entries23loaded = dictionaryClient.getEntriesForType(addedType2.getTypeId(), null, DictionaryEntryType.ENTRY); assertThat(entries23loaded.stream().filter(e -> !e.isDeleted()).collect(Collectors.toList())).isEmpty(); - dossierTemplateStatsList = dossierTemplateStatsClient.getDossierTemplateStats(dossierTemplateIds); + dossierTemplateStatsList = dossierTemplateStatsClient.getDossierTemplateDictionaryStats(dossierTemplateIds); assertThat(dossierTemplateStatsList.size()).isEqualTo(dossierTemplateIds.size()); - DossierTemplateStats dossierTemplateStats23 = dossierTemplateStatsList.stream().filter(d -> d.getDossierTemplateId().equals(dossierTemplate2.getId())).findAny().get(); + DossierTemplateDictionaryStats dossierTemplateStats23 = dossierTemplateStatsList.stream().filter(d -> d.getDossierTemplateId().equals(dossierTemplate2.getId())).findAny().get(); dictionarySummaryList = dossierTemplateStats23.getDictionarySummaryList(); assertThat(dictionarySummaryList.stream().filter(d -> d.getType().equals(TYPE_ID_2)).findAny().isEmpty()).isTrue();