2018年5月31日木曜日

OpenDolphinログイン時の通信解析

 今回は前々回と同様の手順を用いてOpenDolphinのパケットキャプチャを行い、実際にどのようなデータが流れているのかを確認した。尚、今回確認したパケットはログインを行った際に送受信されるパケットである(図1,2)。
図1.OpenDolphinログイン画面
 
図2.ログイン後に表示される受付リストとスタンプボックス

図3 Wiresharkでログイン時に流れていたパケットをキャプチャ
取得したパケットは上記の図3の様なものである。ここからprtocolが「HTTP」、Infoが「GET~」から始まるパケットを探すと全部で6つあった。各々に対して、[追跡]>[HTTPストリーム]でパケットの再構築を行った。するとポップアップが表示されるので、show and save data asの項目を「UTF-8形式」に変更し、save as...よりパケットの保存を行う。尚、この際拡張子は「.txt」とする。
保存したパケットを開くと、下記の図4のようなテキストが表示された。
図4 再構築したパケット

1行目のGET~から始まるHTTPリクエストメッセージは、クライアントがどういったデータを要求しているのかを読み取ることが出来る。HTTPリクエストメッセージはリクエスト行とヘッダから構成されている(参考:HTTP入門)。図4では、リクエスト行が次のようになっている。
GET /dolphin/openSource/user/1.3.6.1.4.1.9414.70.1:w3415016 HTTP/1.1
これはHTTPのGETメソッドを使ってユーザ情報を要求しているものと思われる。その際のRESTful APIが次のようになっている。
http://[ホスト名]:8080/dolphin/openSource/user/[ユーザID]
2行目以降はリクエストヘッダで、その中には認証用のパスワードとユーザ名が含まれている。
Accept: application/json
Accept-Encoding: gzip, deflate
password: 6f8e646f95af8e79096477e877245664
userName: 1.3.6.1.4.1.9414.70.1:w3415039

Host: 172.16.108.251:8080
Connection: Keep-Alive
パスワードはMD5ハッシュ関数でダイジェストに置き換えられている。ユーザ名は[医療機関コード:ユーザID]になっている。
次にHTTPレスポンスを見ると次のようになっている。
HTTP/1.1 200 OK
Connection: keep-alive
X-Powered-By: Undertow/1
Server: WildFly/9
Content-Type: application/json
Content-Length: 821
Date: Thu, 31 May 2018 05:49:22 GMT

JSON形式のボディ部
しかし、userIdから始まるJSON形式のボディ部は改行されていないため、大変わかりにくいので、JSON Pretty Printというサイトを用いて、データの整形を行った。まずWiresharkのHTTPストリームからHTTPレスポンスのボディ部にあるJSONデータをコピーし、左のテキストボックスにペーストする。そして中央のメニューにある「Make pretty」というボタンを押下することで、右のテキストボックスに整形されたJSONデータが出力される。以下の図5がその出力結果である。
図5 JSON Pretty Printによって整形されたJSONデータ
そして、右テキストボックスタブメニューに存在する「Copy to clip board」というアイコンをクリックすることで、コピーすることが出来る。そして、テキストファイルに保存されている破損されたデータを整形されたデータに置き換えると下記の図6のように正常なテキストが表示される様になった。
図6 JSONデータを整形したHTTPパケット
他の5つのキャプチャしたパケットも同様の手順で処理を行った。なお、これら6つのHTTPリクエスト行を抽出すると、以下の様になった。
  1. GET /dolphin/openSource/user/1.3.6.1.4.1.9414.70.1:w3415016 HTTP/1.1
  2. GET /dolphin/openSource/serverinfo/cloud/zero HTTP/1.1
  3. GET /dolphin/openSource/chartEvent/subscribe HTTP/1.1
  4. GET /dolphin/openSource/stamp/tree/13 HTTP/1.1
  5. GET /dolphin/openSource/pvt2/pvtList HTTP/1.1
  6. GET /dolphin/openSource/pvt2/pvtList HTTP/1.1

このように、ログイン時だけで6つの通信が行われていることがわかった。4番目は図2に示すスタンプボックスの情報を取得しているものと思われる。5番目、6番目は図2に示す受付リストの情報を取得しているものと思われる。2番目と3番目は不明である。また、なぜ5番目と6番目で受付リストを2回取得しているのかも不明である。

4番目のHTTPレスポンスのボディ部に図7のようなBASE64エンコードされているデータpersonalTree.treeBytesが含まれているのが分かった。
図7 受付リストに含まれるBASE64エンコード文字列()
これをオンラインBase64でデコーダというサイトを用いてデコードすることで、元のデータを抽出することが出来る。
以下の図7がそのデコード結果である。
図8 treeBytesのデコード結果
デコードされた文字列を確認すると、どうやら下に示すようにxml形式のデータであることを読み取ることが出来た。
<stampTree project="open.dolphin" version="1.0">
  <root name="傷病名" entity="diagnosis">
    <stampInfo name="エディタから発行..." role="diagnosis" entity="diagnosis" editable="false" memo="傷病名エディタ"/>
  </root>
  <root name="テキスト" entity="text">
  </root>
  <root name="パ ス" entity="path">
  </root>
  <root name="汎 用" entity="generalOrder">
    <stampInfo name="エディタから発行..." role="p" entity="generalOrder" editable="false" memo="汎用エディタ"/>
  </root>
  <root name="その他" entity="otherOrder">
    <stampInfo name="エディタから発行..." role="p" entity="otherOrder" editable="false" memo="その他エディタ"/>
  </root>
  <root name="処 置" entity="treatmentOrder">
    <stampInfo name="エディタから発行..." role="p" entity="treatmentOrder" editable="false" memo="処置エディタ"/>
  </root>
  <root name="手 術" entity="surgeryOrder">
    <stampInfo name="エディタから発行..." role="p" entity="surgeryOrder" editable="false" memo="手術エディタ"/>
  </root>
  <root name="放射線" entity="radiologyOrder">
    <stampInfo name="エディタから発行..." role="p" entity="radiologyOrder" editable="false" memo="放射線エディタ"/>
  </root>
  <root name="検体検査" entity="testOrder">
    <stampInfo name="エディタから発行..." role="p" entity="testOrder" editable="false" memo="検体検査ディタ"/>
  </root>
  <root name="生体検査" entity="physiologyOrder">
    <stampInfo name="エディタから発行..." role="p" entity="physiologyOrder" editable="false" memo="生体検査エディタ"/>
  </root>
  <root name="細菌検査" entity="bacteriaOrder">
    <stampInfo name="エディタから発行..." role="p" entity="bacteriaOrder" editable="false" memo="細菌検査ディタ"/>
  </root>
  <root name="注 射" entity="injectionOrder">
    <stampInfo name="エディタから発行..." role="p" entity="injectionOrder" editable="false" memo="注射エディタ"/>
  </root>
  <root name="処 方" entity="medOrder">
    <stampInfo name="エディタから発行..." role="p" entity="medOrder" editable="false" memo="処方エディタ"/>
  </root>
  <root name="初診・再診" entity="baseChargeOrder">
    <stampInfo name="エディタから発行..." role="p" entity="baseChargeOrder" editable="false" memo="初診・再診エディタ"/>
  </root>
  <root name="指導・在宅" entity="instractionChargeOrder">
    <stampInfo name="エディタから発行..." role="p" entity="instractionChargeOrder" editable="false" memo="指導・在宅エディタ"/>
  </root>
</stampTree>


これは、明らかに図2に示すスタンプボックスの情報である。このような情報をなぜJSONで記述せず、XMLで記述してBASE64エンコードしているのかは不明である。

次回は、ログイン時以外の様々なパケットの解析を試みたいと思う。

【TIPS】

ログイン時に取り交わされる6つのHTTPメッセージは以下のとおりである。
#1 GET /dolphin/openSource/user/1.3.6.1.4.1.9414.70.1:w3415039 HTTP/1.1
GET /dolphin/openSource/user/1.3.6.1.4.1.9414.70.1:w3415039 HTTP/1.1
Accept: application/json
Accept-Encoding: gzip, deflate
password: 6f8e646f95af8e79096477e877245664
userName: 1.3.6.1.4.1.9414.70.1:w3415039
Host: 172.16.108.251:8080
Connection: Keep-Alive

HTTP/1.1 200 OK
Connection: keep-alive
X-Powered-By: Undertow/1
Server: WildFly/9
Content-Type: application/json
Content-Length: 821
Date: Thu, 31 May 2018 05:49:22 GMT

{
  "userId": "1.3.6.1.4.1.9414.70.1:w3415039",
  "facilityModel": {
    "facilityId": "1.3.6.1.4.1.9414.70.1",
    "facilityName": "クリニック",
    "zipCode": "",
    "telephone": "",
    "facsimile": null,
    "s3URL": null,
    "s3AccessKey": null,
    "s3SecretKey": null,
    "memberType": "FACILITY_USER",
    "registeredDate": "2018-05-10",
    "url": "",
    "address": "",
    "id": 1
  },
  "sirName": "守久",
  "givenName": "遼子",
  "commonName": "守久 遼子",
  "departmentModel": {
    "departmentCodeSys": "MML0028",
    "departmentDesc": "内科",
    "department": "01"
  },
  "memo": null,
  "email": "kurasiki@caja",
  "orcaId": "10002",
  "useDrugId": "",
  "memberType": "FACILITY_USER",
  "registeredDate": "2018-05-17",
  "licenseModel": {
    "licenseDesc": "医師",
    "licenseCodeSys": "MML0026",
    "license": "doctor"
  },
  "roles": [
    {
      "userId": "1.3.6.1.4.1.9414.70.1:w3415039",
      "role": "user",
      "id": 20
    }
  ],
  "password": "6f8e646f95af8e79096477e877245664",
  "id": 19
}
#2 GET /dolphin/openSource/serverinfo/cloud/zero HTTP/1.1
GET /dolphin/openSource/serverinfo/cloud/zero HTTP/1.1
Accept: text/plain
Accept-Encoding: gzip, deflate
password: 6f8e646f95af8e79096477e877245664
userName: 1.3.6.1.4.1.9414.70.1:w3415039
Host: 172.16.108.251:8080
Connection: Keep-Alive

HTTP/1.1 200 OK
Connection: keep-alive
X-Powered-By: Undertow/1
Server: WildFly/9
Content-Type: text/plain
Content-Length: 0
Date: Thu, 31 May 2018 05:49:22 GMT
#3 GET /dolphin/openSource/chartEvent/subscribe HTTP/1.1
GET /dolphin/openSource/chartEvent/subscribe HTTP/1.1
Accept: application/json
Accept-Encoding: gzip, deflate
clientUUID: w3415039:89fa211b-833f-438a-a15e-3a298981e1db
password: 6f8e646f95af8e79096477e877245664
userName: 1.3.6.1.4.1.9414.70.1:w3415039
Host: 172.16.108.251:8080
Connection: Keep-Alive
#4 GET /dolphin/openSource/stamp/tree/19 HTTP/1.1
GET /dolphin/openSource/stamp/tree/19 HTTP/1.1
Accept: application/json
Accept-Encoding: gzip, deflate
password: 6f8e646f95af8e79096477e877245664
userName: 1.3.6.1.4.1.9414.70.1:w3415039
Host: 172.16.108.251:8080
Connection: Keep-Alive

HTTP/1.1 200 OK
Connection: keep-alive
X-Powered-By: Undertow/1
Server: WildFly/9
Content-Type: application/json
Content-Length: 4486
Date: Thu, 31 May 2018 05:49:22 GMT

{
  "personalTree": {
    "category": null,
    "userModel": {
      "userId": "1.3.6.1.4.1.9414.70.1:w3415039",
      "facilityModel": {
        "facilityId": "1.3.6.1.4.1.9414.70.1",
        "facilityName": "クリニック",
        "zipCode": "",
        "telephone": "",
        "facsimile": null,
        "s3URL": null,
        "s3AccessKey": null,
        "s3SecretKey": null,
        "memberType": "FACILITY_USER",
        "registeredDate": "2018-05-10",
        "url": "",
        "address": "",
        "id": 1
      },
      "sirName": "守久",
      "givenName": "遼子",
      "commonName": "守久 遼子",
      "departmentModel": {
        "departmentCodeSys": "MML0028",
        "departmentDesc": "内科",
        "department": "01"
      },
      "memo": null,
      "email": "kurasiki@caja",
      "orcaId": "10002",
      "useDrugId": "",
      "memberType": "FACILITY_USER",
      "registeredDate": "2018-05-17",
      "licenseModel": {
        "licenseDesc": "医師",
        "licenseCodeSys": "MML0026",
        "license": "doctor"
      },
      "roles": [
        {
          "userId": "1.3.6.1.4.1.9414.70.1:w3415039",
          "role": "user",
          "id": 20
        }
      ],
      "password": "6f8e646f95af8e79096477e877245664",
      "id": 19
    },
    "treeBytes": "PHN0YW1wVHJlZSBwcm9qZWN0PSJvcGVuLmRvbHBoaW4iIHZlcnNpb249IjEuMCI+Cjxyb290IG5hbWU9IuWCt+eXheWQjSIgZW50aXR5PSJkaWFnbm9zaXMiPgo8c3RhbXBJbmZvIG5hbWU9IuOCqOODh+OCo+OCv+OBi+OCieeZuuihjC4uLiIgcm9sZT0iZGlhZ25vc2lzIiBlbnRpdHk9ImRpYWdub3NpcyIgZWRpdGFibGU9ImZhbHNlIiBtZW1vPSLlgrfnl4XlkI3jgqjjg4fjgqPjgr8iLz4KPC9yb290Pgo8cm9vdCBuYW1lPSLjg4bjgq3jgrnjg4giIGVudGl0eT0idGV4dCI+Cjwvcm9vdD4KPHJvb3QgbmFtZT0i44ORIOOCuSIgZW50aXR5PSJwYXRoIj4KPC9yb290Pgo8cm9vdCBuYW1lPSLmsY4g55SoIiBlbnRpdHk9ImdlbmVyYWxPcmRlciI+CjxzdGFtcEluZm8gbmFtZT0i44Ko44OH44Kj44K/44GL44KJ55m66KGMLi4uIiByb2xlPSJwIiBlbnRpdHk9ImdlbmVyYWxPcmRlciIgZWRpdGFibGU9ImZhbHNlIiBtZW1vPSLmsY7nlKjjgqjjg4fjgqPjgr8iLz4KPC9yb290Pgo8cm9vdCBuYW1lPSLjgZ3jga7ku5YiIGVudGl0eT0ib3RoZXJPcmRlciI+CjxzdGFtcEluZm8gbmFtZT0i44Ko44OH44Kj44K/44GL44KJ55m66KGMLi4uIiByb2xlPSJwIiBlbnRpdHk9Im90aGVyT3JkZXIiIGVkaXRhYmxlPSJmYWxzZSIgbWVtbz0i44Gd44Gu5LuW44Ko44OH44Kj44K/Ii8+Cjwvcm9vdD4KPHJvb3QgbmFtZT0i5YemIOe9riIgZW50aXR5PSJ0cmVhdG1lbnRPcmRlciI+CjxzdGFtcEluZm8gbmFtZT0i44Ko44OH44Kj44K/44GL44KJ55m66KGMLi4uIiByb2xlPSJwIiBlbnRpdHk9InRyZWF0bWVudE9yZGVyIiBlZGl0YWJsZT0iZmFsc2UiIG1lbW89IuWHpue9ruOCqOODh+OCo+OCvyIvPgo8L3Jvb3Q+Cjxyb290IG5hbWU9IuaJiyDooZMiIGVudGl0eT0ic3VyZ2VyeU9yZGVyIj4KPHN0YW1wSW5mbyBuYW1lPSLjgqjjg4fjgqPjgr/jgYvjgonnmbrooYwuLi4iIHJvbGU9InAiIGVudGl0eT0ic3VyZ2VyeU9yZGVyIiBlZGl0YWJsZT0iZmFsc2UiIG1lbW89IuaJi+ihk+OCqOODh+OCo+OCvyIvPgo8L3Jvb3Q+Cjxyb290IG5hbWU9IuaUvuWwhOe3miIgZW50aXR5PSJyYWRpb2xvZ3lPcmRlciI+CjxzdGFtcEluZm8gbmFtZT0i44Ko44OH44Kj44K/44GL44KJ55m66KGMLi4uIiByb2xlPSJwIiBlbnRpdHk9InJhZGlvbG9neU9yZGVyIiBlZGl0YWJsZT0iZmFsc2UiIG1lbW89IuaUvuWwhOe3muOCqOODh+OCo+OCvyIvPgo8L3Jvb3Q+Cjxyb290IG5hbWU9IuaknOS9k+aknOafuyIgZW50aXR5PSJ0ZXN0T3JkZXIiPgo8c3RhbXBJbmZvIG5hbWU9IuOCqOODh+OCo+OCv+OBi+OCieeZuuihjC4uLiIgcm9sZT0icCIgZW50aXR5PSJ0ZXN0T3JkZXIiIGVkaXRhYmxlPSJmYWxzZSIgbWVtbz0i5qSc5L2T5qSc5p+744OH44Kj44K/Ii8+Cjwvcm9vdD4KPHJvb3QgbmFtZT0i55Sf5L2T5qSc5p+7IiBlbnRpdHk9InBoeXNpb2xvZ3lPcmRlciI+CjxzdGFtcEluZm8gbmFtZT0i44Ko44OH44Kj44K/44GL44KJ55m66KGMLi4uIiByb2xlPSJwIiBlbnRpdHk9InBoeXNpb2xvZ3lPcmRlciIgZWRpdGFibGU9ImZhbHNlIiBtZW1vPSLnlJ/kvZPmpJzmn7vjgqjjg4fjgqPjgr8iLz4KPC9yb290Pgo8cm9vdCBuYW1lPSLntLDoj4zmpJzmn7siIGVudGl0eT0iYmFjdGVyaWFPcmRlciI+CjxzdGFtcEluZm8gbmFtZT0i44Ko44OH44Kj44K/44GL44KJ55m66KGMLi4uIiByb2xlPSJwIiBlbnRpdHk9ImJhY3RlcmlhT3JkZXIiIGVkaXRhYmxlPSJmYWxzZSIgbWVtbz0i57Sw6I+M5qSc5p+744OH44Kj44K/Ii8+Cjwvcm9vdD4KPHJvb3QgbmFtZT0i5rOoIOWwhCIgZW50aXR5PSJpbmplY3Rpb25PcmRlciI+CjxzdGFtcEluZm8gbmFtZT0i44Ko44OH44Kj44K/44GL44KJ55m66KGMLi4uIiByb2xlPSJwIiBlbnRpdHk9ImluamVjdGlvbk9yZGVyIiBlZGl0YWJsZT0iZmFsc2UiIG1lbW89IuazqOWwhOOCqOODh+OCo+OCvyIvPgo8L3Jvb3Q+Cjxyb290IG5hbWU9IuWHpiDmlrkiIGVudGl0eT0ibWVkT3JkZXIiPgo8c3RhbXBJbmZvIG5hbWU9IuOCqOODh+OCo+OCv+OBi+OCieeZuuihjC4uLiIgcm9sZT0icCIgZW50aXR5PSJtZWRPcmRlciIgZWRpdGFibGU9ImZhbHNlIiBtZW1vPSLlh6bmlrnjgqjjg4fjgqPjgr8iLz4KPC9yb290Pgo8cm9vdCBuYW1lPSLliJ3oqLrjg7vlho3oqLoiIGVudGl0eT0iYmFzZUNoYXJnZU9yZGVyIj4KPHN0YW1wSW5mbyBuYW1lPSLjgqjjg4fjgqPjgr/jgYvjgonnmbrooYwuLi4iIHJvbGU9InAiIGVudGl0eT0iYmFzZUNoYXJnZU9yZGVyIiBlZGl0YWJsZT0iZmFsc2UiIG1lbW89IuWIneiouuODu+WGjeiouuOCqOODh+OCo+OCvyIvPgo8L3Jvb3Q+Cjxyb290IG5hbWU9IuaMh+WwjuODu+WcqOWuhSIgZW50aXR5PSJpbnN0cmFjdGlvbkNoYXJnZU9yZGVyIj4KPHN0YW1wSW5mbyBuYW1lPSLjgqjjg4fjgqPjgr/jgYvjgonnmbrooYwuLi4iIHJvbGU9InAiIGVudGl0eT0iaW5zdHJhY3Rpb25DaGFyZ2VPcmRlciIgZWRpdGFibGU9ImZhbHNlIiBtZW1vPSLmjIflsI7jg7vlnKjlroXjgqjjg4fjgqPjgr8iLz4KPC9yb290Pgo8L3N0YW1wVHJlZT4K",
    "publishType": null,
    "partyName": "クリニック",
    "publishedDate": null,
    "lastUpdated": null,
    "published": null,
    "versionNumber": "13",
    "url": "",
    "description": "個人用のスタンプセットです",
    "name": "個人用",
    "id": 23
  },
  "subscribedList": []
}
#5 GET /dolphin/openSource/pvt2/pvtList HTTP/1.1
GET /dolphin/openSource/pvt2/pvtList HTTP/1.1
Accept: application/json
Accept-Encoding: gzip, deflate
password: 6f8e646f95af8e79096477e877245664
userName: 1.3.6.1.4.1.9414.70.1:w3415039
Host: 172.16.108.251:8080
Connection: Keep-Alive

HTTP/1.1 200 OK
Connection: keep-alive
X-Powered-By: Undertow/1
Server: WildFly/9
Content-Type: application/json
Content-Length: 2346
Date: Thu, 31 May 2018 05:49:22 GMT

{
  "list": [
    {
      "memo": null,
      "facilityId": "1.3.6.1.4.1.9414.70.1",
      "patientModel": {
        "romanName": null,
        "nationality": null,
        "nationalityDesc": null,
        "maritalStatus": null,
        "jpegPhoto": null,
        "mobilePhone": null,
        "relations": null,
        "reserve1": null,
        "reserve2": null,
        "reserve3": null,
        "reserve4": null,
        "reserve5": null,
        "reserve6": null,
        "memo": null,
        "email": null,
        "facilityId": "1.3.6.1.4.1.9414.70.1",
        "telephone": null,
        "patientId": "00004",
        "healthInsurances": [
          {
            "beanBytes": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPGphdmEgdmVyc2lvbj0iMS44LjBfMTYxIiBjbGFzcz0iamF2YS5iZWFucy5YTUxEZWNvZGVyIj4KIDxvYmplY3QgY2xhc3M9Im9wZW4uZG9scGhpbi5pbmZvbW9kZWwuUFZUSGVhbHRoSW5zdXJhbmNlTW9kZWwiPgogIDx2b2lkIHByb3BlcnR5PSJHVUlEIj4KICAgPHN0cmluZz41Yjk0NWIyZi01Mzg4LTQ0ODMtYjlhYS0wOTdkMDJhZDk1MmE8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9ImNsaWVudEdyb3VwIj4KICAgPHN0cmluZz7vvJLvvJDvvJDvvJA8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9ImNsaWVudE51bWJlciI+CiAgIDxzdHJpbmc+77yW77yY77yV77yTPC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJleHBpcmVkRGF0ZSI+CiAgIDxzdHJpbmc+OTk5OS0xMi0zMTwvc3RyaW5nPgogIDwvdm9pZD4KICA8dm9pZCBwcm9wZXJ0eT0iZmFtaWx5Q2xhc3MiPgogICA8c3RyaW5nPmZhbHNlPC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJpbnN1cmFuY2VDbGFzcyI+CiAgIDxzdHJpbmc+57WE5ZCIPC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJpbnN1cmFuY2VDbGFzc0NvZGUiPgogICA8c3RyaW5nPjA2PC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJpbnN1cmFuY2VDbGFzc0NvZGVTeXMiPgogICA8c3RyaW5nPk1NTDAwMzE8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9Imluc3VyYW5jZU51bWJlciI+CiAgIDxzdHJpbmc+MDYzMzAwNzA8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9InBheU91dFJhdGlvIj4KICAgPHN0cmluZz4wLjMwPC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJzdGFydERhdGUiPgogICA8c3RyaW5nPjIwMTctMTAtMzA8L3N0cmluZz4KICA8L3ZvaWQ+CiA8L29iamVjdD4KPC9qYXZhPgo=",
            "id": 32
          }
        ],
        "kanaName": "サヤマ セイジ",
        "gender": "male",
        "genderDesc": "M",
        "birthday": "1948-06-15",
        "simpleAddressModel": null,
        "appMemo": "診察1",
        "pvtDate": null,
        "ownerUUID": null,
        "fullName": "佐山 清二",
        "id": 31
      },
      "deptName": "内科",
      "deptCode": "01",
      "doctorName": "守久 遼子",
      "doctorId": "10002",
      "jmariNumber": "JPN000000000000",
      "pvtDate": "2018-05-17T15:22:21",
      "department": "内科,01,守久 遼子,10002,JPN000000000000,",
      "firstInsurance": "06 組合",
      "insuranceUid": "5b945b2f-5388-4483-b9aa-097d02ad952a",
      "lastDocDate": null,
      "appointment": null,
      "id": 34,
      "state": 0
    }
  ]
}
#6 GET /dolphin/openSource/pvt2/pvtList HTTP/1.1
GET /dolphin/openSource/pvt2/pvtList HTTP/1.1
Accept: application/json
Accept-Encoding: gzip, deflate
password: 6f8e646f95af8e79096477e877245664
userName: 1.3.6.1.4.1.9414.70.1:w3415039
Host: 172.16.108.251:8080
Connection: Keep-Alive

HTTP/1.1 200 OK
Connection: keep-alive
X-Powered-By: Undertow/1
Server: WildFly/9
Content-Type: application/json
Content-Length: 2346
Date: Thu, 31 May 2018 05:49:22 GMT

{
  "list": [
    {
      "memo": null,
      "facilityId": "1.3.6.1.4.1.9414.70.1",
      "patientModel": {
        "romanName": null,
        "nationality": null,
        "nationalityDesc": null,
        "maritalStatus": null,
        "jpegPhoto": null,
        "mobilePhone": null,
        "relations": null,
        "reserve1": null,
        "reserve2": null,
        "reserve3": null,
        "reserve4": null,
        "reserve5": null,
        "reserve6": null,
        "memo": null,
        "email": null,
        "facilityId": "1.3.6.1.4.1.9414.70.1",
        "telephone": null,
        "patientId": "00004",
        "healthInsurances": [
          {
            "beanBytes": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPGphdmEgdmVyc2lvbj0iMS44LjBfMTYxIiBjbGFzcz0iamF2YS5iZWFucy5YTUxEZWNvZGVyIj4KIDxvYmplY3QgY2xhc3M9Im9wZW4uZG9scGhpbi5pbmZvbW9kZWwuUFZUSGVhbHRoSW5zdXJhbmNlTW9kZWwiPgogIDx2b2lkIHByb3BlcnR5PSJHVUlEIj4KICAgPHN0cmluZz41Yjk0NWIyZi01Mzg4LTQ0ODMtYjlhYS0wOTdkMDJhZDk1MmE8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9ImNsaWVudEdyb3VwIj4KICAgPHN0cmluZz7vvJLvvJDvvJDvvJA8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9ImNsaWVudE51bWJlciI+CiAgIDxzdHJpbmc+77yW77yY77yV77yTPC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJleHBpcmVkRGF0ZSI+CiAgIDxzdHJpbmc+OTk5OS0xMi0zMTwvc3RyaW5nPgogIDwvdm9pZD4KICA8dm9pZCBwcm9wZXJ0eT0iZmFtaWx5Q2xhc3MiPgogICA8c3RyaW5nPmZhbHNlPC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJpbnN1cmFuY2VDbGFzcyI+CiAgIDxzdHJpbmc+57WE5ZCIPC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJpbnN1cmFuY2VDbGFzc0NvZGUiPgogICA8c3RyaW5nPjA2PC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJpbnN1cmFuY2VDbGFzc0NvZGVTeXMiPgogICA8c3RyaW5nPk1NTDAwMzE8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9Imluc3VyYW5jZU51bWJlciI+CiAgIDxzdHJpbmc+MDYzMzAwNzA8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9InBheU91dFJhdGlvIj4KICAgPHN0cmluZz4wLjMwPC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJzdGFydERhdGUiPgogICA8c3RyaW5nPjIwMTctMTAtMzA8L3N0cmluZz4KICA8L3ZvaWQ+CiA8L29iamVjdD4KPC9qYXZhPgo=",
            "id": 32
          }
        ],
        "kanaName": "サヤマ セイジ",
        "gender": "male",
        "genderDesc": "M",
        "birthday": "1948-06-15",
        "simpleAddressModel": null,
        "appMemo": "診察1",
        "pvtDate": null,
        "ownerUUID": null,
        "fullName": "佐山 清二",
        "id": 31
      },
      "deptName": "内科",
      "deptCode": "01",
      "doctorName": "守久 遼子",
      "doctorId": "10002",
      "jmariNumber": "JPN000000000000",
      "pvtDate": "2018-05-17T15:22:21",
      "department": "内科,01,守久 遼子,10002,JPN000000000000,",
      "firstInsurance": "06 組合",
      "insuranceUid": "5b945b2f-5388-4483-b9aa-097d02ad952a",
      "lastDocDate": null,
      "appointment": null,
      "id": 34,
      "state": 0
    }
  ]
}
#5と#6は同じ内容に見える。
なお、#5,#6の中にあるBASE64エンコード部分(patientModel.healthInsurances.beanBytes)をデコードすると次のようになっていた。
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_161" class="java.beans.XMLDecoder">
 <object class="open.dolphin.infomodel.PVTHealthInsuranceModel">
  <void property="GUID">
   <string>5b945b2f-5388-4483-b9aa-097d02ad952a</string>
  </void>
  <void property="clientGroup">
   <string>2000</string>
  </void>
  <void property="clientNumber">
   <string>6853</string>
  </void>
  <void property="expiredDate">
   <string>9999-12-31</string>
  </void>
  <void property="familyClass">
   <string>false</string>
  </void>
  <void property="insuranceClass">
   <string>組合</string>
  </void>
  <void property="insuranceClassCode">
   <string>06</string>
  </void>
  <void property="insuranceClassCodeSys">
   <string>MML0031</string>
  </void>
  <void property="insuranceNumber">
   <string>06330070</string>
  </void>
  <void property="payOutRatio">
   <string>0.30</string>
  </void>
  <void property="startDate">
   <string>2017-10-30</string>
  </void>
 </object>
</java>
明らかに保険情報である。

使用可能メモリについて

前回のブログで物理メモリと使用可能メモリの間に大きな差があることを書いた。その対策としてシステム構成において最大メモリのチェックを外すという方法が紹介されていた。
これにしたがって操作をしていたところ、誤って最大メモリを0にしたままチェックを入れて再起動してしまった。そのため、使用可能なメモリが0になってしまい、Windowsは起動はするものの、遅くて使い物にならなくなった。
これについてはネット上に「msconfigのブート詳細オプションでメモリを0に設定してしまった」という記事があり、他にも同様な現象にさいなまれている人がいるとわかった。これに対してどのようにして復旧したかを書いておく。

復旧方法

まず復旧するにあたってメモリが全く使われていない関係上通常の環境下ではとてもではないがmsconfigを実行する事ができない為、必要最低限の動作で作業を行う必要がある。その為今回はセーフモードで復旧作業を行うのだが、windows10はデフォルトの状態だと起動時にF8等のコマンドを入力してもセーフモードの起動を行うことができないようだ。そこで調べてみたところ、どうやらwindowsの起動に2回以上失敗すると、次回起動時にスタートアップ修復なるものが実行され、そこからセーフモードでの起動が行える様だ。スタートアップ修復が実行された後は、この様な手順でセーフモードでの起動を行うことが出来る。
セーフモードで起動することができれば、検索バーもしくは「Winキー+R」でファイル名を指定して実行を呼び出し、「msconfig」と入力しシステム構成を起動する。あとはブートタブ>詳細オプションからブート詳細オプションを表示し、「最大メモリ」のチェックを外し設定を変更することで、復旧を行うことが出来る。



2018年5月30日水曜日

メモリの増設

今回は、パソコン(ThinkCentre M90 Small)の処理速度を上げるためパソコンAとパソコンB(いずれも現在2GB)のメモリの増設(4GBに増設)を行った、使ったメモリは図1のメモリ(シリコンパワー デスクトップPC用メモリ 240Pin DIMM DDR3-1333 PC3-10600 4GB)である。

図1 増設するメモリ4G(DDR3 1333)
まずパソコンAの解体を行った。
図2.HDDを取り外す
 HDDを外し(図2)、次いでDVDドライブ(DVDドライブとフロントカバーは一体になっており(これを光学ドライブベイと呼ぶ)、手前に傾ける仕組みになっている)を外した(図3)。

図3.フロントカバーを手前に倒したところ
そして既設の2GBのメモリを抜き取り、代わりに購入した4GBのメモリを挿入した。

図4 メモリの設置

そうしてパソコンAを起動させて結果、「問題が発生したため、PCを再起動する必要があります。自動的に再起動します。」とエラーが発生して正常に動作できなかった。

図5 エラーメッセージ
その後パソコンAのメモリを元に戻しパソコンBでも同様に購入したメモリ4Gを挿入したが、エラーが発生した。
 メモリには相性があり、今回購入したメモリは使用しているパソコンには合わなかったのかもしれない。そこで、レノボの純正メモリ(レノボ・ジャパン 2GB PC3-10600 1333MHz DDR3 ECC UDIMM WSメモリー 43R2033)を購入して増設することにした。
そこで、当座を凌ぐため、以前故障して使えなくなったパソコンから2Gのメモリを抜き、元々パソコンBに入っていたメモリと合わせて2G+2G=4G になるようにした。

コントロールパネルでメモリを確認したら物理メモリは4GBと表示されたものの、使用可能なメモリは2.80Gしかなかった(下図)。これは往々にしてあることのようなので、ネット上にある対処方法に従って対応してみることにする。

図6 コントロールパネルからメモリの状況
今回はメモリ増設だけで時間を使い切った。次回は、OpenDolphinの通信をパケットキャプチャして、各種ツールを利用して分析を行い、どのようなやり取りが行われているかを詳細に見ていきたい。

【TIPS】

2018年5月24日木曜日

pgAdminとWiresharkを用いたORCA,OpenDolphinの閲覧

今回は、スマートフォンアプリケーションを作っていく中で必要なデータを取得するテーブルがORCA,Opendolphinのどこに格納されているのかを、データベースマネジメントシステムPostgreSQLのGUIクライアントツールであるpgAdminを用いて確認をした。

pgAdminをインストール後、Serverの登録を行っていく。

図1:pgAdminの起動画面
図1のような過程でサーバーの設定画面へ行く。
左のタブから「server」を選択し、右クリック>Create>Server...をクリックする。
図2:サーバ名の入力

図3:IPアドレス・ポート番号の入力
すると、サーバー設定のポップアップが表示されるので、図2、図3のようにサーバーの設定を行った。
ORCAが使用するデータベースはLinuxサーバ上にインストールされているので、ポート番号にはPostgreSQLの標準ポート番号である5432を入力する。
一方、OpenDolphinが使用するデータベースはDocker上で動いているので、コンテナが外部に公開しているPostgreSQLのポート番号である32768を入力することに注意する。
サーバー設定が完了すると左タブのSeverに設定した名前(今回はORCAとOpenDolphin)が表示されるのでデータベースが含まれるテーブルの確認を行う。なお、テーブルデータが格納されている場所はServer>サーバーの名前>データベース>データベース名>スキーマ>パブリック>テーブルで確認することができる。
図4.pgAdminのブラウザ(左側)

図5:ORCAの患者テーブル(tbl_ptinf)

図6:OpenDolphiのd_moduleテーブル
そして、閲覧したいテーブル上で右クリック>View/Edit Data>All Rowsでテーブル内のデータを閲覧することができる。
図5、図6は実際にデータベースの閲覧を行った図である。
図5はORCAのデータベースにある患者情報テーブル(tbl_ptinf)の中身である。なお、ORCAのテーブル定義書は公開されている。
一方、図6はOpenDolphinのデータベースにあるオーダ情報などが格納されているテーブル(d_module)の中身である。残念ながら、OpenDolphinのデータベーステーブル定義書は公開されていないようなので、pgAdmin等のDBクライアントツールでテーブルスキーマを確認するしかない。

次に、OpenDolphinクライアントがサーバとの間でどのようなデータをやり取りしているか確認するために、パケットキャプチャツールWiresharkを用いて通信データ内容をキャプチャした。
図7:Wiresharkの画面(キャプチャフィルタの設定)
図7のようにキャプチャフィルタに「host 172.16.108.251」を設定してパケットキャプチャした。ここで、172.16.108.251はOpenDolphinサーバのIPアドレスである。
手順としては、まずあらかじめOpenDolphinを起動しておき、患者のカルテを開く手前の状態にしておく。次にWirasharkでパケットキャプチャを行い、パケットのやり取りを確認した。それが以下の図8である。
図8:パケット一覧

そして、protocolが「HTTP」infoが「GET...」から始まるパケットを探し、右クリックのメニューから「HTTPストリーム」を実行することで、キャプチャしたパケットの詳細な内容を確認することができる。尚、HTTPストリームを行った際に該当したパケットが表示されない場合は、別のパケットに格納されている可能性があるので、順次上記の条件で始まるパケットを確認していく必要がある。
図9.ログイン時のメッセージのやり取り


上記の図9がHTTPストリームを行った後に表示される通信内容である。右下の「show and save data as」の項目を「UTF-8形式」に変更することで、パケットの内容が日本語で表示されるようになる。
ここで、HTTPヘッダ(図9の赤文字で示されている部分)を確認すると、1行目はGET~から表示されているURLを指定し、2行目では、json形式で表示するように要求をしている。そして、4行目では認証のためのパスワードのハッシュ(MD5)を、5行目ではログインユーザIDを指定している(ユーザIDは医療機関コード:ユーザIDという形式になっていることがわかる)。
このようなAPIをRESTful APIという。OpenDolphinはRESTful APIをサポートしており、任意のクライアントから所定のRESTful APIを用いてデータを取得(あるいは追加・更新・削除)ができるようになっている。そのため、クライアントは直接データベースにアクセスすることなくデータを取得できる。
GET /dolphin/openSource/user/1.3.6.1.4.1.9414.70.1:mtanaka HTTP/1.1
Accept: application/json
Accept-Encoding: gzip, deflate
password: 5f4dcc3b5aa765d61d8327deb882cf99
userName: 1.3.6.1.4.1.9414.70.1:mtanaka
Host: 172.16.108.251:8080
Connection: Keep-Alive
json形式とは、JavaScript Object Notationの略で、JavaScriptでオブジェクトを記述する書式である。下記はサーバからのレスポンスで、ボディ部にはJSON形式でサーバからデータが送られてきていることがわかる。JSON形式のデータは、全体を"{}"でくくり、キーと値を「"キー名":"値"」の形式で表記する。そして、この"キー":"値"ペアを","(カンマ)で区切って表記する。また、データは階層的に記述することができる。例えば下記の例では、facilityModelという項目の中がさらに{}で括られたオブジェクトになっており、その中にfacilityIdやfacilityNameといった要素が入っている。
HTTP/1.1 200 OK
Connection: keep-alive
X-Powered-By: Undertow/1
Server: WildFly/9
Content-Type: application/json
Content-Length: 833
Date: Fri, 25 May 2018 02:42:01 GMT

{
  "userId": "1.3.6.1.4.1.9414.70.1:mtanaka",
  "facilityModel": {
    "facilityId": "1.3.6.1.4.1.9414.70.1",
    "facilityName": "クリニック",
    "zipCode": "",
    "telephone": "",
    "facsimile": null,
    "s3URL": null,
    "s3AccessKey": null,
    "s3SecretKey": null,
    "memberType": "FACILITY_USER",
    "registeredDate": "2018-05-10",
    "url": "",
    "address": "",
    "id": 1
  },
  "sirName": "中田",
  "givenName": "太郎",
  "commonName": "中田 太郎",
  "departmentModel": {
    "departmentCodeSys": "MML0028",
    "departmentDesc": "内科",
    "department": "01"
  },
  "memo": null,
  "email": "nakata@dolphin.jp",
  "orcaId": "10006",
  "useDrugId": "",
  "memberType": "FACILITY_USER",
  "registeredDate": "2018-05-17",
  "licenseModel": {
    "licenseDesc": "医師",
    "licenseCodeSys": "MML0026",
    "license": "doctor"
  },
  "roles": [
    {
      "userId": "1.3.6.1.4.1.9414.70.1:mtanaka",
      "role": "user",
      "id": 11
    }
  ],
  "password": "5f4dcc3b5aa765d61d8327deb882cf99",
  "id": 10
}
先に見たようにOpenDolphinのRESTful APIはHTTPリクエストヘッダに認証用のパスワードとユーザIDを設定している。したがって、ブラウザのアドレスにURLだけ入力してもエラーになるだけである(図10)。

図10 :ブラウザからURLを入力した場合はエラーになる
同様にして、OpenDolphinのクライアント-サーバ間の通信をパケットキャプチャすることでJSON形式の通信内容を取得できる。それを解析すれば独自にスマホアプリを開発できる。
例えば、以下は検査データのパケットをキャプチャしたものである。
{
  "list": [
    {
      "progressState": null,
      "items": [
        {
          "laboCode": null,
          "lipemia": null,
          "hemolysis": null,
          "dialysis": null,
          "reportStatus": "E",
          "groupCode": "01",
          "groupName": "生化学的検査",
          "parentCode": "0001",
          "medisCode": "3J010000002327101",
          "itemName": "総ビリルビン",
          "abnormalFlg": null,
          "normalValue": "0.2-1.2",
          "specimenCode": "023",
          "specimenName": "血清",
          "commentCode1": null,
          "comment1": null,
          "commentCode2": null,
          "comment2": null,
          "sortKey": null,
          "itemCode": "0001",
          "sampleDate": "2018-05-02 00:00",
          "patientId": "1.3.6.1.4.1.9414.70.1:00004",
          "unit": "mg/dL",
          "value": "0.811980324",
          "id": 2079
        },
        {
          "laboCode": null,
          "lipemia": null,
          "hemolysis": null,
          "dialysis": null,
          "reportStatus": "E",
          "groupCode": "01",
          "groupName": "生化学的検査",
          "parentCode": "0002",
          "medisCode": "3J015000002327101",
          "itemName": "直接ビリルビン",
          "abnormalFlg": null,
          "normalValue": "0.0-0.4",
          "specimenCode": "023",
          "specimenName": "血清",
          "commentCode1": null,
          "comment1": null,
          "commentCode2": null,
          "comment2": null,
          "sortKey": null,
          "itemCode": "0002",
          "sampleDate": "2018-05-02 00:00",
          "patientId": "1.3.6.1.4.1.9414.70.1:00004",
          "unit": "mg/dL",
          "value": "0.305672831",
          "id": 2080
        },
        ・・・・(中略)・・・・
      ],
      "sampleDate": "2018-04-28 00:00",
      "laboCenterCode": "LSCC",
      "moduleKey": "LSCC2018042842011",
      "reportFormat": null,
      "patientName": "佐山 清二",
      "patientSex": "M",
      "numOfItems": null,
      "patientId": "1.3.6.1.4.1.9414.70.1:00004",
      "id": 1153
    }
  ]
}
groupName:"生化学検査”,parentCode":"0001"…といったように、それぞれ対応したテーブルと、それに該当するデータがパケットとして送信されていることがわかる。このパケットからデータを取得することで、OpenDolphin上でデータの表示をすることができるのだということが分かった。
今回は確認が容易である検査データのパケットキャプチャを行ったが、pgAdmin上で確認できなかった所見欄のデータも同じように確認することができるであろう。
各データの格納場所と、取得方法に関する大まかな検討はつけることができたので、
次回はスマホアプリケーションの開発に挑戦していこうと思う。

【TIPS】

以下にOpenDolphinのいくつかの通信をキャプチャしたものを示す。

受付リスト

これはログイン後、受付リスト(図11)が表示されるときの通信内容をキャプチャしたものである。
図11.受付リスト
GET /dolphin/openSource/pvt2/pvtList HTTP/1.1
Accept: application/json
Accept-Encoding: gzip, deflate
password: 5f4dcc3b5aa765d61d8327deb882cf99
userName: 1.3.6.1.4.1.9414.70.1:mtanaka
Host: 172.16.108.251:8080
Connection: Keep-Alive

HTTP/1.1 200 OK
Connection: keep-alive
X-Powered-By: Undertow/1
Server: WildFly/9
Content-Type: application/json
Content-Length: 2346
Date: Fri, 25 May 2018 02:47:17 GMT

{
  "list": [
    {
      "memo": null,
      "facilityId": "1.3.6.1.4.1.9414.70.1",
      "patientModel": {
        "romanName": null,
        "nationality": null,
        "nationalityDesc": null,
        "maritalStatus": null,
        "jpegPhoto": null,
        "mobilePhone": null,
        "relations": null,
        "reserve1": null,
        "reserve2": null,
        "reserve3": null,
        "reserve4": null,
        "reserve5": null,
        "reserve6": null,
        "memo": null,
        "email": null,
        "facilityId": "1.3.6.1.4.1.9414.70.1",
        "telephone": null,
        "patientId": "00004",
        "healthInsurances": [
          {
            "beanBytes": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPGphdmEgdmVyc2lvbj0iMS44LjBfMTYxIiBjbGFzcz0iamF2YS5iZWFucy5YTUxEZWNvZGVyIj4KIDxvYmplY3QgY2xhc3M9Im9wZW4uZG9scGhpbi5pbmZvbW9kZWwuUFZUSGVhbHRoSW5zdXJhbmNlTW9kZWwiPgogIDx2b2lkIHByb3BlcnR5PSJHVUlEIj4KICAgPHN0cmluZz41Yjk0NWIyZi01Mzg4LTQ0ODMtYjlhYS0wOTdkMDJhZDk1MmE8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9ImNsaWVudEdyb3VwIj4KICAgPHN0cmluZz7vvJLvvJDvvJDvvJA8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9ImNsaWVudE51bWJlciI+CiAgIDxzdHJpbmc+77yW77yY77yV77yTPC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJleHBpcmVkRGF0ZSI+CiAgIDxzdHJpbmc+OTk5OS0xMi0zMTwvc3RyaW5nPgogIDwvdm9pZD4KICA8dm9pZCBwcm9wZXJ0eT0iZmFtaWx5Q2xhc3MiPgogICA8c3RyaW5nPmZhbHNlPC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJpbnN1cmFuY2VDbGFzcyI+CiAgIDxzdHJpbmc+57WE5ZCIPC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJpbnN1cmFuY2VDbGFzc0NvZGUiPgogICA8c3RyaW5nPjA2PC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJpbnN1cmFuY2VDbGFzc0NvZGVTeXMiPgogICA8c3RyaW5nPk1NTDAwMzE8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9Imluc3VyYW5jZU51bWJlciI+CiAgIDxzdHJpbmc+MDYzMzAwNzA8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9InBheU91dFJhdGlvIj4KICAgPHN0cmluZz4wLjMwPC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJzdGFydERhdGUiPgogICA8c3RyaW5nPjIwMTctMTAtMzA8L3N0cmluZz4KICA8L3ZvaWQ+CiA8L29iamVjdD4KPC9qYXZhPgo=",
            "id": 32
          }
        ],
        "kanaName": "サヤマ セイジ",
        "gender": "male",
        "genderDesc": "M",
        "birthday": "1948-06-15",
        "simpleAddressModel": null,
        "appMemo": "診察1",
        "pvtDate": null,
        "ownerUUID": null,
        "fullName": "佐山 清二",
        "id": 31
      },
      "deptName": "内科",
      "deptCode": "01",
      "doctorName": "久森 良子",
      "doctorId": "10002",
      "jmariNumber": "JPN000000000000",
      "pvtDate": "2018-05-17T15:22:21",
      "department": "内科,01,久森 良子,10002,JPN000000000000,",
      "firstInsurance": "06 組合",
      "insuranceUid": "5b945b2f-5388-4483-b9aa-097d02ad952a",
      "lastDocDate": null,
      "appointment": null,
      "id": 34,
      "state": 0
    }
  ]
}

患者検索

患者検索画面でキーワードに"0000"を入力してエンターキーを押したときの通信内容をキャプチャしたものである。
図12.患者検索画面
GET /dolphin/openSource/patient/digit/0000 HTTP/1.1
Accept: application/json
Accept-Encoding: gzip, deflate
password: 5f4dcc3b5aa765d61d8327deb882cf99
userName: 1.3.6.1.4.1.9414.70.1:mtanaka
Host: 172.16.108.251:8080
Connection: Keep-Alive

HTTP/1.1 200 OK
Connection: keep-alive
X-Powered-By: Undertow/1
Server: WildFly/9
Content-Type: application/json
Content-Length: 7830
Date: Fri, 25 May 2018 02:49:22 GMT

{
  "list": [
    {
      "romanName": null,
      "nationality": null,
      "nationalityDesc": null,
      "maritalStatus": null,
      "jpegPhoto": null,
      "mobilePhone": null,
      "relations": null,
      "reserve1": null,
      "reserve2": null,
      "reserve3": null,
      "reserve4": null,
      "reserve5": null,
      "reserve6": null,
      "memo": null,
      "email": null,
      "facilityId": "1.3.6.1.4.1.9414.70.1",
      "telephone": null,
      "patientId": "00003",
      "healthInsurances": [
        {
          "beanBytes": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPGphdmEgdmVyc2lvbj0iMS44LjBfMTcxIiBjbGFzcz0iamF2YS5iZWFucy5YTUxEZWNvZGVyIj4KIDxvYmplY3QgY2xhc3M9Im9wZW4uZG9scGhpbi5pbmZvbW9kZWwuUFZUSGVhbHRoSW5zdXJhbmNlTW9kZWwiPgogIDx2b2lkIHByb3BlcnR5PSJHVUlEIj4KICAgPHN0cmluZz40MDIyNjE1ZC1kNWE0LTRiY2ItYWJiMC1hZTY2MTEzY2FjMTg8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9ImNsaWVudEdyb3VwIj4KICAgPHN0cmluZz7vvJHvvJDvvJg8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9ImNsaWVudE51bWJlciI+CiAgIDxzdHJpbmc+77yU77yT77yS77yV77yS77yRPC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJleHBpcmVkRGF0ZSI+CiAgIDxzdHJpbmc+OTk5OS0xMi0zMTwvc3RyaW5nPgogIDwvdm9pZD4KICA8dm9pZCBwcm9wZXJ0eT0iZmFtaWx5Q2xhc3MiPgogICA8c3RyaW5nPmZhbHNlPC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJpbnN1cmFuY2VDbGFzcyI+CiAgIDxzdHJpbmc+57WE5ZCIPC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJpbnN1cmFuY2VDbGFzc0NvZGUiPgogICA8c3RyaW5nPjA2PC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJpbnN1cmFuY2VDbGFzc0NvZGVTeXMiPgogICA8c3RyaW5nPk1NTDAwMzE8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9Imluc3VyYW5jZU51bWJlciI+CiAgIDxzdHJpbmc+MDYwNDAxMzM8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9InBheU91dFJhdGlvIj4KICAgPHN0cmluZz4wLjMwPC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJzdGFydERhdGUiPgogICA8c3RyaW5nPjIwMTctMTAtMzA8L3N0cmluZz4KICA8L3ZvaWQ+CiA8L29iamVjdD4KPC9qYXZhPgo=",
          "id": 28
        }
      ],
      "kanaName": "サカイ ハルヨ",
      "gender": "female",
      "genderDesc": "F",
      "birthday": "1976-06-04",
      "simpleAddressModel": null,
      "appMemo": "診察1",
      "pvtDate": "2018-05-17T15:22:20",
      "ownerUUID": null,
      "fullName": "酒井 春代",
      "id": 27
    },
    {
      "romanName": null,
      "nationality": null,
      "nationalityDesc": null,
      "maritalStatus": null,
      "jpegPhoto": null,
      "mobilePhone": null,
      "relations": null,
      "reserve1": null,
      "reserve2": null,
      "reserve3": null,
      "reserve4": null,
      "reserve5": null,
      "reserve6": null,
      "memo": null,
      "email": null,
      "facilityId": "1.3.6.1.4.1.9414.70.1",
      "telephone": null,
      "patientId": "00002",
      "healthInsurances": [
        {
          "beanBytes": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPGphdmEgdmVyc2lvbj0iMS44LjBfNDUiIGNsYXNzPSJqYXZhLmJlYW5zLlhNTERlY29kZXIiPgogPG9iamVjdCBjbGFzcz0ib3Blbi5kb2xwaGluLmluZm9tb2RlbC5QVlRIZWFsdGhJbnN1cmFuY2VNb2RlbCI+CiAgPHZvaWQgcHJvcGVydHk9IkdVSUQiPgogICA8c3RyaW5nPjFhYWM3MjMyLWEwZWEtNDM2Ny1hODMwLTE0OTE5NjMzYTYzZjwvc3RyaW5nPgogIDwvdm9pZD4KICA8dm9pZCBwcm9wZXJ0eT0iY2xpZW50R3JvdXAiPgogICA8c3RyaW5nPumDvTwvc3RyaW5nPgogIDwvdm9pZD4KICA8dm9pZCBwcm9wZXJ0eT0iY2xpZW50TnVtYmVyIj4KICAgPHN0cmluZz7vvJfvvJfvvJTvvJLvvJE8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9ImV4cGlyZWREYXRlIj4KICAgPHN0cmluZz45OTk5LTEyLTMxPC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJmYW1pbHlDbGFzcyI+CiAgIDxzdHJpbmc+dHJ1ZTwvc3RyaW5nPgogIDwvdm9pZD4KICA8dm9pZCBwcm9wZXJ0eT0iaW5zdXJhbmNlQ2xhc3MiPgogICA8c3RyaW5nPuWcsOaWueWFsea4iDwvc3RyaW5nPgogIDwvdm9pZD4KICA8dm9pZCBwcm9wZXJ0eT0iaW5zdXJhbmNlQ2xhc3NDb2RlIj4KICAgPHN0cmluZz4zMjwvc3RyaW5nPgogIDwvdm9pZD4KICA8dm9pZCBwcm9wZXJ0eT0iaW5zdXJhbmNlQ2xhc3NDb2RlU3lzIj4KICAgPHN0cmluZz5NTUwwMDMxPC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJpbnN1cmFuY2VOdW1iZXIiPgogICA8c3RyaW5nPjMyMTMwMjEzPC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJwYXlPdXRSYXRpbyI+CiAgIDxzdHJpbmc+MC4zMDwvc3RyaW5nPgogIDwvdm9pZD4KICA8dm9pZCBwcm9wZXJ0eT0ic3RhcnREYXRlIj4KICAgPHN0cmluZz4yMDE3LTEwLTI1PC9zdHJpbmc+CiAgPC92b2lkPgogPC9vYmplY3Q+CjwvamF2YT4K",
          "id": 40
        }
      ],
      "kanaName": "フクダ ヨシヒロ",
      "gender": "male",
      "genderDesc": "M",
      "birthday": "1961-08-27",
      "simpleAddressModel": null,
      "appMemo": "診察1",
      "pvtDate": "2018-05-17T15:22:52",
      "ownerUUID": null,
      "fullName": "福田 佳宏",
      "id": 39
    },
    {
      "romanName": null,
      "nationality": null,
      "nationalityDesc": null,
      "maritalStatus": null,
      "jpegPhoto": null,
      "mobilePhone": null,
      "relations": null,
      "reserve1": null,
      "reserve2": null,
      "reserve3": null,
      "reserve4": null,
      "reserve5": null,
      "reserve6": null,
      "memo": null,
      "email": null,
      "facilityId": "1.3.6.1.4.1.9414.70.1",
      "telephone": null,
      "patientId": "00004",
      "healthInsurances": [
        {
          "beanBytes": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPGphdmEgdmVyc2lvbj0iMS44LjBfMTYxIiBjbGFzcz0iamF2YS5iZWFucy5YTUxEZWNvZGVyIj4KIDxvYmplY3QgY2xhc3M9Im9wZW4uZG9scGhpbi5pbmZvbW9kZWwuUFZUSGVhbHRoSW5zdXJhbmNlTW9kZWwiPgogIDx2b2lkIHByb3BlcnR5PSJHVUlEIj4KICAgPHN0cmluZz41Yjk0NWIyZi01Mzg4LTQ0ODMtYjlhYS0wOTdkMDJhZDk1MmE8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9ImNsaWVudEdyb3VwIj4KICAgPHN0cmluZz7vvJLvvJDvvJDvvJA8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9ImNsaWVudE51bWJlciI+CiAgIDxzdHJpbmc+77yW77yY77yV77yTPC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJleHBpcmVkRGF0ZSI+CiAgIDxzdHJpbmc+OTk5OS0xMi0zMTwvc3RyaW5nPgogIDwvdm9pZD4KICA8dm9pZCBwcm9wZXJ0eT0iZmFtaWx5Q2xhc3MiPgogICA8c3RyaW5nPmZhbHNlPC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJpbnN1cmFuY2VDbGFzcyI+CiAgIDxzdHJpbmc+57WE5ZCIPC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJpbnN1cmFuY2VDbGFzc0NvZGUiPgogICA8c3RyaW5nPjA2PC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJpbnN1cmFuY2VDbGFzc0NvZGVTeXMiPgogICA8c3RyaW5nPk1NTDAwMzE8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9Imluc3VyYW5jZU51bWJlciI+CiAgIDxzdHJpbmc+MDYzMzAwNzA8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9InBheU91dFJhdGlvIj4KICAgPHN0cmluZz4wLjMwPC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJzdGFydERhdGUiPgogICA8c3RyaW5nPjIwMTctMTAtMzA8L3N0cmluZz4KICA8L3ZvaWQ+CiA8L29iamVjdD4KPC9qYXZhPgo=",
          "id": 32
        }
      ],
      "kanaName": "サヤマ セイジ",
      "gender": "male",
      "genderDesc": "M",
      "birthday": "1948-06-15",
      "simpleAddressModel": null,
      "appMemo": "診察1",
      "pvtDate": "2018-05-17T15:22:21",
      "ownerUUID": null,
      "fullName": "佐山 清二",
      "id": 31
    },
    {
      "romanName": null,
      "nationality": null,
      "nationalityDesc": null,
      "maritalStatus": null,
      "jpegPhoto": null,
      "mobilePhone": null,
      "relations": null,
      "reserve1": null,
      "reserve2": null,
      "reserve3": null,
      "reserve4": null,
      "reserve5": null,
      "reserve6": null,
      "memo": null,
      "email": null,
      "facilityId": "1.3.6.1.4.1.9414.70.1",
      "telephone": null,
      "patientId": "00001",
      "healthInsurances": [
        {
          "beanBytes": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPGphdmEgdmVyc2lvbj0iMS44LjBfMTcxIiBjbGFzcz0iamF2YS5iZWFucy5YTUxEZWNvZGVyIj4KIDxvYmplY3QgY2xhc3M9Im9wZW4uZG9scGhpbi5pbmZvbW9kZWwuUFZUSGVhbHRoSW5zdXJhbmNlTW9kZWwiPgogIDx2b2lkIHByb3BlcnR5PSJHVUlEIj4KICAgPHN0cmluZz45MjYyOTRlZi03YTZmLTRlOTYtODEyNS03OThlMzQwYWNhNjM8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9ImNsaWVudEdyb3VwIj4KICAgPHN0cmluZz7vvJTvvJHvvJDvvJbvvJHvvJLvvJTvvJI8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9ImNsaWVudE51bWJlciI+CiAgIDxzdHJpbmc+77yZ77yW77yT77yVPC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJleHBpcmVkRGF0ZSI+CiAgIDxzdHJpbmc+OTk5OS0xMi0zMTwvc3RyaW5nPgogIDwvdm9pZD4KICA8dm9pZCBwcm9wZXJ0eT0iZmFtaWx5Q2xhc3MiPgogICA8c3RyaW5nPnRydWU8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9Imluc3VyYW5jZUNsYXNzIj4KICAgPHN0cmluZz7ljZTkvJrjgZHjgpPjgb08L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9Imluc3VyYW5jZUNsYXNzQ29kZSI+CiAgIDxzdHJpbmc+MDk8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9Imluc3VyYW5jZUNsYXNzQ29kZVN5cyI+CiAgIDxzdHJpbmc+TU1MMDAzMTwvc3RyaW5nPgogIDwvdm9pZD4KICA8dm9pZCBwcm9wZXJ0eT0iaW5zdXJhbmNlTnVtYmVyIj4KICAgPHN0cmluZz4wMTQwMDAxOTwvc3RyaW5nPgogIDwvdm9pZD4KICA8dm9pZCBwcm9wZXJ0eT0icGF5T3V0UmF0aW8iPgogICA8c3RyaW5nPjAuMzA8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9InN0YXJ0RGF0ZSI+CiAgIDxzdHJpbmc+MjAxNy0xMC0yNTwvc3RyaW5nPgogIDwvdm9pZD4KIDwvb2JqZWN0Pgo8L2phdmE+Cg==",
          "id": 1867
        }
      ],
      "kanaName": "ヤマシタ コウスケ",
      "gender": "male",
      "genderDesc": "M",
      "birthday": "1970-12-06",
      "simpleAddressModel": null,
      "appMemo": "診察1",
      "pvtDate": "2018-05-23T13:56:45",
      "ownerUUID": "w3415038:89bc6c0b-0e94-4e12-ac5a-70283c6cc145",
      "fullName": "山下 浩介",
      "id": 35
    }
  ]
}

カルテ表示

患者一覧画面で患者を選択したときに図13のカルテ画面が表示されるが、そのときの通信内容をキャプチャしたものである。
図13 カルテ表示画面

このときのパケット一覧を以下に示す。
図14.カルテを出した時のパケットの一覧
 このとき全部で3回のセッションがキャプチャできた。最初のキャプチャは以下の通りである。これは、どうやらこの患者に対して作成された2通のカルテの情報がサーバから送られてきているようである。ここのカルテはdocInfoList配列の要素になっている。
GET /dolphin/openSource/karte/31,2008-05-25%2011:00:00 HTTP/1.1
Accept: application/json
Accept-Encoding: gzip, deflate
password: 5f4dcc3b5aa765d61d8327deb882cf99
userName: 1.3.6.1.4.1.9414.70.1:mtanaka
Host: 172.16.108.251:8080
Connection: Keep-Alive

HTTP/1.1 200 OK
Connection: keep-alive
X-Powered-By: Undertow/1
Server: WildFly/9
Content-Type: application/json
Content-Length: 2102
Date: Fri, 25 May 2018 02:52:13 GMT

{
  "lastDocDate": 1526539476658,
  "created": "2018-05-17",
  "allergies": null,
  "heights": null,
  "weights": null,
  "patientVisits": [
    "2018-05-17T15:22:21"
  ],
  "docInfoList": [
    {
      "departmentCodeSys": null,
      "docPk": 79,
      "purposeDesc": null,
      "purposeCodeSys": null,
      "healthInsuranceCodeSys": null,
      "versionNotes": null,
      "parentId": null,
      "parentIdDesc": null,
      "parentIdCodeSys": null,
      "labtestOrderNumber": null,
      "pvthealthInsuranceModel": null,
      "createrLisence": null,
      "title": "嘔吐・下痢の症状がみられる",
      "departmentDesc": "内科,01,小井 優成,10004,JPN000000000000",
      "firstConfirmDate": 1526539476658,
      "confirmDate": 1526539476658,
      "facilityName": null,
      "patientName": null,
      "patientId": null,
      "department": "01",
      "parentPk": 0,
      "docId": "6cd5ea01ac10667f015ec41706ccae36",
      "sendClaim": false,
      "parentIdRelation": null,
      "docType": "karte",
      "healthInsurance": "06",
      "healthInsuranceDesc": "06 組合",
      "healthInsuranceGUID": "5b945b2f-5388-4483-b9aa-097d02ad952a",
      "claimDate": 1526539466036,
      "purpose": "recode",
      "patientGender": null,
      "versionNumber": "1.0",
      "hasTreatment": false,
      "hasLaboTest": false,
      "sendLabtest": false,
      "sendMml": false,
      "hasRp": true,
      "hasImage": false,
      "hasMark": false,
      "status": "F"
    },
    {
      "departmentCodeSys": null,
      "docPk": 48,
      "purposeDesc": null,
      "purposeCodeSys": null,
      "healthInsuranceCodeSys": null,
      "versionNotes": null,
      "parentId": null,
      "parentIdDesc": null,
      "parentIdCodeSys": null,
      "labtestOrderNumber": null,
      "pvthealthInsuranceModel": null,
      "createrLisence": null,
      "title": "風邪初診",
      "departmentDesc": "内科,01,小井 優成,10004,JPN000000000000",
      "firstConfirmDate": 1526538665611,
      "confirmDate": 1526538665611,
      "facilityName": null,
      "patientName": null,
      "patientId": null,
      "department": "01",
      "parentPk": 0,
      "docId": "6cc5df93ac10667f014541e8efd2397f",
      "sendClaim": false,
      "parentIdRelation": null,
      "docType": "karte",
      "healthInsurance": "06",
      "healthInsuranceDesc": "06 組合",
      "healthInsuranceGUID": "5b945b2f-5388-4483-b9aa-097d02ad952a",
      "claimDate": 1526538643879,
      "purpose": "recode",
      "patientGender": null,
      "versionNumber": "1.0",
      "hasTreatment": false,
      "hasLaboTest": false,
      "sendLabtest": false,
      "sendMml": false,
      "hasRp": true,
      "hasImage": false,
      "hasMark": false,
      "status": "F"
    }
  ],
  "memoList": null,
  "id": 33
}
次は、2つ目のセッションの通信内容である。
クライアントはPUTメソッドを送っている。RESTfulでは、PUTメソッドは書き込みを意味する。クライアントからのリクエストメッセージのボディ部を見ると医療機関コードfacilityIdやownerUUIDなどの情報がある。これに対してサーバはレスポンスメッセージのボディ部にただ単に1とだけ返信している。このメッセージのやり取りがどのような役割を担っているのか不明である。
PUT /dolphin/openSource/chartEvent/event HTTP/1.1
Accept-Encoding: gzip, deflate
Content-Type: application/json
password: 5f4dcc3b5aa765d61d8327deb882cf99
userName: 1.3.6.1.4.1.9414.70.1:mtanaka
Content-Length: 295
Host: 172.16.108.251:8080
Connection: Keep-Alive

{
  "state": 1,
  "patientVisitModel": null,
  "byomeiCount": 0,
  "issuerUUID": "mtanaka:8a8e884a-103d-4c1c-8f0d-0eef4f5df2e0",
  "byomeiCountToday": 0,
  "facilityId": "1.3.6.1.4.1.9414.70.1",
  "memo": null,
  "patientModel": null,
  "ownerUUID": "mtanaka:8a8e884a-103d-4c1c-8f0d-0eef4f5df2e0",
  "ptPk": 31,
  "eventType": 0,
  "pvtPk": 0
}

HTTP/1.1 200 OK
Connection: keep-alive
X-Powered-By: Undertow/1
Server: WildFly/9
Content-Type: application/json
Content-Length: 1
Date: Fri, 25 May 2018 02:52:13 GMT

1
最後に3つ目のセッションの通信内容を以下に示す。どうやらこれが開いているカルテの内容のようである。
GET /dolphin/openSource/karte/documents/79 HTTP/1.1
Accept: application/json
Accept-Encoding: gzip, deflate
password: 5f4dcc3b5aa765d61d8327deb882cf99
userName: 1.3.6.1.4.1.9414.70.1:mtanaka
Host: 172.16.108.251:8080
Connection: Keep-Alive

HTTP/1.1 200 OK
Connection: keep-alive
X-Powered-By: Undertow/1
Server: WildFly/9
Content-Type: application/json
Content-Length: 10286
Date: Fri, 25 May 2018 02:52:14 GMT

{
  "list": [
    {
      "linkId": 0,
      "linkRelation": null,
      "recorded": 1526539476658,
      "userModel": {
        "userId": null,
        "facilityModel": null,
        "sirName": null,
        "givenName": null,
        "commonName": "内田 裕也",
        "departmentModel": null,
        "memo": null,
        "email": null,
        "orcaId": null,
        "useDrugId": null,
        "memberType": null,
        "registeredDate": null,
        "licenseModel": null,
        "roles": null,
        "password": null,
        "id": 13
      },
      "karteBean": {
        "lastDocDate": null,
        "created": null,
        "allergies": null,
        "heights": null,
        "weights": null,
        "patientVisits": null,
        "docInfoList": null,
        "memoList": null,
        "id": 33
      },
      "started": 1526539476658,
      "ended": null,
      "docInfoModel": {
        "departmentCodeSys": null,
        "docPk": 79,
        "purposeDesc": null,
        "purposeCodeSys": null,
        "healthInsuranceCodeSys": null,
        "versionNotes": null,
        "parentId": null,
        "parentIdDesc": null,
        "parentIdCodeSys": null,
        "labtestOrderNumber": null,
        "pvthealthInsuranceModel": null,
        "createrLisence": null,
        "title": "嘔吐・下痢の症状がみられる",
        "departmentDesc": "内科,01,小井 優成,10004,JPN000000000000",
        "firstConfirmDate": 1526539476658,
        "confirmDate": 1526539476658,
        "facilityName": null,
        "patientName": null,
        "patientId": null,
        "department": "01",
        "parentPk": 0,
        "docId": "6cd5ea01ac10667f015ec41706ccae36",
        "sendClaim": false,
        "parentIdRelation": null,
        "docType": "karte",
        "healthInsurance": "06",
        "healthInsuranceDesc": "06 組合",
        "healthInsuranceGUID": "5b945b2f-5388-4483-b9aa-097d02ad952a",
        "claimDate": 1526539466036,
        "purpose": "recode",
        "patientGender": null,
        "versionNumber": "1.0",
        "hasTreatment": false,
        "hasLaboTest": false,
        "sendLabtest": false,
        "sendMml": false,
        "hasRp": true,
        "hasImage": false,
        "hasMark": false,
        "status": "F"
      },
      "confirmed": 1526539476658,
      "modules": [
        {
          "beanBytes": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPGphdmEgdmVyc2lvbj0iMS44LjBfMTYxIiBjbGFzcz0iamF2YS5iZWFucy5YTUxEZWNvZGVyIj4KIDxvYmplY3QgY2xhc3M9Im9wZW4uZG9scGhpbi5pbmZvbW9kZWwuUHJvZ3Jlc3NDb3Vyc2UiPgogIDx2b2lkIHByb3BlcnR5PSJmcmVlVGV4dCI+CiAgIDxzdHJpbmc+Jmx0O3NlY3Rpb24gc3RhcnQ9JnF1b3Q7MCZxdW90OyBlbmQ9JnF1b3Q7MTQmcXVvdDsmZ3Q7Jmx0O3BhcmFncmFwaCBzdGFydD0mcXVvdDswJnF1b3Q7IGVuZD0mcXVvdDsxNCZxdW90OyZndDsmbHQ7Y29udGVudCBzdGFydD0mcXVvdDswJnF1b3Q7IGVuZD0mcXVvdDsxMyZxdW90OyBuYW1lPSZxdW90O2NvbnRlbnQmcXVvdDsmZ3Q7Jmx0O3RleHQmZ3Q75ZiU5ZCQ44O75LiL55ei44Gu55eH54q244GM44G/44KJ44KM44KLJmx0Oy90ZXh0Jmd0OyZsdDsvY29udGVudCZndDsmbHQ7Y29udGVudCBzdGFydD0mcXVvdDsxMyZxdW90OyBlbmQ9JnF1b3Q7MTQmcXVvdDsmZ3Q7Jmx0O3RleHQmZ3Q7CiZsdDsvdGV4dCZndDsmbHQ7L2NvbnRlbnQmZ3Q7Jmx0Oy9wYXJhZ3JhcGgmZ3Q7Jmx0Oy9zZWN0aW9uJmd0Ozwvc3RyaW5nPgogIDwvdm9pZD4KIDwvb2JqZWN0Pgo8L2phdmE+Cg==",
          "linkId": 0,
          "linkRelation": null,
          "recorded": 1526539476658,
          "userModel": {
            "userId": null,
            "facilityModel": null,
            "sirName": null,
            "givenName": null,
            "commonName": null,
            "departmentModel": null,
            "memo": null,
            "email": null,
            "orcaId": null,
            "useDrugId": null,
            "memberType": null,
            "registeredDate": null,
            "licenseModel": null,
            "roles": null,
            "password": null,
            "id": 13
          },
          "karteBean": {
            "lastDocDate": null,
            "created": null,
            "allergies": null,
            "heights": null,
            "weights": null,
            "patientVisits": null,
            "docInfoList": null,
            "memoList": null,
            "id": 33
          },
          "started": 1526539476658,
          "ended": null,
          "moduleInfoBean": {
            "stampNumber": 0,
            "stampName": "progressCourse",
            "stampRole": "soaSpec",
            "entity": "progressCourse"
          },
          "confirmed": 1526539476658,
          "status": "F",
          "id": 80
        },
        {
          "beanBytes": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPGphdmEgdmVyc2lvbj0iMS44LjBfMTYxIiBjbGFzcz0iamF2YS5iZWFucy5YTUxEZWNvZGVyIj4KIDxvYmplY3QgY2xhc3M9Im9wZW4uZG9scGhpbi5pbmZvbW9kZWwuQnVuZGxlRG9scGhpbiI+CiAgPHZvaWQgcHJvcGVydHk9ImJ1bmRsZU51bWJlciI+CiAgIDxzdHJpbmc+MTwvc3RyaW5nPgogIDwvdm9pZD4KICA8dm9pZCBwcm9wZXJ0eT0iY2xhaW1JdGVtIj4KICAgPGFycmF5IGNsYXNzPSJvcGVuLmRvbHBoaW4uaW5mb21vZGVsLkNsYWltSXRlbSIgbGVuZ3RoPSIxIj4KICAgIDx2b2lkIGluZGV4PSIwIj4KICAgICA8b2JqZWN0IGNsYXNzPSJvcGVuLmRvbHBoaW4uaW5mb21vZGVsLkNsYWltSXRlbSI+CiAgICAgIDx2b2lkIHByb3BlcnR5PSJjbGFzc0NvZGUiPgogICAgICAgPHN0cmluZz4wPC9zdHJpbmc+CiAgICAgIDwvdm9pZD4KICAgICAgPHZvaWQgcHJvcGVydHk9ImNsYXNzQ29kZVN5c3RlbSI+CiAgICAgICA8c3RyaW5nPkNsYWltMDAzPC9zdHJpbmc+CiAgICAgIDwvdm9pZD4KICAgICAgPHZvaWQgcHJvcGVydHk9ImNvZGUiPgogICAgICAgPHN0cmluZz4xMTIwMDc0MTA8L3N0cmluZz4KICAgICAgPC92b2lkPgogICAgICA8dm9pZCBwcm9wZXJ0eT0ibmFtZSI+CiAgICAgICA8c3RyaW5nPuWGjeioujwvc3RyaW5nPgogICAgICA8L3ZvaWQ+CiAgICAgPC9vYmplY3Q+CiAgICA8L3ZvaWQ+CiAgIDwvYXJyYXk+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJjbGFzc0NvZGUiPgogICA8c3RyaW5nPjEyMDwvc3RyaW5nPgogIDwvdm9pZD4KICA8dm9pZCBwcm9wZXJ0eT0iY2xhc3NDb2RlU3lzdGVtIj4KICAgPHN0cmluZz5DbGFpbTAwNzwvc3RyaW5nPgogIDwvdm9pZD4KICA8dm9pZCBwcm9wZXJ0eT0iY2xhc3NOYW1lIj4KICAgPHN0cmluZz7lho3oqLoo5YaN6Ki6KTwvc3RyaW5nPgogIDwvdm9pZD4KICA8dm9pZCBwcm9wZXJ0eT0ib3JkZXJOYW1lIj4KICAgPHN0cmluZz7oqLrmlq3mlpk8L3N0cmluZz4KICA8L3ZvaWQ+CiA8L29iamVjdD4KPC9qYXZhPgo=",
          "linkId": 0,
          "linkRelation": null,
          "recorded": 1526539476658,
          "userModel": {
            "userId": null,
            "facilityModel": null,
            "sirName": null,
            "givenName": null,
            "commonName": null,
            "departmentModel": null,
            "memo": null,
            "email": null,
            "orcaId": null,
            "useDrugId": null,
            "memberType": null,
            "registeredDate": null,
            "licenseModel": null,
            "roles": null,
            "password": null,
            "id": 13
          },
          "karteBean": {
            "lastDocDate": null,
            "created": null,
            "allergies": null,
            "heights": null,
            "weights": null,
            "patientVisits": null,
            "docInfoList": null,
            "memoList": null,
            "id": 33
          },
          "started": 1526539476658,
          "ended": null,
          "moduleInfoBean": {
            "stampNumber": 1,
            "stampName": "再診",
            "stampRole": "p",
            "entity": "baseChargeOrder"
          },
          "confirmed": 1526539476658,
          "status": "F",
          "id": 81
        },
        {
          "beanBytes": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPGphdmEgdmVyc2lvbj0iMS44LjBfMTYxIiBjbGFzcz0iamF2YS5iZWFucy5YTUxEZWNvZGVyIj4KIDxvYmplY3QgY2xhc3M9Im9wZW4uZG9scGhpbi5pbmZvbW9kZWwuQnVuZGxlTWVkIj4KICA8dm9pZCBwcm9wZXJ0eT0iYWRtaW4iPgogICA8c3RyaW5nPlvnlKjms5VdIO+8keaXpe+8k+Wbnuavjumjn+W+jOOBqzwvc3RyaW5nPgogIDwvdm9pZD4KICA8dm9pZCBwcm9wZXJ0eT0iYWRtaW5Db2RlIj4KICAgPHN0cmluZz4wMDEwMDAzMDE8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9ImJ1bmRsZU51bWJlciI+CiAgIDxzdHJpbmc+Nzwvc3RyaW5nPgogIDwvdm9pZD4KICA8dm9pZCBwcm9wZXJ0eT0iY2xhaW1JdGVtIj4KICAgPGFycmF5IGNsYXNzPSJvcGVuLmRvbHBoaW4uaW5mb21vZGVsLkNsYWltSXRlbSIgbGVuZ3RoPSIxIj4KICAgIDx2b2lkIGluZGV4PSIwIj4KICAgICA8b2JqZWN0IGNsYXNzPSJvcGVuLmRvbHBoaW4uaW5mb21vZGVsLkNsYWltSXRlbSI+CiAgICAgIDx2b2lkIHByb3BlcnR5PSJjbGFzc0NvZGUiPgogICAgICAgPHN0cmluZz4yPC9zdHJpbmc+CiAgICAgIDwvdm9pZD4KICAgICAgPHZvaWQgcHJvcGVydHk9ImNsYXNzQ29kZVN5c3RlbSI+CiAgICAgICA8c3RyaW5nPkNsYWltMDAzPC9zdHJpbmc+CiAgICAgIDwvdm9pZD4KICAgICAgPHZvaWQgcHJvcGVydHk9ImNvZGUiPgogICAgICAgPHN0cmluZz42MTA0MjEzMjA8L3N0cmluZz4KICAgICAgPC92b2lkPgogICAgICA8dm9pZCBwcm9wZXJ0eT0ibmFtZSI+CiAgICAgICA8c3RyaW5nPuOCouODgOODqeODvOODiO+8o++8sumMoO+8ke+8kO+9je+9hzwvc3RyaW5nPgogICAgICA8L3ZvaWQ+CiAgICAgIDx2b2lkIHByb3BlcnR5PSJudW1iZXIiPgogICAgICAgPHN0cmluZz4zPC9zdHJpbmc+CiAgICAgIDwvdm9pZD4KICAgICAgPHZvaWQgcHJvcGVydHk9Im51bWJlckNvZGUiPgogICAgICAgPHN0cmluZz4xMDwvc3RyaW5nPgogICAgICA8L3ZvaWQ+CiAgICAgIDx2b2lkIHByb3BlcnR5PSJudW1iZXJDb2RlU3lzdGVtIj4KICAgICAgIDxzdHJpbmc+Q2xhaW0wMDQ8L3N0cmluZz4KICAgICAgPC92b2lkPgogICAgICA8dm9pZCBwcm9wZXJ0eT0idW5pdCI+CiAgICAgICA8c3RyaW5nPumMoDwvc3RyaW5nPgogICAgICA8L3ZvaWQ+CiAgICAgIDx2b2lkIHByb3BlcnR5PSJ5a3pLYm4iPgogICAgICAgPHN0cmluZz4xPC9zdHJpbmc+CiAgICAgIDwvdm9pZD4KICAgICA8L29iamVjdD4KICAgIDwvdm9pZD4KICAgPC9hcnJheT4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9ImNsYXNzQ29kZSI+CiAgIDxzdHJpbmc+MjExPC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJjbGFzc0NvZGVTeXN0ZW0iPgogICA8c3RyaW5nPkNsYWltMDA3PC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJjbGFzc05hbWUiPgogICA8c3RyaW5nPuaKleiWrCjlhoXmnI3jg7vpoJPmnI3jg7voqr/liaQpKOmZouWGhSk8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9Im1lbW8iPgogICA8c3RyaW5nPuWGheeUqO+8iOmZouWGheWHpuaWuSk8L3N0cmluZz4KICA8L3ZvaWQ+CiA8L29iamVjdD4KPC9qYXZhPgo=",
          "linkId": 0,
          "linkRelation": null,
          "recorded": 1526539476658,
          "userModel": {
            "userId": null,
            "facilityModel": null,
            "sirName": null,
            "givenName": null,
            "commonName": null,
            "departmentModel": null,
            "memo": null,
            "email": null,
            "orcaId": null,
            "useDrugId": null,
            "memberType": null,
            "registeredDate": null,
            "licenseModel": null,
            "roles": null,
            "password": null,
            "id": 13
          },
          "karteBean": {
            "lastDocDate": null,
            "created": null,
            "allergies": null,
            "heights": null,
            "weights": null,
            "patientVisits": null,
            "docInfoList": null,
            "memoList": null,
            "id": 33
          },
          "started": 1526539476658,
          "ended": null,
          "moduleInfoBean": {
            "stampNumber": 2,
            "stampName": "アダラートCR錠10mg",
            "stampRole": "p",
            "entity": "medOrder"
          },
          "confirmed": 1526539476658,
          "status": "F",
          "id": 82
        },
        {
          "beanBytes": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPGphdmEgdmVyc2lvbj0iMS44LjBfMTYxIiBjbGFzcz0iamF2YS5iZWFucy5YTUxEZWNvZGVyIj4KIDxvYmplY3QgY2xhc3M9Im9wZW4uZG9scGhpbi5pbmZvbW9kZWwuUHJvZ3Jlc3NDb3Vyc2UiPgogIDx2b2lkIHByb3BlcnR5PSJmcmVlVGV4dCI+CiAgIDxzdHJpbmc+Jmx0O3NlY3Rpb24gc3RhcnQ9JnF1b3Q7MCZxdW90OyBlbmQ9JnF1b3Q7NSZxdW90OyZndDsmbHQ7cGFyYWdyYXBoIHN0YXJ0PSZxdW90OzAmcXVvdDsgZW5kPSZxdW90OzImcXVvdDsmZ3Q7Jmx0O2NvbXBvbmVudCBzdGFydD0mcXVvdDswJnF1b3Q7IGVuZD0mcXVvdDsxJnF1b3Q7IG5hbWU9JnF1b3Q7c3RhbXBIb2xkZXImcXVvdDsgY29tcG9uZW50PSZxdW90OzAmcXVvdDsmZ3Q7Jmx0Oy9jb21wb25lbnQmZ3Q7Jmx0O2NvbnRlbnQgc3RhcnQ9JnF1b3Q7MSZxdW90OyBlbmQ9JnF1b3Q7MiZxdW90OyZndDsmbHQ7dGV4dCZndDsKJmx0Oy90ZXh0Jmd0OyZsdDsvY29udGVudCZndDsmbHQ7L3BhcmFncmFwaCZndDsmbHQ7cGFyYWdyYXBoIHN0YXJ0PSZxdW90OzImcXVvdDsgZW5kPSZxdW90OzMmcXVvdDsmZ3Q7Jmx0O2NvbnRlbnQgc3RhcnQ9JnF1b3Q7MiZxdW90OyBlbmQ9JnF1b3Q7MyZxdW90OyZndDsmbHQ7dGV4dCZndDsKJmx0Oy90ZXh0Jmd0OyZsdDsvY29udGVudCZndDsmbHQ7L3BhcmFncmFwaCZndDsmbHQ7cGFyYWdyYXBoIHN0YXJ0PSZxdW90OzMmcXVvdDsgZW5kPSZxdW90OzUmcXVvdDsmZ3Q7Jmx0O2NvbXBvbmVudCBzdGFydD0mcXVvdDszJnF1b3Q7IGVuZD0mcXVvdDs0JnF1b3Q7IG5hbWU9JnF1b3Q7c3RhbXBIb2xkZXImcXVvdDsgY29tcG9uZW50PSZxdW90OzEmcXVvdDsmZ3Q7Jmx0Oy9jb21wb25lbnQmZ3Q7Jmx0O2NvbnRlbnQgc3RhcnQ9JnF1b3Q7NCZxdW90OyBlbmQ9JnF1b3Q7NSZxdW90OyZndDsmbHQ7dGV4dCZndDsKJmx0Oy90ZXh0Jmd0OyZsdDsvY29udGVudCZndDsmbHQ7L3BhcmFncmFwaCZndDsmbHQ7L3NlY3Rpb24mZ3Q7PC9zdHJpbmc+CiAgPC92b2lkPgogPC9vYmplY3Q+CjwvamF2YT4K",
          "linkId": 0,
          "linkRelation": null,
          "recorded": 1526539476658,
          "userModel": {
            "userId": null,
            "facilityModel": null,
            "sirName": null,
            "givenName": null,
            "commonName": null,
            "departmentModel": null,
            "memo": null,
            "email": null,
            "orcaId": null,
            "useDrugId": null,
            "memberType": null,
            "registeredDate": null,
            "licenseModel": null,
            "roles": null,
            "password": null,
            "id": 13
          },
          "karteBean": {
            "lastDocDate": null,
            "created": null,
            "allergies": null,
            "heights": null,
            "weights": null,
            "patientVisits": null,
            "docInfoList": null,
            "memoList": null,
            "id": 33
          },
          "started": 1526539476658,
          "ended": null,
          "moduleInfoBean": {
            "stampNumber": 3,
            "stampName": "progressCourse",
            "stampRole": "pSpec",
            "entity": "progressCourse"
          },
          "confirmed": 1526539476658,
          "status": "F",
          "id": 83
        }
      ],
      "attachment": null,
      "schema": null,
      "status": "F",
      "id": 79
    }
  ]
}
この中にbeanBytesという項目があり、その値として長い文字列が設定されている。
これはBASE64でエンコードされたデータで、デコードすると次のようなXMLが得られた。
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_161" class="java.beans.XMLDecoder">
 <object class="open.dolphin.infomodel.ProgressCourse">
  <void property="freeText">
   <string>
    <section start="0" end="14">
     <paragraph start="0" end="14">
      <content start="0" end="13" name="content">
       <text>嘔吐・下痢の症状がみられる</text>
      </content>
      <content start="13" end="14">
       <text></text>
      </content>
     </paragraph>
    </section>
   </string>
  </void>
 </object>
</java>
これを見ると、カルテの左側、つまり経過記録のようである。OpenDolphinではカルテに表示するデータをこのようにXML形式で記述しているようである。XMLなので、セクションやパラグラフの開始や終わりを属性として記述できるため、単なる文字列ではなくオブジェクトとして扱えるためであろう。

MD5ハッシュを計算するLinuxコマンドmd5sum

$ echo -n password | md5sum
5f4dcc3b5aa765d61d8327deb882cf99  -
この例では文字列"password"のMD5ハッシュ値を計算している。echoコマンドのオプション -n は改行を出力しないという意味。
また、Web上にMD5ハッシュ値を計算するサイトがある。

JSONの整形

OpenDolphinの通信内容をキャプチャすると、サーバからのレスポンスのボディ部にJSON形式のデータが格納されて戻ってくるが、適切に改行されていないため、わかりにくい。そのような時にはWeb上にJSON整形ツールがあるので利用するとよい。このブログで紹介したJSONデータはすべてそのツールを用いて整形してある。
図15.JSON整形ツール

BASE64デコードツール

カルテを開いたときにサーバから届くJSON形式のデータ(2つ目のGETメソッドに対するレスポンス)の中にbeanBytesという項目がある。この項目はBASE64にエンコーディングされている。BASE64にエンコードされたデータをデコードするツールがWeb上にあり、それを用いることによりメッセージの中身がわかる。
図16.BASE64でコードツール

2018年5月23日水曜日

検査データの取り込み、受付状況の確認

前回、無事にORCAとOpendolphinの取り込みを行うことができたので、今回はOpendolphinから検査データを取り込んだ際、どのような処理が行われるかを確認する。
また、前回カルテ書き終えた患者がOpendolphin上の受付画面から表示されなくなっていたため、どのタイミングで表示されなくなるのかといった点も見極めていきたい。
まず、取り込むデータの作成を行うのだが、これは以前作成したダミーデータを用いた。
尚、そのまま流用する事はできないので、書式を以下の図1のように変更した。
図1 検査データ
この時、赤線を付けたオーダーIDを重複させて検査データの登録を行うと、最後に登録したデータでそれ以外に登録した検査データが上書きされてしまうため、たとえ患者が違っても、同じオーダーIDは使ってはならないので必ず変更しておくこと。今回は、オーダIDを「年月日+患者ID」として、患者が違えば必ずオーダIDも異なるようにした。
青線を付けたカルテIDは、電子カルテに登録している患者の患者IDに揃えないとカルテデータを登録するときにエラーになるので、対応する患者のカルテIDに変更する。
また、今回編集を行うときに「TeraPad」を用いて編集作業を行ったのだが、サンプルデータ10個に対して毎回置換作業を行うといった作業は少々手間であるので、コマンドプロンプトを用いてサンプルデータの統合を行った。以下は手順である。
図2 検査データが保存されているディレクトリ
まず、上記図2の様にコマンドプロンプトを起動し、「cd 検査データがあるファイルの場所」 を指定し、当該ファイルが存在するフォルダに移動する。次に確認のため「dir」を入力し、フォルダに含まれているファイル一覧を表示する。
図3データの結合
そして、「type ファイル名1 ファイル名2..... > 出力ファイル名」と入力することで、ファイルの統合、出力を行うことができる。この処理は選択されたファイルの中身を、指定したファイル名に出力を行うといった処理である。この処理を行うことで、TeraPadを用いたデータの加工を容易に行う事が出来た。
ダミーデータを適切な形に変更したことで、実際にそれぞれのカルテに登録を行ったところ、無事に登録できた。なお、検査データを登録しても、空のカルテが作成されることはなかった。つまり、検査データを取り込む操作とカルテを作成する操作は独立したものであることがわかった。

次に、Opendolphinの受付リストからどのタイミングで患者が受付リストから削除されるのかといった問題だが、試しにもう一度前回と同じように患者登録を行い、カルテを書き込み、処理の終了を行った。その結果、下記の図4のようなフラグがたてられていることが分かった。
図4 OpenDolphinの受付画面

図4のフラグの凡例として「診察終了」とい表示がされており、ここから考えられる事柄としては、診察が行われた次の日になると、自動的に削除されるといったものではないだろうか?なんにせよ次回になるまでわからないので、次にOpendolphinを起動するときには注意しておきたい。

今回は検査データの取り込みと、受付状況の確認について大まかな検討をつけることができたので、次回はデータベース管理クライアントツールであるpgAdminを利用し、ORCAやOpenDolphinのデータベースを詳しく見ていきたい。

【TIPS】
OpenDolphinの検査結果グラフ表示は最大6日分しか表示できないことがわかった。

レーダーチャートの表示2

前回 レーダーチャートの表示を行うことが出来たので、今回は実際の値を代入したグラフの描画を試みる。 .controller('RaderChartController', ['$scope', 'Countries', funct...