RED-3899 - dossier stats by template first iteration
This commit is contained in:
parent
22ae74d581
commit
1cbdeedb2e
@ -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<DictionarySummary> dictionarySummaryList = new ArrayList<>();
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,20 +1,40 @@
|
|||||||
package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate;
|
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.AllArgsConstructor;
|
||||||
import lombok.Builder;
|
import lombok.Builder;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@Builder
|
@Builder
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public class DossierTemplateStats {
|
public class DossierTemplateStats {
|
||||||
|
|
||||||
private String dossierTemplateId;
|
private String dossierTemplateId;
|
||||||
private int numberOfDictionaries; // number of Types for the dossierTemplate
|
private String name;
|
||||||
private List<DictionarySummary> dictionarySummaryList = new ArrayList<>();
|
|
||||||
|
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<ProcessingStatus, Integer> fileCountPerProcessingStatus = new HashMap<>();
|
||||||
|
private Map<WorkflowStatus, Integer> fileCountPerWorkflowStatus = new HashMap<>();
|
||||||
|
private Map<String, Integer> dossierCountByStatus = new HashMap<>();
|
||||||
|
|
||||||
|
private List<String> dossiersInTemplate = new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,7 +1,9 @@
|
|||||||
package com.iqser.red.service.persistence.service.v1.api.resources;
|
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 com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplateStats;
|
||||||
import org.springframework.http.MediaType;
|
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.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
|
||||||
@ -12,6 +14,18 @@ public interface DossierTemplateStatsResource {
|
|||||||
|
|
||||||
String REST_PATH = "/dossier-template-stats";
|
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<DossierTemplateDictionaryStats> getDossierTemplateDictionaryStats(@RequestBody Set<String> 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)
|
@PostMapping(value = REST_PATH, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
|
||||||
List<DossierTemplateStats> getDossierTemplateStats(@RequestBody Set<String> dossierTemplateIds);
|
List<DossierTemplateStats> getDossierTemplateStats();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -180,4 +180,5 @@ public class DossierPersistenceService {
|
|||||||
throw new BadRequestException("Cannot unarchive dossier!");
|
throw new BadRequestException("Cannot unarchive dossier!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,9 @@
|
|||||||
|
package com.iqser.red.service.persistence.management.v1.processor.service.persistence.projection;
|
||||||
|
|
||||||
|
public interface DossierCountByStatusProjection {
|
||||||
|
|
||||||
|
int getCount();
|
||||||
|
|
||||||
|
String getDossierStatusId();
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,8 @@
|
|||||||
|
package com.iqser.red.service.persistence.management.v1.processor.service.persistence.projection;
|
||||||
|
|
||||||
|
public interface FilePageCountsProjection {
|
||||||
|
|
||||||
|
int getNumberOfExcludedPages();
|
||||||
|
|
||||||
|
int getNumberOfAnalyzedPages();
|
||||||
|
}
|
||||||
@ -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();
|
||||||
|
|
||||||
|
}
|
||||||
@ -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();
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,13 +1,13 @@
|
|||||||
package com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository;
|
package com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository;
|
||||||
|
|
||||||
import java.time.OffsetDateTime;
|
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity;
|
||||||
import java.util.List;
|
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.JpaRepository;
|
||||||
import org.springframework.data.jpa.repository.Modifying;
|
import org.springframework.data.jpa.repository.Modifying;
|
||||||
import org.springframework.data.jpa.repository.Query;
|
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<DossierEntity, String> {
|
public interface DossierRepository extends JpaRepository<DossierEntity, String> {
|
||||||
|
|
||||||
@ -40,4 +40,19 @@ public interface DossierRepository extends JpaRepository<DossierEntity, String>
|
|||||||
@Modifying
|
@Modifying
|
||||||
@Query("update DossierEntity d set d.lastUpdated = :lastUpdated, d.archivedTime = null where d.id = :dossierId")
|
@Query("update DossierEntity d set d.lastUpdated = :lastUpdated, d.archivedTime = null where d.id = :dossierId")
|
||||||
int unarchiveDossier(String dossierId, OffsetDateTime lastUpdated);
|
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<DossierCountByStatusProjection> countByDossierStatus(String dossierTemplateId);
|
||||||
|
|
||||||
|
@Query("select d.id from DossierEntity d where d.dossierTemplateId = :dossierTemplateId")
|
||||||
|
List<String> findDossierIdsForTemplate(String dossierTemplateId);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,15 +1,17 @@
|
|||||||
package com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository;
|
package com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository;
|
||||||
|
|
||||||
import java.time.OffsetDateTime;
|
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity;
|
||||||
import java.util.List;
|
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.JpaRepository;
|
||||||
import org.springframework.data.jpa.repository.Modifying;
|
import org.springframework.data.jpa.repository.Modifying;
|
||||||
import org.springframework.data.jpa.repository.Query;
|
import org.springframework.data.jpa.repository.Query;
|
||||||
|
|
||||||
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity;
|
import java.time.OffsetDateTime;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus;
|
import java.util.List;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus;
|
|
||||||
|
|
||||||
|
|
||||||
public interface FileRepository extends JpaRepository<FileEntity, String> {
|
public interface FileRepository extends JpaRepository<FileEntity, String> {
|
||||||
@ -147,7 +149,7 @@ public interface FileRepository extends JpaRepository<FileEntity, String> {
|
|||||||
|
|
||||||
@Query("select f from FileEntity f join DossierEntity d on d.id = f.dossierId where f.workflowStatus <> 'APPROVED' and f.excludedFromAutomaticAnalysis = false " +
|
@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 ( 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<FileEntity> getAllRelevantStatusesForReanalysisScheduler();
|
List<FileEntity> getAllRelevantStatusesForReanalysisScheduler();
|
||||||
|
|
||||||
@Modifying(clearAutomatically = true)
|
@Modifying(clearAutomatically = true)
|
||||||
@ -157,6 +159,33 @@ public interface FileRepository extends JpaRepository<FileEntity, String> {
|
|||||||
@Query("select f from FileEntity f where f.deleted is not null and f.hardDeletedTime is null and f.dossierId in :dossierIds")
|
@Query("select f from FileEntity f where f.deleted is not null and f.hardDeletedTime is null and f.dossierId in :dossierIds")
|
||||||
List<FileEntity> getSoftDeletedFiles(List<String> dossierIds);
|
List<FileEntity> getSoftDeletedFiles(List<String> 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<FileProcessingStatusProjection> 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<FileWorkflowStatusProjection> 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
package com.iqser.red.service.peristence.v1.server.controller;
|
package com.iqser.red.service.peristence.v1.server.controller;
|
||||||
|
|
||||||
import com.iqser.red.service.peristence.v1.server.service.DossierTemplateStatsService;
|
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.model.dossiertemplate.DossierTemplateStats;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.resources.DossierTemplateStatsResource;
|
import com.iqser.red.service.persistence.service.v1.api.resources.DossierTemplateStatsResource;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
@ -17,7 +18,17 @@ public class DossierTemplateStatsController implements DossierTemplateStatsResou
|
|||||||
private final DossierTemplateStatsService dossierTemplateStatsService;
|
private final DossierTemplateStatsService dossierTemplateStatsService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<DossierTemplateStats> getDossierTemplateStats(@RequestBody Set<String> dossierTemplateIds) {
|
public List<DossierTemplateDictionaryStats> getDossierTemplateDictionaryStats(@RequestBody Set<String> dossierTemplateIds) {
|
||||||
return dossierTemplateStatsService.getDossierTemplateStats(dossierTemplateIds);
|
return dossierTemplateStatsService.getDossierTemplateStats(dossierTemplateIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DossierTemplateStats getDossierTemplateStats(String dossierTemplateId) {
|
||||||
|
return dossierTemplateStatsService.getDossierTemplateStats(dossierTemplateId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<DossierTemplateStats> getDossierTemplateStats() {
|
||||||
|
return dossierTemplateStatsService.getDossierTemplateStats();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,7 +1,14 @@
|
|||||||
package com.iqser.red.service.peristence.v1.server.service;
|
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.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.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.DictionarySummary;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionarySummaryResponse;
|
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 lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@ -21,25 +25,49 @@ import java.util.stream.Collectors;
|
|||||||
public class DossierTemplateStatsService {
|
public class DossierTemplateStatsService {
|
||||||
|
|
||||||
private final DictionaryPersistenceService dictionaryPersistenceService;
|
private final DictionaryPersistenceService dictionaryPersistenceService;
|
||||||
private final DossierTemplatePersistenceService dossierTemplatePersistenceService;
|
|
||||||
|
|
||||||
public List<DossierTemplateStats> getDossierTemplateStats(Set<String> 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<DossierTemplateStats> getDossierTemplateStats() {
|
||||||
|
var allUnDeletedTemplates = dossierTemplateRepository.findAllWhereDeletedIsFalse();
|
||||||
|
|
||||||
|
final List<DossierTemplateStats> 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<DossierTemplateDictionaryStats> getDossierTemplateStats(Set<String> dossierTemplateIds) {
|
||||||
List<DictionarySummaryResponse> dictionarySummaryList = dictionaryPersistenceService.getDictionarySummaryForDossierTemplateId(dossierTemplateIds);
|
List<DictionarySummaryResponse> dictionarySummaryList = dictionaryPersistenceService.getDictionarySummaryForDossierTemplateId(dossierTemplateIds);
|
||||||
Map<String, List<DictionarySummary>> dictionarySummaryMap = dictionarySummaryList.stream().collect(
|
Map<String, List<DictionarySummary>> dictionarySummaryMap = dictionarySummaryList.stream().collect(
|
||||||
Collectors.groupingBy(DictionarySummaryResponse::getDossierTemplateId,
|
Collectors.groupingBy(DictionarySummaryResponse::getDossierTemplateId,
|
||||||
Collectors.mapping(this::getDossierTemplateStats, Collectors.toList())));
|
Collectors.mapping(this::getDossierTemplateStats, Collectors.toList())));
|
||||||
List<DossierTemplateStats> dossierTemplateStatsList = dictionarySummaryMap.entrySet().stream()
|
List<DossierTemplateDictionaryStats> dossierTemplateStatsList = dictionarySummaryMap.entrySet().stream()
|
||||||
.map(e ->
|
.map(e ->
|
||||||
e.getValue().size() == 1 && e.getValue().get(0).getId() == null?
|
e.getValue().size() == 1 && e.getValue().get(0).getId() == null ?
|
||||||
new DossierTemplateStats(e.getKey(), 0, new ArrayList<>()):
|
new DossierTemplateDictionaryStats(e.getKey(), 0, new ArrayList<>()) :
|
||||||
new DossierTemplateStats(e.getKey(), e.getValue().size(), e.getValue()))
|
new DossierTemplateDictionaryStats(e.getKey(), e.getValue().size(), e.getValue()))
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
// add the dossier templates with no dictionaries but with dossiers
|
// add the dossier templates with no dictionaries but with dossiers
|
||||||
Set<String> dossierTemplatesIdsFounded = dossierTemplateStatsList.stream().map(DossierTemplateStats::getDossierTemplateId).collect(Collectors.toSet());
|
Set<String> dossierTemplatesIdsFounded = dossierTemplateStatsList.stream().map(DossierTemplateDictionaryStats::getDossierTemplateId).collect(Collectors.toSet());
|
||||||
|
|
||||||
dossierTemplateIds.removeAll(dossierTemplatesIdsFounded);
|
dossierTemplateIds.removeAll(dossierTemplatesIdsFounded);
|
||||||
List<DossierTemplateStats> dossierTemplateStatsListForDossierNotFound = dossierTemplateIds.stream()
|
List<DossierTemplateDictionaryStats> dossierTemplateStatsListForDossierNotFound = dossierTemplateIds.stream()
|
||||||
.map(e -> new DossierTemplateStats(e, 0, new ArrayList<>())).collect(Collectors.toList());
|
.map(e -> new DossierTemplateDictionaryStats(e, 0, new ArrayList<>())).collect(Collectors.toList());
|
||||||
dossierTemplateStatsList.addAll(dossierTemplateStatsListForDossierNotFound);
|
dossierTemplateStatsList.addAll(dossierTemplateStatsListForDossierNotFound);
|
||||||
return dossierTemplateStatsList;
|
return dossierTemplateStatsList;
|
||||||
}
|
}
|
||||||
@ -47,4 +75,34 @@ public class DossierTemplateStatsService {
|
|||||||
private DictionarySummary getDossierTemplateStats(DictionarySummaryResponse response) {
|
private DictionarySummary getDossierTemplateStats(DictionarySummaryResponse response) {
|
||||||
return new DictionarySummary(response.getId(), response.getType(), response.getName(), response.getEntriesCount());
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,16 +1,13 @@
|
|||||||
package com.iqser.red.service.peristence.v1.server.service;
|
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.peristence.v1.server.settings.FileManagementServiceSettings;
|
||||||
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierPersistenceService;
|
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.AnalyzeResult;
|
||||||
import com.iqser.red.service.redaction.v1.model.MessageType;
|
|
||||||
import com.iqser.red.service.search.v1.model.IndexMessageType;
|
import com.iqser.red.service.search.v1.model.IndexMessageType;
|
||||||
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.retry.support.RetryTemplate;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@RestController
|
@RestController
|
||||||
@ -86,20 +83,20 @@ public class FileStatusProcessingUpdateService {
|
|||||||
|
|
||||||
public void analysisFailed(String dossierId, String fileId) {
|
public void analysisFailed(String dossierId, String fileId) {
|
||||||
|
|
||||||
setStatusError(dossierId, fileId);
|
setStatusError(dossierId, fileId, "analysisFailed");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void ocrFailed(String dossierId, String fileId) {
|
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 -> {
|
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);
|
fileStatusService.setStatusError(fileId);
|
||||||
return null;
|
return null;
|
||||||
});
|
});
|
||||||
@ -128,7 +125,7 @@ public class FileStatusProcessingUpdateService {
|
|||||||
|
|
||||||
public void indexingFailed(String dossierId, String fileId) {
|
public void indexingFailed(String dossierId, String fileId) {
|
||||||
|
|
||||||
setStatusError(dossierId, fileId);
|
setStatusError(dossierId, fileId, "indexingFailed");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,6 +10,7 @@ import java.util.List;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.*;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
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.client.DossierTemplateStatsClient;
|
||||||
import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider;
|
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.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.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.DictionaryEntryType;
|
||||||
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.DictionarySummary;
|
||||||
@ -155,9 +152,9 @@ public class DossierTemplateStatsTest extends AbstractPersistenceServerServiceTe
|
|||||||
dossierTemplateIds.add(dossierTemplate4.getId());
|
dossierTemplateIds.add(dossierTemplate4.getId());
|
||||||
dossierTemplateIds.add(dossierTemplate5.getId());
|
dossierTemplateIds.add(dossierTemplate5.getId());
|
||||||
|
|
||||||
List<DossierTemplateStats> dossierTemplateStatsList = dossierTemplateStatsClient.getDossierTemplateStats(dossierTemplateIds);
|
List<DossierTemplateDictionaryStats> dossierTemplateStatsList = dossierTemplateStatsClient.getDossierTemplateDictionaryStats(dossierTemplateIds);
|
||||||
assertThat(dossierTemplateStatsList.size()).isEqualTo(dossierTemplateIds.size());
|
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.getDossierTemplateId()).isEqualTo(dossierTemplate2.getId());
|
||||||
assertThat(dossierTemplateStats1.getNumberOfDictionaries()).isEqualTo(2);
|
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());
|
assertThat(dictionarySummaryList.stream().filter(d -> d.getType().equals(TYPE_ID_2)).findAny().get().getEntriesCount()).isEqualTo(entries2.size());
|
||||||
|
|
||||||
// dossier template with no type
|
// 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.getDossierTemplateId()).isEqualTo(dossierTemplate4.getId());
|
||||||
assertThat(dossierTemplateStats3.getNumberOfDictionaries()).isZero();
|
assertThat(dossierTemplateStats3.getNumberOfDictionaries()).isZero();
|
||||||
|
|
||||||
@ -175,10 +172,10 @@ public class DossierTemplateStatsTest extends AbstractPersistenceServerServiceTe
|
|||||||
entries22.add(entries2.get(2));
|
entries22.add(entries2.get(2));
|
||||||
|
|
||||||
dictionaryClient.deleteEntries(addedType2.getTypeId(), entries22, DictionaryEntryType.ENTRY);
|
dictionaryClient.deleteEntries(addedType2.getTypeId(), entries22, DictionaryEntryType.ENTRY);
|
||||||
dossierTemplateStatsList = dossierTemplateStatsClient.getDossierTemplateStats(dossierTemplateIds);
|
dossierTemplateStatsList = dossierTemplateStatsClient.getDossierTemplateDictionaryStats(dossierTemplateIds);
|
||||||
|
|
||||||
assertThat(dossierTemplateStatsList.size()).isEqualTo(dossierTemplateIds.size());
|
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();
|
dictionarySummaryList = dossierTemplateStats2.getDictionarySummaryList();
|
||||||
assertThat(dictionarySummaryList.stream().filter(d -> d.getType().equals(TYPE_ID_2)).findAny().get().getEntriesCount()).isEqualTo(entries2.size() - entries22.size());
|
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);
|
var entries23loaded = dictionaryClient.getEntriesForType(addedType2.getTypeId(), null, DictionaryEntryType.ENTRY);
|
||||||
assertThat(entries23loaded.stream().filter(e -> !e.isDeleted()).collect(Collectors.toList())).isEmpty();
|
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());
|
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();
|
dictionarySummaryList = dossierTemplateStats23.getDictionarySummaryList();
|
||||||
assertThat(dictionarySummaryList.stream().filter(d -> d.getType().equals(TYPE_ID_2)).findAny().isEmpty()).isTrue();
|
assertThat(dictionarySummaryList.stream().filter(d -> d.getType().equals(TYPE_ID_2)).findAny().isEmpty()).isTrue();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user