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) {