Merge branch 'develop' into feature-NEWDWH2021-1011

This commit is contained in:
shimoda.m@nds-tyo.co.jp 2023-04-17 16:18:03 +09:00
commit f420bf341e
38 changed files with 728 additions and 334 deletions

View File

@ -3,4 +3,8 @@ DB_PORT=************
DB_USERNAME=************
DB_PASSWORD=************
DB_SCHEMA=src05
LOG_LEVEL=INFO
LOG_LEVEL=INFO
ULTMARC_DATA_BUCKET=****************
ULTMARC_DATA_FOLDER=recv
ULTMARC_BACKUP_BUCKET=****************
ULTMARC_BACKUP_FOLDER=ultmarc

View File

@ -5,7 +5,7 @@
"version": "0.2.0",
"configurations": [
{
"name": "Batch Sample",
"name": "(DEBUG)jskult batch daily",
"type": "python",
"request": "launch",
"program": "entrypoint.py",

View File

@ -23,7 +23,7 @@
"--ignore=F541"
],
"python.testing.pytestArgs": [
"tests"
"tests/batch/ultmarc"
],
"python.testing.unittestEnabled": false,

View File

@ -12,79 +12,207 @@
## 環境構築
- Pythonの構築
- Merck_NewDWH開発2021のWiki、[Python環境構築](https://nds-tyo.backlog.com/alias/wiki/1874930)を参照
- 「Pipenvの導入」までを行っておくこと
- 構築完了後、プロジェクト配下で以下のコマンドを実行し、Pythonの仮想環境を作成する
- `pipenv install --dev --python <pyenvでインストールしたpythonバージョン>`
- この手順で出力される仮想環境のパスは、後述するVSCodeの設定手順で使用するため、控えておく
- Python の構築
- MySQLの環境構築
- Windowsの場合、以下のリンクからダウンロードする
- Merck_NewDWH 開発 2021 の Wiki、[Python 環境構築](https://nds-tyo.backlog.com/alias/wiki/1874930)を参照
- 「Pipenv の導入」までを行っておくこと
- 構築完了後、プロジェクト配下で以下のコマンドを実行し、Python の仮想環境を作成する
- `pipenv install --dev --python <pyenvでインストールしたpythonバージョン>`
- この手順で出力される仮想環境のパスは、後述する VSCode の設定手順で使用するため、控えておく
- MySQL の環境構築
- Windows の場合、以下のリンクからダウンロードする
- <https://dev.mysql.com/downloads/installer/>
- Dockerを利用する場合、「newsdwh-tools」リポジトリのMySQL設定を使用すると便利
- Docker を利用する場合、「newsdwh-tools」リポジトリの MySQL 設定を使用すると便利
- 「crm-table-to-ddl」フォルダ内で以下のコマンドを実行すると
- `docker-compose up -d`
- Dockerの構築手順は、[Dockerのセットアップ手順](https://nds-tyo.backlog.com/alias/wiki/1754332)を参照のこと
- Docker の構築手順は、[Docker のセットアップ手順](https://nds-tyo.backlog.com/alias/wiki/1754332)を参照のこと
- データを投入する
- 立ち上げたデータベースに「src05」スキーマを作成する
- [ローカル開発用データ](https://ndstokyo.sharepoint.com/:f:/r/sites/merck-new-dwh-team/Shared%20Documents/03.NewDWH%E6%A7%8B%E7%AF%89%E3%83%95%E3%82%A7%E3%83%BC%E3%82%BA3/02.%E9%96%8B%E7%99%BA/90.%E9%96%8B%E7%99%BA%E5%85%B1%E6%9C%89/%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E9%96%8B%E7%99%BA%E7%94%A8%E3%83%87%E3%83%BC%E3%82%BF?csf=1&web=1&e=VVcRUs)をダウンロードし、mysqlコマンドを使用して復元する
- [ローカル開発用データ](https://ndstokyo.sharepoint.com/:f:/r/sites/merck-new-dwh-team/Shared%20Documents/03.NewDWH%E6%A7%8B%E7%AF%89%E3%83%95%E3%82%A7%E3%83%BC%E3%82%BA3/02.%E9%96%8B%E7%99%BA/90.%E9%96%8B%E7%99%BA%E5%85%B1%E6%9C%89/%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E9%96%8B%E7%99%BA%E7%94%A8%E3%83%87%E3%83%BC%E3%82%BF?csf=1&web=1&e=VVcRUs)をダウンロードし、mysql コマンドを使用して復元する
- `mysql -h <ホスト名> -P <ポート> -u <ユーザー名> -p src05 < src05_dump.sql`
- 環境変数の設定
- 「.env.example」ファイルをコピーし、「.env」ファイルを作成する
- 環境変数を設定する。設定内容はPRJメンバーより共有を受けてください
- VSCodeの設定
- 環境変数を設定する。設定内容は PRJ メンバーより共有を受けてください
- VSCode の設定
- 「.vscode/recommended_settings.json」ファイルをコピーし、「settings.json」ファイルを作成する
- 「python.defaultInterpreterPath」を、Pythonの構築手順で作成した仮想環境のパスに変更する
- 「python.defaultInterpreterPath」を、Python の構築手順で作成した仮想環境のパスに変更する
## 実行
- VSCode上で「F5」キーを押下すると、バッチ処理が起動する。
- VSCode 上で「F5」キーを押下すると、バッチ処理が起動する。
- 「entrypoint.py」が、バッチ処理のエントリーポイント。
- 実際の処理は、「src/jobctrl_daily.py」で行っている。
## 単体テスト
アルトマーク取込処理は、単体テストコードを使用してテスト自動化を行う
### テスト準備
- VSCodeで以下の拡張機能をインストールする
- Python
- Python Test Explorer for Visual Studio Code
- Test Explorer UI
- VSCode 上でショートカット「ctrl」+「shift」+「P」でコマンドパレットを開く
- コマンドパレットの検索窓に「Python」と入力し、「Python: テストを構成する」を押下する
- 現在のワークスペースを選び、「pytest」を選択する
- 「tests」フォルダを選択する
- バックグランドで、pytest モジュールのインストールが始まれば成功
### テスト用のサブコマンド一覧
- `pipenv run`のあとに、サブコマンドとしてユーザー定義スクリプトを実行できる
- `Pipfile`内の「scripts」セクションに宣言されている
| コマンド | 概要 |
| ---------------- | -------------------------------------------------------------------------------------------- |
| test:ultmarc | tests/batch/ultmarc フォルダ配下のユニットテストを実行する |
| test:ultmarc:cov | tests/batch/ultmarc フォルダ配下のユニットテストを実行し、テストカバレッジを取得する(C1, C2) |
### テスト共通関数の仕様
- tests/testing_utility.py内の共通関数の仕様について記載する
#### create_ultmarc_test_data_from_csv
- 引数
- file_path: str
- 戻り値
- src.batch.ultmarc.datfile.DatFileのインスタンス
- 処理概要
- CSVファイルから、アルトマークのインプットデータを作成する
- データフォーマットは以下
- 文字コード: UTF-8
- 改行コードLF
- ヘッダ: なし
- 値囲い: ダブルクォート
- アルトマークデータと文字コードを合わせるため、指定されたファイルを一時ディレクトリに、文字コード「cp932」で書き出してからテストデータとして読み込む
- テストデータそのものはUTF-8の文字コードで作成すること
### create_db_data_from_csv
- 引数
- file_path: str
- 戻り値
- テーブルのレコードに相当する辞書のリスト
- 処理概要
- CSVファイルから、アルトマークテーブルに相当するテストデータを作成する
- テストの初期データ、期待値データを作成するのに利用する
- データフォーマットは以下
- 文字コード: UTF-8
- 改行コードLF
- ヘッダ: なし
- 値囲い: ダブルクォート
- ファイル内の、以下の形式のデータを自動的に変換する
- `NULL`
- `None`に変換される
- `yyyy-mm-dd`もしくは、`yyyy/mm/dd`の文字
- Date型に変換される
- `yyyy-mm-dd hh:mm:ss`もしくは、`yyyy/mm/dd hh:mm:ss`の文字
- DateTime型に変換される
### create_insert_sql_with_parameter
- 引数
- table_name: str テーブル名
- column_names: list[str] カラム名のリスト
- test_data: list[str]: 値のリスト
- 戻り値
- INSERT文とバインドパラメータ辞書
- 処理概要
- 引数を使用して、`src.db.Database#execute`メソッドで実行可能な形でINSERT文、バインドパラメータを作成する
### create_delete_sql_with_parameter
- 引数
- table_name: str テーブル名
- column_names: list[str] カラム名のリスト
- test_data: list[str]: 値のリスト
- 戻り値
- DELETE文とバインドパラメータ辞書
- 処理概要
- 引数を使用して、`src.db.Database#execute`メソッドで実行可能な形でDELETE文、バインドパラメータを作成する
### create_ultmarc_table_mapper_sut
- 引数
- line: src.batch.ultmarc.datfile.DatFileLine アルトマークデータファイルの1行
- db: src.db.Database データベース操作クラス
- 戻り値
- マッパークラス
- 処理概要
- src.batch.ultmarc.utmp_tables.ultmarc_table_mapper_factory.UltmarcTableMapperFactoryを通じて、テスト対象のマッパークラスを生成して返す
### assert_table_results
- 引数
- actual_rows: list[dict] テスト結果の辞書リスト
- expect_rows: list[dict] 期待値の辞書リスト
- ignore_col_name: list 比較を無視するDBのカラム名. Default None.
- 戻り値
- なし
- 処理概要
- テスト結果データと期待値データを突き合わせ、期待値どおりとなっているかを確認する
- ignore_col_nameに指定したカラムは、呼び出し元のテストコード内で個別に突き合わせする
## フォルダ構成
```text
.
├── Pipfile -- Pythonモジュールの依存関係を管理するファイル
├── Dockerfile -- Dockerイメージを作成するためのファイル
├── Pipfile -- Pythonモジュールの依存関係を管理するファイル
├── Pipfile.lock -- Pythonモジュールの依存関係バージョン固定用ファイル
├── README.md -- 当ファイル
├── entrypoint.py -- バッチ処理のエントリーポイントになるpythonファイル
├── src -- ソースコードの保管場所
│ ├── aws -- AWS関連処理
│ │ └── s3.py -- S3クライアントとバケット処理
│ ├── batch -- バッチ処理関連ソース置き場
│ │ ├── batch_functions.py -- バッチ処理共通関数置き場
│ │ ├── datachange -- 実績洗替関連ソース置き場
│ │ │ └── emp_chg_inst_lau.py -- 施設担当者マスタ洗替
│ │ └── jissekiaraigae.py -- 実績洗替処理のエントリーポイント
│ │ └── ultmarc -- アルトマーク関連処理
│ │ ├── ultmarc_process.py -- アルトマーク関連処理のエントリーポイント
│ │ ├── datfile.py -- データファイル読込
│ │ └── utmp_tables -- アルトマークテーブルへの登録関連
│ │ ├── table_mapper -- テーブルへのデータマッピング処理
│ │ │ ├── concrete -- テーブルマッパーのマッピング処理を行う具象クラス(全テーブル分)
├── Pipfile -- Pythonモジュールの依存関係を管理するファイル
├── Dockerfile -- Dockerイメージを作成するためのファイル
├── Pipfile -- Pythonモジュールの依存関係を管理するファイル
├── Pipfile.lock -- Pythonモジュールの依存関係バージョン固定用ファイル
├── README.md -- 当ファイル
├── entrypoint.py -- バッチ処理のエントリーポイントになるpythonファイル
├── src -- ソースコードの保管場所
│ ├── aws -- AWS関連処理
│ │ └── s3.py -- S3クライアントとバケット処理
│ ├── batch -- バッチ処理関連ソース置き場
│ │ ├── batch_functions.py -- バッチ処理共通関数置き場
│ │ ├── datachange -- 実績洗替関連ソース置き場
│ │ │ └── emp_chg_inst_lau.py -- 施設担当者マスタ洗替
│ │ └── jissekiaraigae.py -- 実績洗替処理のエントリーポイント
│ │ └── ultmarc -- アルトマーク関連処理
│ │ ├── ultmarc_process.py -- アルトマーク関連処理のエントリーポイント
│ │ ├── datfile.py -- データファイル読込
│ │ └── utmp_tables -- アルトマークテーブルへの登録関連
│ │ ├── table_mapper -- テーブルへのデータマッピング処理
│ │ │ ├── concrete -- テーブルマッパーのマッピング処理を行う具象クラス(全テーブル分)
│ │ │ │ ├── com_alma_mapper.py
│ │ │ │ ├── ...
│ │ │ │ └── null_mapper.py -- テスト用、空振りするマッパークラス
│ │ │ └── ultmarc_table_mapper.py -- テーブルへの登録処理を行う抽象クラス
│ │ ├── tables -- アルトマークデータのDTOクラス(全テーブル分)
│ │ │ │ └── null_mapper.py -- テスト用、空振りするマッパークラス
│ │ │ └── ultmarc_table_mapper.py -- テーブルへの登録処理を行う抽象クラス
│ │ ├── tables -- アルトマークデータのDTOクラス(全テーブル分)
│ │ │ ├── com_alma.py
│ │ │ ├── ...
│ │ │ └── ultmarc_table.py -- アルトマークテーブルの抽象クラス
│ │ └── ultmarc_table_mapper_factory.py -- テーブルマッパー生成クラス
│ │ │ └── ultmarc_table.py -- アルトマークテーブルの抽象クラス
│ │ └── ultmarc_table_mapper_factory.py -- テーブルマッパー生成クラス
│ ├── db
│ │ └── database.py -- データベース操作共通処理
│ │ └── database.py -- データベース操作共通処理
│ ├── error
│ │ └── exceptions.py -- カスタム例外
│ ├── jobctrl_daily.py -- 日次バッチ処理のエントリーポイント。「entrypoint.py」 から呼ばれる。
│ │ └── exceptions.py -- カスタム例外
│ ├── jobctrl_daily.py -- 日次バッチ処理のエントリーポイント。「entrypoint.py」 から呼ばれる。
│ ├── logging
│ │ └── get_logger.py -- ログ出力の共通処理
│ │ └── get_logger.py -- ログ出力の共通処理
│ ├── system_var
│ │ └── environment.py -- 環境変数
│ │ └── environment.py -- 環境変数
│ └── time
│ └── elapsed_time.py -- 実行時間計測用
│ └── elapsed_time.py -- 実行時間計測用
└── tests -- ユニットテストのルートディレクト
├── batch
│ └── ultmarc -- アルトマーク関連のユニットテストを格納する
│ └── utmp_tables
│ └── table_mapper -- 以下、マッパークラス単位でフォルダを切る
│ └── com_alma
│ ├── test_com_alma_mapper.py -- テストコード本体
│ ├── com_alma_insert.csv -- S3に配置される想定のテストCSVデータ。ケースごとに用意する。
│ ...
│ ├── db_com_alma_before_update.csv -- テスト時に事前にDBに登録しておくデータ。CSVで用意する。
│ ...
│ ├── expect_com_alma_insert.csv -- テストの期待値データ。CSVで用意する。
│ ...
├── conftest.py -- テスト内で共通利用できるフィクスチャを宣言する(執筆時点ではDBのみ)
└── testing_utility.py -- テストの共通関数
```

View File

@ -3,6 +3,8 @@ import tempfile
import boto3
from src.system_var import environment
class S3Client:
__s3_client = boto3.client('s3')
@ -16,13 +18,12 @@ class S3Client:
# 末尾がスラッシュで終わるものはフォルダとみなしてスキップする
objects = [{'filename': content['Key'], 'size': content['Size']} for content in contents if not content['Key'].endswith('/')]
return objects
def copy(self, src_bucket: str, src_key: str, dest_bucket: str, dest_key: str) -> None:
copy_source = {'Bucket': src_bucket, 'Key': src_key}
self.__s3_client.copy(copy_source, dest_bucket, dest_key)
return
def download_file(self, bucket_name: str, file_key: str, file):
self.__s3_client.download_fileobj(
Bucket=bucket_name,
@ -31,50 +32,53 @@ class S3Client:
)
return
def upload_file(self, local_file_path: str, bucket_name: str, file_key: str):
self.__s3_client.upload_file(
local_file_path,
Bucket=bucket_name,
Key=file_key
)
local_file_path,
Bucket=bucket_name,
Key=file_key
)
def delete_file(self, bucket_name: str, file_key: str):
self.__s3_client.delete_object(
Bucket=bucket_name,
Key=file_key
)
class S3Bucket():
_s3_client = S3Client()
_bucket_name: str = None
def __str__(self) -> str:
return self._bucket_name
class UltmarcBucket(S3Bucket):
# TODO: 環境変数にする
_bucket_name = 'mbj-newdwh2021-staging-jskult-ultmarc'
_folder = 'recv'
_bucket_name = environment.ULTMARC_DATA_BUCKET
_folder = environment.ULTMARC_DATA_FOLDER
def list_edi_file(self):
def list_dat_file(self):
return self._s3_client.list_objects(self._bucket_name, self._folder)
def download_edi_file(self, edi_filename: str):
def download_dat_file(self, dat_filename: str):
# 一時ファイルとして保存する
temporary_dir = tempfile.mkdtemp()
temporary_file_path = path.join(temporary_dir, f'{edi_filename.replace("recv/", "")}')
temporary_file_path = path.join(temporary_dir, f'{dat_filename.replace(f"{self._folder}/", "")}')
with open(temporary_file_path, mode='wb') as f:
self._s3_client.download_file(self._bucket_name, edi_filename, f)
self._s3_client.download_file(self._bucket_name, dat_filename, f)
f.seek(0)
return temporary_file_path
def backup_edi_file(self, edi_file_key: str, datetime_key: str):
def backup_dat_file(self, dat_file_key: str, datetime_key: str):
ultmarc_backup_bucket = UltmarcBackupBucket()
backup_key = f'{ultmarc_backup_bucket._folder}/{datetime_key}/{edi_file_key.replace(f"{self._folder}/", "")}'
self._s3_client.copy(str(self), edi_file_key, str(ultmarc_backup_bucket), backup_key)
backup_key = f'{ultmarc_backup_bucket._folder}/{datetime_key}/{dat_file_key.replace(f"{self._folder}/", "")}'
self._s3_client.copy(self._bucket_name, dat_file_key, ultmarc_backup_bucket._bucket_name, backup_key)
def delete_dat_file(self, dat_file_key: str):
self._s3_client.delete_file(self._bucket_name, dat_file_key)
class JskUltBackupBucket(S3Bucket):
# TODO: 環境変数にする
_bucket_name = 'mbj-newdwh2021-staging-jskult-backup'
_bucket_name = environment.ULTMARC_BACKUP_BUCKET
class UltmarcBackupBucket(JskUltBackupBucket):
# TODO: 環境変数にする
_folder = 'ultmarc'
_folder = environment.ULTMARC_BACKUP_FOLDER

View File

@ -53,4 +53,4 @@ def logging_sql(logger, sql):
logger (logging.Logger): ロガー
sql (str): SQL文
"""
logger.debug(f'\n{"-"*15}\n{textwrap.dedent(sql)[1:-1]}\n{"-"*15}')
logger.debug(f'\n{"-"*15}\n{textwrap.dedent(sql)[1:-1]}\n{"-"*15}')

View File

@ -5,6 +5,6 @@ class BatchConfig:
@classmethod
def get_instance(cls):
if cls.__instance == None:
if cls.__instance is None:
cls.__instance = cls()
return cls.__instance

View File

@ -4,16 +4,16 @@ from io import TextIOWrapper
class DatFileLine:
layout_class: str
record_id: str
records: list[str]
def __init__(self, dat_line: list[str]) -> None:
self.layout_class = dat_line[0]
self.record_id = dat_line[1]
self.records = dat_line
class DatFile:
"""アルトマークデータファイル"""
lines: list[DatFileLine]
success_count: int = 0
error_count: int = 0
@ -45,6 +45,14 @@ class DatFile:
@classmethod
def from_path(cls, local_file_path: str):
"""アルトマークデータファイルを読み込み、新しいインスタンスを作成する
Args:
local_file_path (str): ローカルのファイルパス
Returns:
DatFile: このクラスのインスタンス
"""
# cp932(Shift-JIS Windows拡張)でファイルを読み込む
file = open(local_file_path, encoding='cp932')
instance = cls(file)

View File

@ -1,89 +1,99 @@
"""アルトマークデータ保管"""
from datetime import datetime
from src.aws.s3 import UltmarcBucket
from src.batch.common.batch_config import BatchConfig
from src.batch.ultmarc.datfile import DatFile
from src.batch.ultmarc.utmp_tables.ultmarc_table_mapper_factory import \
UltmarcTableMapperFactory
from src.db.database import Database
from src.error.exceptions import DBException
from src.logging.get_logger import get_logger
logger = get_logger('アルトマークデータ保管')
ultmarc_bucket = UltmarcBucket()
batch_config = BatchConfig.get_instance()
def batch_process():
def exec_import():
"""アルトマーク取り込み処理"""
try:
logger.info('datInsert START')
# DBセットアップ
db = Database.get_instance()
db.connect()
# ファイル単位でトランザクションを行う
db.begin()
logger.info('Transaction BEGIN')
logger.info('アルトマーク取込処理: 開始')
# datファイルをS3から取得する
dat_file_list = ultmarc_bucket.list_edi_file()
dat_file_list = ultmarc_bucket.list_dat_file()
# ファイルがない場合は処理せず、正常終了とする
if len(dat_file_list) == 0:
logger.info('ファイルがないため、処理をスキップします')
logger.info('ファイルがないため、アルトマーク取込処理をスキップします')
return
# ファイルが複数ある場合はエラーとする
if len(dat_file_list) > 1:
logger.error('複数の取込ファイルがあるため、異常終了')
logger.error(f'複数の取込ファイルがあるため、異常終了 ファイル一覧:{dat_file_list}')
return
# ファイルの件数は必ず1件になる
dat_file_info = dat_file_list[0]
# 0Byteの場合、
if dat_file_info['size'] == 0:
logger.info('0Byteファイルのため、処理をスキップします')
logger.info(f'0Byteファイルのため、処理をスキップします。ファイル名={dat_file_info["filename"]}')
return
dat_file_name = dat_file_info['filename']
logger.info(f"Get File Name :{dat_file_name}")
now = datetime.now().strftime('%Y/%m/%d')
logger.info(f"{dat_file_name}を取り込みます")
# ファイルをバックアップ
# 現行は、jobctrl_dailyの先頭でやっている
ultmarc_bucket.backup_edi_file(dat_file_name, now)
ultmarc_bucket.backup_dat_file(dat_file_name, batch_config.syor_date)
# datファイルをダウンロード
local_file_path = ultmarc_bucket.download_edi_file(dat_file_name)
mapper_factory = UltmarcTableMapperFactory()
local_file_path = ultmarc_bucket.download_dat_file(dat_file_name)
dat_file = DatFile.from_path(local_file_path)
# datファイルを1行ずつ処理し、各テーブルへ登録
for log_count, line in enumerate(dat_file):
try:
# 書き込み先のテーブルを特定
mapper_class = mapper_factory.create(
line.layout_class,
line.record_id,
line.records,
db
)
mapper_class.make_query()
mapper_class.execute_queries()
dat_file.count_up_success()
# 5000件ごとにログ記録
# これいる??
if log_count % 5000 == 0:
logger.info(f'Count: {log_count}')
except DBException as e:
logger.warning(e)
record = line.records
log_message = ','.join([f'"{r}"' for r in record])
logger.warning(log_message)
dat_file.count_up_error()
# すべての行を登録終えたらコミットする
db.commit()
logger.info('Transaction COMMIT')
logger.info(f'datInsert RESULT')
logger.info(f'SUCCESS_COUNT={dat_file.success_count}')
logger.info(f'ERROR_COUNT={dat_file.error_count}')
logger.info(f'ALL_COUNT={dat_file.total_count}')
# アルトマーク取り込み実行
_import_to_ultmarc_table(dat_file)
# 処理後、ファイルをS3から削除する
logger.info(f'取り込み処理が完了したため、datファイルを削除。ファイル名={dat_file_name}')
ultmarc_bucket.delete_dat_file(dat_file_name)
except Exception as e:
logger.exception(e)
raise e
finally:
db.disconnect()
logger.info('終了')
logger.info('アルトマーク取込処理: 終了')
def _import_to_ultmarc_table(dat_file: DatFile):
db = Database.get_instance()
# DB接続
db.connect()
# ファイル単位でトランザクションを行う
db.begin()
logger.info('Transaction BEGIN')
mapper_factory = UltmarcTableMapperFactory()
# datファイルを1行ずつ処理し、各テーブルへ登録
for line in dat_file:
try:
# 書き込み先のテーブルを特定
mapper_class = mapper_factory.create(
line.layout_class,
line.records,
db
)
mapper_class.make_query()
mapper_class.execute_queries()
dat_file.count_up_success()
except Exception as e:
logger.warning(e)
record = line.records
log_message = ','.join([f'"{r}"' for r in record])
logger.warning(f'ERROR_LINE: {log_message}')
dat_file.count_up_error()
# すべての行を登録終えたらコミットする
db.commit()
db.disconnect()
# 処理結果をログに出力する
logger.info('Transaction COMMIT')
logger.info(f'ultmarc import process RESULT')
logger.info(f'SUCCESS_COUNT={dat_file.success_count}')
logger.info(f'ERROR_COUNT={dat_file.error_count}')
logger.info(f'ALL_COUNT={dat_file.total_count}')
# 1件でもエラーがあれば、通知用にログに出力する
if dat_file.error_count > 0:
logger.warning('取り込みに失敗した行があります。詳細は`ERROR_LINE:`の行を確認してください。')
return

View File

@ -206,7 +206,7 @@ class ComDrWrkplaceMapper(UltmarcTableMapper):
if self.record.notdm_flg != '':
notdm_flg = None if self.record.notdm_flg == '@' else self.record.notdm_flg
self.query_parameter['notdm_flg'] = notdm_flg
set_clause_without_historical.append(f'notdm_flg = {"NULL" if notdm_flg is None else ":notdm_flg"}')
set_clause_without_historical.append(f'notdm_flg = :notdm_flg')
# 何かしら更新がある場合、履歴作成クエリを作成
if len(set_clauses_with_historical) != 0:
make_history_query = self.TO_HISTORY_QUERY
@ -242,12 +242,12 @@ class ComDrWrkplaceMapper(UltmarcTableMapper):
# 所属部科(カナ)
sectname_kana = None if self.record.sectname_kana == '@' else self.record.sectname_kana
self.query_parameter['sectname_kana'] = sectname_kana
set_clauses.append(f'blng_sec_name_kana = {"NULL" if sectname_kana is None else ":sectname_kana"}')
set_clauses.append(f'blng_sec_name_kana = :sectname_kana')
# 所属部科(漢字)
# 全角文字なので、修正項目として全角@が連携されるパターンがある
sectname = None if self.record.sectname == '' else self.record.sectname
self.query_parameter['sectname'] = sectname
set_clauses.append(f'blng_sec_name = {"NULL" if sectname is None else ":sectname"}')
set_clauses.append(f'blng_sec_name = :sectname')
# 何かしら更新がある場合、適用開始日をセットする
if len(set_clauses) != 0:

View File

@ -10,6 +10,8 @@ batch_config = BatchConfig.get_instance()
class UltmarcTableMapper(metaclass=ABCMeta):
"""アルトマークテーブルへの登録処理の抽象クラス"""
record: UltmarcTable
db: Database
queries: list[str]

View File

@ -1,8 +1,9 @@
class UltmarcTable:
"""アルトマーク関連テーブルの抽象クラス"""
record: list
def __init__(self, record: list):
self.record = record
def to_sql_parameter(self):
return vars(self)

View File

@ -9,33 +9,32 @@ from src.db.database import Database
COM_TABLE_LIST = {
# レコードID固定
# COM_医師学会
"521": {"01": null_mapper.NullMapper},
# TODO: 入れ子にしない
"521": null_mapper.NullMapper,
# COM_施設属性
"111": {"00": null_mapper.NullMapper},
"111": null_mapper.NullMapper,
# COM_臨床研修病院
"112": {"00": null_mapper.NullMapper},
"112": null_mapper.NullMapper,
# COM_医師
"501": {"01": null_mapper.NullMapper},
"501": null_mapper.NullMapper,
# COM_施設
"101": {"00": com_inst_mapper.ComInstMapper},
"101": com_inst_mapper.ComInstMapper,
# COM_薬局
"102": com_pharm_mapper.ComPharmMapper,
# COM_医師勤務先
"502": {"01": com_dr_wrkplace_mapper.ComDrWrkplaceMapper},
"502": com_dr_wrkplace_mapper.ComDrWrkplaceMapper,
# COM_専門分野
"511": {"01": null_mapper.NullMapper},
"511": null_mapper.NullMapper,
# COM_都道府県医療機能情報(基本)
"132": {"00": null_mapper.NullMapper},
"132": null_mapper.NullMapper,
# COM_都道府県医療機能情報(施設設備)
"133": {"00": null_mapper.NullMapper},
"133": null_mapper.NullMapper,
# COM_都道府県医療機能情報(疾患治療)
"134": {"00": null_mapper.NullMapper},
"134": null_mapper.NullMapper,
# COM_都道府県医療機能情報(短期滞在手術)
"135": {"00": null_mapper.NullMapper},
"135": null_mapper.NullMapper,
# COM_都道府県医療機能情報(専門外来)
"136": {"00": null_mapper.NullMapper},
# レコードID浮動
"136": null_mapper.NullMapper,
# COM_診療科目
"001": null_mapper.NullMapper,
# COM_病院種別
@ -85,18 +84,24 @@ COM_TABLE_LIST = {
class UltmarcTableMapperFactory:
def create(self, layout_class: str, record_id: str, records: list[str], db: Database) -> UltmarcTableMapper:
# レイアウト種別とレコードIDから、マッピング先のテーブルを特定
table_by_layout_class = COM_TABLE_LIST.get(layout_class)
def create(self, layout_class: str, records: list[str], db: Database) -> UltmarcTableMapper:
"""レイアウト区分とレコードIDから、マッピング先のテーブルマッパーを特定する
# レイアウト種別が特定できない場合はエラーとする
if table_by_layout_class is None:
raise Exception('特定できませんでした')
Args:
layout_class (str): レイアウト区分
records (list[str]): アルトマークデータの1行
db (Database): データベース操作クラス
mapper_class: UltmarcTableMapper = None
if type(table_by_layout_class) is dict:
mapper_class = table_by_layout_class.get(record_id)
elif issubclass(table_by_layout_class, UltmarcTableMapper):
mapper_class = table_by_layout_class
Raises:
Exception: レイアウトを特定できない場合
Returns:
UltmarcTableMapper: マッパークラス
"""
# レイアウト区分から、マッピング先のテーブルを特定
mapper_class = COM_TABLE_LIST.get(layout_class)
# レイアウト区分が特定できない場合はエラーとする
if mapper_class is None:
raise Exception(f'マッピング先のテーブルを特定できませんでした。レイアウト区分={layout_class}')
return mapper_class(records, db)

View File

@ -73,7 +73,7 @@ def batch_process():
logger.info('日次処理(アルトマーク)実行対象日でない為未実行')
try:
logger.info('アルトマーク取込:起動')
ultmarc_process.batch_process()
ultmarc_process.exec_import()
logger.info('アルトマーク取込:終了')
except BatchOperationException as e:
logger.error(f'アルトマーク取込処理エラー(異常終了){e}')

View File

@ -6,8 +6,16 @@ from src.system_var.environment import LOG_LEVEL
for name in ["boto3", "botocore", "s3transfer", "urllib3"]:
logging.getLogger(name).setLevel(logging.WARNING)
# 共通ロガー
def get_logger(log_name):
def get_logger(log_name: str) -> logging.Logger:
"""一意のログ出力モジュールを取得します。
Args:
log_name (str): ロガー名
Returns:
_type_: _description_
"""
logger = logging.getLogger(log_name)
level = logging.getLevelName(LOG_LEVEL)
if not isinstance(level, int):

View File

@ -1,12 +1,20 @@
import os
# Database
DB_HOST = os.environ['DB_HOST']
DB_PORT = int(os.environ['DB_PORT'])
DB_USERNAME = os.environ['DB_USERNAME']
DB_PASSWORD = os.environ['DB_PASSWORD']
DB_SCHEMA = os.environ['DB_SCHEMA']
LOG_LEVEL = os.environ['LOG_LEVEL']
# AWS
ULTMARC_DATA_BUCKET = os.environ['ULTMARC_DATA_BUCKET']
ULTMARC_DATA_FOLDER = os.environ['ULTMARC_DATA_FOLDER']
ULTMARC_BACKUP_BUCKET = os.environ['ULTMARC_BACKUP_BUCKET']
ULTMARC_BACKUP_FOLDER = os.environ['ULTMARC_BACKUP_FOLDER']
# 初期値がある環境変数
LOG_LEVEL = os.environ.get('LOG_LEVEL', 'INFO')
DB_CONNECTION_MAX_RETRY_ATTEMPT = int(os.environ.get('DB_CONNECTION_MAX_RETRY_ATTEMPT', 4))
DB_CONNECTION_RETRY_INTERVAL_INIT = int(os.environ.get('DB_CONNECTION_RETRY_INTERVAL', 5))
DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS = int(os.environ.get('DB_CONNECTION_RETRY_MIN_SECONDS', 5))

View File

@ -1,7 +1,7 @@
"004","001","A","20141113","20141114","北大","1","2014/11/21 22:53","VANLOAD","","","2014/11/21 22:53"
"004","002","A","20141113","20141114","札幌医","1","2014/11/21 22:53","VANLOAD","","","2014/11/21 22:53"
"004","003","A","20141113","20141114","弘大","1","2014/11/21 22:53","VANLOAD","","","2014/11/21 22:53"
"004","004","A","20141113","20141114","","1","2014/11/21 22:53","VANLOAD","","","2014/11/21 22:53"
"004","005","A","20141113","20141114","東北大","1","2014/11/21 22:53","VANLOAD","","","2014/11/21 22:53"
"004","006","C","20141113","20141114","福島医","1","2014/11/21 22:53","VANLOAD","","","2014/11/21 22:53"
"004","007","A","20141113","20141114","群馬大","1","2014/11/21 22:53","VANLOAD","","","2014/11/21 22:53"
"004","001","A","20141113","20141114","北大"
"004","002","A","20141113","20141114","札幌医"
"004","003","A","20141113","20141114","弘大"
"004","004","A","20141113","20141114",
"004","005","A","20141113","20141114","東北大"
"004","006","C","20141113","20141114","福島医"
"004","007","A","20141113","20141114","群馬大"

1 004 001 A 20141113 20141114 北大 1 2014/11/21 22:53 VANLOAD 2014/11/21 22:53
2 004 002 A 20141113 20141114 札幌医 1 2014/11/21 22:53 VANLOAD 2014/11/21 22:53
3 004 003 A 20141113 20141114 弘大 1 2014/11/21 22:53 VANLOAD 2014/11/21 22:53
4 004 004 A 20141113 20141114 1 2014/11/21 22:53 VANLOAD 2014/11/21 22:53
5 004 005 A 20141113 20141114 東北大 1 2014/11/21 22:53 VANLOAD 2014/11/21 22:53
6 004 006 C 20141113 20141114 福島医 1 2014/11/21 22:53 VANLOAD 2014/11/21 22:53
7 004 007 A 20141113 20141114 群馬大 1 2014/11/21 22:53 VANLOAD 2014/11/21 22:53

View File

@ -1,6 +1,6 @@
"004","001","A","20141113","20141114","北大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"
"004","002","A","20141113","20141114","札幌医","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"
"004","003","A","20141113","20141114","弘大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"
"004","004","A","20141113","20141114","岩手医","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"
"004","005","A","20141113","20141114","東北大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"
"004","006","A","20141113","20141114","福島医","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"
"004","001","A","20141113","20141114","北大"
"004","002","A","20141113","20141114","札幌医"
"004","003","A","20141113","20141114","弘大"
"004","004","A","20141113","20141114","岩手医"
"004","005","A","20141113","20141114","東北大"
"004","006","A","20141113","20141114","福島医"
1 004 001 A 20141113 20141114 北大 1 2014/11/21 22:53 VANLOAD 2014/11/21 22:53
2 004 002 A 20141113 20141114 札幌医 1 2014/11/21 22:53 VANLOAD 2014/11/21 22:53
3 004 003 A 20141113 20141114 弘大 1 2014/11/21 22:53 VANLOAD 2014/11/21 22:53
4 004 004 A 20141113 20141114 岩手医 1 2014/11/21 22:53 VANLOAD 2014/11/21 22:53
5 004 005 A 20141113 20141114 東北大 1 2014/11/21 22:53 VANLOAD 2014/11/21 22:53
6 004 006 A 20141113 20141114 福島医 1 2014/11/21 22:53 VANLOAD 2014/11/21 22:53

View File

@ -1,7 +1,7 @@
"004","001","B","20141113","20141114","北大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"
"004","002","B","20141113","20141114","札幌医","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"
"004","003","B","20141113","20141114","弘大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"
"004","004","B","20141113","20141114",,"1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"
"004","005","B","20141113","20141114","福島医","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"
"004","006","B","20141113","20141114","東北大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"
"004","007","A","20141113","20141114","神大","1","2014/11/21 22:53","VANLOAD",,,"2014/11/21 22:53"
"004","001","B","20141113","20141114","北大"
"004","002","B","20141113","20141114","札幌医"
"004","003","B","20141113","20141114","弘大"
"004","004","B","20141113","20141114",
"004","005","B","20141113","20141114","福島医"
"004","006","B","20141113","20141114","東北大"
"004","007","A","20141113","20141114","神大"
1 004 001 B 20141113 20141114 北大 1 2014/11/21 22:53 VANLOAD 2014/11/21 22:53
2 004 002 B 20141113 20141114 札幌医 1 2014/11/21 22:53 VANLOAD 2014/11/21 22:53
3 004 003 B 20141113 20141114 弘大 1 2014/11/21 22:53 VANLOAD 2014/11/21 22:53
4 004 004 B 20141113 20141114 1 2014/11/21 22:53 VANLOAD 2014/11/21 22:53
5 004 005 B 20141113 20141114 福島医 1 2014/11/21 22:53 VANLOAD 2014/11/21 22:53
6 004 006 B 20141113 20141114 東北大 1 2014/11/21 22:53 VANLOAD 2014/11/21 22:53
7 004 007 A 20141113 20141114 神大 1 2014/11/21 22:53 VANLOAD 2014/11/21 22:53

View File

@ -88,7 +88,7 @@ class TestComAlmaMapper:
COM_出身校テーブルのレコードを更新する
Arranges:
- CSVデータを用意し読み込む
- 追加対象となるレコードを登録する
- 更新対象となるレコードを登録する
Expects:
- 登録内容が期待値と一致すること
"""
@ -145,7 +145,7 @@ class TestComAlmaMapper:
COM_出身校テーブルのレコードを1件論理削除する
Arranges:
- CSVデータを用意し読み込む
- 追加対象となるレコードを登録する
- 削除対象となるレコードを登録する
Expects:
- 登録内容が期待値と一致すること
"""

View File

@ -0,0 +1,5 @@
"502","01","997682","","B","00","5408060","","1","20141204","20141206","","","1512","","",""
"502","01","997906","","B","00","5409446","","1","20141128","20141206","","","6802","","",""
"502","01","997682","","B","00","5412977","","1","20141204","20141206","","","6720","","",""
"502","01","995783","","B","00","5414992","","1","20141204","20141206","","","1118","","",""
"502","01","997906","","B","00","5503358","","1","20141202","20141206","","","7212","","",""
1 502 01 997682 B 00 5408060 1 20141204 20141206 1512
2 502 01 997906 B 00 5409446 1 20141128 20141206 6802
3 502 01 997682 B 00 5412977 1 20141204 20141206 6720
4 502 01 995783 B 00 5414992 1 20141204 20141206 1118
5 502 01 997906 B 00 5503358 1 20141202 20141206 7212

View File

@ -0,0 +1,5 @@
"502","01","997906","","B","00","5409446","","","20170906","20170910","","","","","","@"
"502","01","995783","","B","00","5507600","","","20170907","20170910","@","802","@","","@",""
"502","01","997682","","A","00","5408060","","","20141113","20141114","","","","","",""
"502","01","997682","","B","00","5402984","","","20141113","20141114","165","@","","","",""
"502","01","999613","","B","00","5504428","","2","20170328","20170401","501","","9999","内分泌・骨代謝外来","ナイブンピ.ホネタイシヤガイライ",""
1 502 01 997906 B 00 5409446 20170906 20170910 @
2 502 01 995783 B 00 5507600 20170907 20170910 @ 802 @ @
3 502 01 997682 A 00 5408060 20141113 20141114
4 502 01 997682 B 00 5402984 20141113 20141114 165 @
5 502 01 999613 B 00 5504428 2 20170328 20170401 501 9999 内分泌・骨代謝外来 ナイブンピ.ホネタイシヤガイライ

View File

@ -0,0 +1,6 @@
"blng_sec_cd","blng_sec_kana","blng_sec_name","regist_ymd","update_ymd","delete_ymd","inst_category","trt_category","category_sort","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id"
"1512",,NULL,"20150825","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2015-08-25 00:10:58","clsComBlngSec","2022-05-16 22:18:28","clsComBlngSec"
"6802","NULL",,"20150825","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2015-08-25 00:10:58","clsComBlngSec","2022-05-30 22:18:48","clsComBlngSec"
"6720",,"NULL","20150825","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2015-08-25 00:10:58","clsComBlngSec","2019-12-23 22:13:44","clsComBlngSec"
"1118","NULL",,"20150825","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2015-08-25 00:10:58","clsComBlngSec","2016-05-17 00:13:18","clsComBlngSec"
"7212",,"NULL","20150818","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2015-08-18 00:12:58","clsComBlngSec","2021-01-11 22:15:40","clsComBlngSec"
1 blng_sec_cd blng_sec_kana blng_sec_name regist_ymd update_ymd delete_ymd inst_category trt_category category_sort regist_date create_user update_date update_user sys_regist_date regist_prgm_id sys_update_date update_prgm_id
2 1512 NULL 20150825 NULL NULL NULL NULL NULL NULL NULL NULL NULL 2015-08-25 00:10:58 clsComBlngSec 2022-05-16 22:18:28 clsComBlngSec
3 6802 NULL 20150825 NULL NULL NULL NULL NULL NULL NULL NULL NULL 2015-08-25 00:10:58 clsComBlngSec 2022-05-30 22:18:48 clsComBlngSec
4 6720 NULL 20150825 NULL NULL NULL NULL NULL NULL NULL NULL NULL 2015-08-25 00:10:58 clsComBlngSec 2019-12-23 22:13:44 clsComBlngSec
5 1118 NULL 20150825 NULL NULL NULL NULL NULL NULL NULL NULL NULL 2015-08-25 00:10:58 clsComBlngSec 2016-05-17 00:13:18 clsComBlngSec
6 7212 NULL 20150818 NULL NULL NULL NULL NULL NULL NULL NULL NULL 2015-08-18 00:12:58 clsComBlngSec 2021-01-11 22:15:40 clsComBlngSec

View File

@ -0,0 +1,11 @@
"dcf_dsf_inst_cd","dcf_pcf_dr_cd","blng_sec_cd","post_cd","identity_cd","aply_start_ymd","blng_sec_name_kana","blng_sec_name","notdm_flg","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id"
"005414992","01995783",,"501",,"2020-02-22",,,,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
"005507600","01995783","9999",,"802","2020-02-23",,,,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","clsComDrWrk"
"005402984","01997682","1512","165",,"2020-02-23","シヨウカキゲカ","消化器外科",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","clsComDrWrk"
"005408060","01997682","6802",,"144","2020-02-22","シヨウカキゲカガク1","消化器外科学Ⅰ",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
"005412977","01997682","6720",,"144","2020-02-22","シヨウカキゲカガク","消化器外科学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
"005409446","01997906","1118","501",,"2020-02-22","ケツエキナイカ","血液内科",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","clsComDrWrk"
"005503358","01997906","1118","172","144","2020-02-22","ケツエキナイカ","血液内科",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
"005504428","01997906","7212",,"144","2020-02-22","ユケツ.サイボウチリヨウガク","輸血・細胞治療学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
"005507600","01997906","9114",,"144","2020-02-22","サイボウイシヨクブモン","細胞移植部門",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
"005504428","01999613","9999","501","144","2020-02-23","ナイブンピ.ホネタイシヤガイライ","内分泌・骨代謝外来",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","clsComDrWrk"
1 dcf_dsf_inst_cd dcf_pcf_dr_cd blng_sec_cd post_cd identity_cd aply_start_ymd blng_sec_name_kana blng_sec_name notdm_flg regist_ymd update_ymd regist_date create_user update_date update_user sys_regist_date regist_prgm_id sys_update_date update_prgm_id
2 005414992 01995783 501 2020-02-22 2022-02-03 NULL NULL NULL NULL NULL 2022-02-03 14:23:39 clsComDrWrk 2022-02-03 14:23:39 clsComDrWrk
3 005507600 01995783 9999 802 2020-02-23 2022-02-03 2022-02-03 NULL NULL NULL NULL 2022-02-03 14:23:39 clsComDrWrk 2022-02-03 14:43:43 clsComDrWrk
4 005402984 01997682 1512 165 2020-02-23 シヨウカキゲカ 消化器外科 2022-02-03 2022-02-03 NULL NULL NULL NULL 2022-02-03 14:23:39 clsComDrWrk 2022-02-03 14:43:43 clsComDrWrk
5 005408060 01997682 6802 144 2020-02-22 シヨウカキゲカガク1 消化器外科学Ⅰ 2022-02-03 NULL NULL NULL NULL NULL 2022-02-03 14:23:39 clsComDrWrk 2022-02-03 14:23:39 clsComDrWrk
6 005412977 01997682 6720 144 2020-02-22 シヨウカキゲカガク 消化器外科学 2022-02-03 NULL NULL NULL NULL NULL 2022-02-03 14:23:39 clsComDrWrk 2022-02-03 14:23:39 clsComDrWrk
7 005409446 01997906 1118 501 2020-02-22 ケツエキナイカ 血液内科 2022-02-03 2022-02-03 NULL NULL NULL NULL 2022-02-03 14:23:39 clsComDrWrk 2022-02-03 14:43:43 clsComDrWrk
8 005503358 01997906 1118 172 144 2020-02-22 ケツエキナイカ 血液内科 2022-02-03 NULL NULL NULL NULL NULL 2022-02-03 14:23:39 clsComDrWrk 2022-02-03 14:23:39 clsComDrWrk
9 005504428 01997906 7212 144 2020-02-22 ユケツ.サイボウチリヨウガク 輸血・細胞治療学 2022-02-03 NULL NULL NULL NULL NULL 2022-02-03 14:23:39 clsComDrWrk 2022-02-03 14:23:39 clsComDrWrk
10 005507600 01997906 9114 144 2020-02-22 サイボウイシヨクブモン 細胞移植部門 2022-02-03 NULL NULL NULL NULL NULL 2022-02-03 14:23:39 clsComDrWrk 2022-02-03 14:23:39 clsComDrWrk
11 005504428 01999613 9999 501 144 2020-02-23 ナイブンピ.ホネタイシヤガイライ 内分泌・骨代謝外来 2022-02-03 2022-02-03 NULL NULL NULL NULL 2022-02-03 14:23:39 clsComDrWrk 2022-02-03 14:43:43 clsComDrWrk

View File

@ -0,0 +1,11 @@
"dcf_dsf_inst_cd","dcf_pcf_dr_cd","blng_sec_cd","post_cd","identity_cd","aply_start_ymd","blng_sec_name_kana","blng_sec_name","notdm_flg","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id"
"005414992","01995783",,"501",,"2020-02-22",,,,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
"005507600","01995783","9112","133","144","2020-02-22","ハツセイ.セイシヨクブモン","発生・生殖部門","1","2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
"005402984","01997682","1512","165","144","2020-02-22","シヨウカキゲカ","消化器外科",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
"005408060","01997682","6802",,"144","2020-02-22","シヨウカキゲカガク1","消化器外科学Ⅰ",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
"005412977","01997682","6720",,"144","2020-02-22","シヨウカキゲカガク","消化器外科学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
"005409446","01997906","1118","501",,"2020-02-22","ケツエキナイカ","血液内科","1","2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
"005503358","01997906","1118","172","144","2020-02-22","ケツエキナイカ","血液内科",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
"005504428","01997906","7212",,"144","2020-02-22","ユケツ.サイボウチリヨウガク","輸血・細胞治療学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
"005507600","01997906","9114",,"144","2020-02-22","サイボウイシヨクブモン","細胞移植部門",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
"005504428","01999613","5140",,"144","2020-02-22","ヤクリガク","薬理学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
1 dcf_dsf_inst_cd dcf_pcf_dr_cd blng_sec_cd post_cd identity_cd aply_start_ymd blng_sec_name_kana blng_sec_name notdm_flg regist_ymd update_ymd regist_date create_user update_date update_user sys_regist_date regist_prgm_id sys_update_date update_prgm_id
2 005414992 01995783 501 2020-02-22 2022-02-03 NULL NULL NULL NULL NULL 2022-02-03 14:23:39 clsComDrWrk 2022-02-03 14:23:39 clsComDrWrk
3 005507600 01995783 9112 133 144 2020-02-22 ハツセイ.セイシヨクブモン 発生・生殖部門 1 2022-02-03 NULL NULL NULL NULL NULL 2022-02-03 14:23:39 clsComDrWrk 2022-02-03 14:23:39 clsComDrWrk
4 005402984 01997682 1512 165 144 2020-02-22 シヨウカキゲカ 消化器外科 2022-02-03 NULL NULL NULL NULL NULL 2022-02-03 14:23:39 clsComDrWrk 2022-02-03 14:23:39 clsComDrWrk
5 005408060 01997682 6802 144 2020-02-22 シヨウカキゲカガク1 消化器外科学Ⅰ 2022-02-03 NULL NULL NULL NULL NULL 2022-02-03 14:23:39 clsComDrWrk 2022-02-03 14:23:39 clsComDrWrk
6 005412977 01997682 6720 144 2020-02-22 シヨウカキゲカガク 消化器外科学 2022-02-03 NULL NULL NULL NULL NULL 2022-02-03 14:23:39 clsComDrWrk 2022-02-03 14:23:39 clsComDrWrk
7 005409446 01997906 1118 501 2020-02-22 ケツエキナイカ 血液内科 1 2022-02-03 NULL NULL NULL NULL NULL 2022-02-03 14:23:39 clsComDrWrk 2022-02-03 14:23:39 clsComDrWrk
8 005503358 01997906 1118 172 144 2020-02-22 ケツエキナイカ 血液内科 2022-02-03 NULL NULL NULL NULL NULL 2022-02-03 14:23:39 clsComDrWrk 2022-02-03 14:23:39 clsComDrWrk
9 005504428 01997906 7212 144 2020-02-22 ユケツ.サイボウチリヨウガク 輸血・細胞治療学 2022-02-03 NULL NULL NULL NULL NULL 2022-02-03 14:23:39 clsComDrWrk 2022-02-03 14:23:39 clsComDrWrk
10 005507600 01997906 9114 144 2020-02-22 サイボウイシヨクブモン 細胞移植部門 2022-02-03 NULL NULL NULL NULL NULL 2022-02-03 14:23:39 clsComDrWrk 2022-02-03 14:23:39 clsComDrWrk
11 005504428 01999613 5140 144 2020-02-22 ヤクリガク 薬理学 2022-02-03 NULL NULL NULL NULL NULL 2022-02-03 14:23:39 clsComDrWrk 2022-02-03 14:23:39 clsComDrWrk

View File

@ -0,0 +1,4 @@
"dr_wrkplace_his_key","dcf_dsf_inst_cd","dcf_pcf_dr_cd","blng_sec_cd","post_cd","identity_cd","aply_start_ymd","blng_sec_name_kana","blng_sec_name","notdm_flg","aply_end_ymd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id"
"1482020","005507600","01995783","9112","133","144","20200222","ハツセイ.セイシヨクブモン","発生・生殖部門",,"20200222","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:43:43","com_dr_wrkplace_mapper","2022-02-03 14:43:43","com_dr_wrkplace_mapper"
"1482021","005402984","01997682","1512","165","144","20200222","シヨウカキゲカ","消化器外科",,"20200222","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:43:43","com_dr_wrkplace_mapper","2022-02-03 14:43:43","com_dr_wrkplace_mapper"
"1482022","005504428","01999613","5140","999","144","20200222","ヤクリガク","薬理学",,"20200222","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:43:43","com_dr_wrkplace_mapper","2022-02-03 14:43:43","com_dr_wrkplace_mapper"
1 dr_wrkplace_his_key dcf_dsf_inst_cd dcf_pcf_dr_cd blng_sec_cd post_cd identity_cd aply_start_ymd blng_sec_name_kana blng_sec_name notdm_flg aply_end_ymd regist_ymd update_ymd regist_date create_user update_date update_user sys_regist_date regist_prgm_id sys_update_date update_prgm_id
2 1482020 005507600 01995783 9112 133 144 20200222 ハツセイ.セイシヨクブモン 発生・生殖部門 20200222 20220203 NULL NULL NULL NULL NULL 2022-02-03 14:43:43 com_dr_wrkplace_mapper 2022-02-03 14:43:43 com_dr_wrkplace_mapper
3 1482021 005402984 01997682 1512 165 144 20200222 シヨウカキゲカ 消化器外科 20200222 20220203 NULL NULL NULL NULL NULL 2022-02-03 14:43:43 com_dr_wrkplace_mapper 2022-02-03 14:43:43 com_dr_wrkplace_mapper
4 1482022 005504428 01999613 5140 999 144 20200222 ヤクリガク 薬理学 20200222 20220203 NULL NULL NULL NULL NULL 2022-02-03 14:43:43 com_dr_wrkplace_mapper 2022-02-03 14:43:43 com_dr_wrkplace_mapper

View File

@ -0,0 +1,6 @@
"dcf_dsf_inst_cd","dcf_pcf_dr_cd","blng_sec_cd","post_cd","identity_cd","aply_start_ymd","blng_sec_name_kana","blng_sec_name","notdm_flg","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id"
"005507600","01995783","9999",,"802","2020-02-23",,,,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","clsComDrWrk"
"005402984","01997682","1512","165",,"2020-02-23","シヨウカキゲカ","消化器外科",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","clsComDrWrk"
"005504428","01997906","7212",,"144","2020-02-22","ユケツ.サイボウチリヨウガク","輸血・細胞治療学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
"005507600","01997906","9114",,"144","2020-02-22","サイボウイシヨクブモン","細胞移植部門",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
"005504428","01999613","9999","501","144","2020-02-23","ナイブンピ.ホネタイシヤガイライ","内分泌・骨代謝外来",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","clsComDrWrk"
1 dcf_dsf_inst_cd dcf_pcf_dr_cd blng_sec_cd post_cd identity_cd aply_start_ymd blng_sec_name_kana blng_sec_name notdm_flg regist_ymd update_ymd regist_date create_user update_date update_user sys_regist_date regist_prgm_id sys_update_date update_prgm_id
2 005507600 01995783 9999 802 2020-02-23 2022-02-03 2022-02-03 NULL NULL NULL NULL 2022-02-03 14:23:39 clsComDrWrk 2022-02-03 14:43:43 clsComDrWrk
3 005402984 01997682 1512 165 2020-02-23 シヨウカキゲカ 消化器外科 2022-02-03 2022-02-03 NULL NULL NULL NULL 2022-02-03 14:23:39 clsComDrWrk 2022-02-03 14:43:43 clsComDrWrk
4 005504428 01997906 7212 144 2020-02-22 ユケツ.サイボウチリヨウガク 輸血・細胞治療学 2022-02-03 NULL NULL NULL NULL NULL 2022-02-03 14:23:39 clsComDrWrk 2022-02-03 14:23:39 clsComDrWrk
5 005507600 01997906 9114 144 2020-02-22 サイボウイシヨクブモン 細胞移植部門 2022-02-03 NULL NULL NULL NULL NULL 2022-02-03 14:23:39 clsComDrWrk 2022-02-03 14:23:39 clsComDrWrk
6 005504428 01999613 9999 501 144 2020-02-23 ナイブンピ.ホネタイシヤガイライ 内分泌・骨代謝外来 2022-02-03 2022-02-03 NULL NULL NULL NULL 2022-02-03 14:23:39 clsComDrWrk 2022-02-03 14:43:43 clsComDrWrk

View File

@ -0,0 +1,9 @@
"dr_wrkplace_his_key","dcf_dsf_inst_cd","dcf_pcf_dr_cd","blng_sec_cd","post_cd","identity_cd","aply_start_ymd","blng_sec_name_kana","blng_sec_name","notdm_flg","aply_end_ymd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id"
"1482020","005507600","01995783","9112","133","144","20200222","ハツセイ.セイシヨクブモン","発生・生殖部門",,"20200222","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:43:43","com_dr_wrkplace_mapper","2022-02-03 14:43:43","com_dr_wrkplace_mapper"
"1482021","005402984","01997682","1512","165","144","20200222","シヨウカキゲカ","消化器外科",,"20200222","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:43:43","com_dr_wrkplace_mapper","2022-02-03 14:43:43","com_dr_wrkplace_mapper"
"1482022","005504428","01999613","5140","999","144","20200222","ヤクリガク","薬理学",,"20200222","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:43:43","com_dr_wrkplace_mapper","2022-02-03 14:43:43","com_dr_wrkplace_mapper"
"1482023","005408060","01997682","6802","999","144","20200222","シヨウカキゲカガク1","消化器外科学Ⅰ",,"20200223","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 16:18:08","com_dr_wrkplace_mapper","2022-02-03 16:18:08","com_dr_wrkplace_mapper"
"1482024","005409446","01997906","1118","501","999","20200222","ケツエキナイカ","血液内科",,"20200223","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 16:18:08","com_dr_wrkplace_mapper","2022-02-03 16:18:08","com_dr_wrkplace_mapper"
"1482025","005412977","01997682","6720","999","144","20200222","シヨウカキゲカガク","消化器外科学",,"20200223","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 16:18:08","com_dr_wrkplace_mapper","2022-02-03 16:18:08","com_dr_wrkplace_mapper"
"1482026","005414992","01995783","9999","501","999","20200222",,,,"20200223","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 16:18:08","com_dr_wrkplace_mapper","2022-02-03 16:18:08","com_dr_wrkplace_mapper"
"1482027","005503358","01997906","1118","172","144","20200222","ケツエキナイカ","血液内科",,"20200223","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 16:18:08","com_dr_wrkplace_mapper","2022-02-03 16:18:08","com_dr_wrkplace_mapper"
1 dr_wrkplace_his_key dcf_dsf_inst_cd dcf_pcf_dr_cd blng_sec_cd post_cd identity_cd aply_start_ymd blng_sec_name_kana blng_sec_name notdm_flg aply_end_ymd regist_ymd update_ymd regist_date create_user update_date update_user sys_regist_date regist_prgm_id sys_update_date update_prgm_id
2 1482020 005507600 01995783 9112 133 144 20200222 ハツセイ.セイシヨクブモン 発生・生殖部門 20200222 20220203 NULL NULL NULL NULL NULL 2022-02-03 14:43:43 com_dr_wrkplace_mapper 2022-02-03 14:43:43 com_dr_wrkplace_mapper
3 1482021 005402984 01997682 1512 165 144 20200222 シヨウカキゲカ 消化器外科 20200222 20220203 NULL NULL NULL NULL NULL 2022-02-03 14:43:43 com_dr_wrkplace_mapper 2022-02-03 14:43:43 com_dr_wrkplace_mapper
4 1482022 005504428 01999613 5140 999 144 20200222 ヤクリガク 薬理学 20200222 20220203 NULL NULL NULL NULL NULL 2022-02-03 14:43:43 com_dr_wrkplace_mapper 2022-02-03 14:43:43 com_dr_wrkplace_mapper
5 1482023 005408060 01997682 6802 999 144 20200222 シヨウカキゲカガク1 消化器外科学Ⅰ 20200223 20220203 NULL NULL NULL NULL NULL 2022-02-03 16:18:08 com_dr_wrkplace_mapper 2022-02-03 16:18:08 com_dr_wrkplace_mapper
6 1482024 005409446 01997906 1118 501 999 20200222 ケツエキナイカ 血液内科 20200223 20220203 NULL NULL NULL NULL NULL 2022-02-03 16:18:08 com_dr_wrkplace_mapper 2022-02-03 16:18:08 com_dr_wrkplace_mapper
7 1482025 005412977 01997682 6720 999 144 20200222 シヨウカキゲカガク 消化器外科学 20200223 20220203 NULL NULL NULL NULL NULL 2022-02-03 16:18:08 com_dr_wrkplace_mapper 2022-02-03 16:18:08 com_dr_wrkplace_mapper
8 1482026 005414992 01995783 9999 501 999 20200222 20200223 20220203 NULL NULL NULL NULL NULL 2022-02-03 16:18:08 com_dr_wrkplace_mapper 2022-02-03 16:18:08 com_dr_wrkplace_mapper
9 1482027 005503358 01997906 1118 172 144 20200222 ケツエキナイカ 血液内科 20200223 20220203 NULL NULL NULL NULL NULL 2022-02-03 16:18:08 com_dr_wrkplace_mapper 2022-02-03 16:18:08 com_dr_wrkplace_mapper

View File

@ -0,0 +1,4 @@
"dr_wrkplace_his_key","dcf_dsf_inst_cd","dcf_pcf_dr_cd","blng_sec_cd","post_cd","identity_cd","aply_start_ymd","blng_sec_name_kana","blng_sec_name","notdm_flg","aply_end_ymd","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id"
"1","005507600","01995783","9112","133","144","20200222","ハツセイ.セイシヨクブモン","発生・生殖部門","1","20200222","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:43:43","com_dr_wrkplace_mapper","2022-02-03 14:43:43","com_dr_wrkplace_mapper"
"2","005402984","01997682","1512","165","144","20200222","シヨウカキゲカ","消化器外科",,"20200222","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:43:43","com_dr_wrkplace_mapper","2022-02-03 14:43:43","com_dr_wrkplace_mapper"
"3","005504428","01999613","5140","999","144","20200222","ヤクリガク","薬理学",,"20200222","20220203","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:43:43","com_dr_wrkplace_mapper","2022-02-03 14:43:43","com_dr_wrkplace_mapper"
1 dr_wrkplace_his_key dcf_dsf_inst_cd dcf_pcf_dr_cd blng_sec_cd post_cd identity_cd aply_start_ymd blng_sec_name_kana blng_sec_name notdm_flg aply_end_ymd regist_ymd update_ymd regist_date create_user update_date update_user sys_regist_date regist_prgm_id sys_update_date update_prgm_id
2 1 005507600 01995783 9112 133 144 20200222 ハツセイ.セイシヨクブモン 発生・生殖部門 1 20200222 20220203 NULL NULL NULL NULL NULL 2022-02-03 14:43:43 com_dr_wrkplace_mapper 2022-02-03 14:43:43 com_dr_wrkplace_mapper
3 2 005402984 01997682 1512 165 144 20200222 シヨウカキゲカ 消化器外科 20200222 20220203 NULL NULL NULL NULL NULL 2022-02-03 14:43:43 com_dr_wrkplace_mapper 2022-02-03 14:43:43 com_dr_wrkplace_mapper
4 3 005504428 01999613 5140 999 144 20200222 ヤクリガク 薬理学 20200222 20220203 NULL NULL NULL NULL NULL 2022-02-03 14:43:43 com_dr_wrkplace_mapper 2022-02-03 14:43:43 com_dr_wrkplace_mapper

View File

@ -0,0 +1,11 @@
"dcf_dsf_inst_cd","dcf_pcf_dr_cd","blng_sec_cd","post_cd","identity_cd","aply_start_ymd","blng_sec_name_kana","blng_sec_name","notdm_flg","regist_ymd","update_ymd","regist_date","create_user","update_date","update_user","sys_regist_date","regist_prgm_id","sys_update_date","update_prgm_id"
"005414992","01995783",,"501",,"2020-02-22",,,,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
"005507600","01995783","9999",,"802","2020-02-23","NULL","NULL","1","2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","com_dr_wrkplace_mapper"
"005402984","01997682","1512","165",,"2020-02-23","シヨウカキゲカ","消化器外科",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","com_dr_wrkplace_mapper"
"005408060","01997682","6802",,"144","2020-02-22","シヨウカキゲカガク1","消化器外科学Ⅰ",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","com_dr_wrkplace_mapper"
"005412977","01997682","6720",,"144","2020-02-22","シヨウカキゲカガク","消化器外科学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
"005409446","01997906","1118","501",,"2020-02-22","ケツエキナイカ","血液内科","NULL","2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","com_dr_wrkplace_mapper"
"005503358","01997906","1118","172","144","2020-02-22","ケツエキナイカ","血液内科",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
"005504428","01997906","7212",,"144","2020-02-22","ユケツ.サイボウチリヨウガク","輸血・細胞治療学",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
"005507600","01997906","9114",,"144","2020-02-22","サイボウイシヨクブモン","細胞移植部門",,"2022-02-03","NULL","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:23:39","clsComDrWrk"
"005504428","01999613","9999","501","144","2020-02-23","ナイブンピ.ホネタイシヤガイライ","内分泌・骨代謝外来",,"2022-02-03","2022-02-03","NULL","NULL","NULL","NULL","2022-02-03 14:23:39","clsComDrWrk","2022-02-03 14:43:43","com_dr_wrkplace_mapper"
1 dcf_dsf_inst_cd dcf_pcf_dr_cd blng_sec_cd post_cd identity_cd aply_start_ymd blng_sec_name_kana blng_sec_name notdm_flg regist_ymd update_ymd regist_date create_user update_date update_user sys_regist_date regist_prgm_id sys_update_date update_prgm_id
2 005414992 01995783 501 2020-02-22 2022-02-03 NULL NULL NULL NULL NULL 2022-02-03 14:23:39 clsComDrWrk 2022-02-03 14:23:39 clsComDrWrk
3 005507600 01995783 9999 802 2020-02-23 NULL NULL 1 2022-02-03 2022-02-03 NULL NULL NULL NULL 2022-02-03 14:23:39 clsComDrWrk 2022-02-03 14:43:43 com_dr_wrkplace_mapper
4 005402984 01997682 1512 165 2020-02-23 シヨウカキゲカ 消化器外科 2022-02-03 2022-02-03 NULL NULL NULL NULL 2022-02-03 14:23:39 clsComDrWrk 2022-02-03 14:43:43 com_dr_wrkplace_mapper
5 005408060 01997682 6802 144 2020-02-22 シヨウカキゲカガク1 消化器外科学Ⅰ 2022-02-03 2022-02-03 NULL NULL NULL NULL 2022-02-03 14:23:39 clsComDrWrk 2022-02-03 14:43:43 com_dr_wrkplace_mapper
6 005412977 01997682 6720 144 2020-02-22 シヨウカキゲカガク 消化器外科学 2022-02-03 NULL NULL NULL NULL NULL 2022-02-03 14:23:39 clsComDrWrk 2022-02-03 14:23:39 clsComDrWrk
7 005409446 01997906 1118 501 2020-02-22 ケツエキナイカ 血液内科 NULL 2022-02-03 2022-02-03 NULL NULL NULL NULL 2022-02-03 14:23:39 clsComDrWrk 2022-02-03 14:43:43 com_dr_wrkplace_mapper
8 005503358 01997906 1118 172 144 2020-02-22 ケツエキナイカ 血液内科 2022-02-03 NULL NULL NULL NULL NULL 2022-02-03 14:23:39 clsComDrWrk 2022-02-03 14:23:39 clsComDrWrk
9 005504428 01997906 7212 144 2020-02-22 ユケツ.サイボウチリヨウガク 輸血・細胞治療学 2022-02-03 NULL NULL NULL NULL NULL 2022-02-03 14:23:39 clsComDrWrk 2022-02-03 14:23:39 clsComDrWrk
10 005507600 01997906 9114 144 2020-02-22 サイボウイシヨクブモン 細胞移植部門 2022-02-03 NULL NULL NULL NULL NULL 2022-02-03 14:23:39 clsComDrWrk 2022-02-03 14:23:39 clsComDrWrk
11 005504428 01999613 9999 501 144 2020-02-23 ナイブンピ.ホネタイシヤガイライ 内分泌・骨代謝外来 2022-02-03 2022-02-03 NULL NULL NULL NULL 2022-02-03 14:23:39 clsComDrWrk 2022-02-03 14:43:43 com_dr_wrkplace_mapper

View File

@ -1,5 +1,4 @@
import os.path as path
from datetime import datetime
import pytest
@ -21,19 +20,6 @@ class TestComDrWrkplaceMapper:
db: Database
batch_config: BatchConfig
test_file_path: str = path.dirname(__file__)
# dr_wrkplace_table_columns = [
# "dcf_dsf_inst_cd", "dcf_pcf_dr_cd", "blng_sec_cd", "post_cd", "identity_cd",
# "aply_start_ymd", "blng_sec_name_kana", "blng_sec_name", "notdm_flg"]
# + create_ultmarc_common_column_names()
# # 削除日カラムはないので消す
# dr_wrkplace_table_columns.remove('delete_ymd')
# dr_wrkplace_his_table_columns = [
# "dr_wrkplace_his_key", "dcf_dsf_inst_cd", "dcf_pcf_dr_cd", "blng_sec_cd", "post_cd", "identity_cd",
# "aply_start_ymd", "blng_sec_name_kana", "blng_sec_name", "notdm_flg", "aply_end_ymd"] \
# + create_ultmarc_common_column_names()
# # 削除日カラムはないので消す
# dr_wrkplace_his_table_columns.remove('delete_ymd')
@ pytest.fixture(autouse=True, scope='function')
def pre_test(self, database: Database):
@ -66,7 +52,8 @@ class TestComDrWrkplaceMapper:
# Arrange
# 処理日設定
self.batch_config.syor_date = datetime.strftime(datetime.now(), '%Y/%m/%d')
# 適用開始日と同値になる
self.batch_config.syor_date = '2020/02/22'
# テスト用のCSVを読み込む
test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_dr_wrkplace_insert.csv'))
# 一旦全データをDBから削除
@ -100,9 +87,9 @@ class TestComDrWrkplaceMapper:
# Assert
# 期待値ファイルを読み込む
expect_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_wrkplace_insert.csv'))
primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_data_list]
primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_data_list]
expect_dr_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_wrkplace_insert.csv'))
primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_dr_data_list]
primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_dr_data_list]
# 複合主キーのため、1件ずつ取得して期待値を作る
actual_dr_data_list = []
actual_dr_select_sql = """\
@ -132,13 +119,272 @@ class TestComDrWrkplaceMapper:
{**param_dcf_dsf_inst_cd, **param_dcf_pcf_dr_cd})
assert len(actual_his_data) == 0, '履歴が作成されていないこと'
assert len(actual_dr_data_list) == len(expect_dr_data_list), 'COM_医師勤務先が期待値通りの件数作成されていること'
# 期待値検査
ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date', 'aply_start_ymd']
assert_table_results(actual_dr_data_list, expect_data_list, ignore_col_name=ignore_columns)
ignore_columns = ['regist_ymd', 'sys_update_date', 'sys_regist_date']
assert_table_results(actual_dr_data_list, expect_dr_data_list, ignore_col_name=ignore_columns)
# 動的日付項目の個別確認
line_number = 0
for actual_row, expect_row in zip(actual_dr_data_list, expect_data_list):
for actual_row, expect_row in zip(actual_dr_data_list, expect_dr_data_list):
line_number += 1
for actual_col_name, expect_col_name in zip(actual_row, expect_row):
if actual_col_name in ['regist_ymd', 'sys_regist_date', 'sys_update_date', 'aply_start_ymd']:
if actual_col_name in ignore_columns:
assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること'
def test_update_record(self):
"""
Cases:
COM_DCF医師勤務先テーブルのレコードを更新する
Arranges:
- CSVデータを用意し読み込む
- 更新対象となるレコードを登録する
Expects:
- COM_医師勤務先の登録内容が期待値と一致すること
- COM_医師勤務先履歴にデータが登録され期待値と一致すること
"""
# Arrange
# 処理日設定
# 適用開始日と同値、適用終了日の+1日になる
self.batch_config.syor_date = '2020/02/23'
# テスト用のCSVを読み込む
test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_dr_wrkplace_update.csv'))
# 一旦全データをDBから削除
# COM_医師勤務先
delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr_wrkplace', {'1': '1'})
self.db.execute(delete_sql, delete_parameter)
# COM_医師勤務先履歴
delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr_wrkplace_his', {'1': '1'})
self.db.execute(delete_sql, delete_parameter)
# COM_所属部科
delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_blng_sec', {'1': '1'})
self.db.execute(delete_sql, delete_parameter)
# COM_医師勤務先を登録
test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_dr_wrkplace_before_update.csv'))
for test_data in test_sql_data_list:
insert_sql, insert_parameter = create_insert_sql_with_parameter(
'src05.com_dr_wrkplace',
test_data.keys(),
test_data.values()
)
self.db.execute(insert_sql, insert_parameter)
# Act
for line_number, line in enumerate(test_dat_file, start=1):
sut: com_dr_wrkplace_mapper.ComDrWrkplaceMapper = create_ultmarc_table_mapper_sut(line, self.db)
assert type(sut) is com_dr_wrkplace_mapper.ComDrWrkplaceMapper, f'{line_number}行目:マッパークラスが期通りか'
sut.make_query()
sut.execute_queries()
# Assert
# 期待値ファイルを読み込む
expect_dr_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_wrkplace_update.csv'))
expect_his_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_wrkplace_his_update.csv'))
# 複合主キーのため、1件ずつ取得して期待値を作る
actual_dr_data_list = []
actual_his_data_list = []
actual_dr_select_sql = """\
SELECT * FROM src05.com_dr_wrkplace
WHERE
dcf_dsf_inst_cd = :dcf_dsf_inst_cd
AND dcf_pcf_dr_cd = :dcf_pcf_dr_cd\
"""
actual_his_select_sql = """\
SELECT * FROM src05.com_dr_wrkplace_his
WHERE
dcf_dsf_inst_cd = :dcf_dsf_inst_cd
AND dcf_pcf_dr_cd = :dcf_pcf_dr_cd
"""
# COM_医師勤務先の取得
primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_dr_data_list]
primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_dr_data_list]
for param_dcf_dsf_inst_cd, param_dcf_pcf_dr_cd in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_dcf_pcf_dr_cd):
actual_dr_data = self.db.execute_select(
actual_dr_select_sql,
{**param_dcf_dsf_inst_cd, **param_dcf_pcf_dr_cd})
assert len(actual_dr_data) == 1, '1件取得できていること'
actual_dr_data_list.append(actual_dr_data[0])
# COM_医師勤務先履歴の取得
primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_his_data_list]
primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_his_data_list]
for param_dcf_dsf_inst_cd, param_dcf_pcf_dr_cd in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_dcf_pcf_dr_cd):
actual_his_data = self.db.execute_select(
actual_his_select_sql,
{**param_dcf_dsf_inst_cd, **param_dcf_pcf_dr_cd})
assert len(actual_dr_data) == 1, '1件取得できていること'
actual_his_data_list.append(actual_his_data[0])
assert len(actual_his_data_list) == len(expect_his_data_list), 'COM_医師勤務先が期待値通りの件数作成されていること'
assert len(actual_his_data_list) == len(expect_his_data_list), 'COM_医師勤務先履歴が期待値通りの件数作成されていること'
# 期待値検査
# COM_医師勤務先
dr_ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_ymd', 'sys_update_date', 'sys_regist_date']
assert_table_results(actual_dr_data_list, expect_dr_data_list, ignore_col_name=dr_ignore_columns)
# 動的日付項目の個別確認
line_number = 0
for actual_row, expect_row in zip(actual_dr_data_list, expect_dr_data_list):
line_number += 1
for actual_col_name, expect_col_name in zip(actual_row, expect_row):
if actual_col_name in dr_ignore_columns:
if expect_row[expect_col_name] is None:
assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと'
else:
assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること'
# COM_医師勤務先履歴
his_ignore_columns = ['dr_wrkplace_his_key', 'regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date']
assert_table_results(actual_his_data_list, expect_his_data_list, ignore_col_name=his_ignore_columns)
# 動的日付項目の個別確認
line_number = 0
for actual_row, expect_row in zip(actual_dr_data_list, expect_dr_data_list):
line_number += 1
for actual_col_name, expect_col_name in zip(actual_row, expect_row):
if actual_col_name in his_ignore_columns:
if expect_row[expect_col_name] is None:
assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと'
else:
assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること'
def test_delete_record(self):
"""
Cases:
COM_DCF医師勤務先テーブルのレコードを削除する
Arranges:
- CSVデータを用意し読み込む
- 削除対象となるレコードを登録する
Expects:
- COM_医師勤務先の登録内容が期待値と一致すること
- COM_医師勤務先履歴にデータが登録されないこと
"""
# Arrange
# 処理日設定
self.batch_config.syor_date = '2020/02/24'
# テスト用のCSVを読み込む
test_dat_file = create_ultmarc_test_data_from_csv(path.join(self.test_file_path, 'com_dr_wrkplace_delete.csv'))
# 一旦全データをDBから削除
# COM_医師勤務先
delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr_wrkplace', {'1': '1'})
self.db.execute(delete_sql, delete_parameter)
# COM_医師勤務先履歴
delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_dr_wrkplace_his', {'1': '1'})
self.db.execute(delete_sql, delete_parameter)
# COM_所属部科
delete_sql, delete_parameter = create_delete_sql_with_parameter('src05.com_blng_sec', {'1': '1'})
self.db.execute(delete_sql, delete_parameter)
# COM_医師勤務先を登録
test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_dr_wrkplace_before_delete.csv'))
for test_data in test_sql_data_list:
insert_sql, insert_parameter = create_insert_sql_with_parameter(
'src05.com_dr_wrkplace',
test_data.keys(),
test_data.values()
)
self.db.execute(insert_sql, insert_parameter)
# COM_医師勤務先履歴を登録
test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_dr_wrkplace_his_before_delete.csv'))
for test_data in test_sql_data_list:
insert_sql, insert_parameter = create_insert_sql_with_parameter(
'src05.com_dr_wrkplace_his',
test_data.keys(),
test_data.values()
)
self.db.execute(insert_sql, insert_parameter)
# COM_所属部科を登録
test_sql_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'db_com_blng_sec_before_delete.csv'))
for test_data in test_sql_data_list:
insert_sql, insert_parameter = create_insert_sql_with_parameter(
'src05.com_blng_sec',
test_data.keys(),
test_data.values()
)
self.db.execute(insert_sql, insert_parameter)
# Act
for line_number, line in enumerate(test_dat_file, start=1):
sut: com_dr_wrkplace_mapper.ComDrWrkplaceMapper = create_ultmarc_table_mapper_sut(line, self.db)
assert type(sut) is com_dr_wrkplace_mapper.ComDrWrkplaceMapper, f'{line_number}行目:マッパークラスが期通りか'
sut.make_query()
sut.execute_queries()
# Assert
# 期待値ファイルを読み込む
expect_dr_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_wrkplace_delete.csv'))
expect_his_data_list = create_db_data_from_csv(path.join(self.test_file_path, 'expect_com_dr_wrkplace_his_delete.csv'))
# 複合主キーのため、1件ずつ取得して期待値を作る
actual_dr_data_list = []
actual_his_data_list = []
actual_dr_select_sql = """\
SELECT * FROM src05.com_dr_wrkplace
WHERE
dcf_dsf_inst_cd = :dcf_dsf_inst_cd
AND dcf_pcf_dr_cd = :dcf_pcf_dr_cd\
"""
actual_his_select_sql = """\
SELECT * FROM src05.com_dr_wrkplace_his
WHERE
dcf_dsf_inst_cd = :dcf_dsf_inst_cd
AND dcf_pcf_dr_cd = :dcf_pcf_dr_cd
"""
# COM_医師勤務先の取得
primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_dr_data_list]
primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_dr_data_list]
for param_dcf_dsf_inst_cd, param_dcf_pcf_dr_cd in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_dcf_pcf_dr_cd):
actual_dr_data = self.db.execute_select(
actual_dr_select_sql,
{**param_dcf_dsf_inst_cd, **param_dcf_pcf_dr_cd})
assert len(actual_dr_data) == 1, '1件取得できていること'
actual_dr_data_list.append(actual_dr_data[0])
# COM_医師勤務先履歴の取得
primary_keys_dcf_dsf_inst_cd = [{'dcf_dsf_inst_cd': columns['dcf_dsf_inst_cd']} for columns in expect_his_data_list]
primary_keys_dcf_pcf_dr_cd = [{'dcf_pcf_dr_cd': columns['dcf_pcf_dr_cd']} for columns in expect_his_data_list]
for param_dcf_dsf_inst_cd, param_dcf_pcf_dr_cd in zip(primary_keys_dcf_dsf_inst_cd, primary_keys_dcf_pcf_dr_cd):
# COM_医師勤務先履歴の取得
actual_his_data = self.db.execute_select(
actual_his_select_sql,
{**param_dcf_dsf_inst_cd, **param_dcf_pcf_dr_cd})
assert len(actual_his_data) == 1, '1件取得できていること'
actual_his_data_list.append(actual_his_data[0])
assert len(actual_dr_data_list) == len(expect_dr_data_list), 'COM_医師勤務先が期待値通りの件数作成されていること'
assert len(actual_his_data_list) == len(expect_his_data_list), 'COM_医師勤務先履歴が期待値通りの件数作成されていること'
# 期待値検査
# COM_医師勤務先
dr_ignore_columns = ['regist_ymd', 'update_ymd', 'sys_update_ymd', 'sys_update_date', 'sys_regist_date']
assert_table_results(actual_dr_data_list, expect_dr_data_list, ignore_col_name=dr_ignore_columns)
# 動的日付項目の個別確認
line_number = 0
for actual_row, expect_row in zip(actual_dr_data_list, expect_dr_data_list):
line_number += 1
for actual_col_name, expect_col_name in zip(actual_row, expect_row):
if actual_col_name in dr_ignore_columns:
if expect_row[expect_col_name] is None:
assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと'
else:
assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること'
# COM_医師勤務先履歴
his_ignore_columns = ['dr_wrkplace_his_key', 'regist_ymd', 'update_ymd', 'sys_update_date', 'sys_regist_date']
assert_table_results(actual_his_data_list, expect_his_data_list, ignore_col_name=his_ignore_columns)
# 動的日付項目の個別確認
line_number = 0
for actual_row, expect_row in zip(actual_dr_data_list, expect_dr_data_list):
line_number += 1
for actual_col_name, expect_col_name in zip(actual_row, expect_row):
if actual_col_name in his_ignore_columns:
if expect_row[expect_col_name] is None:
assert actual_row[actual_col_name] is None, f'{line_number}行目:{actual_col_name}が、登録されていないこと'
else:
assert actual_row[actual_col_name] >= expect_row[expect_col_name], f'{line_number}行目:{actual_col_name}が、期待値以降であること'

View File

@ -1,7 +1,7 @@
"021","001","","A","20141113","20141114","","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
"021","002","1","A","20141113","20141114","電磁波温熱療法(放射線療法と併用しないもの)","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
"021","003","2","A","20141113","20141114","微小銅線による脳血管性病変に対しての電気的凝固治療","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
"021","004","1","C","20141113","20141114","顔面骨、頭蓋骨の観血的移動術","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
"021","005","1","A","20141113","20141114","培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
"021","006","1","A","20141113","20141114","造血器腫瘍のDNA診断","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
"021","007","2","A","20141113","20141114","重症肥満の外科治療法","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
"021","001",,"A","20141113","20141114",
"021","002","1","A","20141113","20141114","電磁波温熱療法(放射線療法と併用しないもの)"
"021","003","2","A","20141113","20141114","微小銅線による脳血管性病変に対しての電気的凝固治療"
"021","004","1","C","20141113","20141114","顔面骨、頭蓋骨の観血的移動術"
"021","005","1","A","20141113","20141114","培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)"
"021","006","1","A","20141113","20141114","造血器腫瘍のDNA診断"
"021","007","2","A","20141113","20141114","重症肥満の外科治療法"
1 021 001 A 20141113 20141114 1 2014/11/21 22:53:44 VANLOAD 2014/11/21 22:53:44
2 021 002 1 A 20141113 20141114 電磁波温熱療法(放射線療法と併用しないもの) 1 2014/11/21 22:53:44 VANLOAD 2014/11/21 22:53:44
3 021 003 2 A 20141113 20141114 微小銅線による脳血管性病変に対しての電気的凝固治療 1 2014/11/21 22:53:44 VANLOAD 2014/11/21 22:53:44
4 021 004 1 C 20141113 20141114 顔面骨、頭蓋骨の観血的移動術 1 2014/11/21 22:53:44 VANLOAD 2014/11/21 22:53:44
5 021 005 1 A 20141113 20141114 培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る) 1 2014/11/21 22:53:44 VANLOAD 2014/11/21 22:53:44
6 021 006 1 A 20141113 20141114 造血器腫瘍のDNA診断 1 2014/11/21 22:53:44 VANLOAD 2014/11/21 22:53:44
7 021 007 2 A 20141113 20141114 重症肥満の外科治療法 1 2014/11/21 22:53:44 VANLOAD 2014/11/21 22:53:44

View File

@ -1,6 +1,6 @@
"021","001","2","A","20141113","20141114","直流電流による骨電気治療法","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
"021","002","1","A","20141113","20141114","電磁波温熱療法(放射線療法と併用しないもの)","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
"021","003","2","A","20141113","20141114","微小銅線による脳血管性病変に対しての電気的凝固治療","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
"021","004","1","A","20141113","20141114","顔面骨、頭蓋骨の観血的移動術","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
"021","005","1","A","20141113","20141114","造血器腫瘍のDNA診断","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
"021","006","1","A","20141113","20141114","培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
"021","001","2","A","20141113","20141114","直流電流による骨電気治療法"
"021","002","1","A","20141113","20141114","電磁波温熱療法(放射線療法と併用しないもの)"
"021","003","2","A","20141113","20141114","微小銅線による脳血管性病変に対しての電気的凝固治療"
"021","004","1","A","20141113","20141114","顔面骨、頭蓋骨の観血的移動術"
"021","005","1","A","20141113","20141114","造血器腫瘍のDNA診断"
"021","006","1","A","20141113","20141114","培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)"
1 021 001 2 A 20141113 20141114 直流電流による骨電気治療法 1 2014/11/21 22:53:44 VANLOAD 2014/11/21 22:53:44
2 021 002 1 A 20141113 20141114 電磁波温熱療法(放射線療法と併用しないもの) 1 2014/11/21 22:53:44 VANLOAD 2014/11/21 22:53:44
3 021 003 2 A 20141113 20141114 微小銅線による脳血管性病変に対しての電気的凝固治療 1 2014/11/21 22:53:44 VANLOAD 2014/11/21 22:53:44
4 021 004 1 A 20141113 20141114 顔面骨、頭蓋骨の観血的移動術 1 2014/11/21 22:53:44 VANLOAD 2014/11/21 22:53:44
5 021 005 1 A 20141113 20141114 造血器腫瘍のDNA診断 1 2014/11/21 22:53:44 VANLOAD 2014/11/21 22:53:44
6 021 006 1 A 20141113 20141114 培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る) 1 2014/11/21 22:53:44 VANLOAD 2014/11/21 22:53:44

View File

@ -1,6 +1,6 @@
"021","001","","B","20141113","20141114","","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
"021","002","1","B","20141113","20141114","電磁波温熱療法(放射線療法と併用しないもの)","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
"021","003","2","B","20141113","20141114","微小銅線による脳血管性病変に対しての電気的凝固治療","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
"021","004","1","B","20141113","20141114","顔面骨、頭蓋骨の観血的移動術","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
"021","005","1","B","20141113","20141114","培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
"021","006","1","B","20141113","20141114","造血器腫瘍のDNA診断","1","2014/11/21 22:53:44","VANLOAD","","","2014/11/21 22:53:44"
"021","001",,"B","20141113","20141114",
"021","002","1","B","20141113","20141114","電磁波温熱療法(放射線療法と併用しないもの)"
"021","003","2","B","20141113","20141114","微小銅線による脳血管性病変に対しての電気的凝固治療"
"021","004","1","B","20141113","20141114","顔面骨、頭蓋骨の観血的移動術"
"021","005","1","B","20141113","20141114","培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る)"
"021","006","1","B","20141113","20141114","造血器腫瘍のDNA診断"
1 021 001 B 20141113 20141114 1 2014/11/21 22:53:44 VANLOAD 2014/11/21 22:53:44
2 021 002 1 B 20141113 20141114 電磁波温熱療法(放射線療法と併用しないもの) 1 2014/11/21 22:53:44 VANLOAD 2014/11/21 22:53:44
3 021 003 2 B 20141113 20141114 微小銅線による脳血管性病変に対しての電気的凝固治療 1 2014/11/21 22:53:44 VANLOAD 2014/11/21 22:53:44
4 021 004 1 B 20141113 20141114 顔面骨、頭蓋骨の観血的移動術 1 2014/11/21 22:53:44 VANLOAD 2014/11/21 22:53:44
5 021 005 1 B 20141113 20141114 培養細胞による先天性代謝異常診断(胎児又は新生児に係るものに限る) 1 2014/11/21 22:53:44 VANLOAD 2014/11/21 22:53:44
6 021 006 1 B 20141113 20141114 造血器腫瘍のDNA診断 1 2014/11/21 22:53:44 VANLOAD 2014/11/21 22:53:44

View File

@ -89,7 +89,7 @@ class TestComHamtecMapper:
COM_高度先進医療テーブルのレコードを更新する
Arranges:
- CSVデータを用意し読み込む
- 追加対象となるレコードを登録する
- 更新対象となるレコードを登録する
Expects:
- 登録内容が期待値と一致すること
"""
@ -146,7 +146,7 @@ class TestComHamtecMapper:
COM_高度先進医療テーブルのレコードを1件論理削除する
Arranges:
- CSVデータを用意し読み込む
- 追加対象となるレコードを登録する
- 削除対象となるレコードを登録する
Expects:
- 登録内容が期待値と一致すること
"""

View File

@ -1,7 +1,5 @@
"""共通テストフィクスチャ"""
from datetime import datetime
import pytest
from src.db.database import Database
@ -11,15 +9,3 @@ from src.db.database import Database
def database() -> Database:
"""データベース接続モジュールを作成"""
return Database.get_instance()
@pytest.fixture
def expect_datetime() -> datetime:
"""テスト実行年月日時分秒を生成"""
return datetime.now().replace(microsecond=0)
@pytest.fixture
def expect_date_str(expect_datetime: datetime) -> str:
"""テスト実行年月日の文字8桁を生成"""
return expect_datetime.strftime('%Y%m%d')

View File

@ -1,9 +1,7 @@
"""テスト用共通処理関数"""
import csv
import io
import tempfile
from datetime import datetime
from types import ModuleType
from src.batch.ultmarc.datfile import DatFile, DatFileLine
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
@ -69,44 +67,6 @@ def create_db_data_from_csv(file_path: str) -> list[dict]:
return rows
def create_ultmarc_test_csv(csv_rows: list[str]) -> DatFile:
"""アルトマーク取込テストのCSVを作成
Args:
csv_rows (tuple[str]): CSV文字列のリスト
Returns:
list[list[str]]: CSVデータ
"""
string_io = io.StringIO()
for csv_row in csv_rows:
string_io.write(csv_row)
string_io.write('\n')
string_io.seek(0)
dat_file = DatFile(string_io)
return dat_file
def create_ultmarc_common_column_names() -> list[str]:
"""アルトマークテーブル共通のカラム名を作成
Returns:
list[str]: 共通カラム名
"""
return [
'regist_ymd',
'update_ymd',
'delete_ymd',
'regist_date',
'create_user',
'update_date',
'update_user',
'sys_regist_date',
'regist_prgm_id',
'sys_update_date',
'update_prgm_id'
]
def create_insert_sql_with_parameter(table_name: str, column_names: list[str], test_data: list[str]) -> tuple[str, dict]:
"""INSERT文と登録値のパラメータを返す
@ -144,41 +104,6 @@ def create_delete_sql_with_parameter(table_name: str, delete_parameter: dict[str
return delete_sql, delete_parameter
def create_ultmarc_common_column_values(**kwargs) -> list:
"""アルトマークテーブル共通のカラムを作成
Args:
kwargs 有効なキー一覧
regist_ymd (str): 登録年月日
update_ymd (str): 更新年月日
delete_ymd (str): 削除年月日
regist_date (datetime): 登録日時
create_user (str): 登録者
update_date (datetime): 更新日時
update_user (str): 更新者
sys_regist_date (datetime): システム登録日時
regist_prgm_id (str): 登録プログラムid
sys_update_date (datetime): システム更新日時
update_prgm_id (str): 更新プログラムid
Returns:
list: 共通カラム値
"""
return [
kwargs.get('regist_ymd'), # 登録年月日(regist_ymd)
kwargs.get('update_ymd'), # 更新年月日(update_ymd)
kwargs.get('delete_ymd'), # 削除年月日(delete_ymd)
kwargs.get('regist_date'), # 登録日時(regist_date)
kwargs.get('create_user'), # 登録者(create_user)
kwargs.get('update_date'), # 更新日時(update_date)
kwargs.get('update_user'), # 更新者(update_user)
kwargs.get('sys_regist_date'), # システム登録日時(sys_regist_date)
kwargs.get('regist_prgm_id'), # 登録プログラムid(regist_prgm_id)
kwargs.get('sys_update_date'), # システム更新日時(sys_update_date)
kwargs.get('update_prgm_id') # 更新プログラムid(update_prgm_id)
]
def create_ultmarc_table_mapper_sut(line: DatFileLine, db: Database) -> UltmarcTableMapper:
"""アルトマークテーブルマッパーのインスタンスを返す
@ -190,11 +115,9 @@ def create_ultmarc_table_mapper_sut(line: DatFileLine, db: Database) -> UltmarcT
UltmarcTableMapper: マッパークラス
"""
layout_class = line.layout_class
record_id = line.record_id
factory = UltmarcTableMapperFactory()
sut = factory.create(
layout_class=layout_class,
record_id=record_id,
records=line.records,
db=db
)
@ -202,18 +125,6 @@ def create_ultmarc_table_mapper_sut(line: DatFileLine, db: Database) -> UltmarcT
return sut
def get_module_name(module: ModuleType) -> str:
"""登録プログラムID、更新プログラムIDに登録するモジュール名を作成
Args:
module (ModuleType): pythonモジュール
Returns:
str: モジュール名
"""
return module.__name__.split('.')[-1]
def is_valid_date_format(date_str: str, date_format):
"""日付文字列が、与えられたフォーマットにマッチするかを検査する
@ -237,6 +148,7 @@ def assert_table_results(actual_rows: list[dict], expect_rows: list[dict], ignor
Args:
actual_rows (list[dict]): テスト結果の辞書リスト
expect_rows (list[dict]): 期待値の辞書リスト
ignore_col_name (list): 比較を無視するDBのカラム名. Default None.
"""
# 取得件数が一致すること
assert len(actual_rows) == len(expect_rows)

View File

@ -6,7 +6,7 @@ CRLF
1
12
対象期間,クラスターコード,クラスター名,都道府県コード,都道府県名,施設コード,施設名,更新日,更新事由,適用年月,セグメントコード,セグメント名
data_period,cluster_code,cluster_name,pref_code,pref_name,HCO_coce,HCO_name,update_date,update_remarks,master_YM,segment_code,segment_name
data_period,cluster_code,cluster_name,pref_code,pref_name,HCO_code,HCO_name,update_date,update_remarks,master_YM,segment_code,segment_name
src01.en_clufm_clumst
org01.en_clufm_clumst
CLUFM_CLUMST_ex.sql