195 lines
8.5 KiB
Python
195 lines
8.5 KiB
Python
import gc
|
|
|
|
from src.backup_crm_csv_data_process import backup_crm_csv_data_process
|
|
from src.backup_crm_data_process import backup_crm_data_process
|
|
from src.check_object_info_process import check_object_info_process
|
|
from src.config.objects import FetchTargetObjects
|
|
from src.convert_crm_csv_data_process import convert_crm_csv_data_process
|
|
from src.copy_crm_csv_data_process import copy_crm_csv_data_process
|
|
from src.error.exceptions import MeDaCaCRMDataFetchException
|
|
from src.fetch_crm_data_process import fetch_crm_data_process
|
|
from src.prepare_data_fetch_process import prepare_data_fetch_process
|
|
from src.set_datetime_period_process import set_datetime_period_process
|
|
from src.system_var.constants import OBJECT_NAME_KEY
|
|
from src.upload_last_fetch_datetime_process import \
|
|
upload_last_fetch_datetime_process
|
|
from src.upload_result_data_process import upload_result_data_process
|
|
from src.util.execute_datetime import ExecuteDateTime
|
|
from src.util.logger import logger_instance as logger
|
|
|
|
|
|
def controller() -> None:
|
|
"""コントロール処理"""
|
|
|
|
try:
|
|
# ① CRMデータ取得処理開始ログを出力する
|
|
logger.info('I-CTRL-01 CRMデータ取得処理を開始します')
|
|
|
|
# ② データ取得準備処理を呼び出す
|
|
logger.info('I-CTRL-02 データ取得準備処理呼び出し')
|
|
|
|
fetch_target_objects, execute_datetime, process_result = prepare_data_fetch_process()
|
|
|
|
# ③ object_infoのobjectsキーの値の件数分ループする
|
|
logger.info('I-CTRL-03 取得対象オブジェクトのループ処理開始')
|
|
|
|
process_result = _fetch_crm_data(fetch_target_objects, execute_datetime, process_result)
|
|
|
|
# ④ すべてのオブジェクトの処理が完了したことと、オブジェクト毎の処理結果をログに出力する
|
|
logger.info(f'I-CTRL-17 すべてのオブジェクトの処理が終了しました 実行結果:[{process_result}]')
|
|
|
|
# 最終結果が0件(1件も処理されていない)の場合、ログ出力して処理を終了する
|
|
if len(process_result.keys()) == 0:
|
|
logger.info('I-CTRL-21 処理対象のデータが存在しませんでした')
|
|
return 0
|
|
|
|
# ⑤ 取得処理実施結果アップロード処理を呼び出す
|
|
logger.info('I-CTRL-18 CRM_取得処理実施結果ファイルアップロード処理開始')
|
|
upload_result_data_process(process_result, execute_datetime)
|
|
|
|
# ⑥ 最終結果をチェックし、チェック結果をログに出力
|
|
_check_process_result(process_result)
|
|
|
|
return 0
|
|
|
|
except MeDaCaCRMDataFetchException as e:
|
|
logger.error(f'E-ERR-01 [{e.func_name}]でエラーが発生したため、処理を終了します')
|
|
logger.exception(f'{e.error_id} {e}')
|
|
raise e
|
|
|
|
except Exception as e:
|
|
logger.exception('E-ERR-02 予期せぬエラーが発生したため、処理を終了します', e)
|
|
raise e
|
|
|
|
finally:
|
|
# ⑦ CRMデータ取得処理終了ログを出力する
|
|
logger.info('I-CTRL-20 CRMデータ取得処理を終了します')
|
|
|
|
|
|
def _fetch_crm_data(fetch_target_objects: FetchTargetObjects, execute_datetime: ExecuteDateTime, process_result: dict):
|
|
"""取得対象オブジェクト情報をループし、1オブジェクトごとのデータを取得する
|
|
|
|
Args:
|
|
fetch_target_objects (FetchTargetObjects): CRMオブジェクト情報インスタンス
|
|
execute_datetime (ExecuteDateTime): 実行日次取得インスタンス
|
|
process_result (dict): 取得処理実行結果辞書オブジェクト
|
|
|
|
Returns:
|
|
process_result: 取得処理実行結果辞書オブジェクト
|
|
"""
|
|
|
|
for object_info in fetch_target_objects:
|
|
try:
|
|
process_result[object_info.get(OBJECT_NAME_KEY)] = 'fail'
|
|
|
|
_fetch_crm_data_per_object(object_info, execute_datetime)
|
|
|
|
process_result[object_info.get(OBJECT_NAME_KEY)] = 'success'
|
|
|
|
except MeDaCaCRMDataFetchException as e:
|
|
logger.info(f'{e.error_id} {e}')
|
|
logger.info(
|
|
f'I-ERR-03 [{object_info.get(OBJECT_NAME_KEY)}] の[{e.func_name}]でエラーが発生しました 次のオブジェクトの処理に移行します', exc_info=True)
|
|
continue
|
|
|
|
except Exception as e:
|
|
logger.info(
|
|
f'I-ERR-04 [{object_info.get(OBJECT_NAME_KEY)}] の処理中に予期せぬエラーが発生しました 次のオブジェクトの処理に移行します', e, exc_info=True)
|
|
continue
|
|
|
|
return process_result
|
|
|
|
|
|
def _fetch_crm_data_per_object(object_info: dict, execute_datetime: ExecuteDateTime) -> None:
|
|
"""オブジェクトごとにCRMのデータを取得し、取込フォルダにアップロードする
|
|
|
|
Args:
|
|
object_info (dict): 取得対象オブジェクト情報
|
|
execute_datetime (ExecuteDateTime): 実行日次取得インスタンス
|
|
"""
|
|
|
|
# 1. オブジェクト処理結果の初期化
|
|
logger.debug(f'D-CTRL-04 対象のオブジェクト情報を出力します オブジェクト情報:[{object_info}]')
|
|
|
|
# 2. オブジェクト情報形式チェック処理を呼び出す
|
|
logger.info('I-CTRL-05 オブジェクト情報形式チェック処理呼び出し')
|
|
|
|
target_object = check_object_info_process(object_info, execute_datetime)
|
|
target_object_name = target_object.object_name
|
|
|
|
# 3. 処理対象のオブジェクト名をログ出力する
|
|
logger.info(
|
|
f'I-CTRL-06 [{target_object_name}]のデータ取得を開始します')
|
|
|
|
# 4. オブジェクト情報.is_skipがTrueの場合、次のオブジェクトの処理に移行する
|
|
if target_object.is_skip is True:
|
|
logger.info(
|
|
f'I-CTRL-07 [{target_object_name}]のデータ取得処理をスキップします')
|
|
return
|
|
|
|
# 5. データ取得期間設定処理を呼び出す
|
|
logger.info(
|
|
f'I-CTRL-08 [{target_object_name}]のデータ取得期間設定処理呼び出し')
|
|
|
|
last_fetch_datetime = set_datetime_period_process(target_object, execute_datetime)
|
|
|
|
# 6. CRMデータ取得処理を呼び出す
|
|
logger.info(
|
|
f'I-CTRL-09 [{target_object_name}]のデータ取得処理呼び出し')
|
|
|
|
crm_data_response = fetch_crm_data_process(target_object, last_fetch_datetime)
|
|
|
|
# 7. 出力ファイル名をログ出力する
|
|
logger.info(
|
|
f'I-CTRL-10 [{target_object_name}] の出力ファイル名は [{target_object.upload_file_name}] となります')
|
|
|
|
# 8. CRM電文データバックアップ処理を呼び出す
|
|
logger.info(
|
|
f'I-CTRL-11 [{target_object_name}] CRM電文データバックアップ処理呼び出し')
|
|
backup_crm_data_process(target_object_name, crm_data_response, execute_datetime)
|
|
|
|
# 9. CSV変換処理を呼び出す
|
|
logger.info(
|
|
f'I-CTRL-12 [{target_object.object_name}] CSV変換処理呼び出し')
|
|
csv_string = convert_crm_csv_data_process(target_object, crm_data_response)
|
|
|
|
# 10. CSVバックアップ処理を呼び出す
|
|
logger.info(
|
|
f'I-CTRL-13 [{target_object_name}] CSVデータバックアップ処理呼び出し')
|
|
backup_crm_csv_data_process(target_object, execute_datetime, csv_string)
|
|
|
|
# 11. CSVアップロード処理を呼び出す
|
|
logger.info(
|
|
f'I-CTRL-14 [{target_object_name}] CSVデータアップロード処理呼び出し')
|
|
copy_crm_csv_data_process(target_object, execute_datetime)
|
|
|
|
# 12. メモリ解放
|
|
del crm_data_response
|
|
del csv_string
|
|
gc.collect()
|
|
|
|
# 13. 前回取得日時ファイル更新処理を呼びだす
|
|
logger.info(
|
|
f'I-CTRL-15 [{target_object_name}] 前回取得日時ファイル更新処理呼び出し')
|
|
upload_last_fetch_datetime_process(target_object, last_fetch_datetime)
|
|
|
|
# 14. オブジェクトのアップロードが完了した旨をログに出力する
|
|
logger.info(f'I-CTRL-16 [{target_object_name}] 処理正常終了')
|
|
|
|
return
|
|
|
|
|
|
def _check_process_result(process_result: dict) -> None:
|
|
"""取得処理結果がすべて成功か、一部失敗しているかを判定し、ログ出力する
|
|
|
|
Args:
|
|
process_result (dict): 取得処理結果辞書オブジェクト
|
|
"""
|
|
if not all([v == 'success' for v in process_result.values()]):
|
|
logger.error('E-CTRL-01 一部のデータ取得に失敗しています 詳細はログをご確認ください')
|
|
return
|
|
|
|
logger.info('I-CTRL-19 すべてのデータの取得に成功しました')
|
|
|
|
return
|