[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[orca-dev:00051] Re: 病名クラス



有家@松山記念病院です。

スレッドも深くなりました。
加算メソッドが何とか定義できたところで、いったん結語といたします。
ゆきあたりばったりの私の思いつきで dev-ML の一隅を埋めてしまったことに
ひたすら恐縮いたしております。
オープンソースプロジェクトORCAの、あしたのためのメモの一片にでもなれば
望外の幸せです。

▼
ORCAも、他のレセコンも、扱う単位レコードはひとりの患者に関するものです。
つまり患者クラス class Patient というものがあれば
レセプトクラス class Receipt は、そのサブクラスということになります。

 class Receipt < Patient

私はカルテの電子化というのは、この「患者クラス class Patient」を設計する作業
であろうと位置づけています。(諸データを CUI 特に Ruby で扱いたいので..)

users-ML で問題になっていたレセプトチェックについて少し述べます。
class Receipt の属性には病名、処置名、医薬品名などがあり
これを入力し記憶し計算し印字するのがレセプト処理ですが
レセプトチェックとは、これらの間に矛盾が無いかどうかを確認し、
あるならば、どこが矛盾なのかを摘出する、という問題だろうと思います。

これを解決するモジュールを module AssessReceipt とすると
AssessReceipt は一意に病名、処置名、医薬品名を扱えなければなりません。
これが病名クラスにこだわった理由です。
(これも既存コードを使用するならば、特に個別のクラスを意識しなくても
文字列クラス class String として扱うことで良いと思います)

病名のクラスが定義できれば、症状名、処置名、医薬品名は、ほぼ同様の方法で
定義できるはずです。

 class Symptom < Disease
 class Operation < Disease
 class Medicine < Disease

次に上記の AssessReceipt を、どう実装するかということについては
緑本の論理を表記するマクロのようなものを作る、というのが第一感でした。
しかし、わざわざそのようなマクロを設計しなくても、Ruby の eval 関数を使えば
算定式の内容をそのままRubyスクリプトで表現して扱うことができます。

ただし、この作業はかなり大がかりなものになるでしょうし
何より最初の設計(諸変数、定数の設定、基本メソッドの作成)がたいへん重要だ
と思います。(この出来しだいで、後の作業の質が決まると思います)

最後に、ひとつだけ、そのひな形を示して終わりにします。
(算定条件を表示するだけのものですが..)

私の設計は、行き当たりばったり、いい加減の極みですので参考になりませんが
良い方法をみんなで考えて行きませんか。


▼以下のスクリプトの出力
-----------------------------------------------------------------------
通院精神療法は睡眠障害の治療手技であり、その算定条件は p180012210 です。
条件:@opcount_pw < ((@opday - @lastdischarge < 4*7)? 2 : 1)

lormetazepamは睡眠障害の治療薬であり、その算定条件は m611120119 です。
条件:@rpdays < 14

葛根湯(顆粒)は上気道炎の治療薬であり、その算定条件は m615101406 です。
条件:true
-----------------------------------------------------------------------


#!/usr/local/bin/ruby -Ke

# 病名ベース(拡張すれば、疾患の簡易知識ベースのようなものになりそうです)
BaseArray = [ # 病名ごとのHashデータの配列
    {
      "睡眠障害" => "ds",            # 病名
      "早朝覚醒" => "sy",            # 症状
      "入眠困難" => "sy",            # 症状
      "通院精神療法" => "op",        # 治療・処置
      "lormetazepam" => "md",        # 薬剤
    },{
      "上気道炎" => "ds",            # 病名
      "咽頭痛" => "sy",              # 症状
      "発熱" => "sy",                # 症状
      "葛根湯(顆粒)" => "md",      # 薬剤
    }
]

# 算定ベース(以下の算定モジュールと合わせて、診療報酬請求の算定条件ベース)
ProcHash = { # 処置名、医薬品とその算定メソッド名のHash
      "通院精神療法"   => "p180012210",
      "lormetazepam"   => "m611120119",
      "葛根湯(顆粒)" => "m615101406",
}

# 算定モジュール(このメソッド名は tbl_tensu の srycd コードに由来します)
module AssessReceipt
    def p180012210 # 通院精神療法(病院)
        # 退院後4週以内は週2回まで、それ以外は週1回まで
        "@opcount_pw < ((@opday - @lastdischarge < 4*7)? 2 : 1)"
    end
    def m611120119 # lormetazepam
        # 一回につき14日まで処方可能
        "@rpdays < 14"
    end
    def m615101406 # 葛根湯(顆粒)
        # 漢方薬の算定はよく知らないので..
        "true"
    end
end

# レセプトクラス
class Receipt < String
    include AssessReceipt

    # 今回は未使用ですが、こんな感じで主要変数・定数を定義して行きます。
    # これらの値を ORCA の出力するデータから抽出するメソッドが必要です。
    #
    @opcount = Integer       # 総処置回数(1ヵ月)
    @opcount_pw = Integer    # 1週当たりの処置回数
    @rpdays = Integer        # 処方日数
    @opday = Time            # 処置日
    @lastdischarge = Time    # 最終退院日

    def operation?(str)
        BaseArray.each{|dis|
            if (self) == dis.index("ds")
                if dis.key?(str) && /^op/ =~ dis[str]
                    print "#{str}は#{self}の治療手技であり、"
                    print "その算定条件は #{ProcHash[str]} です。\n"
                    print "条件:#{eval ProcHash[str]}\n\n"
                end
            end
        }
    end
    def medicine?(str)
        BaseArray.each{|dis|
            if (self) == dis.index("ds")
                if dis.key?(str) && /^md/ =~ dis[str]
                    print "#{str}は#{self}の治療薬であり、"
                    print "その算定条件は #{ProcHash[str]} です。\n"
                    print "条件:#{eval ProcHash[str]}\n\n"
                end
            end
        }
    end
end

DATA.each{|line|
    next if /^$/ =~ line || /^#/ =~ line
    a = line.chomp.split

    s = String.new(a[0])
    d = Receipt.new(a[1])

    d.operation?(s)
    d.medicine?(s)
}

__END__
#
通院精神療法   睡眠障害
lormetazepam   睡眠障害
葛根湯(顆粒) 上気道炎

# pba00250@xxxxxxxxx
# yoariie@xxxxxxxxxxxxxxx
# -------------------------
# 有家佳紀  Yoshinori Ariie