update
This commit is contained in:
+44
-23
@@ -166,7 +166,7 @@ DEVICE_CONFIGS = [
|
|||||||
'protocol': 'serial', 'flag_column': 'flg_vitek2'
|
'protocol': 'serial', 'flag_column': 'flg_vitek2'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'port': 'COM5', 'baud_rate': 19200, 'device_type': 'bd', 'alat_name': 'BACTEC',
|
'port': 'COM5', 'baud_rate': 9600, 'device_type': 'bd', 'alat_name': 'BACTEC',
|
||||||
'protocol': 'serial', 'flag_column': 'flg_bd1'
|
'protocol': 'serial', 'flag_column': 'flg_bd1'
|
||||||
},
|
},
|
||||||
#BD_MGIT yang di dalam ruangan isolasi
|
#BD_MGIT yang di dalam ruangan isolasi
|
||||||
@@ -2536,38 +2536,50 @@ def parse_and_save_vitek_result(raw_data, port_name="VITEK"):
|
|||||||
|
|
||||||
def split_patient_name(full_name):
|
def split_patient_name(full_name):
|
||||||
"""
|
"""
|
||||||
Pecah nama pasien menjadi first_name dan last_name.
|
Return: last_name, first_name
|
||||||
- Jika ada '^', diasumsikan format ASTM/HL7: Last^First.
|
ASTM format: LAST^FIRST
|
||||||
- Jika nama biasa, token terakhir = last_name, sisanya = first_name.
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if not full_name:
|
if not full_name:
|
||||||
return "NO", "NAME"
|
return "NAME", "NO"
|
||||||
|
|
||||||
raw = str(full_name).strip()
|
raw = str(full_name).strip()
|
||||||
|
|
||||||
if not raw:
|
if not raw:
|
||||||
return "NO", "NAME"
|
return "NAME", "NO"
|
||||||
|
|
||||||
first_name = ""
|
first_name = ""
|
||||||
last_name = ""
|
last_name = ""
|
||||||
|
|
||||||
|
# Hapus karakter ASTM berbahaya
|
||||||
|
raw = (
|
||||||
|
raw.replace("\x00", "")
|
||||||
|
.replace("\r", " ")
|
||||||
|
.replace("\n", " ")
|
||||||
|
.replace("|", " ")
|
||||||
|
.replace("&", " ")
|
||||||
|
)
|
||||||
|
|
||||||
if "^" in raw:
|
if "^" in raw:
|
||||||
parts = [p.strip() for p in raw.split("^") if p.strip()]
|
parts = [p.strip() for p in raw.split("^")]
|
||||||
if len(parts) >= 2:
|
|
||||||
last_name = parts[0]
|
last_name = parts[0] if len(parts) > 0 and parts[0] else "NAME"
|
||||||
first_name = parts[1]
|
first_name = parts[1] if len(parts) > 1 and parts[1] else "NO"
|
||||||
elif len(parts) == 1:
|
|
||||||
first_name = parts[0]
|
|
||||||
else:
|
else:
|
||||||
tokens = raw.split()
|
tokens = raw.split()
|
||||||
|
|
||||||
if len(tokens) >= 2:
|
if len(tokens) >= 2:
|
||||||
last_name = tokens[-1]
|
|
||||||
first_name = " ".join(tokens[:-1])
|
first_name = " ".join(tokens[:-1])
|
||||||
|
last_name = tokens[-1]
|
||||||
elif len(tokens) == 1:
|
elif len(tokens) == 1:
|
||||||
first_name = tokens[0]
|
first_name = tokens[0]
|
||||||
|
last_name = "NAME"
|
||||||
|
|
||||||
first_name = (first_name or "NO").upper()[:20]
|
first_name = first_name.upper()[:20]
|
||||||
last_name = (last_name or "NAME").upper()[:20]
|
last_name = last_name.upper()[:20]
|
||||||
return first_name, last_name
|
|
||||||
|
return last_name, first_name
|
||||||
|
|
||||||
def sanitize_astm_field(value, *, uppercase=False, max_len=None, allow_component_sep=False):
|
def sanitize_astm_field(value, *, uppercase=False, max_len=None, allow_component_sep=False):
|
||||||
"""
|
"""
|
||||||
@@ -2989,7 +3001,7 @@ def create_astm_order_message(order):
|
|||||||
sex = "M" if sex_raw.startswith("L") else "F"
|
sex = "M" if sex_raw.startswith("L") else "F"
|
||||||
|
|
||||||
# Lokasi / Ruangan (Field 26) sebaiknya berupa kode singkat agar tidak ditrunkasi LIS.
|
# Lokasi / Ruangan (Field 26) sebaiknya berupa kode singkat agar tidak ditrunkasi LIS.
|
||||||
raw_location = sanitize_astm_field(getattr(order, 'ruangan', "UT"), uppercase=True, max_len=40)
|
raw_location = sanitize_astm_field(getattr(order, 'ruangan', "UT"), uppercase=True, max_len=10)
|
||||||
location = re.sub(r"[^A-Z0-9]", "", raw_location)[:10]
|
location = re.sub(r"[^A-Z0-9]", "", raw_location)[:10]
|
||||||
if not location:
|
if not location:
|
||||||
location = "UT"
|
location = "UT"
|
||||||
@@ -3009,11 +3021,18 @@ def create_astm_order_message(order):
|
|||||||
# --- 2. KONSTRUKSI RECORD DENGAN INDEX PASTI ---
|
# --- 2. KONSTRUKSI RECORD DENGAN INDEX PASTI ---
|
||||||
|
|
||||||
# --- RECORD HEADER (H) ---
|
# --- RECORD HEADER (H) ---
|
||||||
head = r"H|\^&|||LIS||||||||1"
|
h_rec = [""] * 14
|
||||||
|
|
||||||
|
h_rec[0] = "H" # H,1 Record Type
|
||||||
|
h_rec[1] = r"\^&" # H,2 Delimiter
|
||||||
|
h_rec[4] = "MyLIS" # H,5 Sender Name
|
||||||
|
h_rec[12] = "V1.00" # H,13 Version
|
||||||
|
h_rec[13] = datetime.datetime.now().strftime("%Y%m%d%H%M%S") # H,14 Message DateTime
|
||||||
|
|
||||||
|
head = "|".join(h_rec)
|
||||||
# --- RECORD PATIENT (P) ---
|
# --- RECORD PATIENT (P) ---
|
||||||
# Kita buat array kosong sebanyak 30 kolom dulu
|
# Kita buat array kosong sebanyak 30 kolom dulu
|
||||||
p_rec = [""] * 30
|
p_rec = [""] * 35
|
||||||
p_rec[0] = "P" # Field 1: Record Type
|
p_rec[0] = "P" # Field 1: Record Type
|
||||||
p_rec[1] = "1" # Field 2: Sequence
|
p_rec[1] = "1" # Field 2: Sequence
|
||||||
p_rec[2] = pid # Field 3: Patient ID (Practice)
|
p_rec[2] = pid # Field 3: Patient ID (Practice)
|
||||||
@@ -3023,10 +3042,12 @@ def create_astm_order_message(order):
|
|||||||
p_rec[7] = "" # Field 8: Birthdate
|
p_rec[7] = "" # Field 8: Birthdate
|
||||||
p_rec[8] = sex # Field 9: Sex (Index 8)
|
p_rec[8] = sex # Field 9: Sex (Index 8)
|
||||||
# ... Field 10-25 biarkan kosong ...
|
# ... Field 10-25 biarkan kosong ...
|
||||||
p_rec[25] = location # Field 26: Location (Index 25)
|
p_rec[25] = "1" # Field 26: Location (Index 25)
|
||||||
|
p_rec[32] = "MIKRO" # Hospital Service
|
||||||
|
p_rec[33] = raw_location# Hospital Client (Raw, untuk referensi internal)
|
||||||
|
|
||||||
# Potong array sampai index 26 saja (sisanya buang) lalu gabung
|
# Potong array sampai index 26 saja (sisanya buang) lalu gabung
|
||||||
pat_str = "|".join(p_rec[:26])
|
pat_str = "|".join(p_rec[:35])
|
||||||
|
|
||||||
# --- RECORD ORDER (O) ---
|
# --- RECORD ORDER (O) ---
|
||||||
o_rec = [""] * 30
|
o_rec = [""] * 30
|
||||||
@@ -3057,7 +3078,7 @@ def create_astm_order_message(order):
|
|||||||
seq = "1"
|
seq = "1"
|
||||||
|
|
||||||
# Isi Frame: [Seq] [Data] [ETX]
|
# Isi Frame: [Seq] [Data] [ETX]
|
||||||
frame_body = f"{seq}{message_content}\x03"
|
frame_body = f"{seq}{message_content}\r\x03"
|
||||||
|
|
||||||
# Hitung Checksum
|
# Hitung Checksum
|
||||||
chk = calculate_astm_checksum(frame_body)
|
chk = calculate_astm_checksum(frame_body)
|
||||||
|
|||||||
Reference in New Issue
Block a user