2016年10月1日土曜日

いよいよORCAとの通信です。

前回までは,スマホアプリはORCAと通信しているのではなく,ORCAが返してくるのと同じ形式のXMLデータを返してくるダミーのWebサーバと通信していました。それは,ORCAとの通信が少々込み入っているため,そのことに頭を悩ませてプログラム開発が先に進まないことを避けるためでした。
しかし,前回,スマホアプリの表示部分は出来上がったので,いよいよORCAと通信して”本物の”データを引っ張ってこれるようにします。
ORCAとの通信には日医標準レセプトAPIを使います。このAPIは,機能ごとにインターフェース(送信データ,応答データ)が決められています。そして,インターフェースは1つを除いてすべてXML形式でやりとりします。個々の機能の具体的なインターフェースは日医標準レセプトAPIで確認してください。
今作っているスマホアプリに必要な情報は

  1. 患者一覧情報
  2. 患者基本情報

の2つです。患者一覧情報のAPIはここを見てください。そして,患者基本情報のAPIはここです。

患者一覧情報


患者一覧情報を取得するにはORCAサーバにPOSTメソッドで要求データを送ります(17行目)。また,このAPIではXML形式でいくつかのデータをORCAへ送ります。開始日(10行目),終了日(11行目),そしてテスト患者区分(12)行目です。ORCAは指定した開始日と終了日の間に新規登録されたかまたは更新された患者情報の一覧を返してきます。このXMLデータは22行目に設定しています。このプログラムでは開始日を2016/4/1に,終了日を当日に設定してあります。
ORCAサーバへはXML形式の入力データだけでなく認証情報も送ります(19~21行目)。認証情報はユーザ名:パスワードをBase64でエンコードしたものをヘッダに付けて送ります(20行目)。
     function getPatientList() {
        var url = 'http://172.16.108.250:8000/api01rv2/patientlst1v2?class=01';
        patientList = null;

        var baseStartDate = '2016-04-01';
        var today = new Date();
        var baseEndDate = today.getFullYear() + '-' + zeroPadding(today.getMonth() + 1) + '-' + today.getDate();
        var requestXML = '<data>';
        requestXML += '<patientlst1req type="record">';
        requestXML += '<Base_StartDate type="string">' + baseStartDate + '</Base_StartDate>';
        requestXML += '<Base_EndDate type="string">' + baseEndDate + '</Base_EndDate>';
        requestXML += '<Contain_TestPatient_Flag type="string">1</Contain_TestPatient_Flag>';
        requestXML += '</patientlst1req>';
        requestXML += '</data>';

        $.ajax({
            type: 'POST',
            url: url,
            headers:{
                'Authorization' : 'Basic ' + window.btoa(g_user + ':' + g_passwd)
            },
            data: requestXML,
            contentType: "application/xml",
            async: false,
            cache: false,
            // レスポンスデータの形式
            dataType: "xml"
        }).done(function(xml, status, error){
            if (status == 'success') {
                patientList = $(xml).find('Patient_Information');
            } else {
                alert('文書データ取得失敗');
            }
        }).fail(function(xhr, status, error){
            var message = "xhr.status = " + xhr.status + ", xhr.statusText = " + xhr.statusText + ", status = " + status + ", error = " + error;
            alert('サーバから応答がありません: ' + message);
        });
    }
なお,7行目のzeroPaddingは数字の先頭に0を付けて2ケタにする(たとえば1を01にする)関数で以下のように定義されています。
//ゼロパディング
function zeroPadding( val ) {
    return ( "0" + val ).slice( -2 )
}

患者基本情報


患者基本情報はGETメソッドでサーバへ要求データを送ります(5行目)。GETメソッドではデータをクエリストリングとしてURLの一部として送ります(2行目)。?以降がそれです。クエリストリングは「パラメタ=値」という対を必要な数だけ&でつなげて書きます。
    function getPatientData(patientId) {
        var url = 'http://172.16.108.250:8000/api01rv2/patientgetv2?id=' + patientId;
        patientData = null;
        $.ajax({
            type: 'GET',
            headers:{
                'Authorization' : 'Basic ' + window.btoa(g_user + ':' + g_passwd)
            },
            url: url,
            async: false,
            cache: false,
            dataType: "xml"
        }).done(function(xml, status, error){
            if (status == 'success') {
                patientData = $(xml).find('Patient_Information');
            } else {
                alert('文書データ取得失敗');
            }
        }).fail(function(xhr, status, error){
            var message = "xhr.status = " + xhr.status + ", xhr.statusText = " + xhr.statusText + ", status = " + status + ", error = " + error;
            alert('サーバから応答がありません: ' + message);
        });
    }

患者病名情報


次は患者病名情報です。患者病名は詳細画面の下側に表示します(4~16行目)。 2行目のgetDiseaseDataが病名情報をORCAから取得する関数です。
    var diseaseData = null;

    $(document).on('pageinit', '#detail-page', function() {
        getDiseaseData(currentItem.id);
        var html = '';
        $(diseaseData).find('Disease_Information_child').each(function(){
            html += '<ons-list-item class="detail-item">';
            html += '<header>';
            html += '<span class="detail-item-date">' + $(this).find('Disease_StartDate').text() + '</span>';
            html += '</header>';
            html += '<p class="detail-item-diseaseName">' + $(this).find('Disease_Name').text() + '</p>';
            html += '</ons-list-item>';
        });
        $("#detail-item-list").html(html);
        var content = $("#detail-item-list").get(0);
        ons.compile(content);
        
        getPatientData(currentItem.id);
        var homeAddress = patientData.find('Home_Address_Information');
        var address = homeAddress.find('WholeAddress1').text();
        var phone = homeAddress.find('PhoneNumber1').text();
        $('.item-id', this).text(currentItem.id);
        $('.item-gender', this).text(currentItem.gender);
        $('.item-name', this).text(currentItem.name);
        $('.item-name-kana', this).text(currentItem.name_kana);
        $('.item-birthdate', this).text(currentItem.birthdate);
        $('.item-address', this).text(address);
        $('.item-phone', this).text(phone);
        $('.add-note-action-item', this).click(function () {
            // ここに Add a noteがタップされた時の処理を書く
        });
    });
getDiseaseData関数は次のようになります。患者一覧情報取得関数と同じようにXML形式のパラメタをPOSTメソッドをORCAサーバへ送ります。
    function getDiseaseData(patientId) {
        var url = 'http://172.16.108.250:8000/api01rv2/diseasegetv2?class=01';
        diseaseData = null;
        var requestXML = '<data>';
        requestXML += '<disease_inforeq type="record">';
        requestXML += '<Patient_ID type="string">' + patientId + '</Patient_ID>';
        requestXML += '<Base_Date type="string"></Base_Date>';
        requestXML += '</disease_inforeq>';
        requestXML += '</data>';
        $.ajax({
            type: 'POST',
            url: url,
            headers:{
                'Authorization' : 'Basic ' + window.btoa(g_user + ':' + g_passwd)
            },
            data: requestXML,
            contentType: "application/xml",
            async: false,
            cache: false,
            dataType: "xml"
        }).done(function(xml, status, error){
            if (status == 'success') {
                diseaseData = $(xml).find('Disease_Information');
            } else {
                alert('文書データ取得失敗');
            }
        }).fail(function(xhr, status, error){
            var message = "xhr.status = " + xhr.status + ", xhr.statusText = " + xhr.statusText + ", status = " + status + ", error = " + error;
            alert('サーバから応答がありません: ' + message);
        });
    }

診療行為情報


詳細画面で「Add a note」をタップされたら当該患者の診療行為を出力するようプログラムを改良します。

診療行為情報 (medical-page)

そのためには,まず,診療行為を表示する画面(html)を作成します。 単体ファイルでもons-templateとして作成しても構いません。 HTMLファイルの名前をmedical.html,ons-pageのidをmedical-pageとします。 ファイルの中身は詳細画面とほぼ同じで次のようになります。
<ons-template id="medical.html">
    <ons-page id="medical-page">

      <ons-toolbar>
        <div class="left"><ons-back-button>Back</ons-back-button></div>
        <div class="center">診療情報</div>
      </ons-toolbar>

      <ons-list modifier="inset" style="margin-top: 10px">
        <ons-list-item class="item">
          <ons-row>
            <ons-col width="60px"> 
              <div class="item-thum">
                <img src="" class="item-thum-photo" width="50px"></img>  
              </div>
            </ons-col>
            <ons-col>
              <header>
                <span class="item-id">id</span>
                <span class="item-gender">gender</span>
              </header>
              <p class="item-name">name</p>
              <p class="item-name-kana">name_kana</p>
              <p class="item-birthdate">birthdate</p>
              <p class="item-address">address</p>
              <p class="item-phone">phone</p>
            </ons-col>
          </ons-row>
        </ons-list-item>

        <ons-list-item modifier="chevron" id="add-note-action" class="add-note-action-item">
          <ons-icon icon="ion-chatboxes" fixed-width="true" style="color: #ccc"></ons-icon>
          症状詳記
        </ons-list-item>
      </ons-list>

      <ons-list id="medical-item-list" style="margin-top: 10px">
      </ons-list>

      <br>

    </ons-page>
</ons-template>
次に,この画面が表示された時の処理を書きます。 これも,詳細画面(detail-page)と変わりありません。
    var medicalData = null;
    
    $(document).on('pageinit', '#medical-page', function() {
        getMedicalData(currentItem.id);
        var html = '';
        $(medicalData).find('Medical_List_Information_child').each(function(){
            html += '<ons-list-item class="detail-item">';
            html += '<header>';
            html += '<span class="detail-item-date">' + $(this).find('Medical_Class_Name').text() + '</span>';
            html += '</header>';
            html += '<p class="detail-item-diseaseName">' + $(this).find('Medication_Name').text() + '</p>';
            html += '</ons-list-item>';
        });
        $("#medical-item-list").html(html);
        var content = $("#medical-item-list").get(0);
        ons.compile(content);
        
        getPatientData(currentItem.id);
        var homeAddress = patientData.find('Home_Address_Information');
        var address = homeAddress.find('WholeAddress1').text();
        var phone = homeAddress.find('PhoneNumber1').text();
        $('.item-id', this).text(currentItem.id);
        $('.item-gender', this).text(currentItem.gender);
        $('.item-name', this).text(currentItem.name);
        $('.item-name-kana', this).text(currentItem.name_kana);
        $('.item-birthdate', this).text(currentItem.birthdate);
        $('.item-address', this).text(address);
        $('.item-phone', this).text(phone);
        $('.add-note-action-item', this).click(function () {
            alert('病状詳記はまだ実装されていません!');
        });
    });
最後にORCAから当該患者の診療情報を取得する関数getMedicalDataを書きます。 これも患者一覧情報や患者病名情報の取得と同じようにPOSTメッセージでXMLデータを送信します。
    function getMedicalData(patientId) {
        var url = 'http://172.16.108.250:8000/api01rv2/medicalgetv2?class=03';
        medicalData = null;
        var today = new Date();
        var performDate = today.getFullYear() + '-' + zeroPadding(today.getMonth() + 1) + '-' + today.getDate();
        var requestXML = '<data>';
        requestXML += '<medicalgetreq type="record">';
        requestXML += '<InOut type="string">O</InOut>';
        requestXML += '<Patient_ID type="string">' + patientId + '</Patient_ID>';
        requestXML += '<Perform_Date type="string">' + performDate + '</Perform_Date>';
        requestXML += '<For_Months type="string">1</For_Months>';
        requestXML += '<Medical_Information type="record">';
        requestXML += '<Department_Code type="string">01</Department_Code>';
        requestXML += '</Medical_Information>';
        requestXML += '</medicalgetreq>';
        requestXML += '</data>';
        $.ajax({
            type: 'POST',
            url: url,
            headers:{
                'Authorization' : 'Basic ' + window.btoa(g_user + ':' + g_passwd)
            },
            data: requestXML,
            contentType: "application/xml",
            async: false,
            cache: false,
            dataType: "xml"
        }).done(function(xml, status, error){
            if (status == 'success') {
                medicalData = $(xml).find('Medical_List_Information');
            } else {
                alert('文書データ取得失敗');
            }
        }).fail(function(xhr, status, error){
            var message = "xhr.status = " + xhr.status + ", xhr.statusText = " + xhr.statusText + ", status = " + status + ", error = " + error;
            alert('サーバから応答がありません: ' + message);
        });
    }
なお,Add a noteをタップしたときに以下のようにすれば診療行為画面を表示することができます。
        $('.add-note-action-item', this).click(function () {
            app.navi.pushPage('medical.html');
        });

0 件のコメント:

コメントを投稿