« シェーマエディタの改造 | トップページ | Mac のメニューバー »

2009年3月 6日 (金)

初診・再診の自動入力

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

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」カテゴリの記事