690 lines
24 KiB
Python
690 lines
24 KiB
Python
"""Render deterministic diagnosis readonly, edit, and view-only references."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
from pathlib import Path
|
|
from typing import Any
|
|
|
|
os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
|
|
|
|
from PySide6.QtWidgets import QApplication
|
|
|
|
from doctor_workstation.core import PermissionSet
|
|
from doctor_workstation.ui import apply_theme
|
|
from doctor_workstation.ui.diagnosis_editors import DailyRecordEditorDialog
|
|
from doctor_workstation.ui.diagnosis_media import RecordingPlayerDialog
|
|
from doctor_workstation.ui.dialogs import diagnosis as diagnosis_module
|
|
from doctor_workstation.ui.dialogs.diagnosis import DiagnosisDialog
|
|
from doctor_workstation.ui.dialogs.prescription import PrescriptionEditorDialog
|
|
|
|
|
|
def _detail(*, locked: bool) -> dict[str, Any]:
|
|
diagnosis: dict[str, Any] = {
|
|
"id": 501,
|
|
"patient_id": 1501,
|
|
"patient_name": "林晓岚",
|
|
"phone": "13800138000",
|
|
"id_card": "110105199203071234",
|
|
"gender": 0,
|
|
"age": 34,
|
|
"marital_status": 1,
|
|
"height": 162,
|
|
"weight": 54.5,
|
|
"region": "浙江省杭州市",
|
|
"systolic_pressure": 146,
|
|
"diastolic_pressure": 92,
|
|
"fasting_blood_sugar": 8.2,
|
|
"diagnosis_type": "follow_up",
|
|
"diagnosis_date": "2026-08-10",
|
|
"status_desc": "诊疗中",
|
|
"channel_name": "健康顾问转介",
|
|
"statistical_visit_card": "第 4 次",
|
|
"current_medications": "二甲双胍",
|
|
"diabetes_discovery_year": "2019 年",
|
|
"local_hospital_diagnosis": ["2 型糖尿病", "高血压"],
|
|
"local_hospital_name": "杭州市第一人民医院",
|
|
"oral_condition": "口干",
|
|
"water_intake": "约 2200 ml",
|
|
"weight_change": "近月下降 1 kg",
|
|
"fatty_liver_degree": "轻度",
|
|
"diet_condition": ["偏甜", "夜宵"],
|
|
"body_feeling": ["乏力", "四肢沉重"],
|
|
"sleep_condition": "入睡稍慢",
|
|
"eye_condition": "偶有干涩",
|
|
"head_feeling": "午后头昏",
|
|
"sweat_condition": "易出汗",
|
|
"skin_condition": "皮肤偏干",
|
|
"urine_condition": "夜尿 2 次",
|
|
"stool_condition": "每日一次",
|
|
"kidney_condition": "腰酸",
|
|
"present_illness": "口渴、乏力反复半年,近期血糖波动。",
|
|
"past_history": "高血压病史 5 年。",
|
|
"trauma_history": 0,
|
|
"surgery_history": 0,
|
|
"allergy_history": 1,
|
|
"family_history": 1,
|
|
"pregnancy_history": 0,
|
|
"remark": "建议持续记录空腹及餐后血糖。",
|
|
"clinical_diagnosis": "气阴两虚",
|
|
"prescription_opinion": "益气养阴,兼顾活血。",
|
|
"has_prescription": 1,
|
|
"unserved_days": 4,
|
|
"patient_basic_locked": locked,
|
|
"can_edit_patient_basic": not locked,
|
|
"latest_prescription_order": {
|
|
"id": "RX-240810-09",
|
|
"fulfillment_status_text": "待配药",
|
|
},
|
|
}
|
|
return {
|
|
"diagnosis": diagnosis,
|
|
"patient": {
|
|
"id": 1501,
|
|
"patient_name": "林晓岚",
|
|
"phone": "13800138000",
|
|
"id_card": "110105199203071234",
|
|
"gender": 0,
|
|
"age": 34,
|
|
},
|
|
"appointment": {
|
|
"id": 2501,
|
|
"appointment_date": "2026-08-10",
|
|
"appointment_time": "09:00-09:30",
|
|
"period_text": "上午",
|
|
"doctor_name": "陈医生",
|
|
"assistant_name": "赵医助",
|
|
"status_desc": "已到诊",
|
|
"remark": "复诊评估",
|
|
},
|
|
}
|
|
|
|
|
|
class ScreenshotRepository:
|
|
"""No-network data source for visual artifact generation."""
|
|
|
|
def __init__(self, *, locked: bool) -> None:
|
|
self.detail = _detail(locked=locked)
|
|
|
|
def get_diagnosis_detail(self, diagnosis_id: int, **_kwargs: Any) -> dict[str, Any]:
|
|
if diagnosis_id != 501:
|
|
raise LookupError(diagnosis_id)
|
|
return self.detail
|
|
|
|
diagnosis_readonly_detail = get_diagnosis_detail
|
|
patient_detail = get_diagnosis_detail
|
|
|
|
def get_dictionary(self, dictionary_type: str) -> list[dict[str, Any]]:
|
|
if dictionary_type == "diagnosis_type":
|
|
return [
|
|
{"name": "初诊", "value": "first_visit"},
|
|
{"name": "复诊", "value": "follow_up"},
|
|
{"name": "会诊", "value": "consultation"},
|
|
]
|
|
if dictionary_type == "appetite":
|
|
return [
|
|
{"name": "口干", "value": "口干"},
|
|
{"name": "口苦", "value": "口苦"},
|
|
]
|
|
return []
|
|
|
|
def get_doctor_notes(self, diagnosis_id: int) -> list[dict[str, Any]]:
|
|
if diagnosis_id != 501:
|
|
raise LookupError(diagnosis_id)
|
|
return [
|
|
{
|
|
"id": 7001,
|
|
"create_time": "2026-08-10 09:20",
|
|
"doctor_name": "陈医生",
|
|
"content": "面色稍淡,舌淡红,苔薄白。",
|
|
"tongue_images": [{"url": "tongue.jpg"}],
|
|
"report_files": [
|
|
{
|
|
"name": "近期血糖趋势.pdf",
|
|
"url": "https://media.example.invalid/report.pdf",
|
|
}
|
|
],
|
|
}
|
|
]
|
|
|
|
def get_tracking_window(
|
|
self,
|
|
diagnosis_id: int,
|
|
*,
|
|
start_date: str = "",
|
|
end_date: str = "",
|
|
) -> dict[str, Any]:
|
|
if diagnosis_id != 501:
|
|
raise LookupError(diagnosis_id)
|
|
del start_date, end_date
|
|
return {
|
|
"blood_records": [
|
|
{
|
|
"id": 6101,
|
|
"diagnosis_id": 501,
|
|
"patient_id": 1501,
|
|
"record_date": "2026-08-10",
|
|
"fasting_blood_sugar": 8.2,
|
|
"systolic_pressure": 146,
|
|
"source": 1,
|
|
},
|
|
{
|
|
"id": 6102,
|
|
"diagnosis_id": 501,
|
|
"patient_id": 1501,
|
|
"record_date": "2026-08-10",
|
|
"postprandial_blood_sugar": 12.4,
|
|
"diastolic_pressure": 92,
|
|
"western_medicine": "二甲双胍",
|
|
},
|
|
{
|
|
"id": 6103,
|
|
"diagnosis_id": 501,
|
|
"patient_id": 1501,
|
|
"record_date": "2026-08-09",
|
|
"fasting_blood_sugar": 7.6,
|
|
"postprandial_blood_sugar": 10.8,
|
|
},
|
|
],
|
|
"diet_records": [
|
|
{
|
|
"id": 6201,
|
|
"diagnosis_id": 501,
|
|
"patient_id": 1501,
|
|
"record_date": "2026-08-10",
|
|
"breakfast_foods": "燕麦、鸡蛋",
|
|
"lunch_foods": "杂粮饭",
|
|
}
|
|
],
|
|
"exercise_records": [
|
|
{
|
|
"id": 6301,
|
|
"diagnosis_id": 501,
|
|
"patient_id": 1501,
|
|
"record_date": "2026-08-09",
|
|
"exercise_type": "散步",
|
|
"duration": 35,
|
|
"intensity": 2,
|
|
}
|
|
],
|
|
}
|
|
|
|
def list_tracking_notes(self, diagnosis_id: int) -> list[dict[str, Any]]:
|
|
if diagnosis_id != 501:
|
|
raise LookupError(diagnosis_id)
|
|
return [{"note_date": "2026-08-10", "content": "饭后散步,继续观察。"}]
|
|
|
|
def list_diagnosis_todos(self, diagnosis_id: int, **_kwargs: Any) -> dict[str, Any]:
|
|
if diagnosis_id != 501:
|
|
raise LookupError(diagnosis_id)
|
|
return {
|
|
"lists": [
|
|
{
|
|
"remind_time_text": "2026-08-12 09:00",
|
|
"content": "回访复测餐后血糖",
|
|
"status": 0,
|
|
"status_text": "待执行",
|
|
"creator_name": "陈医生",
|
|
"can_cancel": True,
|
|
"id": 7101,
|
|
}
|
|
],
|
|
"count": 1,
|
|
}
|
|
|
|
def list_prescriptions_by_diagnosis(self, diagnosis_id: int) -> list[dict[str, Any]]:
|
|
if diagnosis_id != 501:
|
|
raise LookupError(diagnosis_id)
|
|
return [
|
|
{
|
|
"id": 901,
|
|
"diagnosis_id": 501,
|
|
"prescription_date": "2026-08-02",
|
|
"global_visit_sequence": 4,
|
|
"prescription_type_text": "中药",
|
|
"prescription_summary": "玉泉丸加减",
|
|
"doctor_name": "陈医生",
|
|
"status_text": "已审核",
|
|
}
|
|
]
|
|
|
|
def appointment_history(self, **_kwargs: Any) -> dict[str, Any]:
|
|
return {
|
|
"lists": [
|
|
{
|
|
"id": 2501,
|
|
"status_desc": "已到诊",
|
|
"patient_name": "林晓岚",
|
|
"patient_phone": "13800138000",
|
|
"doctor_name": "陈医生",
|
|
"assistant_name": "赵医助",
|
|
"appointment_date": "2026-08-10",
|
|
"appointment_time": "09:00-09:30",
|
|
"appointment_type_text": "复诊",
|
|
"channel_name": "健康顾问",
|
|
"is_confirmed": 1,
|
|
"has_prescription": 1,
|
|
"remark": "复诊评估",
|
|
"create_time": "2026-08-08 11:20",
|
|
}
|
|
]
|
|
}
|
|
|
|
def assign_history(self, **_kwargs: Any) -> dict[str, Any]:
|
|
return {
|
|
"lists": [
|
|
{
|
|
"create_time": "2026-08-08 11:22",
|
|
"from_assistant_name": "王医助",
|
|
"to_assistant_name": "赵医助",
|
|
"is_inherit": 1,
|
|
"snapshot_order_creator_name": "王医助",
|
|
"snapshot_order_create_time": "2026-08-01 10:00",
|
|
"operator_name": "陈医生",
|
|
"operator_account": "doctor.chen",
|
|
"ip": "10.1.2.8",
|
|
}
|
|
]
|
|
}
|
|
|
|
def list_prescription_orders(self, **_kwargs: Any) -> dict[str, Any]:
|
|
return {
|
|
"lists": [
|
|
{
|
|
"id": 801,
|
|
"order_no": "RX-240810-09",
|
|
"global_visit_sequence": 4,
|
|
"statistics_count": 1,
|
|
"amount": "¥ 286.00",
|
|
"doctor_name": "陈医生",
|
|
"assistant_name": "赵医助",
|
|
"fulfillment_status_text": "待配药",
|
|
"create_time": "2026-08-10 09:24",
|
|
}
|
|
],
|
|
"count": 1,
|
|
}
|
|
|
|
def get_prescription_order(self, order_id: int) -> dict[str, Any]:
|
|
if order_id != 801:
|
|
raise LookupError(order_id)
|
|
return {
|
|
"id": order_id,
|
|
"order_no": "RX-240810-09",
|
|
"patient_name": "林晓岚",
|
|
"amount": 286,
|
|
"fulfillment_status_text": "待配药",
|
|
}
|
|
|
|
def add_blood_record(self, payload: dict[str, Any]) -> dict[str, Any]:
|
|
return {"id": 7201, **payload}
|
|
|
|
def add_diet_record(self, payload: dict[str, Any]) -> dict[str, Any]:
|
|
return {"id": 7202, **payload}
|
|
|
|
def add_exercise_record(self, payload: dict[str, Any]) -> dict[str, Any]:
|
|
return {"id": 7203, **payload}
|
|
|
|
def update_blood_record(
|
|
self, record: dict[str, Any], changes: dict[str, Any] | None = None
|
|
) -> dict[str, Any]:
|
|
return {**record, **(changes or {})}
|
|
|
|
def update_diet_record(
|
|
self, record: dict[str, Any], changes: dict[str, Any] | None = None
|
|
) -> dict[str, Any]:
|
|
return {**record, **(changes or {})}
|
|
|
|
def update_exercise_record(
|
|
self, record: dict[str, Any], changes: dict[str, Any] | None = None
|
|
) -> dict[str, Any]:
|
|
return {**record, **(changes or {})}
|
|
|
|
def add_tracking_note(self, diagnosis_id: int, content: str) -> dict[str, Any]:
|
|
return {"id": 7204, "diagnosis_id": diagnosis_id, "content": content}
|
|
|
|
def add_diagnosis_todo(
|
|
self, diagnosis_id: int, content: str, remind_time: int
|
|
) -> dict[str, Any]:
|
|
return {
|
|
"id": 7205,
|
|
"diagnosis_id": diagnosis_id,
|
|
"content": content,
|
|
"remind_time": remind_time,
|
|
}
|
|
|
|
def cancel_diagnosis_todo(self, todo_id: int) -> dict[str, Any]:
|
|
return {"id": todo_id, "status": 2}
|
|
|
|
def add_doctor_note(self, diagnosis_id: int, content: str = "", **_kwargs: Any) -> Any:
|
|
return {"id": 7206, "diagnosis_id": diagnosis_id, "content": content}
|
|
|
|
def delete_doctor_note_image(self, note_id: int, image_type: str, image_path: str) -> Any:
|
|
return {"note_id": note_id, "image_type": image_type, "image_path": image_path}
|
|
|
|
def upload_material(self, path: str, material_type: str) -> str:
|
|
return f"https://media.example.invalid/{material_type}/{Path(path).name}"
|
|
|
|
def create_prescription(self, prescription: dict[str, Any]) -> Any:
|
|
return {"id": 7207, **prescription}
|
|
|
|
def set_revisit_slot_start_offset(self, diagnosis_id: int, offset: int) -> Any:
|
|
return {"id": diagnosis_id, "revisit_slot_start_offset": offset}
|
|
|
|
def list_call_records(self, diagnosis_id: int) -> list[dict[str, Any]]:
|
|
return [
|
|
{
|
|
"id": 7208,
|
|
"diagnosis_id": diagnosis_id,
|
|
"recording_urls_list": [
|
|
"https://media.example.invalid/replay.mp4",
|
|
"https://media.example.invalid/replay-backup.m3u8",
|
|
"https://media.example.invalid/replay.webm",
|
|
],
|
|
"start_time_text": "2026-08-10 09:10:00",
|
|
"end_time_text": "2026-08-10 09:22:00",
|
|
"call_type_text": "视频",
|
|
"room_id": "demo-room-501",
|
|
"duration_text": "12分00秒",
|
|
"status_text": "已结束",
|
|
"recording_status_text": "录制完成",
|
|
}
|
|
]
|
|
|
|
def upload_call_recording(
|
|
self, path: str, diagnosis_id: int, *, call_record_id: int | None = None
|
|
) -> dict[str, Any]:
|
|
return {
|
|
"diagnosis_id": diagnosis_id,
|
|
"call_record_id": call_record_id,
|
|
"file_url": Path(path).name,
|
|
}
|
|
|
|
def list_im_chat_messages(
|
|
self, diagnosis_id: int, *, only_archived: bool = True
|
|
) -> dict[str, Any]:
|
|
del diagnosis_id
|
|
return {
|
|
"only_archived": only_archived,
|
|
"lists": [
|
|
{
|
|
"msg_id": "chat-1",
|
|
"msg_type": "text",
|
|
"text": "今天空腹血糖 5.8。",
|
|
"is_from_doctor": False,
|
|
"time": "2026-08-10 08:30",
|
|
},
|
|
{
|
|
"msg_id": "chat-2",
|
|
"msg_type": "image",
|
|
"image_url": "https://media.example.invalid/blood.jpg",
|
|
"is_from_doctor": False,
|
|
"time": "2026-08-10 08:31",
|
|
},
|
|
{
|
|
"msg_id": "chat-3",
|
|
"msg_type": "file",
|
|
"file_url": "https://media.example.invalid/report.pdf",
|
|
"file_name": "复查报告.pdf",
|
|
"is_from_doctor": True,
|
|
"from_staff_name": "陈医生",
|
|
"time": "2026-08-10 08:40",
|
|
},
|
|
],
|
|
}
|
|
|
|
def sync_im_chat_messages(self, diagnosis_id: int) -> dict[str, Any]:
|
|
return {"diagnosis_id": diagnosis_id, "queued": True}
|
|
|
|
|
|
class EmptyScreenshotRepository(ScreenshotRepository):
|
|
def get_doctor_notes(self, diagnosis_id: int) -> list[dict[str, Any]]:
|
|
del diagnosis_id
|
|
return []
|
|
|
|
def list_prescriptions_by_diagnosis(self, diagnosis_id: int) -> list[dict[str, Any]]:
|
|
del diagnosis_id
|
|
return []
|
|
|
|
def list_prescription_orders(self, **_kwargs: Any) -> dict[str, Any]:
|
|
return {"lists": [], "count": 0}
|
|
|
|
|
|
class FailingScreenshotRepository(ScreenshotRepository):
|
|
def get_diagnosis_detail(self, diagnosis_id: int, **_kwargs: Any) -> dict[str, Any]:
|
|
del diagnosis_id
|
|
raise RuntimeError("诊单详情加载失败,请检查网络后重试")
|
|
|
|
|
|
def _run_immediately(
|
|
function: Any,
|
|
*args: Any,
|
|
on_success: Any = None,
|
|
on_error: Any = None,
|
|
on_finished: Any = None,
|
|
**_kwargs: Any,
|
|
) -> object:
|
|
try:
|
|
result = function(*args)
|
|
except Exception as error:
|
|
if on_error:
|
|
on_error(error)
|
|
else:
|
|
if on_success:
|
|
on_success(result)
|
|
finally:
|
|
if on_finished:
|
|
on_finished()
|
|
return object()
|
|
|
|
|
|
def render() -> list[Path]:
|
|
app = QApplication.instance() or QApplication([])
|
|
apply_theme(app)
|
|
diagnosis_module.run_async = _run_immediately
|
|
root = Path(__file__).resolve().parents[1]
|
|
output = root / "artifacts" / "diagnosis_visual"
|
|
output.mkdir(parents=True, exist_ok=True)
|
|
rendered: list[Path] = []
|
|
for width, height in ((1024, 640), (1440, 900)):
|
|
for mode in ("readonly", "edit", "viewonly"):
|
|
dialog = DiagnosisDialog(
|
|
ScreenshotRepository(locked=mode == "viewonly"),
|
|
permissions=PermissionSet(["*"]),
|
|
)
|
|
dialog.resize(width, height)
|
|
if mode == "readonly":
|
|
dialog.open_for(501, editable=False)
|
|
elif mode == "edit":
|
|
dialog.open_for(501, editable=True)
|
|
else:
|
|
dialog.open_view_only(501)
|
|
for _ in range(8):
|
|
app.processEvents()
|
|
if mode == "readonly":
|
|
dialog.readonly_scroll.verticalScrollBar().setValue(0)
|
|
else:
|
|
dialog.tabs.setCurrentIndex(0)
|
|
app.processEvents()
|
|
path = output / f"diagnosis_{mode}_{width}x{height}.png"
|
|
if not dialog.grab().save(str(path), "PNG"):
|
|
raise RuntimeError(f"failed to save {path}")
|
|
rendered.append(path)
|
|
dialog.close()
|
|
app.processEvents()
|
|
|
|
def save_state(dialog: DiagnosisDialog, name: str, *, close: bool = True) -> None:
|
|
for _ in range(8):
|
|
app.processEvents()
|
|
path = output / f"diagnosis_state_{name}_1024x640.png"
|
|
if not dialog.grab().save(str(path), "PNG"):
|
|
raise RuntimeError(f"failed to save {path}")
|
|
rendered.append(path)
|
|
if close:
|
|
dialog.close()
|
|
app.processEvents()
|
|
|
|
def save_widget(widget: Any, name: str) -> None:
|
|
widget.show()
|
|
for _ in range(6):
|
|
app.processEvents()
|
|
path = output / f"diagnosis_state_{name}.png"
|
|
if not widget.grab().save(str(path), "PNG"):
|
|
raise RuntimeError(f"failed to save {path}")
|
|
rendered.append(path)
|
|
widget.close()
|
|
app.processEvents()
|
|
|
|
pending: list[dict[str, Any]] = []
|
|
|
|
def queue_async(function: Any, **options: Any) -> object:
|
|
pending.append({"function": function, **options})
|
|
return object()
|
|
|
|
diagnosis_module.run_async = queue_async
|
|
loading = DiagnosisDialog(ScreenshotRepository(locked=False), permissions=PermissionSet(["*"]))
|
|
loading.resize(1024, 640)
|
|
loading.open_for(501, editable=True)
|
|
save_state(loading, "loading")
|
|
|
|
diagnosis_module.run_async = _run_immediately
|
|
error = DiagnosisDialog(
|
|
FailingScreenshotRepository(locked=False), permissions=PermissionSet(["*"])
|
|
)
|
|
error.resize(1024, 640)
|
|
error.open_for(501, editable=True, seed=_detail(locked=False))
|
|
save_state(error, "error")
|
|
|
|
empty = DiagnosisDialog(
|
|
EmptyScreenshotRepository(locked=False), permissions=PermissionSet(["*"])
|
|
)
|
|
empty.resize(1024, 640)
|
|
empty.open_for(501, editable=True)
|
|
empty_index = next(
|
|
index
|
|
for index in range(empty.tabs.count())
|
|
if empty.tabs.tabBar().tabData(index) == "prescription"
|
|
)
|
|
empty.tabs.setCurrentIndex(empty_index)
|
|
save_state(empty, "empty")
|
|
|
|
permission = DiagnosisDialog(
|
|
ScreenshotRepository(locked=True),
|
|
permissions=PermissionSet(["tcm.diagnosis/readonlyDetail"]),
|
|
)
|
|
permission.resize(1024, 640)
|
|
permission.open_view_only(501)
|
|
save_state(permission, "permission")
|
|
|
|
daily = DiagnosisDialog(ScreenshotRepository(locked=False), permissions=PermissionSet(["*"]))
|
|
daily.resize(1024, 640)
|
|
daily.open_for(501, editable=True)
|
|
daily_index = next(
|
|
index
|
|
for index in range(daily.tabs.count())
|
|
if daily.tabs.tabBar().tabData(index) == "daily"
|
|
)
|
|
daily.tabs.setCurrentIndex(daily_index)
|
|
save_state(daily, "daily", close=False)
|
|
daily_page = daily._tab_pages["daily"]
|
|
daily_page.verticalScrollBar().setValue(daily_page.verticalScrollBar().maximum())
|
|
save_state(daily, "daily_lower")
|
|
|
|
focus = DiagnosisDialog(ScreenshotRepository(locked=False), permissions=PermissionSet(["*"]))
|
|
focus.resize(1024, 640)
|
|
focus.open_for(501, editable=True)
|
|
focus.edit_fields["patient_name"].setFocus()
|
|
save_state(focus, "focus")
|
|
|
|
save_states = DiagnosisDialog(
|
|
ScreenshotRepository(locked=False), permissions=PermissionSet(["*"])
|
|
)
|
|
save_states.resize(1024, 640)
|
|
save_states.open_for(501, editable=True)
|
|
save_states.save_button.set_state("loading")
|
|
save_state(save_states, "save_loading", close=False)
|
|
save_states.save_button.set_state("success")
|
|
save_state(save_states, "save_success", close=False)
|
|
save_states.save_button.set_state("error")
|
|
save_state(save_states, "save_failure")
|
|
|
|
for tab_key, state_name in (
|
|
("notes", "notes_actions"),
|
|
("video", "video_replay"),
|
|
("chat", "chat_archive"),
|
|
("orders", "order_offset"),
|
|
):
|
|
dialog = DiagnosisDialog(
|
|
ScreenshotRepository(locked=False), permissions=PermissionSet(["*"])
|
|
)
|
|
dialog.resize(1024, 640)
|
|
dialog.open_for(501, editable=True)
|
|
index = next(
|
|
item
|
|
for item in range(dialog.tabs.count())
|
|
if dialog.tabs.tabBar().tabData(item) == tab_key
|
|
)
|
|
dialog.tabs.setCurrentIndex(index)
|
|
save_state(dialog, state_name, close=False)
|
|
if tab_key == "orders":
|
|
order_detail = dialog._build_order_detail_dialog(
|
|
dialog.repository.get_prescription_order(801), 801
|
|
)
|
|
save_widget(order_detail, "order_detail_640x540")
|
|
elif tab_key == "video":
|
|
video_table = dialog._table_registry["video"][1]
|
|
video_table.horizontalScrollBar().setValue(video_table.horizontalScrollBar().maximum())
|
|
save_state(dialog, "video_upload_action", close=False)
|
|
player = RecordingPlayerDialog(
|
|
"https://media.example.invalid/replay.mp4", parent=dialog
|
|
)
|
|
save_widget(player, "video_player_820x560")
|
|
dialog.close()
|
|
app.processEvents()
|
|
|
|
daily_editor = DailyRecordEditorDialog(
|
|
"blood",
|
|
{
|
|
"id": 6101,
|
|
"diagnosis_id": 501,
|
|
"patient_id": 1501,
|
|
"record_date": "2026-08-10",
|
|
"record_time": "08:20",
|
|
"fasting_blood_sugar": 8.2,
|
|
"postprandial_blood_sugar": 12.4,
|
|
"systolic_pressure": 146,
|
|
"diastolic_pressure": 92,
|
|
"western_medicine": "二甲双胍",
|
|
"remark": "继续观察餐后波动。",
|
|
},
|
|
)
|
|
daily_editor.setStyleSheet(diagnosis_module.DIAGNOSIS_QSS)
|
|
save_widget(daily_editor, "daily_blood_edit_650x620")
|
|
|
|
prescription = PrescriptionEditorDialog(
|
|
ScreenshotRepository(locked=False),
|
|
{
|
|
"diagnosis_id": 501,
|
|
"appointment_id": 2501,
|
|
"patient_name": "林晓岚",
|
|
"gender": 0,
|
|
"age": 34,
|
|
"visit_no": "1K00002501",
|
|
"tongue": "舌淡红、苔薄白",
|
|
"pulse": "脉细",
|
|
"clinical_diagnosis": "气阴两虚",
|
|
"doctor_name": "陈医生",
|
|
},
|
|
mode="add",
|
|
current_user={"id": 1, "name": "陈医生"},
|
|
)
|
|
prescription.setObjectName("DiagnosisPrescriptionEditor")
|
|
prescription.setStyleSheet(diagnosis_module.DIAGNOSIS_QSS)
|
|
save_widget(prescription, "prescription_editor_920x780")
|
|
return rendered
|
|
|
|
|
|
if __name__ == "__main__":
|
|
for path in render():
|
|
print(path)
|