Merge pull request #320 develop into master

This commit is contained in:
下田雅人 2023-12-07 15:20:47 +09:00
commit 360258fcf4
849 changed files with 46844 additions and 1 deletions

View File

@ -0,0 +1,12 @@
tests/*
.coverage
.env
.env.example
.report/*
.vscode/*
.pytest_cache/*
*/__pychache__/*
Dockerfile
pytest.ini
README.md
*.sql

View File

@ -0,0 +1,26 @@
DB_HOST=************
DB_PORT=************
DB_USERNAME=************
DB_PASSWORD=************
DB_SCHEMA=src05
LOG_LEVEL=INFO
ULTMARC_DATA_BUCKET=****************
ULTMARC_DATA_FOLDER=recv
JSKULT_BACKUP_BUCKET=****************
ULTMARC_BACKUP_FOLDER=ultmarc
VJSK_BACKUP_FOLDER=vjsk
JSKULT_CONFIG_BUCKET=**********************
JSKULT_CONFIG_CALENDAR_FOLDER=jskult/calendar
JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME=jskult_holiday_list.txt
VJSK_DATA_SEND_FOLDER=send
VJSK_DATA_RECEIVE_FOLDER=recv
VJSK_DATA_BUCKET=*************
JSKULT_CONFIG_CALENDAR_WHOLESALER_STOCK_FILE_NAME=jskult_wholesaler_stock_input_day_list.txt
JSKULT_CONFIG_CONVERT_FOLDER=jskult/convert
JSKULT_ULTMARC_HEX_CONVERT_CONFIG_FILE_NAME=ultmarc_hex_convert_config.json
# 連携データ抽出期間
SALES_LAUNDERING_EXTRACT_DATE_PERIOD=0
# 洗替対象テーブル名
SALES_LAUNDERING_TARGET_TABLE_NAME=src05.sales_lau
# 卸実績洗替で作成するデータの期間(年単位)
SALES_LAUNDERING_TARGET_YEAR_OFFSET=5

10
ecs/jskult-batch-daily/.gitignore vendored Normal file
View File

@ -0,0 +1,10 @@
.vscode/settings.json
.env
# python
__pycache__
# python test
.pytest_cache
.coverage
.report/

View File

@ -0,0 +1,16 @@
{
// IntelliSense 使
//
// : https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(DEBUG)jskult batch daily",
"type": "python",
"request": "launch",
"program": "entrypoint.py",
"console": "integratedTerminal",
"justMyCode": true
}
]
}

View File

@ -0,0 +1,31 @@
{
"[python]": {
"editor.defaultFormatter": null,
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.organizeImports": true
}
},
//
"python.defaultInterpreterPath": "<pythonインタプリターのパス>",
"python.linting.lintOnSave": true,
"python.linting.enabled": true,
"python.linting.pylintEnabled": false,
"python.linting.flake8Enabled": true,
"python.linting.flake8Args": [
"--max-line-length=200",
"--ignore=F541"
],
"python.formatting.provider": "autopep8",
"python.formatting.autopep8Path": "autopep8",
"python.formatting.autopep8Args": [
"--max-line-length", "200",
"--ignore=F541"
],
"python.testing.pytestArgs": [
"tests/batch/"
],
"python.testing.unittestEnabled": false,
"python.testing.pytestEnabled": true
}

View File

@ -0,0 +1,20 @@
FROM python:3.9
ENV TZ="Asia/Tokyo"
WORKDIR /usr/src/app
COPY Pipfile Pipfile.lock ./
RUN \
apt update -y && \
# パッケージのセキュリティアップデートのみを適用するコマンド
apt install -y unattended-upgrades && \
unattended-upgrades && \
pip install --upgrade pip wheel setuptools && \
pip install pipenv --no-cache-dir && \
pipenv install --system --deploy && \
pip uninstall -y pipenv virtualenv-clone virtualenv
COPY src ./src
COPY entrypoint.py entrypoint.py
CMD ["python", "entrypoint.py"]

View File

@ -0,0 +1,29 @@
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[scripts]
"test:ultmarc" = "pytest tests/batch/ultmarc/"
"test:ultmarc:cov" = "pytest --cov=src/batch/ultmarc/ --cov-branch --cov-report=term-missing tests/batch/ultmarc/"
"test:vjsk" = "pytest tests/batch/vjsk/"
"test:vjsk:cov" = "pytest --cov=src/batch/vjsk/ --cov-branch --cov-report=term-missing tests/batch/vjsk/"
[packages]
boto3 = "*"
PyMySQL = "*"
sqlalchemy = "*"
tenacity = "*"
[dev-packages]
autopep8 = "*"
flake8 = "*"
pytest = "*"
pytest-cov = "*"
boto3 = "*"
[requires]
python_version = "3.9"
[pipenv]
allow_prereleases = true

433
ecs/jskult-batch-daily/Pipfile.lock generated Normal file
View File

@ -0,0 +1,433 @@
{
"_meta": {
"hash": {
"sha256": "df8b09869c6ad0daff24cf808bac56f528d8ae5835fe70a50d58c2bed724e717"
},
"pipfile-spec": 6,
"requires": {
"python_version": "3.9"
},
"sources": [
{
"name": "pypi",
"url": "https://pypi.org/simple",
"verify_ssl": true
}
]
},
"default": {
"boto3": {
"hashes": [
"sha256:ae1352d0193aaf90c47d6e57ab054b0b1fabf0fbbe9f51eefec431bf2c3e18f4",
"sha256:bb8ecd6f86289ceaed566eefc0ce8ac66a85e5954aef115ed4ac602cbe61f101"
],
"index": "pypi",
"version": "==1.28.82"
},
"botocore": {
"hashes": [
"sha256:5f213229348433d0b7b6aac2d9ae2fdd15c4ff9f38c30ea072f5b300bf6c1dcb",
"sha256:9d7d8de1789b1ed37b86a2b0a4fcff9fac91deef0548461d411e1626f68ca70c"
],
"markers": "python_version >= '3.7'",
"version": "==1.31.82"
},
"greenlet": {
"hashes": [
"sha256:0a02d259510b3630f330c86557331a3b0e0c79dac3d166e449a39363beaae174",
"sha256:0b6f9f8ca7093fd4433472fd99b5650f8a26dcd8ba410e14094c1e44cd3ceddd",
"sha256:100f78a29707ca1525ea47388cec8a049405147719f47ebf3895e7509c6446aa",
"sha256:1757936efea16e3f03db20efd0cd50a1c86b06734f9f7338a90c4ba85ec2ad5a",
"sha256:19075157a10055759066854a973b3d1325d964d498a805bb68a1f9af4aaef8ec",
"sha256:19bbdf1cce0346ef7341705d71e2ecf6f41a35c311137f29b8a2dc2341374565",
"sha256:20107edf7c2c3644c67c12205dc60b1bb11d26b2610b276f97d666110d1b511d",
"sha256:22f79120a24aeeae2b4471c711dcf4f8c736a2bb2fabad2a67ac9a55ea72523c",
"sha256:2847e5d7beedb8d614186962c3d774d40d3374d580d2cbdab7f184580a39d234",
"sha256:28e89e232c7593d33cac35425b58950789962011cc274aa43ef8865f2e11f46d",
"sha256:329c5a2e5a0ee942f2992c5e3ff40be03e75f745f48847f118a3cfece7a28546",
"sha256:337322096d92808f76ad26061a8f5fccb22b0809bea39212cd6c406f6a7060d2",
"sha256:3fcc780ae8edbb1d050d920ab44790201f027d59fdbd21362340a85c79066a74",
"sha256:41bdeeb552d814bcd7fb52172b304898a35818107cc8778b5101423c9017b3de",
"sha256:4eddd98afc726f8aee1948858aed9e6feeb1758889dfd869072d4465973f6bfd",
"sha256:52e93b28db27ae7d208748f45d2db8a7b6a380e0d703f099c949d0f0d80b70e9",
"sha256:55d62807f1c5a1682075c62436702aaba941daa316e9161e4b6ccebbbf38bda3",
"sha256:5805e71e5b570d490938d55552f5a9e10f477c19400c38bf1d5190d760691846",
"sha256:599daf06ea59bfedbec564b1692b0166a0045f32b6f0933b0dd4df59a854caf2",
"sha256:60d5772e8195f4e9ebf74046a9121bbb90090f6550f81d8956a05387ba139353",
"sha256:696d8e7d82398e810f2b3622b24e87906763b6ebfd90e361e88eb85b0e554dc8",
"sha256:6e6061bf1e9565c29002e3c601cf68569c450be7fc3f7336671af7ddb4657166",
"sha256:80ac992f25d10aaebe1ee15df45ca0d7571d0f70b645c08ec68733fb7a020206",
"sha256:816bd9488a94cba78d93e1abb58000e8266fa9cc2aa9ccdd6eb0696acb24005b",
"sha256:85d2b77e7c9382f004b41d9c72c85537fac834fb141b0296942d52bf03fe4a3d",
"sha256:87c8ceb0cf8a5a51b8008b643844b7f4a8264a2c13fcbcd8a8316161725383fe",
"sha256:89ee2e967bd7ff85d84a2de09df10e021c9b38c7d91dead95b406ed6350c6997",
"sha256:8bef097455dea90ffe855286926ae02d8faa335ed8e4067326257cb571fc1445",
"sha256:8d11ebbd679e927593978aa44c10fc2092bc454b7d13fdc958d3e9d508aba7d0",
"sha256:91e6c7db42638dc45cf2e13c73be16bf83179f7859b07cfc139518941320be96",
"sha256:97e7ac860d64e2dcba5c5944cfc8fa9ea185cd84061c623536154d5a89237884",
"sha256:990066bff27c4fcf3b69382b86f4c99b3652bab2a7e685d968cd4d0cfc6f67c6",
"sha256:9fbc5b8f3dfe24784cee8ce0be3da2d8a79e46a276593db6868382d9c50d97b1",
"sha256:ac4a39d1abae48184d420aa8e5e63efd1b75c8444dd95daa3e03f6c6310e9619",
"sha256:b2c02d2ad98116e914d4f3155ffc905fd0c025d901ead3f6ed07385e19122c94",
"sha256:b2d3337dcfaa99698aa2377c81c9ca72fcd89c07e7eb62ece3f23a3fe89b2ce4",
"sha256:b489c36d1327868d207002391f662a1d163bdc8daf10ab2e5f6e41b9b96de3b1",
"sha256:b641161c302efbb860ae6b081f406839a8b7d5573f20a455539823802c655f63",
"sha256:b8ba29306c5de7717b5761b9ea74f9c72b9e2b834e24aa984da99cbfc70157fd",
"sha256:b9934adbd0f6e476f0ecff3c94626529f344f57b38c9a541f87098710b18af0a",
"sha256:ce85c43ae54845272f6f9cd8320d034d7a946e9773c693b27d620edec825e376",
"sha256:cf868e08690cb89360eebc73ba4be7fb461cfbc6168dd88e2fbbe6f31812cd57",
"sha256:d2905ce1df400360463c772b55d8e2518d0e488a87cdea13dd2c71dcb2a1fa16",
"sha256:d57e20ba591727da0c230ab2c3f200ac9d6d333860d85348816e1dca4cc4792e",
"sha256:d6a8c9d4f8692917a3dc7eb25a6fb337bff86909febe2f793ec1928cd97bedfc",
"sha256:d923ff276f1c1f9680d32832f8d6c040fe9306cbfb5d161b0911e9634be9ef0a",
"sha256:daa7197b43c707462f06d2c693ffdbb5991cbb8b80b5b984007de431493a319c",
"sha256:dbd4c177afb8a8d9ba348d925b0b67246147af806f0b104af4d24f144d461cd5",
"sha256:dc4d815b794fd8868c4d67602692c21bf5293a75e4b607bb92a11e821e2b859a",
"sha256:e9d21aaa84557d64209af04ff48e0ad5e28c5cca67ce43444e939579d085da72",
"sha256:ea6b8aa9e08eea388c5f7a276fabb1d4b6b9d6e4ceb12cc477c3d352001768a9",
"sha256:eabe7090db68c981fca689299c2d116400b553f4b713266b130cfc9e2aa9c5a9",
"sha256:f2f6d303f3dee132b322a14cd8765287b8f86cdc10d2cb6a6fae234ea488888e",
"sha256:f33f3258aae89da191c6ebaa3bc517c6c4cbc9b9f689e5d8452f7aedbb913fa8",
"sha256:f7bfb769f7efa0eefcd039dd19d843a4fbfbac52f1878b1da2ed5793ec9b1a65",
"sha256:f89e21afe925fcfa655965ca8ea10f24773a1791400989ff32f467badfe4a064",
"sha256:fa24255ae3c0ab67e613556375a4341af04a084bd58764731972bcbc8baeba36"
],
"markers": "platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))",
"version": "==3.0.1"
},
"jmespath": {
"hashes": [
"sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980",
"sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"
],
"markers": "python_version >= '3.7'",
"version": "==1.0.1"
},
"pymysql": {
"hashes": [
"sha256:4f13a7df8bf36a51e81dd9f3605fede45a4878fe02f9236349fd82a3f0612f96",
"sha256:8969ec6d763c856f7073c4c64662882675702efcb114b4bcbb955aea3a069fa7"
],
"index": "pypi",
"version": "==1.1.0"
},
"python-dateutil": {
"hashes": [
"sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86",
"sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
"version": "==2.8.2"
},
"s3transfer": {
"hashes": [
"sha256:10d6923c6359175f264811ef4bf6161a3156ce8e350e705396a7557d6293c33a",
"sha256:fd3889a66f5fe17299fe75b82eae6cf722554edca744ca5d5fe308b104883d2e"
],
"markers": "python_version >= '3.7'",
"version": "==0.7.0"
},
"six": {
"hashes": [
"sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",
"sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
"version": "==1.16.0"
},
"sqlalchemy": {
"hashes": [
"sha256:0666031df46b9badba9bed00092a1ffa3aa063a5e68fa244acd9f08070e936d3",
"sha256:0a8c6aa506893e25a04233bc721c6b6cf844bafd7250535abb56cb6cc1368884",
"sha256:0e680527245895aba86afbd5bef6c316831c02aa988d1aad83c47ffe92655e74",
"sha256:14aebfe28b99f24f8a4c1346c48bc3d63705b1f919a24c27471136d2f219f02d",
"sha256:1e018aba8363adb0599e745af245306cb8c46b9ad0a6fc0a86745b6ff7d940fc",
"sha256:227135ef1e48165f37590b8bfc44ed7ff4c074bf04dc8d6f8e7f1c14a94aa6ca",
"sha256:31952bbc527d633b9479f5f81e8b9dfada00b91d6baba021a869095f1a97006d",
"sha256:3e983fa42164577d073778d06d2cc5d020322425a509a08119bdcee70ad856bf",
"sha256:42d0b0290a8fb0165ea2c2781ae66e95cca6e27a2fbe1016ff8db3112ac1e846",
"sha256:42ede90148b73fe4ab4a089f3126b2cfae8cfefc955c8174d697bb46210c8306",
"sha256:4895a63e2c271ffc7a81ea424b94060f7b3b03b4ea0cd58ab5bb676ed02f4221",
"sha256:4af79c06825e2836de21439cb2a6ce22b2ca129bad74f359bddd173f39582bf5",
"sha256:5f94aeb99f43729960638e7468d4688f6efccb837a858b34574e01143cf11f89",
"sha256:616fe7bcff0a05098f64b4478b78ec2dfa03225c23734d83d6c169eb41a93e55",
"sha256:62d9e964870ea5ade4bc870ac4004c456efe75fb50404c03c5fd61f8bc669a72",
"sha256:638c2c0b6b4661a4fd264f6fb804eccd392745c5887f9317feb64bb7cb03b3ea",
"sha256:63bfc3acc970776036f6d1d0e65faa7473be9f3135d37a463c5eba5efcdb24c8",
"sha256:6463aa765cf02b9247e38b35853923edbf2f6fd1963df88706bc1d02410a5577",
"sha256:64ac935a90bc479fee77f9463f298943b0e60005fe5de2aa654d9cdef46c54df",
"sha256:683ef58ca8eea4747737a1c35c11372ffeb84578d3aab8f3e10b1d13d66f2bc4",
"sha256:75eefe09e98043cff2fb8af9796e20747ae870c903dc61d41b0c2e55128f958d",
"sha256:787af80107fb691934a01889ca8f82a44adedbf5ef3d6ad7d0f0b9ac557e0c34",
"sha256:7c424983ab447dab126c39d3ce3be5bee95700783204a72549c3dceffe0fc8f4",
"sha256:7e0dc9031baa46ad0dd5a269cb7a92a73284d1309228be1d5935dac8fb3cae24",
"sha256:87a3d6b53c39cd173990de2f5f4b83431d534a74f0e2f88bd16eabb5667e65c6",
"sha256:89a01238fcb9a8af118eaad3ffcc5dedaacbd429dc6fdc43fe430d3a941ff965",
"sha256:9585b646ffb048c0250acc7dad92536591ffe35dba624bb8fd9b471e25212a35",
"sha256:964971b52daab357d2c0875825e36584d58f536e920f2968df8d581054eada4b",
"sha256:967c0b71156f793e6662dd839da54f884631755275ed71f1539c95bbada9aaab",
"sha256:9ca922f305d67605668e93991aaf2c12239c78207bca3b891cd51a4515c72e22",
"sha256:a86cb7063e2c9fb8e774f77fbf8475516d270a3e989da55fa05d08089d77f8c4",
"sha256:aeb397de65a0a62f14c257f36a726945a7f7bb60253462e8602d9b97b5cbe204",
"sha256:b41f5d65b54cdf4934ecede2f41b9c60c9f785620416e8e6c48349ab18643855",
"sha256:bd45a5b6c68357578263d74daab6ff9439517f87da63442d244f9f23df56138d",
"sha256:c14eba45983d2f48f7546bb32b47937ee2cafae353646295f0e99f35b14286ab",
"sha256:c1bda93cbbe4aa2aa0aa8655c5aeda505cd219ff3e8da91d1d329e143e4aff69",
"sha256:c4722f3bc3c1c2fcc3702dbe0016ba31148dd6efcd2a2fd33c1b4897c6a19693",
"sha256:c80c38bd2ea35b97cbf7c21aeb129dcbebbf344ee01a7141016ab7b851464f8e",
"sha256:cabafc7837b6cec61c0e1e5c6d14ef250b675fa9c3060ed8a7e38653bd732ff8",
"sha256:cc1d21576f958c42d9aec68eba5c1a7d715e5fc07825a629015fe8e3b0657fb0",
"sha256:d0f7fb0c7527c41fa6fcae2be537ac137f636a41b4c5a4c58914541e2f436b45",
"sha256:d4041ad05b35f1f4da481f6b811b4af2f29e83af253bf37c3c4582b2c68934ab",
"sha256:d5578e6863eeb998980c212a39106ea139bdc0b3f73291b96e27c929c90cd8e1",
"sha256:e3b5036aa326dc2df50cba3c958e29b291a80f604b1afa4c8ce73e78e1c9f01d",
"sha256:e599a51acf3cc4d31d1a0cf248d8f8d863b6386d2b6782c5074427ebb7803bda",
"sha256:f3420d00d2cb42432c1d0e44540ae83185ccbbc67a6054dcc8ab5387add6620b",
"sha256:f48ed89dd11c3c586f45e9eec1e437b355b3b6f6884ea4a4c3111a3358fd0c18",
"sha256:f508ba8f89e0a5ecdfd3761f82dda2a3d7b678a626967608f4273e0dba8f07ac",
"sha256:fd54601ef9cc455a0c61e5245f690c8a3ad67ddb03d3b91c361d076def0b4c60"
],
"index": "pypi",
"version": "==2.0.23"
},
"tenacity": {
"hashes": [
"sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a",
"sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c"
],
"index": "pypi",
"version": "==8.2.3"
},
"typing-extensions": {
"hashes": [
"sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0",
"sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"
],
"markers": "python_version >= '3.8'",
"version": "==4.8.0"
},
"urllib3": {
"hashes": [
"sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07",
"sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0"
],
"markers": "python_version < '3.10'",
"version": "==1.26.18"
}
},
"develop": {
"autopep8": {
"hashes": [
"sha256:067959ca4a07b24dbd5345efa8325f5f58da4298dab0dde0443d5ed765de80cb",
"sha256:2913064abd97b3419d1cc83ea71f042cb821f87e45b9c88cad5ad3c4ea87fe0c"
],
"index": "pypi",
"version": "==2.0.4"
},
"boto3": {
"hashes": [
"sha256:ae1352d0193aaf90c47d6e57ab054b0b1fabf0fbbe9f51eefec431bf2c3e18f4",
"sha256:bb8ecd6f86289ceaed566eefc0ce8ac66a85e5954aef115ed4ac602cbe61f101"
],
"index": "pypi",
"version": "==1.28.82"
},
"botocore": {
"hashes": [
"sha256:5f213229348433d0b7b6aac2d9ae2fdd15c4ff9f38c30ea072f5b300bf6c1dcb",
"sha256:9d7d8de1789b1ed37b86a2b0a4fcff9fac91deef0548461d411e1626f68ca70c"
],
"markers": "python_version >= '3.7'",
"version": "==1.31.82"
},
"coverage": {
"extras": [
"toml"
],
"hashes": [
"sha256:0cbf38419fb1a347aaf63481c00f0bdc86889d9fbf3f25109cf96c26b403fda1",
"sha256:12d15ab5833a997716d76f2ac1e4b4d536814fc213c85ca72756c19e5a6b3d63",
"sha256:149de1d2401ae4655c436a3dced6dd153f4c3309f599c3d4bd97ab172eaf02d9",
"sha256:1981f785239e4e39e6444c63a98da3a1db8e971cb9ceb50a945ba6296b43f312",
"sha256:2443cbda35df0d35dcfb9bf8f3c02c57c1d6111169e3c85fc1fcc05e0c9f39a3",
"sha256:289fe43bf45a575e3ab10b26d7b6f2ddb9ee2dba447499f5401cfb5ecb8196bb",
"sha256:2f11cc3c967a09d3695d2a6f03fb3e6236622b93be7a4b5dc09166a861be6d25",
"sha256:307adb8bd3abe389a471e649038a71b4eb13bfd6b7dd9a129fa856f5c695cf92",
"sha256:310b3bb9c91ea66d59c53fa4989f57d2436e08f18fb2f421a1b0b6b8cc7fffda",
"sha256:315a989e861031334d7bee1f9113c8770472db2ac484e5b8c3173428360a9148",
"sha256:3a4006916aa6fee7cd38db3bfc95aa9c54ebb4ffbfc47c677c8bba949ceba0a6",
"sha256:3c7bba973ebee5e56fe9251300c00f1579652587a9f4a5ed8404b15a0471f216",
"sha256:4175e10cc8dda0265653e8714b3174430b07c1dca8957f4966cbd6c2b1b8065a",
"sha256:43668cabd5ca8258f5954f27a3aaf78757e6acf13c17604d89648ecc0cc66640",
"sha256:4cbae1051ab791debecc4a5dcc4a1ff45fc27b91b9aee165c8a27514dd160836",
"sha256:5c913b556a116b8d5f6ef834038ba983834d887d82187c8f73dec21049abd65c",
"sha256:5f7363d3b6a1119ef05015959ca24a9afc0ea8a02c687fe7e2d557705375c01f",
"sha256:630b13e3036e13c7adc480ca42fa7afc2a5d938081d28e20903cf7fd687872e2",
"sha256:72c0cfa5250f483181e677ebc97133ea1ab3eb68645e494775deb6a7f6f83901",
"sha256:7dbc3ed60e8659bc59b6b304b43ff9c3ed858da2839c78b804973f613d3e92ed",
"sha256:88ed2c30a49ea81ea3b7f172e0269c182a44c236eb394718f976239892c0a27a",
"sha256:89a937174104339e3a3ffcf9f446c00e3a806c28b1841c63edb2b369310fd074",
"sha256:9028a3871280110d6e1aa2df1afd5ef003bab5fb1ef421d6dc748ae1c8ef2ebc",
"sha256:99b89d9f76070237975b315b3d5f4d6956ae354a4c92ac2388a5695516e47c84",
"sha256:9f805d62aec8eb92bab5b61c0f07329275b6f41c97d80e847b03eb894f38d083",
"sha256:a889ae02f43aa45032afe364c8ae84ad3c54828c2faa44f3bfcafecb5c96b02f",
"sha256:aa72dbaf2c2068404b9870d93436e6d23addd8bbe9295f49cbca83f6e278179c",
"sha256:ac8c802fa29843a72d32ec56d0ca792ad15a302b28ca6203389afe21f8fa062c",
"sha256:ae97af89f0fbf373400970c0a21eef5aa941ffeed90aee43650b81f7d7f47637",
"sha256:af3d828d2c1cbae52d34bdbb22fcd94d1ce715d95f1a012354a75e5913f1bda2",
"sha256:b4275802d16882cf9c8b3d057a0839acb07ee9379fa2749eca54efbce1535b82",
"sha256:b4767da59464bb593c07afceaddea61b154136300881844768037fd5e859353f",
"sha256:b631c92dfe601adf8f5ebc7fc13ced6bb6e9609b19d9a8cd59fa47c4186ad1ce",
"sha256:be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef",
"sha256:beaa5c1b4777f03fc63dfd2a6bd820f73f036bfb10e925fce067b00a340d0f3f",
"sha256:c0ba320de3fb8c6ec16e0be17ee1d3d69adcda99406c43c0409cb5c41788a611",
"sha256:c9eacf273e885b02a0273bb3a2170f30e2d53a6d53b72dbe02d6701b5296101c",
"sha256:cb536f0dcd14149425996821a168f6e269d7dcd2c273a8bff8201e79f5104e76",
"sha256:d1bc430677773397f64a5c88cb522ea43175ff16f8bfcc89d467d974cb2274f9",
"sha256:d1c88ec1a7ff4ebca0219f5b1ef863451d828cccf889c173e1253aa84b1e07ce",
"sha256:d3d9df4051c4a7d13036524b66ecf7a7537d14c18a384043f30a303b146164e9",
"sha256:d51ac2a26f71da1b57f2dc81d0e108b6ab177e7d30e774db90675467c847bbdf",
"sha256:d872145f3a3231a5f20fd48500274d7df222e291d90baa2026cc5152b7ce86bf",
"sha256:d8f17966e861ff97305e0801134e69db33b143bbfb36436efb9cfff6ec7b2fd9",
"sha256:dbc1b46b92186cc8074fee9d9fbb97a9dd06c6cbbef391c2f59d80eabdf0faa6",
"sha256:e10c39c0452bf6e694511c901426d6b5ac005acc0f78ff265dbe36bf81f808a2",
"sha256:e267e9e2b574a176ddb983399dec325a80dbe161f1a32715c780b5d14b5f583a",
"sha256:f47d39359e2c3779c5331fc740cf4bce6d9d680a7b4b4ead97056a0ae07cb49a",
"sha256:f6e9589bd04d0461a417562649522575d8752904d35c12907d8c9dfeba588faf",
"sha256:f94b734214ea6a36fe16e96a70d941af80ff3bfd716c141300d95ebc85339738",
"sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a",
"sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4"
],
"markers": "python_version >= '3.8'",
"version": "==7.3.2"
},
"exceptiongroup": {
"hashes": [
"sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9",
"sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"
],
"markers": "python_version < '3.11'",
"version": "==1.1.3"
},
"flake8": {
"hashes": [
"sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23",
"sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5"
],
"index": "pypi",
"version": "==6.1.0"
},
"iniconfig": {
"hashes": [
"sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3",
"sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"
],
"markers": "python_version >= '3.7'",
"version": "==2.0.0"
},
"jmespath": {
"hashes": [
"sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980",
"sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"
],
"markers": "python_version >= '3.7'",
"version": "==1.0.1"
},
"mccabe": {
"hashes": [
"sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325",
"sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"
],
"markers": "python_version >= '3.6'",
"version": "==0.7.0"
},
"packaging": {
"hashes": [
"sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5",
"sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"
],
"markers": "python_version >= '3.7'",
"version": "==23.2"
},
"pluggy": {
"hashes": [
"sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12",
"sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"
],
"markers": "python_version >= '3.8'",
"version": "==1.3.0"
},
"pycodestyle": {
"hashes": [
"sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f",
"sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"
],
"markers": "python_version >= '3.8'",
"version": "==2.11.1"
},
"pyflakes": {
"hashes": [
"sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774",
"sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc"
],
"markers": "python_version >= '3.8'",
"version": "==3.1.0"
},
"pytest": {
"hashes": [
"sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac",
"sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5"
],
"index": "pypi",
"version": "==7.4.3"
},
"pytest-cov": {
"hashes": [
"sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6",
"sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"
],
"index": "pypi",
"version": "==4.1.0"
},
"python-dateutil": {
"hashes": [
"sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86",
"sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
"version": "==2.8.2"
},
"s3transfer": {
"hashes": [
"sha256:10d6923c6359175f264811ef4bf6161a3156ce8e350e705396a7557d6293c33a",
"sha256:fd3889a66f5fe17299fe75b82eae6cf722554edca744ca5d5fe308b104883d2e"
],
"markers": "python_version >= '3.7'",
"version": "==0.7.0"
},
"six": {
"hashes": [
"sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",
"sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
"version": "==1.16.0"
},
"tomli": {
"hashes": [
"sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc",
"sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"
],
"markers": "python_version < '3.11'",
"version": "==2.0.1"
},
"urllib3": {
"hashes": [
"sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07",
"sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0"
],
"markers": "python_version < '3.10'",
"version": "==1.26.18"
}
}
}

View File

@ -0,0 +1,292 @@
# 実消化&アルトマーク 日次バッチ
## 概要
実消化&アルトマークの日次バッチ処理。
## 環境情報
- Python 3.9
- MySQL 8.23
- VSCode
## 環境構築
- Python の構築
- 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 設定を使用すると便利
- 「crm-table-to-ddl」フォルダ内で以下のコマンドを実行すると
- `docker-compose up -d`
- 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 コマンドを使用して復元する
- `mysql -h <ホスト名> -P <ポート> -u <ユーザー名> -p src05 < src05_dump.sql`
- 環境変数の設定
- 「.env.example」ファイルをコピーし、「.env」ファイルを作成する
- 環境変数を設定する。設定内容は PRJ メンバーより共有を受けてください
- VSCode の設定
- 「.vscode/recommended_settings.json」ファイルをコピーし、「settings.json」ファイルを作成する
- 「python.defaultInterpreterPath」を、Python の構築手順で作成した仮想環境のパスに変更する
## 実行
- 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 フォルダ配下のユニットテストを実行し、テストカバレッジを取得する(C0, C1) |
### テスト共通関数の仕様
- 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に指定したカラムは、呼び出し元のテストコード内で個別に突き合わせする
## 単体テスト(実消化データ取込処理)
実消化データは、単体テストコードを使用してテスト自動化を行う
### テスト準備
※単体テスト(アルトマーク取込処理)と同じ
### テスト用のサブコマンド一覧
- `pipenv run`のあとに、サブコマンドとしてユーザー定義スクリプトを実行できる
- `Pipfile`内の「scripts」セクションに宣言されている
| コマンド | 概要 |
| ---------------- | -------------------------------------------------------------------------------------------- |
| test:vjsk | tests/batch/vjsk フォルダ配下のユニットテストを実行する |
| test:vjsk:cov | tests/batch/vjsk フォルダ配下のユニットテストを実行し、テストカバレッジを取得する(C0, C1) |
### テスト共通関数の仕様
- tests/testing_vjsk_utility.py内の共通関数の仕様について記載する
#### create_vjsk_assertion_list
- 概要
- DB登録期待値リストを作成する
- Args:
- file_path (str): DB登録期待値ファイル(tsvファイル)のパス
- memo: ※DB登録期待値ファイルの前提
- memo: 受領データファイルと同じ
- memo: BOM付きtsv形式
- memo: 一行目はカラム名になっているヘッダ行
- Returns:
- List(dict) DB登録期待値辞書リスト
## フォルダ構成
```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 -- テーブルマッパーのマッピング処理を行う具象クラス(全テーブル分)
│ │ │ │ ├── com_alma_mapper.py
│ │ │ │ ├── ...
│ │ │ │ └── null_mapper.py -- テスト用、空振りするマッパークラス
│ │ │ └── ultmarc_table_mapper.py -- テーブルへの登録処理を行う抽象クラス
│ │ ├── tables -- アルトマークデータのDTOクラス(全テーブル分)
│ │ │ ├── com_alma.py
│ │ │ ├── ...
│ │ │ └── ultmarc_table.py -- アルトマークテーブルの抽象クラス
│ │ └── ultmarc_table_mapper_factory.py -- テーブルマッパー生成クラス
│ ├── db
│ │ └── database.py -- データベース操作共通処理
│ ├── error
│ │ └── exceptions.py -- カスタム例外
│ ├── jobctrl_daily.py -- 日次バッチ処理のエントリーポイント。「entrypoint.py」 から呼ばれる。
│ ├── logging
│ │ └── get_logger.py -- ログ出力の共通処理
│ ├── system_var
│ │ └── environment.py -- 環境変数
│ └── time
│ └── 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で用意する。
│ │ ...
│ └─vjsk -- 実消化データ取込処理関連のユニットテストを格納する
│ │
│ ├─vjsk_file_check -- 受領ファイルチェック処理関連のユニットテストを格納する
│ │ ├─conftest.py -- テスト内で共通利用できるフィクスチャの宣言
│ │ └─test_vjsk_file_check.py -- テストクラス本体
│ │
│ └─vjsk_load -- 受領データ登録処理関連のユニットテストを格納する
│ │ conftest.py -- テスト内で共通利用できるフィクスチャの宣言
│ │ test_vjsk_load.py -- テストクラス本体
│ │
│ └─testdata -- テストモジュールが使用するテストデータを格納する
│ │ bio_slip_data_202304280000.tsv -- 正常ケースの単体確認用
│ │ ... -- *20230428* は新規4件の登録確認用
│ │ whs_mst_202304290000.tsv -- *20230429* は更新2件+追加新規2件の登録確認用
│ │
│ ├─NoData -- 正常ケースの単体確認用
│ │ bio_slip_data_nodatarecord.tsv -- ヘッダ行のみでデータが0件の動作確認用
│ │ ...
│ │ whs_mst_nodatarecord.tsv
│ │
│ ├─TestFormatErrorFile -- 異常ケースの単体確認用
│ │ bio_slip_data_formaterror.tsv -- 末尾行のタブ数が想定と異なる(ファイル欠落がある)ときの動作確認用
│ │ ...
│ │ whs_mst_formaterror.tsv
│ │
│ ├─TestImportFileToDb -- 正常ケースの単体確認用
│ │ bio_slip_data_202304270000.gz -- 対向元システムから送られてきた状態(gz圧縮)の受領データファイルの動作確認用
│ │ ...
│ │ whs_mst_202304270000.gz
│ │
│ └─UnzipError -- 異常ケースの単体確認用
│ bio_slip_data_202304270000.gz -- gz圧縮ファイルが解凍できないときの動作確認用
│ ...
│ whs_mst_202304270000.gz
├── conftest.py -- テスト内で共通利用できるフィクスチャを宣言する(執筆時点ではDBのみ)
├── testing_utility.py -- テストの共通関数
└── testing_vjsk_utility.py -- テストの共通関数(実消化データ取込処理関連)
```

View File

@ -0,0 +1,10 @@
"""実消化&アルトマーク 日次バッチのエントリーポイント"""
from src import jobctrl_daily
if __name__ == '__main__':
try:
exit(jobctrl_daily.exec())
except Exception:
# エラーが起きても、正常系のコードで返す。
# エラーが起きた事実はbatch_process内でログを出す。
exit(0)

View File

@ -0,0 +1,3 @@
[pytest]
log_format = %(levelname)s %(asctime)s %(message)s
log_date_format = %Y-%m-%d %H:%M:%S

View File

View File

@ -0,0 +1,185 @@
import gzip
import os
import os.path as path
import shutil
import tempfile
import boto3
from src.system_var import environment
class S3Client:
__s3_client = boto3.client('s3')
_bucket_name: str
def list_objects(self, bucket_name: str, folder_name: str):
response = self.__s3_client.list_objects_v2(Bucket=bucket_name, Prefix=folder_name)
if response['KeyCount'] == 0:
return []
contents = response['Contents']
# 末尾がスラッシュで終わるものはフォルダとみなしてスキップする
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,
Key=file_key,
Fileobj=file
)
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
)
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
class UltmarcBucket(S3Bucket):
_bucket_name = environment.ULTMARC_DATA_BUCKET
_folder = environment.ULTMARC_DATA_FOLDER
def list_dat_file(self):
return self._s3_client.list_objects(self._bucket_name, self._folder)
def download_dat_file(self, dat_filename: str):
# 一時ファイルとして保存する
temporary_dir = tempfile.mkdtemp()
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, dat_filename, f)
f.seek(0)
return temporary_file_path
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}/{dat_file_key.replace(f"{self._folder}/", "")}'
self._s3_client.copy(self._bucket_name, dat_file_key, ultmarc_backup_bucket._bucket_name, backup_key)
# コピー元のファイルを削除
self._s3_client.delete_file(self._bucket_name, dat_file_key)
class ConfigBucket(S3Bucket):
_bucket_name = environment.JSKULT_CONFIG_BUCKET
def download_holiday_list(self):
# 一時ファイルとして保存する
temporary_dir = tempfile.mkdtemp()
temporary_file_path = path.join(temporary_dir, environment.JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME)
holiday_list_key = f'{environment.JSKULT_CONFIG_CALENDAR_FOLDER}/{environment.JSKULT_CONFIG_CALENDAR_HOLIDAY_LIST_FILE_NAME}'
with open(temporary_file_path, mode='wb') as f:
self._s3_client.download_file(self._bucket_name, holiday_list_key, f)
f.seek(0)
return temporary_file_path
def download_wholesaler_stock_input_day_list(self):
# 一時ファイルとして保存する
temporary_dir = tempfile.mkdtemp()
temporary_file_path = path.join(temporary_dir, environment.JSKULT_CONFIG_CALENDAR_WHOLESALER_STOCK_FILE_NAME)
wholesaler_stock_input_day_list_key = f'{environment.JSKULT_CONFIG_CALENDAR_FOLDER}/{environment.JSKULT_CONFIG_CALENDAR_WHOLESALER_STOCK_FILE_NAME}'
with open(temporary_file_path, mode='wb') as f:
self._s3_client.download_file(self._bucket_name, wholesaler_stock_input_day_list_key, f)
f.seek(0)
return temporary_file_path
def download_ultmarc_hex_convert_config(self):
# 一時ファイルとして保存する
temporary_dir = tempfile.mkdtemp()
temporary_file_path = path.join(temporary_dir, environment.JSKULT_ULTMARC_HEX_CONVERT_CONFIG_FILE_NAME)
hex_convert_config_key = f'{environment.JSKULT_CONFIG_CONVERT_FOLDER}/{environment.JSKULT_ULTMARC_HEX_CONVERT_CONFIG_FILE_NAME}'
with open(temporary_file_path, mode='wb') as f:
self._s3_client.download_file(self._bucket_name, hex_convert_config_key, f)
f.seek(0)
return temporary_file_path
class JskUltBackupBucket(S3Bucket):
_bucket_name = environment.JSKULT_BACKUP_BUCKET
class UltmarcBackupBucket(JskUltBackupBucket):
_folder = environment.ULTMARC_BACKUP_FOLDER
class VjskBackupBucket(JskUltBackupBucket):
_folder = environment.VJSK_BACKUP_FOLDER
class VjskReceiveBucket(S3Bucket):
_bucket_name = environment.VJSK_DATA_BUCKET
_recv_folder = environment.VJSK_DATA_RECEIVE_FOLDER
_s3_file_list = None
def get_s3_file_list(self):
self._s3_file_list = self._s3_client.list_objects(self._bucket_name, self._recv_folder)
return self._s3_file_list
def download_data_file(self, data_filename: str):
temporary_dir = tempfile.mkdtemp()
temporary_file_path = path.join(temporary_dir, f'{data_filename.replace(f"{self._recv_folder}/", "")}')
with open(temporary_file_path, mode='wb') as f:
self._s3_client.download_file(self._bucket_name, data_filename, f)
f.seek(0)
return temporary_file_path
def unzip_data_file(self, filename: str):
temp_dir = os.path.dirname(filename)
decompress_filename = os.path.basename(filename).replace('.gz', '')
decompress_file_path = os.path.join(temp_dir, decompress_filename)
with gzip.open(filename, 'rb') as gz:
with open(decompress_file_path, 'wb') as decompressed_file:
shutil.copyfileobj(gz, decompressed_file)
ret = [decompress_file_path]
return ret
def backup_dat_file(self, target_files: list, datetime_key: str):
jskult_backup_bucket = VjskBackupBucket()
for target_file in target_files:
backup_from_file_path = target_file.get("filename")
backup_to_filename = backup_from_file_path.replace(f"{self._recv_folder}/", "")
backup_key = f'{jskult_backup_bucket._folder}/{datetime_key}/{backup_to_filename}'
self._s3_client.copy(self._bucket_name, backup_from_file_path,
jskult_backup_bucket._bucket_name, backup_key)
self._s3_client.delete_file(self._bucket_name, backup_from_file_path)
class VjskSendBucket(S3Bucket):
_bucket_name = environment.VJSK_DATA_BUCKET
_send_folder = environment.VJSK_DATA_SEND_FOLDER
def upload_inst_pharm_csv_file(self, vjsk_create_csv: str, csv_file_path: str):
# S3バケットにファイルを移動
csv_file_name = f'{self._send_folder}/{vjsk_create_csv}'
s3_client = S3Client()
s3_client.upload_file(csv_file_path, self._bucket_name, csv_file_name)
return
def backup_inst_pharm_csv_file(self, dat_file_key: str, datetime_key: str):
# バックアップバケットにコピー
vjsk_backup_bucket = VjskBackupBucket()
dat_key = f'{self._send_folder}/{dat_file_key}'
backup_key = f'{vjsk_backup_bucket._folder}/{self._send_folder}/{datetime_key}/{dat_file_key.replace(f"{self._send_folder}/", "")}'
self._s3_client.copy(self._bucket_name, dat_key, vjsk_backup_bucket._bucket_name, backup_key)

View File

@ -0,0 +1,111 @@
"""バッチ処理の共通関数"""
import logging
import textwrap
from datetime import datetime
from src.db.database import Database
from src.error.exceptions import BatchOperationException, DBException
from src.system_var import constants
def get_batch_statuses() -> tuple[str, str, str]:
"""日付テーブルから、以下を取得して返す。
- 日次バッチ処理中フラグ
- dump取得状況区分
- 処理日YYYY/MM/DD
Raises:
BatchOperationException: 日付テーブルが取得できないとき何らかのエラーが発生したとき
Returns:
tuple[str, str]: [0]日次バッチ処理中フラグdump取得状況区分
"""
db = Database.get_instance()
sql = 'SELECT bch_actf, dump_sts_kbn, src05.get_syor_date() AS syor_date FROM src05.hdke_tbl'
try:
db.connect()
hdke_tbl_result = db.execute_select(sql)
except DBException as e:
raise BatchOperationException(e)
finally:
db.disconnect()
if len(hdke_tbl_result) == 0:
raise BatchOperationException('日付テーブルが取得できませんでした')
# 必ず1件取れる
hdke_tbl_record = hdke_tbl_result[0]
batch_processing_flag = hdke_tbl_record['bch_actf']
dump_status_kbn = hdke_tbl_record['dump_sts_kbn']
syor_date = hdke_tbl_record['syor_date']
# 処理日を文字列に変換する
syor_date_str = datetime.strftime(syor_date, '%Y/%m/%d')
return batch_processing_flag, dump_status_kbn, syor_date_str
def update_batch_processing_flag_in_processing() -> None:
"""バッチ処理中フラグを処理中に更新する
Raises:
BatchOperationException: DB操作の何らかのエラー
"""
db = Database.get_instance()
sql = """\
UPDATE src05.hdke_tbl
SET
bch_actf = :in_processing,
updater = CURRENT_USER(),
update_date = NOW()
"""
try:
db.connect()
db.to_jst()
db.execute(sql, {'in_processing': constants.BATCH_ACTF_BATCH_IN_PROCESSING})
except DBException as e:
raise BatchOperationException(e)
finally:
db.disconnect()
return
def update_batch_process_complete() -> None:
"""バッチ処理を完了とし、処理日、バッチ処理中フラグ、dump処理状態区分を更新する
Raises:
BatchOperationException: DB操作の何らかのエラー
"""
db = Database.get_instance()
sql = """\
UPDATE src05.hdke_tbl
SET
bch_actf = :batch_complete,
dump_sts_kbn = :dump_unprocessed,
syor_date = DATE_FORMAT((src05.get_syor_date() + interval 1 day), '%Y%m%d'), -- +1
updater = CURRENT_USER(),
update_date = NOW()
"""
try:
db.connect()
db.to_jst()
db.execute(sql, {
'batch_complete': constants.BATCH_ACTF_BATCH_UNPROCESSED,
'dump_unprocessed': constants.DUMP_STATUS_KBN_UNPROCESSED
})
except DBException as e:
raise BatchOperationException(e)
finally:
db.disconnect()
return
def logging_sql(logger: logging.Logger, sql: str) -> None:
"""SQL文をデバッグログで出力する
Args:
logger (logging.Logger): ロガー
sql (str): SQL文
"""
logger.debug(f'\n{"-" * 15}\n{textwrap.dedent(sql)[1:-1]}\n{"-" * 15}')

View File

@ -0,0 +1,398 @@
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('生物由来卸販売ロット分解')
def exec():
"""生物由来卸販売ロット分解"""
logger.debug('生物由来卸販売ロット分解処理開始')
# 営業日ではない場合、処理をスキップする
if batch_context.is_not_business_day:
logger.info('営業日ではないため、生物由来卸販売ロット分解処理をスキップします。')
return
db = Database.get_instance()
try:
db.connect()
db.begin()
# 生物由来ロット分解データの未確定データを削除する
_delete_not_confirm_data_in_bio_sales_lot(db)
# 生物由来ロット分解データを作成する
_insert_bio_sales_lot(db)
# 生物由来ロット分解データの不要レコードを削除する
_delete_empty_lot_record(db)
# MDB変換マスタビュー生物由来ロット分解処理用、メルク施設マスタから施設情報を生物由来ロット分解データにセットする
_set_inst_info_from_mdb_or_mst_inst(db)
# V製品マスタから製品情報を生物由来ロット分解データにセットする
_set_prd_info_from_v_prd_mst(db)
# 製造ロット管理番号マスタから有効期限を生物由来ロット分解データにセットする
_set_expr_dt_from_lot_num_mst(db)
db.commit()
logger.debug('生物由来卸販売ロット分解処理終了')
return
except Exception as e:
db.rollback()
raise BatchOperationException(e)
finally:
db.disconnect()
def _delete_not_confirm_data_in_bio_sales_lot(db: Database):
logger.debug('生物由来ロット分解データの未確定データ削除開始')
try:
elapsed_time = ElapsedTime()
sql = """
DELETE lot FROM src05.bio_sales_lot AS lot
INNER JOIN src05.bio_sales AS bio
ON bio.slip_mgt_num = lot.slip_mgt_num
AND DATE(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):
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 '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
WHEN bio.bef_slip_mgt_num IS NOT NULL THEN bio.ins_dt
ELSE NULL
END AS ins_dt,
CASE
WHEN bio.bef_slip_mgt_num IS NOT 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 '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 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 DATE(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):
logger.debug('生物由来ロット分解データの製造番号が空のレコードを削除開始')
try:
elapsed_time = ElapsedTime()
sql = """
DELETE FROM src05.bio_sales_lot lot
WHERE
-- 空白15桁のデータはロット情報が空とみなして削除する
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):
logger.debug('MDB変換マスタビュー生物由来ロット分解処理用、メルク施設マスタから施設情報を生物由来ロット分解データにセット開始')
try:
elapsed_time = ElapsedTime()
sql = """
UPDATE
src05.bio_sales_lot bio
LEFT OUTER JOIN internal05.view_mdb_cnv_mst mdb
ON bio.v_inst_cd = mdb.hco_vid_v
LEFT OUTER JOIN src05.mst_inst inst
ON bio.v_inst_cd = inst.inst_cd
SET
-- 施設コード
bio.inst_cd = (
CASE
WHEN mdb.mdb_cd IS NOT NULL THEN mdb.mdb_cd
ELSE bio.v_inst_cd
END
),
-- 正式施設名漢字
bio.inst_name_form = (
CASE
WHEN mdb.mdb_cd IS NOT NULL THEN mdb.inst_name_form
ELSE inst.inst_name_form
END
),
-- 施設住所
bio.address = (
CASE
WHEN mdb.mdb_cd IS NOT NULL THEN mdb.address
ELSE inst.address
END
),
-- 施設電話番号
bio.tel_num = (
CASE
WHEN mdb.mdb_cd IS NOT NULL THEN mdb.tel_num
ELSE inst.tel_num
END
)
"""
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):
logger.debug('V製品マスタから製品情報を生物由来ロット分解データにセット開始')
try:
elapsed_time = ElapsedTime()
sql = """
UPDATE
src05.bio_sales_lot bio
LEFT OUTER JOIN src05.phm_prd_mst_v prd
ON 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'
SET
bio.mkr_inf_1 = prd.mkr_inf_1,
bio.mkr_cd = prd.mkr_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('V製品マスタから製品情報を生物由来ロット分解データにセットに失敗')
raise e
logger.debug('V製品マスタから製品情報を生物由来ロット分解データにセットに成功')
def _set_expr_dt_from_lot_num_mst(db: Database):
# 製造ロット管理番号マスタから有効期限をセット
logger.debug('製造ロット管理番号マスタから有効期限をセット開始')
try:
elapsed_time = ElapsedTime()
sql = """
UPDATE
src05.bio_sales_lot bio
LEFT OUTER JOIN src05.lot_num_mst lot
ON bio.mkr_cd = lot.ser_num
AND bio.rec_lot_num = lot.lot_num
SET
bio.expr_dt = lot.expr_dt
"""
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('製造ロット管理番号マスタから有効期限をセットに成功')

View File

@ -0,0 +1,48 @@
class BatchContext:
__instance = None
__syor_date: str # 処理日(yyyy/mm/dd形式)
__is_not_business_day: bool # 日次バッチ起動日フラグ
__is_ultmarc_imported: bool # アルトマーク取込実施済フラグ
__is_vjsk_stock_import_day: bool # 卸在庫データ取込対象フラグ
def __init__(self) -> None:
self.__is_not_business_day = False
self.__is_ultmarc_imported = False
@classmethod
def get_instance(cls):
if cls.__instance is None:
cls.__instance = cls()
return cls.__instance
@property
def syor_date(self):
return self.__syor_date
@syor_date.setter
def syor_date(self, syor_date_str: str):
self.__syor_date = syor_date_str
@property
def is_not_business_day(self):
return self.__is_not_business_day
@is_not_business_day.setter
def is_not_business_day(self, flag: bool):
self.__is_not_business_day = flag
@property
def is_ultmarc_imported(self):
return self.__is_ultmarc_imported
@is_ultmarc_imported.setter
def is_ultmarc_imported(self, flag: bool):
self.__is_ultmarc_imported = flag
@property
def is_vjsk_stock_import_day(self):
return self.__is_vjsk_stock_import_day
@is_vjsk_stock_import_day.setter
def is_vjsk_stock_import_day(self, flag: bool):
self.__is_vjsk_stock_import_day = flag

View File

@ -0,0 +1,32 @@
from src.system_var import constants
class CalendarFile:
"""カレンダーファイル"""
__calendar_file_lines: list[str]
def __init__(self, calendar_file_path):
with open(calendar_file_path) as f:
self.__calendar_file_lines: list[str] = f.readlines()
def compare_date(self, date_str: str) -> bool:
"""与えられた日付がカレンダーファイル内に含まれているかどうか
カレンダーファイル内の日付はyyyy/mm/ddで書かれている前提
コメント#)が含まれている行は無視される
Args:
date_str (str): yyyy/mm/dd文字列
Returns:
bool: 含まれていればTrue
"""
for calendar_date in self.__calendar_file_lines:
# コメント行が含まれている場合はスキップ
if constants.CALENDAR_COMMENT_SYMBOL in calendar_date:
continue
if date_str in calendar_date:
return True
return False

View File

@ -0,0 +1,167 @@
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('DCF施設統合マスタ作成')
def exec():
"""DCF施設統合マスタ作成"""
# アルトマーク取込が行われていない場合は処理をスキップする
if not batch_context.is_ultmarc_imported:
logger.info('アルトマーク取込が行われていないため、DCF施設統合マスタ作成処理をスキップします。')
return
db = Database.get_instance()
try:
db.connect()
db.to_jst()
db.begin()
logger.debug('DCF施設統合マスタ作成処理開始')
# COM施設からDCF施設統合マスタに登録
(is_add_dcf_inst_merge, duplication_inst_records) = _insert_dcf_inst_merge_from_com_inst(db)
db.commit()
# DCF施設統合マスタ追加のログを出力する
if is_add_dcf_inst_merge:
logger.info('[NOTICE]DCF施設統合マスタが追加されました。')
_output_add_dcf_inst_merge_log(duplication_inst_records)
logger.debug('DCF施設統合マスタ作成処理終了')
except Exception as e:
db.rollback()
raise BatchOperationException(e)
finally:
db.disconnect()
def _insert_dcf_inst_merge_from_com_inst(db: Database) -> tuple[bool, list[dict]]:
# com_instからdcf_inst_mergeにinsert
# 重複コードがあるデータを取得する(処理日~システム日付を対象)
try:
sql = """
SELECT
ci.dcf_dsf_inst_cd AS dcf_dsf_inst_cd,
ci.form_inst_name_kanji AS form_inst_name_kanji,
ci.dup_opp_cd AS dup_opp_cd,
(
SELECT
dupci.form_inst_name_kanji
FROM
src05.com_inst AS dupci
WHERE
dupci.dcf_dsf_inst_cd = ci.dup_opp_cd
) AS dup_inst_name_kanji,
DATE_FORMAT((src05.get_syor_date() + INTERVAL 1 MONTH), '%Y%m') AS sys_update_date
FROM
src05.com_inst AS ci
WHERE
CHAR_LENGTH(ci.dup_opp_cd) > 0
AND ci.delete_sche_reason_cd = 'D'
AND ci.abolish_ymd IS NULL
AND ci.sys_update_date BETWEEN src05.get_syor_date() AND SYSDATE()
AND NOT EXISTS (
SELECT
dim.dcf_inst_cd
FROM
src05.dcf_inst_merge AS dim
WHERE
dim.dcf_inst_cd = ci.dcf_dsf_inst_cd
)
AND (
EXISTS (
SELECT
eci.inst_cd
FROM
src05.emp_chg_inst AS eci
WHERE
eci.inst_cd = ci.dcf_dsf_inst_cd
)
OR (
SELECT
sl.inst_cd
FROM
src05.sales_lau AS sl
WHERE
sl.inst_cd = ci.dcf_dsf_inst_cd
)
)
"""
duplication_inst_records = db.execute_select(sql)
logging_sql(logger, sql)
logger.info('施設統合対象データの取得に成功')
except Exception as e:
logger.debug('施設統合対象データの取得に失敗')
raise e
if len(duplication_inst_records) == 0:
logger.info('施設統合対象データはありません')
return (False, None)
# DCF施設統合マスタ追加
values_clauses = []
params = {}
for clauses_no, row in enumerate(duplication_inst_records, start=1):
dcf_inst_cd_arr = f'dcf_inst_cd{clauses_no}'
dup_opp_cd_arr = f'dup_opp_cd{clauses_no}'
tekiyo_month_arr = f'tekiyo_month{clauses_no}'
values_clause = f'(:{dcf_inst_cd_arr}, :{dup_opp_cd_arr}, :{tekiyo_month_arr}, "Y", CURRENT_USER(), SYSDATE(), CURRENT_USER(), SYSDATE())'
values_clauses.append(values_clause)
params[dcf_inst_cd_arr] = row['dcf_dsf_inst_cd']
params[dup_opp_cd_arr] = row['dup_opp_cd']
params[tekiyo_month_arr] = row['sys_update_date']
insert_sql = f"""
INSERT INTO
src05.dcf_inst_merge (
dcf_inst_cd,
dup_opp_cd,
tekiyo_month,
enabled_flg,
creater,
create_date,
updater,
update_date
) VALUES
{','.join(values_clauses)}
"""
try:
elapsed_time = ElapsedTime()
res = db.execute(insert_sql, params)
logging_sql(logger, insert_sql)
logger.info(f'COM施設からDCF施設統合マスタに登録成功, {res.rowcount} 行更新 ({elapsed_time.of})')
except Exception as e:
logger.debug('COM施設からDCF施設統合マスタの登録に失敗')
raise e
return (True, duplication_inst_records)
def _output_add_dcf_inst_merge_log(duplication_inst_records: list[dict]):
sys_update_date = duplication_inst_records[0]['sys_update_date']
set_year_month = '{set_year}{set_month}'.format(
set_year=sys_update_date[0:4],
set_month=sys_update_date[-2:]
)
add_dct_inst_merge = 'DCF施設コード {dcf_dsf_inst_cd} {form_inst_name_kanji},  重複時相手先コード {dup_opp_cd} {dup_inst_name_kanji}'
add_dct_inst_merge_list = []
for row in duplication_inst_records:
add_dct_inst_merge_list.append(add_dct_inst_merge.format(**row))
add_dct_inst_merge_list = '\n'.join(add_dct_inst_merge_list)
# 顧客報告用にログ出力
logger.info(
f"""DCF施設統合マスタが追加されました。
**********************************************************
適用月度 {set_year_month}
**********************************************************
{add_dct_inst_merge_list}
**********************************************************
合計 {len(duplication_inst_records)}"""
)
return

View File

@ -0,0 +1,648 @@
from datetime import datetime, timedelta
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('DCF施設統合マスタ日次更新')
def exec():
db = Database.get_instance()
try:
db.connect()
db.to_jst()
db.begin()
logger.debug('DCF施設統合マスタ日次更新処理開始')
# DCF施設統合マスタ移行先コードのセット(無効フラグが『0(有効)』)
enabled_dst_inst_merge_records = _set_enabled_dct_inst_merge(db)
# DCF施設統合マスタ移行先コードのセット(無効フラグが『1(無効)』)
_set_disabled_dct_inst_merge(db)
# DCF施設統合マスタに無効フラグが『0(有効)』データが存在する場合
if len(enabled_dst_inst_merge_records) > 0:
_add_emp_chg_inst(db, enabled_dst_inst_merge_records)
_add_ult_ident_presc(db, enabled_dst_inst_merge_records)
db.commit()
logger.debug('DCF施設統合マスタ日次更新処理終了')
except Exception as e:
db.rollback()
raise BatchOperationException(e)
finally:
db.disconnect()
def _set_enabled_dct_inst_merge(db: Database) -> list[dict]:
# データ取得無効フラグが『0(有効)』)
enabled_dst_inst_merge_records = _select_dct_inst_merge(db, 0)
# 移行先DCF施設コードの更新無効フラグが『0(有効)』)
if _update_dcf_inst_merge(db, 0) > 0:
# DCF施設統合マスタの過去分の洗い替え
for row in enabled_dst_inst_merge_records:
_update_dcf_inst_cd_new(db, row['dup_opp_cd'], row['dcf_inst_cd'], '')
return enabled_dst_inst_merge_records
def _set_disabled_dct_inst_merge(db: Database):
# データ取得無効フラグが『1(無効)』)
disabled_dst_inst_merge_records = _select_dct_inst_merge(db, 1)
# 移行先DCF施設コードの更新無効フラグが『1(無効)』)
if _update_dcf_inst_merge(db, 1) > 0:
# DCF施設統合マスタの過去分の洗い替え
for row in disabled_dst_inst_merge_records:
_update_dcf_inst_cd_new(db, row['dcf_inst_cd'], row['dup_opp_cd'], '戻し')
def _select_ult_ident_presc_dcf_inst_cd(db: Database, dcf_inst_cd: str) -> list[dict]:
# 納入先処方元マスタから、DCF施設コードに対応したレコードの取得
try:
sql = """
SELECT
ta_cd,
ult_ident_cd,
ratio
FROM
src05.ult_ident_presc
WHERE
presc_cd = :dcf_inst_cd
AND (SELECT ht.syor_date FROM src05.hdke_tbl AS ht) < end_date
"""
params = {'dcf_inst_cd': dcf_inst_cd}
ult_ident_presc_ta_cd_records = db.execute_select(sql, params)
logging_sql(logger, sql)
logger.info('納入先処方元マスタからDCF施設コードに対応したレコードの取得に成功')
except Exception as e:
logger.debug('納入先処方元マスタからDCF施設コードに対応したレコードの取得に失敗')
raise e
return ult_ident_presc_ta_cd_records
def _add_ult_ident_presc(db: Database, enabled_dst_inst_merge_records: list[dict]):
# 納入先処方元マスタの追加
logger.info('納入先処方元マスタの登録 開始')
for data_inst_cnt, enabled_merge_record in enumerate(enabled_dst_inst_merge_records, start=1):
tekiyo_month_first_day = _get_first_day_of_month(enabled_merge_record['tekiyo_month'])
ult_ident_presc_source_records = _select_ult_ident_presc_dcf_inst_cd(db, enabled_merge_record['dcf_inst_cd'])
for ult_ident_presc_source_record in ult_ident_presc_source_records:
ult_ident_presc_records = _select_ult_ident_presc(db,
enabled_merge_record['dcf_inst_cd'],
enabled_merge_record['dup_opp_cd'],
ult_ident_presc_source_record)
for data_cnt, ult_ident_presc_row in enumerate(ult_ident_presc_records, start=1):
logger.info(f'{data_inst_cnt}件目の移行施設の{data_cnt}レコード目処理 開始')
# 処方元コード=重複時相手先コードが発生した場合
if ult_ident_presc_row['opp_count'] > 0:
continue
start_date = _str_to_date_time(ult_ident_presc_row['start_date'])
set_start_date = start_date \
if start_date > tekiyo_month_first_day else tekiyo_month_first_day
set_start_date = _date_time_to_str(set_start_date)
is_exists_duplicate_key = False
if _count_duplicate_ult_ident_presc(db, set_start_date, ult_ident_presc_row) > 0:
_delete_ult_ident_presc(db, set_start_date, ult_ident_presc_row,
'納入先処方元マスタの重複予定データの削除')
is_exists_duplicate_key = True
else:
logger.info('納入先処方元マスタの重複予定データなし')
_insert_ult_ident_presc(db, set_start_date, enabled_merge_record['dup_opp_cd'], ult_ident_presc_row)
# 重複予定データが存在しない、且つ、適用終了日 ≧ 適用開始日の場合
if not is_exists_duplicate_key and _str_to_date_time(ult_ident_presc_row['end_date']) >= start_date:
last_end_date = tekiyo_month_first_day - timedelta(days=1)
# 適用終了日を、DCF施設統合マスタの適用月度の前月末日で更新
_update_ult_ident_presc_end_date(db, _date_time_to_str(last_end_date), ult_ident_presc_row)
logger.info('納入先処方元マスタの登録 終了')
def _select_emp_chg_inst_ta_cd(db: Database, dcf_inst_cd: str) -> list[dict]:
# 従業員担当施設マスタから、DCF施設コードに対応した領域コードの取得
try:
sql = """
SELECT
ta_cd
FROM
src05.emp_chg_inst
WHERE
inst_cd = :dcf_inst_cd
AND enabled_flg = 'Y'
AND (SELECT ht.syor_date FROM src05.hdke_tbl AS ht) < end_date
"""
params = {'dcf_inst_cd': dcf_inst_cd}
emp_chg_inst_ta_cd_records = db.execute_select(sql, params)
logging_sql(logger, sql)
logger.info('従業員担当施設マスタから領域コードの取得に成功')
except Exception as e:
logger.debug('従業員担当施設マスタから領域コードの取得に失敗')
raise e
return emp_chg_inst_ta_cd_records
def _add_emp_chg_inst(db: Database, enabled_dst_inst_merge_records: list[dict]):
# 従業員担当施設マスタの登録
logger.info('従業員担当施設マスタの登録 開始')
for enabled_merge_record in enabled_dst_inst_merge_records:
tekiyo_month_first_day = _get_first_day_of_month(enabled_merge_record['tekiyo_month'])
emp_chg_inst_ta_cd_records = _select_emp_chg_inst_ta_cd(db, enabled_merge_record['dcf_inst_cd'])
for emp_chg_inst_ta_cd_record in emp_chg_inst_ta_cd_records:
emp_chg_inst_records = _select_emp_chg_inst(db, enabled_merge_record['dcf_inst_cd'], enabled_merge_record['dup_opp_cd'],
emp_chg_inst_ta_cd_record['ta_cd'])
for emp_chg_inst_row in emp_chg_inst_records:
# 重複時相手先コードが存在したかのチェック
if emp_chg_inst_row['opp_count'] > 0:
continue
start_date = _str_to_date_time(emp_chg_inst_row['start_date'])
set_start_date = start_date \
if start_date > tekiyo_month_first_day else tekiyo_month_first_day
_insert_emp_chg_inst(db, enabled_merge_record['dup_opp_cd'], _date_time_to_str(set_start_date),
emp_chg_inst_row)
# 適用開始日 < DCF施設統合マスタの適用月度の1日の場合
if start_date < tekiyo_month_first_day:
# DCF施設統合マスタの適用月度の前月末日で、適用終了日を更新する
last_end_date = tekiyo_month_first_day - timedelta(days=1)
_update_emp_chg_inst_end_date(db, enabled_merge_record['dcf_inst_cd'], _date_time_to_str(last_end_date),
emp_chg_inst_row)
continue
# 適用開始日 ≧ DCF施設統合マスタの適用月度の1日の場合、N(論理削除レコード)に設定する
_update_emp_chg_inst_disabled(db, enabled_merge_record['dcf_inst_cd'], emp_chg_inst_row['ta_cd'],
emp_chg_inst_row['start_date'])
logger.info('従業員担当施設マスタの登録 終了')
def _delete_ult_ident_presc(db: Database, start_date: str, ult_ident_presc_row: dict,
log_message: str):
# ult_ident_prescのDelete
try:
elapsed_time = ElapsedTime()
sql = """
DELETE FROM
src05.ult_ident_presc
WHERE
ta_cd = :ta_cd
AND ult_ident_cd = :ult_ident_cd
AND ratio = :ratio
AND start_date = :start_date
"""
params = {
'ta_cd': ult_ident_presc_row['ta_cd'],
'ult_ident_cd': ult_ident_presc_row['ult_ident_cd'],
'ratio': ult_ident_presc_row['ratio'],
'start_date': start_date
}
res = db.execute(sql, params)
logging_sql(logger, sql)
logger.info(f'{log_message} 成功, {res.rowcount} 行更新 ({elapsed_time.of})')
except Exception as e:
logger.debug(f'{log_message} 失敗')
raise e
def _update_emp_chg_inst_disabled(db: Database, dcf_inst_cd: str, ta_cd: str, start_date: str):
# emp_chg_instをUPDATE
try:
elapsed_time = ElapsedTime()
sql = """
UPDATE
src05.emp_chg_inst
SET
enabled_flg = 'N',
updater = CURRENT_USER(),
update_date = SYSDATE()
WHERE
inst_cd = :dcf_inst_cd
AND ta_cd = :ta_cd
AND start_date = :start_date
"""
params = {'dcf_inst_cd': dcf_inst_cd, 'ta_cd': ta_cd, 'start_date': start_date}
res = db.execute(sql, params)
logging_sql(logger, sql)
logger.info(f'従業員担当施設マスタのYorNフラグ更新に成功, {res.rowcount} 行更新 ({elapsed_time.of})')
except Exception as e:
logger.debug('従業員担当施設マスタのYorNフラグ更新に失敗')
raise e
def _update_emp_chg_inst_end_date(db: Database, dcf_inst_cd: str, last_end_date: str,
emp_chg_inst_row: dict):
# emp_chg_instをUPDATE
try:
elapsed_time = ElapsedTime()
sql = """
UPDATE
src05.emp_chg_inst
SET end_date = :end_date,
updater = CURRENT_USER(),
update_date = SYSDATE()
WHERE
inst_cd = :dcf_inst_cd
AND ta_cd = :ta_cd
AND emp_cd = :emp_cd
AND bu_cd = :bu_cd
AND start_date = :start_date
"""
params = {
'end_date': last_end_date,
'dcf_inst_cd': dcf_inst_cd,
'ta_cd': emp_chg_inst_row['ta_cd'],
'emp_cd': emp_chg_inst_row['emp_cd'],
'bu_cd': emp_chg_inst_row['bu_cd'],
'start_date': emp_chg_inst_row['start_date']
}
res = db.execute(sql, params)
logging_sql(logger, sql)
logger.info(f'従業員担当施設マスタの適用終了日更新 成功, {res.rowcount} 行更新 ({elapsed_time.of})')
except Exception as e:
logger.debug('従業員担当施設マスタの適用終了日更新 失敗')
raise e
def _insert_emp_chg_inst(db: Database, dup_opp_cd: str, set_start_date: str,
emp_chg_inst_row: dict):
# emp_chg_instにINSERT
try:
elapsed_time = ElapsedTime()
sql = """
INSERT INTO
src05.emp_chg_inst(
inst_cd,
ta_cd,
emp_cd,
bu_cd,
start_date,
end_date,
main_chg_flg,
enabled_flg,
creater,
create_date,
updater,
update_date
)
VALUES(
:dup_opp_cd,
:ta_cd,
:emp_cd,
:bu_cd,
:start_date,
:end_date,
:main_chg_flg,
'Y',
CURRENT_USER(),
SYSDATE(),
CURRENT_USER(),
SYSDATE()
)
"""
params = {
'dup_opp_cd': dup_opp_cd,
'ta_cd': emp_chg_inst_row['ta_cd'],
'emp_cd': emp_chg_inst_row['emp_cd'],
'bu_cd': emp_chg_inst_row['bu_cd'],
'start_date': set_start_date,
'end_date': emp_chg_inst_row['end_date'],
'main_chg_flg': None
if emp_chg_inst_row['main_chg_flg'] is None else emp_chg_inst_row['main_chg_flg']
}
res = db.execute(sql, params)
logging_sql(logger, sql)
logger.info(f'従業員担当施設マスタの追加に成功, {res.rowcount} 行更新 ({elapsed_time.of})')
except Exception as e:
logger.debug('従業員担当施設マスタの追加に失敗')
raise e
def _select_dct_inst_merge(db: Database, muko_flg: int) -> list[dict]:
# dcf_inst_mergeからSELECT
# 無効フラグがOFFのときは、移行先DCF施設コードが設定されてないデータを抽出する。
# ONのときは、移行先DCF施設コードが設定されているデータを抽出する。
try:
sql = """
SELECT
dim.dcf_inst_cd,
dim.dup_opp_cd,
dim.tekiyo_month
FROM
src05.dcf_inst_merge AS dim
INNER JOIN
src05.hdke_tbl AS ht
ON dim.tekiyo_month = DATE_FORMAT(ht.syor_date, '%Y%m')
WHERE
dim.muko_flg = :muko_flg
AND dim.enabled_flg = 'Y'
AND dim.dcf_inst_cd_new IS {not_null}NULL
""".format(
not_null='' if muko_flg == 0 else 'NOT '
)
params = {
'muko_flg': muko_flg
}
dst_inst_merge_records = db.execute_select(sql, params)
logging_sql(logger, sql)
logger.info('DCF施設統合マスタの取得に成功')
except Exception as e:
logger.debug('DCF施設統合マスタの取得に失敗')
raise e
return dst_inst_merge_records
def _update_dcf_inst_merge(db: Database, muko_flg: int) -> int:
# dcf_inst_mergeをUPDATE
# 無効フラグがOFFのときは、
# 移行先DCF施設コードが設定されていないデータを抽出し、移行先DCF施設コードに重複時相手先コードを上書きする
# 無効フラグがONのときは、
# 移行先DCF施設コードが設定されているデータを抽出し、移行先DCF施設コードにNULLを上書きする。
try:
elapsed_time = ElapsedTime()
log_message = '更新しました' if muko_flg == 0 else '無効データに戻しました'
sql = """
UPDATE
src05.dcf_inst_merge AS updim
INNER JOIN(
SELECT
dim.dcf_inst_cd AS base_dcf_inst_cd,
dim.dup_opp_cd AS base_dup_opp_cd,
dim.tekiyo_month AS base_tekiyo_month,
dim.muko_flg AS base_muko_flg,
dim.enabled_flg AS base_enabled_flg
FROM
src05.dcf_inst_merge AS dim
INNER JOIN
src05.hdke_tbl AS ht
ON dim.tekiyo_month = DATE_FORMAT(ht.syor_date, '%Y%m')
WHERE
dim.muko_flg = :muko_flg
AND dim.enabled_flg ='Y'
AND dim.dcf_inst_cd_new IS {not_null}NULL
) AS bf_dim
SET
updim.dcf_inst_cd_new = {column},
updim.updater = CURRENT_USER(),
updim.update_date = SYSDATE()
WHERE
updim.dcf_inst_cd = base_dcf_inst_cd
AND updim.dup_opp_cd = base_dup_opp_cd
AND updim.tekiyo_month = base_tekiyo_month
AND updim.muko_flg = base_muko_flg
AND updim.enabled_flg = base_enabled_flg
""".format(
not_null='' if muko_flg == 0 else 'NOT ',
column='base_dup_opp_cd' if muko_flg == 0 else 'NULL'
)
params = {
'muko_flg': muko_flg
}
res = db.execute(sql, params)
logging_sql(logger, sql)
logger.info(f'DCF施設統合マスタの有効データを{log_message} 成功, {res.rowcount} 行更新 ({elapsed_time.of})')
except Exception as e:
logger.debug(f'DCF施設統合マスタの有効データを{log_message} 失敗')
raise e
return res.rowcount
def _update_dcf_inst_cd_new(db: Database, dcf_inst_cd_new_after: str, dcf_inst_cd_new_before: str, log_message: str):
# dcf_inst_mergeをUPDATE
try:
elapsed_time = ElapsedTime()
sql = """
UPDATE
src05.dcf_inst_merge
SET
dcf_inst_cd_new = :dcf_inst_cd_new_after,
updater = CURRENT_USER(),
update_date = SYSDATE()
WHERE
dcf_inst_cd_new = :dcf_inst_cd_new_before
AND enabled_flg = 'Y'
AND muko_flg = 0
"""
params = {
'dcf_inst_cd_new_after': dcf_inst_cd_new_after,
'dcf_inst_cd_new_before': dcf_inst_cd_new_before
}
res = db.execute(sql, params)
logging_sql(logger, sql)
logger.info(f'移行先DCF施設コードの{log_message}更新に成功, {res.rowcount} 行更新 ({elapsed_time.of})')
except Exception as e:
logger.debug(f'移行先DCF施設コードの{log_message}更新に失敗')
raise e
def _update_ult_ident_presc_end_date(db: Database, last_end_date: str, ult_ident_presc_row: dict):
# ult_ident_presc_endをUPDATE
try:
elapsed_time = ElapsedTime()
sql = """
UPDATE
src05.ult_ident_presc
SET end_date = :end_date,
updater = CURRENT_USER(),
update_date = SYSDATE()
WHERE
ta_cd = :ta_cd
AND ult_ident_cd = :ult_ident_cd
AND ratio = :ratio
AND start_date = :start_date
"""
params = {
'end_date': last_end_date,
'ta_cd': ult_ident_presc_row['ta_cd'],
'ult_ident_cd': ult_ident_presc_row['ult_ident_cd'],
'ratio': ult_ident_presc_row['ratio'],
'start_date': ult_ident_presc_row['start_date']
}
res = db.execute(sql, params)
logging_sql(logger, sql)
logger.info(f'終了日 > 開始月のため適用終了日を更新 成功, {res.rowcount} 行更新 ({elapsed_time.of})')
except Exception as e:
logger.debug('終了日 > 開始月のため適用終了日を更新 失敗')
raise e
def _insert_ult_ident_presc(db: Database, set_Start_Date: str, dup_opp_cd: str,
ult_ident_presc_row: dict):
# ult_ident_prescにINSERT
try:
elapsed_time = ElapsedTime()
sql = """
INSERT INTO
src05.ult_ident_presc(
ta_cd,
ult_ident_cd,
ratio,
start_date,
presc_cd,
end_date,
creater,
create_date,
update_date,
updater
)
VALUES(
:ta_cd,
:ult_ident_cd,
:ratio,
:start_date,
:presc_cd,
:end_date,
CURRENT_USER(),
SYSDATE(),
SYSDATE(),
CURRENT_USER()
)
"""
params = {
'ta_cd': ult_ident_presc_row['ta_cd'],
'ult_ident_cd': ult_ident_presc_row['ult_ident_cd'],
'ratio': ult_ident_presc_row['ratio'],
'start_date': set_Start_Date,
'presc_cd': dup_opp_cd,
'end_date': ult_ident_presc_row['end_date']
}
res = db.execute(sql, params)
logging_sql(logger, sql)
logger.info(f'納入先処方元マスタに追加 成功, {res.rowcount} 行更新 ({elapsed_time.of})')
except Exception as e:
logger.debug('納入先処方元マスタに追加 失敗')
raise e
def _select_emp_chg_inst(db: Database, dcf_inst_cd: str, dup_opp_cd: str, ta_cd: str) -> list[dict]:
# emp_chg_instからSELECT
try:
sql = """
SELECT
eci.inst_cd,
eci.ta_cd,
eci.emp_cd,
eci.bu_cd,
eci.start_date,
eci.end_date,
eci.main_chg_flg,
eci.enabled_flg,
(
SELECT
COUNT(eciopp.inst_cd)
FROM
src05.emp_chg_inst AS eciopp
WHERE
eciopp.inst_cd = :dup_opp_cd
AND eciopp.ta_cd = :ta_cd
) AS opp_count
FROM
src05.emp_chg_inst AS eci
WHERE
eci.inst_cd = :dcf_inst_cd
AND eci.ta_cd = :ta_cd
AND eci.enabled_flg = 'Y'
AND (SELECT ht.syor_date FROM src05.hdke_tbl AS ht) < eci.end_date
"""
params = {'dcf_inst_cd': dcf_inst_cd, 'dup_opp_cd': dup_opp_cd, 'ta_cd': ta_cd}
emp_chg_inst_records = db.execute_select(sql, params)
logging_sql(logger, sql)
logger.info('従業員担当施設マスタの取得 成功')
except Exception as e:
logger.debug('従業員担当施設マスタの取得 失敗')
raise e
return emp_chg_inst_records
def _select_ult_ident_presc(db: Database, dcf_inst_cd: str, dup_opp_cd: str,
ult_ident_presc_row: dict) -> list[dict]:
# ult_ident_prescからSELECT
try:
sql = """
SELECT
uip.ta_cd,
uip.ult_ident_cd,
uip.ratio,
uip.start_date,
uip.end_date,
(
SELECT
COUNT(uipopp.ta_cd)
FROM
src05.ult_ident_presc AS uipopp
WHERE
uipopp.presc_cd = :dup_opp_cd
AND uipopp.ta_cd = :ta_cd
AND uipopp.ult_ident_cd = :ult_ident_cd
AND uipopp.ratio = :ratio
) AS opp_count
FROM
src05.ult_ident_presc AS uip
WHERE
uip.presc_cd = :dcf_inst_cd
AND uip.ta_cd = :ta_cd
AND (SELECT ht.syor_date FROM src05.hdke_tbl AS ht) < uip.end_date
"""
params = {
'dcf_inst_cd': dcf_inst_cd,
'dup_opp_cd': dup_opp_cd,
'ta_cd': ult_ident_presc_row['ta_cd'],
'ult_ident_cd': ult_ident_presc_row['ult_ident_cd'],
'ratio': ult_ident_presc_row['ratio']
}
ult_ident_presc_records = db.execute_select(sql, params)
logging_sql(logger, sql)
logger.info('納入先処方元マスタの取得 成功')
except Exception as e:
logger.debug('納入先処方元マスタの取得 失敗')
raise e
return ult_ident_presc_records
def _count_duplicate_ult_ident_presc(db: Database, set_start_date: str,
ult_ident_presc_row: dict) -> int:
# ult_ident_prescの重複時相手先コードの件数取得
try:
sql = """
SELECT
COUNT(ta_cd) AS cnt
FROM
src05.ult_ident_presc
WHERE
ta_cd = :ta_cd
AND ult_ident_cd = :ult_ident_cd
AND ratio = :ratio
AND start_date = :start_date
"""
params = {
'ta_cd': ult_ident_presc_row['ta_cd'],
'ult_ident_cd': ult_ident_presc_row['ult_ident_cd'],
'ratio': ult_ident_presc_row['ratio'],
'start_date': set_start_date
}
result = db.execute_select(sql, params)
logging_sql(logger, sql)
logger.info('納入先処方元マスタの重複予定データの存在チェック 成功')
except Exception as e:
logger.debug('納入先処方元マスタの重複予定データの存在チェック 失敗')
raise e
return result[0]['cnt']
def _get_first_day_of_month(year_month: str) -> datetime:
# year_monthの初日の日付を日付型に変換し返却する
return datetime.strptime(year_month + '01', '%Y%m%d')
def _str_to_date_time(str_date_time: str) -> datetime:
# str_date_timeを日付型に変換して返却する
return datetime.strptime(str_date_time, '%Y%m%d')
def _date_time_to_str(date_time: datetime) -> str:
# date_timeをYmd型に変換して返却する
return date_time.strftime('%Y%m%d')

View File

@ -0,0 +1,32 @@
from src.db.database import Database
from src.error.exceptions import BatchOperationException
from src.logging.get_logger import get_logger
logger = get_logger('洗替用マスタ作成')
def exec():
db = Database.get_instance()
try:
db.connect()
logger.debug('処理開始')
db.to_jst()
call_v_inst_merge_t_create(db)
call_inst_merge_t_create(db)
logger.debug('処理終了')
except Exception as e:
raise BatchOperationException(e)
finally:
db.disconnect()
def call_v_inst_merge_t_create(db: Database):
db.execute('CALL src05.v_inst_merge_t_create()')
return
def call_inst_merge_t_create(db: Database):
db.execute('CALL src05.inst_merge_t_create()')
return

View File

@ -0,0 +1,178 @@
from src.batch.batch_functions import logging_sql
from src.batch.common.batch_context import BatchContext
from src.db.database import Database
from src.error.exceptions import BatchOperationException
from src.logging.get_logger import get_logger
from src.time.elapsed_time import ElapsedTime
logger = get_logger('施設担当者マスタ洗替')
batch_context = BatchContext.get_instance()
def exec():
db = Database.get_instance()
try:
db.connect()
db.to_jst()
logger.debug('##########################')
logger.debug('START Changing Employee in charge of institution PGM.')
# `emp_chg_inst_lau`をTruncate
_truncate_emp_chg_inst_lau(db)
# emp_chg_inst から、`emp_chg_inst_lau`へInsert
_insert_into_emp_chg_inst_lau_from_emp_chg_inst(db)
# v_inst_merge_tから、emp_chg_inst_lauをUpdate
_update_emp_chg_inst_lau_from_v_inst_merge_t(db)
# inst_merge_tから、emp_chg_inst_lauをUpdate
_update_emp_chg_inst_lau_from_inst_merge_t(db)
logger.debug('##########################')
logger.debug('End All Processing PGM.')
except Exception as e:
raise BatchOperationException(e)
finally:
db.disconnect()
def _truncate_emp_chg_inst_lau(db: Database):
logger.debug("##########################")
try:
db.execute("TRUNCATE TABLE src05.emp_chg_inst_lau")
except Exception as e:
logger.debug("Error! Truncate Table `emp_chg_inst_lau` is Failed!!!")
raise e
logger.debug("Table `emp_chg_inst_lau` was truncated!")
return
def _insert_into_emp_chg_inst_lau_from_emp_chg_inst(db: Database):
logger.debug("##########################")
try:
elapsed_time = ElapsedTime()
sql = """
INSERT INTO
src05.emp_chg_inst_lau
SELECT
inst_cd,
ta_cd,emp_cd,
bu_cd,
start_date,
end_date,
main_chg_flg,
enabled_flg,
creater,
create_date,
updater,
update_date,
NULL -- lua_ope_dt
FROM
src05.emp_chg_inst
WHERE
enabled_flg = 'Y'
"""
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("Error! Insert into `emp_chg_inst_lau` from `emp_chg_inst` was failed!!!")
raise e
logger.debug("Success! Insert into `emp_chg_inst_lau` from `emp_chg_inst` was inserted!")
return
def _update_emp_chg_inst_lau_from_v_inst_merge_t(db: Database):
# v_inst_merge_tの元となるvop_hco_merge_vはデータが作られないため、この洗い替え処理は基本空振りする
logger.debug("##########################")
try:
select_result = db.execute_select(
"""
SELECT
COUNT(v_inst_cd) AS row_count
FROM
internal05.v_inst_merge_t
"""
)
except Exception as e:
logger.debug("Error! `v_inst_merge_t` Table count error!")
raise e
count = [row for row in select_result][0]['row_count']
if count == 0:
logger.info('v_inst_merge_t Table Data is not exists!')
return
logger.info('v_inst_merge_t Table Data is exists!')
# v_inst_merge_t から、emp_chg_inst_lauをUpdateします
logger.debug("##########################")
logger.debug("#### UPDATE DATA #########")
logger.debug("##########################")
try:
elapsed_time = ElapsedTime()
update_sql = """
UPDATE
src05.emp_chg_inst_lau el, internal05.v_inst_merge_t vimt
SET
el.inst_cd = vimt.v_inst_cd_merge,
el.lua_ope_dt = SYSDATE()
WHERE
el.inst_cd = vimt.v_inst_cd
"""
res = db.execute(update_sql)
logging_sql(logger, update_sql)
logger.info(f'Query OK, {res.rowcount} rows affected ({elapsed_time.of})')
except Exception as e:
logger.debug("emp_chg_inst_lau.v_inst_cd could not set!")
raise e
logger.debug("emp_chg_inst_lau.v_inst_cd was set!")
return
def _update_emp_chg_inst_lau_from_inst_merge_t(db: Database):
# inst_merge_tから、emp_chg_inst_lauをUpdate
# Get count from INST_MERGE_T
logger.debug("##########################")
try:
select_result = db.execute_select(
"""
SELECT
COUNT(dcf_dsf_inst_cd) AS row_count
FROM
internal05.inst_merge_t
"""
)
except Exception as e:
logger.debug("Error! Getting Count of internal05.inst_merge_t was failed!")
raise e
count = [row for row in select_result][0]['row_count']
if count == 0:
logger.info('inst_merge_t Table Data is not exists!')
return
logger.debug('inst_merge_t Table Data is exists!')
# inst_merge_tから、emp_chg_inst_lauをUpdate
logger.debug("##########################")
logger.debug("#### UPDATE DATA #########")
logger.debug("##########################")
try:
elapsed_time = ElapsedTime()
update_sql = """
UPDATE
src05.emp_chg_inst_lau el, internal05.inst_merge_t imt
SET
el.inst_cd = imt.dup_opp_cd,
el.lua_ope_dt = SYSDATE()
WHERE
el.inst_cd = imt.dcf_dsf_inst_cd
"""
res = db.execute(update_sql)
logging_sql(logger, update_sql)
logger.info(f'Query OK, {res.rowcount} rows affected ({elapsed_time.of})')
except Exception as e:
logger.debug("emp_chg_inst_lau.v_inst_cd could not set!")
raise e
logger.debug("emp_chg_inst_lau.v_inst_cd was set!")
return

View File

@ -0,0 +1,262 @@
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('メルク施設マスタ作成')
def exec():
"""メルク施設マスタ作成"""
# 営業日ではないかつ、アルトマーク取込が行われていない場合は処理をスキップする
if batch_context.is_not_business_day is True and batch_context.is_ultmarc_imported is not True:
logger.info('営業日ではない、かつ、アルトマーク取込が行われていないため、メルク施設マスタ作成処理をスキップします。')
return
db = Database.get_instance()
try:
db.connect()
logger.debug('メルク施設マスタ作成処理開始')
# mst_instをTruncate
_truncate_mst_inst(db)
# fcl_mst_vから、mst_instへInsert
_insert_mst_inst_from_fcl_mst_v(db)
# com_instから、mst_instへInsert
_insert_mst_inst_from_com_inst(db)
logger.debug('メルク施設マスタ作成処理終了')
except Exception as e:
raise BatchOperationException(e)
finally:
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:
elapsed_time = ElapsedTime()
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,
LEFT(fmv1.closed_dt, 10),
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)
logging_sql(logger, sql)
logger.info(f'V施設マスタからメルク施設マスタに登録成功, {res.rowcount} 行更新 ({elapsed_time.of})')
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:
elapsed_time = ElapsedTime()
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)
logging_sql(logger, sql)
logger.info(f'COM施設からメルク施設マスタに登録成功, {res.rowcount} 行更新 ({elapsed_time.of})')
except Exception as e:
logger.debug("COM施設からメルク施設マスタに登録失敗")
raise e
return

View File

@ -0,0 +1,31 @@
from src.batch.common.batch_context import BatchContext
from src.batch.laundering import (
create_inst_merge_for_laundering, emp_chg_inst_laundering,
ult_ident_presc_laundering, sales_results_laundering)
from src.batch.dcf_inst_merge import integrate_dcf_inst_merge
from src.logging.get_logger import get_logger
batch_context = BatchContext.get_instance()
logger = get_logger('実績洗替')
def exec():
"""実績洗替処理"""
logger.info('実績更新:起動')
# 営業日ではない場合、実績洗替処理は実行しない
if batch_context.is_not_business_day:
logger.info('営業日ではないため、実績洗替処理をスキップします。')
return
# DCF施設統合マスタ日次更新
integrate_dcf_inst_merge.exec()
# 洗替用マスタ作成
create_inst_merge_for_laundering.exec()
# 施設担当者洗替
emp_chg_inst_laundering.exec()
# 納入先処方元マスタ洗替
ult_ident_presc_laundering.exec()
# 卸販売洗替
sales_results_laundering.exec()
logger.info('実績更新:終了')

View File

@ -0,0 +1,169 @@
from src.batch.batch_functions import logging_sql
from src.db.database import Database
from src.error.exceptions import BatchOperationException
from src.logging.get_logger import get_logger
from src.system_var import environment
logger = get_logger('卸販売洗替')
def exec():
db = Database.get_instance(autocommit=True)
try:
db.connect()
db.to_jst()
logger.debug('処理開始')
# 卸販売実績テーブル(洗替後)過去データ削除
_call_sales_lau_delete(db)
# 卸販売実績テーブル(洗替後)作成
_call_sales_lau_upsert(db)
# 1:卸組織洗替
_call_whs_org_laundering(db)
# HCO施設コードの洗替
_update_sales_lau_from_vop_hco_merge_v(db)
# 4:メルク施設コードの洗替
_update_mst_inst_laundering(db)
logger.debug('処理終了')
except Exception as e:
raise BatchOperationException(e)
finally:
db.disconnect()
def _call_sales_lau_delete(db: Database):
# 卸販売実績テーブル(洗替後)過去データ削除
logger.info('sales_lau_delete(プロシージャ―) 開始')
db.execute(f"""
CALL src05.sales_lau_delete(
'{environment.SALES_LAUNDERING_TARGET_TABLE_NAME}',
{environment.SALES_LAUNDERING_TARGET_YEAR_OFFSET}
)
""")
logger.info('sales_lau_delete(プロシージャ―) 終了')
return
def _call_sales_lau_upsert(db: Database):
# 卸販売実績テーブル(洗替後)作成
# sales_lau_upsertの第3引数は、NEWDWH2021-1230の対応の結果、未使用の引数となっています
logger.info('sales_lau_upsert(プロシージャ―) 開始')
db.execute(f"""
CALL src05.sales_lau_upsert(
'{environment.SALES_LAUNDERING_TARGET_TABLE_NAME}',
(src05.get_syor_date() - interval {environment.SALES_LAUNDERING_EXTRACT_DATE_PERIOD} day),
src05.get_syor_date()
)
""")
logger.info('sales_lau_upsert(プロシージャ―) 終了')
return
def _call_whs_org_laundering(db: Database):
# 卸組織洗替
logger.info('whs_org_laundering(プロシージャ―) 開始')
db.execute(f"""
CALL src05.whs_org_laundering(
'{environment.SALES_LAUNDERING_TARGET_TABLE_NAME}'
)
""")
logger.info('whs_org_laundering(プロシージャ―) 終了')
return
def _update_sales_lau_from_vop_hco_merge_v(db: Database):
# HCO施設コードの洗替
if _count_v_inst_merge_t(db) == 0:
logger.info('V施設統合マスタ(洗替処理一時テーブル)にデータは存在しません')
return
_call_v_inst_merge_laundering(db)
return
def _count_v_inst_merge_t(db: Database) -> int:
# V施設統合マスタ(洗替処理一時テーブル)のデータ件数の取得
try:
sql = """
SELECT
COUNT(v_inst_cd) AS cnt
FROM
internal05.v_inst_merge_t
"""
result = db.execute_select(sql)
logging_sql(logger, sql)
logger.info('V施設統合マスタ(洗替処理一時テーブル)のデータ件数の取得 成功')
except Exception as e:
logger.debug('V施設統合マスタ(洗替処理一時テーブル)のデータ件数の取得 失敗')
raise e
return result[0]['cnt']
def _call_v_inst_merge_laundering(db: Database):
# HCO施設コードの洗替(プロシージャ―の呼び出し)
logger.info('v_inst_merge_laundering(プロシージャ―) 開始')
db.execute(f"""
CALL src05.v_inst_merge_laundering(
'{environment.SALES_LAUNDERING_TARGET_TABLE_NAME}'
)
""")
logger.info('v_inst_merge_laundering(プロシージャ―) 終了')
return
def _update_mst_inst_laundering(db: Database):
# メルク施設コードの洗替
_call_hco_to_mdb_laundering(db)
_update_sales_lau_from_dcf_inst_merge(db)
def _call_hco_to_mdb_laundering(db: Database):
# A:医療機関のデータはMDB変換表からHCO⇒DCFへ変換
logger.info('hco_to_mdb_laundering(プロシージャ―) 開始')
db.execute(f"""
CALL src05.hco_to_mdb_laundering(
'{environment.SALES_LAUNDERING_TARGET_TABLE_NAME}'
)
""")
logger.info('hco_to_mdb_laundering(プロシージャ―) 終了')
return
def _update_sales_lau_from_dcf_inst_merge(db: Database):
# B:DCF施設統合マスタがある場合は、コードを変換し、住所等をSETする
if _count_inst_merge_t(db) == 0:
logger.info('アルトマーク施設統合マスタ(洗替処理一時テーブル)にデータは存在しません')
return
_call_inst_merge_laundering(db)
return
def _count_inst_merge_t(db: Database) -> int:
# アルトマーク施設統合マスタ(洗替処理一時テーブル)のデータ件数の取得
try:
sql = """
SELECT
COUNT(dcf_dsf_inst_cd) AS cnt
FROM
internal05.inst_merge_t
"""
result = db.execute_select(sql)
logging_sql(logger, sql)
logger.info('アルトマーク施設統合マスタ(洗替処理一時テーブル)のデータ件数の取得 成功')
except Exception as e:
logger.debug('アルトマーク施設統合マスタ(洗替処理一時テーブル)のデータ件数の取得 失敗')
raise e
return result[0]['cnt']
def _call_inst_merge_laundering(db: Database):
# B:DCF施設統合マスタがある場合は、コードを変換し、住所等をSETする(プロシージャ―の呼び出し)
logger.info('inst_merge_laundering(プロシージャ―) 開始')
db.execute(f"""
CALL src05.inst_merge_laundering(
'{environment.SALES_LAUNDERING_TARGET_TABLE_NAME}'
)
""")
logger.info('inst_merge_laundering(プロシージャ―) 終了')
return

View File

@ -0,0 +1,140 @@
from src.batch.batch_functions import logging_sql
from src.batch.common.batch_context import BatchContext
from src.db.database import Database
from src.error.exceptions import BatchOperationException
from src.logging.get_logger import get_logger
from src.time.elapsed_time import ElapsedTime
logger = get_logger('納入先処方元マスタ洗替')
batch_context = BatchContext.get_instance()
def exec():
db = Database.get_instance()
try:
db.connect()
db.to_jst()
logger.debug('納入先処方元マスタの洗替処理開始')
# ult_ident_presc_lauをTruncate
_truncate_ult_ident_presc_lau(db)
# ult_ident_presc から、ult_ident_presc_lauへInsert
_insert_into_ult_ident_presc_lau_from_ult_ident_presc(db)
# v_inst_merge_tから、ult_ident_presc_lauをUpdate
_update_ult_ident_presc_lau_from_v_inst_merge_t(db)
# inst_merge_tから、ult_ident_presc_lauをUpdate
_update_ult_ident_presc_lau_from_inst_merge_t(db)
logger.debug('納入先処方元マスタの洗替処理製造終了')
except Exception as e:
raise BatchOperationException(e)
finally:
db.disconnect()
def _truncate_ult_ident_presc_lau(db: Database):
try:
db.execute("TRUNCATE TABLE src05.ult_ident_presc_lau")
except Exception as e:
logger.debug("納入先処方元マスタ(洗替後)の全件削除に失敗")
raise e
logger.debug("納入先処方元マスタ(洗替後)の全件削除に成功")
return
def _insert_into_ult_ident_presc_lau_from_ult_ident_presc(db: Database):
try:
elapsed_time = ElapsedTime()
sql = "INSERT INTO src05.ult_ident_presc_lau SELECT *, NULL FROM src05.ult_ident_presc"
res = db.execute(sql)
logging_sql(logger, sql)
logger.info(f'処方元マスタから処方元マスタ(洗替後)に全件コピーに成功, {res.rowcount} 行更新 ({elapsed_time.of})')
except Exception as e:
logger.debug("処方元マスタから処方元マスタ(洗替後)に全件コピーに失敗")
raise e
return
def _update_ult_ident_presc_lau_from_v_inst_merge_t(db: Database):
# v_inst_merge_tの元となるvop_hco_merge_vはデータが作られないため、この洗い替え処理は基本空振りする
try:
select_result = db.execute_select(
"""
SELECT
COUNT(v_inst_cd) AS row_count
FROM
internal05.v_inst_merge_t
"""
)
except Exception as e:
logger.debug("V施設統合マスタ(洗替処理一時テーブル)からの移行対象施設件数取得失敗")
raise e
count = [row for row in select_result][0]['row_count']
if count == 0:
logger.info('V施設統合マスタ(洗替処理一時テーブル)からの移行対象施設が存在しません')
return
logger.info(f'V施設統合マスタ(洗替処理一時テーブル)からの移行対象施設件数取得成功 移行対象施設件数={count}')
try:
elapsed_time = ElapsedTime()
update_sql = """
UPDATE
src05.ult_ident_presc_lau uipl, internal05.v_inst_merge_t vimt
SET
uipl.ult_ident_cd = vimt.v_inst_cd_merge,
uipl.lau_ope_dt = SYSDATE()
WHERE
uipl.ult_ident_cd = vimt.v_inst_cd
"""
res = db.execute(update_sql)
logging_sql(logger, update_sql)
logger.info(f'納入先処方元マスタの納入先コードを施設コード移行先に更新成功, {res.rowcount} 行更新 ({elapsed_time.of})')
except Exception as e:
logger.debug("納入先処方元マスタの納入先コードを施設コード移行先に更新失敗")
raise e
return
def _update_ult_ident_presc_lau_from_inst_merge_t(db: Database):
# inst_merge_tから、ult_ident_presc_lauをUpdate
try:
select_result = db.execute_select(
"""
SELECT
COUNT(dcf_dsf_inst_cd) AS row_count
FROM
internal05.inst_merge_t
"""
)
except Exception as e:
logger.debug("施設統合マスタ(洗替処理一時テーブル)からの移行対象施設件数取得失敗")
raise e
count = [row for row in select_result][0]['row_count']
if count == 0:
logger.info('施設統合マスタ(洗替処理一時テーブル)からの移行対象施設が存在しません')
return
logger.info(f'施設統合マスタ(洗替処理一時テーブル)からの移行対象施設件数取得成功 移行対象施設件数={count}')
# inst_merge_tから、ult_ident_presc_lauをUpdate
try:
elapsed_time = ElapsedTime()
update_sql = """
UPDATE
src05.ult_ident_presc_lau uipl, internal05.inst_merge_t imt
SET
uipl.presc_cd = imt.dup_opp_cd,
uipl.lau_ope_dt = SYSDATE()
WHERE
uipl.presc_cd = imt.dcf_dsf_inst_cd
"""
res = db.execute(update_sql)
logging_sql(logger, update_sql)
logger.info(f'納入先処方元マスタの処方元コードを施設コード移行先に更新成功, {res.rowcount} 行更新 ({elapsed_time.of})')
except Exception as e:
logger.debug("納入先処方元マスタの処方元コードを施設コード移行先に更新失敗")
raise e
return

View File

@ -0,0 +1,32 @@
"""並列処理"""
import concurrent.futures
from src.batch.bio_sales import create_bio_sales_lot
from src.batch.laundering import sales_laundering
from src.error.exceptions import BatchOperationException
def exec():
# 並列処理を開始
with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor:
# 実績更新
future_sales_laundering = executor.submit(sales_laundering.exec)
# 生物由来ロット分解
future_create_bio_sales_lot = executor.submit(create_bio_sales_lot.exec)
# 両方の処理が完了するまで待つ
concurrent.futures.wait([future_sales_laundering, future_create_bio_sales_lot])
# エラーがあれば呼び出し元でキャッチする
sales_laundering_exc = future_sales_laundering.exception()
create_bio_sales_lot_exc = future_create_bio_sales_lot.exception()
# いずれかにエラーが発生していれば、1つのエラーとして返す。
if sales_laundering_exc is not None or create_bio_sales_lot_exc is not None:
sales_laundering_exc_message = str(sales_laundering_exc) if sales_laundering_exc is not None else ''
create_bio_sales_lot_exc_message = str(create_bio_sales_lot_exc) if create_bio_sales_lot_exc is not None else ''
raise BatchOperationException(f'並列処理中にエラーが発生しました。実績更新="{sales_laundering_exc_message}", 生物由来ロット分解={create_bio_sales_lot_exc_message}')
return

View File

@ -0,0 +1,60 @@
import csv
from io import TextIOWrapper
class DatFileLine:
layout_class: str
records: list[str]
def __init__(self, dat_line: list[str]) -> None:
self.layout_class = dat_line[0]
self.records = dat_line
class DatFile:
"""アルトマークデータファイル"""
lines: list[DatFileLine]
success_count: int = 0
error_count: int = 0
total_count: int = 0
__i: int = 0
def __iter__(self):
return self
def __next__(self) -> DatFileLine:
if self.__i == len(self.lines):
raise StopIteration()
line = self.lines[self.__i]
self.__i += 1
return line
def __init__(self, file: TextIOWrapper) -> None:
reader = csv.reader(file)
csv_rows = [DatFileLine(row) for row in reader]
self.lines = csv_rows
self.total_count = len(csv_rows)
def count_up_success(self):
self.success_count += 1
def count_up_error(self):
self.error_count += 1
@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)
file.close()
return instance

View File

@ -0,0 +1,271 @@
"""output_vjsk_inst_pharm_data"""
from src.aws.s3 import VjskSendBucket
from src.batch.common.batch_context import BatchContext
from src.db.database import Database
from src.logging.get_logger import get_logger
import tempfile
import os.path as path
import csv
logger = get_logger('V実消化用施設データ作成処理')
sql_err_msg = "SQL実行エラーです。"
def exec():
vjsk_csv_file_name = 'ComInst.csv'
# バッチ共通設定を取得
batch_context = BatchContext.get_instance()
if not batch_context.is_ultmarc_imported:
logger.info('アルトマーク取込が行われていないため、V実消化用施設データ作成処理をスキップします。')
return
db = Database.get_instance()
try:
logger.info('処理開始')
try:
# DB接続
db.connect()
except Exception as e:
logger.info('DB接続エラーです。')
raise e
# CSVファイルの作成用のSQL実行(施設)
record_inst = select_inst_record(db)
# CSVファイルの作成用のSQL実行(薬局)
record_pharm = select_pharm_record(db)
# CSVファイル作成
csv_file_path = make_csv_data(record_inst, record_pharm, vjsk_csv_file_name)
vjsk_bucket = VjskSendBucket()
try:
# s3へデータ移動
vjsk_bucket.upload_inst_pharm_csv_file(vjsk_csv_file_name, csv_file_path)
except Exception as e:
logger.info('S3バケットにCSVデータを作成できませんでした。')
raise e
try:
# 処理後ファイルをバックアップ
vjsk_bucket.backup_inst_pharm_csv_file(vjsk_csv_file_name, batch_context.syor_date)
except Exception as e:
logger.info('バックアップバケットへCSVデータをコピーできませんでした。')
raise e
csv_count = len(record_inst) + len(record_pharm)
logger.info(f'CSV出力件数: {csv_count}')
logger.info('正常終了')
except Exception as e:
raise e
finally:
db.disconnect()
return
def select_inst_record(db):
# CSVファイル作成用のSQL実行(施設)
try:
# 施設テーブル検索SQL
sql = """\
SELECT dcf_dsf_inst_cd,
inst_div_cd,
addr_unknown_reason_cd,
form_inst_name_kana,
inst_name_kana,
form_inst_name_kanji,
inst_name_kanji,
rltd_univ_prnt_cd,
bed_num,
close_flg,
estab_sche_flg,
close_start_ym,
estab_sche_ym,
ward_abolish_flg,
inst_repre_cd,
inst_repre_kana,
inst_repre,
phone_number_non_flg,
unconf_flg,
inst_phone_number,
inst_addr_kana,
inst_addr,
postal_number,
village_cd,
prefc_cd,
city_cd,
addr_display_number,
addr_cnt_kana,
addr_cnt,
manage_cd,
delete_sche_reason_cd,
hp_assrt_cd,
dup_opp_cd,
insp_item_micrb,
insp_item_serum,
insp_item_blood,
insp_item_patho,
insp_item_paras,
insp_item_biochem,
insp_item_ri,
re_exam_cd,
prmit_bed_num_other,
prmit_bed_num_mental,
prmit_bed_num_tuber,
prmit_bed_num_infection,
prmit_bed_num_sum,
prmit_bed_num_gen,
prmit_bed_num_rcup,
prmit_bed_maint_ymd,
inst_pharm_div,
abolish_ymd,
delete_flg,
filler_1,
filler_2,
filler_3,
filler_4,
filler_5,
regist_date,
create_user,
update_date,
update_user,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
FROM src05.com_inst ORDER BY dcf_dsf_inst_cd
"""
return db.execute_select(sql)
except Exception as e:
logger.debug(sql_err_msg)
raise e
def select_pharm_record(db):
# CSVファイル作成用のSQL実行(薬局)
try:
# 薬局テーブル検索SQL
sql = """\
SELECT dcf_dsf_inst_cd,
inst_div_cd,
addr_unknown_reason_cd,
form_inst_name_kana,
inst_name_kana,
form_inst_name_kanji,
inst_name_kanji,
'' AS rltd_univ_prnt_cd,
'' AS bed_num,
close_flg,
estab_sche_flg,
close_start_ym,
estab_sche_ym,
'' AS ward_abolish_flg,
'' AS inst_repre_cd,
inst_repre_kana,
inst_repre,
phone_number_non_flg,
unconf_flg,
inst_phone_number,
inst_addr_kana,
inst_addr,
postal_number,
village_cd,
prefc_cd,
city_cd,
addr_display_number,
addr_cnt_kana,
addr_cnt,
manage_cd,
delete_sche_reason_cd,
'' AS hp_assrt_cd,
dup_opp_cd,
'' AS insp_item_micrb,
'' AS insp_item_serum,
'' AS insp_item_blood,
'' AS insp_item_patho,
'' AS insp_item_paras,
'' AS insp_item_biochem,
'' AS insp_item_ri,
'' AS re_exam_cd,
'' AS prmit_bed_num_other,
'' AS prmit_bed_num_mental,
'' AS prmit_bed_num_tuber,
'' AS prmit_bed_num_infection,
'' AS prmit_bed_num_sum,
'' AS prmit_bed_num_gen,
'' AS prmit_bed_num_rcup,
'' AS prmit_bed_maint_ymd,
inst_pharm_div,
abolish_ymd,
delete_flg,
filler_1,
filler_2,
filler_3,
filler_4,
filler_5,
regist_date,
create_user,
update_date,
update_user,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
FROM src05.com_pharm ORDER BY dcf_dsf_inst_cd
"""
return db.execute_select(sql)
except Exception as e:
logger.debug(sql_err_msg)
raise e
def make_csv_data(record_inst: list, record_pharm: list, vjsk_csv_file_name: str):
# 一時ファイルとして保存する(CSVファイル)
try:
temporary_dir = tempfile.mkdtemp()
csv_file_path = path.join(temporary_dir, vjsk_csv_file_name)
head_str = ['DCF_DSF_INST_CD', 'INST_DIV_CD', 'ADDR_UNKNOWN_REASON_CD', 'FORM_INST_NAME_KANA', 'INST_NAME_KANA',
'FORM_INST_NAME_KANJI', 'INST_NAME_KANJI', 'RLTD_UNIV_PRNT_CD', 'BED_NUM', 'CLOSE_FLG', 'ESTAB_SCHE_FLG',
'CLOSE_START_YM', 'ESTAB_SCHE_YM', 'WARD_ABOLISH_FLG', 'INST_REPRE_CD', 'INST_REPRE_KANA', 'INST_REPRE',
'PHONE_NUMBER_NON_FLG', 'UNCONF_FLG', 'INST_PHONE_NUMBER', 'INST_ADDR_KANA', 'INST_ADDR', 'POSTAL_NUMBER',
'VILLAGE_CD', 'PREFC_CD', 'CITY_CD', 'ADDR_DISPLAY_NUMBER', 'ADDR_CNT_KANA', 'ADDR_CNT', 'MANAGE_CD',
'DELETE_SCHE_REASON_CD', 'HP_ASSRT_CD', 'DUP_OPP_CD', 'INSP_ITEM_MICRB', 'INSP_ITEM_SERUM', 'INSP_ITEM_BLOOD',
'INSP_ITEM_PATHO', 'INSP_ITEM_PARAS', 'INSP_ITEM_BIOCHEM', 'INSP_ITEM_RI', 'RE_EXAM_CD', 'PRMIT_BED_NUM_OTHER',
'PRMIT_BED_NUM_MENTAL', 'PRMIT_BED_NUM_TUBER', 'PRMIT_BED_NUM_INFECTION', 'PRMIT_BED_NUM_SUM', 'PRMIT_BED_NUM_GEN',
'PRMIT_BED_NUM_RCUP', 'PRMIT_BED_MAINT_YMD', 'INST_PHARM_DIV', 'ABOLISH_YMD', 'DELETE_FLG', 'FILLER_1', 'FILLER_2',
'FILLER_3', 'FILLER_4', 'FILLER_5', 'REGIST_DATE', 'CREATE_USER', 'UPDATE_DATE', 'UPDATE_USER', 'SYS_REGIST_DATE',
'REGIST_PRGM_ID', 'SYS_UPDATE_DATE', 'UPDATE_PRGM_ID']
with open(csv_file_path, mode='w', encoding='UTF-8') as csv_file:
# ヘッダ行書き込みくくり文字をつけない為にwriterowではなく、writeを使用しています
csv_file.write(f"{','.join(head_str)}\n")
# Shift-JIS、CRLF、価囲いありで書き込む
writer = csv.writer(csv_file, delimiter=',', lineterminator='\n',
quotechar='"', doublequote=True, quoting=csv.QUOTE_ALL,
strict=True
)
# データ部分書き込み(施設)
for record_inst_data in record_inst:
record_inst_value = list(record_inst_data.values())
csv_data = ['' if n is None else n for n in record_inst_value]
writer.writerow(csv_data)
# データ部分書き込み(薬局)
for record_pharm_data in record_pharm:
record_pharm_value = list(record_pharm_data.values())
csv_data = ['' if n is None else n for n in record_pharm_value]
writer.writerow(csv_data)
except Exception as e:
logger.info('CSVデータの作成に失敗しました。')
raise e
return csv_file_path

View File

@ -0,0 +1,156 @@
"""アルトマークデータ処理"""
import json
from datetime import datetime
from src.aws.s3 import ConfigBucket, UltmarcBucket
from src.batch.common.batch_context import BatchContext
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 BatchOperationException
from src.logging.get_logger import get_logger
from src.system_var import constants
logger = get_logger('アルトマークデータ処理')
ultmarc_bucket = UltmarcBucket()
config_bucket = ConfigBucket()
batch_context = BatchContext.get_instance()
def exec_import():
"""アルトマーク取り込み処理"""
try:
logger.info('アルトマーク取込処理: 開始')
# datファイルをS3から取得する
dat_file_list = ultmarc_bucket.list_dat_file()
# ファイルがない場合は処理せず、正常終了とする
if len(dat_file_list) == 0:
logger.info('取込ファイルがないため、アルトマーク取込処理をスキップします')
# アルトマークデータ受信予定曜日である月曜日は、保守ユーザーに通知する
if datetime.strptime(batch_context.syor_date, '%Y/%m/%d').weekday() == constants.WEEKDAY_MONDAY:
logger.info('[NOTICE]アルトマークデータの受信がありませんでした')
return
# ファイルが複数ある場合はエラーとする
if len(dat_file_list) > 1:
raise BatchOperationException(f'複数の取込ファイルがあるため、異常終了 ファイル一覧:{dat_file_list}')
# ファイルの件数は必ず1件になる
dat_file_info = dat_file_list[0]
# 0Byteの場合、
if dat_file_info['size'] == 0:
logger.info(f'0Byteファイルのため、処理をスキップします。ファイル名={dat_file_info["filename"]}')
return
dat_file_name = dat_file_info['filename']
logger.info(f"{dat_file_name}を取り込みます")
# datファイルをダウンロード
local_file_path = ultmarc_bucket.download_dat_file(dat_file_name)
# 文字コード変換設定ファイルをダウンロード
convert_config_file_path = config_bucket.download_ultmarc_hex_convert_config()
# 文字コードを変換
converted_file_path = _convert_character_hex(local_file_path, convert_config_file_path)
dat_file = DatFile.from_path(converted_file_path)
# アルトマーク取り込み実行
_import_to_ultmarc_table(dat_file)
# 処理後ファイルをバックアップ
ultmarc_bucket.backup_dat_file(dat_file_name, batch_context.syor_date)
logger.info(f'取り込み処理が完了したため、datファイルをバックアップ。ファイル名={dat_file_name}')
# アルトマーク取込済をマーク
batch_context.is_ultmarc_imported = True
logger.info('アルトマーク取込処理: 終了')
except Exception as e:
raise BatchOperationException(e)
def _convert_character_hex(dat_file_path: str, config_file_path: str) -> str:
"""_summary_
アルトマークデータファイルを読みバイトレベルで文字コードを変換して新しいファイルに書き出す
Args:
dat_file_path (str): 変換前のアルトマークデータファイル
config_file_path (str): 変換設定
Returns:
str: 文字コード変換後のアルトマークデータファイルのパス
"""
logger.debug('文字コード変換開始')
# 変換設定ファイルを読み込む
with open(config_file_path, 'r', encoding='utf-8') as f:
hex_convert_config_dict: dict = json.load(f)
with open(dat_file_path, 'rb') as org_file, open(f'{dat_file_path}.converted', 'wb') as dest_file:
while True:
first_byte = org_file.read(1)
# ファイルの末尾まで読んだらループ終了
if not first_byte:
break
# 読みだした1バイトが、Shift_JIS の日本語範囲(2バイト文字)に含まれる場合、もう1バイト読む
if 0x81 <= first_byte[0] <= 0x9F or 0xE0 <= first_byte[0] <= 0xFC:
second_byte = org_file.read(1)
# ファイルの末尾まで読んだらループ終了
if not second_byte:
break
# 2バイトを結合して、HEXの4桁(大文字)に変換
japanese_bytes = first_byte + second_byte
japanese_hex = ''.join([hex(b)[2:].zfill(2).upper() for b in japanese_bytes])
# 変換対象の文字を変換設定に基づいて変換する
processed_hex = hex_convert_config_dict.get(japanese_hex)
if processed_hex is None:
processed_hex = japanese_hex
# HEXの4桁をバイト列に戻して書き出す
processed_bytes = bytes.fromhex(processed_hex)
dest_file.write(processed_bytes)
else:
# 1バイト文字はそのまま書き出す
dest_file.write(first_byte)
logger.debug('文字コード変換終了')
return f'{dat_file_path}.converted'
def _import_to_ultmarc_table(dat_file: DatFile):
db = Database.get_instance()
try:
# DB接続
db.connect()
# ファイル単位でトランザクションを行う
db.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.info(e)
record = line.records
log_message = ','.join([f'"{r}"' for r in record])
logger.info(f'ERROR_LINE: {log_message}')
dat_file.count_up_error()
# 処理結果をログに出力する
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:`の行を確認してください。')
finally:
# 終了時に必ずコミットする
db.commit()
db.disconnect()
return

View File

@ -0,0 +1,107 @@
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
from src.batch.ultmarc.utmp_tables.tables.com_alma_depart_disc import ComAlmaDepartDisc
class ComAlmaDepartDiscMapper(UltmarcTableMapper):
"""レイアウト区分003: COM_出身校学部識別 登録処理"""
# レコード存在確認SQL
RECORD_EXISTS_QUERY = """\
SELECT
COUNT(*) AS count_num
FROM
src05.com_alma_depart_disc
WHERE
alma_cd = :alma_cd
AND
depart_disc_cd = :depart_disc_cd
"""
# データ登録用SQL
INSERT_QUERY = """\
INSERT INTO src05.com_alma_depart_disc
(
alma_cd,
depart_disc_cd,
estab_e,
estab_y,
alma_name,
regist_ymd,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:alma_cd,
:depart_disc_cd,
:estab_e,
:estab_y,
:alma_name,
:execute_date_str_ymd,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
# 更新用SQL
UPDATE_QUERY = """\
UPDATE
src05.com_alma_depart_disc
SET
estab_e = :estab_e,
estab_y = :estab_y,
alma_name = :alma_name,
update_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
alma_cd = :alma_cd
AND
depart_disc_cd = :depart_disc_cd
"""
# 修正区分が「C(削除)」の場合の更新SQL
LOGICAL_DELETE_QUERY = """\
UPDATE
src05.com_alma_depart_disc
SET
delete_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
alma_cd = :alma_cd
AND
depart_disc_cd = :depart_disc_cd
"""
record: ComAlmaDepartDisc
def __init__(self, record: list[str], db) -> None:
super().__init__(record, db, ComAlmaDepartDisc)
program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている)
# モジュール名をクエリパラメータに設定
self.query_parameter['program_name'] = program_name
# 読み込んだレコード値もクエリパラメータに追加
self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()}
def make_query(self):
# 修正区分がC(削除)の場合、論理削除
if self.record.maint_flag == 'C':
self.queries.append(self.LOGICAL_DELETE_QUERY)
return
# 追加、更新の場合
self.queries.append(self.__make_upsert_query())
return
def __make_upsert_query(self):
# レコードの存在確認
record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter)
# 存在しない場合はInsert
if record_count[0]['count_num'] == 0:
return self.INSERT_QUERY
# 存在する場合ではUpdate
return self.UPDATE_QUERY

View File

@ -0,0 +1,92 @@
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
from src.batch.ultmarc.utmp_tables.tables.com_alma import ComAlma
class ComAlmaMapper(UltmarcTableMapper):
"""レイアウト区分004: COM_出身校 登録処理"""
# レコード存在確認SQL
RECORD_EXISTS_QUERY = """\
SELECT
COUNT(*) AS count_num
FROM
src05.com_alma
WHERE
alma_cd = :alma_cd
"""
# データ登録用SQL
INSERT_QUERY = """\
INSERT INTO src05.com_alma
(
alma_cd,
alma,
regist_ymd,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:alma_cd,
:alma,
:execute_date_str_ymd,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
UPDATE_QUERY = """\
UPDATE
src05.com_alma
SET
alma = :alma,
update_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
alma_cd = :alma_cd
"""
# 修正区分が「C(削除)」の場合の更新SQL
LOGICAL_DELETE_QUERY = """\
UPDATE
src05.com_alma
SET
delete_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
alma_cd = :alma_cd
"""
record: ComAlma
def __init__(self, record: list[str], db) -> None:
super().__init__(record, db, ComAlma)
program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている)
# モジュール名をクエリパラメータに設定
self.query_parameter['program_name'] = program_name
# 読み込んだレコード値もクエリパラメータに追加
self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()}
def make_query(self):
# 修正区分がC(削除)の場合、論理削除
if self.record.maint_flag == 'C':
self.queries.append(self.LOGICAL_DELETE_QUERY)
return
# 追加、更新の場合
self.queries.append(self.__make_upsert_query())
return
def __make_upsert_query(self):
# レコードの存在確認
record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter)
# 存在しない場合はInsert
if record_count[0]['count_num'] == 0:
return self.INSERT_QUERY
# 存在する場合ではUpdate
return self.UPDATE_QUERY

View File

@ -0,0 +1,105 @@
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
from src.batch.ultmarc.utmp_tables.tables.com_blng_sec import ComBlngSec
class ComBlngSecMapper(UltmarcTableMapper):
"""レイアウト区分008: COM_所属部科 登録処理"""
# レコード存在確認SQL
RECORD_EXISTS_QUERY = """\
SELECT
COUNT(*) AS count_num
FROM
src05.com_blng_sec
WHERE
blng_sec_cd = :blng_sec_cd
"""
# データ登録用SQL
INSERT_QUERY = """\
INSERT INTO src05.com_blng_sec
(
blng_sec_cd,
blng_sec_kana,
blng_sec_name,
inst_category,
trt_category,
category_sort,
regist_ymd,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:blng_sec_cd,
:blng_sec_kana,
:blng_sec_name,
:inst_category,
:trt_category,
:category_sort,
:execute_date_str_ymd,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
# 変更用SQL
UPDATE_QUERY = """\
UPDATE
src05.com_blng_sec
SET
blng_sec_kana = :blng_sec_kana,
blng_sec_name = :blng_sec_name,
inst_category = :inst_category,
trt_category = :trt_category,
category_sort = :category_sort,
update_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
blng_sec_cd = :blng_sec_cd
"""
# 修正区分が「C(削除)」の場合の更新SQL
LOGICAL_DELETE_QUERY = """\
UPDATE
src05.com_blng_sec
SET
delete_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
blng_sec_cd = :blng_sec_cd
"""
record: ComBlngSec
def __init__(self, record: list[str], db) -> None:
super().__init__(record, db, ComBlngSec)
program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている)
# モジュール名をクエリパラメータに設定
self.query_parameter['program_name'] = program_name
# 読み込んだレコード値もクエリパラメータに追加
self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()}
def make_query(self):
# 修正区分がC(削除)の場合、論理削除
if self.record.maint_flag == 'C':
self.queries.append(self.LOGICAL_DELETE_QUERY)
return
# 追加、更新の場合
self.queries.append(self.__make_upsert_query())
return
def __make_upsert_query(self):
# レコードの存在確認
record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter)
# 存在しない場合はInsert
if record_count[0]['count_num'] == 0:
return self.INSERT_QUERY
# 存在する場合ではUpdate
return self.UPDATE_QUERY

View File

@ -0,0 +1,108 @@
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
from src.batch.ultmarc.utmp_tables.tables.com_cop_hp import ComCopHp
class ComCopHpMapper(UltmarcTableMapper):
"""レイアウト区分112: COM_臨床研修病院 登録処理"""
# レコード存在確認SQL
RECORD_EXISTS_QUERY = """\
SELECT
COUNT(*) AS count_num
FROM
src05.com_cop_hp
WHERE
dcf_dsf_inst_cd = :dcfdsf_inst_code
AND
cophp_cd = :cophp_code
AND
openyear = :open_year
"""
# データ登録用SQL
INSERT_QUERY = """\
INSERT INTO src05.com_cop_hp
(
dcf_dsf_inst_cd,
cophp_cd,
openyear,
sortkey,
regist_ymd,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:dcfdsf_inst_code,
:cophp_code,
:open_year,
:sort_key,
:execute_date_str_ymd,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
# データ変更用SQL
UPDATE_QUERY = """\
UPDATE
src05.com_cop_hp
SET
sortkey = :sort_key,
update_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
dcf_dsf_inst_cd = :dcfdsf_inst_code
AND
cophp_cd = :cophp_code
AND
openyear = :open_year
"""
# 削除『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除
PHYSICAL_DELETE_QUERY = """\
DELETE FROM
src05.com_cop_hp
WHERE
dcf_dsf_inst_cd = :dcfdsf_inst_code
AND
cophp_cd = :cophp_code
AND
openyear = :open_year
"""
record: ComCopHp
def __init__(self, record: list[str], db) -> None:
super().__init__(record, db, ComCopHp)
program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている)
# モジュール名をクエリパラメータに設定
self.query_parameter['program_name'] = program_name
# 読み込んだレコード値もクエリパラメータに追加
self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()}
def make_query(self):
# 削除『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除
if self.record.maint_flag == 'B' and self.record.adddel_div == '1':
self.queries.append(self.PHYSICAL_DELETE_QUERY)
return
# 追加、更新の場合
self.queries.append(self.__make_upsert_query())
return
def __make_upsert_query(self):
# レコードの存在確認
record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter)
# 存在しない場合はInsert
if record_count[0]['count_num'] == 0:
return self.INSERT_QUERY
# 存在する場合ではUpdate
# 更新する値が空の場合は、更新処理を行わない
if self.record.sort_key == '':
return None
else:
return self.UPDATE_QUERY

View File

@ -0,0 +1,461 @@
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
from src.batch.ultmarc.utmp_tables.tables.com_dr import ComDr
class ComDrMapper(UltmarcTableMapper):
"""レイアウト区分501: COM_医師 登録処理"""
# レコード存在確認SQL
RECORD_EXISTS_QUERY = """\
SELECT
COUNT(*) AS count_num
FROM
src05.com_dr
WHERE
dcf_pcf_dr_cd = :dcf_pcf_dr_cd
"""
# データ登録用SQL
INSERT_QUERY = """\
INSERT INTO src05.com_dr
(
dcf_pcf_dr_cd,
dr_name_kana,
dr_name,
birthday_era,
birthday_year,
birthday_month,
birthday_day,
birthday,
hometown_cd,
estab_era,
estab_year,
estab_y,
home_phone_number,
home_addr_kana,
home_addr,
home_postal_number,
addr_village_cd,
prefc_cd,
city_cd,
addr_display_number,
addr_cnt_kana,
addr_cnt,
dr_circle_cd,
estab_div_cd,
sex_cd,
delete_sche_reason_cd,
addr_unknown_reason_cd,
alma_cd,
depart_disc_cd,
grad_era,
grad_year,
grad_y,
lump_regist_flg,
opp_dup_cd,
dr_ph_div,
use_stop_div,
use_stop_reason_cd,
use_stop_regist_ymd,
use_stop_cancel_ymd,
drday_era,
drday_year,
drday_y,
abolish_ymd,
delete_flg,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:dcf_pcf_dr_cd,
:dr_name_kana,
:dr_name,
:birthday_era,
:birthday_year,
:birthday_month,
:birthday_day,
:birth_day,
:home_town_code,
:pract_yearera,
:pract_year,
:estab_y,
:dr_tel,
:dr_addr_kana,
:dr_addr,
:dr_zip_code,
:addr_village_cd,
:pref_code,
:city_code,
:dr_addr_num,
:addr_cnt_kana,
:addr_cnt,
:medassoci_code,
:pract_class_code,
:sex_code,
:drdel_code,
:dr_addr_lost_code,
:graduniv_code,
:graduniv_dept_code,
:grad_yearera,
:grad_year,
:grad_y,
:bskregst_flag,
:opp_dup_code,
1,
:use_stop_flag,
:use_stopc_ode,
:cre_stop_date,
:release_date,
:drda_yera,
:drday_year,
:drday_y,
NULL,
0,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
UPDATE_QUERY = """\
UPDATE
src05.com_dr
SET
{update_columns}
dr_ph_div = 1,
abolish_ymd = NULL,
delete_flg = 0,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
dcf_pcf_dr_cd = :dcf_pcf_dr_cd
"""
# 修正区分が「C(削除)」の場合の更新SQL
LOGICAL_DELETE_QUERY = """\
UPDATE
src05.com_dr
SET
abolish_ymd = :maint_date,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
dcf_pcf_dr_cd = :dcf_pcf_dr_cd
"""
# 西暦取得SQL
YEAR_GET_QUERY = """\
SELECT
year AS year
FROM
src05.com_era
WHERE
era_cd = :era_cd
"""
# COM_医師診療科目の物理削除SQL
PHYSICAL_DELETE_QUERY_TRT = """\
DELETE FROM
src05.com_dr_trt_course
WHERE
dcf_pcf_dr_cd = :dcf_pcf_dr_cd
"""
# COM_医師診療科目の登録用SQL
INSERT_QUERY_TRT = """\
INSERT INTO src05.com_dr_trt_course
(
trt_course_cd,
sequence,
dcf_pcf_dr_cd,
regist_ymd,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
{trt_course_code},
{trt_sequence},
:dcf_pcf_dr_cd,
:execute_date_str_ymd,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
record: ComDr
def __init__(self, record: list[str], db) -> None:
super().__init__(record, db, ComDr)
program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている)
# モジュール名をクエリパラメータに設定
self.query_parameter['program_name'] = program_name
# 読み込んだレコード値もクエリパラメータに追加
self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()}
def make_query(self):
# 修正区分がC(削除)の場合、論理削除
if self.record.maint_flag == 'C':
self.queries.append(self.LOGICAL_DELETE_QUERY)
return
# 追加、更新の場合
self.__make_upsert_query()
return
def __make_upsert_query(self):
# 西暦の取得
self.__set_era()
# レコードの存在確認
record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter)
# 存在しない場合はInsert
if record_count[0]['count_num'] == 0:
self.queries.append(self.INSERT_QUERY)
# COM_医師診療科目 削除登録
self.__make_delete_insert_trt_query()
return
# 存在する場合ではUpdate
# COM_医師診療科目 削除登録
self.__make_delete_insert_trt_query()
update_columns = ','.join(self.__make_update_query())
# 何も更新項目が無い場合はNoneとする更新処理は行わない
if len(update_columns) == 0:
self.queries.append(None)
return
else:
# 末尾にカンマを付けてSET句を完成させる
update_columns += ','
update_query = self.UPDATE_QUERY.format(
update_columns=update_columns
)
self.queries.append(update_query)
return
def __make_update_query(self):
set_clauses = [] # 設定項目
# 削除予定理由
if len(self.record.drdel_code) > 0:
set_clauses.append('delete_sche_reason_cd = :drdel_code')
if self.record.drdel_code == '@':
self.query_parameter['drdel_code'] = None
# 重複時相手先コード
if len(self.record.opp_dup_code) > 0:
set_clauses.append('opp_dup_cd = :opp_dup_code')
if self.record.reptdr_id == '@':
self.query_parameter['opp_dup_code'] = None
# 医師名(漢字)
if len(self.record.dr_name) > 0:
set_clauses.append('dr_name = :dr_name')
# 医師名(カナ)
if len(self.record.dr_name_kana) > 0:
set_clauses.append('dr_name_kana = :dr_name_kana')
# 性別
if len(self.record.sex_code) > 0:
set_clauses.append('sex_cd = :sex_code')
# 生年月日
if len(self.record.birthday_era + self.record.birthday_year + self.record.birthday_month + self.record.birthday_day) > 0:
set_clauses.append('birthday_era = :birthday_era')
set_clauses.append('birthday_year = :birthday_year')
set_clauses.append('birthday_month = :birthday_month')
set_clauses.append('birthday_day = :birthday_day')
set_clauses.append('birthday = :birth_day')
if self.record.birthday_era == '@':
self.query_parameter['birthday_era'] = None
self.query_parameter['birthday_year'] = None
self.query_parameter['birthday_month'] = None
self.query_parameter['birthday_day'] = None
self.query_parameter['birth_day'] = None
# 出身都道府県コード
if len(self.record.home_town_code) > 0:
set_clauses.append('hometown_cd = :home_town_code')
# 医師会コード
if len(self.record.medassoci_code) > 0:
set_clauses.append('dr_circle_cd = :medassoci_code')
# 卒年
if len(self.record.grad_yearera + self.record.grad_year) > 0:
set_clauses.append('grad_year = :grad_year')
set_clauses.append('grad_era = :grad_yearera')
set_clauses.append('grad_y = :grad_y')
if self.record.grad_yearera == '@':
self.query_parameter['grad_yearera'] = None
self.query_parameter['grad_year'] = None
self.query_parameter['grad_y'] = None
# 出身校コード
if len(self.record.graduniv_code) > 0:
set_clauses.append('alma_cd = :graduniv_code')
# 出身校学部識別コード
if len(self.record.graduniv_dept_code) > 0:
set_clauses.append('depart_disc_cd = :graduniv_dept_code')
# 登録年
if len(self.record.drda_yera + self.record.drday_year) > 0:
set_clauses.append('drday_era = :drda_yera')
set_clauses.append('drday_year = :drday_year')
set_clauses.append('drday_y = :drday_y')
if self.record.drda_yera == '@':
self.query_parameter['drda_yera'] = None
self.query_parameter['drday_year'] = None
self.query_parameter['drday_y'] = None
# 住所不明
if len(self.record.dr_addr_lost_code) > 0:
set_clauses.append('addr_unknown_reason_cd = :dr_addr_lost_code')
if self.record.dr_addr_lost_code == '@':
self.query_parameter['dr_addr_lost_code'] = None
# 住所
# 集合項目のいずれかに入力がある場合に更新
if sum(len(item) for item in self.record.address_aggregation_items) > 0:
set_clauses.append('home_addr_kana = :dr_addr_kana')
set_clauses.append('home_addr = :dr_addr')
set_clauses.append('home_postal_number = :dr_zip_code')
set_clauses.append('addr_village_cd = :addr_village_cd')
set_clauses.append('prefc_cd = :pref_code')
set_clauses.append('city_cd = :city_code')
set_clauses.append('addr_display_number = :dr_addr_num')
set_clauses.append('addr_cnt_kana = :addr_cnt_kana')
set_clauses.append('addr_cnt = :addr_cnt')
# 自宅電話番号
if len(self.record.dr_tel) > 0:
set_clauses.append('home_phone_number = :dr_tel')
if self.record.dr_tel == '@':
self.query_parameter['dr_tel'] = None
# 利用停止区分
if len(self.record.use_stop_flag) > 0:
set_clauses.append('use_stop_div = :use_stop_flag')
if self.record.use_stop_flag == '@':
self.query_parameter['use_stop_flag'] = None
# 利用停止理由
if len(self.record.use_stopc_ode) > 0:
set_clauses.append('use_stop_reason_cd = :use_stopc_ode')
if self.record.use_stopc_ode == '@':
self.query_parameter['use_stopc_ode'] = None
# 利用停止登録年月日
if len(self.record.cre_stop_date) > 0:
set_clauses.append('use_stop_regist_ymd = :cre_stop_date')
if self.record.cre_stop_date == '@':
self.query_parameter['cre_stop_date'] = None
# 利用停止解除年月日
if len(self.record.release_date) > 0:
set_clauses.append('use_stop_cancel_ymd = :release_date')
if self.record.release_date == '@':
self.query_parameter['release_date'] = None
# 開勤区分
if len(self.record.pract_class_code) > 0:
set_clauses.append('estab_div_cd = :pract_class_code')
# 開業年
if len(self.record.pract_yearera + self.record.pract_year) > 0:
set_clauses.append('estab_era = :pract_yearera')
set_clauses.append('estab_year = :pract_year')
set_clauses.append('estab_y = :estab_y')
if self.record.pract_yearera == '@':
self.query_parameter['pract_yearera'] = None
self.query_parameter['pract_year'] = None
self.query_parameter['estab_y'] = None
# 一括登録フラグ
if len(self.record.bskregst_flag) > 0:
set_clauses.append('lump_regist_flg = :bskregst_flag')
return set_clauses
def __make_delete_insert_trt_query(self):
# 診療科目(集合項目)のいずれかに入力がある場合
if sum(len(item) for item in self.record.medsbj_code_items) == 0:
return
# 削除
self.queries.append(self.PHYSICAL_DELETE_QUERY_TRT)
# @マークの場合は、登録しない
if self.record.medsbj_code1 == '@':
return
# 登録
for num, m_code in enumerate(self.record.medsbj_code_items, start=1):
if len(m_code) > 0:
insert_trt_query = self.INSERT_QUERY_TRT.format(
trt_course_code=f':medsbj_code{num}',
trt_sequence=num
)
self.queries.append(insert_trt_query)
return
def __set_era(self):
# 西暦の取得
# 生年月日(西暦)
western_year: str = ""
if self.record.birthday_era != "@" and len(self.record.birthday_era) > 0 and len(self.record.birthday_year) > 0:
self.query_parameter['era_cd'] = self.record.birthday_era
record_year = self.db.execute_select(self.YEAR_GET_QUERY, self.query_parameter)
western_year = str(int(record_year[0]['year']) + int(self.record.birthday_year))
# 生年月日の設定
self.query_parameter['birth_day'] = self.__set_birthday(western_year)
# 開業年(西暦)
if self.record.pract_yearera != "@" and len(self.record.pract_yearera) > 0 and len(self.record.pract_year) > 0:
self.query_parameter['era_cd'] = self.record.pract_yearera
record_year = self.db.execute_select(self.YEAR_GET_QUERY, self.query_parameter)
self.query_parameter['estab_y'] = str(int(record_year[0]['year']) + int(self.record.pract_year))
# 卒業年(西暦)
if self.record.grad_yearera != "@" and len(self.record.grad_yearera) > 0 and len(self.record.grad_year) > 0:
self.query_parameter['era_cd'] = self.record.grad_yearera
record_year = self.db.execute_select(self.YEAR_GET_QUERY, self.query_parameter)
self.query_parameter['grad_y'] = str(int(record_year[0]['year']) + int(self.record.grad_year))
# 登録年(西暦)
if self.record.drda_yera != "@" and len(self.record.drda_yera) > 0 and len(self.record.drday_year) > 0:
self.query_parameter['era_cd'] = self.record.drda_yera
record_year = self.db.execute_select(self.YEAR_GET_QUERY, self.query_parameter)
self.query_parameter['drday_y'] = str(int(record_year[0]['year']) + int(self.record.drday_year))
return
def __set_birthday(self, western_year: str = ""):
# 生年月日を設定
# 年(西暦)、月、日を連結
birth_day = ''.join([western_year, self.record.birthday_month, self.record.birthday_day])
# 年(西暦)、月、日が全て揃っている場合
if len(birth_day) == 8:
return birth_day
# 西暦が空の場合、先頭に半角スペース4つで連結
if len(western_year) == 0 and len(self.record.birthday_month) > 0 and len(self.record.birthday_day) > 0:
return f' {self.record.birthday_month}{self.record.birthday_day}'
# 月日も空の場合、生年月日は空
return ''

View File

@ -0,0 +1,97 @@
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
from src.batch.ultmarc.utmp_tables.tables.com_dr_sosiety import ComDrSosiety
class ComDrSosietyMapper(UltmarcTableMapper):
"""レイアウト区分521: COM_所属学会 登録処理"""
# レコード存在確認SQL
RECORD_EXISTS_QUERY = """\
SELECT
COUNT(*) AS count_num
FROM
src05.com_dr_sosiety
WHERE
sosiety_cd = :sosiety_cd
AND
dcf_pcf_dr_cd = :dcf_pcf_dr_cd
"""
# データ登録用SQL
INSERT_QUERY = """\
INSERT INTO src05.com_dr_sosiety
(
sosiety_cd,
dcf_pcf_dr_cd,
sosiety_f,
regist_ymd,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:sosiety_cd,
:dcf_pcf_dr_cd,
:sosiety_f,
:execute_date_str_ymd,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
UPDATE_QUERY = """\
UPDATE
src05.com_dr_sosiety
SET
sosiety_f = :sosiety_f,
update_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
sosiety_cd = :sosiety_cd
AND
dcf_pcf_dr_cd = :dcf_pcf_dr_cd
"""
# 削除『修正区分がB(修正)かつ追加削除区分が1(退職)』SQL
PHYSICAL_DELETE_QUERY = """\
DELETE FROM
src05.com_dr_sosiety
WHERE
sosiety_cd = :sosiety_cd
AND
dcf_pcf_dr_cd = :dcf_pcf_dr_cd
"""
record: ComDrSosiety
def __init__(self, record: list[str], db) -> None:
super().__init__(record, db, ComDrSosiety)
program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている)
# モジュール名をクエリパラメータに設定
self.query_parameter['program_name'] = program_name
# 読み込んだレコード値もクエリパラメータに追加
self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()}
def make_query(self):
# 削除『修正区分がB(修正)かつ追加削除区分が1(退職)』
if self.record.maint_flag == 'B' and self.record.cont_flag == '1':
self.queries.append(self.PHYSICAL_DELETE_QUERY)
return
# 追加、更新の場合
self.queries.append(self.__make_upsert_query())
return
def __make_upsert_query(self):
# レコードの存在確認
record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter)
# 存在しない場合はInsert
if record_count[0]['count_num'] == 0:
return self.INSERT_QUERY
# 存在する場合ではUpdate
return self.UPDATE_QUERY

View File

@ -0,0 +1,258 @@
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
from src.batch.ultmarc.utmp_tables.tables.com_dr_wrkplace import ComDrWrkplace
class ComDrWrkplaceMapper(UltmarcTableMapper):
"""レイアウト区分502:COM_医師勤務先 登録処理"""
# レコード存在確認SQL
RECORD_EXISTS_QUERY = """\
SELECT
COUNT(*) AS count_num
FROM
src05.com_dr_wrkplace
WHERE
dcf_pcf_dr_cd = :full_dcfdr_code
AND dcf_dsf_inst_cd = :full_hp_code
"""
# COM_所属部課から所属部科カナと所属部科名を取得するSQL
GET_NAME_FROM_COM_BLNG_SEC_QUERY = """\
SELECT
blng_sec_kana,
blng_sec_name
FROM
src05.com_blng_sec
WHERE
blng_sec_cd = :sectcode
"""
# データ登録用SQL
INSERT_QUERY = """\
INSERT INTO src05.com_dr_wrkplace (
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,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:full_hp_code,
:full_dcfdr_code,
:sectcode,
:postcode,
:identitycode,
:syor_date,
:sectname_kana,
:sectname,
:notdm_flg,
:execute_date_str_ymd,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
# 更新用SQL
UPDATE_QUERY = """\
UPDATE src05.com_dr_wrkplace
SET
{update_columns}
update_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
DCF_PCF_DR_CD= :full_dcfdr_code
AND DCF_DSF_INST_CD = :full_hp_code
"""
# 更新・削除の場合に該当のデータを履歴テーブルに退避するSQL
TO_HISTORY_QUERY = """\
INSERT INTO src05.com_dr_wrkplace_his (
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,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
SELECT
dcf_dsf_inst_cd,
dcf_pcf_dr_cd,
(
CASE
WHEN blng_sec_cd = '' THEN '9999'
ELSE blng_sec_cd
END
) AS blng_sec_cd,
(
CASE
WHEN post_cd = '' THEN '999'
ELSE post_cd
END
) AS post_cd,
(
CASE
WHEN identity_cd = '' THEN '999'
ELSE identity_cd
END
) AS identity_cd,
DATE_FORMAT(aply_start_ymd, '%Y%m%d'),
blng_sec_name_kana,
blng_sec_name,
notdm_flg,
(
CASE
WHEN DATE_FORMAT(aply_start_ymd, '%Y%m%d') > DATE_FORMAT(DATE_SUB(:syor_date, INTERVAL 1 DAY), '%Y%m%d') THEN DATE_FORMAT(aply_start_ymd, '%Y%m%d')
ELSE DATE_FORMAT(DATE_SUB(:syor_date, INTERVAL 1 DAY), '%Y%m%d')
END
) AS aply_end_ymd,
:execute_date_str_ymd,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
FROM
src05.com_dr_wrkplace
WHERE
dcf_pcf_dr_cd = :full_dcfdr_code
AND dcf_dsf_inst_cd = :full_hp_code
AND aply_start_ymd < :syor_date
"""
# 退職レコードの場合、物理削除するSQL
PHYSICAL_DELETE_FOR_RETIREMENT_QUERY = """\
DELETE FROM src05.com_dr_wrkplace
WHERE
dcf_pcf_dr_cd = :full_dcfdr_code
AND dcf_dsf_inst_cd = :full_hp_code
"""
record: ComDrWrkplace
def __init__(self, record: list[str], db) -> None:
super().__init__(record, db, ComDrWrkplace)
program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている)
# モジュール名をクエリパラメータに設定
self.query_parameter['program_name'] = program_name
# 読み込んだレコード値もクエリパラメータに追加
self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()}
def make_query(self):
# 所属部科を取得し、所属部科カナと所属部科名を設定する
self.__set_sect_name_and_sect_name_kana()
# 追加/更新クエリを生成
# 履歴へのレコード登録もあるため、リストで返る
self.queries = self.__make_queries()
return
def __set_sect_name_and_sect_name_kana(self):
# 所属部科を取得し、所属部科カナと所属部科名を設定する
com_blng_sec_records = self.db.execute_select(self.GET_NAME_FROM_COM_BLNG_SEC_QUERY, self.query_parameter)
if len(com_blng_sec_records) == 0:
return
# 必ず1件
com_blng_sec_record = com_blng_sec_records[0]
if com_blng_sec_record['blng_sec_kana'] != '' and com_blng_sec_record['blng_sec_kana'] is not None:
self.record.sectname_kana = com_blng_sec_record['blng_sec_kana']
self.query_parameter['sectname_kana'] = com_blng_sec_record['blng_sec_kana']
if com_blng_sec_record['blng_sec_name'] != '' and com_blng_sec_record['blng_sec_name'] is not None:
self.record.sectname = com_blng_sec_record['blng_sec_name']
self.query_parameter['sectname'] = com_blng_sec_record['blng_sec_name']
def __make_queries(self):
# レコードの存在確認
record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter)
# 存在しない場合はInsert
if record_count[0]['count_num'] == 0:
return [self.INSERT_QUERY]
# 存在する場合はUpdate
# 予備/退職異動区分が1(削除:退職)の場合、退職済みのレコードとして処理
if self.record.drretflag == '1':
# 履歴への移動と、退職レコードの物理削除
return [self.TO_HISTORY_QUERY, self.PHYSICAL_DELETE_FOR_RETIREMENT_QUERY]
# 履歴への移動+更新クエリ生成
return self.__make_update_query()
def __make_update_query(self):
make_history_query = None
# 履歴レコード作成判断となる、UPDATE SET句を作成
set_clauses_with_historical = self.__make_update_columns_with_historical()
# 履歴レコード作成判断とならない、UPDATE SET句
set_clause_without_historical = []
# DM不可フラグの値をセット
# 履歴レコード作成判断とならないため、後から設定
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 = :notdm_flg')
# 何かしら更新がある場合、履歴作成クエリを作成
if len(set_clauses_with_historical) != 0:
make_history_query = self.TO_HISTORY_QUERY
update_columns = ','.join(set_clauses_with_historical + set_clause_without_historical)
if len(update_columns) == 0:
update_query = None
else:
# 何かしら更新がある場合、末尾にカンマを付けてSET句を完成させる
update_columns += ','
update_query = self.UPDATE_QUERY.format(
update_columns=update_columns
)
return [make_history_query, update_query]
def __make_update_columns_with_historical(self):
# 履歴レコードの作成有無を判断するカラムの更新設定
# DM不可フラグは、履歴レコードの作成判断に使わないため、この関数の外で判定する
set_clauses = []
# 役職コード
if self.record.postcode != '':
set_clauses.append('post_cd = :postcode')
self.query_parameter['postcode'] = '' if self.record.postcode == '@' else self.record.postcode
# 大学順位
if self.record.identitycode != '':
set_clauses.append('identity_cd = :identitycode')
self.query_parameter['identitycode'] = '' if self.record.identitycode == '@' else self.record.identitycode
# 所属部科(集合項目)
if self.record.sectcode != '':
# 所属部科コード
self.query_parameter['sectcode'] = '9999' if self.record.sectcode == '@' else self.record.sectcode
set_clauses.append('blng_sec_cd = :sectcode')
# 所属部科(カナ)
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 = :sectname_kana')
# 所属部科(漢字)
# 全角文字なので、修正項目として全角@が連携されるパターンがある
sectname = None if self.record.sectname == '' else self.record.sectname
self.query_parameter['sectname'] = sectname
set_clauses.append(f'blng_sec_name = :sectname')
# 何かしら更新がある場合、適用開始日をセットする
if len(set_clauses) != 0:
# 処理日はパラメータに設定済み
set_clauses.append("aply_start_ymd = DATE_FORMAT(:syor_date, '%Y%m%d')")
return set_clauses

View File

@ -0,0 +1,95 @@
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
from src.batch.ultmarc.utmp_tables.tables.com_forfront_med_equip import ComForfrontMedEquip
class ComForfrontMedEquipMapper(UltmarcTableMapper):
"""レイアウト区分022: COM_先端医療機器 登録処理 """
# レコード存在確認SQL
RECORD_EXISTS_QUERY = """\
SELECT
COUNT(*) AS count_num
FROM
src05.com_forfront_med_equip
WHERE
forfront_med_equip_cd = :hi_medicmach_code
"""
# データ登録用SQL
INSERT_QUERY = """\
INSERT INTO src05.com_forfront_med_equip
(
forfront_med_equip_cd,
forfront_med_equip_name,
regist_ymd,
delete_ymd,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:hi_medicmach_code,
:hi_medicmach_name,
:execute_date_str_ymd,
NULL,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
# 更新用SQL
UPDATE_QUERY = """\
UPDATE src05.com_forfront_med_equip
SET
forfront_med_equip_name = :hi_medicmach_name,
update_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
forfront_med_equip_cd = :hi_medicmach_code
"""
# 修正区分が「C(削除)」の場合の更新SQL
# 削除年月日 ← システム日付
LOGICAL_DELETE_QUERY = """\
UPDATE
src05.com_forfront_med_equip
SET
delete_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
forfront_med_equip_cd = :hi_medicmach_code
"""
record: ComForfrontMedEquip
def __init__(self, record: list[str], db) -> None:
super().__init__(record, db, ComForfrontMedEquip)
program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている)
# モジュール名をクエリパラメータに設定
self.query_parameter['program_name'] = program_name
# 読み込んだレコード値もクエリパラメータに追加
self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()}
def make_query(self):
# 修正区分がC(削除)の場合、論理削除
if self.record.maint_flag == 'C':
self.queries.append(self.LOGICAL_DELETE_QUERY)
return
# 追加、更新の場合
self.queries.append(self.__make_upsert_query())
return
def __make_upsert_query(self):
# レコードの存在確認
record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter)
# 存在しない場合はInsert
if record_count[0]['count_num'] == 0:
return self.INSERT_QUERY
# 存在する場合はUpdate
return self.UPDATE_QUERY

View File

@ -0,0 +1,96 @@
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
from src.batch.ultmarc.utmp_tables.tables.com_hamtec import ComHamtec
class ComHamtecMapper(UltmarcTableMapper):
"""レイアウト区分021: COM_高度先進医療 登録処理"""
# レコード存在確認SQL
RECORD_EXISTS_QUERY = """\
SELECT
COUNT(*) AS count_num
FROM
src05.com_hamtec
WHERE
hamtec_cd = :hamtec_cd
"""
# データ登録用SQL
INSERT_QUERY = """\
INSERT INTO src05.com_hamtec
(
hamtec_cd,
hamtec_div,
hamtec_name,
regist_ymd,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:hamtec_cd,
:hamtec_div,
:hamtec_name,
:execute_date_str_ymd,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
# 更新用SQL
UPDATE_QUERY = """\
UPDATE
src05.com_hamtec
SET
hamtec_div = :hamtec_div,
hamtec_name = :hamtec_name,
update_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
hamtec_cd = :hamtec_cd
"""
# 修正区分が「C(削除)」の場合の更新SQL
LOGICAL_DELETE_QUERY = """\
UPDATE
src05.com_hamtec
SET
delete_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
hamtec_cd = :hamtec_cd
"""
record: ComHamtec
def __init__(self, record: list[str], db) -> None:
super().__init__(record, db, ComHamtec)
program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている)
# モジュール名をクエリパラメータに設定
self.query_parameter['program_name'] = program_name
# 読み込んだレコード値もクエリパラメータに追加
self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()}
def make_query(self):
# 修正区分がC(削除)の場合、論理削除
if self.record.maint_flag == 'C':
self.queries.append(self.LOGICAL_DELETE_QUERY)
return
# 追加、更新の場合
self.queries.append(self.__make_upsert_query())
return
def __make_upsert_query(self):
# レコードの存在確認
record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter)
# 存在しない場合はInsert
if record_count[0]['count_num'] == 0:
return self.INSERT_QUERY
# 存在する場合はUpdate
return self.UPDATE_QUERY

View File

@ -0,0 +1,93 @@
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
from src.batch.ultmarc.utmp_tables.tables.com_hp_assrt import ComHpAssrt
class ComHpAssrtMapper(UltmarcTableMapper):
"""レイアウト区分002: COM_病院種別 登録処理"""
# レコード存在確認SQL
RECORD_EXISTS_QUERY = """\
SELECT
COUNT(*) AS count_num
FROM
src05.com_hp_assrt
WHERE
hp_assrt_cd = :hp_assrt_cd
"""
# データ登録用SQL
INSERT_QUERY = """\
INSERT INTO src05.com_hp_assrt
(
hp_assrt_cd,
hp_assrt_name,
regist_ymd,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:hp_assrt_cd,
:hp_assrt_name,
:execute_date_str_ymd,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
# 更新用SQL
UPDATE_QUERY = """\
UPDATE
src05.com_hp_assrt
SET
hp_assrt_name = :hp_assrt_name,
update_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
hp_assrt_cd = :hp_assrt_cd
"""
# 修正区分が「C(削除)」の場合の更新SQL
LOGICAL_DELETE_QUERY = """\
UPDATE
src05.com_hp_assrt
SET
delete_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
hp_assrt_cd = :hp_assrt_cd
"""
record: ComHpAssrt
def __init__(self, record: list[str], db) -> None:
super().__init__(record, db, ComHpAssrt)
program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている)
# モジュール名をクエリパラメータに設定
self.query_parameter['program_name'] = program_name
# 読み込んだレコード値もクエリパラメータに追加
self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()}
def make_query(self):
# 修正区分がC(削除)の場合、論理削除
if self.record.maint_flag == 'C':
self.queries.append(self.LOGICAL_DELETE_QUERY)
return
# 追加、更新の場合
self.queries.append(self.__make_upsert_query())
return
def __make_upsert_query(self):
# レコードの存在確認
record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter)
# 存在しない場合はInsert
if record_count[0]['count_num'] == 0:
return self.INSERT_QUERY
# 存在する場合ではUpdate
return self.UPDATE_QUERY

View File

@ -0,0 +1,93 @@
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
from src.batch.ultmarc.utmp_tables.tables.com_inst_div import ComInstDiv
class ComInstDivMapper(UltmarcTableMapper):
"""レイアウト区分011: COM_施設区分 登録処理"""
# レコード存在確認SQL
RECORD_EXISTS_QUERY = """\
SELECT
COUNT(*) AS count_num
FROM
src05.com_inst_div
WHERE
inst_div_cd = :inst_div_cd
"""
# データ登録用SQL
INSERT_QUERY = """\
INSERT INTO src05.com_inst_div
(
inst_div_cd,
inst_div_name,
regist_ymd,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:inst_div_cd,
:inst_div_name,
:execute_date_str_ymd,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
# 変更用SQL
UPDATE_QUERY = """\
UPDATE
src05.com_inst_div
SET
inst_div_name = :inst_div_name,
update_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
inst_div_cd = :inst_div_cd
"""
# 修正区分が「C(削除)」の場合の更新SQL
LOGICAL_DELETE_QUERY = """\
UPDATE
src05.com_inst_div
SET
delete_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
inst_div_cd = :inst_div_cd
"""
record: ComInstDiv
def __init__(self, record: list[str], db) -> None:
super().__init__(record, db, ComInstDiv)
program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている)
# モジュール名をクエリパラメータに設定
self.query_parameter['program_name'] = program_name
# 読み込んだレコード値もクエリパラメータに追加
self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()}
def make_query(self):
# 修正区分がC(削除)の場合、論理削除
if self.record.maint_flag == 'C':
self.queries.append(self.LOGICAL_DELETE_QUERY)
return
# 追加、更新の場合
self.queries.append(self.__make_upsert_query())
return
def __make_upsert_query(self):
# レコードの存在確認
record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter)
# 存在しない場合はInsert
if record_count[0]['count_num'] == 0:
return self.INSERT_QUERY
# 存在する場合ではUpdate
return self.UPDATE_QUERY

View File

@ -0,0 +1,531 @@
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
from src.batch.ultmarc.utmp_tables.tables.com_inst import ComInst
class ComInstMapper(UltmarcTableMapper):
"""レイアウト区分101: COM_施設 登録処理"""
# レコード存在確認SQL(COM_施設)
RECORD_EXISTS_QUERY = """\
SELECT
COUNT(*) AS count_num
FROM
src05.com_inst
WHERE
dcf_dsf_inst_cd = :dcfdsf_inst_code
"""
# データ登録用SQL(COM_施設)
INSERT_INST_QUERY = """\
INSERT INTO src05.com_inst
(
dcf_dsf_inst_cd,
inst_div_cd,
addr_unknown_reason_cd,
form_inst_name_kana,
inst_name_kana,
form_inst_name_kanji,
inst_name_kanji,
rltd_univ_prnt_cd,
bed_num,
close_flg,
estab_sche_flg,
close_start_ym,
estab_sche_ym,
ward_abolish_flg,
inst_repre_cd,
inst_repre_kana,
inst_repre,
phone_number_non_flg,
unconf_flg,
inst_phone_number,
inst_addr_kana,
inst_addr,
postal_number,
village_cd,
prefc_cd,
city_cd,
addr_display_number,
addr_cnt_kana,
addr_cnt,
manage_cd,
delete_sche_reason_cd,
hp_assrt_cd,
dup_opp_cd,
insp_item_micrb,
insp_item_serum,
insp_item_blood,
insp_item_patho,
insp_item_paras,
insp_item_biochem,
insp_item_ri,
re_exam_cd,
prmit_bed_num_other,
prmit_bed_num_mental,
prmit_bed_num_tuber,
prmit_bed_num_infection,
prmit_bed_num_sum,
prmit_bed_num_gen,
prmit_bed_num_rcup,
prmit_bed_maint_ymd,
inst_pharm_div,
abolish_ymd,
delete_flg,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:dcfdsf_inst_code,
:hp_class_code,
:hp_addr_lost_code,
:hp_name_kana,
:hp_ryaku_name_kana,
:hp_name,
:hp_ryaku_name,
:univ_prnt_code,
:bed_num,
:close_flag,
:open_flag,
:close_year_month,
:open_year_month,
:close_flag2,
:inst_repre_code,
:president_kana,
:president,
:tel_nothing_flag,
:uncheck_flag,
:hp_tel,
:hp_addr_kana,
:hp_addr,
:hp_zip_code,
:village_code,
:pref_code,
:city_code,
:hp_addr_number,
:addr_cnt_kana,
:addr_cnt,
:mgt_class_code,
:hpdel_code,
:hp_kind_code,
:dup_opp_code,
:inspect_code1,
:inspect_code2,
:inspect_code3,
:inspect_code4,
:inspect_code5,
:inspect_code6,
:inspect_code7,
:reexam_flag,
:bed_num_gen,
:bed_num_psy,
:bed_num_tub,
:bed_num_epi,
:bed_num_sum,
:bed_num_gen2,
:bed_num_rest,
:bed_class_maint_date,
1,
NULL,
0,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
# データ更新用SQL(COM_施設)
UPDATE_INST_QUERY = """\
UPDATE
src05.com_inst
SET
{update_columns}
abolish_ymd = NULL,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
dcf_dsf_inst_cd = :dcfdsf_inst_code
"""
# 修正区分が「C(削除)」の場合の更新SQL
LOGICAL_DELETE_QUERY = """\
UPDATE
src05.com_inst
SET
abolish_ymd = :maint_date,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
dcf_dsf_inst_cd = :dcfdsf_inst_code
"""
# データ登録用SQL(COM_施設診療科目)
INSERT_INST_TRT_QUERY = """\
INSERT INTO src05.com_inst_trt_course
(
dcf_dsf_inst_cd,
trt_course_cd,
regist_ymd,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:dcfdsf_inst_code,
{trt_course_cd},
:execute_date_str_ymd,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
# データ削除用SQL(COM_施設診療科目)
PHYSICAL_DELETE_TRT_QUERY = """\
DELETE FROM
src05.com_inst_trt_course
WHERE
dcf_dsf_inst_cd = :dcfdsf_inst_code
"""
# レコード存在確認SQL(COM_特養医務室)
RECORD_EXISTS_SPCARE_QUERY = """\
SELECT
COUNT(*) AS count_num
FROM
src05.com_spcare_med_office_dat
WHERE
dcf_chld_inst_cd = :dcfdsf_inst_code
"""
# データ更新用SQL(COM_特養医務室)
UPDATE_SPCARE_QUERY = """\
UPDATE
src05.com_spcare_med_office_dat
SET
dcf_prnt_inst_cd = :dcf_prnt_inst_code,
update_ymd = :execute_date_str_ymd,
delete_ymd = :delete_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
dcf_chld_inst_cd = :dcfdsf_inst_code
"""
# データ登録用SQL(COM_特養医務室)
INSERT_SPCARE_QUERY = """\
INSERT INTO src05.com_spcare_med_office_dat
(
dcf_chld_inst_cd,
dcf_prnt_inst_cd,
regist_ymd,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:dcfdsf_inst_code,
:dcf_prnt_inst_code,
:execute_date_str_ymd,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
record: ComInst
def __init__(self, record: list[str], db) -> None:
super().__init__(record, db, ComInst)
program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている)
# モジュール名をクエリパラメータに設定
self.query_parameter['program_name'] = program_name
# 読み込んだレコード値もクエリパラメータに追加
self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()}
def make_query(self):
# 修正区分がC(削除)の場合、論理削除
if self.record.maint_flag == 'C':
self.queries.append(self.LOGICAL_DELETE_QUERY)
return
# 追加、更新の場合
self.__make_upsert_query()
return
def __make_upsert_query(self):
# レコードの存在確認(施設)
record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter)
if record_count[0]['count_num'] == 0:
# 存在しない場合はInsert
self.queries.append(self.INSERT_INST_QUERY)
else:
# 存在する場合はUpdate(施設)
self.__make_update_query()
# 施設診療科目の削除挿入
self.__make_delete_insert_trt_query()
# 特養医務室の追加更新
self.__make_upsert_spcare_query()
return
def __make_update_query(self):
# 存在する場合はUpdate(施設)
set_clauses = [] # 設定項目
# 施設区分コード
if len(self.record.hp_class_code) > 0:
set_clauses.append('inst_div_cd = :hp_class_code')
# 正式施設名(カナ)
if len(self.record.hp_name_kana) > 0:
set_clauses.append('form_inst_name_kana = :hp_name_kana')
# 略式施設名(カナ)
if len(self.record.hp_ryaku_name_kana) > 0:
set_clauses.append('inst_name_kana = :hp_ryaku_name_kana')
# 正式施設名(漢字)
if len(self.record.hp_name) > 0:
set_clauses.append('form_inst_name_kanji = :hp_name')
# 略式施設名(漢字)
if len(self.record.hp_ryaku_name) > 0:
set_clauses.append('inst_name_kanji = :hp_ryaku_name')
# 施設住所カナ
if len(self.record.hp_addr_kana) > 0:
set_clauses.append('inst_addr_kana = :hp_addr_kana')
# 施設住所
if len(self.record.hp_addr) > 0:
set_clauses.append('inst_addr = :hp_addr')
# 郵便番号
if len(self.record.hp_zip_code) > 0:
set_clauses.append('postal_number = :hp_zip_code')
# 町字コード・都道府県コード・市区町村コード
if len(self.record.village_code + self.record.pref_code + self.record.city_code) > 0:
set_clauses.append('village_cd = :village_code')
set_clauses.append('prefc_cd = :pref_code')
set_clauses.append('city_cd = :city_code')
# 住所カウント
if len(self.record.pref_code) > 0:
set_clauses.append('addr_cnt_kana = :addr_cnt_kana')
set_clauses.append('addr_cnt = :addr_cnt')
# 住所表示番号
if len(self.record.hp_addr_number) > 0:
set_clauses.append('addr_display_number = :hp_addr_number')
# 経営体コード
if len(self.record.mgt_class_code) > 0:
set_clauses.append('manage_cd = :mgt_class_code')
# 病院種別
if len(self.record.hp_kind_code) > 0:
set_clauses.append('hp_assrt_cd = :hp_kind_code')
# 再審査コード
if len(self.record.reexam_flag) > 0:
set_clauses.append('re_exam_cd = :reexam_flag')
# 未確認フラグ
if len(self.record.uncheck_flag) > 0:
set_clauses.append('unconf_flg = :uncheck_flag')
if self.record.uncheck_flag == '@':
self.query_parameter['uncheck_flag'] = None
# 削除予定理由コード
if len(self.record.hpdel_code) > 0:
set_clauses.append('delete_sche_reason_cd = :hpdel_code')
if self.record.hpdel_code == '@':
self.query_parameter['hpdel_code'] = None
# 重複時相手先コード
if len(self.record.dup_opp_code) > 0:
set_clauses.append('dup_opp_cd = :dup_opp_code')
if self.record.duphp_id == '@':
self.query_parameter['dup_opp_code'] = None
# 住所不明理由コード
if len(self.record.hp_addr_lost_code) > 0:
set_clauses.append('addr_unknown_reason_cd = :hp_addr_lost_code')
if self.record.hp_addr_lost_code == '@':
self.query_parameter['hp_addr_lost_code'] = None
# 電話番号なしフラグ
if len(self.record.tel_nothing_flag) > 0:
set_clauses.append('phone_number_non_flg = :tel_nothing_flag')
if self.record.tel_nothing_flag == '@':
self.query_parameter['tel_nothing_flag'] = None
# 電話番号
if len(self.record.hp_tel) > 0:
set_clauses.append('inst_phone_number = :hp_tel')
if self.record.hp_tel == '@':
self.query_parameter['hp_tel'] = None
# 施設代表者コード
if len(self.record.inst_repre_code) > 0:
set_clauses.append('inst_repre_cd = :inst_repre_code')
if self.record.president_id == '@':
self.query_parameter['inst_repre_code'] = None
# 代表者(カナ)
if len(self.record.president_kana) > 0:
set_clauses.append('inst_repre_kana = :president_kana')
if self.record.president_kana == '@':
self.query_parameter['president_kana'] = None
# 代表者(漢字) ※「@」が大文字
if len(self.record.president) > 0:
set_clauses.append('inst_repre = :president')
if self.record.president == '':
self.query_parameter['president'] = None
# 開業予定フラグ・開業予定年月
if len(self.record.open_flag + self.record.open_year_month) > 0:
set_clauses.append('estab_sche_flg = :open_flag')
set_clauses.append('estab_sche_ym = :open_year_month')
if self.record.open_flag == '@':
self.query_parameter['open_flag'] = None
self.query_parameter['open_year_month'] = None
# 休院フラグ・休院開始年月
if len(self.record.close_flag + self.record.close_year_month) > 0:
set_clauses.append('close_flg = :close_flag')
set_clauses.append('close_start_ym = :close_year_month')
if self.record.close_flag == '@':
self.query_parameter['close_flag'] = None
self.query_parameter['close_year_month'] = None
# 関連大学親コード
if len(self.record.univ_prnt_code) > 0:
set_clauses.append('rltd_univ_prnt_cd = :univ_prnt_code')
if self.record.assoc_parrent_id == '@':
self.query_parameter['univ_prnt_code'] = None
# 病棟閉鎖フラグ
if len(self.record.close_flag2) > 0:
set_clauses.append('ward_abolish_flg = :close_flag2')
if self.record.close_flag2 == '@':
self.query_parameter['close_flag2'] = None
# 病床数(定員)
if self.record.bed_num is not None:
set_clauses.append('bed_num = :bed_num')
if self.record.bed_num == '@':
self.query_parameter['bed_num'] = None
# 許可病床メンテ日付
if len(self.record.bed_class_maint_date) > 0:
set_clauses.append('prmit_bed_maint_ymd = :bed_class_maint_date')
if self.record.bed_class_maint_date == '@':
self.query_parameter['bed_class_maint_date'] = None
# 許可ベッド数(合計、精神、結核、感染、その他、一般病床、療養病床)
if not self.record.prmit_bed.count(None) == len(self.record.prmit_bed):
set_clauses.append('prmit_bed_num_sum = :bed_num_sum')
set_clauses.append('prmit_bed_num_mental = :bed_num_psy')
set_clauses.append('prmit_bed_num_tuber = :bed_num_tub')
set_clauses.append('prmit_bed_num_infection = :bed_num_epi')
set_clauses.append('prmit_bed_num_other = :bed_num_gen')
set_clauses.append('prmit_bed_num_gen = :bed_num_gen2')
set_clauses.append('prmit_bed_num_rcup = :bed_num_rest')
if self.record.bed_num_sum == '@':
self.query_parameter['bed_num_sum'] = None
self.query_parameter['bed_num_psy'] = None
self.query_parameter['bed_num_tub'] = None
self.query_parameter['bed_num_epi'] = None
self.query_parameter['bed_num_gen'] = None
self.query_parameter['bed_num_gen2'] = None
self.query_parameter['bed_num_rest'] = None
# 検査項目(微生物、血清、血液、病理、寄生虫、生化、RI)
if sum(len(item) for item in self.record.insp_item) > 0:
set_clauses.append('insp_item_micrb = :inspect_code1')
set_clauses.append('insp_item_serum = :inspect_code2')
set_clauses.append('insp_item_blood = :inspect_code3')
set_clauses.append('insp_item_patho = :inspect_code4')
set_clauses.append('insp_item_paras = :inspect_code5')
set_clauses.append('insp_item_biochem = :inspect_code6')
set_clauses.append('insp_item_ri = :inspect_code7')
if self.record.inspect_code1 == '@':
self.query_parameter['inspect_code1'] = None
self.query_parameter['inspect_code2'] = None
self.query_parameter['inspect_code3'] = None
self.query_parameter['inspect_code4'] = None
self.query_parameter['inspect_code5'] = None
self.query_parameter['inspect_code6'] = None
self.query_parameter['inspect_code7'] = None
update_columns = ','.join(set_clauses)
# 何も更新項目が無い場合は更新処理は行わない
if len(update_columns) == 0:
self.queries.append(None)
return
else:
update_columns += ','
update_query = self.UPDATE_INST_QUERY.format(
update_columns=update_columns
)
self.queries.append(update_query)
return
def __make_delete_insert_trt_query(self):
# 施設診療科目の削除挿入
# 診療科目(集合項目)のいずれも入力がない場合、何もしない
if sum(len(item) for item in self.record.medsbj_code) == 0:
return
# 削除
self.queries.append(self.PHYSICAL_DELETE_TRT_QUERY)
if self.record.medsbj_code[0] == "@":
return
# 診療科目160
for medsbj_code in self.record.medsbj_code:
if len(medsbj_code) > 0:
insert_query = self.INSERT_INST_TRT_QUERY.format(
trt_course_cd=f"'{medsbj_code}'"
)
self.queries.append(insert_query)
return
def __make_upsert_spcare_query(self):
# 特養医務室の追加、更新
# DCF親施設コードがない場合、何もしない
if (self.record.dcf_prnt_inst_code == "00" or len(self.record.dcf_prnt_inst_code) == 0):
return
# レコードの存在確認
record_count = self.db.execute_select(self.RECORD_EXISTS_SPCARE_QUERY, self.query_parameter)
# 存在しない場合はInsert
if record_count[0]['count_num'] == 0:
self.queries.append(self.INSERT_SPCARE_QUERY)
return
# 存在する場合はUpdate
if self.record.dcfhp_92id == "@":
self.query_parameter['dcf_prnt_inst_code'] = None
self.query_parameter['delete_ymd'] = self.query_parameter['execute_date_str_ymd']
else:
self.query_parameter['delete_ymd'] = None
self.queries.append(self.UPDATE_SPCARE_QUERY)
return

View File

@ -0,0 +1,94 @@
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
from src.batch.ultmarc.utmp_tables.tables.com_manage import ComManage
class ComManageMapper(UltmarcTableMapper):
"""レイアウト区分007: COM_経営体 登録処理"""
# レコード存在確認SQL
RECORD_EXISTS_QUERY = """\
SELECT
COUNT(*) AS count_num
FROM
src05.com_manage
WHERE
manage_cd = :manage_cd
"""
# データ登録用SQL
INSERT_QUERY = """\
INSERT INTO src05.com_manage
(
manage_cd,
manage_name,
regist_ymd,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:manage_cd,
:manage_name,
:execute_date_str_ymd,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
# 更新用SQL
UPDATE_QUERY = """\
UPDATE
src05.com_manage
SET
manage_name = :manage_name,
update_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
manage_cd = :manage_cd
"""
# 修正区分が「C(削除)」の場合の更新SQL
LOGICAL_DELETE_QUERY = """\
UPDATE
src05.com_manage
SET
delete_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
manage_cd = :manage_cd
"""
record: ComManage
def __init__(self, record: list[str], db) -> None:
super().__init__(record, db, ComManage)
program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている)
# モジュール名をクエリパラメータに設定
self.query_parameter['program_name'] = program_name
# 読み込んだレコード値もクエリパラメータに追加
self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()}
def make_query(self):
# 修正区分がC(削除)の場合、論理削除
if self.record.maint_flag == 'C':
self.queries.append(self.LOGICAL_DELETE_QUERY)
return
# 追加、更新の場合
self.queries.append(self.__make_upsert_query())
return
def __make_upsert_query(self):
# レコードの存在確認
record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter)
# 存在しない場合はInsert
if record_count[0]['count_num'] == 0:
return self.INSERT_QUERY
# 存在する場合ではUpdate
return self.UPDATE_QUERY

View File

@ -0,0 +1,117 @@
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
from src.batch.ultmarc.utmp_tables.tables.com_med_area_city import ComMedAreaCity
class ComMedAreaCityMapper(UltmarcTableMapper):
"""レイアウト区分124: COM_医療圏都道府県市町村対応表 登録処理"""
# レコード存在確認SQL
RECORD_EXISTS_QUERY = """\
SELECT
COUNT(*) AS count_num
FROM
src05.com_med_area_city
WHERE
prefc_cd = :prefc_cd
AND
med_sphe_cd = :med_sphe_cd
AND
jis_prefc_cd = :jis_prefc_cd
AND
jis_city_cd = :jis_city_cd
"""
# データ登録用SQL
INSERT_QUERY = """\
INSERT INTO src05.com_med_area_city
(
prefc_cd,
med_sphe_cd,
jis_prefc_cd,
jis_city_cd,
zen_prefcode,
zen_medareacode,
regist_ymd,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:prefc_cd,
:med_sphe_cd,
:jis_prefc_cd,
:jis_city_cd,
:zen_prefcode,
:zen_medareacode,
:execute_date_str_ymd,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
# データ更新用SQL
UPDATE_QUERY = """\
UPDATE
src05.com_med_area_city
SET
zen_prefcode = :zen_prefcode,
zen_medareacode = :zen_medareacode,
update_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
prefc_cd = :prefc_cd
AND
med_sphe_cd = :med_sphe_cd
AND
jis_prefc_cd = :jis_prefc_cd
AND
jis_city_cd = :jis_city_cd
"""
# 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除
PHYSICAL_DELETE_QUERY = """\
DELETE FROM
src05.com_med_area_city
WHERE
prefc_cd = :prefc_cd
AND
med_sphe_cd = :med_sphe_cd
AND
jis_prefc_cd = :jis_prefc_cd
AND
jis_city_cd = :jis_city_cd
"""
record: ComMedAreaCity
def __init__(self, record: list[str], db) -> None:
super().__init__(record, db, ComMedAreaCity)
program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている)
# モジュール名をクエリパラメータに設定
self.query_parameter['program_name'] = program_name
# 読み込んだレコード値もクエリパラメータに追加
self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()}
def make_query(self):
# 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除
if self.record.maintflag == 'B' and self.record.addDelDiv == '1':
self.queries.append(self.PHYSICAL_DELETE_QUERY)
return
# 追加、更新の場合
self.queries.append(self.__make_upsert_query())
return
def __make_upsert_query(self):
# レコードの存在確認
record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter)
# 存在しない場合はInsert
if record_count[0]['count_num'] == 0:
return self.INSERT_QUERY
# 存在する場合はUpdate
return self.UPDATE_QUERY

View File

@ -0,0 +1,97 @@
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
from src.batch.ultmarc.utmp_tables.tables.com_med_func_valuation import ComMedFuncValuation
class ComMedFuncValuationMapper(UltmarcTableMapper):
"""レイアウト区分024: COM_医療機器評価 登録処理"""
# レコード存在確認SQL
RECORD_EXISTS_QUERY = """\
SELECT
COUNT(*) AS count_num
FROM
src05.com_med_func_valuation
WHERE
med_func_valuation_cd = :med_func_valuation_cd
"""
# データ登録用SQL
INSERT_QUERY = """\
INSERT INTO src05.com_med_func_valuation
(
med_func_valuation_cd,
med_func_valuation_name,
regist_ymd,
update_ymd,
delete_ymd,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:med_func_valuation_cd,
:med_func_valuation_name,
:execute_date_str_ymd,
:execute_date_str_ymd,
NULL,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
UPDATE_QUERY = """\
UPDATE
src05.com_med_func_valuation
SET
med_func_valuation_name = :med_func_valuation_name,
update_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
med_func_valuation_cd = :med_func_valuation_cd
"""
# 修正区分が「C(削除)」の場合の更新SQL
LOGICAL_DELETE_QUERY = """\
UPDATE
src05.com_med_func_valuation
SET
delete_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
med_func_valuation_cd = :med_func_valuation_cd
"""
record: ComMedFuncValuation
def __init__(self, record: list[str], db) -> None:
super().__init__(record, db, ComMedFuncValuation)
program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている)
# モジュール名をクエリパラメータに設定
self.query_parameter['program_name'] = program_name
# 読み込んだレコード値もクエリパラメータに追加
self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()}
def make_query(self):
# 修正区分がC(削除)の場合、論理削除
if self.record.maint_flag == 'C':
self.queries.append(self.LOGICAL_DELETE_QUERY)
return
# 追加、更新の場合
self.queries.append(self.__make_upsert_query())
return
def __make_upsert_query(self):
# レコードの存在確認
record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter)
# 存在しない場合はInsert
if record_count[0]['count_num'] == 0:
return self.INSERT_QUERY
# 存在する場合はUpdate
return self.UPDATE_QUERY

View File

@ -0,0 +1,129 @@
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
from src.batch.ultmarc.utmp_tables.tables.com_med_prefc import ComMedPrefc
class ComMedPrefcMapper(UltmarcTableMapper):
"""レイアウト区分121: COM_医療圏都道府県 登録処理"""
# レコード存在確認SQL
RECORD_EXISTS_QUERY = """\
SELECT
COUNT(*) AS count_num
FROM
src05.com_med_prefc
WHERE
pref_code = :pref_code
"""
# データ登録用SQL
INSERT_QUERY = """\
INSERT INTO src05.com_med_prefc
(
pref_code,
rev_date,
post_date,
psy_bednumtg,
psy_bednumgen,
psy_bednumdate,
psy_eqbednum,
tb_bednumtg,
tb_bednumgen,
tb_bednumdate,
tb_eqbednum,
inf_bednumtg,
inf_bednumgen,
inf_bednumdate,
inf_eqbednum,
regist_ymd,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:pref_code,
:rev_date,
:post_date,
:psy_bednum_tg,
:psy_bednum_gen,
:psy_bednum_date,
:psy_eqbed_num,
:tb_bednum_tg,
:tb_bednum_gen,
:tb_bednum_date,
:tb_eqbed_num,
:inf_bednum_tg,
:inf_bednum_gen,
:inf_bednum_date,
:inf_eqbed_num,
:execute_date_str_ymd,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
# データ更新用SQL
UPDATE_QUERY = """\
UPDATE
src05.com_med_prefc
SET
rev_date = :rev_date,
post_date = :post_date,
psy_bednumtg = :psy_bednum_tg,
psy_bednumgen = :psy_bednum_gen,
psy_bednumdate = :psy_bednum_date,
psy_eqbednum = :psy_eqbed_num,
tb_bednumtg = :tb_bednum_tg,
tb_bednumgen = :tb_bednum_gen,
tb_bednumdate = :tb_bednum_date,
tb_eqbednum = :tb_eqbed_num,
inf_bednumtg = :inf_bednum_tg,
inf_bednumgen = :inf_bednum_gen,
inf_bednumdate = :inf_bednum_date,
inf_eqbednum = :inf_eqbed_num,
update_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
pref_code = :pref_code
"""
# 修正区分が「C(削除)」の場合、物理削除
PHYSICAL_DELETE_QUERY = """\
DELETE FROM
src05.com_med_prefc
WHERE
pref_code = :pref_code
"""
record: ComMedPrefc
def __init__(self, record: list[str], db) -> None:
super().__init__(record, db, ComMedPrefc)
program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている)
# モジュール名をクエリパラメータに設定
self.query_parameter['program_name'] = program_name
# 読み込んだレコード値もクエリパラメータに追加
self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()}
def make_query(self):
# 修正区分がC(削除)の場合、物理削除
if self.record.maintflag == 'C':
self.queries.append(self.PHYSICAL_DELETE_QUERY)
return
# 追加、更新の場合
self.queries.append(self.__make_upsert_query())
return
def __make_upsert_query(self):
# レコードの存在確認
record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter)
# 存在しない場合はInsert
if record_count[0]['count_num'] == 0:
return self.INSERT_QUERY
# 存在する場合はUpdate
return self.UPDATE_QUERY

View File

@ -0,0 +1,95 @@
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
from src.batch.ultmarc.utmp_tables.tables.com_nurse_assrt import ComNurseAssrt
class ComNurseAssrtMapper(UltmarcTableMapper):
"""レイアウト区分023: COM_看護種別 登録処理"""
# レコード存在確認SQL
RECORD_EXISTS_QUERY = """\
SELECT
COUNT(*) AS count_num
FROM
src05.com_nurse_assrt
WHERE
nurse_assrt_cd = :nurse_assrt_cd
"""
# データ登録用SQL
INSERT_QUERY = """\
INSERT INTO src05.com_nurse_assrt
(
nurse_assrt_cd,
nurse_assrt_name,
regist_ymd,
delete_ymd,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:nurse_assrt_cd,
:nurse_assrt_name,
:execute_date_str_ymd,
NULL,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
# 更新用SQL
UPDATE_QUERY = """\
UPDATE
src05.com_nurse_assrt
SET
nurse_assrt_name = :nurse_assrt_name,
update_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
nurse_assrt_cd = :nurse_assrt_cd
"""
# 修正区分が「C(削除)」の場合の更新SQL
LOGICAL_DELETE_QUERY = """\
UPDATE
src05.com_nurse_assrt
SET
delete_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
nurse_assrt_cd = :nurse_assrt_cd
"""
record: ComNurseAssrt
def __init__(self, record: list[str], db) -> None:
super().__init__(record, db, ComNurseAssrt)
program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている)
# モジュール名をクエリパラメータに設定
self.query_parameter['program_name'] = program_name
# 読み込んだレコード値もクエリパラメータに追加
self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()}
def make_query(self):
# 修正区分がC(削除)の場合、論理削除
if self.record.maint_flag == 'C':
self.queries.append(self.LOGICAL_DELETE_QUERY)
return
# 追加、更新の場合
self.queries.append(self.__make_upsert_query())
return
def __make_upsert_query(self):
# レコードの存在確認
record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter)
# 存在しない場合はInsert
if record_count[0]['count_num'] == 0:
return self.INSERT_QUERY
# 存在する場合はupdate
return self.UPDATE_QUERY

View File

@ -0,0 +1,296 @@
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
from src.batch.ultmarc.utmp_tables.tables.com_pharm import ComPharm
class ComPharmMapper(UltmarcTableMapper):
"""レイアウト区分102: COM_薬局 登録処理 """
# レコード存在確認SQL
RECORD_EXISTS_QUERY = """\
SELECT
COUNT(*) AS count_num
FROM
src05.com_pharm
WHERE
dcf_dsf_inst_cd = :dcfdsf_inst_cd
"""
# データ登録用SQL
INSERT_QUERY = """\
INSERT INTO src05.com_pharm
(
dcf_dsf_inst_cd,
inst_div_cd,
addr_unknown_reason_cd,
form_inst_name_kana,
inst_name_kana,
form_inst_name_kanji,
inst_name_kanji,
close_flg,
estab_sche_flg,
close_start_ym,
estab_sche_ym,
inst_repre_kana,
inst_repre,
phone_number_non_flg,
unconf_flg,
inst_phone_number,
inst_addr_kana,
inst_addr,
postal_number,
village_cd,
prefc_cd,
city_cd,
addr_display_number,
addr_cnt_kana,
addr_cnt,
manage_cd,
delete_sche_reason_cd,
dup_opp_cd,
supervising_pharmacist,
supervising_pharmacist_kana,
franchise_hq_cd,
inst_pharm_div,
abolish_ymd,
delete_flg,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:dcfdsf_inst_cd,
:hpclass_code,
:hp_addr_lost_code,
:hp_name_kana,
:hp_ryaku_name_kana,
:hp_name,
:hp_ryaku_name,
:close_flg,
:open_flag,
:close_yearmonth,
:open_yearmonth,
:president_Kana,
:president,
:tel_nothing_flag,
:unconf_flg,
:tel_number,
:addr_kana,
:addr,
:zip_code,
:village_code,
:prefc_cd,
:city_cd,
:addr_number,
:addr_count_kana,
:addr_count,
:mgtclass_code,
:del_cd,
:dup_opp_cd,
:pharmacist,
:pharmacist_kana,
:franchise_hq_cd,
2,
NULL,
0,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
# 更新用SQL
UPDATE_QUERY = """\
UPDATE src05.com_pharm
SET
{update_columns}
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
dcf_dsf_inst_cd = :dcfdsf_inst_cd
"""
# 修正区分が「C(削除)」の場合の更新SQL
# 廃業年月日 ← メンテナンス年月日
LOGICAL_DELETE_QUERY = """\
UPDATE
src05.com_pharm
SET
abolish_ymd = :maintdate,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
dcf_dsf_inst_cd = :dcfdsf_inst_cd
"""
record: ComPharm
def __init__(self, record: list[str], db) -> None:
super().__init__(record, db, ComPharm)
program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている)
# モジュール名をクエリパラメータに設定
self.query_parameter['program_name'] = program_name
# 読み込んだレコード値もクエリパラメータに追加
self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()}
def make_query(self):
# 修正区分がC(削除)の場合、論理削除
if self.record.maint_flag == 'C':
self.queries.append(self.LOGICAL_DELETE_QUERY)
return
# 追加、更新の場合
self.queries.append(self.__make_upsert_query())
return
def __make_upsert_query(self):
# レコードの存在確認
record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter)
# 存在しない場合はInsert
if record_count[0]['count_num'] == 0:
return self.INSERT_QUERY
# 更新の場合
update_columns = ','.join(self.__make_update_query())
# 何も更新項目が無い場合はNoneとする更新処理は行わない
if len(update_columns) == 0:
return None
else:
# 末尾にカンマを付けてSET句を完成させる
update_columns += ','
update_query = self.UPDATE_QUERY.format(
update_columns=update_columns
)
return update_query
def __make_update_query(self):
set_clauses = [] # 設定項目
# 設定項目の判定
# DCFDSF施設コード(主キーなので更新対象外)
# 施設区分コード
if self.record.hpclass_code != '':
set_clauses.append('inst_div_cd = :hpclass_code')
# 住所不明理由コード
if self.record.hp_addr_lost_code != '':
set_clauses.append('addr_unknown_reason_cd = :hp_addr_lost_code')
self.query_parameter['hp_addr_lost_code'] = None if self.record.hp_addr_lost_code == '@' else self.record.hp_addr_lost_code
# 正式施設名カナ
if self.record.hp_name_kana != '':
set_clauses.append('form_inst_name_kana = :hp_name_kana')
# 施設名カナ
if self.record.hp_ryaku_name_kana != '':
set_clauses.append('inst_name_kana = :hp_ryaku_name_kana')
# 正式施設名(漢字)
if self.record.hp_name != '':
set_clauses.append('form_inst_name_kanji = :hp_name')
# 施設名(漢字)
if self.record.hp_ryaku_name != '':
set_clauses.append('inst_name_kanji = :hp_ryaku_name')
# 休院フラグ、休院予定年月
if len(self.record.close_flg + self.record.close_yearmonth) > 0:
set_clauses.append('close_flg = :close_flg')
set_clauses.append('close_start_ym = :close_yearmonth')
if self.record.close_flg == '@':
self.query_parameter['close_flg'] = None
self.query_parameter['close_yearmonth'] = None
# 開業予定フラグ、開業予定年月
if len(self.record.open_flag + self.record.open_yearmonth) > 0:
set_clauses.append('estab_sche_flg = :open_flag')
set_clauses.append('estab_sche_ym = :open_yearmonth')
if self.record.open_flag == '@':
self.query_parameter['open_flag'] = None
self.query_parameter['open_yearmonth'] = None
# 施設代表者カナ
if self.record.president_Kana != '':
set_clauses.append('inst_repre_kana = :president_Kana')
self.query_parameter['president_Kana'] = None if self.record.president_Kana == '@' else self.record.president_Kana
# 施設代表者 ※@が大文字
if self.record.president != '':
set_clauses.append('inst_repre = :president')
self.query_parameter['president'] = None if self.record.president == '' else self.record.president
# 電話番号なしフラグ
if self.record.tel_nothing_flag != '':
set_clauses.append('phone_number_non_flg = :tel_nothing_flag')
self.query_parameter['tel_nothing_flag'] = None if self.record.tel_nothing_flag == '@' else self.record.tel_nothing_flag
# 未確認フラグ
if self.record.unconf_flg != '':
set_clauses.append('unconf_flg = :unconf_flg')
self.query_parameter['unconf_flg'] = None if self.record.unconf_flg == '@' else self.record.unconf_flg
# 施設電話番号
if self.record.tel_number != '':
set_clauses.append('inst_phone_number = :tel_number')
self.query_parameter['tel_number'] = None if self.record.tel_number == '@' else self.record.tel_number
# 施設住所カナ
if self.record.addr_kana != '':
set_clauses.append('inst_addr_kana = :addr_kana')
# 施設住所
if self.record.addr != '':
set_clauses.append('inst_addr = :addr')
# 郵便番号
if self.record.zip_code != '':
set_clauses.append('postal_number = :zip_code')
# 町字コード(住所コード)
if len(self.record.village_code) > 0:
set_clauses.append('village_cd = :village_code') # 住所コード
set_clauses.append('prefc_cd = :prefc_cd') # 都道府県コード
set_clauses.append('city_cd = :city_cd') # 市区町村コード
# 住所表示番号
if self.record.addr_number != '':
set_clauses.append('addr_display_number = :addr_number')
self.query_parameter['addr_number'] = None if self.record.addr_number == '@' else self.record.addr_number
# 住所カウント(集合項目である県コードが入っていればカウントをセットする)
if len(self.record.prefc_cd) > 0:
set_clauses.append('addr_cnt = :addr_count') # 住所カウント
set_clauses.append('addr_cnt_kana = :addr_count_kana') # 住所カウントカナ
# 経営体コード
if self.record.mgtclass_code != '':
set_clauses.append('manage_cd = :mgtclass_code')
self.query_parameter['mgtclass_code'] = None if self.record.mgtclass_code == '@' else self.record.mgtclass_code
# 削除予定理由コード
if self.record.del_cd != '':
set_clauses.append('delete_sche_reason_cd = :del_cd')
self.query_parameter['del_cd'] = None if self.record.del_cd == '@' else self.record.del_cd
# 重複時相手先コード
if self.record.dup_opp_cd != '':
set_clauses.append('dup_opp_cd = :dup_opp_cd')
self.query_parameter['dup_opp_cd'] = None if self.record.dup_opp_cd == '@' else self.record.dup_opp_cd
# 管理薬剤師名(漢字)※@が大文字
if self.record.pharmacist != '':
set_clauses.append('supervising_pharmacist = :pharmacist')
self.query_parameter['pharmacist'] = None if self.record.pharmacist == '' else self.record.pharmacist
# 管理薬剤師名(カナ)
if self.record.pharmacist_kana != '':
set_clauses.append('supervising_pharmacist_kana = :pharmacist_kana')
self.query_parameter['pharmacist_kana'] = None if self.record.pharmacist_kana == '@' else self.record.pharmacist_kana
# チェーン店本部コード
if self.record.franchise_hq_id != '':
set_clauses.append('franchise_hq_cd = :franchise_hq_cd')
if self.record.franchise_hq_id == '@':
self.query_parameter['franchise_hq_cd'] = None
return set_clauses

View File

@ -0,0 +1,96 @@
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
from src.batch.ultmarc.utmp_tables.tables.com_policy_med import ComPolicyMed
class ComPolicyMedMapper(UltmarcTableMapper):
"""レイアウト区分028: COM_政策医療 登録処理 """
# レコード存在確認SQL
RECORD_EXISTS_QUERY = """\
SELECT
COUNT(*) AS count_num
FROM
src05.com_policy_med
WHERE
policy_med_cd = :policy_med_cd
"""
# データ登録用SQL
INSERT_QUERY = """\
INSERT INTO src05.com_policy_med
(
policy_med_cd,
field_name,
regist_ymd,
delete_ymd,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:policy_med_cd,
:field_name,
:execute_date_str_ymd,
NULL,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
# 更新用SQL
UPDATE_QUERY = """\
UPDATE src05.com_policy_med
SET
field_name = :field_name,
update_ymd = :execute_date_str_ymd,
delete_ymd = NULL,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
policy_med_cd = :policy_med_cd
"""
# 修正区分が「C(削除)」の場合の更新SQL
# 削除年月日 ← システム日付
LOGICAL_DELETE_QUERY = """\
UPDATE
src05.com_policy_med
SET
delete_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
policy_med_cd = :policy_med_cd
"""
record: ComPolicyMed
def __init__(self, record: list[str], db) -> None:
super().__init__(record, db, ComPolicyMed)
program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている)
# モジュール名をクエリパラメータに設定
self.query_parameter['program_name'] = program_name
# 読み込んだレコード値もクエリパラメータに追加
self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()}
def make_query(self):
# 修正区分がC(削除)の場合、論理削除
if self.record.maint_flag == 'C':
self.queries.append(self.LOGICAL_DELETE_QUERY)
return
# 追加、更新の場合
self.queries.append(self.__make_upsert_query())
return
def __make_upsert_query(self):
# レコードの存在確認
record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter)
# 存在しない場合はInsert
if record_count[0]['count_num'] == 0:
return self.INSERT_QUERY
# 存在する場合はUpdate
return self.UPDATE_QUERY

View File

@ -0,0 +1,92 @@
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
from src.batch.ultmarc.utmp_tables.tables.com_post import ComPost
class ComPostMapper(UltmarcTableMapper):
"""レイアウト区分005: COM_役職 登録処理"""
# レコード存在確認SQL
RECORD_EXISTS_QUERY = """\
SELECT
COUNT(*) AS count_num
FROM
src05.com_post
WHERE
post_cd = :post_cd
"""
# データ登録用SQL
INSERT_QUERY = """\
INSERT INTO src05.com_post
(
post_cd,
form_post_name,
regist_ymd,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:post_cd,
:form_post_name,
:execute_date_str_ymd,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
UPDATE_QUERY = """\
UPDATE
src05.com_post
SET
form_post_name = :form_post_name,
update_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
post_cd = :post_cd
"""
# 修正区分が「C(削除)」の場合の更新SQL
LOGICAL_DELETE_QUERY = """\
UPDATE
src05.com_post
SET
delete_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
post_cd = :post_cd
"""
record: ComPost
def __init__(self, record: list[str], db) -> None:
super().__init__(record, db, ComPost)
program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている)
# モジュール名をクエリパラメータに設定
self.query_parameter['program_name'] = program_name
# 読み込んだレコード値もクエリパラメータに追加
self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()}
def make_query(self):
# 修正区分がC(削除)の場合、論理削除
if self.record.maint_flag == 'C':
self.queries.append(self.LOGICAL_DELETE_QUERY)
return
# 追加、更新の場合
self.queries.append(self.__make_upsert_query())
return
def __make_upsert_query(self):
# レコードの存在確認
record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter)
# 存在しない場合はInsert
if record_count[0]['count_num'] == 0:
return self.INSERT_QUERY
# 存在する場合ではUpdate
return self.UPDATE_QUERY

View File

@ -0,0 +1,455 @@
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
from src.batch.ultmarc.utmp_tables.tables.com_prefc_med_base import ComPrefcMedBase
class ComPrefcMedBaseMapper(UltmarcTableMapper):
"""レイアウト区分132: COM_都道府県医療機能情報(基本)"""
# レコード存在確認SQL
RECORD_EXISTS_QUERY = """\
SELECT
COUNT(*) AS count_num
FROM
src05.com_prefc_med_base
WHERE
dcf_dsf_inst_cd = :dcfdsf_inst_code
"""
# データ登録用SQL
INSERT_QUERY = """\
INSERT INTO src05.com_prefc_med_base
(
dcf_dsf_inst_cd,
info_date,
home_page,
hppre_flg,
expre_flg,
trial_flg,
trial_contcount,
trialwhet_from,
trialwhet_to,
equipment_flg,
cos_disease_flg,
cos_surgery,
specialclinic_flg,
establishment_flg,
critical_flg,
cop_system,
sys_exists_flg,
sys_inspection,
sys_prescription,
sys_reserv,
icduse_flg,
echart_flg,
fulltime_flg,
fulltime_count,
ge_patient_avg,
mt_patient_avg,
mc_patient_avg,
ca_patient_avg,
pys_patient_avg,
tub_patient_avg,
inf_patient_avg,
patient_avg_sum,
patient_avg_from,
patient_avg_to,
cl_patient_avg,
cl_patient_avg_from,
cl_patient_avg_to,
hm_patient_avg,
hm_patient_avg_from,
hm_patient_avg_to,
ge_patient_ex,
mt_patient_ex,
mc_patient_ex,
ca_patient_ex,
pys_patient_ex,
tub_patient_ex,
inf_patient_ex,
patient_ex_sum,
patient_ex_from,
patient_ex_to,
cl_patient_ex,
cl_patient_ex_from,
cl_patient_ex_to,
hm_patient_ex,
hm_patient_ex_from,
hm_patient_ex_to,
ge_stay_avg,
mt_stay_avg,
mc_stay_avg,
ca_stay_avg,
pys_stay_avg,
tub_stay_avg,
inf_stay_avg,
stay_avg_sum,
stay_avg_from,
stay_avg_to,
regist_ymd,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:dcfdsf_inst_code,
:info_date,
:home_page,
:hppre_flg,
:expre_flg,
:trial_flg,
:trial_cont_count,
:trial_whet_from,
:trial_whet_to,
:equipment_flg,
:cos_disease_flg,
:cos_surgery,
:specialclinic_flg,
:establishment_flg,
:critical_flg,
:cop_system,
:sys_exists_flg,
:sys_inspection,
:sys_prescription,
:sys_reserv,
:icduse_flg,
:echart_flg,
:fulltime_flg,
:fulltime_count,
:ge_patient_avg,
:mt_patient_avg,
:mc_patient_avg,
:ca_patient_avg,
:pys_patient_avg,
:tub_patient_avg,
:inf_patient_avg,
:patient_avg_sum,
:patient_avg_from,
:patient_avg_to,
:cl_patient_avg,
:cl_patient_avg_from,
:cl_patient_avg_to,
:hm_patient_avg,
:hm_patient_avg_from,
:hm_patient_avg_to,
:ge_patient_ex,
:mt_patient_ex,
:mc_patient_ex,
:ca_patient_ex,
:pys_patient_ex,
:tub_patient_ex,
:inf_patient_ex,
:patient_ex_sum,
:patient_ex_from,
:patient_ex_to,
:cl_patient_ex,
:cl_patient_ex_from,
:cl_patient_ex_to,
:hm_patient_ex,
:hm_patient_ex_from,
:hm_patient_ex_to,
:ge_stay_avg,
:mt_stay_avg,
:mc_stay_avg,
:ca_stay_avg,
:pys_stay_avg,
:tub_stay_avg,
:inf_stay_avg,
:stay_avg_sum,
:stay_avg_from,
:stay_avg_to,
:execute_date_str_ymd,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
# データ変更用SQL
UPDATE_QUERY = """\
UPDATE
src05.com_prefc_med_base
SET
{update_columns}
update_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
dcf_dsf_inst_cd = :dcfdsf_inst_code
"""
# 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除
PHYSICAL_DELETE_QUERY = """\
DELETE FROM
src05.com_prefc_med_base
WHERE
dcf_dsf_inst_cd = :dcfdsf_inst_code
"""
record: ComPrefcMedBase
def __init__(self, record: list[str], db) -> None:
super().__init__(record, db, ComPrefcMedBase)
program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている)
# モジュール名をクエリパラメータに設定
self.query_parameter['program_name'] = program_name
# 読み込んだレコード値もクエリパラメータに追加
self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()}
def make_query(self):
# 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除
if self.record.maint_flag == 'B' and self.record.adddel_div == '1':
self.queries.append(self.PHYSICAL_DELETE_QUERY)
return
# 追加、更新の場合
self.queries.append(self.__make_upsert_query())
return
def __make_upsert_query(self):
# レコードの存在確認
record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter)
# 存在しない場合はInsert
if record_count[0]['count_num'] == 0:
return self.INSERT_QUERY
# 存在する場合ではUpdate
return self.__make_update_query()
def __make_update_query(self):
set_clauses = [] # 設定項目
# 情報年月日
if len(self.record.info_date) > 0:
set_clauses.append('info_date = :info_date')
if self.record.info_date == '@':
self.query_parameter['info_date'] = None
# 案内用ホームページアドレス
if len(self.record.home_page) > 0:
set_clauses.append('home_page = :home_page')
if self.record.home_page == '@':
self.query_parameter['home_page'] = None
# 院内処方フラグ
if len(self.record.hppre_flg) > 0:
set_clauses.append('hppre_flg = :hppre_flg')
if self.record.hppre_flg == '@':
self.query_parameter['hppre_flg'] = None
# 院外処方フラグ
if len(self.record.expre_flg) > 0:
set_clauses.append('expre_flg = :expre_flg')
if self.record.expre_flg == '@':
self.query_parameter['expre_flg'] = None
# 治験の実施
if len(self.record.trial_flg) > 0:
set_clauses.append('trial_flg = :trial_flg')
set_clauses.append('trial_contcount = :trial_cont_count')
set_clauses.append('trialwhet_from = :trial_whet_from')
set_clauses.append('trialwhet_to = :trial_whet_to')
if self.record.trial_flg == '@':
self.query_parameter['trial_flg'] = None
self.query_parameter['trial_cont_count'] = None
self.query_parameter['trial_whet_from'] = None
self.query_parameter['trial_whet_to'] = None
# 保有する施設設備フラグ
if len(self.record.equipment_flg) > 0:
set_clauses.append('equipment_flg = :equipment_flg')
if self.record.equipment_flg == '@':
self.query_parameter['equipment_flg'] = None
# 対応することができる疾患・治療の内容フラグ
if len(self.record.cos_disease_flg) > 0:
set_clauses.append('cos_disease_flg = :cos_disease_flg')
if self.record.cos_disease_flg == '@':
self.query_parameter['cos_disease_flg'] = None
# 対応することができる短期滞在手術フラグ
if len(self.record.cos_surgery) > 0:
set_clauses.append('cos_surgery = :cos_surgery')
if self.record.cos_surgery == '@':
self.query_parameter['cos_surgery'] = None
# 専門外来フラグ
if len(self.record.specialclinic_flg) > 0:
set_clauses.append('specialclinic_flg = :specialclinic_flg')
if self.record.specialclinic_flg == '@':
self.query_parameter['specialclinic_flg'] = None
# 地域医療連携体制_窓口設置フラグ
if len(self.record.establishment_flg) > 0:
set_clauses.append('establishment_flg = :establishment_flg')
if self.record.establishment_flg == '@':
self.query_parameter['establishment_flg'] = None
# 地域医療連携体制_地域連携パスフラグ
if len(self.record.critical_flg) > 0:
set_clauses.append('critical_flg = :critical_flg')
if self.record.critical_flg == '@':
self.query_parameter['critical_flg'] = None
# 入院診療計画策定時における院内の連携体制
if len(self.record.cop_system) > 0:
set_clauses.append('cop_system = :cop_system')
if self.record.cop_system == '@':
self.query_parameter['cop_system'] = None
# オーダリングシステム
if len(self.record.sys_exists_flg) > 0:
set_clauses.append('sys_exists_flg = :sys_exists_flg')
set_clauses.append('sys_inspection = :sys_inspection')
set_clauses.append('sys_prescription = :sys_prescription')
set_clauses.append('sys_reserv = :sys_reserv')
if self.record.sys_exists_flg == '@':
self.query_parameter['sys_exists_flg'] = None
self.query_parameter['sys_inspection'] = None
self.query_parameter['sys_prescription'] = None
self.query_parameter['sys_reserv'] = None
# ICDコード利用フラグ
if len(self.record.icduse_flg) > 0:
set_clauses.append('icduse_flg = :icduse_flg')
if self.record.icduse_flg == '@':
self.query_parameter['icduse_flg'] = None
# 電子カルテフラク
if len(self.record.echart_flg) > 0:
set_clauses.append('echart_flg = :echart_flg')
if self.record.echart_flg == '@':
self.query_parameter['echart_flg'] = None
# 専任従事者
if len(self.record.fulltime_flg) > 0:
set_clauses.append('fulltime_flg = :fulltime_flg')
set_clauses.append('fulltime_count = :fulltime_count')
if self.record.fulltime_flg == '@':
self.query_parameter['fulltime_flg'] = None
self.query_parameter['fulltime_count'] = None
# 病床患者数平均
if len(self.record.ge_patient_avg) > 0:
set_clauses.append('ge_patient_avg = :ge_patient_avg')
set_clauses.append('mt_patient_avg = :mt_patient_avg')
set_clauses.append('mc_patient_avg = :mc_patient_avg')
set_clauses.append('ca_patient_avg = :ca_patient_avg')
set_clauses.append('pys_patient_avg = :pys_patient_avg')
set_clauses.append('tub_patient_avg = :inf_patient_avg')
set_clauses.append('inf_patient_avg = :tub_patient_avg')
set_clauses.append('patient_avg_sum = :patient_avg_sum')
set_clauses.append('patient_avg_from = :patient_avg_from')
set_clauses.append('patient_avg_to = :patient_avg_to')
if self.record.ge_patient_avg == '@':
self.query_parameter['ge_patient_avg'] = None
self.query_parameter['mt_patient_avg'] = None
self.query_parameter['mc_patient_avg'] = None
self.query_parameter['ca_patient_avg'] = None
self.query_parameter['pys_patient_avg'] = None
self.query_parameter['inf_patient_avg'] = None
self.query_parameter['tub_patient_avg'] = None
self.query_parameter['patient_avg_sum'] = None
self.query_parameter['patient_avg_from'] = None
self.query_parameter['patient_avg_to'] = None
# 患者数平均
if len(self.record.cl_patient_avg) > 0:
set_clauses.append('cl_patient_avg = :cl_patient_avg')
set_clauses.append('cl_patient_avg_from = :cl_patient_avg_from')
set_clauses.append('cl_patient_avg_to = :cl_patient_avg_to')
if self.record.cl_patient_avg == '@':
self.query_parameter['cl_patient_avg'] = None
self.query_parameter['cl_patient_avg_from'] = None
self.query_parameter['cl_patient_avg_to'] = None
# 患者数平均
if len(self.record.hm_patient_avg) > 0:
set_clauses.append('hm_patient_avg = :hm_patient_avg')
set_clauses.append('hm_patient_avg_from = :hm_patient_avg_from')
set_clauses.append('hm_patient_avg_to = :hm_patient_avg_to')
if self.record.hm_patient_avg == '@':
self.query_parameter['hm_patient_avg'] = None
self.query_parameter['hm_patient_avg_from'] = None
self.query_parameter['hm_patient_avg_to'] = None
# 患者数延数
if len(self.record.ge_patient_ex) > 0:
set_clauses.append('ge_patient_ex = :ge_patient_ex')
set_clauses.append('mt_patient_ex = :mt_patient_ex')
set_clauses.append('mc_patient_ex = :mc_patient_ex')
set_clauses.append('ca_patient_ex = :ca_patient_ex')
set_clauses.append('pys_patient_ex = :pys_patient_ex')
set_clauses.append('tub_patient_ex = :tub_patient_ex')
set_clauses.append('inf_patient_ex = :inf_patient_ex')
set_clauses.append('patient_ex_sum = :patient_ex_sum')
set_clauses.append('patient_ex_from = :patient_ex_from')
set_clauses.append('patient_ex_to = :patient_ex_to')
if self.record.ge_patient_ex == '@':
self.query_parameter['ge_patient_ex'] = None
self.query_parameter['mt_patient_ex'] = None
self.query_parameter['mc_patient_ex'] = None
self.query_parameter['ca_patient_ex'] = None
self.query_parameter['pys_patient_ex'] = None
self.query_parameter['tub_patient_ex'] = None
self.query_parameter['inf_patient_ex'] = None
self.query_parameter['patient_ex_sum'] = None
self.query_parameter['patient_ex_from'] = None
self.query_parameter['patient_ex_to'] = None
# 患者数延数
if len(self.record.cl_patient_ex) > 0:
set_clauses.append('cl_patient_ex = :cl_patient_ex')
set_clauses.append('cl_patient_ex_from = :cl_patient_ex_from')
set_clauses.append('cl_patient_ex_to = :cl_patient_ex_to')
if self.record.cl_patient_ex == '@':
self.query_parameter['cl_patient_ex'] = None
self.query_parameter['cl_patient_ex_from'] = None
self.query_parameter['cl_patient_ex_to'] = None
# 患者数延数
if len(self.record.hm_patient_ex) > 0:
set_clauses.append('hm_patient_ex = :hm_patient_ex')
set_clauses.append('hm_patient_ex_from = :hm_patient_ex_from')
set_clauses.append('hm_patient_ex_to = :hm_patient_ex_to')
if self.record.hm_patient_ex == '@':
self.query_parameter['hm_patient_ex'] = None
self.query_parameter['hm_patient_ex_from'] = None
self.query_parameter['hm_patient_ex_to'] = None
# 平均在院日数
if len(self.record.ge_stay_avg) > 0:
set_clauses.append('ge_stay_avg = :ge_stay_avg')
set_clauses.append('mt_stay_avg = :mt_stay_avg')
set_clauses.append('mc_stay_avg = :mc_stay_avg')
set_clauses.append('ca_stay_avg = :ca_stay_avg')
set_clauses.append('pys_stay_avg = :pys_stay_avg')
set_clauses.append('tub_stay_avg = :tub_stay_avg')
set_clauses.append('inf_stay_avg = :inf_stay_avg')
set_clauses.append('stay_avg_sum = :stay_avg_sum')
set_clauses.append('stay_avg_from = :stay_avg_from')
set_clauses.append('stay_avg_to = :stay_avg_to')
if self.record.ge_stay_avg == '@':
self.query_parameter['ge_stay_avg'] = None
self.query_parameter['mt_stay_avg'] = None
self.query_parameter['mc_stay_avg'] = None
self.query_parameter['ca_stay_avg'] = None
self.query_parameter['pys_stay_avg'] = None
self.query_parameter['tub_stay_avg'] = None
self.query_parameter['inf_stay_avg'] = None
self.query_parameter['stay_avg_sum'] = None
self.query_parameter['stay_avg_from'] = None
self.query_parameter['stay_avg_to'] = None
update_columns = ','.join(set_clauses)
# 何も更新項目が無い場合はNoneとする更新処理は行わない
if len(update_columns) == 0:
return None
else:
# 末尾にカンマを付けてSET句を完成させる
update_columns += ','
update_query = self.UPDATE_QUERY.format(
update_columns=update_columns
)
return update_query

View File

@ -0,0 +1,105 @@
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
from src.batch.ultmarc.utmp_tables.tables.com_prefc_med_dis_treat import \
ComPrefcMedDisTreat
class ComPrefcMedDisTreatMapper(UltmarcTableMapper):
"""レイアウト区分134: COM_都道府県医療機能情報(疾患治療)"""
# レコード存在確認SQL
RECORD_EXISTS_QUERY = """\
SELECT
COUNT(*) AS count_num
FROM
src05.com_prefc_med_dis_treat
WHERE
dcf_dsf_inst_cd = :dcfdsf_inst_code
AND
treatment_code = :treatment_code
"""
# データ登録用SQL
INSERT_QUERY = """\
INSERT INTO src05.com_prefc_med_dis_treat
(
dcf_dsf_inst_cd,
treatment_code,
pre_num,
regist_ymd,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:dcfdsf_inst_code,
:treatment_code,
:pre_num,
:execute_date_str_ymd,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
# データ変更用SQL
UPDATE_QUERY = """\
UPDATE
src05.com_prefc_med_dis_treat
SET
pre_num = :pre_num,
update_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
dcf_dsf_inst_cd = :dcfdsf_inst_code
AND
treatment_code = :treatment_code
"""
# 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除
PHYSICAL_DELETE_QUERY = """\
DELETE FROM
src05.com_prefc_med_dis_treat
WHERE
dcf_dsf_inst_cd = :dcfdsf_inst_code
AND
treatment_code = :treatment_code
"""
record: ComPrefcMedDisTreat
def __init__(self, record: list[str], db) -> None:
super().__init__(record, db, ComPrefcMedDisTreat)
program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている)
# モジュール名をクエリパラメータに設定
self.query_parameter['program_name'] = program_name
# 読み込んだレコード値もクエリパラメータに追加
self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()}
def make_query(self):
# 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除
if self.record.maint_flag == 'B' and self.record.adddel_div == '1':
self.queries.append(self.PHYSICAL_DELETE_QUERY)
return
# 追加、更新の場合
self.queries.append(self.__make_upsert_query())
return
def __make_upsert_query(self):
# レコードの存在確認
record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter)
# 存在しない場合はInsert
if record_count[0]['count_num'] == 0:
return self.INSERT_QUERY
# 存在する場合はUpdate
# 前年件数が空の場合は更新しない
if self.record.pre_num is not None:
if self.record.pre_num == '@':
self.query_parameter['pre_num'] = None
return self.UPDATE_QUERY
else:
return None

View File

@ -0,0 +1,105 @@
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
from src.batch.ultmarc.utmp_tables.tables.com_prefc_med_equpment import \
ComPrefcMedEqupment
class ComPrefcMedEqupmentMapper(UltmarcTableMapper):
"""レイアウト区分133: COM_都道府県医療機能情報(施設設備)"""
# レコード存在確認SQL
RECORD_EXISTS_QUERY = """\
SELECT
COUNT(*) AS count_num
FROM
src05.com_prefc_med_equpment
WHERE
dcf_dsf_inst_cd = :dcfdsf_inst_code
AND
equipment_code = :equipment_code
"""
# データ登録用SQL
INSERT_QUERY = """\
INSERT INTO src05.com_prefc_med_equpment
(
dcf_dsf_inst_cd,
equipment_code,
bednum,
regist_ymd,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:dcfdsf_inst_code,
:equipment_code,
:bed_num,
:execute_date_str_ymd,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
# データ変更用SQL
UPDATE_QUERY = """\
UPDATE
src05.com_prefc_med_equpment
SET
bednum = :bed_num,
update_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
dcf_dsf_inst_cd = :dcfdsf_inst_code
AND
equipment_code = :equipment_code
"""
# 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除
PHYSICAL_DELETE_QUERY = """\
DELETE FROM
src05.com_prefc_med_equpment
WHERE
dcf_dsf_inst_cd = :dcfdsf_inst_code
AND
equipment_code = :equipment_code
"""
record: ComPrefcMedEqupment
def __init__(self, record: list[str], db) -> None:
super().__init__(record, db, ComPrefcMedEqupment)
program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている)
# モジュール名をクエリパラメータに設定
self.query_parameter['program_name'] = program_name
# 読み込んだレコード値もクエリパラメータに追加
self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()}
def make_query(self):
# 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除
if self.record.maint_flag == 'B' and self.record.adddel_div == '1':
self.queries.append(self.PHYSICAL_DELETE_QUERY)
return
# 追加、更新の場合
self.queries.append(self.__make_upsert_query())
return
def __make_upsert_query(self):
# レコードの存在確認
record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter)
# 存在しない場合はInsert
if record_count[0]['count_num'] == 0:
return self.INSERT_QUERY
# 存在する場合はUpdate
# 病床数が空の場合は更新しない
if self.record.bed_num is not None:
if self.record.bed_num == '@':
self.query_parameter['bed_num'] = None
return self.UPDATE_QUERY
else:
return None

View File

@ -0,0 +1,95 @@
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
from src.batch.ultmarc.utmp_tables.tables.com_prefc_med_sojourn_ope import ComPrefcMedSojournOpe
class ComPrefcMedSojournOpeMapper(UltmarcTableMapper):
"""レイアウト区分135: COM_都道府県医療機能情報(短期滞在手術)"""
# レコード存在確認SQL
RECORD_EXISTS_QUERY = """\
SELECT
COUNT(*) AS count_num
FROM
src05.com_prefc_med_sojourn_ope
WHERE
dcf_dsf_inst_cd = :dcfdsf_inst_code
AND
cos_surgery_code = :cos_surgery_code
"""
# データ登録用SQL
INSERT_QUERY = """\
INSERT INTO src05.com_prefc_med_sojourn_ope
(
dcf_dsf_inst_cd,
cos_surgery_code,
regist_ymd,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:dcfdsf_inst_code,
:cos_surgery_code,
:execute_date_str_ymd,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
# データ変更用SQL
UPDATE_QUERY = """\
UPDATE
src05.com_prefc_med_sojourn_ope
SET
update_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
dcf_dsf_inst_cd = :dcfdsf_inst_code
AND
cos_surgery_code = :cos_surgery_code
"""
# 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除
PHYSICAL_DELETE_QUERY = """\
DELETE FROM
src05.com_prefc_med_sojourn_ope
WHERE
dcf_dsf_inst_cd = :dcfdsf_inst_code
AND
cos_surgery_code = :cos_surgery_code
"""
record: ComPrefcMedSojournOpe
def __init__(self, record: list[str], db) -> None:
super().__init__(record, db, ComPrefcMedSojournOpe)
program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている)
# モジュール名をクエリパラメータに設定
self.query_parameter['program_name'] = program_name
# 読み込んだレコード値もクエリパラメータに追加
self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()}
def make_query(self):
# 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除
if self.record.maint_flag == 'B' and self.record.adddel_div == '1':
self.queries.append(self.PHYSICAL_DELETE_QUERY)
return
# 追加、更新の場合
self.queries.append(self.__make_upsert_query())
return
def __make_upsert_query(self):
# レコードの存在確認
record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter)
# 存在しない場合はInsert
if record_count[0]['count_num'] == 0:
return self.INSERT_QUERY
# 存在する場合はUpdate
return self.UPDATE_QUERY

View File

@ -0,0 +1,125 @@
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
from src.batch.ultmarc.utmp_tables.tables.com_prefc_med_sp_outpat import ComPrefcMedSpOutpat
class ComPrefcMedSpOutpatMapper(UltmarcTableMapper):
"""レイアウト区分136: COM_都道府県医療機能情報(専門外来)"""
# レコード存在確認SQL
RECORD_EXISTS_QUERY = """\
SELECT
COUNT(*) AS count_num
FROM
src05.com_prefc_med_sp_outpat
WHERE
dcf_dsf_inst_cd = :dcfdsf_inst_code
AND
specialclinic_name = :specialclinic_name
"""
# データ登録用SQL
INSERT_QUERY = """\
INSERT INTO src05.com_prefc_med_sp_outpat
(
dcf_dsf_inst_cd,
specialclinic_name,
sort_key,
sectsub_cd,
regist_ymd,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:dcfdsf_inst_code,
:specialclinic_name,
:sort_key,
:sectsub_cd,
:execute_date_str_ymd,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
# データ変更用SQL
UPDATE_QUERY = """\
UPDATE
src05.com_prefc_med_sp_outpat
SET
{update_columns}
update_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
dcf_dsf_inst_cd = :dcfdsf_inst_code
AND
specialclinic_name = :specialclinic_name
"""
# 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除
PHYSICAL_DELETE_QUERY = """\
DELETE FROM
src05.com_prefc_med_sp_outpat
WHERE
dcf_dsf_inst_cd = :dcfdsf_inst_code
AND
specialclinic_name = :specialclinic_name
"""
record: ComPrefcMedSpOutpat
def __init__(self, record: list[str], db) -> None:
super().__init__(record, db, ComPrefcMedSpOutpat)
program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている)
# モジュール名をクエリパラメータに設定
self.query_parameter['program_name'] = program_name
# 読み込んだレコード値もクエリパラメータに追加
self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()}
def make_query(self):
# 『修正区分がB(修正)かつ追加削除区分が1(退職)』の場合、物理削除
if self.record.maint_flag == 'B' and self.record.adddel_div == '1':
self.queries.append(self.PHYSICAL_DELETE_QUERY)
return
# 追加、更新の場合
self.queries.append(self.__make_upsert_query())
return
def __make_upsert_query(self):
# レコードの存在確認
record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter)
# 存在しない場合はInsert
if record_count[0]['count_num'] == 0:
return self.INSERT_QUERY
# 存在する場合ではUpdate
return self.__make_update_query()
def __make_update_query(self):
set_clauses = [] # 設定項目
# ソートキー
if len(self.record.sort_key) > 0:
set_clauses.append('sort_key = :sort_key')
# 分類補助コード
if len(self.record.sectsub_cd) > 0:
set_clauses.append('sectsub_cd = :sectsub_cd')
if self.record.sectsub_cd == '@':
self.query_parameter['sectsub_cd'] = None
update_columns = ','.join(set_clauses)
# 何も更新項目が無い場合はNoneとする更新処理は行わない
if len(update_columns) == 0:
return None
else:
# 末尾にカンマを付けてSET句を完成させる
update_columns += ','
update_query = self.UPDATE_QUERY.format(
update_columns=update_columns
)
return update_query

View File

@ -0,0 +1,95 @@
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
from src.batch.ultmarc.utmp_tables.tables.com_regn_critic_pass import ComRegnCriticPass
class ComRegnCriticPassMapper(UltmarcTableMapper):
"""レイアウト区分026: COM_地域クリティカルパス 登録処理"""
# レコード存在確認SQL
RECORD_EXISTS_QUERY = """\
SELECT
COUNT(*) AS count_num
FROM
src05.com_regn_critic_pass
WHERE
regn_co_critic_pass_cd = :regn_co_critic_pass_cd
"""
# データ登録用SQL
INSERT_QUERY = """\
INSERT INTO src05.com_regn_critic_pass
(
regn_co_critic_pass_cd,
disease_name_kanji,
regist_ymd,
delete_ymd,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:regn_co_critic_pass_cd,
:disease_name_kanji,
:execute_date_str_ymd,
NULL,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
# 更新用SQL
UPDATE_QUERY = """\
UPDATE
src05.com_regn_critic_pass
SET
disease_name_kanji = :disease_name_kanji,
update_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
regn_co_critic_pass_cd = :regn_co_critic_pass_cd
"""
# 修正区分が「C(削除)」の場合の更新SQL
LOGICAL_DELETE_QUERY = """\
UPDATE
src05.com_regn_critic_pass
SET
delete_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
regn_co_critic_pass_cd = :regn_co_critic_pass_cd
"""
record: ComRegnCriticPass
def __init__(self, record: list[str], db) -> None:
super().__init__(record, db, ComRegnCriticPass)
program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている)
# モジュール名をクエリパラメータに設定
self.query_parameter['program_name'] = program_name
# 読み込んだレコード値もクエリパラメータに追加
self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()}
def make_query(self):
# 修正区分がC(削除)の場合、論理削除
if self.record.maint_flag == 'C':
self.queries.append(self.LOGICAL_DELETE_QUERY)
return
# 追加、更新の場合
self.queries.append(self.__make_upsert_query())
return
def __make_upsert_query(self):
# レコードの存在確認
record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter)
# 存在しない場合はInsert
if record_count[0]['count_num'] == 0:
return self.INSERT_QUERY
# 存在する場合はUpdate
return self.UPDATE_QUERY

View File

@ -0,0 +1,94 @@
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
from src.batch.ultmarc.utmp_tables.tables.com_rehabili import ComRehabili
class ComRehabiliMapper(UltmarcTableMapper):
"""レイアウト区分027: COM_疾患別リハビリテーション科 登録処理"""
# レコード存在確認SQL
RECORD_EXISTS_QUERY = """\
SELECT
COUNT(*) AS count_num
FROM
src05.com_rehabili
WHERE
rehabili_cd = :rehabili_cd
"""
# データ登録用SQL
INSERT_QUERY = """\
INSERT INTO src05.com_rehabili
(
rehabili_cd,
rehabili_name,
regist_ymd,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:rehabili_cd,
:rehabili_name,
:execute_date_str_ymd,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
# 更新用SQL
UPDATE_QUERY = """\
UPDATE
src05.com_rehabili
SET
rehabili_name = :rehabili_name,
update_ymd = :execute_date_str_ymd,
delete_ymd = NULL,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
rehabili_cd = :rehabili_cd
"""
# 修正区分が「C(削除)」の場合の更新SQL
LOGICAL_DELETE_QUERY = """\
UPDATE
src05.com_rehabili
SET
delete_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
rehabili_cd = :rehabili_cd
"""
record: ComRehabili
def __init__(self, record: list[str], db) -> None:
super().__init__(record, db, ComRehabili)
program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている)
# モジュール名をクエリパラメータに設定
self.query_parameter['program_name'] = program_name
# 読み込んだレコード値もクエリパラメータに追加
self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()}
def make_query(self):
# 修正区分がC(削除)の場合、論理削除
if self.record.maint_flag == 'C':
self.queries.append(self.LOGICAL_DELETE_QUERY)
return
# 追加、更新の場合
self.queries.append(self.__make_upsert_query())
return
def __make_upsert_query(self):
# レコードの存在確認
record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter)
# 存在しない場合はInsert
if record_count[0]['count_num'] == 0:
return self.INSERT_QUERY
# 存在する場合はUpdate
return self.UPDATE_QUERY

View File

@ -0,0 +1,113 @@
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
from src.batch.ultmarc.utmp_tables.tables.com_snd_med_sphe import ComSndMedSphe
class ComSndMedSpheMapper(UltmarcTableMapper):
"""レイアウト区分123: COM_医療圏二次医療圏 登録処理"""
# レコード存在確認SQL
RECORD_EXISTS_QUERY = """\
SELECT
COUNT(*) AS count_num
FROM
src05.com_snd_med_sphe
WHERE
prefc_cd = :prefc_cd
AND
med_sphe_cd = :med_sphe_cd
"""
# データ登録用SQL
INSERT_QUERY = """\
INSERT INTO src05.com_snd_med_sphe
(
prefc_cd,
med_sphe_cd,
thrd_cd,
snd_med_sphe_name,
requd_bed_or_equip_target,
exist_bed_num,
exist_bed_num_regist_ymd,
plsmns_bed_num,
regist_ymd,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:prefc_cd,
:med_sphe_cd,
:thrd_cd,
:snd_med_sphe_name,
:requd_bed_or_equip_target,
:exist_bed_num,
:exist_bed_num_regist_ymd,
:plsmns_bed_num,
:execute_date_str_ymd,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
# データ更新用SQL
UPDATE_QUERY = """\
UPDATE
src05.com_snd_med_sphe
SET
thrd_cd = :thrd_cd,
snd_med_sphe_name = :snd_med_sphe_name,
requd_bed_or_equip_target = :requd_bed_or_equip_target,
exist_bed_num = :exist_bed_num,
exist_bed_num_regist_ymd = :exist_bed_num_regist_ymd,
plsmns_bed_num = :plsmns_bed_num,
update_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
prefc_cd = :prefc_cd
AND
med_sphe_cd = :med_sphe_cd
"""
# 修正区分が「C(削除)」の場合、物理削除
PHYSICAL_DELETE_QUERY = """\
DELETE FROM
src05.com_snd_med_sphe
WHERE
prefc_cd = :prefc_cd
AND
med_sphe_cd = :med_sphe_cd
"""
record: ComSndMedSphe
def __init__(self, record: list[str], db) -> None:
super().__init__(record, db, ComSndMedSphe)
program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている)
# モジュール名をクエリパラメータに設定
self.query_parameter['program_name'] = program_name
# 読み込んだレコード値もクエリパラメータに追加
self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()}
def make_query(self):
# 修正区分がC(削除)の場合、物理削除
if self.record.maintflag == 'C':
self.queries.append(self.PHYSICAL_DELETE_QUERY)
return
# 追加、更新の場合
self.queries.append(self.__make_upsert_query())
return
def __make_upsert_query(self):
# レコードの存在確認
record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter)
# 存在しない場合はInsert
if record_count[0]['count_num'] == 0:
return self.INSERT_QUERY
# 存在する場合はUpdate
return self.UPDATE_QUERY

View File

@ -0,0 +1,93 @@
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
from src.batch.ultmarc.utmp_tables.tables.com_sosiety import ComSosiety
class ComSosietyMapper(UltmarcTableMapper):
"""レイアウト区分009: COM_学会 登録処理"""
# レコード存在確認SQL
RECORD_EXISTS_QUERY = """\
SELECT
COUNT(*) AS count_num
FROM
src05.com_sosiety
WHERE
sosiety_cd = :sosiety_cd
"""
# データ登録用SQL
INSERT_QUERY = """\
INSERT INTO src05.com_sosiety
(
sosiety_cd,
sosiety_name,
regist_ymd,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:sosiety_cd,
:sosiety_name,
:execute_date_str_ymd,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
# 変更用SQL
UPDATE_QUERY = """\
UPDATE
src05.com_sosiety
SET
sosiety_name = :sosiety_name,
update_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
sosiety_cd = :sosiety_cd
"""
# 修正区分が「C(削除)」の場合の更新SQL
LOGICAL_DELETE_QUERY = """\
UPDATE
src05.com_sosiety
SET
delete_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
sosiety_cd = :sosiety_cd
"""
record: ComSosiety
def __init__(self, record: list[str], db) -> None:
super().__init__(record, db, ComSosiety)
program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている)
# モジュール名をクエリパラメータに設定
self.query_parameter['program_name'] = program_name
# 読み込んだレコード値もクエリパラメータに追加
self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()}
def make_query(self):
# 修正区分がC(削除)の場合、論理削除
if self.record.maint_flag == 'C':
self.queries.append(self.LOGICAL_DELETE_QUERY)
return
# 追加、更新の場合
self.queries.append(self.__make_upsert_query())
return
def __make_upsert_query(self):
# レコードの存在確認
record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter)
# 存在しない場合はInsert
if record_count[0]['count_num'] == 0:
return self.INSERT_QUERY
# 存在する場合ではUpdate
return self.UPDATE_QUERY

View File

@ -0,0 +1,146 @@
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
from src.batch.ultmarc.utmp_tables.tables.com_sp_field import ComSpField
class ComSpFieldMapper(UltmarcTableMapper):
"""レイアウト区分511: COM_専門分野 登録処理"""
# レコード存在確認SQL
RECORD_EXISTS_QUERY = """\
SELECT
COUNT(*) AS count_num
FROM
src05.com_sp_field
WHERE
dcf_pcf_dr_cd = :dcf_pcf_dr_cd
and
specialist_cd = :specialist_cd
"""
# データ登録用SQL
INSERT_QUERY = """\
INSERT INTO src05.com_sp_field
(
dcf_pcf_dr_cd,
specialist_cd,
specialist_maint_div,
specialist_flg,
specialist_publsh_ymd,
ackn_med_flg,
ackn_med_publsh_ymd,
guide_med_flg,
guide_med_publsh_ymd,
regist_ymd,
delete_ymd,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:dcf_pcf_dr_cd,
:specialist_cd,
:specialist_maint_div,
:specialist_flg,
:specialist_publsh_ymd,
:ackn_med_flg,
:ackn_med_publsh_ymd,
:guide_med_flg,
:guide_med_publsh_ymd,
:execute_date_str_ymd,
NULL,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
UPDATE_QUERY = """\
UPDATE
src05.com_sp_field
SET
{update_columns}
update_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
dcf_pcf_dr_cd = :dcf_pcf_dr_cd
and
specialist_cd = :specialist_cd
"""
# 『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除
PHYSICAL_DELETE_QUERY = """\
DELETE FROM
src05.com_sp_field
WHERE
dcf_pcf_dr_cd = :dcf_pcf_dr_cd
and
specialist_cd = :specialist_cd
"""
record: ComSpField
def __init__(self, record: list[str], db) -> None:
super().__init__(record, db, ComSpField)
program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている)
# モジュール名をクエリパラメータに設定
self.query_parameter['program_name'] = program_name
# 読み込んだレコード値もクエリパラメータに追加
self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()}
def make_query(self):
# 『修正区分がB(修正)かつ専門医メンテナンス区分が1(退職)』の場合、物理削除
if self.record.maint_flag == 'B' and self.record.specialist_maint_div == '1':
self.queries.append(self.PHYSICAL_DELETE_QUERY)
return
# 追加、更新の場合
self.queries.append(self.__make_upsert_query())
return
def __make_upsert_query(self):
set_clauses = [] # 設定項目
# レコードの存在確認
record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter)
# 存在しない場合はInsert
if record_count[0]['count_num'] == 0:
return self.INSERT_QUERY
# 存在する場合ではUpdate
if len(self.record.specialist_maint_div) > 0:
set_clauses.append('specialist_maint_div = :specialist_maint_div')
if len(self.record.specialist_flg) > 0:
set_clauses.append('specialist_flg = :specialist_flg')
set_clauses.append('specialist_publsh_ymd = :specialist_publsh_ymd')
if self.record.specialist_flg == '@':
self.query_parameter['specialist_flg'] = None
self.query_parameter['specialist_publsh_ymd'] = None
if len(self.record.ackn_med_flg) > 0:
set_clauses.append('ackn_med_flg = :ackn_med_flg')
set_clauses.append('ackn_med_publsh_ymd = :ackn_med_publsh_ymd')
if self.record.ackn_med_flg == '@':
self.query_parameter['ackn_med_flg'] = None
self.query_parameter['ackn_med_publsh_ymd'] = None
if len(self.record.guide_med_flg) > 0:
set_clauses.append('guide_med_flg = :guide_med_flg')
set_clauses.append('guide_med_publsh_ymd = :guide_med_publsh_ymd')
if self.record.guide_med_flg == '@':
self.query_parameter['guide_med_flg'] = None
self.query_parameter['guide_med_publsh_ymd'] = None
update_columns = ','.join(set_clauses)
# 何も更新項目が無い場合はNoneとする更新処理は行わない
if len(update_columns) == 0:
return None
else:
# 末尾にカンマを付けてSET句を完成させる
update_columns += ','
update_query = self.UPDATE_QUERY.format(
update_columns=update_columns
)
return update_query

View File

@ -0,0 +1,93 @@
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
from src.batch.ultmarc.utmp_tables.tables.com_specialist_license import ComSpecialistLicense
class ComSpecialistLicenseMapper(UltmarcTableMapper):
"""レイアウト区分010: COM_専門医資格 登録処理"""
# レコード存在確認SQL
RECORD_EXISTS_QUERY = """\
SELECT
COUNT(*) AS count_num
FROM
src05.com_specialist_license
WHERE
specialist_cd = :specialist_cd
"""
# データ登録用SQL
INSERT_QUERY = """\
INSERT INTO src05.com_specialist_license
(
specialist_cd,
specialist_license_name,
regist_ymd,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:specialist_cd,
:specialist_license_name,
:execute_date_str_ymd,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
# 変更用SQL
UPDATE_QUERY = """\
UPDATE
src05.com_specialist_license
SET
specialist_license_name = :specialist_license_name,
update_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
specialist_cd = :specialist_cd
"""
# 修正区分が「C(削除)」の場合の更新SQL
LOGICAL_DELETE_QUERY = """\
UPDATE
src05.com_specialist_license
SET
delete_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
specialist_cd = :specialist_cd
"""
record: ComSpecialistLicense
def __init__(self, record: list[str], db) -> None:
super().__init__(record, db, ComSpecialistLicense)
program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている)
# モジュール名をクエリパラメータに設定
self.query_parameter['program_name'] = program_name
# 読み込んだレコード値もクエリパラメータに追加
self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()}
def make_query(self):
# 修正区分がC(削除)の場合、論理削除
if self.record.maint_flag == 'C':
self.queries.append(self.LOGICAL_DELETE_QUERY)
return
# 追加、更新の場合
self.queries.append(self.__make_upsert_query())
return
def __make_upsert_query(self):
# レコードの存在確認
record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter)
# 存在しない場合はInsert
if record_count[0]['count_num'] == 0:
return self.INSERT_QUERY
# 存在する場合ではUpdate
return self.UPDATE_QUERY

View File

@ -0,0 +1,98 @@
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
from src.batch.ultmarc.utmp_tables.tables.com_thrd_med import ComThrdMed
class ComThrdMedMapper(UltmarcTableMapper):
"""レイアウト区分122: COM_医療圏3次マスタ 登録処理"""
# レコード存在確認SQL
RECORD_EXISTS_QUERY = """\
SELECT
COUNT(*) AS count_num
FROM
src05.com_thrd_med
WHERE
prefcode = :pref_code
AND
thrd_cd = :thrd_cd
"""
# データ登録用SQL
INSERT_QUERY = """\
INSERT INTO src05.com_thrd_med
(
prefcode,
thrd_cd,
thrd_med_sphe_name,
regist_ymd,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:pref_code,
:thrd_cd,
:thrd_med_sphe_name,
:execute_date_str_ymd,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
# データ更新用SQL
UPDATE_QUERY = """\
UPDATE
src05.com_thrd_med
SET
thrd_med_sphe_name = :thrd_med_sphe_name,
update_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
prefcode = :pref_code
AND
thrd_cd = :thrd_cd
"""
# 修正区分が「C(削除)」の場合、物理削除
PHYSICAL_DELETE_QUERY = """\
DELETE FROM
src05.com_thrd_med
WHERE
prefcode = :pref_code
AND
thrd_cd = :thrd_cd
"""
record: ComThrdMed
def __init__(self, record: list[str], db) -> None:
super().__init__(record, db, ComThrdMed)
program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている)
# モジュール名をクエリパラメータに設定
self.query_parameter['program_name'] = program_name
# 読み込んだレコード値もクエリパラメータに追加
self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()}
def make_query(self):
# 修正区分がC(削除)の場合、物理削除
if self.record.maintflag == 'C':
self.queries.append(self.PHYSICAL_DELETE_QUERY)
return
# 追加、更新の場合
self.queries.append(self.__make_upsert_query())
return
def __make_upsert_query(self):
# レコードの存在確認
record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter)
# 存在しない場合はInsert
if record_count[0]['count_num'] == 0:
return self.INSERT_QUERY
# 存在する場合はUpdate
return self.UPDATE_QUERY

View File

@ -0,0 +1,99 @@
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
from src.batch.ultmarc.utmp_tables.tables.com_trt_course import ComTrtCourse
class ComTrtCourseMapper(UltmarcTableMapper):
"""レイアウト区分001: COM_診療科目 登録処理"""
# レコード存在確認SQL
RECORD_EXISTS_QUERY = """\
SELECT
COUNT(*) AS count_num
FROM
src05.com_trt_course
WHERE
trt_course_cd = :trt_course_cd
"""
# データ登録用SQL
INSERT_QUERY = """\
INSERT INTO src05.com_trt_course
(
trt_course_cd,
trt_course_name_kana,
trt_course_name_abb,
trt_course_name,
regist_ymd,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:trt_course_cd,
:trt_course_name_kana,
:trt_course_name_abb,
:trt_course_name,
:execute_date_str_ymd,
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
# 更新用SQL
UPDATE_QUERY = """\
UPDATE
src05.com_trt_course
SET
trt_course_name_kana = :trt_course_name_kana,
trt_course_name_abb = :trt_course_name_abb,
trt_course_name = :trt_course_name,
update_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
trt_course_cd = :trt_course_cd
"""
# 修正区分が「C(削除)」の場合の更新SQL
LOGICAL_DELETE_QUERY = """\
UPDATE
src05.com_trt_course
SET
delete_ymd = :execute_date_str_ymd,
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
trt_course_cd = :trt_course_cd
"""
record: ComTrtCourse
def __init__(self, record: list[str], db) -> None:
super().__init__(record, db, ComTrtCourse)
program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている)
# モジュール名をクエリパラメータに設定
self.query_parameter['program_name'] = program_name
# 読み込んだレコード値もクエリパラメータに追加
self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()}
def make_query(self):
# 修正区分がC(削除)の場合、論理削除
if self.record.maint_flag == 'C':
self.queries.append(self.LOGICAL_DELETE_QUERY)
return
# 追加、更新の場合
self.queries.append(self.__make_upsert_query())
return
def __make_upsert_query(self):
# レコードの存在確認
record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter)
# 存在しない場合はInsert
if record_count[0]['count_num'] == 0:
return self.INSERT_QUERY
# 存在する場合ではUpdate
return self.UPDATE_QUERY

View File

@ -0,0 +1,96 @@
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
from src.batch.ultmarc.utmp_tables.tables.mst_prefc import MstPrefc
class MstPrefcMapper(UltmarcTableMapper):
"""レイアウト区分006: 都道府県マスタ 登録処理"""
# レコード存在確認SQL
RECORD_EXISTS_QUERY = """\
SELECT
COUNT(*) AS count_num
FROM
src05.mst_prefc
WHERE
prefc_cd = :prefc_cd
"""
# データ登録用SQL
INSERT_QUERY = """\
INSERT INTO src05.mst_prefc
(
prefc_cd,
prefc_name,
prefc_name_kana,
delete_flg,
sys_regist_date,
regist_prgm_id,
sys_update_date,
update_prgm_id
)
VALUES (
:prefc_cd,
:prefc_name,
'',
'0',
:execute_datetime,
:program_name,
:execute_datetime,
:program_name
)
"""
# 更新用SQL
UPDATE_QUERY = """\
UPDATE
src05.mst_prefc
SET
prefc_name = :prefc_name,
delete_flg = '0',
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
prefc_cd = :prefc_cd
"""
# 修正区分が「C(削除)」の場合の更新SQL
LOGICAL_DELETE_QUERY = """\
UPDATE
src05.mst_prefc
SET
delete_flg = '1',
sys_update_date = :execute_datetime,
update_prgm_id = :program_name
WHERE
prefc_cd = :prefc_cd
"""
record: MstPrefc
def __init__(self, record: list[str], db) -> None:
super().__init__(record, db, MstPrefc)
program_name = __name__.split('.')[-1] # 当モジュール名(現行から変わっている)
# モジュール名をクエリパラメータに設定
self.query_parameter['program_name'] = program_name
# 読み込んだレコード値もクエリパラメータに追加
self.query_parameter = {**self.query_parameter, **self.record.to_sql_parameter()}
def make_query(self):
# 修正区分がC(削除)の場合、論理削除
if self.record.maint_flag == 'C':
self.queries.append(self.LOGICAL_DELETE_QUERY)
return
# 追加、更新の場合
self.queries.append(self.__make_upsert_query())
return
def __make_upsert_query(self):
# レコードの存在確認
record_count = self.db.execute_select(self.RECORD_EXISTS_QUERY, self.query_parameter)
# 存在しない場合はInsert
if record_count[0]['count_num'] == 0:
return self.INSERT_QUERY
# 存在する場合ではUpdate
return self.UPDATE_QUERY

View File

@ -0,0 +1,8 @@
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
class NullMapper(UltmarcTableMapper):
def make_query(self):
return super().make_query()

View File

@ -0,0 +1,50 @@
from abc import ABCMeta, abstractmethod
from datetime import datetime
from src.batch.common.batch_context import BatchContext
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
from src.db.database import Database
# 処理日を使用するために、configを使用
batch_context = BatchContext.get_instance()
class UltmarcTableMapper(metaclass=ABCMeta):
"""アルトマークテーブルへの登録処理の抽象クラス"""
record: UltmarcTable
db: Database
queries: list[str]
query_parameter: dict
def __init__(self, record: list[str], db: Database, table_class: type[UltmarcTable]) -> None:
self.record = table_class(record)
self.db = db
# 実行年月日(文字列)、実行年月日時分秒を設定
now = datetime.now()
execute_date_str_ymd = now.strftime('%Y%m%d')
execute_datetime = now.strftime('%Y/%m/%d %H:%M:%S')
# クエリリストを初期化
self.queries = []
# 共通クエリパラメータを設定
self.query_parameter = {
'execute_date_str_ymd': execute_date_str_ymd,
'execute_datetime': execute_datetime,
# バッチ共通設定から処理日を取得
'syor_date': batch_context.syor_date
}
@abstractmethod
def make_query(self):
pass
def execute_queries(self):
if len(self.queries) == 0:
raise Exception('make_queryを呼び出してから実行してください')
for query in self.queries:
if query is None:
continue
self.db.execute(query, self.query_parameter)

View File

@ -0,0 +1,14 @@
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
class ComAlma(UltmarcTable):
"""レイアウト区分004: COM_出身校"""
maint_flag: str # 修正区分
alma_cd: str # 出身校コード
alma: str # 出身校
def __init__(self, record: list[str]):
super().__init__(record)
self.maint_flag = record[2]
self.alma_cd = record[1]
self.alma = record[5]

View File

@ -0,0 +1,20 @@
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
class ComAlmaDepartDisc(UltmarcTable):
"""レイアウト区分003: COM_出身校学部識別"""
alma_cd: str # 出身校コード
depart_disc_cd: str # 学部識別コード
estab_e: str # 創立元号
estab_y: str # 創立年
alma_name: str # 出身校名
maint_flag: str # 修正区分
def __init__(self, record: list[str]):
super().__init__(record)
self.alma_cd = record[1]
self.depart_disc_cd = record[2]
self.maint_flag = record[3]
self.alma_name = record[6]
self.estab_e = record[7]
self.estab_y = record[8]

View File

@ -0,0 +1,22 @@
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
class ComBlngSec(UltmarcTable):
"""レイアウト区分008: COM_所属部科"""
blng_sec_cd: str # 所属部科コード
blng_sec_kana: str # 所属部科カナ
blng_sec_name: str # 所属部科名
inst_category: str # 分類補助コード(施設分類)
trt_category: str # 分類補助コード(診療分野分類)
category_sort: str # 分類補助コード(ソートコード)
maint_flag: str # 修正区分
def __init__(self, record: list[str]):
super().__init__(record)
self.blng_sec_cd = record[1]
self.maint_flag = record[2]
self.blng_sec_name = record[5]
self.blng_sec_kana = record[6]
self.inst_category = record[7]
self.trt_category = record[8]
self.category_sort = record[9]

View File

@ -0,0 +1,36 @@
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
class ComCopHp(UltmarcTable):
"""レイアウト区分112: COM_臨床研修病院"""
dcfhp_id: str # DCFコードレコードID
dcfhp_code: str # DCFコード施設コード
dcfhp_yobi: str # DCFコード予備
cophp_id: str # 協力型病院コードID
cophp_code: str # 協力型病院コード(コード)
cophp_yobi: str # 協力型病院コード(予備)
open_year: str # 開始年度
sort_key: str # ソートキー
adddel_div: str # 追加削除区分
maint_flag: str # 修正区分
dcfdsf_inst_code: str # DCFDSF施設コード
cophp_code: str # 協力型病院コード
def __init__(self, record: list[str]):
super().__init__(record)
self.dcfhp_id = record[1]
self.dcfhp_code = record[2]
self.dcfhp_yobi = record[3]
self.maint_flag = record[4]
self.cophp_id = record[5]
self.cophp_code = record[6]
self.cophp_yobi = record[7]
self.open_year = record[8]
self.adddel_div = record[9]
self.sort_key = record[12]
# DCFDSF施設コード
self.dcfdsf_inst_code = ''.join([self.dcfhp_id, self.dcfhp_code, self.dcfhp_yobi])
# 協力型病院コード
self.cophp_code = ''.join([self.cophp_id, self.cophp_code, self.cophp_yobi])

View File

@ -0,0 +1,183 @@
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
class ComDr(UltmarcTable):
"""レイアウト区分501: COM_医師"""
dcfdr_id: str # 個人コードレコードID
dcfdr_code: str # 個人コード(個人コード)
dcfd_yobi: str # 個人コード(予備)
maint_flag: str # 修正区分
maint_date: str # メンテナンス年月日
trn_date: str # 予備/転送年月日
drdel_code: str # 削除予定理由
reptdr_id: str # 重複時相手先コードレコードID
reptdr_code: str # 重複時相手先コード(個人コード)
reptdr_yobi: str # 重複時相手先コード(予備)
dr_name: str # 医師名(漢字)
dr_name_kana: str # 医師名(カナ)
sex_code: str # 性別
birthday_era: str # 生年月日(元号)
birthday_year: str # 生年月日(年)
birthday_month: str # 生年月日(月)
birthday_day: str # 生年月日(日)
home_town_code: str # 出身都道府県コード
medassoci_code: str # 医師会コード
grad_yearera: str # 卒年_元号
grad_year: str # 卒年_年
graduniv_code: str # 出身校コード
graduniv_dept_code: str # 出身校学部識別コード
drda_yera: str # 登録年_元号
drday_year: str # 登録年_年
medsbj_code1: str # 診療科目1
medsbj_code2: str # 診療科目2
medsbj_code3: str # 診療科目3
medsbj_code4: str # 診療科目4
medsbj_code5: str # 診療科目5
dr_addr_lost_code: str # 住所不明
pref_code: str # 住所コード(県コード)
city_code: str # 住所コード(市区町村コード)
addr_code1: str # 住所コード(大字・通称コード)
addr_code2: str # 住所コード(字・丁目コード)
dr_zip_code: str # 郵便番号
dr_addr: str # 自宅住所(漢字)
dr_addr_kana: str # 自宅住所(カナ)
dr_addr_num: str # 住所表示番号
dr_addr_kanj_cnt1: str # 住所カウント_漢字
dr_addr_kanj_cnt2: str # 住所カウント_漢字市区町村
dr_addr_kanj_cnt3: str # 住所カウント_漢字大字・通称
dr_addr_kanj_cnt4: str # 住所カウント_漢字字・丁目
dr_addr_kana_cnt1: str # 住所カウント_カナ
dr_addr_kana_cnt2: str # 住所カウント_カナ市区町村
dr_addr_kana_cnt3: str # 住所カウント_カナ大字・通称
dr_addr_kana_cnt4: str # 住所カウント_カナ字・丁目
dr_tel: str # 自宅電話番号
use_stop_flag: str # 利用停止区分
use_stopc_ode: str # 利用停止理由
cre_stop_date: str # 利用停止登録年月日
release_date: str # 利用停止解除年月日
pract_class_code: str # 開勤区分
pract_yearera: str # 開業年(元号)
pract_year: str # 開業年(年)
bskregst_flag: str # 一括登録フラグ
dcf_pcf_dr_cd: str # DCFPCF医師コード
addr_village_cd: str # 住所(町字)コード
addr_cnt_kana: str # 住所カウントカナ
addr_cnt: str # 住所カウント
opp_dup_code: str # 相手先重複コード
birth_day: str # 生年月日(西暦)
estab_y: str # 開業年(西暦)
grad_y: str # 卒業年(西暦)
drday_y: str # 登録年(西暦)
era_cd: str # 元号コード
# 住所(集合項目)
address_aggregation_items: list
# 診療科目(集合項目)
medsbj_code_items: list
def __init__(self, record: list[str]):
super().__init__(record)
self.dcfdr_id = record[1]
self.dcfdr_code = record[2]
self.dcfd_yobi = record[3].strip()
self.maint_flag = record[4]
self.maint_date = record[5]
self.trn_date = record[6]
self.drdel_code = record[7].strip()
self.reptdr_id = record[8].strip()
self.reptdr_code = record[9].strip()
self.reptdr_yobi = record[10].strip()
self.dr_name = record[11].strip()
self.dr_name_kana = record[12].strip()
self.sex_code = record[13].strip()
self.birthday_era = record[14].strip()
self.birthday_year = record[15].strip()
self.birthday_month = record[16].strip()
self.birthday_day = record[17].strip()
self.home_town_code = record[18].strip()
self.medassoci_code = record[19].strip()
self.grad_yearera = record[20].strip()
self.grad_year = record[21].strip()
self.graduniv_code = record[22].strip()
self.graduniv_dept_code = record[23].strip()
self.drda_yera = record[24].strip()
self.drday_year = record[25].strip()
self.medsbj_code1 = record[26].strip()
self.medsbj_code2 = record[27].strip()
self.medsbj_code3 = record[28].strip()
self.medsbj_code4 = record[29].strip()
self.medsbj_code5 = record[30].strip()
self.dr_addr_lost_code = record[31].strip()
self.pref_code = record[32].strip()
self.city_code = record[33].strip()
self.addr_code1 = record[34].strip()
self.addr_code2 = record[35].strip()
self.dr_zip_code = record[36].strip()
self.dr_addr = record[37].strip()
self.dr_addr_kana = record[38].strip()
self.dr_addr_num = record[39]
self.dr_addr_kanj_cnt1 = record[40]
self.dr_addr_kanj_cnt2 = record[41]
self.dr_addr_kanj_cnt3 = record[42]
self.dr_addr_kanj_cnt4 = record[43]
self.dr_addr_kana_cnt1 = record[44]
self.dr_addr_kana_cnt2 = record[45]
self.dr_addr_kana_cnt3 = record[46]
self.dr_addr_kana_cnt4 = record[47]
self.dr_tel = record[48].strip()
self.use_stop_flag = record[49].strip()
self.use_stopc_ode = record[50].strip()
self.cre_stop_date = record[51].strip()
self.release_date = record[52].strip()
self.pract_class_code = record[53].strip()
self.pract_yearera = record[54].strip()
self.pract_year = record[55].strip()
self.bskregst_flag = record[56].strip()
# DCFPCF医師コード
self.dcf_pcf_dr_cd = ''.join([self.dcfdr_id, self.dcfdr_code, self.dcfd_yobi])
# 住所(町字)コード
self.addr_village_cd = ''.join([self.pref_code, self.city_code, self.addr_code1, self.addr_code2])
# 住所カウントカナ
self.addr_cnt_kana = ''.join([self.dr_addr_kana_cnt1.zfill(2), self.dr_addr_kana_cnt2.zfill(2), self.dr_addr_kana_cnt3.zfill(2), self.dr_addr_kana_cnt4.zfill(2)])
# 住所カウント
self.addr_cnt = ''.join([self.dr_addr_kanj_cnt1.zfill(2), self.dr_addr_kanj_cnt2.zfill(2), self.dr_addr_kanj_cnt3.zfill(2), self.dr_addr_kanj_cnt4.zfill(2)])
# 相手先重複コード
self.opp_dup_code = ''.join([self.reptdr_id, self.reptdr_code, self.reptdr_yobi])
self.birth_day = '' # 生年月日(西暦)
self.estab_y = '' # 開業年(西暦)
self.grad_y = '' # 卒業年(西暦)
self.drday_y = '' # 登録年(西暦)
self.era_cd = '' # 元号コード
# 住所(集合項目)
self.address_aggregation_items = [
self.pref_code,
self.city_code,
self.addr_code1,
self.addr_code2,
self.dr_zip_code,
self.dr_addr_kana,
self.dr_addr_num,
self.dr_addr_kanj_cnt1,
self.dr_addr_kanj_cnt2,
self.dr_addr_kanj_cnt3,
self.dr_addr_kanj_cnt4,
self.dr_addr_kana_cnt1,
self.dr_addr_kana_cnt2,
self.dr_addr_kana_cnt3,
self.dr_addr_kana_cnt4
]
# 診療科目(集合項目)
self.medsbj_code_items = [
self.medsbj_code1,
self.medsbj_code2,
self.medsbj_code3,
self.medsbj_code4,
self.medsbj_code5]

View File

@ -0,0 +1,28 @@
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
class ComDrSosiety(UltmarcTable):
"""レイアウト区分521: COM_所属学会"""
dcf_dr_id: str # レコードID
dcf_dr_code: str # 個人コード
dcf_dr_yobi: str # 個人コード(予備)
maint_flag: str # 修正区分
sosiety_cd: str # 学会コード
cont_flag: str # 予備/所属学会メンテ区分
sosiety_f: str # 学会年度
dcf_pcf_dr_cd: str # DCFPCF医師コード
# メンテナンス年月日 と 予備/転送年月日 は未使用
def __init__(self, record: list[str]):
super().__init__(record)
self.dcf_dr_id = record[1]
self.dcf_dr_code = record[2]
self.dcf_dr_yobi = record[3].strip()
self.maint_flag = record[4]
self.sosiety_cd = record[5]
self.cont_flag = record[6]
self.sosiety_f = record[9]
# DCFPCF医師コード(レコードID + 個人コード + 個人コード(予備))
self.dcf_pcf_dr_cd = ''.join([self.dcf_dr_id, self.dcf_dr_code, self.dcf_dr_yobi])

View File

@ -0,0 +1,49 @@
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
class ComDrWrkplace(UltmarcTable):
"""レイアウト区分502 :COM_医師勤務先"""
maint_flag: str # 修正区分
dcfdr_id: str # 個人コードID
dcfdr_code: str # 個人コード(個人コード)
dcfdr_yobi: str # 個人コード(予備)
hp_id: str # 施設コードID
hp_code: str # 施設コード(施設コード)
hp_yobi: str # 施設コード(予備)
drretflag: str # 予備/退職異動区分
maintdate: str # メンテナンス年月日
trndate: str # 予備/転送年月日
postcode: str # 役職コード
identitycode: str # 大学職位
sectcode: str # 所属部科コード
sectname: str # 所属部科(漢字)
sectname_kana: str # 所属部科(カナ)
notdm_flg: str # DM不可フラグ
full_dcfdr_code: str # 個人ID+個人コード+個人コード予備
full_hp_code: str # 施設ID+施設コード+施設コード予備
def __init__(self, record: list[str]):
super().__init__(record)
self.maintflag = record[4]
self.dcfdr_id = record[1]
self.dcfdr_code = record[2]
self.dcfdr_yobi = record[3].strip()
self.hp_id = record[5]
self.hp_code = record[6]
self.hp_yobi = record[7].strip()
self.drretflag = record[8]
self.maintdate = record[9]
self.trndate = record[10]
self.postcode = record[11].strip()
self.identitycode = record[12].strip()
# 所属部科の集合項目
self.sectcode = record[13].strip()
self.sectname = record[14].strip()
self.sectname_kana = record[15].strip()
self.notdm_flg = record[16].strip()
# ID、コード、予備を結合してフル桁コードに変換
self.full_dcfdr_code = ''.join([self.dcfdr_id, self.dcfdr_code, self.dcfdr_yobi])
self.full_hp_code = ''.join([self.hp_id, self.hp_code, self.hp_yobi])

View File

@ -0,0 +1,14 @@
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
class ComForfrontMedEquip(UltmarcTable):
"""レイアウト区分022: COM_先端医療機器"""
hi_medicmach_code: str # 先進医療機器コード
hi_medicmach_name: str # 先端医療機器名
maint_flag: str # 修正区分
def __init__(self, record: list[str]):
super().__init__(record)
self.hi_medicmach_code = record[1]
self.hi_medicmach_name = record[5]
self.maint_flag = record[2]

View File

@ -0,0 +1,16 @@
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
class ComHamtec(UltmarcTable):
"""レイアウト区分021: COM_高度先進医療"""
maint_flag: str # 修正区分
hamtec_cd: str # 高度先進医療コード
hamtec_div: str # 高度先進医療区分
hamtec_name: str # 高度先進医療名
def __init__(self, record: list[str]):
super().__init__(record)
self.maint_flag = record[3]
self.hamtec_cd = record[1]
self.hamtec_div = record[2]
self.hamtec_name = record[6]

View File

@ -0,0 +1,14 @@
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
class ComHpAssrt(UltmarcTable):
"""レイアウト区分002: 病院種別"""
hp_assrt_cd: str # 病院種別コード
hp_assrt_name: str # 病院種別名
maint_flag: str # 修正区分
def __init__(self, record: list[str]):
super().__init__(record)
self.hp_assrt_cd = record[1]
self.maint_flag = record[2]
self.hp_assrt_name = record[5]

View File

@ -0,0 +1,230 @@
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
class ComInst(UltmarcTable):
"""レイアウト区分101: COM_施設"""
dcfhp_id: str # 施設コードレコードID
dcfhp_code: str # 施設コード(施設コード)
dcfh_yobi: str # 施設コード(予備)
maint_flag: str # 修正区分
maint_date: str # メンテナンス年月日
trn_date: str # 予備/転送年月日
uncheck_flag: str # 未確認フラグ
hpdel_code: str # 削除予定理由
duphp_id: str # 重複時相手先コードレコードID
duphp_code: str # 重複時相手先コード(施設コード)
duphp_yobi: str # 重複時相手先コード(予備)
hp_name: str # 正式施設名(漢字)
hp_name_kana: str # 正式施設名(カナ)
hp_ryaku_name: str # 略式施設名(漢字)
hp_ryaku_name_kana: str # 略式施設名(カナ)
hp_addr_lost_code: str # 住所不明
pref_code: str # 住所コード(県コード)
city_code: str # 住所コード(市区町村コード)
addr_code1: str # 住所コード(大字・通称コード)
addr_code2: str # 住所コード(字・丁目コード)
hp_zip_code: str # 郵便番号
hp_addr: str # 住所(漢字)
hp_addr_kana: str # 住所(カナ)
hp_addr_number: str # 住所表示番号
dr_addr_kanji1: str # 住所カウント_漢字
dr_addr_kanji2: str # 住所カウント_漢字市区町村
dr_addr_kanji3: str # 住所カウント_漢字大字・通称
dr_addr_kanji4: str # 住所カウント_漢字字・丁目
dr_addr_kana1: str # 住所カウント_カナ
dr_addr_kana2: str # 住所カウント_カナ市区町村
dr_addr_kana3: str # 住所カウント_カナ大字・通称
dr_addr_kana4: str # 住所カウント_カナ字・丁目
tel_nothing_flag: str # 電話番号なしフラグ
hp_tel: str # 電話番号
mgt_class_code: str # 経営体
hp_class_code: str # 施設区分
president_id: str # 代表者コードレコードID
president_code: str # 代表者コード(個人コード)
president_yobi: str # 代表者コード(予備)
president: str # 代表者(漢字)
president_kana: str # 代表者(カナ)
open_flag: str # 開業予定フラグ
open_year_month: str # 開業予定年月
close_flag: str # 休院フラグ
close_year_month: str # 休院開始年月
medsbj_code: list # 診療科目160
hp_kind_code: str # 病院種別
reexam_flag: str # 再審査区分
assoc_parrent_id: str # 関連大学親コードレコードID
assoc_parrent_code: str # 関連大学親コード(施設コード)
assoc_parrent_yobi: str # 関連大学親コード(予備)
close_flag2: str # 病棟閉鎖フラグ
bed_num: str # 病床数(定員)
bed_class_maint_date: str # 許可病床メンテ日付
bed_num_sum: str # 許可病床数_合計
bed_num_psy: str # 許可病床数_精神
bed_num_tub: str # 許可病床数_結核
bed_num_epi: str # 許可病床数_感染症
bed_num_gen: str # 許可病床数_その他
bed_num_gen2: str # 許可病床数_一般病床
bed_num_rest: str # 許可病床数_療養病床
inspect_code1: str # 検査項目_微生物
inspect_code2: str # 検査項目_血清
inspect_code3: str # 検査項目_血液
inspect_code4: str # 検査項目_病理
inspect_code5: str # 検査項目_寄生虫
inspect_code6: str # 検査項目_生化
inspect_code7: str # 検査項目_RI
dcfhp_92id: str # 特養医務室コードレコードID
dcfhp_92code: str # 特養医務室コード(施設コード)
dcfhp_92yobi: str # 特養医務室コード(予備)
dcfdsf_inst_code: str # DCFDSF施設コード
univ_prnt_code: str # 関連大学親コード
inst_repre_code: str # 施設代表者コード
village_code: str # 町字コード
addr_cnt_kana: str # 住所カウントカナ
addr_cnt: str # 住所カウント
dup_opp_code: str # 重複時相手先コード
dcf_prnt_inst_code: str # DCF親施設コード
prmit_bed: list # 許可ベッド(集合項目)
insp_item: list # 検査項目(集合項目)
def __init__(self, record: list[str]):
super().__init__(record)
self.dcfhp_id = record[1]
self.dcfhp_code = record[2]
self.dcfh_yobi = record[3].strip()
self.maint_flag = record[4]
self.maint_date = record[5]
self.trn_date = record[6]
self.uncheck_flag = record[7].strip()
self.hpdel_code = record[8].strip()
self.duphp_id = record[9]
self.duphp_code = record[10].strip()
self.duphp_yobi = record[11].strip()
self.hp_name = record[12].strip()
self.hp_name_kana = record[13].strip()
self.hp_ryaku_name = record[14].strip()
self.hp_ryaku_name_kana = record[15].strip()
self.hp_addr_lost_code = record[16].strip()
self.pref_code = record[17].strip()
self.city_code = record[18].strip()
self.addr_code1 = record[19].strip()
self.addr_code2 = record[20].strip()
self.hp_zip_code = record[21].strip()
self.hp_addr = record[22]
self.hp_addr_kana = record[23]
self.hp_addr_number = record[24]
self.dr_addr_kanji1 = record[25].strip()
self.dr_addr_kanji2 = record[26].strip()
self.dr_addr_kanji3 = record[27].strip()
self.dr_addr_kanji4 = record[28].strip()
self.dr_addr_kana1 = record[29].strip()
self.dr_addr_kana2 = record[30].strip()
self.dr_addr_kana3 = record[31].strip()
self.dr_addr_kana4 = record[32].strip()
self.tel_nothing_flag = record[33].strip()
self.hp_tel = record[34].strip()
self.mgt_class_code = record[35].strip()
self.hp_class_code = record[36].strip()
self.president_id = record[37]
self.president_code = record[38].strip()
self.president_yobi = record[39]
self.president = record[40].strip()
self.president_kana = record[41].strip()
self.open_flag = record[42].strip()
self.open_year_month = record[43].strip()
self.close_flag = record[44].strip()
self.close_year_month = record[45].strip()
# 診療科目160(csvカラム番号 46 105)
# rangeの第2引数の数字はループに含まれないため、+1を指定する
self.medsbj_code = []
for i in range(46, 106):
self.medsbj_code.append(str(record[i]))
self.hp_kind_code = record[106].strip()
self.reexam_flag = record[107].strip()
self.assoc_parrent_id = record[108].strip()
self.assoc_parrent_code = record[109].strip()
self.assoc_parrent_yobi = record[110].strip()
self.close_flag2 = record[111].strip()
self.bed_num = record[112].strip()
self.bed_class_maint_date = record[113].strip()
self.bed_num_sum = record[114].strip()
self.bed_num_psy = record[115].strip()
self.bed_num_tub = record[116].strip()
self.bed_num_epi = record[117].strip()
self.bed_num_gen = record[118].strip()
self.bed_num_gen2 = record[119].strip()
self.bed_num_rest = record[120].strip()
# smallint型のカラム値は、空文字で渡ってきた場合はNULLに変換する
self.bed_num = self.bed_num if len(self.bed_num) > 0 else None
self.bed_num_sum = self.bed_num_sum if len(self.bed_num_sum) > 0 else None
self.bed_num_psy = self.bed_num_psy if len(self.bed_num_psy) > 0 else None
self.bed_num_tub = self.bed_num_tub if len(self.bed_num_tub) > 0 else None
self.bed_num_epi = self.bed_num_epi if len(self.bed_num_epi) > 0 else None
self.bed_num_gen = self.bed_num_gen if len(self.bed_num_gen) > 0 else None
self.bed_num_gen2 = self.bed_num_gen2 if len(self.bed_num_gen2) > 0 else None
self.bed_num_rest = self.bed_num_rest if len(self.bed_num_rest) > 0 else None
self.inspect_code1 = record[121].strip()
self.inspect_code2 = record[122].strip()
self.inspect_code3 = record[123].strip()
self.inspect_code4 = record[124].strip()
self.inspect_code5 = record[125].strip()
self.inspect_code6 = record[126].strip()
self.inspect_code7 = record[127].strip()
self.dcfhp_92id = record[128].strip()
self.dcfhp_92code = record[129].strip()
self.dcfhp_92yobi = record[130].strip()
# 住所カウント_漢字の埋め
self.dr_addr_kanji1 = self.dr_addr_kanji1.zfill(2)
self.dr_addr_kanji2 = self.dr_addr_kanji2.zfill(2)
self.dr_addr_kanji3 = self.dr_addr_kanji3.zfill(2)
self.dr_addr_kanji4 = self.dr_addr_kanji4.zfill(2)
# 住所カウント_カナの埋め
self.dr_addr_kana1 = self.dr_addr_kana1.zfill(2)
self.dr_addr_kana2 = self.dr_addr_kana2.zfill(2)
self.dr_addr_kana3 = self.dr_addr_kana3.zfill(2)
self.dr_addr_kana4 = self.dr_addr_kana4.zfill(2)
# DCFDSF施設コード
self.dcfdsf_inst_code = self.dcfhp_id + self.dcfhp_code + self.dcfh_yobi
# 関連大学親コード
self.univ_prnt_code = self.assoc_parrent_id + self.assoc_parrent_code + self.assoc_parrent_yobi
# 施設代表者コード
self.inst_repre_code = self.president_id + self.president_code + self.president_yobi
# 町字コード
self.village_code = self.pref_code + self.city_code + self.addr_code1 + self.addr_code2
# 住所カウントカナ
self.addr_cnt_kana = self.dr_addr_kana1 + self.dr_addr_kana2 + self.dr_addr_kana3 + self.dr_addr_kana4
# 住所カウント
self.addr_cnt = self.dr_addr_kanji1 + self.dr_addr_kanji2 + self.dr_addr_kanji3 + self.dr_addr_kanji4
# 重複時相手先コード
self.dup_opp_code = self.duphp_id + self.duphp_code + self.duphp_yobi
# DCF親施設コード
self.dcf_prnt_inst_code = self.dcfhp_92id + self.dcfhp_92code + self.dcfhp_92yobi
# 許可ベッド(集合項目)
self.prmit_bed = [
self.bed_num_sum,
self.bed_num_psy,
self.bed_num_tub,
self.bed_num_epi,
self.bed_num_gen,
self.bed_num_gen2,
self.bed_num_rest
]
# 検査項目(集合項目)
self.insp_item = [
self.inspect_code1,
self.inspect_code2,
self.inspect_code3,
self.inspect_code4,
self.inspect_code5,
self.inspect_code6,
self.inspect_code7
]

View File

@ -0,0 +1,703 @@
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
class ComInstAtt(UltmarcTable):
"""レイアウト区分111: COM_施設属性"""
dcfhp_id: str # DCFコードレコードID
dcfhp_code: str # DCFコード施設コード
dcfhp_yobi: str # DCFコード予備10/8asa
dpc_flag: str # DPC対象病院フラグ
dpc_spec_day: str # DPC対象病院指定年月日
dpc_cancel_day: str # DPC対象病院取消年月日
predpc_flag: str # DPC準備病院フラグ
predpc_spec_day: str # DPC準備病院承認年
predpc_cancel_day: str # DPC準備病院取消年月日
cancer_flag: str # がん診療連携拠点病院フラグ
cancer_spec_day: str # がん診療連携拠点病院指定年月日
cancer_cancel_day: str # がん診療連携拠点病院取消年月日
funchp_flag: str # 特定機能病院フラグ
funchp_ok_date: str # 特定機能病院承認年月日
funchp_can_date: str # 特定機能病院取消年月日
areasuphp_flag: str # 地域医療支援病院フラグ
areasuphp_intrate: str # 地域医療支援病院紹介率
areasuphp_ok_date: str # 地域医療支援病院承認年月日
areasuphp_can_date: str # 地域医療支援病院取消年月日
acuthp_add_flag: str # 超急性期脳卒中加算フラグ
acuthp_add_ok_date: str # 超急性期脳卒中加算承認年月日
acuthp_add_can_date: str # 超急性期脳卒中加算取消年月日
genadmisiion_flag: str # 総合入院体制加算フラグ
genadmisiion_ok_date: str # 総合入院体制加算承認年月日
genadmisiion_can_date: str # 総合入院体制加算取消年月日
assistance_flag: str # 医師事務作業補助体制加算フラグ
assistance_ok_date: str # 医師事務作業補助体制加算承認年月日
assistance_can_date: str # 医師事務作業補助体制加算取消年月日
diagnosis_treatment_flag: str # 診療録管理体制加算フラグ
diagnosis_treatment_spec_day: str # 診療録管理体制加算承認年月日
diagnosis_treatment_cancel_day: str # 診療録管理体制加算取消年月日
safety_flag: str # 医療安全対策加算フラグ
safety_spec_day: str # 医療安全対策加算承認年月日
safety_cancel_day: str # 医療安全対策加算取消年月日
highrisk_flag: str # 褥瘡ハイリスク患者ケア加算フラグ
highrisk_spec_day: str # 褥瘡ハイリスク患者ケア加算承認年月日
highrisk_cancel_day: str # 褥瘡ハイリスク患者ケア加算取消年月日
infant_and_holiday_flag: str # 地域連携小児夜間・休日診療料フラグ
infant_and_holiday_spec_day: str # 地域連携小児夜間・休日診療料承認
infant_and_holiday_cancel_day: str # 地域連携小児夜間・休日診療料取消
ophp_flag: str # 開放型病院フラグ
ophpok_date: str # 開放型病院承認年月日
ophpcan_date: str # 開放型病院取消年月日
critical_flag: str # 地域連携クリティカルパスフラグ
critical_code01: str # 地域連携クリティカルパスコード1
critical_code02: str # 地域連携クリティカルパスコード2
critical_code03: str # 地域連携クリティカルパスコード3
critical_code04: str # 地域連携クリティカルパスコード4
critical_code05: str # 地域連携クリティカルパスコード5
critical_code06: str # 地域連携クリティカルパスコード6
critical_code07: str # 地域連携クリティカルパスコード7
critical_code08: str # 地域連携クリティカルパスコード8
critical_code09: str # 地域連携クリティカルパスコード9
critical_code10: str # 地域連携クリティカルパスコード10
critical_code11: str # 地域連携クリティカルパスコード11
critical_code12: str # 地域連携クリティカルパスコード12
critical_code13: str # 地域連携クリティカルパスコード13
critical_code14: str # 地域連携クリティカルパスコード14
critical_code15: str # 地域連携クリティカルパスコード15
critical_code16: str # 地域連携クリティカルパスコード16
critical_code17: str # 地域連携クリティカルパスコード17
critical_code18: str # 地域連携クリティカルパスコード18
critical_code19: str # 地域連携クリティカルパスコード19
critical_code20: str # 地域連携クリティカルパスコード20
drgmgthp_flag: str # 薬剤管理指導料フラグ
drgmgthp_ok_date: str # 薬剤管理指導料承認年月日
drgmgthp_can_date: str # 薬剤管理指導料取消年月日
image_diagnosis_flag: str # 画像診断管理加算フラグ
image_diagnosis_specified_day: str # 画像診断管理加算承認年月日
image_diagnosis_cancel_day: str # 画像診断管理加算取消年月日
chemotherapy_flag: str # 外来化学療法加算フラグ
chemotherapy_spec_day: str # 外来化学療法加算承認年月日
chemotherapy_cancel_day: str # 外来化学療法加算取消年月日
rehabilitation_flag: str # 疾患別リハビリテーション料フラグ
rehabilitation_code01: str # 疾患別リハビリテーション料コード1
rehabilitation_code02: str # 疾患別リハビリテーション料コード2
rehabilitation_code03: str # 疾患別リハビリテーション料コード3
rehabilitation_code04: str # 疾患別リハビリテーション料コード4
rehabilitation_code05: str # 疾患別リハビリテーション料コード5
rehabilitation_code06: str # 疾患別リハビリテーション料コード6
rehabilitation_code07: str # 疾患別リハビリテーション料コード7
rehabilitation_code08: str # 疾患別リハビリテーション料コード8
rehabilitation_code09: str # 疾患別リハビリテーション料コード9
rehabilitation_code10: str # 疾患別リハビリテーション料コード10
anesthetizing_manage_flag: str # 麻酔管理料フラグ
anesthetizing_manage_spec_day: str # 麻酔管理料承認年月日
anesthetizing_manage_can_day: str # 麻酔管理料取消年月日
home_recuperation_flag: str # 在宅療養支援病院・診療所フラグ
home_recuperation_spec_day: str # 在宅療養支援病院・診療所承認年月
home_recuperation_cancel_day: str # 在宅療養支援病院・診療所取消年月
synthesis_when_staying_flag: str # 在宅時医学総合管理料フラグ
synthesis_when_staying_spec_day: str # 在宅時医学総合管理料承認年月日
synthesis_when_staying_can_day: str # 在宅時医学総合管理料取消年月日
home_late_flag: str # 在宅末期医療総合診療料フラグ
home_late_ok_day: str # 在宅末期医療総合診療料承認年月日
home_late_can_day: str # 在宅末期医療総合診療料取消年月日
caremix_kind: str # ケアミックス区分
fullmove_flag: str # 完全型・移行型区分
resthp_flag: str # 療養型病床群フラグ
resthp_care_kind: str # 療養型病床群_医療型看護種別
resthp_bed_num: str # 療養型病床群_医療型病床数
resthp_ok_date: str # 療養型病床群_医療型承認年月日
resthp_can_date: str # 療養型病床群_医療型取消年月日
resthp_care_nrs_kind: str # 療養型病床群_介護型看護種別
resthp_care_bed_num: str # 療養型病床群_介護型病床数
resthp_care_ok_date: str # 療養型病床群_介護型承認年月日
resthp_care_can_date: str # 療養型病床群_介護型取消年月日
resthp_sbed_num: str # 療養型病床群_稼動数合計病床数
nrmhp_flag: str # 一般病棟フラグ
nrmhp_care_kind: str # 一般病棟看護種別
nrmhp_bed_total_num: str # 一般病棟病床数
menthp_flag: str # 精神病棟フラグ
menthp_care_kind: str # 精神病棟看護種別
menthp_bed_num: str # 精神病棟病床数
tubhp_flag: str # 結核病棟フラグ
tubhp_care_kind: str # 結核病棟看護種別
tubhp_bed_num: str # 結核病棟病床数
infhp_flag: str # 感染症特定
infhp_flag1: str # 感染症1種
infhp_flag2: str # 感染症2種
infhp_bed_flag: str # 感染症病床フラグ
infhp_bed_num: str # 感染症病床病床数
hospice_flag: str # 緩和ケア病棟設置病院フラグ
hospice_bed_num: str # 緩和ケア病棟設置病院病床数
hospice_ok_date: str # 緩和ケア病棟設置病院承認年月日
hospice_can_date: str # 緩和ケア病棟設置病院取消年月日
hpfunce_st_flag: str # 医療機能評価フラグ
hpfunce_st_kind: str # 医療機能評価種別
hpfunce_st_ok_date: str # 医療機能評価承認年月日
hpfunce_st_can_date: str # 医療機能評価取消年月日
clolyhp_kind: str # 臨床研修指定病院_基幹型病院1フラグ
clolyhp_ok_date: str # 臨床研修指定病院_基幹型病院1承認年月日
clolyhp_can_date: str # 臨床研修指定病院_基幹型病院1取消年月日
clhp_kind: str # 臨床研修指定病院_基幹型病院2(群指定)フラグ
clhp_ok_date: str # 臨床研修指定病院_基幹型病院2(群指定)承認
clhp_can_date: str # 臨床研修指定病院_基幹型病院2(群指定)取消
cldephp_kind: str # 臨床研修指定病院_協力型病院(群指定)フラグ
cldephp_ok_date: str # 臨床研修指定病院_協力型病院(群指定)承認年
cldephp_can_date: str # 臨床研修指定病院_協力型病院(群指定)取消年
disasthp_flag: str # 災害拠点病院
d1emerhp_flag: str # 救急医療救急告示
d2emerhp_flag: str # 救急医療2次救急
d3emerhp_flag: str # 救急医療3次救急
emergency_clinic: str # 救急告示診療所
trial_core_flag: str # 治験中核病院フラグ
trial_core_div: str # 治験中核病院区分
trial_core_ok_date: str # 治験中核病院承認年月日
trial_core_can_date: str # 治験中核病院取消年月日
dementia_flag: str # 認知症疾患医療センターフラグ
dementia_okd_ate: str # 認知症疾患医療センター承認年月日
dementia_can_date: str # 認知症疾患医療センター取消年月日
sphealth_exploration: str # 特定健康診査実施機
sphealth_guidance: str # 特定保健指導実施機
hiadhp_flag: str # 先端医療・高度医療技術実施医療機関フラグ
hiadhpcode1: str # 先端医療・高度医療技術実施医療機関1コード
hiadhpkind1: str # 先端医療・高度医療技術実施医療機関1区分
hiadhpcode2: str # 先端医療・高度医療技術実施医療機関2コード
hiadhpkind2: str # 先端医療・高度医療技術実施医療機関2区分
hiadhpcode3: str # 先端医療・高度医療技術実施医療機関3コード
hiadhpkind3: str # 先端医療・高度医療技術実施医療機関3区分
hiadhpcode4: str # 先端医療・高度医療技術実施医療機関4コード
hiadhpkind4: str # 先端医療・高度医療技術実施医療機関4区分
hiadhpcode5: str # 先端医療・高度医療技術実施医療機関5コード
hiadhpkind5: str # 先端医療・高度医療技術実施医療機関5区分
hiadhpcode6: str # 先端医療・高度医療技術実施医療機関6コード
hiadhpkind6: str # 先端医療・高度医療技術実施医療機関6区分
hiadhpcode7: str # 先端医療・高度医療技術実施医療機関7コード
hiadhpkind7: str # 先端医療・高度医療技術実施医療機関7区分
hiadhpcode8: str # 先端医療・高度医療技術実施医療機関8コード
hiadhpkind8: str # 先端医療・高度医療技術実施医療機関8区分
hiadhpcode9: str # 先端医療・高度医療技術実施医療機関9コード
hiadhpkind9: str # 先端医療・高度医療技術実施医療機関9区分
hiadhpcode10: str # 先端医療・高度医療技術実施医療機関10コード
hiadhpkind10: str # 先端医療・高度医療技術実施医療機関10区分
hiadhpcode11: str # 先端医療・高度医療技術実施医療機関11コード
hiadhpkind11: str # 先端医療・高度医療技術実施医療機関11区分
hiadhpcode12: str # 先端医療・高度医療技術実施医療機関12コード
hiadhpkind12: str # 先端医療・高度医療技術実施医療機関12区分
hiadhpcode13: str # 先端医療・高度医療技術実施医療機関13コード
hiadhpkind13: str # 先端医療・高度医療技術実施医療機関13区分
hiadhpcode14: str # 先端医療・高度医療技術実施医療機関14コード
hiadhpkind14: str # 先端医療・高度医療技術実施医療機関14区分
hiadhpcode15: str # 先端医療・高度医療技術実施医療機関15コード
hiadhpkind15: str # 先端医療・高度医療技術実施医療機関15区分
hiadhpcode16: str # 先端医療・高度医療技術実施医療機関16コード
hiadhpkind16: str # 先端医療・高度医療技術実施医療機関16区分
hiadhpcode17: str # 先端医療・高度医療技術実施医療機関17コード
hiadhpkind17: str # 先端医療・高度医療技術実施医療機関17区分
hiadhpcode18: str # 先端医療・高度医療技術実施医療機関18コード
hiadhpkind18: str # 先端医療・高度医療技術実施医療機関18区分
hiadhpcode19: str # 先端医療・高度医療技術実施医療機関19コード
hiadhpkind19: str # 先端医療・高度医療技術実施医療機関19区分
hiadhpcode20: str # 先端医療・高度医療技術実施医療機関20コード
hiadhpkind20: str # 先端医療・高度医療技術実施医療機関20区分
hiadhpcode21: str # 先端医療・高度医療技術実施医療機関21コード
hiadhpkind21: str # 先端医療・高度医療技術実施医療機関21区分
hiadhpcode22: str # 先端医療・高度医療技術実施医療機関22コード
hiadhpkind22: str # 先端医療・高度医療技術実施医療機関22区分
hiadhpcode23: str # 先端医療・高度医療技術実施医療機関23コード
hiadhpkind23: str # 先端医療・高度医療技術実施医療機関23区分
hiadhpcode24: str # 先端医療・高度医療技術実施医療機関24コード
hiadhpkind24: str # 先端医療・高度医療技術実施医療機関24区分
hiadhpcode25: str # 先端医療・高度医療技術実施医療機関25コード
hiadhpkind25: str # 先端医療・高度医療技術実施医療機関25区分
hiadhpcode26: str # 先端医療・高度医療技術実施医療機関26コード
hiadhpkind26: str # 先端医療・高度医療技術実施医療機関26区分
hiadhpcode27: str # 先端医療・高度医療技術実施医療機関27コード
hiadhpkind27: str # 先端医療・高度医療技術実施医療機関27区分
hiadhpcode28: str # 先端医療・高度医療技術実施医療機関28コード
hiadhpkind28: str # 先端医療・高度医療技術実施医療機関28区分
hiadhpcode29: str # 先端医療・高度医療技術実施医療機関29コード
hiadhpkind29: str # 先端医療・高度医療技術実施医療機関29区分
hiadhpcode30: str # 先端医療・高度医療技術実施医療機関30コード
hiadhpkind30: str # 先端医療・高度医療技術実施医療機関30区分
hiadhpcode31: str # 先端医療・高度医療技術実施医療機関31コード
hiadhpkind31: str # 先端医療・高度医療技術実施医療機関31区分
hiadhpcode32: str # 先端医療・高度医療技術実施医療機関32コード
hiadhpkind32: str # 先端医療・高度医療技術実施医療機関32区分
hiadhpcode33: str # 先端医療・高度医療技術実施医療機関33コード
hiadhpkind33: str # 先端医療・高度医療技術実施医療機関33区分
hiadhpcode34: str # 先端医療・高度医療技術実施医療機関34コード
hiadhpkind34: str # 先端医療・高度医療技術実施医療機関34区分
hiadhpcode35: str # 先端医療・高度医療技術実施医療機関35コード
hiadhpkind35: str # 先端医療・高度医療技術実施医療機関35区分
hiadhpcode36: str # 先端医療・高度医療技術実施医療機関36コード
hiadhpkind36: str # 先端医療・高度医療技術実施医療機関36区分
hiadhpcode37: str # 先端医療・高度医療技術実施医療機関37コード
hiadhpkind37: str # 先端医療・高度医療技術実施医療機関37区分
hiadhpcode38: str # 先端医療・高度医療技術実施医療機関38コード
hiadhpkind38: str # 先端医療・高度医療技術実施医療機関38区分
hiadhpcode39: str # 先端医療・高度医療技術実施医療機関39コード
hiadhpkind39: str # 先端医療・高度医療技術実施医療機関39区分
hiadhpcode40: str # 先端医療・高度医療技術実施医療機関40コード
hiadhpkind40: str # 先端医療・高度医療技術実施医療機関40区分
hitechhp_flag: str # 先端医療機器フラグ
hitechhpkind1: str # 先端医療機器1
hitechhpkind2: str # 先端医療機器2
hitechhpkind3: str # 先端医療機器3
hitechhpkind4: str # 先端医療機器4
hitechhpkind5: str # 先端医療機器5
hitechhpkind6: str # 先端医療機器6
hitechhpkind7: str # 先端医療機器7
hitechhpkind8: str # 先端医療機器8
hitechhpkind9: str # 先端医療機器9
hitechhpkind10: str # 先端医療機器10
hitechhpkind11: str # 先端医療機器11
hitechhpkind12: str # 先端医療機器12
hitechhpkind13: str # 先端医療機器13
hitechhpkind14: str # 先端医療機器14
hitechhpkind15: str # 先端医療機器15
hitechhpkind16: str # 先端医療機器16
hitechhpkind17: str # 先端医療機器17
hitechhpkind18: str # 先端医療機器18
hitechhpkind19: str # 先端医療機器19
hitechhpkind20: str # 先端医療機器20
policy_medical_flag: str # 政策医療フラグ
policymedical_code01: str # 政策医療1コード
policymedical_content01: str # 政策医療1区分
policymedical_code02: str # 政策医療2コード
policymedical_content02: str # 政策医療2区分
policymedical_code03: str # 政策医療3コード
policymedical_content03: str # 政策医療3区分
policymedical_code04: str # 政策医療4コード
policymedical_content04: str # 政策医療4区分
policymedical_code05: str # 政策医療5コード
policymedical_content05: str # 政策医療5区分
policymedical_code06: str # 政策医療6コード
policymedical_content06: str # 政策医療6区分
policymedical_code07: str # 政策医療7コード
policymedical_content07: str # 政策医療7区分
policymedical_code08: str # 政策医療8コード
policymedical_content08: str # 政策医療8区分
policymedical_code09: str # 政策医療9コード
policymedical_content09: str # 政策医療9区分
policymedical_code10: str # 政策医療10コード
policymedical_content10: str # 政策医療10区分
policymedical_code11: str # 政策医療11コード
policymedical_content11: str # 政策医療11区分
policymedical_code12: str # 政策医療12コード
policymedical_content12: str # 政策医療12区分
policymedical_code13: str # 政策医療13コード
policymedical_content13: str # 政策医療13区分
policymedical_code14: str # 政策医療14コード
policymedical_content14: str # 政策医療14区分
policymedical_code15: str # 政策医療15コード
policymedical_content15: str # 政策医療15区分
policymedical_code16: str # 政策医療16コード
policymedical_content16: str # 政策医療16区分
policymedical_code17: str # 政策医療17コード
policymedical_content17: str # 政策医療17区分
policymedical_code18: str # 政策医療18コード
policymedical_content18: str # 政策医療18区分
policymedical_code19: str # 政策医療19コード
policymedical_content19: str # 政策医療19区分
policymedical_code20: str # 政策医療20コード
policymedical_content20: str # 政策医療20区分
visitcarest_flag: str # 訪問看護ステーションフラグ
visitcarestation_id: str # 訪問看護ステーション_施設コード(レコードID
visitcarestation_code: str # 訪問看護ステーション_施設コード(施設コード)
visitcarestation_yobi: str # 訪問看護ステーション_施設コード(予備)
open_date: str # 開設年月
maint_flag: str # 修正区分
adddel_div: str # 追加削除区分
dcfdsf_inst_code: str # DCFDSF施設コード
resthp_items: list # 療養型病床リスト
cl_items: list # 臨床研修指定病院リスト
def __init__(self, record: list[str]):
super().__init__(record)
self.dcfhp_id = record[1].strip()
self.dcfhp_code = record[2].strip()
self.dcfhp_yobi = record[3].strip()
self.maint_flag = record[4].strip()
self.adddel_div = record[5].strip()
self.dpc_flag = record[8].strip()
self.dpc_spec_day = record[9].strip()
self.dpc_cancel_day = record[10].strip()
self.predpc_flag = record[11].strip()
self.predpc_spec_day = record[12].strip()
self.predpc_cancel_day = record[13].strip()
self.cancer_flag = record[14].strip()
self.cancer_spec_day = record[15].strip()
self.cancer_cancel_day = record[16].strip()
self.funchp_flag = record[17].strip()
self.funchp_ok_date = record[18].strip()
self.funchp_can_date = record[19].strip()
self.areasuphp_flag = record[20].strip()
self.areasuphp_intrate = record[21].strip()
self.areasuphp_ok_date = record[22].strip()
self.areasuphp_can_date = record[23].strip()
self.acuthp_add_flag = record[24].strip()
self.acuthp_add_ok_date = record[25].strip()
self.acuthp_add_can_date = record[26].strip()
self.genadmisiion_flag = record[27].strip()
self.genadmisiion_ok_date = record[28].strip()
self.genadmisiion_can_date = record[29].strip()
self.assistance_flag = record[30].strip()
self.assistance_ok_date = record[31].strip()
self.assistance_can_date = record[32].strip()
self.diagnosis_treatment_flag = record[33].strip()
self.diagnosis_treatment_spec_day = record[34].strip()
self.diagnosis_treatment_cancel_day = record[35].strip()
self.safety_flag = record[36].strip()
self.safety_spec_day = record[37].strip()
self.safety_cancel_day = record[38].strip()
self.highrisk_flag = record[39].strip()
self.highrisk_spec_day = record[40].strip()
self.highrisk_cancel_day = record[41].strip()
self.infant_and_holiday_flag = record[42].strip()
self.infant_and_holiday_spec_day = record[43].strip()
self.infant_and_holiday_cancel_day = record[44].strip()
self.ophp_flag = record[45].strip()
self.ophpok_date = record[46].strip()
self.ophpcan_date = record[47].strip()
self.critical_flag = record[48].strip()
self.critical_code01 = record[49].strip()
self.critical_code02 = record[50].strip()
self.critical_code03 = record[51].strip()
self.critical_code04 = record[52].strip()
self.critical_code05 = record[53].strip()
self.critical_code06 = record[54].strip()
self.critical_code07 = record[55].strip()
self.critical_code08 = record[56].strip()
self.critical_code09 = record[57].strip()
self.critical_code10 = record[58].strip()
self.critical_code11 = record[59].strip()
self.critical_code12 = record[60].strip()
self.critical_code13 = record[61].strip()
self.critical_code14 = record[62].strip()
self.critical_code15 = record[63].strip()
self.critical_code16 = record[64].strip()
self.critical_code17 = record[65].strip()
self.critical_code18 = record[66].strip()
self.critical_code19 = record[67].strip()
self.critical_code20 = record[68].strip()
self.drgmgthp_flag = record[69].strip()
self.drgmgthp_ok_date = record[70].strip()
self.drgmgthp_can_date = record[71].strip()
self.image_diagnosis_flag = record[72].strip()
self.image_diagnosis_specified_day = record[73].strip()
self.image_diagnosis_cancel_day = record[74].strip()
self.chemotherapy_flag = record[75].strip()
self.chemotherapy_spec_day = record[76].strip()
self.chemotherapy_cancel_day = record[77].strip()
self.rehabilitation_flag = record[78].strip()
self.rehabilitation_code01 = record[79].strip()
self.rehabilitation_code02 = record[80].strip()
self.rehabilitation_code03 = record[81].strip()
self.rehabilitation_code04 = record[82].strip()
self.rehabilitation_code05 = record[83].strip()
self.rehabilitation_code06 = record[84].strip()
self.rehabilitation_code07 = record[85].strip()
self.rehabilitation_code08 = record[86].strip()
self.rehabilitation_code09 = record[87].strip()
self.rehabilitation_code10 = record[88].strip()
self.anesthetizing_manage_flag = record[89].strip()
self.anesthetizing_manage_spec_day = record[90].strip()
self.anesthetizing_manage_can_day = record[91].strip()
self.home_recuperation_flag = record[92].strip()
self.home_recuperation_spec_day = record[93].strip()
self.home_recuperation_cancel_day = record[94].strip()
self.synthesis_when_staying_flag = record[95].strip()
self.synthesis_when_staying_spec_day = record[96].strip()
self.synthesis_when_staying_can_day = record[97].strip()
self.home_late_flag = record[98].strip()
self.home_late_ok_day = record[99].strip()
self.home_late_can_day = record[100].strip()
self.caremix_kind = record[101].strip()
self.fullmove_flag = record[102].strip()
self.resthp_flag = record[103].strip()
self.resthp_care_kind = record[104].strip()
self.resthp_bed_num = record[105].strip()
self.resthp_ok_date = record[106].strip()
self.resthp_can_date = record[107].strip()
self.resthp_care_nrs_kind = record[108].strip()
self.resthp_care_bed_num = record[109].strip()
self.resthp_care_ok_date = record[110].strip()
self.resthp_care_can_date = record[111].strip()
self.resthp_sbed_num = record[112].strip()
self.nrmhp_flag = record[113].strip()
self.nrmhp_care_kind = record[114].strip()
self.nrmhp_bed_total_num = record[115].strip()
self.menthp_flag = record[116].strip()
self.menthp_care_kind = record[117].strip()
self.menthp_bed_num = record[118].strip()
self.tubhp_flag = record[119].strip()
self.tubhp_care_kind = record[120].strip()
self.tubhp_bed_num = record[121].strip()
self.infhp_flag = record[122].strip()
self.infhp_flag1 = record[123].strip()
self.infhp_flag2 = record[124].strip()
self.infhp_bed_flag = record[125].strip()
self.infhp_bed_num = record[126].strip()
self.hospice_flag = record[127].strip()
self.hospice_bed_num = record[128].strip()
self.hospice_ok_date = record[129].strip()
self.hospice_can_date = record[130].strip()
self.hpfunce_st_flag = record[131].strip()
self.hpfunce_st_kind = record[132].strip()
self.hpfunce_st_ok_date = record[133].strip()
self.hpfunce_st_can_date = record[134].strip()
self.clolyhp_kind = record[135].strip()
self.clolyhp_ok_date = record[136].strip()
self.clolyhp_can_date = record[137].strip()
self.clhp_kind = record[138].strip()
self.clhp_ok_date = record[139].strip()
self.clhp_can_date = record[140].strip()
self.cldephp_kind = record[141].strip()
self.cldephp_ok_date = record[142].strip()
self.cldephp_can_date = record[143].strip()
self.disasthp_flag = record[144].strip()
self.d1emerhp_flag = record[145].strip()
self.d2emerhp_flag = record[146].strip()
self.d3emerhp_flag = record[147].strip()
self.emergency_clinic = record[148].strip()
self.trial_core_flag = record[149].strip()
self.trial_core_div = record[150].strip()
self.trial_core_ok_date = record[151].strip()
self.trial_core_can_date = record[152].strip()
self.dementia_flag = record[153].strip()
self.dementia_okd_ate = record[154].strip()
self.dementia_can_date = record[155].strip()
self.sphealth_exploration = record[156].strip()
self.sphealth_guidance = record[157].strip()
self.hiadhp_flag = record[158].strip()
self.hiadhpcode1 = record[159].strip()
self.hiadhpkind1 = record[160].strip()
self.hiadhpcode2 = record[161].strip()
self.hiadhpkind2 = record[162].strip()
self.hiadhpcode3 = record[163].strip()
self.hiadhpkind3 = record[164].strip()
self.hiadhpcode4 = record[165].strip()
self.hiadhpkind4 = record[166].strip()
self.hiadhpcode5 = record[167].strip()
self.hiadhpkind5 = record[168].strip()
self.hiadhpcode6 = record[169].strip()
self.hiadhpkind6 = record[170].strip()
self.hiadhpcode7 = record[171].strip()
self.hiadhpkind7 = record[172].strip()
self.hiadhpcode8 = record[173].strip()
self.hiadhpkind8 = record[174].strip()
self.hiadhpcode9 = record[175].strip()
self.hiadhpkind9 = record[176].strip()
self.hiadhpcode10 = record[177].strip()
self.hiadhpkind10 = record[178].strip()
self.hiadhpcode11 = record[179].strip()
self.hiadhpkind11 = record[180].strip()
self.hiadhpcode12 = record[181].strip()
self.hiadhpkind12 = record[182].strip()
self.hiadhpcode13 = record[183].strip()
self.hiadhpkind13 = record[184].strip()
self.hiadhpcode14 = record[185].strip()
self.hiadhpkind14 = record[186].strip()
self.hiadhpcode15 = record[187].strip()
self.hiadhpkind15 = record[188].strip()
self.hiadhpcode16 = record[189].strip()
self.hiadhpkind16 = record[190].strip()
self.hiadhpcode17 = record[191].strip()
self.hiadhpkind17 = record[192].strip()
self.hiadhpcode18 = record[193].strip()
self.hiadhpkind18 = record[194].strip()
self.hiadhpcode19 = record[195].strip()
self.hiadhpkind19 = record[196].strip()
self.hiadhpcode20 = record[197].strip()
self.hiadhpkind20 = record[198].strip()
self.hiadhpcode21 = record[199].strip()
self.hiadhpkind21 = record[200].strip()
self.hiadhpcode22 = record[201].strip()
self.hiadhpkind22 = record[202].strip()
self.hiadhpcode23 = record[203].strip()
self.hiadhpkind23 = record[204].strip()
self.hiadhpcode24 = record[205].strip()
self.hiadhpkind24 = record[206].strip()
self.hiadhpcode25 = record[207].strip()
self.hiadhpkind25 = record[208].strip()
self.hiadhpcode26 = record[209].strip()
self.hiadhpkind26 = record[210].strip()
self.hiadhpcode27 = record[211].strip()
self.hiadhpkind27 = record[212].strip()
self.hiadhpcode28 = record[213].strip()
self.hiadhpkind28 = record[214].strip()
self.hiadhpcode29 = record[215].strip()
self.hiadhpkind29 = record[216].strip()
self.hiadhpcode30 = record[217].strip()
self.hiadhpkind30 = record[218].strip()
self.hiadhpcode31 = record[219].strip()
self.hiadhpkind31 = record[220].strip()
self.hiadhpcode32 = record[221].strip()
self.hiadhpkind32 = record[222].strip()
self.hiadhpcode33 = record[223].strip()
self.hiadhpkind33 = record[224].strip()
self.hiadhpcode34 = record[225].strip()
self.hiadhpkind34 = record[226].strip()
self.hiadhpcode35 = record[227].strip()
self.hiadhpkind35 = record[228].strip()
self.hiadhpcode36 = record[229].strip()
self.hiadhpkind36 = record[230].strip()
self.hiadhpcode37 = record[231].strip()
self.hiadhpkind37 = record[232].strip()
self.hiadhpcode38 = record[233].strip()
self.hiadhpkind38 = record[234].strip()
self.hiadhpcode39 = record[235].strip()
self.hiadhpkind39 = record[236].strip()
self.hiadhpcode40 = record[237].strip()
self.hiadhpkind40 = record[238].strip()
self.hitechhp_flag = record[239].strip()
self.hitechhpkind1 = record[240].strip()
self.hitechhpkind2 = record[241].strip()
self.hitechhpkind3 = record[242].strip()
self.hitechhpkind4 = record[243].strip()
self.hitechhpkind5 = record[244].strip()
self.hitechhpkind6 = record[245].strip()
self.hitechhpkind7 = record[246].strip()
self.hitechhpkind8 = record[247].strip()
self.hitechhpkind9 = record[248].strip()
self.hitechhpkind10 = record[249].strip()
self.hitechhpkind11 = record[250].strip()
self.hitechhpkind12 = record[251].strip()
self.hitechhpkind13 = record[252].strip()
self.hitechhpkind14 = record[253].strip()
self.hitechhpkind15 = record[254].strip()
self.hitechhpkind16 = record[255].strip()
self.hitechhpkind17 = record[256].strip()
self.hitechhpkind18 = record[257].strip()
self.hitechhpkind19 = record[258].strip()
self.hitechhpkind20 = record[259].strip()
self.policy_medical_flag = record[260].strip()
self.policymedical_code01 = record[261].strip()
self.policymedical_content01 = record[262].strip()
self.policymedical_code02 = record[263].strip()
self.policymedical_content02 = record[264].strip()
self.policymedical_code03 = record[265].strip()
self.policymedical_content03 = record[266].strip()
self.policymedical_code04 = record[267].strip()
self.policymedical_content04 = record[268].strip()
self.policymedical_code05 = record[269].strip()
self.policymedical_content05 = record[270].strip()
self.policymedical_code06 = record[271].strip()
self.policymedical_content06 = record[272].strip()
self.policymedical_code07 = record[273].strip()
self.policymedical_content07 = record[274].strip()
self.policymedical_code08 = record[275].strip()
self.policymedical_content08 = record[276].strip()
self.policymedical_code09 = record[277].strip()
self.policymedical_content09 = record[278].strip()
self.policymedical_code10 = record[279].strip()
self.policymedical_content10 = record[280].strip()
self.policymedical_code11 = record[281].strip()
self.policymedical_content11 = record[282].strip()
self.policymedical_code12 = record[283].strip()
self.policymedical_content12 = record[284].strip()
self.policymedical_code13 = record[285].strip()
self.policymedical_content13 = record[286].strip()
self.policymedical_code14 = record[287].strip()
self.policymedical_content14 = record[288].strip()
self.policymedical_code15 = record[289].strip()
self.policymedical_content15 = record[290].strip()
self.policymedical_code16 = record[291].strip()
self.policymedical_content16 = record[292].strip()
self.policymedical_code17 = record[293].strip()
self.policymedical_content17 = record[294].strip()
self.policymedical_code18 = record[295].strip()
self.policymedical_content18 = record[296].strip()
self.policymedical_code19 = record[297].strip()
self.policymedical_content19 = record[298].strip()
self.policymedical_code20 = record[299].strip()
self.policymedical_content20 = record[300].strip()
self.visitcarest_flag = record[301].strip()
self.visitcarestation_id = record[302].strip()
self.visitcarestation_code = record[303].strip()
self.visitcarestation_yobi = record[304].strip()
self.open_date = record[305].strip()
# DCFDSF施設コード
self.dcfdsf_inst_code = self.dcfhp_id + self.dcfhp_code + self.dcfhp_yobi
# 療養型病床群
self.resthp_items = [
self.resthp_flag,
self.resthp_care_kind,
self.resthp_bed_num,
self.resthp_ok_date,
self.resthp_can_date,
self.resthp_care_nrs_kind,
self.resthp_care_bed_num,
self.resthp_care_ok_date,
self.resthp_care_can_date,
self.resthp_sbed_num
]
# 臨床研修指定病院リスト
self.cl_items = [
self.clolyhp_kind,
self.clolyhp_ok_date,
self.clolyhp_can_date,
self.clhp_kind,
self.clhp_ok_date,
self.clhp_can_date,
self.cldephp_kind,
self.cldephp_ok_date,
self.cldephp_can_date
]
# smallint型のカラム値は、空文字で渡ってきた場合はNULLに変換する
self.areasuphp_intrate = self.areasuphp_intrate if len(self.areasuphp_intrate) > 0 else None
self.resthp_bed_num = self.resthp_bed_num if len(self.resthp_bed_num) > 0 else None
self.resthp_care_bed_num = self.resthp_care_bed_num if len(self.resthp_care_bed_num) > 0 else None
self.resthp_sbed_num = self.resthp_sbed_num if len(self.resthp_sbed_num) > 0 else None
self.nrmhp_bed_total_num = self.nrmhp_bed_total_num if len(self.nrmhp_bed_total_num) > 0 else None
self.menthp_bed_num = self.menthp_bed_num if len(self.menthp_bed_num) > 0 else None
self.tubhp_bed_num = self.tubhp_bed_num if len(self.tubhp_bed_num) > 0 else None
self.infhp_bed_num = self.infhp_bed_num if len(self.infhp_bed_num) > 0 else None
self.hospice_bed_num = self.hospice_bed_num if len(self.hospice_bed_num) > 0 else None

View File

@ -0,0 +1,14 @@
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
class ComInstDiv(UltmarcTable):
"""レイアウト区分011: COM_施設区分"""
inst_div_cd: str # 施設区分コード
inst_div_name: str # 施設区分名称
maint_flag: str # 修正区分
def __init__(self, record: list[str]):
super().__init__(record)
self.inst_div_cd = record[1]
self.maint_flag = record[2]
self.inst_div_name = record[5]

View File

@ -0,0 +1,14 @@
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
class ComManage(UltmarcTable):
"""レイアウト区分007: COM_経営体"""
manage_cd: str # 経営体コード
manage_name: str # 経営体名
maint_flag: str # 修正区分
def __init__(self, record: list[str]):
super().__init__(record)
self.manage_cd = record[1]
self.maint_flag = record[2]
self.manage_name = record[5]

View File

@ -0,0 +1,24 @@
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
class ComMedAreaCity(UltmarcTable):
"""レイアウト区分124: COM_医療圏都道府県市町村対応表"""
prefc_cd: str # 県コード
med_sphe_cd: str # 医療圏コード
jis_prefc_cd: str # JIS都道府県コード
jis_city_cd: str # JIS市区町村コード
zen_prefcode: str # 移動元2次コード(都道府県)
zen_medareacode: str # 移動元2次コード(医療圏コード)
maintflag: str # 修正区分
addDelDiv: str # 追加削除区分
def __init__(self, record: list[str]):
super().__init__(record)
self.prefc_cd = record[1]
self.med_sphe_cd = record[2]
self.maintflag = record[3]
self.jis_prefc_cd = record[4]
self.jis_city_cd = record[5]
self.addDelDiv = record[6]
self.zen_prefcode = record[9].strip()
self.zen_medareacode = record[10].strip()

View File

@ -0,0 +1,14 @@
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
class ComMedFuncValuation(UltmarcTable):
"""レイアウト区分024: COM_医療機器評価"""
maint_flag: str # 修正区分
med_func_valuation_cd: str # 医療機器評価コード
med_func_valuation_name: str # 医療機器評価名称(漢字)
def __init__(self, record: list[str]):
super().__init__(record)
self.maint_flag = record[2]
self.med_func_valuation_cd = record[1]
self.med_func_valuation_name = record[5]

View File

@ -0,0 +1,48 @@
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
class ComMedPrefc(UltmarcTable):
"""レイアウト区分121: COM_医療圏都道府県"""
pref_code: str # 都道府県コード
rev_date: str # 医療圏メンテナンス年月日
post_date: str # 公示年月日
psy_bednum_tg: str # 精神_基準病床数 or 整備目標数
psy_bednum_gen: str # 精神_既存病床数病床数
psy_bednum_date: str # 精神_既存病床数年月日
psy_eqbed_num: str # 精神_過不足病床数(差引)
tb_bednum_tg: str # 結核_基準病床数 or 整備目標数
tb_bednum_gen: str # 結核_既存病床数病床数
tb_bednum_date: str # 結核_既存病床数年月日
tb_eqbed_num: str # 結核_過不足病床数(差引)
inf_bednum_tg: str # 感染症_基準病床数 or 整備目標数
inf_bednum_gen: str # 感染症_既存病床数病床数
inf_bednum_date: str # 感染症_既存病床数年月日
inf_eqbed_num: str # 感染症_過不足病床数(差引)
maintflag: str # 修正区分
def __init__(self, record: list[str]):
super().__init__(record)
self.pref_code = record[1]
self.maintflag = record[2]
self.rev_date = record[5]
self.post_date = record[6]
self.psy_bednum_tg = record[7].strip()
self.psy_bednum_gen = record[8].strip()
self.psy_bednum_date = record[9]
self.psy_eqbed_num = record[10]
self.tb_bednum_tg = record[11].strip()
self.tb_bednum_gen = record[12].strip()
self.tb_bednum_date = record[13]
self.tb_eqbed_num = record[14]
self.inf_bednum_tg = record[15].strip()
self.inf_bednum_gen = record[16].strip()
self.inf_bednum_date = record[17]
self.inf_eqbed_num = record[18]
# decimal型のカラム値は、空文字で渡ってきた場合はNULLに変換する
self.psy_bednum_tg = self.psy_bednum_tg if len(self.psy_bednum_tg) > 0 else None
self.psy_bednum_gen = self.psy_bednum_gen if len(self.psy_bednum_gen) > 0 else None
self.tb_bednum_tg = self.tb_bednum_tg if len(self.tb_bednum_tg) > 0 else None
self.tb_bednum_gen = self.tb_bednum_gen if len(self.tb_bednum_gen) > 0 else None
self.inf_bednum_tg = self.inf_bednum_tg if len(self.inf_bednum_tg) > 0 else None
self.inf_bednum_gen = self.inf_bednum_gen if len(self.inf_bednum_gen) > 0 else None

View File

@ -0,0 +1,14 @@
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
class ComNurseAssrt(UltmarcTable):
"""レイアウト区分023: COM_看護種別"""
nurse_assrt_cd: str # 看護種別コード
nurse_assrt_name: str # 看護種別名
maint_flag: str # 修正区分
def __init__(self, record: list[str]):
super().__init__(record)
self.nurse_assrt_cd = record[1]
self.nurse_assrt_name = record[5]
self.maint_flag = record[2]

View File

@ -0,0 +1,139 @@
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
class ComPharm(UltmarcTable):
"""レイアウト区分102: COM_薬局"""
dcfhp_id: str # DCF コード(ID)
dcfhp_code: str # DCF コード(コード)
dcfhp_yobi: str # DCF コード(予備)
maint_flag: str # 修正区分
maintdate: str # メンテナンス年月日
pass # 予備/転送年月日(未使用)
unconf_flg: str # 未確認フラグ
del_cd: str # 削除予定理由
duphp_id: str # 重複時相手先コード(レコードID)
duphp_cd: str # 重複時相手先コード(施設コード)
duphp_yobi: str # 重複時相手先コード(予備)
hp_name: str # 正式施設名(漢字)
hp_name_kana: str # 正式施設名(カナ)
hp_ryaku_name: str # 略式施設名(漢字)
hp_ryaku_name_kana: str # 略式施設名(カナ)
hp_addr_lost_code: str # 住所不明
prefc_cd: str # 住所コード(県コード)
city_cd: str # 住所コード(市区町村コード)
addrcode1: str # 住所コード(大字・通称コード)
addrcode2: str # 住所コード(字・丁目コード)
zip_code: str # 郵便番号
addr: str # 住所(漢字)
addr_kana: str # 住所(カナ)
addr_number: str # 住所表示番号
addrkanjcnt1: str # 住所文字カウント:漢字(県)
addrkanjcnt2: str # 住所文字カウント:漢字(市区町村)
addrkanjcnt3: str # 住所文字カウント:漢字(大字・通称)
addrkanjcnt4: str # 住所文字カウント:漢字(字・丁目)
addrkanacnt1: str # 住所文字カウント:カナ(県)
addrkanacnt2: str # 住所文字カウント:カナ(市区町村)
addrkanacnt3: str # 住所文字カウント:カナ(大字・通称)
addrkanacnt4: str # 住所文字カウント:カナ(字・丁目)
tel_nothing_flag: str # 電話番号なしフラグ
tel_number: str # 電話番号
mgtclass_code: str # 経営体
hpclass_code: str # 施設区分
president: str # 代表者(漢字)
president_Kana: str # 代表者(カナ)
open_flag: str # 開業予定(フラグ)
open_yearmonth: str # 開業予定(年月)
close_flg: str # 休院(休院フラグ)
close_yearmonth: str # 休院(開始年月)
pharmacist: str # 管理薬剤師名(漢字)
pharmacist_kana: str # 管理薬剤師名(カナ)
franchise_hq_id: str # チェーン店本部コード(レコードID)
franchise_hq_code: str # チェーン店本部コード(施設コード)
franchise_hq_yobi: str # チェーン店本部コード(予備)
dcfdsf_inst_cd: str # 施設コード
village_code: str # 町字コード
addr_count_kana: str # 住所カウントカナ
addr_count: str # 住所カウント
dup_opp_cd: str # 重複時相手先コード
franchise_hq_cd: str # チェーン店本部コード
def __init__(self, record: list[str]):
super().__init__(record)
self.dcfhp_id = record[1]
self.dcfhp_cd = record[2]
self.dcfhp_yobi = record[3]
self.maint_flag = record[4]
self.maintdate = record[5]
self.unconf_flg = record[7].strip()
self.del_cd = record[8].strip()
self.duphp_id = record[9].strip()
self.duphp_cd = record[10].strip()
self.duphp_yobi = record[11].strip()
self.hp_name = record[12].strip()
self.hp_name_kana = record[13].strip()
self.hp_ryaku_name = record[14].strip()
self.hp_ryaku_name_kana = record[15].strip()
self.hp_addr_lost_code = record[16].strip()
self.prefc_cd = record[17].strip()
self.city_cd = record[18].strip()
self.addrcode1 = record[19].strip()
self.addrcode2 = record[20].strip()
self.zip_code = record[21].strip()
self.addr = record[22]
self.addr_kana = record[23]
self.addr_number = record[24]
self.addrkanjcnt1 = record[25].strip()
self.addrkanjcnt2 = record[26].strip()
self.addrkanjcnt3 = record[27].strip()
self.addrkanjcnt4 = record[28].strip()
self.addrkanacnt1 = record[29].strip()
self.addrkanacnt2 = record[30].strip()
self.addrkanacnt3 = record[31].strip()
self.addrkanacnt4 = record[32].strip()
self.tel_nothing_flag = record[33].strip()
self.tel_number = record[34].strip()
self.mgtclass_code = record[35].strip()
self.hpclass_code = record[36].strip()
self.president = record[37].strip()
self.president_Kana = record[38].strip()
self.open_flag = record[39].strip()
self.open_yearmonth = record[40].strip()
self.close_flg = record[41].strip()
self.close_yearmonth = record[42].strip()
self.pharmacist = record[43]
self.pharmacist_kana = record[44]
self.franchise_hq_id = record[45]
self.franchise_hq_code = record[46]
self.franchise_hq_yobi = record[47]
# 住所カウント_漢字の埋め
self.addrkanacnt1 = self.addrkanacnt1.zfill(2)
self.addrkanacnt2 = self.addrkanacnt2.zfill(2)
self.addrkanacnt3 = self.addrkanacnt3.zfill(2)
self.addrkanacnt4 = self.addrkanacnt4.zfill(2)
# 住所カウント_カナの埋め
self.addrkanjcnt1 = self.addrkanjcnt1.zfill(2)
self.addrkanjcnt2 = self.addrkanjcnt2.zfill(2)
self.addrkanjcnt3 = self.addrkanjcnt3.zfill(2)
self.addrkanjcnt4 = self.addrkanjcnt4.zfill(2)
# 施設コード(2+3+4)
self.dcfdsf_inst_cd = ''.join([self.dcfhp_id, self.dcfhp_cd, self.dcfhp_yobi])
# 町字コード(18+19+20+21)
self.village_code = ''.join([self.prefc_cd, self.city_cd, self.addrcode1, self.addrcode2])
# 住所カウントカナ(30+31+32+33)
self.addr_count_kana = ''.join([self.addrkanacnt1, self.addrkanacnt2, self.addrkanacnt3, self.addrkanacnt4])
# 住所カウント(26+27+28+29)
self.addr_count = ''.join([self.addrkanjcnt1, self.addrkanjcnt2, self.addrkanjcnt3, self.addrkanjcnt4])
# 重複時相手先コード(10+11+12)
self.dup_opp_cd = ''.join([self.duphp_id, self.duphp_cd, self.duphp_yobi])
# チェーン店本部コード(46+47+48)
self.franchise_hq_cd = ''.join([self.franchise_hq_id, self.franchise_hq_code, self.franchise_hq_yobi])

View File

@ -0,0 +1,14 @@
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
class ComPolicyMed(UltmarcTable):
"""レイアウト区分028: COM_政策医療"""
policy_med_cd: str # 政策医療コード
field_name: str # 分野名称(漢字)
maint_flag: str # 修正区分
def __init__(self, record: list[str]):
super().__init__(record)
self.policy_med_cd = record[1]
self.field_name = record[5]
self.maint_flag = record[2]

View File

@ -0,0 +1,14 @@
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
class ComPost(UltmarcTable):
"""レイアウト区分005: COM_役職"""
post_cd: str # 役職コード
form_post_name: str # 正式役職名
maint_flag: str # 修正区分
def __init__(self, record: list[str]):
super().__init__(record)
self.post_cd = record[1]
self.maint_flag = record[2]
self.form_post_name = record[5]

View File

@ -0,0 +1,157 @@
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
class ComPrefcMedBase(UltmarcTable):
"""レイアウト区分132: COM_都道府県医療機能情報(基本)"""
dcfhp_id: str # DCFコードレコードID
dcfhp_code: str # DCFコード施設コード
dcfhp_yobi: str # DCFコード予備
maint_flag: str # 修正区分
adddel_div: str # 予備/追加削除区分
maint_date: str # メンテナンス年月日
trn_date: str # 予備/転送年月日
info_date: str # 情報年月日
home_page: str # 案内用ホームページアドレス
hppre_flg: str # 院内処方フラグ
expre_flg: str # 院外処方フラグ
trial_flg: str # 治験の実施フラグ
trial_cont_count: str # 治験の実施_契約件数
trial_whet_from: str # 治験の実施_期間自
trial_whet_to: str # 治験の実施_期間至
equipment_flg: str # 保有する施設設備フラグ
cos_disease_flg: str # 対応することができる疾患・治療の内容フラグ
cos_surgery: str # 対応することができる短期滞在手術フラグ
specialclinic_flg: str # 専門外来フラグ
establishment_flg: str # 地域医療連携体制_窓口設置フラグ
critical_flg: str # 地域医療連携体制_地域連携パスフラグ
cop_system: str # 入院診療計画策定時における院内の連携体制
sys_exists_flg: str # オーダリングシステム_有無フラグ
sys_inspection: str # オーダリングシステム_検査
sys_prescription: str # オーダリングシステム_処方
sys_reserv: str # オーダリングシステム_予約
icduse_flg: str # ICDコード利用フラグ
echart_flg: str # 電子カルテフラク
fulltime_flg: str # 専任従事者フラグ
fulltime_count: str # 専任従事者数
ge_patient_avg: str # 病床患者数平均(一般)
mt_patient_avg: str # 病床患者数平均(療養)
mc_patient_avg: str # 病床患者数平均(療養(医療)
ca_patient_avg: str # 病床患者数平均(療養(介護)
pys_patient_avg: str # 病床患者数平均(精神)
tub_patient_avg: str # 病床患者数平均(結核)
inf_patient_avg: str # 病床患者数平均(感染症)
patient_avg_sum: str # 病床患者数平均(全体)
patient_avg_from: str # 病床患者数平均_期間自病床種別
patient_avg_to: str # 病床患者数平均_期間至病床種別
cl_patient_avg: str # 患者数平均(外来)
cl_patient_avg_from: str # 病床患者数平均_期間自外来
cl_patient_avg_to: str # 病床患者数平均_期間至外来
hm_patient_avg: str # 患者数平均(在宅)
hm_patient_avg_from: str # 病床患者数平均_期間自在宅
hm_patient_avg_to: str # 病床患者数平均_期間至在宅
ge_patient_ex: str # 患者数延数(一般)
mt_patient_ex: str # 患者数延数(療養)
mc_patient_ex: str # 病床患者数平均(療養(医療)
ca_patient_ex: str # 病床患者数平均(療養(介護)
pys_patient_ex: str # 患者数延数(精神)
tub_patient_ex: str # 患者数延数(結核)
inf_patient_ex: str # 患者数延数(感染症)
patient_ex_sum: str # 患者数延数(全体)
patient_ex_from: str # 患者数延数_期間自病床種別
patient_ex_to: str # 患者数延数_期間至病床種別
cl_patient_ex: str # 患者数延数(外来)
cl_patient_ex_from: str # 患者数延数_期間自外来
cl_patient_ex_to: str # 患者数延数_期間至外来
hm_patient_ex: str # 患者数延数(在宅)
hm_patient_ex_from: str # 患者数延数_期間自在宅
hm_patient_ex_to: str # 患者数延数_期間至在宅
ge_stay_avg: str # 平均在院日数(一般)
mt_stay_avg: str # 平均在院日数(療養)
mc_stay_avg: str # 平均在院日数(療養(医療)
ca_stay_avg: str # 平均在院日数(療養(介護)
pys_stay_avg: str # 平均在院日数(精神)
tub_stay_avg: str # 平均在院日数(結核)
inf_stay_avg: str # 平均在院日数(感染症)
stay_avg_sum: str # 平均在院日数(全体)
stay_avg_from: str # 平均在院日数_期間自
stay_avg_to: str # 平均在院日数_期間至
dcfdsf_inst_code: str # DCFDSF施設コード
def __init__(self, record: list[str]):
super().__init__(record)
self.dcfhp_id = record[1].strip()
self.dcfhp_code = record[2].strip()
self.dcfhp_yobi = record[3].strip()
self.maint_flag = record[4].strip()
self.adddel_div = record[5].strip()
self.maint_date = record[6].strip()
self.trn_date = record[7].strip()
self.info_date = record[8].strip()
self.home_page = record[9].strip()
self.hppre_flg = record[10].strip()
self.expre_flg = record[11].strip()
self.trial_flg = record[12].strip()
self.trial_cont_count = record[13].strip()
self.trial_whet_from = record[14].strip()
self.trial_whet_to = record[15].strip()
self.equipment_flg = record[16].strip()
self.cos_disease_flg = record[17].strip()
self.cos_surgery = record[18].strip()
self.specialclinic_flg = record[19].strip()
self.establishment_flg = record[20].strip()
self.critical_flg = record[21].strip()
self.cop_system = record[22].strip()
self.sys_exists_flg = record[23].strip()
self.sys_inspection = record[24].strip()
self.sys_prescription = record[25].strip()
self.sys_reserv = record[26].strip()
self.icduse_flg = record[27].strip()
self.echart_flg = record[28].strip()
self.fulltime_flg = record[29].strip()
self.fulltime_count = record[30].strip()
self.ge_patient_avg = record[31].strip()
self.mt_patient_avg = record[32].strip()
self.mc_patient_avg = record[33].strip()
self.ca_patient_avg = record[34].strip()
self.pys_patient_avg = record[35].strip()
self.tub_patient_avg = record[36].strip()
self.inf_patient_avg = record[37].strip()
self.patient_avg_sum = record[38].strip()
self.patient_avg_from = record[39].strip()
self.patient_avg_to = record[40].strip()
self.cl_patient_avg = record[41].strip()
self.cl_patient_avg_from = record[42].strip()
self.cl_patient_avg_to = record[43].strip()
self.hm_patient_avg = record[44].strip()
self.hm_patient_avg_from = record[45].strip()
self.hm_patient_avg_to = record[46].strip()
self.ge_patient_ex = record[47].strip()
self.mt_patient_ex = record[48].strip()
self.mc_patient_ex = record[49].strip()
self.ca_patient_ex = record[50].strip()
self.pys_patient_ex = record[51].strip()
self.tub_patient_ex = record[52].strip()
self.inf_patient_ex = record[53].strip()
self.patient_ex_sum = record[54].strip()
self.patient_ex_from = record[55].strip()
self.patient_ex_to = record[56].strip()
self.cl_patient_ex = record[57].strip()
self.cl_patient_ex_from = record[58].strip()
self.cl_patient_ex_to = record[59].strip()
self.hm_patient_ex = record[60].strip()
self.hm_patient_ex_from = record[61].strip()
self.hm_patient_ex_to = record[62].strip()
self.ge_stay_avg = record[63].strip()
self.mt_stay_avg = record[64].strip()
self.mc_stay_avg = record[65].strip()
self.ca_stay_avg = record[66].strip()
self.pys_stay_avg = record[67].strip()
self.tub_stay_avg = record[68].strip()
self.inf_stay_avg = record[69].strip()
self.stay_avg_sum = record[70].strip()
self.stay_avg_from = record[71].strip()
self.stay_avg_to = record[72].strip()
# DCFDSF施設コード
self.dcfdsf_inst_code = ''.join([self.dcfhp_id, self.dcfhp_code, self.dcfhp_yobi])

View File

@ -0,0 +1,30 @@
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
class ComPrefcMedDisTreat(UltmarcTable):
"""レイアウト区分134: COM_都道府県医療機能情報(疾患治療)"""
dcfhp_id: str # DCFコードレコードID
dcfhp_code: str # DCFコード施設コード
dcfhp_yobi: str # DCFコード予備
treatment_code: str # 疾患治療コード
pre_num: str # 前年比
adddel_div: str # 追加削除区分
maint_flag: str # 修正区分
dcfdsf_inst_code: str # DCFDSF施設コード
def __init__(self, record: list[str]):
super().__init__(record)
self.dcfhp_id = record[1]
self.dcfhp_code = record[2]
self.dcfhp_yobi = record[3].strip()
self.maint_flag = record[4]
self.treatment_code = record[5].strip()
self.adddel_div = record[6]
self.pre_num = record[9]
# smallint型のカラム値は、空文字で渡ってきた場合はNULLに変換する
self.pre_num = self.pre_num if len(self.pre_num) > 0 else None
# DCFDSF施設コード
self.dcfdsf_inst_code = ''.join([self.dcfhp_id, self.dcfhp_code, self.dcfhp_yobi])

View File

@ -0,0 +1,30 @@
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
class ComPrefcMedEqupment(UltmarcTable):
"""レイアウト区分133: COM_都道府県医療機能情報(施設設備)"""
dcfhp_id: str # DCFコードレコードID
dcfhp_code: str # DCFコード施設コード
dcfhp_yobi: str # DCFコード予備
equipment_code: str # 施設設備コード
bed_num: str # 病床数
adddel_div: str # 追加削除区分
maint_flag: str # 修正区分
dcfdsf_inst_code: str # DCFDSF施設コード
def __init__(self, record: list[str]):
super().__init__(record)
self.dcfhp_id = record[1]
self.dcfhp_code = record[2]
self.dcfhp_yobi = record[3].strip()
self.maint_flag = record[4]
self.equipment_code = record[5].strip()
self.adddel_div = record[6]
self.bed_num = record[9]
# smallint型のカラム値は、空文字で渡ってきた場合はNULLに変換する
self.bed_num = self.bed_num if len(self.bed_num) > 0 else None
# DCFDSF施設コード
self.dcfdsf_inst_code = ''.join([self.dcfhp_id, self.dcfhp_code, self.dcfhp_yobi])

View File

@ -0,0 +1,25 @@
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
class ComPrefcMedSojournOpe(UltmarcTable):
"""レイアウト区分135: COM_都道府県医療機能情報(短期滞在手術)"""
dcfhp_id: str # DCFコードレコードID
dcfhp_code: str # DCFコード施設コード
dcfhp_yobi: str # DCFコード予備
cos_surgery_code: str # 短期滞在手術コード
adddel_div: str # 追加削除区分
maint_flag: str # 修正区分
dcfdsf_inst_code: str # DCFDSF施設コード
def __init__(self, record: list[str]):
super().__init__(record)
self.dcfhp_id = record[1].strip()
self.dcfhp_code = record[2].strip()
self.dcfhp_yobi = record[3].strip()
self.maint_flag = record[4].strip()
self.cos_surgery_code = record[5].strip()
self.adddel_div = record[6].strip()
# DCFDSF施設コード
self.dcfdsf_inst_code = ''.join([self.dcfhp_id, self.dcfhp_code, self.dcfhp_yobi])

View File

@ -0,0 +1,29 @@
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
class ComPrefcMedSpOutpat(UltmarcTable):
"""レイアウト区分136: COM_都道府県医療機能情報(専門外来)"""
dcfhp_id: str # DCFコードレコードID
dcfhp_code: str # DCFコード施設コード
dcfhp_yobi: str # DCFコード予備
specialclinic_name: str # 専門外来名
sort_key: str # ソートキー
sectsub_cd: str # 分類補助コード
adddel_div: str # 追加削除区分
maint_flag: str # 修正区分
dcfdsf_inst_code: str # DCFDSF施設コード
def __init__(self, record: list[str]):
super().__init__(record)
self.dcfhp_id = record[1].strip()
self.dcfhp_code = record[2].strip()
self.dcfhp_yobi = record[3].strip()
self.maint_flag = record[4].strip()
self.specialclinic_name = record[5].strip()
self.adddel_div = record[6].strip()
self.sort_key = record[9].strip()
self.sectsub_cd = record[10].strip()
# DCFDSF施設コード
self.dcfdsf_inst_code = ''.join([self.dcfhp_id, self.dcfhp_code, self.dcfhp_yobi])

Some files were not shown because too many files have changed in this diff Show More