Merge pull request #485 feature-NEWDWH2021-1864 into develop
This commit is contained in:
commit
42fbde2190
@ -4,15 +4,18 @@ import os.path as path
|
|||||||
import tempfile
|
import tempfile
|
||||||
|
|
||||||
from src.aws.s3 import JskSendBucket, JskTransferListBucket
|
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.batch.jskult_batch_entrypoint import JskultBatchEntrypoint
|
||||||
from src.db.database import Database
|
from src.db.database import Database
|
||||||
from src.error.exceptions import (BatchOperationException,
|
from src.error.exceptions import (BatchOperationException,
|
||||||
|
EnvironmentVariableNotSetException,
|
||||||
MaxRunCountReachedException)
|
MaxRunCountReachedException)
|
||||||
from src.logging.get_logger import get_logger
|
from src.logging.get_logger import get_logger
|
||||||
from src.manager.jskult_batch_run_manager import JskultBatchRunManager
|
from src.manager.jskult_batch_run_manager import JskultBatchRunManager
|
||||||
from src.manager.jskult_batch_status_manager import JskultBatchStatusManager
|
from src.manager.jskult_batch_status_manager import JskultBatchStatusManager
|
||||||
from src.manager.jskult_hdke_tbl_manager import JskultHdkeTblManager
|
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削除新規マスタ作成')
|
logger = get_logger('DCF削除新規マスタ作成')
|
||||||
|
|
||||||
@ -20,12 +23,22 @@ logger = get_logger('DCF削除新規マスタ作成')
|
|||||||
class DcfInstMergeIO(JskultBatchEntrypoint):
|
class DcfInstMergeIO(JskultBatchEntrypoint):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
# 環境変数をimport
|
||||||
|
self.environment = DCFInstMergeEnvironment()
|
||||||
|
|
||||||
def execute(self):
|
def execute(self):
|
||||||
logger.info("DCF削除新規マスタ作成処理を開始します。")
|
logger.info("DCF削除新規マスタ作成処理を開始します。")
|
||||||
|
|
||||||
|
# 必須の環境変数が設定されていない場合、エラーにする
|
||||||
|
try:
|
||||||
|
self.environment.validate()
|
||||||
|
except EnvironmentVariableNotSetException as e:
|
||||||
|
logger.exception(e)
|
||||||
|
return
|
||||||
|
|
||||||
jskult_hdke_tbl_manager = JskultHdkeTblManager()
|
jskult_hdke_tbl_manager = JskultHdkeTblManager()
|
||||||
jskult_batch_run_manager = JskultBatchRunManager(
|
jskult_batch_run_manager = JskultBatchRunManager(
|
||||||
environment.BATCH_EXECUTION_ID)
|
self.environment.BATCH_EXECUTION_ID)
|
||||||
if not jskult_hdke_tbl_manager.can_run_process():
|
if not jskult_hdke_tbl_manager.can_run_process():
|
||||||
logger.error(
|
logger.error(
|
||||||
'日次バッチ処理中またはdump取得が正常終了していないため、DCF削除新規マスタ作成を終了します。')
|
'日次バッチ処理中またはdump取得が正常終了していないため、DCF削除新規マスタ作成を終了します。')
|
||||||
@ -54,20 +67,21 @@ class DcfInstMergeIO(JskultBatchEntrypoint):
|
|||||||
transfer_list['jsk_transfer_list']) + len(transfer_list['ult_transfer_list'])
|
transfer_list['jsk_transfer_list']) + len(transfer_list['ult_transfer_list'])
|
||||||
|
|
||||||
jskult_batch_status_manager = JskultBatchStatusManager(
|
jskult_batch_status_manager = JskultBatchStatusManager(
|
||||||
environment.PROCESS_NAME,
|
self.environment.PROCESS_NAME,
|
||||||
# TODO チケットNEWDWH2021-1847の実装で作成した定数に置き換え
|
constants.PROCESS_TYPE_POST_PROCESS,
|
||||||
'post_process',
|
self.environment.MAX_RUN_COUNT,
|
||||||
environment.MAX_RUN_COUNT,
|
|
||||||
receive_file_count
|
receive_file_count
|
||||||
)
|
)
|
||||||
try:
|
try:
|
||||||
|
|
||||||
jskult_batch_status_manager.set_process_status("start")
|
jskult_batch_status_manager.set_process_status(
|
||||||
|
constants.PROCESS_STATUS_START)
|
||||||
try:
|
try:
|
||||||
if not jskult_batch_status_manager.can_run_post_process():
|
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」で登録
|
# バッチ実行管理テーブルに「retry」で登録
|
||||||
jskult_batch_run_manager.batch_retry()
|
jskult_batch_run_manager.batch_retry()
|
||||||
@ -76,7 +90,8 @@ class DcfInstMergeIO(JskultBatchEntrypoint):
|
|||||||
except MaxRunCountReachedException:
|
except MaxRunCountReachedException:
|
||||||
logger.info('最大起動回数に到達したため、DCF削除新規マスタ作成処理を実行します。')
|
logger.info('最大起動回数に到達したため、DCF削除新規マスタ作成処理を実行します。')
|
||||||
|
|
||||||
jskult_batch_status_manager.set_process_status("doing")
|
jskult_batch_status_manager.set_process_status(
|
||||||
|
constants.PROCESS_STATUS_DOING)
|
||||||
|
|
||||||
# アルトマーク取込が実行されていた場合にDCF施設削除新規マスタの作成処理を実行
|
# アルトマーク取込が実行されていた場合にDCF施設削除新規マスタの作成処理を実行
|
||||||
if jskult_batch_status_manager.is_done_ultmarc_import():
|
if jskult_batch_status_manager.is_done_ultmarc_import():
|
||||||
@ -90,17 +105,18 @@ class DcfInstMergeIO(JskultBatchEntrypoint):
|
|||||||
# CSV出力
|
# CSV出力
|
||||||
dcf_inst_merge_all_records = self._select_dcf_inst_merge_all()
|
dcf_inst_merge_all_records = self._select_dcf_inst_merge_all()
|
||||||
file_path = self._make_csv_data(
|
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)
|
dcf_inst_merge_all_records)
|
||||||
|
|
||||||
# CSVをS3にアップロード
|
# CSVをS3にアップロード
|
||||||
self._upload_dcf_inst_merge_csv_file(
|
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」で登録
|
# 処理が全て正常終了した際に、バッチ実行管理テーブルに「success」で登録
|
||||||
logger.info("DCF削除新規マスタ作成処理を正常終了します。")
|
logger.info("DCF削除新規マスタ作成処理を正常終了します。")
|
||||||
jskult_batch_run_manager.batch_success()
|
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
|
return
|
||||||
|
|
||||||
@ -108,7 +124,8 @@ class DcfInstMergeIO(JskultBatchEntrypoint):
|
|||||||
# 何らかのエラーが発生した際に、バッチ実行管理テーブルに「failed」で登録
|
# 何らかのエラーが発生した際に、バッチ実行管理テーブルに「failed」で登録
|
||||||
logger.exception(f'予期せぬエラーが発生したため、DCF削除新規マスタ作成処理を終了します。{e}')
|
logger.exception(f'予期せぬエラーが発生したため、DCF削除新規マスタ作成処理を終了します。{e}')
|
||||||
jskult_batch_run_manager.batch_failed()
|
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]]:
|
def _select_dcf_inst_merge_all(self) -> tuple[bool, list[dict]]:
|
||||||
try:
|
try:
|
||||||
@ -272,7 +289,7 @@ class DcfInstMergeIO(JskultBatchEntrypoint):
|
|||||||
'CREATER', 'CREATE_DATE', 'UPDATER', 'UPDATE_DATE']
|
'CREATER', 'CREATE_DATE', 'UPDATER', 'UPDATE_DATE']
|
||||||
with open(csv_file_path, mode='w', encoding='UTF-8') as csv_file:
|
with open(csv_file_path, mode='w', encoding='UTF-8') as csv_file:
|
||||||
# ヘッダ行書き込み(くくり文字をつけない為にwriterowではなく、writeを使用しています)
|
# ヘッダ行書き込み(くくり文字をつけない為にwriterowではなく、writeを使用しています)
|
||||||
csv_file.write(f"{','.join(head_str)}\n")
|
csv_file.write(f"{','.join(head_str)}\r\n")
|
||||||
# UTF-8、CRLF、価囲いありで書き込む
|
# UTF-8、CRLF、価囲いありで書き込む
|
||||||
writer = csv.writer(csv_file, delimiter=',', lineterminator='\r\n',
|
writer = csv.writer(csv_file, delimiter=',', lineterminator='\r\n',
|
||||||
quotechar='"', doublequote=True, quoting=csv.QUOTE_ALL,
|
quotechar='"', doublequote=True, quoting=csv.QUOTE_ALL,
|
||||||
|
|||||||
@ -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')
|
||||||
@ -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}]が整数ではありません。')
|
||||||
@ -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')
|
||||||
|
|
||||||
@ -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.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):
|
class TrnResultDataBioLot(JskultBatchEntrypoint):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
self.environment = TrnResultDataBioLotEnvironment()
|
||||||
|
|
||||||
|
# 必須の環境変数が設定されていない場合、エラーにする
|
||||||
|
try:
|
||||||
|
self.environment.validate()
|
||||||
|
except EnvironmentVariableNotSetException as e:
|
||||||
|
logger.exception(e)
|
||||||
|
return
|
||||||
|
|
||||||
def execute(self):
|
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('ロットマスタから有効期限をセット成功')
|
||||||
|
|||||||
@ -12,3 +12,7 @@ class BatchOperationException(MeDaCaException):
|
|||||||
|
|
||||||
class MaxRunCountReachedException(MeDaCaException):
|
class MaxRunCountReachedException(MeDaCaException):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class EnvironmentVariableNotSetException(MeDaCaException):
|
||||||
|
pass
|
||||||
|
|||||||
@ -7,21 +7,24 @@ DB_USERNAME = os.environ['DB_USERNAME']
|
|||||||
DB_PASSWORD = os.environ['DB_PASSWORD']
|
DB_PASSWORD = os.environ['DB_PASSWORD']
|
||||||
DB_SCHEMA = os.environ['DB_SCHEMA']
|
DB_SCHEMA = os.environ['DB_SCHEMA']
|
||||||
|
|
||||||
# AWS
|
# 処理名
|
||||||
JSKULT_CONFIG_BUCKET = os.environ['JSKULT_CONFIG_BUCKET']
|
PROCESS_NAME = os.environ.get('PROCESS_NAME', None)
|
||||||
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']
|
|
||||||
|
|
||||||
# AWS
|
# 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')
|
LOG_LEVEL = os.environ.get('LOG_LEVEL', 'INFO')
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user