Imports FlexCell Public Class ReportingScenario Sub New(_UserName As String, _HotleID As String, _RoomTypeID As String, filename As String, Version As String, grd As FlexCell.Grid, Devicemodel As Dictionary(Of String, DeviceModel), ActionConfiguration As List(Of TableRowTag)) UserName = _UserName RoomTypeID = _RoomTypeID HotleID = _HotleID DevColList = New List(Of MTableSet) ' DevRowList = New List(Of MTableSet) ConfigurationName = filename ConfigurationVersion = Version Tgrd = grd TDevicemodel = Devicemodel 'Runing(grd, Devicemodel, ActionConfiguration) End Sub Sub New(grd As FlexCell.Grid, Devicemodel As Dictionary(Of String, DeviceModel)) Tgrd = grd TDevicemodel = Devicemodel End Sub '配置名称 Public ConfigurationName As String '配置版本 Public ConfigurationVersion As String Public HotleID As String Public RoomTypeID As String Public UserName As String Public Tgrd As FlexCell.Grid Public DevColList As List(Of MTableSet) Public TDevicemodel As Dictionary(Of String, DeviceModel) '列集合 '{ ' 设备名 ' 设备节点集合 ' { 节点类型 ' 节点名 ' 节点下属回路集合 键值对 k:回路 v : 回路别名 ' } ''} Public DevRowList As List(Of MTableSet) '行集合 '{ ' 设备名 '' 设备节点集合 '' { 节点类型 '' 节点名 '' 节点下属回路集合 键值对 k:回路 v : 回路别名 '' } '} #Region "数据处理" Public Function getDateDisposeRuning() As List(Of MDevNodeMessage) Return DateDisposeRuning(Tgrd, TDevicemodel) End Function Public Function DateDisposeRuning(_grd As FlexCell.Grid, _Devicemodel As Dictionary(Of String, DeviceModel)) As List(Of MDevNodeMessage) If IsNothing(_grd) Then Return Nothing Dim ACtabRange As CtabRange Dim rt As New RoomTypeConfig(RoomTypeID) Dim ot As String = "1" Dim result As New List(Of MDevNodeMessage) Dim dic As New Dictionary(Of String, MDevNodeMessage) Dim NodeLoopname As String Dim NCtabRange As CtabRange Dim NodeLoop As String = String.Empty For Each Dev In _Devicemodel '遍历设备 For Each DevNode In Dev.Value.Nodes '遍历设备下属子节点 Dim devAddr As String = GetActionDeviceAddr(Dev.Value, DevNode.Name).ToString If DevNode.Interface.Equals("DO") OrElse DevNode.Interface.Equals("LIGHT") Then '判断是否为输出设备 If DevNode.DEV_TYPE_DATA.Equals("4") Then '服务设备节点特殊处理 For ni As Integer = 0 To 14 NodeLoopname = DevNode.Nodes.Item(ni).Name NodeLoop = DevNode.Nodes.Item(ni).LoopAddr NodeLoop = $"{DevNode.DEV_TYPE_DATA.PadLeft(3, "0")}{devAddr.PadLeft(3, "0")}{NodeLoop.PadLeft(3, "0")}" If dic.ContainsKey(NodeLoop) Then Continue For ot = Dev.Value.Name ot = ot.Replace(vbLf, "").Replace(vbCr, "").Replace(":", "").Replace("\", "").Replace("/", "").Replace("|", "").Replace("'", "").Replace("'", "").Replace("?", "").Replace("!", "").Replace("`", "") Dim datenode As New MDevNodeMessage(result.Count, NodeLoop, ot, NodeLoopname, DevNode.DEV_TYPE_DATA, rt) dic.Add(NodeLoop, datenode) result.Add(datenode) Next For ri As Integer = TableInteraction.TableRowNumber.Max To _grd.Rows - 1 ' 遍历每行找到服务起始行 ACtabRange = New CtabRange(_grd, ri, TableInteraction.TableColNumber.DeviceName) If ACtabRange.devname.Equals("HOSTSERVICE") Then '找到服务集合 For cj As Integer = ACtabRange.fr To ACtabRange.lr NodeLoopname = _grd.Cell(cj, TableInteraction.TableColNumber.KeyName).Text.Replace(vbLf, "").Replace(vbCr, "").Replace(":", "").Replace("\", "").Replace("/", "").Replace("|", "").Replace("'", "").Replace("'", "").Replace("?", "").Replace("!", "").Replace("`", "") NodeLoop = _grd.Cell(cj, TableInteraction.TableColNumber.KeyVal).Text NodeLoop = $"{DevNode.DEV_TYPE_DATA.PadLeft(3, "0")}{devAddr.PadLeft(3, "0")}{NodeLoop.PadLeft(3, "0")}" If dic.ContainsKey(NodeLoop) Then Continue For ot = Dev.Value.Name ot = ot.Replace(vbLf, "").Replace(vbCr, "").Replace(":", "").Replace("\", "").Replace("/", "").Replace("|", "").Replace("'", "").Replace("'", "").Replace("?", "").Replace("!", "").Replace("`", "") Dim datenode As New MDevNodeMessage(result.Count, NodeLoop, ot, NodeLoopname, DevNode.DEV_TYPE_DATA, rt) dic.Add(NodeLoop, datenode) result.Add(datenode) Next End If Next Exit For '完成遍历退出服务输出的处理 Else '正常输出节点 For i As Integer = TableInteraction.TableColNumber.InsertColumn To _grd.Cols - 2 ACtabRange = New CtabRange(_grd, TableInteraction.TableRowNumber.DeviceName, i) If ACtabRange.devname.Equals(Dev.Key) Then '在表格找到对应设备 For j As Integer = ACtabRange.fc To ACtabRange.lc '遍历设备下属节点集合 NCtabRange = New CtabRange(_grd, TableInteraction.TableRowNumber.FunctionName, j) If NCtabRange.devname.ToUpper.Equals("LIGHT") Then NCtabRange.devname = "DO" End If If NCtabRange.devname.ToUpper.Equals("DRY_CURTAIN") Then NCtabRange.devname = "CURTAIN" End If If DevNode.Name.ToUpper.Equals(NCtabRange.devname.ToUpper) Then '找到当前设备的当前节点 For k = NCtabRange.fc To NCtabRange.lc '遍历当前节点下属回路集合 If _grd.Column(k).Visible = True Then '过滤隐藏的回路 NodeLoopname = _grd.Cell(TableInteraction.TableRowNumber.FunctionChildNodeAnother, k).Text.Replace(vbLf, "").Replace(vbCr, "").Replace(":", "").Replace("\", "").Replace("/", "").Replace("|", "").Replace("'", "").Replace("'", "").Replace("?", "").Replace("!", "").Replace("`", "") If DevNode.Nodes.Count = 1 Then NodeLoop = 0 Else NodeLoop = _grd.Cell(TableInteraction.TableRowNumber.FunctionChildNodeID, k).Text End If NodeLoop = $"{DevNode.DEV_TYPE_DATA.PadLeft(3, "0")}{devAddr.PadLeft(3, "0")}{NodeLoop.PadLeft(3, "0")}" If dic.ContainsKey(NodeLoop) Then Continue For ot = Dev.Value.Name ot = ot.Replace(vbLf, "").Replace(vbCr, "").Replace(":", "").Replace("\", "").Replace("/", "").Replace("|", "").Replace("'", "").Replace("'", "").Replace("`", "").Replace("?", "").Replace("!", "").Replace(" ", "") Dim datenode As New MDevNodeMessage(result.Count, NodeLoop, ot, NodeLoopname, DevNode.DEV_TYPE_DATA, rt) dic.Add(NodeLoop, datenode) result.Add(datenode) End If Next Exit For End If j = NCtabRange.lc Next Exit For End If i = ACtabRange.lc Next End If End If Next Next Return result End Function 'Public Sub Runing(_grd As FlexCell.Grid, _Devicemodel As Dictionary(Of String, DeviceModel), _ActionConfiguration As List(Of TableRowTag)) ' If IsNothing(_grd) Then Return ' Dim nodename As String = String.Empty ' Dim ACtabRange As CtabRange ' Dim NCtabRange As CtabRange ' Dim CdevMode As DeviceModel ' Dim CdevModeNode As DeviceChildNodeClass ' Dim AnotherName As String = String.Empty ' Dim Result As String = String.Empty ' Dim NodeLoop As String = String.Empty ' Dim NodeLoopname As String = String.Empty ' Dim scene As String = String.Empty ' For i As Integer = TableInteraction.TableColNumber.InsertColumn To _grd.Cols - 2 ' ACtabRange = New CtabRange(_grd, TableInteraction.TableRowNumber.DeviceName, i) ' '遍历设备 ' If Not String.IsNullOrEmpty(ACtabRange.devname) AndAlso _Devicemodel.ContainsKey(ACtabRange.devname) Then ' CdevMode = _Devicemodel.Item(ACtabRange.devname) ' Dim nMTableSet As New MTableSet(ACtabRange.devname) ' DevColList.Add(nMTableSet) ' '遍历设备节点 ' For j As Integer = ACtabRange.fc To ACtabRange.lc ' NCtabRange = New CtabRange(_grd, TableInteraction.TableRowNumber.FunctionName, j) ' CdevModeNode = Nothing ' For Each index In CdevMode.Nodes ' If index.Name.Equals(NCtabRange.devname) Then ' CdevModeNode = index ' Exit For ' End If ' Next ' If Not IsNothing(CdevModeNode) Then ' Result = CdevModeNode.DEV_TYPE_DATA.PadLeft(3, "0") ' Dim Mdnm As New MDevNodeMessage(CdevModeNode.Name, Result) ' nMTableSet.DevNode.Add(Mdnm) ' '遍历遍历设备节点下属回路 ' For k = NCtabRange.fc To NCtabRange.lc ' If _grd.Column(k).Visible = True Then ' Dim dic As New Dictionary(Of String, String) ' NodeLoop = _grd.Cell(TableInteraction.TableRowNumber.FunctionChildNodeID, k).Text ' NodeLoopname = _grd.Cell(TableInteraction.TableRowNumber.FunctionChildNodeAnother, k).Text ' If Mdnm.DevNodeDic.ContainsKey(NodeLoop) Then ' Continue For ' Else ' dic.Add("回路别名", NodeLoopname) ' Mdnm.DevNodeDic.Add(NodeLoop, dic) ' End If ' End If ' Next ' End If ' j = NCtabRange.lc ' Next ' End If ' i = ACtabRange.lc ' Next ' Dim rowtag As TableRowTag ' For i As Integer = TableInteraction.TableRowNumber.Max To _grd.Rows - 1 ' ACtabRange = New CtabRange(_grd, i, TableInteraction.TableColNumber.DeviceName) ' If ACtabRange.devname.Equals("HOSTSERVICE") Then ' ACtabRange.devname = _Devicemodel.Keys(0) ' End If ' If Not String.IsNullOrEmpty(ACtabRange.devname) AndAlso (_Devicemodel.ContainsKey(ACtabRange.devname)) Then ' CdevMode = _Devicemodel.Item(ACtabRange.devname) ' Dim nMTableSet As New MTableSet(ACtabRange.devname) ' DevRowList.Add(nMTableSet) ' '遍历设备 ' For j As Integer = ACtabRange.fr To ACtabRange.lr ' If j >= TableInteraction.TableRowNumber.Max AndAlso (i - TableInteraction.TableRowNumber.Max < _ActionConfiguration.Count) Then ' rowtag = _ActionConfiguration.Item(j - TableInteraction.TableRowNumber.Max) ' CdevModeNode = Nothing ' For Each index In CdevMode.Nodes ' If index.Name.Equals(rowtag.G_DevNodeName) Then ' CdevModeNode = index ' Exit For ' End If ' Next ' If Not IsNothing(CdevModeNode) Then ' Result = CdevModeNode.DEV_TYPE_DATA.PadLeft(3, "0") ' NodeLoop = _grd.Cell(j, TableInteraction.TableColNumber.KeyVal).Text ' Dim Tisbol As Boolean = True ' For Each Tindex In nMTableSet.DevNode ' If Tindex.DevNodeName.Equals(CdevModeNode.Name) AndAlso Tindex.DevNodeDic.ContainsKey(NodeLoop) Then ' Tisbol = False ' Continue For ' End If ' Next ' If Tisbol = False Then Continue For ' Dim Mdnm As New MDevNodeMessage(CdevModeNode.Name, Result) ' nMTableSet.DevNode.Add(Mdnm) ' '遍历遍历设备节点下属回路 ' If _grd.Row(j).Visible = True Then ' Dim dic As New Dictionary(Of String, String) ' NodeLoopname = _grd.Cell(j, TableInteraction.TableColNumber.KeyName).Text ' scene = _grd.Cell(j, TableInteraction.TableColNumber.SceneID).Text ' If Mdnm.DevNodeDic.ContainsKey(NodeLoop) Then ' Continue For ' Else ' dic.Add("回路别名", NodeLoopname) ' dic.Add("场景号", scene) ' Mdnm.DevNodeDic.Add(NodeLoop, dic) ' End If ' End If ' End If ' End If ' Next ' End If ' i = ACtabRange.lr ' Next 'End Sub 'Public Sub Runing(_grd As FlexCell.Grid, _Devicemodel As Dictionary(Of String, DeviceModel), _ActionConfiguration As List(Of TableRowTag)) ' If IsNothing(_grd) Then Return ' Dim ACtabRange As CtabRange ' Dim NCtabRange As CtabRange ' Dim NodeLoopname As String ' Dim NodeLoop As String = String.Empty ' For Each Dev In _Devicemodel '遍历设备 ' Dim nMTableSet As New MTableSet(Dev.Key) ' DevColList.Add(nMTableSet) ' For Each DevNode In Dev.Value.Nodes '遍历设备下属子节点 ' If DevNode.Interface.Equals("DO") Then '判断是否为输出设备 ' If DevNode.DEV_TYPE_DATA.Equals("4") Then '服务设备节点特殊处理 ' For ri As Integer = TableInteraction.TableRowNumber.Max To _grd.Rows - 1 ' 遍历每行找到服务起始行 ' ACtabRange = New CtabRange(_grd, ri, TableInteraction.TableColNumber.DeviceName) ' If ACtabRange.devname.Equals("HOSTSERVICE") Then '找到服务集合 ' Dim devAddr As String = GetActionDeviceAddr(Dev.Value, DevNode.Name).ToString ' Dim devnodename As String = TableInteraction.GetAnotherName(DevNode.Name) ' Dim MDevNode As New MDevNodeMessage(devAddr, devnodename, DevNode.DEV_TYPE_DATA) ' nMTableSet.DevNode.Add(MDevNode) ' For cj As Integer = ACtabRange.fr To ACtabRange.lr '遍历服务集合 ' NodeLoopname = _grd.Cell(cj, TableInteraction.TableColNumber.KeyName).Text ' NodeLoop = _grd.Cell(cj, TableInteraction.TableColNumber.KeyVal).Text ' If MDevNode.DevNodeDic.ContainsKey(NodeLoop) Then ' Continue For ' Else ' Dim dic As New Dictionary(Of String, String) ' dic.Add("回路别名", NodeLoopname) ' dic.Add("回路地址", NodeLoop) ' MDevNode.DevNodeDic.Add(NodeLoop, dic) ' End If ' Next ' Exit For '完成遍历退出服务输出的处理 ' End If ' Next ' Else '正常输出节点 ' For i As Integer = TableInteraction.TableColNumber.InsertColumn To _grd.Cols - 2 ' ACtabRange = New CtabRange(_grd, TableInteraction.TableRowNumber.DeviceName, i) ' If ACtabRange.devname.Equals(Dev.Key) Then '在表格找到对应设备 ' For j As Integer = ACtabRange.fc To ACtabRange.lc '遍历设备下属节点集合 ' NCtabRange = New CtabRange(_grd, TableInteraction.TableRowNumber.FunctionName, j) ' If DevNode.Name.Equals(NCtabRange.devname) Then '找到当前设备的当前节点 ' Dim devAddr As String = GetActionDeviceAddr(Dev.Value, DevNode.Name).ToString ' Dim devnodename As String = TableInteraction.GetAnotherName(DevNode.Name) ' Dim MDevNode As New MDevNodeMessage(devAddr, devnodename, DevNode.DEV_TYPE_DATA) ' nMTableSet.DevNode.Add(MDevNode) ' For k = NCtabRange.fc To NCtabRange.lc '遍历当前节点下属回路集合 ' NodeLoopname = String.Empty ' If _grd.Column(k).Visible = True Then '过滤隐藏的回路 ' NodeLoopname = _grd.Cell(TableInteraction.TableRowNumber.FunctionChildNodeAnother, k).Text ' NodeLoop = _grd.Cell(TableInteraction.TableRowNumber.FunctionChildNodeID, k).Text ' Dim dic As New Dictionary(Of String, String) ' dic.Add("回路别名", NodeLoopname) ' dic.Add("回路地址", NodeLoop) ' MDevNode.DevNodeDic.Add(NodeLoop, dic) ' End If ' Next ' Exit For ' End If ' j = NCtabRange.lc ' Next ' Exit For ' End If ' i = ACtabRange.lc ' Next ' End If ' End If ' Next ' Next 'End Sub Private Function GetActionDeviceAddr(Dev As DeviceModel, DevNodeName As String) As Integer For Each index In Dev.Config If index.Name.Equals($"{DevNodeName }设备组信息") Then For Each node In index.Attributes If node.Name.Equals("DeviceAddr") Then Return CInt(node.DataDefault) End If Next End If If index.Name.Equals($"设备存在") Then For Each node In index.Attributes If node.Name.Equals("拨码地址") Then Return CInt(node.Value) End If Next End If Next Return -1 End Function #End Region End Class Public Class MTableSet Public Sub New(name As String) DevNode = New List(Of MDevNodeMessage) DevName = name End Sub ' 设备名 Public DevName As String ' 设备下所有输出节点 Public DevNode As List(Of MDevNodeMessage) End Class Public Class MDevNodeMessage Public Sub New(addr As String, NodeName As String, NodeType As String) End Sub Public Sub New(yid As Integer, Ma As String, ol As String, Nm As String, Ty As String, RTy As RoomTypeConfig) ID = yid ModalAddress = Ma outlet = ol Name = Nm Type = Ty RoomType = RTy End Sub '序号 Dim ID As Integer ' 设备地址 Public ModalAddress As String '设备输出节点名 Public outlet As String '设备输出节点类型 Public Name As String '设备输出节点下所有回路和相关信息 Public Type As String Public RoomType As RoomTypeConfig End Class Public Class RoomTypeConfig Sub New(tID As String) ID = tID End Sub Public ID As String End Class