電子カルテ

当院では,2008年の開業以来,電子カルテとしてオープンソースの OpenDolphin 1.3.0(デジタルグローブ社)を使用させていただいています。素晴らしいソフトをオープンソースで公開されているデジタルグローブ社には,とても感謝しています。

どんなに優れた電子カルテも,実際に運用するには個々の医院に合わせたカスタマイズが必要だと思います。その場合,オープンソースなら,自院のためだけに自由にカスタマイズすることができます。このブログでは,OpenDolphin を当院で運用するにあたって,色々カスタマイズした内容を中心に公開しています。


  • カスタマイズしたソースは公開しています
  • デジタルグローブ社はライフサイエンスコンピューティング(株)と合併し,
    現在同社のオープンドルフィンラボとなっています
  • 本家オープンドルフィンラボの OpenDolphin は既に ver. 2.x になっています

2021年2月 4日 (木)

13年目の運用まとめ

13年目はコロナにやられた年だった。外来が結構ひまだったので、長年の懸案だった undo のコードを書きまくって、その副作用で ATOK の確定 undo まで制御できるようになって、入力環境が大きく改善した。スタンプの簡易編集機能も、薬の量や日数を変更するのに、いちいちダイアログを出さなくても入力できるので、入力速度の改善につながった。

もう一つの長年の懸案、JWindow を使った JSheet も解決した。SecondaryLoop をつかって modal にするという技を覚えた。あとは、シェーマの拡大縮小、Google Calendar の取込、スタンプの簡易表示などのコードを書いた。

結構コードを書いた年であったが、クラウドファンディングに出資していた天体望遠鏡が 9月に届いてからは、ほとんど暇がなくなってしまった。

  • データベースの PatientModel の件数
    dolphin=# select count(*) from d_patient;
     count
    -------
    34420
    (1 row)
    
  • データベースの ModuleModel の件数
    dolphin=# select count(*) from d_module;
      count
    ---------
     1369363
    (1 row)
    
  • dolphin サーバの df。used は 18G でほとんど変わらず。
    Filesystem      Size  Used Avail Use% Mounted on
    udev            962M     0  962M   0% /dev
    tmpfs           199M  460K  199M   1% /run
    /dev/xvda1       46G   18G   26G  41% /
    tmpfs           993M  8.0K  993M   1% /dev/shm
    tmpfs           5.0M     0  5.0M   0% /run/lock
    tmpfs           993M     0  993M   0% /sys/fs/cgroup
    tmpfs           199M     0  199M   0% /run/user/1001
    
  • orca サーバの df。used が 9.9G から 12G に増加。
    udev            2.9G     0  2.9G   0% /dev
    tmpfs           601M  860K  600M   1% /run
    /dev/xvda1       46G   12G   33G  26% /
    tmpfs           3.0G  8.0K  3.0G   1% /dev/shm
    tmpfs           5.0M     0  5.0M   0% /run/lock
    tmpfs           3.0G     0  3.0G   0% /sys/fs/cgroup
    tmpfs           601M     0  601M   0% /run/user/1001
    
  • データベースの dump ファイルのサイズ
    dolphin_db.dump.gpg 2,595,374,852
    orca_db.dump.gpg 291,521,000
    
  • スタンプ数
    $ grep -c stampInfo stamp.xml 
    2139
    

2020年9月 4日 (金)

スタンプの簡易表示

できるだけ無駄な処方はしないように気をつけているが,それでもどうしても処方薬が増えてしまう場合がある。そうすると,スタンプが増えて,画面をスクロールしないと全体が確認できなくなってしまう。

そこで,スタンプを簡易表示する j2html コードを追加して,スクロールせずに全体を確認できるようにしてみた。⌘-T を押す毎に通常表示と簡易表示が切り替わるようにした。

Normal ⌘T
Simple_20200903190401

2020年7月26日 (日)

Java 1.8.0_261 での apple.awt.brushMetalLook

これまでずっと java 8 を 11 にバージョンアップせず使っている。その唯一の理由は,java 11 でウインドウのタイトルが unified にならないことであった。java 8 だと "apple.awt.brushMetalLook" を true に設定することで,title bar と tool bar が連続した美しいウインドウにできる。いや,できていた。

それが,1.8.0_261 から java 11 と同じになってしまったのである。悲しすぎる。java 11 に移行する潮時なのか。

251

2020年7月23日 (木)

Undo の充実 (4) StampEditor, StampTree

次に,StampEditor の undo を実装した。StampEditor の TableModel である ObjectReflectTableModel を extend した UndoableObjectRelflectTableModel に undoable... な method を作成し,おまとめ undo 機能も組み込んだ。ObjectReflectTableModel を使っていた AllergyInspector と PhysicalInspector も undoable にすることができた。

最後に StampTree を undoable にした。StampTree の TableModel である StampTableModel に同様の undoable な method を組み込んで undo できるようにした。

これでほとんどの操作が undo 可能となったと思う。

2020年7月22日 (水)

Undo の充実 (3) AtokListener

ATOK には,確定直後に ctrl-delete を押すと,未確定状態に戻してくれる「確定アンドゥ」という便利な機能がある。しかし JTextPane でこの操作を行うと,前の確定文字が消えずに未確定文字列が確定文字列の後ろに出る状態になってしまう(下図)。また,間違って半角アルファベットで打ち込んでしまった文を,かなキーの2度打ちでひらがなに戻して変換したり,間違って打ち込んでしまった英単語を,英数キーの2度打ちで半角アルファベットに変換してくれる機能も便利なのだが,これも JTextPane だともとの文字が残ってしまっていた

Atoklistener

ずっと何とかならないかと思っていたのだが,今回 TextComponentUndoManager に【おまとめ undo】機能を付けたので,ATOK の確定アンドゥと同時に JTextPane に undo を1回かけてやれば,前の確定文字列を消せるのではないかと思いついた。KeyListener と InputMethodListener を組み込んだ AtokListener を作って,上記動作をプログラムしたところうまく動作した。頑張ってプログラムしたおかげで日本語入力環境がぐっと便利になった。

Atok

2020年7月21日 (火)

Undo の充実 (2) TextComponentUndoManager

これまで KarteEditor の JTextPane に TextComponentUndoManager を付けて undo ができるようにしてあったが,機能的には入力を1段階戻すだけの単純なものであった。

そのため,例えばスタンプを DnD で移動した場合,【ドロップしたスタンプを書き込む】【位置や改行などの調節】【元のスタンプを削除する】という一連の操作が行われるので,これを undo すると,undo 1回毎に【元のスタンプが復活】【改行などの調節が戻る】【ドロップしたスタンプが消える】と戻っていくことになる。できれば DnD の操作はまとめて1回で undo したいところである。また,英単語を打つ場合【english word】と打った後に undo すると,【english wor】【english wo】【english w】と1文字ずつ戻ることになる。ここはできれば,単語毎にまとめて消えて欲しいところである。

そこで,まず TextComponentUndoManager に Timer を組み込んで,短時間 (30 msec 以内) に連続しておきた操作は,1つにまとめてから UndoManager に登録するようにした。これによって DnD は1回の undo で戻るようになり,ATOK の漢字変換後の入力も,変換して入力した分が1回の undo で戻るようになった。また,アルファベット入力の場合は, 前の入力をチェックして,アルファベットだった場合は前の undo 情報にマージするようにして,word 単位の undo ができるようにした。

Textcomponent_20200720082001

2020年7月20日 (月)

Undo の充実 (1) StampHolder/SchemaHolder

これまで,DiagnosisDocumentTableModelTextComponentUndoManager で,病名編集とカルテ編集を undo できるようにしていたが,その他もろもろの機能は undo できないままであった。今回がんばって undo 機能をいろいろつけてみた。

まずは StampHolder/SchemaHolder の undo 対応をプログラムした。StampHolder/SchemaHolder のモデル更新を updateModel() というメソッドで実行するようにして,ここを AbstractComponentHolder の undoableUpdateModel() メソッドでフックして,StampHolder/SchemaHolder からここを呼んで undo 情報をとる方式にした。具体的な undo 処理は AbstractComponentHolder で行うことにより,StampHolder/SchemaHolder の両方の undo ができるようになった。

Componentholder

2020年6月 2日 (火)

簡易スタンプ編集機能

スタンプ編集に関して,これまで当院のカスタマイズでは,スタンプ選択後にダブルクリック or スペースキーでスタンプエディタを立ち上げる方法と,右クリックでコンテクストメニューを表示して編集する機能があった。

Editor   Popup

今回それに加えて,スタンプ選択後に数字キーを押して簡単な編集ができるようにしてみた。スタンプを選択して数字キーを押すと小さなテキストボックスが現れて数字が入力できるようになる。数字を入力して enter を押すと,内服薬の場合は日数を,外用剤の場合は処方量を変更することができる。

Screen_20200531190201

2020年5月28日 (木)

Google Calendar API の利用

当院では休日・休診情報を Google Calendar で管理して,ホームページ上で公開している。 OpenDolphin のカレンダーでも休日・休診情報を表示できるようにカスタマイズしていたが,表示データはプログラム内にハードコーディングであった。これを Google Calendar から情報を読み込めるようにして,データを Google Calendar で一元管理できるようにしてみた。

Google Calendar には Calendar API というのが用意されており,利用しやすいように主要言語のチュートリアルまで用意されている。そこに出ている java のサンプルを参考にしてプログラムした。Calendar API の認証にはブラウザが必要になるのだが,当院のサーバは CUI でブラウザは使えない。そこで,診察室のクライアントでデータを取込み,それをサーバに保存して,そのデータを全クライアントで利用するという方式にした。

CalendarSettingPanel で Calendar API からデータを取り込み,それをサーバに保存する。サーバ側ではわざわざ Entity を作るのも面倒なので,PnsServiceImpl の Preferences に保存するという素人丸出しの方法を使った。保存したカレンダー情報は,各クライアントが起動時にサーバから読み込む。

Settingpanel   Calendar

2020年5月22日 (金)

添書作成スクリプト

当院では開院以来,添書は NeoOffice の NeoOffice Basic で作ったシステムを使っていた。しかし,NeoOffice Basic でのコード管理は非常に苦痛度が高く,いつかアップル謹製の Pages と AppleScript を使って書き直したいと思っていた。ただ,実のところ AppleScript もあまりプログラミングが楽しい言語とは言えず,だらだらとそのままになっていた。

そんな折,AppleScript のスクリプトエディタで JavaScript が使えるということを知った。JavaScript for Automation (JXA) というもので,Yosemite から使えるようになっていたらしい。JavaScript なら AppleScript より圧倒的にコードが楽しく書ける。早速,JXA を使って添書システムを書き換えた。

手順としては,まず連絡先アプリで紹介先を選んで,スクリプトで選択項目を読み込み,さらに orca から患者情報を読み込んで,最後に Pages のテンプレートファイルのプレースホルダーに情報を挿入して添書を完成させるという仕組みにした。

まずは連絡先アプリに医療機関を登録した。連絡先アプリは vcf ファイルを読み込めるので,公開されている道内医療機関リストの xlsx ファイルを cvs で保存して,それを vcf に変換するスクリプトを書いた。これで,道内 3,300 の全医療機関を連絡先アプリに登録できた。

次に orca からの患者情報の取得であるが,NeoOffice Basic では jdbc で orca に接続して sql を発行して情報を得ていた。しかし,orca api のおかげで,今ではそういう手続きは全部すっ飛ばして,curl で拍子抜けするほど簡単に情報を得ることができる。例えば,orca trial サイトでやってみると,

$ curl -u trial: 'http://trial.orca.med.or.jp:8000/api01rv2/patientgetv2?id=00001&format=json' 
これで患者情報が json で取れて,さらに JavaScript を使うとパースまで一気にできてしまう。jdbc を使っていた頃とは雲泥の差である。
var res = app.doShellScript("curl -u " + AUTH + " " + URL )
var pt = JSON.parse(res)		

Contacts 3_20200520172001
Dialog

作ったファイルは github に上げた。.pages ファイルをテンプレートセレクタに追加して使う。

«病名検索フィールドをカルテ検索と併用する