/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package open.dolphin.common; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.commons.codec.binary.Base64; /** * ORCA APIクラス * @author Life Sciences Computing Corporation. */ public class OrcaApi { private static final String URL_HTTP = "http://"; public static final String REQUESTMETHOD_POST = "POST"; // ORCA public static final String ORCAAPI_VER_47 = "47"; public static final String KIND_01 = "?class=01"; public static final String KIND_02 = "?class=02"; public static final String KIND_03 = "?class=03"; // 受付一覧 private static final String ORCAAPI47_ACCEPTLIST = "/api01rv2/acceptlstv2"; private String ACCEPTLIST; // 予約一覧 private static final String ORCAAPI47_APPOINTLIST = "/api01rv2/appointlstv2"; private String APPOINTLIST; // 患者病名返却 private static final String ORCAAPI47_GETDISEASE = "/api01rv2/diseasegetv2"; private String GETDISEASE; // 患者予約情報 private static final String ORCAAPI47_APPOINTLIST2 = "/api01rv2/appointlst2v2"; private String APPOINTLIST2; // 受付登録 private static final String ORCAAPI47_ACCEPTMOD = "/orca11/acceptmodv2"; private String ACCEPTMOD; // システム管理情報 private static final String ORCAAPI47_SYSTEM01LST = "/api01rv2/system01lstv2"; private String SYSTEM01LST; protected String host; protected String port; protected String user; protected String pass; protected String ver; /** * コンストラクタ */ protected OrcaApi() { super(); Init(); } /** * 初期化 */ void Init() { host = null; port = null; user = null; pass = null; ver = null; } protected void setVerInfo() { if(ver.equals(ORCAAPI_VER_47)) { ACCEPTLIST = ORCAAPI47_ACCEPTLIST; APPOINTLIST = ORCAAPI47_APPOINTLIST; GETDISEASE = ORCAAPI47_GETDISEASE; APPOINTLIST2 = ORCAAPI47_APPOINTLIST2; ACCEPTMOD = ORCAAPI47_ACCEPTMOD; SYSTEM01LST = ORCAAPI47_SYSTEM01LST; } } /** * 受付一覧 * @param date 受付日(YYYY-MM-DD) * @param dcode 診療科コード * @param pcode ドクターコード * @param medical 診療内容区分 * @param kind class=01:受付中取得,class=02:受付済み取得,class=03:全受付取得 * @return */ protected String acceptlst(String date, String dcode, String pcode, String medical, String kind) { StringBuilder sbParam = new StringBuilder(); sbParam.append("<data>"); sbParam.append("<acceptlstreq type=\"record\">"); sbParam.append("<Acceptance_Date type=\"string\">"); sbParam.append(date); sbParam.append("</Acceptance_Date>"); sbParam.append("<Department_Code type=\"string\">"); sbParam.append(dcode); sbParam.append("</Department_Code>"); sbParam.append("<Physician_Code type=\"string\">"); sbParam.append(pcode); sbParam.append("</Physician_Code>"); sbParam.append("<Medical_Information type=\"string\">"); sbParam.append(medical); sbParam.append("</Medical_Information>"); sbParam.append("</acceptlstreq>"); sbParam.append("</data>"); return orcaSendRecv(ACCEPTLIST + kind, sbParam.toString()); /* 1 Information_Date 実施日 2011-03-13 2 Information_Time 実施時間 10:50:00 3 Api_Result 結果コード(ゼロ以外エラー) 00 4 Api_Result_Message エラーメッセージ 処理終了 5 Reskey Patient Info 6 Acceptance_Date 受付日 2011-03-15 7 Acceptlst_Infomation 受付一覧情報 (繰り返し 500) 7-1 Acceptance_Time 受付時間 15:30:00 7-2 Department_Code 診療科コード(01:内科) 01 7-3 Department_WholeName 診療科名称 内科 7-4 Physician_Code ドクターコード 10001 7-5 Physician_WholeName ドクター名 日本 一 7-6 Medical_Information 診療内容区分(01:診察1、 02:薬のみ、 03:注射のみ、 04:検査のみ、 05:リハビリテーション、 06:健康診断、 07:予防注射、 99:該当なし) 01 7-7 Claim_Infometion claim情報 0 7-8 Account_Time 会計時間 15:50:00 7-9 Patient_Information 患者基本情報 7-9-1 Patient_ID 患者番号 00012 7-9-2 WholeName 患者氏名 日医 太郎 7-9-3 WholeName_inKana 患者カナ氏名 ニチイ タロウ 7-9-4 BirthDate 生年月日 1975-01-01 7-9-5 Sex 性別(1:男性、2:女性) 1 7-10 HealthInsurance_Information 保険組合せ情報 7-10-1 InsuranceProvider_Class 保険の種類 060 7-10-2 InsuranceProvider_Number 保険者番号 138057 7-10-3 InsuranceProvider_WholeName 保険の制度名称 国保 7-10-4 HealthInsuredPerson_Symbol 記号 01 7-10-5 HealthInsuredPerson_Number 番号 1234567 7-10-6 HealthInsuredPerson_Continuation 継続区分(1:継続療養、 2:任意継続) 7-10-7 HealthInsuredPerson_Assistance 補助区分(詳細については、「日医標準レセプトソフトデータベーステーブル定義書」を参照して下さい。) 3 7-10-8 RelationToInsuredPerson 本人家族区分(1:本人、 2:家族) 1 7-10-9 HealthInsuredPerson_WholeName 被保険者名 日医 太郎 7-10-10 Certificate_StartDate 適用開始日 2010-05-01 7-10-11 Certificate_ExpiredDate 適用終了日 9999-12-31 7-10-12 PublicInsurance_Information 公費情報(繰り返し 4) 7-10-12-1 PublicInsurance_Class 公費の種類 010 7-10-12-2 PublicInsurance_Name 公費の制度名称 感37の2 7-10-12-3 PublicInsurer_Number 負担者番号 10131142 7-10-12-4 PublicInsuredPerson_Number 受給者番号 1234566 7-10-12-5 Rate_Admission 入院ー負担率(割) 0.05 7-10-12-6 Money_Admission 入院ー固定額 0 7-10-12-7 Rate_Outpatient 外来ー負担率(割) 0.05 7-10-12-8 Money_Outpatient 外来ー固定額 0 7-10-12-9 Certificate_IssuedDate 適用開始日 2010-05-01 7-10-12-10 Certificate_ExpiredDate 適用終了日 9999-12-31 */ } /** * 予約一覧 * @param date 予約日 * @param medical 診療内容区分 * @param pcode ドクターコード * @param kind class=01:予約一覧取得 * @return */ protected String appointlst(String date, String medical, String pcode, String kind) { StringBuilder sbParam = new StringBuilder(); sbParam.append("<data>"); sbParam.append("<appointlstreq type=\"record\">"); sbParam.append("<Appointment_Date type=\"string\">"); sbParam.append(date); sbParam.append("</Appointment_Date>"); sbParam.append("<Medical_Information type=\"string\">"); sbParam.append(medical); sbParam.append("</Medical_Information>"); sbParam.append("<Physician_Code type=\"string\">"); sbParam.append(pcode); sbParam.append("</Physician_Code>"); sbParam.append("</appointlstreq>"); sbParam.append("</data>"); return orcaSendRecv(APPOINTLIST + kind, sbParam.toString()); /* 1 Information_Date 実施日 2011-03-13 2 Information_Time 実施時間 10:50:00 3 Api_Result 結果コード(ゼロ以外エラー) 00 4 Api_Result_Message エラーメッセージ 処理終了 5 Reskey Patient Info 6 Appointment_Date 予約日 2011-03-15 7 Appointlst_Infomation 予約情報 (繰り返し500) 7-1 Appointment_Time 予約時間 15:30:00 7-2 Medical_Information 診療内容区分(01:診察1、 02:薬のみ、 03:注射のみ、 04:検査のみ、 05:リハビリテーション、 06:健康診断、 07:予防注射、 99:該当なし) 01 7-3 Department_Code 予約診療科コード(01:内科) 01 7-4 Department_WholeName 予約診療科名称 内科 7-5 Physician_Code 予約ドクタコード 10001 7-6 Physician_WholeName 予約ドクター名 日本 一 7-7 Visit_Information 来院情報 (1:来院済) 8 Patient_Information 患者情報 8-1 Patient_ID 患者番号 00012 8-2 WholeName 患者氏名 日医 太郎 8-3 WholeName_inKana 患者カナ氏名 ニチイ タロウ 8-4 BirthDate 生年月日 1975-01-01 8-5 Sex 性別(1:男性、2:女性) 1 8-6 Home_Address_Information 自宅住所情報 8-6-1 PhoneNumber1 自宅電話番号 03-8888-9999 */ } /** * 患者病名情報の返却 * @param pid 患者ID(※必須) * @param date 基準月(YYYY-MM)(※省略の場合はシステム時間) * @param kind class=01:患者病名情報の取得 * @return */ protected String diseaseget(String pid, String date, String kind) { StringBuilder sbParam = new StringBuilder(); sbParam.append("<data>"); sbParam.append("<disease_inforeq type=\"record\">"); sbParam.append("<Patient_ID type=\"string\">"); sbParam.append(pid); sbParam.append("</Patient_ID>"); sbParam.append("<Base_Date type=\"string\">"); sbParam.append(date); sbParam.append("</Base_Date>"); sbParam.append("</disease_inforeq>"); sbParam.append("</data>"); return orcaSendRecv(GETDISEASE + kind, sbParam.toString()); /* 1 Information_Date 実施日 2011-09-07 2 Information_Time 実施時間 17:30:30 3 Api_Result 結果コード(ゼロ以外エラー) 00 4 Api_Result_Message エラーメッセージ 処理終了 5 Reskey Medical Info 6 Disease_Infores 患者病名情報 6-1 Patient_ID 患者番号 00012 6-2 WholeName 患者氏名 日医 太郎 6-3 WholeName_inKana 患者カナ氏名 ニチイ タロウ 6-4 BirthDate 生年月日 1975-01-01 6-5 Sex 性別(1:男性、2:女性) 1 7 Base_Date 基準月 2011-09 8 Disease_Information 病名情報(繰り返し 200) 8-1 InOut 入外区分(1:入院、2:入院外) 2 8-2 Department_Code 診療科コード(01:内科) 01 8-3 Insurance_Combination_Number 保険組み合わせ番号 0002 8-4 Disease_Name 病名 ACバイパス術後機械的合併症 8-5 Disease_Single 単独病名情報(繰り返し 21) 8-5-1 Disease_Single_Code 病名コード 8830052 8-5-2 Disease_Single_Name 単独病名 ACバイパス術後機械的合併症 8-5-3 Disease_Single_Condition 単独病名状態(空白:通常、2:削除、3:廃止(実施日時点での)) 8-6 Disease_Category 主病フラグ(PD:主病名) PD 8-7 Disease_SuspectedFlag 疑い、急性フラグ(S:疑い、A:急性、SA:急性かつ疑い) S 8-8 Disease_StartDate 病名開始日 2011-09-08 8-9 Disease_EndDate 転帰日 2011-09-08 8-10 Disease_OutCome 転帰フラグ(F:治癒、D:死亡、C:中止、S:移行) F 8-11 Disease_Supplement_Name 補足コメント 8-12 Disease_Karte_Name カルテ病名 8-13 Disease_Class 疾患区分(03:皮膚科特定疾患指導管理料(1)、04:皮膚科特定疾患指導管理料(2)、05:特定疾患療養管理料、07:てんかん指導料、08:特定疾患療養管理料又はてんかん指導料、09:難病外来指導管理料) 03 4-14 Disease_Receipt_Print レセプト表示有無(1:表示しない、空白:表示する) 1 4-15 Disease_Receipt_Print_Period レセプト表示期間 */ } /** * 患者予約情報 * @param pid 患者ID(※必須) * @param date 基準日(YYYY-MM-DD)(※省略の場合はシステム時間) * @param kind class=01:患者予約情報取得 * @return */ protected String appointlst2(String pid, String date, String kind) { StringBuilder sbParam = new StringBuilder(); sbParam.append("<data>"); sbParam.append("<appointlstreq2 type=\"record\">"); sbParam.append("<Patient_ID type=\"string\">"); sbParam.append(pid); sbParam.append("</Patient_ID>"); sbParam.append("<Base_Date type=\"string\">"); sbParam.append(date); sbParam.append("</Base_Date>"); sbParam.append("</appointlstreq2>"); sbParam.append("</data>"); return orcaSendRecv(APPOINTLIST + kind, sbParam.toString()); /* 1 Information_Date 実施日 2012-12-17 2 Information_Time 実施時間 14:09:44 3 Api_Result 結果コード(ゼロ以外エラー) 00 4 Api_Result_Message エラーメッセージ 処理終了 5 Reskey レスポンスキー情報 Patient Info 6 Base_Date 基準日 2012-12-18 7 Patient_Information 患者基本情報 7-1 Patient_ID 患者番号 00001 7-2 WholeName 患者氏名 テスト 患者 7-3 WholeName_inKana 患者カナ氏名 テスト カンジャ 7-4 BirthDate 生年月日 1970-01-01 7-5 Sex 性別(1:男性、2:女性) 1 8 Appointlst_Information 予約情報(繰り返し 50) 8-1 Appointment_Date 予約日 2012-12-22 8-2 Appointment_Time 予約時間 11:00:00 8-3 Medical_Information 診療内容区分(01:診察1、02:薬のみ、03:注射のみ、04:検査のみ、05:リハビリテーション、06:健康診断、07:予防注射、99:該当なし) 01 8-4 Medical_Information_WholeName 診療内容名称 診察1 8-5 Department_Code 予約診療科コード(01:内科) 01 8-6 Department_WholeName 予約診療科名称 内科 8-7 Physician_Code 予約ドクターコード 10001 8-8 Physician_WholeName 予約ドクター名 おるか 8-9 Visit_Information 来院情報(1:来院済) 1 8-10 Appointment_Note 予約メモ 予約メモテスト */ } /** * 受付登録 * @param pid 患者ID * @param accept 受付ID * @param depart 診療科コード * @param physician ドクターコード * @param kind 種類 * @return */ protected String acceptmod(String pid, String accept, String depart, String physician, String kind) { StringBuilder sbParam = new StringBuilder(); sbParam.append("<data>"); sbParam.append("<acceptreq type=\"record\">"); sbParam.append("<Patient_ID type=\"string\">"); sbParam.append(pid); sbParam.append("</Patient_ID>"); sbParam.append("<Acceptance_Id type=\"string\">"); sbParam.append(accept); sbParam.append("</Acceptance_Id>"); sbParam.append("<Department_Code type=\"string\">"); sbParam.append(depart); sbParam.append("</Department_Code>"); sbParam.append("<Physician_Code type=\"string\">"); sbParam.append(physician); sbParam.append("</Physician_Code>"); sbParam.append("</acceptrea>"); sbParam.append("</data>"); return orcaSendRecv(ACCEPTMOD + kind, sbParam.toString()); /* 1Patient_ID 患者番号 00012 必須 2 Acceptance_Date 受付日 2011-03-15 3 Acceptance_Time 受付時間 15:30:00 4 Acceptance_Id 受付ID 必須(受付取消のみ) 5 Department_Code 診療科コード ※1(01:内科) 01 必須(受付登録のみ) 6 Physician_Code ドクターコード 10001 必須(受付登録のみ) 7 Medical_Information 診療内容区分 ※2(01:診察1、 02:薬のみ、 03:注射のみ、 04:検査のみ、 05:リハビリテーション、 06:健康診断、 07:予防注射、 99:該当なし) 01 ※3 8 HealthInsurance_Information 保険組合せ情報 8-1 InsuranceProvider_Class 保険の種類(060:国保) 060 ※4 8-2 InsuranceProvider_Number 保険者番号 138057 ※4 8-3 InsuranceProvider_WholeName 保険の制度名称 国保 ※4 8-4 HealthInsuredPerson_Symbol 記号 01 8-5 HealthInsuredPerson_Number 番号 1234567 8-6 HealthInsuredPerson_Continuation 継続区分(1:継続療養、 2:任意継続) 8-7 HealthInsuredPerson_Assistance 補助区分(詳細については、「日医標準レセプトソフトデータベーステーブル定義書」を参照して下さい。) 3 8-8 RelationToInsuredPerson 本人家族区分(1:本人、 2:家族) 1 8-9 HealthInsuredPerson_WholeName 被保険者名 日医 太郎 8-10 Certificate_StartDate 適用開始日 2010-05-01 8-11 Certificate_ExpiredDate 適用終了日 9999-12-31 8-12 PublicInsurance_Information 公費情報(繰り返し4) 8-12-1 PublicInsurance_Class 公費の種類 010 ※4 8-12-2 PublicInsurance_Name 公費の制度名称 感37の2 ※4 8-12-3 PublicInsurer_Number 負担者番号 10131142 ※4 8-12-4 PublicInsuredPerson_Number 受給者番号 1234566 ※4 8-12-5 Certificate_IssuedDate 適用開始日 2010-05-01 8-12-6 Certificate_ExpiredDate 適用終了日 9999-12-31 */ } /** * システム管理情報 * @param date 受付日(YYYY-MM-DD) * @param kind class=01:診療科対象,class=02:ドクター対象,class=03:ドクター以外の職員対象 * @return */ protected String system01lst(String date, String kind) { StringBuilder sbParam = new StringBuilder(); sbParam.append("<data>"); sbParam.append("<system01_managereq type=\"record\">"); sbParam.append("<Base_Date type=\"string\">"); sbParam.append(date); sbParam.append("</Base_Date>"); sbParam.append("</system01_managereq>"); sbParam.append("</data>"); return orcaSendRecv(SYSTEM01LST + kind, sbParam.toString()); } /** * 送受信 * @param urlInfo URL情報 * @param data 送信データ * @return */ protected String orcaSendRecv(String urlInfo, String data) { StringBuilder ret = new StringBuilder(); try { StringBuilder urlStr = new StringBuilder(); urlStr.append(URL_HTTP); urlStr.append(host); urlStr.append(":"); urlStr.append(port); urlStr.append(urlInfo); URL url = new URL(urlStr.toString()); HttpURLConnection connection = (HttpURLConnection)url.openConnection(); connection.setDoOutput(true); connection.setUseCaches(false); connection.setRequestMethod(REQUESTMETHOD_POST); connection.setRequestProperty("Content-Type", "application/xml"); byte[] encoded = Base64.encodeBase64((user + ":" + pass).getBytes()); connection.setRequestProperty("Authorization", "Basic " + new String(encoded)); connection.setRequestProperty("Content-Length", "" + data.length()); PrintWriter printWriter = new PrintWriter(connection.getOutputStream()); printWriter.printf(data); printWriter.close(); InputStream is = connection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8")); String line = null; while((line = reader.readLine()) != null) { ret.append(line);//.append("\n"); } reader.close(); connection.disconnect(); } catch (MalformedURLException ex) { Logger.getLogger(OrcaApi.class.getName()).log(Level.SEVERE, null, ex); } catch (Exception ex) { Logger.getLogger(OrcaApi.class.getName()).log(Level.SEVERE, null, ex); } return ret.toString(); } }