notebookvb

This commit is contained in:
2026-04-11 11:56:54 +02:00
parent 24635b955d
commit c2d94b2362
10 changed files with 507 additions and 35 deletions
+87 -22
View File
@@ -1,12 +1,14 @@
"""
Nacte odpoved lekoveho zaznamu (XML) a ulozi ji do MySQL.
Schema: zprava / predpis / predpis_slozka / vydej / vydej_slozka
Schema: pacient / zprava / predpis / predpis_slozka / vydej / vydej_slozka / predepisujici / vydavajici
Typy a delky presne dle XSD (Cuer2Schema.xsd + CuerSchema.xsd, verze 202501A)
Spusteni:
Spusteni (jednorazova inicializace + import jednoho XML):
python 06UlozitDoMySQL.py
nebo:
python 06UlozitDoMySQL.py cesta/k/odpoved.xml
Pro hromadne stazeni vsech pacientu pouzij 07StahnoutVsechny.py.
"""
import sys
@@ -47,25 +49,49 @@ def ts(s):
# ── DDL ───────────────────────────────────────────────────────────────────────
DDL_TABULKY = [
# smazat v opacnem poradi kvuli FK
# Pouziva se ve vytvor_schema() (DROP + CREATE) pro ciste spusteni
DDL_DROP = [
"DROP TABLE IF EXISTS predpis_slozka",
"DROP TABLE IF EXISTS vydej_slozka",
"DROP TABLE IF EXISTS vydej",
"DROP TABLE IF EXISTS predpis",
"DROP TABLE IF EXISTS zprava",
"DROP TABLE IF EXISTS pacient",
"DROP TABLE IF EXISTS predepisujici",
"DROP TABLE IF EXISTS vydavajici",
]
DDL_CREATE = [
# ── pacient ───────────────────────────────────────────────────────────────
# Zrcadlo registrovanych pacientu z Medicusu (Firebird).
# idpac = IDPAC z KAR tabulky Medicusu.
# poznamka: posledni chyba API (napr. "neztotozneny pacient"); NULL = OK
"""
CREATE TABLE IF NOT EXISTS pacient (
id INT AUTO_INCREMENT PRIMARY KEY,
idpac INT NOT NULL UNIQUE,
prijmeni VARCHAR(35) NOT NULL,
jmena VARCHAR(24),
datum_narozeni DATE NOT NULL,
aktivni TINYINT(1) NOT NULL DEFAULT 1,
poznamka VARCHAR(500),
INDEX idx_prijmeni (prijmeni)
) ENGINE=InnoDB
""",
# ── zprava ────────────────────────────────────────────────────────────────
# zprava_odpoved_type + zprava_type:
# ID_Zpravy CHAR(36), Verze, Odeslano dateTime
# Aplikace(512), ID_Podani CHAR(36), Prijato dateTime
# jmeno_osoby_type: Prijmeni(35), Jmena(24)
# pacient_id: FK na pacient.id (NULL pokud volano z 06 primo)
# xml_soubor: relativni cesta k ulozene XML odpovedi
"""
CREATE TABLE zprava (
CREATE TABLE IF NOT EXISTS zprava (
id INT AUTO_INCREMENT PRIMARY KEY,
id_zpravy CHAR(36) NOT NULL UNIQUE,
pacient_id INT,
verze VARCHAR(20),
odeslano DATETIME,
aplikace VARCHAR(512),
@@ -74,8 +100,11 @@ DDL_TABULKY = [
pacient_prijmeni VARCHAR(35),
pacient_jmena VARCHAR(24),
pacient_datum_narozeni DATE,
xml_soubor VARCHAR(255),
stazeno DATETIME DEFAULT CURRENT_TIMESTAMP,
INDEX idx_pacient (pacient_prijmeni, pacient_datum_narozeni)
FOREIGN KEY (pacient_id) REFERENCES pacient(id) ON DELETE SET NULL,
INDEX idx_pacient_id (pacient_id),
INDEX idx_pacient (pacient_prijmeni, pacient_datum_narozeni)
) ENGINE=InnoDB
""",
@@ -90,7 +119,7 @@ DDL_TABULKY = [
# inn_predpis_type: Nazev(200) — nejdelsi nazev mezi typy
# iplp_predpis_type: PostupPripravy(4000), Nazev(146), CestaPodani(15), Forma(27)
"""
CREATE TABLE predpis (
CREATE TABLE IF NOT EXISTS predpis (
id INT AUTO_INCREMENT PRIMARY KEY,
zprava_id INT NOT NULL,
id_lp_predpis CHAR(36) NOT NULL UNIQUE,
@@ -120,7 +149,7 @@ DDL_TABULKY = [
# Mnozstvi DECIMAL(15,6) NOT NULL, Jednotka ENUM('g','ks') NOT NULL,
# Nazev(200) NOT NULL, Surovina CHAR(7)?, HVLPReg CHAR(7)?
"""
CREATE TABLE predpis_slozka (
CREATE TABLE IF NOT EXISTS predpis_slozka (
id INT AUTO_INCREMENT PRIMARY KEY,
predpis_id INT NOT NULL,
mnozstvi DECIMAL(15,6) NOT NULL,
@@ -140,7 +169,7 @@ DDL_TABULKY = [
# lek — vzdy jen jeden z: HVLPReg / HVLPNereg / IPLP
# iplp_type (vydej): KodVZP CHAR(7)?, PostupPripravy(4000), Nazev(146), CestaPodani(15)
"""
CREATE TABLE vydej (
CREATE TABLE IF NOT EXISTS vydej (
id INT AUTO_INCREMENT PRIMARY KEY,
zprava_id INT NOT NULL,
id_lp_vydej CHAR(36) NOT NULL UNIQUE,
@@ -175,7 +204,7 @@ DDL_TABULKY = [
# Nazev(200) NOT NULL, HrazenoZP DECIMAL(9,2)?,
# Surovina CHAR(7)?, HVLPReg CHAR(7)?
"""
CREATE TABLE vydej_slozka (
CREATE TABLE IF NOT EXISTS vydej_slozka (
id INT AUTO_INCREMENT PRIMARY KEY,
vydej_id INT NOT NULL,
mnozstvi DECIMAL(15,6) NOT NULL,
@@ -197,7 +226,7 @@ DDL_TABULKY = [
# Telefon(20)?
# lekar_kod = predpis.kod_predepisujiciho
"""
CREATE TABLE predepisujici (
CREATE TABLE IF NOT EXISTS predepisujici (
id INT AUTO_INCREMENT PRIMARY KEY,
lekar_kod CHAR(36) NOT NULL UNIQUE,
prijmeni VARCHAR(35),
@@ -220,7 +249,7 @@ DDL_TABULKY = [
# PZS: Nazev(200), Telefon(20)?, Adresa: NazevUlice, CisloPopisne, CisloOrientacni, NazevObce, PSC
# lekarnik_kod = vydej.kod_vydavajiciho
"""
CREATE TABLE vydavajici (
CREATE TABLE IF NOT EXISTS vydavajici (
id INT AUTO_INCREMENT PRIMARY KEY,
lekarnik_kod CHAR(36) NOT NULL UNIQUE,
prijmeni VARCHAR(35),
@@ -236,13 +265,38 @@ DDL_TABULKY = [
def vytvor_schema(conn):
"""DROP + CREATE vsech tabulek. Pouzij pro ciste spusteni / reset dat."""
with conn.cursor() as cur:
for stmt in DDL_TABULKY:
for stmt in DDL_DROP:
cur.execute(stmt)
for stmt in DDL_CREATE:
stmt = stmt.strip()
if stmt:
cur.execute(stmt)
conn.commit()
print("Schema OK (5 tabulek smazano a vytvoreno znovu)")
print("Schema OK tabulky smazany a vytvoreny znovu")
def inicializuj_schema(conn):
"""CREATE TABLE IF NOT EXISTS — bezpecne pro opakowane spusteni (neznici data)."""
with conn.cursor() as cur:
for stmt in DDL_CREATE:
stmt = stmt.strip()
if stmt:
cur.execute(stmt)
# Zpetna kompatibilita: pridat sloupec poznamka pokud jeste neexistuje
cur.execute("""
SELECT COUNT(*) AS cnt
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'pacient'
AND COLUMN_NAME = 'poznamka'
""")
if cur.fetchone()["cnt"] == 0:
cur.execute(
"ALTER TABLE pacient ADD COLUMN poznamka VARCHAR(500) NULL DEFAULT NULL"
)
conn.commit()
# ── parsovani predepisujicich a vydavajicich ─────────────────────────────────
@@ -519,25 +573,36 @@ def _najdi_id(cur, tabulka, sloupec, hodnota):
return row["id"] if row else None
def uloz(conn, zprava, predpisy, vydeji, predepisujici, vydavajici):
def uloz(conn, zprava, predpisy, vydeji, predepisujici, vydavajici,
pacient_id=None, xml_soubor=None):
"""
Ulozi parsovana data do MySQL.
pacient_id — FK na tabulku pacient (None pokud volano primo z 06)
xml_soubor — relativni cesta k archivnimu XML souboru (None pokud neni archivovano)
"""
iplp_predpisu = 0
iplp_vydejuu = 0
with conn.cursor() as cur:
# ── zprava ────────────────────────────────────────────────────────────
zprava_row = dict(zprava)
zprava_row["pacient_id"] = pacient_id
zprava_row["xml_soubor"] = xml_soubor
cur.execute("""
INSERT INTO zprava
(id_zpravy, verze, odeslano, aplikace, id_podani, prijato,
pacient_prijmeni, pacient_jmena, pacient_datum_narozeni)
(id_zpravy, pacient_id, verze, odeslano, aplikace, id_podani, prijato,
pacient_prijmeni, pacient_jmena, pacient_datum_narozeni, xml_soubor)
VALUES
(%(id_zpravy)s, %(verze)s, %(odeslano)s, %(aplikace)s,
(%(id_zpravy)s, %(pacient_id)s, %(verze)s, %(odeslano)s, %(aplikace)s,
%(id_podani)s, %(prijato)s,
%(pacient_prijmeni)s, %(pacient_jmena)s, %(pacient_datum_narozeni)s)
%(pacient_prijmeni)s, %(pacient_jmena)s, %(pacient_datum_narozeni)s,
%(xml_soubor)s)
ON DUPLICATE KEY UPDATE
prijato = VALUES(prijato),
stazeno = CURRENT_TIMESTAMP
""", zprava)
prijato = VALUES(prijato),
xml_soubor = COALESCE(VALUES(xml_soubor), xml_soubor),
stazeno = CURRENT_TIMESTAMP
""", zprava_row)
zprava_id = _najdi_id(cur, "zprava", "id_zpravy", zprava["id_zpravy"])
print(f" zprava id={zprava_id} ({zprava['id_zpravy']})")