From 6034009480341f4ec3ad56ab6f6100170bd4b64f Mon Sep 17 00:00:00 2001 From: "mori.k" Date: Fri, 30 May 2025 10:09:16 +0900 Subject: [PATCH 01/11] =?UTF-8?q?=E3=83=A1=E3=83=AB=E3=82=AF=E6=96=BD?= =?UTF-8?q?=E8=A8=AD=E3=83=9E=E3=82=B9=E3=82=BF=E4=BD=9C=E6=88=90=20first?= =?UTF-8?q?=20commit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch/src/batch/mst_inst_all.py | 322 ++++++++++++++++++++- 1 file changed, 319 insertions(+), 3 deletions(-) diff --git a/ecs/jskult-batch/src/batch/mst_inst_all.py b/ecs/jskult-batch/src/batch/mst_inst_all.py index d396e7fc..cef6a3fd 100644 --- a/ecs/jskult-batch/src/batch/mst_inst_all.py +++ b/ecs/jskult-batch/src/batch/mst_inst_all.py @@ -1,10 +1,326 @@ -from src.batch.jskult_batch_entrypoint import JskultBatchEntrypoint +import csv +import json +import os.path as path +import tempfile +from src.aws.s3 import JskSendBucket, JskTransferListBucket +from src.batch.jskult_batch_entrypoint import JskultBatchEntrypoint +from src.db.database import Database +from src.error.exceptions import (BatchOperationException, + MaxRunCountReachedException) +from src.logging.get_logger import get_logger +from src.manager.jskult_batch_run_manager import JskultBatchRunManager +from src.manager.jskult_batch_status_manager import JskultBatchStatusManager +from src.manager.jskult_hdke_tbl_manager import JskultHdkeTblManager +from src.system_var import environment + +logger = get_logger('メルク施設マスタ作成') class MstInstAll(JskultBatchEntrypoint): def __init__(self): super().__init__() def execute(self): - # TODO: ここでメルク施設マスタ作成処理を実行する - pass + logger.info("メルク施設マスタ作成処理を開始します。") + jskult_hdke_tbl_manager = JskultHdkeTblManager() + jskult_batch_run_manager = JskultBatchRunManager( + environment.BATCH_EXECUTION_ID) + if not jskult_hdke_tbl_manager.can_run_process(): + logger.error( + '日次バッチ処理中またはdump取得が正常終了していないため、メルク施設マスタ作成処理を終了します。') + # バッチ実行管理テーブルをfailedで登録 + jskult_batch_run_manager.batch_failed() + return + + # 業務日付を取得 + _, _, process_date = jskult_hdke_tbl_manager.get_batch_statuses() + + # 転送ファイル一覧を取得し、転送件数を取得 + try: + transfer_list_bucket = JskTransferListBucket() + transfer_list_file_path = transfer_list_bucket.download_transfer_result_file( + process_date) + except Exception as e: + logger.exception(f'転送ファイル一覧の取得に失敗しました。 {e}') + # バッチ実行管理テーブルをfailedで登録 + jskult_batch_run_manager.batch_failed() + + with open(transfer_list_file_path) as f: + transfer_list = json.load(f) + + # 実消化データ + アルトマークデータの転送件数を合算し、受信ファイル件数とする + receive_file_count = len( + transfer_list['jsk_transfer_list']) + len(transfer_list['ult_transfer_list']) + + jskult_batch_status_manager = JskultBatchStatusManager( + environment.PROCESS_NAME, + # TODO チケットNEWDWH2021-1847の実装で作成した定数に置き換え + 'post_process', + environment.MAX_RUN_COUNT, + receive_file_count + ) + try: + + jskult_batch_status_manager.set_process_status("start") + try: + if not jskult_batch_status_manager.can_run_post_process(): + # 後続処理の起動条件を満たしていない場合 + # 処理ステータスを「処理待」に設定 + jskult_batch_status_manager.set_process_status("waiting") + + # バッチ実行管理テーブルに「retry」で登録 + jskult_batch_run_manager.batch_retry() + + return + except MaxRunCountReachedException: + logger.info('最大起動回数に到達したため、メルク施設マスタ作成処理を実行します。') + + jskult_batch_status_manager.set_process_status("doing") + + # アルトマーク取込が実行されていた場合にDCF施設削除新規マスタの作成処理を実行 + if jskult_batch_status_manager.is_done_ultmarc_import(): + self._db = Database.get_instance() + self._db.connect() + logger.debug('メルク施設マスタ作成処理開始') + # mst_instをTruncate + self._truncate_mst_inst(self._db) + # fcl_mst_vから、mst_instへInsert + self._insert_mst_inst_from_fcl_mst_v(self._db) + # com_instから、mst_instへInsert + self._insert_mst_inst_from_com_inst(self._db) + logger.debug('メルク施設マスタ作成処理終了') + except Exception as e: + raise BatchOperationException(e) + finally: + self._db.disconnect() + + + def _truncate_mst_inst(db: Database): + try: + db.execute("TRUNCATE TABLE src05.mst_inst") + except Exception as e: + logger.debug("メルク施設マスタの全件削除に失敗") + raise e + + logger.debug("メルク施設マスタの全件削除に成功") + return + + + def _insert_mst_inst_from_fcl_mst_v(db: Database): + # fcl_mst_vから、mst_instへInsert + try: + sql = """ + INSERT INTO + src05.mst_inst ( + inst_cd, + inst_clas_cd, + inst_name_form, + inst_name, + pref_cd, + city_cd, + pref_name, + city_name, + address, + postal_cd, + tel_num, + delete_date, + v_inst_cd, + create_date, + update_date + ) + SELECT + fmv1.v_inst_cd, + CASE + WHEN fmv1.fcl_type IN ('A1', 'A0') THEN '3' + WHEN fmv1.fcl_type BETWEEN '20' AND '29' THEN '2' + END AS inst_clas_cd, + fmv1.fcl_name, + fmv1.fcl_abb_name, + fmv1.prft_cd, + RIGHT(fmv1.admin_kbn, 3), + mp.prefc_name, + LEFT(mc.city_name, 40), + CASE + WHEN fmv1.fcl_type IN ('A1', 'A0') THEN LEFT(fmv1.fmt_addr, 200) + WHEN fmv1.fcl_type BETWEEN '20' AND '29' THEN CONCAT(fmv1.prft_name,fmv1.city_name,fmv1.addr_line_1) + END AS address, + fmv1.postal_cd, + fmv1.tel_num, + CASE + WHEN + fmv1.fcl_type BETWEEN '20' AND '29' THEN LEFT(fmv1.closed_dt, 10) + WHEN + fmv1.fcl_type IN ('A1', 'A0') AND fmv1.end_date != '9999-12-31' THEN DATE_FORMAT(fmv1.end_date, "%Y-%m-%d") + ELSE + null + END AS delete_date, + fmv1.v_inst_cd, + fmv1.ins_dt, + fmv1.upd_dt + FROM + src05.fcl_mst_v AS fmv1 + INNER JOIN ( + SELECT + v_inst_cd, + MAX(sub_num) AS sno + FROM + src05.fcl_mst_v + GROUP BY + v_inst_cd + ) fmv2 + ON fmv1.v_inst_cd = fmv2.v_inst_cd + AND fmv1.sub_num = fmv2.sno + LEFT OUTER JOIN src05.mst_prefc AS mp + ON fmv1.prft_cd = mp.prefc_cd + LEFT OUTER JOIN src05.mst_city AS mc + ON LEFT(fmv1.admin_kbn, 2) = mc.prefc_cd + AND RIGHT(fmv1.admin_kbn, 3) = mc.city_cd + WHERE + ((fmv1.fcl_type IN ('A1', 'A0')) OR fmv1.fcl_type BETWEEN '20' AND '29') + AND fmv1.rec_sts_kbn != '9' + """ + res = db.execute(sql) + logger.info(f'V施設マスタからメルク施設マスタに登録成功') + except Exception as e: + logger.debug("V施設マスタからメルク施設マスタに登録失敗") + raise e + + return + + + def _insert_mst_inst_from_com_inst(db: Database): + # オプティマイザのderived_mergeフラグをoffにする + try: + sql = """ + SET SESSION optimizer_switch = 'derived_merge=off' + """ + db.execute(sql) + logger.debug("オプティマイザのderived_mergeフラグ = Off") + except Exception as e: + logger.debug("オプティマイザのderived_mergeフラグの値変更に失敗") + raise e + + # com_instから、mst_instへInsert + try: + sql = """ + INSERT INTO + src05.mst_inst ( + inst_cd, + inst_clas_cd, + inst_name_form, + inst_name, + pref_cd, + city_cd, + pref_name, + city_name, + address, + postal_cd, + tel_num, + bed_num, + manage_cd, + manage_name, + delete_date, + inst_div_cd, + inst_div_name, + v_inst_cd, + creater, + create_date, + updater, + update_date + ) + SELECT + ci.dcf_dsf_inst_cd, + '1', + ci.form_inst_name_kanji, + ci.inst_name_kanji, + ci.prefc_cd, + ci.city_cd, + mp.prefc_name, + LEFT(mc.city_name, 40), + ci.inst_addr, + ci.postal_number, + ci.inst_phone_number, + ci.bed_num, + ci.manage_cd, + LEFT(cm.manage_name, 40), + ci.abolish_ymd, + ci.inst_div_cd, + LEFT(cid.inst_div_name, 40), + mcmv.hco_vid_v, + ci.create_user, + ci.regist_date, + ci.update_user, + ci.update_date + FROM + src05.com_inst AS ci + LEFT OUTER JOIN src05.mst_prefc AS mp + ON ci.prefc_cd = mp.prefc_cd + LEFT OUTER JOIN src05.mst_city AS mc + ON ci.prefc_cd = mc.prefc_cd + AND ci.city_cd = mc.city_cd + LEFT OUTER JOIN src05.com_manage AS cm + ON ci.manage_cd = cm.manage_cd + LEFT OUTER JOIN src05.com_inst_div AS cid + ON ci.inst_div_cd = cid.inst_div_cd + LEFT OUTER JOIN ( -- MDBコード変換表を使用してV施設コードを取得するためのテーブル結合 + SELECT + mcmv4.* + FROM ( + SELECT + mcmv1.* + FROM + src05.mdb_cnv_mst_v AS mcmv1 + INNER JOIN ( + SELECT + mcmv2.hco_vid_v, + MAX(mcmv2.sub_num) AS sno -- MDBコード変換データの枝番MAX + FROM + src05.mdb_cnv_mst_v mcmv2 + WHERE + mcmv2.rec_sts_kbn != '9' -- 状態区分9(削除)以外 and 適用開始≦日付テーブル.処理日 + AND src05.get_syor_date() >= mcmv2.start_date + GROUP BY + mcmv2.hco_vid_v + ) AS mcmv3 + ON mcmv1.hco_vid_v = mcmv3.hco_vid_v + AND mcmv1.sub_num = mcmv3.sno + ) AS mcmv4 + INNER JOIN ( + SELECT + MIN(mcmv8.hco_vid_v) AS hvv, -- 1つのMDBコードに対し、複数のV施設コードが割り当てられている場合、最小のV施設コードを選択する + mcmv8.mdb_cd + FROM ( + SELECT + mcmv5.* + FROM + src05.mdb_cnv_mst_v AS mcmv5 + INNER JOIN ( + SELECT + mcmv6.hco_vid_v, + MAX(mcmv6.sub_num) AS sno -- MDBコード変換データの枝番MAX + FROM + src05.mdb_cnv_mst_v AS mcmv6 + WHERE + mcmv6.rec_sts_kbn != '9' -- 状態区分9(削除)以外 and 適用開始≦日付テーブル.処理日 + AND src05.get_syor_date() >= mcmv6.start_date + GROUP BY + mcmv6.hco_vid_v + ) AS mcmv7 + ON mcmv5.hco_vid_v = mcmv7.hco_vid_v + AND mcmv5.sub_num = mcmv7.sno + ) AS mcmv8 + GROUP BY + mcmv8.mdb_cd + ) AS mcmv9 + ON mcmv4.mdb_cd = mcmv9.mdb_cd + AND mcmv4.hco_vid_v = mcmv9.hvv + ) AS mcmv + ON ci.dcf_dsf_inst_cd = mcmv.mdb_cd + """ + res = db.execute(sql) + logger.info(f'COM施設からメルク施設マスタに登録成功') + except Exception as e: + logger.debug("COM施設からメルク施設マスタに登録失敗") + raise e + + return From fe26aa38cf622dd4c1415ea0a90ee09d33b65611 Mon Sep 17 00:00:00 2001 From: "mori.k" Date: Fri, 30 May 2025 14:23:57 +0900 Subject: [PATCH 02/11] =?UTF-8?q?feat:=20jskult-batch=E5=86=85=E3=81=AE?= =?UTF-8?q?=E5=90=84=E6=A9=9F=E8=83=BD=E4=BA=8B=E3=81=AB=E4=BD=BF=E3=81=86?= =?UTF-8?q?=E7=92=B0=E5=A2=83=E5=A4=89=E6=95=B0=E3=82=92=E5=88=87=E3=82=8A?= =?UTF-8?q?=E5=88=86=E3=81=91=E3=82=89=E3=82=8C=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E3=82=AF=E3=83=A9=E3=82=B9=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/dcf_inst_merge_io.py | 45 +++++++++++------ .../batch/environment/__init__.py} | 0 .../environment/dcf_inst_merge_environment.py | 48 +++++++++++++++++++ .../environment/jskult_batch_environment.py | 26 ++++++++++ ecs/jskult-batch/src/error/exceptions.py | 4 ++ .../src/system_var/environment.py | 29 ++++++----- 6 files changed, 125 insertions(+), 27 deletions(-) rename ecs/jskult-batch/{test.py => src/batch/environment/__init__.py} (100%) create mode 100644 ecs/jskult-batch/src/batch/environment/dcf_inst_merge_environment.py create mode 100644 ecs/jskult-batch/src/batch/environment/jskult_batch_environment.py diff --git a/ecs/jskult-batch/src/batch/dcf_inst_merge_io.py b/ecs/jskult-batch/src/batch/dcf_inst_merge_io.py index 82c7cfbe..499cfa98 100644 --- a/ecs/jskult-batch/src/batch/dcf_inst_merge_io.py +++ b/ecs/jskult-batch/src/batch/dcf_inst_merge_io.py @@ -4,15 +4,18 @@ import os.path as path import tempfile from src.aws.s3 import JskSendBucket, JskTransferListBucket +from src.batch.environment.dcf_inst_merge_environment import \ + DCFInstMergeEnvironment from src.batch.jskult_batch_entrypoint import JskultBatchEntrypoint from src.db.database import Database from src.error.exceptions import (BatchOperationException, + EnvironmentVariableNotSetException, MaxRunCountReachedException) from src.logging.get_logger import get_logger from src.manager.jskult_batch_run_manager import JskultBatchRunManager from src.manager.jskult_batch_status_manager import JskultBatchStatusManager from src.manager.jskult_hdke_tbl_manager import JskultHdkeTblManager -from src.system_var import environment +from src.system_var import constants logger = get_logger('DCF削除新規マスタ作成') @@ -20,12 +23,22 @@ logger = get_logger('DCF削除新規マスタ作成') class DcfInstMergeIO(JskultBatchEntrypoint): def __init__(self): super().__init__() + # 環境変数をimport + self.environment = DCFInstMergeEnvironment() def execute(self): logger.info("DCF削除新規マスタ作成処理を開始します。") + + # 必須の環境変数が設定されていない場合、エラーにする + try: + self.environment.validate() + except EnvironmentVariableNotSetException as e: + logger.exception(e) + return + jskult_hdke_tbl_manager = JskultHdkeTblManager() jskult_batch_run_manager = JskultBatchRunManager( - environment.BATCH_EXECUTION_ID) + self.environment.BATCH_EXECUTION_ID) if not jskult_hdke_tbl_manager.can_run_process(): logger.error( '日次バッチ処理中またはdump取得が正常終了していないため、DCF削除新規マスタ作成を終了します。') @@ -54,20 +67,21 @@ class DcfInstMergeIO(JskultBatchEntrypoint): transfer_list['jsk_transfer_list']) + len(transfer_list['ult_transfer_list']) jskult_batch_status_manager = JskultBatchStatusManager( - environment.PROCESS_NAME, - # TODO チケットNEWDWH2021-1847の実装で作成した定数に置き換え - 'post_process', - environment.MAX_RUN_COUNT, + self.environment.PROCESS_NAME, + constants.PROCESS_TYPE_POST_PROCESS, + self.environment.MAX_RUN_COUNT, receive_file_count ) try: - jskult_batch_status_manager.set_process_status("start") + jskult_batch_status_manager.set_process_status( + constants.PROCESS_STATUS_START) try: if not jskult_batch_status_manager.can_run_post_process(): # 後続処理の起動条件を満たしていない場合 # 処理ステータスを「処理待」に設定 - jskult_batch_status_manager.set_process_status("waiting") + jskult_batch_status_manager.set_process_status( + constants.PROCESS_STATUS_WAITING) # バッチ実行管理テーブルに「retry」で登録 jskult_batch_run_manager.batch_retry() @@ -76,7 +90,8 @@ class DcfInstMergeIO(JskultBatchEntrypoint): except MaxRunCountReachedException: logger.info('最大起動回数に到達したため、DCF削除新規マスタ作成処理を実行します。') - jskult_batch_status_manager.set_process_status("doing") + jskult_batch_status_manager.set_process_status( + constants.PROCESS_STATUS_DOING) # アルトマーク取込が実行されていた場合にDCF施設削除新規マスタの作成処理を実行 if jskult_batch_status_manager.is_done_ultmarc_import(): @@ -90,17 +105,18 @@ class DcfInstMergeIO(JskultBatchEntrypoint): # CSV出力 dcf_inst_merge_all_records = self._select_dcf_inst_merge_all() file_path = self._make_csv_data( - environment.DCF_INST_MERGE_SEND_FILE_NAME, + self.environment.DCF_INST_MERGE_SEND_FILE_NAME, dcf_inst_merge_all_records) # CSVをS3にアップロード self._upload_dcf_inst_merge_csv_file( - file_path, process_date, environment.DCF_INST_MERGE_SEND_FILE_NAME) + file_path, process_date, self.environment.DCF_INST_MERGE_SEND_FILE_NAME) # 処理が全て正常終了した際に、バッチ実行管理テーブルに「success」で登録 logger.info("DCF削除新規マスタ作成処理を正常終了します。") jskult_batch_run_manager.batch_success() - jskult_batch_status_manager.set_process_status("done") + jskult_batch_status_manager.set_process_status( + constants.PROCESS_STATUS_DONE) return @@ -108,7 +124,8 @@ class DcfInstMergeIO(JskultBatchEntrypoint): # 何らかのエラーが発生した際に、バッチ実行管理テーブルに「failed」で登録 logger.exception(f'予期せぬエラーが発生したため、DCF削除新規マスタ作成処理を終了します。{e}') jskult_batch_run_manager.batch_failed() - jskult_batch_status_manager.set_process_status("failed") + jskult_batch_status_manager.set_process_status( + constants.PROCESS_STATUS_ERROR) def _select_dcf_inst_merge_all(self) -> tuple[bool, list[dict]]: try: @@ -272,7 +289,7 @@ class DcfInstMergeIO(JskultBatchEntrypoint): 'CREATER', 'CREATE_DATE', 'UPDATER', 'UPDATE_DATE'] with open(csv_file_path, mode='w', encoding='UTF-8') as csv_file: # ヘッダ行書き込み(くくり文字をつけない為にwriterowではなく、writeを使用しています) - csv_file.write(f"{','.join(head_str)}\n") + csv_file.write(f"{','.join(head_str)}\r\n") # UTF-8、CRLF、価囲いありで書き込む writer = csv.writer(csv_file, delimiter=',', lineterminator='\r\n', quotechar='"', doublequote=True, quoting=csv.QUOTE_ALL, diff --git a/ecs/jskult-batch/test.py b/ecs/jskult-batch/src/batch/environment/__init__.py similarity index 100% rename from ecs/jskult-batch/test.py rename to ecs/jskult-batch/src/batch/environment/__init__.py diff --git a/ecs/jskult-batch/src/batch/environment/dcf_inst_merge_environment.py b/ecs/jskult-batch/src/batch/environment/dcf_inst_merge_environment.py new file mode 100644 index 00000000..3da34501 --- /dev/null +++ b/ecs/jskult-batch/src/batch/environment/dcf_inst_merge_environment.py @@ -0,0 +1,48 @@ +from src.batch.environment.jskult_batch_environment import \ + JskultBatchEnvironment +from src.system_var import environment + + +class DCFInstMergeEnvironment(JskultBatchEnvironment): + """実消化&アルトマークのバッチ処理で使用する環境変数を管理するクラス""" + + def __init__(self): + self.JSK_IO_BUCKET = environment.JSK_IO_BUCKET + self.JSKULT_BACKUP_BUCKET = environment.JSKULT_BACKUP_BUCKET + self.BATCH_MANAGE_DYNAMODB_TABLE_NAME = environment.BATCH_MANAGE_DYNAMODB_TABLE_NAME + self.BATCH_EXECUTION_ID = environment.BATCH_EXECUTION_ID + self.MAX_RUN_COUNT = environment.MAX_RUN_COUNT + self.PROCESS_NAME = environment.PROCESS_NAME + self.JSK_DATA_SEND_FOLDER = environment.JSK_DATA_SEND_FOLDER + self.JSK_BACKUP_FOLDER = environment.JSK_BACKUP_FOLDER + self.TRANSFER_RESULT_FOLDER = environment.TRANSFER_RESULT_FOLDER + self.TRANSFER_RESULT_FILE_NAME = environment.TRANSFER_RESULT_FILE_NAME + self.DCF_INST_MERGE_SEND_FILE_NAME = environment.DCF_INST_MERGE_SEND_FILE_NAME + + def validate(self): + """ + 必須の環境変数が設定されているかどうか検査する。 + DB関連の環境変数は対象外とする。 + + Raises: + EnvironmentVariableNotSetException: 環境変数の設定ミス + """ + super()._assert_variable_not_empty(self.JSK_IO_BUCKET, 'JSK_IO_BUCKET') + super()._assert_variable_not_empty( + self.JSKULT_BACKUP_BUCKET, 'JSKULT_BACKUP_BUCKET') + super()._assert_variable_not_empty(self.BATCH_MANAGE_DYNAMODB_TABLE_NAME, + 'BATCH_MANAGE_DYNAMODB_TABLE_NAME') + super()._assert_variable_not_empty(self.BATCH_EXECUTION_ID, 'BATCH_EXECUTION_ID') + super()._assert_variable_is_int(self.MAX_RUN_COUNT, 'MAX_RUN_COUNT') + # MAX_RUN_COUNTは数値として扱うため、検査後に変換 + self.MAX_RUN_COUNT = int(self.MAX_RUN_COUNT) + super()._assert_variable_not_empty(self.PROCESS_NAME, 'PROCESS_NAME') + super()._assert_variable_not_empty( + self.JSK_DATA_SEND_FOLDER, 'JSK_DATA_SEND_FOLDER') + super()._assert_variable_not_empty(self.JSK_BACKUP_FOLDER, 'JSK_BACKUP_FOLDER') + super()._assert_variable_not_empty( + self.TRANSFER_RESULT_FOLDER, 'TRANSFER_RESULT_FOLDER') + super()._assert_variable_not_empty( + self.TRANSFER_RESULT_FILE_NAME, 'TRANSFER_RESULT_FILE_NAME') + super()._assert_variable_not_empty(self.DCF_INST_MERGE_SEND_FILE_NAME, + 'DCF_INST_MERGE_SEND_FILE_NAME') diff --git a/ecs/jskult-batch/src/batch/environment/jskult_batch_environment.py b/ecs/jskult-batch/src/batch/environment/jskult_batch_environment.py new file mode 100644 index 00000000..e5be1d41 --- /dev/null +++ b/ecs/jskult-batch/src/batch/environment/jskult_batch_environment.py @@ -0,0 +1,26 @@ +import abc + +from src.error.exceptions import EnvironmentVariableNotSetException + + +class JskultBatchEnvironment(metaclass=abc.ABCMeta): + """実消化&アルトマークのバッチ処理で使用する環境変数を管理するクラス""" + @abc.abstractmethod + def validate(self): + """ + 必須の環境変数が設定されているかどうか検査する。 + DB関連の環境変数は対象外とする。 + """ + pass + + def _assert_variable_not_empty(self, variable: str, variable_name: str): + if variable is None: + raise EnvironmentVariableNotSetException( + f'環境変数[{variable_name}]が設定されていません。') + + def _assert_variable_is_int(self, variable: str, variable_name: str): + try: + int(variable) + except ValueError: + raise EnvironmentVariableNotSetException( + f'環境変数[{variable_name}]が整数ではありません。') diff --git a/ecs/jskult-batch/src/error/exceptions.py b/ecs/jskult-batch/src/error/exceptions.py index aa5f9be6..a6db7ed7 100644 --- a/ecs/jskult-batch/src/error/exceptions.py +++ b/ecs/jskult-batch/src/error/exceptions.py @@ -12,3 +12,7 @@ class BatchOperationException(MeDaCaException): class MaxRunCountReachedException(MeDaCaException): pass + + +class EnvironmentVariableNotSetException(MeDaCaException): + pass diff --git a/ecs/jskult-batch/src/system_var/environment.py b/ecs/jskult-batch/src/system_var/environment.py index d44805d4..492c9661 100644 --- a/ecs/jskult-batch/src/system_var/environment.py +++ b/ecs/jskult-batch/src/system_var/environment.py @@ -7,21 +7,24 @@ DB_USERNAME = os.environ['DB_USERNAME'] DB_PASSWORD = os.environ['DB_PASSWORD'] DB_SCHEMA = os.environ['DB_SCHEMA'] -# AWS -JSKULT_CONFIG_BUCKET = os.environ['JSKULT_CONFIG_BUCKET'] -BATCH_EXECUTION_ID = os.environ['BATCH_EXECUTION_ID'] -MAX_RUN_COUNT = int(os.environ['MAX_RUN_COUNT']) -TRANSFER_RESULT_FOLDER = os.environ['TRANSFER_RESULT_FOLDER'] -TRANSFER_RESULT_FILE_NAME = os.environ['TRANSFER_RESULT_FILE_NAME'] -DCF_INST_MERGE_SEND_FILE_NAME = os.environ['DCF_INST_MERGE_SEND_FILE_NAME'] -PROCESS_NAME = os.environ['PROCESS_NAME'] -JSKULT_BACKUP_BUCKET = os.environ['JSKULT_BACKUP_BUCKET'] -JSK_IO_BUCKET = os.environ['JSK_IO_BUCKET'] -JSK_BACKUP_FOLDER = os.environ['JSK_BACKUP_FOLDER'] -JSK_DATA_SEND_FOLDER = os.environ['JSK_DATA_SEND_FOLDER'] +# 処理名 +PROCESS_NAME = os.environ.get('PROCESS_NAME', None) # AWS -BATCH_MANAGE_DYNAMODB_TABLE_NAME = os.environ.get('BATCH_MANAGE_DYNAMODB_TABLE_NAME') +JSKULT_CONFIG_BUCKET = os.environ.get('JSKULT_CONFIG_BUCKET', None) +BATCH_EXECUTION_ID = os.environ.get('BATCH_EXECUTION_ID', None) +MAX_RUN_COUNT = os.environ.get('MAX_RUN_COUNT', None) +TRANSFER_RESULT_FOLDER = os.environ.get('TRANSFER_RESULT_FOLDER', None) +TRANSFER_RESULT_FILE_NAME = os.environ.get('TRANSFER_RESULT_FILE_NAME', None) +DCF_INST_MERGE_SEND_FILE_NAME = os.environ.get( + 'DCF_INST_MERGE_SEND_FILE_NAME', None) +JSKULT_BACKUP_BUCKET = os.environ.get('JSKULT_BACKUP_BUCKET', None) +JSK_IO_BUCKET = os.environ.get('JSK_IO_BUCKET', None) +JSK_BACKUP_FOLDER = os.environ.get('JSK_BACKUP_FOLDER', None) +JSK_DATA_SEND_FOLDER = os.environ.get('JSK_DATA_SEND_FOLDER', None) +BATCH_MANAGE_DYNAMODB_TABLE_NAME = os.environ.get( + 'BATCH_MANAGE_DYNAMODB_TABLE_NAME', None) + # 初期値がある環境変数 LOG_LEVEL = os.environ.get('LOG_LEVEL', 'INFO') From ed55a30bf1d7221b55b5c73dc71df508e82a8a86 Mon Sep 17 00:00:00 2001 From: "mori.k" Date: Fri, 30 May 2025 15:08:15 +0900 Subject: [PATCH 03/11] =?UTF-8?q?=E7=92=B0=E5=A2=83=E5=A4=89=E6=95=B0?= =?UTF-8?q?=E3=81=AE=E3=83=90=E3=83=AA=E3=83=87=E3=83=BC=E3=82=B7=E3=83=A7?= =?UTF-8?q?=E3=83=B3=E3=83=81=E3=82=A7=E3=83=83=E3=82=AF=E3=81=AE=E5=AE=9F?= =?UTF-8?q?=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../environment/mst_inst_all_environment.py | 36 +++++++++++++++++++ ecs/jskult-batch/src/batch/mst_inst_all.py | 11 ++++++ 2 files changed, 47 insertions(+) create mode 100644 ecs/jskult-batch/src/batch/environment/mst_inst_all_environment.py diff --git a/ecs/jskult-batch/src/batch/environment/mst_inst_all_environment.py b/ecs/jskult-batch/src/batch/environment/mst_inst_all_environment.py new file mode 100644 index 00000000..0dcf9ece --- /dev/null +++ b/ecs/jskult-batch/src/batch/environment/mst_inst_all_environment.py @@ -0,0 +1,36 @@ +from src.batch.environment.jskult_batch_environment import \ + JskultBatchEnvironment +from src.system_var import environment + + +class MstInstAllEnvironment(JskultBatchEnvironment): + """実消化&アルトマークのバッチ処理で使用する環境変数を管理するクラス""" + + def __init__(self): + self.JSKULT_BACKUP_BUCKET = environment.JSKULT_BACKUP_BUCKET + self.BATCH_MANAGE_DYNAMODB_TABLE_NAME = environment.BATCH_MANAGE_DYNAMODB_TABLE_NAME + self.MAX_RUN_COUNT = environment.MAX_RUN_COUNT + self.PROCESS_NAME = environment.PROCESS_NAME + self.TRANSFER_RESULT_FOLDER = environment.TRANSFER_RESULT_FOLDER + self.TRANSFER_RESULT_FILE_NAME = environment.TRANSFER_RESULT_FILE_NAME + + def validate(self): + """ + 必須の環境変数が設定されているかどうか検査する。 + DB関連の環境変数は対象外とする。 + + Raises: + EnvironmentVariableNotSetException: 環境変数の設定ミス + """ + super()._assert_variable_not_empty( + self.JSKULT_BACKUP_BUCKET, 'JSKULT_BACKUP_BUCKET') + super()._assert_variable_not_empty(self.BATCH_MANAGE_DYNAMODB_TABLE_NAME, + 'BATCH_MANAGE_DYNAMODB_TABLE_NAME') + super()._assert_variable_is_int(self.MAX_RUN_COUNT, 'MAX_RUN_COUNT') + # MAX_RUN_COUNTは数値として扱うため、検査後に変換 + self.MAX_RUN_COUNT = int(self.MAX_RUN_COUNT) + super()._assert_variable_not_empty(self.PROCESS_NAME, 'PROCESS_NAME') + super()._assert_variable_not_empty( + self.TRANSFER_RESULT_FOLDER, 'TRANSFER_RESULT_FOLDER') + super()._assert_variable_not_empty( + self.TRANSFER_RESULT_FILE_NAME, 'TRANSFER_RESULT_FILE_NAME') diff --git a/ecs/jskult-batch/src/batch/mst_inst_all.py b/ecs/jskult-batch/src/batch/mst_inst_all.py index cef6a3fd..af9d1c38 100644 --- a/ecs/jskult-batch/src/batch/mst_inst_all.py +++ b/ecs/jskult-batch/src/batch/mst_inst_all.py @@ -4,9 +4,12 @@ import os.path as path import tempfile from src.aws.s3 import JskSendBucket, JskTransferListBucket +from src.batch.environment.mst_inst_all_environment import \ + MstInstAllEnvironment from src.batch.jskult_batch_entrypoint import JskultBatchEntrypoint from src.db.database import Database from src.error.exceptions import (BatchOperationException, + EnvironmentVariableNotSetException, MaxRunCountReachedException) from src.logging.get_logger import get_logger from src.manager.jskult_batch_run_manager import JskultBatchRunManager @@ -19,6 +22,14 @@ logger = get_logger('メルク施設マスタ作成') class MstInstAll(JskultBatchEntrypoint): def __init__(self): super().__init__() + self.environment = MstInstAllEnvironment() + + # 必須の環境変数が設定されていない場合、エラーにする + try: + self.environment.validate() + except EnvironmentVariableNotSetException as e: + logger.exception(e) + return def execute(self): logger.info("メルク施設マスタ作成処理を開始します。") From f5953877fce79bed27a8a5ac473f1d551dbf0354 Mon Sep 17 00:00:00 2001 From: "mori.k" Date: Fri, 30 May 2025 18:14:43 +0900 Subject: [PATCH 04/11] =?UTF-8?q?=E3=82=A2=E3=83=AB=E3=83=88=E3=83=9E?= =?UTF-8?q?=E3=83=BC=E3=82=AF=E6=96=BD=E8=A8=AD=E3=83=9E=E3=82=B9=E3=82=BF?= =?UTF-8?q?=E3=81=AEinsert=E3=81=AE=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch/src/batch/mst_inst_all.py | 95 +++++----------------- 1 file changed, 19 insertions(+), 76 deletions(-) diff --git a/ecs/jskult-batch/src/batch/mst_inst_all.py b/ecs/jskult-batch/src/batch/mst_inst_all.py index af9d1c38..33e3f6fe 100644 --- a/ecs/jskult-batch/src/batch/mst_inst_all.py +++ b/ecs/jskult-batch/src/batch/mst_inst_all.py @@ -19,6 +19,7 @@ from src.system_var import environment logger = get_logger('メルク施設マスタ作成') + class MstInstAll(JskultBatchEntrypoint): def __init__(self): super().__init__() @@ -35,7 +36,8 @@ class MstInstAll(JskultBatchEntrypoint): logger.info("メルク施設マスタ作成処理を開始します。") jskult_hdke_tbl_manager = JskultHdkeTblManager() jskult_batch_run_manager = JskultBatchRunManager( - environment.BATCH_EXECUTION_ID) + self.environment.BATCH_MANAGE_DYNAMODB_TABLE_NAME, + self.environment.BATCH_BATCH_EXECUTION_ID) if not jskult_hdke_tbl_manager.can_run_process(): logger.error( '日次バッチ処理中またはdump取得が正常終了していないため、メルク施設マスタ作成処理を終了します。') @@ -93,22 +95,21 @@ class MstInstAll(JskultBatchEntrypoint): self._db = Database.get_instance() self._db.connect() logger.debug('メルク施設マスタ作成処理開始') - # mst_instをTruncate - self._truncate_mst_inst(self._db) - # fcl_mst_vから、mst_instへInsert - self._insert_mst_inst_from_fcl_mst_v(self._db) - # com_instから、mst_instへInsert - self._insert_mst_inst_from_com_inst(self._db) + # mst_inst_allをTruncate + self._truncate_mst_inst_all(self._db) + # com_pharmから、mst_inst_allへInsert + self._insert_mst_inst_all_from_com_pharm(self._db) + # com_instから、mst_inst_allへInsert + self._insert_mst_inst_all_from_com_inst(self._db) logger.debug('メルク施設マスタ作成処理終了') except Exception as e: raise BatchOperationException(e) finally: self._db.disconnect() - - def _truncate_mst_inst(db: Database): + def _truncate_mst_inst_all(self, db: Database): try: - db.execute("TRUNCATE TABLE src05.mst_inst") + db.execute("TRUNCATE TABLE src07.mst_inst_all") except Exception as e: logger.debug("メルク施設マスタの全件削除に失敗") raise e @@ -116,13 +117,12 @@ class MstInstAll(JskultBatchEntrypoint): logger.debug("メルク施設マスタの全件削除に成功") return - - def _insert_mst_inst_from_fcl_mst_v(db: Database): - # fcl_mst_vから、mst_instへInsert + def _insert_mst_inst_all_from_com_pharm(self, db: Database): + # com_pharmから、mst_inst_allへInsert try: sql = """ INSERT INTO - src05.mst_inst ( + src07.mst_inst_all ( inst_cd, inst_clas_cd, inst_name_form, @@ -191,15 +191,14 @@ class MstInstAll(JskultBatchEntrypoint): AND fmv1.rec_sts_kbn != '9' """ res = db.execute(sql) - logger.info(f'V施設マスタからメルク施設マスタに登録成功') + logger.info(f'COM_薬局からメルク施設マスタに登録成功') except Exception as e: - logger.debug("V施設マスタからメルク施設マスタに登録失敗") + logger.debug("COM_薬局からメルク施設マスタに登録失敗") raise e return - - def _insert_mst_inst_from_com_inst(db: Database): + def _insert_mst_inst_all_from_com_inst(self, db: Database): # オプティマイザのderived_mergeフラグをoffにする try: sql = """ @@ -211,11 +210,11 @@ class MstInstAll(JskultBatchEntrypoint): logger.debug("オプティマイザのderived_mergeフラグの値変更に失敗") raise e - # com_instから、mst_instへInsert + # com_instから、mst_inst_allへInsert try: sql = """ INSERT INTO - src05.mst_inst ( + src07.mst_inst_all ( inst_cd, inst_clas_cd, inst_name_form, @@ -233,7 +232,6 @@ class MstInstAll(JskultBatchEntrypoint): delete_date, inst_div_cd, inst_div_name, - v_inst_cd, creater, create_date, updater, @@ -257,7 +255,6 @@ class MstInstAll(JskultBatchEntrypoint): ci.abolish_ymd, ci.inst_div_cd, LEFT(cid.inst_div_name, 40), - mcmv.hco_vid_v, ci.create_user, ci.regist_date, ci.update_user, @@ -273,60 +270,6 @@ class MstInstAll(JskultBatchEntrypoint): ON ci.manage_cd = cm.manage_cd LEFT OUTER JOIN src05.com_inst_div AS cid ON ci.inst_div_cd = cid.inst_div_cd - LEFT OUTER JOIN ( -- MDBコード変換表を使用してV施設コードを取得するためのテーブル結合 - SELECT - mcmv4.* - FROM ( - SELECT - mcmv1.* - FROM - src05.mdb_cnv_mst_v AS mcmv1 - INNER JOIN ( - SELECT - mcmv2.hco_vid_v, - MAX(mcmv2.sub_num) AS sno -- MDBコード変換データの枝番MAX - FROM - src05.mdb_cnv_mst_v mcmv2 - WHERE - mcmv2.rec_sts_kbn != '9' -- 状態区分9(削除)以外 and 適用開始≦日付テーブル.処理日 - AND src05.get_syor_date() >= mcmv2.start_date - GROUP BY - mcmv2.hco_vid_v - ) AS mcmv3 - ON mcmv1.hco_vid_v = mcmv3.hco_vid_v - AND mcmv1.sub_num = mcmv3.sno - ) AS mcmv4 - INNER JOIN ( - SELECT - MIN(mcmv8.hco_vid_v) AS hvv, -- 1つのMDBコードに対し、複数のV施設コードが割り当てられている場合、最小のV施設コードを選択する - mcmv8.mdb_cd - FROM ( - SELECT - mcmv5.* - FROM - src05.mdb_cnv_mst_v AS mcmv5 - INNER JOIN ( - SELECT - mcmv6.hco_vid_v, - MAX(mcmv6.sub_num) AS sno -- MDBコード変換データの枝番MAX - FROM - src05.mdb_cnv_mst_v AS mcmv6 - WHERE - mcmv6.rec_sts_kbn != '9' -- 状態区分9(削除)以外 and 適用開始≦日付テーブル.処理日 - AND src05.get_syor_date() >= mcmv6.start_date - GROUP BY - mcmv6.hco_vid_v - ) AS mcmv7 - ON mcmv5.hco_vid_v = mcmv7.hco_vid_v - AND mcmv5.sub_num = mcmv7.sno - ) AS mcmv8 - GROUP BY - mcmv8.mdb_cd - ) AS mcmv9 - ON mcmv4.mdb_cd = mcmv9.mdb_cd - AND mcmv4.hco_vid_v = mcmv9.hvv - ) AS mcmv - ON ci.dcf_dsf_inst_cd = mcmv.mdb_cd """ res = db.execute(sql) logger.info(f'COM施設からメルク施設マスタに登録成功') From 77d1ca41f507c3859981484f8d9ab83a6bf7d2cd Mon Sep 17 00:00:00 2001 From: "mori.k" Date: Fri, 30 May 2025 18:19:29 +0900 Subject: [PATCH 05/11] =?UTF-8?q?=E7=92=B0=E5=A2=83=E5=A4=89=E6=95=B0?= =?UTF-8?q?=E3=81=AE=E3=83=90=E3=83=AA=E3=83=87=E3=83=BC=E3=82=B7=E3=83=A7?= =?UTF-8?q?=E3=83=B3=E3=83=81=E3=82=A7=E3=83=83=E3=82=AF=E3=81=AE=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/environment/mst_inst_all_environment.py | 3 +++ ecs/jskult-batch/src/batch/mst_inst_all.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/ecs/jskult-batch/src/batch/environment/mst_inst_all_environment.py b/ecs/jskult-batch/src/batch/environment/mst_inst_all_environment.py index 0dcf9ece..51dbd081 100644 --- a/ecs/jskult-batch/src/batch/environment/mst_inst_all_environment.py +++ b/ecs/jskult-batch/src/batch/environment/mst_inst_all_environment.py @@ -9,6 +9,7 @@ class MstInstAllEnvironment(JskultBatchEnvironment): def __init__(self): self.JSKULT_BACKUP_BUCKET = environment.JSKULT_BACKUP_BUCKET self.BATCH_MANAGE_DYNAMODB_TABLE_NAME = environment.BATCH_MANAGE_DYNAMODB_TABLE_NAME + self.BATCH_EXECUTION_ID = environment.BATCH_EXECUTION_ID self.MAX_RUN_COUNT = environment.MAX_RUN_COUNT self.PROCESS_NAME = environment.PROCESS_NAME self.TRANSFER_RESULT_FOLDER = environment.TRANSFER_RESULT_FOLDER @@ -26,6 +27,8 @@ class MstInstAllEnvironment(JskultBatchEnvironment): self.JSKULT_BACKUP_BUCKET, 'JSKULT_BACKUP_BUCKET') super()._assert_variable_not_empty(self.BATCH_MANAGE_DYNAMODB_TABLE_NAME, 'BATCH_MANAGE_DYNAMODB_TABLE_NAME') + super()._assert_variable_not_empty( + self.BATCH_EXECUTION_ID, 'BATCH_EXECUTION_ID') super()._assert_variable_is_int(self.MAX_RUN_COUNT, 'MAX_RUN_COUNT') # MAX_RUN_COUNTは数値として扱うため、検査後に変換 self.MAX_RUN_COUNT = int(self.MAX_RUN_COUNT) diff --git a/ecs/jskult-batch/src/batch/mst_inst_all.py b/ecs/jskult-batch/src/batch/mst_inst_all.py index 33e3f6fe..e5bf9db8 100644 --- a/ecs/jskult-batch/src/batch/mst_inst_all.py +++ b/ecs/jskult-batch/src/batch/mst_inst_all.py @@ -37,7 +37,7 @@ class MstInstAll(JskultBatchEntrypoint): jskult_hdke_tbl_manager = JskultHdkeTblManager() jskult_batch_run_manager = JskultBatchRunManager( self.environment.BATCH_MANAGE_DYNAMODB_TABLE_NAME, - self.environment.BATCH_BATCH_EXECUTION_ID) + self.environment.BATCH_EXECUTION_ID) if not jskult_hdke_tbl_manager.can_run_process(): logger.error( '日次バッチ処理中またはdump取得が正常終了していないため、メルク施設マスタ作成処理を終了します。') From 80da987224d47e5ab090addd837abd25e6227be3 Mon Sep 17 00:00:00 2001 From: "mori.k" Date: Mon, 2 Jun 2025 10:15:20 +0900 Subject: [PATCH 06/11] =?UTF-8?q?COM=5F=E8=96=AC=E5=B1=80=E3=81=8B?= =?UTF-8?q?=E3=82=89=E3=81=AEinsert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch/src/batch/mst_inst_all.py | 91 ++++++++++------------ 1 file changed, 42 insertions(+), 49 deletions(-) diff --git a/ecs/jskult-batch/src/batch/mst_inst_all.py b/ecs/jskult-batch/src/batch/mst_inst_all.py index e5bf9db8..3979d30a 100644 --- a/ecs/jskult-batch/src/batch/mst_inst_all.py +++ b/ecs/jskult-batch/src/batch/mst_inst_all.py @@ -97,10 +97,10 @@ class MstInstAll(JskultBatchEntrypoint): logger.debug('メルク施設マスタ作成処理開始') # mst_inst_allをTruncate self._truncate_mst_inst_all(self._db) - # com_pharmから、mst_inst_allへInsert - self._insert_mst_inst_all_from_com_pharm(self._db) # com_instから、mst_inst_allへInsert self._insert_mst_inst_all_from_com_inst(self._db) + # com_pharmから、mst_inst_allへInsert + self._insert_mst_inst_all_from_com_pharm(self._db) logger.debug('メルク施設マスタ作成処理終了') except Exception as e: raise BatchOperationException(e) @@ -134,61 +134,52 @@ class MstInstAll(JskultBatchEntrypoint): address, postal_cd, tel_num, + bed_num, + manage_cd, + manage_name, delete_date, - v_inst_cd, + inst_div_cd, + inst_div_name, + yobi, + creater, create_date, + updater, update_date ) SELECT - fmv1.v_inst_cd, - CASE - WHEN fmv1.fcl_type IN ('A1', 'A0') THEN '3' - WHEN fmv1.fcl_type BETWEEN '20' AND '29' THEN '2' - END AS inst_clas_cd, - fmv1.fcl_name, - fmv1.fcl_abb_name, - fmv1.prft_cd, - RIGHT(fmv1.admin_kbn, 3), + cp.dcf_dsf_inst_cd, + '2', + cp.form_inst_name_kanji, + cp.inst_name_kanji, + cp.prefc_cd, + cp.city_cd, mp.prefc_name, LEFT(mc.city_name, 40), - CASE - WHEN fmv1.fcl_type IN ('A1', 'A0') THEN LEFT(fmv1.fmt_addr, 200) - WHEN fmv1.fcl_type BETWEEN '20' AND '29' THEN CONCAT(fmv1.prft_name,fmv1.city_name,fmv1.addr_line_1) - END AS address, - fmv1.postal_cd, - fmv1.tel_num, - CASE - WHEN - fmv1.fcl_type BETWEEN '20' AND '29' THEN LEFT(fmv1.closed_dt, 10) - WHEN - fmv1.fcl_type IN ('A1', 'A0') AND fmv1.end_date != '9999-12-31' THEN DATE_FORMAT(fmv1.end_date, "%Y-%m-%d") - ELSE - null - END AS delete_date, - fmv1.v_inst_cd, - fmv1.ins_dt, - fmv1.upd_dt + cp.inst_addr, + cp.postal_number, + null, + null, + null, + LEFT(cm.manage_name, 40), + cp.abolish_ymd, + cp.inst_div_cd, + LEFT(cid.inst_div_name, 40), + null, + cp.create_user, + cp.regist_date, + cp.update_user, + cp.update_date FROM - src05.fcl_mst_v AS fmv1 - INNER JOIN ( - SELECT - v_inst_cd, - MAX(sub_num) AS sno - FROM - src05.fcl_mst_v - GROUP BY - v_inst_cd - ) fmv2 - ON fmv1.v_inst_cd = fmv2.v_inst_cd - AND fmv1.sub_num = fmv2.sno + src05.com_pharm AS cp LEFT OUTER JOIN src05.mst_prefc AS mp - ON fmv1.prft_cd = mp.prefc_cd + ON cp.prefc_cd = mp.prefc_cd LEFT OUTER JOIN src05.mst_city AS mc - ON LEFT(fmv1.admin_kbn, 2) = mc.prefc_cd - AND RIGHT(fmv1.admin_kbn, 3) = mc.city_cd - WHERE - ((fmv1.fcl_type IN ('A1', 'A0')) OR fmv1.fcl_type BETWEEN '20' AND '29') - AND fmv1.rec_sts_kbn != '9' + ON cp.prefc_cd = mc.prefc_cd + AND cp.city_cd = mc.city_cd + LEFT OUTER JOIN src05.com_manage AS cm + ON cp.manage_cd = cm.manage_cd + LEFT OUTER JOIN src05.com_inst_div AS cid + ON cp.inst_div_cd = cid.inst_div_cd """ res = db.execute(sql) logger.info(f'COM_薬局からメルク施設マスタに登録成功') @@ -232,6 +223,7 @@ class MstInstAll(JskultBatchEntrypoint): delete_date, inst_div_cd, inst_div_name, + yobi, creater, create_date, updater, @@ -255,6 +247,7 @@ class MstInstAll(JskultBatchEntrypoint): ci.abolish_ymd, ci.inst_div_cd, LEFT(cid.inst_div_name, 40), + null, ci.create_user, ci.regist_date, ci.update_user, @@ -272,9 +265,9 @@ class MstInstAll(JskultBatchEntrypoint): ON ci.inst_div_cd = cid.inst_div_cd """ res = db.execute(sql) - logger.info(f'COM施設からメルク施設マスタに登録成功') + logger.info(f'COM_施設からメルク施設マスタに登録成功') except Exception as e: - logger.debug("COM施設からメルク施設マスタに登録失敗") + logger.debug("COM_施設からメルク施設マスタに登録失敗") raise e return From a232923909aee038b90b673eed6b7683b4fda451 Mon Sep 17 00:00:00 2001 From: "mori.k" Date: Mon, 2 Jun 2025 14:59:35 +0900 Subject: [PATCH 07/11] =?UTF-8?q?=E3=83=AC=E3=83=93=E3=83=A5=E3=83=BC?= =?UTF-8?q?=E6=8C=87=E6=91=98=E5=AF=BE=E5=BF=9C=E3=81=A8set=5Fprocess=5Fst?= =?UTF-8?q?atus=E3=81=AE=E5=BC=95=E6=95=B0=E3=82=92=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch/src/batch/mst_inst_all.py | 200 +++++++++++---------- 1 file changed, 105 insertions(+), 95 deletions(-) diff --git a/ecs/jskult-batch/src/batch/mst_inst_all.py b/ecs/jskult-batch/src/batch/mst_inst_all.py index 3979d30a..4b64b27a 100644 --- a/ecs/jskult-batch/src/batch/mst_inst_all.py +++ b/ecs/jskult-batch/src/batch/mst_inst_all.py @@ -16,6 +16,7 @@ from src.manager.jskult_batch_run_manager import JskultBatchRunManager from src.manager.jskult_batch_status_manager import JskultBatchStatusManager from src.manager.jskult_hdke_tbl_manager import JskultHdkeTblManager from src.system_var import environment +from src.system_var import constants logger = get_logger('メルク施設マスタ作成') @@ -74,119 +75,56 @@ class MstInstAll(JskultBatchEntrypoint): ) try: - jskult_batch_status_manager.set_process_status("start") + jskult_batch_status_manager.set_process_status( + constants.PROCESS_STATUS_START) try: if not jskult_batch_status_manager.can_run_post_process(): # 後続処理の起動条件を満たしていない場合 # 処理ステータスを「処理待」に設定 - jskult_batch_status_manager.set_process_status("waiting") + jskult_batch_status_manager.set_process_status( + constants.PROCESS_STATUS_WAITING) # バッチ実行管理テーブルに「retry」で登録 jskult_batch_run_manager.batch_retry() return except MaxRunCountReachedException: - logger.info('最大起動回数に到達したため、メルク施設マスタ作成処理を実行します。') + logger.info("最大起動回数に到達したため、メルク施設マスタ作成処理を実行します。") - jskult_batch_status_manager.set_process_status("doing") + jskult_batch_status_manager.set_process_status( + constants.PROCESS_STATUS_DOING) - # アルトマーク取込が実行されていた場合にDCF施設削除新規マスタの作成処理を実行 - if jskult_batch_status_manager.is_done_ultmarc_import(): - self._db = Database.get_instance() - self._db.connect() - logger.debug('メルク施設マスタ作成処理開始') - # mst_inst_allをTruncate - self._truncate_mst_inst_all(self._db) - # com_instから、mst_inst_allへInsert - self._insert_mst_inst_all_from_com_inst(self._db) - # com_pharmから、mst_inst_allへInsert - self._insert_mst_inst_all_from_com_pharm(self._db) - logger.debug('メルク施設マスタ作成処理終了') + db = Database.get_instance() + db.connect() + logger.info("メルク施設マスタ作成処理開始") + # mst_inst_allをTruncate + self._truncate_mst_inst_all(db) + # com_instから、mst_inst_allへInsert + self._insert_mst_inst_all_from_com_inst(db) + # com_pharmから、mst_inst_allへInsert + self._insert_mst_inst_all_from_com_pharm(db) + logger.info("メルク施設マスタ作成処理終了") + + jskult_batch_run_manager.batch_success() + jskult_batch_status_manager.set_process_status( + constants.PROCESS_STATUS_DONE) except Exception as e: + logger.exception(e) + jskult_batch_run_manager.batch_failed() + jskult_batch_status_manager.set_process_status( + constants.PROCESS_STATUS_ERROR) raise BatchOperationException(e) finally: - self._db.disconnect() + db.disconnect() def _truncate_mst_inst_all(self, db: Database): try: db.execute("TRUNCATE TABLE src07.mst_inst_all") except Exception as e: - logger.debug("メルク施設マスタの全件削除に失敗") - raise e - - logger.debug("メルク施設マスタの全件削除に成功") - return - - def _insert_mst_inst_all_from_com_pharm(self, db: Database): - # com_pharmから、mst_inst_allへInsert - try: - sql = """ - INSERT INTO - src07.mst_inst_all ( - inst_cd, - inst_clas_cd, - inst_name_form, - inst_name, - pref_cd, - city_cd, - pref_name, - city_name, - address, - postal_cd, - tel_num, - bed_num, - manage_cd, - manage_name, - delete_date, - inst_div_cd, - inst_div_name, - yobi, - creater, - create_date, - updater, - update_date - ) - SELECT - cp.dcf_dsf_inst_cd, - '2', - cp.form_inst_name_kanji, - cp.inst_name_kanji, - cp.prefc_cd, - cp.city_cd, - mp.prefc_name, - LEFT(mc.city_name, 40), - cp.inst_addr, - cp.postal_number, - null, - null, - null, - LEFT(cm.manage_name, 40), - cp.abolish_ymd, - cp.inst_div_cd, - LEFT(cid.inst_div_name, 40), - null, - cp.create_user, - cp.regist_date, - cp.update_user, - cp.update_date - FROM - src05.com_pharm AS cp - LEFT OUTER JOIN src05.mst_prefc AS mp - ON cp.prefc_cd = mp.prefc_cd - LEFT OUTER JOIN src05.mst_city AS mc - ON cp.prefc_cd = mc.prefc_cd - AND cp.city_cd = mc.city_cd - LEFT OUTER JOIN src05.com_manage AS cm - ON cp.manage_cd = cm.manage_cd - LEFT OUTER JOIN src05.com_inst_div AS cid - ON cp.inst_div_cd = cid.inst_div_cd - """ - res = db.execute(sql) - logger.info(f'COM_薬局からメルク施設マスタに登録成功') - except Exception as e: - logger.debug("COM_薬局からメルク施設マスタに登録失敗") + logger.info("メルク施設マスタの全件削除に失敗") raise e + logger.info("メルク施設マスタの全件削除に成功") return def _insert_mst_inst_all_from_com_inst(self, db: Database): @@ -196,9 +134,9 @@ class MstInstAll(JskultBatchEntrypoint): SET SESSION optimizer_switch = 'derived_merge=off' """ db.execute(sql) - logger.debug("オプティマイザのderived_mergeフラグ = Off") + logger.info("オプティマイザのderived_mergeフラグ = Off") except Exception as e: - logger.debug("オプティマイザのderived_mergeフラグの値変更に失敗") + logger.info("オプティマイザのderived_mergeフラグの値変更に失敗") raise e # com_instから、mst_inst_allへInsert @@ -265,9 +203,81 @@ class MstInstAll(JskultBatchEntrypoint): ON ci.inst_div_cd = cid.inst_div_cd """ res = db.execute(sql) - logger.info(f'COM_施設からメルク施設マスタに登録成功') + logger.info("COM_施設からメルク施設マスタに登録成功") except Exception as e: - logger.debug("COM_施設からメルク施設マスタに登録失敗") + logger.info("COM_施設からメルク施設マスタに登録失敗") + raise e + + return + + def _insert_mst_inst_all_from_com_pharm(self, db: Database): + # com_pharmから、mst_inst_allへInsert + try: + sql = """ + INSERT INTO + src07.mst_inst_all ( + inst_cd, + inst_clas_cd, + inst_name_form, + inst_name, + pref_cd, + city_cd, + pref_name, + city_name, + address, + postal_cd, + tel_num, + bed_num, + manage_cd, + manage_name, + delete_date, + inst_div_cd, + inst_div_name, + yobi, + creater, + create_date, + updater, + update_date + ) + SELECT + cp.dcf_dsf_inst_cd, + '2', + cp.form_inst_name_kanji, + cp.inst_name_kanji, + cp.prefc_cd, + cp.city_cd, + mp.prefc_name, + LEFT(mc.city_name, 40), + cp.inst_addr, + cp.postal_number, + cp.inst_phone_number, + null, + null, + null, + cp.abolish_ymd, + cp.inst_div_cd, + LEFT(cid.inst_div_name, 40), + null, + cp.create_user, + cp.regist_date, + cp.update_user, + cp.update_date + FROM + src05.com_pharm AS cp + LEFT OUTER JOIN src05.mst_prefc AS mp + ON cp.prefc_cd = mp.prefc_cd + LEFT OUTER JOIN src05.mst_city AS mc + ON cp.prefc_cd = mc.prefc_cd + AND cp.city_cd = mc.city_cd + LEFT OUTER JOIN src05.com_manage AS cm + ON cp.manage_cd = cm.manage_cd + LEFT OUTER JOIN src05.com_inst_div AS cid + ON cp.inst_div_cd = cid.inst_div_cd + """ + res = db.execute(sql) + logger.info("COM_薬局からメルク施設マスタに登録成功") + except Exception as e: + logger.info("COM_薬局からメルク施設マスタに登録失敗") raise e return From 75d4f85bb2928e498e8caa944cdbcddb5df280eb Mon Sep 17 00:00:00 2001 From: "mori.k" Date: Mon, 2 Jun 2025 17:15:31 +0900 Subject: [PATCH 08/11] =?UTF-8?q?=E7=8B=AC=E8=87=AA=E6=96=BD=E8=A8=AD?= =?UTF-8?q?=E3=83=9E=E3=82=B9=E3=82=BF=E3=81=8B=E3=82=89=E3=81=AEinsert?= =?UTF-8?q?=E3=81=AE=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch/src/batch/mst_inst_all.py | 84 ++++++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/ecs/jskult-batch/src/batch/mst_inst_all.py b/ecs/jskult-batch/src/batch/mst_inst_all.py index 4b64b27a..7d1bae7d 100644 --- a/ecs/jskult-batch/src/batch/mst_inst_all.py +++ b/ecs/jskult-batch/src/batch/mst_inst_all.py @@ -103,6 +103,8 @@ class MstInstAll(JskultBatchEntrypoint): self._insert_mst_inst_all_from_com_inst(db) # com_pharmから、mst_inst_allへInsert self._insert_mst_inst_all_from_com_pharm(db) + # mst_inst_merckから、最新レコードをmst_inst_allへInsert + self._insert_mst_inst_all_from_mst_inst_merck(db) logger.info("メルク施設マスタ作成処理終了") jskult_batch_run_manager.batch_success() @@ -281,3 +283,85 @@ class MstInstAll(JskultBatchEntrypoint): raise e return + + def _insert_mst_inst_all_from_mst_inst_merck(self, db:Database): + # mst_inst_merckから、mst_inst_allへInsert + try: + sql = """ + INSERT INTO + src07.mst_inst_all ( + inst_cd, + inst_clas_cd, + inst_name_form, + inst_name, + pref_cd, + city_cd, + pref_name, + city_name, + address, + postal_cd, + tel_num, + bed_num, + manage_cd, + manage_name, + delete_date, + inst_div_cd, + inst_div_name, + yobi, + creater, + create_date, + updater, + update_date + ) + SELECT + mim.inst_cd, + CASE LEFT(mim.inst_cd, 2) + WHEN '59' THEN '3' + ELSE '2' + END, + mim.inst_nm_kj, + mim.inst_nm_kj_s, + mim.jis_pref_cd, + mim.jis_city_cd, + mjp.jis_pref_nm_kj, + LEFT(mjc.jis_city_nm_kj, 40), + CONCAT(mim.addr1_nm_kj, mim.addr2_nm_kj), + mim.postal_no, + mim.tel_no, + null, + null, + null, + CASE mim.eff_end_ym + WHEN '999912' THEN null + ELSE CONCAT(mim.eff_end_ym, DATE_FORMAT(LAST_DAY(STR_TO_DATE(mim.eff_end_ym, '%Y%m')), '%d')) + END, + null, + null, + null, + mim.ins_user, + mim.ins_date, + mim.upd_user, + mim.upd_date + FROM + src07.mst_inst_merck AS mim + JOIN ( + SELECT mim.inst_cd, MAX(mim.eff_end_ym) AS max_end_ym + FROM src07.mst_inst_merck AS mim + GROUP BY mim.inst_cd + ) AS mim_max_end_ym + ON mim.inst_cd = mim_max_end_ym.inst_cd + AND mim.eff_end_ym = mim_max_end_ym.max_end_ym + LEFT OUTER JOIN src07.mst_jis_pref AS mjp + ON mim.jis_pref_cd = mjp.jis_pref_cd + LEFT OUTER JOIN src07.mst_jis_city AS mjc + ON mim.jis_pref_cd = mjc.jis_pref_cd + AND mim.jis_city_cd = mjc.jis_city_cd; + + """ + res = db.execute(sql) + logger.info("メルク独自施設マスタからメルク施設マスタに登録成功") + except Exception as e: + logger.info("メルク独自施設マスタからメルク施設マスタに登録失敗") + raise e + + return \ No newline at end of file From 02319c4876a731e84b45fc64a6b3a414dadf2d8f Mon Sep 17 00:00:00 2001 From: "mori.k" Date: Mon, 2 Jun 2025 18:14:53 +0900 Subject: [PATCH 09/11] =?UTF-8?q?inst=5Fclas=5Fcd=E3=81=AE=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6=E3=81=AE=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch/src/batch/mst_inst_all.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-batch/src/batch/mst_inst_all.py b/ecs/jskult-batch/src/batch/mst_inst_all.py index 7d1bae7d..706ef7dc 100644 --- a/ecs/jskult-batch/src/batch/mst_inst_all.py +++ b/ecs/jskult-batch/src/batch/mst_inst_all.py @@ -316,8 +316,8 @@ class MstInstAll(JskultBatchEntrypoint): SELECT mim.inst_cd, CASE LEFT(mim.inst_cd, 2) - WHEN '59' THEN '3' - ELSE '2' + WHEN '59' THEN '2' + ELSE '3' END, mim.inst_nm_kj, mim.inst_nm_kj_s, From 822d57e878df00aad169dabcd868e4e4d2e91077 Mon Sep 17 00:00:00 2001 From: "mori.k" Date: Mon, 2 Jun 2025 18:27:51 +0900 Subject: [PATCH 10/11] =?UTF-8?q?JOIN=E5=8F=A5=E3=82=92INNER=20JOIN?= =?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4=E3=81=97=E3=80=81=E3=82=BF=E3=83=96?= =?UTF-8?q?=E6=96=87=E5=AD=97=E3=82=92=E6=8E=92=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch/src/batch/mst_inst_all.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ecs/jskult-batch/src/batch/mst_inst_all.py b/ecs/jskult-batch/src/batch/mst_inst_all.py index 706ef7dc..96a9e7d2 100644 --- a/ecs/jskult-batch/src/batch/mst_inst_all.py +++ b/ecs/jskult-batch/src/batch/mst_inst_all.py @@ -344,11 +344,11 @@ class MstInstAll(JskultBatchEntrypoint): mim.upd_date FROM src07.mst_inst_merck AS mim - JOIN ( - SELECT mim.inst_cd, MAX(mim.eff_end_ym) AS max_end_ym - FROM src07.mst_inst_merck AS mim - GROUP BY mim.inst_cd - ) AS mim_max_end_ym + INNER JOIN ( + SELECT mim.inst_cd, MAX(mim.eff_end_ym) AS max_end_ym + FROM src07.mst_inst_merck AS mim + GROUP BY mim.inst_cd + ) AS mim_max_end_ym ON mim.inst_cd = mim_max_end_ym.inst_cd AND mim.eff_end_ym = mim_max_end_ym.max_end_ym LEFT OUTER JOIN src07.mst_jis_pref AS mjp From 8b32d83bc856cfcccded75893943cea72bb49cb0 Mon Sep 17 00:00:00 2001 From: "mori.k" Date: Mon, 2 Jun 2025 18:35:46 +0900 Subject: [PATCH 11/11] =?UTF-8?q?=E9=96=89=E3=81=98=E6=8B=AC=E5=BC=A7?= =?UTF-8?q?=E3=81=AE=E3=82=A4=E3=83=B3=E3=83=87=E3=83=B3=E3=83=88=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch/src/batch/mst_inst_all.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecs/jskult-batch/src/batch/mst_inst_all.py b/ecs/jskult-batch/src/batch/mst_inst_all.py index 96a9e7d2..c5b99021 100644 --- a/ecs/jskult-batch/src/batch/mst_inst_all.py +++ b/ecs/jskult-batch/src/batch/mst_inst_all.py @@ -348,7 +348,7 @@ class MstInstAll(JskultBatchEntrypoint): SELECT mim.inst_cd, MAX(mim.eff_end_ym) AS max_end_ym FROM src07.mst_inst_merck AS mim GROUP BY mim.inst_cd - ) AS mim_max_end_ym + ) AS mim_max_end_ym ON mim.inst_cd = mim_max_end_ym.inst_cd AND mim.eff_end_ym = mim_max_end_ym.max_end_ym LEFT OUTER JOIN src07.mst_jis_pref AS mjp