From 87364d7e83248c2ebae1b7b93b7210492b821499 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 30 May 2023 14:34:50 +0900 Subject: [PATCH 01/24] =?UTF-8?q?=E5=8C=BB=E5=B8=AB=E6=A4=9C=E7=B4=A2?= =?UTF-8?q?=E7=94=BB=E9=9D=A2=E3=81=AE=E5=81=B4=E3=81=A0=E3=81=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/ultmarc.py | 90 +++ ecs/jskult-webapp/src/main.py | 4 +- ecs/jskult-webapp/src/static/css/ultStyle.css | 671 ++++++++++++++++ .../static/function/businessLogicScript.js | 60 ++ .../src/templates/docSearch.html | 744 ++++++++++++++++++ ecs/jskult-webapp/src/templates/menu.html | 2 +- 6 files changed, 1569 insertions(+), 2 deletions(-) create mode 100644 ecs/jskult-webapp/src/controller/ultmarc.py create mode 100644 ecs/jskult-webapp/src/static/css/ultStyle.css create mode 100644 ecs/jskult-webapp/src/templates/docSearch.html diff --git a/ecs/jskult-webapp/src/controller/ultmarc.py b/ecs/jskult-webapp/src/controller/ultmarc.py new file mode 100644 index 00000000..2f1bd5eb --- /dev/null +++ b/ecs/jskult-webapp/src/controller/ultmarc.py @@ -0,0 +1,90 @@ +from typing import Optional + +from fastapi import APIRouter, Depends, HTTPException, Request +from fastapi.exceptions import HTTPException +from starlette import status + +from src.depends.services import get_service +from src.model.internal.session import UserSession +from src.model.request.bio import BioModel +from src.model.view.bio_view_model import BioViewModel +from src.router.session_router import AuthenticatedRoute +from src.services.batch_status_service import BatchStatusService +from src.services.bio_view_service import BioViewService +from src.services.session_service import set_session +from src.system_var import constants +from src.templates import templates + +router = APIRouter() +router.route_class = AuthenticatedRoute + +######################### +# Views # +######################### + + +@router.get('/docSearch') +def ultmarc_view( + request: Request, + # batch_status_service:BatchStatusService=Depends(get_service(BatchStatusService)), + # bio_service: BioViewService=Depends(get_service(BioViewService)) +): + session: UserSession = request.session + # バッチ処理中の場合、機能を利用させない + # if batch_status_service.is_batch_processing(): + # raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BATCH_PROCESSING) + # # 検索項目の取得 + # bio = bio_service.prepare_bio_view(session) + # セッション書き換え + 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( + 'docSearch.html', { + 'request': request, + # 'bio': bio, + }, + headers={'session_key': session_key} + ) + return templates_response + + +@router.post('/BioSearchList') +def search_bio( + request: Request, + bio_form: Optional[BioModel] = Depends(BioModel.as_form), + bio_service: BioViewService = Depends(get_service(BioViewService)), + batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) +): + # error_log(date("Y/m/d H:i:s") . " [INFO] UserId:" . $UserId . "\r\n", 3, "$execLog"); + session: UserSession = request.session + # バッチ処理中の場合、機能を利用させない + if batch_status_service.is_batch_processing(): + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BATCH_PROCESSING) + + # 生物由来データを検索 + bio_sales_view_data = bio_service.search_bio_data(bio_form) + # 検索項目などのデータを取得 + bio: BioViewModel = bio_service.prepare_bio_view(session) + bio.bio_data = bio_sales_view_data + bio.form_data = bio_form + # セッション書き換え + 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( + 'bioSearchList.html', { + 'request': request, + 'bio': bio + }, + headers={'session_key': session_key} + ) + return templates_response diff --git a/ecs/jskult-webapp/src/main.py b/ecs/jskult-webapp/src/main.py index f00f5ac3..a15344dc 100644 --- a/ecs/jskult-webapp/src/main.py +++ b/ecs/jskult-webapp/src/main.py @@ -5,7 +5,7 @@ from fastapi.staticfiles import StaticFiles from starlette import status import src.static as static -from src.controller import bio, bio_download, healthcheck, login, logout, menu +from src.controller import bio, bio_download, healthcheck, ultmarc, login, logout, menu from src.core import tasks from src.error.exception_handler import http_exception_handler from src.error.exceptions import UnexpectedException @@ -22,6 +22,8 @@ app.include_router(logout.router, prefix='/logout') app.include_router(menu.router, prefix='/menu') # 生物由来関連のルーター app.include_router(bio.router, prefix='/bio') +# アルトマークデータ照会のルーター +app.include_router(ultmarc.router, prefix='/ultmarc') # 生物由来のダウンロード用APIルーター。 # クライアントから非同期呼出しされるため、共通ルーターとは異なる扱いとする。 app.include_router(bio_download.router, prefix='/bio') diff --git a/ecs/jskult-webapp/src/static/css/ultStyle.css b/ecs/jskult-webapp/src/static/css/ultStyle.css new file mode 100644 index 00000000..936cef77 --- /dev/null +++ b/ecs/jskult-webapp/src/static/css/ultStyle.css @@ -0,0 +1,671 @@ +body { + background-color: LightCyan; + font-family: "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", "メイリオ", Meiryo, Osaka, "MS Pゴシック", "MS PGothic", sans-serif; +} + +h1 { + font-size: 150%; + margin-left: 2%; + margin-top: 0%; + margin-bottom: 0%; +} + +table{ + border-collapse : collapse; +} + +.header_bt{ + width: 8%; + margin-bottom: 0.8%; + margin-left: 78.5%; +} + +.search_textbox{ + width: 100%; +} + +.search_dropdown{ + width: 100%; +} + +.search_longtextbox{ + width: 100% +} + +.instSearchResult { + width: 100%; +} + +.scroll_table{ + overflow: auto; + white-space: nowrap; + margin-bottom: 2%; + /*スクロール時カラムが動く問題の修正 width: 100%;をコメントアウト*/ + width: 100%; + height: 250px; +} + +.scroll_table::-webkit-scrollbar { + height: 5px; + width: 10px; +} + +.scroll_table::-webkit-scrollbar-track { + border-radius: 5px; + background: #eee; +} + +.scroll_table::-webkit-scrollbar-thumb { + border-radius: 5px; + background: #666; +} + +.ult_bt { + width: 20%; + height: 80%; +} + +.info_bt{ + width: 10% +} + +.search_bt{ + margin-left: 3%; + margin-top: 0.8%; + margin-bottom: 0.8%; +} + +.notFind{ + margin-top: 5%; + text-align: center; + font-size: 150%; +} + +.search_table { + margin-bottom: 1%; + padding-bottom: 1%; + border-bottom: solid 1px gray; + width: 100%; +} + +.search_tb { + padding-right: 2%; + padding-top: 0.2%; + padding-bottom: 0.2%; +} + +.leftSearch_tb{ + width: 35%; +} + +.batchMsg{ + color: red; + font-size: 120%; + text-align: center; + +} + +._form { + width: 95%; + margin-left: 3%; +} + +.result_info { + text-align: right; +} + +/*施設検索一覧ヘッダー*/ +.instSearchHeaderTable{ + width: 100%; +} + +.instSearchHeaderTd{ + width: 24%; +} + +.instSearchHeaderTdCenter{ + text-align: center; + width: 50%; +} + +.instSearchHeaderTdRight{ + text-align: right; + padding-right: 2%; +} + +.instSearchButchMsg{ + font-size: 80%; + color: red; +} + +.instSearchHeader_bt{ + width: 40%; +} + + +/*施設詳細*/ +.instInfoTable{ + margin-top: 1%; + margin-left: 5%; + margin-right: 2%; + margin-bottom: 2%; + width: 93%; +} + +.instInfoTableHalf1{ + margin-top: 1%; + margin-left: 5%; + margin-right: 2%; + width: 93%; +} + +.instInfoTableHalf2{ + margin-top: -0.05%; + margin-left: 5%; + margin-right: 2%; + margin-bottom: 2%; + width: 93%; +} + +.instInfoColumn { + width : 9%; + height: 40px; + background : rgb(225, 233, 250); + border : solid 1px; +} + +.instData { + background : rgb(244, 244, 244); + border : solid 1px; + padding-left : 0.5%; + padding-right : 0.5%; + padding-top: 0.25%; + padding-bottom: 0.25%; +} + +.instDataMid{ + /*NO5修正前 width: 51%;*/ + width: 20%; +} + +/*NO5にて追加 START*/ +.instDataLarge{ + width: 85%; +} + +.instDataLeft{ + width: 20%; +} + +.instDataCenter{ + width: 7%; +} + +.instDataRight{ + width: 25%; +} +/*NO5にて追加 END*/ + +.instDataSmallTextbox{ + width: 45%; +} + +/*NO5にて追加 START*/ +.instDataCenterTextbox{ + width: 80%; +} +/*NO5にて追加 END*/ + +.instInfoTextbox{ + width: 98%; + padding-right: 1%; + padding-left: 1%; +} + +.instCdTextbox{ + /*NO5修正前 width: 13%;*/ + width: 35%; + margin-left: 0.5%; + margin-right: 2%; +} + +.delReasonCdTextbox{ + /*NO5修正前 width: 2%;*/ + width: 5%; + margin-left: 0.5%; + margin-right: 1%; +} + +.delReasonTextbox{ + /*NO5修正前 width: 43%;*/ + width: 88%; + margin-left: 0.5%; + margin-right: 2%; +} + +.manageTextbox{ + width: 40%; +} + +.textboxMargin { + margin-left : 0.1%; +} + +.transitionBt{ + width: 98%; + height: 30px; +} + +.instHeaderTable{ + margin-left: 40%; +} + +.instHeaderTd{ + width: 10%; + font-size: 140%; + text-align: center; + padding-right: 2%; +} + +.trtCourseTextbox{ + width: 6%; +} + +.bedTd{ + width: 46%; +} + +.bedTextbox{ + width: 70%; +} + +.xSmallTd{ + width: 9%; +} + +.xSmallTextbox{ + width: 75%; +} + +.reExamTd{ + width: 13%; +} + +.repreTd{ + width: 50%; +} + +.repreTextbox{ + width: 95%; +} + +.trtTextbox{ + width: 5%; + margin-right: 1.2%; +} + +.parentCdTextBox{ + width: 15%; +} + +.parentNameTextBox{ + width: 75%; +} + +.hpInfoColumn{ + width : 12%; + height: 40px; + background : rgb(225, 233, 250); + border : solid 1px; +} + +.hpAssrtTd{ + width: 12%; +} + +.hpAssrtTextbox{ + width: 85%; +} + +.border_bottom_none { + border-bottom-style:none; +} + +.numberBox{ + text-align: right; +} + +/*医師検索*/ +/*ヘッダー*/ +.docHeaderTable{ + width: 100%; +} + +.docHeaderTd{ + width: 24%; +} + +.docHeaderTdCenter{ + text-align: center; + width: 50%; +} + +.docHeaderTdRight{ + text-align: right; + padding-right: 2%; +} + +.docButchMsg{ + /* font-size: 80%; */ + color: red; +} + +.docHeader_bt{ + width: 40%;s +} + +/* アルトマーク課題管理表No.2の修正 8% → 10% */ +/* アルトマーク課題管理表No.8の修正 10% → 14% */ +.docSearchColumnTd{ + width: 14%; +} + +.docSearchTextboxTd{ + width: 18%; +} + +.docSearchTextbox_td{ + width: 94%; +} + +.docSearchTextbox{ + width: 90%; + margin-right: 5%; + margin-top: 0.8%; + margin-bottom: 0.8%; +} + +.docSearchTableDivOne{ + width: 100%; +} + +.docSearchTableDivTwo{ + margin-bottom: 1%; + padding-bottom: 1%; + border-bottom: solid 1px gray; + width: 100%; +} + +.docSearchScroll{ + overflow: auto; + white-space: nowrap; + margin-bottom: 2%; + width: 100%; + height: 270px; +} + +.docSearchScroll::-webkit-scrollbar { + height: 5px; + width: 10px; +} + +.docSearchScroll::-webkit-scrollbar-track { + border-radius: 5px; + background: #eee; +} + +.docSearchScroll::-webkit-scrollbar-thumb { + border-radius: 5px; + background: #666; +} + +.allOnOffButton{ + width: 6%; +} + +/*医師情報*/ +.docInfoTable{ + margin-top: 1%; + margin-left: 5%; + margin-right: 2%; + margin-bottom: 1%; + width: 93%; + border-bottom: solid 1px gray; +} + +.docInfoTd{ + padding-bottom: 0.5%; +} + +.docInfoTextBox{ + margin-left: 0.5%; + margin-right: 2%; + width: 8%; +} + +.docInfoTrtTextBox{ + margin-left: 0.5%; +} + +.docBelongTable{ + margin-left: 1%; + width: 98%; + border-bottom: solid 1px gray; +} + +.docBelongTd{ + width: 49%; + height: 150px; +} + +.docSocietyTable{ + width: 100%; +} + +.scroll{ + overflow: auto; + height: 120px; + width: 90%; + margin-left: 7%; + margin-bottom: 4%; +} + +.scroll::-webkit-scrollbar { + height: 5px; + width: 10px; +} + +.scroll::-webkit-scrollbar-track { + border-radius: 5px; + background: #eee; +} + +.scroll::-webkit-scrollbar-thumb { + border-radius: 5px; + background: #666; +} + +.rightBoderLine{ + border-right: solid 1px gray; +} + +.wrkplaceH1{ + margin-top: 0.3%; +} + +.wrkplaceTable{ + width: 100%; +} + + + + + + + +/* 生物由来検索、施設検索共通*/ + + + +.clear_bt{ + margin-left: 120px; + width: 60px +} + +.back_bt{ + margin-left: 1042px; + width: 80px +} + +.noLine{ + text-decoration: none; +} + + +/*アルトマーク施設検索*/ + + +/*共通:アルトマーク施設検索,医師検索,施設詳細*/ +.maxWidth_tb { + width: 100%; +} + +/*アルトマーク施設検索,医師検索共通*/ + +.search_btTd { + text-align: right; +} + +.selection { + display: none; +} + +#page-1 { + display: block; +} + + +/*医師検索*/ +.search_middleTd { + padding-right: 25px; + width : 450px; +} + +.docSearchScroll_div { + overflow: auto; + height: 200px; + width: 1132px; +} + +/*共通:施設詳細、医師詳細*/ +.transition{ + text-align: right; + margin-right: 60px; +} + + + + + +.data_width_middle { + width : 300px; +} + + +.border_top_none { + border-top-style:none; +} + + + +.textbox_margin_short { + margin-left : 5px; +} + +.label_margin { + margin-left: 10px; + margin-right: 10px; +} + + +/*医師詳細*/ +.docInfo_table{ + margin-bottom: 30px; + border-bottom: solid 1px gray; + width: 1132px; +} + +.small_tb{ + width: 100px; +} + +.docBelongScroll_div { + overflow: auto; + height: 100px; + width: 500px; + margin: 0px 30px 0px 30px; +} + +.rightPadding_table{ + padding-right: 50px; +} + + +.docPlaceScroll_div { + overflow: auto; + height: 150px; + width: 700px; + margin: 0px 30px 0px 30px; +} + +.result_tr{ + overflow-y: scroll; + overflow-x: scroll; +} + +.result_data{ + overflow-y: scroll; + overflow-x: scroll; + width: 50px; +} + +/* tablesoter */ +table.tablesorter { + font-family:arial; + background-color: #CDCDCD; + font-size: 8pt; + text-align: left; +} + +table.tablesorter thead tr th, table.tablesorter tfoot tr th { + background-color: #e6EEEE; + border: 0.1px solid silver; + font-size: 8pt; + padding: 4px; + padding-right: 20px; +} +table.tablesorter thead tr .header { + background-image: url(bg.gif); + background-repeat: no-repeat; + background-position: center right; + cursor: pointer; +} +table.tablesorter tbody td { + color: #3D3D3D; + padding: 4px; + background-color: #FFF; + border: 0.1px solid silver; + vertical-align: top; +} +table.tablesorter tbody tr.odd td { + background-color:#F0F0F6; +} +table.tablesorter thead tr .headerSortUp { + background-image: url(asc.gif); +} +table.tablesorter thead tr .headerSortDown { + background-image: url(desc.gif); +} +table.tablesorter thead tr .headerSortDown, table.tablesorter thead tr .headerSortUp { + background-color: #8dbdd8; +} diff --git a/ecs/jskult-webapp/src/static/function/businessLogicScript.js b/ecs/jskult-webapp/src/static/function/businessLogicScript.js index 90ecc18b..f55e7858 100644 --- a/ecs/jskult-webapp/src/static/function/businessLogicScript.js +++ b/ecs/jskult-webapp/src/static/function/businessLogicScript.js @@ -211,3 +211,63 @@ function DisplayErrorDialog(strMesssage) { $("#errorTxt").html(strMesssage); $("#error").dialog("open"); } + +/* ult.jsから移植 */ +// チェックボックス全選択関数 +// 条件:チェックボックスのクラス名に"selected"というのがついていること +// 条件:ボタンにクラス名 send がついていること +function allOn(){ + $(".selected").prop("checked", true); + $(".send").prop('disabled',false); +} + +// チェックボックス全解除関数 +// 条件:チェックボックスのクラス名に"selectedページ数"というのがついていること +// 条件:ボタンにクラス名 send がついていること +function allOff(){ + $(".selected").prop("checked", false); + $(".send").prop('disabled',true); +} + +// 検索結果のところのボタンをチェックが1個でも付いたら押せるようにして、チェックがなければ押せないようにする関数 +// 条件:チェックボックスのクラス名に"selected"というのがついていること +// 条件:ボタンにクラス名 send がついていること +function resultBtDisablead(){ + var cnt1 = $('.checkNum input:checkbox:checked').length; + console.log(cnt1); + if(cnt1 == 0) { + $(".send").prop('disabled',true); + } + else { + $(".send").prop('disabled',false); + } +} + +// Enter押下時にsubmitさせなくする +$(function() { + $(document).on("keypress", "input:not(.allow_submit)", function(event) { + return event.which !== 13; + }); +}); + +// 数字-以外を許さない入力チェック +function checkNumberForm($this) +{ + var str=$this.value; + while(str.match(/[^\d\-]/)) + { + str=str.replace(/[^\d\-]/,""); + } + $this.value=str; +} + +// 数字以外を許さない入力チェック +function checkNumberOnlyForm($this) +{ + var str=$this.value; + while(str.match(/[^\d]/)) + { + str=str.replace(/[^\d]/,""); + } + $this.value=str; +} \ No newline at end of file diff --git a/ecs/jskult-webapp/src/templates/docSearch.html b/ecs/jskult-webapp/src/templates/docSearch.html new file mode 100644 index 00000000..214ea399 --- /dev/null +++ b/ecs/jskult-webapp/src/templates/docSearch.html @@ -0,0 +1,744 @@ + + + + + + {% with subtitle = '医師検索一覧' %} + {% include '_header.html' %} + {% endwith %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

医師検索一覧

+ +
日次バッチ処理中のため、データが正しく表示されない可能性があります
+ + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
医師コード: + + + 氏名(漢字): + + + 氏名(かな・カナ): + + +
勤務先コード: + + + 勤務先名(漢字): + + + 勤務先名(かな・カナ): + + +
勤務先都道府県: + + + 所属部科(漢字): + + + 診療科目(漢字): + + +
出身大学(漢字): + + + 卒年: + + +
+
+ + +
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
医師コード氏名勤務先名所属部科診療科目役職名出身大学卒年
+ + +
+ + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/ecs/jskult-webapp/src/templates/menu.html b/ecs/jskult-webapp/src/templates/menu.html index beda056b..58f05375 100644 --- a/ecs/jskult-webapp/src/templates/menu.html +++ b/ecs/jskult-webapp/src/templates/menu.html @@ -11,7 +11,7 @@

MeDaCA
機能メニュー



{% if menu.is_available_ult_doctor_menu() %} - Ultmarc照会(医師)

+ Ultmarc照会(医師)

{% endif %} {% if menu.is_available_ult_inst_menu() %} Ultmarc照会(施設)

From f6050ee47170ef7a1eeba919165bfbbfff0d464d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 30 May 2023 16:19:32 +0900 Subject: [PATCH 02/24] =?UTF-8?q?=E6=A4=9C=E7=B4=A2=E7=94=BB=E9=9D=A2?= =?UTF-8?q?=E8=A1=A8=E7=A4=BA=E3=81=AF=E5=AE=8C=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/ultmarc.py | 7 +- .../src/model/db/prefc_master.py | 8 ++ .../model/view/ultmarc_doctor_view_model.py | 113 ++++++++++++++++++ .../repositories/prefc_master_repository.py | 31 +++++ .../src/services/ultmarc_view_service.py | 111 +++++++++++++++++ .../src/templates/docSearch.html | 8 +- 6 files changed, 274 insertions(+), 4 deletions(-) create mode 100644 ecs/jskult-webapp/src/model/db/prefc_master.py create mode 100644 ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py create mode 100644 ecs/jskult-webapp/src/repositories/prefc_master_repository.py create mode 100644 ecs/jskult-webapp/src/services/ultmarc_view_service.py diff --git a/ecs/jskult-webapp/src/controller/ultmarc.py b/ecs/jskult-webapp/src/controller/ultmarc.py index 2f1bd5eb..ed966685 100644 --- a/ecs/jskult-webapp/src/controller/ultmarc.py +++ b/ecs/jskult-webapp/src/controller/ultmarc.py @@ -11,6 +11,7 @@ from src.model.view.bio_view_model import BioViewModel from src.router.session_router import AuthenticatedRoute from src.services.batch_status_service import BatchStatusService from src.services.bio_view_service import BioViewService +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 @@ -27,14 +28,14 @@ router.route_class = AuthenticatedRoute def ultmarc_view( request: Request, # batch_status_service:BatchStatusService=Depends(get_service(BatchStatusService)), - # bio_service: BioViewService=Depends(get_service(BioViewService)) + ultmarc_service: UltmarcViewService = Depends(get_service(UltmarcViewService)) ): session: UserSession = request.session # バッチ処理中の場合、機能を利用させない # if batch_status_service.is_batch_processing(): # raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BATCH_PROCESSING) # # 検索項目の取得 - # bio = bio_service.prepare_bio_view(session) + ultmarc = ultmarc_service.prepare_ultmarc_doctor_view(session) # セッション書き換え session.update( actions=[ @@ -46,7 +47,7 @@ def ultmarc_view( templates_response = templates.TemplateResponse( 'docSearch.html', { 'request': request, - # 'bio': bio, + 'ultmarc': ultmarc, }, headers={'session_key': session_key} ) diff --git a/ecs/jskult-webapp/src/model/db/prefc_master.py b/ecs/jskult-webapp/src/model/db/prefc_master.py new file mode 100644 index 00000000..5010149e --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/prefc_master.py @@ -0,0 +1,8 @@ +from typing import Optional + +from src.model.db.base_db_model import BaseDBModel + + +class PrefcMasterModel(BaseDBModel): + prefc_cd: Optional[str] + prefc_name: Optional[str] diff --git a/ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py new file mode 100644 index 00000000..1e3cf236 --- /dev/null +++ b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py @@ -0,0 +1,113 @@ +import json +from collections import OrderedDict +from datetime import datetime +from typing import Optional + +from pydantic import BaseModel + +from src.model.db.prefc_master import PrefcMasterModel +from src.model.db.wholesaler_master import WholesalerMasterModel +from src.model.request.bio import BioModel +from src.model.view.bio_disp_model import BisDisplayModel +from src.system_var import environment + + +class UltmarcDoctorViewModel(BaseModel): + subtitle: str = '医師検索一覧' + batch_status: Optional[str] + prefc_models: list[PrefcMasterModel] + doctor_data: Optional[list[BisDisplayModel]] = [] + form_data: Optional[BioModel] + + def display_wholesaler_names(self): + display_names = [ + f'{whs_model.rec_whs_cd}-{whs_model.rec_whs_sub_cd}:{whs_model.nm}' + for whs_model in self.whs_models + ] + return display_names + + 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_selected_whs_name(self, selected_wholesaler): + # if not self.is_form_submitted(): + # return '' + + # form_wholesaler_full_name = f'{self.form_data.wholesaler_code}-{self.form_data.wholesaler_sub_code}:{self.form_data.wholesaler_name}' + # return self._selected_value(form_wholesaler_full_name, selected_wholesaler) + + # def is_selected_org_kbn(self, selected_org_kbn): + # if not self.is_form_submitted(): + # return '' + # return self._selected_value(self.form_data.org_kbn, selected_org_kbn) + + # def is_input_rec_ymd_from(self): + # if not self.is_form_submitted(): + # return '' + + # return self._format_date_string(self.form_data.rec_ymd_from) + + # def is_input_rec_ymd_to(self): + # if not self.is_form_submitted(): + # return '' + + # return self._format_date_string(self.form_data.rec_ymd_to) + + # def is_input_lot_num(self): + # if not self.is_form_submitted(): + # return '' + + # return self.form_data.rec_lot_num or '' + + # def is_selected_data_kbn(self, selected_data_kbn): + # if not self.is_form_submitted(): + # return '' + + # return self._selected_value(self.form_data.data_kbn, selected_data_kbn) + + def is_selected_prefc_cd(self, selected_prefc_cd): + if not self.is_form_submitted(): + return '' + return '' + # return self._selected_value(self.form_data.maker_cd, selected_prefc_cd) + + # def is_input_rev_hsdnymd_srk_from(self): + # if not self.is_form_submitted(): + # return '' + + # return self._format_date_string(self.form_data.rev_hsdnymd_srk_from) + + # def is_input_rev_hsdnymd_srk_to(self): + # if not self.is_form_submitted(): + # return '' + + # return self._format_date_string(self.form_data.rev_hsdnymd_srk_to) + + # def is_checked_iko_flg(self): + # if not self.is_form_submitted(): + # return '' + + # return 'checked' if self.form_data.ikoFlg else '' + + 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.BIO_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') + + def _selected_value(self, form_value: str, current_value: str): + return 'selected' if form_value == current_value else '' diff --git a/ecs/jskult-webapp/src/repositories/prefc_master_repository.py b/ecs/jskult-webapp/src/repositories/prefc_master_repository.py new file mode 100644 index 00000000..a8cf288f --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/prefc_master_repository.py @@ -0,0 +1,31 @@ +from src.model.db.prefc_master import PrefcMasterModel +from src.repositories.base_repository import BaseRepository + + +class PrefcMasterRepository(BaseRepository): + + FETCH_SQL = """\ + SELECT DISTINCT + com_inst.prefc_cd AS prefc_cd, + mst_prefc.prefc_name AS prefc_name + FROM + src05.com_inst + JOIN src05.mst_prefc ON com_inst.prefc_cd = mst_prefc.prefc_cd + ORDER BY + mst_prefc.prefc_cd + """ + + def fetch_all(self) -> list[PrefcMasterModel]: + try: + self._database.connect() + result = self._database.execute_select(self.FETCH_SQL) + result_data = [res for res in result] + models = [PrefcMasterModel(**r) for r in result_data] + return models + except Exception as e: + # TODO: ファイルへの書き出しはloggerでやる + print(f"[ERROR] getOroshiData DB Error. ") + print(f"[ERROR] ErrorMessage: {e.args}") + raise e + finally: + self._database.disconnect() diff --git a/ecs/jskult-webapp/src/services/ultmarc_view_service.py b/ecs/jskult-webapp/src/services/ultmarc_view_service.py new file mode 100644 index 00000000..6d296f74 --- /dev/null +++ b/ecs/jskult-webapp/src/services/ultmarc_view_service.py @@ -0,0 +1,111 @@ +import os.path as path +import shutil +from datetime import datetime + +import pandas as pd + +from src.aws.aws_api_client import AWSAPIClient +from src.aws.s3 import S3Client +from src.model.internal.session import UserSession +from src.model.request.bio import BioModel +from src.model.view.bio_disp_model import BisDisplayModel +from src.model.view.ultmarc_doctor_view_model import UltmarcDoctorViewModel +from src.repositories.base_repository import BaseRepository +from src.repositories.bio_sales_view_repository import BioSalesViewRepository +from src.repositories.prefc_master_repository import PrefcMasterRepository +from src.repositories.pharmacy_product_master_repository import \ + PharmacyProductMasterRepository +from src.repositories.wholesaler_master_repository import \ + WholesalerMasterRepository +from src.services.base_service import BaseService +from src.system_var import constants, environment + + +class UltmarcViewService(BaseService): + REPOSITORIES = { + 'ultmarc_doctor_repository': WholesalerMasterRepository, + 'prefc_repository': PrefcMasterRepository + } + + ultmarc_doctor_repository: WholesalerMasterRepository + prefc_repository: PrefcMasterRepository + + def __init__(self, repositories: dict[str, BaseRepository], clients: dict[str, AWSAPIClient]) -> None: + super().__init__(repositories, clients) + self.ultmarc_doctor_repository = repositories['ultmarc_doctor_repository'] + self.prefc_repository = repositories['prefc_repository'] + + def prepare_ultmarc_doctor_view( + self, + session: UserSession + ) -> UltmarcDoctorViewModel: + # # 都道府県リストを取得 + prefcs = self.prefc_repository.fetch_all() + + ultmarc = UltmarcDoctorViewModel( + prefc_models=prefcs + ) + return ultmarc + + def search_bio_data(self, search_params: BioModel): + # 生物由来データを検索 + bio_sales_view_data = self.bio_sales_repository.fetch_many(parameter=search_params) + # 画面表示用に加工 + display_bio_data: list[BisDisplayModel] = [BisDisplayModel(data) for data in bio_sales_view_data] + + return display_bio_data + + def search_download_bio_data(self, search_params: BioModel): + # 生物由来データをダウンロードするために、DBから検索した結果をデータフレームに変換 + bio_sales_data_frame = self.bio_sales_repository.fetch_as_data_frame(parameter=search_params) + return bio_sales_data_frame + + def write_excel_file(self, data_frame: pd.DataFrame, user_id: str, timestamp: datetime): + # Excelに書き込み + output_file_path = path.join(constants.BIO_TEMPORARY_FILE_DIR_PATH, + f'Result_{user_id}_{timestamp:%Y%m%d%H%M%S%f}.xlsx') + + # テンプレートファイルをコピーして出力ファイルの枠だけを作る + shutil.copyfile( + src=constants.BIO_EXCEL_TEMPLATE_FILE_PATH, + dst=output_file_path + ) + # ExcelWriterの追記モード(`mode`='a')でファイルを開く + # `engine``='openpyxlは、追記モードでExcelを開くためのおまじない(xlsxしか動作しないが、こちらが出すものなので問題ナシ) + # 既存シートへの書き込みは、`if_sheet_exists='overlay'を指定する + with pd.ExcelWriter(output_file_path, engine='openpyxl', mode='a', if_sheet_exists='overlay') as writer: + # `sheet_name`引数を省略した場合は、「Sheet1」に書き込む。 + # DF内のヘッダと連番を書き込みたくない場合、`header`と`index`をFalseに指定する。 + # `startrow`と`startcol`で、Excelの書き込み位置を決定する。省略した場合はA1セルから書く。 + data_frame.to_excel(writer, header=False, index=False, startrow=1, startcol=0) + + return output_file_path + + def write_csv_file(self, data_frame: pd.DataFrame, user_id: str, header: list[str], timestamp: datetime): + # csvに書き込み + output_file_path = path.join(constants.BIO_TEMPORARY_FILE_DIR_PATH, + f'Result_{user_id}_{timestamp:%Y%m%d%H%M%S%f}.csv') + # 横長のDataFrameとするため、ヘッダーの加工処理 + header_data = {} + for df_column, header_column in zip(data_frame.columns, header): + header_data[df_column] = header_column + + header_df = pd.DataFrame([header_data], index=None) + output_df = pd.concat([header_df, data_frame]) + # ヘッダー行としてではなく、1レコードとして出力する + output_df.to_csv(output_file_path, index=False, header=False) + + return output_file_path + + def upload_bio_data_file(self, local_file_path: str) -> None: + bucket_name = environment.BIO_ACCESS_LOG_BUCKET + # TODO: フォルダを変える + file_key = f'bio/{path.basename(local_file_path)}' + self.s3_client.upload_file(local_file_path, bucket_name, file_key) + + def generate_download_file_url(self, local_file_path: str, user_id: str, kind: str) -> str: + bucket_name = environment.BIO_ACCESS_LOG_BUCKET + # TODO: フォルダを変える + file_key = f'bio/{path.basename(local_file_path)}' + download_filename = f'{user_id}_生物由来卸販売データ.{kind}' + return self.s3_client.generate_presigned_url(bucket_name, file_key, download_filename) diff --git a/ecs/jskult-webapp/src/templates/docSearch.html b/ecs/jskult-webapp/src/templates/docSearch.html index 214ea399..45189de3 100644 --- a/ecs/jskult-webapp/src/templates/docSearch.html +++ b/ecs/jskult-webapp/src/templates/docSearch.html @@ -11,7 +11,7 @@ require_once('/home/nds_dwh/webroot/common/function/getDateBatchJSString.php'); - {% with subtitle = '医師検索一覧' %} + {% with subtitle = ultmarc.subtitle %} {% include '_header.html' %} {% endwith %} @@ -231,6 +231,12 @@ if (!isset($isDBSuccess)) { + 氏名(漢字): - + @@ -196,7 +195,7 @@ if (!isset($isDBSuccess)) { 氏名(かな・カナ): - + @@ -205,14 +204,14 @@ if (!isset($isDBSuccess)) { 勤務先コード: - + 勤務先名(漢字): - + @@ -220,7 +219,7 @@ if (!isset($isDBSuccess)) { 勤務先名(かな・カナ): - + @@ -231,7 +230,7 @@ if (!isset($isDBSuccess)) { 勤務先都道府県: - {% for prefc in ultmarc.prefc_models %} @@ -253,14 +252,14 @@ if (!isset($isDBSuccess)) { 所属部科(漢字): - + 診療科目(漢字): - + @@ -269,18 +268,18 @@ if (!isset($isDBSuccess)) { 出身大学(漢字): - + 卒年: - + - + From 45c6af090c7832b14dc6e4475b0bcc7a8f2d4f8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Fri, 2 Jun 2023 10:33:16 +0900 Subject: [PATCH 05/24] =?UTF-8?q?SQL=E3=82=A8=E3=83=A9=E3=83=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/ultmarc.py | 7 +- ecs/jskult-webapp/src/db/sql_condition.py | 13 +- .../src/model/db/ultmarc_doctor.py | 19 +++ .../model/view/ultmarc_doctor_view_model.py | 86 ++++++++++--- .../repositories/ultmarc_doctor_repository.py | 120 ++++++++++++++++++ .../src/services/ultmarc_view_service.py | 110 ++++++++-------- ecs/jskult-webapp/src/templates/_header.html | 3 + .../src/templates/bioSearchList.html | 5 +- .../src/templates/docSearch.html | 83 +++++------- 9 files changed, 314 insertions(+), 132 deletions(-) create mode 100644 ecs/jskult-webapp/src/model/db/ultmarc_doctor.py create mode 100644 ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py diff --git a/ecs/jskult-webapp/src/controller/ultmarc.py b/ecs/jskult-webapp/src/controller/ultmarc.py index 19d43e5e..a42d1ccc 100644 --- a/ecs/jskult-webapp/src/controller/ultmarc.py +++ b/ecs/jskult-webapp/src/controller/ultmarc.py @@ -73,16 +73,19 @@ def search_doc( # 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_doctor_data = ultmarc_service.search_doctor_data(ultmarc_doctor_form) + # 検索項目などのデータを取得 ultmarc = ultmarc_service.prepare_ultmarc_doctor_view(session) ultmarc.is_batch_processing = batch_status_service.is_batch_processing() ultmarc.doctor_data = ultmarc_doctor_data + ultmarc.form_data = ultmarc_doctor_form # bio: BioViewModel = bio_service.prepare_bio_view(session) # bio.bio_data = ultmarc_doctor_data # bio.form_data = bio_form + # セッション書き換え session.update( actions=[ diff --git a/ecs/jskult-webapp/src/db/sql_condition.py b/ecs/jskult-webapp/src/db/sql_condition.py index dfd73858..f0f929a3 100644 --- a/ecs/jskult-webapp/src/db/sql_condition.py +++ b/ecs/jskult-webapp/src/db/sql_condition.py @@ -4,7 +4,7 @@ class SQLCondition: param: str literal: bool - def __init__(self, column: str, operator: str, param: str, literal=False) -> None: + def __init__(self, column: str, operator: str, param: str, literal=False, like_wildcard=False) -> None: """ Args: column (str): カラム名 @@ -12,17 +12,22 @@ class SQLCondition: param (str): パラメータ(プレースホルダーかリテラル値か) literal (bool, optional): リテラル値を埋め込むかどうか。 画面から渡ってきた値を使うとSQLインジェクションの危険性があるため、固定値で使用すること。 + like_wildcard (bool, optional): like検索で部分一致検索にするかどうか。 """ self.column = column self.operator = operator self.param = param - self.literal=literal - + self.literal = literal + self.like_wildcard = like_wildcard + def apply(self): # literalがFalseならプレースホルダー。Trueだったならは固定値。 param = f':{self.param}' if self.literal is False else self.param + # like_wildcardがTrueならLike検索にする + param = f'%{param}%' if self.like_wildcard is False else param return f' {self.column} {self.operator} {param}' + # 定数 EQ = '=' NE = '<>' @@ -32,4 +37,4 @@ GE = '>=' LE = '<=' LIKE = 'LIKE' IS = 'IS' -IS_NOT = 'IS NOT' \ No newline at end of file +IS_NOT = 'IS NOT' diff --git a/ecs/jskult-webapp/src/model/db/ultmarc_doctor.py b/ecs/jskult-webapp/src/model/db/ultmarc_doctor.py new file mode 100644 index 00000000..f5576a02 --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/ultmarc_doctor.py @@ -0,0 +1,19 @@ +from typing import Optional + +from src.model.db.base_db_model import BaseDBModel +from src.util.sanitize import sanitize + + +@sanitize +class UltmarcDoctorDBModel(BaseDBModel): + dcf_pcf_dr_cd: Optional[str] + dr_name: Optional[str] + form_inst_name_kanji: Optional[str] + dcf_dsf_inst_cd: Optional[str] + blng_sec_name: Optional[str] + trt_course_name: Optional[str] + form_post_name: Optional[str] + alma: Optional[str] + grad_y: Optional[str] + prefc_name: Optional[str] + blng_sec_cd: Optional[str] diff --git a/ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py index 894573e4..02ac88a0 100644 --- a/ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py +++ b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py @@ -6,8 +6,8 @@ from typing import Optional from pydantic import BaseModel from src.model.db.prefc_master import PrefcMasterModel -from src.model.db.wholesaler_master import WholesalerMasterModel -from src.model.request.bio import BioModel +# from src.model.db.doctor_view import DoctorViewModel +from src.model.request.ultmarc_doctor import UltmarcDoctorModel from src.model.view.bio_disp_model import BisDisplayModel from src.system_var import environment @@ -16,13 +16,14 @@ class UltmarcDoctorViewModel(BaseModel): subtitle: str = '医師検索一覧' is_batch_processing: Optional[bool] prefc_models: list[PrefcMasterModel] + # doctor_models: list[DoctorViewModel] doctor_data: Optional[list[BisDisplayModel]] = [] - form_data: Optional[BioModel] + form_data: Optional[UltmarcDoctorModel] def display_wholesaler_names(self): display_names = [ f'{whs_model.rec_whs_cd}-{whs_model.rec_whs_sub_cd}:{whs_model.nm}' - for whs_model in self.whs_models + for whs_model in self.doctor_models ] return display_names @@ -30,13 +31,74 @@ class UltmarcDoctorViewModel(BaseModel): 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_selected_whs_name(self, selected_wholesaler): - # if not self.is_form_submitted(): - # return '' + # 医師コード + def is_input_dcf_pcf_dr_cd(self): + if not self.is_form_submitted(): + return '' + return self.form_data.dcf_pcf_dr_cd - # form_wholesaler_full_name = f'{self.form_data.wholesaler_code}-{self.form_data.wholesaler_sub_code}:{self.form_data.wholesaler_name}' - # return self._selected_value(form_wholesaler_full_name, selected_wholesaler) + # 氏名(漢字) + def is_input_dr_name(self): + if not self.is_form_submitted(): + return '' + return self.form_data.dr_name + + # 氏名(かな・カナ) + def is_input_dr_name_kana(self): + if not self.is_form_submitted(): + return '' + return self.form_data.dr_name_kana + + # 勤務先コード + def is_input_dcf_dsf_inst_cd(self): + if not self.is_form_submitted(): + return '' + return self.form_data.dcf_dsf_inst_cd + + # 勤務先名(漢字) + def is_input_form_inst_name_kanji(self): + if not self.is_form_submitted(): + return '' + return self.form_data.form_inst_name_kanji + + # 勤務先名(かな・カナ) + def is_input_form_inst_name_kana(self): + if not self.is_form_submitted(): + return '' + return self.form_data.form_inst_name_kana + + # 勤務先都道府県 + def is_selected_prefc_cd(self, selected_prefc_cd): + if not self.is_form_submitted(): + return '' + return self._selected_value(self.form_data.prefc_cd, selected_prefc_cd) + + # 所属部科(漢字) + def is_input_blng_sec_name(self): + if not self.is_form_submitted(): + return '' + return self.form_data.blng_sec_name + + # 診療科目(漢字) + def is_input_trt_course_name(self): + if not self.is_form_submitted(): + return '' + return self.form_data.trt_course_name + + # 出身大学(漢字) + def is_input_alma(self): + if not self.is_form_submitted(): + return '' + return self.form_data.alma + + # 卒年 + def is_grad_y(self): + if not self.is_form_submitted(): + return '' + return self.form_data.grad_y +# ************************** のま作 ************************** # def is_selected_org_kbn(self, selected_org_kbn): # if not self.is_form_submitted(): @@ -67,12 +129,6 @@ class UltmarcDoctorViewModel(BaseModel): # return self._selected_value(self.form_data.data_kbn, selected_data_kbn) - def is_selected_prefc_cd(self, selected_prefc_cd): - if not self.is_form_submitted(): - return '' - return '' - # return self._selected_value(self.form_data.maker_cd, selected_prefc_cd) - # def is_input_rev_hsdnymd_srk_from(self): # if not self.is_form_submitted(): # return '' diff --git a/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py new file mode 100644 index 00000000..5321ba46 --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py @@ -0,0 +1,120 @@ +from src.model.db.ultmarc_doctor import UltmarcDoctorDBModel +from src.repositories.base_repository import BaseRepository +from src.db import sql_condition as condition +from src.db.sql_condition import SQLCondition +from src.model.request.ultmarc_doctor import UltmarcDoctorModel +from src.repositories.base_repository import BaseRepository +from src.util.string_util import is_not_empty + + +class UltmarcDoctorRepository(BaseRepository): + + FETCH_SQL = """\ + SELECT + com_dr.dcf_pcf_dr_cd, + com_dr.dr_name, + com_inst.form_inst_name_kanji, + com_inst.dcf_dsf_inst_cd, + com_blng_sec.blng_sec_name, + com_trt_course.trt_course_name, + com_post.form_post_name, + com_alma.alma, + com_dr.grad_y, + mst_prefc.prefc_name, + com_dr_wrkplace.blng_sec_cd + FROM + src05.com_dr + LEFT JOIN src05.mst_prefc ON com_dr.prefc_cd = mst_prefc.prefc_cd + 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_dr_trt_course ON com_dr.dcf_pcf_dr_cd = com_dr_trt_course.dcf_pcf_dr_cd + LEFT JOIN src05.com_trt_course ON com_dr_trt_course.trt_course_cd = com_trt_course.trt_course_cd + LEFT JOIN src05.com_post ON com_dr_wrkplace.post_cd = com_post.post_cd + LEFT JOIN src05.com_alma ON com_dr.alma_cd = com_alma.alma_cd + WHERE + {where_clause} + ORDER BY + com_dr.dcf_pcf_dr_cd, + com_dr_wrkplace.dcf_dsf_inst_cd, + com_dr_wrkplace.blng_sec_cd, + com_dr_trt_course.trt_course_cd + \ + """ + + def fetch_many(self, parameter: UltmarcDoctorModel) -> list[UltmarcDoctorDBModel]: + try: + self._database.connect() + where_clause = self.__build_condition(parameter) + query = self.FETCH_SQL.format(where_clause=where_clause) + result = self._database.execute_select(query, parameter.dict()) + models = [UltmarcDoctorDBModel(**r) for r in result] + + return models + except Exception as e: + # TODO: ファイルへの書き出しはloggerでやる + print(f"[ERROR] DB Error : Exception={e.args}") + raise e + finally: + self._database.disconnect() + + def __build_condition(self, parameter: UltmarcDoctorModel): + where_clauses: list[SQLCondition] = [] + + # 医師コード + if is_not_empty(parameter.dcf_pcf_dr_cd): + # 必ず部分一致で検索 + where_clauses.append(SQLCondition('com_dr.dcf_pcf_dr_cd', condition.LIKE, + 'dcf_pcf_dr_cd', like_wildcard=True)) + # 氏名(漢字) + if is_not_empty(parameter.dr_name): + # 必ず部分一致で検索 + where_clauses.append(SQLCondition('dr_name', condition.LIKE, 'dr_name', like_wildcard=True)) + # 氏名(かな・カナ) + if is_not_empty(parameter.dr_name_kana): + # 必ず部分一致で検索 + where_clauses.append(SQLCondition('dr_name_kana', condition.LIKE, 'dr_name_kana', like_wildcard=True)) + # 勤務先コード + if is_not_empty(parameter.dcf_dsf_inst_cd): + # 必ず部分一致で検索 + where_clauses.append(SQLCondition('com_inst.dcf_dsf_inst_cd', + condition.LIKE, 'dcf_dsf_inst_cd', like_wildcard=True)) + # 勤務先名(漢字) + if is_not_empty(parameter.form_inst_name_kanji): + # 必ず部分一致で検索 + where_clauses.append(SQLCondition('form_inst_name_kanji', condition.LIKE, + 'form_inst_name_kanji', like_wildcard=True)) + # 勤務先名(かな・カナ) + if is_not_empty(parameter.form_inst_name_kana): + # 必ず部分一致で検索 + where_clauses.append(SQLCondition('form_inst_name_kana', condition.LIKE, + 'form_inst_name_kana', like_wildcard=True)) + + # 勤務先都道府県 + if is_not_empty(parameter.prefc_cd): + where_clauses.append(SQLCondition('com_inst.prefc_cd', condition.EQ, 'prefc_cd')) + + # 所属部科(漢字) + if is_not_empty(parameter.blng_sec_name): + # 必ず部分一致で検索 + where_clauses.append(SQLCondition('com_blng_sec.blng_sec_name', + condition.LIKE, 'blng_sec_name', like_wildcard=True)) + + # 診療科目(漢字) + if is_not_empty(parameter.trt_course_name): + # 必ず部分一致で検索 + where_clauses.append(SQLCondition('trt_course_name', condition.LIKE, 'trt_course_name', like_wildcard=True)) + + # 出身大学(漢字) + if is_not_empty(parameter.alma): + # 必ず部分一致で検索 + where_clauses.append(SQLCondition('alma', condition.LIKE, 'alma', like_wildcard=True)) + + # 卒年 + if is_not_empty(parameter.grad_y): + # 必ず部分一致で検索 + where_clauses.append(SQLCondition('grad_y', condition.LIKE, 'grad_y', like_wildcard=True)) + + where_clauses_str = ' AND '.join([condition.apply() for condition in where_clauses]) + + return where_clauses_str diff --git a/ecs/jskult-webapp/src/services/ultmarc_view_service.py b/ecs/jskult-webapp/src/services/ultmarc_view_service.py index 6d296f74..0fd38f18 100644 --- a/ecs/jskult-webapp/src/services/ultmarc_view_service.py +++ b/ecs/jskult-webapp/src/services/ultmarc_view_service.py @@ -7,12 +7,13 @@ import pandas as pd from src.aws.aws_api_client import AWSAPIClient from src.aws.s3 import S3Client from src.model.internal.session import UserSession -from src.model.request.bio import BioModel +from src.model.request.ultmarc_doctor import UltmarcDoctorModel from src.model.view.bio_disp_model import BisDisplayModel from src.model.view.ultmarc_doctor_view_model import UltmarcDoctorViewModel from src.repositories.base_repository import BaseRepository from src.repositories.bio_sales_view_repository import BioSalesViewRepository from src.repositories.prefc_master_repository import PrefcMasterRepository +from src.repositories.ultmarc_doctor_repository import UltmarcDoctorRepository from src.repositories.pharmacy_product_master_repository import \ PharmacyProductMasterRepository from src.repositories.wholesaler_master_repository import \ @@ -23,11 +24,11 @@ from src.system_var import constants, environment class UltmarcViewService(BaseService): REPOSITORIES = { - 'ultmarc_doctor_repository': WholesalerMasterRepository, + 'ultmarc_doctor_repository': UltmarcDoctorRepository, 'prefc_repository': PrefcMasterRepository } - ultmarc_doctor_repository: WholesalerMasterRepository + ultmarc_doctor_repository: UltmarcDoctorRepository prefc_repository: PrefcMasterRepository def __init__(self, repositories: dict[str, BaseRepository], clients: dict[str, AWSAPIClient]) -> None: @@ -47,65 +48,62 @@ class UltmarcViewService(BaseService): ) return ultmarc - def search_bio_data(self, search_params: BioModel): - # 生物由来データを検索 - bio_sales_view_data = self.bio_sales_repository.fetch_many(parameter=search_params) - # 画面表示用に加工 - display_bio_data: list[BisDisplayModel] = [BisDisplayModel(data) for data in bio_sales_view_data] + def search_doctor_data(self, search_params: UltmarcDoctorModel): + # 医師データを検索 + ultmarc_doctor_data = self.ultmarc_doctor_repository.fetch_many(parameter=search_params) + return ultmarc_doctor_data - return display_bio_data + # def search_download_bio_data(self, search_params: BioModel): + # # 生物由来データをダウンロードするために、DBから検索した結果をデータフレームに変換 + # bio_sales_data_frame = self.bio_sales_repository.fetch_as_data_frame(parameter=search_params) + # return bio_sales_data_frame - def search_download_bio_data(self, search_params: BioModel): - # 生物由来データをダウンロードするために、DBから検索した結果をデータフレームに変換 - bio_sales_data_frame = self.bio_sales_repository.fetch_as_data_frame(parameter=search_params) - return bio_sales_data_frame + # def write_excel_file(self, data_frame: pd.DataFrame, user_id: str, timestamp: datetime): + # # Excelに書き込み + # output_file_path = path.join(constants.BIO_TEMPORARY_FILE_DIR_PATH, + # f'Result_{user_id}_{timestamp:%Y%m%d%H%M%S%f}.xlsx') - def write_excel_file(self, data_frame: pd.DataFrame, user_id: str, timestamp: datetime): - # Excelに書き込み - output_file_path = path.join(constants.BIO_TEMPORARY_FILE_DIR_PATH, - f'Result_{user_id}_{timestamp:%Y%m%d%H%M%S%f}.xlsx') + # # テンプレートファイルをコピーして出力ファイルの枠だけを作る + # shutil.copyfile( + # src=constants.BIO_EXCEL_TEMPLATE_FILE_PATH, + # dst=output_file_path + # ) + # # ExcelWriterの追記モード(`mode`='a')でファイルを開く + # # `engine``='openpyxlは、追記モードでExcelを開くためのおまじない(xlsxしか動作しないが、こちらが出すものなので問題ナシ) + # # 既存シートへの書き込みは、`if_sheet_exists='overlay'を指定する + # with pd.ExcelWriter(output_file_path, engine='openpyxl', mode='a', if_sheet_exists='overlay') as writer: + # # `sheet_name`引数を省略した場合は、「Sheet1」に書き込む。 + # # DF内のヘッダと連番を書き込みたくない場合、`header`と`index`をFalseに指定する。 + # # `startrow`と`startcol`で、Excelの書き込み位置を決定する。省略した場合はA1セルから書く。 + # data_frame.to_excel(writer, header=False, index=False, startrow=1, startcol=0) - # テンプレートファイルをコピーして出力ファイルの枠だけを作る - shutil.copyfile( - src=constants.BIO_EXCEL_TEMPLATE_FILE_PATH, - dst=output_file_path - ) - # ExcelWriterの追記モード(`mode`='a')でファイルを開く - # `engine``='openpyxlは、追記モードでExcelを開くためのおまじない(xlsxしか動作しないが、こちらが出すものなので問題ナシ) - # 既存シートへの書き込みは、`if_sheet_exists='overlay'を指定する - with pd.ExcelWriter(output_file_path, engine='openpyxl', mode='a', if_sheet_exists='overlay') as writer: - # `sheet_name`引数を省略した場合は、「Sheet1」に書き込む。 - # DF内のヘッダと連番を書き込みたくない場合、`header`と`index`をFalseに指定する。 - # `startrow`と`startcol`で、Excelの書き込み位置を決定する。省略した場合はA1セルから書く。 - data_frame.to_excel(writer, header=False, index=False, startrow=1, startcol=0) + # return output_file_path - return output_file_path + # def write_csv_file(self, data_frame: pd.DataFrame, user_id: str, header: list[str], timestamp: datetime): + # # csvに書き込み + # output_file_path = path.join(constants.BIO_TEMPORARY_FILE_DIR_PATH, + # f'Result_{user_id}_{timestamp:%Y%m%d%H%M%S%f}.csv') + # # 横長のDataFrameとするため、ヘッダーの加工処理 + # header_data = {} + # for df_column, header_column in zip(data_frame.columns, header): + # header_data[df_column] = header_column - def write_csv_file(self, data_frame: pd.DataFrame, user_id: str, header: list[str], timestamp: datetime): - # csvに書き込み - output_file_path = path.join(constants.BIO_TEMPORARY_FILE_DIR_PATH, - f'Result_{user_id}_{timestamp:%Y%m%d%H%M%S%f}.csv') - # 横長のDataFrameとするため、ヘッダーの加工処理 - header_data = {} - for df_column, header_column in zip(data_frame.columns, header): - header_data[df_column] = header_column + # header_df = pd.DataFrame([header_data], index=None) + # output_df = pd.concat([header_df, data_frame]) + # # ヘッダー行としてではなく、1レコードとして出力する + # output_df.to_csv(output_file_path, index=False, header=False) - header_df = pd.DataFrame([header_data], index=None) - output_df = pd.concat([header_df, data_frame]) - # ヘッダー行としてではなく、1レコードとして出力する - output_df.to_csv(output_file_path, index=False, header=False) + # return output_file_path - return output_file_path + # def upload_bio_data_file(self, local_file_path: str) -> None: + # bucket_name = environment.BIO_ACCESS_LOG_BUCKET + # # TODO: フォルダを変える + # file_key = f'bio/{path.basename(local_file_path)}' + # self.s3_client.upload_file(local_file_path, bucket_name, file_key) - def upload_bio_data_file(self, local_file_path: str) -> None: - bucket_name = environment.BIO_ACCESS_LOG_BUCKET - # TODO: フォルダを変える - file_key = f'bio/{path.basename(local_file_path)}' - self.s3_client.upload_file(local_file_path, bucket_name, file_key) - - def generate_download_file_url(self, local_file_path: str, user_id: str, kind: str) -> str: - bucket_name = environment.BIO_ACCESS_LOG_BUCKET - # TODO: フォルダを変える - file_key = f'bio/{path.basename(local_file_path)}' - download_filename = f'{user_id}_生物由来卸販売データ.{kind}' - return self.s3_client.generate_presigned_url(bucket_name, file_key, download_filename) + # def generate_download_file_url(self, local_file_path: str, user_id: str, kind: str) -> str: + # bucket_name = environment.BIO_ACCESS_LOG_BUCKET + # # TODO: フォルダを変える + # file_key = f'bio/{path.basename(local_file_path)}' + # download_filename = f'{user_id}_生物由来卸販売データ.{kind}' + # return self.s3_client.generate_presigned_url(bucket_name, file_key, download_filename) diff --git a/ecs/jskult-webapp/src/templates/_header.html b/ecs/jskult-webapp/src/templates/_header.html index ae41e99c..01a1521a 100644 --- a/ecs/jskult-webapp/src/templates/_header.html +++ b/ecs/jskult-webapp/src/templates/_header.html @@ -6,9 +6,12 @@ + + + diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index cc208efd..d44247c1 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -5,10 +5,7 @@ {% include '_header.html' %} {% endwith %} - - - - + @@ -180,14 +177,16 @@ if (!isset($isDBSuccess)) { 医師コード: - + 氏名(漢字): - + @@ -195,7 +194,8 @@ if (!isset($isDBSuccess)) { 氏名(かな・カナ): - + @@ -204,14 +204,16 @@ if (!isset($isDBSuccess)) { 勤務先コード: - + 勤務先名(漢字): - + @@ -219,7 +221,8 @@ if (!isset($isDBSuccess)) { 勤務先名(かな・カナ): - + @@ -252,14 +255,16 @@ if (!isset($isDBSuccess)) { 所属部科(漢字): - + 診療科目(漢字): - + @@ -268,13 +273,15 @@ if (!isset($isDBSuccess)) { 出身大学(漢字): - + 卒年: - + @@ -672,7 +679,7 @@ if (!isset($isDBSuccess)) { $(function() { // スピナー出さない場合は以下、エスケープせず埋め込む // {% autoescape False%} - let searchResultString = '{}' + let searchResultString = '{{ultmarc.ultmarc_data_json_str()}}' // {% endautoescape%} const searchResultData = JSON.parse(searchResultString) if (searchResultData.length == 0) { @@ -699,43 +706,17 @@ if (!isset($isDBSuccess)) { function pagination_content(datas) { const display_keys = [ - 'slip_org_kbn', - 'slip_mgt_no', - 'rec_ymd', - 'rec_whs_cd', - 'rec_whs_sub_cd', - 'whs_nm', - 'rec_whs_org_cd', - 'rec_urag_no', - 'rev_hsdnymd_srk', - 'rec_tran_kbn', - 'tran_kbn_nm', - 'mkr_cd', - 'rec_comm_cd', - 'comm_nm', - 'whs_rep_comm_nm', - 'nnsk_cd', - 'rec_nnskfcl_nm', - 'whs_rep_nnskfcl_nm', - 'rec_nnsk_fcl_addr', - 'whs_rep_nnsk_fcl_addr', - 'rec_lot_num', - 'amt_fugo', - 'expr_dt', - 'data_kbn', - 'lot_no_err_flg', - 'bef_slip_mgt_no', - 'ins_usr', - 'ins_dt', - 'inst_cd', - 'inst_name_form', - 'address', - 'tel_no', - 'v_whs_cd', - 'v_whsorg_cd', - 'whs_org_nm', - 'v_tran_cd', - 'iko_flg', + 'dcf_pcf_dr_cd', + 'dr_name', + 'form_inst_name_kanji', + 'dcf_dsf_inst_cd', + 'blng_sec_name', + 'trt_course_name', + 'form_post_name', + 'alma', + 'grad_y', + 'prefc_name', + 'blng_sec_cd' ]; const tableRow = document.createElement('tr') return datas.map(function (data) { From 79d241aa18cf304c135a56042ebf8f862b3378fb Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 2 Jun 2023 11:45:50 +0900 Subject: [PATCH 06/24] =?UTF-8?q?feat:=20=E5=8C=BB=E5=B8=AB=E3=81=AE?= =?UTF-8?q?=E9=83=A8=E5=88=86=E4=B8=80=E8=87=B4=E6=A4=9C=E7=B4=A2=E3=81=AB?= =?UTF-8?q?=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/db/sql_condition.py | 6 +-- .../repositories/ultmarc_doctor_repository.py | 44 ++++++++++++------- 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/ecs/jskult-webapp/src/db/sql_condition.py b/ecs/jskult-webapp/src/db/sql_condition.py index f0f929a3..d0d645c7 100644 --- a/ecs/jskult-webapp/src/db/sql_condition.py +++ b/ecs/jskult-webapp/src/db/sql_condition.py @@ -4,7 +4,7 @@ class SQLCondition: param: str literal: bool - def __init__(self, column: str, operator: str, param: str, literal=False, like_wildcard=False) -> None: + def __init__(self, column: str, operator: str, param: str, literal=False) -> None: """ Args: column (str): カラム名 @@ -12,19 +12,15 @@ class SQLCondition: param (str): パラメータ(プレースホルダーかリテラル値か) literal (bool, optional): リテラル値を埋め込むかどうか。 画面から渡ってきた値を使うとSQLインジェクションの危険性があるため、固定値で使用すること。 - like_wildcard (bool, optional): like検索で部分一致検索にするかどうか。 """ self.column = column self.operator = operator self.param = param self.literal = literal - self.like_wildcard = like_wildcard def apply(self): # literalがFalseならプレースホルダー。Trueだったならは固定値。 param = f':{self.param}' if self.literal is False else self.param - # like_wildcardがTrueならLike検索にする - param = f'%{param}%' if self.like_wildcard is False else param return f' {self.column} {self.operator} {param}' diff --git a/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py index 5321ba46..f9651d98 100644 --- a/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py +++ b/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py @@ -1,7 +1,6 @@ -from src.model.db.ultmarc_doctor import UltmarcDoctorDBModel -from src.repositories.base_repository import BaseRepository from src.db import sql_condition as condition from src.db.sql_condition import SQLCondition +from src.model.db.ultmarc_doctor import UltmarcDoctorDBModel from src.model.request.ultmarc_doctor import UltmarcDoctorModel from src.repositories.base_repository import BaseRepository from src.util.string_util import is_not_empty @@ -35,8 +34,8 @@ class UltmarcDoctorRepository(BaseRepository): WHERE {where_clause} ORDER BY - com_dr.dcf_pcf_dr_cd, - com_dr_wrkplace.dcf_dsf_inst_cd, + com_dr.dcf_pcf_dr_cd, + com_dr_wrkplace.dcf_dsf_inst_cd, com_dr_wrkplace.blng_sec_cd, com_dr_trt_course.trt_course_cd \ @@ -45,9 +44,11 @@ class UltmarcDoctorRepository(BaseRepository): def fetch_many(self, parameter: UltmarcDoctorModel) -> list[UltmarcDoctorDBModel]: try: self._database.connect() - where_clause = self.__build_condition(parameter) + # 文字列の検索を部分一致にするため、モデルをコピー。以降はこのコピーを使用する。 + clone_parameter = UltmarcDoctorModel(**parameter.dict()) + where_clause = self.__build_condition(clone_parameter) query = self.FETCH_SQL.format(where_clause=where_clause) - result = self._database.execute_select(query, parameter.dict()) + result = self._database.execute_select(query, clone_parameter.dict()) models = [UltmarcDoctorDBModel(**r) for r in result] return models @@ -64,31 +65,36 @@ class UltmarcDoctorRepository(BaseRepository): # 医師コード if is_not_empty(parameter.dcf_pcf_dr_cd): # 必ず部分一致で検索 - where_clauses.append(SQLCondition('com_dr.dcf_pcf_dr_cd', condition.LIKE, - 'dcf_pcf_dr_cd', like_wildcard=True)) + parameter.dcf_pcf_dr_cd = f'%{parameter.dcf_pcf_dr_cd}%' + where_clauses.append(SQLCondition('com_dr.dcf_pcf_dr_cd', condition.LIKE, 'dcf_pcf_dr_cd')) # 氏名(漢字) if is_not_empty(parameter.dr_name): # 必ず部分一致で検索 - where_clauses.append(SQLCondition('dr_name', condition.LIKE, 'dr_name', like_wildcard=True)) + parameter.dr_name = f'%{parameter.dr_name}%' + where_clauses.append(SQLCondition('dr_name', condition.LIKE, 'dr_name')) # 氏名(かな・カナ) if is_not_empty(parameter.dr_name_kana): # 必ず部分一致で検索 - where_clauses.append(SQLCondition('dr_name_kana', condition.LIKE, 'dr_name_kana', like_wildcard=True)) + parameter.dr_name_kana = f'%{parameter.dr_name_kana}%' + where_clauses.append(SQLCondition('dr_name_kana', condition.LIKE, 'dr_name_kana')) # 勤務先コード if is_not_empty(parameter.dcf_dsf_inst_cd): # 必ず部分一致で検索 + parameter.dcf_dsf_inst_cd = f'%{parameter.dcf_dsf_inst_cd}%' where_clauses.append(SQLCondition('com_inst.dcf_dsf_inst_cd', - condition.LIKE, 'dcf_dsf_inst_cd', like_wildcard=True)) + condition.LIKE, 'dcf_dsf_inst_cd')) # 勤務先名(漢字) if is_not_empty(parameter.form_inst_name_kanji): # 必ず部分一致で検索 + parameter.form_inst_name_kanji = f'%{parameter.form_inst_name_kanji}%' where_clauses.append(SQLCondition('form_inst_name_kanji', condition.LIKE, - 'form_inst_name_kanji', like_wildcard=True)) + 'form_inst_name_kanji')) # 勤務先名(かな・カナ) if is_not_empty(parameter.form_inst_name_kana): # 必ず部分一致で検索 + parameter.form_inst_name_kana = f'%{parameter.form_inst_name_kana}%' where_clauses.append(SQLCondition('form_inst_name_kana', condition.LIKE, - 'form_inst_name_kana', like_wildcard=True)) + 'form_inst_name_kana')) # 勤務先都道府県 if is_not_empty(parameter.prefc_cd): @@ -97,23 +103,27 @@ class UltmarcDoctorRepository(BaseRepository): # 所属部科(漢字) if is_not_empty(parameter.blng_sec_name): # 必ず部分一致で検索 + parameter.blng_sec_name = f'%{parameter.blng_sec_name}%' where_clauses.append(SQLCondition('com_blng_sec.blng_sec_name', - condition.LIKE, 'blng_sec_name', like_wildcard=True)) + condition.LIKE, 'blng_sec_name')) # 診療科目(漢字) if is_not_empty(parameter.trt_course_name): # 必ず部分一致で検索 - where_clauses.append(SQLCondition('trt_course_name', condition.LIKE, 'trt_course_name', like_wildcard=True)) + parameter.trt_course_name = f'%{parameter.trt_course_name}%' + where_clauses.append(SQLCondition('trt_course_name', condition.LIKE, 'trt_course_name')) # 出身大学(漢字) if is_not_empty(parameter.alma): # 必ず部分一致で検索 - where_clauses.append(SQLCondition('alma', condition.LIKE, 'alma', like_wildcard=True)) + parameter.alma = f'%{parameter.alma}%' + where_clauses.append(SQLCondition('alma', condition.LIKE, 'alma')) # 卒年 if is_not_empty(parameter.grad_y): # 必ず部分一致で検索 - where_clauses.append(SQLCondition('grad_y', condition.LIKE, 'grad_y', like_wildcard=True)) + parameter.grad_y = f'%{parameter.grad_y}%' + where_clauses.append(SQLCondition('grad_y', condition.LIKE, 'grad_y')) where_clauses_str = ' AND '.join([condition.apply() for condition in where_clauses]) From 90944307ae85e361e85888bcab245c39fb16bea4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Fri, 2 Jun 2023 16:27:12 +0900 Subject: [PATCH 07/24] =?UTF-8?q?=E5=8C=BB=E5=B8=AB=E6=A4=9C=E7=B4=A2?= =?UTF-8?q?=E7=94=BB=E9=9D=A2=EF=BC=BF=E6=A4=9C=E7=B4=A2=E8=A1=A8=E7=A4=BA?= =?UTF-8?q?=E3=81=AF=E5=AE=8C=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/ultmarc.py | 5 - .../model/view/ultmarc_doctor_view_model.py | 80 +-- .../repositories/ultmarc_doctor_repository.py | 16 +- .../src/services/ultmarc_view_service.py | 61 -- ecs/jskult-webapp/src/static/css/ultStyle.css | 38 +- .../src/templates/docSearch.html | 574 +----------------- 6 files changed, 65 insertions(+), 709 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/ultmarc.py b/ecs/jskult-webapp/src/controller/ultmarc.py index a42d1ccc..133f6c64 100644 --- a/ecs/jskult-webapp/src/controller/ultmarc.py +++ b/ecs/jskult-webapp/src/controller/ultmarc.py @@ -66,7 +66,6 @@ def search_doc( ultmarc_service: UltmarcViewService = Depends(get_service(UltmarcViewService)), batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) ): - # error_log(date("Y/m/d H:i:s") . " [INFO] UserId:" . $UserId . "\r\n", 3, "$execLog"); session: UserSession = request.session # バッチ処理中の場合、機能を利用させない # is_batch_processing = batch_status_service.is_batch_processing() @@ -82,10 +81,6 @@ def search_doc( ultmarc.doctor_data = ultmarc_doctor_data ultmarc.form_data = ultmarc_doctor_form - # bio: BioViewModel = bio_service.prepare_bio_view(session) - # bio.bio_data = ultmarc_doctor_data - # bio.form_data = bio_form - # セッション書き換え session.update( actions=[ diff --git a/ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py index 02ac88a0..ea2afe48 100644 --- a/ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py +++ b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py @@ -6,7 +6,6 @@ from typing import Optional from pydantic import BaseModel from src.model.db.prefc_master import PrefcMasterModel -# from src.model.db.doctor_view import DoctorViewModel from src.model.request.ultmarc_doctor import UltmarcDoctorModel from src.model.view.bio_disp_model import BisDisplayModel from src.system_var import environment @@ -16,58 +15,49 @@ class UltmarcDoctorViewModel(BaseModel): subtitle: str = '医師検索一覧' is_batch_processing: Optional[bool] prefc_models: list[PrefcMasterModel] - # doctor_models: list[DoctorViewModel] doctor_data: Optional[list[BisDisplayModel]] = [] form_data: Optional[UltmarcDoctorModel] - def display_wholesaler_names(self): - display_names = [ - f'{whs_model.rec_whs_cd}-{whs_model.rec_whs_sub_cd}:{whs_model.nm}' - for whs_model in self.doctor_models - ] - return display_names - 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): if not self.is_form_submitted(): return '' - return self.form_data.dcf_pcf_dr_cd + return self.form_data.dcf_pcf_dr_cd or '' # 氏名(漢字) def is_input_dr_name(self): if not self.is_form_submitted(): return '' - return self.form_data.dr_name + return self.form_data.dr_name or '' # 氏名(かな・カナ) def is_input_dr_name_kana(self): if not self.is_form_submitted(): return '' - return self.form_data.dr_name_kana + return self.form_data.dr_name_kana or '' # 勤務先コード def is_input_dcf_dsf_inst_cd(self): if not self.is_form_submitted(): return '' - return self.form_data.dcf_dsf_inst_cd + return self.form_data.dcf_dsf_inst_cd or '' # 勤務先名(漢字) def is_input_form_inst_name_kanji(self): if not self.is_form_submitted(): return '' - return self.form_data.form_inst_name_kanji + return self.form_data.form_inst_name_kanji or '' # 勤務先名(かな・カナ) def is_input_form_inst_name_kana(self): if not self.is_form_submitted(): return '' - return self.form_data.form_inst_name_kana + return self.form_data.form_inst_name_kana or '' # 勤務先都道府県 def is_selected_prefc_cd(self, selected_prefc_cd): @@ -79,73 +69,25 @@ class UltmarcDoctorViewModel(BaseModel): def is_input_blng_sec_name(self): if not self.is_form_submitted(): return '' - return self.form_data.blng_sec_name + return self.form_data.blng_sec_name or '' # 診療科目(漢字) def is_input_trt_course_name(self): if not self.is_form_submitted(): return '' - return self.form_data.trt_course_name + return self.form_data.trt_course_name or '' # 出身大学(漢字) def is_input_alma(self): if not self.is_form_submitted(): return '' - return self.form_data.alma + return self.form_data.alma or '' # 卒年 - def is_grad_y(self): + def is_input_grad_y(self): if not self.is_form_submitted(): return '' - return self.form_data.grad_y -# ************************** のま作 ************************** - - # def is_selected_org_kbn(self, selected_org_kbn): - # if not self.is_form_submitted(): - # return '' - # return self._selected_value(self.form_data.org_kbn, selected_org_kbn) - - # def is_input_rec_ymd_from(self): - # if not self.is_form_submitted(): - # return '' - - # return self._format_date_string(self.form_data.rec_ymd_from) - - # def is_input_rec_ymd_to(self): - # if not self.is_form_submitted(): - # return '' - - # return self._format_date_string(self.form_data.rec_ymd_to) - - # def is_input_lot_num(self): - # if not self.is_form_submitted(): - # return '' - - # return self.form_data.rec_lot_num or '' - - # def is_selected_data_kbn(self, selected_data_kbn): - # if not self.is_form_submitted(): - # return '' - - # return self._selected_value(self.form_data.data_kbn, selected_data_kbn) - - # def is_input_rev_hsdnymd_srk_from(self): - # if not self.is_form_submitted(): - # return '' - - # return self._format_date_string(self.form_data.rev_hsdnymd_srk_from) - - # def is_input_rev_hsdnymd_srk_to(self): - # if not self.is_form_submitted(): - # return '' - - # return self._format_date_string(self.form_data.rev_hsdnymd_srk_to) - - # def is_checked_iko_flg(self): - # if not self.is_form_submitted(): - # return '' - - # return 'checked' if self.form_data.ikoFlg else '' + return self.form_data.grad_y or '' def disabled_button(self): return 'disabled' if self.is_data_empty() or self.is_data_overflow_max_length() else '' diff --git a/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py index f9651d98..f9293893 100644 --- a/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py +++ b/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py @@ -81,20 +81,20 @@ class UltmarcDoctorRepository(BaseRepository): if is_not_empty(parameter.dcf_dsf_inst_cd): # 必ず部分一致で検索 parameter.dcf_dsf_inst_cd = f'%{parameter.dcf_dsf_inst_cd}%' - where_clauses.append(SQLCondition('com_inst.dcf_dsf_inst_cd', - condition.LIKE, 'dcf_dsf_inst_cd')) + where_clauses.append(SQLCondition( + 'com_inst.dcf_dsf_inst_cd', condition.LIKE, 'dcf_dsf_inst_cd')) # 勤務先名(漢字) if is_not_empty(parameter.form_inst_name_kanji): # 必ず部分一致で検索 parameter.form_inst_name_kanji = f'%{parameter.form_inst_name_kanji}%' - where_clauses.append(SQLCondition('form_inst_name_kanji', condition.LIKE, - 'form_inst_name_kanji')) + where_clauses.append(SQLCondition( + 'form_inst_name_kanji', condition.LIKE, 'form_inst_name_kanji')) # 勤務先名(かな・カナ) if is_not_empty(parameter.form_inst_name_kana): # 必ず部分一致で検索 parameter.form_inst_name_kana = f'%{parameter.form_inst_name_kana}%' - where_clauses.append(SQLCondition('form_inst_name_kana', condition.LIKE, - 'form_inst_name_kana')) + where_clauses.append(SQLCondition( + 'form_inst_name_kana', condition.LIKE, 'form_inst_name_kana')) # 勤務先都道府県 if is_not_empty(parameter.prefc_cd): @@ -104,8 +104,8 @@ class UltmarcDoctorRepository(BaseRepository): if is_not_empty(parameter.blng_sec_name): # 必ず部分一致で検索 parameter.blng_sec_name = f'%{parameter.blng_sec_name}%' - where_clauses.append(SQLCondition('com_blng_sec.blng_sec_name', - condition.LIKE, 'blng_sec_name')) + where_clauses.append(SQLCondition( + 'com_blng_sec.blng_sec_name', condition.LIKE, 'blng_sec_name')) # 診療科目(漢字) if is_not_empty(parameter.trt_course_name): diff --git a/ecs/jskult-webapp/src/services/ultmarc_view_service.py b/ecs/jskult-webapp/src/services/ultmarc_view_service.py index 0fd38f18..140863e7 100644 --- a/ecs/jskult-webapp/src/services/ultmarc_view_service.py +++ b/ecs/jskult-webapp/src/services/ultmarc_view_service.py @@ -8,16 +8,10 @@ from src.aws.aws_api_client import AWSAPIClient from src.aws.s3 import S3Client from src.model.internal.session import UserSession from src.model.request.ultmarc_doctor import UltmarcDoctorModel -from src.model.view.bio_disp_model import BisDisplayModel from src.model.view.ultmarc_doctor_view_model import UltmarcDoctorViewModel from src.repositories.base_repository import BaseRepository -from src.repositories.bio_sales_view_repository import BioSalesViewRepository from src.repositories.prefc_master_repository import PrefcMasterRepository from src.repositories.ultmarc_doctor_repository import UltmarcDoctorRepository -from src.repositories.pharmacy_product_master_repository import \ - PharmacyProductMasterRepository -from src.repositories.wholesaler_master_repository import \ - WholesalerMasterRepository from src.services.base_service import BaseService from src.system_var import constants, environment @@ -52,58 +46,3 @@ class UltmarcViewService(BaseService): # 医師データを検索 ultmarc_doctor_data = self.ultmarc_doctor_repository.fetch_many(parameter=search_params) return ultmarc_doctor_data - - # def search_download_bio_data(self, search_params: BioModel): - # # 生物由来データをダウンロードするために、DBから検索した結果をデータフレームに変換 - # bio_sales_data_frame = self.bio_sales_repository.fetch_as_data_frame(parameter=search_params) - # return bio_sales_data_frame - - # def write_excel_file(self, data_frame: pd.DataFrame, user_id: str, timestamp: datetime): - # # Excelに書き込み - # output_file_path = path.join(constants.BIO_TEMPORARY_FILE_DIR_PATH, - # f'Result_{user_id}_{timestamp:%Y%m%d%H%M%S%f}.xlsx') - - # # テンプレートファイルをコピーして出力ファイルの枠だけを作る - # shutil.copyfile( - # src=constants.BIO_EXCEL_TEMPLATE_FILE_PATH, - # dst=output_file_path - # ) - # # ExcelWriterの追記モード(`mode`='a')でファイルを開く - # # `engine``='openpyxlは、追記モードでExcelを開くためのおまじない(xlsxしか動作しないが、こちらが出すものなので問題ナシ) - # # 既存シートへの書き込みは、`if_sheet_exists='overlay'を指定する - # with pd.ExcelWriter(output_file_path, engine='openpyxl', mode='a', if_sheet_exists='overlay') as writer: - # # `sheet_name`引数を省略した場合は、「Sheet1」に書き込む。 - # # DF内のヘッダと連番を書き込みたくない場合、`header`と`index`をFalseに指定する。 - # # `startrow`と`startcol`で、Excelの書き込み位置を決定する。省略した場合はA1セルから書く。 - # data_frame.to_excel(writer, header=False, index=False, startrow=1, startcol=0) - - # return output_file_path - - # def write_csv_file(self, data_frame: pd.DataFrame, user_id: str, header: list[str], timestamp: datetime): - # # csvに書き込み - # output_file_path = path.join(constants.BIO_TEMPORARY_FILE_DIR_PATH, - # f'Result_{user_id}_{timestamp:%Y%m%d%H%M%S%f}.csv') - # # 横長のDataFrameとするため、ヘッダーの加工処理 - # header_data = {} - # for df_column, header_column in zip(data_frame.columns, header): - # header_data[df_column] = header_column - - # header_df = pd.DataFrame([header_data], index=None) - # output_df = pd.concat([header_df, data_frame]) - # # ヘッダー行としてではなく、1レコードとして出力する - # output_df.to_csv(output_file_path, index=False, header=False) - - # return output_file_path - - # def upload_bio_data_file(self, local_file_path: str) -> None: - # bucket_name = environment.BIO_ACCESS_LOG_BUCKET - # # TODO: フォルダを変える - # file_key = f'bio/{path.basename(local_file_path)}' - # self.s3_client.upload_file(local_file_path, bucket_name, file_key) - - # def generate_download_file_url(self, local_file_path: str, user_id: str, kind: str) -> str: - # bucket_name = environment.BIO_ACCESS_LOG_BUCKET - # # TODO: フォルダを変える - # file_key = f'bio/{path.basename(local_file_path)}' - # download_filename = f'{user_id}_生物由来卸販売データ.{kind}' - # return self.s3_client.generate_presigned_url(bucket_name, file_key, download_filename) diff --git a/ecs/jskult-webapp/src/static/css/ultStyle.css b/ecs/jskult-webapp/src/static/css/ultStyle.css index 936cef77..3f1850d0 100644 --- a/ecs/jskult-webapp/src/static/css/ultStyle.css +++ b/ecs/jskult-webapp/src/static/css/ultStyle.css @@ -46,18 +46,18 @@ table{ } .scroll_table::-webkit-scrollbar { - height: 5px; - width: 10px; + height: 5px; + width: 10px; } .scroll_table::-webkit-scrollbar-track { - border-radius: 5px; - background: #eee; + border-radius: 5px; + background: #eee; } .scroll_table::-webkit-scrollbar-thumb { - border-radius: 5px; - background: #666; + border-radius: 5px; + background: #666; } .ult_bt { @@ -361,7 +361,7 @@ table{ } .docHeader_bt{ - width: 40%;s + width: 40%; } /* アルトマーク課題管理表No.2の修正 8% → 10% */ @@ -405,18 +405,18 @@ table{ } .docSearchScroll::-webkit-scrollbar { - height: 5px; - width: 10px; + height: 5px; + width: 10px; } .docSearchScroll::-webkit-scrollbar-track { - border-radius: 5px; - background: #eee; + border-radius: 5px; + background: #eee; } .docSearchScroll::-webkit-scrollbar-thumb { - border-radius: 5px; - background: #666; + border-radius: 5px; + background: #666; } .allOnOffButton{ @@ -471,18 +471,18 @@ table{ } .scroll::-webkit-scrollbar { - height: 5px; - width: 10px; + height: 5px; + width: 10px; } .scroll::-webkit-scrollbar-track { - border-radius: 5px; - background: #eee; + border-radius: 5px; + background: #eee; } .scroll::-webkit-scrollbar-thumb { - border-radius: 5px; - background: #666; + border-radius: 5px; + background: #666; } .rightBoderLine{ diff --git a/ecs/jskult-webapp/src/templates/docSearch.html b/ecs/jskult-webapp/src/templates/docSearch.html index dc187eb4..475578fa 100644 --- a/ecs/jskult-webapp/src/templates/docSearch.html +++ b/ecs/jskult-webapp/src/templates/docSearch.html @@ -1,13 +1,3 @@ - - @@ -16,137 +6,17 @@ require_once('/home/nds_dwh/webroot/common/function/getDateBatchJSString.php'); {% endwith %} - - - - - - - - - - - - - - @@ -155,17 +25,9 @@ if (!isset($isDBSuccess)) {

医師検索一覧

- {% if ultmarc.is_batch_processing %}
日次バッチ処理中のため、データが正しく表示されない可能性があります
{% endif %} - - - @@ -179,26 +41,16 @@ if (!isset($isDBSuccess)) { - 氏名(漢字): - - 氏名(かな・カナ): - @@ -206,35 +58,24 @@ if (!isset($isDBSuccess)) { - 勤務先名(漢字): - - 勤務先名(かな・カナ): - - 勤務先都道府県: - 所属部科(漢字): - 診療科目(漢字): - @@ -275,16 +101,10 @@ if (!isset($isDBSuccess)) { - 卒年: - + value="{{ultmarc.is_input_grad_y()}}" maxlength='4' oninput="formBtDisabled()"> @@ -293,223 +113,13 @@ if (!isset($isDBSuccess)) { - +
- - + - @@ -528,152 +138,15 @@ if (!isset($isDBSuccess)) { 卒年 - - - - - - - - - - - - -
- - - - - - - \ No newline at end of file From 16a62a9cfc431c6c309580ed56d0d47e1b948e5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 6 Jun 2023 11:43:18 +0900 Subject: [PATCH 08/24] =?UTF-8?q?=E5=8C=BB=E5=B8=AB=E6=83=85=E5=A0=B1?= =?UTF-8?q?=E6=A4=9C=E7=B4=A2=E7=B5=90=E6=9E=9C=EF=BC=91=E4=BB=B6=E8=A1=A8?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/ultmarc.py | 39 +- .../src/model/db/ultmarc_doctor_info.py | 18 + .../src/model/db/ultmarc_doctor_wrkplace.py | 15 + .../model/db/ultmarc_doctor_wrkplace_his.py | 16 + .../src/model/db/ultmarc_sosiety.py | 10 + .../model/db/ultmarc_specialist_license.py | 10 + .../src/model/db/ultmarc_trt_course.py | 9 + .../view/ultmarc_doctor_info_view_model.py | 97 ++++ .../repositories/ultmarc_doctor_repository.py | 39 +- .../ultmarc_dr_wrkplace_his_repository.py | 39 ++ .../ultmarc_dr_wrkplace_repository.py | 39 ++ .../ultmarc_sosiety_repository.py | 30 ++ .../ultmarc_specialist_license_repository.py | 31 ++ .../ultmarc_trt_course_repository.py | 31 ++ .../src/services/ultmarc_view_service.py | 53 +- ecs/jskult-webapp/src/templates/docInfo.html | 486 ++++++++++++++++++ .../src/templates/docSearch.html | 24 +- 17 files changed, 969 insertions(+), 17 deletions(-) create mode 100644 ecs/jskult-webapp/src/model/db/ultmarc_doctor_info.py create mode 100644 ecs/jskult-webapp/src/model/db/ultmarc_doctor_wrkplace.py create mode 100644 ecs/jskult-webapp/src/model/db/ultmarc_doctor_wrkplace_his.py create mode 100644 ecs/jskult-webapp/src/model/db/ultmarc_sosiety.py create mode 100644 ecs/jskult-webapp/src/model/db/ultmarc_specialist_license.py create mode 100644 ecs/jskult-webapp/src/model/db/ultmarc_trt_course.py create mode 100644 ecs/jskult-webapp/src/model/view/ultmarc_doctor_info_view_model.py create mode 100644 ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_his_repository.py create mode 100644 ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_repository.py create mode 100644 ecs/jskult-webapp/src/repositories/ultmarc_sosiety_repository.py create mode 100644 ecs/jskult-webapp/src/repositories/ultmarc_specialist_license_repository.py create mode 100644 ecs/jskult-webapp/src/repositories/ultmarc_trt_course_repository.py create mode 100644 ecs/jskult-webapp/src/templates/docInfo.html diff --git a/ecs/jskult-webapp/src/controller/ultmarc.py b/ecs/jskult-webapp/src/controller/ultmarc.py index 133f6c64..399ca6e4 100644 --- a/ecs/jskult-webapp/src/controller/ultmarc.py +++ b/ecs/jskult-webapp/src/controller/ultmarc.py @@ -7,10 +7,8 @@ from starlette import status from src.depends.services import get_service from src.model.internal.session import UserSession from src.model.request.ultmarc_doctor import UltmarcDoctorModel -from src.model.view.bio_view_model import BioViewModel from src.router.session_router import AuthenticatedRoute from src.services.batch_status_service import BatchStatusService -from src.services.bio_view_service import BioViewService from src.services.ultmarc_view_service import UltmarcViewService from src.services.session_service import set_session from src.system_var import constants @@ -97,3 +95,40 @@ def search_doc( headers={'session_key': session_key} ) return templates_response + + +@router.get('/docInfo') +def ultmarc_doctor_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() + + # 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) + # バッチ起動判定の取得 + ultmarc.is_batch_processing = is_batch_processing + + # セッション書き換え + 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( + 'docInfo.html', { + 'request': request, + 'ultmarc': ultmarc, + }, + headers={'session_key': session_key} + ) + return templates_response diff --git a/ecs/jskult-webapp/src/model/db/ultmarc_doctor_info.py b/ecs/jskult-webapp/src/model/db/ultmarc_doctor_info.py new file mode 100644 index 00000000..6f20dfb9 --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/ultmarc_doctor_info.py @@ -0,0 +1,18 @@ +from typing import Optional + +from src.model.db.base_db_model import BaseDBModel +from src.util.sanitize import sanitize + + +@sanitize +class UltmarcDoctorInfoDBModel(BaseDBModel): + dcf_pcf_dr_cd: Optional[str] + dr_name: Optional[str] + dr_name_kana: Optional[str] + sex: Optional[str] + birthday: Optional[str] + alma: Optional[str] + hometown: Optional[str] + grad_y: Optional[str] + drday_y: Optional[str] + estab_y: Optional[str] diff --git a/ecs/jskult-webapp/src/model/db/ultmarc_doctor_wrkplace.py b/ecs/jskult-webapp/src/model/db/ultmarc_doctor_wrkplace.py new file mode 100644 index 00000000..c8f555cc --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/ultmarc_doctor_wrkplace.py @@ -0,0 +1,15 @@ +from typing import Optional +from datetime import date + +from src.model.db.base_db_model import BaseDBModel +from src.util.sanitize import sanitize + + +@sanitize +class UltmarcDoctorWrkplaceDBModel(BaseDBModel): + dcf_dsf_inst_cd: Optional[str] + inst_name_kanji: Optional[str] + blng_sec_name: Optional[str] + univ_post_name: Optional[str] + post_name: Optional[str] + aply_start_ymd: Optional[date] diff --git a/ecs/jskult-webapp/src/model/db/ultmarc_doctor_wrkplace_his.py b/ecs/jskult-webapp/src/model/db/ultmarc_doctor_wrkplace_his.py new file mode 100644 index 00000000..3fe3de38 --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/ultmarc_doctor_wrkplace_his.py @@ -0,0 +1,16 @@ +from typing import Optional +from datetime import date + +from src.model.db.base_db_model import BaseDBModel +from src.util.sanitize import sanitize + + +@sanitize +class UltmarcDoctorWrkplaceHisDBModel(BaseDBModel): + dcf_dsf_inst_cd: Optional[str] + inst_name_kanji: Optional[str] + blng_sec_name: Optional[str] + univ_post_name: Optional[str] + post_name: Optional[str] + aply_start_ymd: Optional[date] + aply_end_ymd: Optional[date] diff --git a/ecs/jskult-webapp/src/model/db/ultmarc_sosiety.py b/ecs/jskult-webapp/src/model/db/ultmarc_sosiety.py new file mode 100644 index 00000000..ab76e4db --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/ultmarc_sosiety.py @@ -0,0 +1,10 @@ +from typing import Optional + +from src.model.db.base_db_model import BaseDBModel +from src.util.sanitize import sanitize + + +@sanitize +class UltmarcSosietyDBModel(BaseDBModel): + sosiety_cd: Optional[str] + sosiety_name: Optional[str] diff --git a/ecs/jskult-webapp/src/model/db/ultmarc_specialist_license.py b/ecs/jskult-webapp/src/model/db/ultmarc_specialist_license.py new file mode 100644 index 00000000..8cccb4eb --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/ultmarc_specialist_license.py @@ -0,0 +1,10 @@ +from typing import Optional + +from src.model.db.base_db_model import BaseDBModel +from src.util.sanitize import sanitize + + +@sanitize +class UltmarcSpecialistLicenseDBModel(BaseDBModel): + specialist_cd: Optional[str] + specialist_license_name: Optional[str] diff --git a/ecs/jskult-webapp/src/model/db/ultmarc_trt_course.py b/ecs/jskult-webapp/src/model/db/ultmarc_trt_course.py new file mode 100644 index 00000000..23908fce --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/ultmarc_trt_course.py @@ -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 UltmarcTrtCoursedbmodel(BaseDBModel): + trt_course_name: Optional[str] diff --git a/ecs/jskult-webapp/src/model/view/ultmarc_doctor_info_view_model.py b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_info_view_model.py new file mode 100644 index 00000000..1cfbcf5f --- /dev/null +++ b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_info_view_model.py @@ -0,0 +1,97 @@ +import json +from collections import OrderedDict +from datetime import datetime +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_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 + + +class UltmarcDoctorInfoViewModel(BaseModel): + subtitle: str = '医師情報' + is_batch_processing: Optional[bool] + doctor_info_data: Optional[UltmarcDoctorInfoDBModel] + trt_coursed_data: Optional[list[UltmarcTrtCoursedbmodel]] + sosiety_data: Optional[list[UltmarcSosietyDBModel]] + specialist_license_data: Optional[list[UltmarcSpecialistLicenseDBModel]] + doctor_wrkplace_data: Optional[list[UltmarcDoctorWrkplaceDBModel]] + doctor_wrkplace_his_data: Optional[list[UltmarcDoctorWrkplaceHisDBModel]] + + 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 '' + + # 氏名(漢字) + def is_input_dr_name(self): + return self.doctor_info_data.dr_name or '' + + # 氏名(かな・カナ) + def is_input_dr_name_kana(self): + return self.doctor_info_data.dr_name_kana or '' + + # 性別 + def is_input_sex(self): + return self.doctor_info_data.sex or '' + + # 出身大学 + def is_input_alma(self): + return self.doctor_info_data.alma or '' + + # 出身県 + def is_input_hometown(self): + return self.doctor_info_data.hometown or '' + + # 卒年 + def is_input_grad_y(self): + return self.doctor_info_data.grad_y or '' + + # 登録年 + def is_input_drday_y(self): + return self.doctor_info_data.drday_y or '' + + # 開業年 + def is_input_estab_y(self): + return self.doctor_info_data.estab_y or '' + + def is_input_birthday_fromat(self): + return self._format_date_string(self.doctor_info_data.birthday) + + def is_input_trt_course_data_size(self): + return len(self.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.BIO_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') + + def _selected_value(self, form_value: str, current_value: str): + return 'selected' if form_value == current_value else '' diff --git a/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py index f9293893..60f1543d 100644 --- a/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py +++ b/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py @@ -2,6 +2,7 @@ from src.db import sql_condition as condition from src.db.sql_condition import SQLCondition from src.model.db.ultmarc_doctor import UltmarcDoctorDBModel from src.model.request.ultmarc_doctor import UltmarcDoctorModel +from src.model.db.ultmarc_doctor_info import UltmarcDoctorInfoDBModel from src.repositories.base_repository import BaseRepository from src.util.string_util import is_not_empty @@ -15,7 +16,7 @@ class UltmarcDoctorRepository(BaseRepository): com_inst.form_inst_name_kanji, com_inst.dcf_dsf_inst_cd, com_blng_sec.blng_sec_name, - com_trt_course.trt_course_name, + GROUP_CONCAT(com_trt_course.trt_course_name separator ' / ') AS trt_course_name, com_post.form_post_name, com_alma.alma, com_dr.grad_y, @@ -33,6 +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 ORDER BY com_dr.dcf_pcf_dr_cd, com_dr_wrkplace.dcf_dsf_inst_cd, @@ -128,3 +130,38 @@ class UltmarcDoctorRepository(BaseRepository): where_clauses_str = ' AND '.join([condition.apply() for condition in where_clauses]) return where_clauses_str + + FETCH_ONE_SQL = """\ + SELECT + com_dr.dcf_pcf_dr_cd, + com_dr.dr_name, + com_dr.dr_name_kana, + com_sex.sex, + com_dr.birthday, + com_alma.alma, + com_hometown.hometown, + com_dr.grad_y, + com_dr.drday_y, + com_dr.estab_y + FROM src05.com_dr + LEFT JOIN src05.com_sex ON com_dr.sex_cd = com_sex.sex_cd + LEFT JOIN src05.com_alma ON com_dr.alma_cd = com_alma.alma_cd + LEFT JOIN src05.com_hometown ON com_dr.hometown_cd = com_hometown.hometown_cd + WHERE dcf_pcf_dr_cd = :id + """ + + def fetch_one(self, id) -> UltmarcDoctorInfoDBModel: + try: + self._database.connect() + query = self.FETCH_ONE_SQL + result = self._database.execute_select(query, {'id': id}) + models = [UltmarcDoctorInfoDBModel(**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() diff --git a/ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_his_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_his_repository.py new file mode 100644 index 00000000..14f0de45 --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_his_repository.py @@ -0,0 +1,39 @@ +from src.model.db.ultmarc_doctor_wrkplace_his import UltmarcDoctorWrkplaceHisDBModel +from src.repositories.base_repository import BaseRepository + + +class UltmarcDoctorWrkplaceHisRepository(BaseRepository): + + FETCH_SQL = """\ + SELECT + 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 + WHERE com_dr.dcf_pcf_dr_cd = :id + ORDER BY com_dr_wrkplace.aply_start_ymd DESC + """ + + def fetch_many(self, id) -> list[UltmarcDoctorWrkplaceHisDBModel]: + try: + self._database.connect() + query = self.FETCH_SQL + result = self._database.execute_select(query, {'id': id}) + models = [UltmarcDoctorWrkplaceHisDBModel(**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() diff --git a/ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_repository.py new file mode 100644 index 00000000..fd1295d7 --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_repository.py @@ -0,0 +1,39 @@ +from src.model.db.ultmarc_doctor_wrkplace import UltmarcDoctorWrkplaceDBModel +from src.repositories.base_repository import BaseRepository + + +class UltmarcDoctorWrkplaceRepository(BaseRepository): + + FETCH_SQL = """\ + SELECT + 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 + WHERE com_dr.dcf_pcf_dr_cd = :id + ORDER BY com_dr_wrkplace.aply_start_ymd DESC + """ + + def fetch_many(self, id) -> list[UltmarcDoctorWrkplaceDBModel]: + try: + self._database.connect() + query = self.FETCH_SQL + result = self._database.execute_select(query, {'id': id}) + models = [UltmarcDoctorWrkplaceDBModel(**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() diff --git a/ecs/jskult-webapp/src/repositories/ultmarc_sosiety_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_sosiety_repository.py new file mode 100644 index 00000000..e3c9ac13 --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/ultmarc_sosiety_repository.py @@ -0,0 +1,30 @@ +from src.model.db.ultmarc_sosiety import UltmarcSosietyDBModel +from src.repositories.base_repository import BaseRepository + + +class UltmarcSosietyRepository(BaseRepository): + + FETCH_SQL = """\ + SELECT com_sosiety.sosiety_cd, com_sosiety.sosiety_name + FROM src05.com_dr + LEFT JOIN src05.com_dr_sosiety ON com_dr.dcf_pcf_dr_cd = com_dr_sosiety.dcf_pcf_dr_cd + LEFT JOIN src05.com_sosiety ON com_dr_sosiety.sosiety_cd = com_sosiety.sosiety_cd + WHERE com_dr.dcf_pcf_dr_cd = :id + ORDER BY com_sosiety.sosiety_cd + """ + + def fetch_many(self, id) -> list[UltmarcSosietyDBModel]: + try: + self._database.connect() + query = self.FETCH_SQL + result = self._database.execute_select(query, {'id': id}) + models = [UltmarcSosietyDBModel(**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() diff --git a/ecs/jskult-webapp/src/repositories/ultmarc_specialist_license_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_specialist_license_repository.py new file mode 100644 index 00000000..35632081 --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/ultmarc_specialist_license_repository.py @@ -0,0 +1,31 @@ +from src.model.db.ultmarc_specialist_license import UltmarcSpecialistLicenseDBModel +from src.repositories.base_repository import BaseRepository + + +class UltmarcSpecialistLicenseRepository(BaseRepository): + + FETCH_SQL = """\ + SELECT + com_specialist_license.specialist_cd, com_specialist_license.specialist_license_name + FROM src05.com_dr + LEFT JOIN src05.com_sp_field ON com_dr.dcf_pcf_dr_cd = com_sp_field.dcf_pcf_dr_cd + LEFT JOIN src05.com_specialist_license ON com_sp_field.specialist_cd = com_specialist_license.specialist_cd + WHERE com_dr.dcf_pcf_dr_cd = :id + ORDER BY com_specialist_license.specialist_cd + """ + + def fetch_many(self, id) -> UltmarcSpecialistLicenseDBModel: + try: + self._database.connect() + query = self.FETCH_SQL + result = self._database.execute_select(query, {'id': id}) + models = [UltmarcSpecialistLicenseDBModel(**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() diff --git a/ecs/jskult-webapp/src/repositories/ultmarc_trt_course_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_trt_course_repository.py new file mode 100644 index 00000000..f50fc02a --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/ultmarc_trt_course_repository.py @@ -0,0 +1,31 @@ +from src.model.db.ultmarc_trt_course import UltmarcTrtCoursedbmodel +from src.repositories.base_repository import BaseRepository + + +class UltmarcTrtCourseRepository(BaseRepository): + + FETCH_SQL = """\ + SELECT trt_course_name + FROM src05.com_dr + LEFT JOIN src05.com_dr_trt_course ON com_dr.dcf_pcf_dr_cd = com_dr_trt_course.dcf_pcf_dr_cd + LEFT JOIN src05.com_trt_course ON com_dr_trt_course.trt_course_cd = com_trt_course.trt_course_cd + WHERE com_dr.dcf_pcf_dr_cd = :id + ORDER BY com_trt_course.trt_course_cd + """ + + 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] + 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() diff --git a/ecs/jskult-webapp/src/services/ultmarc_view_service.py b/ecs/jskult-webapp/src/services/ultmarc_view_service.py index 140863e7..1b207c5e 100644 --- a/ecs/jskult-webapp/src/services/ultmarc_view_service.py +++ b/ecs/jskult-webapp/src/services/ultmarc_view_service.py @@ -9,9 +9,15 @@ from src.aws.s3 import S3Client from src.model.internal.session import UserSession from src.model.request.ultmarc_doctor import UltmarcDoctorModel from src.model.view.ultmarc_doctor_view_model import UltmarcDoctorViewModel +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 from src.repositories.ultmarc_doctor_repository import UltmarcDoctorRepository +from src.repositories.ultmarc_trt_course_repository import UltmarcTrtCourseRepository +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 +from src.repositories.ultmarc_specialist_license_repository import UltmarcSpecialistLicenseRepository from src.services.base_service import BaseService from src.system_var import constants, environment @@ -19,16 +25,31 @@ from src.system_var import constants, environment class UltmarcViewService(BaseService): REPOSITORIES = { 'ultmarc_doctor_repository': UltmarcDoctorRepository, - 'prefc_repository': PrefcMasterRepository + 'prefc_repository': PrefcMasterRepository, + 'ultmarc_trt_course_repository': UltmarcTrtCourseRepository, + 'ultmarc_sosiety_repository': UltmarcSosietyRepository, + 'ultmarc_doctor_wrkplace_repository': UltmarcDoctorWrkplaceRepository, + 'ultmarc_doctor_wrkplace_his_repository': UltmarcDoctorWrkplaceHisRepository, + 'ultmarc_specialist_license_repository': UltmarcSpecialistLicenseRepository } ultmarc_doctor_repository: UltmarcDoctorRepository prefc_repository: PrefcMasterRepository + ultmarc_trt_course_repository: UltmarcTrtCourseRepository + ultmarc_sosiety_repository: UltmarcSosietyRepository + ultmarc_doctor_wrkplace_repository: UltmarcDoctorWrkplaceRepository + ultmarc_doctor_wrkplace_his_repository: UltmarcDoctorWrkplaceHisRepository + ultmarc_specialist_license_repository: UltmarcSpecialistLicenseRepository def __init__(self, repositories: dict[str, BaseRepository], clients: dict[str, AWSAPIClient]) -> None: super().__init__(repositories, clients) self.ultmarc_doctor_repository = repositories['ultmarc_doctor_repository'] self.prefc_repository = repositories['prefc_repository'] + self.ultmarc_trt_course_repository = repositories['ultmarc_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'] + self.ultmarc_specialist_license_repository = repositories['ultmarc_specialist_license_repository'] def prepare_ultmarc_doctor_view( self, @@ -46,3 +67,33 @@ class UltmarcViewService(BaseService): # 医師データを検索 ultmarc_doctor_data = self.ultmarc_doctor_repository.fetch_many(parameter=search_params) return ultmarc_doctor_data + + def info_ultmarc_doctor_view( + self, + id, + session: UserSession + ) -> UltmarcDoctorInfoViewModel: + + # 医師情報画面の表示データ取得 + # 医師情報を取得 + doctor_info = self.ultmarc_doctor_repository.fetch_one(id) + # 診療科目情報を取得 + trt_course = self.ultmarc_trt_course_repository.fetch_many(id) + # 所属学会情報を取得 + sosiety = self.ultmarc_sosiety_repository.fetch_many(id) + # 所属学会専門医情報を取得 + specialist_license = self.ultmarc_specialist_license_repository.fetch_many(id) + # 勤務先情報を取得 + wrkplace = self.ultmarc_doctor_wrkplace_repository.fetch_many(id) + # 勤務先履歴情報を取得 + wrkplace_his = self.ultmarc_doctor_wrkplace_his_repository.fetch_many(id) + + ultmarc = UltmarcDoctorInfoViewModel( + doctor_info_data=doctor_info, + trt_coursed_data=trt_course, + sosiety_data=sosiety, + specialist_license_data=specialist_license, + doctor_wrkplace_data=wrkplace, + doctor_wrkplace_his_data=wrkplace_his + ) + return ultmarc diff --git a/ecs/jskult-webapp/src/templates/docInfo.html b/ecs/jskult-webapp/src/templates/docInfo.html new file mode 100644 index 00000000..e9214447 --- /dev/null +++ b/ecs/jskult-webapp/src/templates/docInfo.html @@ -0,0 +1,486 @@ + + + + {% with subtitle = ultmarc.subtitle %} + {% include '_header.html' %} + {% endwith %} + 医師情報 + + + + + + + + + + + + + + + + + + +

医師情報

+ {% if ultmarc.is_batch_processing %} +
日次バッチ処理中のため、データが正しく表示されない可能性があります
+ {% endif %} +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
医師コード:氏名(漢字):氏名(カナ):
性別:生年月日:
+ 出身大学: + + 出身県: + + 卒年: + + 登録年: + + 開業年: + +
+ 診療科目: + + {% for trt_coursed_data in ultmarc.trt_coursed_data %} + + {% endfor %} + + + + {% for i in range(5-ultmarc.is_input_trt_course_data_size())%} + + {% endfor %} + +
+ + + + + + + + +
+

所属学会

+
+ + + + + + + + + + {% for sosiety_data in ultmarc.sosiety_data %} + + + + + {% endfor %} + +
コード所属学会
{{ultmarc.is_data_string_empty_fromat(sosiety_data.sosiety_cd)}}{{ultmarc.is_data_string_empty_fromat(sosiety_data.sosiety_name)}}
+
+
+

所属学会専門医

+
+ + + + + + + + + {% for specialist_license_data in ultmarc.specialist_license_data %} + + + + + {% endfor %} + + +
コード専門医資格名
{{ultmarc.is_data_string_empty_fromat(specialist_license_data.specialist_cd)}}{{ultmarc.is_data_string_empty_fromat(specialist_license_data.specialist_license_name)}}
+
+
+ +

勤務先履歴

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + {% for doctor_wrkplace_data in ultmarc.doctor_wrkplace_data %} + {% if ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.dcf_dsf_inst_cd) != ''%} + + + + + + + + + + {% endif %} + {% endfor %} + + + {% 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) != ''%} + + + + + + + + + + {% endif %} + {% endfor %} + + + + + + + + + + + +
ULT施設コード勤務先略名所属部科名役職名職位開始年月日終了年月日
{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.dcf_dsf_inst_cd)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.inst_name_kanji)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.blng_sec_name)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.univ_post_name)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.post_name)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.aply_start_ymd)}}9999/99/99
{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.dcf_dsf_inst_cd)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.inst_name_kanji)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.blng_sec_name)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.univ_post_name)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.post_name)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.aply_start_ymd)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.aply_end_ymd)}}
+
+ + + + \ No newline at end of file diff --git a/ecs/jskult-webapp/src/templates/docSearch.html b/ecs/jskult-webapp/src/templates/docSearch.html index 475578fa..2168aa3e 100644 --- a/ecs/jskult-webapp/src/templates/docSearch.html +++ b/ecs/jskult-webapp/src/templates/docSearch.html @@ -20,19 +20,17 @@ - - - - - - - -

医師検索一覧

- {% if ultmarc.is_batch_processing %} -
日次バッチ処理中のため、データが正しく表示されない可能性があります
- {% endif %} -
- + + + + + + +

医師検索一覧

+ {% if ultmarc.is_batch_processing %} +
日次バッチ処理中のため、データが正しく表示されない可能性があります
+ {% endif %} +
From 91f47d4fa450cbc6bc614b49bc1010161c16f7e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 7 Jun 2023 09:42:31 +0900 Subject: [PATCH 09/24] =?UTF-8?q?=E5=8C=BB=E5=B8=AB=E6=83=85=E5=A0=B1?= =?UTF-8?q?=E7=94=BB=E9=9D=A2=E3=81=AF=E5=A4=A7=E4=BD=93=E5=AE=8C=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/ultmarc.py | 53 ++- .../src/model/request/ultmarc_doctor.py | 17 + .../view/ultmarc_doctor_info_view_model.py | 17 + ecs/jskult-webapp/src/templates/docInfo.html | 320 ++---------------- .../src/templates/docSearch.html | 21 +- 5 files changed, 125 insertions(+), 303 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/ultmarc.py b/ecs/jskult-webapp/src/controller/ultmarc.py index 399ca6e4..3037971f 100644 --- a/ecs/jskult-webapp/src/controller/ultmarc.py +++ b/ecs/jskult-webapp/src/controller/ultmarc.py @@ -6,7 +6,7 @@ from starlette import status from src.depends.services import get_service from src.model.internal.session import UserSession -from src.model.request.ultmarc_doctor import UltmarcDoctorModel +from src.model.request.ultmarc_doctor import UltmarcDoctorModel, UltmarcDoctorInfoModel from src.router.session_router import AuthenticatedRoute from src.services.batch_status_service import BatchStatusService from src.services.ultmarc_view_service import UltmarcViewService @@ -115,6 +115,57 @@ def ultmarc_doctor_info_view( ultmarc = ultmarc_service.info_ultmarc_doctor_view(id, session) # バッチ起動判定の取得 ultmarc.is_batch_processing = is_batch_processing + # DocId + ultmarc.DocId = 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( + 'docInfo.html', { + 'request': request, + 'ultmarc': ultmarc, + }, + headers={'session_key': session_key} + ) + return templates_response + + +@router.post('/docInfo') +def ultmarc_doctor_info_search( + request: Request, + ultmarc_doctor_form: Optional[UltmarcDoctorInfoModel] = Depends(UltmarcDoctorInfoModel.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() + + # 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(',') + + # 医師情報の取得 + ultmarc = ultmarc_service.info_ultmarc_doctor_view(docId[ultmarc_doctor_form.pageNum], session) + # バッチ起動判定の取得 + ultmarc.is_batch_processing = is_batch_processing + # DocId + ultmarc.DocId = ultmarc_doctor_form.docId + # ページ総数(件数) + ultmarc.postCnt = len(docId) + # ページ数(表示するページNo) + ultmarc.pageNum = ultmarc_doctor_form.pageNum # セッション書き換え session.update( diff --git a/ecs/jskult-webapp/src/model/request/ultmarc_doctor.py b/ecs/jskult-webapp/src/model/request/ultmarc_doctor.py index 5935c076..0633624e 100644 --- a/ecs/jskult-webapp/src/model/request/ultmarc_doctor.py +++ b/ecs/jskult-webapp/src/model/request/ultmarc_doctor.py @@ -49,3 +49,20 @@ class UltmarcDoctorModel(BaseModel): alma=ctrl_alma, grad_y=ctrl_grad_y ) + + +class UltmarcDoctorInfoModel(BaseModel): + docId: Optional[str] + pageNum: Optional[int] + + @classmethod + def as_form( + cls, + docId: str = Form(None), + pageNum: str = Form(None) + ): + + return cls( + docId=docId, + pageNum=int(pageNum) + ) diff --git a/ecs/jskult-webapp/src/model/view/ultmarc_doctor_info_view_model.py b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_info_view_model.py index 1cfbcf5f..993bea14 100644 --- a/ecs/jskult-webapp/src/model/view/ultmarc_doctor_info_view_model.py +++ b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_info_view_model.py @@ -24,6 +24,9 @@ class UltmarcDoctorInfoViewModel(BaseModel): specialist_license_data: Optional[list[UltmarcSpecialistLicenseDBModel]] doctor_wrkplace_data: Optional[list[UltmarcDoctorWrkplaceDBModel]] doctor_wrkplace_his_data: Optional[list[UltmarcDoctorWrkplaceHisDBModel]] + DocId: Optional[str] + postCnt: Optional[int] + pageNum: Optional[int] def ultmarc_data_json_str(self): def date_handler(obj): @@ -66,6 +69,20 @@ class UltmarcDoctorInfoViewModel(BaseModel): def is_input_estab_y(self): return self.doctor_info_data.estab_y or '' + # 現在のページ(表示用) + 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_birthday_fromat(self): return self._format_date_string(self.doctor_info_data.birthday) diff --git a/ecs/jskult-webapp/src/templates/docInfo.html b/ecs/jskult-webapp/src/templates/docInfo.html index e9214447..1202faee 100644 --- a/ecs/jskult-webapp/src/templates/docInfo.html +++ b/ecs/jskult-webapp/src/templates/docInfo.html @@ -14,169 +14,22 @@ formBtDisabled(); } + - - - - - - -
@@ -193,30 +46,17 @@ if (!isset($isDBSuccess)) {
- - - - - - - - + + + @@ -226,9 +66,7 @@ if (!isset($isDBSuccess)) {
- - + - + {{ultmarc.is_pageNum_view()}}/{{ultmarc.postCnt}} - - +
- + @@ -259,37 +97,16 @@ if (!isset($isDBSuccess)) { - @@ -309,18 +126,6 @@ if (!isset($isDBSuccess)) { - {% for sosiety_data in ultmarc.sosiety_data %} @@ -348,16 +153,6 @@ if (!isset($isDBSuccess)) { {% endfor %} -
診療科目: - {% for trt_coursed_data in ultmarc.trt_coursed_data %} - + {% endfor %} - - - {% for i in range(5-ultmarc.is_input_trt_course_data_size())%} {% endfor %} -
{{ultmarc.is_data_string_empty_fromat(sosiety_data.sosiety_cd)}}{{ultmarc.is_data_string_empty_fromat(specialist_license_data.specialist_license_name)}}
@@ -371,42 +166,16 @@ if (!isset($isDBSuccess)) { - - - - - - - - - - - - {% for doctor_wrkplace_data in ultmarc.doctor_wrkplace_data %} {% if ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.dcf_dsf_inst_cd) != ''%} @@ -421,16 +190,6 @@ if (!isset($isDBSuccess)) { {% endif %} {% endfor %} - {% 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) != ''%} @@ -444,43 +203,10 @@ if (!isset($isDBSuccess)) { {% endif %} {% endfor %} - - - - - - - - - -
ULT施設コード 勤務先略名 所属部科名 役職名 職位 開始年月日 終了年月日
- - + \ No newline at end of file diff --git a/ecs/jskult-webapp/src/templates/docSearch.html b/ecs/jskult-webapp/src/templates/docSearch.html index 2168aa3e..c3168212 100644 --- a/ecs/jskult-webapp/src/templates/docSearch.html +++ b/ecs/jskult-webapp/src/templates/docSearch.html @@ -31,7 +31,7 @@ -
+ @@ -113,10 +113,11 @@ - + - + + @@ -142,7 +143,7 @@ - + \ No newline at end of file From 227f79932c8a66a82ea5286d33a7291733e174da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Thu, 8 Jun 2023 10:21:24 +0900 Subject: [PATCH 10/24] =?UTF-8?q?=E6=96=BD=E8=A8=AD=E6=A4=9C=E7=B4=A2?= =?UTF-8?q?=E7=94=BB=E9=9D=A2=EF=BC=88=E5=AE=9F=E8=A3=85=E5=AE=8C=E4=BA=86?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/ultmarc.py | 78 ++++++- .../src/model/db/inst_div_master.py | 8 + .../src/model/db/ultmarc_inst.py | 18 ++ .../src/model/request/ultmarc_inst.py | 61 +++++ .../src/model/view/ultmarc_inst_view_model.py | 103 +++++++++ .../repositories/inst_master_repository.py | 29 +++ .../repositories/ultmarc_inst_repository.py | 108 +++++++++ .../src/services/ultmarc_view_service.py | 32 ++- ecs/jskult-webapp/src/static/css/ultStyle.css | 2 +- .../src/templates/instSearch.html | 212 ++++++++++++++++++ ecs/jskult-webapp/src/templates/menu.html | 2 +- 11 files changed, 649 insertions(+), 4 deletions(-) create mode 100644 ecs/jskult-webapp/src/model/db/inst_div_master.py create mode 100644 ecs/jskult-webapp/src/model/db/ultmarc_inst.py create mode 100644 ecs/jskult-webapp/src/model/request/ultmarc_inst.py create mode 100644 ecs/jskult-webapp/src/model/view/ultmarc_inst_view_model.py create mode 100644 ecs/jskult-webapp/src/repositories/inst_master_repository.py create mode 100644 ecs/jskult-webapp/src/repositories/ultmarc_inst_repository.py create mode 100644 ecs/jskult-webapp/src/templates/instSearch.html diff --git a/ecs/jskult-webapp/src/controller/ultmarc.py b/ecs/jskult-webapp/src/controller/ultmarc.py index 3037971f..f4747bc8 100644 --- a/ecs/jskult-webapp/src/controller/ultmarc.py +++ b/ecs/jskult-webapp/src/controller/ultmarc.py @@ -7,6 +7,7 @@ from starlette import status 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.router.session_router import AuthenticatedRoute from src.services.batch_status_service import BatchStatusService from src.services.ultmarc_view_service import UltmarcViewService @@ -22,6 +23,81 @@ router.route_class = AuthenticatedRoute ######################### +@router.get('/instSearch') +def ultmarc_inst_view( + request: Request, + 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() + + # 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 + + # セッション書き換え + 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( + 'instSearch.html', { + 'request': request, + 'ultmarc': ultmarc, + }, + headers={'session_key': session_key} + ) + return templates_response + + +@router.post('/instSearch') +def search_inst( + request: Request, + ultmarc_inst_form: Optional[UltmarcInstModel] = Depends(UltmarcInstModel.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() + # 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) + + # 検索項目の取得(都道府県・施設区分) + ultmarc = ultmarc_service.ultmarc_inst_view(session) + ultmarc.is_batch_processing = batch_status_service.is_batch_processing() + ultmarc.inst_data = ultmarc_inst_data + ultmarc.form_data = ultmarc_inst_form + + # セッション書き換え + 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( + 'instSearch.html', { + 'request': request, + 'ultmarc': ultmarc, + }, + headers={'session_key': session_key} + ) + return templates_response + + @router.get('/docSearch') def ultmarc_doctor_view( request: Request, @@ -35,7 +111,7 @@ def ultmarc_doctor_view( # 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 diff --git a/ecs/jskult-webapp/src/model/db/inst_div_master.py b/ecs/jskult-webapp/src/model/db/inst_div_master.py new file mode 100644 index 00000000..38ec7b70 --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/inst_div_master.py @@ -0,0 +1,8 @@ +from typing import Optional + +from src.model.db.base_db_model import BaseDBModel + + +class InstDivMasterModel(BaseDBModel): + inst_div_cd: Optional[str] + inst_div_name: Optional[str] diff --git a/ecs/jskult-webapp/src/model/db/ultmarc_inst.py b/ecs/jskult-webapp/src/model/db/ultmarc_inst.py new file mode 100644 index 00000000..14830582 --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/ultmarc_inst.py @@ -0,0 +1,18 @@ +from typing import Optional + +from src.model.db.base_db_model import BaseDBModel +from src.util.sanitize import sanitize + + +@sanitize +class UltmarcInstDBModel(BaseDBModel): + dcf_dsf_inst_cd: Optional[str] + abolish_ymd: Optional[str] + delete_sche_reason_cd: Optional[str] + form_inst_name_kanji: Optional[str] + inst_addr: Optional[str] + postal_number: Optional[str] + inst_phone_number: Optional[str] + inst_div_name: Optional[str] + hp_assrt_name: Optional[str] + prefc_name: Optional[str] diff --git a/ecs/jskult-webapp/src/model/request/ultmarc_inst.py b/ecs/jskult-webapp/src/model/request/ultmarc_inst.py new file mode 100644 index 00000000..f7919612 --- /dev/null +++ b/ecs/jskult-webapp/src/model/request/ultmarc_inst.py @@ -0,0 +1,61 @@ +from typing import Optional + +from fastapi import Form +from pydantic import BaseModel + +from src.util.sanitize import sanitize + + +@sanitize +class UltmarcInstModel(BaseModel): + dcf_dsf_inst_cd: Optional[str] + inst_div_cd: Optional[str] + form_inst_name_kanji: Optional[str] + form_inst_name_kana: Optional[str] + postal_number: Optional[str] + inst_phone_number: Optional[str] + prefc_cd: Optional[str] + delFlg: Optional[str] + inst_addr: Optional[str] + + @classmethod + def as_form( + cls, + ctrl_dcf_dsf_inst_cd: str = Form(None), + ctrl_inst_div_cd: str = Form(None), + ctrl_form_inst_name_kanji: str = Form(None), + ctrl_form_inst_name_kana: str = Form(None), + ctrl_postal_number: str = Form(None), + ctrl_inst_phone_number: str = Form(None), + ctrl_prefc_cd: str = Form(None), + ctrl_delFlg: str = Form(None), + ctrl_inst_addr: str = Form(None) + ): + return cls( + dcf_dsf_inst_cd=ctrl_dcf_dsf_inst_cd, + inst_div_cd=ctrl_inst_div_cd, + form_inst_name_kanji=ctrl_form_inst_name_kanji, + form_inst_name_kana=ctrl_form_inst_name_kana, + postal_number=ctrl_postal_number, + inst_phone_number=ctrl_inst_phone_number, + prefc_cd=ctrl_prefc_cd, + delFlg=ctrl_delFlg, + inst_addr=ctrl_inst_addr + ) + + +class UltmarcInstInfoModel(BaseModel): + docId: Optional[str] + pageNum: Optional[int] + + @classmethod + def as_form( + cls, + docId: str = Form(None), + pageNum: str = Form(None) + ): + + return cls( + docId=docId, + pageNum=int(pageNum) + ) diff --git a/ecs/jskult-webapp/src/model/view/ultmarc_inst_view_model.py b/ecs/jskult-webapp/src/model/view/ultmarc_inst_view_model.py new file mode 100644 index 00000000..a0b5107c --- /dev/null +++ b/ecs/jskult-webapp/src/model/view/ultmarc_inst_view_model.py @@ -0,0 +1,103 @@ +import json +from datetime import datetime +from typing import Optional + +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.system_var import environment + + +class UltmarcInstViewModel(BaseModel): + subtitle: str = '施設検索一覧' + is_batch_processing: Optional[bool] + prefc_models: list[PrefcMasterModel] + inst_div_models: list[InstDivMasterModel] + inst_data: Optional[list[BisDisplayModel]] = [] + form_data: Optional[UltmarcInstModel] + + 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.inst_data], ensure_ascii=False, default=date_handler) + + # ULT施設コード + def is_input_dcf_dsf_inst_cdd(self): + if not self.is_form_submitted(): + return '' + return self.form_data.dcf_dsf_inst_cd or '' + + # 施設区分 + def is_selected_inst_div_cd(self, selected_inst_div_cd): + if not self.is_form_submitted(): + return '' + return self._selected_value(self.form_data.inst_div_cd, selected_inst_div_cd) + + # ULT施設名(漢字) + def is_input_form_inst_name_kanji(self): + if not self.is_form_submitted(): + return '' + return self.form_data.form_inst_name_kanji or '' + + # ULT施設名(かな・カナ) + def is_input_form_inst_name_kana(self): + if not self.is_form_submitted(): + return '' + return self.form_data.form_inst_name_kana or '' + + # 郵便番号 + def is_input_postal_number(self): + if not self.is_form_submitted(): + return '' + return self.form_data.postal_number or '' + + # 電話番号 + def is_input_inst_phone_number(self): + if not self.is_form_submitted(): + return '' + return self.form_data.inst_phone_number or '' + + # 削除施設表示 + def is_checked_delFlg(self): + if not self.is_form_submitted(): + return '' + return self._checked_value(self.form_data.delFlg) + + # ULT施設住所 + def is_input_inst_addr(self): + if not self.is_form_submitted(): + return '' + return self.form_data.inst_addr or '' + + # 勤務先都道府県 + def is_selected_prefc_cd(self, selected_prefc_cd): + if not self.is_form_submitted(): + return '' + return self._selected_value(self.form_data.prefc_cd, selected_prefc_cd) + + 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.BIO_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') + + def _selected_value(self, form_value: str, current_value: str): + return 'selected' if form_value == current_value else '' + + def _checked_value(self, form_value: str): + return 'checked' if form_value else '' diff --git a/ecs/jskult-webapp/src/repositories/inst_master_repository.py b/ecs/jskult-webapp/src/repositories/inst_master_repository.py new file mode 100644 index 00000000..d4b18505 --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/inst_master_repository.py @@ -0,0 +1,29 @@ +from src.model.db.inst_div_master import InstDivMasterModel +from src.repositories.base_repository import BaseRepository + + +class InstDivMasterRepository(BaseRepository): + + FETCH_SQL = """\ + SELECT + DISTINCT com_inst_div.inst_div_cd AS inst_div_cd, + com_inst_div.inst_div_name AS inst_div_name + FROM src05.com_inst + JOIN src05.com_inst_div on com_inst.inst_div_cd = com_inst_div.inst_div_cd + ORDER BY com_inst_div.inst_div_cd + """ + + def fetch_all(self) -> list[InstDivMasterModel]: + try: + self._database.connect() + result = self._database.execute_select(self.FETCH_SQL) + result_data = [res for res in result] + models = [InstDivMasterModel(**r) for r in result_data] + return models + except Exception as e: + # TODO: ファイルへの書き出しはloggerでやる + print(f"[ERROR] getOroshiData DB Error. ") + print(f"[ERROR] ErrorMessage: {e.args}") + raise e + finally: + self._database.disconnect() diff --git a/ecs/jskult-webapp/src/repositories/ultmarc_inst_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_inst_repository.py new file mode 100644 index 00000000..438c429d --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/ultmarc_inst_repository.py @@ -0,0 +1,108 @@ +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.request.ultmarc_inst import UltmarcInstModel +from src.repositories.base_repository import BaseRepository +from src.util.string_util import is_not_empty + + +class UltmarcInstRepository(BaseRepository): + + FETCH_SQL = """\ + SELECT + dcf_dsf_inst_cd, + abolish_ymd, + delete_sche_reason_cd, + form_inst_name_kanji, + inst_addr, + postal_number, + inst_phone_number, + inst_div_name, + hp_assrt_name, + prefc_name + FROM src05.com_inst + LEFT JOIN src05.mst_prefc ON com_inst.prefc_cd = mst_prefc.prefc_cd + LEFT JOIN src05.com_inst_div ON com_inst.inst_div_cd = com_inst_div.inst_div_cd + LEFT JOIN src05.com_hp_assrt ON com_inst.hp_assrt_cd = com_hp_assrt.hp_assrt_cd + WHERE {where_clause} + ORDER BY dcf_dsf_inst_cd + \ + """ + + def fetch_many(self, parameter: UltmarcInstModel) -> list[UltmarcInstDBModel]: + try: + self._database.connect() + # 文字列の検索を部分一致にするため、モデルをコピー。以降はこのコピーを使用する。 + clone_parameter = UltmarcInstModel(**parameter.dict()) + where_clause = self.__build_condition(clone_parameter) + query = self.FETCH_SQL.format(where_clause=where_clause) + result = self._database.execute_select(query, clone_parameter.dict()) + models = [UltmarcInstDBModel(**r) for r in result] + + return models + except Exception as e: + # TODO: ファイルへの書き出しはloggerでやる + print(f"[ERROR] DB Error : Exception={e.args}") + raise e + finally: + self._database.disconnect() + + def __build_condition(self, parameter: UltmarcInstModel): + where_clauses: list[SQLCondition] = [] + + # ULT施設コード + if is_not_empty(parameter.dcf_dsf_inst_cd): + # 部分一致検索 + parameter.dcf_dsf_inst_cd = f'%{parameter.dcf_dsf_inst_cd}%' + where_clauses.append(SQLCondition('com_inst.dcf_dsf_inst_cd', condition.LIKE, 'dcf_dsf_inst_cd')) + + # 施設区分 + if is_not_empty(parameter.inst_div_cd): + where_clauses.append(SQLCondition('com_inst.inst_div_cd', condition.EQ, 'inst_div_cd')) + + # ULT施設名(漢字) + if is_not_empty(parameter.form_inst_name_kanji): + # 部分一致検索 + parameter.form_inst_name_kanji = f'%{parameter.form_inst_name_kanji}%' + where_clauses.append(SQLCondition('form_inst_name_kanji', condition.LIKE, 'form_inst_name_kanji')) + + # ULT施設名(カナ) + if is_not_empty(parameter.form_inst_name_kana): + # 部分一致検索 + parameter.form_inst_name_kana = f'%{parameter.form_inst_name_kana}%' + where_clauses.append(SQLCondition('form_inst_name_kana', condition.LIKE, 'form_inst_name_kana')) + + # 郵便番号 + if is_not_empty(parameter.postal_number): + # 前方一致検索 + parameter.postal_number = f'{parameter.postal_number}%' + where_clauses.append(SQLCondition('postal_number', condition.LIKE, 'postal_number')) + + # 電話番号 + if is_not_empty(parameter.inst_phone_number): + # 前方一致検索 + parameter.inst_phone_number = f'{parameter.inst_phone_number}%' + where_clauses.append(SQLCondition('inst_phone_number', condition.LIKE, 'inst_phone_number')) + + # 勤務先都道府県 + if is_not_empty(parameter.prefc_cd): + where_clauses.append(SQLCondition('com_inst.prefc_cd', condition.EQ, 'prefc_cd')) + + # ULT施設住所 + if is_not_empty(parameter.inst_addr): + # 部分一致検索 + parameter.inst_addr = f'%{parameter.inst_addr}%' + where_clauses.append(SQLCondition('inst_addr', condition.LIKE, 'inst_addr')) + + # 削除表示フラグ + if is_not_empty(parameter.delFlg): + # 論理和での検索 + 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 diff --git a/ecs/jskult-webapp/src/services/ultmarc_view_service.py b/ecs/jskult-webapp/src/services/ultmarc_view_service.py index 1b207c5e..65cc57a0 100644 --- a/ecs/jskult-webapp/src/services/ultmarc_view_service.py +++ b/ecs/jskult-webapp/src/services/ultmarc_view_service.py @@ -8,10 +8,14 @@ from src.aws.aws_api_client import AWSAPIClient from src.aws.s3 import S3Client from src.model.internal.session import UserSession 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_doctor_info_view_model import UltmarcDoctorInfoViewModel from src.repositories.base_repository import BaseRepository from src.repositories.prefc_master_repository import PrefcMasterRepository +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_sosiety_repository import UltmarcSosietyRepository @@ -26,6 +30,8 @@ class UltmarcViewService(BaseService): REPOSITORIES = { 'ultmarc_doctor_repository': UltmarcDoctorRepository, 'prefc_repository': PrefcMasterRepository, + 'inst_div_repository': InstDivMasterRepository, + 'ultmarc_inst_repository': UltmarcInstRepository, 'ultmarc_trt_course_repository': UltmarcTrtCourseRepository, 'ultmarc_sosiety_repository': UltmarcSosietyRepository, 'ultmarc_doctor_wrkplace_repository': UltmarcDoctorWrkplaceRepository, @@ -35,6 +41,8 @@ class UltmarcViewService(BaseService): ultmarc_doctor_repository: UltmarcDoctorRepository prefc_repository: PrefcMasterRepository + inst_div_repository: InstDivMasterRepository + ultmarc_inst_repository: UltmarcInstRepository ultmarc_trt_course_repository: UltmarcTrtCourseRepository ultmarc_sosiety_repository: UltmarcSosietyRepository ultmarc_doctor_wrkplace_repository: UltmarcDoctorWrkplaceRepository @@ -45,6 +53,8 @@ class UltmarcViewService(BaseService): super().__init__(repositories, clients) self.ultmarc_doctor_repository = repositories['ultmarc_doctor_repository'] self.prefc_repository = repositories['prefc_repository'] + 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_sosiety_repository = repositories['ultmarc_sosiety_repository'] self.ultmarc_doctor_wrkplace_repository = repositories['ultmarc_doctor_wrkplace_repository'] @@ -55,7 +65,7 @@ class UltmarcViewService(BaseService): self, session: UserSession ) -> UltmarcDoctorViewModel: - # # 都道府県リストを取得 + # 都道府県リストを取得 prefcs = self.prefc_repository.fetch_all() ultmarc = UltmarcDoctorViewModel( @@ -63,6 +73,26 @@ class UltmarcViewService(BaseService): ) return ultmarc + def ultmarc_inst_view( + self, + session: UserSession + ) -> UltmarcInstViewModel: + # 都道府県リストを取得 + prefcs = self.prefc_repository.fetch_all() + # 施設区分リストを取得 + inst_div = self.inst_div_repository.fetch_all() + + ultmarc = UltmarcInstViewModel( + prefc_models=prefcs, + inst_div_models=inst_div + ) + return ultmarc + + def search_inst_data(self, search_params: UltmarcInstModel): + # 施設データを検索 + ultmarc_inst_data = self.ultmarc_inst_repository.fetch_many(parameter=search_params) + return ultmarc_inst_data + def search_doctor_data(self, search_params: UltmarcDoctorModel): # 医師データを検索 ultmarc_doctor_data = self.ultmarc_doctor_repository.fetch_many(parameter=search_params) diff --git a/ecs/jskult-webapp/src/static/css/ultStyle.css b/ecs/jskult-webapp/src/static/css/ultStyle.css index 3f1850d0..8d018b01 100644 --- a/ecs/jskult-webapp/src/static/css/ultStyle.css +++ b/ecs/jskult-webapp/src/static/css/ultStyle.css @@ -134,7 +134,7 @@ table{ } .instSearchButchMsg{ - font-size: 80%; + /* font-size: 80%; */ color: red; } diff --git a/ecs/jskult-webapp/src/templates/instSearch.html b/ecs/jskult-webapp/src/templates/instSearch.html new file mode 100644 index 00000000..92db85ae --- /dev/null +++ b/ecs/jskult-webapp/src/templates/instSearch.html @@ -0,0 +1,212 @@ + + + + {% with subtitle = ultmarc.subtitle %} + {% include '_header.html' %} + {% endwith %} + + + + + + + + +
+ + + + + +

施設検索一覧

+ {% if ultmarc.is_batch_processing %} +
日次バッチ処理中のため、データが正しく表示されない可能性があります
+ {% endif %} +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ULT施設コード: + + 施設区分: + + +
ULT施設名(漢字): + + ULT施設名(かな・カナ): + +
郵便番号: + 電話番号: +
都道府県: + + + + 削除施設表示 +
ULT施設住所: + + + + +
+
+ + +
+ + + + + + + + +
+ + + + + + + + + + + + + + + + +
ULT施設コード削除ULT施設名(漢字)ULT施設住所(漢字)郵便番号施設電話番号施設区分名病院種別都道府県
+
+ + +
+ + + + \ No newline at end of file diff --git a/ecs/jskult-webapp/src/templates/menu.html b/ecs/jskult-webapp/src/templates/menu.html index 58f05375..db36bf61 100644 --- a/ecs/jskult-webapp/src/templates/menu.html +++ b/ecs/jskult-webapp/src/templates/menu.html @@ -14,7 +14,7 @@ Ultmarc照会(医師)

{% endif %} {% if menu.is_available_ult_inst_menu() %} - Ultmarc照会(施設)

+ Ultmarc照会(施設)

{% endif %} {% if menu.is_available_bio_menu() %} {% if not menu.is_batch_processing() %} From ce883d8ad7d0c910e88cfe1a35f932ae38e8678e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 14 Jun 2023 09:41:07 +0900 Subject: [PATCH 11/24] =?UTF-8?q?=E3=83=AC=E3=83=93=E3=83=A5=E3=83=BC?= =?UTF-8?q?=E5=89=8D=E5=AE=8C=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/.env.example | 1 + ecs/jskult-webapp/src/controller/ultmarc.py | 108 +++++-- .../model/db/ultmarc_doctor_wrkplace_count.py | 9 + .../src/model/db/ultmarc_inst_info.py | 57 ++++ .../src/model/db/ultmarc_inst_trt_course.py | 9 + .../src/model/db/ultmarc_trt_course.py | 2 +- .../src/model/request/ultmarc_inst.py | 6 +- .../view/ultmarc_doctor_info_view_model.py | 29 +- .../model/view/ultmarc_doctor_view_model.py | 15 +- .../view/ultmarc_inst_info_view_model.py | 264 ++++++++++++++++ .../src/model/view/ultmarc_inst_view_model.py | 31 +- .../repositories/ultmarc_doctor_repository.py | 9 +- .../ultmarc_dr_wrkplace_his_repository.py | 30 +- .../ultmarc_dr_wrkplace_repository.py | 24 ++ .../repositories/ultmarc_inst_repository.py | 87 +++++- .../ultmarc_inst_trt_course_repository.py | 31 ++ .../ultmarc_trt_course_repository.py | 6 +- .../src/services/ultmarc_view_service.py | 26 ++ .../src/system_var/environment.py | 3 +- ecs/jskult-webapp/src/templates/docInfo.html | 68 +++-- .../src/templates/docSearch.html | 43 ++- ecs/jskult-webapp/src/templates/instInfo.html | 285 ++++++++++++++++++ .../src/templates/instSearch.html | 62 +++- .../task_settings/web_task_settings.env | 1 + 24 files changed, 1089 insertions(+), 117 deletions(-) create mode 100644 ecs/jskult-webapp/src/model/db/ultmarc_doctor_wrkplace_count.py create mode 100644 ecs/jskult-webapp/src/model/db/ultmarc_inst_info.py create mode 100644 ecs/jskult-webapp/src/model/db/ultmarc_inst_trt_course.py create mode 100644 ecs/jskult-webapp/src/model/view/ultmarc_inst_info_view_model.py create mode 100644 ecs/jskult-webapp/src/repositories/ultmarc_inst_trt_course_repository.py create mode 100644 ecs/jskult-webapp/src/templates/instInfo.html diff --git a/ecs/jskult-webapp/.env.example b/ecs/jskult-webapp/.env.example index f330f3d5..c604e43e 100644 --- a/ecs/jskult-webapp/.env.example +++ b/ecs/jskult-webapp/.env.example @@ -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 diff --git a/ecs/jskult-webapp/src/controller/ultmarc.py b/ecs/jskult-webapp/src/controller/ultmarc.py index f4747bc8..914826c9 100644 --- a/ecs/jskult-webapp/src/controller/ultmarc.py +++ b/ecs/jskult-webapp/src/controller/ultmarc.py @@ -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(',') # 医師情報の取得 diff --git a/ecs/jskult-webapp/src/model/db/ultmarc_doctor_wrkplace_count.py b/ecs/jskult-webapp/src/model/db/ultmarc_doctor_wrkplace_count.py new file mode 100644 index 00000000..4482eab9 --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/ultmarc_doctor_wrkplace_count.py @@ -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] diff --git a/ecs/jskult-webapp/src/model/db/ultmarc_inst_info.py b/ecs/jskult-webapp/src/model/db/ultmarc_inst_info.py new file mode 100644 index 00000000..a72b38a9 --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/ultmarc_inst_info.py @@ -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] diff --git a/ecs/jskult-webapp/src/model/db/ultmarc_inst_trt_course.py b/ecs/jskult-webapp/src/model/db/ultmarc_inst_trt_course.py new file mode 100644 index 00000000..7c2ef6de --- /dev/null +++ b/ecs/jskult-webapp/src/model/db/ultmarc_inst_trt_course.py @@ -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] diff --git a/ecs/jskult-webapp/src/model/db/ultmarc_trt_course.py b/ecs/jskult-webapp/src/model/db/ultmarc_trt_course.py index 23908fce..788d9748 100644 --- a/ecs/jskult-webapp/src/model/db/ultmarc_trt_course.py +++ b/ecs/jskult-webapp/src/model/db/ultmarc_trt_course.py @@ -5,5 +5,5 @@ from src.util.sanitize import sanitize @sanitize -class UltmarcTrtCoursedbmodel(BaseDBModel): +class UltmarcTrtCourseDBModel(BaseDBModel): trt_course_name: Optional[str] diff --git a/ecs/jskult-webapp/src/model/request/ultmarc_inst.py b/ecs/jskult-webapp/src/model/request/ultmarc_inst.py index f7919612..8b9a52c6 100644 --- a/ecs/jskult-webapp/src/model/request/ultmarc_inst.py +++ b/ecs/jskult-webapp/src/model/request/ultmarc_inst.py @@ -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) ) diff --git a/ecs/jskult-webapp/src/model/view/ultmarc_doctor_info_view_model.py b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_info_view_model.py index 993bea14..0af599d4 100644 --- a/ecs/jskult-webapp/src/model/view/ultmarc_doctor_info_view_model.py +++ b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_info_view_model.py @@ -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) diff --git a/ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py index ea2afe48..47f55454 100644 --- a/ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py +++ b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py @@ -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 '' diff --git a/ecs/jskult-webapp/src/model/view/ultmarc_inst_info_view_model.py b/ecs/jskult-webapp/src/model/view/ultmarc_inst_info_view_model.py new file mode 100644 index 00000000..6d64e04f --- /dev/null +++ b/ecs/jskult-webapp/src/model/view/ultmarc_inst_info_view_model.py @@ -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 diff --git a/ecs/jskult-webapp/src/model/view/ultmarc_inst_view_model.py b/ecs/jskult-webapp/src/model/view/ultmarc_inst_view_model.py index a0b5107c..e728945a 100644 --- a/ecs/jskult-webapp/src/model/view/ultmarc_inst_view_model.py +++ b/ecs/jskult-webapp/src/model/view/ultmarc_inst_view_model.py @@ -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 '' diff --git a/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py index 60f1543d..5860148c 100644 --- a/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py +++ b/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py @@ -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 diff --git a/ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_his_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_his_repository.py index 14f0de45..67ab328d 100644 --- a/ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_his_repository.py +++ b/ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_his_repository.py @@ -5,21 +5,23 @@ from src.repositories.base_repository import BaseRepository class UltmarcDoctorWrkplaceHisRepository(BaseRepository): FETCH_SQL = """\ - SELECT - 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 + SELECT + 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_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]: diff --git a/ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_repository.py index fd1295d7..cc6a9dc3 100644 --- a/ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_repository.py +++ b/ecs/jskult-webapp/src/repositories/ultmarc_dr_wrkplace_repository.py @@ -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() diff --git a/ecs/jskult-webapp/src/repositories/ultmarc_inst_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_inst_repository.py index 438c429d..2cf08f77 100644 --- a/ecs/jskult-webapp/src/repositories/ultmarc_inst_repository.py +++ b/ecs/jskult-webapp/src/repositories/ultmarc_inst_repository.py @@ -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() diff --git a/ecs/jskult-webapp/src/repositories/ultmarc_inst_trt_course_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_inst_trt_course_repository.py new file mode 100644 index 00000000..eaee391a --- /dev/null +++ b/ecs/jskult-webapp/src/repositories/ultmarc_inst_trt_course_repository.py @@ -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() diff --git a/ecs/jskult-webapp/src/repositories/ultmarc_trt_course_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_trt_course_repository.py index f50fc02a..c76032a3 100644 --- a/ecs/jskult-webapp/src/repositories/ultmarc_trt_course_repository.py +++ b/ecs/jskult-webapp/src/repositories/ultmarc_trt_course_repository.py @@ -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 diff --git a/ecs/jskult-webapp/src/services/ultmarc_view_service.py b/ecs/jskult-webapp/src/services/ultmarc_view_service.py index 65cc57a0..d8103c93 100644 --- a/ecs/jskult-webapp/src/services/ultmarc_view_service.py +++ b/ecs/jskult-webapp/src/services/ultmarc_view_service.py @@ -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) diff --git a/ecs/jskult-webapp/src/system_var/environment.py b/ecs/jskult-webapp/src/system_var/environment.py index aed9916c..cd54d35d 100644 --- a/ecs/jskult-webapp/src/system_var/environment.py +++ b/ecs/jskult-webapp/src/system_var/environment.py @@ -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']) \ No newline at end of file +SEARCH_RESULT_MAX_COUNT = int(os.environ['SEARCH_RESULT_MAX_COUNT']) +SESSION_EXPIRE_MINUTE = int(os.environ['SESSION_EXPIRE_MINUTE']) diff --git a/ecs/jskult-webapp/src/templates/docInfo.html b/ecs/jskult-webapp/src/templates/docInfo.html index 1202faee..7e807303 100644 --- a/ecs/jskult-webapp/src/templates/docInfo.html +++ b/ecs/jskult-webapp/src/templates/docInfo.html @@ -33,7 +33,7 @@ - + - + + @@ -175,35 +188,44 @@ + - {% for doctor_wrkplace_data in ultmarc.doctor_wrkplace_data %} - {% if ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.dcf_dsf_inst_cd) != ''%} - - - - - - - - - - {% 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) != ''%} + + + + + + + + + + {% endif %} + {% endfor %} + {% 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) != ''%} - - + + - - + + {% endif %} {% endfor %} - +

医師情報

{{ultmarc.subtitle}}

{% if ultmarc.is_batch_processing %}
日次バッチ処理中のため、データが正しく表示されない可能性があります
@@ -50,16 +50,29 @@
- + {{ultmarc.is_pageNum_view()}}/{{ultmarc.postCnt}} - +
終了年月日
{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.dcf_dsf_inst_cd)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.inst_name_kanji)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.blng_sec_name)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.univ_post_name)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.post_name)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.aply_start_ymd)}}9999/99/99
+ {{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.dcf_dsf_inst_cd)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.inst_name_kanji)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.blng_sec_name)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.univ_post_name)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.post_name)}}{{ultmarc.is_input_ymd_fromat(doctor_wrkplace_data.aply_start_ymd)}}9999/99/99
{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.dcf_dsf_inst_cd)}}
+ {{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.dcf_dsf_inst_cd)}} + {{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.inst_name_kanji)}} {{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.blng_sec_name)}} {{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.univ_post_name)}} {{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.post_name)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.aply_start_ymd)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.aply_end_ymd)}}{{ultmarc.is_input_ymd_fromat(doctor_wrkplace_his_data.aply_start_ymd)}}{{ultmarc.is_input_ymd_fromat(doctor_wrkplace_his_data.aply_end_ymd)}}
diff --git a/ecs/jskult-webapp/src/templates/docSearch.html b/ecs/jskult-webapp/src/templates/docSearch.html index c3168212..403b7f33 100644 --- a/ecs/jskult-webapp/src/templates/docSearch.html +++ b/ecs/jskult-webapp/src/templates/docSearch.html @@ -22,7 +22,7 @@ - +

医師検索一覧

{{ultmarc.subtitle}}

{% if ultmarc.is_batch_processing %}
日次バッチ処理中のため、データが正しく表示されない可能性があります
@@ -140,7 +140,17 @@
- + {% if ultmarc.is_form_submitted() and ultmarc.is_data_overflow_max_length() %} +
+ 検索結果が最大件数を超えました。検索条件を見直しして下さい。 +
+ {% endif %} + {% if ultmarc.is_form_submitted() and ultmarc.is_data_empty() %} +
+ 対象のデータが存在しません。 +
+ {% endif %} + @@ -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 = `${data['dcf_pcf_dr_cd'] || ''}`; if(key=='dcf_dsf_inst_cd') - inner_content = `${data['form_inst_name_kanji'] || ''}`; + inner_content = `${data['form_inst_name_kanji'] || ''}`; return `${inner_content || ''}` }); return ` @@ -208,7 +239,7 @@ }) } - // 配列パラメータを加工にする + 配列パラメータを加工にする function CheckBoxListPocessing() { var vals = []; // 配列を定義 diff --git a/ecs/jskult-webapp/src/templates/instInfo.html b/ecs/jskult-webapp/src/templates/instInfo.html new file mode 100644 index 00000000..2ce03d2b --- /dev/null +++ b/ecs/jskult-webapp/src/templates/instInfo.html @@ -0,0 +1,285 @@ + + + + {% with subtitle = ultmarc.subtitle %} + {% include '_header.html' %} + {% endwith %} + + + + + + + +

+ {{ultmarc.subtitle}} +

+ {% if ultmarc.is_batch_processing %} +
日次バッチ処理中のため、データが正しく表示されない可能性があります
+ {% endif %} + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + {{ultmarc.is_pageNum_view()}}/{{ultmarc.postCnt}} + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
施設コード + + 未確認 + 施設コード変換先 + + 休院店開始年月 + + 休院店 +
削除予定理由削除日 + + 開業予定年月 + + 開業 +
正式施設名(カナ)
正式施設名(漢字)
略式施設名(カナ)施設区分名
略式施設名(漢字)経営体 + + +
郵便番号 + + 住所不明 + 施設電話番号 + + 電話なし +
住所(カナ)
住所(漢字)
+ +
+ + + + + + + + + + + + + + + + + + + + +
病院種別再審査区分関連大学親名 + + +
診療科目 + {% if ultmarc.inst_trt_coursed_data != None %} + {% for inst_trt_course_data in ultmarc.inst_trt_coursed_data %} + + {% endfor %} + {% endif %} + {% for i in range(60-ultmarc.is_input_inst_trt_course_data_size()) %} + + {% endfor %} + +
検査工程 + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + +
特務医務室許可病床数 + + + + + + + + + + + + + + + + + + + + + +
一般療養精神感染症結核その他合計
+
病棟閉鎖  一部病棟閉鎖
病床数(定員)メンテ年月日
+ + + + + + + + + + + + + + + + + + + + +
代表者個人コード
施設代表者(カナ)
施設代表者(漢字)
修正年月日
+ + \ No newline at end of file diff --git a/ecs/jskult-webapp/src/templates/instSearch.html b/ecs/jskult-webapp/src/templates/instSearch.html index 92db85ae..15988f05 100644 --- a/ecs/jskult-webapp/src/templates/instSearch.html +++ b/ecs/jskult-webapp/src/templates/instSearch.html @@ -7,7 +7,7 @@ \ No newline at end of file diff --git a/s3/config/jskult/task_settings/web_task_settings.env b/s3/config/jskult/task_settings/web_task_settings.env index 9cd4ecf8..b10c9342 100644 --- a/s3/config/jskult/task_settings/web_task_settings.env +++ b/s3/config/jskult/task_settings/web_task_settings.env @@ -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 From 5359486197fa214974a56888d1ec0b2cb498e84a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Wed, 14 Jun 2023 15:35:55 +0900 Subject: [PATCH 12/24] =?UTF-8?q?delFlg=5Fctrl=20=E8=8B=A6=E8=82=89?= =?UTF-8?q?=E3=81=AE=E7=AD=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/model/request/ultmarc_inst.py | 4 ++-- .../repositories/ultmarc_doctor_repository.py | 9 ++------- .../src/templates/bioSearchList.html | 4 ++-- .../src/templates/docSearch.html | 2 -- .../src/templates/instSearch.html | 20 +++++++++---------- 5 files changed, 15 insertions(+), 24 deletions(-) diff --git a/ecs/jskult-webapp/src/model/request/ultmarc_inst.py b/ecs/jskult-webapp/src/model/request/ultmarc_inst.py index 8b9a52c6..ba06a443 100644 --- a/ecs/jskult-webapp/src/model/request/ultmarc_inst.py +++ b/ecs/jskult-webapp/src/model/request/ultmarc_inst.py @@ -28,7 +28,7 @@ class UltmarcInstModel(BaseModel): ctrl_postal_number: str = Form(None), ctrl_inst_phone_number: str = Form(None), ctrl_prefc_cd: str = Form(None), - ctrl_delFlg: str = Form(None), + delFlg_ctrl: str = Form(None), ctrl_inst_addr: str = Form(None) ): return cls( @@ -39,7 +39,7 @@ class UltmarcInstModel(BaseModel): postal_number=ctrl_postal_number, inst_phone_number=ctrl_inst_phone_number, prefc_cd=ctrl_prefc_cd, - delFlg=ctrl_delFlg, + delFlg=delFlg_ctrl, inst_addr=ctrl_inst_addr ) diff --git a/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py index 5860148c..bd89db0b 100644 --- a/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py +++ b/ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py @@ -34,6 +34,8 @@ class UltmarcDoctorRepository(BaseRepository): LEFT JOIN src05.com_alma ON com_dr.alma_cd = com_alma.alma_cd WHERE {where_clause} + AND (length(com_inst.abolish_ymd) = 0 OR com_inst.abolish_ymd IS NULL) + AND (length(com_dr.abolish_ymd) = 0 OR com_dr.abolish_ymd IS NULL) 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, @@ -127,13 +129,6 @@ 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 diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index d44247c1..09f1a718 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -176,12 +176,12 @@ {% if bio.is_form_submitted() and bio.is_data_overflow_max_length() %}
- 検索結果が最大件数を超えました。検索条件を見直しして下さい。 + 検索件数が500件を超えています 検索項目を見直してください
{% endif %} {% if bio.is_form_submitted() and bio.is_data_empty() %}
- 対象のデータが存在しません。 + 対象のデータが存在しません
{% endif %} diff --git a/ecs/jskult-webapp/src/templates/docSearch.html b/ecs/jskult-webapp/src/templates/docSearch.html index 403b7f33..0b86e837 100644 --- a/ecs/jskult-webapp/src/templates/docSearch.html +++ b/ecs/jskult-webapp/src/templates/docSearch.html @@ -7,8 +7,6 @@ diff --git a/ecs/jskult-webapp/src/templates/instInfo.html b/ecs/jskult-webapp/src/templates/instInfo.html index 2ce03d2b..b582b54d 100644 --- a/ecs/jskult-webapp/src/templates/instInfo.html +++ b/ecs/jskult-webapp/src/templates/instInfo.html @@ -18,12 +18,12 @@ $(function(){ // 前ページ遷移処理 $('#prev').click(function(){ - $('#pageNum').val(Number($('#pageNum').val()) - 1); + $('#page_num').val(Number($('#page_num').val()) - 1); $('#instInfo').submit(); }); // 次ページ遷移処理 $('#next').click(function(){ - $('#pageNum').val(Number($('#pageNum').val()) + 1); + $('#page_num').val(Number($('#page_num').val()) + 1); $('#instInfo').submit(); }); }); @@ -48,13 +48,13 @@
- - + + - {{ultmarc.is_pageNum_view()}}/{{ultmarc.postCnt}} + {{ultmarc.is_page_num_view()}}/{{ultmarc.post_cnt}} diff --git a/ecs/jskult-webapp/src/templates/instSearch.html b/ecs/jskult-webapp/src/templates/instSearch.html index 8cb92402..25e55ed8 100644 --- a/ecs/jskult-webapp/src/templates/instSearch.html +++ b/ecs/jskult-webapp/src/templates/instSearch.html @@ -114,8 +114,8 @@ - - + + @@ -236,7 +236,7 @@ $('input[name="data"]:checked').each(function() { vals.push( $(this).val() ); // 配列に値を追加 }); - $("#instId").val(vals.join(',')); + $("#inst_id").val(vals.join(',')); } diff --git a/s3/config/jskult/task_settings/web_task_settings.env b/s3/config/jskult/task_settings/web_task_settings.env index b10c9342..9336383d 100644 --- a/s3/config/jskult/task_settings/web_task_settings.env +++ b/s3/config/jskult/task_settings/web_task_settings.env @@ -4,4 +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 +UTL_SEARCH_RESULT_MAX_COUNT=500 From f261cda65befba0433db776b0f1b30a22aeacf83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Fri, 16 Jun 2023 18:12:28 +0900 Subject: [PATCH 17/24] =?UTF-8?q?=E6=8C=87=E6=91=98=E4=BA=8B=E9=A0=85?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=EF=BC=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/.env.example | 2 +- ecs/jskult-webapp/src/controller/ultmarc.py | 48 +++-- .../src/model/request/ultmarc_doctor.py | 7 +- .../src/model/request/ultmarc_inst.py | 9 +- .../src/model/view/bio_view_model.py | 2 +- .../view/ultmarc_doctor_info_view_model.py | 42 +---- .../model/view/ultmarc_doctor_view_model.py | 8 +- .../view/ultmarc_inst_info_view_model.py | 166 +----------------- .../src/model/view/ultmarc_inst_view_model.py | 12 +- .../repositories/ultmarc_inst_repository.py | 8 +- .../src/services/ultmarc_view_service.py | 101 +++++------ .../src/system_var/environment.py | 2 +- .../src/templates/bioSearchList.html | 2 +- ecs/jskult-webapp/src/templates/docInfo.html | 63 ++++--- .../src/templates/docSearch.html | 40 +++-- ecs/jskult-webapp/src/templates/instInfo.html | 84 ++++----- .../src/templates/instSearch.html | 32 ++-- .../task_settings/web_task_settings.env | 2 +- 18 files changed, 239 insertions(+), 391 deletions(-) diff --git a/ecs/jskult-webapp/.env.example b/ecs/jskult-webapp/.env.example index d6fcbdcc..0630afe4 100644 --- a/ecs/jskult-webapp/.env.example +++ b/ecs/jskult-webapp/.env.example @@ -22,6 +22,6 @@ AWS_REGION=ap-northeast-1 AUTHORIZE_ENDPOINT=oauth2/authorize TOKEN_ENDPOINT=oauth2/token BIO_SEARCH_RESULT_MAX_COUNT=35000 -UTL_SEARCH_RESULT_MAX_COUNT=500 +ULTMARC_SEARCH_RESULT_MAX_COUNT=500 SESSION_EXPIRE_MINUTE=20 LOG_LEVEL=DEBUG \ No newline at end of file diff --git a/ecs/jskult-webapp/src/controller/ultmarc.py b/ecs/jskult-webapp/src/controller/ultmarc.py index 00678cb0..5e9c046f 100644 --- a/ecs/jskult-webapp/src/controller/ultmarc.py +++ b/ecs/jskult-webapp/src/controller/ultmarc.py @@ -4,10 +4,10 @@ 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 (UltmarcDoctorInfoModel, - UltmarcDoctorSearchModel) +from src.model.request.ultmarc_doctor import ( + UltmarcDoctorInfoModel, UltmarcDoctorSearchModel) from src.model.request.ultmarc_inst import (UltmarcInstInfoModel, - UltmarcInstModel) + UltmarcInstSearchModel) from src.router.session_router import AuthenticatedRoute from src.services.batch_status_service import BatchStatusService from src.services.session_service import set_session @@ -21,6 +21,10 @@ router.route_class = AuthenticatedRoute # Views # ######################### +######################### +# アルトマーク施設検索 # +######################### + @router.get('/instSearch') def ultmarc_inst_view( @@ -33,7 +37,7 @@ def ultmarc_inst_view( is_batch_processing = batch_status_service.is_batch_processing() # 検索項目の取得(都道府県・施設区分) - ultmarc = ultmarc_service.ultmarc_inst_view(session) + ultmarc = ultmarc_service.prepare_ultmarc_inst_search_view() ultmarc.is_batch_processing = is_batch_processing # セッション書き換え @@ -57,7 +61,7 @@ def ultmarc_inst_view( @router.post('/instSearch') def search_inst( request: Request, - ultmarc_inst_form: Optional[UltmarcInstModel] = Depends(UltmarcInstModel.as_form), + ultmarc_inst_form: Optional[UltmarcInstSearchModel] = Depends(UltmarcInstSearchModel.as_form), ultmarc_service: UltmarcViewService = Depends(get_service(UltmarcViewService)), batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) ): @@ -70,7 +74,7 @@ def search_inst( ultmarc_inst_data = ultmarc_service.search_inst_data(ultmarc_inst_form) # 検索項目の取得(都道府県・施設区分) - ultmarc = ultmarc_service.ultmarc_inst_view(session) + ultmarc = ultmarc_service.prepare_ultmarc_inst_search_view() ultmarc.is_batch_processing = is_batch_processing ultmarc.inst_data = ultmarc_inst_data ultmarc.form_data = ultmarc_inst_form @@ -92,6 +96,10 @@ def search_inst( ) return templates_response +######################### +# アルトマーク施設詳細 # +######################### + @router.get('/instInfo') def ultmarc_inst_info_view( @@ -105,8 +113,8 @@ def ultmarc_inst_info_view( is_batch_processing = batch_status_service.is_batch_processing() # 施設情報の取得 - ultmarc = ultmarc_service.info_ultmarc_inst_view(id, session) - # バッチ起動判定の取得 + ultmarc = ultmarc_service.prepare_ultmarc_inst_info_view(id) + # バッチ起動判定 ultmarc.is_batch_processing = is_batch_processing # inst_id ultmarc.inst_id = id @@ -133,7 +141,7 @@ def ultmarc_inst_info_view( return templates_response -@router.post('/instInfo') +@ router.post('/instInfo') def ultmarc_inst_info_search( request: Request, ultmarc_inst_form: Optional[UltmarcInstInfoModel] = Depends(UltmarcInstInfoModel.as_form), @@ -147,7 +155,7 @@ def ultmarc_inst_info_search( inst_id = ultmarc_inst_form.inst_id.split(',') # 施設情報の取得 - ultmarc = ultmarc_service.info_ultmarc_inst_view(inst_id[ultmarc_inst_form.page_num], session) + ultmarc = ultmarc_service.prepare_ultmarc_inst_info_view(inst_id[ultmarc_inst_form.page_num]) # バッチ起動判定の取得 ultmarc.is_batch_processing = is_batch_processing @@ -175,6 +183,10 @@ def ultmarc_inst_info_search( ) return templates_response +######################### +# アルトマーク医師検索 # +######################### + @router.get('/docSearch') def ultmarc_doctor_view( @@ -187,7 +199,7 @@ def ultmarc_doctor_view( is_batch_processing = batch_status_service.is_batch_processing() # 検索項目の取得(都道府県) - ultmarc = ultmarc_service.prepare_ultmarc_doctor_view(session) + ultmarc = ultmarc_service.prepare_ultmarc_doctor_search_view() ultmarc.is_batch_processing = is_batch_processing # セッション書き換え @@ -218,14 +230,14 @@ def search_doc( session: UserSession = request.session # バッチ処理中ステータスを取得 - # is_batch_processing = batch_status_service.is_batch_processing() + is_batch_processing = batch_status_service.is_batch_processing() # 医師データを検索 ultmarc_doctor_data = ultmarc_service.search_doctor_data(ultmarc_doctor_form) # 検索項目などのデータを取得 - ultmarc = ultmarc_service.prepare_ultmarc_doctor_view(session) - ultmarc.is_batch_processing = batch_status_service.is_batch_processing() + ultmarc = ultmarc_service.prepare_ultmarc_doctor_search_view() + ultmarc.is_batch_processing = is_batch_processing ultmarc.doctor_data = ultmarc_doctor_data ultmarc.form_data = ultmarc_doctor_form @@ -246,6 +258,10 @@ def search_doc( ) return templates_response +######################### +# アルトマーク医師詳細 # +######################### + @router.get('/docInfo') def ultmarc_doctor_info_view( @@ -259,7 +275,7 @@ def ultmarc_doctor_info_view( is_batch_processing = batch_status_service.is_batch_processing() # 医師情報の取得 - ultmarc = ultmarc_service.info_ultmarc_doctor_view(id, session) + ultmarc = ultmarc_service.prepare_ultmarc_doctor_info_view(id) # バッチ起動判定の取得 ultmarc.is_batch_processing = is_batch_processing # doc_id @@ -301,7 +317,7 @@ def ultmarc_doctor_info_search( doc_id = ultmarc_doctor_form.doc_id.split(',') # 医師情報の取得 - ultmarc = ultmarc_service.info_ultmarc_doctor_view(doc_id[ultmarc_doctor_form.page_num], session) + ultmarc = ultmarc_service.prepare_ultmarc_doctor_info_view(doc_id[ultmarc_doctor_form.page_num]) # バッチ起動判定の取得 ultmarc.is_batch_processing = is_batch_processing # doc_id diff --git a/ecs/jskult-webapp/src/model/request/ultmarc_doctor.py b/ecs/jskult-webapp/src/model/request/ultmarc_doctor.py index 135869b9..e1fd6224 100644 --- a/ecs/jskult-webapp/src/model/request/ultmarc_doctor.py +++ b/ecs/jskult-webapp/src/model/request/ultmarc_doctor.py @@ -19,6 +19,7 @@ class UltmarcDoctorSearchModel(BaseModel): trt_course_name: Optional[str] alma: Optional[str] grad_y: Optional[str] + pagination_pageNumber: Optional[int] @classmethod def as_form( @@ -33,7 +34,8 @@ class UltmarcDoctorSearchModel(BaseModel): ctrl_blng_sec_name: str = Form(None), ctrl_trt_course_name: str = Form(None), ctrl_alma: str = Form(None), - ctrl_grad_y: str = Form(None) + ctrl_grad_y: str = Form(None), + pagination_pageNumber: str = Form(None) ): return cls( @@ -47,7 +49,8 @@ class UltmarcDoctorSearchModel(BaseModel): blng_sec_name=ctrl_blng_sec_name, trt_course_name=ctrl_trt_course_name, alma=ctrl_alma, - grad_y=ctrl_grad_y + grad_y=ctrl_grad_y, + pagination_pageNumber=pagination_pageNumber ) diff --git a/ecs/jskult-webapp/src/model/request/ultmarc_inst.py b/ecs/jskult-webapp/src/model/request/ultmarc_inst.py index 1b5972ff..8f28df30 100644 --- a/ecs/jskult-webapp/src/model/request/ultmarc_inst.py +++ b/ecs/jskult-webapp/src/model/request/ultmarc_inst.py @@ -7,7 +7,7 @@ from src.util.sanitize import sanitize @sanitize -class UltmarcInstModel(BaseModel): +class UltmarcInstSearchModel(BaseModel): dcf_dsf_inst_cd: Optional[str] inst_div_cd: Optional[str] form_inst_name_kanji: Optional[str] @@ -17,6 +17,7 @@ class UltmarcInstModel(BaseModel): prefc_cd: Optional[str] delFlg: Optional[str] inst_addr: Optional[str] + pagination_pageNumber: Optional[int] @classmethod def as_form( @@ -29,7 +30,8 @@ class UltmarcInstModel(BaseModel): ctrl_inst_phone_number: str = Form(None), ctrl_prefc_cd: str = Form(None), delFlg_ctrl: str = Form(None), - ctrl_inst_addr: str = Form(None) + ctrl_inst_addr: str = Form(None), + pagination_pageNumber: str = Form(None) ): return cls( dcf_dsf_inst_cd=ctrl_dcf_dsf_inst_cd, @@ -40,7 +42,8 @@ class UltmarcInstModel(BaseModel): inst_phone_number=ctrl_inst_phone_number, prefc_cd=ctrl_prefc_cd, delFlg=delFlg_ctrl, - inst_addr=ctrl_inst_addr + inst_addr=ctrl_inst_addr, + pagination_pageNumber=pagination_pageNumber ) diff --git a/ecs/jskult-webapp/src/model/view/bio_view_model.py b/ecs/jskult-webapp/src/model/view/bio_view_model.py index 70017932..8f5e4875 100644 --- a/ecs/jskult-webapp/src/model/view/bio_view_model.py +++ b/ecs/jskult-webapp/src/model/view/bio_view_model.py @@ -127,7 +127,7 @@ class BioViewModel(BaseModel): return len(self.bio_data) == 0 def is_data_overflow_max_length(self): - return len(self.bio_data) >= environment.BIO_SEARCH_RESULT_MAX_COUNT + return len(self.bio_data) > environment.BIO_SEARCH_RESULT_MAX_COUNT def _format_date_string(self, date_string): if date_string is None: diff --git a/ecs/jskult-webapp/src/model/view/ultmarc_doctor_info_view_model.py b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_info_view_model.py index ddbd5542..e84a3f3f 100644 --- a/ecs/jskult-webapp/src/model/view/ultmarc_doctor_info_view_model.py +++ b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_info_view_model.py @@ -27,42 +27,6 @@ class UltmarcDoctorInfoViewModel(BaseModel): post_cnt: Optional[int] page_num: Optional[int] - # 医師コード - def is_input_dcf_pcf_dr_cd(self): - return self.doctor_info_data.dcf_pcf_dr_cd or '' - - # 氏名(漢字) - def is_input_dr_name(self): - return self.doctor_info_data.dr_name or '' - - # 氏名(かな・カナ) - def is_input_dr_name_kana(self): - return self.doctor_info_data.dr_name_kana or '' - - # 性別 - def is_input_sex(self): - return self.doctor_info_data.sex or '' - - # 出身大学 - def is_input_alma(self): - return self.doctor_info_data.alma or '' - - # 出身県 - def is_input_hometown(self): - return self.doctor_info_data.hometown or '' - - # 卒年 - def is_input_grad_y(self): - return self.doctor_info_data.grad_y or '' - - # 登録年 - def is_input_drday_y(self): - return self.doctor_info_data.drday_y or '' - - # 開業年 - def is_input_estab_y(self): - return self.doctor_info_data.estab_y or '' - # 現在のページ(表示用) def is_page_num_view(self): return self.page_num + 1 @@ -77,6 +41,7 @@ class UltmarcDoctorInfoViewModel(BaseModel): return 'disabled' return '' + # 生年月日 def is_input_birthday_fromat(self): return self._format_date_string(self.doctor_info_data.birthday) @@ -88,9 +53,6 @@ class UltmarcDoctorInfoViewModel(BaseModel): def is_input_trt_course_data_size(self): return len(self.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 '' @@ -101,7 +63,7 @@ class UltmarcDoctorInfoViewModel(BaseModel): return len(self.doctor_data) == 0 def is_data_overflow_max_length(self): - return len(self.doctor_data) >= environment.UTL_SEARCH_RESULT_MAX_COUNT + return len(self.doctor_data) > environment.ULTMARC_SEARCH_RESULT_MAX_COUNT def _format_date_string(self, date_string): if date_string is None: diff --git a/ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py index a97956fd..0cb0123d 100644 --- a/ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py +++ b/ecs/jskult-webapp/src/model/view/ultmarc_doctor_view_model.py @@ -21,6 +21,12 @@ class UltmarcDoctorViewModel(BaseModel): 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_pagination_pageNumber(self): + if not self.is_form_submitted(): + return 1 + return self.form_data.pagination_pageNumber or 1 + # 医師コード def is_input_dcf_pcf_dr_cd(self): if not self.is_form_submitted(): @@ -102,7 +108,7 @@ class UltmarcDoctorViewModel(BaseModel): return len(self.doctor_data) == 0 def is_data_overflow_max_length(self): - return len(self.doctor_data) >= environment.UTL_SEARCH_RESULT_MAX_COUNT + return len(self.doctor_data) > environment.ULTMARC_SEARCH_RESULT_MAX_COUNT def _selected_value(self, form_value: str, current_value: str): return 'selected' if form_value == current_value else '' diff --git a/ecs/jskult-webapp/src/model/view/ultmarc_inst_info_view_model.py b/ecs/jskult-webapp/src/model/view/ultmarc_inst_info_view_model.py index 7caad57b..4244bef4 100644 --- a/ecs/jskult-webapp/src/model/view/ultmarc_inst_info_view_model.py +++ b/ecs/jskult-webapp/src/model/view/ultmarc_inst_info_view_model.py @@ -17,171 +17,30 @@ class UltmarcInstInfoViewModel(BaseModel): post_cnt: Optional[int] page_num: Optional[int] - # 施設コード - 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 '' @@ -190,26 +49,6 @@ class UltmarcInstInfoViewModel(BaseModel): 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) @@ -239,9 +78,6 @@ class UltmarcInstInfoViewModel(BaseModel): 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 '' @@ -252,4 +88,4 @@ class UltmarcInstInfoViewModel(BaseModel): return len(self.doctor_data) == 0 def is_data_overflow_max_length(self): - return len(self.doctor_data) >= environment.UTL_SEARCH_RESULT_MAX_COUNT + return len(self.doctor_data) > environment.ULTMARC_SEARCH_RESULT_MAX_COUNT diff --git a/ecs/jskult-webapp/src/model/view/ultmarc_inst_view_model.py b/ecs/jskult-webapp/src/model/view/ultmarc_inst_view_model.py index f98794d3..6215f8bf 100644 --- a/ecs/jskult-webapp/src/model/view/ultmarc_inst_view_model.py +++ b/ecs/jskult-webapp/src/model/view/ultmarc_inst_view_model.py @@ -6,7 +6,7 @@ from pydantic import BaseModel from src.model.db.inst_div_master import InstDivMasterModel from src.model.db.prefc_master import PrefcMasterModel from src.model.db.ultmarc_inst import UltmarcInstDBModel -from src.model.request.ultmarc_inst import UltmarcInstModel +from src.model.request.ultmarc_inst import UltmarcInstSearchModel from src.system_var import environment @@ -16,13 +16,19 @@ class UltmarcInstViewModel(BaseModel): prefc_models: list[PrefcMasterModel] inst_div_models: list[InstDivMasterModel] inst_data: Optional[list[UltmarcInstDBModel]] = [] - form_data: Optional[UltmarcInstModel] + form_data: Optional[UltmarcInstSearchModel] 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.inst_data], ensure_ascii=False, default=date_handler) + # ページネーションのページ番号 + def is_input_pagination_pageNumber(self): + if not self.is_form_submitted(): + return 1 + return self.form_data.pagination_pageNumber or 1 + # ULT施設コード def is_input_dcf_dsf_inst_cd(self): if not self.is_form_submitted(): @@ -102,7 +108,7 @@ class UltmarcInstViewModel(BaseModel): return len(self.inst_data) == 0 def is_data_overflow_max_length(self): - return len(self.inst_data) >= environment.UTL_SEARCH_RESULT_MAX_COUNT + return len(self.inst_data) >= environment.ULTMARC_SEARCH_RESULT_MAX_COUNT def _selected_value(self, form_value: str, current_value: str): return 'selected' if form_value == current_value else '' diff --git a/ecs/jskult-webapp/src/repositories/ultmarc_inst_repository.py b/ecs/jskult-webapp/src/repositories/ultmarc_inst_repository.py index 2ceebd0a..95e8605c 100644 --- a/ecs/jskult-webapp/src/repositories/ultmarc_inst_repository.py +++ b/ecs/jskult-webapp/src/repositories/ultmarc_inst_repository.py @@ -2,7 +2,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.model.request.ultmarc_inst import UltmarcInstSearchModel from src.repositories.base_repository import BaseRepository from src.util.string_util import is_not_empty @@ -30,11 +30,11 @@ class UltmarcInstRepository(BaseRepository): \ """ - def fetch_many(self, parameter: UltmarcInstModel) -> list[UltmarcInstDBModel]: + def fetch_many(self, parameter: UltmarcInstSearchModel) -> list[UltmarcInstDBModel]: try: self._database.connect() # 文字列の検索を部分一致にするため、モデルをコピー。以降はこのコピーを使用する。 - clone_parameter = UltmarcInstModel(**parameter.dict()) + clone_parameter = UltmarcInstSearchModel(**parameter.dict()) where_clause = self.__build_condition(clone_parameter) query = self.FETCH_SQL.format(where_clause=where_clause) result = self._database.execute_select(query, clone_parameter.dict()) @@ -48,7 +48,7 @@ class UltmarcInstRepository(BaseRepository): finally: self._database.disconnect() - def __build_condition(self, parameter: UltmarcInstModel): + def __build_condition(self, parameter: UltmarcInstSearchModel): where_clauses: list[SQLCondition] = [] # ULT施設コード diff --git a/ecs/jskult-webapp/src/services/ultmarc_view_service.py b/ecs/jskult-webapp/src/services/ultmarc_view_service.py index 44f99cda..5c441421 100644 --- a/ecs/jskult-webapp/src/services/ultmarc_view_service.py +++ b/ecs/jskult-webapp/src/services/ultmarc_view_service.py @@ -1,7 +1,6 @@ from src.aws.aws_api_client import AWSAPIClient -from src.model.internal.session import UserSession from src.model.request.ultmarc_doctor import UltmarcDoctorSearchModel -from src.model.request.ultmarc_inst import UltmarcInstModel +from src.model.request.ultmarc_inst import UltmarcInstSearchModel from src.model.view.ultmarc_doctor_info_view_model import \ UltmarcDoctorInfoViewModel from src.model.view.ultmarc_doctor_view_model import UltmarcDoctorViewModel @@ -66,10 +65,13 @@ class UltmarcViewService(BaseService): self.ultmarc_doctor_wrkplace_his_repository = repositories['ultmarc_doctor_wrkplace_his_repository'] self.ultmarc_specialist_license_repository = repositories['ultmarc_specialist_license_repository'] - def prepare_ultmarc_doctor_view( - self, - session: UserSession + ######################### + # アルトマーク医師 # + ######################### + def prepare_ultmarc_doctor_search_view( + self ) -> UltmarcDoctorViewModel: + # 医師一覧画面の表示データ取得 # 都道府県リストを取得 prefcs = self.prefc_repository.fetch_all() @@ -78,58 +80,15 @@ class UltmarcViewService(BaseService): ) return ultmarc - def ultmarc_inst_view( - self, - session: UserSession - ) -> UltmarcInstViewModel: - # 都道府県リストを取得 - prefcs = self.prefc_repository.fetch_all() - # 施設区分リストを取得 - inst_div = self.inst_div_repository.fetch_all() - - ultmarc = UltmarcInstViewModel( - prefc_models=prefcs, - inst_div_models=inst_div - ) - return ultmarc - - def search_inst_data(self, search_params: UltmarcInstModel): - # 施設データを検索 - 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: UltmarcDoctorSearchModel): # 医師データを検索 ultmarc_doctor_data = self.ultmarc_doctor_repository.fetch_many(parameter=search_params) return ultmarc_doctor_data - def info_ultmarc_doctor_view( + def prepare_ultmarc_doctor_info_view( self, - id, - session: UserSession + id ) -> UltmarcDoctorInfoViewModel: - # 医師情報画面の表示データ取得 # 医師情報を取得 doctor_info = self.ultmarc_doctor_repository.fetch_one(id) @@ -153,3 +112,45 @@ class UltmarcViewService(BaseService): doctor_wrkplace_his_data=wrkplace_his ) return ultmarc + + ######################### + # アルトマーク施設 # + ######################### + def prepare_ultmarc_inst_search_view( + self + ) -> UltmarcInstViewModel: + # 施設一覧画面の表示データ取得 + # 都道府県リストを取得 + prefcs = self.prefc_repository.fetch_all() + # 施設区分リストを取得 + inst_div = self.inst_div_repository.fetch_all() + + ultmarc = UltmarcInstViewModel( + prefc_models=prefcs, + inst_div_models=inst_div + ) + return ultmarc + + def search_inst_data(self, search_params: UltmarcInstSearchModel): + # 施設データを検索 + ultmarc_inst_data = self.ultmarc_inst_repository.fetch_many(parameter=search_params) + return ultmarc_inst_data + + def prepare_ultmarc_inst_info_view( + self, + id + ) -> 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 diff --git a/ecs/jskult-webapp/src/system_var/environment.py b/ecs/jskult-webapp/src/system_var/environment.py index 91b661b3..c5bf66ef 100644 --- a/ecs/jskult-webapp/src/system_var/environment.py +++ b/ecs/jskult-webapp/src/system_var/environment.py @@ -19,7 +19,7 @@ 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']) -UTL_SEARCH_RESULT_MAX_COUNT = int(os.environ['UTL_SEARCH_RESULT_MAX_COUNT']) +ULTMARC_SEARCH_RESULT_MAX_COUNT = int(os.environ['ULTMARC_SEARCH_RESULT_MAX_COUNT']) SESSION_EXPIRE_MINUTE = int(os.environ['SESSION_EXPIRE_MINUTE']) LOG_LEVEL = os.environ.get('LOG_LEVEL', 'INFO') diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index 2ab9b7cb..32ca883a 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -176,7 +176,7 @@ {% if bio.is_form_submitted() and bio.is_data_overflow_max_length() %}
- 検索件数が500件を超えています 検索項目を見直してください + 検索結果が最大件数を超えました。検索条件を見直しして下さい。
{% endif %} {% if bio.is_form_submitted() and bio.is_data_empty() %} diff --git a/ecs/jskult-webapp/src/templates/docInfo.html b/ecs/jskult-webapp/src/templates/docInfo.html index 1a40192b..ca70b292 100644 --- a/ecs/jskult-webapp/src/templates/docInfo.html +++ b/ecs/jskult-webapp/src/templates/docInfo.html @@ -84,30 +84,30 @@ 医師コード: - + 氏名(漢字): - + 氏名(カナ): - + 性別: - + 生年月日: 出身大学: - + 出身県: - + 卒年: - + 登録年: - + 開業年: - + @@ -141,8 +141,8 @@ {% for sosiety_data in ultmarc.sosiety_data %} - {{ultmarc.is_data_string_empty_fromat(sosiety_data.sosiety_cd)}} - {{ultmarc.is_data_string_empty_fromat(sosiety_data.sosiety_name)}} + {{sosiety_data.sosiety_cd or ''}} + {{sosiety_data.sosiety_name or ''}} {% endfor %} @@ -162,8 +162,8 @@ {% for specialist_license_data in ultmarc.specialist_license_data %} - {{ultmarc.is_data_string_empty_fromat(specialist_license_data.specialist_cd)}} - {{ultmarc.is_data_string_empty_fromat(specialist_license_data.specialist_license_name)}} + {{specialist_license_data.specialist_cd or ''}} + {{specialist_license_data.specialist_license_name or ''}} {% endfor %} @@ -176,7 +176,7 @@

勤務先履歴

- +
@@ -196,31 +196,30 @@ {% for doctor_wrkplace_data in ultmarc.doctor_wrkplace_data %} - {% if ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.dcf_dsf_inst_cd) != ''%} + {% if doctor_wrkplace_data.dcf_dsf_inst_cd %} - - - - - - + + + + + + {% endif %} {% endfor %} {% 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) != ''%} + {% if doctor_wrkplace_his_data.dcf_dsf_inst_cd %} - - - - - - - + + + + + + + {% endif %} {% endfor %} diff --git a/ecs/jskult-webapp/src/templates/docSearch.html b/ecs/jskult-webapp/src/templates/docSearch.html index 3d532374..1654f1eb 100644 --- a/ecs/jskult-webapp/src/templates/docSearch.html +++ b/ecs/jskult-webapp/src/templates/docSearch.html @@ -111,11 +111,12 @@ - + + @@ -140,7 +141,7 @@
ULT施設コード
- {{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.dcf_dsf_inst_cd)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.inst_name_kanji)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.blng_sec_name)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.univ_post_name)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_data.post_name)}}{{ultmarc.is_input_ymd_fromat(doctor_wrkplace_data.aply_start_ymd)}} + {{doctor_wrkplace_data.dcf_dsf_inst_cd or ''}}{{doctor_wrkplace_data.inst_name_kanji or ''}}{{doctor_wrkplace_data.blng_sec_name or ''}}{{doctor_wrkplace_data.univ_post_name or ''}}{{doctor_wrkplace_data.post_name or ''}}{{doctor_wrkplace_data.aply_start_ymd or ''}} 9999/99/99
- {{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.dcf_dsf_inst_cd)}} - {{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.inst_name_kanji)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.blng_sec_name)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.univ_post_name)}}{{ultmarc.is_data_string_empty_fromat(doctor_wrkplace_his_data.post_name)}}{{ultmarc.is_input_ymd_fromat(doctor_wrkplace_his_data.aply_start_ymd)}}{{ultmarc.is_input_ymd_fromat(doctor_wrkplace_his_data.aply_end_ymd)}} + {{doctor_wrkplace_his_data.dcf_dsf_inst_cd or ''}}{{doctor_wrkplace_his_data.inst_name_kanji or ''}}{{doctor_wrkplace_his_data.blng_sec_name or ''}}{{doctor_wrkplace_his_data.univ_post_name or ''}}{{doctor_wrkplace_his_data.post_name or ''}}{{doctor_wrkplace_his_data.aply_start_ymd or ''}}{{doctor_wrkplace_his_data.aply_end_ymd or ''}}
{% if ultmarc.is_form_submitted() and ultmarc.is_data_overflow_max_length() %}
- 検索結果が最大件数を超えました。検索条件を見直しして下さい。 + 検索件数が500件を超えています 検索項目を見直してください
{% endif %} {% if ultmarc.is_form_submitted() and ultmarc.is_data_empty() %} @@ -157,14 +158,15 @@ - + diff --git a/ecs/jskult-webapp/src/templates/instSearch.html b/ecs/jskult-webapp/src/templates/instSearch.html index e630b9d8..5ac6c003 100644 --- a/ecs/jskult-webapp/src/templates/instSearch.html +++ b/ecs/jskult-webapp/src/templates/instSearch.html @@ -15,7 +15,7 @@ } - + @@ -37,7 +37,7 @@ ULT施設コード: - 施設区分: @@ -56,22 +56,22 @@ ULT施設名(漢字): - ULT施設名(かな・カナ): - 郵便番号: - 電話番号: - @@ -83,7 +83,7 @@ {% for prefc in ultmarc.prefc_models %} - @@ -91,14 +91,14 @@ - ULT施設住所: - @@ -116,7 +116,7 @@ - + @@ -152,7 +152,7 @@
- + \ No newline at end of file From 3d54ec82599378e1f26793a90aea29237ae7a45f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Tue, 27 Jun 2023 16:21:13 +0900 Subject: [PATCH 24/24] =?UTF-8?q?allon=E3=81=A8alloff=E3=81=AE=E5=89=8A?= =?UTF-8?q?=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../static/function/businessLogicScript.js | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/ecs/jskult-webapp/src/static/function/businessLogicScript.js b/ecs/jskult-webapp/src/static/function/businessLogicScript.js index ee4beb0c..36171aad 100644 --- a/ecs/jskult-webapp/src/static/function/businessLogicScript.js +++ b/ecs/jskult-webapp/src/static/function/businessLogicScript.js @@ -135,26 +135,6 @@ $(function(){ $(".send").prop('disabled',true); }); -// チェックボックス全選択関数 -// 条件:チェックボックスのクラス名に"selectedページ数"というのがついていること -// 条件:ボタンにクラス名 send がついていること -function allOn(){ - var selected = ".selected" + tableCurrentPage + " input.checkbox"; - $(selected).prop("checked", true); - $(".send").prop('disabled',false); -} - -// チェックボックス全解除関数 -// 条件:チェックボックスのクラス名に"selectedページ数"というのがついていること -// 条件:ボタンにクラス名 send がついていること -function allOff(pageCount){ - for (var i = 1; i <= pageCount; i++) { - var selected = ".selected" + i + " input.checkbox"; - $(selected).prop("checked", false); - } - $(".send").prop('disabled',true); -} - // 検索結果のところのボタンをチェックが1個でも付いたら押せるようにして、チェックがなければ押せないようにする関数 // 条件:チェックボックスのクラス名に"selectedページ数"というのがついていること // 条件:ボタンにクラス名 send がついていること