[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[orca-dev:00051] Re: 病名クラス
- To: orca-dev@xxxxxxxxxxxxxx
- Subject: [orca-dev:00051] Re: 病名クラス
- From: Yoshinori Ariie <PBA00250@xxxxxxxxx>
- Date: Mon, 27 May 2002 23:16:57 +0900
有家@松山記念病院です。
スレッドも深くなりました。
加算メソッドが何とか定義できたところで、いったん結語といたします。
ゆきあたりばったりの私の思いつきで 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