"""Render deterministic prescription-editor drawer references.""" from __future__ import annotations import os from pathlib import Path from types import SimpleNamespace from typing import Any os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") from PySide6.QtWidgets import QApplication, QWidget from doctor_workstation.core.permissions import PermissionSet from doctor_workstation.ui import apply_theme from doctor_workstation.ui.dialogs.prescription import ( PrescriptionDetailDialog, PrescriptionEditorDialog, ) from doctor_workstation.ui.dialogs.prescription_ai import PrescriptionAiReportDialog class VisualRepository: def list_medicines(self, **_filters: Any) -> dict[str, Any]: return {"lists": [], "count": 0} def list_prescription_template_ai_reports(self, template_id: int) -> dict[str, Any]: report = { "summary": "益气健脾为主,兼顾养阴安神,适合脾气不足、气阴两虚方向的复核参考。", "possible_symptoms": ["乏力气短", "食少便溏", "睡眠不安"], "main_indications": "气阴两虚、脾气不足所见的倦怠与纳差。", "efficacy": ["益气健脾", "养阴生津", "宁心安神"], "suitable_people": ["辨证属气阴两虚者", "需由医师结合四诊确认"], "compatibility_analysis": "黄芪、党参、白术与茯苓协同补气健脾,麦冬、五味子兼顾养阴敛津,酸枣仁与远志用于宁心安神。", "cautions": ["仍需核对过敏史与现用药", "症状变化时及时复诊"], "disclaimer": "仅供专业人员辅助审方,不替代辨证、诊断和处方审核。", } return { "prescription_id": template_id, "can_refresh": True, "can_edit": True, "reports": [ { "report_id": 21, "model_key": "qwen", "model_label": "千问", "model_name": "qwen3.6-35b", "generated_at": "2026-08-13 10:32:00", "report": report, "is_stale": False, "is_edited": True, }, { "report_id": 22, "model_key": "openai", "model_label": "OpenAI", "model_name": "gpt-5.6-sol", "generated_at": "2026-08-13 10:32:00", "report": report, "is_stale": False, "is_edited": False, }, ], } def _seed() -> dict[str, Any]: return { "diagnosis_id": 501, "id": 2501, "appointment_id": 2501, "prescription_no": "RX202608130021", "patient_name": "林晓岚", "phone": "13800138000", "gender": 0, "age": 34, "visit_no": "1K00002501", "prescription_date": "2026-08-11", "tongue": "舌淡红、苔薄白", "pulse": "面色少华", "pulse_condition": "脉细", "clinical_diagnosis": "气阴两虚,脾气不足", "prescription_type": "浓缩水丸", "dosage_amount": 3, "dosage_unit": "g", "dosage_bag_count": 2, "dose_count": 7, "dose_unit": "剂", "usage_days": 7, "times_per_day": 2, "usage_instruction": "早晚各一次,温水送服", "usage_time": "饭后", "usage_way": "温水送服", "dietary_taboo": ["生冷食物", "浓茶"], "usage_notes": "服药期间规律记录空腹及餐后血糖。", "aux_usage": { "dosage_amount": 2, "dosage_bag_count": 1, "times_per_day": 1, "usage_days": 7, "prescription_name": "宁心辅方", }, "doctor_name": "陈医生", "audit_status": 1, "create_time": "2026-08-13 10:26:00", "herbs": [ {"medicine_id": 11, "name": "黄芪", "dosage": 15, "formula_type": "主方"}, {"medicine_id": 12, "name": "党参", "dosage": 12, "formula_type": "主方"}, {"medicine_id": 13, "name": "白术", "dosage": 10, "formula_type": "主方"}, {"medicine_id": 14, "name": "茯苓", "dosage": 12, "formula_type": "主方"}, {"medicine_id": 15, "name": "麦冬", "dosage": 9, "formula_type": "主方"}, {"medicine_id": 16, "name": "五味子", "dosage": 6, "formula_type": "主方"}, {"medicine_id": 17, "name": "酸枣仁", "dosage": 12, "formula_type": "辅方"}, {"medicine_id": 18, "name": "远志", "dosage": 6, "formula_type": "辅方"}, ], } def _make_editor(host: QWidget) -> PrescriptionEditorDialog: editor = PrescriptionEditorDialog( VisualRepository(), _seed(), mode="add", current_user=SimpleNamespace(id=1, name="陈医生"), parent=host, ) return editor def _settle(app: QApplication, rounds: int = 8) -> None: for _ in range(rounds): app.processEvents() def render() -> list[Path]: app = QApplication.instance() or QApplication([]) apply_theme(app) output = Path(__file__).resolve().parents[1] / "artifacts" / "subwindow_exact" output.mkdir(parents=True, exist_ok=True) rendered: list[Path] = [] host = QWidget() host.resize(1440, 900) host.show() editor = _make_editor(host) editor.show() _settle(app) editor.body_scroll.verticalScrollBar().setValue(0) _settle(app, 4) path = output / "prescription_editor_860x900.png" if not editor.grab().save(str(path), "PNG"): raise RuntimeError(f"failed to save {path}") rendered.append(path) editor.close() host.close() detail = PrescriptionDetailDialog( _seed(), can_open_diagnosis=True, can_open_orders=True, ) detail.show() _settle(app, 10) path = output / "prescription_detail_920x780.png" if not detail.grab().save(str(path), "PNG"): raise RuntimeError(f"failed to save {path}") rendered.append(path) detail.close() _settle(app, 2) ai_dialog = PrescriptionAiReportDialog( VisualRepository(), PermissionSet(["*", "tcm.prescriptionLibrary/editAiReport"]), ) ai_dialog.open_for( { "id": 2501, "prescription_name": "益气养阴安神方", "formula_type": "主方", "herbs": _seed()["herbs"], } ) ai_dialog.show() _settle(app, 16) path = output / "prescription_ai_report_920x760.png" if not ai_dialog.grab().save(str(path), "PNG"): raise RuntimeError(f"failed to save {path}") rendered.append(path) ai_dialog.close() _settle(app, 2) return rendered if __name__ == "__main__": for rendered_path in render(): print(rendered_path)