Files
his/scripts/check_surgery_advice.py

161 lines
5.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
诊断脚本:检查手术医嘱是否正确保存和显示
"""
import psycopg2
import json
from datetime import datetime
# 数据库配置
DB_CONFIG = {
"host": "localhost",
"port": 5432,
"database": "his",
"user": "postgres",
"password": "postgres",
}
def check_surgery_advice():
"""检查最近保存的手术医嘱"""
try:
conn = psycopg2.connect(**DB_CONFIG)
cursor = conn.cursor()
print("=" * 80)
print("手术医嘱诊断报告")
print("=" * 80)
print(f"查询时间: {datetime.now()}")
print()
# 1. 查询最近的手术医嘱category_enum = 4
print("1. 查询最近保存的手术医嘱:")
print("-" * 80)
cursor.execute("""
SELECT
id,
category_enum,
activity_id,
content_json,
patient_id,
encounter_id,
create_time
FROM wor_service_request
WHERE category_enum = 4
AND delete_flag = '0'
ORDER BY create_time DESC
LIMIT 5
""")
rows = cursor.fetchall()
if not rows:
print("⚠️ 没有找到手术医嘱记录category_enum = 4")
else:
for row in rows:
print(f"\n手术医嘱 ID: {row[0]}")
print(f" category_enum: {row[1]}")
print(f" activity_id: {row[2]}")
print(f" patient_id: {row[4]}")
print(f" encounter_id: {row[5]}")
print(f" create_time: {row[6]}")
# 解析 content_json
try:
content = json.loads(row[3]) if row[3] else {}
surgery_name = content.get("surgeryName", "NOT FOUND")
surgery_code = content.get("surgeryCode", "NOT FOUND")
print(f" content_json.surgeryName: {surgery_name}")
print(f" content_json.surgeryCode: {surgery_code}")
if surgery_name == "NOT FOUND" or not surgery_name:
print(" ❌ 警告: content_json 中没有 surgeryName")
else:
print(" ✅ surgeryName 已正确保存")
except Exception as e:
print(f" ❌ 解析 content_json 失败: {e}")
print(f" 原始内容: {row[3]}")
print("\n" + "=" * 80)
# 2. 测试 SQL 查询是否能正确获取 advice_name
print("\n2. 测试 SQL 查询是否能正确获取手术名称:")
print("-" * 80)
cursor.execute("""
SELECT
wsr.id,
COALESCE(wad.NAME, wsr.content_json::jsonb->>'surgeryName', wsr.content_json::jsonb->>'adviceName') AS advice_name,
wsr.content_json::jsonb->>'surgeryName' AS surgery_name_from_json,
wad.NAME AS activity_name,
wsr.category_enum
FROM wor_service_request wsr
LEFT JOIN wor_activity_definition wad ON wad.ID = wsr.activity_id AND wad.delete_flag = '0'
WHERE wsr.category_enum = 4
AND wsr.delete_flag = '0'
ORDER BY wsr.create_time DESC
LIMIT 5
""")
rows = cursor.fetchall()
if not rows:
print("⚠️ 没有找到手术医嘱记录")
else:
for row in rows:
print(f"\n手术医嘱 ID: {row[0]}")
print(f" COALESCE advice_name: {row[1]}")
print(f" surgeryName from JSON: {row[2]}")
print(f" activity_definition name: {row[3]}")
print(f" category_enum: {row[4]}")
if not row[1]:
print(" ❌ 警告: advice_name 为空!")
else:
print(" ✅ advice_name 可以正确获取")
print("\n" + "=" * 80)
# 3. 检查是否存在 activity_id 对应的 wor_activity_definition
print("\n3. 检查手术医嘱的 activity_id 关联:")
print("-" * 80)
cursor.execute("""
SELECT
wsr.id,
wsr.activity_id,
wad.id AS def_id,
wad.name AS def_name,
CASE WHEN wad.id IS NULL THEN 'MISSING' ELSE 'OK' END AS status
FROM wor_service_request wsr
LEFT JOIN wor_activity_definition wad ON wad.ID = wsr.activity_id
WHERE wsr.category_enum = 4
AND wsr.delete_flag = '0'
ORDER BY wsr.create_time DESC
LIMIT 5
""")
rows = cursor.fetchall()
for row in rows:
status_icon = "" if row[4] == "OK" else ""
print(
f"{status_icon} service_request.id={row[0]}, activity_id={row[1]}, definition={row[3] or 'NULL'}"
)
print("\n" + "=" * 80)
print("诊断完成")
print("=" * 80)
cursor.close()
conn.close()
except Exception as e:
print(f"❌ 诊断失败: {e}")
import traceback
traceback.print_exc()
if __name__ == "__main__":
check_surgery_advice()