using CommunityToolkit.Mvvm.ComponentModel; using ivf_tl_Entity; using ivf_tl_Entity.DebugEntitys; using ivf_tl_Entity.DTO; using ivf_tl_Entity.GlobalEntitys; using ivf_tl_Entity.GlobalEnums; using ivf_tl_Operate.Converts; using ivf_tl_Services; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Runtime.Intrinsics.X86; using System.Security.Claims; using System.Security.RightsManagement; using System.Speech.AudioFormat; using System.Speech.Synthesis; using System.Text; using System.Threading; using System.Threading.Tasks; namespace ivf_tl_Operate.ViewModel { public partial class MainPageViewModel : ObservableObject { public MainPageViewModel(string tlsn) { this.tlsn = tlsn; InitExHouse(); Init(); StartMqtt(); StartThread(); StartSpeaker(); } [ObservableProperty] private int alarmCount = 0; [ObservableProperty] private ExDish exDish1 = new ExDish(); [ObservableProperty] private ExDish exDish2 = new ExDish(); [ObservableProperty] private ExDish exDish3 = new ExDish(); [ObservableProperty] private ExDish exDish4 = new ExDish(); [ObservableProperty] private ExDish exDish5 = new ExDish(); [ObservableProperty] private ExDish exDish6 = new ExDish(); [ObservableProperty] private ExDish exDish7 = new ExDish(); [ObservableProperty] private ExDish exDish8 = new ExDish(); [ObservableProperty] private ExDish exDish9 = new ExDish(); [ObservableProperty] private ExDish exDish10 = new ExDish(); [ObservableProperty] private ExHouse exHouse1 = null; [ObservableProperty] private ExHouse exHouse2 = null; [ObservableProperty] private ExHouse exHouse3 = null; [ObservableProperty] private ExHouse exHouse4 = null; [ObservableProperty] private ExHouse exHouse5 = null; [ObservableProperty] private ExHouse exHouse6 = null; [ObservableProperty] private ExHouse exHouse7 = null; [ObservableProperty] private ExHouse exHouse8 = null; [ObservableProperty] private ExHouse exHouse9 = null; [ObservableProperty] private ExHouse exHouse10 = null; [ObservableProperty] private ExHouse exHouse11 = null; public ExBalance ExBalance1 { get; set; } = null; public ExBalance ExBalance2 { get; set; } = null; public ExBalance ExBalance3 { get; set; } = null; public ExBalance ExBalance4 { get; set; } = null; public ExBalance ExBalance5 { get; set; } = null; public ExBalance ExBalance6 { get; set; } = null; public ExBalance ExBalance7 { get; set; } = null; public ExBalance ExBalance8 { get; set; } = null; public ExBalance ExBalance9 { get; set; } = null; public ExBalance ExBalance10 { get; set; } = null; [ObservableProperty] private string hepaTimeString = null; [ObservableProperty] private string maintenanceTimeString = null; [ObservableProperty] private string runTimeString = null; public string tlsn { get; set; } private void InitExHouse() { ExHouse1 = new ExHouse() { tlSn = tlsn, houseSn = 1 }; ExHouse2 = new ExHouse() { tlSn = tlsn, houseSn = 2 }; ExHouse3 = new ExHouse() { tlSn = tlsn, houseSn = 3 }; ExHouse4 = new ExHouse() { tlSn = tlsn, houseSn = 4 }; ExHouse5 = new ExHouse() { tlSn = tlsn, houseSn = 5 }; ExHouse6 = new ExHouse() { tlSn = tlsn, houseSn = 6 }; ExHouse7 = new ExHouse() { tlSn = tlsn, houseSn = 7 }; ExHouse8 = new ExHouse() { tlSn = tlsn, houseSn = 8 }; ExHouse9 = new ExHouse() { tlSn = tlsn, houseSn = 9 }; ExHouse10 = new ExHouse() { tlSn = tlsn, houseSn = 10 }; ExHouse11 = new ExHouse() { tlSn = tlsn, houseSn = 11 }; } public void Init() { GetHouseStateData getHouseStateData = AppData.Instance.HttpHelper.GetHouseCultureListApi(tlsn); InitDish(getHouseStateData.embryoCultureRecords); InitBalance(getHouseStateData.balances); InitHouse(); } private void InitHouse() { ExHouse currentHouse = null; ExDish currentDish = null; ExBalance currentBalance = null; for (int i = 1; i < 11; i++) { currentHouse = HouseSnToExHouse(i); if (currentHouse == null) continue; currentDish = HouseSnToDish(i); currentBalance = HouseSnToExBalance(i); if (currentBalance == null && currentDish == null) { currentHouse.FaYuTime = ""; currentHouse.StartTime = ""; continue; } if (currentDish != null) { if (DateTime.TryParse(currentDish.startTime, out DateTime sou)) { currentDish.SouJingTime = sou; var span = DateTime.Now.Subtract(sou); var allHour = (span.Days * 24) + span.Hours; if (allHour >= 168) currentHouse.FaYuTime = $"168h+"; else currentHouse.FaYuTime = $"{allHour}h:{span.Minutes}m"; currentHouse.StartTime = sou.ToString("MM-dd HH:mm"); } else { currentHouse.FaYuTime = ""; currentHouse.StartTime = ""; } continue; } if (currentBalance != null) { if (DateTime.TryParse(currentBalance.startTime, out DateTime sou)) { currentBalance.StartDateTime = sou; var span = DateTime.Now.Subtract(sou); var allHour = (span.Days * 24) + span.Hours; if (allHour >= 168) currentHouse.FaYuTime = $"168h+"; else currentHouse.FaYuTime = $"{allHour}h:{span.Minutes}m"; currentHouse.StartTime = sou.ToString("MM-dd HH:mm"); } continue; } currentHouse.FaYuTime = ""; currentHouse.StartTime = ""; } } private void InitDish(List dishList) { //ExDish currentDish = null; //ExDish newDish = null; //for (int i = 1; i < 11; i++) //{ // newDish = dishList.FirstOrDefault(x => x.houseSn == i); // currentDish = HouseSnToDish(i); // if (currentDish == null) continue; // if (newDish == null) // { // if (currentDish.id > 0) EndDish(i); // continue; // } // currentDish.id = newDish.id; // currentDish.state = newDish.state; // currentDish.houseSn = newDish.houseSn; // currentDish.caseId=newDish.caseId; // currentDish.wife = newDish.wife; // currentDish.husband = newDish.husband; // currentDish.wifeBirth=newDish.wifeBirth; // currentDish.husbandBirth = newDish.husbandBirth; // currentDish.vip = newDish.vip; // currentDish.state = newDish.state; // currentDish.startTime = newDish.startTime; // currentDish.fertilizationType = newDish.fertilizationType; // currentDish.fertilizationTypeId = newDish.fertilizationTypeId; // currentDish.embryoList = newDish.embryoList; // currentDish.embryoCount = newDish.embryoCount; //} ExDish1 = dishList.FirstOrDefault(x => x.houseSn == 1); ExDish2 = dishList.FirstOrDefault(x => x.houseSn == 2); ExDish3 = dishList.FirstOrDefault(x => x.houseSn == 3); ExDish4 = dishList.FirstOrDefault(x => x.houseSn == 4); ExDish5 = dishList.FirstOrDefault(x => x.houseSn == 5); ExDish6 = dishList.FirstOrDefault(x => x.houseSn == 6); ExDish7 = dishList.FirstOrDefault(x => x.houseSn == 7); ExDish8 = dishList.FirstOrDefault(x => x.houseSn == 8); ExDish9 = dishList.FirstOrDefault(x => x.houseSn == 9); ExDish10 = dishList.FirstOrDefault(x => x.houseSn == 10); //SetSouJingTime(ExDish1); //SetSouJingTime(ExDish2); //SetSouJingTime(ExDish3); //SetSouJingTime(ExDish4); //SetSouJingTime(ExDish5); //SetSouJingTime(ExDish6); //SetSouJingTime(ExDish7); //SetSouJingTime(ExDish8); //SetSouJingTime(ExDish9); //SetSouJingTime(ExDish10); } private void InitBalance(List balanceList) { ExBalance1 = balanceList.FirstOrDefault(x => x.houseSn == 1); ExBalance2 = balanceList.FirstOrDefault(x => x.houseSn == 2); ExBalance3 = balanceList.FirstOrDefault(x => x.houseSn == 3); ExBalance4 = balanceList.FirstOrDefault(x => x.houseSn == 4); ExBalance5 = balanceList.FirstOrDefault(x => x.houseSn == 5); ExBalance6 = balanceList.FirstOrDefault(x => x.houseSn == 6); ExBalance7 = balanceList.FirstOrDefault(x => x.houseSn == 7); ExBalance8 = balanceList.FirstOrDefault(x => x.houseSn == 8); ExBalance9 = balanceList.FirstOrDefault(x => x.houseSn == 9); ExBalance10 = balanceList.FirstOrDefault(x => x.houseSn == 10); //SetSouJingTime(ExBalance1); //SetSouJingTime(ExBalance2); //SetSouJingTime(ExBalance3); //SetSouJingTime(ExBalance4); //SetSouJingTime(ExBalance5); //SetSouJingTime(ExBalance6); //SetSouJingTime(ExBalance7); //SetSouJingTime(ExBalance8); //SetSouJingTime(ExBalance9); //SetSouJingTime(ExBalance10); } /// /// 设置培养记录受精时间 /// /// private void SetSouJingTime(ExDish exDish) { if (exDish == null) return; if (DateTime.TryParse(exDish.startTime, out DateTime sou)) { exDish.SouJingTime = sou; } var exhoue = HouseSnToExHouse(exDish.houseSn); if (exhoue == null) { return; } if (exDish.SouJingTime.HasValue) { var endTime = DateTime.Now; if (!string.IsNullOrEmpty(exDish.endTime)) { DateTime.TryParse(exDish.endTime, out endTime); } var span = endTime.Subtract(exDish.SouJingTime.Value); exhoue.FaYuTime = $"{(span.Days * 24) + span.Hours}H:{span.Minutes}M"; exhoue.StartTime = exDish.SouJingTime.Value.ToString("MM-dd HH:mm"); } } /// /// 设置平衡记录开始时间 /// /// private void SetSouJingTime(ExBalance exBalance) { if (exBalance == null) return; if (DateTime.TryParse(exBalance.startTime, out DateTime sou)) { exBalance.StartDateTime = sou; } var exhoue = HouseSnToExHouse(exBalance.houseSn); if (exhoue == null) { return; } if (exBalance.StartDateTime.HasValue) { var endTime = DateTime.Now; if (!string.IsNullOrEmpty(exBalance.endTime)) { DateTime.TryParse(exBalance.endTime, out endTime); } var span = endTime.Subtract(exBalance.StartDateTime.Value); exhoue.FaYuTime = $"{(span.Days * 24) + span.Hours}H:{span.Minutes}M"; exhoue.StartTime = exBalance.StartDateTime.Value.ToString("MM-dd HH:mm"); } } /// /// 结束培养 /// /// public void EndDish(int houseSn) { // M8-G3-1:结束培养——本地清空该舱培养记录与发育/开始时间,属有业务含义的本地操作,埋点(自动计时+异常→失败)。 Aivfo.OperationLog.OperationLogger.Run("舱室操作", "结束培养", () => { switch (houseSn) { case 1: ExDish1 = new ExDish(); break; case 2: ExDish2 = new ExDish(); break; case 3: ExDish3 = new ExDish(); break; case 4: ExDish4 = new ExDish(); break; case 5: ExDish5 = new ExDish(); break; case 6: ExDish6 = new ExDish(); break; case 7: ExDish7 = new ExDish(); break; case 8: ExDish8 = new ExDish(); break; case 9: ExDish9 = new ExDish(); break; case 10: ExDish10 = new ExDish(); break; } var exhoue = HouseSnToExHouse(houseSn); if (exhoue == null) return; exhoue.FaYuTime = ""; exhoue.StartTime = ""; }, input: new { houseSn }); } public ExDish HouseSnToDish(int houseSn) { ExDish exDish = null; switch (houseSn) { case 1: exDish = ExDish1; break; case 2: exDish = ExDish2; break; case 3: exDish = ExDish3; break; case 4: exDish = ExDish4; break; case 5: exDish = ExDish5; break; case 6: exDish = ExDish6; break; case 7: exDish = ExDish7; break; case 8: exDish = ExDish8; break; case 9: exDish = ExDish9; break; case 10: exDish = ExDish10; break; } return exDish; } public ExHouse HouseSnToExHouse(int houseSn) { ExHouse ExHouse = null; switch (houseSn) { case 1: ExHouse = ExHouse1; break; case 2: ExHouse = ExHouse2; break; case 3: ExHouse = ExHouse3; break; case 4: ExHouse = ExHouse4; break; case 5: ExHouse = ExHouse5; break; case 6: ExHouse = ExHouse6; break; case 7: ExHouse = ExHouse7; break; case 8: ExHouse = ExHouse8; break; case 9: ExHouse = ExHouse9; break; case 10: ExHouse = ExHouse10; break; case 11: ExHouse = ExHouse11; break; } return ExHouse; } public ExBalance HouseSnToExBalance(int houseSn) { ExBalance exBalance = null; switch (houseSn) { case 1: exBalance = ExBalance1; break; case 2: exBalance = ExBalance2; break; case 3: exBalance = ExBalance3; break; case 4: exBalance = ExBalance4; break; case 5: exBalance = ExBalance5; break; case 6: exBalance = ExBalance6; break; case 7: exBalance = ExBalance7; break; case 8: exBalance = ExBalance8; break; case 9: exBalance = ExBalance9; break; case 10: exBalance = ExBalance10; break; } return exBalance; } /// /// 接受mqtt消息 /// public void RecMqttMessage(string message) { try { List exHouses = JsonConvert.DeserializeObject>(message); //List exHouses = new List(); for (int i = 1; i <= 11; i++) { ExHouse currentHouse = HouseSnToExHouse(i); if (currentHouse == null) continue; if (i == 11) { var exHouse11 = exHouses.FirstOrDefault(x => x.houseSn == i); if (exHouse11 == null) continue; currentHouse.pressure = exHouse11.pressure; //currentHouse.pressureDesc = exHouse11.pressureDesc; //currentHouse.houseDesc = exHouse11.houseDesc; currentHouse.PressureString = $"{currentHouse.pressure.ToString("f0")}mbar"; switch (exHouse11.pressureDesc) { case "未知": currentHouse.pressureDesc = KeyToStringConvert.GetLanguageStringByKey("C0281"); break; case "待补气": currentHouse.pressureDesc = KeyToStringConvert.GetLanguageStringByKey("C0007"); break; case "补气": currentHouse.pressureDesc = KeyToStringConvert.GetLanguageStringByKey("C0006"); break; case "正常": currentHouse.pressureDesc = KeyToStringConvert.GetLanguageStringByKey("C0005"); break; case "冲刷": currentHouse.pressureDesc = KeyToStringConvert.GetLanguageStringByKey("C0301"); break; case "排气": currentHouse.pressureDesc = KeyToStringConvert.GetLanguageStringByKey("C0299"); break; case "排队": currentHouse.pressureDesc = KeyToStringConvert.GetLanguageStringByKey("C0300"); break; default: currentHouse.pressureDesc=exHouse11.pressureDesc; break; } switch (exHouse11.houseDesc) { case "未知": currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0281"); break; case "舱室换气": currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0302"); break; case "气压监测": currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0282"); break; case "缓冲瓶补气": currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0283"); break; case "握手准备": currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0009"); break; case "水平电机自检": currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0010"); break; case "垂直电机自检": currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0012"); break; case "调试状态": currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0013"); break; case "空闲监测": currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0014"); break; case "温压监测平衡": currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0008"); break; case "温压监测": currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0015"); break; case "气体交换": currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0016"); break; case "气体交换平衡": currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0280"); break; default: if (exHouse11.houseDesc.Contains("自动对焦")) { currentHouse.houseDesc = exHouse11.houseDesc.Replace("自动对焦", KeyToStringConvert.GetLanguageStringByKey("C0017")); }else if (exHouse11.houseDesc.Contains("胚胎拍照")) { currentHouse.houseDesc = exHouse11.houseDesc.Replace("胚胎拍照", KeyToStringConvert.GetLanguageStringByKey("C0018")); } else { currentHouse.houseDesc = exHouse11.houseDesc; } break; } continue; } var exHouse = exHouses.FirstOrDefault(x => x.houseSn == i); if (exHouse != null) { currentHouse.pressureAlarm = exHouse.pressureAlarm; currentHouse.temperatureAlarm = exHouse.temperatureAlarm; currentHouse.pressure = exHouse.pressure; currentHouse.temperature = exHouse.temperature; currentHouse.houseDoorState = exHouse.houseDoorState; //currentHouse.pressureDesc = exHouse.pressureDesc; //currentHouse.houseDesc = exHouse.houseDesc; currentHouse.PressureString = $"{currentHouse.pressure.ToString("f0")}mbar"; currentHouse.TemperatureSring = $"{currentHouse.temperature.ToString("f2")}℃"; switch (exHouse.pressureDesc) { case "未知": currentHouse.pressureDesc = KeyToStringConvert.GetLanguageStringByKey("C0281"); break; case "待补气": currentHouse.pressureDesc = KeyToStringConvert.GetLanguageStringByKey("C0007"); break; case "补气": currentHouse.pressureDesc = KeyToStringConvert.GetLanguageStringByKey("C0006"); break; case "正常": currentHouse.pressureDesc = KeyToStringConvert.GetLanguageStringByKey("C0005"); break; case "冲刷": currentHouse.pressureDesc = KeyToStringConvert.GetLanguageStringByKey("C0301"); break; case "排气": currentHouse.pressureDesc = KeyToStringConvert.GetLanguageStringByKey("C0299"); break; case "排队": currentHouse.pressureDesc = KeyToStringConvert.GetLanguageStringByKey("C0300"); break; default: currentHouse.pressureDesc = exHouse.pressureDesc; break; } switch (exHouse.houseDesc) { case "未知": currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0281"); break; case "握手准备": currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0009"); break; case "水平电机自检": currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0010"); break; case "垂直电机自检": currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0012"); break; case "调试状态": currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0013"); break; case "空闲监测": currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0014"); break; case "温压监测平衡": currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0008"); break; case "温压监测": currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0015"); break; case "气体交换": currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0016"); break; case "气体交换平衡": currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0280"); break; default: if (exHouse.houseDesc.Contains("自动对焦")) { currentHouse.houseDesc = exHouse.houseDesc.Replace("自动对焦", KeyToStringConvert.GetLanguageStringByKey("C0017")); } else if (exHouse.houseDesc.Contains("胚胎拍照")) { currentHouse.houseDesc = exHouse.houseDesc.Replace("胚胎拍照", KeyToStringConvert.GetLanguageStringByKey("C0018")); } else { currentHouse.houseDesc = exHouse.houseDesc; } break; } } continue; var currentBalance = HouseSnToExBalance(i); if (currentBalance != null && currentBalance.StartDateTime.HasValue) { var endTime = DateTime.Now; if (!string.IsNullOrEmpty(currentBalance.endTime)) { DateTime.TryParse(currentBalance.endTime, out endTime); } var span = endTime.Subtract(currentBalance.StartDateTime.Value); currentHouse.FaYuTime = $"{(span.Days * 24) + span.Hours}H:{span.Minutes}M"; currentHouse.StartTime = currentBalance.StartDateTime.Value.ToString("MM-dd HH:mm"); } var currentDish = HouseSnToDish(i); if (currentDish != null && currentDish.SouJingTime.HasValue) { var endTime = DateTime.Now; if (!string.IsNullOrEmpty(currentDish.endTime)) { DateTime.TryParse(currentDish.endTime, out endTime); } var span = endTime.Subtract(currentDish.SouJingTime.Value); currentHouse.FaYuTime = $"{(span.Days * 24) + span.Hours}H:{span.Minutes}M"; currentHouse.StartTime = currentDish.SouJingTime.Value.ToString("MM-dd HH:mm"); } } } catch (Exception ex) { AppData.Instance.LogHelper.ExceptionLog(ex, "解析mqtt消息", LogEnum.RunException); } } public void StartThread() { Task.Factory.StartNew(async () => { string yunxing = KeyToStringConvert.GetLanguageStringByKey("C0001"); string genghuang = KeyToStringConvert.GetLanguageStringByKey("C0002"); string baoyang = KeyToStringConvert.GetLanguageStringByKey("C0003"); string tian = KeyToStringConvert.GetLanguageStringByKey("C0004"); while (true) { try { AlarmCount = AppData.Instance.HttpHelper.SearchAlarmHistoryNumApi(new SearchAlarmResponse { current = 1, selectType = 2, size = 5, tlSn = AppData.Instance.TlSn }).current; var a = AppData.Instance.HttpHelper.TlInfoTimeApi(tlsn); if (a == null) continue; if (a.runTime > 9999) RunTimeString = $"{yunxing}:9999+{tian}";/*RunTimeString = $"运行时间:9999+天";*/ else RunTimeString = $"{yunxing}:{a.runTime}{tian}";/*RunTimeString = $"运行时间:{a.runTime}天";*/ if (a.maintenanceTime > 9999) MaintenanceTimeString = $"{baoyang}:9999+{tian}";/*MaintenanceTimeString = $"保养倒计时:9999+天";*/ else MaintenanceTimeString = $"{baoyang}:{a.maintenanceTime}{tian}";/*MaintenanceTimeString = $"保养倒计时:{a.maintenanceTime}天";*/ if (a.hepatime > 9999) HepaTimeString = $"{genghuang}:9999+{tian}";/*HepaTimeString = $"更换HEPA时间:9999+天";*/ else HepaTimeString = $"{genghuang}:{a.hepatime}{tian}";/* HepaTimeString = $"更换HEPA时间:{a.hepatime}天";*/ // M5-04-4:HTTP 轮询本轮成功,写「最后成功通讯时间」供 control GetMonitorSnapshot 透出、服务监控页上色。 // a==null 已在上面 continue(失联不更新),故走到这里即视为 HTTP 链路通。try 兜底,绝不因监控埋点影响主轮询。 try { ivf_tl_Control.AppData.Instance.LastHttpOkAt = DateTime.Now; } catch { } Init(); } catch (Exception ex) { AppData.Instance.LogHelper.ExceptionLog(ex, "定时刷新", LogEnum.RunException); } finally { await Task.Delay(1000 * 5); } } }, TaskCreationOptions.LongRunning); Task.Factory.StartNew(async () => { string newPath = ""; while (true) { try { if(AppData.Instance.TLSettingCommon.cleanSurfaceData != 0) { newPath = $"{AppData.Instance.DefeatPan}:\\TLData\\ivf_tl_Operate_logs"; DeleteLogDir(newPath, AppData.Instance.TLSettingCommon.cleanSurfaceData); newPath = $"{AppData.Instance.DefeatPan}:\\TLData\\ivf_tl_Operate_logs\\Log"; DeleteLogFile(newPath, AppData.Instance.TLSettingCommon.cleanSurfaceData); newPath = $"{AppData.Instance.DefeatPan}:\\TLData\\ivf_tl_Operate_logs\\LogError"; DeleteLogFile(newPath, AppData.Instance.TLSettingCommon.cleanSurfaceData); } } catch (Exception ex) { AppData.Instance.LogHelper.ExceptionLog(ex, "DeleteLog", LogEnum.RunException); } finally { await Task.Delay(1000 * 60 * 60 * 12); } } }, TaskCreationOptions.LongRunning); } private void DeleteLogDir(string newPath,int day) { var newDir = Directory.GetDirectories(newPath, "*", SearchOption.TopDirectoryOnly); string dirName = ""; DateTime dirTime = DateTime.Now; DateTime nowTime = dirTime; foreach (var item in newDir) { dirName = System.IO.Path.GetFileName(item); if (DateTime.TryParse(dirName, out dirTime)) { if (nowTime.Subtract(dirTime).Days >= day) { try { Directory.Delete(item, true); } catch (Exception) { continue; } } } } } private void DeleteLogFile(string newPath,int day) { var newDir = Directory.GetFiles(newPath, "*.htm", SearchOption.TopDirectoryOnly); string fileName = ""; DateTime fileTime = DateTime.Now; DateTime nowTime = fileTime; foreach (var item in newDir) { fileName = System.IO.Path.GetFileNameWithoutExtension(item); if (fileName.Length == 8) { fileName = fileName.Insert(6, "-"); fileName = fileName.Insert(4, "-"); if (DateTime.TryParse(fileName, out fileTime)) { if (nowTime.Subtract(fileTime).Days >= day) { try { File.Delete(item); } catch (Exception) { continue; } } } } } } public void StartMqtt() { AppData.Instance.MqttHelper.MessEvent -= RecMqttMessage; AppData.Instance.MqttHelper.MessEvent += RecMqttMessage; AppData.Instance.MqttHelper.StartMqtt(); } List ReadAlarmId = new List(); Queue AlarmQueue = new Queue(); private object AlarmQueueLock = new object(); public void StartSpeaker() { Task.Factory.StartNew(async () => { SpeechSynthesizer speech = new SpeechSynthesizer(); speech.Volume = 100; var currentVoiceInfo = speech.GetInstalledVoices(CultureInfo.CurrentCulture).FirstOrDefault(); if (currentVoiceInfo != null) speech.SelectVoice(currentVoiceInfo.VoiceInfo.Name); AlarmHistoryResult alarmHistoryResult = null; AlarmHistoryEntity currentAlarm = null; string yiqi = KeyToStringConvert.GetLanguageStringByKey("C0230"); string huanchongp = KeyToStringConvert.GetLanguageStringByKey("C0231"); string hcs = KeyToStringConvert.GetLanguageStringByKey("C0056"); int dataCount = 0; string houseSnString = null; string speakText = ""; while (true) { try { currentAlarm = AlarmDequeue(); if (currentAlarm != null && currentAlarm.mute == 0) { if (currentAlarm.houseSn == 0) { //houseSnString = "时差仪器"; houseSnString = yiqi; } else if (currentAlarm.houseSn == 11) { //houseSnString = "缓冲瓶"; houseSnString = huanchongp; } else { //houseSnString = $"{currentAlarm.houseSn}号舱室"; houseSnString = $"{currentAlarm.houseSn}{hcs}"; } speakText = $"{houseSnString}{currentAlarm.title}"; speech.Speak(speakText); } currentAlarm = null; if (!AlarmQueueAny()) { //ReadAlarmId.Clear(); alarmHistoryResult = AppData.Instance.HttpHelper.SearchAlarmHistoryApi(new SearchAlarmResponse { current = 1, selectType = 2, size = 999, tlSn = AppData.Instance.TlSn }); if (alarmHistoryResult.IsSuccess) { dataCount = 0; foreach (var item in alarmHistoryResult.records) { //if (ReadAlarmId.Contains(item.id)) continue; //ReadAlarmId.Add(item.id); if (item.mute == 0) { AlarmEnqueue(item); dataCount++; } } if (dataCount == 0) await Task.Delay(5000); } else { await Task.Delay(5000); } await Task.Delay(1000); } } catch (Exception ex) { AppData.Instance.LogHelper.ExceptionLog(ex, $"语音报警:{speakText}", LogEnum.RunException); } finally { await Task.Delay(100); } } }, TaskCreationOptions.LongRunning); } public void SetAlarmMute(long id, int mute) { try { lock (AlarmQueueLock) { var aa = AlarmQueue.FirstOrDefault(x => x.id == id); if (aa != null) aa.mute = mute; } // M8-G3-1:报警静音/取消静音——本地修改报警队列状态,属有业务含义的本地操作。原方法吞异常,故用兜底 Log 直记成功(不改控制流)。 Aivfo.OperationLog.OperationLogger.Log("报警操作", "设置报警静音", input: new { id, mute }, result: "成功"); } catch (Exception ex) { // M8-G3-1:失败兜底直记(沿用原异常吞处理,不重抛)。 Aivfo.OperationLog.OperationLogger.Log("报警操作", "设置报警静音", input: new { id, mute }, result: "失败", error: ex.GetType().Name + ": " + ex.Message); AppData.Instance.LogHelper.ExceptionLog(ex, "SetAlarmMute", LogEnum.RunException); } } private void AlarmEnqueue(AlarmHistoryEntity alarmHistoryEntity) { try { lock (AlarmQueueLock) { AlarmQueue.Enqueue(alarmHistoryEntity); } } catch (Exception ex) { AppData.Instance.LogHelper.ExceptionLog(ex, "AlarmEnqueue", LogEnum.RunException); } } private AlarmHistoryEntity AlarmDequeue() { try { lock (AlarmQueueLock) { if (AlarmQueue.Any()) return AlarmQueue.Dequeue(); } return null; } catch (Exception ex) { AppData.Instance.LogHelper.ExceptionLog(ex, "AlarmDequeue", LogEnum.RunException); return null; } } private bool AlarmQueueAny() { try { lock (AlarmQueueLock) return AlarmQueue.Any(); } catch (Exception ex) { AppData.Instance.LogHelper.ExceptionLog(ex, "AlarmQueueAny", LogEnum.RunException); lock (AlarmQueueLock) AlarmQueue.Clear(); return false; } } } }