/* fEMR - fast Electronic Medical Records Copyright (C) 2014 Team fEMR fEMR is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. fEMR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with fEMR. If not, see <http://www.gnu.org/licenses/>. If you have any questions, contact <info@teamfemr.org>. */ package femr.business.services.system; import com.avaje.ebean.ExpressionList; import com.avaje.ebean.Query; import com.google.inject.Inject; import com.google.inject.name.Named; import femr.business.helpers.QueryProvider; import femr.business.services.core.IVitalService; import femr.common.IItemModelMapper; import femr.common.dtos.ServiceResponse; import femr.common.models.VitalItem; import femr.data.IDataModelMapper; import femr.data.daos.IRepository; import femr.data.models.core.IPatientEncounterVital; import femr.data.models.core.ISystemSetting; import femr.data.models.core.IVital; import femr.data.models.mysql.PatientEncounterVital; import femr.data.models.mysql.SystemSetting; import femr.data.models.mysql.Vital; import femr.util.DataStructure.Mapping.VitalMultiMap; import femr.util.calculations.LocaleUnitConverter; import femr.util.calculations.dateUtils; import java.util.ArrayList; import java.util.List; import java.util.Map; public class VitalService implements IVitalService { private final IRepository<IPatientEncounterVital> patientEncounterVitalRepository; private final IRepository<IVital> vitalRepository; private final IDataModelMapper dataModelMapper; private final IRepository<ISystemSetting> systemSettingRepository; private final IItemModelMapper itemModelMapper; @Inject public VitalService(IRepository<IPatientEncounterVital> patientEncounterVitalRepository, IRepository<IVital> vitalRepository, IDataModelMapper dataModelMapper, IRepository<ISystemSetting> settingsReposity, @Named("identified") IItemModelMapper itemModelMapper) { this.patientEncounterVitalRepository = patientEncounterVitalRepository; this.vitalRepository = vitalRepository; this.dataModelMapper = dataModelMapper; this.systemSettingRepository = settingsReposity; this.itemModelMapper = itemModelMapper; } /** * {@inheritDoc} */ @Override public ServiceResponse<List<VitalItem>> createPatientEncounterVitals(Map<String, Float> patientEncounterVitalMap, int userId, int encounterId) { ServiceResponse<List<VitalItem>> response = new ServiceResponse<>(); if (patientEncounterVitalMap == null || userId < 1 || encounterId < 1) { response.addError("", "invalid parameters"); return response; } List<IPatientEncounterVital> patientEncounterVitals = new ArrayList<>(); IPatientEncounterVital patientEncounterVital; IVital vital; ExpressionList<Vital> query; String currentTime = dateUtils.getCurrentDateTimeString(); // Convert vitals to imperial for storing in DB if (isMetric()) LocaleUnitConverter.toImperial(patientEncounterVitalMap); for (String key : patientEncounterVitalMap.keySet()) { if (patientEncounterVitalMap.get(key) != null) { query = QueryProvider.getVitalQuery().where().eq("name", key); vital = vitalRepository.findOne(query); patientEncounterVitals.add(dataModelMapper.createPatientEncounterVital(encounterId, userId, currentTime, vital.getId(), patientEncounterVitalMap.get(key))); } } try { List<VitalItem> vitalItems = new ArrayList<>(); List<? extends IPatientEncounterVital> newPatientEncounterVitals = patientEncounterVitalRepository.createAll(patientEncounterVitals); for (IPatientEncounterVital pev : newPatientEncounterVitals) { if (pev.getVital() != null) vitalItems.add(itemModelMapper.createVitalItem(pev.getVital().getName(), pev.getVitalValue())); } response.setResponseObject(vitalItems); } catch (Exception ex) { response.addError("exception", ex.getMessage()); } return response; } /** * {@inheritDoc} */ @Override public ServiceResponse<List<VitalItem>> retrieveAllVitalItems() { ServiceResponse<List<VitalItem>> response = new ServiceResponse<>(); try { List<? extends IVital> vitals = vitalRepository.findAll(Vital.class); List<VitalItem> vitalItems = new ArrayList<>(); for (IVital v : vitals) { vitalItems.add(itemModelMapper.createVitalItem(v.getName(), null)); } response.setResponseObject(vitalItems); } catch (Exception ex) { response.addError("exception", ex.getMessage()); } return response; } /** * {@inheritDoc} */ @Override public ServiceResponse<List<VitalItem>> createPatientEncounterVitalItems(Map<String, Float> patientEncounterVitalMap, int userId, int encounterId) { ServiceResponse<List<VitalItem>> response = new ServiceResponse<>(); if (patientEncounterVitalMap == null) { response.addError("", "bad parameters"); return response; } List<IPatientEncounterVital> patientEncounterVitals = new ArrayList<>(); IPatientEncounterVital patientEncounterVital; IVital vital; ExpressionList<Vital> query; String currentTime = dateUtils.getCurrentDateTimeString(); // Convert vitals to imperial for storing in DB if (isMetric()) LocaleUnitConverter.toImperial(patientEncounterVitalMap); try { for (String key : patientEncounterVitalMap.keySet()) { if (patientEncounterVitalMap.get(key) != null) { query = QueryProvider.getVitalQuery().where().eq("name", key); vital = vitalRepository.findOne(query); patientEncounterVitals.add(dataModelMapper.createPatientEncounterVital(encounterId, userId, currentTime, vital.getId(), patientEncounterVitalMap.get(key))); } } List<? extends IPatientEncounterVital> newPatientEncounterVitals = patientEncounterVitalRepository.createAll(patientEncounterVitals); List<VitalItem> vitalItems = new ArrayList<>(); for (IPatientEncounterVital pev : patientEncounterVitals) { if (pev.getVital() != null) vitalItems.add(itemModelMapper.createVitalItem(pev.getVital().getName(), pev.getVitalValue())); } response.setResponseObject(vitalItems); } catch (Exception ex) { response.addError("exception", ex.getMessage()); } return response; } /** * {@inheritDoc} */ @Override public ServiceResponse<VitalMultiMap> retrieveVitalMultiMap(int encounterId) { ServiceResponse<VitalMultiMap> response = new ServiceResponse<>(); VitalMultiMap vitalMultiMap = new VitalMultiMap(); Query<PatientEncounterVital> query = QueryProvider.getPatientEncounterVitalQuery() .where() .eq("patient_encounter_id", encounterId) .order() .desc("date_taken"); try { List<? extends IPatientEncounterVital> patientEncounterVitals = patientEncounterVitalRepository.find(query); if (patientEncounterVitals != null) { for (IPatientEncounterVital vitalData : patientEncounterVitals) { vitalMultiMap.put(vitalData.getVital().getName(), vitalData.getDateTaken().trim(), vitalData.getVitalValue()); } } // convert the multimap to metric - if condition removed and converting to metric for dual unit display // if (isMetric()) { vitalMultiMap = LocaleUnitConverter.toMetric(vitalMultiMap); } catch (Exception ex) { response.addError("", "bad query"); } response.setResponseObject(vitalMultiMap); return response; } /** * Gets isActive of the metric setting * @return */ private boolean isMetric() { ExpressionList<SystemSetting> query = QueryProvider.getSystemSettingQuery() .where() .eq("name", "Metric System Option"); ISystemSetting isMetric = systemSettingRepository.findOne(query); return isMetric.isActive(); } }