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/batch/environment/trn_result_data_bio_lot_environment.py b/ecs/jskult-batch/src/batch/environment/trn_result_data_bio_lot_environment.py new file mode 100644 index 00000000..ff0ca12e --- /dev/null +++ b/ecs/jskult-batch/src/batch/environment/trn_result_data_bio_lot_environment.py @@ -0,0 +1,35 @@ +from src.batch.environment.jskult_batch_environment import \ + JskultBatchEnvironment +from src.system_var import environment + + +class TrnResultDataBioLotEnvironment(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 + 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_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.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/trn_result_data_bio_lot.py b/ecs/jskult-batch/src/batch/trn_result_data_bio_lot.py index d0142cbc..65e7408a 100644 --- a/ecs/jskult-batch/src/batch/trn_result_data_bio_lot.py +++ b/ecs/jskult-batch/src/batch/trn_result_data_bio_lot.py @@ -1,10 +1,300 @@ +import json +from src.aws.s3 import JskTransferListBucket +from src.batch.environment.trn_result_data_bio_lot_environment import \ + TrnResultDataBioLotEnvironment from src.batch.jskult_batch_entrypoint import JskultBatchEntrypoint +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.db.database import Database +from src.error.exceptions import (BatchOperationException, + EnvironmentVariableNotSetException, + MaxRunCountReachedException) +from src.logging.get_logger import get_logger +from src.system_var import constants + + + + +logger = get_logger('生物由来卸販売ロット分解') + class TrnResultDataBioLot(JskultBatchEntrypoint): def __init__(self): super().__init__() + self.environment = TrnResultDataBioLotEnvironment() + + # 必須の環境変数が設定されていない場合、エラーにする + try: + self.environment.validate() + except EnvironmentVariableNotSetException as e: + logger.exception(e) + return def execute(self): - # TODO: ここで生物由来ロット分解処理を実行する - pass + """生物由来卸販売ロット分解""" + logger.info('生物由来卸販売ロット分解処理開始') + + + jskult_hdke_tbl_manager = JskultHdkeTblManager() + jskult_batch_run_manager = JskultBatchRunManager( + self.environment.BATCH_MANAGE_DYNAMODB_TABLE_NAME, + self.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( + self.environment.PROCESS_NAME, + # TODO チケットNEWDWH2021-1847の実装で作成した定数に置き換え + 'post_process', + self.environment.MAX_RUN_COUNT, + receive_file_count + ) + try: + + jskult_batch_status_manager.set_process_status(constants.BATCH_ACTF_BATCH_START) + try: + if not jskult_batch_status_manager.can_run_post_process(): + # 後続処理の起動条件を満たしていない場合 + # 処理ステータスを「処理待」に設定 + jskult_batch_status_manager.set_process_status(constants.PROCESS_STATUS_WAITING) + + # バッチ実行管理テーブルに「retry」で登録 + jskult_batch_run_manager.batch_retry() + + return + except MaxRunCountReachedException: + logger.info('最大起動回数に到達したため、生物由来卸販売ロット分解処理を実行します。') + + jskult_batch_status_manager.set_process_status(constants.PROCESS_STATUS_DOING) + db = Database.get_instance() + try: + db.connect() + db.begin() + # 生物由来ロット分解データの未確定データを削除する + self._delete_not_confirm_data_in_trn_result_data_bio_lot(db) + # 生物由来ロット分解データを作成する + self._insert_trn_result_data_bio_lot(db) + # 生物由来ロット分解データの不要レコードを削除する + self._delete_empty_lot_record(db) + # 製造ロット管理番号マスタから有効期限を生物由来ロット分解データにセットする + self._set_expr_dt_from_lot_num_mst(db) + # 施設情報を生物由来ロット分解データにセットする + self._set_inst_info_from_com_inst_or_com_pharm_or_mst_inst_merck(db) + db.commit() + logger.info('生物由来卸販売ロット分解処理終了') + # 処理が全て正常終了した際に、バッチ実行管理テーブルに「success」で登録 + logger.info("生物由来卸販売ロット分解処理を正常終了します。") + jskult_batch_run_manager.batch_success() + jskult_batch_status_manager.set_process_status(constants.PROCESS_STATUS_DONE) + return + + except Exception as e: + db.rollback() + raise BatchOperationException(e) + finally: + db.disconnect() + except Exception as e: + # 何らかのエラーが発生した際に、バッチ実行管理テーブルに「failed」で登録 + logger.exception(f'予期せぬエラーが発生したため、生物由来卸販売ロット分解処理を終了します。{e}') + jskult_batch_run_manager.batch_failed() + jskult_batch_status_manager.set_process_status(constants.PROCESS_STATUS_ERROR) + + + def _delete_not_confirm_data_in_trn_result_data_bio_lot(self, db: Database): + logger.info('生物由来ロット分解データの未確定データ削除開始') + try: + sql = """ + DELETE lot FROM src07.trn_result_data_bio_lot AS lot + INNER JOIN src07.trn_result_data_bio AS bio + ON bio.account_ym = lot.account_ym + AND bio.seq_no = lot.seq_no + AND IFNULL(bio.upd_date, bio.ins_date) >= src07.get_syor_date() + """ + res = db.execute(sql) + except Exception as e: + logger.info('生物由来ロット分解データの未確定データ削除に失敗') + raise e + logger.info('生物由来ロット分解データの未確定データ削除に成功') + + + def _insert_trn_result_data_bio_lot(self, db: Database): + logger.info('生物由来ロット分解データの作成開始') + try: + sql = """ + INSERT INTO src07.trn_result_data_bio_lot + SELECT + bio.account_ym AS account_ym, + bio.seq_no AS seq_no, + conv.conv_cd AS conv_cd, + bio.orig_whlslr_cd AS orig_whlslr_cd, + bio.orig_whlslr_sub_cd AS orig_whlslr_sub_cd, + bio.edit_whlslr_org_cd AS edit_whlslr_org_cd, + bio.orig_univ_product_cd AS orig_univ_product_cd, + bio.edit_deal_div_cd AS edit_deal_div_cd, + bio.cnvs_sales_dt AS cnvs_sales_dt, + bio.orig_slip_no AS orig_slip_no, + bio.orig_prod_nm AS orig_prod_nm, + bio.edit_endusr_cd AS edit_endusr_cd, + bio.orig_endusr_nm AS orig_endusr_nm, + bio.orig_jd45_addr_txt AS orig_jd45_addr_txt, + -- 3レコードに分解する + CASE conv.conv_cd + WHEN 1 THEN bio.cnvs_lot_no_1 + WHEN 2 THEN bio.cnvs_lot_no_2 + WHEN 3 THEN bio.cnvs_lot_no_3 + END AS cnvs_lot_no, + bio.load_dt AS load_dt, + bio.cnvs_deal_div_cd AS cnvs_deal_div_cd, + bio.cls_deal_div_nm AS cls_deal_div_nm, + bio.cnvs_depo_cd AS cnvs_depo_cd, + bio.cls_depo_nm AS cls_depo_nm, + bio.cnvs_whlslr_cd AS cnvs_whlslr_cd, + bio.cls_whlslr_nm AS cls_whlslr_nm, + bio.cls_prod_nm AS cls_prod_nm, + bio.cnvs_prod_cd AS cnvs_prod_cd, + -- 3レコードに分解する + CASE conv.conv_cd + WHEN 1 THEN bio.cnvs_lot_sales_qty_1 + WHEN 2 THEN bio.cnvs_lot_sales_qty_2 + WHEN 3 THEN bio.cnvs_lot_sales_qty_3 + END AS cnvs_lot_sales_qty, + bio.cnvs_inst_cd AS cnvs_inst_cd, + bio.cls_inst_nm AS cls_inst_nm, + -- COM_施設 or COM_薬局 or メルク独自施設マスタから後ほどセット + NULL AS inst_addr, + NULL AS inst_tel, + bio.result_cd AS result_cd, + bio.src_cd AS src_cd, + -- 判定結果CDより値を設定する + CASE bio.result_cd + WHEN '1' THEN '正常' + WHEN '2' THEN '卸間転送除外対象' + WHEN 'E' THEN 'エラー' + WHEN 'D' THEN 'エラー(重複)' + WHEN 'Z' THEN 'エラー(想定外)' + END AS data_kbn, + -- SRC_種類より値を設定する + CASE bio.result_cd + WHEN '1' THEN 'VAN' + WHEN '2' THEN '手入力' + WHEN '3' THEN 'VAN-Web' + WHEN 'S' THEN 'SCSK-VAN' + END AS if_kind, + -- 製品コード、ロット番号でロットマスタより後ほどセット + NULL AS ck_last_dt_txt + FROM + src07.trn_result_data_bio bio + -- 生物由来変換マスタ + CROSS JOIN src07.bio_conv conv + WHERE + IFNULL(bio.upd_date, bio.ins_date) >= src07.get_syor_date() + """ + db.execute(sql) + + except Exception as e: + logger.info('生物由来ロット分解データの作成に失敗') + raise e + logger.info('生物由来ロット分解データの作成に成功') + + + def _delete_empty_lot_record(self, db: Database): + logger.info('生物由来ロット分解データのロット番号が空のレコードを削除開始') + try: + sql = """ + DELETE FROM src07.trn_result_data_bio_lot lot + WHERE + -- 空白15桁のデータはロット情報が空とみなして削除する + lot.cnvs_lot_no = REPEAT(' ', 15) OR lot.cnvs_lot_no IS NULL + """ + res = db.execute(sql) + except Exception as e: + logger.info('生物由来ロット分解データのロット番号が空のレコードを削除に失敗') + raise e + logger.info('生物由来ロット分解データのロット番号が空のレコードを削除に成功') + + + def _set_inst_info_from_com_inst_or_com_pharm_or_mst_inst_merck(self, db: Database): + logger.info('COM_施設 or COM_薬局 or メルク独自施設マスタから施設情報を生物由来ロット分解データにセット開始') + try: + sql = """ + UPDATE + src07.trn_result_data_bio_lot bio + -- COM_施設 + LEFT OUTER JOIN src05.com_inst ci + ON bio.cnvs_inst_cd = ci.dcf_dsf_inst_cd + -- COM_薬局 + LEFT OUTER JOIN src05.com_pharm cp + ON bio.cnvs_inst_cd = cp.dcf_dsf_inst_cd + -- 独自施設マスタ + LEFT OUTER JOIN src07.mst_inst_merck mim + ON bio.cnvs_inst_cd = mim.inst_cd + AND DATE_FORMAT(bio.cnvs_sales_dt, '%Y%m') BETWEEN mim.eff_start_ym + AND mim.eff_end_ym + -- 施設住所 + SET bio.inst_addr = ( + CASE LEFT(bio.cnvs_inst_cd, 2) + WHEN '00' THEN ci.inst_addr + WHEN '03' THEN cp.inst_addr + ELSE mim.addr2_nm_kj + END + ), + -- 施設電話番号 + bio.inst_tel = ( + CASE LEFT(bio.cnvs_inst_cd, 2) + WHEN '00' THEN ci.inst_phone_number + WHEN '03' THEN cm.inst_phone_number + ELSE mim.tel_no + END + ) + """ + res = db.execute(sql) + except Exception as e: + logger.info('COM_施設 or COM_薬局 or メルク独自施設マスタから施設情報を生物由来ロット分解データにセット失敗') + raise e + logger.info('COM_施設 or COM_薬局 or メルク独自施設マスタから施設情報を生物由来ロット分解データにセット成功') + + + def _set_ck_last_dt_txt_from_customer_lotno_all(self, db: Database): + # ロットマスタから有効期限をセット + logger.info('ロットマスタから有効期限をセット開始') + try: + sql = """ + UPDATE + src07.trn_result_data_bio_lot bio + LEFT OUTER JOIN src07.customer_lotno_all cla + ON bio.cnvs_prod_cd = cla.material_cd + AND bio.cnvs_lot_no = cla.lot_no_txt + SET + bio.ck_last_dt_txt = cla.ck_last_dt_txt + """ + res = db.execute(sql) + except Exception as e: + logger.info('ロットマスタから有効期限をセット失敗') + raise e + logger.info('ロットマスタから有効期限をセット成功') 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')