カルテ新規作成時に,初診・再診を自動入力するようにする。当院での特異的な各種条件を判定して,スタンプの名前で適切なスタンプを選ぶしくみ。
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);
}
////↑