using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.UI; public class PatientInfoPanel : BasePanel { [Header("患者信息输入")] public TMP_InputField NameInput; public TMP_InputField AdmissionIdInput; public TMP_Dropdown GenderDropdown; // 0: 男, 1: 女 public TMP_InputField AgeInput; public TMP_InputField HeightInput; public TMP_InputField WeightInput; // public TMP_InputField IdNumberInput; [Header("按钮控制")] public Button HomeButton; public Button ConfirmButton; public Button BackButton; public Button LoadFromFileButton; // 从文件加载按钮 public Button ExportToFileButton; // 导出到文件按钮 // public Button StartSessionButton; // 开始会话按钮 [Header("会话状态显示")] // public GameObject SessionStatusPanel; // 会话状态面板 // public TextMeshProUGUI SessionStatusText; // 会话状态文本 // public TextMeshProUGUI AdminUserText; // 管理员用户显示 // public Button EndSessionButton; // 结束会话按钮 private PatientInfoSettingsViewModel _vm; private IPatientInfoService _patientService; // private PatientSessionService _sessionService; private IAuthenticationService _authService; private TabNavigationSystem _tabNavigation; public override void Init() { InitializeButtons(); InitializeServices(); InitializeFieldDisplay(); // InitializeTabNavigation(); // UpdateUI(); LoadCurrentPatientInfo(); // 延迟设置自定义键盘,确保 CustomKeyboardManager 已初始化 StartCoroutine(SetupCustomKeyboardDelayed()); } private System.Collections.IEnumerator SetupCustomKeyboardDelayed() { // 等待一帧确保所有 Awake 都已执行 yield return null; // 检查 CustomKeyboardManager 是否存在 if (CustomKeyboardManager.Instance == null) { Debug.LogError("CustomKeyboardManager not found in scene! Please add CustomKeyboardManager to Canvas."); yield break; } DisableSystemKeyboardForInputFields(); } private void InitializeButtons() { if (HomeButton != null) { HomeButton.onClick.AddListener(() => ReturnToHome()); } if (ConfirmButton != null) { ConfirmButton.onClick.AddListener(ApplyAndBack); } if (BackButton != null) { BackButton.onClick.AddListener(() => ClosePanel()); } if (LoadFromFileButton != null) { LoadFromFileButton.onClick.AddListener(OnLoadFromFileClicked); } if (ExportToFileButton != null) { ExportToFileButton.onClick.AddListener(OnExportToFileClicked); } // if (StartSessionButton != null) // { // StartSessionButton.onClick.AddListener(OnStartSessionClicked); // } // if (EndSessionButton != null) // { // EndSessionButton.onClick.AddListener(OnEndSessionClicked); // } } private void InitializeFieldDisplay() { SetInputPlaceholder(NameInput, "请输入患者姓名"); SetInputPlaceholder(AdmissionIdInput, "请输入住院号"); SetInputPlaceholder(AgeInput, "年龄(岁)"); SetInputPlaceholder(HeightInput, "身高(cm)"); SetInputPlaceholder(WeightInput, "体重(kg)"); } private void SetInputPlaceholder(TMP_InputField inputField, string placeholder) { if (inputField?.placeholder == null) { return; } var placeholderText = inputField.placeholder.GetComponent(); if (placeholderText != null) { placeholderText.text = placeholder; } } private void InitializeServices() { _vm = new PatientInfoSettingsViewModel(); _vm.OnPatientInfoSaved += OnPatientInfoSaved; _patientService = ServiceLocator.Get(); // _sessionService = ServiceLocator.Get(); _authService = ServiceLocator.Get(); // 注册会话事件 // if (_sessionService != null) // { // _sessionService.OnSessionStarted += OnSessionStarted; // _sessionService.OnSessionEnded += OnSessionEnded; // } } private void ApplyAndBack() { var info = new PatientInfo { Name = NameInput?.text ?? "", HospitalId = AdmissionIdInput?.text ?? "", Gender = GenderDropdown?.value == 1 ? "女" : "男", Age = int.TryParse(AgeInput?.text ?? "0", out int age) ? age : 0, Height = float.TryParse(HeightInput?.text ?? "0", out float height) ? height : 0f, Weight = float.TryParse(WeightInput?.text ?? "0", out float weight) ? weight : 0f, // IdNumber = IdNumberInput?.text ?? "" }; _vm.SavePatientInfo(info); } private void LoadCurrentPatientInfo() { if (_patientService != null) { var info = _patientService.GetCurrentPatient(); if (info != null) { PopulateFields(info); } else { ClearFields(); } } } /// /// 从文件加载病人信息 /// private void OnLoadFromFileClicked() { // 显示文件选择对话框 FileSelectionDialog.Show( "选择病人信息文件", _patientService?.GetFileFilter() ?? "所有文件|*.*", (filePath) => { if (!string.IsNullOrEmpty(filePath)) { LoadPatientFromFile(filePath); } }, () => Debug.Log("取消文件选择") ); } /// /// 导出病人信息到文件(包含测量数据) /// private void OnExportToFileClicked() { var currentPatient = GetCurrentInputPatient(); if (string.IsNullOrEmpty(currentPatient.Name)) { ConfirmDialog.Show("提示", "请先填写病人信息再导出", () => { }); return; } // 检查是否有会话数据 // bool hasSessionData = _sessionService?.IsSessionActive ?? false; bool hasSessionData = false; string dialogTitle = hasSessionData ? "导出完整患者数据" : "导出患者基本信息"; string defaultFileName = hasSessionData ? $"{currentPatient.Name}_完整数据_{System.DateTime.Now:yyyyMMdd_HHmmss}.json" : $"{currentPatient.Name}_基本信息.json"; // 显示保存文件对话框 FileSelectionDialog.ShowSave( dialogTitle, "JSON文件|*.json|CSV文件|*.csv", defaultFileName, (filePath) => { if (!string.IsNullOrEmpty(filePath)) { if (hasSessionData && _patientService != null) { var success = _patientService.ExportCompletePatientData(currentPatient, filePath); var message = success ? "完整患者数据导出成功" : "完整患者数据导出失败"; ConfirmDialog.Show(success ? "成功" : "错误", message, () => { }); } else { ExportPatientToFile(currentPatient, filePath); } } }, () => Debug.Log("取消文件保存") ); } private void LoadPatientFromFile(string filePath) { if (_patientService != null) { var patient = _patientService.LoadPatientFromFile(filePath); if (patient != null) { PopulateFields(patient); ConfirmDialog.Show("成功", $"成功加载病人信息:{patient.Name}", () => { }); } else { ConfirmDialog.Show("错误", "文件加载失败,请检查文件格式", () => { }); } } } private void ExportPatientToFile(PatientInfo patient, string filePath) { if (_patientService != null) { bool success = _patientService.ExportPatientToFile(patient, filePath); if (success) { ConfirmDialog.Show("成功", "病人信息导出成功", () => { }); } else { ConfirmDialog.Show("错误", "文件导出失败", () => { }); } } } private PatientInfo GetCurrentInputPatient() { return new PatientInfo { Name = NameInput?.text ?? "", HospitalId = AdmissionIdInput?.text ?? "", Gender = GenderDropdown?.value == 1 ? "女" : "男", Age = int.TryParse(AgeInput?.text ?? "0", out int age) ? age : 0, Height = float.TryParse(HeightInput?.text ?? "0", out float height) ? height : 0f, Weight = float.TryParse(WeightInput?.text ?? "0", out float weight) ? weight : 0f, // IdNumber = IdNumberInput?.text ?? "" }; } /// /// 初始化Tab导航 /// private void InitializeTabNavigation() { // 添加或获取Tab导航组件 _tabNavigation = GetComponent(); if (_tabNavigation == null) { _tabNavigation = gameObject.AddComponent(); } // 手动设置导航顺序 _tabNavigation.NavigationOrder.Clear(); _tabNavigation.AutoDetectInputFields = false; // 手动设置顺序 // 按逻辑顺序添加InputField if (NameInput != null) _tabNavigation.AddNavigationElement(NameInput); if (AdmissionIdInput != null) _tabNavigation.AddNavigationElement(AdmissionIdInput); if (GenderDropdown != null) _tabNavigation.AddNavigationElement(GenderDropdown); if (AgeInput != null) _tabNavigation.AddNavigationElement(AgeInput); if (HeightInput != null) _tabNavigation.AddNavigationElement(HeightInput); if (WeightInput != null) _tabNavigation.AddNavigationElement(WeightInput); // if (IdNumberInput != null) _tabNavigation.AddNavigationElement(IdNumberInput); Debug.Log($"PatientInfoPanel: 初始化Tab导航,共 {_tabNavigation.NavigationOrder.Count} 个输入框"); } private void OnPatientInfoSaved(bool success, string message) { if (success) { // 保存成功,返回主界面 ClosePanel(); } else { // 显示错误信息 ConfirmDialog.Show("保存病人信息失败:", message, () => { }); // Debug.LogError($"保存病人信息失败: {message}"); } } private void PopulateFields(PatientInfo info) { if (NameInput != null) NameInput.text = info.Name ?? ""; if (AdmissionIdInput != null) AdmissionIdInput.text = info.HospitalId ?? ""; if (GenderDropdown != null) GenderDropdown.value = info.Gender == "女" ? 1 : 0; if (AgeInput != null) AgeInput.text = info.Age == 0 ? "" : info.Age.ToString(); if (HeightInput != null) HeightInput.text = info.Height == 0 ? "" : info.Height.ToString(); if (WeightInput != null) WeightInput.text = info.Weight == 0 ? "" : info.Weight.ToString(); // if (IdNumberInput != null) IdNumberInput.text = info.IdNumber ?? ""; } private void ClearFields() { if (NameInput != null) NameInput.text = ""; if (AdmissionIdInput != null) AdmissionIdInput.text = ""; if (GenderDropdown != null) GenderDropdown.value = 0; if (AgeInput != null) AgeInput.text = ""; if (HeightInput != null) HeightInput.text = ""; if (WeightInput != null) WeightInput.text = ""; } // public void ClosePanel() // { // UIManager.Instance.HidePanel(); // } #region 会话管理方法 /// /// 开始患者会话 /// private void OnStartSessionClicked() { var currentPatient = GetCurrentInputPatient(); if (string.IsNullOrEmpty(currentPatient.Name)) { ConfirmDialog.Show("提示", "请先填写患者基本信息", () => { }); return; } var currentUser = _authService?.CurrentUser; if (currentUser == null) { ConfirmDialog.Show("错误", "未登录管理员账号,无法开始会话", () => { }); return; } // if (_sessionService != null) // { // bool success = _sessionService.StartSession(currentPatient, currentUser.Username); // if (success) // { // ConfirmDialog.Show("成功", $"已为患者 {currentPatient.Name} 开始会话", () => { }); // UpdateSessionUI(); // } // else // { // ConfirmDialog.Show("错误", "开始会话失败", () => { }); // } // } } /// /// 结束患者会话 /// // private void OnEndSessionClicked() // { // ConfirmDialog.Show("确认", "确定要结束当前患者会话吗?", // () => // { // if (_sessionService != null) // { // _sessionService.EndSession(); // UpdateSessionUI(); // } // }); // } /// /// 会话开始事件处理 /// private void OnSessionStarted(PatientSession session) { Debug.Log($"会话已开始: {session.PatientInfo.Name}"); // UpdateSessionUI(); } /// /// 会话结束事件处理 /// private void OnSessionEnded(PatientSession session) { Debug.Log($"会话已结束: {session.PatientInfo.Name}"); // UpdateSessionUI(); } /// /// 更新UI状态 /// // private void UpdateUI() // { // UpdateSessionUI(); // } /// /// 更新会话相关UI /// // private void UpdateSessionUI() // { // bool hasActiveSession = _sessionService?.IsSessionActive ?? false; // 显示/隐藏会话状态面板 // if (SessionStatusPanel != null) // { // SessionStatusPanel.SetActive(hasActiveSession); // } // if (hasActiveSession) // { // var session = _sessionService.CurrentSession; // if (SessionStatusText != null) // { // SessionStatusText.text = $"会话状态: {GetSessionStatusText(session.Status)}"; // } // if (AdminUserText != null) // { // AdminUserText.text = $"管理员: {session.AdminUserId}"; // } // } // 控制按钮状态 // if (StartSessionButton != null) // { // StartSessionButton.interactable = !hasActiveSession; // } // if (EndSessionButton != null) // { // EndSessionButton.interactable = hasActiveSession; // } // } /// /// 获取会话状态文本 /// private string GetSessionStatusText(SessionStatus status) { switch (status) { case SessionStatus.Started: return "已开始"; case SessionStatus.Measuring: return "测量中"; case SessionStatus.MeasurementComplete: return "测量完成"; case SessionStatus.Completed: return "已完成"; default: return "未知"; } } #endregion #region 自定义键盘配置 /// /// 禁用InputField的系统键盘,改用自定义键盘 /// private void DisableSystemKeyboardForInputFields() { // 为不同输入框设置不同的键盘布局 // 姓名 - 拼音键盘(支持中文) if (NameInput != null) CustomKeyboardManager.SetupInputField(NameInput, KeyboardLayout.Pinyin); // else // Debug.LogWarning("PatientInfoPanel: NameInput is null!"); // 住院号 - 默认键盘(字母+数字) if (AdmissionIdInput != null) CustomKeyboardManager.SetupInputField(AdmissionIdInput, KeyboardLayout.Default); else Debug.LogWarning("PatientInfoPanel: AdmissionIdInput is null!"); // 年龄 - 数字键盘 if (AgeInput != null) { CustomKeyboardManager.SetupInputField(AgeInput, KeyboardLayout.Numeric, (value) => { if (!string.IsNullOrEmpty(value) && !int.TryParse(value, out _)) { ConfirmDialog.Show("提示", "年龄必须是数字", () => { }); AgeInput.text = ""; } }); } else Debug.LogWarning("PatientInfoPanel: AgeInput is null!"); // 身高 - 数字键盘 if (HeightInput != null) { CustomKeyboardManager.SetupInputField(HeightInput, KeyboardLayout.Numeric, (value) => { if (!string.IsNullOrEmpty(value) && !float.TryParse(value, out _)) { ConfirmDialog.Show("提示", "身高必须是数字", () => { }); HeightInput.text = ""; } }); } else Debug.LogWarning("PatientInfoPanel: HeightInput is null!"); // 体重 - 数字键盘 if (WeightInput != null) { CustomKeyboardManager.SetupInputField(WeightInput, KeyboardLayout.Numeric, (value) => { if (!string.IsNullOrEmpty(value) && !float.TryParse(value, out _)) { ConfirmDialog.Show("提示", "体重必须是数字", () => { }); WeightInput.text = ""; } }); } else Debug.LogWarning("PatientInfoPanel: WeightInput is null!"); } #endregion void OnDestroy() { // 清理事件订阅 if (_vm != null) _vm.OnPatientInfoSaved -= OnPatientInfoSaved; // if (_sessionService != null) // { // _sessionService.OnSessionStarted -= OnSessionStarted; // _sessionService.OnSessionEnded -= OnSessionEnded; // } // 关闭自定义键盘(如果正在显示) if (CustomKeyboardManager.Instance != null && CustomKeyboardManager.Instance.IsKeyboardShowing()) { CustomKeyboardManager.Instance.HideKeyboard(); } } }