# WEB予約API ## 概要 患者さんが利用するWEB予約から利用されるAPI ## 認証・認可 なし ただし、以下の条件に合致する場合は、利用を制限する - n秒間にm回以上のリクエスト? ## API一覧 | | メソッド | URI | | :--- | :---: | :--- | | 医院情報取得 | GET | /webr/clinic/clinic_info | | 患者情報取得 | POST | /webr/patient/patients_info | | 空き枠情報取得 | POST | /webr/reservation/find_reservable_time | | 予約登録 | POST | /webr/reservation/entry_reservations | | 予約情報取得 | GET | /webr/reservation/reservations_info | | キャンセル待ち情報取得 | GET | /webr/reservation/waiting_list | ## 応答 | HTTPステータスコード | 内容 | | | :---: | :--- | :--- | | 200 | OK | | | 400 | Bad Request | 必須パラメータ未指定、または、想定外パラメータ指定→Slackに通知 | | 401 | Unauthorized | | | 403 | Forbidden | | | 404 | Not Found | | | 405 | Method Not Allowed | | | 408 | Request Timeout | | ## API詳細 ### リクエスト共通 #### リクエスト・パラメータ | 場所 | 必須/任意・デフォルト値 | 名称 | 内容 | | :--- | :--- | :--- | :--- | | クエリ | 必須 | url_code | 医院コード-医院ID | | クエリ | 必須 | caller | 呼び出し元 | | クエリ | 必須 | version | バージョン | ### レスポンス共通 #### レスポンス(HTTPステータスコード=200の場合) | object | type | 説明 | | :--- | :--- | :--- | | status | 文字列 | 下表参照 | | message | 文字列 | status≠0の場合 | | data | オブジェクト | status=0の場合 | #### status | status | 説明 | | :--: | :--- | | 0 | 正常 | | 1 | サーバーエラー | | 101 | リクエスト・パラメータのurl_codeが不正値です | | 102 | 医院マスタが存在しません | | 103 | WEB予約設定が存在しません | | 104 | WEB予約を利用しない設定になっています | | 105 | WEB予約設定(新患)が存在しません | | 106 | WEB予約設定(再診)が存在しません | | 107 | 主訴マスタが存在しません | | 201 | 患者マスタが存在しません | | 202 | 電話番号が違います(※廃止 201と統合) | | 301 | リクエスト・パラメータのyearが不正値です | | 302 | リクエスト・パラメータのmonthが不正値です | ### 医院情報取得 #### 概要 歯科医院のWEB予約関連情報を取得する #### 関連テーブル m_clinic:歯科医院マスタ wr_m_config:Web予約設定 wr_m_config_new_patient:Web予約設定(新患) wr_m_config_repeated:Web予約設定(再診) wr_m_config_screen:Web予約設定(画面ごとの設定) m_complaint:主訴マスタ wr_mx_complaint:主訴(WEB予約用) #### エンドポイント ``` GET https://xxx.com/webr/clinic/clinic_info ``` #### リクエスト・パラメータ 共通のみ ##### 例 ``` GET https://xxx.com/webr/clinic/clinic_info?url_code=123456-1 ``` #### レスポンス(data) | object | type | 説明 | | :--- | :--- | :--- | | clinic | オブジェクト | 基本設定情報 | | screen_list | オブジェクト | 画面表示情報リスト | | complaint_list_new_patient | オブジェクト | 新患用主訴情報リスト | | complaint_list_repeated | オブジェクト | 再診用主訴情報リスト | #### レスポンス(clinic) | object | type | 説明 | | :--- | :--- | :--- | | clinic_name | 文字列 | 医院名 | | tel | 文字列 | 電話番号 | | mydental_dl_show | 数値 | 予約完了画面にてWEB予約後のアプリへの招待(0:表示しない 1:表示する) | | default_col_mode | 数値 | 列表示モード(1:スタッフ 2:ユニット)※完了メッセージの振り分け、主訴必須判定 | | color_r | 数値 | カラーコード(R) | | color_g | 数値 | カラーコード(G) | | color_b | 数値 | カラーコード(B) | | header_title | 文字列 | HTML head title(未設定の場合、医院名) | | conversion_reservation_url | 文字列 | コンバージョンURL | | enable_new_patient | 数値 | 初診許可(0:許可しない 1:許可する) | | enable_repeated | 数値 | 再診許可(0:許可しない 1:許可する) | | enable_all_patient | 数値 | 日時未定なしの再診許可(0:許可しない 1:許可する) | | new_enable_change_date | 数値 | 新患の日時変更許可(0:許可しない 1:許可する) | | repeated_enable_change_date | 数値 | 再診の日時変更許可(0:許可しない 1:許可する) | | new_enable_cancel | 数値 | 新患のキャンセル許可(0:許可しない 1:許可する) | | repeated_enable_cancel | 数値 | 再診のキャンセル許可(0:許可しない 1:許可する) | | enable_waiting_list | 数値 | 再診のキャンセル待ち許可(0:許可しない 1:許可する) | | welcome_message | 文字列 | Welcomeメッセージ | | logo_image | 文字列 | ロゴ画像URL | #### レスポンス(complaint_list_new_patient) | object | type | 説明 | | :--- | :--- | :--- | | complaint | オブジェクト | 主訴情報(id昇順) | #### レスポンス(complaint_list_repeated) | object | type | 説明 | | :--- | :--- | :--- | | complaint | オブジェクト | 主訴情報(id昇順) | #### レスポンス(complaint) | object | type | 説明 | | :--- | :--- | :--- | | complaint_id | 数値 | 主訴ID | | complaint_name | 文字列 | 主訴名 | | order | 数値 | 並び順 | | cares | 文字列 | 診療内容 | ##### 例 ``` { "status": 0, "data": { "clinic": { "clinic_name": "デンタライトクリニック", "tel": "050-2018-0069", "mydental_dl_show": 1, "default_col_mode": 2, "color_r": 128, "color_g": 128, "color_b": 128, "header_title": "デンタライトクリニック", "conversion_reservation_url": "https://google.com", "enable_new_patient": 1, "enable_repeated": 1, "enable_all_patient": 1, "new_enable_change_date": 1, "repeated_enable_change_date": 1, "new_enable_cancel": 1, "repeated_enable_cancel": 1, "enable_waiting_list": 1, "welcome_message": "TOP画面のメッセージ", "logo_image": "https://www.xxx.com/aaa/bbb/logo.png" }, "complaint_list_new_patient": [ { "complaint": { "complaint_id": 2, "complaint_name": "【初めて受診されるかた】歯ぐきが腫れた", "order": 12, "content": "【初めて受診されるかた】歯ぐきが腫れた", "cares": null } }, { "complaint": { "complaint_id": 3, "complaint_name": "【初めて受診されるかた】詰め物・かぶせ物が取れた", "order": 13, "content": "【初めて受診されるかた】詰め物・かぶせ物が取れた", "cares": null } } ], "complaint_list_repeated": [ { "complaint": { "complaint_id": 2674, "complaint_name": "【再診】歯が痛い", "order": 18, "content": "【再診】歯が痛い", "cares": null } } ] } } ``` ### 患者情報取得 #### 概要 患者さんごとのWEB予約関連情報を取得する #### 関連テーブル m_clinic:歯科医院マスタ wr_m_config:Web予約設定 wr_m_config_new_patient:Web予約設定(新患) wr_m_config_repeated:Web予約設定(再診) m_patient:患者マスタ #### エンドポイント ``` POST https://xxx.com/webr/patient/patients_info ``` #### リクエスト・パラメータ | 場所 | 必須/任意・デフォルト値 | 名称 | 内容 | | :--- | :--- | :--- | :--- | | クエリ | 必須 | patient_list | 患者情報リスト | #### リクエスト・パラメータ(patient_list) | 場所 | 必須/任意・デフォルト値 | 名称 | 内容 | | :--- | :--- | :--- | :--- | | クエリ | 必須 | type | 0:新患 1:再診 | | クエリ | 任意 | name | 患者名(新患の場合必須) | | クエリ | 任意 | karte | カルテNo.(再診の場合必須) | | クエリ | 任意 | tel | 電話番号(再診の場合必須) | ##### 例 ``` POST http://localhost:8000/webr/patient/patients_info -H 'Content-Type: application/json' --data-raw '{"url_code":"123456-1","patient_list":[{"type":0,"name":"山本哲夫"},{"type":1,"karte":12345,"tel":"090-3344-5555"}]}' ``` #### レスポンス(data) | object | type | 説明 | | :--- | :--- | :--- | | all_authenticated | boolean | True:全て認証済み False:未認証あり | | patient_list | オブジェクト | 患者情報リスト | #### レスポンス(patient_list) | object | type | 説明 | | :--- | :--- | :--- | | patient | オブジェクト | 患者情報 | #### レスポンス(patient) | object | type | 説明 | | :--- | :--- | :--- | | type | 数値 | 0:新患 1:再診 | | status | 文字列 | 上表参照 | | message | 文字列 | status≠0の場合 | | patient_id | 数値 | 患者ID | | patient_name | 文字列 | 患者名 | | enable_change_date | 数値 | 日時変更許可(0:許可しない 1:許可する) | | tel | 文字列 | 電話番号 | | tel | 文字列 | 電話番号 | | tel | 文字列 | 電話番号 | | tel | 文字列 | 電話番号 | | tel | 文字列 | 電話番号 | | tel | 文字列 | 電話番号 | | tel | 文字列 | 電話番号 | | tel | 文字列 | 電話番号 | | tel | 文字列 | 電話番号 | カルテ番号も(重複チェック用) change_delay tinyint 新患_日時変更_変更可能予約 ○日後以降の予約を対象 change_max_count tinyint 新患_日時変更_変更可能上限 enable_cancel tinyint 新患のキャンセル許可 null,0:許可しない 1:許可する enable_all_patient tinyint 日時未定の予約がなくても再診を許可する nul,0:許可しない 1:許可する stages nvarchar(450) 再診許可するステージ enable_change_date tinyint 再診の日時変更を許可する null,0:許可しない 1:許可する change_delay tinyint 日時変更_変更可能予約 ○日後以降の予約を対象 nullの場合は今日からOK change_max_count tinyint 日時変更_変更可能上限 enable_cancel tinyint 再診のキャンセル許可 null,0:許可しない 1:許可する enable_waiting_list tinyint 再診のキャンセル待ち登録許可  null,0:許可しない 1:許可する | mydental_dl_show | 数値 | 予約完了画面にてWEB予約後のアプリへの招待(0:表示しない 1:表示する) | | default_col_mode | 数値 | 列表示モード(1:スタッフ 2:ユニット)※完了メッセージの振り分け、主訴必須判定 | | conversion_reservation_url | 文字列 | コンバージョンURL | | enable_new_patient | 数値 | 初診許可(0:許可しない 1:許可する) | | enable_repeated | 数値 | 再診許可(0:許可しない 1:許可する) | #### レスポンス(screen_list) | object | type | 説明 | | :--- | :--- | :--- | | screen | オブジェクト | 画面表示情報(id昇順) | #### レスポンス(complaint_list) | object | type | 説明 | | :--- | :--- | :--- | | complaint | オブジェクト | 主訴情報(id昇順) | #### レスポンス(complaint) | object | type | 説明 | | :--- | :--- | :--- | | complaint_id | 数値 | 主訴ID | | complaint_name | 文字列 | 主訴名 | | order | 数値 | 並び順 | | content | 文字列 | | | cares | 文字列 | | ##### 例 ``` { "status": 0, "data": { "clinic": { "clinic_id": 1, "clinic_name": "デン***********ック", "tel": "092-610-7011", "mydental_dl_show": 1, "default_col_mode": 2, "color_r": 128, "color_g": 128, "color_b": 128, "conversion_reservation_url": "https://google.com", "welcome_message": "医院からの任意のメッセージが入ります。医院からの任意のメッセージが入ります。医院からの任意のメッセージが入ります。医院からの任意のメッセージが入ります。" }, "complaint_list": [ { "complaint": { "complaint_id": 2, "complaint_name": "【初めて受診されるかた】歯ぐきが腫れた", "order": 12, "content": "【初めて受診されるかた】歯ぐきが腫れた", "cares": null } }, { "complaint": { "complaint_id": 2941, "complaint_name": "【矯正】セカンドオピニオン", "order": 7, "content": "【矯正】セカンドオピニオン", "cares": null } } ] } } ``` ##### 仕様 - 以下の場合、HTTPステータスコード404を返す - リクエスト・パラメータのurl_codeが不正値の場合 - m_clinicが存在しない場合(id) - wr_m_configが存在しない場合(clinic_id, code) - wr_m_config.enable_reservation≠1の場合 - wr_m_config_new_patientが存在しない場合(clinic_id, config_id) - wr_m_config_repeatedが存在しない場合(clinic_id, config_id) ※既存患者が新患で予約を取ろうとしているのを防げないか!? ### 空き枠情報取得 #### 概要 患者さんごとの予約可能時刻情報を取得する #### 関連テーブル m_ m_clinic:歯科医院マスタ wr_m_config:Web予約設定 wr_m_config_new_patient:Web予約設定(新患) wr_m_config_repeated:Web予約設定(再診) #### エンドポイント ``` POST https://xxx.com/webr/reservation/find_reservable_time ``` #### リクエスト・パラメータ | 場所 | 必須/任意・デフォルト値 | 名称 | 内容 | | :--- | :--- | :--- | :--- | | クエリ | 必須 | year | 年 | | クエリ | 必須 | month | 月 | | クエリ | 必須 | patient_list | 患者情報リスト | #### リクエスト・パラメータ(patient_list) | 場所 | 必須/任意・デフォルト値 | 名称 | 内容 | | :--- | :--- | :--- | :--- | | クエリ | 必須 | type | 0:新患 1:再診 | | クエリ | 任意 | complaint_id | 主訴ID(新患の場合必須、再診の場合もあり) | | クエリ | 任意 | patient_id | 患者ID(再診の場合必須) | ##### 例 ``` POST http://localhost:8000/webr/reservation/find_reservable_time -H 'Content-Type: application/json' --data-raw '{"url_code":"123456-1","year":2021,"month":6,patient_list":[{"type":0,"complaint_id":1},{"type":1,"patient_id":1002,"reservation_id":1000232}]}' ``` #### レスポンス(data) | object | type | 説明 | | :--- | :--- | :--- | | patient_list | オブジェクト | 患者情報リスト | #### レスポンス(patient_list) | object | type | 説明 | | :--- | :--- | :--- | | patient | オブジェクト | 患者情報 | #### レスポンス(patient) | object | type | 説明 | | :--- | :--- | :--- | | type | 数値 | 0:新患 1:再診 | | status | 文字列 | 上表参照 | | message | 文字列 | status≠0の場合 | | patient_id | 数値 | 患者ID | | patient_name | 文字列 | 患者名 | | time_list | オブジェクト | 空き枠リスト | #### レスポンス(time_list) | object | type | 説明 | | :--- | :--- | :--- | | time | オブジェクト | 空き枠情報 | #### レスポンス(time) | object | type | 説明 | | :--- | :--- | :--- | | day | 数値 | 日 | | hour | 数値 | 時 | | min | 数値 | 分 | | u_list | オブジェクト | ユニットリスト | | s_list | オブジェクト | スタッフリスト | #### レスポンス(u_list) | object | type | 説明 | | :--- | :--- | :--- | | u | オブジェクト | ユニット情報 | #### レスポンス(u) | object | type | 説明 | | :--- | :--- | :--- | | u_id | 数値 | ユニットID | | u_name | 文字列 | ユニット名 | #### レスポンス(s_list) | object | type | 説明 | | :--- | :--- | :--- | | s | オブジェクト | スタッフ情報 | #### レスポンス(s) | object | type | 説明 | | :--- | :--- | :--- | | s_id | 数値 | スタッフID | | s_name | 数値 | スタッフ名 | ##### 例 ``` { "status": 0, "data": { "clinic": { "clinic_id": 1, "clinic_name": "デン***********ック", "tel": "092-610-7011", "mydental_dl_show": 1, "default_col_mode": 2, "color_r": 128, "color_g": 128, "color_b": 128, "conversion_reservation_url": "https://google.com", "welcome_message": "医院からの任意のメッセージが入ります。医院からの任意のメッセージが入ります。医院からの任意のメッセージが入ります。医院からの任意のメッセージが入ります。" }, "complaint_list": [ { "complaint": { "complaint_id": 2, "complaint_name": "【初めて受診されるかた】歯ぐきが腫れた", "order": 12, "content": "【初めて受診されるかた】歯ぐきが腫れた", "cares": null } }, { "complaint": { "complaint_id": 2941, "complaint_name": "【矯正】セカンドオピニオン", "order": 7, "content": "【矯正】セカンドオピニオン", "cares": null } } ] } } ``` ##### 仕様 - 以下の場合、HTTPステータスコード404を返す - リクエスト・パラメータのurl_codeが不正値の場合 - m_clinicが存在しない場合(id) - wr_m_configが存在しない場合(clinic_id, code) - wr_m_config.enable_reservation≠1の場合 - wr_m_config_new_patientが存在しない場合(clinic_id, config_id) - wr_m_config_repeatedが存在しない場合(clinic_id, config_id) ##### 仕様(検討) 1. ベースとなる時間のテーブルを作成 - 事前に作成しておく。日付変更、設定変更をトリガーに作成し直す(SQLServerのtrigger? Azure Functionsの方がエラー時の通知楽?) - clinic_idで全件削除 - 当日からWeb予約設定のreservation_periodまで(初診と最新の長い方。未設定時は3年) - m_clinic, m_business_day, m_business_hours, m_business_exception, wr_m_configより登録する | Column | Type | Example | | :--- | :--: | :--- | | clinic_id | int | 1 | | wr_date_time | datetime | 2020-06-01 09:10:00 | | wr_date | date | 2020-06-01 | | wr_hour | int | 9 | | wr_min | int | 10 | 1. 既存の予約、医院予定、主訴の設定情報をjoinし、絞り込んだ時間をselectする 1. 患者ごとに時間(親要素:時間、子要素:ユニット、スタッフ)の情報を作成する(python) 1. 複数患者の場合、作成された時間の情報の組み合わせ総当たりで、カレンダーの表示情報を作成する(ここのロジックは予約の登録でも使用する) ローカルで試すときは、これを使ってください。
リモートは開発向けにAZDB_KITSUNE_DEVを作ってます。
使い方は、以下のソースを参照してください。
classes/api/genie/box/file.py
(batchを使っている部分です。)