メルク施設マスタ作成 first commit

This commit is contained in:
mori.k 2025-05-30 10:09:16 +09:00
parent df3bee1be1
commit 6034009480

View File

@ -1,10 +1,326 @@
from src.batch.jskult_batch_entrypoint import JskultBatchEntrypoint
import csv
import json
import os.path as path
import tempfile
from src.aws.s3 import JskSendBucket, JskTransferListBucket
from src.batch.jskult_batch_entrypoint import JskultBatchEntrypoint
from src.db.database import Database
from src.error.exceptions import (BatchOperationException,
MaxRunCountReachedException)
from src.logging.get_logger import get_logger
from src.manager.jskult_batch_run_manager import JskultBatchRunManager
from src.manager.jskult_batch_status_manager import JskultBatchStatusManager
from src.manager.jskult_hdke_tbl_manager import JskultHdkeTblManager
from src.system_var import environment
logger = get_logger('メルク施設マスタ作成')
class MstInstAll(JskultBatchEntrypoint):
def __init__(self):
super().__init__()
def execute(self):
# TODO: ここでメルク施設マスタ作成処理を実行する
pass
logger.info("メルク施設マスタ作成処理を開始します。")
jskult_hdke_tbl_manager = JskultHdkeTblManager()
jskult_batch_run_manager = JskultBatchRunManager(
environment.BATCH_EXECUTION_ID)
if not jskult_hdke_tbl_manager.can_run_process():
logger.error(
'日次バッチ処理中またはdump取得が正常終了していないため、メルク施設マスタ作成処理を終了します。')
# バッチ実行管理テーブルをfailedで登録
jskult_batch_run_manager.batch_failed()
return
# 業務日付を取得
_, _, process_date = jskult_hdke_tbl_manager.get_batch_statuses()
# 転送ファイル一覧を取得し、転送件数を取得
try:
transfer_list_bucket = JskTransferListBucket()
transfer_list_file_path = transfer_list_bucket.download_transfer_result_file(
process_date)
except Exception as e:
logger.exception(f'転送ファイル一覧の取得に失敗しました。 {e}')
# バッチ実行管理テーブルをfailedで登録
jskult_batch_run_manager.batch_failed()
with open(transfer_list_file_path) as f:
transfer_list = json.load(f)
# 実消化データ + アルトマークデータの転送件数を合算し、受信ファイル件数とする
receive_file_count = len(
transfer_list['jsk_transfer_list']) + len(transfer_list['ult_transfer_list'])
jskult_batch_status_manager = JskultBatchStatusManager(
environment.PROCESS_NAME,
# TODO チケットNEWDWH2021-1847の実装で作成した定数に置き換え
'post_process',
environment.MAX_RUN_COUNT,
receive_file_count
)
try:
jskult_batch_status_manager.set_process_status("start")
try:
if not jskult_batch_status_manager.can_run_post_process():
# 後続処理の起動条件を満たしていない場合
# 処理ステータスを「処理待」に設定
jskult_batch_status_manager.set_process_status("waiting")
# バッチ実行管理テーブルに「retry」で登録
jskult_batch_run_manager.batch_retry()
return
except MaxRunCountReachedException:
logger.info('最大起動回数に到達したため、メルク施設マスタ作成処理を実行します。')
jskult_batch_status_manager.set_process_status("doing")
# アルトマーク取込が実行されていた場合にDCF施設削除新規マスタの作成処理を実行
if jskult_batch_status_manager.is_done_ultmarc_import():
self._db = Database.get_instance()
self._db.connect()
logger.debug('メルク施設マスタ作成処理開始')
# mst_instをTruncate
self._truncate_mst_inst(self._db)
# fcl_mst_vから、mst_instへInsert
self._insert_mst_inst_from_fcl_mst_v(self._db)
# com_instから、mst_instへInsert
self._insert_mst_inst_from_com_inst(self._db)
logger.debug('メルク施設マスタ作成処理終了')
except Exception as e:
raise BatchOperationException(e)
finally:
self._db.disconnect()
def _truncate_mst_inst(db: Database):
try:
db.execute("TRUNCATE TABLE src05.mst_inst")
except Exception as e:
logger.debug("メルク施設マスタの全件削除に失敗")
raise e
logger.debug("メルク施設マスタの全件削除に成功")
return
def _insert_mst_inst_from_fcl_mst_v(db: Database):
# fcl_mst_vから、mst_instへInsert
try:
sql = """
INSERT INTO
src05.mst_inst (
inst_cd,
inst_clas_cd,
inst_name_form,
inst_name,
pref_cd,
city_cd,
pref_name,
city_name,
address,
postal_cd,
tel_num,
delete_date,
v_inst_cd,
create_date,
update_date
)
SELECT
fmv1.v_inst_cd,
CASE
WHEN fmv1.fcl_type IN ('A1', 'A0') THEN '3'
WHEN fmv1.fcl_type BETWEEN '20' AND '29' THEN '2'
END AS inst_clas_cd,
fmv1.fcl_name,
fmv1.fcl_abb_name,
fmv1.prft_cd,
RIGHT(fmv1.admin_kbn, 3),
mp.prefc_name,
LEFT(mc.city_name, 40),
CASE
WHEN fmv1.fcl_type IN ('A1', 'A0') THEN LEFT(fmv1.fmt_addr, 200)
WHEN fmv1.fcl_type BETWEEN '20' AND '29' THEN CONCAT(fmv1.prft_name,fmv1.city_name,fmv1.addr_line_1)
END AS address,
fmv1.postal_cd,
fmv1.tel_num,
CASE
WHEN
fmv1.fcl_type BETWEEN '20' AND '29' THEN LEFT(fmv1.closed_dt, 10)
WHEN
fmv1.fcl_type IN ('A1', 'A0') AND fmv1.end_date != '9999-12-31' THEN DATE_FORMAT(fmv1.end_date, "%Y-%m-%d")
ELSE
null
END AS delete_date,
fmv1.v_inst_cd,
fmv1.ins_dt,
fmv1.upd_dt
FROM
src05.fcl_mst_v AS fmv1
INNER JOIN (
SELECT
v_inst_cd,
MAX(sub_num) AS sno
FROM
src05.fcl_mst_v
GROUP BY
v_inst_cd
) fmv2
ON fmv1.v_inst_cd = fmv2.v_inst_cd
AND fmv1.sub_num = fmv2.sno
LEFT OUTER JOIN src05.mst_prefc AS mp
ON fmv1.prft_cd = mp.prefc_cd
LEFT OUTER JOIN src05.mst_city AS mc
ON LEFT(fmv1.admin_kbn, 2) = mc.prefc_cd
AND RIGHT(fmv1.admin_kbn, 3) = mc.city_cd
WHERE
((fmv1.fcl_type IN ('A1', 'A0')) OR fmv1.fcl_type BETWEEN '20' AND '29')
AND fmv1.rec_sts_kbn != '9'
"""
res = db.execute(sql)
logger.info(f'V施設マスタからメルク施設マスタに登録成功')
except Exception as e:
logger.debug("V施設マスタからメルク施設マスタに登録失敗")
raise e
return
def _insert_mst_inst_from_com_inst(db: Database):
# オプティマイザのderived_mergeフラグをoffにする
try:
sql = """
SET SESSION optimizer_switch = 'derived_merge=off'
"""
db.execute(sql)
logger.debug("オプティマイザのderived_mergeフラグ = Off")
except Exception as e:
logger.debug("オプティマイザのderived_mergeフラグの値変更に失敗")
raise e
# com_instから、mst_instへInsert
try:
sql = """
INSERT INTO
src05.mst_inst (
inst_cd,
inst_clas_cd,
inst_name_form,
inst_name,
pref_cd,
city_cd,
pref_name,
city_name,
address,
postal_cd,
tel_num,
bed_num,
manage_cd,
manage_name,
delete_date,
inst_div_cd,
inst_div_name,
v_inst_cd,
creater,
create_date,
updater,
update_date
)
SELECT
ci.dcf_dsf_inst_cd,
'1',
ci.form_inst_name_kanji,
ci.inst_name_kanji,
ci.prefc_cd,
ci.city_cd,
mp.prefc_name,
LEFT(mc.city_name, 40),
ci.inst_addr,
ci.postal_number,
ci.inst_phone_number,
ci.bed_num,
ci.manage_cd,
LEFT(cm.manage_name, 40),
ci.abolish_ymd,
ci.inst_div_cd,
LEFT(cid.inst_div_name, 40),
mcmv.hco_vid_v,
ci.create_user,
ci.regist_date,
ci.update_user,
ci.update_date
FROM
src05.com_inst AS ci
LEFT OUTER JOIN src05.mst_prefc AS mp
ON ci.prefc_cd = mp.prefc_cd
LEFT OUTER JOIN src05.mst_city AS mc
ON ci.prefc_cd = mc.prefc_cd
AND ci.city_cd = mc.city_cd
LEFT OUTER JOIN src05.com_manage AS cm
ON ci.manage_cd = cm.manage_cd
LEFT OUTER JOIN src05.com_inst_div AS cid
ON ci.inst_div_cd = cid.inst_div_cd
LEFT OUTER JOIN ( -- MDBコード変換表を使用してV施設コードを取得するためのテーブル結合
SELECT
mcmv4.*
FROM (
SELECT
mcmv1.*
FROM
src05.mdb_cnv_mst_v AS mcmv1
INNER JOIN (
SELECT
mcmv2.hco_vid_v,
MAX(mcmv2.sub_num) AS sno -- MDBコード変換データの枝番MAX
FROM
src05.mdb_cnv_mst_v mcmv2
WHERE
mcmv2.rec_sts_kbn != '9' -- 状態区分9削除以外 and 適用開始日付テーブル.処理日
AND src05.get_syor_date() >= mcmv2.start_date
GROUP BY
mcmv2.hco_vid_v
) AS mcmv3
ON mcmv1.hco_vid_v = mcmv3.hco_vid_v
AND mcmv1.sub_num = mcmv3.sno
) AS mcmv4
INNER JOIN (
SELECT
MIN(mcmv8.hco_vid_v) AS hvv, -- 1つのMDBコードに対し複数のV施設コードが割り当てられている場合最小のV施設コードを選択する
mcmv8.mdb_cd
FROM (
SELECT
mcmv5.*
FROM
src05.mdb_cnv_mst_v AS mcmv5
INNER JOIN (
SELECT
mcmv6.hco_vid_v,
MAX(mcmv6.sub_num) AS sno -- MDBコード変換データの枝番MAX
FROM
src05.mdb_cnv_mst_v AS mcmv6
WHERE
mcmv6.rec_sts_kbn != '9' -- 状態区分9削除以外 and 適用開始日付テーブル.処理日
AND src05.get_syor_date() >= mcmv6.start_date
GROUP BY
mcmv6.hco_vid_v
) AS mcmv7
ON mcmv5.hco_vid_v = mcmv7.hco_vid_v
AND mcmv5.sub_num = mcmv7.sno
) AS mcmv8
GROUP BY
mcmv8.mdb_cd
) AS mcmv9
ON mcmv4.mdb_cd = mcmv9.mdb_cd
AND mcmv4.hco_vid_v = mcmv9.hvv
) AS mcmv
ON ci.dcf_dsf_inst_cd = mcmv.mdb_cd
"""
res = db.execute(sql)
logger.info(f'COM施設からメルク施設マスタに登録成功')
except Exception as e:
logger.debug("COM施設からメルク施設マスタに登録失敗")
raise e
return