Merge pull request #475 feature-NEWDWH2021-1858 into develop

This commit is contained in:
下田雅人 2025-05-26 09:57:40 +09:00
commit 9219b08872
497 changed files with 21979 additions and 87 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,24 @@
DB_HOST=************
DB_PORT=************
DB_USERNAME=************
DB_PASSWORD=************
DB_SCHEMA=src05
LOG_LEVEL=INFO
PROCESS_NAME=jskult-batch-ultmarc-io
JSKULT_CONFIG_BUCKET=**********************
JSKULT_CONFIG_CONVERT_FOLDER=jskult/convert
JSKULT_ULTMARC_HEX_CONVERT_CONFIG_FILE_NAME=ultmarc_hex_convert_config.json
ULTMARC_DATA_BUCKET=****************
ULTMARC_DATA_FOLDER=import
JSK_IO_BUCKET=*************
JSK_DATA_SEND_FOLDER=send
JSKULT_BACKUP_BUCKET=****************
JSK_BACKUP_FOLDER=jsk/send
DCF_DSF_SEND_FILE_NAME=ult_dcf_dsf.csv
IMPORT_FILE_KEY=****************
DB_CONNECTION_MAX_RETRY_ATTEMPT=4
DB_CONNECTION_RETRY_INTERVAL_INIT=5
DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS=5
DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS=50

10
ecs/jskult-batch-ultmarc-io/.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 ultmarc io",
"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.12-slim-bookworm
ENV TZ="Asia/Tokyo"
# pythonの標準出力をバッファリングしないフラグ
ENV PYTHONUNBUFFERED=1
# pythonのバイトコードを生成しないフラグ
ENV PYTHONDONTWRITEBYTECODE=1
WORKDIR /usr/src/app
COPY Pipfile Pipfile.lock ./
RUN \
apt update -y && \
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,27 @@
[[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/"
[packages]
boto3 = "*"
PyMySQL = "*"
sqlalchemy = "*"
tenacity = "*"
[dev-packages]
autopep8 = "*"
flake8 = "*"
pytest = "*"
pytest-cov = "*"
boto3 = "*"
[requires]
python_version = "3.12"
[pipenv]
allow_prereleases = true

443
ecs/jskult-batch-ultmarc-io/Pipfile.lock generated Normal file
View File

@ -0,0 +1,443 @@
{
"_meta": {
"hash": {
"sha256": "aa2d1d97600fea225b7d249dae0d065190d00fdadbf85b20773e0c1d9862f5c1"
},
"pipfile-spec": 6,
"requires": {
"python_version": "3.12"
},
"sources": [
{
"name": "pypi",
"url": "https://pypi.org/simple",
"verify_ssl": true
}
]
},
"default": {
"boto3": {
"hashes": [
"sha256:008f6a7c2f9f306984f9bd00c331d70341124aaa7dfebcb0466ecbda6619884a",
"sha256:760c85ab6dd78f12aa669269ca917d313fe02378722dc3b8ab41a8dc13b2a999"
],
"index": "pypi",
"markers": "python_version >= '3.9'",
"version": "==1.38.22"
},
"botocore": {
"hashes": [
"sha256:0e524cc763eced7c87ab256338ebd247ce10d1eb11d5cc4f71a3bd82611739e8",
"sha256:3b464984674f97367ca1dfa29bdbce499327571208aaec2f9743f66e54d9ba05"
],
"markers": "python_version >= '3.9'",
"version": "==1.38.22"
},
"greenlet": {
"hashes": [
"sha256:00cd814b8959b95a546e47e8d589610534cfb71f19802ea8a2ad99d95d702057",
"sha256:02a98600899ca1ca5d3a2590974c9e3ec259503b2d6ba6527605fcd74e08e207",
"sha256:02f5972ff02c9cf615357c17ab713737cccfd0eaf69b951084a9fd43f39833d3",
"sha256:055916fafad3e3388d27dd68517478933a97edc2fc54ae79d3bec827de2c64c4",
"sha256:0a16fb934fcabfdfacf21d79e6fed81809d8cd97bc1be9d9c89f0e4567143d7b",
"sha256:1592a615b598643dbfd566bac8467f06c8c8ab6e56f069e573832ed1d5d528cc",
"sha256:1919cbdc1c53ef739c94cf2985056bcc0838c1f217b57647cbf4578576c63825",
"sha256:1e4747712c4365ef6765708f948acc9c10350719ca0545e362c24ab973017370",
"sha256:1e76106b6fc55fa3d6fe1c527f95ee65e324a13b62e243f77b48317346559708",
"sha256:1f72667cc341c95184f1c68f957cb2d4fc31eef81646e8e59358a10ce6689457",
"sha256:2593283bf81ca37d27d110956b79e8723f9aa50c4bcdc29d3c0543d4743d2763",
"sha256:2dc5c43bb65ec3669452af0ab10729e8fdc17f87a1f2ad7ec65d4aaaefabf6bf",
"sha256:3091bc45e6b0c73f225374fefa1536cd91b1e987377b12ef5b19129b07d93ebe",
"sha256:354f67445f5bed6604e493a06a9a49ad65675d3d03477d38a4db4a427e9aad0e",
"sha256:3885f85b61798f4192d544aac7b25a04ece5fe2704670b4ab73c2d2c14ab740d",
"sha256:3ab7194ee290302ca15449f601036007873028712e92ca15fc76597a0aeb4c59",
"sha256:3aeca9848d08ce5eb653cf16e15bb25beeab36e53eb71cc32569f5f3afb2a3aa",
"sha256:44671c29da26539a5f142257eaba5110f71887c24d40df3ac87f1117df589e0e",
"sha256:45f9f4853fb4cc46783085261c9ec4706628f3b57de3e68bae03e8f8b3c0de51",
"sha256:4bd139e4943547ce3a56ef4b8b1b9479f9e40bb47e72cc906f0f66b9d0d5cab3",
"sha256:4fefc7aa68b34b9224490dfda2e70ccf2131368493add64b4ef2d372955c207e",
"sha256:6629311595e3fe7304039c67f00d145cd1d38cf723bb5b99cc987b23c1433d61",
"sha256:6fadd183186db360b61cb34e81117a096bff91c072929cd1b529eb20dd46e6c5",
"sha256:71566302219b17ca354eb274dfd29b8da3c268e41b646f330e324e3967546a74",
"sha256:7409796591d879425997a518138889d8d17e63ada7c99edc0d7a1c22007d4907",
"sha256:752f0e79785e11180ebd2e726c8a88109ded3e2301d40abced2543aa5d164275",
"sha256:7791dcb496ec53d60c7f1c78eaa156c21f402dda38542a00afc3e20cae0f480f",
"sha256:782743700ab75716650b5238a4759f840bb2dcf7bff56917e9ffdf9f1f23ec59",
"sha256:7c9896249fbef2c615853b890ee854f22c671560226c9221cfd27c995db97e5c",
"sha256:85f3e248507125bf4af607a26fd6cb8578776197bd4b66e35229cdf5acf1dfbf",
"sha256:89c69e9a10670eb7a66b8cef6354c24671ba241f46152dd3eed447f79c29fb5b",
"sha256:8cb8553ee954536500d88a1a2f58fcb867e45125e600e80f586ade399b3f8819",
"sha256:9ae572c996ae4b5e122331e12bbb971ea49c08cc7c232d1bd43150800a2d6c65",
"sha256:9c7b15fb9b88d9ee07e076f5a683027bc3befd5bb5d25954bb633c385d8b737e",
"sha256:9ea5231428af34226c05f927e16fc7f6fa5e39e3ad3cd24ffa48ba53a47f4240",
"sha256:a31ead8411a027c2c4759113cf2bd473690517494f3d6e4bf67064589afcd3c5",
"sha256:a8fa80665b1a29faf76800173ff5325095f3e66a78e62999929809907aca5659",
"sha256:ad053d34421a2debba45aa3cc39acf454acbcd025b3fc1a9f8a0dee237abd485",
"sha256:b24c7844c0a0afc3ccbeb0b807adeefb7eff2b5599229ecedddcfeb0ef333bec",
"sha256:b50a8c5c162469c3209e5ec92ee4f95c8231b11db6a04db09bbe338176723bb8",
"sha256:ba30e88607fb6990544d84caf3c706c4b48f629e18853fc6a646f82db9629418",
"sha256:bf3fc9145141250907730886b031681dfcc0de1c158f3cc51c092223c0f381ce",
"sha256:c23ea227847c9dbe0b3910f5c0dd95658b607137614eb821e6cbaecd60d81cc6",
"sha256:c3cc1a3ed00ecfea8932477f729a9f616ad7347a5e55d50929efa50a86cb7be7",
"sha256:c49e9f7c6f625507ed83a7485366b46cbe325717c60837f7244fc99ba16ba9d6",
"sha256:d0cb7d47199001de7658c213419358aa8937df767936506db0db7ce1a71f4a2f",
"sha256:d8009ae46259e31bc73dc183e402f548e980c96f33a6ef58cc2e7865db012e13",
"sha256:da956d534a6d1b9841f95ad0f18ace637668f680b1339ca4dcfb2c1837880a0b",
"sha256:dcb9cebbf3f62cb1e5afacae90761ccce0effb3adaa32339a0670fe7805d8068",
"sha256:decb0658ec19e5c1f519faa9a160c0fc85a41a7e6654b3ce1b44b939f8bf1325",
"sha256:df4d1509efd4977e6a844ac96d8be0b9e5aa5d5c77aa27ca9f4d3f92d3fcf330",
"sha256:eeb27bece45c0c2a5842ac4c5a1b5c2ceaefe5711078eed4e8043159fa05c834",
"sha256:efcdfb9df109e8a3b475c016f60438fcd4be68cd13a365d42b35914cdab4bb2b",
"sha256:fd9fb7c941280e2c837b603850efc93c999ae58aae2b40765ed682a6907ebbc5",
"sha256:fe46d4f8e94e637634d54477b0cfabcf93c53f29eedcbdeecaf2af32029b4421"
],
"markers": "python_version < '3.14' and (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.2.2"
},
"jmespath": {
"hashes": [
"sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980",
"sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"
],
"markers": "python_version >= '3.7'",
"version": "==1.0.1"
},
"pymysql": {
"hashes": [
"sha256:4de15da4c61dc132f4fb9ab763063e693d521a80fd0e87943b9a453dd4c19d6c",
"sha256:e127611aaf2b417403c60bf4dc570124aeb4a57f5f37b8e95ae399a42f904cd0"
],
"index": "pypi",
"markers": "python_version >= '3.7'",
"version": "==1.1.1"
},
"python-dateutil": {
"hashes": [
"sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3",
"sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
"version": "==2.9.0.post0"
},
"s3transfer": {
"hashes": [
"sha256:0148ef34d6dd964d0d8cf4311b2b21c474693e57c2e069ec708ce043d2b527be",
"sha256:f5e6db74eb7776a37208001113ea7aa97695368242b364d73e91c981ac522177"
],
"markers": "python_version >= '3.9'",
"version": "==0.13.0"
},
"six": {
"hashes": [
"sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274",
"sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
"version": "==1.17.0"
},
"sqlalchemy": {
"hashes": [
"sha256:023b3ee6169969beea3bb72312e44d8b7c27c75b347942d943cf49397b7edeb5",
"sha256:03968a349db483936c249f4d9cd14ff2c296adfa1290b660ba6516f973139582",
"sha256:05132c906066142103b83d9c250b60508af556982a385d96c4eaa9fb9720ac2b",
"sha256:087b6b52de812741c27231b5a3586384d60c353fbd0e2f81405a814b5591dc8b",
"sha256:0b3dbf1e7e9bc95f4bac5e2fb6d3fb2f083254c3fdd20a1789af965caf2d2348",
"sha256:118c16cd3f1b00c76d69343e38602006c9cfb9998fa4f798606d28d63f23beda",
"sha256:1936af879e3db023601196a1684d28e12f19ccf93af01bf3280a3262c4b6b4e5",
"sha256:1e3f196a0c59b0cae9a0cd332eb1a4bda4696e863f4f1cf84ab0347992c548c2",
"sha256:23a8825495d8b195c4aa9ff1c430c28f2c821e8c5e2d98089228af887e5d7e29",
"sha256:293cd444d82b18da48c9f71cd7005844dbbd06ca19be1ccf6779154439eec0b8",
"sha256:32f9dc8c44acdee06c8fc6440db9eae8b4af8b01e4b1aee7bdd7241c22edff4f",
"sha256:34ea30ab3ec98355235972dadc497bb659cc75f8292b760394824fab9cf39826",
"sha256:3d3549fc3e40667ec7199033a4e40a2f669898a00a7b18a931d3efb4c7900504",
"sha256:41836fe661cc98abfae476e14ba1906220f92c4e528771a8a3ae6a151242d2ae",
"sha256:4d44522480e0bf34c3d63167b8cfa7289c1c54264c2950cc5fc26e7850967e45",
"sha256:4eeb195cdedaf17aab6b247894ff2734dcead6c08f748e617bfe05bd5a218443",
"sha256:4f67766965996e63bb46cfbf2ce5355fc32d9dd3b8ad7e536a920ff9ee422e23",
"sha256:57df5dc6fdb5ed1a88a1ed2195fd31927e705cad62dedd86b46972752a80f576",
"sha256:598d9ebc1e796431bbd068e41e4de4dc34312b7aa3292571bb3674a0cb415dd1",
"sha256:5b14e97886199c1f52c14629c11d90c11fbb09e9334fa7bb5f6d068d9ced0ce0",
"sha256:5e22575d169529ac3e0a120cf050ec9daa94b6a9597993d1702884f6954a7d71",
"sha256:60c578c45c949f909a4026b7807044e7e564adf793537fc762b2489d522f3d11",
"sha256:6145afea51ff0af7f2564a05fa95eb46f542919e6523729663a5d285ecb3cf5e",
"sha256:6375cd674fe82d7aa9816d1cb96ec592bac1726c11e0cafbf40eeee9a4516b5f",
"sha256:6854175807af57bdb6425e47adbce7d20a4d79bbfd6f6d6519cd10bb7109a7f8",
"sha256:6ab60a5089a8f02009f127806f777fca82581c49e127f08413a66056bd9166dd",
"sha256:725875a63abf7c399d4548e686debb65cdc2549e1825437096a0af1f7e374814",
"sha256:7492967c3386df69f80cf67efd665c0f667cee67032090fe01d7d74b0e19bb08",
"sha256:81965cc20848ab06583506ef54e37cf15c83c7e619df2ad16807c03100745dea",
"sha256:81c24e0c0fde47a9723c81d5806569cddef103aebbf79dbc9fcbb617153dea30",
"sha256:81eedafa609917040d39aa9332e25881a8e7a0862495fcdf2023a9667209deda",
"sha256:81f413674d85cfd0dfcd6512e10e0f33c19c21860342a4890c3a2b59479929f9",
"sha256:8280856dd7c6a68ab3a164b4a4b1c51f7691f6d04af4d4ca23d6ecf2261b7923",
"sha256:82ca366a844eb551daff9d2e6e7a9e5e76d2612c8564f58db6c19a726869c1df",
"sha256:8b4af17bda11e907c51d10686eda89049f9ce5669b08fbe71a29747f1e876036",
"sha256:90144d3b0c8b139408da50196c5cad2a6909b51b23df1f0538411cd23ffa45d3",
"sha256:906e6b0d7d452e9a98e5ab8507c0da791856b2380fdee61b765632bb8698026f",
"sha256:90c11ceb9a1f482c752a71f203a81858625d8df5746d787a4786bca4ffdf71c6",
"sha256:911cc493ebd60de5f285bcae0491a60b4f2a9f0f5c270edd1c4dbaef7a38fc04",
"sha256:9a420a91913092d1e20c86a2f5f1fc85c1a8924dbcaf5e0586df8aceb09c9cc2",
"sha256:9f8c9fdd15a55d9465e590a402f42082705d66b05afc3ffd2d2eb3c6ba919560",
"sha256:a104c5694dfd2d864a6f91b0956eb5d5883234119cb40010115fd45a16da5e70",
"sha256:a373a400f3e9bac95ba2a06372c4fd1412a7cee53c37fc6c05f829bf672b8769",
"sha256:a62448526dd9ed3e3beedc93df9bb6b55a436ed1474db31a2af13b313a70a7e1",
"sha256:a8808d5cf866c781150d36a3c8eb3adccfa41a8105d031bf27e92c251e3969d6",
"sha256:b1f09b6821406ea1f94053f346f28f8215e293344209129a9c0fcc3578598d7b",
"sha256:b2ac41acfc8d965fb0c464eb8f44995770239668956dc4cdf502d1b1ffe0d747",
"sha256:b46fa6eae1cd1c20e6e6f44e19984d438b6b2d8616d21d783d150df714f44078",
"sha256:b50eab9994d64f4a823ff99a0ed28a6903224ddbe7fef56a6dd865eec9243440",
"sha256:bfc9064f6658a3d1cadeaa0ba07570b83ce6801a1314985bf98ec9b95d74e15f",
"sha256:c0b0e5e1b5d9f3586601048dd68f392dc0cc99a59bb5faf18aab057ce00d00b2",
"sha256:c153265408d18de4cc5ded1941dcd8315894572cddd3c58df5d5b5705b3fa28d",
"sha256:d4ae769b9c1c7757e4ccce94b0641bc203bbdf43ba7a2413ab2523d8d047d8dc",
"sha256:dc56c9788617b8964ad02e8fcfeed4001c1f8ba91a9e1f31483c0dffb207002a",
"sha256:dd5ec3aa6ae6e4d5b5de9357d2133c07be1aff6405b136dad753a16afb6717dd",
"sha256:edba70118c4be3c2b1f90754d308d0b79c6fe2c0fdc52d8ddf603916f83f4db9",
"sha256:ff8e80c4c4932c10493ff97028decfdb622de69cae87e0f127a7ebe32b4069c6"
],
"index": "pypi",
"markers": "python_version >= '3.7'",
"version": "==2.0.41"
},
"tenacity": {
"hashes": [
"sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb",
"sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138"
],
"index": "pypi",
"markers": "python_version >= '3.9'",
"version": "==9.1.2"
},
"typing-extensions": {
"hashes": [
"sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c",
"sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef"
],
"markers": "python_version >= '3.8'",
"version": "==4.13.2"
},
"urllib3": {
"hashes": [
"sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466",
"sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813"
],
"markers": "python_version >= '3.10'",
"version": "==2.4.0"
}
},
"develop": {
"autopep8": {
"hashes": [
"sha256:89440a4f969197b69a995e4ce0661b031f455a9f776d2c5ba3dbd83466931758",
"sha256:ce8ad498672c845a0c3de2629c15b635ec2b05ef8177a6e7c91c74f3e9b51128"
],
"index": "pypi",
"markers": "python_version >= '3.9'",
"version": "==2.3.2"
},
"boto3": {
"hashes": [
"sha256:008f6a7c2f9f306984f9bd00c331d70341124aaa7dfebcb0466ecbda6619884a",
"sha256:760c85ab6dd78f12aa669269ca917d313fe02378722dc3b8ab41a8dc13b2a999"
],
"index": "pypi",
"markers": "python_version >= '3.9'",
"version": "==1.38.22"
},
"botocore": {
"hashes": [
"sha256:0e524cc763eced7c87ab256338ebd247ce10d1eb11d5cc4f71a3bd82611739e8",
"sha256:3b464984674f97367ca1dfa29bdbce499327571208aaec2f9743f66e54d9ba05"
],
"markers": "python_version >= '3.9'",
"version": "==1.38.22"
},
"coverage": {
"extras": [
"toml"
],
"hashes": [
"sha256:0034ceec8e91fdaf77350901cc48f47efd00f23c220a3f9fc1187774ddf307cb",
"sha256:061a3bf679dc38fe34d3822f10a9977d548de86b440010beb1e3b44ba93d20f7",
"sha256:07fff2f2ce465fae27447432d39ce733476fbf8478de51fb4034c201e0c5da6d",
"sha256:11e5ea0acd8cc5d23030c34dfb2eb6638ad886328df18cc69f8eefab73d1ece5",
"sha256:12950b6373dc9dfe1ce22a8506ec29c82bfc5b38146ced0a222f38cf5d99a56d",
"sha256:173e16969f990688aae4b4487717c44330bc57fd8b61a6216ce8eeb827eb5c0d",
"sha256:1cc6bebc15c3b275174c66cf4e1c949a94c5c2a3edaa2f193a1225548c52c771",
"sha256:21645788c5c2afa3df2d4b607638d86207b84cb495503b71e80e16b4c6b44e80",
"sha256:2d8f844e837374a9497e11722d9eb9dfeb33b1b5d31136786c39a4c1a3073c6d",
"sha256:35dd5d405a1d378c39f3f30f628a25b0b99f1b8e5bdd78275df2e7b0404892d7",
"sha256:3763b9a4bc128f72da5dcfd7fcc7c7d6644ed28e8f2db473ce1ef0dd37a43fa9",
"sha256:3bd8e3753257e95e94f38c058627aba1581d51f674e3badf226283b2bdb8f8ca",
"sha256:41d142eefbc0bb3be160a77b2c0fbec76f345387676265052e224eb6c67b7af3",
"sha256:452f3831c64f5f50260e18a89e613594590d6ceac5206a9b7d76ba43586b01b3",
"sha256:4fc4f7cff2495d6d112353c33a439230a6de0b7cd0c2578f1e8d75326f63d783",
"sha256:62a13b372b65fa6e11685df9ca924bed23bab1d0f277f9b67be7536f253aaf17",
"sha256:6ce2606a171f9cf7c15a77ca61f979ffc0e0d92cd2fb18767cead58c1d19f58e",
"sha256:6f24a1e2c373a77afae21bc512466a91e31251685c271c5309ee3e557f6e3e03",
"sha256:76a4e1d62505a21971968be61ae17cbdc5e0c483265a37f7ddbbc050f9c0b8ec",
"sha256:82db9344a07dd9106796b9fe8805425633146a7ea7fed5ed07c65a64d0bb79e1",
"sha256:87284f272746e31919302ab6211b16b41135109822c498f6e7b40a2f828e7836",
"sha256:87b86a87f8de2e1bd0bcd45faf1b1edf54f988c8857157300e0336efcfb8ede6",
"sha256:8bcfafb2809cd01be8ffe5f962e01b0fbe4cc1d74513434c52ff2dd05b86d492",
"sha256:9296df6a33b8539cd753765eb5b47308602263a14b124a099cbcf5f770d7cf90",
"sha256:958b513e23286178b513a6b4d975fe9e7cddbcea6e5ebe8d836e4ef067577154",
"sha256:9772c9e266b2ca4999180c12b90c8efb4c5c9ad3e55f301d78bc579af6467ad9",
"sha256:9b31756ea647b6ef53190f6b708ad0c4c2ea879bc17799ba5b0699eee59ecf7b",
"sha256:9cd54a762667c32112df5d6f059c5d61fa532ee06460948cc5bcbf60c502f5c9",
"sha256:9dabc70012fd7b58a8040a7bc1b5f71fd0e62e2138aefdd8367d3d24bf82c349",
"sha256:adafe9d71a940927dd3ad8d487f521f11277f133568b7da622666ebd08923191",
"sha256:ae5e557aa92565d72f6d3196e878e7cbd6a6380e02a15eafe0af781bd767c10d",
"sha256:af6b8cdf0857fd4e6460dd6639c37c3f82163127f6112c1942b5e6a52a477676",
"sha256:b37729ba34c116a3b2b6fb99df5c37a4ca40e96f430070488fd7a1077ad44907",
"sha256:b6424c716f4c38ff8f62b602e6b94cde478dadda542a1cb3fe2fe2520cc2aae3",
"sha256:b8f105631835fdf191c971c4da93d27e732e028d73ecaa1a88f458d497d026cf",
"sha256:be2b1a455b3ecfee20638289bb091a95216887d44924a41c28a601efac0916e8",
"sha256:c04a7903644ccea8fa07c3e76db43ca31c8d453f93c5c94c0f9b82efca225543",
"sha256:c0d6290a466a6f3fadf6add2dd4ec11deba4e1a6e3db2dd284edd497aadf802f",
"sha256:c5757a7b25fe48040fa120ba6597f5f885b01e323e0d13fe21ff95a70c0f76b7",
"sha256:ccad4e29ac1b6f75bfeedb2cac4860fe5bd9e0a2f04c3e3218f661fa389ab101",
"sha256:cd21de85aa0e247b79c6c41f8b5541b54285550f2da6a9448d82b53234d3611b",
"sha256:ce4553a573edb363d5db12be1c044826878bec039159d6d4eafe826ef773396d",
"sha256:d074380f587360d2500f3b065232c67ae248aaf739267807adbcd29b88bdf864",
"sha256:d41d4da5f2871b1782c6b74948d2d37aac3a5b39b43a6ba31d736b97a02ae1f1",
"sha256:d5102e17b81158de17d4b5bc363fcffd15231a38ef3f50b8e6fa01f0c6911194",
"sha256:d52d79dfd3b410b153b6d65b0e3afe834eca2b969377f55ad73c67156d35af0d",
"sha256:d591f2ddad432b794f77dc1e94334a80015a3fc7fa07fd6aed8f40362083be5b",
"sha256:d616b5a543c7d4deffa25eb8d8ae3d0d95097f08ac8b131600bb7fbf967ea0e2",
"sha256:d7af3990490982fbd2437156c69edbe82b7edf99bc60302cceeeaf79afb886b8",
"sha256:d8a6c35afd5b912101fabf42975d92d750cfce33c571508a82ff334a133c40d5",
"sha256:db181a1896e0bad75b3bf4916c49fd3cf6751f9cc203fe0e0ecbee1fc43590fa",
"sha256:dd5c305faa2e69334a53061b3168987847dadc2449bab95735242a9bde92fde8",
"sha256:e1f8e96455907496b3e4ea16f63bb578da31e17d2805278b193525e7714f17f2",
"sha256:e233a56bbf99e4cb134c4f8e63b16c77714e3987daf2c5aa10c3ba8c4232d730",
"sha256:e3f65da9701648d226b6b24ded3e2528b72075e48d7540968cd857c3bd4c5321",
"sha256:e4e893c7f7fb12271a667d5c1876710fae06d7580343afdb5f3fc4488b73209e",
"sha256:e54b80885b0e61d346accc5709daf8762471a452345521cc9281604a907162c2",
"sha256:e93f36a5c9d995f40e9c4cd9bbabd83fd78705792fa250980256c93accd07bb6",
"sha256:ebdf212e1ed85af63fa1a76d556c0a3c7b34348ffba6e145a64b15f003ad0a2b",
"sha256:f7a95b0dce364535a63fde0ec1b1ca36400037175d3b62ce04d85dbca5e33832",
"sha256:f82c1a1c1897d2293cb6c50f20fe8a9ea2add1a228eff479380917a1fe7bbb68",
"sha256:fe4877c24711458f7990392181be30166cc3ae72158036ecb48a73c30c99fb6f",
"sha256:ff619c58322d9d6df0a859dc76c3532d7bdbc125cb040f7cd642141446b4f654"
],
"markers": "python_version >= '3.9'",
"version": "==7.8.1"
},
"flake8": {
"hashes": [
"sha256:93b92ba5bdb60754a6da14fa3b93a9361fd00a59632ada61fd7b130436c40343",
"sha256:fa558ae3f6f7dbf2b4f22663e5343b6b6023620461f8d4ff2019ef4b5ee70426"
],
"index": "pypi",
"markers": "python_version >= '3.9'",
"version": "==7.2.0"
},
"iniconfig": {
"hashes": [
"sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7",
"sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"
],
"markers": "python_version >= '3.8'",
"version": "==2.1.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:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484",
"sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"
],
"markers": "python_version >= '3.8'",
"version": "==25.0"
},
"pluggy": {
"hashes": [
"sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3",
"sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"
],
"markers": "python_version >= '3.9'",
"version": "==1.6.0"
},
"pycodestyle": {
"hashes": [
"sha256:35863c5974a271c7a726ed228a14a4f6daf49df369d8c50cd9a6f58a5e143ba9",
"sha256:c8415bf09abe81d9c7f872502a6eee881fbe85d8763dd5b9924bb0a01d67efae"
],
"markers": "python_version >= '3.9'",
"version": "==2.13.0"
},
"pyflakes": {
"hashes": [
"sha256:5039c8339cbb1944045f4ee5466908906180f13cc99cc9949348d10f82a5c32a",
"sha256:6dfd61d87b97fba5dcfaaf781171ac16be16453be6d816147989e7f6e6a9576b"
],
"markers": "python_version >= '3.9'",
"version": "==3.3.2"
},
"pytest": {
"hashes": [
"sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820",
"sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845"
],
"index": "pypi",
"markers": "python_version >= '3.8'",
"version": "==8.3.5"
},
"pytest-cov": {
"hashes": [
"sha256:46935f7aaefba760e716c2ebfbe1c216240b9592966e7da99ea8292d4d3e2a0a",
"sha256:bddf29ed2d0ab6f4df17b4c55b0a657287db8684af9c42ea546b21b1041b3dde"
],
"index": "pypi",
"markers": "python_version >= '3.9'",
"version": "==6.1.1"
},
"python-dateutil": {
"hashes": [
"sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3",
"sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
"version": "==2.9.0.post0"
},
"s3transfer": {
"hashes": [
"sha256:0148ef34d6dd964d0d8cf4311b2b21c474693e57c2e069ec708ce043d2b527be",
"sha256:f5e6db74eb7776a37208001113ea7aa97695368242b364d73e91c981ac522177"
],
"markers": "python_version >= '3.9'",
"version": "==0.13.0"
},
"six": {
"hashes": [
"sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274",
"sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
"version": "==1.17.0"
},
"urllib3": {
"hashes": [
"sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466",
"sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813"
],
"markers": "python_version >= '3.10'",
"version": "==2.4.0"
}
}
}

View File

@ -0,0 +1,215 @@
# 実消化&アルトマーク アルトマーク取込/データ出力処理
## 概要
実消化&アルトマークのアルトマーク取込/データ出力処理
## 環境情報
- Python 3.12
- 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に指定したカラムは、呼び出し元のテストコード内で個別に突き合わせする
## フォルダ構成
```text
.
├── Pipfile -- Pythonモジュールの依存関係を管理するファイル
├── Dockerfile -- Dockerイメージを作成するためのファイル
├── Pipfile -- Pythonモジュールの依存関係を管理するファイル
├── Pipfile.lock -- Pythonモジュールの依存関係バージョン固定用ファイル
├── README.md -- 当ファイル
├── entrypoint.py -- バッチ処理のエントリーポイントになるpythonファイル
├── src -- ソースコードの保管場所
│ ├── aws -- AWS関連処理
│ │ └── s3.py -- S3クライアントとバケット処理
│ ├── batch -- バッチ処理関連ソース置き場
│ │ └── ultmarc -- アルトマーク関連処理
│ │ ├── import_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 -- カスタム例外
│ ├── main.py -- アルトマーク取込処理のエントリーポイント。「entrypoint.py」 から呼ばれる。
│ ├── logging
│ │ └── get_logger.py -- ログ出力の共通処理
│ ├── system_var
│ │ ├── constants.py -- 定数
│ │ └── environment.py -- 環境変数
└── tests -- ユニットテストのルートディレクト
├── batch
│ └── ultmarc -- アルトマーク関連のユニットテストを格納する
│ │ └── utmp_tables
│ │ └── table_mapper -- 以下、マッパークラス単位でフォルダを切る
│ │ └── com_alma
│ │ ├── test_com_alma_mapper.py -- テストコード本体
│ │ ├── com_alma_insert.csv -- S3に配置される想定のテストCSVデータ。ケースごとに用意する。
│ │ ...
│ │ ├── db_com_alma_before_update.csv -- テスト時に事前にDBに登録しておくデータ。CSVで用意する。
│ │ ...
│ │ ├── expect_com_alma_insert.csv -- テストの期待値データ。CSVで用意する。
│ │ ...
│ └── conftest.py -- テスト内で共通利用できるフィクスチャを宣言する(執筆時点ではDBのみ)
├── testing_utility.py -- テストの共通関数
└── testing_vjsk_utility.py -- テストの共通関数(実消化データ取込処理関連)
```

View File

@ -0,0 +1,10 @@
"""実消化&アルトマーク 日次バッチのエントリーポイント"""
from src import main
if __name__ == '__main__':
try:
exit(main.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

@ -0,0 +1,113 @@
import os.path as path
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 delete_dat_file(self, dat_file_key: str):
self._s3_client.delete_file(self._bucket_name, dat_file_key)
class ConfigBucket(S3Bucket):
_bucket_name = environment.JSKULT_CONFIG_BUCKET
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 VjskBackupBucket(JskUltBackupBucket):
_folder = environment.JSK_BACKUP_FOLDER
class VjskSendBucket(S3Bucket):
_bucket_name = environment.JSK_IO_BUCKET
_send_folder = environment.JSK_DATA_SEND_FOLDER
def upload_dcf_dsf_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_dcf_dsf_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,17 @@
class BatchContext:
__instance = None
__syor_date: str # 処理日(yyyy/mm/dd形式)
@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

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,148 @@
"""アルトマークデータ処理"""
import json
from src.aws.s3 import ConfigBucket, UltmarcBucket
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 environment
logger = get_logger('アルトマーク取込')
ultmarc_bucket = UltmarcBucket()
config_bucket = ConfigBucket()
def exec_import():
"""アルトマーク取り込み処理"""
try:
logger.info('アルトマーク取込処理: 開始')
# datファイルをS3から取得する
dat_file_list = ultmarc_bucket.list_dat_file()
# ファイルがS3に存在しない場合、起動していること自体が異常のためエラーとする
if len(dat_file_list) == 0:
raise BatchOperationException(f'取込ファイルが見つからないため、異常終了 ファイル一覧:{dat_file_list}')
# ファイルが複数ある場合はエラーとする
if len(dat_file_list) > 1:
raise BatchOperationException(f'複数の取込ファイルがあるため、異常終了 ファイル一覧:{dat_file_list}')
# ファイルの件数は必ず1件になる
dat_file_info = dat_file_list[0]
dat_file_name = dat_file_info['filename']
if environment.IMPORT_FILE_KEY != dat_file_name:
raise BatchOperationException(f'取込対象のファイルが見つからないため、異常終了 ファイル名:{environment.IMPORT_FILE_KEY}')
# 0Byteの場合、
if dat_file_info['size'] == 0:
logger.info(f'0Byteファイルのため、処理をスキップします。ファイル名={dat_file_info["filename"]}')
return
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)
# 取込完了後、S3からファイルを削除
ultmarc_bucket.delete_dat_file(dat_file_name)
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,237 @@
"""DCF DSFデータ作成処理"""
import csv
import os.path as path
import tempfile
from src.aws.s3 import VjskSendBucket
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.system_var import environment
logger = get_logger('DCF_DSFデータ作成処理')
def exec():
csv_file_name = environment.DCF_DSF_SEND_FILE_NAME
# バッチ共通設定を取得
batch_context = BatchContext.get_instance()
db = Database.get_instance()
try:
logger.info('処理開始')
# DB接続
db.connect()
# CSVファイルの作成用のSQL実行(施設)
record_dcf = select_dcf_record(db)
# CSVファイルの作成用のSQL実行(薬局)
record_dsf = select_dsf_record(db)
# CSVファイル作成
csv_file_path = make_csv_data(record_dcf, record_dsf, csv_file_name)
# s3へアップロード
jsk_bucket = VjskSendBucket()
jsk_bucket.upload_dcf_dsf_csv_file(csv_file_name, csv_file_path)
# 連携ファイルをバックアップ
jsk_bucket.backup_dcf_dsf_csv_file(csv_file_name, batch_context.syor_date)
csv_count = len(record_dcf) + len(record_dsf)
logger.info(f'CSV出力件数: {csv_count}')
logger.info('正常終了')
except Exception as e:
raise BatchOperationException(e)
finally:
db.disconnect()
return
def select_dcf_record(db):
# CSVファイル作成用のSQL実行(DCF施設)
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)
def select_dsf_record(db):
# CSVファイル作成用のSQL実行(DSF薬局)
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)
def make_csv_data(record_inst: list, record_pharm: list, csv_file_name: str):
# CSVファイルを作成する
temporary_dir = tempfile.mkdtemp()
csv_file_path = path.join(temporary_dir, 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)
return csv_file_path

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,480 @@
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()
# 「@」による項目クリアを設定
self.__set_clearing_item()
# レコードの存在確認
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 len(self.record.opp_dup_code) > 0:
set_clauses.append('opp_dup_cd = :opp_dup_code')
# 医師名(漢字)
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 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 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 len(self.record.dr_addr_lost_code) > 0:
set_clauses.append('addr_unknown_reason_cd = :dr_addr_lost_code')
# 住所
# 集合項目のいずれかに入力がある場合に更新
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 len(self.record.use_stop_flag) > 0:
set_clauses.append('use_stop_div = :use_stop_flag')
# 利用停止理由
if len(self.record.use_stopc_ode) > 0:
set_clauses.append('use_stop_reason_cd = :use_stopc_ode')
# 利用停止登録年月日
if len(self.record.cre_stop_date) > 0:
set_clauses.append('use_stop_regist_ymd = :cre_stop_date')
# 利用停止解除年月日
if len(self.record.release_date) > 0:
set_clauses.append('use_stop_cancel_ymd = :release_date')
# 開勤区分
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 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 ''
def __set_clearing_item(self):
# 削除予定理由
if self.record.drdel_code == '@':
self.query_parameter['drdel_code'] = None
# 重複時相手先コード
if self.record.reptdr_id == '@':
self.query_parameter['opp_dup_code'] = None
# 生年月日
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 self.record.grad_yearera == '@':
self.query_parameter['grad_yearera'] = None
self.query_parameter['grad_year'] = None
self.query_parameter['grad_y'] = None
# 登録年
if self.record.drda_yera == '@':
self.query_parameter['drda_yera'] = None
self.query_parameter['drday_year'] = None
self.query_parameter['drday_y'] = None
# 住所不明
if self.record.dr_addr_lost_code == '@':
self.query_parameter['dr_addr_lost_code'] = None
# 自宅電話番号
if self.record.dr_tel == '@':
self.query_parameter['dr_tel'] = None
# 利用停止区分
if self.record.use_stop_flag == '@':
self.query_parameter['use_stop_flag'] = None
# 利用停止理由
if self.record.use_stopc_ode == '@':
self.query_parameter['use_stopc_ode'] = None
# 利用停止登録年月日
if self.record.cre_stop_date == '@':
self.query_parameter['cre_stop_date'] = None
# 利用停止解除年月日
if self.record.release_date == '@':
self.query_parameter['release_date'] = None
# 開業年
if self.record.pract_yearera == '@':
self.query_parameter['pract_yearera'] = None
self.query_parameter['pract_year'] = None
self.query_parameter['estab_y'] = None
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,281 @@
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)
# 「@」による項目クリアを設定
self.__set_clearing_item()
# 存在しない場合は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 != '':
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')
# 大学順位
if self.record.identitycode != '':
set_clauses.append('identity_cd = :identitycode')
# 所属部科(集合項目)
if self.record.sectcode != '':
# 所属部科コード
set_clauses.append('blng_sec_cd = :sectcode')
# 所属部科(カナ)
set_clauses.append(f'blng_sec_name_kana = :sectname_kana')
# 所属部科(漢字)
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
def __set_clearing_item(self):
# 役職コード
if self.record.postcode == '@':
# NOT NULLのため、空文字をセット
self.query_parameter['postcode'] = ''
# 大学順位
if self.record.identitycode == '@':
# NOT NULLのため、空文字をセット
self.query_parameter['identitycode'] = ''
# DM不可フラグ
if self.record.notdm_flg == '@':
self.query_parameter['notdm_flg'] = None
# 以下、実際には項目のクリアが発生しない為不要なロジックだが、現行踏襲の為残しておく
# 所属部科コード
if self.record.sectcode == '@':
# NOT NULLのため、固定の所属部科コードをセット
self.query_parameter['sectcode'] = '9999'
# 所属部科(カナ)
if self.record.sectname_kana == '@':
self.query_parameter['sectname_kana'] = None
# 所属部科(漢字)
# 全角の項目なので、修正項目値として全角@が連携される
if self.record.sectname == '':
self.query_parameter['sectname'] = None
return

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,563 @@
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)
# 「@」による項目クリアを設定
self.__set_clearing_item()
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 len(self.record.hpdel_code) > 0:
set_clauses.append('delete_sche_reason_cd = :hpdel_code')
# 重複時相手先コード
if len(self.record.dup_opp_code) > 0:
set_clauses.append('dup_opp_cd = :dup_opp_code')
# 住所不明理由コード
if len(self.record.hp_addr_lost_code) > 0:
set_clauses.append('addr_unknown_reason_cd = :hp_addr_lost_code')
# 電話番号なしフラグ
if len(self.record.tel_nothing_flag) > 0:
set_clauses.append('phone_number_non_flg = :tel_nothing_flag')
# 電話番号
if len(self.record.hp_tel) > 0:
set_clauses.append('inst_phone_number = :hp_tel')
# 施設代表者コード
if len(self.record.inst_repre_code) > 0:
set_clauses.append('inst_repre_cd = :inst_repre_code')
# 代表者(カナ)
if len(self.record.president_kana) > 0:
set_clauses.append('inst_repre_kana = :president_kana')
# 代表者(漢字) ※「@」が大文字
if len(self.record.president) > 0:
set_clauses.append('inst_repre = :president')
# 開業予定フラグ・開業予定年月
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 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 len(self.record.univ_prnt_code) > 0:
set_clauses.append('rltd_univ_prnt_cd = :univ_prnt_code')
# 病棟閉鎖フラグ
if len(self.record.close_flag2) > 0:
set_clauses.append('ward_abolish_flg = :close_flag2')
# 病床数(定員)
if self.record.bed_num is not None:
set_clauses.append('bed_num = :bed_num')
# 許可病床メンテ日付
if len(self.record.bed_class_maint_date) > 0:
set_clauses.append('prmit_bed_maint_ymd = :bed_class_maint_date')
# 許可ベッド数(合計、精神、結核、感染、その他、一般病床、療養病床)
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')
# 検査項目(微生物、血清、血液、病理、寄生虫、生化、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')
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)
# 診療科目の1つ目の値がクリアマーク@)の場合、診療科目を登録しない
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:
# 特養医務室の集合項目の値がクリアマーク(@)の場合、登録しない
if self.record.dcfhp_92id == "@":
return
self.queries.append(self.INSERT_SPCARE_QUERY)
return
# 存在する場合はUpdate
# 特養医務室の集合項目の値がクリアマーク(@)の場合、DCF親施設コードをクリアし、削除日を設定
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
def __set_clearing_item(self):
# 未確認フラグ
if self.record.uncheck_flag == '@':
self.query_parameter['uncheck_flag'] = None
# 削除予定理由コード
if self.record.hpdel_code == '@':
self.query_parameter['hpdel_code'] = None
# 重複時相手先コード
if self.record.duphp_id == '@':
self.query_parameter['dup_opp_code'] = None
# 住所不明理由コード
if self.record.hp_addr_lost_code == '@':
self.query_parameter['hp_addr_lost_code'] = None
# 電話番号なしフラグ
if self.record.tel_nothing_flag == '@':
self.query_parameter['tel_nothing_flag'] = None
# 電話番号
if self.record.hp_tel == '@':
self.query_parameter['hp_tel'] = None
# 施設代表者コード
if self.record.president_id == '@':
self.query_parameter['inst_repre_code'] = None
# 代表者(カナ)
if self.record.president_kana == '@':
self.query_parameter['president_kana'] = None
# 代表者(漢字) ※全角文字のため、クリアマーク「@」が大文字
if self.record.president == '':
self.query_parameter['president'] = None
# 開業予定フラグ・開業予定年月
if self.record.open_flag == '@':
self.query_parameter['open_flag'] = None
self.query_parameter['open_year_month'] = None
# 休院フラグ・休院開始年月
if self.record.close_flag == '@':
self.query_parameter['close_flag'] = None
self.query_parameter['close_year_month'] = None
# 関連大学親コード
if self.record.assoc_parrent_id == '@':
self.query_parameter['univ_prnt_code'] = None
# 病棟閉鎖フラグ
if self.record.close_flag2 == '@':
self.query_parameter['close_flag2'] = None
# 病床数(定員)
if self.record.bed_num == '@':
self.query_parameter['bed_num'] = None
# 許可病床メンテ日付
if self.record.bed_class_maint_date == '@':
self.query_parameter['bed_class_maint_date'] = None
# 許可ベッド数(合計、精神、結核、感染、その他、一般病床、療養病床)
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 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
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,327 @@
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):
# 「@」による項目クリアを設定
self.__set_clearing_item()
# レコードの存在確認
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')
# 正式施設名カナ
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 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.president_Kana != '':
set_clauses.append('inst_repre_kana = :president_Kana')
# 施設代表者
if self.record.president != '':
set_clauses.append('inst_repre = :president')
# 電話番号なしフラグ
if self.record.tel_nothing_flag != '':
set_clauses.append('phone_number_non_flg = :tel_nothing_flag')
# 未確認フラグ
if self.record.unconf_flg != '':
set_clauses.append('unconf_flg = :unconf_flg')
# 施設電話番号
if self.record.tel_number != '':
set_clauses.append('inst_phone_number = :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')
# 住所カウント(集合項目である県コードが入っていればカウントをセットする)
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')
# 削除予定理由コード
if self.record.del_cd != '':
set_clauses.append('delete_sche_reason_cd = :del_cd')
# 重複時相手先コード
if self.record.dup_opp_cd != '':
set_clauses.append('dup_opp_cd = :dup_opp_cd')
# 管理薬剤師名(漢字)※@が大文字
if self.record.pharmacist != '':
set_clauses.append('supervising_pharmacist = :pharmacist')
# 管理薬剤師名(カナ)
if self.record.pharmacist_kana != '':
set_clauses.append('supervising_pharmacist_kana = :pharmacist_kana')
# チェーン店本部コード
if self.record.franchise_hq_id != '':
set_clauses.append('franchise_hq_cd = :franchise_hq_cd')
return set_clauses
def __set_clearing_item(self):
# 住所不明理由コード
if self.record.hp_addr_lost_code == '@':
self.query_parameter['hp_addr_lost_code'] = None
# 休院フラグ、休院予定年月
if self.record.close_flg == '@':
self.query_parameter['close_flg'] = None
self.query_parameter['close_yearmonth'] = None
# 開業予定フラグ、開業予定年月
if self.record.open_flag == '@':
self.query_parameter['open_flag'] = None
self.query_parameter['open_yearmonth'] = None
# 施設代表者カナ
if self.record.president_Kana == '@':
self.query_parameter['president_Kana'] = None
# 施設代表者 ※@が大文字
if self.record.president == '':
self.query_parameter['president'] = None
# 電話番号なしフラグ
if self.record.tel_nothing_flag == '@':
self.query_parameter['tel_nothing_flag'] = None
# 未確認フラグ
if self.record.unconf_flg == '@':
self.query_parameter['unconf_flg'] = None
# 施設電話番号
if self.record.tel_number == '@':
self.query_parameter['tel_number'] = None
# 住所表示番号
if self.record.addr_number == '@':
self.query_parameter['addr_number'] = None
# 削除予定理由コード
if self.record.del_cd == '@':
self.query_parameter['del_cd'] = None
# 重複時相手先コード
if self.record.duphp_id == '@':
self.query_parameter['dup_opp_cd'] = None
# 管理薬剤師名(漢字) ※@が大文字
if self.record.pharmacist == '':
self.query_parameter['pharmacist'] = None
# 管理薬剤師名(カナ)
if self.record.pharmacist_kana == '@':
self.query_parameter['pharmacist_kana'] = None
# チェーン店本部コード
if self.record.franchise_hq_id == '@':
self.query_parameter['franchise_hq_cd'] = None
return

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,489 @@
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):
# 「@」による項目クリアを設定
self.__set_clearing_item()
# レコードの存在確認
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 len(self.record.home_page) > 0:
set_clauses.append("home_page = :home_page")
# 院内処方フラグ
if len(self.record.hppre_flg) > 0:
set_clauses.append("hppre_flg = :hppre_flg")
# 院外処方フラグ
if len(self.record.expre_flg) > 0:
set_clauses.append("expre_flg = :expre_flg")
# 治験の実施
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 len(self.record.equipment_flg) > 0:
set_clauses.append("equipment_flg = :equipment_flg")
# 対応することができる疾患・治療の内容フラグ
if len(self.record.cos_disease_flg) > 0:
set_clauses.append("cos_disease_flg = :cos_disease_flg")
# 対応することができる短期滞在手術フラグ
if len(self.record.cos_surgery) > 0:
set_clauses.append("cos_surgery = :cos_surgery")
# 専門外来フラグ
if len(self.record.specialclinic_flg) > 0:
set_clauses.append("specialclinic_flg = :specialclinic_flg")
# 地域医療連携体制_窓口設置フラグ
if len(self.record.establishment_flg) > 0:
set_clauses.append("establishment_flg = :establishment_flg")
# 地域医療連携体制_地域連携パスフラグ
if len(self.record.critical_flg) > 0:
set_clauses.append("critical_flg = :critical_flg")
# 入院診療計画策定時における院内の連携体制
if len(self.record.cop_system) > 0:
set_clauses.append("cop_system = :cop_system")
# オーダリングシステム
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")
# ICDコード利用フラグ
if len(self.record.icduse_flg) > 0:
set_clauses.append("icduse_flg = :icduse_flg")
# 電子カルテフラク
if len(self.record.echart_flg) > 0:
set_clauses.append("echart_flg = :echart_flg")
# 専任従事者
if len(self.record.fulltime_flg) > 0:
set_clauses.append("fulltime_flg = :fulltime_flg")
set_clauses.append("fulltime_count = :fulltime_count")
# 病床患者数平均
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 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 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 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 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 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 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")
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
def __set_clearing_item(self):
# 情報年月日
if self.record.info_date == "@":
self.query_parameter["info_date"] = None
# 案内用ホームページアドレス
if self.record.home_page == "@":
self.query_parameter["home_page"] = None
# 院内処方フラグ
if self.record.hppre_flg == "@":
self.query_parameter["hppre_flg"] = None
# 院外処方フラグ
if self.record.expre_flg == "@":
self.query_parameter["expre_flg"] = None
# 治験の実施
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 self.record.equipment_flg == "@":
self.query_parameter["equipment_flg"] = None
# 対応することができる疾患・治療の内容フラグ
if self.record.cos_disease_flg == "@":
self.query_parameter["cos_disease_flg"] = None
# 対応することができる短期滞在手術フラグ
if self.record.cos_surgery == "@":
self.query_parameter["cos_surgery"] = None
# 専門外来フラグ
if self.record.specialclinic_flg == "@":
self.query_parameter["specialclinic_flg"] = None
# 地域医療連携体制_窓口設置フラグ
if self.record.establishment_flg == "@":
self.query_parameter["establishment_flg"] = None
# 地域医療連携体制_地域連携パスフラグ
if self.record.critical_flg == "@":
self.query_parameter["critical_flg"] = None
# 入院診療計画策定時における院内の連携体制
if self.record.cop_system == "@":
self.query_parameter["cop_system"] = None
# オーダリングシステム
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 self.record.icduse_flg == "@":
self.query_parameter["icduse_flg"] = None
# 電子カルテフラク
if self.record.echart_flg == "@":
self.query_parameter["echart_flg"] = None
# 専任従事者
if self.record.fulltime_flg == "@":
self.query_parameter["fulltime_flg"] = None
self.query_parameter["fulltime_count"] = None
# 病床患者数平均
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 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 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 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 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 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 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
return

View File

@ -0,0 +1,106 @@
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):
# 修正のレコードだった場合はNULLに変換する
if self.record.pre_num == '@':
self.query_parameter['pre_num'] = None
# レコードの存在確認
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.is_pre_num_not_empty:
return self.UPDATE_QUERY
else:
return None

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_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):
# 修正のレコードだった場合はNULLに変換する
if self.record.bed_num == '@':
self.query_parameter['bed_num'] = None
# レコードの存在確認
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.is_bed_num_not_empty:
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,133 @@
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):
# 修正のレコードだった場合はNULLに変換する
if self.record.sectsub_cd == "@":
self.query_parameter["sectsub_cd"] = None
# レコードの存在確認
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")
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,158 @@
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)
# 「@」による項目クリアを設定
self.__set_clearing_item()
# 存在しない場合は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 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 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')
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
def __set_clearing_item(self):
# 専門医の集合項目クリア
if self.record.specialist_flg == '@':
self.query_parameter['specialist_flg'] = None
self.query_parameter['specialist_publsh_ymd'] = None
# 認定医の集合項目クリア
if self.record.ackn_med_flg == '@':
self.query_parameter['ackn_med_flg'] = None
self.query_parameter['ackn_med_publsh_ymd'] = None
# 指導医の集合項目クリア
if self.record.guide_med_flg == '@':
self.query_parameter['guide_med_flg'] = None
self.query_parameter['guide_med_publsh_ymd'] = None
return

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,34 @@
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]
# Update判断フラグ。数値が空の場合は更新しない。
self.is_pre_num_not_empty = True
# smallint型のカラム値は、空文字で渡ってきた場合はNULLに変換する
self.pre_num = self.pre_num if len(self.pre_num) > 0 else None
self.is_pre_num_not_empty = self.pre_num is not None
# DCFDSF施設コード
self.dcfdsf_inst_code = ''.join([self.dcfhp_id, self.dcfhp_code, self.dcfhp_yobi])

View File

@ -0,0 +1,34 @@
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]
# Update判断フラグ。数値が空の場合は更新しない。
self.is_bed_num_not_empty = True
# smallint型のカラム値は、空文字で渡ってきた場合はNULLに変換する
self.bed_num = self.bed_num if len(self.bed_num) > 0 else None
self.is_bed_num_not_empty = self.bed_num is not 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])

View File

@ -0,0 +1,14 @@
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
class ComRegnCriticPass(UltmarcTable):
"""レイアウト区分026: COM_地域クリティカルパス"""
maint_flag: str # 修正区分
regn_co_critic_pass_cd: str # 地域クリティカルパスコード
disease_name_kanji: str # 疾患名(漢字)
def __init__(self, record: list[str]):
super().__init__(record)
self.maint_flag = record[2]
self.regn_co_critic_pass_cd = record[1]
self.disease_name_kanji = record[5]

View File

@ -0,0 +1,14 @@
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
class ComRehabili(UltmarcTable):
"""レイアウト区分027: COM_疾患別リハビリテーション科"""
maint_flag: str # 修正区分
rehabili_cd: str # 疾患別リハビリコード
rehabili_name: str # リハビリテーション名称(漢字)
def __init__(self, record: list[str]):
super().__init__(record)
self.maint_flag = record[2]
self.rehabili_cd = record[1]
self.rehabili_name = record[5]

View File

@ -0,0 +1,30 @@
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
class ComSndMedSphe(UltmarcTable):
"""レイアウト区分123: COM_医療圏二次医療圏"""
prefc_cd: str # 県コード
med_sphe_cd: str # 医療圏コード
thrd_cd: str # 3次コード
snd_med_sphe_name: str # 2次医療圏名
requd_bed_or_equip_target: str # 基準病床数 or 整備目標数
exist_bed_num: str # 既存病床数(病床数)
exist_bed_num_regist_ymd: str # 既存病床数(年月日)
plsmns_bed_num: str # 過不足病床数
maintflag: 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.snd_med_sphe_name = record[6]
self.thrd_cd = record[7]
self.requd_bed_or_equip_target = record[8].strip()
self.exist_bed_num = record[9].strip()
self.exist_bed_num_regist_ymd = record[10]
self.plsmns_bed_num = record[11]
# decimal型のカラム値は、空文字で渡ってきた場合はNULLに変換する
self.requd_bed_or_equip_target = self.requd_bed_or_equip_target if len(self.requd_bed_or_equip_target) > 0 else None
self.exist_bed_num = self.exist_bed_num if len(self.exist_bed_num) > 0 else None

View File

@ -0,0 +1,14 @@
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
class ComSosiety(UltmarcTable):
"""レイアウト区分009: COM_学会"""
sosiety_cd: str # 学会コード
sosiety_name: str # 学会名
maint_flag: str # 修正区分
def __init__(self, record: list[str]):
super().__init__(record)
self.sosiety_cd = record[1]
self.maint_flag = record[2]
self.sosiety_name = record[5]

View File

@ -0,0 +1,42 @@
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
class ComSpField(UltmarcTable):
"""レイアウト区分511: COM_専門分野"""
dcf_pcf_dr_cd: str # DCFPCF医師コード
dcf_dr_id: str # レコードID
dcf_dr_code: str # 個人コード
dcf_dr_yobi: str # 個人コード(予備)
maint_flag: str # 修正区分
specialist_cd: str # 専門医コード
specialist_maint_div: str # 予備/専門医メンテ区分
specialist_flg: str # 専門医フラグ
specialist_publsh_ymd: str # 専門医掲載年月日
ackn_med_flg: str # 認定医フラグ
ackn_med_publsh_ymd: str # 認定医掲載年月日
guide_med_flg: str # 指導医フラグ
guide_med_publsh_ymd: str # 指導医掲載年月日
# メンテナンス年月日 と 予備/転送年月日 は未使用
def __init__(self, record: list[str]):
super().__init__(record)
self.dcf_dr_id = record[1].strip()
self.dcf_dr_code = record[2].strip()
self.dcf_dr_yobi = record[3].strip()
self.maint_flag = record[4].strip()
self.specialist_cd = record[5].strip()
self.specialist_maint_div = record[6].strip()
self.specialist_flg = record[9].strip()
self.specialist_publsh_ymd = record[10].strip()
self.ackn_med_flg = record[11].strip()
self.ackn_med_publsh_ymd = record[12].strip()
self.guide_med_flg = record[13].strip()
self.guide_med_publsh_ymd = record[14].strip()
# 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,14 @@
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
class ComSpecialistLicense(UltmarcTable):
"""レイアウト区分010: COM_専門医資格"""
specialist_cd: str # 専門医コード
specialist_license_name: str # 専門医資格名
maint_flag: str # 修正区分
def __init__(self, record: list[str]):
super().__init__(record)
self.specialist_cd = record[1]
self.maint_flag = record[2]
self.specialist_license_name = record[5]

View File

@ -0,0 +1,16 @@
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
class ComThrdMed(UltmarcTable):
"""レイアウト区分122: COM_医療圏3次マスタ"""
pref_code: str # 都道府県コード
thrd_cd: str # 3次コード
thrd_med_sphe_name: str # 3次医療圏名称
maintflag: str # 修正区分
def __init__(self, record: list[str]):
super().__init__(record)
self.pref_code = record[1]
self.thrd_cd = record[2]
self.maintflag = record[3]
self.thrd_med_sphe_name = record[6]

View File

@ -0,0 +1,18 @@
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
class ComTrtCourse(UltmarcTable):
"""レイアウト区分001: COM_診療科目"""
trt_course_cd: str # 診療科目コード
trt_course_name_kana: str # 診療科目名カナ
trt_course_name_abb: str # 診療科目名略称
trt_course_name: str # 診療科目名
maint_flag: str # 修正区分
def __init__(self, record: list[str]):
super().__init__(record)
self.trt_course_cd = record[1]
self.maint_flag = record[2]
self.trt_course_name_abb = record[5]
self.trt_course_name = record[6]
self.trt_course_name_kana = record[7]

View File

@ -0,0 +1,14 @@
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
class MstPrefc(UltmarcTable):
"""レイアウト区分006: 都道府県マスタ"""
prefc_cd: str # 都道府県コード
prefc_name: str # 都道府県名称
maint_flag: str # 修正区分
def __init__(self, record: list[str]):
super().__init__(record)
self.maint_flag = record[2]
self.prefc_name = record[5]
self.prefc_cd = record[6]

View File

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

View File

@ -0,0 +1,174 @@
from src.db.database import Database
from src.batch.ultmarc.utmp_tables.table_mapper.ultmarc_table_mapper import \
UltmarcTableMapper
from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_alma_mapper import \
ComAlmaMapper
from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_dr_wrkplace_mapper import \
ComDrWrkplaceMapper
from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_forfront_med_equip_mapper import \
ComForfrontMedEquipMapper
from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_hamtec_mapper import \
ComHamtecMapper
from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_inst_mapper import \
ComInstMapper
from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_nurse_assrt_mapper import \
ComNurseAssrtMapper
from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_pharm_mapper import \
ComPharmMapper
from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_sp_field_mapper import \
ComSpFieldMapper
from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_policy_med_mapper import \
ComPolicyMedMapper
from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_rehabili_mapper import \
ComRehabiliMapper
from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_regn_critic_pass_mapper import \
ComRegnCriticPassMapper
from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_med_func_valuation_mapper import \
ComMedFuncValuationMapper
from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_dr_mapper import \
ComDrMapper
from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_dr_sosiety_mapper import \
ComDrSosietyMapper
from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_prefc_med_base_mapper import \
ComPrefcMedBaseMapper
from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_prefc_med_equpment_mapper import \
ComPrefcMedEqupmentMapper
from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_prefc_med_dis_treat_mapper import \
ComPrefcMedDisTreatMapper
from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_prefc_med_sojourn_ope_mapper import \
ComPrefcMedSojournOpeMapper
from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_prefc_med_sp_outpat_mapper import \
ComPrefcMedSpOutpatMapper
from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_inst_att_mapper import \
ComInstAttMapper
from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_cop_hp_mapper import \
ComCopHpMapper
from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_trt_course_mapper import \
ComTrtCourseMapper
from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_hp_assrt_mapper import \
ComHpAssrtMapper
from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_alma_depart_disc_mapper import \
ComAlmaDepartDiscMapper
from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_med_prefc_mapper import \
ComMedPrefcMapper
from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_thrd_med_mapper import \
ComThrdMedMapper
from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_snd_med_sphe_mapper import \
ComSndMedSpheMapper
from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_med_area_city_mapper import \
ComMedAreaCityMapper
from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_post_mapper import \
ComPostMapper
from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_manage_mapper import \
ComManageMapper
from src.batch.ultmarc.utmp_tables.table_mapper.concrete.mst_prefc_mapper import \
MstPrefcMapper
from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_blng_sec_mapper import \
ComBlngSecMapper
from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_sosiety_mapper import \
ComSosietyMapper
from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_specialist_license_mapper import \
ComSpecialistLicenseMapper
from src.batch.ultmarc.utmp_tables.table_mapper.concrete.com_inst_div_mapper import \
ComInstDivMapper
# テーブルとのマッピング
COM_TABLE_LIST = {
# レコードID固定
# COM_医師学会
"521": ComDrSosietyMapper,
# COM_施設属性
"111": ComInstAttMapper,
# COM_臨床研修病院
"112": ComCopHpMapper,
# COM_医師
"501": ComDrMapper,
# COM_施設
"101": ComInstMapper,
# COM_薬局
"102": ComPharmMapper,
# COM_医師勤務先
"502": ComDrWrkplaceMapper,
# COM_専門分野
"511": ComSpFieldMapper,
# COM_都道府県医療機能情報(基本)
"132": ComPrefcMedBaseMapper,
# COM_都道府県医療機能情報(施設設備)
"133": ComPrefcMedEqupmentMapper,
# COM_都道府県医療機能情報(疾患治療)
"134": ComPrefcMedDisTreatMapper,
# COM_都道府県医療機能情報(短期滞在手術)
"135": ComPrefcMedSojournOpeMapper,
# COM_都道府県医療機能情報(専門外来)
"136": ComPrefcMedSpOutpatMapper,
# COM_診療科目
"001": ComTrtCourseMapper,
# COM_病院種別
"002": ComHpAssrtMapper,
# COM_出身校学部識別
"003": ComAlmaDepartDiscMapper,
# COM_出身校
"004": ComAlmaMapper,
# COM_役職
"005": ComPostMapper,
# 都道府県マスタ
"006": MstPrefcMapper,
# COM_経営体
"007": ComManageMapper,
# COM_所属部科
"008": ComBlngSecMapper,
# COM_学会
"009": ComSosietyMapper,
# COM_専門医資格
"010": ComSpecialistLicenseMapper,
# COM_施設区分
"011": ComInstDivMapper,
# COM_高度先進医療
"021": ComHamtecMapper,
# COM_先端医療機器
"022": ComForfrontMedEquipMapper,
# COM_看護種別
"023": ComNurseAssrtMapper,
# COM_医療機能評価
"024": ComMedFuncValuationMapper,
# COM_地域クリティカルパス
"026": ComRegnCriticPassMapper,
# COM_疾患別リハビリテーション科
"027": ComRehabiliMapper,
# COM_政策医療
"028": ComPolicyMedMapper,
# COM_医療圏都道府県
"121": ComMedPrefcMapper,
# COM_医療圏次マスタ
"122": ComThrdMedMapper,
# COM_二次医療圏
"123": ComSndMedSpheMapper,
# COM_医療圏都道府県市町村対照表
"124": ComMedAreaCityMapper
}
class UltmarcTableMapperFactory:
def create(self, layout_class: str, records: list[str], db: Database) -> UltmarcTableMapper:
"""レイアウト区分とレコードIDから、マッピング先のテーブルマッパーを特定する
Args:
layout_class (str): レイアウト区分
records (list[str]): アルトマークデータの1行
db (Database): データベース操作クラス
Raises:
Exception: レイアウトを特定できない場合
Returns:
UltmarcTableMapper: マッパークラス
"""
# レイアウト区分から、マッピング先のテーブルを特定
mapper_class = COM_TABLE_LIST.get(layout_class)
# レイアウト区分が特定できない場合はエラーとする
if mapper_class is None:
raise Exception(f'マッピング先のテーブルを特定できませんでした。レイアウト区分={layout_class}')
return mapper_class(records, db)

View File

@ -0,0 +1,195 @@
from sqlalchemy import (Connection, CursorResult, Engine, QueuePool,
create_engine, text)
from sqlalchemy.engine.url import URL
from tenacity import retry, stop_after_attempt, wait_exponential
from src.error.exceptions import DBException
from src.logging.get_logger import get_logger
from src.system_var import environment
logger = get_logger(__name__)
class Database:
"""データベース操作クラス"""
__connection: Connection = None
__transactional_engine: Engine = None
__autocommit_engine: Engine = None
__host: str = None
__port: str = None
__username: str = None
__password: str = None
__schema: str = None
__autocommit: bool = None
__connection_string: str = None
def __init__(self, username: str, password: str, host: str, port: int, schema: str, autocommit: bool = False) -> None:
"""このクラスの新たなインスタンスを初期化します
Args:
username (str): DBユーザー名
password (str): DBパスワード
host (str): DBホスト名
port (int): DBポート
schema (str): DBスキーマ名
autocommit(bool): 自動コミットモードで接続するかどうか(Trueの場合トランザクションの有無に限らず即座にコミットされる). Defaults to False.
"""
self.__username = username
self.__password = password
self.__host = host
self.__port = int(port)
self.__schema = schema
self.__autocommit = autocommit
self.__connection_string = URL.create(
drivername='mysql+pymysql',
username=self.__username,
password=self.__password,
host=self.__host,
port=self.__port,
database=self.__schema,
query={"charset": "utf8mb4", "local_infile": "1"},
)
self.__transactional_engine = create_engine(
self.__connection_string,
pool_timeout=5,
poolclass=QueuePool
)
self.__autocommit_engine = self.__transactional_engine.execution_options(isolation_level='AUTOCOMMIT')
@classmethod
def get_instance(cls, autocommit=False):
"""インスタンスを取得します
Args:
autocommit (bool, optional): 自動コミットモードで接続するかどうか(Trueの場合トランザクションの有無に限らず即座にコミットされる). Defaults to False.
Returns:
Database: DB操作クラスインスタンス
"""
return cls(
username=environment.DB_USERNAME,
password=environment.DB_PASSWORD,
host=environment.DB_HOST,
port=environment.DB_PORT,
schema=environment.DB_SCHEMA,
autocommit=autocommit
)
@retry(
wait=wait_exponential(
multiplier=environment.DB_CONNECTION_RETRY_INTERVAL_INIT,
min=environment.DB_CONNECTION_RETRY_INTERVAL_MIN_SECONDS,
max=environment.DB_CONNECTION_RETRY_INTERVAL_MAX_SECONDS
),
stop=stop_after_attempt(environment.DB_CONNECTION_MAX_RETRY_ATTEMPT),
retry_error_cls=DBException
)
def connect(self):
"""
DBに接続します接続に失敗した場合リトライします\n
インスタンスのautocommitがTrueの場合自動コミットモードで接続する明示的なトランザクションも無視される
Raises:
DBException: 接続失敗
"""
try:
self.__connection = (
self.__autocommit_engine.connect() if self.__autocommit is True
else self.__transactional_engine.connect())
except Exception as e:
raise DBException(e)
def execute_select(self, select_query: str, parameters=None) -> list[dict]:
"""SELECTクエリを実行します。
Args:
select_query (str): SELECT文
parameters (dict, optional): クエリのプレースホルダーに埋め込む変数の辞書. Defaults to None.
Raises:
DBException: DBエラー
Returns:
list[dict]: カラム名: 値の辞書リスト
"""
if self.__connection is None:
raise DBException('DBに接続していません')
result = None
try:
# トランザクションが開始している場合は、トランザクションを引き継ぐ
if self.__connection.in_transaction():
result = self.__connection.execute(text(select_query), parameters)
else:
# トランザクションが明示的に開始していない場合は、クエリ単位でトランザクションをbegin-commitする。
result = self.__execute_with_transaction(select_query, parameters)
except Exception as e:
raise DBException(f'SQL Error: {e}')
result_rows = result.mappings().all()
return result_rows
def execute(self, query: str, parameters=None) -> CursorResult:
"""SQLクエリを実行します。
Args:
query (str): SQL文
parameters (dict, optional): クエリのプレースホルダーに埋め込む変数の辞書. Defaults to None.
Raises:
DBException: DBエラー
Returns:
CursorResult: 取得結果
"""
if self.__connection is None:
raise DBException('DBに接続していません')
result = None
try:
# トランザクションが開始している場合は、トランザクションを引き継ぐ
if self.__connection.in_transaction():
result = self.__connection.execute(text(query), parameters)
else:
# トランザクションが明示的に開始していない場合は、クエリ単位でトランザクションをbegin-commitする。
result = self.__execute_with_transaction(query, parameters)
except Exception as e:
raise DBException(f'SQL Error: {e}')
return result
def begin(self):
"""トランザクションを開始します。"""
if not self.__connection.in_transaction():
self.__connection.begin()
def commit(self):
"""トランザクションをコミットします"""
if self.__connection.in_transaction():
self.__connection.commit()
def rollback(self):
"""トランザクションをロールバックします"""
if self.__connection.in_transaction():
self.__connection.rollback()
def disconnect(self):
"""DB接続を切断します。"""
if self.__connection is not None:
self.__connection.close()
self.__connection = None
def to_jst(self):
self.execute('SET time_zone = "+9:00"')
def __execute_with_transaction(self, query: str, parameters: dict):
# トランザクションを開始してクエリを実行する
with self.__connection.begin():
try:
result = self.__connection.execute(text(query), parameters=parameters)
except Exception as e:
self.__connection.rollback()
raise e
# ここでコミットされる
return result

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