From 94016f513d9eb9004f9883dbf3db52fac76a8a81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Thu, 18 May 2023 18:04:16 +0900 Subject: [PATCH 01/13] =?UTF-8?q?feat:=20DCF=E6=96=BD=E8=A8=AD=E7=B5=B1?= =?UTF-8?q?=E5=90=88=E3=83=9E=E3=82=B9=E3=82=BF=E6=97=A5=E6=AC=A1=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E3=83=90=E3=83=83=E3=83=81(=E9=80=94=E4=B8=AD?= =?UTF-8?q?=E3=81=BE=E3=81=A7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Integrate_dcf_inst_merge.py | 547 ++++++++++++++++++ 1 file changed, 547 insertions(+) create mode 100644 ecs/jskult-batch-daily/src/batch/dcf_inst_merge/Integrate_dcf_inst_merge.py diff --git a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/Integrate_dcf_inst_merge.py b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/Integrate_dcf_inst_merge.py new file mode 100644 index 00000000..fa6ce77a --- /dev/null +++ b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/Integrate_dcf_inst_merge.py @@ -0,0 +1,547 @@ +from datetime import datetime, timedelta +from sqlalchemy import CursorResult +from src.batch.batch_functions import logging_sql +from src.batch.common.batch_context import BatchContext +from src.db.database import Database +from src.error.exceptions import BatchOperationException +from src.logging.get_logger import get_logger +from src.time.elapsed_time import ElapsedTime + +logger = get_logger('DCF施設統合マスタ日次更新バッチ') +batch_context = BatchContext.get_instance() + + +def exec(): + db = Database.get_instance() + try: + db.connect() + db.begin() + # + enabled_dst_inst_merge_records = _laundering_enabled_dct_inst_merge(db) + # + _laundering_disabled_dct_inst_merge(db) + # + if len(enabled_dst_inst_merge_records) > 0: + logger.info('') + _add_emp_chg_inst(db, enabled_dst_inst_merge_records) + logger.info('') + _add_ult_ident_presc(db, enabled_dst_inst_merge_records) + db.commit() + # + logger.info('') + except Exception as e: + db.rollback() + raise BatchOperationException(e) + finally: + db.disconnect() + + +def _laundering_enabled_dct_inst_merge(db: Database) -> list[dict]: + # データ取得(無効フラグが『0(有効)』) + valid_dst_inst_merge_records = _select_dct_inst_merge(db, 0, True) + # 移行先DCF施設コードの更新(無効フラグが『0(有効)』) + _update_dcf_inst_merge(db, 0) + # DCF施設統合マスタの過去分の洗い替え + if len(valid_dst_inst_merge_records) == 0: + return + for row in valid_dst_inst_merge_records: + _update_dcf_inst_cd_new(db, row['dup_opp_cd'], row['dcf_inst_cd']) + + return valid_dst_inst_merge_records + + +def _laundering_disabled_dct_inst_merge(db: Database): + # データ取得(無効フラグが『1(無効)』) + disabled_dst_inst_merge_records = _select_dct_inst_merge(db, 1, False) + # 移行先DCF施設コードの更新(無効フラグが『1(無効)』) + _update_dcf_inst_merge(db, 1) + # DCF施設統合マスタの過去分の洗い替え + if len(disabled_dst_inst_merge_records) == 0: + return + for row in disabled_dst_inst_merge_records: + _update_dcf_inst_cd_new(db, row['dcf_inst_cd'], row['dup_opp_cd']) + + +def _add_ult_ident_presc(db: Database, valid_dst_inst_merge_records: list[dict]): + # + for data_inst_cnt, row in enumerate(valid_dst_inst_merge_records, start=1): + tekiyo_month_first_day = _get_first_day_of_month(row['tekiyo_month']) + + ult_ident_presc_records = _select_ult_ident_presc(db, row['dcf_inst_cd'], row['dup_opp_cd']) + for data_cnt, ult_row in enumerate(ult_ident_presc_records, start=1): + logger.info(f'{data_inst_cnt}件目の移行施設の{data_cnt}レコード目処理 開始') + # 処方元コード=重複時相手先コードが発生した場合 + if ult_row['opp_count'] > 0: + break + + start_date = _str_to_date_time(ult_row['start_date']) + set_start_date = start_date \ + if start_date > tekiyo_month_first_day else tekiyo_month_first_day + set_start_date = _date_time_to_str(set_start_date) + is_delete_duplicate_key = False + if _count_duplicate_ult_ident_presc(db, set_start_date, ult_row): + _delete_ult_ident_presc(db, set_start_date, ult_row) + is_delete_duplicate_key = True + else: + logger.info('納入先処方元マスタの重複予定データなし') + _insert_ult_ident_presc(db, set_start_date, row['dup_opp_cd'], ult_row) + + if _str_to_date_time(ult_row['end_date']) < start_date: + _delete_ult_ident_presc(db, ult_row['start_date'], ult_row) + continue + if not is_delete_duplicate_key: + last_end_date = tekiyo_month_first_day - timedelta(days=1) + _update_ult_ident_presc_end_date(db, _date_time_to_str(last_end_date), ult_row) + if start_date > last_end_date: + _delete_ult_ident_presc(db, ult_row['start_date'], ult_row) + + +def _delete_ult_ident_presc(db: Database, start_date: str, ult_row: CursorResult): + # + try: + elapsed_time = ElapsedTime() + sql = """ + DELETE FROM + src05.ult_ident_presc + WHERE + ta_cd = :ta_cd + AND ult_ident_cd = :ult_ident_cd + AND ratio = :ratio + AND start_date = :set_start_date + """ + params = { + 'ta_cd': ult_row['ta_cd'], + 'ult_ident_cd': ult_row['ult_ident_cd'], + 'ratio': ult_row['ratio'], + 'start_date': start_date + } + res = db.execute(sql, params) + logging_sql(logger, sql) + logger.info('') + except Exception as e: + logger.debug('') + raise e + + +def _add_emp_chg_inst(db: Database, valid_dst_inst_merge_records: list[dict]): + # + for row in valid_dst_inst_merge_records: + tekiyo_month_first_day = _get_first_day_of_month(row['tekiyo_month']) + emp_chg_inst_records = _select_emp_chg_inst(db, row['dcf_inst_cd'], row['dup_opp_cd']) + for emp_row in emp_chg_inst_records: + # 重複時相手先コードが存在したかのチェック + if emp_row['opp_count'] > 0: + break + + start_date = _str_to_date_time(emp_row['start_date']) + set_start_date = start_date \ + if start_date > tekiyo_month_first_day else tekiyo_month_first_day + + _insert_emp_chg_inst(db, row['dup_opp_cd'], _date_time_to_str(set_start_date), emp_row) + + if start_date < tekiyo_month_first_day: + last_end_date = tekiyo_month_first_day - timedelta(days=1) + _update_emp_chg_inst_end_date(db, row['dcf_inst_cd'], _date_time_to_str(last_end_date), emp_row) + if start_date <= last_end_date: + continue + _update_emp_chg_inst_enabled_flg(db, row['dcf_inst_cd'], emp_row['ta_cd'], emp_row['start_date']) + + # if start_date >= tekiyo_month_first_day: + # _update_emp_chg_inst_enabled_flg(db, row['dcf_inst_cd'], emp_row['ta_cd'], start_date) + # continue + # last_end_date = tekiyo_month_first_day - timedelta(days=1) + # _update_emp_chg_inst_end_date(db, row['dcf_inst_cd'], last_end_date, emp_row) + # if start_date > last_end_date: + # _update_emp_chg_inst_enabled_flg(db, row['dcf_inst_cd'], emp_row['ta_cd'], start_date) + + +def _update_emp_chg_inst_enabled_flg(db: Database, dcf_inst_cd: str, ta_cd: str, start_date: str): + # + try: + elapsed_time = ElapsedTime() + sql = """ + UPDATE + src05.emp_chg_inst + SET + enabled_flg = 'N', + updater = CURRENT_USER(), + update_date = SYSDATE() + WHERE + inst_cd = :dcf_inst_cd + AND ta_cd = :ta_cd + AND start_date = :start_date + """ + params = {'dcf_inst_cd': dcf_inst_cd, 'ta_cd': ta_cd, 'start_date': start_date} + res = db.execute(sql, params) + logging_sql(logger, sql) + logger.info(f'従業員担当施設マスタの更新に成功, {res.rowcount} 行更新 ({elapsed_time.of})') + except Exception as e: + logger.debug('') + raise e + + +def _update_emp_chg_inst_end_date(db: Database, dcf_inst_cd: str, last_end_date: str, emp_row: CursorResult): + # + try: + elapsed_time = ElapsedTime() + sql = """ + UPDATE + src05.emp_chg_inst + SET end_date = :end_date, + updater = CURRENT_USER(), + update_date= SYSDATE() + WHERE + inst_cd = :dcf_inst_cd + AND ta_cd = :ta_cd + AND emp_cd = :emp_cd + AND bu_cd = :bu_cd + AND start_date = :start_date + """ + params = { + 'end_date': last_end_date, + 'dcf_inst_cd': dcf_inst_cd, + 'ta_cd': emp_row['ta_cd'], + 'emp_cd': emp_row['emp_cd'], + 'bu_cd': emp_row['bu_cd'], + 'start_date': emp_row['start_date'] + } + res = db.execute(sql, params) + logging_sql(logger, sql) + logger.info(f'従業員担当施設マスタの更新に成功, {res.rowcount} 行更新 ({elapsed_time.of})') + except Exception as e: + logger.debug('') + raise e + + +def _insert_emp_chg_inst(db: Database, dup_opp_cd: str, set_start_date: str, emp_row: CursorResult): + # + try: + elapsed_time = ElapsedTime() + sql = """ + INSERT INTO + src05.emp_chg_inst( + inst_cd, + ta_cd, + emp_cd, + bu_cd, + start_date, + end_date, + main_chg_flg, + enabled_flg, + creater, + create_date, + updater, + update_date + ) + VALUES( + :dup_opp_cd, + :ta_cd, + :emp_cd, + :bu_cd, + :start_date, + :end_date, + :main_chg_flg, + 'Y', + CURRENT_USER(), + SYSDATE(), + CURRENT_USER(), + SYSDATE() + ) + """ + params = { + 'dup_opp_cd': dup_opp_cd, + 'ta_cd': emp_row['ta_cd'], + 'emp_cd': emp_row['emp_cd'], + 'bu_cd': emp_row['bu_cd'], + 'start_date': set_start_date, + 'end_date': emp_row['end_date'], + 'main_chg_flg': emp_row['main_chg_flg'] if emp_row['main_chg_flg'] is None else None + } + res = db.execute(sql, params) + logging_sql(logger, sql) + logger.info(f'従業員担当施設マスタの追加に成功, {res.rowcount} 行更新 ({elapsed_time.of})') + except Exception as e: + logger.debug('') + raise e + + +def _select_dct_inst_merge(db: Database, muko_flg: int, is_null_dcf_inst_cd_new: bool): + # + try: + sql = """ + SELECT + dim.dcf_inst_cd, + dim.dup_opp_cd, + dim.tekiyo_month + FROM + src05.dcf_inst_merge AS dim + INNER JOIN + src05.hdke_tbl AS ht + ON dim.tekiyo_month = DATE_FORMAT(ht.syor_date, '%Y%m') + WHERE + dim.muko_flg =: muko_flg + AND dim.enabled_flg = 'Y' + AND dim.dcf_inst_cd_new <= >: is_null_dcf_inst_cd_new + """ + params = { + 'muko_flg': muko_flg, + 'is_null_dcf_inst_cd_new': None + } + dst_inst_merge_records = db.execute_select(sql, params) + logging_sql(logger, sql) + logger.info('') + except Exception as e: + logger.debug('') + raise e + + return dst_inst_merge_records + + +def _update_dcf_inst_merge(db: Database, muko_flg: int): + # + try: + elapsed_time = ElapsedTime() + sql = """ + UPDATE + src05.dcf_inst_merge AS updim + INNER JOIN( + SELECT + dim.dcf_inst_cd AS base_dcf_inst_cd, + dim.dup_opp_cd AS base_dup_opp_cd, + dim.tekiyo_month AS base_tekiyo_month, + dim.muko_flg AS base_muko_flg, + dim.enabled_flg AS base_enabled_flg + FROM + src05.dcf_inst_merge AS dim + INNER JOIN + src05.hdke_tbl AS ht + ON dim.tekiyo_month=DATE_FORMAT(ht.syor_date, '%Y%m') + WHERE + dim.muko_flg= :muko_flg + AND dim.enabled_flg='Y' + AND dim.dcf_inst_cd_new IS {$dcfInstCdNew}NULL + ) AS bf_dim + SET + updim.dcf_inst_cd_new = {column}, + updim.updater = CURRENT_USER(), + updim.update_date = SYSDATE() + WHERE + updim.dcf_inst_cd = base_dcf_inst_cd + AND updim.dup_opp_cd = base_dup_opp_cd + AND updim.tekiyo_month = base_tekiyo_month + AND updim.muko_flg =base_muko_flg + AND updim.enabled_flg =base_enabled_flg + """ + params = { + 'muko_flg': muko_flg + } + res = db.execute(sql.format( + column='base_dup_opp_cd' if muko_flg == 1 else 'NULL' + ), params) + logging_sql(logger, sql) + logger.info(f'DCF施設統合マスタの更新に成功, {res.rowcount} 行更新 ({elapsed_time.of})') + except Exception as e: + logger.debug('') + raise e + + +def _update_dcf_inst_cd_new(db: Database, dcf_inst_cd_new_after: str, dcf_inst_cd_new_before: str): + # + try: + elapsed_time = ElapsedTime() + sql = """ + UPDATE + src05.dcf_inst_merge + SET + dcf_inst_cd_new = :dcf_inst_cd_new_after, + updater = CURRENT_USER(), + update_date = SYSDATE() + WHERE + dcf_inst_cd_new = :dcf_inst_cd_new_before + AND enabled_flg = 'Y' + AND muko_flg = 0 + """ + params = {'dcf_inst_cd_new_after': dcf_inst_cd_new_after, 'dcf_inst_cd_new_before': dcf_inst_cd_new_before} + res = db.execute(sql, params) + logging_sql(logger, sql) + logger.info(f'移行先DCF施設コードの更新に成功, {res.rowcount} 行更新 ({elapsed_time.of})') + except Exception as e: + logger.debug('') + raise e + + +def _update_ult_ident_presc_end_date(db: Database, last_end_date: str, ult_ident_presc_record: CursorResult): + # + try: + elapsed_time = ElapsedTime() + sql = """ + UPDATE + src05.ult_ident_presc + SET end_date = :end_date, + updater = CURRENT_USER(), + update_date= SYSDATE() + WHERE + ta_cd = :ta_cd + AND ult_ident_cd = :ult_ident_cd + AND ratio = :ratio + AND start_date = :start_date + """ + params = { + 'end_date': last_end_date, + 'ta_cd': ult_ident_presc_record['ta_cd'], + 'ult_ident_cd': ult_ident_presc_record['ult_ident_cd'], + 'ratio': ult_ident_presc_record['ratio'], + 'start_date': ult_ident_presc_record['start_date'] + } + res = db.execute(sql, params) + logging_sql(logger, sql) + logger.info(f'終了日 > 開始月のため適用終了日を更新, {res.rowcount} 行更新 ({elapsed_time.of})') + except Exception as e: + logger.debug('') + raise e + + +def _insert_ult_ident_presc(db: Database, set_Start_Date: str, dup_opp_cd: str, ult_row: CursorResult): + # + try: + elapsed_time = ElapsedTime() + sql = """ + INSERT INTO + src05.ult_ident_presc( + ta_cd, + ult_ident_cd, + ratio, + start_date, + presc_cd, + end_date, + creater, + create_date, + update_date, + updater + ) + VALUES( + :ta_cd, + :ult_ident_cd, + :ratio, + :start_date, + :presc_cd, + :end_date, + CURRENT_USER(), + SYSDATE(), + SYSDATE(), + CURRENT_USER() + ) + """ + params = { + 'ta_cd': ult_row['ta_cd'], + 'ult_ident_cd': ult_row['ult_ident_cd'], + 'ratio': ult_row['ratio'], + 'start_date': set_Start_Date, + 'presc_cd': dup_opp_cd, + 'end_date': ult_row['end_date'] + } + res = db.execute(sql, params) + logging_sql(logger, sql) + logger.info(f'納入先処方元マスタに追加に成功, {res.rowcount} 行更新 ({elapsed_time.of})') + except Exception as e: + logger.debug('納入先処方元マスタに追加に失敗') + raise e + + +def _select_emp_chg_inst(db: Database, dcf_inst_cd: str, dup_opp_cd: str) -> list[dict]: + # + try: + sql = """ + SELECT + eci.inst_cd, + eci.ta_cd, + eci.emp_cd, + eci.bu_cd, + eci.start_date, + eci.end_date, + eci.main_chg_flg, + eci.enabled_flg, + (SELECT COUNT(eciopp.inst_cd) FROM src05.emp_chg_inst AS eciopp WHERE eciopp.inst_cd = :dup_opp_cd) AS opp_count + FROM + src05.emp_chg_inst AS eci + WHERE + eci.inst_cd = :dcf_inst_cd + AND eci.enabled_flg = 'Y' + AND (SELECT ht.syor_date FROM src05.hdke_tbl AS ht) < eci.end_date + """ + params = {'dcf_inst_cd': dcf_inst_cd, 'dup_opp_cd': dup_opp_cd} + emp_chg_inst_records = db.execute_select(sql, params) + logging_sql(logger, sql) + logger.info('') + except Exception as e: + logger.debug('') + raise e + return emp_chg_inst_records + + +def _select_ult_ident_presc(db: Database, dcf_inst_cd: str, dup_opp_cd: str) -> list[dict]: + # + try: + sql = """ + SELECT + uip.ta_cd, + uip.ult_ident_cd, + uip.ratio, + uip.start_date, + uip.end_date, + (SELECT COUNT(uipopp.ta_cd) FROM ult_ident_presc AS uipopp WHERE uipopp.presc_cd = :dup_opp_cd) AS opp_count + FROM + src05.ult_ident_presc AS uip + WHERE + uip.presc_cd = '{$dcfInstCd}' + AND (SELECT ht.syor_date FROM src05.hdke_tbl AS ht) < uip.end_date + """ + params = {'dcf_inst_cd': dcf_inst_cd, 'dup_opp_cd': dup_opp_cd} + ult_ident_presc_records = db.execute_select(sql, params) + logging_sql(logger, sql) + logger.info('') + except Exception as e: + logger.debug('') + raise e + return ult_ident_presc_records + + +def _count_duplicate_ult_ident_presc(db: Database, set_Start_Date: str, ult_row: CursorResult): + # + try: + sql = """ + SELECT + COUNT(ta_cd) AS cnt + FROM + src05.ult_ident_presc + WHERE + ta_cd = :ta_cd + AND ult_ident_cd = :ult_ident_cd + AND ratio = :ratio + AND start_date = :set_Start_Date + """ + params = { + 'ta_cd': ult_row['ta_cd'], + 'ult_ident_cd': ult_row['ult_ident_cd'], + 'ratio': ult_row['ratio'], + 'start_date': set_Start_Date + } + result = db.execute_select(sql, params) + logging_sql(logger, sql) + logger.info('') + except Exception as e: + logger.debug('') + raise e + return result[0]['cnt'] + + +def _get_first_day_of_month(month_day: str): + return datetime.datetime.strptime(month_day, '%Y%m01') + + +def _str_to_date_time(str_date_time: str): + return datetime.datetime.strptime(str_date_time, '%Y%m%d') + + +def _date_time_to_str(date_time: datetime): + return date_time.strptime('%Y%m%d') From 75db3d2251968850ce4d1834d83ed39bef0d4461 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Fri, 19 May 2023 16:37:03 +0900 Subject: [PATCH 02/13] =?UTF-8?q?feat:=20DCF=E6=96=BD=E8=A8=AD=E7=B5=B1?= =?UTF-8?q?=E5=90=88=E3=83=9E=E3=82=B9=E3=82=BF=E6=97=A5=E6=AC=A1=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E3=83=90=E3=83=83=E3=83=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Integrate_dcf_inst_merge.py | 358 ++++++++++-------- 1 file changed, 193 insertions(+), 165 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/Integrate_dcf_inst_merge.py b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/Integrate_dcf_inst_merge.py index fa6ce77a..c37a3a30 100644 --- a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/Integrate_dcf_inst_merge.py +++ b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/Integrate_dcf_inst_merge.py @@ -7,8 +7,8 @@ from src.error.exceptions import BatchOperationException from src.logging.get_logger import get_logger from src.time.elapsed_time import ElapsedTime -logger = get_logger('DCF施設統合マスタ日次更新バッチ') batch_context = BatchContext.get_instance() +logger = get_logger('DCF施設統合マスタ日次更新バッチ') def exec(): @@ -16,19 +16,17 @@ def exec(): try: db.connect() db.begin() - # - enabled_dst_inst_merge_records = _laundering_enabled_dct_inst_merge(db) - # - _laundering_disabled_dct_inst_merge(db) - # + logger.debug('DCF施設統合マスタ日次更新バッチ処理開始') + # DCF施設統合マスタ移行先コードのセット(無効フラグが『0(有効)』) + enabled_dst_inst_merge_records = _set_enabled_dct_inst_merge(db) + # DCF施設統合マスタ移行先コードのセット(無効フラグが『1(無効)』) + _set_disabled_dct_inst_merge(db) + # DCF施設統合マスタに無効フラグが『0(有効)』データが存在する場合 if len(enabled_dst_inst_merge_records) > 0: - logger.info('') _add_emp_chg_inst(db, enabled_dst_inst_merge_records) - logger.info('') _add_ult_ident_presc(db, enabled_dst_inst_merge_records) db.commit() - # - logger.info('') + logger.info('DCF施設統合マスタ日次更新バッチ処理終了') except Exception as e: db.rollback() raise BatchOperationException(e) @@ -36,68 +34,101 @@ def exec(): db.disconnect() -def _laundering_enabled_dct_inst_merge(db: Database) -> list[dict]: +def _set_enabled_dct_inst_merge(db: Database) -> list[dict]: # データ取得(無効フラグが『0(有効)』) - valid_dst_inst_merge_records = _select_dct_inst_merge(db, 0, True) + enabled_dst_inst_merge_records = _select_dct_inst_merge(db, 0) # 移行先DCF施設コードの更新(無効フラグが『0(有効)』) - _update_dcf_inst_merge(db, 0) - # DCF施設統合マスタの過去分の洗い替え - if len(valid_dst_inst_merge_records) == 0: - return - for row in valid_dst_inst_merge_records: - _update_dcf_inst_cd_new(db, row['dup_opp_cd'], row['dcf_inst_cd']) + if _update_dcf_inst_merge(db, 0) > 0: + # DCF施設統合マスタの過去分の洗い替え + for row in enabled_dst_inst_merge_records: + _update_dcf_inst_cd_new(db, row['dup_opp_cd'], row['dcf_inst_cd']) - return valid_dst_inst_merge_records + return enabled_dst_inst_merge_records -def _laundering_disabled_dct_inst_merge(db: Database): +def _set_disabled_dct_inst_merge(db: Database): # データ取得(無効フラグが『1(無効)』) - disabled_dst_inst_merge_records = _select_dct_inst_merge(db, 1, False) + disabled_dst_inst_merge_records = _select_dct_inst_merge(db, 1) # 移行先DCF施設コードの更新(無効フラグが『1(無効)』) - _update_dcf_inst_merge(db, 1) - # DCF施設統合マスタの過去分の洗い替え - if len(disabled_dst_inst_merge_records) == 0: - return - for row in disabled_dst_inst_merge_records: - _update_dcf_inst_cd_new(db, row['dcf_inst_cd'], row['dup_opp_cd']) + if _update_dcf_inst_merge(db, 1) > 0: + # DCF施設統合マスタの過去分の洗い替え + for row in disabled_dst_inst_merge_records: + _update_dcf_inst_cd_new(db, row['dcf_inst_cd'], row['dup_opp_cd']) -def _add_ult_ident_presc(db: Database, valid_dst_inst_merge_records: list[dict]): - # - for data_inst_cnt, row in enumerate(valid_dst_inst_merge_records, start=1): +def _add_ult_ident_presc(db: Database, enabled_dst_inst_merge_records: list[dict]): + # 納入先処方元マスタの追加 + logger.info('納入先処方元マスタの登録 開始') + for data_inst_cnt, row in enumerate(enabled_dst_inst_merge_records, start=1): tekiyo_month_first_day = _get_first_day_of_month(row['tekiyo_month']) ult_ident_presc_records = _select_ult_ident_presc(db, row['dcf_inst_cd'], row['dup_opp_cd']) - for data_cnt, ult_row in enumerate(ult_ident_presc_records, start=1): + for data_cnt, ult_ident_presc_row in enumerate(ult_ident_presc_records, start=1): logger.info(f'{data_inst_cnt}件目の移行施設の{data_cnt}レコード目処理 開始') # 処方元コード=重複時相手先コードが発生した場合 - if ult_row['opp_count'] > 0: + if ult_ident_presc_row['opp_count'] > 0: break - start_date = _str_to_date_time(ult_row['start_date']) + start_date = _str_to_date_time(ult_ident_presc_row['start_date']) set_start_date = start_date \ if start_date > tekiyo_month_first_day else tekiyo_month_first_day set_start_date = _date_time_to_str(set_start_date) - is_delete_duplicate_key = False - if _count_duplicate_ult_ident_presc(db, set_start_date, ult_row): - _delete_ult_ident_presc(db, set_start_date, ult_row) - is_delete_duplicate_key = True + is_exists_duplicate_key = False + if _count_duplicate_ult_ident_presc(db, set_start_date, ult_ident_presc_row) > 0: + _delete_ult_ident_presc(db, set_start_date, ult_ident_presc_row, + '納入先処方元マスタの重複予定データの削除') + is_exists_duplicate_key = True else: logger.info('納入先処方元マスタの重複予定データなし') - _insert_ult_ident_presc(db, set_start_date, row['dup_opp_cd'], ult_row) + _insert_ult_ident_presc(db, set_start_date, row['dup_opp_cd'], ult_ident_presc_row) - if _str_to_date_time(ult_row['end_date']) < start_date: - _delete_ult_ident_presc(db, ult_row['start_date'], ult_row) + if _str_to_date_time(ult_ident_presc_row['end_date']) < start_date: + _delete_ult_ident_presc(db, ult_ident_presc_row['start_date'], ult_ident_presc_row, + '開始月>適用開始日のため物理削除') continue - if not is_delete_duplicate_key: + if not is_exists_duplicate_key: last_end_date = tekiyo_month_first_day - timedelta(days=1) - _update_ult_ident_presc_end_date(db, _date_time_to_str(last_end_date), ult_row) - if start_date > last_end_date: - _delete_ult_ident_presc(db, ult_row['start_date'], ult_row) + _update_ult_ident_presc_end_date(db, _date_time_to_str(last_end_date), ult_ident_presc_row) + if start_date > last_end_date: + _delete_ult_ident_presc(db, ult_ident_presc_row['start_date'], ult_ident_presc_row, + '適用終了日更新後 開始日>終了日のため物理削除') + + logger.info('納入先処方元マスタの登録 終了') -def _delete_ult_ident_presc(db: Database, start_date: str, ult_row: CursorResult): - # +def _add_emp_chg_inst(db: Database, enabled_dst_inst_merge_records: list[dict]): + # 従業員担当施設マスタの登録 + logger.info('従業員担当施設マスタの登録 開始') + for row in enabled_dst_inst_merge_records: + tekiyo_month_first_day = _get_first_day_of_month(row['tekiyo_month']) + emp_chg_inst_records = _select_emp_chg_inst(db, row['dcf_inst_cd'], row['dup_opp_cd']) + for emp_chg_inst_row in emp_chg_inst_records: + # 重複時相手先コードが存在したかのチェック + if emp_chg_inst_row['opp_count'] > 0: + break + + start_date = _str_to_date_time(emp_chg_inst_row['start_date']) + set_start_date = start_date \ + if start_date > tekiyo_month_first_day else tekiyo_month_first_day + + _insert_emp_chg_inst(db, row['dup_opp_cd'], _date_time_to_str(set_start_date), + emp_chg_inst_row) + + if start_date < tekiyo_month_first_day: + last_end_date = tekiyo_month_first_day - timedelta(days=1) + _update_emp_chg_inst_end_date(db, row['dcf_inst_cd'], _date_time_to_str(last_end_date), + emp_chg_inst_row) + if start_date <= last_end_date: + continue + _update_emp_chg_inst_enabled_flg(db, row['dcf_inst_cd'], emp_chg_inst_row['ta_cd'], + emp_chg_inst_row['start_date']) + + logger.info('従業員担当施設マスタの登録 終了') + + +def _delete_ult_ident_presc(db: Database, start_date: str, ult_ident_presc_row: CursorResult, + log_message: str): + # ult_ident_prescのDelete try: elapsed_time = ElapsedTime() sql = """ @@ -107,56 +138,24 @@ def _delete_ult_ident_presc(db: Database, start_date: str, ult_row: CursorResult ta_cd = :ta_cd AND ult_ident_cd = :ult_ident_cd AND ratio = :ratio - AND start_date = :set_start_date + AND start_date = :start_date """ params = { - 'ta_cd': ult_row['ta_cd'], - 'ult_ident_cd': ult_row['ult_ident_cd'], - 'ratio': ult_row['ratio'], + 'ta_cd': ult_ident_presc_row['ta_cd'], + 'ult_ident_cd': ult_ident_presc_row['ult_ident_cd'], + 'ratio': ult_ident_presc_row['ratio'], 'start_date': start_date } res = db.execute(sql, params) logging_sql(logger, sql) - logger.info('') + logger.info(f'{log_message} 成功, {res.rowcount} 行更新 ({elapsed_time.of})') except Exception as e: - logger.debug('') + logger.debug(f'{log_message} 失敗') raise e -def _add_emp_chg_inst(db: Database, valid_dst_inst_merge_records: list[dict]): - # - for row in valid_dst_inst_merge_records: - tekiyo_month_first_day = _get_first_day_of_month(row['tekiyo_month']) - emp_chg_inst_records = _select_emp_chg_inst(db, row['dcf_inst_cd'], row['dup_opp_cd']) - for emp_row in emp_chg_inst_records: - # 重複時相手先コードが存在したかのチェック - if emp_row['opp_count'] > 0: - break - - start_date = _str_to_date_time(emp_row['start_date']) - set_start_date = start_date \ - if start_date > tekiyo_month_first_day else tekiyo_month_first_day - - _insert_emp_chg_inst(db, row['dup_opp_cd'], _date_time_to_str(set_start_date), emp_row) - - if start_date < tekiyo_month_first_day: - last_end_date = tekiyo_month_first_day - timedelta(days=1) - _update_emp_chg_inst_end_date(db, row['dcf_inst_cd'], _date_time_to_str(last_end_date), emp_row) - if start_date <= last_end_date: - continue - _update_emp_chg_inst_enabled_flg(db, row['dcf_inst_cd'], emp_row['ta_cd'], emp_row['start_date']) - - # if start_date >= tekiyo_month_first_day: - # _update_emp_chg_inst_enabled_flg(db, row['dcf_inst_cd'], emp_row['ta_cd'], start_date) - # continue - # last_end_date = tekiyo_month_first_day - timedelta(days=1) - # _update_emp_chg_inst_end_date(db, row['dcf_inst_cd'], last_end_date, emp_row) - # if start_date > last_end_date: - # _update_emp_chg_inst_enabled_flg(db, row['dcf_inst_cd'], emp_row['ta_cd'], start_date) - - def _update_emp_chg_inst_enabled_flg(db: Database, dcf_inst_cd: str, ta_cd: str, start_date: str): - # + # emp_chg_instを更新 try: elapsed_time = ElapsedTime() sql = """ @@ -174,14 +173,15 @@ def _update_emp_chg_inst_enabled_flg(db: Database, dcf_inst_cd: str, ta_cd: str, params = {'dcf_inst_cd': dcf_inst_cd, 'ta_cd': ta_cd, 'start_date': start_date} res = db.execute(sql, params) logging_sql(logger, sql) - logger.info(f'従業員担当施設マスタの更新に成功, {res.rowcount} 行更新 ({elapsed_time.of})') + logger.info(f'従業員担当施設マスタのYorNフラグ更新に成功, {res.rowcount} 行更新 ({elapsed_time.of})') except Exception as e: - logger.debug('') + logger.debug('従業員担当施設マスタのYorNフラグ更新に失敗') raise e -def _update_emp_chg_inst_end_date(db: Database, dcf_inst_cd: str, last_end_date: str, emp_row: CursorResult): - # +def _update_emp_chg_inst_end_date(db: Database, dcf_inst_cd: str, last_end_date: str, + emp_chg_inst_row: CursorResult): + # emp_chg_instを更新 try: elapsed_time = ElapsedTime() sql = """ @@ -200,21 +200,22 @@ def _update_emp_chg_inst_end_date(db: Database, dcf_inst_cd: str, last_end_date: params = { 'end_date': last_end_date, 'dcf_inst_cd': dcf_inst_cd, - 'ta_cd': emp_row['ta_cd'], - 'emp_cd': emp_row['emp_cd'], - 'bu_cd': emp_row['bu_cd'], - 'start_date': emp_row['start_date'] + 'ta_cd': emp_chg_inst_row['ta_cd'], + 'emp_cd': emp_chg_inst_row['emp_cd'], + 'bu_cd': emp_chg_inst_row['bu_cd'], + 'start_date': emp_chg_inst_row['start_date'] } res = db.execute(sql, params) logging_sql(logger, sql) - logger.info(f'従業員担当施設マスタの更新に成功, {res.rowcount} 行更新 ({elapsed_time.of})') + logger.info(f'従業員担当施設マスタの適用終了日更新 成功, {res.rowcount} 行更新 ({elapsed_time.of})') except Exception as e: - logger.debug('') + logger.debug('従業員担当施設マスタの適用終了日更新 失敗') raise e -def _insert_emp_chg_inst(db: Database, dup_opp_cd: str, set_start_date: str, emp_row: CursorResult): - # +def _insert_emp_chg_inst(db: Database, dup_opp_cd: str, set_start_date: str, + emp_chg_inst_row: CursorResult): + # emp_chg_instにInsert try: elapsed_time = ElapsedTime() sql = """ @@ -250,23 +251,24 @@ def _insert_emp_chg_inst(db: Database, dup_opp_cd: str, set_start_date: str, emp """ params = { 'dup_opp_cd': dup_opp_cd, - 'ta_cd': emp_row['ta_cd'], - 'emp_cd': emp_row['emp_cd'], - 'bu_cd': emp_row['bu_cd'], + 'ta_cd': emp_chg_inst_row['ta_cd'], + 'emp_cd': emp_chg_inst_row['emp_cd'], + 'bu_cd': emp_chg_inst_row['bu_cd'], 'start_date': set_start_date, - 'end_date': emp_row['end_date'], - 'main_chg_flg': emp_row['main_chg_flg'] if emp_row['main_chg_flg'] is None else None + 'end_date': emp_chg_inst_row['end_date'], + 'main_chg_flg': None + if emp_chg_inst_row['main_chg_flg'] is None else emp_chg_inst_row['main_chg_flg'] } res = db.execute(sql, params) logging_sql(logger, sql) logger.info(f'従業員担当施設マスタの追加に成功, {res.rowcount} 行更新 ({elapsed_time.of})') except Exception as e: - logger.debug('') + logger.debug('従業員担当施設マスタの追加に失敗') raise e -def _select_dct_inst_merge(db: Database, muko_flg: int, is_null_dcf_inst_cd_new: bool): - # +def _select_dct_inst_merge(db: Database, muko_flg: int) -> list[dict]: + # dcf_inst_mergeからSelect try: sql = """ SELECT @@ -279,25 +281,26 @@ def _select_dct_inst_merge(db: Database, muko_flg: int, is_null_dcf_inst_cd_new: src05.hdke_tbl AS ht ON dim.tekiyo_month = DATE_FORMAT(ht.syor_date, '%Y%m') WHERE - dim.muko_flg =: muko_flg + dim.muko_flg = :muko_flg AND dim.enabled_flg = 'Y' - AND dim.dcf_inst_cd_new <= >: is_null_dcf_inst_cd_new - """ + AND dim.dcf_inst_cd_new IS {not_null}NULL + """.format( + not_null='' if muko_flg == 0 else 'NOT ' + ) params = { - 'muko_flg': muko_flg, - 'is_null_dcf_inst_cd_new': None + 'muko_flg': muko_flg } dst_inst_merge_records = db.execute_select(sql, params) logging_sql(logger, sql) - logger.info('') + logger.info('DCF施設統合マスタの取得に成功') except Exception as e: - logger.debug('') + logger.debug('DCF施設統合マスタの取得に失敗') raise e return dst_inst_merge_records -def _update_dcf_inst_merge(db: Database, muko_flg: int): +def _update_dcf_inst_merge(db: Database, muko_flg: int) -> int: # try: elapsed_time = ElapsedTime() @@ -319,7 +322,7 @@ def _update_dcf_inst_merge(db: Database, muko_flg: int): WHERE dim.muko_flg= :muko_flg AND dim.enabled_flg='Y' - AND dim.dcf_inst_cd_new IS {$dcfInstCdNew}NULL + AND dim.dcf_inst_cd_new IS {not_null}NULL ) AS bf_dim SET updim.dcf_inst_cd_new = {column}, @@ -329,24 +332,27 @@ def _update_dcf_inst_merge(db: Database, muko_flg: int): updim.dcf_inst_cd = base_dcf_inst_cd AND updim.dup_opp_cd = base_dup_opp_cd AND updim.tekiyo_month = base_tekiyo_month - AND updim.muko_flg =base_muko_flg - AND updim.enabled_flg =base_enabled_flg - """ + AND updim.muko_flg = base_muko_flg + AND updim.enabled_flg = base_enabled_flg + """.format( + not_null='' if muko_flg == 0 else 'NOT ', + column='base_dup_opp_cd' if muko_flg == 0 else 'NULL' + ) params = { 'muko_flg': muko_flg } - res = db.execute(sql.format( - column='base_dup_opp_cd' if muko_flg == 1 else 'NULL' - ), params) + res = db.execute(sql, params) logging_sql(logger, sql) logger.info(f'DCF施設統合マスタの更新に成功, {res.rowcount} 行更新 ({elapsed_time.of})') except Exception as e: - logger.debug('') + logger.debug('DCF施設統合マスタの更新に失敗') raise e + return res.rowcount + def _update_dcf_inst_cd_new(db: Database, dcf_inst_cd_new_after: str, dcf_inst_cd_new_before: str): - # + # dcf_inst_mergeをUpdate try: elapsed_time = ElapsedTime() sql = """ @@ -361,17 +367,20 @@ def _update_dcf_inst_cd_new(db: Database, dcf_inst_cd_new_after: str, dcf_inst_c AND enabled_flg = 'Y' AND muko_flg = 0 """ - params = {'dcf_inst_cd_new_after': dcf_inst_cd_new_after, 'dcf_inst_cd_new_before': dcf_inst_cd_new_before} + params = { + 'dcf_inst_cd_new_after': dcf_inst_cd_new_after, + 'dcf_inst_cd_new_before': dcf_inst_cd_new_before + } res = db.execute(sql, params) logging_sql(logger, sql) logger.info(f'移行先DCF施設コードの更新に成功, {res.rowcount} 行更新 ({elapsed_time.of})') except Exception as e: - logger.debug('') + logger.debug('移行先DCF施設コードの更新に失敗') raise e -def _update_ult_ident_presc_end_date(db: Database, last_end_date: str, ult_ident_presc_record: CursorResult): - # +def _update_ult_ident_presc_end_date(db: Database, last_end_date: str, ult_ident_presc_row: CursorResult): + # ult_ident_presc_endをUpdate try: elapsed_time = ElapsedTime() sql = """ @@ -388,21 +397,22 @@ def _update_ult_ident_presc_end_date(db: Database, last_end_date: str, ult_ident """ params = { 'end_date': last_end_date, - 'ta_cd': ult_ident_presc_record['ta_cd'], - 'ult_ident_cd': ult_ident_presc_record['ult_ident_cd'], - 'ratio': ult_ident_presc_record['ratio'], - 'start_date': ult_ident_presc_record['start_date'] + 'ta_cd': ult_ident_presc_row['ta_cd'], + 'ult_ident_cd': ult_ident_presc_row['ult_ident_cd'], + 'ratio': ult_ident_presc_row['ratio'], + 'start_date': ult_ident_presc_row['start_date'] } res = db.execute(sql, params) logging_sql(logger, sql) - logger.info(f'終了日 > 開始月のため適用終了日を更新, {res.rowcount} 行更新 ({elapsed_time.of})') + logger.info(f'終了日 > 開始月のため適用終了日を更新 成功, {res.rowcount} 行更新 ({elapsed_time.of})') except Exception as e: - logger.debug('') + logger.debug('終了日 > 開始月のため適用終了日を更新 失敗') raise e -def _insert_ult_ident_presc(db: Database, set_Start_Date: str, dup_opp_cd: str, ult_row: CursorResult): - # +def _insert_ult_ident_presc(db: Database, set_Start_Date: str, dup_opp_cd: str, + ult_ident_presc_row: CursorResult): + # ult_ident_prescにInsert try: elapsed_time = ElapsedTime() sql = """ @@ -419,7 +429,7 @@ def _insert_ult_ident_presc(db: Database, set_Start_Date: str, dup_opp_cd: str, update_date, updater ) - VALUES( + VALUES( :ta_cd, :ult_ident_cd, :ratio, @@ -433,23 +443,23 @@ def _insert_ult_ident_presc(db: Database, set_Start_Date: str, dup_opp_cd: str, ) """ params = { - 'ta_cd': ult_row['ta_cd'], - 'ult_ident_cd': ult_row['ult_ident_cd'], - 'ratio': ult_row['ratio'], + 'ta_cd': ult_ident_presc_row['ta_cd'], + 'ult_ident_cd': ult_ident_presc_row['ult_ident_cd'], + 'ratio': ult_ident_presc_row['ratio'], 'start_date': set_Start_Date, 'presc_cd': dup_opp_cd, - 'end_date': ult_row['end_date'] + 'end_date': ult_ident_presc_row['end_date'] } res = db.execute(sql, params) logging_sql(logger, sql) - logger.info(f'納入先処方元マスタに追加に成功, {res.rowcount} 行更新 ({elapsed_time.of})') + logger.info(f'納入先処方元マスタに追加 成功, {res.rowcount} 行更新 ({elapsed_time.of})') except Exception as e: - logger.debug('納入先処方元マスタに追加に失敗') + logger.debug('納入先処方元マスタに追加 失敗') raise e def _select_emp_chg_inst(db: Database, dcf_inst_cd: str, dup_opp_cd: str) -> list[dict]: - # + # emp_chg_instから取得 try: sql = """ SELECT @@ -461,7 +471,14 @@ def _select_emp_chg_inst(db: Database, dcf_inst_cd: str, dup_opp_cd: str) -> lis eci.end_date, eci.main_chg_flg, eci.enabled_flg, - (SELECT COUNT(eciopp.inst_cd) FROM src05.emp_chg_inst AS eciopp WHERE eciopp.inst_cd = :dup_opp_cd) AS opp_count + ( + SELECT + COUNT(eciopp.inst_cd) + FROM + src05.emp_chg_inst AS eciopp + WHERE + eciopp.inst_cd = :dup_opp_cd + ) AS opp_count FROM src05.emp_chg_inst AS eci WHERE @@ -472,15 +489,15 @@ def _select_emp_chg_inst(db: Database, dcf_inst_cd: str, dup_opp_cd: str) -> lis params = {'dcf_inst_cd': dcf_inst_cd, 'dup_opp_cd': dup_opp_cd} emp_chg_inst_records = db.execute_select(sql, params) logging_sql(logger, sql) - logger.info('') + logger.info('従業員担当施設マスタの取得 成功') except Exception as e: - logger.debug('') + logger.debug('従業員担当施設マスタの取得 失敗') raise e return emp_chg_inst_records def _select_ult_ident_presc(db: Database, dcf_inst_cd: str, dup_opp_cd: str) -> list[dict]: - # + # ult_ident_prescから取得 try: sql = """ SELECT @@ -489,25 +506,33 @@ def _select_ult_ident_presc(db: Database, dcf_inst_cd: str, dup_opp_cd: str) -> uip.ratio, uip.start_date, uip.end_date, - (SELECT COUNT(uipopp.ta_cd) FROM ult_ident_presc AS uipopp WHERE uipopp.presc_cd = :dup_opp_cd) AS opp_count + ( + SELECT + COUNT(uipopp.ta_cd) + FROM + ult_ident_presc AS uipopp + WHERE + uipopp.presc_cd = :dup_opp_cd + ) AS opp_count FROM src05.ult_ident_presc AS uip WHERE - uip.presc_cd = '{$dcfInstCd}' + uip.presc_cd = :dcf_inst_cd AND (SELECT ht.syor_date FROM src05.hdke_tbl AS ht) < uip.end_date """ params = {'dcf_inst_cd': dcf_inst_cd, 'dup_opp_cd': dup_opp_cd} ult_ident_presc_records = db.execute_select(sql, params) logging_sql(logger, sql) - logger.info('') + logger.info('納入先処方元マスタの取得 成功') except Exception as e: - logger.debug('') + logger.debug('納入先処方元マスタの取得 失敗') raise e return ult_ident_presc_records -def _count_duplicate_ult_ident_presc(db: Database, set_Start_Date: str, ult_row: CursorResult): - # +def _count_duplicate_ult_ident_presc(db: Database, set_start_date: str, + ult_ident_presc_row: CursorResult) -> int: + # ult_ident_prescの重複時相手先コードの件数取得 try: sql = """ SELECT @@ -518,30 +543,33 @@ def _count_duplicate_ult_ident_presc(db: Database, set_Start_Date: str, ult_row: ta_cd = :ta_cd AND ult_ident_cd = :ult_ident_cd AND ratio = :ratio - AND start_date = :set_Start_Date + AND start_date = :start_date """ params = { - 'ta_cd': ult_row['ta_cd'], - 'ult_ident_cd': ult_row['ult_ident_cd'], - 'ratio': ult_row['ratio'], - 'start_date': set_Start_Date + 'ta_cd': ult_ident_presc_row['ta_cd'], + 'ult_ident_cd': ult_ident_presc_row['ult_ident_cd'], + 'ratio': ult_ident_presc_row['ratio'], + 'start_date': set_start_date } result = db.execute_select(sql, params) logging_sql(logger, sql) - logger.info('') + logger.info('納入先処方元マスタの重複予定データの存在チェック 成功') except Exception as e: - logger.debug('') + logger.debug('納入先処方元マスタの重複予定データの存在チェック 失敗') raise e return result[0]['cnt'] -def _get_first_day_of_month(month_day: str): - return datetime.datetime.strptime(month_day, '%Y%m01') +def _get_first_day_of_month(year_month: str) -> datetime: + # year_monthの初日の日付を日付型に変換し返却する + return datetime.strptime(year_month + '01', '%Y%m%d') -def _str_to_date_time(str_date_time: str): - return datetime.datetime.strptime(str_date_time, '%Y%m%d') +def _str_to_date_time(str_date_time: str) -> datetime: + # str_date_timeを日付型に変換して返却する + return datetime.strptime(str_date_time, '%Y%m%d') -def _date_time_to_str(date_time: datetime): - return date_time.strptime('%Y%m%d') +def _date_time_to_str(date_time: datetime) -> str: + # date_timeをYmd型に変換して返却する + return date_time.strftime('%Y%m%d') From 3b369b8fc40b258792455aa647e4007f99708398 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Fri, 19 May 2023 16:48:11 +0900 Subject: [PATCH 03/13] =?UTF-8?q?feat:=20=E8=B5=B7=E5=8B=95=E3=81=97?= =?UTF-8?q?=E3=81=AA=E3=81=84=E4=B8=8D=E5=85=B7=E5=90=88=E3=81=AE=E5=AF=BE?= =?UTF-8?q?=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-batch-daily/src/jobctrl_daily.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/ecs/jskult-batch-daily/src/jobctrl_daily.py b/ecs/jskult-batch-daily/src/jobctrl_daily.py index 1a82f226..71fbea90 100644 --- a/ecs/jskult-batch-daily/src/jobctrl_daily.py +++ b/ecs/jskult-batch-daily/src/jobctrl_daily.py @@ -7,6 +7,7 @@ from src.batch.batch_functions import ( update_batch_processing_flag_in_processing) from src.batch.common.batch_context import BatchContext from src.batch.common.calendar_file import CalendarFile +from src.batch.dcf_inst_merge import Integrate_dcf_inst_merge from src.batch.laundering import create_dcf_inst_merge, mst_inst_laundering from src.batch.ultmarc import ultmarc_process from src.error.exceptions import BatchOperationException @@ -114,6 +115,14 @@ def exec(): logger.exception(f'DCF施設統合マスタ作成エラー(異常終了){e}') return constants.BATCH_EXIT_CODE_SUCCESS + try: + logger.info('DCF施設統合マスタ日次更新バッチ:起動') + Integrate_dcf_inst_merge.exec() + logger.info('DCF施設統合マスタ日次更新バッチ:終了') + except BatchOperationException as e: + logger.exception(f'DCF施設統合マスタ日次更新バッチエラー(異常終了){e}') + return constants.BATCH_EXIT_CODE_SUCCESS + # バッチ処理完了とし、処理日、バッチ処置中フラグ、dump取得状態区分を更新 logger.info('業務日付更新・バッチステータスリフレッシュ:起動') try: From 7da4be471c97a1eba6b3fe86e6342c8272ff9021 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Thu, 25 May 2023 15:30:51 +0900 Subject: [PATCH 04/13] =?UTF-8?q?feat:=20=E3=83=AC=E3=83=93=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E6=8C=87=E6=91=98=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...t_merge.py => integrate_dcf_inst_merge.py} | 87 ++++++++++--------- .../src/batch/laundering/sales_laundering.py | 3 + ecs/jskult-batch-daily/src/jobctrl_daily.py | 9 -- 3 files changed, 51 insertions(+), 48 deletions(-) rename ecs/jskult-batch-daily/src/batch/dcf_inst_merge/{Integrate_dcf_inst_merge.py => integrate_dcf_inst_merge.py} (83%) diff --git a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/Integrate_dcf_inst_merge.py b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py similarity index 83% rename from ecs/jskult-batch-daily/src/batch/dcf_inst_merge/Integrate_dcf_inst_merge.py rename to ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py index c37a3a30..ffb2ba06 100644 --- a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/Integrate_dcf_inst_merge.py +++ b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py @@ -1,5 +1,4 @@ from datetime import datetime, timedelta -from sqlalchemy import CursorResult from src.batch.batch_functions import logging_sql from src.batch.common.batch_context import BatchContext from src.db.database import Database @@ -8,7 +7,7 @@ from src.logging.get_logger import get_logger from src.time.elapsed_time import ElapsedTime batch_context = BatchContext.get_instance() -logger = get_logger('DCF施設統合マスタ日次更新バッチ') +logger = get_logger('DCF施設統合マスタ日次更新') def exec(): @@ -16,7 +15,7 @@ def exec(): try: db.connect() db.begin() - logger.debug('DCF施設統合マスタ日次更新バッチ処理開始') + logger.debug('DCF施設統合マスタ日次更新処理開始') # DCF施設統合マスタ移行先コードのセット(無効フラグが『0(有効)』) enabled_dst_inst_merge_records = _set_enabled_dct_inst_merge(db) # DCF施設統合マスタ移行先コードのセット(無効フラグが『1(無効)』) @@ -26,7 +25,7 @@ def exec(): _add_emp_chg_inst(db, enabled_dst_inst_merge_records) _add_ult_ident_presc(db, enabled_dst_inst_merge_records) db.commit() - logger.info('DCF施設統合マスタ日次更新バッチ処理終了') + logger.debug('DCF施設統合マスタ日次更新処理終了') except Exception as e: db.rollback() raise BatchOperationException(e) @@ -59,10 +58,11 @@ def _set_disabled_dct_inst_merge(db: Database): def _add_ult_ident_presc(db: Database, enabled_dst_inst_merge_records: list[dict]): # 納入先処方元マスタの追加 logger.info('納入先処方元マスタの登録 開始') - for data_inst_cnt, row in enumerate(enabled_dst_inst_merge_records, start=1): - tekiyo_month_first_day = _get_first_day_of_month(row['tekiyo_month']) + for data_inst_cnt, enabled_merge_record in enumerate(enabled_dst_inst_merge_records, start=1): + tekiyo_month_first_day = _get_first_day_of_month(enabled_merge_record['tekiyo_month']) - ult_ident_presc_records = _select_ult_ident_presc(db, row['dcf_inst_cd'], row['dup_opp_cd']) + ult_ident_presc_records = _select_ult_ident_presc(db, enabled_merge_record['dcf_inst_cd'], + enabled_merge_record['dup_opp_cd']) for data_cnt, ult_ident_presc_row in enumerate(ult_ident_presc_records, start=1): logger.info(f'{data_inst_cnt}件目の移行施設の{data_cnt}レコード目処理 開始') # 処方元コード=重複時相手先コードが発生した場合 @@ -80,13 +80,17 @@ def _add_ult_ident_presc(db: Database, enabled_dst_inst_merge_records: list[dict is_exists_duplicate_key = True else: logger.info('納入先処方元マスタの重複予定データなし') - _insert_ult_ident_presc(db, set_start_date, row['dup_opp_cd'], ult_ident_presc_row) + _insert_ult_ident_presc(db, set_start_date, enabled_merge_record['dup_opp_cd'], ult_ident_presc_row) + # 適用終了日 < 適用開始日の場合 if _str_to_date_time(ult_ident_presc_row['end_date']) < start_date: + # 対象レコードを物理削除する _delete_ult_ident_presc(db, ult_ident_presc_row['start_date'], ult_ident_presc_row, '開始月>適用開始日のため物理削除') continue + # 重複予定データが存在しない、且つ、適用終了日 ≧ 適用開始日の場合 if not is_exists_duplicate_key: + # 適用終了日を、DCF施設統合マスタの適用月度の前月末日で更新 last_end_date = tekiyo_month_first_day - timedelta(days=1) _update_ult_ident_presc_end_date(db, _date_time_to_str(last_end_date), ult_ident_presc_row) if start_date > last_end_date: @@ -99,9 +103,9 @@ def _add_ult_ident_presc(db: Database, enabled_dst_inst_merge_records: list[dict def _add_emp_chg_inst(db: Database, enabled_dst_inst_merge_records: list[dict]): # 従業員担当施設マスタの登録 logger.info('従業員担当施設マスタの登録 開始') - for row in enabled_dst_inst_merge_records: - tekiyo_month_first_day = _get_first_day_of_month(row['tekiyo_month']) - emp_chg_inst_records = _select_emp_chg_inst(db, row['dcf_inst_cd'], row['dup_opp_cd']) + for enabled_merge_record in enabled_dst_inst_merge_records: + tekiyo_month_first_day = _get_first_day_of_month(enabled_merge_record['tekiyo_month']) + emp_chg_inst_records = _select_emp_chg_inst(db, enabled_merge_record['dcf_inst_cd'], enabled_merge_record['dup_opp_cd']) for emp_chg_inst_row in emp_chg_inst_records: # 重複時相手先コードが存在したかのチェック if emp_chg_inst_row['opp_count'] > 0: @@ -111,22 +115,24 @@ def _add_emp_chg_inst(db: Database, enabled_dst_inst_merge_records: list[dict]): set_start_date = start_date \ if start_date > tekiyo_month_first_day else tekiyo_month_first_day - _insert_emp_chg_inst(db, row['dup_opp_cd'], _date_time_to_str(set_start_date), + _insert_emp_chg_inst(db, enabled_merge_record['dup_opp_cd'], _date_time_to_str(set_start_date), emp_chg_inst_row) + # 適用開始日 < DCF施設統合マスタの適用月度の1日の場合 if start_date < tekiyo_month_first_day: + # DCF施設統合マスタの適用月度の前月末日で、適用終了日を更新する last_end_date = tekiyo_month_first_day - timedelta(days=1) - _update_emp_chg_inst_end_date(db, row['dcf_inst_cd'], _date_time_to_str(last_end_date), + _update_emp_chg_inst_end_date(db, enabled_merge_record['dcf_inst_cd'], _date_time_to_str(last_end_date), emp_chg_inst_row) - if start_date <= last_end_date: - continue - _update_emp_chg_inst_enabled_flg(db, row['dcf_inst_cd'], emp_chg_inst_row['ta_cd'], - emp_chg_inst_row['start_date']) + continue + # 適用開始日 ≧ DCF施設統合マスタの適用月度の1日の場合、N(論理削除レコード)に設定する + _update_emp_chg_inst_disabled(db, enabled_merge_record['dcf_inst_cd'], emp_chg_inst_row['ta_cd'], + emp_chg_inst_row['start_date']) logger.info('従業員担当施設マスタの登録 終了') -def _delete_ult_ident_presc(db: Database, start_date: str, ult_ident_presc_row: CursorResult, +def _delete_ult_ident_presc(db: Database, start_date: str, ult_ident_presc_row: dict, log_message: str): # ult_ident_prescのDelete try: @@ -154,8 +160,8 @@ def _delete_ult_ident_presc(db: Database, start_date: str, ult_ident_presc_row: raise e -def _update_emp_chg_inst_enabled_flg(db: Database, dcf_inst_cd: str, ta_cd: str, start_date: str): - # emp_chg_instを更新 +def _update_emp_chg_inst_disabled(db: Database, dcf_inst_cd: str, ta_cd: str, start_date: str): + # emp_chg_instをUPDATE try: elapsed_time = ElapsedTime() sql = """ @@ -180,8 +186,8 @@ def _update_emp_chg_inst_enabled_flg(db: Database, dcf_inst_cd: str, ta_cd: str, def _update_emp_chg_inst_end_date(db: Database, dcf_inst_cd: str, last_end_date: str, - emp_chg_inst_row: CursorResult): - # emp_chg_instを更新 + emp_chg_inst_row: dict): + # emp_chg_instをUPDATE try: elapsed_time = ElapsedTime() sql = """ @@ -214,8 +220,8 @@ def _update_emp_chg_inst_end_date(db: Database, dcf_inst_cd: str, last_end_date: def _insert_emp_chg_inst(db: Database, dup_opp_cd: str, set_start_date: str, - emp_chg_inst_row: CursorResult): - # emp_chg_instにInsert + emp_chg_inst_row: dict): + # emp_chg_instにINSERT try: elapsed_time = ElapsedTime() sql = """ @@ -268,7 +274,8 @@ def _insert_emp_chg_inst(db: Database, dup_opp_cd: str, set_start_date: str, def _select_dct_inst_merge(db: Database, muko_flg: int) -> list[dict]: - # dcf_inst_mergeからSelect + # dcf_inst_mergeからSELECT + # muko_flgの値によって、SQLのWHERE条件を変更 try: sql = """ SELECT @@ -301,9 +308,11 @@ def _select_dct_inst_merge(db: Database, muko_flg: int) -> list[dict]: def _update_dcf_inst_merge(db: Database, muko_flg: int) -> int: - # - try: + # dcf_inst_mergeをUPDATE + # muko_flgの値によって、SQLのWHERE条件とSET句を変更 + try: elapsed_time = ElapsedTime() + log_message = '更新しました' if muko_flg == 0 else '無効データに戻しました' sql = """ UPDATE src05.dcf_inst_merge AS updim @@ -318,9 +327,9 @@ def _update_dcf_inst_merge(db: Database, muko_flg: int) -> int: src05.dcf_inst_merge AS dim INNER JOIN src05.hdke_tbl AS ht - ON dim.tekiyo_month=DATE_FORMAT(ht.syor_date, '%Y%m') + ON dim.tekiyo_month = DATE_FORMAT(ht.syor_date, '%Y%m') WHERE - dim.muko_flg= :muko_flg + dim.muko_flg = :muko_flg AND dim.enabled_flg='Y' AND dim.dcf_inst_cd_new IS {not_null}NULL ) AS bf_dim @@ -343,16 +352,16 @@ def _update_dcf_inst_merge(db: Database, muko_flg: int) -> int: } res = db.execute(sql, params) logging_sql(logger, sql) - logger.info(f'DCF施設統合マスタの更新に成功, {res.rowcount} 行更新 ({elapsed_time.of})') + logger.info(f'DCF施設統合マスタの有効データを{log_message} 成功, {res.rowcount} 行更新 ({elapsed_time.of})') except Exception as e: - logger.debug('DCF施設統合マスタの更新に失敗') + logger.debug(f'DCF施設統合マスタの{log_message} 失敗') raise e return res.rowcount def _update_dcf_inst_cd_new(db: Database, dcf_inst_cd_new_after: str, dcf_inst_cd_new_before: str): - # dcf_inst_mergeをUpdate + # dcf_inst_mergeをUPDATE try: elapsed_time = ElapsedTime() sql = """ @@ -379,8 +388,8 @@ def _update_dcf_inst_cd_new(db: Database, dcf_inst_cd_new_after: str, dcf_inst_c raise e -def _update_ult_ident_presc_end_date(db: Database, last_end_date: str, ult_ident_presc_row: CursorResult): - # ult_ident_presc_endをUpdate +def _update_ult_ident_presc_end_date(db: Database, last_end_date: str, ult_ident_presc_row: dict): + # ult_ident_presc_endをUPDATE try: elapsed_time = ElapsedTime() sql = """ @@ -411,8 +420,8 @@ def _update_ult_ident_presc_end_date(db: Database, last_end_date: str, ult_ident def _insert_ult_ident_presc(db: Database, set_Start_Date: str, dup_opp_cd: str, - ult_ident_presc_row: CursorResult): - # ult_ident_prescにInsert + ult_ident_presc_row: dict): + # ult_ident_prescにINSERT try: elapsed_time = ElapsedTime() sql = """ @@ -459,7 +468,7 @@ def _insert_ult_ident_presc(db: Database, set_Start_Date: str, dup_opp_cd: str, def _select_emp_chg_inst(db: Database, dcf_inst_cd: str, dup_opp_cd: str) -> list[dict]: - # emp_chg_instから取得 + # emp_chg_instからSELECT try: sql = """ SELECT @@ -497,7 +506,7 @@ def _select_emp_chg_inst(db: Database, dcf_inst_cd: str, dup_opp_cd: str) -> lis def _select_ult_ident_presc(db: Database, dcf_inst_cd: str, dup_opp_cd: str) -> list[dict]: - # ult_ident_prescから取得 + # ult_ident_prescからSELECT try: sql = """ SELECT @@ -531,7 +540,7 @@ def _select_ult_ident_presc(db: Database, dcf_inst_cd: str, dup_opp_cd: str) -> def _count_duplicate_ult_ident_presc(db: Database, set_start_date: str, - ult_ident_presc_row: CursorResult) -> int: + ult_ident_presc_row: dict) -> int: # ult_ident_prescの重複時相手先コードの件数取得 try: sql = """ diff --git a/ecs/jskult-batch-daily/src/batch/laundering/sales_laundering.py b/ecs/jskult-batch-daily/src/batch/laundering/sales_laundering.py index f6d682b4..019f8c29 100644 --- a/ecs/jskult-batch-daily/src/batch/laundering/sales_laundering.py +++ b/ecs/jskult-batch-daily/src/batch/laundering/sales_laundering.py @@ -1,5 +1,6 @@ from src.batch.common.batch_context import BatchContext from src.batch.laundering import create_inst_merge_for_laundering, emp_chg_inst_laundering, ult_ident_presc_laundering +from src.batch.dcf_inst_merge import integrate_dcf_inst_merge from src.logging.get_logger import get_logger batch_context = BatchContext.get_instance() @@ -16,6 +17,8 @@ def exec(): return # 洗替用マスタ作成 create_inst_merge_for_laundering.exec() + # DCF施設統合マスタ日次更新 + integrate_dcf_inst_merge.exec() # 施設担当者洗替 emp_chg_inst_laundering.exec() # 納入先処方元マスタ洗替 diff --git a/ecs/jskult-batch-daily/src/jobctrl_daily.py b/ecs/jskult-batch-daily/src/jobctrl_daily.py index 71fbea90..1a82f226 100644 --- a/ecs/jskult-batch-daily/src/jobctrl_daily.py +++ b/ecs/jskult-batch-daily/src/jobctrl_daily.py @@ -7,7 +7,6 @@ from src.batch.batch_functions import ( update_batch_processing_flag_in_processing) from src.batch.common.batch_context import BatchContext from src.batch.common.calendar_file import CalendarFile -from src.batch.dcf_inst_merge import Integrate_dcf_inst_merge from src.batch.laundering import create_dcf_inst_merge, mst_inst_laundering from src.batch.ultmarc import ultmarc_process from src.error.exceptions import BatchOperationException @@ -115,14 +114,6 @@ def exec(): logger.exception(f'DCF施設統合マスタ作成エラー(異常終了){e}') return constants.BATCH_EXIT_CODE_SUCCESS - try: - logger.info('DCF施設統合マスタ日次更新バッチ:起動') - Integrate_dcf_inst_merge.exec() - logger.info('DCF施設統合マスタ日次更新バッチ:終了') - except BatchOperationException as e: - logger.exception(f'DCF施設統合マスタ日次更新バッチエラー(異常終了){e}') - return constants.BATCH_EXIT_CODE_SUCCESS - # バッチ処理完了とし、処理日、バッチ処置中フラグ、dump取得状態区分を更新 logger.info('業務日付更新・バッチステータスリフレッシュ:起動') try: From 5d16bceec95f4bd064d18246f55fc32dd5736e54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Thu, 25 May 2023 16:22:05 +0900 Subject: [PATCH 05/13] =?UTF-8?q?feat:=20SQL=E4=BF=AE=E6=AD=A3=E3=80=81?= =?UTF-8?q?=E5=8D=98=E4=BD=93=E8=A9=A6=E9=A8=93=E6=9B=B8=E3=83=AC=E3=83=93?= =?UTF-8?q?=E3=83=A5=E3=83=BC=E6=99=82=E3=81=AE=E6=8C=87=E6=91=98=E3=81=AE?= =?UTF-8?q?=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../integrate_dcf_inst_merge.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py index ffb2ba06..6e9bf5e4 100644 --- a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py +++ b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py @@ -90,12 +90,15 @@ def _add_ult_ident_presc(db: Database, enabled_dst_inst_merge_records: list[dict continue # 重複予定データが存在しない、且つ、適用終了日 ≧ 適用開始日の場合 if not is_exists_duplicate_key: - # 適用終了日を、DCF施設統合マスタの適用月度の前月末日で更新 last_end_date = tekiyo_month_first_day - timedelta(days=1) - _update_ult_ident_presc_end_date(db, _date_time_to_str(last_end_date), ult_ident_presc_row) + # 適用開始日 > DCF施設統合マスタの適用月度の前月末日の場合 if start_date > last_end_date: + # 対象レコードを物理削除する _delete_ult_ident_presc(db, ult_ident_presc_row['start_date'], ult_ident_presc_row, '適用終了日更新後 開始日>終了日のため物理削除') + continue + # 適用終了日を、DCF施設統合マスタの適用月度の前月末日で更新 + _update_ult_ident_presc_end_date(db, _date_time_to_str(last_end_date), ult_ident_presc_row) logger.info('納入先処方元マスタの登録 終了') @@ -195,7 +198,7 @@ def _update_emp_chg_inst_end_date(db: Database, dcf_inst_cd: str, last_end_date: src05.emp_chg_inst SET end_date = :end_date, updater = CURRENT_USER(), - update_date= SYSDATE() + update_date = SYSDATE() WHERE inst_cd = :dcf_inst_cd AND ta_cd = :ta_cd @@ -310,9 +313,9 @@ def _select_dct_inst_merge(db: Database, muko_flg: int) -> list[dict]: def _update_dcf_inst_merge(db: Database, muko_flg: int) -> int: # dcf_inst_mergeをUPDATE # muko_flgの値によって、SQLのWHERE条件とSET句を変更 - try: + try: elapsed_time = ElapsedTime() - log_message = '更新しました' if muko_flg == 0 else '無効データに戻しました' + log_message = '更新しました' if muko_flg == 0 else '無効データに戻しました' sql = """ UPDATE src05.dcf_inst_merge AS updim @@ -330,7 +333,7 @@ def _update_dcf_inst_merge(db: Database, muko_flg: int) -> int: ON dim.tekiyo_month = DATE_FORMAT(ht.syor_date, '%Y%m') WHERE dim.muko_flg = :muko_flg - AND dim.enabled_flg='Y' + AND dim.enabled_flg ='Y' AND dim.dcf_inst_cd_new IS {not_null}NULL ) AS bf_dim SET @@ -397,7 +400,7 @@ def _update_ult_ident_presc_end_date(db: Database, last_end_date: str, ult_ident src05.ult_ident_presc SET end_date = :end_date, updater = CURRENT_USER(), - update_date= SYSDATE() + update_date = SYSDATE() WHERE ta_cd = :ta_cd AND ult_ident_cd = :ult_ident_cd @@ -519,7 +522,7 @@ def _select_ult_ident_presc(db: Database, dcf_inst_cd: str, dup_opp_cd: str) -> SELECT COUNT(uipopp.ta_cd) FROM - ult_ident_presc AS uipopp + src05.ult_ident_presc AS uipopp WHERE uipopp.presc_cd = :dup_opp_cd ) AS opp_count From 0f8fb0026f88accd75207484ad115213360a99c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Thu, 25 May 2023 18:16:09 +0900 Subject: [PATCH 06/13] =?UTF-8?q?feat:=20=E3=83=AC=E3=83=93=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E6=8C=87=E6=91=98=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py index 6e9bf5e4..182b7232 100644 --- a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py +++ b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py @@ -278,7 +278,8 @@ def _insert_emp_chg_inst(db: Database, dup_opp_cd: str, set_start_date: str, def _select_dct_inst_merge(db: Database, muko_flg: int) -> list[dict]: # dcf_inst_mergeからSELECT - # muko_flgの値によって、SQLのWHERE条件を変更 + # 無効フラグがOFFのときは、移行先DCF施設コードが設定されてないデータを抽出する。 + # ONのときは、移行先DCF施設コードが設定されているデータを抽出する。 try: sql = """ SELECT @@ -312,7 +313,10 @@ def _select_dct_inst_merge(db: Database, muko_flg: int) -> list[dict]: def _update_dcf_inst_merge(db: Database, muko_flg: int) -> int: # dcf_inst_mergeをUPDATE - # muko_flgの値によって、SQLのWHERE条件とSET句を変更 + # 無効フラグがOFFのときは、 + # 移行先DCF施設コードが設定されていないデータを抽出し、移行先DCF施設コードに重複時相手先コードを上書きする + # 無効フラグがONのときは、 + # 移行先DCF施設コードが設定されているデータを抽出し、移行先DCF施設コードにNULLを上書きする。 try: elapsed_time = ElapsedTime() log_message = '更新しました' if muko_flg == 0 else '無効データに戻しました' From f3e772e0f34b8f824a2283cdd3ba7926cd622d4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Tue, 30 May 2023 16:25:48 +0900 Subject: [PATCH 07/13] =?UTF-8?q?feat:=20=E5=8D=98=E4=BD=93=E8=A9=A6?= =?UTF-8?q?=E9=A8=93=E5=AE=9F=E6=96=BD=E4=B8=AD=E3=81=AB=E7=99=BA=E8=A6=8B?= =?UTF-8?q?=E3=81=95=E3=82=8C=E3=81=9F=E3=83=87=E3=83=83=E3=83=88=E3=82=B3?= =?UTF-8?q?=E3=83=BC=E3=83=89=E3=81=AE=E5=89=8A=E9=99=A4=E3=80=81=E3=81=BB?= =?UTF-8?q?=E3=81=8B=E3=80=81=E3=83=87=E3=83=BC=E3=82=BF=E3=81=AE=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E6=9D=A1=E4=BB=B6=E3=81=AE=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dcf_inst_merge/integrate_dcf_inst_merge.py | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py index 182b7232..20ac5fcc 100644 --- a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py +++ b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py @@ -91,12 +91,6 @@ def _add_ult_ident_presc(db: Database, enabled_dst_inst_merge_records: list[dict # 重複予定データが存在しない、且つ、適用終了日 ≧ 適用開始日の場合 if not is_exists_duplicate_key: last_end_date = tekiyo_month_first_day - timedelta(days=1) - # 適用開始日 > DCF施設統合マスタの適用月度の前月末日の場合 - if start_date > last_end_date: - # 対象レコードを物理削除する - _delete_ult_ident_presc(db, ult_ident_presc_row['start_date'], ult_ident_presc_row, - '適用終了日更新後 開始日>終了日のため物理削除') - continue # 適用終了日を、DCF施設統合マスタの適用月度の前月末日で更新 _update_ult_ident_presc_end_date(db, _date_time_to_str(last_end_date), ult_ident_presc_row) @@ -121,14 +115,15 @@ def _add_emp_chg_inst(db: Database, enabled_dst_inst_merge_records: list[dict]): _insert_emp_chg_inst(db, enabled_merge_record['dup_opp_cd'], _date_time_to_str(set_start_date), emp_chg_inst_row) - # 適用開始日 < DCF施設統合マスタの適用月度の1日の場合 - if start_date < tekiyo_month_first_day: + # 適用終了日 ≧ 適用開始日の場合 + if _str_to_date_time(emp_chg_inst_row['end_date']) >= start_date: # DCF施設統合マスタの適用月度の前月末日で、適用終了日を更新する last_end_date = tekiyo_month_first_day - timedelta(days=1) _update_emp_chg_inst_end_date(db, enabled_merge_record['dcf_inst_cd'], _date_time_to_str(last_end_date), emp_chg_inst_row) - continue - # 適用開始日 ≧ DCF施設統合マスタの適用月度の1日の場合、N(論理削除レコード)に設定する + if last_end_date >= start_date: + continue + # DCF施設統合マスタの適用月度の前月末日 < 適用開始日、または適用終了日 < 適用開始日の場合、N(論理削除レコード)に設定する _update_emp_chg_inst_disabled(db, enabled_merge_record['dcf_inst_cd'], emp_chg_inst_row['ta_cd'], emp_chg_inst_row['start_date']) From 9ae92789678fad933360267f7f675b50b5074348 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Thu, 1 Jun 2023 15:58:52 +0900 Subject: [PATCH 08/13] =?UTF-8?q?feat:=20=E3=83=AD=E3=82=B0=E5=87=BA?= =?UTF-8?q?=E5=8A=9B=E3=83=A1=E3=83=83=E3=82=BB=E3=83=BC=E3=82=B8=E3=82=92?= =?UTF-8?q?=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dcf_inst_merge/integrate_dcf_inst_merge.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py index 20ac5fcc..832cc20c 100644 --- a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py +++ b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py @@ -40,7 +40,7 @@ def _set_enabled_dct_inst_merge(db: Database) -> list[dict]: if _update_dcf_inst_merge(db, 0) > 0: # DCF施設統合マスタの過去分の洗い替え for row in enabled_dst_inst_merge_records: - _update_dcf_inst_cd_new(db, row['dup_opp_cd'], row['dcf_inst_cd']) + _update_dcf_inst_cd_new(db, row['dup_opp_cd'], row['dcf_inst_cd'], 0) return enabled_dst_inst_merge_records @@ -52,7 +52,7 @@ def _set_disabled_dct_inst_merge(db: Database): if _update_dcf_inst_merge(db, 1) > 0: # DCF施設統合マスタの過去分の洗い替え for row in disabled_dst_inst_merge_records: - _update_dcf_inst_cd_new(db, row['dcf_inst_cd'], row['dup_opp_cd']) + _update_dcf_inst_cd_new(db, row['dcf_inst_cd'], row['dup_opp_cd'], 1) def _add_ult_ident_presc(db: Database, enabled_dst_inst_merge_records: list[dict]): @@ -356,15 +356,16 @@ def _update_dcf_inst_merge(db: Database, muko_flg: int) -> int: logging_sql(logger, sql) logger.info(f'DCF施設統合マスタの有効データを{log_message} 成功, {res.rowcount} 行更新 ({elapsed_time.of})') except Exception as e: - logger.debug(f'DCF施設統合マスタの{log_message} 失敗') + logger.debug(f'DCF施設統合マスタの有効データを{log_message} 失敗') raise e return res.rowcount -def _update_dcf_inst_cd_new(db: Database, dcf_inst_cd_new_after: str, dcf_inst_cd_new_before: str): +def _update_dcf_inst_cd_new(db: Database, dcf_inst_cd_new_after: str, dcf_inst_cd_new_before: str, muko_flg: int): # dcf_inst_mergeをUPDATE try: + log_message = '' if muko_flg == 0 else '戻し' elapsed_time = ElapsedTime() sql = """ UPDATE @@ -384,9 +385,9 @@ def _update_dcf_inst_cd_new(db: Database, dcf_inst_cd_new_after: str, dcf_inst_c } res = db.execute(sql, params) logging_sql(logger, sql) - logger.info(f'移行先DCF施設コードの更新に成功, {res.rowcount} 行更新 ({elapsed_time.of})') + logger.info(f'移行先DCF施設コードの{log_message}更新に成功, {res.rowcount} 行更新 ({elapsed_time.of})') except Exception as e: - logger.debug('移行先DCF施設コードの更新に失敗') + logger.debug(f'移行先DCF施設コードの{log_message}更新に失敗') raise e From b9e4a73b941909476e503768647abc7fa57bd3d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Fri, 2 Jun 2023 09:51:16 +0900 Subject: [PATCH 09/13] =?UTF-8?q?feat:=20=E3=83=AD=E3=82=B0=E5=87=BA?= =?UTF-8?q?=E5=8A=9B=E9=83=A8=E5=88=86=E3=82=92=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py index 832cc20c..b4b6e4e7 100644 --- a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py +++ b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py @@ -40,7 +40,7 @@ def _set_enabled_dct_inst_merge(db: Database) -> list[dict]: if _update_dcf_inst_merge(db, 0) > 0: # DCF施設統合マスタの過去分の洗い替え for row in enabled_dst_inst_merge_records: - _update_dcf_inst_cd_new(db, row['dup_opp_cd'], row['dcf_inst_cd'], 0) + _update_dcf_inst_cd_new(db, row['dup_opp_cd'], row['dcf_inst_cd'], '') return enabled_dst_inst_merge_records @@ -52,7 +52,7 @@ def _set_disabled_dct_inst_merge(db: Database): if _update_dcf_inst_merge(db, 1) > 0: # DCF施設統合マスタの過去分の洗い替え for row in disabled_dst_inst_merge_records: - _update_dcf_inst_cd_new(db, row['dcf_inst_cd'], row['dup_opp_cd'], 1) + _update_dcf_inst_cd_new(db, row['dcf_inst_cd'], row['dup_opp_cd'], '戻し') def _add_ult_ident_presc(db: Database, enabled_dst_inst_merge_records: list[dict]): @@ -362,10 +362,9 @@ def _update_dcf_inst_merge(db: Database, muko_flg: int) -> int: return res.rowcount -def _update_dcf_inst_cd_new(db: Database, dcf_inst_cd_new_after: str, dcf_inst_cd_new_before: str, muko_flg: int): +def _update_dcf_inst_cd_new(db: Database, dcf_inst_cd_new_after: str, dcf_inst_cd_new_before: str, log_message: str): # dcf_inst_mergeをUPDATE try: - log_message = '' if muko_flg == 0 else '戻し' elapsed_time = ElapsedTime() sql = """ UPDATE From 607784bc50a8597647e145b74812d175f578460d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Tue, 6 Jun 2023 17:55:47 +0900 Subject: [PATCH 10/13] =?UTF-8?q?feat:=20=E5=BE=93=E6=A5=AD=E5=93=A1?= =?UTF-8?q?=E6=8B=85=E5=BD=93=E6=96=BD=E8=A8=AD=E3=83=9E=E3=82=B9=E3=82=BF?= =?UTF-8?q?=E5=87=A6=E7=90=86=E3=82=92=E7=8F=BE=E8=A1=8CMINE=E3=81=AE?= =?UTF-8?q?=E5=87=A6=E7=90=86=E3=81=AB=E3=83=AD=E3=83=BC=E3=83=AB=E3=83=90?= =?UTF-8?q?=E3=83=83=E3=82=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py index b4b6e4e7..e325d7a4 100644 --- a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py +++ b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py @@ -115,15 +115,14 @@ def _add_emp_chg_inst(db: Database, enabled_dst_inst_merge_records: list[dict]): _insert_emp_chg_inst(db, enabled_merge_record['dup_opp_cd'], _date_time_to_str(set_start_date), emp_chg_inst_row) - # 適用終了日 ≧ 適用開始日の場合 - if _str_to_date_time(emp_chg_inst_row['end_date']) >= start_date: + # 適用開始日 < DCF施設統合マスタの適用月度の1日の場合 + if start_date < tekiyo_month_first_day: # DCF施設統合マスタの適用月度の前月末日で、適用終了日を更新する last_end_date = tekiyo_month_first_day - timedelta(days=1) _update_emp_chg_inst_end_date(db, enabled_merge_record['dcf_inst_cd'], _date_time_to_str(last_end_date), emp_chg_inst_row) - if last_end_date >= start_date: - continue - # DCF施設統合マスタの適用月度の前月末日 < 適用開始日、または適用終了日 < 適用開始日の場合、N(論理削除レコード)に設定する + continue + # 適用開始日 ≧ DCF施設統合マスタの適用月度の1日の場合、N(論理削除レコード)に設定する _update_emp_chg_inst_disabled(db, enabled_merge_record['dcf_inst_cd'], emp_chg_inst_row['ta_cd'], emp_chg_inst_row['start_date']) From 0421aa8ccd44f1bb4463c7c08a2ae07cb181da24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Wed, 14 Jun 2023 11:56:44 +0900 Subject: [PATCH 11/13] =?UTF-8?q?feat:=20=E4=BB=95=E6=A7=98=E5=A4=89?= =?UTF-8?q?=E6=9B=B4=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../integrate_dcf_inst_merge.py | 170 ++++++++++++------ 1 file changed, 113 insertions(+), 57 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py index e325d7a4..2e4f9ca7 100644 --- a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py +++ b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py @@ -55,76 +55,128 @@ def _set_disabled_dct_inst_merge(db: Database): _update_dcf_inst_cd_new(db, row['dcf_inst_cd'], row['dup_opp_cd'], '戻し') +def _select_ult_ident_presc_ta_cd(db: Database, dcf_inst_cd: str) -> list[dict]: + # 納入先処方元マスタから、DCF施設コードに対応した領域コードの取得 + try: + sql = """ + SELECT + ta_cd + FROM + src05.ult_ident_presc + WHERE + presc_cd = :dcf_inst_cd + AND (SELECT ht.syor_date FROM src05.hdke_tbl AS ht) < end_date + """ + params = {'dcf_inst_cd': dcf_inst_cd} + ult_ident_presc_ta_cd_records = db.execute_select(sql, params) + logging_sql(logger, sql) + logger.info('納入先処方元マスタから領域コードの取得に成功') + except Exception as e: + logger.debug('納入先処方元マスタから領域コードの取得に失敗') + raise e + + return ult_ident_presc_ta_cd_records + + def _add_ult_ident_presc(db: Database, enabled_dst_inst_merge_records: list[dict]): # 納入先処方元マスタの追加 logger.info('納入先処方元マスタの登録 開始') for data_inst_cnt, enabled_merge_record in enumerate(enabled_dst_inst_merge_records, start=1): tekiyo_month_first_day = _get_first_day_of_month(enabled_merge_record['tekiyo_month']) + ult_ident_presc_ta_cd_records = _select_ult_ident_presc_ta_cd(db, enabled_merge_record['dcf_inst_cd']) + for ult_ident_presc_ta_cd_record in ult_ident_presc_ta_cd_records: + ult_ident_presc_records = _select_ult_ident_presc(db, enabled_merge_record['dcf_inst_cd'], + enabled_merge_record['dup_opp_cd'], + ult_ident_presc_ta_cd_record['ta_cd']) + for data_cnt, ult_ident_presc_row in enumerate(ult_ident_presc_records, start=1): + logger.info(f'{data_inst_cnt}件目の移行施設の{data_cnt}レコード目処理 開始') + # 処方元コード=重複時相手先コードが発生した場合 + if ult_ident_presc_row['opp_count'] > 0: + continue - ult_ident_presc_records = _select_ult_ident_presc(db, enabled_merge_record['dcf_inst_cd'], - enabled_merge_record['dup_opp_cd']) - for data_cnt, ult_ident_presc_row in enumerate(ult_ident_presc_records, start=1): - logger.info(f'{data_inst_cnt}件目の移行施設の{data_cnt}レコード目処理 開始') - # 処方元コード=重複時相手先コードが発生した場合 - if ult_ident_presc_row['opp_count'] > 0: - break + start_date = _str_to_date_time(ult_ident_presc_row['start_date']) + set_start_date = start_date \ + if start_date > tekiyo_month_first_day else tekiyo_month_first_day + set_start_date = _date_time_to_str(set_start_date) + is_exists_duplicate_key = False + if _count_duplicate_ult_ident_presc(db, set_start_date, ult_ident_presc_row) > 0: + _delete_ult_ident_presc(db, set_start_date, ult_ident_presc_row, + '納入先処方元マスタの重複予定データの削除') + is_exists_duplicate_key = True + else: + logger.info('納入先処方元マスタの重複予定データなし') + _insert_ult_ident_presc(db, set_start_date, enabled_merge_record['dup_opp_cd'], ult_ident_presc_row) - start_date = _str_to_date_time(ult_ident_presc_row['start_date']) - set_start_date = start_date \ - if start_date > tekiyo_month_first_day else tekiyo_month_first_day - set_start_date = _date_time_to_str(set_start_date) - is_exists_duplicate_key = False - if _count_duplicate_ult_ident_presc(db, set_start_date, ult_ident_presc_row) > 0: - _delete_ult_ident_presc(db, set_start_date, ult_ident_presc_row, - '納入先処方元マスタの重複予定データの削除') - is_exists_duplicate_key = True - else: - logger.info('納入先処方元マスタの重複予定データなし') - _insert_ult_ident_presc(db, set_start_date, enabled_merge_record['dup_opp_cd'], ult_ident_presc_row) - - # 適用終了日 < 適用開始日の場合 - if _str_to_date_time(ult_ident_presc_row['end_date']) < start_date: - # 対象レコードを物理削除する - _delete_ult_ident_presc(db, ult_ident_presc_row['start_date'], ult_ident_presc_row, - '開始月>適用開始日のため物理削除') - continue - # 重複予定データが存在しない、且つ、適用終了日 ≧ 適用開始日の場合 - if not is_exists_duplicate_key: - last_end_date = tekiyo_month_first_day - timedelta(days=1) - # 適用終了日を、DCF施設統合マスタの適用月度の前月末日で更新 - _update_ult_ident_presc_end_date(db, _date_time_to_str(last_end_date), ult_ident_presc_row) + # 適用終了日 < 適用開始日の場合 + if _str_to_date_time(ult_ident_presc_row['end_date']) < start_date: + # 対象レコードを物理削除する + _delete_ult_ident_presc(db, ult_ident_presc_row['start_date'], ult_ident_presc_row, + '開始月>適用開始日のため物理削除') + continue + # 重複予定データが存在しない、且つ、適用終了日 ≧ 適用開始日の場合 + if not is_exists_duplicate_key: + last_end_date = tekiyo_month_first_day - timedelta(days=1) + # 適用終了日を、DCF施設統合マスタの適用月度の前月末日で更新 + _update_ult_ident_presc_end_date(db, _date_time_to_str(last_end_date), ult_ident_presc_row) logger.info('納入先処方元マスタの登録 終了') +def _select_emp_chg_inst_ta_cd(db: Database, dcf_inst_cd: str) -> list[dict]: + # 従業員担当施設マスタから、DCF施設コードに対応した領域コードの取得 + try: + sql = """ + SELECT + ta_cd + FROM + src05.emp_chg_inst + WHERE + inst_cd = :dcf_inst_cd + AND enabled_flg = 'Y' + AND (SELECT ht.syor_date FROM src05.hdke_tbl AS ht) < end_date + """ + params = {'dcf_inst_cd': dcf_inst_cd} + emp_chg_inst_ta_cd_records = db.execute_select(sql, params) + logging_sql(logger, sql) + logger.info('従業員担当施設マスタから領域コードの取得に成功') + except Exception as e: + logger.debug('従業員担当施設マスタから領域コードの取得に失敗') + raise e + + return emp_chg_inst_ta_cd_records + + def _add_emp_chg_inst(db: Database, enabled_dst_inst_merge_records: list[dict]): # 従業員担当施設マスタの登録 logger.info('従業員担当施設マスタの登録 開始') for enabled_merge_record in enabled_dst_inst_merge_records: tekiyo_month_first_day = _get_first_day_of_month(enabled_merge_record['tekiyo_month']) - emp_chg_inst_records = _select_emp_chg_inst(db, enabled_merge_record['dcf_inst_cd'], enabled_merge_record['dup_opp_cd']) - for emp_chg_inst_row in emp_chg_inst_records: - # 重複時相手先コードが存在したかのチェック - if emp_chg_inst_row['opp_count'] > 0: - break + emp_chg_inst_ta_cd_records = _select_emp_chg_inst_ta_cd(db, enabled_merge_record['dcf_inst_cd']) + for emp_chg_inst_ta_cd_record in emp_chg_inst_ta_cd_records: + emp_chg_inst_records = _select_emp_chg_inst(db, enabled_merge_record['dcf_inst_cd'], enabled_merge_record['dup_opp_cd'], + emp_chg_inst_ta_cd_record['ta_cd']) + for emp_chg_inst_row in emp_chg_inst_records: + # 重複時相手先コードが存在したかのチェック + if emp_chg_inst_row['opp_count'] > 0: + continue - start_date = _str_to_date_time(emp_chg_inst_row['start_date']) - set_start_date = start_date \ - if start_date > tekiyo_month_first_day else tekiyo_month_first_day + start_date = _str_to_date_time(emp_chg_inst_row['start_date']) + set_start_date = start_date \ + if start_date > tekiyo_month_first_day else tekiyo_month_first_day - _insert_emp_chg_inst(db, enabled_merge_record['dup_opp_cd'], _date_time_to_str(set_start_date), - emp_chg_inst_row) + _insert_emp_chg_inst(db, enabled_merge_record['dup_opp_cd'], _date_time_to_str(set_start_date), + emp_chg_inst_row) - # 適用開始日 < DCF施設統合マスタの適用月度の1日の場合 - if start_date < tekiyo_month_first_day: - # DCF施設統合マスタの適用月度の前月末日で、適用終了日を更新する - last_end_date = tekiyo_month_first_day - timedelta(days=1) - _update_emp_chg_inst_end_date(db, enabled_merge_record['dcf_inst_cd'], _date_time_to_str(last_end_date), - emp_chg_inst_row) - continue - # 適用開始日 ≧ DCF施設統合マスタの適用月度の1日の場合、N(論理削除レコード)に設定する - _update_emp_chg_inst_disabled(db, enabled_merge_record['dcf_inst_cd'], emp_chg_inst_row['ta_cd'], - emp_chg_inst_row['start_date']) + # 適用開始日 < DCF施設統合マスタの適用月度の1日の場合 + if start_date < tekiyo_month_first_day: + # DCF施設統合マスタの適用月度の前月末日で、適用終了日を更新する + last_end_date = tekiyo_month_first_day - timedelta(days=1) + _update_emp_chg_inst_end_date(db, enabled_merge_record['dcf_inst_cd'], _date_time_to_str(last_end_date), + emp_chg_inst_row) + continue + # 適用開始日 ≧ DCF施設統合マスタの適用月度の1日の場合、N(論理削除レコード)に設定する + _update_emp_chg_inst_disabled(db, enabled_merge_record['dcf_inst_cd'], emp_chg_inst_row['ta_cd'], + emp_chg_inst_row['start_date']) logger.info('従業員担当施設マスタの登録 終了') @@ -468,7 +520,7 @@ def _insert_ult_ident_presc(db: Database, set_Start_Date: str, dup_opp_cd: str, raise e -def _select_emp_chg_inst(db: Database, dcf_inst_cd: str, dup_opp_cd: str) -> list[dict]: +def _select_emp_chg_inst(db: Database, dcf_inst_cd: str, dup_opp_cd: str, ta_cd: str) -> list[dict]: # emp_chg_instからSELECT try: sql = """ @@ -487,16 +539,18 @@ def _select_emp_chg_inst(db: Database, dcf_inst_cd: str, dup_opp_cd: str) -> lis FROM src05.emp_chg_inst AS eciopp WHERE - eciopp.inst_cd = :dup_opp_cd + eciopp.inst_cd = :dup_opp_cd + AND eciopp.ta_cd = :ta_cd ) AS opp_count FROM src05.emp_chg_inst AS eci WHERE eci.inst_cd = :dcf_inst_cd + AND eci.ta_cd = :ta_cd AND eci.enabled_flg = 'Y' AND (SELECT ht.syor_date FROM src05.hdke_tbl AS ht) < eci.end_date """ - params = {'dcf_inst_cd': dcf_inst_cd, 'dup_opp_cd': dup_opp_cd} + params = {'dcf_inst_cd': dcf_inst_cd, 'dup_opp_cd': dup_opp_cd, 'ta_cd': ta_cd} emp_chg_inst_records = db.execute_select(sql, params) logging_sql(logger, sql) logger.info('従業員担当施設マスタの取得 成功') @@ -506,7 +560,7 @@ def _select_emp_chg_inst(db: Database, dcf_inst_cd: str, dup_opp_cd: str) -> lis return emp_chg_inst_records -def _select_ult_ident_presc(db: Database, dcf_inst_cd: str, dup_opp_cd: str) -> list[dict]: +def _select_ult_ident_presc(db: Database, dcf_inst_cd: str, dup_opp_cd: str, ta_cd: str) -> list[dict]: # ult_ident_prescからSELECT try: sql = """ @@ -522,15 +576,17 @@ def _select_ult_ident_presc(db: Database, dcf_inst_cd: str, dup_opp_cd: str) -> FROM src05.ult_ident_presc AS uipopp WHERE - uipopp.presc_cd = :dup_opp_cd + uipopp.presc_cd = :dup_opp_cd + AND uipopp.ta_cd = :ta_cd ) AS opp_count FROM src05.ult_ident_presc AS uip WHERE uip.presc_cd = :dcf_inst_cd + AND uip.ta_cd = :ta_cd AND (SELECT ht.syor_date FROM src05.hdke_tbl AS ht) < uip.end_date """ - params = {'dcf_inst_cd': dcf_inst_cd, 'dup_opp_cd': dup_opp_cd} + params = {'dcf_inst_cd': dcf_inst_cd, 'dup_opp_cd': dup_opp_cd, 'ta_cd': ta_cd} ult_ident_presc_records = db.execute_select(sql, params) logging_sql(logger, sql) logger.info('納入先処方元マスタの取得 成功') From a808e03ea816766fec9008266b1ab47dc079c97d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Thu, 15 Jun 2023 15:55:16 +0900 Subject: [PATCH 12/13] =?UTF-8?q?feat:=20=E3=83=87=E3=83=83=E3=83=88?= =?UTF-8?q?=E3=83=AD=E3=82=B8=E3=83=83=E3=82=AF=E3=81=AE=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py index 2e4f9ca7..ab4d107a 100644 --- a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py +++ b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py @@ -107,14 +107,8 @@ def _add_ult_ident_presc(db: Database, enabled_dst_inst_merge_records: list[dict logger.info('納入先処方元マスタの重複予定データなし') _insert_ult_ident_presc(db, set_start_date, enabled_merge_record['dup_opp_cd'], ult_ident_presc_row) - # 適用終了日 < 適用開始日の場合 - if _str_to_date_time(ult_ident_presc_row['end_date']) < start_date: - # 対象レコードを物理削除する - _delete_ult_ident_presc(db, ult_ident_presc_row['start_date'], ult_ident_presc_row, - '開始月>適用開始日のため物理削除') - continue # 重複予定データが存在しない、且つ、適用終了日 ≧ 適用開始日の場合 - if not is_exists_duplicate_key: + if not is_exists_duplicate_key and _str_to_date_time(ult_ident_presc_row['end_date']) >= start_date: last_end_date = tekiyo_month_first_day - timedelta(days=1) # 適用終了日を、DCF施設統合マスタの適用月度の前月末日で更新 _update_ult_ident_presc_end_date(db, _date_time_to_str(last_end_date), ult_ident_presc_row) From 535ae8fa482d601da6d7e6154edecc2aeda37d65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=9C=A8=E8=A6=81?= Date: Fri, 30 Jun 2023 15:15:55 +0900 Subject: [PATCH 13/13] =?UTF-8?q?feat:=20=E4=BB=95=E6=A7=98=E5=A4=89?= =?UTF-8?q?=E6=9B=B4=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../integrate_dcf_inst_merge.py | 34 +++++++++++++------ 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py index ab4d107a..816a0545 100644 --- a/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py +++ b/ecs/jskult-batch-daily/src/batch/dcf_inst_merge/integrate_dcf_inst_merge.py @@ -55,12 +55,14 @@ def _set_disabled_dct_inst_merge(db: Database): _update_dcf_inst_cd_new(db, row['dcf_inst_cd'], row['dup_opp_cd'], '戻し') -def _select_ult_ident_presc_ta_cd(db: Database, dcf_inst_cd: str) -> list[dict]: - # 納入先処方元マスタから、DCF施設コードに対応した領域コードの取得 +def _select_ult_ident_presc_dcf_inst_cd(db: Database, dcf_inst_cd: str) -> list[dict]: + # 納入先処方元マスタから、DCF施設コードに対応したレコードの取得 try: sql = """ SELECT - ta_cd + ta_cd, + ult_ident_cd, + ratio FROM src05.ult_ident_presc WHERE @@ -70,9 +72,9 @@ def _select_ult_ident_presc_ta_cd(db: Database, dcf_inst_cd: str) -> list[dict]: params = {'dcf_inst_cd': dcf_inst_cd} ult_ident_presc_ta_cd_records = db.execute_select(sql, params) logging_sql(logger, sql) - logger.info('納入先処方元マスタから領域コードの取得に成功') + logger.info('納入先処方元マスタからDCF施設コードに対応したレコードの取得に成功') except Exception as e: - logger.debug('納入先処方元マスタから領域コードの取得に失敗') + logger.debug('納入先処方元マスタからDCF施設コードに対応したレコードの取得に失敗') raise e return ult_ident_presc_ta_cd_records @@ -83,11 +85,12 @@ def _add_ult_ident_presc(db: Database, enabled_dst_inst_merge_records: list[dict logger.info('納入先処方元マスタの登録 開始') for data_inst_cnt, enabled_merge_record in enumerate(enabled_dst_inst_merge_records, start=1): tekiyo_month_first_day = _get_first_day_of_month(enabled_merge_record['tekiyo_month']) - ult_ident_presc_ta_cd_records = _select_ult_ident_presc_ta_cd(db, enabled_merge_record['dcf_inst_cd']) - for ult_ident_presc_ta_cd_record in ult_ident_presc_ta_cd_records: - ult_ident_presc_records = _select_ult_ident_presc(db, enabled_merge_record['dcf_inst_cd'], + ult_ident_presc_source_records = _select_ult_ident_presc_dcf_inst_cd(db, enabled_merge_record['dcf_inst_cd']) + for ult_ident_presc_source_record in ult_ident_presc_source_records: + ult_ident_presc_records = _select_ult_ident_presc(db, + enabled_merge_record['dcf_inst_cd'], enabled_merge_record['dup_opp_cd'], - ult_ident_presc_ta_cd_record['ta_cd']) + ult_ident_presc_source_record) for data_cnt, ult_ident_presc_row in enumerate(ult_ident_presc_records, start=1): logger.info(f'{data_inst_cnt}件目の移行施設の{data_cnt}レコード目処理 開始') # 処方元コード=重複時相手先コードが発生した場合 @@ -554,7 +557,8 @@ def _select_emp_chg_inst(db: Database, dcf_inst_cd: str, dup_opp_cd: str, ta_cd: return emp_chg_inst_records -def _select_ult_ident_presc(db: Database, dcf_inst_cd: str, dup_opp_cd: str, ta_cd: str) -> list[dict]: +def _select_ult_ident_presc(db: Database, dcf_inst_cd: str, dup_opp_cd: str, + ult_ident_presc_row: dict) -> list[dict]: # ult_ident_prescからSELECT try: sql = """ @@ -572,6 +576,8 @@ def _select_ult_ident_presc(db: Database, dcf_inst_cd: str, dup_opp_cd: str, ta_ WHERE uipopp.presc_cd = :dup_opp_cd AND uipopp.ta_cd = :ta_cd + AND uipopp.ult_ident_cd = :ult_ident_cd + AND uipopp.ratio = :ratio ) AS opp_count FROM src05.ult_ident_presc AS uip @@ -580,7 +586,13 @@ def _select_ult_ident_presc(db: Database, dcf_inst_cd: str, dup_opp_cd: str, ta_ AND uip.ta_cd = :ta_cd AND (SELECT ht.syor_date FROM src05.hdke_tbl AS ht) < uip.end_date """ - params = {'dcf_inst_cd': dcf_inst_cd, 'dup_opp_cd': dup_opp_cd, 'ta_cd': ta_cd} + params = { + 'dcf_inst_cd': dcf_inst_cd, + 'dup_opp_cd': dup_opp_cd, + 'ta_cd': ult_ident_presc_row['ta_cd'], + 'ult_ident_cd': ult_ident_presc_row['ult_ident_cd'], + 'ratio': ult_ident_presc_row['ratio'] + } ult_ident_presc_records = db.execute_select(sql, params) logging_sql(logger, sql) logger.info('納入先処方元マスタの取得 成功')