レビュー前完了

This commit is contained in:
野間 2023-06-14 09:41:07 +09:00
parent 227f79932c
commit ce883d8ad7
24 changed files with 1089 additions and 117 deletions

View File

@ -22,4 +22,5 @@ AWS_REGION=ap-northeast-1
AUTHORIZE_ENDPOINT=oauth2/authorize
TOKEN_ENDPOINT=oauth2/token
BIO_SEARCH_RESULT_MAX_COUNT=35000
SEARCH_RESULT_MAX_COUNT=500
SESSION_EXPIRE_MINUTE=20

View File

@ -1,18 +1,15 @@
from typing import Optional
from fastapi import APIRouter, Depends, HTTPException, Request
from fastapi.exceptions import HTTPException
from starlette import status
from fastapi import APIRouter, Depends, Request
from src.depends.services import get_service
from src.model.internal.session import UserSession
from src.model.request.ultmarc_doctor import UltmarcDoctorModel, UltmarcDoctorInfoModel
from src.model.request.ultmarc_inst import UltmarcInstModel
from src.model.request.ultmarc_inst import UltmarcInstModel, UltmarcInstInfoModel
from src.router.session_router import AuthenticatedRoute
from src.services.batch_status_service import BatchStatusService
from src.services.ultmarc_view_service import UltmarcViewService
from src.services.session_service import set_session
from src.system_var import constants
from src.templates import templates
router = APIRouter()
@ -33,9 +30,6 @@ def ultmarc_inst_view(
# バッチ処理中の場合、機能を利用させない
is_batch_processing = batch_status_service.is_batch_processing()
# if batch_status_service.is_batch_processing():
# raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BATCH_PROCESSING)
# 検索項目の取得(都道府県・施設区分)
ultmarc = ultmarc_service.ultmarc_inst_view(session)
ultmarc.is_batch_processing = is_batch_processing
@ -66,10 +60,9 @@ def search_inst(
batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService))
):
session: UserSession = request.session
# バッチ処理中の場合、機能を利用させない
# is_batch_processing = batch_status_service.is_batch_processing()
# if batch_status_service.is_batch_processing():
# raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BATCH_PROCESSING)
# 施設データを検索
ultmarc_inst_data = ultmarc_service.search_inst_data(ultmarc_inst_form)
@ -98,6 +91,89 @@ def search_inst(
return templates_response
@router.get('/instInfo')
def ultmarc_inst_info_view(
request: Request,
id: str,
batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)),
ultmarc_service: UltmarcViewService = Depends(get_service(UltmarcViewService))
):
session: UserSession = request.session
# バッチ処理中の場合、機能を利用させない
is_batch_processing = batch_status_service.is_batch_processing()
# 施設情報の取得
ultmarc = ultmarc_service.info_ultmarc_inst_view(id, session)
# バッチ起動判定の取得
ultmarc.is_batch_processing = is_batch_processing
# instId
ultmarc.instId = id
# ページ総数(件数)
ultmarc.postCnt = 1
# ページ数表示するページNo
ultmarc.pageNum = 0
# セッション書き換え
session.update(
actions=[
UserSession.last_access_time.set(UserSession.new_last_access_time()),
UserSession.record_expiration_time.set(UserSession.new_record_expiration_time()),
]
)
session_key = set_session(session)
templates_response = templates.TemplateResponse(
'instInfo.html', {
'request': request,
'ultmarc': ultmarc,
},
headers={'session_key': session_key}
)
return templates_response
@router.post('/instInfo')
def ultmarc_inst_info_search(
request: Request,
ultmarc_inst_form: Optional[UltmarcInstInfoModel] = Depends(UltmarcInstInfoModel.as_form),
ultmarc_service: UltmarcViewService = Depends(get_service(UltmarcViewService)),
batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService))
):
session: UserSession = request.session
# バッチ処理中の場合、機能を利用させない
is_batch_processing = batch_status_service.is_batch_processing()
instId = ultmarc_inst_form.instId.split(',')
# 施設情報の取得
ultmarc = ultmarc_service.info_ultmarc_inst_view(instId[ultmarc_inst_form.pageNum], session)
# バッチ起動判定の取得
ultmarc.is_batch_processing = is_batch_processing
# InstId
ultmarc.instId = ultmarc_inst_form.instId
# ページ総数(件数)
ultmarc.postCnt = len(instId)
# ページ数表示するページNo
ultmarc.pageNum = ultmarc_inst_form.pageNum
# セッション書き換え
session.update(
actions=[
UserSession.last_access_time.set(UserSession.new_last_access_time()),
UserSession.record_expiration_time.set(UserSession.new_record_expiration_time()),
]
)
session_key = set_session(session)
templates_response = templates.TemplateResponse(
'instInfo.html', {
'request': request,
'ultmarc': ultmarc,
},
headers={'session_key': session_key}
)
return templates_response
@router.get('/docSearch')
def ultmarc_doctor_view(
request: Request,
@ -108,9 +184,6 @@ def ultmarc_doctor_view(
# バッチ処理中の場合、機能を利用させない
is_batch_processing = batch_status_service.is_batch_processing()
# if batch_status_service.is_batch_processing():
# raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BATCH_PROCESSING)
# 検索項目の取得(都道府県)
ultmarc = ultmarc_service.prepare_ultmarc_doctor_view(session)
ultmarc.is_batch_processing = is_batch_processing
@ -141,10 +214,9 @@ def search_doc(
batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService))
):
session: UserSession = request.session
# バッチ処理中の場合、機能を利用させない
# is_batch_processing = batch_status_service.is_batch_processing()
# if batch_status_service.is_batch_processing():
# raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BATCH_PROCESSING)
# 医師データを検索
ultmarc_doctor_data = ultmarc_service.search_doctor_data(ultmarc_doctor_form)
@ -184,9 +256,6 @@ def ultmarc_doctor_info_view(
# バッチ処理中の場合、機能を利用させない
is_batch_processing = batch_status_service.is_batch_processing()
# if batch_status_service.is_batch_processing():
# raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BATCH_PROCESSING)
# 医師情報の取得
ultmarc = ultmarc_service.info_ultmarc_doctor_view(id, session)
# バッチ起動判定の取得
@ -227,9 +296,6 @@ def ultmarc_doctor_info_search(
# バッチ処理中の場合、機能を利用させない
is_batch_processing = batch_status_service.is_batch_processing()
# if batch_status_service.is_batch_processing():
# raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BATCH_PROCESSING)
docId = ultmarc_doctor_form.docId.split(',')
# 医師情報の取得

View File

@ -0,0 +1,9 @@
from typing import Optional
from src.model.db.base_db_model import BaseDBModel
from src.util.sanitize import sanitize
@sanitize
class UltmarcDoctorWrkplaceCountDBModel(BaseDBModel):
count: Optional[int]

View File

@ -0,0 +1,57 @@
from typing import Optional
from datetime import datetime
from src.model.db.base_db_model import BaseDBModel
from src.util.sanitize import sanitize
@sanitize
class UltmarcInstInfoDBModel(BaseDBModel):
dcf_dsf_inst_cd: Optional[str]
unconf_flg: Optional[str]
dup_opp_cd: Optional[str]
close_start_ym: Optional[str]
close_flg: Optional[str]
delete_sche_reason_cd: Optional[str]
abolish_ymd: Optional[str]
estab_sche_ym: Optional[str]
estab_sche_flg: Optional[str]
form_inst_name_kana: Optional[str]
form_inst_name_kanji: Optional[str]
inst_name_kana: Optional[str]
inst_name_kanji: Optional[str]
manage_cd: Optional[str]
postal_number: Optional[str]
inst_phone_number: Optional[str]
addr_unknown_reason_cd: Optional[str]
phone_number_non_flg: Optional[str]
inst_addr_kana: Optional[str]
inst_addr: Optional[str]
re_exam_cd: Optional[str]
rltd_univ_prnt_cd: Optional[str]
insp_item_micrb: Optional[str]
insp_item_serum: Optional[str]
insp_item_blood: Optional[str]
insp_item_patho: Optional[str]
insp_item_paras: Optional[str]
insp_item_biochem: Optional[str]
insp_item_ri: Optional[str]
prmit_bed_num_gen: Optional[str]
prmit_bed_num_rcup: Optional[str]
prmit_bed_num_mental: Optional[str]
prmit_bed_num_infection: Optional[str]
prmit_bed_num_tuber: Optional[str]
prmit_bed_num_other: Optional[str]
prmit_bed_num_sum: Optional[str]
ward_abolish_flg: Optional[str]
bed_num: Optional[str]
prmit_bed_maint_ymd: Optional[str]
inst_repre_cd: Optional[str]
inst_repre_kana: Optional[str]
inst_repre: Optional[str]
sys_update_date: Optional[datetime]
delete_sche_reason: Optional[str]
inst_div_name: Optional[str]
manage_name: Optional[str]
hp_assrt_name: Optional[str]
parent_name: Optional[str]
dcf_prnt_inst_cd: Optional[str]

View File

@ -0,0 +1,9 @@
from typing import Optional
from src.model.db.base_db_model import BaseDBModel
from src.util.sanitize import sanitize
@sanitize
class UltmarcInstTrtCourseDBModel(BaseDBModel):
trt_course_name_abb: Optional[str]

View File

@ -5,5 +5,5 @@ from src.util.sanitize import sanitize
@sanitize
class UltmarcTrtCoursedbmodel(BaseDBModel):
class UltmarcTrtCourseDBModel(BaseDBModel):
trt_course_name: Optional[str]

View File

@ -45,17 +45,17 @@ class UltmarcInstModel(BaseModel):
class UltmarcInstInfoModel(BaseModel):
docId: Optional[str]
instId: Optional[str]
pageNum: Optional[int]
@classmethod
def as_form(
cls,
docId: str = Form(None),
instId: str = Form(None),
pageNum: str = Form(None)
):
return cls(
docId=docId,
instId=instId,
pageNum=int(pageNum)
)

View File

@ -1,17 +1,13 @@
import json
from collections import OrderedDict
from datetime import datetime
from datetime import datetime, date
from typing import Optional
from pydantic import BaseModel
from src.model.db.ultmarc_doctor_info import UltmarcDoctorInfoDBModel
from src.model.db.ultmarc_trt_course import UltmarcTrtCoursedbmodel
from src.model.db.ultmarc_trt_course import UltmarcTrtCourseDBModel
from src.model.db.ultmarc_sosiety import UltmarcSosietyDBModel
from src.model.db.ultmarc_specialist_license import UltmarcSpecialistLicenseDBModel
from src.model.db.ultmarc_doctor_wrkplace import UltmarcDoctorWrkplaceDBModel
from src.model.db.ultmarc_doctor_wrkplace_his import UltmarcDoctorWrkplaceHisDBModel
from src.system_var import environment
@ -19,7 +15,7 @@ class UltmarcDoctorInfoViewModel(BaseModel):
subtitle: str = '医師情報'
is_batch_processing: Optional[bool]
doctor_info_data: Optional[UltmarcDoctorInfoDBModel]
trt_coursed_data: Optional[list[UltmarcTrtCoursedbmodel]]
trt_coursed_data: Optional[list[UltmarcTrtCourseDBModel]]
sosiety_data: Optional[list[UltmarcSosietyDBModel]]
specialist_license_data: Optional[list[UltmarcSpecialistLicenseDBModel]]
doctor_wrkplace_data: Optional[list[UltmarcDoctorWrkplaceDBModel]]
@ -28,11 +24,6 @@ class UltmarcDoctorInfoViewModel(BaseModel):
postCnt: Optional[int]
pageNum: Optional[int]
def ultmarc_data_json_str(self):
def date_handler(obj):
return obj.isoformat() if hasattr(obj, 'isoformat') else obj
return json.dumps([model.dict() for model in self.doctor_data], ensure_ascii=False, default=date_handler)
# 医師コード
def is_input_dcf_pcf_dr_cd(self):
return self.doctor_info_data.dcf_pcf_dr_cd or ''
@ -86,6 +77,11 @@ class UltmarcDoctorInfoViewModel(BaseModel):
def is_input_birthday_fromat(self):
return self._format_date_string(self.doctor_info_data.birthday)
def is_input_ymd_fromat(self, ymd):
if ymd is None:
return ''
return ymd.strftime('%Y/%m/%d')
def is_input_trt_course_data_size(self):
return len(self.trt_coursed_data)
@ -102,13 +98,16 @@ class UltmarcDoctorInfoViewModel(BaseModel):
return len(self.doctor_data) == 0
def is_data_overflow_max_length(self):
return len(self.doctor_data) >= environment.BIO_SEARCH_RESULT_MAX_COUNT
return len(self.doctor_data) >= environment.SEARCH_RESULT_MAX_COUNT
def _format_date_string(self, date_string):
if date_string is None:
return ''
date = datetime.strptime(date_string, '%Y%m%d')
return date.strftime('%Y/%m/%d')
date_str = datetime.strptime(date_string, '%Y%m%d')
return date_str.strftime('%Y/%m/%d')
def _selected_value(self, form_value: str, current_value: str):
return 'selected' if form_value == current_value else ''
def is_octor_wrkplace_data_count(self):
return len(self.doctor_wrkplace_data)

View File

@ -7,7 +7,7 @@ from pydantic import BaseModel
from src.model.db.prefc_master import PrefcMasterModel
from src.model.request.ultmarc_doctor import UltmarcDoctorModel
from src.model.view.bio_disp_model import BisDisplayModel
from src.model.db.ultmarc_doctor import UltmarcDoctorDBModel
from src.system_var import environment
@ -15,7 +15,7 @@ class UltmarcDoctorViewModel(BaseModel):
subtitle: str = '医師検索一覧'
is_batch_processing: Optional[bool]
prefc_models: list[PrefcMasterModel]
doctor_data: Optional[list[BisDisplayModel]] = []
doctor_data: Optional[list[UltmarcDoctorDBModel]] = []
form_data: Optional[UltmarcDoctorModel]
def ultmarc_data_json_str(self):
@ -65,6 +65,11 @@ class UltmarcDoctorViewModel(BaseModel):
return ''
return self._selected_value(self.form_data.prefc_cd, selected_prefc_cd)
def is_input_form_prefc_cd(self):
if not self.is_form_submitted():
return ''
return self.form_data.prefc_cd or ''
# 所属部科(漢字)
def is_input_blng_sec_name(self):
if not self.is_form_submitted():
@ -99,13 +104,13 @@ class UltmarcDoctorViewModel(BaseModel):
return len(self.doctor_data) == 0
def is_data_overflow_max_length(self):
return len(self.doctor_data) >= environment.BIO_SEARCH_RESULT_MAX_COUNT
return len(self.doctor_data) >= environment.SEARCH_RESULT_MAX_COUNT
def _format_date_string(self, date_string):
if date_string is None:
return ''
date = datetime.strptime(date_string, '%Y%m%d')
return date.strftime('%Y/%m/%d')
date_str = datetime.strptime(date_string, '%Y%m%d')
return date_str.strftime('%Y/%m/%d')
def _selected_value(self, form_value: str, current_value: str):
return 'selected' if form_value == current_value else ''

View File

@ -0,0 +1,264 @@
import json
from collections import OrderedDict
from datetime import datetime
from typing import Optional
from pydantic import BaseModel
from src.model.db.ultmarc_inst_info import UltmarcInstInfoDBModel
from src.model.db.ultmarc_inst_trt_course import UltmarcInstTrtCourseDBModel
from src.system_var import environment
class UltmarcInstInfoViewModel(BaseModel):
subtitle: str = '施設情報'
is_batch_processing: Optional[bool]
inst_info_data: Optional[UltmarcInstInfoDBModel]
inst_trt_coursed_data: Optional[list[UltmarcInstTrtCourseDBModel]]
doctor_wrkplace_count: Optional[int]
instId: Optional[str]
postCnt: Optional[int]
pageNum: Optional[int]
# def ultmarc_data_json_str(self):
# def date_handler(obj):
# return obj.isoformat() if hasattr(obj, 'isoformat') else obj
# return json.dumps([model.dict() for model in self.doctor_data], ensure_ascii=False, default=date_handler)
# 施設コード
def is_input_dcf_dsf_inst_cd(self):
return self.inst_info_data.dcf_dsf_inst_cd or ''
# 未確認
def is_checked_unconf_flg(self):
return 'checked' if self.inst_info_data.unconf_flg == '1' else ''
# 施設コード変換先
def is_input_dup_opp_cd(self):
return self.inst_info_data.dup_opp_cd or ''
# 休院店開始年月
def is_input_close_start_ym(self):
return self.inst_info_data.close_start_ym or ''
# 休院店
def is_checked_close_flg(self):
return 'checked' if self.inst_info_data.close_flg == '1' else ''
# 削除予定理由
def is_input_delete_sche_reason_cd(self):
return self.inst_info_data.delete_sche_reason_cd or ''
def is_input_delete_sche_reason(self):
return self.inst_info_data.delete_sche_reason or ''
# 削除日
def is_input_abolish_ymd(self):
return self.inst_info_data.abolish_ymd or ''
# 開業予定年月
def is_input_estab_sche_ym(self):
return self.inst_info_data.estab_sche_ym or ''
# 開業
def is_checked_estab_sche_flg(self):
return 'checked' if self.inst_info_data.estab_sche_flg == '1' else ''
# 正式施設名(カナ)
def is_input_form_inst_name_kana(self):
return self.inst_info_data.form_inst_name_kana or ''
# 正式施設名(漢字)
def is_input_form_inst_name_kanji(self):
return self.inst_info_data.form_inst_name_kanji or ''
# 略式施設名(カナ)
def is_input_inst_name_kana(self):
return self.inst_info_data.inst_name_kana or ''
# 施設区分名
def is_input_inst_div_name(self):
return self.inst_info_data.inst_div_name or ''
# 略式施設名(漢字)
def is_input_inst_name_kanji(self):
return self.inst_info_data.inst_name_kanji or ''
# 経営体
def is_input_manage_cd(self):
return self.inst_info_data.manage_cd or ''
def is_input_manage_name(self):
return self.inst_info_data.manage_name or ''
# 郵便番号
def is_input_postal_number(self):
return self.inst_info_data.postal_number or ''
# 住所不明
def is_checked_addr_unknown_reason_cd(self):
return 'checked' if self.inst_info_data.addr_unknown_reason_cd else ''
# 施設電話番号
def is_input_inst_phone_number(self):
return self.inst_info_data.inst_phone_number or ''
# 開業
def is_checked_phone_number_non_flg(self):
return 'checked' if self.inst_info_data.phone_number_non_flg == '1' else ''
# 住所(カナ)
def is_input_inst_addr_kana(self):
return self.inst_info_data.inst_addr_kana or ''
# 住所(漢字)
def is_input_inst_addr(self):
return self.inst_info_data.inst_addr or ''
# 病院種別
def is_input_hp_assrt_name(self):
return self.inst_info_data.hp_assrt_name or ''
# 再審査区分
def is_checked_re_exam_cd(self):
return 'checked' if self.inst_info_data.re_exam_cd else ''
# 関連大学親名
def is_input_rltd_univ_prnt_cd(self):
return self.inst_info_data.rltd_univ_prnt_cd or ''
def is_input_parent_name(self):
return self.inst_info_data.parent_name or ''
# 微生物
def is_input_insp_item_micrb(self):
return self.inst_info_data.insp_item_micrb or ''
# 血清
def is_input_insp_item_serum(self):
return self.inst_info_data.insp_item_serum or ''
# 血液
def is_input_insp_item_blood(self):
return self.inst_info_data.insp_item_blood or ''
# 病理
def is_input_insp_item_patho(self):
return self.inst_info_data.insp_item_patho or ''
# 寄生虫
def is_input_insp_item_paras(self):
return self.inst_info_data.insp_item_paras or ''
# 生化
def is_input_insp_item_biochem(self):
return self.inst_info_data.insp_item_biochem or ''
# RI
def is_input_insp_item_ri(self):
return self.inst_info_data.insp_item_ri or ''
# 特務医務室
def is_input_dcf_prnt_inst_cd(self):
return self.inst_info_data.dcf_prnt_inst_cd or ''
# 一般
def is_input_prmit_bed_num_gen(self):
return self.inst_info_data.prmit_bed_num_gen or ''
# 療養
def is_input_prmit_bed_num_rcup(self):
return self.inst_info_data.prmit_bed_num_rcup or ''
# 精神
def is_input_prmit_bed_num_mental(self):
return self.inst_info_data.prmit_bed_num_mental or ''
# 感染症
def is_input_prmit_bed_num_infection(self):
return self.inst_info_data.prmit_bed_num_infection or ''
# 結核
def is_input_prmit_bed_num_tuber(self):
return self.inst_info_data.prmit_bed_num_tuber or ''
# その他
def is_input_prmit_bed_num_other(self):
return self.inst_info_data.prmit_bed_num_other or ''
# 合計
def is_input_prmit_bed_num_sum(self):
return self.inst_info_data.prmit_bed_num_sum or ''
# 病棟閉鎖  
def is_checked_ward_abolish_flg(self):
return 'checked' if self.inst_info_data.ward_abolish_flg == '1' else ''
# 一部病棟閉鎖
def is_checked_ward_abolish_flg_part(self):
return 'checked' if self.inst_info_data.ward_abolish_flg == '2' else ''
# 病床数(定員)
def is_input_bed_num(self):
return self.inst_info_data.bed_num or ''
# メンテ年月日
def is_input_prmit_bed_maint_ymd(self):
return self.inst_info_data.prmit_bed_maint_ymd or ''
# 代表者個人コード
def is_input_inst_repre_cd(self):
return self.inst_info_data.inst_repre_cd or ''
# 施設代表者(カナ)
def is_input_inst_repre_kana(self):
return self.inst_info_data.inst_repre_kana or ''
# 施設代表者(漢字)
def is_input_inst_repre(self):
return self.inst_info_data.inst_repre or ''
# 修正年月日
def is_input_sys_update_date(self):
sys_update_date = str(self.inst_info_data.sys_update_date)
return sys_update_date[:10]
# 勤務医師ボタン表示
def is_disabled_doctor_wrkplace(self):
return 'disabled' if self.doctor_wrkplace_count == 0 else ''
# 現在のページ(表示用)
def is_pageNum_view(self):
return self.pageNum + 1
# 前ボタン
def is_disabled_prev(self):
return 'disabled' if self.pageNum == 0 else ''
# 次ボタン
def is_disabled_next(self):
if self.pageNum == self.postCnt - 1:
return 'disabled'
return ''
# 診療科目のデータ件数
def is_input_inst_trt_course_data_size(self):
if self.inst_trt_coursed_data is None:
return 0
return len(self.inst_trt_coursed_data)
def is_data_string_empty_fromat(self, data_string):
return data_string or ''
def disabled_button(self):
return 'disabled' if self.is_data_empty() or self.is_data_overflow_max_length() else ''
def is_form_submitted(self):
return self.form_data is not None
def is_data_empty(self):
return len(self.doctor_data) == 0
def is_data_overflow_max_length(self):
return len(self.doctor_data) >= environment.SEARCH_RESULT_MAX_COUNT

View File

@ -7,7 +7,7 @@ from pydantic import BaseModel
from src.model.db.prefc_master import PrefcMasterModel
from src.model.db.inst_div_master import InstDivMasterModel
from src.model.request.ultmarc_inst import UltmarcInstModel
from src.model.view.bio_disp_model import BisDisplayModel
from src.model.db.ultmarc_inst import UltmarcInstDBModel
from src.system_var import environment
@ -16,7 +16,7 @@ class UltmarcInstViewModel(BaseModel):
is_batch_processing: Optional[bool]
prefc_models: list[PrefcMasterModel]
inst_div_models: list[InstDivMasterModel]
inst_data: Optional[list[BisDisplayModel]] = []
inst_data: Optional[list[UltmarcInstDBModel]] = []
form_data: Optional[UltmarcInstModel]
def ultmarc_data_json_str(self):
@ -25,7 +25,7 @@ class UltmarcInstViewModel(BaseModel):
return json.dumps([model.dict() for model in self.inst_data], ensure_ascii=False, default=date_handler)
# ULT施設コード
def is_input_dcf_dsf_inst_cdd(self):
def is_input_dcf_dsf_inst_cd(self):
if not self.is_form_submitted():
return ''
return self.form_data.dcf_dsf_inst_cd or ''
@ -36,6 +36,11 @@ class UltmarcInstViewModel(BaseModel):
return ''
return self._selected_value(self.form_data.inst_div_cd, selected_inst_div_cd)
def is_input_form_inst_div_cd(self):
if not self.is_form_submitted():
return ''
return self.form_data.inst_div_cd or ''
# ULT施設名(漢字)
def is_input_form_inst_name_kanji(self):
if not self.is_form_submitted():
@ -63,9 +68,14 @@ class UltmarcInstViewModel(BaseModel):
# 削除施設表示
def is_checked_delFlg(self):
if not self.is_form_submitted():
return ''
return 'checked'
return self._checked_value(self.form_data.delFlg)
def is_input_delFlg(self):
if not self.is_form_submitted():
return ''
return self.form_data.delFlg or ''
# ULT施設住所
def is_input_inst_addr(self):
if not self.is_form_submitted():
@ -78,6 +88,11 @@ class UltmarcInstViewModel(BaseModel):
return ''
return self._selected_value(self.form_data.prefc_cd, selected_prefc_cd)
def is_input_form_prefc_cd(self):
if not self.is_form_submitted():
return ''
return self.form_data.prefc_cd or ''
def disabled_button(self):
return 'disabled' if self.is_data_empty() or self.is_data_overflow_max_length() else ''
@ -85,16 +100,16 @@ class UltmarcInstViewModel(BaseModel):
return self.form_data is not None
def is_data_empty(self):
return len(self.doctor_data) == 0
return len(self.inst_data) == 0
def is_data_overflow_max_length(self):
return len(self.doctor_data) >= environment.BIO_SEARCH_RESULT_MAX_COUNT
return len(self.inst_data) >= environment.SEARCH_RESULT_MAX_COUNT
def _format_date_string(self, date_string):
if date_string is None:
return ''
date = datetime.strptime(date_string, '%Y%m%d')
return date.strftime('%Y/%m/%d')
date_str = datetime.strptime(date_string, '%Y%m%d')
return date_str.strftime('%Y/%m/%d')
def _selected_value(self, form_value: str, current_value: str):
return 'selected' if form_value == current_value else ''

View File

@ -34,7 +34,7 @@ class UltmarcDoctorRepository(BaseRepository):
LEFT JOIN src05.com_alma ON com_dr.alma_cd = com_alma.alma_cd
WHERE
{where_clause}
GROUP BY com_dr.dcf_pcf_dr_cd
GROUP BY com_dr.dcf_pcf_dr_cd, com_inst.dcf_dsf_inst_cd, com_blng_sec.blng_sec_cd
ORDER BY
com_dr.dcf_pcf_dr_cd,
com_dr_wrkplace.dcf_dsf_inst_cd,
@ -127,6 +127,13 @@ class UltmarcDoctorRepository(BaseRepository):
parameter.grad_y = f'%{parameter.grad_y}%'
where_clauses.append(SQLCondition('grad_y', condition.LIKE, 'grad_y'))
# 検索条件が入力されていない場合
# if not where_clauses:
# where_clauses.append(SQLCondition(
# '', '', '(LENGTH(com_inst.abolish_ymd) = 0 OR com_inst.abolish_ymd IS NULL)', literal=True))
# where_clauses.append(SQLCondition(
# '', '', '(LENGTH(com_dr.abolish_ymd) = 0 OR com_dr.abolish_ymd IS NULL)', literal=True))
where_clauses_str = ' AND '.join([condition.apply() for condition in where_clauses])
return where_clauses_str

View File

@ -9,17 +9,19 @@ class UltmarcDoctorWrkplaceHisRepository(BaseRepository):
com_inst.dcf_dsf_inst_cd,
com_inst.inst_name_kanji,
com_blng_sec.blng_sec_name,
univ_post.form_post_name AS univ_post_name,
post.form_post_name AS post_name,
com_dr_wrkplace.aply_start_ymd
FROM src05.com_dr
LEFT JOIN src05.com_dr_wrkplace ON com_dr.dcf_pcf_dr_cd = com_dr_wrkplace.dcf_pcf_dr_cd
LEFT JOIN src05.com_inst ON com_dr_wrkplace.dcf_dsf_inst_cd = com_inst.dcf_dsf_inst_cd
LEFT JOIN src05.com_blng_sec ON com_dr_wrkplace.blng_sec_cd = com_blng_sec.blng_sec_cd
LEFT JOIN src05.com_post as univ_post ON com_dr_wrkplace.identity_cd = univ_post.post_cd
LEFT JOIN src05.com_post as post ON com_dr_wrkplace.post_cd = post.post_cd
univ_post.form_post_name as univ_post_name,
post.form_post_name as post_name,
com_dr_wrkplace_his.aply_start_ymd,
com_dr_wrkplace_his.aply_end_ymd
FROM com_dr
LEFT JOIN com_dr_wrkplace_his ON com_dr.dcf_pcf_dr_cd = com_dr_wrkplace_his.dcf_pcf_dr_cd
LEFT JOIN com_inst ON com_dr_wrkplace_his.dcf_dsf_inst_cd = com_inst.dcf_dsf_inst_cd
LEFT JOIN com_blng_sec ON com_dr_wrkplace_his.blng_sec_cd = com_blng_sec.blng_sec_cd
LEFT JOIN com_post as univ_post ON com_dr_wrkplace_his.identity_cd = univ_post.post_cd
LEFT JOIN com_post as post ON com_dr_wrkplace_his.post_cd = post.post_cd
WHERE com_dr.dcf_pcf_dr_cd = :id
ORDER BY com_dr_wrkplace.aply_start_ymd DESC
ORDER BY com_dr_wrkplace_his.aply_end_ymd DESC,
com_dr_wrkplace_his.aply_start_ymd DESC
"""
def fetch_many(self, id) -> list[UltmarcDoctorWrkplaceHisDBModel]:

View File

@ -1,4 +1,6 @@
from src.model.db.ultmarc_doctor_wrkplace import UltmarcDoctorWrkplaceDBModel
from src.model.db.ultmarc_doctor_wrkplace_count import UltmarcDoctorWrkplaceCountDBModel
from src.repositories.base_repository import BaseRepository
@ -37,3 +39,25 @@ class UltmarcDoctorWrkplaceRepository(BaseRepository):
raise e
finally:
self._database.disconnect()
FETCH_COUNT_SQL = """\
SELECT COUNT(*) AS count
FROM src05.com_dr_wrkplace
WHERE dcf_dsf_inst_cd = :id
"""
def fetch_count(self, id) -> UltmarcDoctorWrkplaceCountDBModel:
try:
self._database.connect()
query = self.FETCH_COUNT_SQL
result = self._database.execute_select(query, {'id': id})
models = [UltmarcDoctorWrkplaceCountDBModel(**r) for r in result]
if len(models) == 0:
return 0
return models[0].count
except Exception as e:
# TODO: ファイルへの書き出しはloggerでやる
print(f"[ERROR] DB Error : Exception={e.args}")
raise e
finally:
self._database.disconnect()

View File

@ -1,6 +1,7 @@
from src.db import sql_condition as condition
from src.db.sql_condition import SQLCondition
from src.model.db.ultmarc_inst import UltmarcInstDBModel
from src.model.db.ultmarc_inst_info import UltmarcInstInfoDBModel
from src.model.request.ultmarc_inst import UltmarcInstModel
from src.repositories.base_repository import BaseRepository
from src.util.string_util import is_not_empty
@ -95,14 +96,94 @@ class UltmarcInstRepository(BaseRepository):
where_clauses.append(SQLCondition('inst_addr', condition.LIKE, 'inst_addr'))
# 削除表示フラグ
if is_not_empty(parameter.delFlg):
if is_not_empty(parameter.delFlg) == False:
# 論理和での検索
where_clauses.append(SQLCondition('', '', '(length(abolish_ymd) = 0 OR abolish_ymd IS NULL)', literal=True))
# 検索条件が入力されていない場合
if not where_clauses:
where_clauses.append(SQLCondition('', '', '(length(abolish_ymd) = 0 OR abolish_ymd IS NULL)', literal=True))
# if not where_clauses:
# where_clauses.append(SQLCondition('', '', '(length(abolish_ymd) = 0 OR abolish_ymd IS NULL)', literal=True))
where_clauses_str = ' AND '.join([condition.apply() for condition in where_clauses])
return where_clauses_str
FETCH_ONE_SQL = """\
SELECT
com_inst.dcf_dsf_inst_cd,
com_inst.unconf_flg,
com_inst.dup_opp_cd,
com_inst.close_start_ym,
com_inst.close_flg,
com_inst.delete_sche_reason_cd,
com_inst.abolish_ymd,
com_inst.estab_sche_ym,
com_inst.estab_sche_flg,
com_inst.form_inst_name_kana,
com_inst.form_inst_name_kanji,
com_inst.inst_name_kana,
com_inst.inst_name_kanji,
com_inst.manage_cd,
com_inst.postal_number,
com_inst.inst_phone_number,
com_inst.addr_unknown_reason_cd,
com_inst.phone_number_non_flg,
com_inst.inst_addr_kana,
com_inst.inst_addr,
com_inst.re_exam_cd,
com_inst.rltd_univ_prnt_cd,
com_inst.insp_item_micrb,
com_inst.insp_item_serum,
com_inst.insp_item_blood,
com_inst.insp_item_patho,
com_inst.insp_item_paras,
com_inst.insp_item_biochem,
com_inst.insp_item_ri,
com_inst.prmit_bed_num_gen,
com_inst.prmit_bed_num_rcup,
com_inst.prmit_bed_num_mental,
com_inst.prmit_bed_num_infection,
com_inst.prmit_bed_num_tuber,
com_inst.prmit_bed_num_other,
com_inst.prmit_bed_num_sum,
com_inst.ward_abolish_flg,
com_inst.bed_num,
com_inst.prmit_bed_maint_ymd,
com_inst.inst_repre_cd,
com_inst.inst_repre_kana,
com_inst.inst_repre,
com_inst.sys_update_date,
com_inst_delete_sche_reason.delete_sche_reason,
com_inst_div.inst_div_name,
com_manage.manage_name,
com_hp_assrt.hp_assrt_name,
parent_inst.form_inst_name_kanji as parent_name,
com_spcare_med_office_dat.dcf_prnt_inst_cd
FROM src05.com_inst
LEFT JOIN src05.com_inst_div ON com_inst.inst_div_cd = com_inst_div.inst_div_cd
LEFT JOIN src05.com_inst_delete_sche_reason ON com_inst.delete_sche_reason_cd = com_inst_delete_sche_reason.delete_sche_reason_cd
LEFT JOIN src05.com_manage ON com_inst.manage_cd = com_manage.manage_cd
LEFT JOIN src05.com_inst_addr_unknown_reason ON com_inst.addr_unknown_reason_cd = com_inst_addr_unknown_reason.addr_unknown_reason_cd
LEFT JOIN src05.com_hp_assrt ON com_hp_assrt.hp_assrt_cd = com_inst.hp_assrt_cd
LEFT JOIN src05.com_re_exam ON com_inst.re_exam_cd = com_re_exam.re_exam_cd
LEFT JOIN src05.com_spcare_med_office_dat ON com_inst.dcf_dsf_inst_cd = com_spcare_med_office_dat.dcf_chld_inst_cd
LEFT JOIN src05.com_inst as parent_inst ON com_inst.rltd_univ_prnt_cd = parent_inst.dcf_dsf_inst_cd
WHERE com_inst.dcf_dsf_inst_cd = :id
\
"""
def fetch_one(self, id) -> UltmarcInstInfoDBModel:
try:
self._database.connect()
query = self.FETCH_ONE_SQL
result = self._database.execute_select(query, {'id': id})
models = [UltmarcInstInfoDBModel(**r) for r in result]
if len(models) == 0:
return None
return models[0]
except Exception as e:
# TODO: ファイルへの書き出しはloggerでやる
print(f"[ERROR] DB Error : Exception={e.args}")
raise e
finally:
self._database.disconnect()

View File

@ -0,0 +1,31 @@
from src.model.db.ultmarc_inst_trt_course import UltmarcInstTrtCourseDBModel
from src.repositories.base_repository import BaseRepository
class UltmarcInstTrtCourseRepository(BaseRepository):
FETCH_SQL = """\
SELECT trt_course_name_abb
FROM src05.com_inst
JOIN src05.com_inst_trt_course ON com_inst.dcf_dsf_inst_cd = com_inst_trt_course.dcf_dsf_inst_cd
LEFT JOIN src05.com_trt_course ON com_inst_trt_course.trt_course_cd = com_trt_course.trt_course_cd
WHERE com_inst.dcf_dsf_inst_cd = :id
ORDER BY com_trt_course.trt_course_cd
"""
def fetch_many(self, id) -> list[UltmarcInstTrtCourseDBModel]:
try:
self._database.connect()
query = self.FETCH_SQL
result = self._database.execute_select(query, {'id': id})
models = [UltmarcInstTrtCourseDBModel(**r) for r in result]
if len(models) == 0:
return None
return models
except Exception as e:
# TODO: ファイルへの書き出しはloggerでやる
print(f"[ERROR] DB Error : Exception={e.args}")
raise e
finally:
self._database.disconnect()

View File

@ -1,4 +1,4 @@
from src.model.db.ultmarc_trt_course import UltmarcTrtCoursedbmodel
from src.model.db.ultmarc_trt_course import UltmarcTrtCourseDBModel
from src.repositories.base_repository import BaseRepository
@ -13,13 +13,13 @@ class UltmarcTrtCourseRepository(BaseRepository):
ORDER BY com_trt_course.trt_course_cd
"""
def fetch_many(self, id) -> list[UltmarcTrtCoursedbmodel]:
def fetch_many(self, id) -> list[UltmarcTrtCourseDBModel]:
try:
self._database.connect()
query = self.FETCH_SQL
result = self._database.execute_select(query, {'id': id})
models = [UltmarcTrtCoursedbmodel(**r) for r in result]
models = [UltmarcTrtCourseDBModel(**r) for r in result]
if len(models) == 0:
return None
return models

View File

@ -11,6 +11,7 @@ from src.model.request.ultmarc_doctor import UltmarcDoctorModel
from src.model.request.ultmarc_inst import UltmarcInstModel
from src.model.view.ultmarc_doctor_view_model import UltmarcDoctorViewModel
from src.model.view.ultmarc_inst_view_model import UltmarcInstViewModel
from src.model.view.ultmarc_inst_info_view_model import UltmarcInstInfoViewModel
from src.model.view.ultmarc_doctor_info_view_model import UltmarcDoctorInfoViewModel
from src.repositories.base_repository import BaseRepository
from src.repositories.prefc_master_repository import PrefcMasterRepository
@ -18,6 +19,7 @@ from src.repositories.inst_master_repository import InstDivMasterRepository
from src.repositories.ultmarc_inst_repository import UltmarcInstRepository
from src.repositories.ultmarc_doctor_repository import UltmarcDoctorRepository
from src.repositories.ultmarc_trt_course_repository import UltmarcTrtCourseRepository
from src.repositories.ultmarc_inst_trt_course_repository import UltmarcInstTrtCourseRepository
from src.repositories.ultmarc_sosiety_repository import UltmarcSosietyRepository
from src.repositories.ultmarc_dr_wrkplace_repository import UltmarcDoctorWrkplaceRepository
from src.repositories.ultmarc_dr_wrkplace_his_repository import UltmarcDoctorWrkplaceHisRepository
@ -33,6 +35,7 @@ class UltmarcViewService(BaseService):
'inst_div_repository': InstDivMasterRepository,
'ultmarc_inst_repository': UltmarcInstRepository,
'ultmarc_trt_course_repository': UltmarcTrtCourseRepository,
'ultmarc_inst_trt_course_repository': UltmarcInstTrtCourseRepository,
'ultmarc_sosiety_repository': UltmarcSosietyRepository,
'ultmarc_doctor_wrkplace_repository': UltmarcDoctorWrkplaceRepository,
'ultmarc_doctor_wrkplace_his_repository': UltmarcDoctorWrkplaceHisRepository,
@ -44,6 +47,7 @@ class UltmarcViewService(BaseService):
inst_div_repository: InstDivMasterRepository
ultmarc_inst_repository: UltmarcInstRepository
ultmarc_trt_course_repository: UltmarcTrtCourseRepository
ultmarc_inst_trt_course_repository: UltmarcInstTrtCourseRepository
ultmarc_sosiety_repository: UltmarcSosietyRepository
ultmarc_doctor_wrkplace_repository: UltmarcDoctorWrkplaceRepository
ultmarc_doctor_wrkplace_his_repository: UltmarcDoctorWrkplaceHisRepository
@ -56,6 +60,7 @@ class UltmarcViewService(BaseService):
self.inst_div_repository = repositories['inst_div_repository']
self.ultmarc_inst_repository = repositories['ultmarc_inst_repository']
self.ultmarc_trt_course_repository = repositories['ultmarc_trt_course_repository']
self.ultmarc_inst_trt_course_repository = repositories['ultmarc_inst_trt_course_repository']
self.ultmarc_sosiety_repository = repositories['ultmarc_sosiety_repository']
self.ultmarc_doctor_wrkplace_repository = repositories['ultmarc_doctor_wrkplace_repository']
self.ultmarc_doctor_wrkplace_his_repository = repositories['ultmarc_doctor_wrkplace_his_repository']
@ -93,6 +98,27 @@ class UltmarcViewService(BaseService):
ultmarc_inst_data = self.ultmarc_inst_repository.fetch_many(parameter=search_params)
return ultmarc_inst_data
def info_ultmarc_inst_view(
self,
id,
session: UserSession
) -> UltmarcInstInfoViewModel:
# 施設情報画面の表示データ取得
# 施設情報を取得
inst_info = self.ultmarc_inst_repository.fetch_one(id)
# 診療科目情報を取得
inst_trt_course = self.ultmarc_inst_trt_course_repository.fetch_many(id)
# 医師件数を取得
doctor_count = self.ultmarc_doctor_wrkplace_repository.fetch_count(id)
ultmarc = UltmarcInstInfoViewModel(
inst_info_data=inst_info,
inst_trt_coursed_data=inst_trt_course,
doctor_wrkplace_count=doctor_count
)
return ultmarc
def search_doctor_data(self, search_params: UltmarcDoctorModel):
# 医師データを検索
ultmarc_doctor_data = self.ultmarc_doctor_repository.fetch_many(parameter=search_params)

View File

@ -19,4 +19,5 @@ DB_PASSWORD = os.environ['DB_PASSWORD']
DB_SCHEMA = os.environ['DB_SCHEMA']
BIO_SEARCH_RESULT_MAX_COUNT = int(os.environ['BIO_SEARCH_RESULT_MAX_COUNT'])
SESSION_EXPIRE_MINUTE=int(os.environ['SESSION_EXPIRE_MINUTE'])
SEARCH_RESULT_MAX_COUNT = int(os.environ['SEARCH_RESULT_MAX_COUNT'])
SESSION_EXPIRE_MINUTE = int(os.environ['SESSION_EXPIRE_MINUTE'])

View File

@ -33,7 +33,7 @@
<body>
<table class="docHeaderTable">
<tr>
<td class="docHeaderTd"><h1>医師情報</h1></td>
<td class="docHeaderTd"><h1>{{ultmarc.subtitle}}</h1></td>
<td class="docHeaderTdCenter docHeaderTdCenter">
{% if ultmarc.is_batch_processing %}
<div class="docButchMsg">日次バッチ処理中のため、データが正しく表示されない可能性があります</div>
@ -50,16 +50,29 @@
<input type="hidden" name="docId" value="{{ultmarc.DocId}}">
<input type="hidden" name="pageNum" id="pageNum" value="{{ultmarc.pageNum}}">
<td class="instHeaderTd">
<input type="button" name="prev" id="prev" value="前" class="transitionBt" {{ultmarc.is_disabled_prev()}}>
<input type="button" name="prev" id="prev" value="前" class="transitionBt" {{ultmarc.is_disabled_prev()}}>
</td>
<td class="instHeaderTd">
{{ultmarc.is_pageNum_view()}}{{ultmarc.postCnt}}
</td>
<td class="instHeaderTd">
<input type="button" name="next" id="next" value="次" class="transitionBt" {{ultmarc.is_disabled_next()}}>
<input type="button" name="next" id="next" value="次" class="transitionBt" {{ultmarc.is_disabled_next()}}>
</td>
</form>
<form name="instSearch" method="get" action="/ultmarc/docSearch">
<form id="instSearch" name="instSearch" method="post" action="/ultmarc/docSearch">
<script>
var form = document.getElementById("instSearch");
for (var i = 0, length = sessionStorage.length; i < length; ++i) {
let key = sessionStorage.key(i);
let value = sessionStorage.getItem(key);
const input = document.createElement('input');
input.setAttribute('type', 'text');
input.value = value;
input.name = key;
form.appendChild(input);
}
</script>
<td class="instHeaderTd">
<input type="submit" name="ctrl_docBackBt" class="transitionBt" value="医師検索一覧へ">
</td>
@ -175,35 +188,44 @@
<th>終了年月日</th>
</tr>
</thead>
<script>
function OnLinkClick(){
sessionStorage.clear();
return true;
}
</script>
<tbody>
{% for doctor_wrkplace_data in ultmarc.doctor_wrkplace_data %}
{% if ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.dcf_dsf_inst_cd) != ''%}
<tr>
<td>{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.dcf_dsf_inst_cd)}}</td>
<td>{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.inst_name_kanji)}}</td>
<td>{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.blng_sec_name)}}</td>
<td>{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.univ_post_name)}}</td>
<td>{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.post_name)}}</td>
<td>{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.aply_start_ymd)}}</td>
<td>9999/99/99</td>
</tr>
{% endif %}
{% endfor %}
{% for doctor_wrkplace_data in ultmarc.doctor_wrkplace_data %}
{% if ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.dcf_dsf_inst_cd) != ''%}
<tr>
<td><a href="/ultmarc/instInfo?id={{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.dcf_dsf_inst_cd)}}" onclick="OnLinkClick();">
{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.dcf_dsf_inst_cd)}}</a></td>
<td>{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.inst_name_kanji)}}</td>
<td>{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.blng_sec_name)}}</td>
<td>{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.univ_post_name)}}</td>
<td>{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.post_name)}}</td>
<td>{{ultmarc.is_input_ymd_fromat(doctor_wrkplace_data.aply_start_ymd)}}</td>
<td>9999/99/99</td>
</tr>
{% endif %}
{% endfor %}
<!-- if ultmarc.is_octor_wrkplace_data_count == 0 -->
{% for doctor_wrkplace_his_data in ultmarc.doctor_wrkplace_his_data %}
{% if ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.dcf_dsf_inst_cd) != ''%}
<tr>
<td>{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.dcf_dsf_inst_cd)}}</td>
<tr>
<td><a href="/ultmarc/instInfo?id={{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.dcf_dsf_inst_cd)}}" onclick="OnLinkClick();">
{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.dcf_dsf_inst_cd)}}
</a></td>
<td>{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.inst_name_kanji)}}</td>
<td>{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.blng_sec_name)}}</td>
<td>{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.univ_post_name)}}</td>
<td>{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.post_name)}}</td>
<td>{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.aply_start_ymd)}}</td>
<td>{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.aply_end_ymd)}}</td>
<td>{{ultmarc.is_input_ymd_fromat(doctor_wrkplace_his_data.aply_start_ymd)}}</td>
<td>{{ultmarc.is_input_ymd_fromat(doctor_wrkplace_his_data.aply_end_ymd)}}</td>
</tr>
{% endif %}
{% endfor %}
<!-- endif -->
</tbody>
</table>
</div>

View File

@ -22,7 +22,7 @@
<body>
<table class="docHeaderTable">
<tr>
<td class="docHeaderTd"><h1>医師検索一覧</h1></td>
<td class="docHeaderTd"><h1>{{ultmarc.subtitle}}</h1></td>
<td class="docHeaderTdCenter docHeaderTdCenter">
{% if ultmarc.is_batch_processing %}
<div class="docButchMsg">日次バッチ処理中のため、データが正しく表示されない可能性があります</div>
@ -140,6 +140,16 @@
<tbody id="result_data" class="result_data"></tbody>
</table>
{% if ultmarc.is_form_submitted() and ultmarc.is_data_overflow_max_length() %}
<div class="resultAreaMsg">
検索結果が最大件数を超えました。検索条件を見直しして下さい。
</div>
{% endif %}
{% if ultmarc.is_form_submitted() and ultmarc.is_data_empty() %}
<div class="resultAreaMsg">
対象のデータが存在しません。
</div>
{% endif %}
</div>
<!--操作ボタン-->
@ -156,8 +166,24 @@
const searchResultData = JSON.parse(searchResultString)
if (searchResultData.length == 0) {
return
}
$(".pagination").pagination({
}else if(searchResultData.length > 500){
return
}
// 検索条件をセッションに入れる
sessionStorage.clear();
sessionStorage.setItem('ctrl_dcf_pcf_dr_cd','{{ultmarc.is_input_dcf_pcf_dr_cd()}}');
sessionStorage.setItem('ctrl_dr_name','{{ultmarc.is_input_dr_name()}}');
sessionStorage.setItem('ctrl_dr_name_kana','{{ultmarc.is_input_dr_name_kana()}}');
sessionStorage.setItem('ctrl_dcf_dsf_inst_cd','{{ultmarc.is_input_dcf_dsf_inst_cd()}}');
sessionStorage.setItem('ctrl_form_inst_name_kanji','{{ultmarc.is_input_form_inst_name_kanji()}}');
sessionStorage.setItem('ctrl_form_inst_name_kana','{{ultmarc.is_input_form_inst_name_kana()}}');
sessionStorage.setItem('ctrl_prefc_cd','{{ultmarc.is_input_form_prefc_cd()}}');
sessionStorage.setItem('ctrl_blng_sec_name','{{ultmarc.is_input_blng_sec_name()}}');
sessionStorage.setItem('ctrl_trt_course_name','{{ultmarc.is_input_trt_course_name()}}');
sessionStorage.setItem('ctrl_alma','{{ultmarc.is_input_alma()}}');
sessionStorage.setItem('ctrl_grad_y','{{ultmarc.is_input_grad_y()}}');
$(".pagination").pagination({
dataSource: function(done) {
done(searchResultData)
},
@ -175,6 +201,11 @@
})
});
function OnLinkClick(){
sessionStorage.clear();
return true;
}
function pagination_content(datas) {
const display_keys = [
'dcf_pcf_dr_cd',
@ -192,7 +223,7 @@
if(key=='dcf_pcf_dr_cd')
inner_content = `<a href="/ultmarc/docInfo?id=${data['dcf_pcf_dr_cd']}">${data['dcf_pcf_dr_cd'] || ''}</a>`;
if(key=='dcf_dsf_inst_cd')
inner_content = `<a href="/ultmarc/instInfo?id=${data['dcf_dsf_inst_cd']}">${data['form_inst_name_kanji'] || ''}</a>`;
inner_content = `<a href="/ultmarc/instInfo?id=${data['dcf_dsf_inst_cd']}" onclick="OnLinkClick()">${data['form_inst_name_kanji'] || ''}</a>`;
return `<td>${inner_content || ''}</td>`
});
return `
@ -208,7 +239,7 @@
})
}
// 配列パラメータを加工にする
配列パラメータを加工にする
function CheckBoxListPocessing()
{
var vals = []; // 配列を定義

View File

@ -0,0 +1,285 @@
<!DOCTYPE html>
<html lang="ja">
<head>
{% with subtitle = ultmarc.subtitle %}
{% include '_header.html' %}
{% endwith %}
<link rel="stylesheet" href="/static/css/ultStyle.css">
<script type="text/javascript">
window.onload = function(){
// 見出し固定初期化
FixedMidashi.create();
// ボタン、テキストボックス初期化
formBtDisabled();
}
</script>
<script>
$(function(){
// 前ページ遷移処理
$('#prev').click(function(){
$('#pageNum').val(Number($('#pageNum').val()) - 1);
$('#instInfo').submit();
});
// 次ページ遷移処理
$('#next').click(function(){
$('#pageNum').val(Number($('#pageNum').val()) + 1);
$('#instInfo').submit();
});
});
</script>
</head>
<body>
<h1>
{{ultmarc.subtitle}}
</h1>
{% if ultmarc.is_batch_processing %}
<div class="docButchMsg">日次バッチ処理中のため、データが正しく表示されない可能性があります</div>
{% endif %}
<!-- 上部のボタン -->
<table class="instHeaderTable">
<tr>
<form name="docSearch" method="post" action="/ultmarc/docSearch">
<td class="instHeaderTd">
<input type="hidden" name="ctrl_dcf_dsf_inst_cd" value="{{ultmarc.is_input_dcf_dsf_inst_cd()}}">
<input name="docSearchBt" class="transitionBt" type="submit" value="勤務医師" {{ultmarc.is_disabled_doctor_wrkplace()}}>
</td>
</form>
<form id="instInfo" name="instInfo" method="post" action="/ultmarc/instInfo">
<input type="hidden" name="instId" value="{{ultmarc.instId}}">
<input type="hidden" name="pageNum" id="pageNum" value="{{ultmarc.pageNum}}">
<td class="instHeaderTd">
<input type="button" name="prev" id="prev" value="前" class="transitionBt" {{ultmarc.is_disabled_prev()}}>
</td>
<td class="instHeaderTd">
{{ultmarc.is_pageNum_view()}}{{ultmarc.postCnt}}
</td>
<td class="instHeaderTd">
<input type="button" name="next" id="next" value="次" class="transitionBt" {{ultmarc.is_disabled_next()}}>
</td>
</form>
<form id="instSearch" name="instSearch" method="" action="/ultmarc/instSearch" onsubmit="chg_send_method()">
<script>
var form = document.getElementById("instSearch");
for (var i = 0, length = sessionStorage.length; i < length; ++i) {
let key = sessionStorage.key(i);
let value = sessionStorage.getItem(key);
const input = document.createElement('input');
input.setAttribute('type', 'text');
input.value = value;
input.name = key;
form.appendChild(input);
}
</script>
<td class="instHeaderTd">
<input type="submit" name="instSearchBt" class="transitionBt" value="施設検索一覧へ">
</td>
</form>
<script>
function chg_send_method(){
if(sessionStorage.length == 0){
$('#instSearch')('method', 'GET');
}else{
$('#instSearch').attr('method', 'POST');
}
return true;
}
</script>
</tr>
</table>
<!-- 施設情報 -->
<table class="instInfoTable">
<tbody>
<tr>
<td class="instInfoColumn">施設コード</td>
<td class="instData instDataLeft">
<input type="text" readonly="readonly" value="{{ultmarc.is_input_dcf_dsf_inst_cd()}}" class="instCdTextbox">
<input class="checkbox" type="checkbox" disabled="disabled" {{ultmarc.is_checked_unconf_flg()}}>未確認
</td>
<td class="instInfoColumn">施設コード変換先</td>
<td class="instData instDataCenter">
<input type="text" readonly="readonly" value="{{ultmarc.is_input_dup_opp_cd()}}" class="instDataCenterTextbox">
</td>
<td class="instInfoColumn">休院店開始年月</td>
<td class="instData instDataRight">
<input type="text" readonly="readonly" value="{{ultmarc.is_input_close_start_ym()}}" class="instDataSmallTextbox">
<input type="checkbox" disabled="disabled" {{ultmarc.is_checked_close_flg()}}>休院店
</td>
</tr>
<tr>
<td class="instInfoColumn">削除予定理由</td>
<td class="instData instDataLeft"><input type="text" readonly="readonly" value="{{ultmarc.is_input_delete_sche_reason_cd()}}" class="delReasonCdTextbox"><input type="text" readonly="readonly" value="{{ultmarc.is_input_delete_sche_reason()}}" class="delReasonTextbox"></td>
<td class="instInfoColumn">削除日</td>
<td class="instData instDataCenter">
<input type="text" readonly="readonly" value="{{ultmarc.is_input_abolish_ymd()}}" class="instDataCenterTextbox">
</td>
<td class="instInfoColumn">開業予定年月</td>
<td class="instData instDataRight">
<input type="text" readonly="readonly" value="{{ultmarc.is_input_estab_sche_ym()}}" class="instDataSmallTextbox">
<input type="checkbox" disabled="disabled" {{ultmarc.is_checked_estab_sche_flg()}}>開業
</td>
</tr>
<tr>
<td class="instInfoColumn">正式施設名(カナ)</td>
<td class="instData" colspan="5"><input type="text" readonly="readonly" value="{{ultmarc.is_input_form_inst_name_kana()}}" class="instInfoTextbox"></td>
</tr>
<tr>
<td class="instInfoColumn">正式施設名(漢字)</td>
<td class="instData" colspan="5"><input type="text" readonly="readonly" value="{{ultmarc.is_input_form_inst_name_kanji()}}" class="instInfoTextbox"></td>
</tr>
<tr>
<td class="instInfoColumn">略式施設名(カナ)</td>
<td class="instData instDataMid" colspan="3"><input type="text" readonly="readonly" value="{{ultmarc.is_input_inst_name_kana()}}" class="instInfoTextbox"></td>
<td class="instInfoColumn">施設区分名</td>
<td class="instData instDataSmall"><input type="text" readonly="readonly" value="{{ultmarc.is_input_inst_div_name()}}" class="instInfoTextbox"></td>
</tr>
<tr>
<td class="instInfoColumn">略式施設名(漢字)</td>
<td class="instData instDataMid" colspan="3"><input type="text" readonly="readonly" value="{{ultmarc.is_input_inst_name_kanji()}}" class="instInfoTextbox"></td>
<td class="instInfoColumn">経営体</td>
<td class="instData instDataSmall">
<input type="text" readonly="readonly" value="{{ultmarc.is_input_manage_cd()}}" class="manageTextbox">
<input type="text" readonly="readonly" value="{{ultmarc.is_input_manage_name()}}" class="textboxMargin manageTextbox">
</td>
</tr>
<tr>
<td class="instInfoColumn">郵便番号</td>
<td class="instData instDataMid" colspan="3">
<input type="text" readonly="readonly" value="{{ultmarc.is_input_postal_number()}}">
<input type="checkbox" class="checkboxMargin" disabled="disabled" {{ultmarc.is_checked_addr_unknown_reason_cd()}}>住所不明
</td>
<td class="instInfoColumn">施設電話番号</td>
<td class="instData instDataRight">
<input type="text" readonly="readonly" value="{{ultmarc.is_input_inst_phone_number()}}" class="instDataSmallTextbox">
<input type="checkbox" class="checkboxMargin" disabled="disabled" {{ultmarc.is_checked_phone_number_non_flg()}}>電話なし
</td>
</tr>
<tr>
<td class="instInfoColumn">住所(カナ)</td>
<td class="instData instDataLarge" colspan="5"><input type="text" readonly="readonly" value="{{ultmarc.is_input_inst_addr_kana()}}" class="instInfoTextbox"></td>
</tr>
<tr>
<td class="instInfoColumn">住所(漢字)</td>
<td class="instData instDataLarge" colspan="5"><input type="text" readonly="readonly" value="{{ultmarc.is_input_inst_addr()}}" class="instInfoTextbox"></td>
</tr>
</tbody>
</table>
<hr>
<!-- 病院情報 -->
<table class="instInfoTableHalf1">
<tbody>
<tr>
<td class="hpInfoColumn">病院種別</td>
<td class="instData hpAssrtTd"><input type="text" readonly="readonly" value="{{ultmarc.is_input_hp_assrt_name()}}" class="hpAssrtTextbox"></td>
<td class="instData reExamTd"><input type="checkbox" disabled="disabled" {{ultmarc.is_checked_re_exam_cd()}}>再審査区分</input></td>
<td class="hpInfoColumn">関連大学親名</td>
<td class="instData">
<input type="text" readonly="readonly" value="{{ultmarc.is_input_rltd_univ_prnt_cd()}}" class="parentCdTextBox">
<input type="text" readonly="readonly" value="{{ultmarc.is_input_parent_name()}}" class="parentNameTextBox">
</td>
</tr>
<tr>
<td class="hpInfoColumn">診療科目</td>
<td class="instData border_bottom_none" colspan="4">
{% if ultmarc.inst_trt_coursed_data != None %}
{% for inst_trt_course_data in ultmarc.inst_trt_coursed_data %}
<input class="trtCourseTextbox" type="text" readonly="readonly" value="{{inst_trt_course_data.trt_course_name_abb}}">
{% endfor %}
{% endif %}
{% for i in range(60-ultmarc.is_input_inst_trt_course_data_size()) %}
<input class="trtCourseTextbox" type="text" readonly="readonly">
{% endfor %}
</td>
</tr>
<tr>
<td class="hpInfoColumn">検査工程</td>
<td class="instData" colspan="4">
<label>微生物</label>
<input class="trtTextbox" type="text" readonly="readonly" value="{{ultmarc.is_input_insp_item_micrb()}}">
<label>血清</label>
<input class="trtTextbox" type="text" readonly="readonly" value="{{ultmarc.is_input_insp_item_serum()}}">
<label>血液</label>
<input class="trtTextbox" type="text" readonly="readonly" value="{{ultmarc.is_input_insp_item_blood()}}">
<label>病理</label>
<input class="trtTextbox" type="text" readonly="readonly" value="{{ultmarc.is_input_insp_item_patho()}}">
<label>寄生虫</label>
<input class="trtTextbox" type="text" readonly="readonly" value="{{ultmarc.is_input_insp_item_paras()}}">
<label>生化</label>
<input class="trtTextbox" type="text" readonly="readonly" value="{{ultmarc.is_input_insp_item_biochem()}}">
<label>RI</label>
<input class="trtTextbox" type="text" readonly="readonly" value="{{ultmarc.is_input_insp_item_ri()}}">
</td>
</tr>
</tbody>
</table>
<table class="instInfoTableHalf2">
<tbody>
<tr>
<td class="hpInfoColumn">特務医務室</td>
<td class="instData xSmallTd"><input type="text" readonly="readonly" value="{{ultmarc.is_input_dcf_prnt_inst_cd()}}" class="xSmallTextbox"></td>
<td rowspan="2" class="hpInfoColumn">許可病床数</td>
<td class="instData bedTd" rowspan="2">
<table>
<tbody>
<tr>
<td>一般</td>
<td>療養</td>
<td>精神</td>
<td>感染症</td>
<td>結核</td>
<td>その他</td>
<td>合計</td>
</tr>
<tr>
<td><input class="bedTextbox numberBox" type="text" readonly="readonly" value="{{ultmarc.is_input_prmit_bed_num_gen()}}"></td>
<td><input class="bedTextbox numberBox" type="text" readonly="readonly" value="{{ultmarc.is_input_prmit_bed_num_rcup()}}"></td>
<td><input class="bedTextbox numberBox" type="text" readonly="readonly" value="{{ultmarc.is_input_prmit_bed_num_mental()}}"></td>
<td><input class="bedTextbox numberBox" type="text" readonly="readonly" value="{{ultmarc.is_input_prmit_bed_num_infection()}}"></td>
<td><input class="bedTextbox numberBox" type="text" readonly="readonly" value="{{ultmarc.is_input_prmit_bed_num_tuber()}}"></td>
<td><input class="bedTextbox numberBox" type="text" readonly="readonly" value="{{ultmarc.is_input_prmit_bed_num_other()}}"></td>
<td><input class="bedTextbox numberBox" type="text" readonly="readonly" value="{{ultmarc.is_input_prmit_bed_num_sum()}}"></td>
</tr>
</tbody>
</table>
</td>
<td class="instData" colspan="2"><input type="checkbox" disabled="disabled" {{ultmarc.is_checked_ward_abolish_flg()}}>病棟閉鎖  <input type="checkbox" disabled="disabled" {{ultmarc.is_checked_ward_abolish_flg_part()}}>一部病棟閉鎖</td>
</tr>
<tr>
<td class="hpInfoColumn">病床数(定員)</td>
<td class="instData"><input type="text" readonly="readonly" value="{{ultmarc.is_input_bed_num()}}" class="xSmallTextbox numberBox"></td>
<td class="hpInfoColumn">メンテ年月日</td>
<td class="instData xSmallTd"><input type="text" readonly="readonly" value="{{ultmarc.is_input_prmit_bed_maint_ymd()}}" class="xSmallTextbox"></td>
</tr>
</tbody>
</table>
<!-- 施設代表者 -->
<table class="instInfoTable">
<tbody>
<tr>
<td class="instInfoColumn">代表者個人コード</td>
<td class="instData repreTd"><input type="text" readonly="readonly" value="{{ultmarc.is_input_inst_repre_cd()}}" class="repreTextbox"></td>
</tr>
<tr>
<td class="instInfoColumn">施設代表者(カナ)</td>
<td class="instData repreTd"><input type="text" readonly="readonly" value="{{ultmarc.is_input_inst_repre_kana()}}" class="repreTextbox"></td>
</tr>
<tr>
<td class="instInfoColumn">施設代表者(漢字)</td>
<td class="instData repreTd"><input type="text" readonly="readonly" value="{{ultmarc.is_input_inst_repre()}}" class="repreTextbox"></td>
</tr>
<tr>
<td class="instInfoColumn">修正年月日</td>
<td class="instData repreTd"><input type="text" readonly="readonly" value="{{ultmarc.is_input_sys_update_date()}}" class="repreTextbox"></td>
</tr>
</tbody>
</table>
</body>
</html>

View File

@ -7,7 +7,7 @@
<link rel="stylesheet" href="/static/css/ultStyle.css">
<script type="text/javascript">
controlCount = 11; // 検索フォームの入力ボックスの数 アルトマーク課題管理表No.2の修正
controlCount = 8; // 検索フォームの入力ボックスの数 アルトマーク課題管理表No.2の修正
window.onload = function(){
// 見出し固定初期化
@ -23,7 +23,7 @@
<!-- タイトルと上部ボタン -->
<table class="instSearchHeaderTable">
<tr>
<td class="instSearchHeaderTd"><h1>施設検索一覧</h1></td>
<td class="instSearchHeaderTd"><h1>{{ultmarc.subtitle}}</h1></td>
<td class="instSearchHeaderTdCenter instSearchHeaderTdCenter">
{% if ultmarc.is_batch_processing %}
<div class="docButchMsg">日次バッチ処理中のため、データが正しく表示されない可能性があります</div>
@ -33,14 +33,14 @@
</tr>
</table>
<!-- 入力フォーム -->
<form class="_form" name="search" action="/ultmarc/instSearch" method="POST">
<form id="inst_search" class="_form" name="search" action="/ultmarc/instSearch" method="POST">
<table class="search_table">
<tbody>
<tr>
<td>ULT施設コード</td>
<td class="search_tb leftSearch_tb">
<input class="text search_textbox" style="ime-mode:disabled;" type="text" name="ctrl_dcf_dsf_inst_cd"
value="{{ultmarc.is_input_dcf_dsf_inst_cdd()}}" oninput="formBtDisabled()">
value="{{ultmarc.is_input_dcf_dsf_inst_cd()}}" oninput="formBtDisabled()">
</td>
<td>施設区分:</td>
<td class="search_tb">
@ -93,8 +93,8 @@
</select>
</td>
<td>
<input type="checkbox" name="ctrl_delFlg" value="true"
onchange="formBtDisabled()" {{ultmarc.is_checked_delFlg()}}> 削除施設表示
<label><input type="checkbox" name="ctrl_delFlg" value="true"
onchange="formBtDisabled()" {{ultmarc.is_checked_delFlg()}}> 削除施設表示</label>
</td>
</tr>
<tr>
@ -103,7 +103,6 @@
<input class="text search_textbox" type="text" name="ctrl_inst_addr"
value="{{ultmarc.is_input_inst_addr()}}" oninput="formBtDisabled()">
</td>
<td class="search_btTd" colspan="2">
<input class="text ult_bt search_bt" id="clear" type="button" name="clear_bt" value="クリア" onclick="clr()">
<input class="ult_bt search_bt" id="search_bt" name="search_bt" value="検索" type="submit">
@ -116,9 +115,9 @@
<!--検索結果-->
<form class="_form" name="result" action="/ultmarc/instInfo" method="POST" onsubmit="CheckBoxListPocessing()">
<input type="button" name="allon" onclick="allOn()" value="全選択" class="ult_bt allOnOffButton">
<!-- <?php if ($dtCnt['countNum'] <= 0){ echo "disabled"; } ? -->
<input type="button" name="alloff" onclick="allOff()" value="全解除" class="ult_bt allOnOffButton">
<!-- <?php if ($dtCnt['countNum'] <= 0){ echo "disabled"; } ?> -->
<input type="hidden" name="instId" id="instId" value="">
<input type="hidden" name="pageNum" value="0">
<!--検索件数-->
<!--ページネーション-->
<div id="light-pagination" class="pagination"></div>
@ -141,7 +140,18 @@
</thead>
<tbody id="result_data" class="result_data"></tbody>
</table>
</div>
{% if ultmarc.is_form_submitted() and ultmarc.is_data_overflow_max_length() %}
<div class="resultAreaMsg">
検索結果が最大件数を超えました。検索条件を見直しして下さい。
</div>
{% endif %}
{% if ultmarc.is_form_submitted() and ultmarc.is_data_empty() %}
<div class="resultAreaMsg">
対象のデータが存在しません。
</div>
{% endif %}
</div>
<!--操作ボタン-->
<input class="send ult_bt info_bt" type="submit" name="detail" value="施設情報">
</form>
@ -149,14 +159,29 @@
<script type="text/javascript">
// <! --ページネーションの作成-- >
$(function() {
// スピナー出さない場合は以下、エスケープせず埋め込む
// {% autoescape False%}
let searchResultString = '{{ultmarc.ultmarc_data_json_str()}}'
// {% autoescape False%}
let searchResultString = '{{ultmarc.ultmarc_data_json_str()}}'
// {% endautoescape%}
const searchResultData = JSON.parse(searchResultString)
if (searchResultData.length == 0) {
return
}
if (searchResultData.length > 500) {
return
}
// 検索条件をセッションに入れる
sessionStorage.clear();
sessionStorage.setItem('ctrl_dcf_dsf_inst_cd','{{ultmarc.is_input_dcf_dsf_inst_cd()}}');
sessionStorage.setItem('ctrl_inst_div_cd','{{ultmarc.is_input_form_inst_div_cd()}}');
sessionStorage.setItem('ctrl_form_inst_name_kanji','{{ultmarc.is_input_form_inst_name_kanji()}}');
sessionStorage.setItem('ctrl_form_inst_name_kana','{{ultmarc.is_input_form_inst_name_kana()}}');
sessionStorage.setItem('ctrl_postal_number','{{ultmarc.is_input_postal_number()}}');
sessionStorage.setItem('ctrl_inst_phone_number','{{ultmarc.is_input_inst_phone_number()}}');
sessionStorage.setItem('ctrl_prefc_cd','{{ultmarc.is_input_form_prefc_cd()}}');
sessionStorage.setItem('ctrl_delFlg','{{ultmarc.is_input_delFlg()}}');
sessionStorage.setItem('ctrl_inst_addr','{{ultmarc.is_input_inst_addr()}}');
$(".pagination").pagination({
dataSource: function(done) {
done(searchResultData)
@ -187,6 +212,7 @@
'hp_assrt_name',
'prefc_name'
];
return datas.map(function (data) {
let td = display_keys.map((key) =>{
let inner_content = data[key];
@ -207,6 +233,16 @@
`
})
}
// 配列パラメータを加工にする
function CheckBoxListPocessing()
{
var vals = []; // 配列を定義
$('input[name="data"]:checked').each(function() {
vals.push( $(this).val() ); // 配列に値を追加
});
$("#instId").val(vals.join(','));
}
</script>
</body>
</html>

View File

@ -4,3 +4,4 @@ AUTHORIZE_ENDPOINT=oauth2/authorize
TOKEN_ENDPOINT=oauth2/token
BIO_SEARCH_RESULT_MAX_COUNT=35000
SESSION_EXPIRE_MINUTE=20
SEARCH_RESULT_MAX_COUNT=500