009_DI-Elec/newFront/c#前端/SWS.CAD/ViewModels/DialogSignalPredistributionViewModel.cs

644 lines
22 KiB
C#
Raw Normal View History

2025-09-09 08:58:50 +08:00

using Aspose.Cells;
2025-09-12 12:03:20 +08:00
using Prism.Events;
2025-09-09 08:58:50 +08:00
using Prism.Ioc;
using Prism.Services.Dialogs;
2025-09-12 12:03:20 +08:00
using SWS.CAD.Event;
2025-09-09 08:58:50 +08:00
using SWS.CAD.ViewModels.myViewModelBase;
using SWS.CAD.Views;
using SWS.CAD.Views.CustomControl;
using SWS.Commons;
2025-09-12 12:03:20 +08:00
using SWS.Model;
using SWS.Service;
2025-09-09 08:58:50 +08:00
using System;
2025-09-12 12:03:20 +08:00
using System.Collections.Generic;
2025-09-09 08:58:50 +08:00
using System.Collections.ObjectModel;
2025-09-12 12:03:20 +08:00
using System.Linq;
2025-09-09 08:58:50 +08:00
using System.Windows;
2025-09-12 12:03:20 +08:00
using System.Windows.Controls;
using System.Windows.Documents;
2025-09-09 08:58:50 +08:00
using System.Windows.Input;
2025-09-12 12:03:20 +08:00
using Telerik.Windows.Controls;
2025-09-09 08:58:50 +08:00
using Unity;
namespace SWS.CAD.ViewModels
{
2025-09-23 16:38:40 +08:00
/// <summary>
/// 信号预分配页面的模型类
/// </summary>
2025-09-09 08:58:50 +08:00
public class DialogSignalPredistributionViewModel : DialogBase, IDialogAware
{
2025-09-12 12:03:20 +08:00
#region
private ObservableCollection<Model.TreeModel> _PanelTreels = new ObservableCollection<Model.TreeModel>();
2025-09-09 08:58:50 +08:00
/// <summary>
2025-09-12 12:03:20 +08:00
/// 页面左侧树形结构数据
2025-09-09 08:58:50 +08:00
/// </summary>
2025-09-12 12:03:20 +08:00
public ObservableCollection<Model.TreeModel> PanelTreels
{
get { return _PanelTreels; }
set { _PanelTreels = value; RaisePropertyChanged(nameof(PanelTreels)); }
}
private Model.TreeModel _SelectedTreeNode;
/// <summary>
/// 当前选中的树形节点
/// </summary>
public Model.TreeModel SelectedTreeNode
{
get { return _SelectedTreeNode; }
set
{
_SelectedTreeNode = value;
RaisePropertyChanged(nameof(SelectedTreeNode));
var path= FindNodePath(PanelTreels, _SelectedTreeNode);
_eventAggregator.GetEvent<ScrollToItemEvent>().Publish(path);
}
}
private ObservableCollection<SignalPredistributionInfo> _SignalPredistributionInfos = new ObservableCollection<SignalPredistributionInfo>();
/// <summary>
/// 表格数据
/// </summary>
public ObservableCollection<SignalPredistributionInfo> SignalPredistributionInfos
{
get { return _SignalPredistributionInfos; }
set
{
_SignalPredistributionInfos = value;
RaisePropertyChanged(nameof(SignalPredistributionInfos));
}
}
private string _SelectedOption1;
/// <summary>
/// 是否通讯母线
/// </summary>
public string SelectedOption1
{
get { return _SelectedOption1; }
set
{
_SelectedOption1 = value;
RaisePropertyChanged(nameof(SelectedOption1));
}
}
private string _SelectedOption2;
/// <summary>
/// 选择的信号类型
/// </summary>
public string SelectedOption2
{
get { return _SelectedOption2; }
set
{
_SelectedOption2 = value;
SignalColumnName = value;
RaisePropertyChanged(nameof(SelectedOption2));
}
}
private string _SignalColumnName;
/// <summary>
/// 信号类型列的列名
/// </summary>
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<string>() { "输出", "输入" };
}
else
{
InorOuts = new List<string>() { tempIntorOut };
}
2025-09-12 12:03:20 +08:00
SignalTypeColumn = new ObservableCollection<string>() { "无公共端接线(断开报警NC)", "无公共端接线(闭合报警NO)", "带公共端接线(断开报警NC)", "带公共端接线(闭合报警NO)" };
}
else if (value.Equals("4-20mA"))
{
InorOuts= new List<string>() { "输出", "输入" };
2025-09-12 12:03:20 +08:00
SignalTypeColumn = new ObservableCollection<string>() { "无源", "有源" };
}
else if (value.Equals("-10V-10V"))
{
InorOuts = new List<string>() { "输出", "输入" };
2025-09-12 12:03:20 +08:00
SignalTypeColumn = new ObservableCollection<string>() { "无源", "有源" };
}
else if (value.Equals("PT100"))
{
InorOuts = new List<string>() { "输出", "输入" };
2025-09-12 12:03:20 +08:00
SignalTypeColumn = new ObservableCollection<string>() { "量程100", "量程150", "量程200", "量程600" };
}
else if (value.Equals("Pulse"))
{
InorOuts = new List<string>() { "输出", "输入" };
2025-09-12 12:03:20 +08:00
SignalTypeColumn = new ObservableCollection<string>() { "脉冲信号" };
}
}
}
private List<string> _CommunicationFormats = new List<string>() { "RS485", "RS482", "TCP/IP", "MQTT" };
/// <summary>
/// 通讯格式集合
/// </summary>
public List<string> CommunicationFormats
{
get { return _CommunicationFormats; }
set
{
_CommunicationFormats = value;
RaisePropertyChanged(nameof(CommunicationFormats));
}
}
private string _CommunicationFormat = "RS485";
/// <summary>
/// 通讯格式
/// </summary>
public string CommunicationFormat
{
get { return _CommunicationFormat; }
set
{
_CommunicationFormat = value;
RaisePropertyChanged(nameof(CommunicationFormat));
}
}
private ObservableCollection<string> _SignalTypeColumn;
/// <summary>
/// 信号类型列的下拉列表
/// </summary>
public ObservableCollection<string> SignalTypeColumn
{
get { return _SignalTypeColumn; }
set
{
_SignalTypeColumn = value;
RaisePropertyChanged(nameof(SignalTypeColumn));
if (SignalPredistributionInfos != null)
{
foreach (var item in SignalPredistributionInfos)
{
item.SignalType = _SignalTypeColumn.FirstOrDefault();
}
}
}
}
private List<string> _InorOuts = new List<string>() { "输出", "输入" };
/// <summary>
/// 输入/输出列的下拉列表
/// </summary>
public List<string> InorOuts
{
get { return _InorOuts; }
set
{
_InorOuts = value;
RaisePropertyChanged(nameof(InorOuts));
}
}
#endregion
IOModuleService _iOModuleService;
IEventAggregator _eventAggregator;
2025-09-09 08:58:50 +08:00
public DialogSignalPredistributionViewModel()
{
2025-09-12 12:03:20 +08:00
_iOModuleService = GlobalObject.container.Resolve<IOModuleService>();
_eventAggregator = GlobalObject.container.Resolve<IEventAggregator>();
2025-09-09 08:58:50 +08:00
}
public string Title => "";
public event Action<IDialogResult> RequestClose;
public bool CanCloseDialog()
{
return true;
}
public void OnDialogClosed()
{
}
2025-09-12 12:03:20 +08:00
private ec_Cable CableBy;
public async void OnDialogOpened(IDialogParameters parameters)
2025-09-09 08:58:50 +08:00
{
2025-09-12 12:03:20 +08:00
title = $"电缆信号({parameters.GetValue<string>(GlobalObject.dialogPar.para2.ToString())})预分配";
//树形结构数据
PanelTreels.AddRange(await _iOModuleService.GetPanelTree());
//电缆信息
CableBy = parameters.GetValue<ec_Cable>(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();
2025-09-12 12:03:20 +08:00
}
else
{
predistributionInfo.InorOut = Set.PreAssignInOrOut;
}
predistributionInfo.SensorCode = Set.PreAssignSensorCode;
//给每一行添加委托事件
predistributionInfo.UpdateInorOutsChanged += (sender, e) => UpdateInorOuts((SignalPredistributionInfo)sender);
2025-09-12 12:03:20 +08:00
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;
}
}
}
}
2025-09-09 08:58:50 +08:00
}
2025-09-12 12:03:20 +08:00
public override async void ExecuteOKCommandAsync(object para)
2025-09-09 08:58:50 +08:00
{
2025-09-12 12:03:20 +08:00
//创建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;
}
2025-09-09 08:58:50 +08:00
2025-09-12 12:03:20 +08:00
newCable.UpdateUserID = GlobalObject.userInfo.userId;
newCable.Sets = new List<ec_CableSet>();
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<ec_CableSetWire>();
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);
2025-09-09 08:58:50 +08:00
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();
}
2025-09-12 12:03:20 +08:00
#region
public ICommand ButtonCmd => new DelegateCommand(Button_Click);
/// <summary>
/// 页面左侧按钮
/// </summary>
/// <param name="parameter"></param>
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<string>() { sender.InorOut };
if (sender.SignalType.Contains("带公共端"))
{
InorOuts = new List<string>() { "输入" };
}
}
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
2025-09-12 12:03:20 +08:00
#region
public List<string> FindNodePath(ObservableCollection<TreeModel> nodes, TreeModel targetNode)
{
List<string> path = new List<string>();
FindNodePathRecursive(nodes, targetNode, path);
return path;
}
private bool FindNodePathRecursive(IEnumerable<TreeModel> nodes, TreeModel targetNode, List<string> 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
2025-09-09 08:58:50 +08:00
}
2025-09-12 12:03:20 +08:00
public class SignalPredistributionInfo : DialogBase
{
public event EventHandler UpdateInorOutsChanged;
2025-09-12 12:03:20 +08:00
#region
private ObservableCollection<string> _Index = new ObservableCollection<string>();
/// <summary>
/// 序号集合
/// </summary>
public ObservableCollection<string> Index
{
get { return _Index; }
set { _Index = value; }
}
private string _CablePair;
/// <summary>
/// 电缆对
/// </summary>
public string CablePair
{
get { return _CablePair; }
set { _CablePair = value; }
}
private ObservableCollection<ec_CableSetWire> _CableWires = new ObservableCollection<ec_CableSetWire>();
/// <summary>
/// 电缆线号
/// </summary>
public ObservableCollection<ec_CableSetWire> CableWires
{
get { return _CableWires; }
set { _CableWires = value; }
}
private ObservableCollection<ec_CableSetWire> _Polaritys = new ObservableCollection<ec_CableSetWire>();
/// <summary>
/// 极性
/// </summary>
public ObservableCollection<ec_CableSetWire> Polaritys
{
get { return _Polaritys; }
set
{
_Polaritys = value;
RaisePropertyChanged(nameof(Polaritys));
}
}
private string _SignalType;
/// <summary>
/// 信号类型
/// </summary>
public string SignalType
{
get { return _SignalType; }
set
{
_SignalType = value;
RaisePropertyChanged(nameof(SignalType));
UpdateInorOutsChanged?.Invoke(this, EventArgs.Empty);
2025-09-12 12:03:20 +08:00
}
}
private string _ChineseDescription;
/// <summary>
/// 中文描述
/// </summary>
public string ChineseDescription
{
get { return _ChineseDescription; }
set
{
_ChineseDescription = value;
RaisePropertyChanged(nameof(ChineseDescription));
}
}
private string _EnglishDescription;
/// <summary>
/// 英文描述
/// </summary>
public string EnglishDescription
{
get { return _EnglishDescription; }
set
{
_EnglishDescription = value;
RaisePropertyChanged(nameof(EnglishDescription));
}
}
private string _InorOut;
/// <summary>
/// 输入/输出
/// </summary>
public string InorOut
{
get { return _InorOut; }
set
{
_InorOut = value;
RaisePropertyChanged(nameof(InorOut));
UpdateInorOutsChanged?.Invoke(this, EventArgs.Empty);
2025-09-12 12:03:20 +08:00
}
}
private string _SensorCode;
/// <summary>
/// 传感器编号
/// </summary>
public string SensorCode
{
get { return _SensorCode; }
set
{
_SensorCode = value;
RaisePropertyChanged(nameof(SensorCode));
}
}
private ObservableCollection<ec_PanelStripTerm> _Terms = new ObservableCollection<ec_PanelStripTerm>();
/// <summary>
/// 端子号集合
/// </summary>
public ObservableCollection<ec_PanelStripTerm> Terms
{
get { return _Terms; }
set { _Terms = value; }
}
#endregion
}
2025-09-09 08:58:50 +08:00
}