/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package open.dolphin.adm10.session; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.Iterator; import java.util.List; import javax.ejb.Stateless; import javax.inject.Named; import javax.persistence.EntityManager; import javax.persistence.NoResultException; import javax.persistence.PersistenceContext; import open.dolphin.infomodel.AllergyModel; import open.dolphin.infomodel.AttachmentModel; import open.dolphin.infomodel.DocumentModel; import open.dolphin.infomodel.HealthInsuranceModel; import open.dolphin.infomodel.IInfoModel; import open.dolphin.infomodel.KarteNumber; import open.dolphin.infomodel.IStampTreeModel; import open.dolphin.infomodel.KarteBean; import open.dolphin.infomodel.ModuleModel; import open.dolphin.infomodel.NLaboItem; import open.dolphin.infomodel.NLaboModule; //import open.dolphin.infomodel.NurseProgressCourseModel; import open.dolphin.infomodel.ObservationModel; //import open.dolphin.infomodel.OndobanModel; import open.dolphin.infomodel.PatientMemoModel; import open.dolphin.infomodel.PatientModel; import open.dolphin.infomodel.RegisteredDiagnosisModel; import open.dolphin.infomodel.SchemaModel; import open.dolphin.infomodel.StampModel; import open.dolphin.infomodel.StampTreeModel; import open.dolphin.infomodel.VitalModel; /** * * @author kazushi */ @Named @Stateless public class ADM10_EHTServiceBean { // Karte private static final String QUERY_KARTE = "from KarteBean k where k.patient.id=:patientPk"; // Document & module private static final String QUERY_DOCUMENT_BY_PK = "from DocumentModel d where d.id=:pk"; private static final String QUERY_DOCUMENT_BY_LINK_ID = "from DocumentModel d where d.linkId=:id"; private static final String QUERY_MODULE_BY_DOCUMENT = "from ModuleModel m where m.document.id=:id"; private static final String QUERY_SCHEMA_BY_DOCUMENT = "from SchemaModel i where i.document.id=:id"; private static final String QUERY_ATTACHMENT_BY_DOC_ID = "from AttachmentModel a where a.document.id=:id"; private static final String QUERY_MODULE_BY_ENTITY = "from ModuleModel m where m.karte.id=:karteId and m.moduleInfo.entity=:entity and m.status='F' order by m.started desc"; // memo private static final String QUERY_PATIENT_MEMO = "from PatientMemoModel p where p.karte.id=:karteId"; // Allergy private static final String QUERY_ALLERGY_BY_KARTE_ID = "from ObservationModel o where o.karte.id=:karteId and o.observation='Allergy'"; // Diagnosis private static final String QUERY_DIAGNOSIS_BY_KARTE_ACTIVEONLY_DESC = "from RegisteredDiagnosisModel r where r.karte.id=:karteId and r.ended is NULL order by r.started desc"; private static final String QUERY_DIAGNOSIS_BY_KARTE_DESC = "from RegisteredDiagnosisModel r where r.karte.id=:karteId order by r.started desc"; private static final String QUERY_DIAGNOSIS_BY_KARTE_OUTCOMEONLY_DESC = "from RegisteredDiagnosisModel r where r.karte.id=:karteId and r.ended is not NULL order by r.started desc"; private static final String QUERY_INSURANCE_BY_PATIENT_PK = "from HealthInsuranceModel h where h.patient.id=:pk"; // バイタル対応 private static final String QUERY_VITAL_BY_ID = "from VitalModel v where v.id=:id"; private static final String ID = "id"; @PersistenceContext private EntityManager em; // 患者メモ public PatientMemoModel getPatientMemo(long ptPK) { KarteBean karte = (KarteBean) em.createQuery(QUERY_KARTE) .setParameter("patientPk", ptPK) .getSingleResult(); // メモを取得する List<PatientMemoModel> memoList = (List<PatientMemoModel>)em.createQuery(QUERY_PATIENT_MEMO) .setParameter("karteId", karte.getId()) .getResultList(); return (!memoList.isEmpty()) ? memoList.get(0) : null; } public int addPatientMemo(PatientMemoModel model) { //em.persist(model); if(model.getKarteBean() != null) { List<PatientMemoModel> memoList = (List<PatientMemoModel>)em.createQuery(QUERY_PATIENT_MEMO) .setParameter("karteId", model.getKarteBean().getId()) .getResultList(); if(memoList.isEmpty()) { em.persist(model); }else{ PatientMemoModel pmm = memoList.get(0); pmm.setMemo(model.getMemo()); em.merge(pmm); } }else{ em.persist(model); } return 1; } public int updatePatientMemo(PatientMemoModel model) { em.merge(model); return 1; } public int deletePatientMemo(PatientMemoModel model) { PatientMemoModel delete = em.find(PatientMemoModel.class, model.getId()); em.remove(delete); return 1; } // Allergy public List<AllergyModel> getAllergies(long patientPk) { List<AllergyModel> retList = new ArrayList<>(); KarteBean karte = (KarteBean) em.createQuery(QUERY_KARTE) .setParameter("patientPk", patientPk) .getSingleResult(); List<ObservationModel> observations = (List<ObservationModel>)em.createQuery(QUERY_ALLERGY_BY_KARTE_ID) .setParameter("karteId", karte.getId()) .getResultList(); for (ObservationModel observation : observations) { AllergyModel allergy = new AllergyModel(); allergy.setObservationId(observation.getId()); allergy.setFactor(observation.getPhenomenon()); allergy.setSeverity(observation.getCategoryValue()); allergy.setIdentifiedDate(observation.confirmDateAsString()); allergy.setMemo(observation.getMemo()); retList.add(allergy); } return retList; } public int addAllergy(ObservationModel model) { em.persist(model); return 1; } public int updateAllergy(ObservationModel model) { em.merge(model); return 1; } public int deleteAllergy(ObservationModel model) { ObservationModel target = em.find(ObservationModel.class, model.getId()); em.remove(target); return 1; } // Active 病名のみ public List<RegisteredDiagnosisModel> getDiagnosis(long patientPk, boolean active, boolean outcomeOnly, int firstResult, int maxResult) { List<RegisteredDiagnosisModel> ret; KarteBean karte = (KarteBean) em.createQuery(QUERY_KARTE) .setParameter("patientPk", patientPk) .getSingleResult(); if (active) { // 疾患開始日の降順 i.e. 直近分 ret = em.createQuery(QUERY_DIAGNOSIS_BY_KARTE_ACTIVEONLY_DESC) .setParameter("karteId", karte.getId()) .setFirstResult(firstResult) .setMaxResults(maxResult) .getResultList(); } else if (outcomeOnly) { ret = em.createQuery(QUERY_DIAGNOSIS_BY_KARTE_OUTCOMEONLY_DESC) .setParameter("karteId", karte.getId()) .setFirstResult(firstResult) .setMaxResults(maxResult) .getResultList(); } else { ret = em.createQuery(QUERY_DIAGNOSIS_BY_KARTE_DESC) .setParameter("karteId", karte.getId()) .setFirstResult(firstResult) .setMaxResults(maxResult) .getResultList(); } return ret; } public int addDiagnosis(RegisteredDiagnosisModel model) { em.persist(model); return 1; } public int updateDiagnosis(RegisteredDiagnosisModel model) { em.merge(model); return 1; } public int deleteDiagnosis(RegisteredDiagnosisModel model) { RegisteredDiagnosisModel delete = em.find(RegisteredDiagnosisModel.class, model.getId()); em.remove(delete); return 1; } // EHT Karte public KarteNumber getKarteNumber(long ptPK) { KarteNumber ret = new KarteNumber(); // Karte KarteBean karte = (KarteBean) em.createQuery(QUERY_KARTE) .setParameter("patientPk", ptPK) .getSingleResult(); ret.setKarteNumber(karte.getId()); ret.setCreated(karte.getCreated()); return ret; } // Document public DocumentModel getDocumentByPk(long docPk) { DocumentModel ret; ret = (DocumentModel) em.createQuery(QUERY_DOCUMENT_BY_PK) .setParameter("pk", docPk) .getSingleResult(); // module List<ModuleModel> modules = em.createQuery(QUERY_MODULE_BY_DOCUMENT) .setParameter("id", ret.getId()) .getResultList(); ret.setModules(modules); // SchemaModel を取得する List<SchemaModel> images = em.createQuery(QUERY_SCHEMA_BY_DOCUMENT) .setParameter("id", ret.getId()) .getResultList(); ret.setSchema(images); // AttachmentModel を取得する List attachments = em.createQuery(QUERY_ATTACHMENT_BY_DOC_ID) .setParameter("id", ret.getId()) .getResultList(); ret.setAttachment(attachments); return ret; } public List<String> deleteDocumentByPk(long id) { //---------------------------------------- // 参照されているDocumentの場合は例外を投げる //---------------------------------------- Collection refs = em.createQuery(QUERY_DOCUMENT_BY_LINK_ID) .setParameter("id", id).getResultList(); if (refs != null && refs.size() >0) { RuntimeException ce = new RuntimeException("他のドキュメントから参照されているため削除できません。"); throw ce; } // 終了日 Date ended = new Date(); // 削除件数 int cnt=0; // 削除リスト 文書ID List<String> list = new ArrayList<>(); // Loop で削除 while (true) { try { //----------------------- // 対象 Document を取得する //----------------------- DocumentModel delete = (DocumentModel)em.find(DocumentModel.class, id); //------------------------ // 削除フラグをたてる //------------------------ delete.setStatus(IInfoModel.STATUS_DELETE); delete.setEnded(ended); cnt++; list.add(delete.getDocInfoModel().getDocId()); //------------------------------ // 関連するモジュールに同じ処理を行う //------------------------------ Collection deleteModules = em.createQuery(QUERY_MODULE_BY_DOCUMENT) .setParameter("id", id).getResultList(); for (Iterator iter = deleteModules.iterator(); iter.hasNext(); ) { ModuleModel model = (ModuleModel) iter.next(); model.setStatus(IInfoModel.STATUS_DELETE); model.setEnded(ended); } //------------------------------ // 関連する画像に同じ処理を行う //------------------------------ Collection deleteImages = em.createQuery(QUERY_SCHEMA_BY_DOCUMENT) .setParameter("id", id).getResultList(); for (Iterator iter = deleteImages.iterator(); iter.hasNext(); ) { SchemaModel model = (SchemaModel) iter.next(); model.setStatus(IInfoModel.STATUS_DELETE); model.setEnded(ended); } //------------------------------ // 関連するAttachmentに同じ処理を行う //------------------------------ Collection deleteAttachments = em.createQuery(QUERY_ATTACHMENT_BY_DOC_ID) .setParameter("id", id).getResultList(); for (Iterator iter = deleteAttachments.iterator(); iter.hasNext(); ) { AttachmentModel model = (AttachmentModel)iter.next(); model.setStatus(IInfoModel.STATUS_DELETE); model.setEnded(ended); } // 削除したDocumentのlinkID を 削除するDocument id(PK) にしてLoopさせる id = delete.getLinkId(); } catch (Exception e) { break; } } return list; } //------------------------------------------------------------------------ // 相互作用 関連 //------------------------------------------------------------------------ public List<ModuleModel> collectModules(long patientPk, Date fromDate, Date toDate, List<String> entities) { // 指定したentityのModuleModelを返す List<ModuleModel> ret; KarteBean karte = (KarteBean) em.createQuery(QUERY_KARTE) .setParameter("patientPk", patientPk) .getSingleResult(); if (entities!=null && entities.size()>0) { final String sql = "from ModuleModel m where m.karte.id = :karteId " + "and m.started between :fromDate and :toDate and m.status='F' " + "and m.moduleInfo.entity in (:entities)"; ret = em.createQuery(sql) .setParameter("karteId", karte.getId()) .setParameter("fromDate", fromDate) .setParameter("toDate", toDate) .setParameter("entities", entities) .getResultList(); } else { final String sql = "from ModuleModel m where m.karte.id = :karteId " + "and m.started between :fromDate and :toDate and m.status='F' "; ret = em.createQuery(sql) .setParameter("karteId", karte.getId()) .setParameter("fromDate", fromDate) .setParameter("toDate", toDate) .getResultList(); } return ret; } //------------------------------------------------------------------------ // Module 関連 //------------------------------------------------------------------------ public List<ModuleModel> getModules(long patientPk, String entity, int firstResult, int maxResult) { List<ModuleModel> retList; KarteBean karte = (KarteBean) em.createQuery(QUERY_KARTE) .setParameter("patientPk", patientPk) .getSingleResult(); if (entity.equals("all")) { retList = em.createQuery("from ModuleModel m where m.karte.id=:karteId and m.moduleInfo.entity!=:entity and m.status='F' order by m.started desc") .setParameter("karteId", karte.getId()) .setParameter("entity", "progressCourse") .setFirstResult(firstResult) .setMaxResults(maxResult) .getResultList(); } else { retList = em.createQuery(QUERY_MODULE_BY_ENTITY) .setParameter("karteId", karte.getId()) .setParameter("entity", entity) .setFirstResult(firstResult) .setMaxResults(maxResult) .getResultList(); } return retList; } public List<NLaboModule> getLaboTest(String facilityId, String patientId, int firstResult, int maxResult) { StringBuilder sb = new StringBuilder(); sb.append(facilityId); sb.append(":"); sb.append(patientId); String fidPid = sb.toString(); List<NLaboModule> ret = (List<NLaboModule>) em.createQuery("from NLaboModule l where l.patientId=:fidPid order by l.sampleDate desc") .setParameter("fidPid", fidPid) .setFirstResult(firstResult) .setMaxResults(maxResult) .getResultList(); for (NLaboModule m : ret) { List<NLaboItem> items = (List<NLaboItem>) em.createQuery("from NLaboItem l where l.laboModule.id=:mid order by groupCode,parentCode,itemCode") .setParameter("mid", m.getId()) .getResultList(); m.setItems(items); } return ret; } public List<NLaboItem> getLaboTestItem(String facilityId, String patientId, int firstResult, int maxResult, String itemCode) { StringBuilder sb = new StringBuilder(); sb.append(facilityId); sb.append(":"); sb.append(patientId); String fidPid = sb.toString(); List<NLaboItem> ret = (List<NLaboItem>) em.createQuery("from NLaboItem l where l.patientId=:fidPid and l.itemCode=:itemCode order by l.sampleDate desc") .setParameter("fidPid", fidPid) .setParameter("itemCode", itemCode) .setFirstResult(firstResult) .setMaxResults(maxResult) .getResultList(); return ret; } //------------------------------------------------------------------------ // Stamp 関連 //------------------------------------------------------------------------ public IStampTreeModel getTrees(long userPK) { // パーソナルツリーを取得する List<StampTreeModel> list = (List<StampTreeModel>) em.createQuery("from StampTreeModel s where s.user.id=:userPK") .setParameter("userPK", userPK) .getResultList(); // 新規ユーザの場合 if (list.isEmpty()) { return null; } // 最初の Tree を取得 IStampTreeModel ret = (StampTreeModel)list.remove(0); // まだある場合 BUG if (!list.isEmpty()) { // 後は delete する for (int i=0; i < list.size(); i++) { StampTreeModel st = (StampTreeModel)list.remove(0); em.remove(st); } } return ret; } public StampModel getStamp(String stampId) { try { return (StampModel)em.find(StampModel.class, stampId); } catch (NoResultException e) { } return null; } protected void setHealthInsurances(Collection<PatientModel> list) { if (list != null && !list.isEmpty()) { for (PatientModel pm : list) { setHealthInsurances(pm); } } } protected void setHealthInsurances(PatientModel pm) { if (pm != null) { List<HealthInsuranceModel> ins = getHealthInsurances(pm.getId()); pm.setHealthInsurances(ins); } } protected List<HealthInsuranceModel> getHealthInsurances(long pk) { List<HealthInsuranceModel> ins = em.createQuery(QUERY_INSURANCE_BY_PATIENT_PK) .setParameter("pk", pk) .getResultList(); return ins; } public VitalModel getVital(String id) { VitalModel vital = (VitalModel)em.createQuery(QUERY_VITAL_BY_ID) .setParameter(ID, Long.parseLong(id)) .getSingleResult(); return vital; } ////----------------------------------------------------------------------------- //// 温度板 ////----------------------------------------------------------------------------- // public List<OndobanModel> getOndoban(long ptPK, Date fromDate, Date toDate) { // // // Karte // KarteBean karte; // karte = (KarteBean) // em.createQuery(QUERY_KARTE) // .setParameter("patientPk", ptPK) // .getSingleResult(); // // // 文書履歴エントリーを取得しカルテに設定する // List<OndobanModel> result; // result = (List<OndobanModel>)em.createQuery("from OndobanModel o where o.karte.id=:karteId and o.started between :fromDate and :toDate") // .setParameter("karteId", karte.getId()) // .setParameter("fromDate", fromDate) // .setParameter("toDate", toDate) // .getResultList(); // return result; // } // // public List<Long> addOndoban(List<OndobanModel> observations) { // if (observations != null && observations.size() > 0) { // List<Long> ret = new ArrayList<>(observations.size()); // for (OndobanModel model : observations) { // em.persist(model); // ret.add(model.getId()); // } // return ret; // } // return null; // } // // public int updateOndoban(List<OndobanModel> observations) { // if (observations != null && observations.size() > 0) { // for (OndobanModel model : observations) { // em.merge(model); // } // return observations.size(); // } // return 0; // } // // public int deleteOndoban(List<OndobanModel> observations) { // if (observations != null && observations.size() > 0) { // for (OndobanModel model : observations) { // OndobanModel delete = em.find(OndobanModel.class, model.getId()); // em.remove(delete); // } // return observations.size(); // } // return 0; // } ////----------------------------------------------------------------------------- //// 看護記録 ////----------------------------------------------------------------------------- // public List<NurseProgressCourseModel> getNurseProgressCourse(long ptPK, int firstResult, int maxResult) { // // // Karte // KarteBean karte; // karte = (KarteBean) // em.createQuery(QUERY_KARTE) // .setParameter("patientPk", ptPK) // .getSingleResult(); // // // started で降順にして取り出す // List<NurseProgressCourseModel> result; // result = (List<NurseProgressCourseModel>)em.createQuery("from NurseProgressCourseModel n where n.karte.id=:karteId order by n.started desc") // .setParameter("karteId", karte.getId()) // .setFirstResult(firstResult) // .setMaxResults(maxResult) // .getResultList(); // return result; // } // // public Long addNurseProgressCourse(NurseProgressCourseModel model) { // em.persist(model); // return model.getId(); // } // // public int updateNurseProgressCourse(NurseProgressCourseModel model) { // em.merge(model); // return 1; // } // // public int deleteNurseProgressCourse(NurseProgressCourseModel model) { // NurseProgressCourseModel delete = em.find(NurseProgressCourseModel.class, model.getId()); // em.remove(delete); // return 1; // } }