package open.dolphin.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import open.dolphin.client.ClientContext;
import open.dolphin.common.OrcaConnect;
import open.dolphin.delegater.OrcaDelegater;
import open.dolphin.infomodel.*;
import open.dolphin.project.Project;
import open.dolphin.util.StringTool;
/**
* OrcaSqlDelegater
*
* @author Kazushi Minagawa
*/
public final class OrcaSqlDelegater extends SqlDaoBean implements OrcaDelegater {
private static final String RP_KBN_START = "2";
private static final String SHINRYO_KBN_START = ".";
private static final int SHINRYO_KBN_LENGTH = 3;
private static final int DEFAULT_BUNDLE_NUMBER = 1;
private static final String KBN_RP = "220";
private static final String KBN_RAD = "700";
private static final String KBN_GENERAL = "999";
private static final String QUERY_FACILITYID_BY_1001
="select kanritbl from tbl_syskanri where kanricd='1001'";
private static final String QUERY_TENSU_BY_SHINKU
= "select srycd,name,kananame,tensikibetu,ten,nyugaitekkbn,routekkbn,srysyukbn,hospsrykbn,yukostymd,yukoedymd from tbl_tensu where srysyukbn ~ ? and yukostymd<= ? and yukoedymd>=?";
private static final String QUERY_TENSU_BY_NAME
= "select srycd,name,kananame,taniname,tensikibetu,ten,nyugaitekkbn,routekkbn,srysyukbn,hospsrykbn,ykzkbn,yakkakjncd,yukostymd,yukoedymd from tbl_tensu where (name ~ ? or kananame ~ ?) and yukostymd<= ? and yukoedymd>=?";
private static final String QUERY_TENSU_BY_1_NAME
= "select srycd,name,kananame,taniname,tensikibetu,ten,nyugaitekkbn,routekkbn,srysyukbn,hospsrykbn,ykzkbn,yakkakjncd,yukostymd,yukoedymd from tbl_tensu where (name = ? or kananame = ?) and yukostymd<= ? and yukoedymd>=?";
private static final String QUERY_TENSU_BY_CODE
= "select srycd,name,kananame,taniname,tensikibetu,ten,nyugaitekkbn,routekkbn,srysyukbn,hospsrykbn,ykzkbn,yakkakjncd,yukostymd,yukoedymd from tbl_tensu where srycd ~ ? and yukostymd<= ? and yukoedymd>=?";
private static final String QUERY_TENSU_BY_TEN
= "select srycd,name,kananame,taniname,tensikibetu,ten,nyugaitekkbn,routekkbn,srysyukbn,hospsrykbn,ykzkbn,yakkakjncd,yukostymd,yukoedymd from tbl_tensu where ten >= ? and ten <= ? and yukostymd<= ? and yukoedymd>=?";
private static final String QUERY_DICEASE_BY_NAME
= "select byomeicd, byomei, byomeikana, icd10, haisiymd from tbl_byomei where (byomei ~ ? or byomeikana ~?) and haisiymd >= ?";
private static final String QUERY_DICEASE_BY_NAME_46
= "select byomeicd, byomei, byomeikana, icd10_1, haisiymd from tbl_byomei where (byomei ~ ? or byomeikana ~?) and haisiymd >= ?";
private static final String QUERY_GENERAL_NAME_BY_CODE
= "select b.srycd,genericname from tbl_tensu b,tbl_genericname c where b.srycd=? and substring(b.yakkakjncd from 1 for 9)=c.yakkakjncd order by b.yukoedymd desc";
/**
* Creates a new instance of OrcaSqlDelegater
*/
public OrcaSqlDelegater() {
}
//-------------------------------------------------------------------------
// 保険医療機関コードとJMARIコード by 1001
//-------------------------------------------------------------------------
@Override
public String getFacilityCodeBy1001() throws Exception {
// SQL 文
StringBuilder buf = new StringBuilder();
buf.append(QUERY_FACILITYID_BY_1001);
String sql = buf.toString();
Connection con = null;
PreparedStatement ps;
StringBuilder ret = new StringBuilder();
try
{
con = getConnection();
ps = con.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
String line = rs.getString(1);
// 保険医療機関コード 10桁
ret.append(line.substring(0, 10));
// JMARIコード JPN+12桁 (total 15)
int index = line.indexOf("JPN");
if (index>0) {
ret.append(line.substring(index, index+15));
}
}
rs.close();
ps.close();
} catch (Exception e) {
e.printStackTrace(System.err);
throw e;
} finally {
closeConnection(con);
}
return ret.toString();
}
//-------------------------------------------------------------------------
// 併用禁忌チェック
// masuda 先生の SqlMiscDao からcheckInteractionポーティング。
//-------------------------------------------------------------------------
@Override
public List<DrugInteractionModel> checkInteraction(Collection<String> drug1, Collection<String> drug2) throws Exception {
// 引数はdrugcdの配列x2
if (drug1 == null || drug1.isEmpty() || drug2 == null || drug2.isEmpty()) {
return Collections.emptyList();
}
StringBuilder sb = new StringBuilder();
List<DrugInteractionModel> ret = new ArrayList<>();
// SQL文を作成
sb.append("select drugcd, drugcd2, TI.syojyoucd, syojyou ");
sb.append("from tbl_interact TI inner join tbl_sskijyo TS on TI.syojyoucd = TS.syojyoucd ");
sb.append("where (drugcd in (");
sb.append(getCodes(drug1));
sb.append(") and drugcd2 in (");
sb.append(getCodes(drug2));
sb.append("))");
String sql = sb.toString();
Connection con = null;
Statement st = null;
try {
con = getConnection();
st = con.createStatement();
ResultSet rs = st.executeQuery(sql);
while (rs.next()) {
ret.add(new DrugInteractionModel(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4)));
}
rs.close();
closeStatement(st);
closeConnection(con);
} catch (Exception e) {
processError(e);
closeStatement(st);
closeConnection(con);
}
return ret;
}
//-------------------------------------------------------------------------
// 点数マスター検索
//-------------------------------------------------------------------------
@Override
public List<TensuMaster> getTensuMasterByShinku(String shinku, String now) throws Exception {
// 結果を格納するリスト
ArrayList<TensuMaster> ret = new ArrayList<>();
// SQL 文
StringBuilder buf = new StringBuilder();
buf.append(QUERY_TENSU_BY_SHINKU);
String sql = buf.toString();
Connection con = null;
PreparedStatement ps;
try
{
con = getConnection();
ps = con.prepareStatement(sql);
ps.setString(1, shinku);
ps.setString(2, now);
ps.setString(3, now);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
TensuMaster t = new TensuMaster();
t.setSrycd(rs.getString(1));
t.setName(rs.getString(2));
t.setKananame(rs.getString(3));
t.setTensikibetu(rs.getString(4));
t.setTen(rs.getString(5));
t.setNyugaitekkbn(rs.getString(6));
t.setRoutekkbn(rs.getString(7));
t.setSrysyukbn(rs.getString(8));
t.setHospsrykbn(rs.getString(9));
t.setYukostymd(rs.getString(10));
t.setYukoedymd(rs.getString(11));
ret.add(t);
}
rs.close();
ps.close();
} catch (Exception e) {
e.printStackTrace(System.err);
throw e;
//processError(e);
//closeConnection(con);
} finally {
closeConnection(con);
}
return ret;
}
@Override
public List<TensuMaster> getTensuMasterByName(String name, String now, boolean partialMatch) throws Exception {
// 結果を格納するリスト
ArrayList<TensuMaster> ret = new ArrayList<>();
// 半角英数字を全角へ変換する
name = StringTool.toZenkakuUpperLower(name);
// SQL 文
boolean one = name.length()==1;
StringBuilder buf = new StringBuilder();
if (one) {
buf.append(QUERY_TENSU_BY_1_NAME);
} else {
buf.append(QUERY_TENSU_BY_NAME);
if (!partialMatch) {
name = "^" + name;
}
}
String sql = buf.toString();
Connection con = null;
PreparedStatement ps;
try
{
con = getConnection();
ps = con.prepareStatement(sql);
ps.setString(1, name);
ps.setString(2, name);
ps.setString(3, now);
ps.setString(4, now);
//System.err.println(ps);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
TensuMaster t = new TensuMaster();
t.setSrycd(rs.getString(1));
t.setName(rs.getString(2));
t.setKananame(rs.getString(3));
t.setTaniname(rs.getString(4));
t.setTensikibetu(rs.getString(5));
t.setTen(rs.getString(6));
t.setNyugaitekkbn(rs.getString(7));
t.setRoutekkbn(rs.getString(8));
t.setSrysyukbn(rs.getString(9));
t.setHospsrykbn(rs.getString(10));
t.setYkzkbn(rs.getString(11));
t.setYakkakjncd(rs.getString(12));
t.setYukostymd(rs.getString(13));
t.setYukoedymd(rs.getString(14));
ret.add(t);
}
rs.close();
ps.close();
} catch (Exception e) {
e.printStackTrace(System.err);
throw e;
//processError(e);
//closeConnection(con);
} finally {
closeConnection(con);
}
return ret;
}
@Override
public List<TensuMaster> getTensuMasterByCode(String regExp, String now) throws Exception {
// 結果を格納するリスト
ArrayList<TensuMaster> ret = new ArrayList<>();
// SQL 文
StringBuilder buf = new StringBuilder();
buf.append(QUERY_TENSU_BY_CODE);
String sql = buf.toString();
Connection con = null;
PreparedStatement ps;
try
{
con = getConnection();
ps = con.prepareStatement(sql);
// 増田内科 コール側で ^ をとる
ps.setString(1, "^"+regExp);
ps.setString(2, now);
ps.setString(3, now);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
TensuMaster t = new TensuMaster();
t.setSrycd(rs.getString(1));
t.setName(rs.getString(2));
t.setKananame(rs.getString(3));
t.setTaniname(rs.getString(4));
t.setTensikibetu(rs.getString(5));
t.setTen(rs.getString(6));
t.setNyugaitekkbn(rs.getString(7));
t.setRoutekkbn(rs.getString(8));
t.setSrysyukbn(rs.getString(9));
t.setHospsrykbn(rs.getString(10));
t.setYkzkbn(rs.getString(11));
t.setYakkakjncd(rs.getString(12));
t.setYukostymd(rs.getString(13));
t.setYukoedymd(rs.getString(14));
ret.add(t);
}
rs.close();
ps.close();
} catch (Exception e) {
e.printStackTrace(System.err);
throw e;
//processError(e);
//closeConnection(con);
} finally {
closeConnection(con);
}
return ret;
}
@Override
public List<TensuMaster> getTensuMasterByTen(String ten, String now) throws Exception {
// 結果を格納するリスト
ArrayList<TensuMaster> ret = new ArrayList<>();
// SQL 文
StringBuilder buf = new StringBuilder();
buf.append(QUERY_TENSU_BY_TEN);
String sql = buf.toString();
Connection con = null;
PreparedStatement ps;
try
{
con = getConnection();
ps = con.prepareStatement(sql);
String[] params = ten.split("-");
if (params.length > 1) {
ps.setFloat(1, Float.parseFloat(params[0]));
ps.setFloat(2, Float.parseFloat(params[1]));
} else {
ps.setFloat(1, Float.parseFloat(params[0]));
ps.setFloat(2, Float.parseFloat(params[0]));
}
ps.setString(3, now);
ps.setString(4, now);
System.err.println(ps);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
TensuMaster t = new TensuMaster();
t.setSrycd(rs.getString(1));
t.setName(rs.getString(2));
t.setKananame(rs.getString(3));
t.setTaniname(rs.getString(4));
t.setTensikibetu(rs.getString(5));
t.setTen(rs.getString(6));
t.setNyugaitekkbn(rs.getString(7));
t.setRoutekkbn(rs.getString(8));
t.setSrysyukbn(rs.getString(9));
t.setHospsrykbn(rs.getString(10));
t.setYkzkbn(rs.getString(11));
t.setYakkakjncd(rs.getString(12));
t.setYukostymd(rs.getString(13));
t.setYukoedymd(rs.getString(14));
ret.add(t);
}
rs.close();
ps.close();
} catch (Exception e) {
e.printStackTrace(System.err);
throw e;
//processError(e);
//closeConnection(con);
} finally {
closeConnection(con);
}
return ret;
}
@Override
public List<DiseaseEntry> getDiseaseByName(String name, String now, boolean partialMatch) throws Exception {
// 結果を格納するリスト
ArrayList<DiseaseEntry> ret = new ArrayList<>();
// SQL 文
StringBuilder buf = new StringBuilder();
//minagawa^ 4.7対応
//masuda^ Version46 対応
// if (ORCA_DB_VER46.equals(getOrcaDbVersion())) {
// buf.append(QUERY_DICEASE_BY_NAME_46);
// } else {
// buf.append(QUERY_DICEASE_BY_NAME);
// }
//masuda$
String curentVersion = getOrcaDbVersion();
if (curentVersion.compareTo(ORCA_DB_VER46)>=0) {
buf.append(QUERY_DICEASE_BY_NAME_46);
} else {
buf.append(QUERY_DICEASE_BY_NAME);
}
//minagawa$
String sql = buf.toString();
Connection con = null;
PreparedStatement ps;
if (!partialMatch) {
name = "^"+name;
}
try
{
con = getConnection();
ps = con.prepareStatement(sql);
ps.setString(1, name);
ps.setString(2, name);
ps.setString(3, now);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
DiseaseEntry de = new DiseaseEntry();
de.setCode(rs.getString(1)); // Code
de.setName(rs.getString(2)); // Name
de.setKana(rs.getString(3)); // Kana
de.setIcdTen(rs.getString(4)); // IcdTen
de.setDisUseDate(rs.getString(5)); // DisUseDate
ret.add(de);
}
rs.close();
ps.close();
} catch (Exception e) {
e.printStackTrace(System.err);
throw e;
//processError(e);
//closeConnection(con);
} finally {
closeConnection(con);
}
return ret;
}
//--------------------------------------------------------------------------
// 一般名を検索する
//--------------------------------------------------------------------------
@Override
public String getGeneralName(String param) {
Connection con = null;
PreparedStatement ps;
String gname = null;
//String srycd = param;
StringBuilder sb = new StringBuilder();
sb.append(QUERY_GENERAL_NAME_BY_CODE);
String sql = sb.toString();
debug(sql);
try {
con = getConnection();
ps = con.prepareStatement(sql);
ps.setString(1, param);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
gname = rs.getString(2);
}
rs.close();
ps.close();
} catch (Exception e) {
e.printStackTrace(System.err);
processError(e);
closeConnection(con);
} finally {
closeConnection(con);
}
return gname;
}
//--------------------------------------------------------------------------
// ORCA 入力セット検索
//--------------------------------------------------------------------------
/**
* ORCA の入力セットコード(約束処方、診療セット)を返す。
* @return 入力セットコード(OrcaInputCd)の昇順リスト
*/
@Override
public ArrayList<OrcaInputCd> getOrcaInputSet() {
debug("getOrcaInputSet()");
Connection con = null;
ArrayList<OrcaInputCd> collection;
Statement st = null;
String sql;
StringBuilder sb = new StringBuilder();
sb.append("select * from tbl_inputcd where ");
if (true) {
int hospnum = getHospNum();
sb.append("hospnum=");
sb.append(hospnum);
sb.append(" and ");
}
sb.append("inputcd like 'P%' or inputcd like 'S%' order by inputcd");
sql = sb.toString();
debug(sql);
boolean v4 = true; //Project.getOrcaVersion().startsWith("4") ? true : false;
try {
con = getConnection();
st = con.createStatement();
ResultSet rs = st.executeQuery(sql);
collection = new ArrayList<>();
while (rs.next()) {
debug("got from tbl_inputcd");
OrcaInputCd inputCd = new OrcaInputCd();
if (!v4) {
inputCd.setHospId(rs.getString(1));
inputCd.setCdsyu(rs.getString(2));
inputCd.setInputCd(rs.getString(3));
inputCd.setSryKbn(rs.getString(4));
inputCd.setSryCd(rs.getString(5));
inputCd.setDspSeq(rs.getInt(6));
inputCd.setDspName(rs.getString(7));
inputCd.setTermId(rs.getString(8));
inputCd.setOpId(rs.getString(9));
inputCd.setCreYmd(rs.getString(10));
inputCd.setUpYmd(rs.getString(11));
inputCd.setUpHms(rs.getString(12));
String cd = inputCd.getInputCd();
if (cd.length() > 6) {
cd = cd.substring(0, 6);
inputCd.setInputCd(cd);
}
} else {
inputCd.setCdsyu(rs.getString(1));
inputCd.setInputCd(rs.getString(2));
inputCd.setSryKbn(rs.getString(3));
inputCd.setSryCd(rs.getString(4));
inputCd.setDspSeq(rs.getInt(5));
inputCd.setDspName(rs.getString(6));
inputCd.setTermId(rs.getString(7));
inputCd.setOpId(rs.getString(8));
inputCd.setCreYmd(rs.getString(9));
inputCd.setUpYmd(rs.getString(10));
inputCd.setUpHms(rs.getString(11));
String cd = inputCd.getInputCd();
if (cd.length() > 6) {
cd = cd.substring(0, 6);
inputCd.setInputCd(cd);
}
debug("getCdsyu = " + inputCd.getCdsyu());
debug("getInputCd = " + inputCd.getInputCd());
debug("getSryKbn = " + inputCd.getSryKbn());
debug("getSryCd = " + inputCd.getSryCd());
debug("getDspSeq = " + String.valueOf(inputCd.getDspSeq()));
debug("getDspName = " + inputCd.getDspName());
debug("getTermId = " + inputCd.getTermId());
debug("getOpId " + inputCd.getOpId());
debug("getCreYmd " + inputCd.getCreYmd());
debug("getUpYmd " + inputCd.getUpYmd());
debug("getUpHms " + inputCd.getUpHms());
ModuleInfoBean info = inputCd.getStampInfo();
debug("getStampName = " + info.getStampName());
debug("getStampRole = " + info.getStampRole());
debug("getEntity = " + info.getEntity());
debug("getStampId = " + info.getStampId());
}
collection.add(inputCd);
}
rs.close();
closeStatement(st);
closeConnection(con);
return collection;
} catch (Exception e) {
processError(e);
closeConnection(con);
closeStatement(st);
}
return null;
}
/**
* 指定された入力セットコードから診療セットを Stamp にして返す。
* @param inputSetInfo 入力セットの StampInfo
* @return 入力セットのStampリスト
*/
@Override
public ArrayList<ModuleModel> getStamp(ModuleInfoBean inputSetInfo) {
String setCd = inputSetInfo.getStampId(); // stampId=setCd; セットコード
String stampName = inputSetInfo.getStampName();
debug("getStamp()");
debug("setCd = " + setCd);
debug("stampName = " + stampName);
int hospnum = -1;
if (true) {
hospnum = getHospNum();
}
Connection con = null;
PreparedStatement ps1 = null;
PreparedStatement ps2 = null;
String sql1;
String sql2;
StringBuilder sb1 = new StringBuilder();
if (true) {
//s.oh^ 2014/04/01 ORCAセット有効期限対応
//sb1.append("select inputcd,suryo1,kaisu from tbl_inputset where hospnum=? and setcd=? order by setseq");
sb1.append("select inputcd,suryo1,kaisu,yukostymd,yukoedymd from tbl_inputset where hospnum=? and setcd=? order by setseq");
//s.oh$
sql1 = sb1.toString();
} else {
sb1.append("select inputcd,suryo1,kaisu from tbl_inputset where setcd=? order by setseq");
sql1 = sb1.toString();
}
// order by yukoedymd desc を追加 ^
StringBuilder sb2 = new StringBuilder();
if (true) {
sb2.append("select srysyukbn,name,taniname,ykzkbn from tbl_tensu where hospnum=? and srycd=? order by yukoedymd desc");
sql2 = sb2.toString();
} else {
sb2.append("select srysyukbn,name,taniname,ykzkbn from tbl_tensu where srycd=? order by yukoedymd desc");
sql2 = sb2.toString();
}
ArrayList<ModuleModel> retSet = new ArrayList<>();
try {
//
// setCd を検索する
//
con = getConnection();
ps1 = con.prepareStatement(sql1);
if (hospnum > 0) {
ps1.setInt(1, hospnum);
ps1.setString(2, setCd);
} else {
ps1.setString(1, setCd);
}
debug(ps1.toString());
ResultSet rs = ps1.executeQuery();
ArrayList<OrcaInputSet> list = new ArrayList<>();
//s.oh^ 2014/04/01 ORCAセット有効期限対応
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String strtoday = sdf.format(new Date());
int today = Integer.parseInt(strtoday);
//s.oh$
while (rs.next()) {
debug("got from tbl_inputset");
OrcaInputSet inputSet = new OrcaInputSet();
//inputSet.setHospId(rs.getString(1));
//inputSet.setSetCd(rs.getString(2)); // P01001 ...
//inputSet.setYukostYmd(rs.getString(3));
//inputSet.setYukoedYmd(rs.getString(4));
//inputSet.setSetSeq(rs.getInt(5)); // 1, 2, ...
inputSet.setInputCd(rs.getString(1)); // .210 616130532 ...
inputSet.setSuryo1(rs.getFloat(2)); // item の個数
//inputSet.setSuryo2(rs.getFloat(8));
inputSet.setKaisu(rs.getInt(3)); // バンドル数
//inputSet.setComment(rs.getString(10));
//inputSet.setAtai1(rs.getString(11));
//inputSet.setAtai2(rs.getString(12));
//inputSet.setAtai3(rs.getString(13));
//inputSet.setAtai4(rs.getString(14));
//inputSet.setTermId(rs.getString(15));
//inputSet.setOpId(rs.getString(16));
//inputSet.setCreYmd(rs.getString(17));
//inputSet.setUpYmd(rs.getString(18));
//inputSet.setUpHms(rs.getString(19));
//s.oh^ 2014/04/01 ORCAセット有効期限対応
//debug("getInputCd = " + inputSet.getInputCd());
//debug("getSuryo1 = " + String.valueOf(inputSet.getSuryo1()));
//debug("getKaisu = " + String.valueOf(inputSet.getKaisu()));
//
//list.add(inputSet);
String strst = rs.getString(4);
String stred = rs.getString(5);
int st = Integer.parseInt(strst);
int ed = Integer.parseInt(stred);
if(st <= today && today <= ed) {
list.add(inputSet);
}else{
}
//s.oh$
}
rs.close();
closeStatement(ps1);
ModuleModel stamp;
BundleDolphin bundle = null;
ps2 = con.prepareStatement(sql2);
if (list != null && list.size() > 0) {
for (OrcaInputSet inputSet : list) {
String inputcd = inputSet.getInputCd();
debug("inputcd = " + inputcd);
if (inputcd.startsWith(SHINRYO_KBN_START)) {
//---------------------------------------
//
//---------------------------------------
stamp = createStamp(stampName, inputcd);
if (stamp != null) {
bundle = (BundleDolphin) stamp.getModel();
retSet.add(stamp);
}
debug("created stamp " + inputcd);
} else {
if (hospnum > 0) {
ps2.setInt(1, hospnum);
ps2.setString(2, inputcd);
} else {
ps2.setString(1, inputcd);
}
debug(ps2.toString());
ResultSet rs2 = ps2.executeQuery();
if (rs2.next()) {
debug("got from tbl_tensu");
String code = inputcd;
String kbn = rs2.getString(1);
String name = rs2.getString(2);
String number = String.valueOf(inputSet.getSuryo1());
String unit = rs2.getString(3);
////s.oh^ 2014/06/24 ORCAセットの改善
// String ykz = rs2.getString(4);
////s.oh$
debug("code = " + code);
debug("kbn = " + kbn);
debug("name = " + name);
debug("number = " + number);
debug("unit = " + unit);
ClaimItem item = new ClaimItem();
item.setCode(code);
item.setName(name);
item.setNumber(number);
item.setClassCodeSystem(ClaimConst.SUBCLASS_CODE_ID);
////s.oh^ 2014/06/24 ORCAセットの改善
// item.setYkzKbn(ykz);
////s.oh$
if (code.startsWith(ClaimConst.SYUGI_CODE_START)) {
//
// 手技の場合
//
debug("item is tech");
item.setClassCode(String.valueOf(ClaimConst.SYUGI));
if (bundle == null) {
stamp = createStamp(stampName, kbn);
if (stamp != null) {
bundle = (BundleDolphin) stamp.getModel();
retSet.add(stamp);
}
}
if (bundle != null) {
//s.oh^ 2014/03/31 スタンプ回数対応
if(inputSet.getKaisu() > 0) {
bundle.setBundleNumber(String.valueOf(inputSet.getKaisu()));
}
//s.oh$
bundle.addClaimItem(item);
}
} else if (code.startsWith(ClaimConst.YAKUZAI_CODE_START)) {
//
// 薬剤の場合
//
debug("item is medicine");
item.setClassCode(String.valueOf(ClaimConst.YAKUZAI));
item.setNumberCode(ClaimConst.YAKUZAI_TOYORYO);
item.setNumberCodeSystem(ClaimConst.NUMBER_CODE_ID);
item.setUnit(unit);
if (bundle == null) {
String receiptCode = rs2.getString(4).equals(ClaimConst.YKZ_KBN_NAIYO)
? ClaimConst.RECEIPT_CODE_NAIYO
: ClaimConst.RECEIPT_CODE_GAIYO;
stamp = createStamp(stampName, receiptCode);
if (stamp != null) {
bundle = (BundleDolphin) stamp.getModel();
retSet.add(stamp);
}
}
if (bundle != null) {
//s.oh^ 2014/03/31 スタンプ回数対応
if(inputSet.getKaisu() > 0) {
bundle.setBundleNumber(String.valueOf(inputSet.getKaisu()));
}
//s.oh$
bundle.addClaimItem(item);
}
} else if (code.startsWith(ClaimConst.ZAIRYO_CODE_START)) {
//
// 材料の場合
//
debug("item is material");
item.setClassCode(String.valueOf(ClaimConst.ZAIRYO));
item.setNumberCode(ClaimConst.ZAIRYO_KOSU);
item.setNumberCodeSystem(ClaimConst.NUMBER_CODE_ID);
item.setUnit(unit);
if (bundle == null) {
stamp = createStamp(stampName, KBN_GENERAL);
if (stamp != null) {
bundle = (BundleDolphin) stamp.getModel();
retSet.add(stamp);
}
}
if (bundle != null) {
//s.oh^ 2014/03/31 スタンプ回数対応
if(inputSet.getKaisu() > 0) {
bundle.setBundleNumber(String.valueOf(inputSet.getKaisu()));
}
//s.oh$
bundle.addClaimItem(item);
}
} else if (code.startsWith(ClaimConst.ADMIN_CODE_START)) {
//
// 用法の場合
//
debug("item is administration");
if (bundle == null) {
stamp = createStamp(stampName, KBN_RP);
if (stamp != null) {
bundle = (BundleDolphin) stamp.getModel();
retSet.add(stamp);
}
}
if (bundle != null) {
if (bundle instanceof BundleMed) {
debug("cur bundle is BundleMed");
bundle.setAdmin(name);
bundle.setAdminCode(code);
bundle.setBundleNumber(String.valueOf(inputSet.getKaisu()));
} else {
debug("cur bundle is ! BundleMed");
bundle.addClaimItem(item);
}
}
} else if (inputcd.startsWith(ClaimConst.RBUI_CODE_START)) {
//
// 放射線部位の場合
//
debug("item is rad loc.");
item.setClassCode(String.valueOf(ClaimConst.SYUGI));
if (bundle == null) {
stamp = createStamp(stampName, KBN_RAD);
if (stamp != null) {
bundle = (BundleDolphin) stamp.getModel();
retSet.add(stamp);
}
}
if (bundle != null) {
//s.oh^ 2014/03/31 スタンプ回数対応
if(inputSet.getKaisu() > 0) {
bundle.setBundleNumber(String.valueOf(inputSet.getKaisu()));
}
//s.oh$
bundle.addClaimItem(item);
}
} else {
debug("item is other");
if (bundle==null) {
stamp = createStamp(stampName, KBN_GENERAL);
if (stamp != null) {
bundle = (BundleDolphin) stamp.getModel();
retSet.add(stamp);
}
}
if (bundle != null) {
//s.oh^ 2014/03/31 スタンプ回数対応
if(inputSet.getKaisu() > 0) {
bundle.setBundleNumber(String.valueOf(inputSet.getKaisu()));
}
//s.oh$
bundle.addClaimItem(item);
}
}
}
}
}
closeStatement(ps2);
}
closeConnection(con);
} catch (Exception e) {
processError(e);
closeConnection(con);
closeStatement(ps1);
closeStatement(ps2);
}
return retSet;
}
/**
* Stampを生成する。
* @param stampName Stamp名
* @param code 診療区分コード
* @return Stamp
*/
private ModuleModel createStamp(String stampName, String code) {
ModuleModel stamp = null;
if (code != null) {
if (code.startsWith(SHINRYO_KBN_START)) {
code = code.substring(1);
}
if (code.length() > SHINRYO_KBN_LENGTH) {
code = code.substring(0, SHINRYO_KBN_LENGTH);
}
stamp = new ModuleModel();
ModuleInfoBean stampInfo = stamp.getModuleInfoBean();
stampInfo.setStampName(stampName);
stampInfo.setStampRole(IInfoModel.ROLE_P); // ROLE_ORCA -> EOLE_P
BundleDolphin bundle;
if (code.startsWith(RP_KBN_START)) {
bundle = new BundleMed();
stamp.setModel(bundle);
String inOut = Project.getBoolean(Project.RP_OUT, true)
? ClientContext.getClaimBundle().getString(ClaimConst.EXT_MEDICINE)
: ClientContext.getClaimBundle().getString(ClaimConst.IN_MEDICINE);
bundle.setMemo(inOut);
} else {
bundle = new BundleDolphin();
stamp.setModel(bundle);
}
bundle.setClassCode(code);
bundle.setClassCodeSystem(ClaimConst.CLASS_CODE_ID);
java.util.ResourceBundle resBundle = ClientContext.getClaimBundle();
bundle.setClassName(resBundle.getString(code));
bundle.setBundleNumber(String.valueOf(DEFAULT_BUNDLE_NUMBER));
String[] entityOrder = getEntityOrderName(code);
if (entityOrder != null) {
stampInfo.setEntity(entityOrder[0]);
bundle.setOrderName(entityOrder[1]);
}
}
return stamp;
}
private String[] getEntityOrderName(String receiptCode) {
try {
int number = Integer.parseInt(receiptCode);
if (number >= 110 && number <= 125) {
return new String[]{IInfoModel.ENTITY_BASE_CHARGE_ORDER, java.util.ResourceBundle.getBundle("open/dolphin/dao/resources/OrcaSqlDelegater").getString("entity.baseCharge")};
} else if (number >= 130 && number <= 150) {
return new String[]{IInfoModel.ENTITY_INSTRACTION_CHARGE_ORDER, java.util.ResourceBundle.getBundle("open/dolphin/dao/resources/OrcaSqlDelegater").getString("entity.instractionHomeCare")};
} else if (number >= 200 && number <= 299) {
return new String[]{IInfoModel.ENTITY_MED_ORDER, java.util.ResourceBundle.getBundle("open/dolphin/dao/resources/OrcaSqlDelegater").getString("entity.prescription")};
}
else if (number >= 300 && number <= 399) {
return new String[]{IInfoModel.ENTITY_INJECTION_ORDER, java.util.ResourceBundle.getBundle("open/dolphin/dao/resources/OrcaSqlDelegater").getString("entity.injection")};
}
else if (number >= 400 && number <= 499) {
return new String[]{IInfoModel.ENTITY_TREATMENT, java.util.ResourceBundle.getBundle("open/dolphin/dao/resources/OrcaSqlDelegater").getString("entity.treatment")};
} else if (number >= 500 && number <= 599) {
return new String[]{IInfoModel.ENTITY_SURGERY_ORDER, java.util.ResourceBundle.getBundle("open/dolphin/dao/resources/OrcaSqlDelegater").getString("entity.surgery")};
} else if (number >= 600 && number <= 699) {
return new String[]{IInfoModel.ENTITY_LABO_TEST, java.util.ResourceBundle.getBundle("open/dolphin/dao/resources/OrcaSqlDelegater").getString("entity.labTest")};
} else if (number >= 700 && number <= 799) {
return new String[]{IInfoModel.ENTITY_RADIOLOGY_ORDER, java.util.ResourceBundle.getBundle("open/dolphin/dao/resources/OrcaSqlDelegater").getString("entity.radilogy")};
} else if (number >= 800 && number <= 899) {
return new String[]{IInfoModel.ENTITY_OTHER_ORDER, java.util.ResourceBundle.getBundle("open/dolphin/dao/resources/OrcaSqlDelegater").getString("entity.other")};
} else {
return new String[]{IInfoModel.ENTITY_GENERAL_ORDER, java.util.ResourceBundle.getBundle("open/dolphin/dao/resources/OrcaSqlDelegater").getString("entity.general")};
}
} catch (Exception e) {
e.printStackTrace(System.err);
}
return null;
}
@Override
protected void debug(String msg) {
//System.out.println(msg);
}
//--------------------------------------------------------------------------
// 病名インポート
//--------------------------------------------------------------------------
/**
* ORCA に登録してある病名を検索する。
* @param patientId
* @param from
* @param to
* @param ascend
* @return Regi
*/
@Override
public ArrayList<RegisteredDiagnosisModel> getOrcaDisease(String patientId, String from, String to, Boolean ascend) {
Connection con = null;
ArrayList<RegisteredDiagnosisModel> collection;
PreparedStatement pt = null;
String sql;
String ptid = null;
int hospNum = getHospNum(); //-1;
StringBuilder sb = new StringBuilder();
sb.append("select ptid, ptnum from tbl_ptnum where hospnum=? and ptnum=?");
sql = sb.toString();
java.util.logging.Logger.getLogger(this.getClass().getName()).fine(sql);
try {
con = getConnection();
pt = con.prepareStatement(sql);
pt.setInt(1, hospNum);
pt.setString(2, patientId);
ResultSet rs = pt.executeQuery();
if (rs.next()) {
ptid = rs.getString(1);
}
closeConnection(con);
closeStatement(pt);
} catch (Exception e) {
java.util.logging.Logger.getLogger(this.getClass().getName()).warning(e.getMessage());
processError(e);
closeConnection(con);
closeStatement(pt);
}
if (ptid == null) {
java.util.logging.Logger.getLogger(this.getClass().getName()).warning("ptid=null");
return null;
}
sb = new StringBuilder();
//sb.append("select sryymd,khnbyomeicd,utagaiflg,syubyoflg,tenkikbn,tenkiymd,byomei from tbl_ptbyomei where ");
sb.append("select sryymd,khnbyomeicd,utagaiflg,syubyoflg,tenkikbn,tenkiymd,byomei,sryka from tbl_ptbyomei where "); // 診療科追加
if (ascend) {
if (hospNum > 0) {
sb.append("hospnum=? and ptid=? and sryymd >= ? and sryymd <= ? and dltflg!=? order by sryymd");
} else {
sb.append("ptid=? and sryymd >= ? and sryymd <= ? and dltflg!=? order by sryymd");
}
} else {
if (hospNum > 0) {
sb.append("hospnum=? and ptid=? and sryymd >= ? and sryymd <= ? and dltflg!=? order by sryymd desc");
} else {
sb.append("ptid=? and sryymd >= ? and sryymd <= ? and dltflg!=? order by sryymd desc");
}
}
sql = sb.toString();
java.util.logging.Logger.getLogger(this.getClass().getName()).fine(sql);
try {
con = getConnection();
pt = con.prepareStatement(sql);
if (hospNum > 0) {
pt.setInt(1, hospNum);
pt.setInt(2, Integer.parseInt(ptid)); // 元町皮膚科
pt.setString(3, from);
pt.setString(4, to);
pt.setString(5, "1");
} else {
pt.setInt(1, Integer.parseInt(ptid)); // 元町皮膚科
pt.setString(2, from);
pt.setString(3, to);
pt.setString(4, "1");
}
ResultSet rs = pt.executeQuery();
collection = new ArrayList<>();
while (rs.next()) {
RegisteredDiagnosisModel ord = new RegisteredDiagnosisModel();
// 疾患開始日
ord.setStartDate(toDolphinDateStr(rs.getString(1)));
// 病名コード
ord.setDiagnosisCode(rs.getString(2));
// 疑いフラグ
storeSuspectedDiagnosis(ord, rs.getString(3));
// 主病名フラグ
storeMainDiagnosis(ord, rs.getString(4));
// 転帰
storeOutcome(ord, rs.getString(5));
// 疾患終了日(転帰)
ord.setEndDate(toDolphinDateStr(rs.getString(6)));
// 疾患名
ord.setDiagnosis(rs.getString(7));
//s.oh^ 2014/03/13 傷病名削除診療科対応
ord.setDepartment(rs.getString(8));
//s.oh$
// 制御のための Status
ord.setStatus("ORCA");
collection.add(ord);
}
rs.close();
closeStatement(pt);
closeConnection(con);
return collection;
} catch (Exception e) {
java.util.logging.Logger.getLogger(this.getClass().getName()).warning(e.getMessage());
processError(e);
closeConnection(con);
closeStatement(pt);
}
return null;
}
/**
* ORCA に登録してある直近の病名を検索する。
* @param patientId
* @param asc
* @return RegisteredDiagnosisModelのリスト
*/
@Override
public ArrayList<RegisteredDiagnosisModel> getActiveOrcaDisease(String patientId, boolean asc) {
Connection con = null;
ArrayList<RegisteredDiagnosisModel> collection;
PreparedStatement pt = null;
String sql;
String ptid = null;
int hospNum = getHospNum(); //-1;
StringBuilder sb = new StringBuilder();
sb.append("select ptid, ptnum from tbl_ptnum where hospnum=? and ptnum=?");
sql = sb.toString();
java.util.logging.Logger.getLogger(this.getClass().getName()).fine(sql);
try {
con = getConnection();
pt = con.prepareStatement(sql);
pt.setInt(1, hospNum);
pt.setString(2, patientId);
ResultSet rs = pt.executeQuery();
if (rs.next()) {
ptid = rs.getString(1);
}
closeConnection(con);
closeStatement(pt);
} catch (Exception e) {
java.util.logging.Logger.getLogger(this.getClass().getName()).warning(e.getMessage());
processError(e);
closeConnection(con);
closeStatement(pt);
}
if (ptid == null) {
java.util.logging.Logger.getLogger(this.getClass().getName()).warning("ptid=null");
return null;
}
sb = new StringBuilder();
//sb.append("select sryymd,khnbyomeicd,utagaiflg,syubyoflg,tenkikbn,tenkiymd,byomei from tbl_ptbyomei where ");
sb.append("select sryymd,khnbyomeicd,utagaiflg,syubyoflg,tenkikbn,tenkiymd,byomei,sryka from tbl_ptbyomei where "); // 診療科追加
if (hospNum > 0) {
//s.oh^ 2014/03/18 ORCAから傷病名の取込
//sb.append("hospnum=? and ptid=? and tenkikbn=? and dltflg!=? order by sryymd");
sb.append("hospnum=? and ptid=? and dltflg!=? order by sryymd");
//s.oh$
} else {
//s.oh^ 2014/03/18 ORCAから傷病名の取込
//sb.append("ptid=? and tenkikbn=? and dltflg!=? order by sryymd");
sb.append("ptid=? and dltflg!=? order by sryymd");
//s.oh$
}
if (!asc) {
sb.append(" desc");
}
sql = sb.toString();
java.util.logging.Logger.getLogger(this.getClass().getName()).fine(sql);
try {
con = getConnection();
pt = con.prepareStatement(sql);
if (hospNum > 0) {
pt.setInt(1, hospNum);
pt.setInt(2, Integer.parseInt(ptid)); // 元町皮膚科
//s.oh^ 2014/03/18 ORCAから傷病名の取込
//pt.setString(3, " ");
//pt.setString(4, "1");
pt.setString(3, "1");
//s.oh$
} else {
pt.setInt(1, Integer.parseInt(ptid)); // 元町皮膚科
//s.oh^ 2014/03/18 ORCAから傷病名の取込
//pt.setString(2, " ");
//pt.setString(3, "1");
pt.setString(2, "1");
//s.oh$
}
ResultSet rs = pt.executeQuery();
collection = new ArrayList<>();
while (rs.next()) {
RegisteredDiagnosisModel ord = new RegisteredDiagnosisModel();
// 疾患開始日
ord.setStartDate(toDolphinDateStr(rs.getString(1)));
// 病名コード
ord.setDiagnosisCode(rs.getString(2));
// 疑いフラグ
storeSuspectedDiagnosis(ord, rs.getString(3));
// 主病名フラグ
storeMainDiagnosis(ord, rs.getString(4));
// 転帰
storeOutcome(ord, rs.getString(5));
// 疾患終了日(転帰)
ord.setEndDate(toDolphinDateStr(rs.getString(6)));
// 疾患名
ord.setDiagnosis(rs.getString(7));
//s.oh^ 2014/03/13 傷病名削除診療科対応
ord.setDepartment(rs.getString(8));
//s.oh$
// 制御のための Status
ord.setStatus("ORCA");
collection.add(ord);
}
rs.close();
closeStatement(pt);
closeConnection(con);
return collection;
} catch (Exception e) {
java.util.logging.Logger.getLogger(this.getClass().getName()).warning(e.getMessage());
processError(e);
closeConnection(con);
closeStatement(pt);
}
return null;
}
// ORCA カテゴリ
private void storeSuspectedDiagnosis(RegisteredDiagnosisModel rdm, String test) {
if (test!=null) {
if (test.equals("1")) {
rdm.setCategory("suspectedDiagnosis");
rdm.setCategoryDesc(java.util.ResourceBundle.getBundle("open/dolphin/dao/resources/OrcaSqlDelegater").getString("suspectedDiagnosis"));
rdm.setCategoryCodeSys("MML0015");
} else if (test.equals("2")) {
// rdm.setCategory("suspectedDiagnosis");
// rdm.setCategoryDesc("急性");
// rdm.setCategoryCodeSys("MML0012");
} else if (test.equals("3")) {
rdm.setCategory("suspectedDiagnosis");
rdm.setCategoryDesc(java.util.ResourceBundle.getBundle("open/dolphin/dao/resources/OrcaSqlDelegater").getString("suspectedDiagnosis"));
rdm.setCategoryCodeSys("MML0015");
}
}
}
private void storeMainDiagnosis(RegisteredDiagnosisModel rdm, String test) {
if (test!=null && test.equals("1")) {
rdm.setCategory("mainDiagnosis");
rdm.setCategoryDesc(java.util.ResourceBundle.getBundle("open/dolphin/dao/resources/OrcaSqlDelegater").getString("mainDiagnosis"));
rdm.setCategoryCodeSys("MML0012");
}
}
// ORCA 転帰
private void storeOutcome(RegisteredDiagnosisModel rdm, String data) {
if (data != null) {
if (data.equals("1")) {
rdm.setOutcome("fullyRecovered");
rdm.setOutcomeDesc(java.util.ResourceBundle.getBundle("open/dolphin/dao/resources/OrcaSqlDelegater").getString("outcome.fullyRecovered"));
rdm.setOutcomeCodeSys("MML0016");
} else if (data.equals("2")) {
rdm.setOutcome("died");
rdm.setOutcomeDesc(java.util.ResourceBundle.getBundle("open/dolphin/dao/resources/OrcaSqlDelegater").getString("outcome.died"));
rdm.setOutcomeCodeSys("MML0016");
} else if (data.equals("3")) {
rdm.setOutcome("pause");
rdm.setOutcomeDesc(java.util.ResourceBundle.getBundle("open/dolphin/dao/resources/OrcaSqlDelegater").getString("outcome.pause"));
rdm.setOutcomeCodeSys("MML0016");
} else if (data.equals("8")) {
rdm.setOutcome("transfer");
rdm.setOutcomeDesc(java.util.ResourceBundle.getBundle("open/dolphin/dao/resources/OrcaSqlDelegater").getString("outcome.transfer"));
rdm.setOutcomeCodeSys("MML0016");
}
}
}
private String toDolphinDateStr(String orcaDate) {
if (orcaDate==null || orcaDate.equals("")) {
return null;
}
try {
SimpleDateFormat sdf = new SimpleDateFormat();
sdf.applyPattern("yyyyMMdd");
Date orca = sdf.parse(orcaDate);
sdf.applyPattern("yyyy-MM-dd");
String ret = sdf.format(orca);
return ret;
} catch (ParseException ex) {
//ex.printStackTrace(System.err);
}
return null;
}
//s.oh^ 2014/03/13 傷病名削除診療科対応
@Override
public ArrayList<String> getDeptInfo() {
ArrayList<String> list = new ArrayList<>(0);
if(Project.getBoolean("orca.orcaapi.getdeptinfo", false)) {
String ip = Project.getString("orca.orcaapi.ip", Project.getString(Project.CLAIM_ADDRESS));
String port = Project.getString("orca.orcaapi.port", "8000");
String id = Project.getString("orca.id", "ormaster");
String password = Project.getString("orca.password", "ormaster123");
if(ip != null) {
OrcaConnect orcaApi = new OrcaConnect(ip, port, id, password, null);
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
String ret = orcaApi.getDepartmentInfo(sf.format(new Date()));
ret = ret.replaceAll("\\<.*?>", ",");
String[] tmps = ret.split(",");
for(String tmp : tmps) {
if(tmp.trim().length() > 0) {
list.add(tmp);
}
}
// HashMap<String, String> deptInfo = new HashMap<String, String>();
// XmlReadWrite xml = new XmlReadWrite();
// try {
// if(ret.length() > 0 && xml.analize(ret, "") == true) {
// if(xml.getRoot().getTagName().equals("xmlio2")) {
// int num = xml.getEleNum(xml.getRoot());
// for(int i = 0; i < num; i++) {
// Element eleDeptRes = xml.getEle(xml.getRoot(), i);
// if(eleDeptRes != null && eleDeptRes.getTagName().equals("departmentres")) {
// num = xml.getEleNum(eleDeptRes);
// for(int j = 0; j < num; j++) {
// Element eleDeptInfo = xml.getEle(eleDeptRes, j);
// if(eleDeptInfo != null && eleDeptInfo.getTagName().equals("Department_Information")) {
// int numChild = xml.getEleNum(eleDeptInfo);
// for(int k = 0; k < numChild; k++) {
// Element eleDeptInfoChild = xml.getEle(eleDeptInfo, k);
// if(eleDeptInfoChild != null && eleDeptInfoChild.getTagName().equals("Department_Information_child")) {
// int numItem = xml.getEleNum(eleDeptInfoChild, "Code");
// String code = null;
// String name = null;
// for(int l = 0; l < numItem; l++) {
// Element eleItem = xml.getEle(eleDeptInfoChild, l);
// if(eleItem != null && eleItem.getTagName().equals("Code")) {
// code = xml.getEleVal(eleItem);
// }else if(eleItem != null && eleItem.getTagName().equals("WholeName")) {
// name = xml.getEleVal(eleItem);
// }
// }
// }
// }
// break;
// }
// }
// break;
// }
// }
// }
// }
// } catch (ParserConfigurationException ex) {
// Logger.getLogger(DiagnosisDocument.class.getName()).log(Level.SEVERE, null, ex);
// } catch (SAXException ex) {
// Logger.getLogger(DiagnosisDocument.class.getName()).log(Level.SEVERE, null, ex);
// } catch (IOException ex) {
// Logger.getLogger(DiagnosisDocument.class.getName()).log(Level.SEVERE, null, ex);
// }
}
}
return list;
}
//s.oh$
}