SettingDialog.xaml.cs 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. using Panuon.WPF.UI;
  2. using SWRIS.Core;
  3. using SWRIS.Enums;
  4. using SWRIS.Extensions;
  5. using SWRIS.Models;
  6. using SWRIS.Models.ViewModel;
  7. using System;
  8. using System.Collections.ObjectModel;
  9. using System.IO.Ports;
  10. using System.Linq;
  11. using System.Windows.Markup;
  12. namespace SWRIS.Pages
  13. {
  14. /// <summary>
  15. /// SettingDialog.xaml 的交互逻辑
  16. /// </summary>
  17. public partial class SettingDialog : WindowX, IComponentConnector
  18. {
  19. public SettingViewModel SettingView { get; set; }
  20. public bool IsAutoStart { get; set; }
  21. public SettingDialog()
  22. {
  23. InitializeComponent();
  24. InitializeSettingView();
  25. DataContext = SettingView;
  26. }
  27. private void InitializeSettingView()
  28. {
  29. SettingView = new SettingViewModel
  30. {
  31. AppName = App.Config.AppName,
  32. Version = App.Config.Version,
  33. Copyright = App.Config.Copyright,
  34. Crane = App.Config.Crane,
  35. IpAddress = App.Config.IpAddress,
  36. Port = App.Config.Port,
  37. AlarmValidCount = App.Config.AlarmValidCount,
  38. DamageExtent = App.Config.DamageExtent,
  39. DataSaveDays = App.Config.DataSaveDays,
  40. ShowDebugMessage = App.Config.ShowDebugMessage,
  41. SpeedVariationThreshold = App.Config.SpeedVariationThreshold,
  42. SoundRiskLevel = (int)App.Config.SoundRiskLevel,
  43. CleanScheduledTime = App.Config.CleanScheduledTime,
  44. DamageNearPointCount = App.Config.DamageNearPointCount,
  45. Calibration = new CalibrationDataModel
  46. {
  47. ModuleType = (int)App.Config.Calibration.ModuleType,
  48. Trolleys = new ObservableCollection<TrolleyLimitDataModel>(),
  49. Tcp = new TcpDataModel
  50. {
  51. IpAddress = App.Config.Calibration.Tcp.IpAddress,
  52. Port = App.Config.Calibration.Tcp.Port,
  53. Station = App.Config.Calibration.Tcp.Station
  54. },
  55. Serial = new SerialDataModel
  56. {
  57. PortName = App.Config.Calibration.Serial.PortName,
  58. BaudRate = App.Config.Calibration.Serial.BaudRate,
  59. DataBits = App.Config.Calibration.Serial.DataBits,
  60. Parity = App.Config.Calibration.Serial.Parity.ToString(),
  61. StopBits = (int)App.Config.Calibration.Serial.StopBits,
  62. Station = App.Config.Calibration.Serial.Station
  63. }
  64. }
  65. };
  66. LoadTrolleyData();
  67. }
  68. private void LoadTrolleyData()
  69. {
  70. foreach (var trolley in App.Config.Trolleys)
  71. {
  72. var trolleyLimitData = new TrolleyLimitDataModel
  73. {
  74. TrolleyId = trolley.Id,
  75. TrolleyName = trolley.Name,
  76. Limits = new ObservableCollection<LimitDataModel>()
  77. };
  78. var trolleyLimits = App.Config.Calibration.Limits
  79. .Where(c => c.TrolleyId == trolley.Id)
  80. .Select(limit => new LimitDataModel
  81. {
  82. Name = limit.Name,
  83. Address = limit.Address,
  84. IsReverse = limit.IsReverse,
  85. TrolleyId = trolley.Id,
  86. Position = limit.Position,
  87. SwitchIndex = limit.SwitchIndex,
  88. IsEnable = limit.IsEnable,
  89. RelatedRopes = App.Config.Equipments.Where(c => c.TrolleyId == trolley.Id).Select(c => new RopeDataModel
  90. {
  91. RopeName = c.RopeName,
  92. RopeNumber = c.RopeNumber,
  93. IsSelected = limit.RelatedRopes.Contains(c.RopeNumber)
  94. }).ToList()
  95. })
  96. .ToList();
  97. trolleyLimitData.Limits.AddRange(trolleyLimits);
  98. SettingView.Calibration.Trolleys.Add(trolleyLimitData);
  99. }
  100. }
  101. private void Save_Click(object sender, System.Windows.RoutedEventArgs e)
  102. {
  103. try
  104. {
  105. UpdateConfiguration();
  106. if (ConfigHelper.Set(App.Config))
  107. {
  108. IsAutoStart = SettingView.IsAutoStart;
  109. DialogResult = true;
  110. Close();
  111. }
  112. else
  113. {
  114. LogHelper.Warn("保存配置失败,请检查配置文件权限。");
  115. DialogResult = false;
  116. }
  117. }
  118. catch (Exception ex)
  119. {
  120. LogHelper.Error($"保存配置时发生错误: {ex.Message}", ex);
  121. DialogResult = false;
  122. }
  123. }
  124. private void UpdateConfiguration()
  125. {
  126. // 更新基本配置
  127. App.Config.Crane = SettingView.Crane;
  128. App.Config.IpAddress = SettingView.IpAddress;
  129. App.Config.Port = SettingView.Port;
  130. App.Config.CleanScheduledTime = SettingView.CleanScheduledTime;
  131. App.Config.DataSaveDays = SettingView.DataSaveDays;
  132. App.Config.SoundRiskLevel = (RiskLevel)SettingView.SoundRiskLevel;
  133. App.Config.SpeedVariationThreshold = SettingView.SpeedVariationThreshold;
  134. App.Config.DamageExtent = SettingView.DamageExtent;
  135. App.Config.AlarmValidCount = SettingView.AlarmValidCount;
  136. App.Config.DamageNearPointCount = SettingView.DamageNearPointCount;
  137. App.Config.ShowDebugMessage = SettingView.ShowDebugMessage;
  138. // 更新校准配置
  139. UpdateCalibrationConfiguration();
  140. // 更新限制配置
  141. UpdateLimitConfiguration();
  142. }
  143. private void UpdateCalibrationConfiguration()
  144. {
  145. App.Config.Calibration.ModuleType = (ModuleType)SettingView.Calibration.ModuleType;
  146. if (SettingView.Calibration.ModuleType == (int)ModuleType.ModbusRtu)
  147. {
  148. var serial = SettingView.Calibration.Serial;
  149. App.Config.Calibration.Serial.PortName = serial.PortName;
  150. App.Config.Calibration.Serial.BaudRate = serial.BaudRate;
  151. App.Config.Calibration.Serial.DataBits = serial.DataBits;
  152. App.Config.Calibration.Serial.Parity = (Parity)Enum.Parse(typeof(Parity), serial.Parity);
  153. App.Config.Calibration.Serial.StopBits = (StopBits)serial.StopBits;
  154. App.Config.Calibration.Serial.Station = serial.Station;
  155. }
  156. else
  157. {
  158. var tcp = SettingView.Calibration.Tcp;
  159. App.Config.Calibration.Tcp.IpAddress = tcp.IpAddress;
  160. App.Config.Calibration.Tcp.Port = tcp.Port;
  161. App.Config.Calibration.Tcp.Station = tcp.Station;
  162. }
  163. }
  164. private void UpdateLimitConfiguration()
  165. {
  166. // 使用更安全的方式更新限制配置
  167. var limitsToUpdate = SettingView.Calibration.Trolleys
  168. .SelectMany(t => t.Limits)
  169. .ToList();
  170. foreach (var sourceLimit in limitsToUpdate)
  171. {
  172. var targetLimit = App.Config.Calibration.Limits
  173. .FirstOrDefault(limit => limit.TrolleyId == sourceLimit.TrolleyId && limit.Address == sourceLimit.Address);
  174. if (targetLimit != null)
  175. {
  176. targetLimit.Name = sourceLimit.Name;
  177. targetLimit.Address = sourceLimit.Address;
  178. targetLimit.Position = sourceLimit.Position;
  179. targetLimit.IsEnable = sourceLimit.IsEnable;
  180. targetLimit.IsReverse = sourceLimit.IsReverse;
  181. targetLimit.SwitchIndex = sourceLimit.SwitchIndex;
  182. targetLimit.RelatedRopes = sourceLimit.RelatedRopes
  183. .Where(r => r.IsSelected)
  184. .Select(r => r.RopeNumber)
  185. .ToList();
  186. }
  187. }
  188. }
  189. private void Cancel_Click(object sender, System.Windows.RoutedEventArgs e)
  190. {
  191. DialogResult = false;
  192. Close();
  193. }
  194. }
  195. }