using Panuon.WPF.UI; using SWRIS.Core; using SWRIS.Enums; using SWRIS.Extensions; using SWRIS.Models; using SWRIS.Models.ViewModel; using System; using System.Collections.ObjectModel; using System.IO.Ports; using System.Linq; using System.Windows.Markup; namespace SWRIS.Pages { /// /// SettingDialog.xaml 的交互逻辑 /// public partial class SettingDialog : WindowX, IComponentConnector { public SettingViewModel SettingView { get; set; } public bool IsAutoStart { get; set; } public SettingDialog() { InitializeComponent(); InitializeSettingView(); DataContext = SettingView; } private void InitializeSettingView() { SettingView = new SettingViewModel { AppName = App.Config.AppName, Version = App.Config.Version, Copyright = App.Config.Copyright, Crane = App.Config.Crane, IpAddress = App.Config.IpAddress, Port = App.Config.Port, AlarmValidCount = App.Config.AlarmValidCount, DamageExtent = App.Config.DamageExtent, DataSaveDays = App.Config.DataSaveDays, ShowDebugMessage = App.Config.ShowDebugMessage, SpeedVariationThreshold = App.Config.SpeedVariationThreshold, SoundRiskLevel = (int)App.Config.SoundRiskLevel, CleanScheduledTime = App.Config.CleanScheduledTime, DamageNearPointCount = App.Config.DamageNearPointCount, Calibration = new CalibrationDataModel { ModuleType = (int)App.Config.Calibration.ModuleType, Trolleys = new ObservableCollection(), Tcp = new TcpDataModel { IpAddress = App.Config.Calibration.Tcp.IpAddress, Port = App.Config.Calibration.Tcp.Port, Station = App.Config.Calibration.Tcp.Station }, Serial = new SerialDataModel { PortName = App.Config.Calibration.Serial.PortName, BaudRate = App.Config.Calibration.Serial.BaudRate, DataBits = App.Config.Calibration.Serial.DataBits, Parity = App.Config.Calibration.Serial.Parity.ToString(), StopBits = (int)App.Config.Calibration.Serial.StopBits, Station = App.Config.Calibration.Serial.Station } } }; LoadTrolleyData(); } private void LoadTrolleyData() { foreach (var trolley in App.Config.Trolleys) { var trolleyLimitData = new TrolleyLimitDataModel { TrolleyId = trolley.Id, TrolleyName = trolley.Name, Limits = new ObservableCollection() }; var trolleyLimits = App.Config.Calibration.Limits .Where(c => c.TrolleyId == trolley.Id) .Select(limit => new LimitDataModel { Name = limit.Name, Address = limit.Address, IsReverse = limit.IsReverse, TrolleyId = trolley.Id, Position = limit.Position, SwitchIndex = limit.SwitchIndex, IsEnable = limit.IsEnable, RelatedRopes = App.Config.Equipments.Where(c => c.TrolleyId == trolley.Id).Select(c => new RopeDataModel { RopeName = c.RopeName, RopeNumber = c.RopeNumber, IsSelected = limit.RelatedRopes.Contains(c.RopeNumber) }).ToList() }) .ToList(); trolleyLimitData.Limits.AddRange(trolleyLimits); SettingView.Calibration.Trolleys.Add(trolleyLimitData); } } private void Save_Click(object sender, System.Windows.RoutedEventArgs e) { try { UpdateConfiguration(); if (ConfigHelper.Set(App.Config)) { IsAutoStart = SettingView.IsAutoStart; DialogResult = true; Close(); } else { LogHelper.Warn("保存配置失败,请检查配置文件权限。"); DialogResult = false; } } catch (Exception ex) { LogHelper.Error($"保存配置时发生错误: {ex.Message}", ex); DialogResult = false; } } private void UpdateConfiguration() { // 更新基本配置 App.Config.Crane = SettingView.Crane; App.Config.IpAddress = SettingView.IpAddress; App.Config.Port = SettingView.Port; App.Config.CleanScheduledTime = SettingView.CleanScheduledTime; App.Config.DataSaveDays = SettingView.DataSaveDays; App.Config.SoundRiskLevel = (RiskLevel)SettingView.SoundRiskLevel; App.Config.SpeedVariationThreshold = SettingView.SpeedVariationThreshold; App.Config.DamageExtent = SettingView.DamageExtent; App.Config.AlarmValidCount = SettingView.AlarmValidCount; App.Config.DamageNearPointCount = SettingView.DamageNearPointCount; App.Config.ShowDebugMessage = SettingView.ShowDebugMessage; // 更新校准配置 UpdateCalibrationConfiguration(); // 更新限制配置 UpdateLimitConfiguration(); } private void UpdateCalibrationConfiguration() { App.Config.Calibration.ModuleType = (ModuleType)SettingView.Calibration.ModuleType; if (SettingView.Calibration.ModuleType == (int)ModuleType.ModbusRtu) { var serial = SettingView.Calibration.Serial; App.Config.Calibration.Serial.PortName = serial.PortName; App.Config.Calibration.Serial.BaudRate = serial.BaudRate; App.Config.Calibration.Serial.DataBits = serial.DataBits; App.Config.Calibration.Serial.Parity = (Parity)Enum.Parse(typeof(Parity), serial.Parity); App.Config.Calibration.Serial.StopBits = (StopBits)serial.StopBits; App.Config.Calibration.Serial.Station = serial.Station; } else { var tcp = SettingView.Calibration.Tcp; App.Config.Calibration.Tcp.IpAddress = tcp.IpAddress; App.Config.Calibration.Tcp.Port = tcp.Port; App.Config.Calibration.Tcp.Station = tcp.Station; } } private void UpdateLimitConfiguration() { // 使用更安全的方式更新限制配置 var limitsToUpdate = SettingView.Calibration.Trolleys .SelectMany(t => t.Limits) .ToList(); foreach (var sourceLimit in limitsToUpdate) { var targetLimit = App.Config.Calibration.Limits .FirstOrDefault(limit => limit.TrolleyId == sourceLimit.TrolleyId && limit.Address == sourceLimit.Address); if (targetLimit != null) { targetLimit.Name = sourceLimit.Name; targetLimit.Address = sourceLimit.Address; targetLimit.Position = sourceLimit.Position; targetLimit.IsEnable = sourceLimit.IsEnable; targetLimit.IsReverse = sourceLimit.IsReverse; targetLimit.SwitchIndex = sourceLimit.SwitchIndex; targetLimit.RelatedRopes = sourceLimit.RelatedRopes .Where(r => r.IsSelected) .Select(r => r.RopeNumber) .ToList(); } } } private void Cancel_Click(object sender, System.Windows.RoutedEventArgs e) { DialogResult = false; Close(); } } }