« FileInspector の作成 | トップページ | 記載医師名表示 »

2011年1月22日 (土)

PvtChecker の見直し

WatingListImpl.java の PvtChecker は,定期チェックとボタンによる手動チェックの2系統に別れている。

 定期チェックでは,新しく加わったリストのみサーバに取りに行く。新規受付がなければチェックだけで,受付があっても多くて1回にせいぜい1〜2件のデータしか転送しないので,チェックはすぐ終わる。しかし,既に受付になったデータの変更は読みに行かないので,例えば診察室の端末で診察終了しても,受付の端末には反映されない。同様に,受付の端末で受診キャンセルしても,診察室の端末には反映されない。受付済みのリストに起きた変更を反映させるには,ボタンによる手動チェックをかける必要がある。

 ボタンによる手動チェックでは,クライアントで「診察未終了」となっているデータを含めてサーバに取りに行く。受付端末で診察未終了状態だが,診察室で診察終了したカルテがあった場合,手動チェックをかけると受付端末でも診察終了フラグが立つ。そのかわり,取りに行くデータ量が多くなるので時間がかかる。

 これらの問題を両立させるために,全てのカルテの状態(診察終了,未終了等)だけ素早く送ることができれば,定期チェックにカルテの状態チェックを組み合わせて,診察室と受付端末が定期チェックのタイミングで常に一致するようにできるのではないかと考えた。

 問題は毎回のデータ転送にかかる時間であるが,今のところ一瞬で終わっており問題ないようだ(最近すいているので何とも言えないが)。試しに 120件の pvt でチェックをしてみたが,200〜300 msec で終わるようなので患者さんが増えても大丈夫そう。

ejb/RemotePvtServiceImpl.java

/**
 * 今日の pvt の state だけもってくる
 * @return
 */
public ArrayList<Integer> getPvtState();

ejb/RemotePvtServiceImpl.java

/**
 * pvt state だけスピーディーにとってくる by pns
 * @return
 */
public final int BYOMEI_COUNT_MASK = 100;
public final int BYOMEI_COUNT_TODAY_MASK = 10000;

public ArrayList<Integer> getPvtState() {
  ArrayList<Integer> list = new ArrayList();

  String fid = getCallersFacilityId(ctx);
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  String date = sdf.format(new Date());
  Collection result = em.createQuery("from PatientVisitModel p where p.facilityId = :fid and p.pvtDate >= :date order by p.pvtDate")
             .setParameter("fid", fid)
             .setParameter("date", date)
             .getResultList();

  for (Iterator iter = result.iterator(); iter.hasNext(); ) {

    PatientVisitModel pvt = (PatientVisitModel) iter.next();
    Integer state = pvt.getState();
    state = state + pvt.getByomeiCount() * BYOMEI_COUNT_MASK;
    state = state + pvt.getByomeiCountToday() * BYOMEI_COUNT_TODAY_MASK;
    list.add(state);
  }
  return list;
}

delegater/PVTDelegater.java

public ArrayList<Integer> getPvtState() {
  try {
    return getService().getPvtState();
  } catch (NamingException e) {
    e.printStackTrace();
    processError(e);
  }
  return null;
}

plugin/PvtStateDecoder.java

package open.dolphin.client;

/**
 * PVT state をできるだけスピーディーに取り出すために,server から
 * pvtState + 100*byomeiCount + 10000*byomeiCountToday の形で送信するようにした
 * それを decode するためのクラス
 * @author pns
 */
class PvtStateDecoder {
  public final int BYOMEI_COUNT_MASK = 100;
  public final int BYOMEI_COUNT_TODAY_MASK = 10000;
  private int state;
  private int byomeiCount;
  private int byomeiCountToday;

  public void decode(int encoded) {
    state = encoded + 10;

    byomeiCountToday = state/BYOMEI_COUNT_TODAY_MASK;
    state = state - byomeiCountToday * BYOMEI_COUNT_TODAY_MASK;

    byomeiCount = state/BYOMEI_COUNT_MASK;
    state = state - byomeiCount * BYOMEI_COUNT_MASK;

    state = state - 10;
  }
  public int getState() {
    return state;
  }
  public int getByomeiCount() {
    return byomeiCount;
  }
  public int getByomeiCountToday() {
    return byomeiCountToday;
  }
}

WatingListImpl.java

大幅にリファクタリングした

« FileInspector の作成 | トップページ | 記載医師名表示 »

OpenDolphin」カテゴリの記事