Skip to content
Snippets Groups Projects
MyDiagnosisAction.java 6.96 KiB
Newer Older
  • Learn to ignore specific revisions
  • HMoss's avatar
    HMoss committed
    package edu.ncsu.csc.itrust.action;
    
    import java.io.Serializable;
    import java.util.*;
    import edu.ncsu.csc.itrust.beans.DiagnosisBean;
    import edu.ncsu.csc.itrust.beans.HCPDiagnosisBean;
    import edu.ncsu.csc.itrust.beans.OfficeVisitBean;
    import edu.ncsu.csc.itrust.beans.PrescriptionBean;
    import edu.ncsu.csc.itrust.beans.MedicationBean;
    import edu.ncsu.csc.itrust.beans.SurveyBean;
    import edu.ncsu.csc.itrust.beans.LabProcedureBean;
    import edu.ncsu.csc.itrust.dao.DAOFactory;
    import edu.ncsu.csc.itrust.dao.mysql.PatientDAO;
    import edu.ncsu.csc.itrust.dao.mysql.PrescriptionsDAO;
    import edu.ncsu.csc.itrust.dao.mysql.OfficeVisitDAO;
    import edu.ncsu.csc.itrust.dao.mysql.SurveyDAO;
    import edu.ncsu.csc.itrust.dao.mysql.PersonnelDAO;
    import edu.ncsu.csc.itrust.dao.mysql.LabProcedureDAO;
    import edu.ncsu.csc.itrust.exception.DBException;
    import edu.ncsu.csc.itrust.exception.ITrustException;
    
    /**
     * Edits the privacy levels of diagnoses, used by myDiagnoses.jsp
     * 
     * 
     */
    public class MyDiagnosisAction {
    	
    	private OfficeVisitDAO officeVisitDAO;
    	private PatientDAO patientDAO;
    	private PersonnelDAO personnelDAO;
    	private SurveyDAO surveyDAO;
    	private LabProcedureDAO labprocDAO;
    	private PrescriptionsDAO prescriptionsDAO;
    	private long loggedInMID;
    
    	/**
    	 * Set up for defaults
    	 * 
    	 * @param factory The DAOFactory used to create the DAOs used in this action.
    	 * @param loggedInMID The MID of the user who is looking at their diagnoses.
    	 * @throws ITrustException
    	 */
    	public MyDiagnosisAction(DAOFactory factory, long loggedInMID) throws ITrustException {
    		this.loggedInMID = loggedInMID;
    		this.patientDAO = factory.getPatientDAO();
    		this.officeVisitDAO = factory.getOfficeVisitDAO();
    		this.personnelDAO = factory.getPersonnelDAO();
    		this.surveyDAO = factory.getSurveyDAO();
    		this.labprocDAO = factory.getLabProcedureDAO();
    		this.prescriptionsDAO = factory.getPrescriptionsDAO();
    	}
    	
    	/**
    	 * Returns a list of DiagnosisBeans for the patient
    	 * 
    	 * @return the list of DiagnosisBeans
    	 * @throws DBException
    	 */
    	public List<DiagnosisBean> getDiagnoses() throws DBException {
    		return patientDAO.getDiagnoses(loggedInMID);
    	}
    	
    	/**
    	 * Returns a list of all the HCPs who have a particular diagnosis
    	 * 
    	 * @param icdcode the diagnosis of interest
    	 * @return the list of HCPs
    	 * @throws DBException
    	 */
    	public List<HCPDiagnosisBean> getHCPByDiagnosis(String icdcode) throws DBException {
    		
    		int medMatch = 0;
    		HashMap<Long, HCPDiagnosisBean> hcpHash = new HashMap<Long, HCPDiagnosisBean>();
    		HashMap<Long, Long> patientHash = new HashMap<Long, Long>();
    	
    		HCPDiagnosisBean diag = null;
    		List<OfficeVisitBean> beans = officeVisitDAO.getAllOfficeVisitsForDiagnosis(icdcode);
    		
    		for (OfficeVisitBean bean: beans) {
    			
    			// check for HCP-Patient locality based on first 3 digits in ZIP
    			if (!patientDAO.getPatient(loggedInMID).getZip().substring(0, 2).equals(personnelDAO.getPersonnel(bean.getHcpID()).getZip().substring(0, 2)))
    				continue;
    			
    			// Check to see if we already have a bean for the HCP associated with this visit
    			if (hcpHash.containsKey(bean.getHcpID())) {
    				diag = hcpHash.get(bean.getHcpID());
    				// get all prescriptions associated with an office visit
    				List<PrescriptionBean> prescriptions = prescriptionsDAO.getList(bean.getID());
    				for (PrescriptionBean p: prescriptions) {
    					List<MedicationBean> mlist = diag.getMedList();
    					
    					for (MedicationBean b: mlist) {
    						if (p.getMedication().getDescription().equals(b.getDescription()))
    							medMatch++;
    					}
    					if (medMatch == 0) {
    						mlist.add(p.getMedication());
    						diag.setMedList(mlist);
    					}
    					else {
    						medMatch = 0;
    					}
    				}
    				
    				// Get Lab Procedures
    				List<LabProcedureBean> labprocs = diag.getLabList(); 
    				List<LabProcedureBean> lpbeans = labprocDAO.getAllLabProceduresForDocOV(bean.getVisitID());
    				for (LabProcedureBean p: lpbeans) {
    					labprocs.add(p);
    				}
    				diag.setLabList(labprocs);
    				
    				
    				if (surveyDAO.isSurveyCompleted(bean.getVisitID())) {
    					SurveyBean survey = surveyDAO.getSurveyData(bean.getVisitID());
    					diag.setVisitSat(survey.getVisitSatisfaction());
    					diag.setTreatmentSat(survey.getTreatmentSatisfaction());
    				}
    				
    				// Check if this patient has been seen multiple times for this diagnosis
    				if (!patientHash.containsKey(bean.getPatientID())) {
    					patientHash.put(bean.getPatientID(), bean.getHcpID());
    					diag.incNumPatients();
    				}
    			}
    			else {
    				diag = new HCPDiagnosisBean();
    				List<MedicationBean> mlist = new ArrayList<MedicationBean>();
    				diag.setHCP(bean.getHcpID());
    				try {
    					diag.setHCPName(personnelDAO.getName(bean.getHcpID()));
    				} catch (ITrustException e) {
    					diag.setHCPName("null");
    				}
    				diag.incNumPatients();
    				List<PrescriptionBean> prescriptions = prescriptionsDAO.getList(bean.getID());
    				for (PrescriptionBean p: prescriptions) {
    					mlist.add(p.getMedication());
    				}
    				diag.setMedList(mlist);
    				diag.setLabList(labprocDAO.getAllLabProceduresForDocOV(bean.getVisitID()));
    				
    				if (surveyDAO.isSurveyCompleted(bean.getVisitID())) {
    					SurveyBean survey = surveyDAO.getSurveyData(bean.getVisitID());
    					diag.setVisitSat(survey.getVisitSatisfaction());
    					diag.setTreatmentSat(survey.getTreatmentSatisfaction());
    				}
    				
    				patientHash.put(bean.getPatientID(), bean.getHcpID());
    				hcpHash.put(bean.getHcpID(), diag);
    			}
    		}
    		List<HCPDiagnosisBean> list = new ArrayList<HCPDiagnosisBean>(hcpHash.values());
    		Collections.sort(list, new HCPDiagnosisBeanComparator() );
    		return list;
    	}
    	
    	/**
    	 * Looks up all the prescriptions given by a certain HCP with the same ICD code.
    	 * @param hcpid The MID of the HCP
    	 * @param icdcode The ICD code of the prescription we are looking up.
    	 * @return A java.util.List of PrescriptionBeans made by this HCP of this ICD code.
    	 * @throws DBException
    	 */
    	public List<PrescriptionBean> getPrescriptionsByHCPAndICD(long hcpid, String icdcode) throws DBException {
    		List<PrescriptionBean> list = new ArrayList<PrescriptionBean>();
    		
    		List<OfficeVisitBean> ovs = officeVisitDAO.getAllOfficeVisitsForDiagnosis(icdcode);
    		for (int i = 0; i < ovs.size(); i++) {
    			if (ovs.get(i).getHcpID() == hcpid) {
    				long ovid = ovs.get(i).getID();
    				List<PrescriptionBean> prescriptions = prescriptionsDAO.getList(ovid);
    				list.addAll(prescriptions);
    			}
    		}
    		
    		return list;
    		
    		
    	}
    	
    	
    	/**
    	 * Checks to see what HCP has had the most experience with a diagnosis
    	 *
    	 */
    	public static class HCPDiagnosisBeanComparator implements Comparator<HCPDiagnosisBean>, Serializable {
    		
    		private static final long serialVersionUID = -6328390386684022934L;
    
    		/**
    		 * Compares one HCP with another
    		 * 
    		 * @param a the first HCP
    		 * @param b the second HCP
    		 * @return -1 if a has had more patients, 1 if b has had more patients; otherwise 0
    		 */
    		public int compare(HCPDiagnosisBean a, HCPDiagnosisBean b) {
    			int ret = 0;
    			
    			if (a.getNumPatients() > b.getNumPatients())
    				ret = -1;
    			else if (a.getNumPatients() < b.getNumPatients())
    				ret = 1;
    			
    			return ret;
    		}
    	}
    	
    }