using System; using System.Collections.Generic; using System.IO; using System.Text; using UnityEngine; using System.Linq; public class PatientInfoService : IPatientInfoService { public event Action OnPatientInfoChanged; private PatientInfo _currentPatient; private const string PATIENT_DATA_KEY = "CurrentPatientData"; private const string PATIENT_FILES_FOLDER = "PatientFiles"; public PatientInfoService() { LoadPatientInfo(); } public PatientInfo GetCurrentPatient() { return _currentPatient; } public void SetCurrentPatient(PatientInfo patient) { _currentPatient = patient; OnPatientInfoChanged?.Invoke(patient); } public void ClearCurrentPatient() { try { _currentPatient = null; PlayerPrefs.DeleteKey(PATIENT_DATA_KEY); PlayerPrefs.Save(); OnPatientInfoChanged?.Invoke(null); var authService = ServiceLocator.Get(); var logService = ServiceLocator.Get(); logService?.LogUserOperation( authService?.CurrentUsername ?? "system", "清空患者信息", "退出主界面返回登录界面", true); } catch (Exception ex) { Debug.LogError($"清空病人信息失败: {ex.Message}"); } } public bool SavePatientInfo(PatientInfo patient) { try { _currentPatient = patient; // 保存到PlayerPrefs(简化实现) var json = JsonUtility.ToJson(patient); PlayerPrefs.SetString(PATIENT_DATA_KEY, json); PlayerPrefs.Save(); OnPatientInfoChanged?.Invoke(patient); // 记录患者信息保存日志 var authService = ServiceLocator.Get(); var logService = ServiceLocator.Get(); logService?.LogUserOperation( authService?.CurrentUsername ?? "system", "保存患者信息", $"姓名: {patient.Name}, 住院号: {patient.HospitalId}", true); return true; } catch (Exception ex) { Debug.LogError($"保存病人信息失败: {ex.Message}"); // 记录失败日志 var authService = ServiceLocator.Get(); var logService = ServiceLocator.Get(); logService?.LogUserOperation( authService?.CurrentUsername ?? "system", "保存患者信息", $"失败: {ex.Message}", false); return false; } } private void LoadPatientInfo() { try { var json = PlayerPrefs.GetString(PATIENT_DATA_KEY, ""); if (!string.IsNullOrEmpty(json)) { _currentPatient = JsonUtility.FromJson(json); } } catch (Exception ex) { Debug.LogError($"加载病人信息失败: {ex.Message}"); } } /// /// 从文件加载病人信息 /// public PatientInfo LoadPatientFromFile(string filePath) { try { if (!File.Exists(filePath)) { Debug.LogError($"文件不存在: {filePath}"); return null; } string extension = Path.GetExtension(filePath).ToLower(); PatientInfo patient = null; switch (extension) { case ".json": patient = LoadFromJSON(filePath); break; case ".csv": patient = LoadFromCSV(filePath); break; case ".txt": patient = LoadFromTXT(filePath); break; default: Debug.LogError($"不支持的文件格式: {extension}"); return null; } if (patient != null) { SetCurrentPatient(patient); SavePatientInfo(patient); // 保存到本地 Debug.Log($"成功从文件加载病人信息: {patient.Name}"); } return patient; } catch (Exception ex) { Debug.LogError($"从文件加载病人信息失败: {ex.Message}"); return null; } } /// /// 从JSON文件加载 /// private PatientInfo LoadFromJSON(string filePath) { // string json = File.ReadAllText(filePath, Encoding.UTF8); // JsonUtility.FromJson(json); PatientInfo jsonData = JsonMgr.Instance.LoadData(filePath); return jsonData; } /// /// 从CSV文件加载 /// 格式: 姓名,住院号,性别,年龄,身高,体重,身份证号 /// private PatientInfo LoadFromCSV(string filePath) { string[] lines = File.ReadAllLines(filePath, Encoding.UTF8); if (lines.Length < 2) // 至少需要标题行和数据行 { throw new Exception("CSV文件格式错误,至少需要两行数据"); } // 跳过标题行,取第一个病人数据 string[] data = lines[1].Split(','); if (data.Length < 7) { throw new Exception("CSV文件数据列数不足,需要7列数据"); } return new PatientInfo { Name = data[0].Trim(), HospitalId = data[1].Trim(), Gender = data[2].Trim(), Age = int.TryParse(data[3].Trim(), out int age) ? age : 0, Height = float.TryParse(data[4].Trim(), out float height) ? height : 0f, Weight = float.TryParse(data[5].Trim(), out float weight) ? weight : 0f, // IdNumber = data[6].Trim() }; } /// /// 从文本文件加载 /// 格式: 每行一个字段,按顺序为姓名、住院号、性别、年龄、身高、体重、身份证号 /// private PatientInfo LoadFromTXT(string filePath) { string[] lines = File.ReadAllLines(filePath, Encoding.UTF8) .Where(line => !string.IsNullOrWhiteSpace(line)) .ToArray(); if (lines.Length < 7) { throw new Exception("文本文件数据不足,需要7行数据"); } return new PatientInfo { Name = lines[0].Trim(), HospitalId = lines[1].Trim(), Gender = lines[2].Trim(), Age = int.TryParse(lines[3].Trim(), out int age) ? age : 0, Height = float.TryParse(lines[4].Trim(), out float height) ? height : 0f, Weight = float.TryParse(lines[5].Trim(), out float weight) ? weight : 0f, // IdNumber = lines[6].Trim() }; } /// /// 导出病人信息到文件 /// public bool ExportPatientToFile(PatientInfo patient, string filePath) { try { string extension = Path.GetExtension(filePath).ToLower(); switch (extension) { case ".json": return ExportToJSON(patient, filePath); case ".csv": return ExportToCSV(patient, filePath); case ".txt": return ExportToTXT(patient, filePath); default: Debug.LogError($"不支持的导出格式: {extension}"); return false; } } catch (Exception ex) { Debug.LogError($"导出病人信息失败: {ex.Message}"); return false; } } /// /// 导出完整的患者会话数据(包含测量数据) /// public bool ExportCompletePatientData(PatientInfo patient, string filePath) { try { // 获取会话服务中的测量数据 var sessionService = ServiceLocator.Get(); if (sessionService?.CurrentSession != null) { return sessionService.ExportSessionData(filePath); } else { // 如果没有会话数据,仅导出患者基本信息 Debug.LogWarning("没有活动会话数据,仅导出患者基本信息"); return ExportPatientToFile(patient, filePath); } } catch (Exception ex) { Debug.LogError($"导出完整患者数据失败: {ex.Message}"); return false; } } private bool ExportToJSON(PatientInfo patient, string filePath) { JsonMgr.Instance.SaveData(patient, filePath); return true; } private bool ExportToCSV(PatientInfo patient, string filePath) { var csv = new StringBuilder(); csv.AppendLine("姓名,住院号,性别,年龄,身高,体重,身份证号"); csv.AppendLine($"{patient.Name},{patient.HospitalId},{patient.Gender},{patient.Age},{patient.Height},{patient.Weight}"); File.WriteAllText(filePath, csv.ToString(), Encoding.UTF8); return true; } private bool ExportToTXT(PatientInfo patient, string filePath) { var txt = new StringBuilder(); txt.AppendLine(patient.Name); txt.AppendLine(patient.HospitalId); txt.AppendLine(patient.Gender); txt.AppendLine(patient.Age.ToString()); txt.AppendLine(patient.Height.ToString()); txt.AppendLine(patient.Weight.ToString()); // txt.AppendLine(patient.IdNumber); File.WriteAllText(filePath, txt.ToString(), Encoding.UTF8); return true; } /// /// 获取支持的文件格式 /// public string[] GetSupportedFileExtensions() { return new string[] { ".json", ".csv", ".txt" }; } /// /// 获取文件选择过滤器 /// public string GetFileFilter() { return "支持的文件|*.json;*.csv;*.txt|JSON文件|*.json|CSV文件|*.csv|文本文件|*.txt"; } }