« ショートカットいろいろ | トップページ | 検索機能強化 »

2009年3月24日 (火)

状態アイコン表示色

状態アイコンの背景色を増やした。病名が付いていない場合,初診の場合に加えて,カルテ記載がされていない場合を加えた。状態に応じて背景の色を変えることで表示する。

Mainwindow 黄色:初診で病名がまだ付いていない。青:初診で病名ついた。橙:カルテ未記載。

患者さんをなるべくお待たせしないため,混んできたら,診察終了後とりあえず会計に必要なオーダーだけ ORCA に送って,所見などの記載はあとに回すことにしている。この日は,9時半ころまではちゃんと記載していたが,その後記載できなくなりオレンジマークが増えていることが分かる。あとで患者さんが切れてから,オレンジと黄色のカルテを記載していくことにしている。

client/DocumentPeeker.java の作成

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package open.dolphin.client;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.GregorianCalendar;
import java.util.List;
import open.dolphin.delegater.DocumentDelegater;
import open.dolphin.dto.DiagnosisSearchSpec;
import open.dolphin.dto.DocumentSearchSpec;
import open.dolphin.infomodel.DocInfoModel;
import open.dolphin.infomodel.DocumentModel;
import open.dolphin.infomodel.IInfoModel;
import open.dolphin.infomodel.KarteBean;
import open.dolphin.infomodel.ModuleModel;
import open.dolphin.infomodel.PatientVisitModel;
import open.dolphin.infomodel.ProgressCourse;
import org.apache.log4j.Logger;

/**
 * ちょっとカルテ内容をチェックして pvt に必要な情報をセットする
 */
public class DocumentPeeker {

    private Logger logger;

    private DocumentDelegater ddl;
    private GregorianCalendar today;
    private GregorianCalendar yesterday;

    public DocumentPeeker() {
        today = new GregorianCalendar();
        ddl = new DocumentDelegater();
        yesterday = new GregorianCalendar();
        yesterday.add(GregorianCalendar.DATE, -1);
        yesterday.set(Calendar.HOUR_OF_DAY, 23);

        logger = ClientContext.getBootLogger();
    }

    public void setByomeiCount(PatientVisitModel pvt) {
        KarteBean karte = ddl.getKarte(pvt.getPatient().getId(), today.getTime());

        // PatientVisitModel に病名数をセットする
        Long karteId = karte.getId();
        DiagnosisSearchSpec spec = new DiagnosisSearchSpec();
        spec.setCode(DiagnosisSearchSpec.PATIENT_SEARCH);
        spec.setKarteId(karteId);
        int byomeiCount = ddl.getDiagnosisList(spec).size(); // 今までについている病名の総数
        int byomeiCountToday = 0;
        if (byomeiCount != 0) {
            spec.setFromDate(yesterday.getTime());
            byomeiCountToday = ddl.getDiagnosisList(spec).size(); // 今日ついた病名の総数
        }

        pvt.setByomeiCount(byomeiCount);
        pvt.setByomeiCountToday(byomeiCountToday);
        //logger.info("pt id = " + pvt.getPatientId());
        //logger.info("total byomei count = " + byomeiCount + " today byomei count = " + byomeiCountToday);
    }

    // カルテに pvt.getLeastKarteSize() 文字以下の記載しか無ければ empty karte と判定
    public void checkEmptyKarte(PatientVisitModel pvt) {

        KarteBean karte = ddl.getKarte(pvt.getPatient().getId(), today.getTime());

        Long karteId = karte.getId();
        DocumentSearchSpec spec = new DocumentSearchSpec();
        spec.setKarteId(karteId);
        spec.setFromDate(yesterday.getTime());
        spec.setDocType(IInfoModel.DOCTYPE_KARTE);
        spec.setIncludeModifid(false);
        spec.setCode(DocumentSearchSpec.DOCTYPE_SEARCH);
        spec.setAscending(false);

        List<DocInfoModel> docInfoList = (List<DocInfoModel>) ddl.getDocumentList(spec);

        pvt.setKarteEmpty(false);
        //logger.info("pvt.getPatientId() = " + pvt.getPatientId());
        //logger.info("docInfoList size = " + docInfoList.size());

        // 今日のカルテがない人はマークしない。今日のカルテを作った段階で,カルテ内容チェックする
        if (docInfoList.size() != 0) {
            // DocumentModule をとるための手続
            Long id = docInfoList.get(0).getDocPk();
            List<Long> docIds = new ArrayList<Long>();
            docIds.add(id);
            List<DocumentModel> docList = ddl.getDocuments(docIds);

            DocumentModel model = docList.get(0);
            Collection<ModuleModel> modules = model.getModules();
            String xml = null;
            if (modules != null) {
                for (ModuleModel bean : modules) {
                    String role = bean.getModuleInfo().getStampRole();

                    if (role.equals(IInfoModel.ROLE_SOA_SPEC))
                        xml = ((ProgressCourse) bean.getModel()).getFreeText();
                }
                if (extractText(xml).length() <= pvt.getLeasKarteSize()) pvt.setKarteEmpty(true);
            } else pvt.setKarteEmpty(true);
        }
    }

    // カルテの内容から text を抜き出す
    private String extractText(String xml) {
        StringBuffer buf = new StringBuffer();
        String head[] = xml.split("<text>");
        for (String str : head) {
            String tail[] = str.split("</text>");
            if (tail.length == 2) buf.append(tail[0].trim());
        }
        //logger.info("extractText: " + buf.toString());
        return buf.toString();
    }
}

plugin/WatingListImpl.java の編集

public class WatingListImpl extends AbstractMainComponent {
 ・
 ・
  private WatingListView view;
////↓
    private DocumentPeeker peeker = new DocumentPeeker();
    private final Color SHOSHIN_COLOR = new Color(180,220,240); //青っぽい色
    private final Color KARTE_EMPTY_COLOR = new Color(250,200,160); //茶色っぽい色
    private final Color DIAGNOSIS_EMPTY_COLOR = new Color(243,255,15); //黄色
////↑
 ・
 ・
protected class PvtChecker implements Runnable {
 ・
 ・
  // 結果を追加する
  if (newVisitCount > 0) {
    for (int i = 0; i < newVisitCount; i++) {
////↓ 受付番号表示
    PatientVisitModel pvt = (PatientVisitModel) result.get(i);
    pvt.setNumber(firstResult+i+1);

    // 病名が1つでもあるかどうか,初診かどうかを pvt にセット
    peeker.setByomeiCount(pvt);
    // カルテ記載されているかどうか
    peeker.checkEmptyKarte(pvt);
////↑
    dataList.add(result.get(i));
 ・
 ・
protected class PvtChecker2 implements Callable {
 ・
 ・
  //
  // cnt 以降は新しいレコードなのでそのまま追加する
  //
  for (int i = index; i < result.size(); i++) {

////↓  // 受付番号表示
    PatientVisitModel pvt = (PatientVisitModel) result.get(i);
    pvt.setNumber(firstResult+i+1);
    dataList.add(result.get(i));
    //dataList.add(result.get(index++));

    // 病名が1つでもあるかどうか,初診かどうかを pvt にセット
    peeker.setByomeiCount(pvt);
    // カルテ記載されているかどうか
    peeker.checkEmptyKarte(pvt);
////↑
 ・
 ・
protected class KarteStateRenderer extends DefaultTableCellRenderer {
    Color fore = pvt != null && pvt.getState() == ChartImpl.CANCEL_PVT ? CANCEL_PVT_COLOR : table.getForeground();
    this.setForeground(fore);
  }
            
////↓ 状態に応じて背景色を変更
  if (pvt != null) {
    // 初診
    if (pvt.isShoshin()) this.setBackground(SHOSHIN_COLOR);
    // カルテ記載がまだ
    if (pvt.isKarteEmpty()) this.setBackground(KARTE_EMPTY_COLOR);
    // 病名ついてない
    if (!pvt.hasByomei()) this.setBackground(DIAGNOSIS_EMPTY_COLOR);
  }
////↑

client/KarteEditor.java の編集

private void save2(final SaveParams params) throws DolphinException {
 ・
 ・
  //
  // SOAPane をダンプし model に追加する
  // 
  KartePaneDumper_2 dumper = new KartePaneDumper_2();
  KarteStyledDocument doc = (KarteStyledDocument) soaPane.getTextPane().getDocument();
  dumper.dump(doc);
  ModuleModel[] soa = dumper.getModule();
  if (soa != null && soa.length > 0) {
    logger.debug("soaPane dumped, number of SOA modules = " + soa.length);
    model.addModule(soa);
  } else {
    logger.debug("soaPane dumped, no module");
  }

////↓   カルテ記載があるかどうか記録。10文字以下だったら未記載と判定。
    PatientVisitModel pvt = this.getContext().getPatientVisit();
    if (doc.getLength() <= pvt.getLeasKarteSize()) pvt.setKarteEmpty(true);
    else pvt.setKarteEmpty(false);
////↑

client/DiagnosisDocument.java の編集

class DiagnosisPutTask extends DBTask> {
 ・
 ・
  @Override
  protected List<Long> doInBackground() throws Exception {
 ・
 ・
////↓ PatientVisitModel に病名数をセットする 
    new DocumentPeeker().setByomeiCount(getContext().getPatientVisit());
////↑

infomodel/PatientVisitModel.java の編集

 //カルテ記載がまだかどうか
    public void setKarteEmpty(boolean k) {
        karteEmpty = k;
    }
    public boolean isKarteEmpty() {
        return karteEmpty;
    }
    public int getLeasKarteSize() {
        return LEAST_KARTE_SIZE;
    }

« ショートカットいろいろ | トップページ | 検索機能強化 »

OpenDolphin」カテゴリの記事