初診・再診の自動入力
カルテ新規作成時に,初診・再診を自動入力するようにする。当院での特異的な各種条件を判定して,スタンプの名前で適切なスタンプを選ぶしくみ。
client/LastVisit.java の作成
package open.dolphin.client; import java.util.GregorianCalendar; /** * 最終受診日を調べる DocumentHistory のテーブルキメ打ちしているので,降順にしてないとダメ * 今日受診していたら今日の日付,今日受診していない場合は History の最終受診日 * 今日受診していても,History の最終受診日を知りたい場合は InHistory を使う */ public class LastVisit { private Chart context; public LastVisit (Chart context) { this.context = context; } /* * DocumentHistory 上の LastVisit (表の左上スミをキメ打ち) 2008-02-01 形式 */ public String getLastVisitInHistory() { DocumentHistoryView dhv = (DocumentHistoryView) context.getDocumentHistory().getPanel(); return (String) dhv.getTable().getModel().getValueAt(0, 0); // 表の左上スミをキメ打ち } public int[] getLastVisitInHistoryYmd() { int[] lastVisitYmd = {2008,2,1}; String lastVisit = getLastVisitInHistory(); if (lastVisit == null) return null; lastVisitYmd[0] = Integer.valueOf(lastVisit.substring(0,4)); lastVisitYmd[1] = Integer.valueOf(lastVisit.substring(5,7)) - 1; // gc では month は 0 から始まるので注意 lastVisitYmd[2] = Integer.valueOf(lastVisit.substring(8)); return lastVisitYmd; } public GregorianCalendar getLastVisitInHistoryGc() { int[] lv = getLastVisitInHistoryYmd(); return new GregorianCalendar(lv[0],lv[1],lv[2]); } /* * 最終受診日を 2008-02-01 形式で返す */ public String getLastVisit() { // pvt: 今日受診していたら今日の日付,受診していなければ null が返る。PvgDateTrimはTimeが日付でDateが時間 String pvt = context.getPatientVisit().getPvtDateTrimTime(); // 今日の受診がない場合,DocumentHistory の table から読んでくる。今日の受診がある場合は,今日をセット return pvt == null? getLastVisitInHistory() : pvt; } /* * 最終受診日を,int 配列 int[0]=year, int[1]=month, int[2]=day で返す (month は 0-11) */ public int[] getLastVisitYmd() { int[] lastVisitYmd = {2008,2,1}; String lastVisit = getLastVisit(); lastVisitYmd[0] = Integer.valueOf(lastVisit.substring(0,4)); lastVisitYmd[1] = Integer.valueOf(lastVisit.substring(5,7)) - 1; // gc では month は 0 から始まるので注意 lastVisitYmd[2] = Integer.valueOf(lastVisit.substring(8)); return lastVisitYmd; } /* * 最終受診日を gregorian calendar で返す */ public GregorianCalendar getLastVisitGc() { int lv[] = {2008,2,1,12,00}; String pvtDate = context.getPatientVisit().getPvtDateTrimTime(); String pvtTime = context.getPatientVisit().getPvtDateTrimDate(); // 受診していないのに新規カルテを作成した場合,暫定的に受診日を今日とする(あり得ない操作) if (pvtDate == null || pvtTime == null) { logger.info("new karte created without patient visit"); return new GregorianCalendar(); } lv[0] = Integer.valueOf(pvtDate.substring(0,4)); //year lv[1] = Integer.valueOf(pvtDate.substring(5,7)) - 1; //month lv[2] = Integer.valueOf(pvtDate.substring(8)); //day lv[3] = Integer.valueOf(pvtTime.substring(0,2)); //hour lv[4] = Integer.valueOf(pvtTime.substring(3)); //minute return new GregorianCalendar(lv[0],lv[1],lv[2],lv[3],lv[4]); } }
client/StampTreeModules.java の作成
package open.dolphin.client; import java.util.Calendar; import java.util.GregorianCalendar; import open.dolphin.delegater.StampDelegater; import open.dolphin.infomodel.IInfoModel; import open.dolphin.infomodel.ModuleInfoBean; import open.dolphin.infomodel.ModuleModel; import open.dolphin.infomodel.StampModel; import open.dolphin.util.BeanUtils; import org.apache.log4j.Logger; /** * StampTree から ModuleModel を取り出す * @author pinus */ public class StampTreeModules { private Logger logger; private final int SHOSHIN = 0; private final int SHOSHIN_RYOTAN = 1; private final int SHOSHIN_YAKAN = 2; private final int SHOSHIN_RYOTAN_YAKAN = 3; private final int SAISHIN = 4; private final int SAISHIN_YAKAN = 5; private final String[] SHOSHIN_SAISHIN = {"初診", "初診(療養担当)", "初診(夜間・早朝等)", "初診(療養担当)(夜間・早朝等)", "再診(診療所)", "再診(診療所)(夜間・早朝等)"}; private Chart context; private ChartMediator mediator; private GregorianCalendar today; private LastVisit lv; public StampTreeModules(Chart context) { this.context = context; mediator = context.getChartMediator(); today = new GregorianCalendar(); lv = new LastVisit(context); logger = ClientContext.getBootLogger(); } /* * 初診・再診を判定して,module として返す */ public ModuleModel getBaseCharge() { /* * 初診か再診か判定 * 初診,初診(療養担当),初診(夜間・早朝等),初診(療養担当)(夜間・早朝等),再診(診療所),再診(診療所)(夜間・早朝等) */ StampTree tree = mediator.getStampTree("baseChargeOrder"); // 初診・再診の情報判定 int index = 0; if (isShoshin()) { if (isRyotan()) { if (isYakan()) index = SHOSHIN_RYOTAN_YAKAN; else index = SHOSHIN_RYOTAN; } else { if (isYakan()) index = SHOSHIN_YAKAN; else index = SHOSHIN; } } else { if (isYakan()) index = SAISHIN_YAKAN; else index = SAISHIN; } logger.info("initial stamp = " + SHOSHIN_SAISHIN[index]); // スタンプ選択 ModuleModel mModel = new ModuleModel(); ModuleInfoBean stamp = null; for (int i=0; i<tree.getRowCount(); i++) { StampTreeNode sn = (StampTreeNode) tree.getPathForRow(i).getLastPathComponent(); if (sn.isLeaf()) { ModuleInfoBean bean = sn.getStampInfo(); String name = bean.getStampName(); if (name.equals(SHOSHIN_SAISHIN[index])) { stamp = bean; break; } } } if (stamp != null) { StampDelegater sdl = new StampDelegater(); // Stamp モデルをデータベースから取ってくる StampModel sModel = sdl.getStamp(stamp.getStampId()); // Stamp モデルから info モデルを作る IInfoModel iModel = (IInfoModel) BeanUtils.xmlDecode(sModel.getStampBytes()); // info モデル(実体)と stamp(情報) を module model にセット mModel.setModel(iModel); mModel.setModuleInfo(stamp); } else mModel = null; return mModel; } private boolean isShoshin() { int[] lastVisit = lv.getLastVisitInHistoryYmd(); // 受診歴が無ければ初診で返す if (lastVisit == null) return true; // 受診歴がある場合は,3ヶ月たったかどうか判定 int dif_year = today.get(Calendar.YEAR) - lastVisit[0]; int dif_month = today.get(Calendar.MONTH) - lastVisit[1]; int dif_day = today.get(Calendar.DATE) - lastVisit[2]; // 2年以上離れていたら初診 if (dif_year >= 2) return true; // 1年差の場合は月差を調整 if (dif_year == 1) dif_month = dif_month + 12; // 4ヶ月以上離れていたら初診 if (dif_month >= 4) return true; // 3ヶ月離れている場合は,日付を比較 else if (dif_month == 3) { if (dif_day >= 0) return true; else return false; // それ以外は再診 } else return false; } private boolean isRyotan() { int month = today.get(Calendar.MONTH); // 5月〜10月は療養担当手当なし if (month >=4 & month <=9) return false; return true; } private boolean isYakan() { // 土曜日で 12時以降なら夜間 GregorianCalendar gc = lv.getLastVisitGc(); if ((gc.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) & (gc.get(Calendar.AM_PM) == Calendar.PM)) return true; else return false; } }
client/ChartImpl.java の編集
public DocumentModel getKarteModelToEdit(NewKarteParams params) { ・ ・ // カルテモデルを生成する DocumentModel model = new DocumentModel(); ////↓ 初診・再診 stampTreeModule を自動入力する ModuleModel mm = new StampTreeModules(this).getBaseCharge(); if (mm != null) model.addModule(mm); ////↑ ・ ・ private void copyModel(DocumentModel oldModel, DocumentModel newModel, boolean applyRp) { // // 前回処方を適用する場合 // if (applyRp) { Collection<ModuleModel> modules = oldModel.getModules(); if (modules != null) { Collection<ModuleModel> apply = new ArrayList<ModuleModel>(5); ////↓ 初診・再診 stampTreeModule を自動入力する ModuleModel mm = new StampTreeModules(this).getBaseCharge(); if (mm != null) apply.add(mm); ////↑ ・ ・ // // 処方かどうかを判定する // if (((ClaimBundle) model).getClassCode().startsWith("2")) { apply.add(bean); } ////↓ ついでに,処置もコピー if (((ClaimBundle) model).getClassCode().startsWith("4")) { apply.add(bean); } ////↑
« シェーマエディタの改造 | トップページ | Mac のメニューバー »
「OpenDolphin」カテゴリの記事
- Java 17 への移行(7) - OpenDolphin client の対応 (2023.02.04)
- Java 17 への移行(6) - Hibernate 6 でやらかす(2023.02.03)
- Java 17 への移行(5) - OpenDolphin server の対応(2023.02.02)
- Java 17 への移行(4) - OpenSearch の準備 [ubuntu 編](2023.02.01)
- Java 17 への移行(3) - OpenSearch の準備 [mac 編](2023.01.31)