using Aspose.Cells; using Prism.Events; using Prism.Ioc; using Prism.Services.Dialogs; using SWS.CAD.Event; using SWS.CAD.ViewModels.myViewModelBase; using SWS.CAD.Views; using SWS.CAD.Views.CustomControl; using SWS.Commons; using SWS.Model; using SWS.Service; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using Telerik.Windows.Controls; using Unity; namespace SWS.CAD.ViewModels { /// /// 信号预分配页面的模型类 /// public class DialogSignalPredistributionViewModel : DialogBase, IDialogAware { #region 字段 private ObservableCollection _PanelTreels = new ObservableCollection(); /// /// 页面左侧树形结构数据 /// public ObservableCollection PanelTreels { get { return _PanelTreels; } set { _PanelTreels = value; RaisePropertyChanged(nameof(PanelTreels)); } } private Model.TreeModel _SelectedTreeNode; /// /// 当前选中的树形节点 /// public Model.TreeModel SelectedTreeNode { get { return _SelectedTreeNode; } set { _SelectedTreeNode = value; RaisePropertyChanged(nameof(SelectedTreeNode)); var path= FindNodePath(PanelTreels, _SelectedTreeNode); _eventAggregator.GetEvent().Publish(path); } } private ObservableCollection _SignalPredistributionInfos = new ObservableCollection(); /// /// 表格数据 /// public ObservableCollection SignalPredistributionInfos { get { return _SignalPredistributionInfos; } set { _SignalPredistributionInfos = value; RaisePropertyChanged(nameof(SignalPredistributionInfos)); } } private string _SelectedOption1; /// /// 是否通讯母线 /// public string SelectedOption1 { get { return _SelectedOption1; } set { _SelectedOption1 = value; RaisePropertyChanged(nameof(SelectedOption1)); } } private string _SelectedOption2; /// /// 选择的信号类型 /// public string SelectedOption2 { get { return _SelectedOption2; } set { _SelectedOption2 = value; SignalColumnName = value; RaisePropertyChanged(nameof(SelectedOption2)); } } private string _SignalColumnName; /// /// 信号类型列的列名 /// public string SignalColumnName { get { return _SignalColumnName; } set { _SignalColumnName = value; RaisePropertyChanged(nameof(SignalColumnName)); if (value.Equals("Digital")) { //判断是否输入输出是否有值,有值下拉可选项需要设置为已有值 string tempIntorOut= SignalPredistributionInfos.Where(s => !string.IsNullOrEmpty(s.InorOut)).Select(s => s.InorOut).FirstOrDefault(); if (string.IsNullOrEmpty(tempIntorOut)) { InorOuts = new List() { "输出", "输入" }; } else { InorOuts = new List() { tempIntorOut }; } SignalTypeColumn = new ObservableCollection() { "无公共端接线(断开报警NC)", "无公共端接线(闭合报警NO)", "带公共端接线(断开报警NC)", "带公共端接线(闭合报警NO)" }; } else if (value.Equals("4-20mA")) { InorOuts= new List() { "输出", "输入" }; SignalTypeColumn = new ObservableCollection() { "无源", "有源" }; } else if (value.Equals("-10V-10V")) { InorOuts = new List() { "输出", "输入" }; SignalTypeColumn = new ObservableCollection() { "无源", "有源" }; } else if (value.Equals("PT100")) { InorOuts = new List() { "输出", "输入" }; SignalTypeColumn = new ObservableCollection() { "量程100", "量程150", "量程200", "量程600" }; } else if (value.Equals("Pulse")) { InorOuts = new List() { "输出", "输入" }; SignalTypeColumn = new ObservableCollection() { "脉冲信号" }; } } } private List _CommunicationFormats = new List() { "RS485", "RS482", "TCP/IP", "MQTT" }; /// /// 通讯格式集合 /// public List CommunicationFormats { get { return _CommunicationFormats; } set { _CommunicationFormats = value; RaisePropertyChanged(nameof(CommunicationFormats)); } } private string _CommunicationFormat = "RS485"; /// /// 通讯格式 /// public string CommunicationFormat { get { return _CommunicationFormat; } set { _CommunicationFormat = value; RaisePropertyChanged(nameof(CommunicationFormat)); } } private ObservableCollection _SignalTypeColumn; /// /// 信号类型列的下拉列表 /// public ObservableCollection SignalTypeColumn { get { return _SignalTypeColumn; } set { _SignalTypeColumn = value; RaisePropertyChanged(nameof(SignalTypeColumn)); if (SignalPredistributionInfos != null) { foreach (var item in SignalPredistributionInfos) { item.SignalType = _SignalTypeColumn.FirstOrDefault(); } } } } private List _InorOuts = new List() { "输出", "输入" }; /// /// 输入/输出列的下拉列表 /// public List InorOuts { get { return _InorOuts; } set { _InorOuts = value; RaisePropertyChanged(nameof(InorOuts)); } } #endregion IOModuleService _iOModuleService; IEventAggregator _eventAggregator; public DialogSignalPredistributionViewModel() { _iOModuleService = GlobalObject.container.Resolve(); _eventAggregator = GlobalObject.container.Resolve(); } public string Title => ""; public event Action RequestClose; public bool CanCloseDialog() { return true; } public void OnDialogClosed() { } private ec_Cable CableBy; public async void OnDialogOpened(IDialogParameters parameters) { title = $"电缆信号({parameters.GetValue(GlobalObject.dialogPar.para2.ToString())})预分配"; //树形结构数据 PanelTreels.AddRange(await _iOModuleService.GetPanelTree()); //电缆信息 CableBy = parameters.GetValue(GlobalObject.dialogPar.para1.ToString()); //是否母线 if (CableBy.CableClass.Equals("homerun")) { SelectedOption1 = "是"; } else if (CableBy.CableClass.Equals("conventional") || CableBy.CableClass.Equals("")) { SelectedOption1 = "否"; } //设置默认信号类型 if (string.IsNullOrEmpty(CableBy.PreAssignIOType)) { SelectedOption2 = "Digital"; } else { SelectedOption2 = CableBy.PreAssignIOType; } //设置表格数据 int index = 0; foreach (var Set in CableBy.Sets) { SignalPredistributionInfo predistributionInfo = new SignalPredistributionInfo(); predistributionInfo.CablePair = Set.CableSetName; foreach (var Wire in Set.Wires) { index++; predistributionInfo.Index.Add(index.ToString()); predistributionInfo.CableWires.Add(Wire); predistributionInfo.Polaritys.Add(Wire); } if (string.IsNullOrEmpty(Set.PreAssignIOTypeDetail)) { predistributionInfo.SignalType = SignalTypeColumn.FirstOrDefault(); } else { predistributionInfo.SignalType = Set.PreAssignIOTypeDetail; } predistributionInfo.ChineseDescription = Set.PreAssignGroup_Desc; predistributionInfo.EnglishDescription = Set.PreAssignGroup_Desc_EN; if (string.IsNullOrEmpty(Set.PreAssignInOrOut)) { //predistributionInfo.InorOut = InorOuts.FirstOrDefault(); } else { predistributionInfo.InorOut = Set.PreAssignInOrOut; } predistributionInfo.SensorCode = Set.PreAssignSensorCode; //给每一行添加委托事件 predistributionInfo.UpdateInorOutsChanged += (sender, e) => UpdateInorOuts((SignalPredistributionInfo)sender); SignalPredistributionInfos.Add(predistributionInfo); } //是否预关联,有则选中节点 foreach (var Panel in PanelTreels) { if (!string.IsNullOrEmpty(Panel.ID)) { if (Panel.ID.Equals(CableBy.PanelID)) { SelectedTreeNode = Panel; break; } } foreach (var Child in Panel.ChildNodes) { if (!string.IsNullOrEmpty(Child.ID)) { if (Child.ID.Equals(CableBy.PanelID)) { SelectedTreeNode = Child; break; } } } } } public override async void ExecuteOKCommandAsync(object para) { //创建SaveCable接口实例 ec_Cable newCable = new ec_Cable(); if (SelectedOption1.Equals("是")) { newCable.CableClass = "homerun"; newCable.PreAssignIOType = CommunicationFormat; } else { newCable.CableClass = "conventional"; newCable.PreAssignIOType = SelectedOption2; } newCable.CableID = CableBy.CableID; newCable.EngineerDataID = CableBy.EngineerDataID; if (SelectedTreeNode != null) { newCable.PanelID = SelectedTreeNode.ID; } else { MessageBox.Show("请选择系统柜!", "KunHengCAD", MessageBoxButton.OK, MessageBoxImage.Warning); return; } newCable.UpdateUserID = GlobalObject.userInfo.userId; newCable.Sets = new List(); foreach (var CableBySet in CableBy.Sets) { ec_CableSet newCableSet = new ec_CableSet(); newCableSet.CableSetID = CableBySet.CableSetID; newCableSet.CableSetName = CableBySet.CableSetName; newCableSet.CableSetSeq = CableBySet.CableSetSeq; newCableSet.IsConned = CableBySet.IsConned; newCableSet.PreAssignGroup_Desc = SignalPredistributionInfos.FirstOrDefault(s => s.CablePair.Equals(CableBySet.CableSetName)).ChineseDescription; newCableSet.PreAssignGroup_Desc_EN = SignalPredistributionInfos.FirstOrDefault(s => s.CablePair.Equals(CableBySet.CableSetName)).EnglishDescription; newCableSet.PreAssignIOTypeDetail = SignalPredistributionInfos.FirstOrDefault(s => s.CablePair.Equals(CableBySet.CableSetName)).SignalType; newCableSet.PreAssignInOrOut = SignalPredistributionInfos.FirstOrDefault(s => s.CablePair.Equals(CableBySet.CableSetName)).InorOut; newCableSet.PreAssignSensorCode = SignalPredistributionInfos.FirstOrDefault(s => s.CablePair.Equals(CableBySet.CableSetName)).SensorCode; newCableSet.Wires = new List(); foreach (var wire in CableBySet.Wires) { ec_CableSetWire newWire = new ec_CableSetWire(); newWire.Polarity = wire.Polarity; newWire.SetLevel = 0; newWire.WireID = wire.WireID; newWire.Wire_Tag = wire.Wire_Tag; newWire.Wire_Color_ID = wire.Wire_Color_ID; newWire.PreAssignChannelTermNo = SignalPredistributionInfos.FirstOrDefault(s => s.CablePair.Equals(CableBySet.CableSetName)).CableWires.FirstOrDefault(c => c.Wire_Tag.Equals(wire.Wire_Tag)).PreAssignChannelTermNo; newCableSet.Wires.Add(newWire); } newCable.Sets.Add(newCableSet); } var httpres = await _iOModuleService.SaveCable(newCable); IDialogParameters res = new Prism.Services.Dialogs.DialogParameters(); //res.Add(GlobalObject.dialogPar.info.ToString(), TagNumber); RequestClose.Invoke(new DialogResult(ButtonResult.Yes, res)); } 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(); } #region 方法 public ICommand ButtonCmd => new DelegateCommand(Button_Click); /// /// 页面左侧按钮 /// /// public virtual async void Button_Click(object parameter) { #region 清除配置 if (parameter.ToString().Equals("清除配置")) { MessageBoxResult result = MessageBox.Show($"确定删除“{ CableBy.TagNumber}”电缆配置?", "KunHengCAD", MessageBoxButton.OKCancel, MessageBoxImage.Question); if (result == MessageBoxResult.OK) { var httpres = await _iOModuleService.DeleteCableProfile(CableBy.CableID); if (httpres == null) { RequestClose.Invoke(new DialogResult(ButtonResult.Cancel)); this.Dispose(); } } return; } #endregion #region 指定中英文 if (parameter.ToString().Equals("指定中英文")) { //SelectedTreeNode = PanelTreels[2].ChildNodes.LastOrDefault(); return; } #endregion } #region 修改输出和输入的可选项 public void UpdateInorOuts(SignalPredistributionInfo sender) { if (SignalColumnName.Equals("Digital")) { string tempIntorOut = SignalPredistributionInfos.Where(s => !string.IsNullOrEmpty(s.InorOut)).Select(s => s.InorOut).FirstOrDefault(); if (string.IsNullOrEmpty(tempIntorOut)) { InorOuts = new List() { sender.InorOut }; if (sender.SignalType.Contains("带公共端")) { InorOuts = new List() { "输入" }; } } else { if (tempIntorOut.Equals("输出")) { if (sender.SignalType.Contains("带公共端")) { MessageBox.Show("带公共端只能跟输入信号搭配", "KunHengCAD", MessageBoxButton.OK, MessageBoxImage.Warning); //需要还原信号类型的选项 var Set = CableBy.Sets.FirstOrDefault(s => s.CableSetName.Equals(sender.CablePair)); sender.SignalType = SignalTypeColumn.FirstOrDefault(); } } } } } #endregion #region 查找节点路径 public List FindNodePath(ObservableCollection nodes, TreeModel targetNode) { List path = new List(); FindNodePathRecursive(nodes, targetNode, path); return path; } private bool FindNodePathRecursive(IEnumerable nodes, TreeModel targetNode, List currentPath) { foreach (var node in nodes) { currentPath.Add(node.Text); if (node == targetNode) return true; // 找到目标节点,返回True并结束搜索 if (node.ChildNodes.Count > 0 && FindNodePathRecursive(node.ChildNodes, targetNode, currentPath)) return true; // 在子节点中继续搜索并找到目标节点,返回True并结束搜索 currentPath.RemoveAt(currentPath.Count - 1); // 回溯,尝试下一个兄弟节点或父节点的其他兄弟节点 } return false; // 没有找到目标节点,返回False } #endregion #endregion } public class SignalPredistributionInfo : DialogBase { public event EventHandler UpdateInorOutsChanged; #region 字段 private ObservableCollection _Index = new ObservableCollection(); /// /// 序号集合 /// public ObservableCollection Index { get { return _Index; } set { _Index = value; } } private string _CablePair; /// /// 电缆对 /// public string CablePair { get { return _CablePair; } set { _CablePair = value; } } private ObservableCollection _CableWires = new ObservableCollection(); /// /// 电缆线号 /// public ObservableCollection CableWires { get { return _CableWires; } set { _CableWires = value; } } private ObservableCollection _Polaritys = new ObservableCollection(); /// /// 极性 /// public ObservableCollection Polaritys { get { return _Polaritys; } set { _Polaritys = value; RaisePropertyChanged(nameof(Polaritys)); } } private string _SignalType; /// /// 信号类型 /// public string SignalType { get { return _SignalType; } set { _SignalType = value; RaisePropertyChanged(nameof(SignalType)); UpdateInorOutsChanged?.Invoke(this, EventArgs.Empty); } } private string _ChineseDescription; /// /// 中文描述 /// public string ChineseDescription { get { return _ChineseDescription; } set { _ChineseDescription = value; RaisePropertyChanged(nameof(ChineseDescription)); } } private string _EnglishDescription; /// /// 英文描述 /// public string EnglishDescription { get { return _EnglishDescription; } set { _EnglishDescription = value; RaisePropertyChanged(nameof(EnglishDescription)); } } private string _InorOut; /// /// 输入/输出 /// public string InorOut { get { return _InorOut; } set { _InorOut = value; RaisePropertyChanged(nameof(InorOut)); UpdateInorOutsChanged?.Invoke(this, EventArgs.Empty); } } private string _SensorCode; /// /// 传感器编号 /// public string SensorCode { get { return _SensorCode; } set { _SensorCode = value; RaisePropertyChanged(nameof(SensorCode)); } } private ObservableCollection _Terms = new ObservableCollection(); /// /// 端子号集合 /// public ObservableCollection Terms { get { return _Terms; } set { _Terms = value; } } #endregion } }