package com.healthcare.ohctech.service.impl; import com.healthcare.ohctech.dto.TreatmentDto; import com.healthcare.ohctech.dto.TreatmentExternalDto; import com.healthcare.ohctech.dto.TreatmentInternalExternalDto; import com.healthcare.ohctech.entity.*; import com.healthcare.ohctech.repository.*; import com.healthcare.ohctech.service.TreatmentService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; @Service public class TreatmentServiceImpl implements TreatmentService { @Autowired private TreatmentRepo treatmentRepo; @Autowired private TreatmentExternalRepo treatmentExternalRepo; @Autowired private EmployeeAppointmentRepo employeeAppointmentRepo; @Autowired private ItemRepo itemRepo; @Autowired private MedicineFrequencyRepo medicineFrequencyRepo; @Autowired private MedicineTimingRepo medicineTimingRepo; @Autowired private RouteOfAdministrationRepo routeOfAdministrationRepo; @Override public List getTreatmentByAppointmentId(Long appointmentId) { return treatmentRepo.findByEmployeeAppointmentId(appointmentId); } @Override public List getTreatmentExternalsByAppointmentId(Long appointmentId) { return treatmentExternalRepo.findByEmployeeAppointmentId(appointmentId); } @Override public Page getAllTreatments(Pageable pageable) { return treatmentRepo.findAll(pageable); } @Override public Page getAllTreatmentExternals(Pageable pageable) { return treatmentExternalRepo.findAll(pageable); } @Override public void addTreatmentOrExternal(TreatmentInternalExternalDto treatmentInternalExternalDto, Long userId) { List treatments = new ArrayList<>(); List treatmentExternals = new ArrayList<>(); for (TreatmentDto dto : treatmentInternalExternalDto.treatmentDtos()) { if (dto.appointmentId() != null || dto.itemId() != null) { Treatment treatment = convertToInternalEntity(new Treatment(), dto); treatment.setModifiedBy(userId); treatments.add(treatment); } } for (TreatmentExternalDto dto : treatmentInternalExternalDto.treatmentExternalDtos()) { TreatmentExternal treatmentExternal = convertToExternalEntity(new TreatmentExternal(), dto); treatmentExternal.setModifiedBy(userId); treatmentExternals.add(treatmentExternal); } treatmentRepo.saveAll(treatments); treatmentExternalRepo.saveAll(treatmentExternals); } @Override public void updateTreatmentOrExternal(TreatmentInternalExternalDto treatmentInternalExternalDto, Long userId) { Long appointmentId = treatmentInternalExternalDto.treatmentDtos().get(0).appointmentId(); treatmentRepo.deleteByEmployeeAppointmentId(appointmentId); treatmentExternalRepo.deleteByEmployeeAppointmentId(appointmentId); addTreatmentOrExternal(treatmentInternalExternalDto, userId); } private Treatment convertToInternalEntity(Treatment treatment, TreatmentDto dto) { if (dto.appointmentId() != null) { EmployeeAppointment employeeAppointment = employeeAppointmentRepo.findById(dto.appointmentId()) .orElseThrow(() -> new RuntimeException("Ohc not found for ID: " + dto.appointmentId())); treatment.setEmployeeAppointment(employeeAppointment); } if (dto.itemId() != null) { Item item = itemRepo.findByIdWithMedicineForm(dto.itemId()) .orElseThrow(() -> new RuntimeException("Ohc not found for ID: " + dto.itemId())); treatment.setItem(item); } if (dto.frequencyId() != null) { MedicineFrequency medicineFrequency = medicineFrequencyRepo.findById(dto.frequencyId()) .orElseThrow(() -> new RuntimeException("Ohc not found for ID: " + dto.frequencyId())); treatment.setMedicineFrequency(medicineFrequency); } if (dto.timingId() != null) { MedicineTiming medicineTiming = medicineTimingRepo.findById(dto.timingId()) .orElseThrow(() -> new RuntimeException("Ohc not found for ID: " + dto.timingId())); treatment.setMedicineTiming(medicineTiming); } if (dto.dosageCategoryId() != null) { RouteOfAdministration routeOfAdministration = routeOfAdministrationRepo.findById(dto.dosageCategoryId()) .orElseThrow(() -> new RuntimeException("Ohc not found for ID: " + dto.dosageCategoryId())); treatment.setRouteOfAdministration(routeOfAdministration); } treatment.setForDays(dto.forDays()); treatment.setDosage(dto.dosage()); treatment.setItemQty(dto.itemQty()); treatment.setItemBatchNo(dto.itemBatchNo()); treatment.setIssuedQty(dto.issuedQty()); treatment.setIssueBy(dto.issueBy()); treatment.setIsDisplay(dto.isDisplay()); treatment.setGroupItemId(dto.groupItemId()); treatment.setFollowupId(dto.followupId()); return treatment; } private TreatmentExternal convertToExternalEntity(TreatmentExternal treatmentExternal, TreatmentExternalDto dto) { if (dto.appointmentId() != null) { EmployeeAppointment employeeAppointment = employeeAppointmentRepo.findById(dto.appointmentId()) .orElseThrow(() -> new RuntimeException("Ohc not found for ID: " + dto.appointmentId())); treatmentExternal.setEmployeeAppointment(employeeAppointment); } treatmentExternal.setFollowupId(dto.followupId()); treatmentExternal.setItemName(dto.itemName()); treatmentExternal.setFrequency(dto.frequency()); treatmentExternal.setForDays(dto.forDays()); treatmentExternal.setItemQty(dto.itemQty()); treatmentExternal.setDosage(dto.dosage()); if (dto.timing() != null) { MedicineTiming medicineTiming = medicineTimingRepo.findById(dto.timing()) .orElseThrow(() -> new RuntimeException("Ohc not found for ID: " + dto.timing())); treatmentExternal.setMedicineTiming(medicineTiming); } if (dto.dosageCategoryId() != null) { RouteOfAdministration routeOfAdministration = routeOfAdministrationRepo.findById(dto.dosageCategoryId()) .orElseThrow(() -> new RuntimeException("Ohc not found for ID: " + dto.dosageCategoryId())); treatmentExternal.setRouteOfAdministration(routeOfAdministration); } return treatmentExternal; } }