From 8214de77e441df87affa04b43fc0877f948166dd Mon Sep 17 00:00:00 2001 From: "mori.k" Date: Thu, 22 May 2025 19:48:39 +0900 Subject: [PATCH] =?UTF-8?q?=E3=83=90=E3=83=83=E3=83=81=E3=82=B9=E3=83=86?= =?UTF-8?q?=E3=83=BC=E3=82=BF=E3=82=B9=E7=AE=A1=E7=90=86=E3=83=86=E3=83=BC?= =?UTF-8?q?=E3=83=96=E3=83=AB=E7=AE=A1=E7=90=86=E3=82=AF=E3=83=A9=E3=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manager/jskult_batch_status_manager.py | 199 ++++++++++++++++++ 1 file changed, 199 insertions(+) create mode 100644 ecs/jskult-batch/src/manager/jskult_batch_status_manager.py diff --git a/ecs/jskult-batch/src/manager/jskult_batch_status_manager.py b/ecs/jskult-batch/src/manager/jskult_batch_status_manager.py new file mode 100644 index 00000000..5ffbe0c4 --- /dev/null +++ b/ecs/jskult-batch/src/manager/jskult_batch_status_manager.py @@ -0,0 +1,199 @@ +from src.error.exceptions import MaxRunCountReachedException +from src.db.database import Database + +# 実消化&アルトマーク_バッチステータス管理テーブルを管理するクラス +class JskultBatchStatusManager: + def __init__(self, process_name : str, process_type : str, max_run_count_flg : int, receive_file_count : int): + + # 処理名 + self._process_name: str = process_name + + # 管理区分 + self._process_type: str = process_type + + # 最大起動回数 + self._max_run_count_flg: str = max_run_count_flg + + # 受信ファイル数 + self._receive_file_count: str = receive_file_count + + # DB接続モジュール(バッチ)のget_instanceを呼び出し設定 + self._db = Database().get_instance() + + # 処理ステータスの登録および更新を行う + def set_process_status (self, process_status : str): + try: + self._db.begin() + self._db.execute(f"CALL upsert_jskult_batch_status_manage({self._process_name} {self._process_type} {process_status} NULL NULL);") + self._db.commit() + + except Exception as e: + + # Exceptionをcatchした場合はrollback + self._db.rollback() + raise e + + # 後続処理を実行してよいか判定する + def can_run_post_process(self): + + # SELECTの結果からレコード数を取得 + record_count = self._db.execute_select( + f"SELECT * FROM internal07.jskult_batch_status_manage WHERE process_name = {self._process_name} AND process_date = src07.get_syor_date();" + ).count() + + if record_count == 0: + raise ValueError("レコードの取得が出来ませんでした。") + + # 起動回数のインクリメント + self._increment_run_count() + + # データ取込が完了していた場合 + if self._is_done_data_import(): + return True + + #最大起動回数に到達していない場合 + if not self._is_max_run_count_reached: + return False + + # 最大起動回数フラグを立てる + self._activate_max_run_count_flg() + + return True + + # 日付テーブル更新を実行してよいか判定する + def can_run_business_day_update(self): + + # SELECTの結果からレコード数を取得 + record_count = self._db.execute_select( + f"SELECT * FROM internal07.jskult_batch_status_manage WHERE process_name = {self._process_name} AND process_date = src07.get_syor_date();" + ).count() + + if record_count == 0: + raise ValueError("レコードの取得が出来ませんでした。") + + # 起動回数のインクリメント + self._increment_run_count() + + # 後続処理が完了していた場合 + if self._is_done_post_process(): + return True + + #最大起動回数に到達していない場合 + if not self._is_max_run_count_reached(): + return False + + # 最大起動回数フラグを立てる + self._activate_max_run_count_flg() + + # 最大起動回数に到達した場合にメッセージをスロー + raise MaxRunCountReachedException("最大起動回数に到達しました") + + + # アルトマークデータ連携があったかを確認する + def is_done_ultmarc_import(self): + + # SELECTの結果からレコード数を取得 + record_count = self._db.execute_select( + f"SELECT * FROM internal07.jskult_batch_status_manage WHERE process_name = 'jskult-batch-ultmarc-io' AND process_date = src07.get_syor_date();" + ).count() + # アルトマークデータ連携が無かった場合 + if record_count == 0: + return False + + return True + + # 起動回数をインクリメントする + def _increment_run_count(self): + try: + self._db.begin() + # SELECTの結果からレコードを取得 + record = self._db.execute_select( + f"SELECT * FROM internal07.jskult_batch_status_manage WHERE process_name = {self._process_name} AND process_date = src07.get_syor_date();" + ) + + run_count += record[0]['run_count'] + + self._db.execute(f"CALL upsert_jskult_batch_status_manage({self._process_name} {self._process_type} NULL {run_count} NULL);") + + self._db.commit() + + except Exception as e: + + # Exceptionをcatchした場合はrollbakc + self._db.rollback() + raise e + + # データ取込処理が完了しているかを判定する + def _is_done_data_import(self): + + # SELECTの結果からレコード数を取得 + record_count = self._db.execute_select( + f"SELECT * FROM internal07.jskult_batch_status_manage WHERE process_type = {self._process_type} AND process_status = 'done' AND process_date = src07.get_syor_date();" + ).count() + + # データ取込数が一致している場合 + if(self._receive_file_count == record_count): + return True + + return False + + # 後続処理のすべての処理が完了しているかを判定する + def _is_done_post_process(self): + + if not self._is_done_process("jskult-batch-trn-result-data-bio-lot"): + return False + + if not self._is_done_process("jskult-batch-mst-inst"): + return False + + if not self._is_done_process("jskult-batch-dcf-inst-merge-io"): + return False + + # 全ての後続処理が完了している場合Trueを返す + return True + + + # データ取込処理が完了しているかを判定する + def _is_done_process(self, process_name : str): + + # SELECTの結果からレコード数を取得 + record_count = self._db.execute_select( + f"SELECT * FROM internal07.jskult_batch_status_manage WHERE process_name = {self._process_name} AND process_status = 'done' AND process_date = src07.get_syor_date();" + ).count() + + if(record_count == 0): + return False + + return True + + + # 起動回数が最大回数に到達しているか判定する + def _is_max_run_count_reached(self): + + # SELECTの結果からレコード数を取得 + record = self._db.execute_select( + f"SELECT * FROM internal07.jskult_batch_status_manage WHERE process_name = {self._process_name} AND process_date = src07.get_syor_date();" + ) + + run_count = record[0]['run_count'] + + # 取得した起動回数とフィールド変数の最大起動回数が一致するか確認 + if run_count == self._max_run_count_flg: + return True + + return False + + + def _activate_max_run_count_flg(self): + try: + self._db.begin() + + # 最大起動回数フラグにフラグを立てる + self._db.execute(f"CALL upsert_jskult_batch_status_manage({self._process_name} {self._process_type} NULL NULL 1);") + + self._db.commit() + + except Exception as e: + + self._db.rollback() + raise e \ No newline at end of file