using Prism.Commands; using Prism.Events; using Prism.Ioc; using Prism.Services.Dialogs; using SWS.CAD.Event; using SWS.Commons; using SWS.Model; using SWS.Service; using SWS.WPF.ViewModels; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Windows; using System.Windows.Input; using Unity; using DelegateCommand = Prism.Commands.DelegateCommand; namespace SWS.CAD.ViewModels { public class DialogParallelCableViewModel : DialogBase, IDialogAware { #region 按钮事件 /// /// 新增位号 /// public ICommand Command_Add { get; set; } /// /// 删除位号 /// public ICommand Command_Delete { get; set; } /// /// 生成 /// public ICommand Command_Build { get; set; } #endregion #region 数据绑定 private ObservableCollection _listTagNumber; /// /// 位号列表 /// public ObservableCollection listTagNumber { get { return this._listTagNumber; } set { if (value != this._listTagNumber) { this._listTagNumber = value; RaisePropertyChanged(nameof(listTagNumber)); } } } private KeyValueModel _selectTag; public KeyValueModel selectTag { get { return this._selectTag; } set { if (value != this._selectTag) { this._selectTag = value; RaisePropertyChanged(nameof(selectTag)); } } } private string _strParallelCable; public string StrParallelCable { get { return this._strParallelCable; } set { if (value != this._strParallelCable) { this._strParallelCable = value; RaisePropertyChanged(nameof(StrParallelCable)); } } } #endregion /// /// 位号 /// private string tagNumber; /// /// 位号数字前的字符串 /// private string preTagNumber; /// /// 位号默认的数字 /// private int num = 0; /// /// 图元类型 /// private ec_objecttype objectType; /// /// 平行电缆属性 /// private propertyModel proModel1; /// /// 平行电缆位号属性 /// private propertyModel proModel2; EnginedataService _enginedataService; ObjectTypeService _objectTypeService; IEventAggregator eventAggregator; public DialogParallelCableViewModel() { _enginedataService = GlobalObject.container.Resolve(); _objectTypeService = GlobalObject.container.Resolve(); eventAggregator = GlobalObject.container.Resolve(); listTagNumber = new ObservableCollection(); Command_Add = new DelegateCommand(onAddTagNumber); Command_Delete = new DelegateCommand(onDeleteTagNumber); Command_Build = new DelegateCommand(onBuild); } #region dialog public string Title => ""; public event Action RequestClose; public bool CanCloseDialog() { return true; } public void OnDialogClosed() { } public void OnDialogOpened(IDialogParameters parameters) { objectType = parameters.GetValue(GlobalObject.dialogPar.info.ToString()); proModel1 = parameters.GetValue(GlobalObject.dialogPar.para1.ToString()); proModel2 = parameters.GetValue(GlobalObject.dialogPar.para2.ToString()); tagNumber = objectType.tags[0].TagNumber; title = $"平行电缆管理 - {tagNumber}"; GlobalObject.GetLastNumber(tagNumber, ref preTagNumber, ref num); StrParallelCable = proModel2.PropertyValue; if (!string.IsNullOrEmpty(proModel1.PropertyValue)) { var listCable = proModel1.PropertyValue.Split(','); for (int i = 0; i < listCable.Length; i++) { listTagNumber.Add(new KeyValueModel() { Key = (i + 1).ToString(), Value= listCable[i] }); } GlobalObject.GetLastNumber(listCable.Last(), ref preTagNumber, ref num); } } #endregion #region 确定 public override void ExecuteOKCommandAsync(object para) { string strValue1=string.Empty; string strValue2 = string.Empty; if (listTagNumber.Any()) { if (string.IsNullOrEmpty(StrParallelCable)) { MessageBox.Show("平行电缆位号不能为空!"); return; } strValue2 = StrParallelCable; strValue1=string.Join(",", listTagNumber.Select(a=>a.Value).ToList()); } proModel1.PropertyValue = strValue1; proModel2.PropertyValue = strValue2; eventAggregator.GetEvent().Publish(proModel1); eventAggregator.GetEvent().Publish(proModel2); DialogResult res = new DialogResult(ButtonResult.Yes); } #endregion #region 取消 public override void ExecuteCloseCommand(object parameter) { if (parameter as string == "ClickNo") { DialogResult res = new DialogResult(ButtonResult.No); RequestClose.Invoke(res); } else { RequestClose.Invoke(new DialogResult(ButtonResult.Cancel)); } this.Dispose(); } #endregion #region 新增位号 public void onAddTagNumber() { num++; var dto = new KeyValueModel() { Key = (listTagNumber.Count + 1).ToString(), Value = preTagNumber + num }; listTagNumber.Add(dto); selectTag = dto; } #endregion #region 删除位号 /// /// 删除位号 /// public void onDeleteTagNumber() { if (selectTag == null) { MessageBox.Show("请选择要删除的位号!"); return; } if (!listTagNumber.Any()) { MessageBox.Show("位号列表不能为空!"); return; } var lastDto = listTagNumber.Last(); if (selectTag == lastDto) { listTagNumber.Remove(selectTag); num--; } else { listTagNumber.Remove(selectTag); } for (int i = 0; i < listTagNumber.Count; i++) { var item = listTagNumber[i]; item.Key = (i + 1).ToString(); } listTagNumber = new ObservableCollection(listTagNumber); } #endregion #region 生成 /// /// 生成平行电缆位 /// public void onBuild() { if (!listTagNumber.Any()) { MessageBox.Show("位号列表不能为空!"); return; } StrParallelCable = FormatCableNumbers(listTagNumber.Select(a => a.Value).ToArray()); } /// /// 根据位号组,生成一定规则的规则字符串 /// public string FormatCableNumbers(string[] input) { string strPre = GetCommonPrefix(input); // 1. 提取数字并排序 List numbers = input .Select(s => int.Parse(s.Substring(strPre.Length))) .OrderBy(n => n) .ToList(); if (numbers.Count == 0) return strPre; // 2. 合并连续数字范围 List ranges = new List(); int currentStart = numbers[0]; int currentEnd = numbers[0]; for (int i = 1; i < numbers.Count; i++) { if (numbers[i] == currentEnd + 1) { currentEnd = numbers[i]; } else { AddRange(ranges, currentStart, currentEnd); currentStart = currentEnd = numbers[i]; } } AddRange(ranges, currentStart, currentEnd); // 3. 拼接最终结果 return $"{strPre}({string.Join(",", ranges)})"; } /// /// 获取字符串数组的最长公共前缀(包含所有字符类型) /// private static string GetCommonPrefix(string[] strs) { if (strs.Length == 0) return ""; string first = strs[0]; int prefixLength = 0; for (int i = 0; i < first.Length; i++) { char currentChar = first[i]; foreach (string s in strs) { if (i >= s.Length || s[i] != currentChar) { return first.Substring(0, prefixLength); } } prefixLength++; } return first.Substring(0, prefixLength); } private void AddRange(List ranges, int start, int end) { ranges.Add(start == end ? start.ToString() : $"{start}~{end}"); } #endregion } }