« 待ち時間表示 | トップページ | 生年月日検索 »

2010年7月 3日 (土)

byomeiCount の永続化

受付リストが増えると,DocumentPeeker の病名数カウントにけっこう時間がかかり,立ち上げ時や更新ボタンを押した後しばらく待たされてしまっていたので,病名数のカウントを PatientVisitModel 内に永続化して早くできるようにした。試しに受付患者数 150 にしてみたところ,以前の方式だと 20秒くらいかかったが,永続化後は 5 秒程度でカウント終了した。もちろん実際にそんなに患者さんが来ているわけではない。

delegater/PVTDelegater

public int setByomeiCount(long pk, int total, int today) {
  try {
    return getService().setByomeiCount(pk, total, today);
  } catch (NamingException e) {
    e.printStackTrace();
    processError(e);
  }
  return 0;
}

ejb/RemotePvtService.java

/**
 * 付いている病名数を書き込む
 * @param pk
 * @param total 総病名数
 * @param today 今日付いた病名数
 * @return
 */
public int setByomeiCount(long pk, int total, int today);

ejb/RemotePvtServiceImpl.java

public Collection getPvt(PatientVisitSpec spec) {
 ・
 ・
//pns^      病名数をセットする
  // カルテの PK を得る
  KarteBean karte = (KarteBean)em.createQuery("from KarteBean k where k.patient.id = :pk")
    .setParameter("pk", patient.getId())
    .getSingleResult();
  long karteId = karte.getId();

  // トータルの病名数
  String byomeiCountQuery = "select count(*) from RegisteredDiagnosisModel r where r.karte.id = :karteId and r.started >= :fromDate";
  int totalCount = ((Long) em.createQuery(byomeiCountQuery)
    .setParameter("karteId", karteId)
    .setParameter("fromDate", new Date(0L))
    .getSingleResult()).intValue();
  pvt.setByomeiCount(totalCount);

  // 今日の病名数
  GregorianCalendar yesterday = new GregorianCalendar();
  yesterday.add(GregorianCalendar.DATE, -1);
  yesterday.set(Calendar.HOUR_OF_DAY, 23);
  int todayCount = ((Long)em.createQuery(byomeiCountQuery)
    .setParameter("karteId", karteId)
    .setParameter("fromDate", yesterday.getTime())
    .getSingleResult()).intValue();
  pvt.setByomeiCountToday(todayCount);
//pns$
 ・
 ・
public int setByomeiCount(long pk, int total, int today) {
  PatientVisitModel exist = em.find(PatientVisitModel.class, pk);
  exist.setByomeiCount(total);
  exist.setByomeiCountToday(today);
  return 1;
}

client/DiagnosisDocument.java

class DiagnosisPutTask extends DBTask> {
 ・
 ・
  @Override
  protected List doInBackground() throws Exception {
 ・
 ・
  // ByomeiCount の永続化
  PatientVisitModel pvt = getContext().getPatientVisit();
  if (pvt.getPvtDate() != null) { // 今日の受診がなければ pvtDate == null
    PVTDelegater pdl = new PVTDelegater();
    pdl.setByomeiCount(pvt.getId(), pvt.getByomeiCount(), pvt.getByomeiCountToday());
  }

infomodel/PatientVisitModel.java

//pns^  pvt model の項目を増やす
/** 今まで付いた病名の総数 */
@Column(nullable=false)
private int byomeiCount;
/** 今日付いた病名の数 */
@Column(nullable=false)
private int byomeiCountToday;
/** カルテ記載があるかどうか */
@Transient
private boolean karteEmpty;
/** ORCA から送られる「診療内容」 */
private String memo;
//pns$
nullable=false を書いても,以前に作られた pvt の byomeiCount が全部 null になってしまい,以下のエラーが出る。
Null value was assigned to a property of primitive type setter of byomeicount
データベースを書き換えて対応する。
# update d_patient_visit set byomeicount=0;
# update d_patient_visit set byomeicounttoday=0;
 

« 待ち時間表示 | トップページ | 生年月日検索 »

OpenDolphin」カテゴリの記事