This is an automated email from the git hooks/post-receive script. New commit to branch feature/6116 in repository tutti. See http://git.codelutin.com/tutti.git commit 144713e36face2264d566ba00f7d4e229e1e7943 Author: Kevin Morin <morin@codelutin.com> Date: Tue Jan 12 17:28:39 2016 +0100 ajout des lots manquants lors de l'import (refs #6116) --- .../entities/protocol/TuttiProtocols.java | 31 ++++++ .../pupitri/CarrouselImportRequestResult.java | 8 +- .../service/pupitri/PupitriImportService.java | 109 ++++++++++++++++++--- .../service/pupitri/PupitriSpeciesContext.java | 53 +++++----- .../species/actions/ImportPupitriAction.java | 3 +- 5 files changed, 162 insertions(+), 42 deletions(-) diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java index 42145e0..c2a0130 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/protocol/TuttiProtocols.java @@ -56,12 +56,14 @@ import org.nuiton.jaxx.application.ApplicationTechnicalException; import org.nuiton.util.beans.Binder; import org.nuiton.util.beans.BinderFactory; +import javax.annotation.Nullable; import java.io.BufferedWriter; import java.io.File; import java.io.Reader; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -651,4 +653,33 @@ public class TuttiProtocols extends AbstractTuttiProtocols { return message; } + + public static Collection<String> getSurveyCodeWhoseCategoryIsMandatory(TuttiProtocol protocol, + final Caracteristic caracteristic) { + + Preconditions.checkNotNull(protocol); + Preconditions.checkNotNull(caracteristic); + + Collection<SpeciesProtocol> speciesProtocols = Collections2.filter(protocol.getSpecies(), + new Predicate<SpeciesProtocol>() { + + @Override + public boolean apply(@Nullable SpeciesProtocol input) { + List<Integer> mandatorySampleCategoryId = input.getMandatorySampleCategoryId(); + return mandatorySampleCategoryId != null + && mandatorySampleCategoryId.contains(caracteristic.getIdAsInt()); + } + }); + + Collection<String> surveyCodes = Collections2.transform(speciesProtocols, + new Function<SpeciesProtocol, String>() { + + @Override + public String apply(@Nullable SpeciesProtocol input) { + return input.getSpeciesSurveyCode(); + } + }); + + return new HashSet<>(surveyCodes); + } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/CarrouselImportRequestResult.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/CarrouselImportRequestResult.java index 364bd4d..12ce5dc 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/CarrouselImportRequestResult.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/CarrouselImportRequestResult.java @@ -107,12 +107,16 @@ public class CarrouselImportRequestResult { notImportedSpeciesIds.add(speciesId); } - public PupitriSpeciesContext getOrCreateCatch(List<Species> speciesList, boolean sorted) { + public PupitriSpeciesContext getOrCreateCatch(List<Species> speciesList, + boolean createMissingSigns, + boolean sorted) { // on utilise la première espèce trouvée dans la liste des candidates //FIXME Bien s'assurer que cela est ok Species species = speciesList.get(0); - PupitriSpeciesContext pupitriSpeciesContext = new PupitriSpeciesContext(species, sorted); + PupitriSpeciesContext pupitriSpeciesContext = new PupitriSpeciesContext(species, + createMissingSigns, + sorted); int catchIndex = catches.indexOf(pupitriSpeciesContext); if (catchIndex >= 0) { pupitriSpeciesContext = catches.get(catchIndex); diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportService.java index 1a73504..3113694 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportService.java @@ -24,6 +24,7 @@ package fr.ifremer.tutti.service.pupitri; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ListMultimap; +import com.google.common.collect.Lists; import com.google.common.collect.Maps; import fr.ifremer.adagio.core.dao.referential.ObjectTypeCode; import fr.ifremer.adagio.core.dao.referential.pmfm.PmfmId; @@ -35,6 +36,8 @@ import fr.ifremer.tutti.persistence.entities.data.CatchBatch; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import fr.ifremer.tutti.persistence.entities.data.SpeciesBatch; import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchs; +import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; +import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocols; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValues; @@ -72,6 +75,7 @@ import java.io.Reader; import java.io.Serializable; import java.text.DateFormat; import java.text.SimpleDateFormat; +import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Locale; @@ -148,11 +152,27 @@ public class PupitriImportService extends AbstractTuttiService { File carrouselFile, FishingOperation operation, CatchBatch catchBatch) { + return importPupitri(trunkFile, carrouselFile, operation, catchBatch, false); + } + + /** + * @param trunkFile incoming trunk file + * @param carrouselFile incoming carroussle file + * @param operation target operation + * @param catchBatch target catch batch + * @param importMissingCategoryBatches import or not empty batches for missing sex or size batches + * @return the number of rows of the .car file which have not been imported + */ + public PupitriImportResult importPupitri(File trunkFile, + File carrouselFile, + FishingOperation operation, + CatchBatch catchBatch, + boolean importMissingCategoryBatches) { PupitriImportResult result = new PupitriImportResult(); importPupitriTrunk(result, trunkFile, operation); - importPupitriCarrousel(result, carrouselFile, operation); + importPupitriCarrousel(result, carrouselFile, operation, importMissingCategoryBatches); if (result.isFishingOperationFound()) { @@ -166,7 +186,7 @@ public class PupitriImportService extends AbstractTuttiService { try { // persistence des lots - savePupitriImportResult(result, operation, catchBatch); + savePupitriImportResult(result, operation, catchBatch, importMissingCategoryBatches); // ajout des pièces-jointes addFileAsAttachment(trunkFile, catchBatch); @@ -214,7 +234,7 @@ public class PupitriImportService extends AbstractTuttiService { } - protected void addCatchEntry(TaxonCache taxonCache, PupitriSpeciesContext aCatch, PupitriImportReportModel reportModel) { + protected void addCatchEntry(TaxonCache taxonCache, PupitriSpeciesContext aCatch, PupitriImportReportModel reportModel) { Species species = aCatch.getSpecies(); taxonCache.load(species); @@ -308,7 +328,10 @@ public class PupitriImportService extends AbstractTuttiService { } - protected void importPupitriCarrousel(PupitriImportResult result, File carrouselFile, FishingOperation operation) { + protected void importPupitriCarrousel(PupitriImportResult result, + File carrouselFile, + FishingOperation operation, + boolean importMissingCategoryBatches) { if (log.isInfoEnabled()) { log.info("Will import pupitri operation [" + operation.toString() + @@ -316,14 +339,18 @@ public class PupitriImportService extends AbstractTuttiService { } // process import file - CarrouselImportRequestResult carrouselImportRequestResult = processCarrouselImportFile(carrouselFile, operation); + CarrouselImportRequestResult carrouselImportRequestResult = processCarrouselImportFile(carrouselFile, + operation, + importMissingCategoryBatches); // save it to global result result.flushCarrouselResult(carrouselImportRequestResult); } - protected CarrouselImportRequestResult processCarrouselImportFile(File carrouselFile, FishingOperation operation) { + protected CarrouselImportRequestResult processCarrouselImportFile(File carrouselFile, + FishingOperation operation, + boolean importMissingCategoryBatches) { // get the map of species by survey code or reftax code ListMultimap<String, Species> speciesBySurveyCode = ArrayListMultimap.create(); @@ -343,7 +370,7 @@ public class PupitriImportService extends AbstractTuttiService { for (CarrouselRow bean : importer) { - importCarrouselRow(result, operation, bean); + importCarrouselRow(result, operation, bean, importMissingCategoryBatches); } } @@ -362,7 +389,10 @@ public class PupitriImportService extends AbstractTuttiService { } - protected void importCarrouselRow(CarrouselImportRequestResult result, FishingOperation operation, CarrouselRow bean) { + protected void importCarrouselRow(CarrouselImportRequestResult result, + FishingOperation operation, + CarrouselRow bean, + boolean importMissingCategoryBatches) { if (!bean.acceptOperation(operation)) { @@ -410,7 +440,9 @@ public class PupitriImportService extends AbstractTuttiService { // creation d'un nouveau lot (par rapport au tuple (espece, trie)) // ou bien recuperation d'un lot deja existant - PupitriSpeciesContext pupitriSpeciesContext = result.getOrCreateCatch(speciesList, sorted); + PupitriSpeciesContext pupitriSpeciesContext = result.getOrCreateCatch(speciesList, + importMissingCategoryBatches, + sorted); // ajout des données (type de box, poids) au signe donne dans le lot pupitriSpeciesContext.addToSignContext(bean.getSign(), bean.getBoxType(), beanWeight); @@ -421,7 +453,8 @@ public class PupitriImportService extends AbstractTuttiService { protected void savePupitriImportResult(PupitriImportResult result, FishingOperation operation, - CatchBatch catchBatch) { + CatchBatch catchBatch, + boolean importMissingCategoryBatches) { catchBatch.setCatchTotalSortedTremisWeight(result.getSortedWeight()); catchBatch.setCatchTotalRejectedWeight(result.getRejectedWeight()); @@ -437,6 +470,25 @@ public class PupitriImportService extends AbstractTuttiService { // insert all imported species batches + TuttiProtocol protocol = dataContext.getProtocol(); + + // especes à sexer + Collection<String> surveyCodesToSex = + TuttiProtocols.getSurveyCodeWhoseCategoryIsMandatory(protocol, + persistenceService.getSexCaracteristic()); + + // especes à trier par taille + Collection<String> surveyCodesToSize = + TuttiProtocols.getSurveyCodeWhoseCategoryIsMandatory(protocol, + persistenceService.getSizeCategoryCaracteristic()); + + // especes à sexer et trier par taille + Collection<String> surveyCodesToSexAndSize = CollectionUtils.intersection(surveyCodesToSex, surveyCodesToSize); + + // on ne veut que les espèces qu'il faut soit sexer soit trier par taille + surveyCodesToSex.removeAll(surveyCodesToSexAndSize); + surveyCodesToSize.removeAll(surveyCodesToSexAndSize); + String melagComment = result.getMelagComment(); Decorator<Species> speciesDecorator = decoratorService.getDecoratorByType(Species.class); @@ -469,7 +521,6 @@ public class PupitriImportService extends AbstractTuttiService { for (Signs signs : pupitriSpeciesContext.getSigns()) { - boolean addMelagComment = pupitriSpeciesContext.isAddMelagComment(signs); float catchWeight = pupitriSpeciesContext.getWeight(signs); @@ -500,7 +551,6 @@ public class PupitriImportService extends AbstractTuttiService { log.info("Create a unique batch for species " + speciesStr + " with total weight: " + totalWeight); } - SpeciesBatch batch = createSpeciesBatch(operation, species, totalWeight, @@ -515,7 +565,40 @@ public class PupitriImportService extends AbstractTuttiService { batch.setComment(melagComment); } - persistenceService.createSpeciesBatch(batch, null, true); + batch = persistenceService.createSpeciesBatch(batch, null, true); + + if (importMissingCategoryBatches) { + + String parentBatchId = batch.getId(); + String speciesId = species.getSurveyCode(); + + List<Signs> signs2add = null; + + if (surveyCodesToSex.contains(speciesId)) { + + signs2add = Lists.newArrayList(Signs.MALE, Signs.FEMALE, Signs.DEFAULT); + + } else if (surveyCodesToSize.contains(speciesId)) { + + signs2add = Lists.newArrayList(Signs.SMALL, Signs.BIG); + } + + if (signs2add != null) { + for (Signs signs : signs2add) { + + Integer categoryId = signs.getCategory(); + CaracteristicQualitativeValue splitCqv = signsToCaracteristicValue.get(signs); + SpeciesBatch childBatch = createSpeciesBatch( + operation, + species, + null, + categoryId, + splitCqv); + + persistenceService.createSpeciesBatch(childBatch, parentBatchId, true); + } + } + } } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriSpeciesContext.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriSpeciesContext.java index c87d6da..0735f5e 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriSpeciesContext.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriSpeciesContext.java @@ -88,10 +88,13 @@ public class PupitriSpeciesContext implements Serializable { */ protected final Map<Signs, PupitriSignContext> signs; - public PupitriSpeciesContext(Species species, boolean sorted) { + protected boolean createMissingSigns; + + public PupitriSpeciesContext(Species species, boolean createMissingSigns, boolean sorted) { this.species = species; this.sorted = sorted; this.signs = Maps.newHashMap(); + this.createMissingSigns = createMissingSigns; } public Species getSpecies() { @@ -145,7 +148,7 @@ public class PupitriSpeciesContext implements Serializable { public void addToSignContext(Signs sign, BoxType boxType, Float weight) { - PupitriSignContext signContext = getOrCreateSignContext(sign, true); + PupitriSignContext signContext = getOrCreateSignContext(sign); signContext.addWeight(weight); switch (boxType) { case SMALL: @@ -156,12 +159,30 @@ public class PupitriSpeciesContext implements Serializable { break; } + // cf #6116 + switch (sign) { + case MALE: + getOrCreateSignContext(Signs.FEMALE); + getOrCreateSignContext(Signs.DEFAULT); + break; + case FEMALE: + getOrCreateSignContext(Signs.MALE); + getOrCreateSignContext(Signs.DEFAULT); + break; + + case SMALL: + getOrCreateSignContext(Signs.BIG); + break; + case BIG: + getOrCreateSignContext(Signs.SMALL); + break; + } } public void setMelagElevatedWeight(Signs melagElevatedSign, Float weight) { PupitriSignContext melagContext = getSignContext(Signs.MELAG); - PupitriSignContext pupitriSignContext = getOrCreateSignContext(melagElevatedSign, true); + PupitriSignContext pupitriSignContext = getOrCreateSignContext(melagElevatedSign); pupitriSignContext.addWeight(weight); //FIXME Check this??? pupitriSignContext.addNbBoxs(melagContext); @@ -175,7 +196,7 @@ public class PupitriSpeciesContext implements Serializable { PupitriSignContext melagContext = getSignContext(Signs.MELAG); - PupitriSignContext defaultSignContext = getOrCreateSignContext(Signs.DEFAULT, true); + PupitriSignContext defaultSignContext = getOrCreateSignContext(Signs.DEFAULT); defaultSignContext.addWeight(melagContext.getWeight()); //FIXME Check this??? defaultSignContext.addNbBoxs(melagContext); @@ -273,33 +294,13 @@ public class PupitriSpeciesContext implements Serializable { return signs.get(sign); } - private PupitriSignContext getOrCreateSignContext(Signs sign, boolean createOtherCategorySigns) { + private PupitriSignContext getOrCreateSignContext(Signs sign) { + PupitriSignContext signContext = getSignContext(sign); if (signContext == null) { signContext = new PupitriSignContext(sign); signs.put(sign, signContext); } - - if (createOtherCategorySigns) { - // cf #6116 - - switch (sign) { - case MALE: - getOrCreateSignContext(Signs.FEMALE, false); - break; - case FEMALE: - getOrCreateSignContext(Signs.MALE, false); - break; - case BIG: - getOrCreateSignContext(Signs.SMALL, false); - break; - case SMALL: - getOrCreateSignContext(Signs.BIG, false); - break; - - } - } - return signContext; } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/actions/ImportPupitriAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/actions/ImportPupitriAction.java index 74162aa..fc9fc6e 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/actions/ImportPupitriAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/actions/ImportPupitriAction.java @@ -160,7 +160,8 @@ public class ImportPupitriAction extends LongActionSupport<SpeciesBatchUIModel, importResult = service.importPupitri(importedTrunkFile, importedCarrouselFile, operation, - catchBatch); + catchBatch, + true); if (importResult.isFishingOperationFound()) { -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.