diff --git a/ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sales_lot.py b/ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sales_lot.py index 55c5311b..298c77c9 100644 --- a/ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sales_lot.py +++ b/ecs/jskult-batch-daily/src/batch/bio_sales/create_bio_sales_lot.py @@ -1,7 +1,9 @@ +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 batch_context = BatchContext.get_instance() logger = get_logger('生物由来卸販売ロット分解') @@ -42,30 +44,361 @@ def exec(): def _delete_not_confirm_data_in_bio_sales_lot(db: Database): - # 生物由来ロット分解データの未確定データ削除 - pass + logger.debug('生物由来ロット分解データの未確定データ削除開始') + try: + elapsed_time = ElapsedTime() + sql = """\ + DELETE FROM src05.bio_sales_lot AS lot + INNER JOIN src05.bio_sales AS bio + ON bio.slip_mgt_num = lot.slip_mgt_num + AND bio.dwh_upd_dt = src05.get_syor_date() + """ + res = db.execute(sql) + logging_sql(logger, sql) + logger.info(f'Query OK, {res.rowcount} rows affected ({elapsed_time.of})') + except Exception as e: + logger.debug('生物由来ロット分解データの未確定データ削除に失敗') + raise e + logger.debug('生物由来ロット分解データの未確定データ削除に成功') def _insert_bio_sales_lot(db: Database): - # 生物由来ロット分解データを作成 - pass + logger.debug('生物由来ロット分解データの作成開始') + try: + elapsed_time = ElapsedTime() + sql = """\ + INSERT INTO src05.bio_sales_lot + SELECT + bio.slip_mgt_num AS slip_mgt_num, + conv.conv_cd AS conv_cd, + bio.rec_whs_cd AS rec_whs_cd, + bio.rec_whs_sub_cd AS rec_whs_sub_cd, + bio.rec_whs_org_cd AS rec_whs_org_cd, + bio.rec_comm_cd AS rec_comm_cd, + bio.rec_tran_kbn AS rec_tran_kbn, + bio.rev_hsdnymd_srk AS rev_hsdnymd_srk, + bio.rec_urag_num AS rec_urag_num, + bio.rec_comm_name AS rec_comm_name, + bio.rec_nonyu_fcl_name AS rec_nonyu_fcl_name, + bio.rec_nonyu_fcl_addr AS rec_nonyu_fcl_addr, + -- 3レコードに分解する + CASE conv.conv_cd + WHEN 1 THEN bio.rec_lot_num1 + WHEN 2 THEN bio.rec_lot_num2 + WHEN 3 THEN bio.rec_lot_num3 + END AS rec_lot_num, + bio.rec_ymd AS rec_ymd, + bio.v_tran_cd AS v_tran_cd, + bio.tran_kbn_name AS tran_kbn_name, + bio.whs_org_cd AS whs_org_cd, + bio.v_whsorg_cd AS v_whsorg_cd, + bio.whs_org_name AS whs_org_name, + bio.v_whs_cd AS v_whs_cd, + bio.whs_name AS whs_name, + bio.nonyu_fcl_cd AS nonyu_fcl_cd, + bio.v_inst_cd AS v_inst_cd, + bio.v_inst_kn AS v_inst_kn, + bio.v_inst_name AS v_inst_name, + bio.v_inst_addr AS v_inst_addr, + bio.comm_cd AS comm_cd, + bio.product_name AS product_name, + bio.whs_rep_comm_name AS whs_rep_comm_name, + bio.whs_rep_nonyu_fcl_name AS whs_rep_nonyu_fcl_name, + bio.whs_rep_nonyu_fcl_addr AS whs_rep_nonyu_fcl_addr, + /* 製品名と製品コードは後ほどV製品マスタからセットする */ + -- 製品名 + NULL AS mkr_inf_1, + -- 製品コード + NULL AS mkr_cd, + -- 数量 + -- Veeva取引区分の先頭が「2」の場合、マイナス表示にする + CASE conv.conv_cd + WHEN 1 THEN + CASE + WHEN (LEFT(bio.v_tran_cd, 1) = 2 AND bio.qty1 >= 1) THEN -bio.qty1 + ELSE bio.qty1 + END + WHEN 2 THEN + CASE + WHEN (LEFT(bio.v_tran_cd, 1) = 2 AND bio.qty2 >= 1) THEN -bio.qty2 + ELSE bio.qty2 + END + WHEN 3 THEN + CASE + WHEN (LEFT(bio.v_tran_cd, 1) = 2 AND bio.qty3 >= 1) THEN -bio.qty3 + ELSE bio.qty3 + END + END AS qty, + bio.slip_org_kbn AS slip_org_kbn, + bio.bef_slip_mgt_num AS bef_slip_mgt_num, + CASE conv.conv_cd + WHEN 1 THEN bio.err_flg11 + WHEN 2 THEN bio.err_flg12 + WHEN 3 THEN bio.err_flg13 + END AS lot_no_err_flg, + CASE bio.err_flg20 + WHEN 'M' THEN '*' + ELSE NULL + END AS iko_flg, + CASE bio.rec_sts_kbn + WHEN '0' THEN bio.rec_sts_kbn + /* 以下、抽出条件で弾かれているので取れない + WHEN '99' THEN bio.rec_sts_kbn + */ + WHEN '1' THEN + CASE conv.conv_cd + WHEN 1 THEN bio.err_flg11 + WHEN 2 THEN bio.err_flg12 + WHEN 3 THEN bio.err_flg13 + END + END AS rec_sts_kbn, + CASE bio.bef_slip_mgt_num + WHEN NULL THEN bio.ins_dt + ELSE NULL + END AS ins_dt, + CASE bio.bef_slip_mgt_num + WHEN NULL THEN bio.ins_usr + ELSE NULL + END AS ins_usr, + bio.dwh_upd_dt AS dwh_upd_dt, + /* 施設情報は後ほどセットする */ + -- 施設コード + NULL AS inst_cd, + -- 正式施設名(漢字) + NULL AS inst_name_form, + -- 施設住所 + NULL AS address, + -- 施設電話番号 + NULL AS tel_num, + CASE conv.conv_cd + WHEN 1 THEN + CASE bio.err_flg11 + WHEN '0' THEN '正常' + WHEN '1' THEN 'ロットエラー' + WHEN '2' THEN 'ロットエラー' + WHEN '3' THEN 'エラー(解消済み)' + WHEN '4' THEN 'ロット不明' + WHEN '5' THEN 'エラー(解消済み)' + WHEN '6' THEN 'ロット不明' + WHEN '8' THEN '除外' + WHEN '9' THEN '除外' + WHEN 'Z' THEN '除外' + END + WHEN 2 THEN + CASE bio.err_flg12 + WHEN '0' THEN '正常' + WHEN '1' THEN 'ロットエラー' + WHEN '2' THEN 'ロットエラー' + WHEN '3' THEN 'エラー(解消済み)' + WHEN '4' THEN 'ロット不明' + WHEN '5' THEN 'エラー(解消済み)' + WHEN '6' THEN 'ロット不明' + WHEN '8' THEN '除外' + WHEN '9' THEN '除外' + WHEN 'Z' THEN '除外' + END + WHEN 3 THEN + CASE bio.err_flg13 + WHEN '0' THEN '正常' + WHEN '1' THEN 'ロットエラー' + WHEN '2' THEN 'ロットエラー' + WHEN '3' THEN 'エラー(解消済み)' + WHEN '4' THEN 'ロット不明' + WHEN '5' THEN 'エラー(解消済み)' + WHEN '6' THEN 'ロット不明' + WHEN '8' THEN '除外' + WHEN '9' THEN '除外' + WHEN 'Z' THEN '除外' + END + END AS data_kbn, + CASE bio.slip_org_kbn + WHEN 'J' THEN 'JD-NET' + WHEN 'N' THEN 'NHI' + WHEN 'H' THEN '手入力' + END AS data_kind, + CASE conv.conv_cd + WHEN 1 THEN + CASE bio.err_flg11 + WHEN '0' THEN '正常' + WHEN '1' THEN 'ロットエラー' + WHEN '2' THEN '日付エラー' + WHEN '3' THEN 'ロットエラー(解消済)' + WHEN '4' THEN 'ロットエラー(調査不能)' + WHEN '5' THEN '日付エラー(解消済)' + WHEN '6' THEN '日付エラー(調査不能)' + WHEN '7' THEN '除外(卸都合)' + WHEN '8' THEN '除外(再送信)' + WHEN 'Z' THEN '過去データ' + END + WHEN 2 THEN + CASE bio.err_flg12 + WHEN '0' THEN '正常' + WHEN '1' THEN 'ロットエラー' + WHEN '2' THEN '日付エラー' + WHEN '3' THEN 'ロットエラー(解消済)' + WHEN '4' THEN 'ロットエラー(調査不能)' + WHEN '5' THEN '日付エラー(解消済)' + WHEN '6' THEN '日付エラー(調査不能)' + WHEN '7' THEN '除外(卸都合)' + WHEN '8' THEN '除外(再送信)' + WHEN 'Z' THEN '過去データ' + END + WHEN 3 THEN + CASE bio.err_flg13 + WHEN '0' THEN '正常' + WHEN '1' THEN 'ロットエラー' + WHEN '2' THEN '日付エラー' + WHEN '3' THEN 'ロットエラー(解消済)' + WHEN '4' THEN 'ロットエラー(調査不能)' + WHEN '5' THEN '日付エラー(解消済)' + WHEN '6' THEN '日付エラー(調査不能)' + WHEN '7' THEN '除外(卸都合)' + WHEN '8' THEN '除外(再送信)' + WHEN 'Z' THEN '過去データ' + END + END AS err_dtl_kind, + NULL AS expr_dt + FROM + src05.bio_sales bio + -- 生物由来変換マスタ + CROSS JOIN src05.bio_conv conv + WHERE + bio.err_flg1 = '0' + AND bio.err_flg2 = '0' + AND bio.err_flg3 = '0' + AND bio.err_flg4 = '0' + AND bio.err_flg5 = '0' + AND bio.err_flg6 = '0' + AND bio.err_flg7 = '0' + AND bio.err_flg8 = '0' + AND bio.err_flg9 = '0' + AND bio.err_flg10 = '0' + AND bio.rec_sts_kbn <> '99' + AND bio.dwh_upd_dt = src05.get_syor_date() + """ + res = db.execute(sql) + logging_sql(logger, sql) + logger.info(f'Query OK, {res.rowcount} rows affected ({elapsed_time.of})') + except Exception as e: + logger.debug('生物由来ロット分解データの作成に失敗') + raise e + logger.debug('生物由来ロット分解データの作成に成功') def _delete_empty_lot_record(db: Database): - # 生物由来ロット分解データの製造番号が空のレコードを削除 - pass + logger.debug('生物由来ロット分解データの製造番号が空のレコードを削除開始') + try: + elapsed_time = ElapsedTime() + sql = """\ + DELETE FROM src05.bio_sales_lot lot + WHERE + lot.rec_lot_num = REPEAT(' ', 15) OR lot.rec_lot_num IS NULL + """ + res = db.execute(sql) + logging_sql(logger, sql) + logger.info(f'Query OK, {res.rowcount} rows affected ({elapsed_time.of})') + except Exception as e: + logger.debug('生物由来ロット分解データの製造番号が空のレコードを削除に失敗') + raise e + logger.debug('生物由来ロット分解データの製造番号が空のレコードを削除に成功') def _set_inst_info_from_mdb_or_mst_inst(db: Database): - # MDB変換マスタビュー(生物由来ロット分解処理用)、メルク施設マスタから施設情報を生物由来ロット分解データにセット - pass + logger.debug('MDB変換マスタビュー(生物由来ロット分解処理用)、メルク施設マスタから施設情報を生物由来ロット分解データにセット開始') + try: + elapsed_time = ElapsedTime() + sql = """\ + UPDATE + src05.bio_sales_lot bio, + internal05.view_mdb_cnv_mst mdb, + src05.mst_inst inst + SET + -- 施設コード + bio.inst_cd = ( + CASE mdb.mdb_cd + WHEN NULL THEN mdb.mdb_cd + ELSE bio.v_inst_cd + END + ), + -- 正式施設名(漢字) + bio.inst_name_form = ( + CASE mdb.mdb_cd + WHEN NULL THEN mdb.inst_name_form + ELSE inst.inst_name_form + END + ) + -- 施設住所 + bio.address = ( + CASE mdb.mdb_cd + WHEN NULL THEN mdb.address + ELSE inst.address + END + ), + -- 施設電話番号 + bio.tel_num = ( + CASE mdb.mdb_cd + WHEN NULL THEN mdb.tel_num + ELSE inst.tel_num + END + ) + WHERE + bio.v_inst_cd = mdb.hco_vid_v + AND bio.v_inst_cd = inst.inst_cd + """ + res = db.execute(sql) + logging_sql(logger, sql) + logger.info(f'Query OK, {res.rowcount} rows affected ({elapsed_time.of})') + except Exception as e: + logger.debug('MDB変換マスタビュー(生物由来ロット分解処理用)、メルク施設マスタから施設情報を生物由来ロット分解データにセットに失敗') + raise e + logger.debug('MDB変換マスタビュー(生物由来ロット分解処理用)、メルク施設マスタから施設情報を生物由来ロット分解データにセットに成功') def _set_prd_info_from_v_prd_mst(db: Database): - # V製品マスタから製品情報を生物由来ロット分解データにセットする - pass + logger.debug('MDB変換マスタビュー(生物由来ロット分解処理用)、メルク施設マスタから施設情報を生物由来ロット分解データにセット開始') + try: + elapsed_time = ElapsedTime() + sql = """\ + UPDATE + src05.bio_sales_lot bio, + src05.phm_prd_mst_v prd + SET + bio.mkr_inf_1 = prd.mkr_inf_1, + bio.mkr_cd = prd.mkr_cd + WHERE + bio.comm_cd = prd.prd_cd + AND STR_TO_DATE(bio.rev_hsdnymd_srk,'%Y%m%d') BETWEEN prd.start_date AND prd.end_date + AND prd.rec_sts_kbn <> '9' + + """ + res = db.execute(sql) + logging_sql(logger, sql) + logger.info(f'Query OK, {res.rowcount} rows affected ({elapsed_time.of})') + except Exception as e: + logger.debug('MDB変換マスタビュー(生物由来ロット分解処理用)、メルク施設マスタから施設情報を生物由来ロット分解データにセットに失敗') + raise e + logger.debug('MDB変換マスタビュー(生物由来ロット分解処理用)、メルク施設マスタから施設情報を生物由来ロット分解データにセットに成功') def _set_expr_dt_from_lot_num_mst(db: Database): # 製造ロット管理番号マスタから有効期限をセット - pass + logger.debug('製造ロット管理番号マスタから有効期限をセット開始') + try: + elapsed_time = ElapsedTime() + sql = """\ + UPDATE + src05.bio_sales_lot bio, + src05.lot_num_mst lot + SET + bio.expr_dt = lot.expr_dt + WHERE + bio.mkr_cd = lot.ser_num + AND bio.rec_lot_num = lot.lot_num + """ + res = db.execute(sql) + logging_sql(logger, sql) + logger.info(f'Query OK, {res.rowcount} rows affected ({elapsed_time.of})') + except Exception as e: + logger.debug('製造ロット管理番号マスタから有効期限をセットに失敗') + raise e + logger.debug('製造ロット管理番号マスタから有効期限をセットに成功')