using System; using Prism.Mvvm; using System.Linq; using System.Text; using System.Windows; using Prism.Commands; using System.Diagnostics; using System.Globalization; using System.Windows.Media; using SHJX.Service.Control; using SHJX.Service.Model.Dao; using System.Threading.Tasks; using System.Collections.Generic; using SHJX.Service.Model.Control; using SHJX.Service.Common.ReadXML; using SHJX.Service.Common.Extend; using SHJX.Service.Common.UserColor; using System.Collections.ObjectModel; using SHJX.Service.Model.DiaplayModel; using SHJX.Service.Common.ExtendElement; using SHJX.Service.Common.UserDelegate; using SHJX.Service.Control.ServiceController; using SHJX.Service.Common.Logging; using Microsoft.Extensions.Logging; namespace SHJX.Service.ModelView { public class MainViewModel : BindableBase { private static readonly ILogger logger = LogFactory.BuildLogger(typeof(MainViewModel)); #region Field private const string ResourcePath = "/SHJX.Service.Resource;component/Resources/"; private static ReadConfigUtil _config; private readonly MainController _controller; public readonly MainController Maincontroller; private static List _detailArgs; #endregion #region Property public ObservableCollection DissolvePositions { get; set; } public ObservableCollection LeftSampleAreas { get; set; } public ObservableCollection RightSampleAreas { get; set; } public ObservableCollection CenterControls { get; set; } /// /// 遮蔽层 /// private Visibility _hiddenValue; public Visibility MainHiddenValue { get => _hiddenValue; set => SetProperty(ref _hiddenValue, value); } /// /// 是否锁定 /// private bool? _mainLock; public bool? WhetherLockMain { get => _mainLock; set => SetProperty(ref _mainLock, value); } /// /// 是否开启相机检测 /// private bool _waterMachine; public bool WaterMachineOpen { get => _waterMachine; set => SetProperty(ref _waterMachine, value); } /// /// 是否润洗 /// private bool? _wash; public bool? WhetherWash { get => _wash; set => SetProperty(ref _wash, value); } /// /// 润洗图标 /// private string _washIcon; public string WashIcon { get => _washIcon; set => SetProperty(ref _washIcon, value); } /// /// 暂停按钮 /// private string _pauseIcon; public string PauseIcon { get => _pauseIcon; set => SetProperty(ref _pauseIcon, value); } /// /// 暂停||继续 /// private string _pauseText; public string PauseText { get => _pauseText; set => SetProperty(ref _pauseText, value); } /// /// 连接名 /// private string _clientName; public string ClientName { get => _clientName; set => SetProperty(ref _clientName, value); } /// /// 连接状态 /// private SolidColorBrush _portClientColor; public SolidColorBrush PortClientColor { get => _portClientColor; set { _portClientColor = value; _portClientColor.Freeze(); RaisePropertyChanged(nameof(PortClientColor)); } } private bool _portClientState; public bool PortClientState { get => _portClientState; set => SetProperty(ref _portClientState, value); } /// /// 导出Word图片 /// private string _exportWordIcon; public string ExportWordIcon { get => _exportWordIcon; set => SetProperty(ref _exportWordIcon, value); } #endregion public MainViewModel(ReadConfigUtil config, out int camera) { _config = config; _controller = new MainController(config); Maincontroller = _controller; _detailArgs = new List(); DissolvePositions = new ObservableCollection(); LeftSampleAreas = new ObservableCollection(); RightSampleAreas = new ObservableCollection(); CenterControls = new ObservableCollection(); BuilderElement(); DataCentre.InitBaseData(_config, out int cameraNum); camera = cameraNum; InitData(); RegisterMessager(); PortClient(); StartPreheat(); } #region InitElement private void BuilderElement() { var areas = _controller.QueryArea(); var tasks = _controller.GetResidueTask(); for (int i = 0; i < 24; i++) { DissolveElementArg dissolve = new() { Index = i, UIName = $"R{i + 1}", }; (from area in areas.Where(item => item.PointName.Equals(dissolve.UIName)).ToList() select area.Status).ToList().ForEach(item => { if(item==false) { dissolve.DisplayText = "N"; } }); (from task in tasks.Where(item => item.From.Equals(dissolve.UIName)&& item.To.Equals(dissolve.UIName)).ToList() select task.OriginLocalName).ToList().ForEach(item => { dissolve.DisplayText = item.Replace("A",""); }); DissolvePositions.Add(dissolve); } for (int i = 0; i < 24; i++) { SampleDetailElementArg detail = new() { Index = i, UIName = $"A{i + 1}", TagNo = $"{i + 1}", TagColor = "#99CCCC", }; LeftSampleAreas.Add(detail); } for (int i = 0; i < 24; i++) { SampleDetailElementArg detail = new() { Index = i, UIName = $"A{i + 25}", TagNo = $"{i + 25}", TagColor = "#99CCCC", }; RightSampleAreas.Add(detail); } (string No, string Name)[] centerValues = new (string No, string Name)[] { ("D1", "滴定1"), ("D2", "滴定2"), ("J1", "搅拌"), ("F1", "废液") }; for (int i = 0; i < 5; i++) { CenterControlElementArg detail = new() { Index = i, CenterText = string.Empty, BackColor = "#99CCCC" }; if (i + 1 <= centerValues.Length) { detail.UIName = centerValues[i].No; detail.TagText = centerValues[i].Name; } else { detail.TagText = string.Empty; detail.UIName = string.Empty; } CenterControls.Add(detail); } } #endregion private int DigestionPositionNumFlag=24; private void InitData() { ChangePauseIcon(); ExportWordIcon = $"{ResourcePath}导出Word.png"; WhetherWash = false; WhetherLockMain = false; WaterMachineOpen = false; MainHiddenValue = Visibility.Hidden; WashIcon = "/SHJX.Service.Resource;component/Resources/clear_unselected.png"; } /// /// 注册消息 /// private void RegisterMessager() { try { Messager.Register("sample", SetSample); Messager.Register("TaskOver", TaskOver); Messager.Register("BD", AddCupBiaoDingBubei); Messager.Register("ringRadius", SetRingRadius); Messager.Register("SampleResult", SetSampleResult); Messager.Register("changeElement", SetElementValue); Messager.Register("getCupError", getCupErrorMessageBox); Messager.Register("ExportResultWord", ExportResultWord); Messager.Register("UpdateElementStatus", UpdateElementStatus); Messager.Register("UpdateResultValue", ManualUpdateResultValue); Messager.Register("ReceiveTemplateData", ExecuteReceiveTemplateData); Messager.Register("ReceiveTemplateDataFromMain", ExecuteReceiveTemplateDataFromMain); Messager.Register("modifyDataByManual", modifyDataByManual); } catch (Exception ex) { logger.LogError(ex.Message); } } #region MessagerMethod /// /// 手动设置结果参数 /// /// private void modifyDataByManual(object obj) { try { string[] param = (string[])obj; if (Convert.ToInt32(param[0]) > 48) return; if (Convert.ToInt32(param[0]) < 0) return; if (Convert.ToInt32(param[0]) > 24) { RightSampleAreas[Convert.ToInt32(param[0])-25].Volume = param[1]; RightSampleAreas[Convert.ToInt32(param[0])-25].Result = param[2]; } else { LeftSampleAreas[Convert.ToInt32(param[0])-1].Volume = param[1]; LeftSampleAreas[Convert.ToInt32(param[0])-1].Result = param[2]; } EquipmentTask task = new EquipmentTask(); task.OriginLocalName = "A" + param[0]; task.Amount = Convert.ToDouble(param[1]); task.Result = Convert.ToDouble(param[2]); _controller.UpdateTaskState(task); ; //var res = obj as Dictionary; //var leftSample = LeftSampleAreas.FirstOrDefault(item => item.UIName.Equals(res?["LocalName"])); //if (leftSample is not null) //{ // LeftSampleAreas[leftSample.Index].Volume = res?["Volume"]; // LeftSampleAreas[leftSample.Index].Result = res?["Result"]; //} //var rightSample = RightSampleAreas.FirstOrDefault(item => item.UIName.Equals(res?["LocalName"])); //if (rightSample is not null) //{ // RightSampleAreas[rightSample.Index].Volume = res?["Volume"]; // RightSampleAreas[rightSample.Index].Result = res?["Result"]; //} } catch { } } public void ExecuteReceiveTemplateData(object obj) { if (obj is List list) { _detailArgs = list; } foreach (var sampleDetail in _detailArgs) { var leftSample = LeftSampleAreas.FirstOrDefault(item => item.UIName.Equals(sampleDetail.NodeName)); if (leftSample is not null) { LeftSampleAreas[leftSample.Index].DetailInfo = sampleDetail.Detail; LeftSampleAreas[leftSample.Index].TagColor = sampleDetail.Concentration.Equals("高") ? "#6699CC" : "#99CCFF"; } var rightSample = RightSampleAreas.FirstOrDefault(item => item.UIName.Equals(sampleDetail.NodeName)); if (rightSample is not null) { RightSampleAreas[rightSample.Index].DetailInfo = sampleDetail.Detail; RightSampleAreas[rightSample.Index].TagColor = sampleDetail.Concentration.Equals("高") ? "#6699CC" : "#99CCFF"; } } } public void ExecuteReceiveTemplateDataFromMain(object obj) { var samples = obj as Action>; samples?.Invoke(_detailArgs); } /// /// 设置样品值 /// /// private void SetSample(object obj) { try { if (obj is not SampleDetail arg) return; var detail = _detailArgs.FirstOrDefault(item => item.NodeName.Equals(arg.NodeName)); if (detail is not null) _detailArgs.Remove(detail); if (arg.WhetherSend!) { _detailArgs.Add(arg); } var leftSample = LeftSampleAreas.FirstOrDefault(item => item.UIName.Equals(arg.NodeName)); if (leftSample is not null) { LeftSampleAreas[leftSample.Index].DetailInfo = arg.WhetherSend ? arg.Detail : string.Empty; LeftSampleAreas[leftSample.Index].TagColor = arg.WhetherSend ? detail?.TaskSendOk ?? false ? "#ff99cc" : arg.Concentration.Equals("高") ? "#6699CC" : "#99CCFF" : "#99CCCC"; } var rightSample = RightSampleAreas.FirstOrDefault(item => item.UIName.Equals(arg.NodeName)); if (rightSample is not null) { RightSampleAreas[rightSample.Index].DetailInfo = arg.WhetherSend ? arg.Detail : string.Empty; RightSampleAreas[rightSample.Index].TagColor = arg.WhetherSend ? detail?.TaskSendOk ?? false ? "#ff99cc" : arg.Concentration.Equals("高") ? "#6699CC" : "#99CCFF" : "#99CCCC"; } } catch (Exception ex) { logger.LogError(ex.ToString()); } } /// /// 任务结束 /// /// private void TaskOver(object obj) { try { _config.UpdateIsAddCupBiaoDingBubei("False"); Action action = () => UMessageBox.Info("任务已结束"); List names = new() { "MotorX", "MotorY" }; names.ForEach(async item => { var res = await _controller.StartEquipmentGoBackAsync(); if (res) { action = () => UMessageBox.InfoTip($"{item}返回原地成功"); } }); } catch (Exception ex) { logger.LogError(ex.ToString()); } } private void AddCupBiaoDingBubei(object obj) { try { if (_config.IsAddCupBiaoDingBubei) { List samplesBD = _controller.CheckExistTaskBD((string)obj); List samples = new List(); foreach (var sample in samplesBD) { SampleDetail detailArgs = new SampleDetail() { NodeName = sample.OriginLocalName, Detail = "补杯", HgSO4 = 0, SampleType = "补杯", Concentration = "低", WhetherSend = true, }; samples.Add(detailArgs); _detailArgs.Remove(_detailArgs.FirstOrDefault(item => item.NodeName.Equals(sample.OriginLocalName))); _detailArgs.Add(detailArgs); } var resInfo = _controller.SendSampleToControl(samples, (string)obj); //标定当补杯显示上的处理 //for (int i = 0; i < 24; i++) //{ // var leftSample = (from SampleDetail items in samples where items.NodeName == LeftSampleAreas[i].UIName select items).FirstOrDefault(); // if (leftSample is not null) // { // LeftSampleAreas[i].DetailInfo = leftSample.Detail + "(补)"; // LeftSampleAreas[i].TagColor = "#ffcccc"; // } // var rightSample = (from SampleDetail items in samples where items.NodeName == RightSampleAreas[i].UIName select items).FirstOrDefault(); // if (rightSample is not null) // { // RightSampleAreas[i].DetailInfo = rightSample.Detail + "(补)"; // RightSampleAreas[i].TagColor = "#ffcccc"; // } //} } } catch (Exception ex) { logger.LogError(ex.ToString()); } } /// /// 更新进度条 /// /// private void SetRingRadius(object obj) { try { var data = obj as Dictionary; (data?["value2"] as List)?.ForEach(item => { var dissolve = DissolvePositions.FirstOrDefault(arg => arg.UIName.Equals(item)); if (dissolve is not null) { DissolvePositions[dissolve.Index].DisplayValue = Convert.ToDouble(data["value1"]) * 100; } }); } catch (Exception ex) { logger.LogError(ex.Message); } } private void getCupErrorMessageBox(object obj) { try { _controller.zBackToPoint(); EquipmentTask task = (EquipmentTask)obj; var strValue = "没有检测到杯子,任务已暂停!\n请点“继续任务”进行下一步骤!"; _controller.StopHeatingTemperature(); _config.UpdateTaskRunning(false); ChangePauseIcon(); logger.LogInformation(strValue); MessageBox.Show(strValue); var centerArea = CenterControls.FirstOrDefault(item => item.UIName.Equals(task.From)); if (centerArea is not null) { centerArea.BackColor = "#FFCCCC"; centerArea.CenterText = task.OriginLocalName.Replace("A", string.Empty); } var dissoArea = DissolvePositions.FirstOrDefault(item => item.UIName.Equals(task.From)); if (dissoArea is not null) { dissoArea.DisplayText = "N"; } //dissoArea. = "#99CCCC"; task.To.UpdateAreaPointState(); var leftSample = LeftSampleAreas.FirstOrDefault(item => item.UIName.Equals(task.OriginLocalName)); if (leftSample is not null) { LeftSampleAreas[leftSample.Index].TagColor = "#99CCCC"; } var rightSample = RightSampleAreas.FirstOrDefault(item => item.UIName.Equals(task.OriginLocalName)); if (rightSample is not null) { RightSampleAreas[rightSample.Index].TagColor = "#99CCCC"; } _detailArgs.Remove(_detailArgs.FirstOrDefault(item => item.NodeName.Equals(task.OriginLocalName))); CancelCache.Set(task.OriginLocalName, "Cancel"); _controller.QuerydeledeEmptyCupTask(task.OriginLocalName); } catch (Exception ex) { logger.LogError(ex.Message); } } /// /// 样品结果 /// /// private void SetSampleResult(object obj) { try { var res = obj as Dictionary; var leftSample = LeftSampleAreas.FirstOrDefault(item => item.UIName.Equals(res?["LocalName"])); if (leftSample is not null) { LeftSampleAreas[leftSample.Index].Volume = res?["Volume"]; LeftSampleAreas[leftSample.Index].Result = res?["Result"] == "0" ? "NULL" : res?["Result"]; } var rightSample = RightSampleAreas.FirstOrDefault(item => item.UIName.Equals(res?["LocalName"])); if (rightSample is not null) { RightSampleAreas[rightSample.Index].Volume = res?["Volume"]; RightSampleAreas[rightSample.Index].Result = res?["Result"] == "0" ? "NULL" : res?["Result"]; } } catch (Exception ex) { logger.LogError(ex.Message); } } /// /// 设置界面元素的值 /// /// private void SetElementValue(object obj) { try { var data = (Dictionary)obj; switch (data["type"]) { case "IC": SetInClearPosition(data); break; case "OC": SetOutCleatPosition(data); break; case "IS": SetInStirPosition(data); break; case "OS": SetOutStirPosition(data); break; case "IT": SetInTitrationPosition(data); break; case "OT": SetOutTitrationPosition(data); break; case "TtS": SetTitrationToSample(data); break; } } catch (Exception ex) { logger.LogError(ex.Message); } } /// /// 导出结果 /// /// private void ExportResultWord(object obj) { //导出结果 ExportResultToWord(obj.ToString()); } /// /// 更新结果值 /// /// private void ManualUpdateResultValue(object obj) { try { if (obj is not Dictionary value) return; var waveKey = value["waveKey"].ToString(); //_controller.GetWavekey(); var tasks = _controller.GetUpdateValue(waveKey, value["valuetype"].ToString()); if (!tasks.Any()) { UMessageBox.SingleBtnInfo("未找到对应任务,无法修改!"); return; } var bdValue = value["valuetype"].ToString() switch { "Low" => 0.125 / Convert.ToDouble(value["bd"]), "High" => 1.25 / Convert.ToDouble(value["bd"]), _ => throw new ArgumentNullException(value["valuetype"].ToString()) }; bdValue = Math.Round(bdValue, 5); (from kbTaskName in tasks.Where(item => item.TaskType.Equals("水样")).ToList() select kbTaskName.OriginLocalName).ToList().ForEach(nodeName => { var task = tasks.FirstOrDefault(equipmentTask => equipmentTask.OriginLocalName.Trim().Equals(nodeName)); //计算参数 C:硫酸亚铁铵浓度 Debug.Assert(task != null, nameof(task) + " != null"); var avgValue = ((bdValue * (Convert.ToDouble(value["kb"]) - task.Amount) * 8000) / 10) * task.GetSampleMultiple; avgValue = Convert.ToDouble(Math.Round(avgValue, 2)); var leftSample = LeftSampleAreas.FirstOrDefault(item => item.UIName.Equals(nodeName)); if (leftSample is not null) { LeftSampleAreas[leftSample.Index].Volume = Math.Round(task.Amount,2).ToString(); LeftSampleAreas[leftSample.Index].Result = avgValue > 0 ? avgValue.ToString() : "NULL"; } var rightSample = RightSampleAreas.FirstOrDefault(item => item.UIName.Equals(nodeName)); if (rightSample is not null) { RightSampleAreas[rightSample.Index].Volume = Math.Round(task.Amount, 2).ToString(); RightSampleAreas[rightSample.Index].Result = avgValue > 0 ? avgValue.ToString() : "NULL"; } //EquipmentTask et = new EquipmentTask(); //et = task; task.Result = avgValue > 0 ? avgValue : 0; DataCentre._dataManager.Update(task); }); } catch (Exception ex) { logger.LogError(ex.ToString()); } } /// /// 更新元素状态 /// /// private void UpdateElementStatus(object obj) { try { var area = obj as EquipmentArea; Debug.Assert(area != null, nameof(area) + " != null"); var color = area.Status ? area.PointName.In("Z1", "D1", "D2", "J1", "F1", "H1") ? UColor.DeepSkyBlue : UColor.SteelBlue : UColor.DarkOrange; var areas = new List() { area }; SetDisableElement(areas, color); } catch (Exception ex) { logger.LogError(ex.ToString()); } } #endregion #region Set ElementValue /// /// 进入消解位 /// /// private void SetInClearPosition(Dictionary data) { try { var dissolve = DissolvePositions.FirstOrDefault(item => item.UIName.Equals(data["to"])); if (dissolve is not null) { DissolvePositions[dissolve.Index].DisplayText = data["localName"]; //if (data["localName"] == "补杯") //{ // DissolveElement.txt_dissolve_show = 11; // //DissolvePositions[dissolve.Index] = "#FFCCCC"; //} } } catch (Exception ex) { logger.LogError(ex.ToString()); } } /// /// 离开消解位 /// /// private void SetOutCleatPosition(Dictionary data) { try { var dissolve = DissolvePositions.FirstOrDefault(item => item.UIName.Equals(data["from"])); if (dissolve is not null) { DissolvePositions[dissolve.Index].DisplayValue = 0; DissolvePositions[dissolve.Index].DisplayText = string.Empty; } } catch (Exception ex) { logger.LogError(ex.ToString()); } } /// /// 进入搅拌位 /// /// private void SetInStirPosition(Dictionary data) { try { if (data == null) throw new ArgumentNullException(nameof(data)); var center = CenterControls.FirstOrDefault(item => item.UIName.Equals(data["to"])); if (center is not null) { CenterControls[center.Index].BackColor = "#FFCCCC"; CenterControls[center.Index].CenterText = data["localName"]; } } catch (Exception ex) { logger.LogError(ex.ToString()); } } /// /// 离开搅拌位 /// /// private void SetOutStirPosition(Dictionary data) { try { if (data == null) throw new ArgumentNullException(nameof(data)); var center = CenterControls.FirstOrDefault(item => item.UIName.Equals(data["from"])); if (center is not null) { CenterControls[center.Index].BackColor = "#99CCCC"; CenterControls[center.Index].CenterText = string.Empty; } } catch (Exception ex) { logger.LogError(ex.ToString()); } } /// /// 进入滴定位 /// /// private void SetInTitrationPosition(Dictionary data) { try { if (data == null) throw new ArgumentNullException(nameof(data)); var center = CenterControls.FirstOrDefault(item => item.UIName.Equals(data["to"])); if (center is not null) { CenterControls[center.Index].BackColor = "#FFCCCC"; CenterControls[center.Index].CenterText = data["localName"]; } } catch (Exception ex) { logger.LogError(ex.ToString()); } } /// /// 离开滴定位 /// /// private void SetOutTitrationPosition(Dictionary data) { try { if (data == null) throw new ArgumentNullException(nameof(data)); var center = CenterControls.FirstOrDefault(item => item.UIName.Equals(data["from"])); if (center is not null) { CenterControls[center.Index].BackColor = "#99CCCC"; CenterControls[center.Index].CenterText = string.Empty; } } catch (Exception ex) { logger.LogError(ex.ToString()); } } /// /// 滴定位回样品位 /// /// private void SetTitrationToSample(Dictionary data) { try { if (data == null) throw new ArgumentNullException(nameof(data)); var leftSample = LeftSampleAreas.FirstOrDefault(item => item.UIName.Equals(data["to"])); if (leftSample is not null) { if (data["level"] == "Low") LeftSampleAreas[leftSample.Index].TagColor = "#99CCCC"; else LeftSampleAreas[leftSample.Index].TagColor = "#6699CC"; if (LeftSampleAreas[leftSample.Index].DetailInfo == "补杯") { LeftSampleAreas[leftSample.Index].DetailInfo = ""; } } var rightSample = RightSampleAreas.FirstOrDefault(item => item.UIName.Equals(data["to"])); if (rightSample is not null) { if (data["level"] == "Low") RightSampleAreas[rightSample.Index].TagColor = "#99CCCC"; else RightSampleAreas[rightSample.Index].TagColor = "#6699CC"; if (RightSampleAreas[rightSample.Index].DetailInfo == "补杯") { RightSampleAreas[rightSample.Index].DetailInfo = ""; } } _detailArgs.Remove(_detailArgs.FirstOrDefault(item => item.NodeName.Equals(data["to"]))); } catch (Exception ex) { logger.LogError(ex.ToString()); } } #endregion #region Extend Method /// /// 页面加载 /// /// /// public async void MainLoaded(object sender, EventArgs e) { try { //询问是否需要返回原点 if (UMessageBox.Info("设备是否需要返回原点?").Equals(MessageBoxResult.Yes)) { var gobackResult = await _controller.StartEquipmentGoBackAsync(); UMessageBox.SingleBtnInfo($"返回原点{(gobackResult ? "成功" : "失败")}"); } var washTasks = _controller.GetResidueWashTasks(); if (washTasks.Any()) { if (UMessageBox.Info("当前还有剩余润洗任务未执行完成,请问是否需要继续执行?").Equals(MessageBoxResult.No)) { _controller.DeleteResidueTask(washTasks); } } //加载的时候需要去检索是否还有正在执行的相应任务 var tasks = _controller.GetResidueTask(); foreach (var task in tasks) { SampleDetail detailArgs = new SampleDetail() { NodeName = task.OriginLocalName, Detail = task.TaskDetailName, HgSO4 = task.HgSO4Volume, SampleType = task.TaskType, Concentration = task.SampleConcentration, WhetherSend = true, }; _detailArgs.Add(detailArgs); } if (tasks.Any()) { if (UMessageBox.Info("当前还有剩余任务未执行完成,请问是否需要继续执行?").Equals(MessageBoxResult.Yes)) { tasks.Where(item => item.Status.Equals(TaskState.New) || item.Status.Equals(TaskState.Doing)).ToList().ForEach(task => { var leftSample = LeftSampleAreas.FirstOrDefault(item => item.UIName.Equals(task.OriginLocalName)); if (leftSample is not null) { LeftSampleAreas[leftSample.Index].TagColor = "#ff99cc"; LeftSampleAreas[leftSample.Index].DetailInfo = task.TaskDetailName; if (task.TaskDetailName == "补杯") { LeftSampleAreas[leftSample.Index].TagColor = "#ffcccc"; } } var rightSample = RightSampleAreas.FirstOrDefault(item => item.UIName.Equals(task.OriginLocalName)); if (rightSample is not null) { RightSampleAreas[rightSample.Index].TagColor = "#ff99cc"; RightSampleAreas[rightSample.Index].DetailInfo = task.TaskDetailName; if (task.TaskDetailName == "补杯") { RightSampleAreas[rightSample.Index].TagColor = "#ffcccc"; } } }); tasks.Where(item => item.Status.Equals(TaskState.Finished)).ToList().ForEach(task => { var leftSample = LeftSampleAreas.FirstOrDefault(item => item.UIName.Equals(task.OriginLocalName)); if (leftSample is not null) { LeftSampleAreas[leftSample.Index].TagColor = "#99CCCC"; LeftSampleAreas[leftSample.Index].DetailInfo = task.TaskDetailName; LeftSampleAreas[leftSample.Index].Volume = task.Amount.ToString(CultureInfo.InvariantCulture); LeftSampleAreas[leftSample.Index].Result = task.Udf1 ?? string.Empty; } var rightSample = RightSampleAreas.FirstOrDefault(item => item.UIName.Equals(task.OriginLocalName)); if (rightSample is not null) { RightSampleAreas[rightSample.Index].TagColor = "#99CCCC"; RightSampleAreas[rightSample.Index].DetailInfo = task.TaskDetailName; RightSampleAreas[rightSample.Index].Volume = task.Amount.ToString(CultureInfo.InvariantCulture); RightSampleAreas[rightSample.Index].Result = task.Udf1 ?? string.Empty; } }); } else { _detailArgs.Clear(); _controller.DeleteResidueTask(tasks); //询问加热棒状态是否更改 if (_controller.CheckHeatingIsRunning()) { if (UMessageBox.Info("当前加热状态正在执行,请问是否取消?").Equals(MessageBoxResult.Yes)) { var res = _controller.UpdateHeatingIsRunning(); UMessageBox.InfoTip($"取消{(res ? "成功" : "失败")}"); } } } } var areas = _controller.QueryArea(); SetDisableElement(areas, UColor.DarkOrange); SetRingBarVisiable(); DataCentre.GetTimer.Start(); } catch (Exception ex) { logger.LogError(ex.Message); } } private void SetRingBarVisiable() { try { var heatTasks = _controller.GetHeatAtPresent(); heatTasks?.ForEach(task => { var dissolve = DissolvePositions.FirstOrDefault(item => item.UIName.Equals(task.Item1)); if (dissolve is not null) { DissolvePositions[dissolve.Index].DisplayText = task.Item2; } }); } catch (Exception ex) { logger.LogError(ex.Message); } } /// /// 启动预热 /// private async void StartPreheat() { if (!_config.OpenAppStartHeat) return; await Task.Factory.StartNew(() => { _controller.WritePreheatTemperature(); }); } /// /// 导出结果 /// /// /// private async void ExportResultToWord(string waveKey, Action action = null) { try { ExportWordIcon = string.Concat(ResourcePath, "等待.gif"); if (await _controller.ConvertWordAsync(waveKey)) { action?.Invoke(); } ExportWordIcon = string.Concat(ResourcePath, "导出Word.png"); } catch (Exception ex) { //UMessageBox.ErrorTip($"导出Word失败,失败原因:{ex.Message}"); logger.LogError($"导出Word失败,失败原因:{ex}"); } } /// /// 不可用控件 /// private void SetDisableElement(List areas, SolidColorBrush solidColor) { try { (from area in areas.Where(item => item.AreaName.Equals("DigestionPosition")).ToList() select area.PointName).ToList().ForEach(item => { //if (_ringBars.TryGetValue(item, out var ringBar)) //{ // ringBar.CenterColor = solidColor; //}; }); (from area in areas.Where(item => item.AreaName.Equals("DigestionPosition")).ToList() select area.PointName).ToList().ForEach(item => { var dissolve = DissolvePositions.FirstOrDefault(it => it.UIName.Equals(item)); if (dissolve is not null && areas[0].Status) { DissolvePositions[dissolve.Index].DisplayText = ""; } if (dissolve is not null && !areas[0].Status) { DissolvePositions[dissolve.Index].DisplayText = "N"; } }); (from area in areas.Where(item => item.AreaName.Equals("TitrationPosition")).ToList() select area.PointName).ToList().ForEach(item => { if (item.Equals("D1")) { var Titration = CenterControls.FirstOrDefault(item => item.UIName.Equals("D1")); if (Titration is not null && areas.FirstOrDefault(item => item.PointName.Equals("D1")).Status) { Titration.BackColor = "#99CCCC"; } if (Titration is not null && !areas[0].Status) { Titration.BackColor = "#FFCCCC"; } } if (item.Equals("D2")) { var Titration = CenterControls.FirstOrDefault(item => item.UIName.Equals("D2")); if (Titration is not null && areas.FirstOrDefault(item => item.PointName.Equals("D2")).Status) { Titration.BackColor = "#99CCCC"; } if (Titration is not null && !areas[0].Status) { Titration.BackColor = "#FFCCCC"; } } }); (from area in areas.Where(item => item.AreaName.Equals("StirPosition")).ToList() select area.PointName).ToList().ForEach(item => { var StirData = CenterControls.FirstOrDefault(item => item.UIName.In("J1")); if (StirData is not null && areas[0].Status) { StirData.BackColor = "#99CCCC"; } if (StirData is not null && !areas[0].Status) { StirData.BackColor = "#FFCCCC"; } }); (from pos in (from area in areas where area.AreaName.Equals("LiquidWastePosition") select area).ToList() select pos.PointName).ToList().ForEach(item => { var EffluentData = CenterControls.FirstOrDefault(item => item.UIName.In("F1")); if (EffluentData is not null && areas[0].Status) { EffluentData.BackColor = "#99CCCC"; } if (EffluentData is not null && !areas[0].Status) { EffluentData.BackColor = "#FFCCCC"; } }); } catch (Exception ex) { logger.LogError(ex.ToString()); } } /// /// 按钮样式改变 /// private void ChangePauseIcon() { try { (PauseIcon, PauseText) = _config.TaskRunning ? ($"{ResourcePath}暂停.png", "任务暂停") : ($"{ResourcePath}继续.png", "任务继续"); } catch (Exception ex) { logger.LogError(ex.Message); } } /// /// 端口连接 /// private async void PortClient() { try { (string portName, bool clientState) = await _controller.ClientOpen(); ClientName = portName; PortClientState = !clientState; PortClientColor = clientState ? Brushes.LightGreen : "#FF6666".ConvertToBrush(); #region 设置电机速度 if (_config.SpeedWrite && clientState) { _config.GetSpeed.ForEach(item => { var res = _controller.SetSpeed(item); var logStr = $"{item.Description}速度设置{(res ? "成功" : "失败")}"; logger.LogInformation(logStr); UMessageBox.InfoTip(logStr); }); } #endregion } catch (Exception ex) { logger.LogError(ex.ToString()); } } #endregion #region Command private DelegateCommand _mainCloseCommand; public DelegateCommand MainCloseCommand => _mainCloseCommand ??= new DelegateCommand(ExecuteMainCloseCommand); public DelegateCommand _lockDestCommand; public DelegateCommand LockDestCommand => _lockDestCommand ?? new DelegateCommand(ExecuteLockDestCommand); public DelegateCommand _taskStartCommand; public DelegateCommand TaskStartCommand => _taskStartCommand ?? new DelegateCommand(ExecuteTaskStartCommand); public DelegateCommand _taskPauseCommand; public DelegateCommand TaskPauseCommand => _taskPauseCommand ?? new DelegateCommand(ExecuteTaskPauseCommand); public DelegateCommand _exportWordCommand; public DelegateCommand ExportWordCommand => _exportWordCommand ?? new DelegateCommand(ExecuteExportWordCommand); public DelegateCommand _frushClientCommand; public DelegateCommand FrushClientCommand => _frushClientCommand ?? new DelegateCommand(ExecuteFrushClientCommand); public DelegateCommand _clearPipeCommand; public DelegateCommand ClearPipeCommand => _clearPipeCommand ?? new DelegateCommand(ExecuteClearPipeCommand); private DelegateCommand _washChooseCommand; public DelegateCommand WashChooseCommand => _washChooseCommand ?? new DelegateCommand(() => { string pathFile = "/SHJX.Service.Resource;component/Resources/"; WashIcon = $"{pathFile}{((bool)WhetherWash ? "clear_selected.png" : "clear_unselected.png")}"; }); public DelegateCommand _manualControlCommand; public DelegateCommand ManualControlCommand => _manualControlCommand ?? new DelegateCommand(() => { Messager.Send("ShowWindow", "manual"); }); public DelegateCommand _settingCommand; public DelegateCommand SettingCommand => _settingCommand ?? new DelegateCommand(() => { Messager.Send("ShowWindow", "setting"); }); public DelegateCommand _aboutSystemCommand; public DelegateCommand AboutSystemCommand => _aboutSystemCommand ?? new DelegateCommand(() => { Messager.Send("ShowWindow", "about"); }); private DelegateCommand _screenCaptureCommand; public DelegateCommand ScreenCaptureCommand => _screenCaptureCommand ?? new DelegateCommand(() => { Messager.Send("ScreenShot"); }); private DelegateCommand _minSizeCommand; public DelegateCommand MinSizeCommand => _minSizeCommand ?? new DelegateCommand(() => { Messager.Send("SystemMinSize"); }); public DelegateCommand _templateCommand; public DelegateCommand TemplateCommand => _templateCommand ?? new DelegateCommand(() => { Messager.Send("ShowWindow", "template"); }); #endregion #region Execute Command private void ExecuteMainCloseCommand() { Application.Current.Shutdown(); } private void ExecuteLockDestCommand() { try { MainHiddenValue = (bool)WhetherLockMain! ? Visibility.Visible : Visibility.Hidden; } catch (Exception ex) { logger.LogError(ex.Message); } } private void ADDcup(int kbypCount, int bbCount, int totalCount,int bdCount,int DigestionPositionNumFlag) { if (kbypCount == 0|| DigestionPositionNumFlag ==0)//如果没有水样和空白不需要补杯 return; int addCupNum = 0; if (kbypCount > DigestionPositionNumFlag) { addCupNum= 2*DigestionPositionNumFlag - kbypCount - bbCount- bdCount; } else addCupNum = DigestionPositionNumFlag - kbypCount - bbCount;//补杯数量是总的位置减去水样和空白的个数 if (addCupNum < 0) { if (-addCupNum <= bbCount)//需要减杯 { for (int j = 0; j < -addCupNum; j++) { _controller.deleteTask(_detailArgs.LastOrDefault(item => item.SampleType == "补杯").NodeName); _detailArgs.Remove(_detailArgs.LastOrDefault(item => item.SampleType == "补杯")); } } else//第二锅需要加杯 { addCupNum = Math.Abs(DigestionPositionNumFlag + addCupNum - bdCount- 2*bbCount); } } if (addCupNum + bbCount + kbypCount < 2 * DigestionPositionNumFlag && addCupNum + bbCount + kbypCount > DigestionPositionNumFlag) { _config.UpdateIsAddCupBiaoDingBubei("True"); } else _config.UpdateIsAddCupBiaoDingBubei("False"); if (addCupNum > 0) { bool left = true; for (var i = 0; i < addCupNum; i++) { string nodeName = null; List parm = new List(from SampleDetail item in _detailArgs where item.TaskSendOk is not true select item.NodeName); for (int j = 0; j < LeftSampleAreas.Count && left; j++) { if (parm.Contains(LeftSampleAreas[j].UIName) || LeftSampleAreas[j].DetailInfo != "") { if (j == LeftSampleAreas.Count - 1) { left = false; } continue; } else { nodeName = LeftSampleAreas[j].UIName; break; } } for (int j = 0; j < RightSampleAreas.Count && !left; j++) { if (parm.Contains(RightSampleAreas[j].UIName) || RightSampleAreas[j].DetailInfo != "") continue; else { nodeName = RightSampleAreas[j].UIName; break; } } SampleDetail detailArgs = new SampleDetail() { NodeName = nodeName, Detail = "补杯", HgSO4 = 0, SampleType = "补杯", Concentration = "低", WhetherSend = true, }; _detailArgs.Add(detailArgs); } } } private void ExecuteTaskStartCommand() { try { int kbypCount = 0; int bbCount = 0; int totalCount = 0; int bdCount = 0; string[] template = new string[2] { "水样", "空白" }; foreach (var sample in _detailArgs) { totalCount++; if (template.Contains(sample.SampleType)) { kbypCount++; } if (sample.SampleType.Equals("补杯")) { bbCount++; } if (sample.SampleType.Equals("标定")) { bdCount++; } } if (totalCount - bdCount > 2 * DigestionPositionNumFlag) { UMessageBox.Error("数量超过,无法下发!"); return; } DigestionPositionNumFlag = DataCentre.getDigestionPositionCount(); if (_config.IsAddCupFeedBack) //是否补杯 { ADDcup( kbypCount, bbCount, totalCount, bdCount, DigestionPositionNumFlag); } List samplesBB = new List(); var samples = (from SampleDetail item in _detailArgs where item.TaskSendOk is not true select item).ToList(); samplesBB = (from SampleDetail item in _detailArgs where item.TaskSendOk is not true && item.SampleType == "补杯" select item).ToList(); if (!samples.Any()) { UMessageBox.Error("未选择样品,无法进行任务下发!"); return; } int lowSample = 0; int highSample = 0; int totalSample = 0; foreach (var item in samples) { totalSample++; if (item.Concentration == "低") { lowSample++; } else highSample++; } string[] types = new string[] {"Water", "Indicator", "Mercury", "SilverSulfate", "PotassiumDichromate_Low", "PotassiumDichromate_High", "FAS", "FAS2"}; double[] typeVolumn = new double[] { totalSample * 45, totalSample * 0.2, totalSample * 2, totalSample * 15 , lowSample *5 , highSample * 5 , lowSample * 25 , highSample * 25 }; for(int i=0; i<8; i++) { LiquidTotal liquid = DataCentre._dataManager.Query().Where(it => it.LiquidName.Equals(types[i])).First(); if (liquid.Total < typeVolumn[i]) { UMessageBox.Info("“" + liquid.Description + "”- 试剂不足,请检查"); return; } } var sb = new StringBuilder(); sb.Append($"请检查废液位是否放有空杯!\n\n"); sb.Append($"当前下发任务数量共计:{samples.Count- samplesBB.Count }条\n\n"); sb.Append($"共需试剂数量如下:\n"); sb.Append($"H2SO4/Ag2SO4:{samples.Count * 15}ml\n"); sb.Append($"HgSO4:{samples.Count * 2}ml\n"); sb.Append($"K2Cr2O7:{samples.Count * 5}ml\n"); sb.Append($"(NH4)2FeSO4:{samples.Count * 25}ml\n"); sb.Append($"H2O:{samples.Count * 45}ml\n\n"); sb.Append("请确定任务是否下发?"); var result = UMessageBox.Info(sb.ToString()); if (result.Equals(MessageBoxResult.No)) return; string waveKey = _controller.GetWavekey(); if ((bool)WhetherWash! && !_controller.CheckExistTask()) { _controller.SendWashTask("润洗", ""); } var resInfo = _controller.SendSampleToControl(samples, waveKey); foreach (var item in resInfo) { switch (item.Code) { case 200: UMessageBox.SuccessTip(item.Message); for (int i = 0; i < 24; i++) { var leftSample = (from SampleDetail items in _detailArgs where items.NodeName == LeftSampleAreas[i].UIName select items).FirstOrDefault(); if (leftSample is not null) { LeftSampleAreas[i].TagColor = "#ff99cc"; LeftSampleAreas[i].DetailInfo = leftSample.Detail; if (leftSample.SampleType == "补杯") { LeftSampleAreas[i].TagColor = "#ffcccc"; } } else { LeftSampleAreas[i].DetailInfo = ""; LeftSampleAreas[i].TagColor = "#99CCCC"; } var rightSample = (from SampleDetail items in _detailArgs where items.NodeName == RightSampleAreas[i].UIName select items).FirstOrDefault(); if (rightSample is not null) { RightSampleAreas[i].TagColor = "#ff99cc"; RightSampleAreas[i].DetailInfo = rightSample.Detail; if (rightSample.SampleType == "补杯") { RightSampleAreas[i].TagColor = "#ffcccc"; } } else { RightSampleAreas[i].DetailInfo = ""; RightSampleAreas[i].TagColor = "#99CCCC"; } //var first = _detailArgs.FirstOrDefault(it => it.NodeName.Equals(task.NodeName)); //if (first != null) first.TaskSendOk = true; } break; case 404: var tasks = _controller.GetResidueTask(); tasks.Where(item => item.Status.Equals(TaskState.New) || item.Status.Equals(TaskState.Doing)).ToList().ForEach(task => { var leftSample = LeftSampleAreas.FirstOrDefault(item => item.UIName.Equals(task.OriginLocalName)); if (leftSample is not null) { LeftSampleAreas[leftSample.Index].TagColor = "#ff99cc"; LeftSampleAreas[leftSample.Index].DetailInfo = task.TaskDetailName; if (task.TaskDetailName == "补杯") { LeftSampleAreas[leftSample.Index].TagColor = "#ffcccc"; } } var rightSample = RightSampleAreas.FirstOrDefault(item => item.UIName.Equals(task.OriginLocalName)); if (rightSample is not null) { RightSampleAreas[rightSample.Index].TagColor = "#ff99cc"; RightSampleAreas[rightSample.Index].DetailInfo = task.TaskDetailName; if (task.TaskDetailName == "补杯") { RightSampleAreas[rightSample.Index].TagColor = "#ffcccc"; } } }); UMessageBox.ErrorTip(item.Message); break; } } } catch (Exception ex) { logger.LogError(ex.Message); } } private void ExecuteTaskPauseCommand() { (var value, var strValue) = _config.TaskRunning ? (false, "任务暂停成功!\n如有后续人为操作,请等到机器停止后,再进行相关操作!") : (true, "任务继续!\n请确保无人员继续操作机器!"); _config.UpdateTaskRunning(value); ChangePauseIcon(); logger.LogInformation(strValue); UMessageBox.SingleBtnInfo(strValue); } #if false private void ExecuteExportTemplateCommand() { try { if (UMessageBox.Info("是否确定导出模板?").Equals(MessageBoxResult.No)) return; if (string.IsNullOrWhiteSpace(_config.TemplateFilePath)) { UMessageBox.ErrorTip($"导出模板失败,地址为空!"); return; } var dt = new DataTable("Template"); dt.Columns.Add("节点名称", Type.GetType("System.String")!); dt.Columns.Add("详细描述", Type.GetType("System.String")!); dt.Columns.Add("样品体积", Type.GetType("System.Double")!); dt.Columns.Add("样品倍数", Type.GetType("System.Double")!); dt.Columns.Add("硫酸汞", Type.GetType("System.Double")!); dt.Columns.Add("样品类型", Type.GetType("System.String")!); dt.Columns.Add("样品浓度", Type.GetType("System.String")!); dt.Columns.Add("是否下发", Type.GetType("System.Boolean")!); _detailArgs.ForEach(item => { dt.Rows.Add(item.NodeName, item.Detail, item.SampleVolume, item.Multiple, item.HgSO4, item.SampleType, item.Concentration, item.WhetherSend); }); dt.ConvertToExcel(_config.TemplateFilePath); UMessageBox.SuccessTip("模板导出成功!"); } catch (Exception ex) { UMessageBox.ErrorTip($"导出模板失败,失败原因:{ex.Message}"); logger.LogError($"导出模板失败,失败原因:{ex.Message}"); } } private void ExecuteImportTemplateCommand() { try { if (UMessageBox.Info("是否确定导入模板?").Equals(MessageBoxResult.No)) return; if (string.IsNullOrWhiteSpace(_config.TemplateFilePath)) { UMessageBox.ErrorTip($"导入模板失败,地址为空!"); return; } if (!File.Exists(_config.TemplateFilePath)) { UMessageBox.ErrorTip($"导入模板失败,文件不存在,请检查地址是否有误!"); return; } DataTable dt = _config.TemplateFilePath.ReadExcel(); var args = dt.ConvertToList(); args.ForEach(item => { SetSample(item); }); UMessageBox.SuccessTip("模板导入成功!"); } catch (Exception ex) { UMessageBox.ErrorTip($"导入模板失败,失败原因:{ex.Message}"); logger.LogError($"导入模板失败,失败原因:{ex.Message}"); } } #endif private void ExecuteExportWordCommand() { try { string wavekey = _controller.GetWavekeyValue(); if (string.IsNullOrWhiteSpace(wavekey)) return; //if (UMessageBox.Info("是否确定导出结果?").Equals(MessageBoxResult.No)) return; //if (_config.ExportTypeByExcel) //{ // //ExportResultToExcel(wavekey, () => UMessageBox.SuccessTip("导出成功")); //} //else if (_config.ExportTypeByWord) //{ ExportResultToWord(wavekey, () => UMessageBox.SuccessTip("导出成功")); //} } catch (Exception ex) { UMessageBox.ErrorTip($"导出Word失败,失败原因:{ex.Message}"); logger.LogError($"导出Word失败,失败原因:{ex}"); } } private void ExecuteFrushClientCommand() { PortClient(); } private void ExecuteClearPipeCommand() { if (UMessageBox.Info("是否下发清洗任务?").Equals(MessageBoxResult.No)) return; var res = _controller.SendWashTask("清洗",""); UMessageBox.InfoTip($"清洗任务下发{(res ? "成功" : "失败")}"); } #endregion } }