View Javadoc
1   package net.sumaris.core.service.data;
2   
3   /*-
4    * #%L
5    * SUMARiS:: Core
6    * %%
7    * Copyright (C) 2018 SUMARiS Consortium
8    * %%
9    * This program is free software: you can redistribute it and/or modify
10   * it under the terms of the GNU General Public License as
11   * published by the Free Software Foundation, either version 3 of the
12   * License, or (at your option) any later version.
13   * 
14   * This program is distributed in the hope that it will be useful,
15   * but WITHOUT ANY WARRANTY; without even the implied warranty of
16   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   * GNU General Public License for more details.
18   * 
19   * You should have received a copy of the GNU General Public
20   * License along with this program.  If not, see
21   * <http://www.gnu.org/licenses/gpl-3.0.html>.
22   * #L%
23   */
24  
25  
26  import com.google.common.base.Preconditions;
27  import com.google.common.collect.Maps;
28  import net.sumaris.core.dao.data.MeasurementDao;
29  import net.sumaris.core.dao.data.BatchDao;
30  import net.sumaris.core.util.Beans;
31  import net.sumaris.core.model.data.BatchQuantificationMeasurement;
32  import net.sumaris.core.model.data.BatchSortingMeasurement;
33  import net.sumaris.core.model.data.IMeasurementEntity;
34  import net.sumaris.core.service.referential.PmfmService;
35  import net.sumaris.core.vo.data.BatchVO;
36  import net.sumaris.core.vo.data.MeasurementVO;
37  import org.slf4j.Logger;
38  import org.slf4j.LoggerFactory;
39  import org.springframework.beans.factory.annotation.Autowired;
40  import org.springframework.stereotype.Service;
41  
42  import java.util.List;
43  import java.util.Map;
44  import java.util.Objects;
45  import java.util.stream.Collectors;
46  
47  @Service("batchService")
48  public class BatchServiceImpl implements BatchService {
49  
50  	private static final Logger log = LoggerFactory.getLogger(BatchServiceImpl.class);
51  
52  	@Autowired
53  	protected BatchDao batchDao;
54  
55  	@Autowired
56  	protected MeasurementDao measurementDao;
57  
58  	@Autowired
59  	protected PmfmService pmfmService;
60  
61  	@Override
62  	public List<BatchVO> getAllByOperationId(int operationId) {
63  		return batchDao.getAllByOperationId(operationId);
64  	}
65  
66  	@Override
67  	public BatchVO get(int saleId) {
68  		return batchDao.get(saleId);
69  	}
70  
71  	@Override
72  	public List<BatchVO> saveByOperationId(int operationId, List<BatchVO> sources) {
73  
74  		List<BatchVO> result = batchDao.saveByOperationId(operationId, sources);
75  
76  		// Save measurements
77  		result.stream().forEach(savedBatch -> {
78  			// If only one maps: distinguish each item
79  			if (savedBatch.getMeasurementValues() != null) {
80  
81  				Map<Integer, String> quantificationMeasurements = Maps.newLinkedHashMap();
82  				Map<Integer, String> sortingMeasurements = Maps.newLinkedHashMap();
83  				savedBatch.getMeasurementValues().forEach((pmfmId, value) -> {
84  					if (pmfmService.isWeightPmfm(pmfmId)) {
85  						quantificationMeasurements.put(pmfmId, value);
86  					}
87  					else {
88  						sortingMeasurements.put(pmfmId, value);
89  					}
90  				});
91  				measurementDao.saveBatchSortingMeasurementsMap(savedBatch.getId(), sortingMeasurements);
92  				measurementDao.saveBatchQuantificationMeasurementsMap(savedBatch.getId(), quantificationMeasurements);
93  			}
94  			else {
95  				// Sorting measurement
96  				if (savedBatch.getSortingMeasurements() != null) {
97  					measurementDao.saveBatchSortingMeasurementsMap(savedBatch.getId(), savedBatch.getSortingMeasurementValues());
98  				} else {
99  					List<MeasurementVO> measurements = Beans.getList(savedBatch.getSortingMeasurements());
100 					measurements.forEach(m -> fillDefaultProperties(savedBatch, m, BatchSortingMeasurement.class));
101 					measurements = measurementDao.saveBatchSortingMeasurements(savedBatch.getId(), measurements);
102 					savedBatch.setSortingMeasurements(measurements);
103 				}
104 
105 				// Quantification measurement
106 				if (savedBatch.getQuantificationMeasurements() != null) {
107 					measurementDao.saveBatchQuantificationMeasurementsMap(savedBatch.getId(), savedBatch.getQuantificationMeasurementValues());
108 				} else {
109 					List<MeasurementVO> measurements = Beans.getList(savedBatch.getQuantificationMeasurements());
110 					measurements.forEach(m -> fillDefaultProperties(savedBatch, m, BatchQuantificationMeasurement.class));
111 					measurements = measurementDao.saveBatchQuantificationMeasurements(savedBatch.getId(), measurements);
112 					savedBatch.setQuantificationMeasurements(measurements);
113 				}
114 			}
115 		});
116 
117 		return result;
118 	}
119 
120 	@Override
121 	public BatchVOef="../../../../../net/sumaris/core/vo/data/BatchVO.html#BatchVO">BatchVO save(BatchVO batch) {
122 		Preconditions.checkNotNull(batch);
123 		Preconditions.checkArgument((batch.getOperation() != null && batch.getOperation().getId() != null) || batch.getOperationId() != null, "Missing batch.operation or batch.operationId");
124 		Preconditions.checkNotNull(batch.getRecorderDepartment(), "Missing batch.recorderDepartment");
125 		Preconditions.checkNotNull(batch.getRecorderDepartment().getId(), "Missing batch.recorderDepartment.id");
126 
127 		return batchDao.save(batch);
128 	}
129 
130 	@Override
131 	public List<BatchVO> save(List<BatchVO> sales) {
132 		Preconditions.checkNotNull(sales);
133 
134 		return sales.stream()
135 				.map(this::save)
136 				.collect(Collectors.toList());
137 	}
138 
139 	@Override
140 	public void delete(int id) {
141 		batchDao.delete(id);
142 	}
143 
144 	@Override
145 	public void delete(List<Integer> ids) {
146 		Preconditions.checkNotNull(ids);
147 		ids.stream()
148 				.filter(Objects::nonNull)
149 				.forEach(this::delete);
150 	}
151 
152 	@Override
153 	public List<BatchVO> toFlatList(final BatchVO catchBatch) {
154 		return batchDao.toFlatList(catchBatch);
155 	}
156 
157 	/* -- protected methods -- */
158 
159 	protected void fillDefaultProperties(BatchVO parent, MeasurementVO measurement, Class<? extends IMeasurementEntity> entityClass) {
160 		if (measurement == null) return;
161 
162 		// Copy recorder department from the parent
163 		if (measurement.getRecorderDepartment() == null || measurement.getRecorderDepartment().getId() == null) {
164 			measurement.setRecorderDepartment(parent.getRecorderDepartment());
165 		}
166 
167 		measurement.setEntityName(entityClass.getSimpleName());
168 	}
169 }