Files
egtbeamwall/EgtBEAMWALL.Supervisor/MachineLogPage/MachineLogPageVM.vb
Demetrio Cassarino 78cb995cec EgtBEAMWALL 3.1.1.6:
-rimosso cambio estensione file colonne datagrid
2026-02-04 16:57:27 +01:00

476 lines
16 KiB
VB.net

Imports System.Collections.ObjectModel
Imports EgtWPFLib5
Imports EgtUILib
Imports EgtBEAMWALL.Core
Imports System.Windows.Threading
Imports EgtBEAMWALL.Core.MachLog
Imports System.IO
Public Class MachineLogPageVM
Inherits VMBase
Private m_Lock_LogList As New Object
Private m_MachineLog_Timer As New DispatcherTimer
Private Enum DayTypes As Integer
TODAY = 0
YESTERDAY = 1
PERIOD = 2
End Enum
Private m_colMachineLog_Type As EgwWPFBaseLib.ColumnLayout
Public ReadOnly Property colMachineLog_Type As EgwWPFBaseLib.ColumnLayout
Get
Return m_colMachineLog_Type
End Get
End Property
Private m_colMachineLog_Description As EgwWPFBaseLib.ColumnLayout
Public ReadOnly Property colMachineLog_Description As EgwWPFBaseLib.ColumnLayout
Get
Return m_colMachineLog_Description
End Get
End Property
Private m_colMachineLog_SupervisorId As EgwWPFBaseLib.ColumnLayout
Public ReadOnly Property colMachineLog_SupervisorId As EgwWPFBaseLib.ColumnLayout
Get
Return m_colMachineLog_SupervisorId
End Get
End Property
Private m_MachineLogColumns As New ObservableCollection(Of EgwWPFBaseLib.ColumnLayout)
Public Property MachineLogColumns As ObservableCollection(Of EgwWPFBaseLib.ColumnLayout)
Get
Return m_MachineLogColumns
End Get
Set(value As ObservableCollection(Of EgwWPFBaseLib.ColumnLayout))
m_MachineLogColumns = value
End Set
End Property
Private m_MachineLogList_View As CollectionView = Nothing
Private m_MachineLogList As New ObservableCollection(Of LogEvent)
Public Property MachineLogList As ObservableCollection(Of LogEvent)
Get
Return m_MachineLogList
End Get
Set(value As ObservableCollection(Of LogEvent))
m_MachineLogList = value
End Set
End Property
Private m_MachLogTypeList As New List(Of MachLogType)({New MachLogType(MachLogTypes.PART_STATUS, "PartStatus", True),
New MachLogType(MachLogTypes.MACHGROUP_STATUS, "MachGroupStatus", True),
New MachLogType(MachLogTypes.MACHINE_MODE, "MachineMode", True),
New MachLogType(MachLogTypes.ALARM, "Alarm", True)})
Public Property MachLogTypeList As List(Of MachLogType)
Get
Return m_MachLogTypeList
End Get
Set(value As List(Of MachLogType))
m_MachLogTypeList = value
End Set
End Property
Private m_PartEventTypeList As New List(Of String)({"", EgtMsg(62527), EgtMsg(62528)})
Public ReadOnly Property PartEventTypeList As List(Of String)
Get
Return m_PartEventTypeList
End Get
End Property
Private m_SelPartEventType As Integer
Public Property SelPartEventType As Integer
Get
Return m_SelPartEventType
End Get
Set(value As Integer)
m_SelPartEventType = value
WriteMainPrivateProfileString(S_MACHINELOGFILTER, K_PARTEVENTTYPE, m_SelPartEventType.ToString())
m_MachineLogList_View.Refresh()
End Set
End Property
Private m_EntityTypeList As New List(Of String)({"", EgtMsg(62525), EgtMsg(62526)})
Public ReadOnly Property EntityTypeList As List(Of String)
Get
Return m_EntityTypeList
End Get
End Property
Private m_SelEntityType As Integer
Public Property SelEntityType As Integer
Get
Return m_SelEntityType
End Get
Set(value As Integer)
m_SelEntityType = value
WriteMainPrivateProfileString(S_MACHINELOGFILTER, K_ENTITYTYPE, m_SelEntityType.ToString())
m_MachineLogList_View.Refresh()
End Set
End Property
Private m_DayTypeList As New List(Of String)({EgtMsg(62529), EgtMsg(62530), EgtMsg(62531)})
Public ReadOnly Property DayTypeList As List(Of String)
Get
Return m_DayTypeList
End Get
End Property
Private m_SelDayType As DayTypes = DayTypes.TODAY
Public Property SelDayType As Integer
Get
Return m_SelDayType
End Get
Set(value As Integer)
Dim PrevSelDayType As DayTypes = m_SelDayType
m_SelDayType = value
WriteMainPrivateProfileString(S_MACHINELOGFILTER, K_DAYTYPE, Convert.ToInt32(m_SelDayType))
m_Date_Visibility = If(m_SelDayType = DayTypes.PERIOD, Visibility.Visible, Visibility.Collapsed)
If m_SelDayType = DayTypes.PERIOD Then
m_dtStartDate = If(PrevSelDayType = DayTypes.TODAY, DateTime.Today, DateTime.Today - TimeSpan.FromDays(1))
m_dtEndDate = If(PrevSelDayType = DayTypes.TODAY, DateTime.Today, DateTime.Today - TimeSpan.FromDays(1))
NotifyPropertyChanged(NameOf(dtStartDate))
NotifyPropertyChanged(NameOf(dtEndDate))
End If
NotifyPropertyChanged(NameOf(Date_Visibility))
' aggiorno lista da Db
UpdateMachineLogList(True)
End Set
End Property
Private m_dtStartDate As DateTime = DateTime.Today
Public Property dtStartDate As DateTime
Get
Return m_dtStartDate
End Get
Set(value As DateTime)
m_dtStartDate = value
Dim lStartDate As Long = m_dtStartDate.ToFileTimeUtc()
WriteMainPrivateProfileString(S_MACHINELOGFILTER, K_STARTDATE, lStartDate.ToString())
' aggiorno lista da Db
UpdateMachineLogList(True)
End Set
End Property
Private m_dtEndDate As DateTime = DateTime.Today
Public Property dtEndDate As DateTime
Get
Return m_dtEndDate
End Get
Set(value As DateTime)
m_dtEndDate = value
Dim lEndDate As Long = m_dtEndDate.ToFileTimeUtc()
WriteMainPrivateProfileString(S_MACHINELOGFILTER, K_ENDDATE, lEndDate.ToString())
' aggiorno lista da Db
UpdateMachineLogList(True)
End Set
End Property
Private m_Date_Visibility As Visibility = Visibility.Collapsed
Public ReadOnly Property Date_Visibility As Visibility
Get
Return m_Date_Visibility
End Get
End Property
' Definizione comandi
Private m_cmdRefresh As ICommand
#Region "Messages"
Public ReadOnly Property EventDateTime_Msg As String
Get
Return EgtMsg(62512)
End Get
End Property
Public ReadOnly Property EventType_Msg As String
Get
Return EgtMsg(62513)
End Get
End Property
Public ReadOnly Property EventValue_Msg As String
Get
Return EgtMsg(62514)
End Get
End Property
Public ReadOnly Property SupervisorId_Msg As String
Get
Return EgtMsg(62515)
End Get
End Property
Public ReadOnly Property ProdId_Msg As String
Get
Return EgtMsg(62516)
End Get
End Property
Public ReadOnly Property MachGroupId_Msg As String
Get
Return EgtMsg(62517)
End Get
End Property
Public ReadOnly Property PartId_Msg As String
Get
Return EgtMsg(62518)
End Get
End Property
Public ReadOnly Property Status_Msg As String
Get
Return EgtMsg(62519)
End Get
End Property
Public ReadOnly Property Entity_Msg As String
Get
Return EgtMsg(62520)
End Get
End Property
Public ReadOnly Property Event_Msg As String
Get
Return EgtMsg(62521)
End Get
End Property
Public ReadOnly Property Date_Msg As String
Get
Return EgtMsg(62522)
End Get
End Property
Public ReadOnly Property From_Msg As String
Get
Return EgtMsg(62523)
End Get
End Property
Public ReadOnly Property To_Msg As String
Get
Return EgtMsg(62524)
End Get
End Property
#End Region ' Messages
#Region "CONSTRUCTORS"
Sub New()
' imposto riferimento in Map
Map.SetRefMachineLogPageVM(Me)
' carico le colonne della datagrid
'GetPrivateProfileColumns(S_MACHINELOG, MachineLogColumns)
EgwWPFBaseLib.EgwDataGrid.ReadColumnLayout(DataGridColumnsIniFile.m_sDataGridColumnsIniFile, S_MACHINELOG, MachineLogColumns)
m_MachineLogList_View = CollectionViewSource.GetDefaultView(m_MachineLogList)
m_MachineLogList_View.Filter = AddressOf MachineLogFilter
' recupero riferimento a colonna StartCut
m_colMachineLog_Type = m_MachineLogColumns.FirstOrDefault(Function(x) x.Key = COL_TYPE)
m_colMachineLog_Description = m_MachineLogColumns.FirstOrDefault(Function(x) x.Key = COL_DESCRIPTION)
m_colMachineLog_SupervisorId = m_MachineLogColumns.FirstOrDefault(Function(x) x.Key = COL_SUPERVISORID)
' imposto valori filtri da ini
m_SelPartEventType = GetMainPrivateProfileInt(S_MACHINELOGFILTER, K_PARTEVENTTYPE, 2)
m_SelEntityType = GetMainPrivateProfileInt(S_MACHINELOGFILTER, K_ENTITYTYPE, 1)
m_SelDayType = GetMainPrivateProfileInt(S_MACHINELOGFILTER, K_DAYTYPE, 0)
Select Case m_SelDayType
Case DayTypes.TODAY
m_dtStartDate = DateTime.Today
m_dtEndDate = DateTime.Today
Case DayTypes.YESTERDAY
m_dtStartDate = DateTime.Today - TimeSpan.FromDays(1)
m_dtEndDate = DateTime.Today - TimeSpan.FromDays(1)
Case DayTypes.PERIOD
Dim sStartDate As String = "0"
Dim lStartDate As Long = 0
GetMainPrivateProfileString(S_MACHINELOGFILTER, K_STARTDATE, 0, sStartDate)
Long.TryParse(sStartDate, lStartDate)
m_dtStartDate = If(lStartDate > 0, DateTime.FromFileTimeUtc(lStartDate), DateTime.Today)
Dim sEndDate As String = "0"
Dim lEndDate As Long = 0
GetMainPrivateProfileString(S_MACHINELOGFILTER, K_ENDDATE, 0, sEndDate)
Long.TryParse(sEndDate, lEndDate)
m_dtEndDate = If(lEndDate > 0, DateTime.FromFileTimeUtc(lEndDate), DateTime.Today)
m_Date_Visibility = Visibility.Visible
End Select
m_MachineLog_Timer.Interval = TimeSpan.FromMilliseconds(100)
AddHandler m_MachineLog_Timer.Tick, AddressOf MachineLog_Timer_Tick
m_MachineLog_Timer.Start()
End Sub
#End Region ' CONSTRUCTORS
#Region "METHODS"
Private Function MachineLogFilter(CurrEvent As Object) As Boolean
Dim CurrLogEvent As LogEvent = DirectCast(CurrEvent, LogEvent)
Dim bOk As Boolean = True
' se livello utente inferiore a 5, mostro solo eventi pezzo e machgroup
If Map.refMainWindowVM.MainWindowM.nUserLevel < 5 Then
If CurrLogEvent.EventType <> LogEvent.MachLogTypes.PART_STATUS AndAlso CurrLogEvent.EventType <> LogEvent.MachLogTypes.MACHGROUP_STATUS Then
Return False
End If
End If
Select Case m_SelEntityType
Case 0 ' ""
bOk = bOk And True
Case 1 ' "Pezzo"
bOk = bOk And CurrLogEvent.EventType = LogEvent.MachLogTypes.PART_STATUS
Case 2 ' "Barra"
bOk = bOk And CurrLogEvent.EventType = LogEvent.MachLogTypes.MACHGROUP_STATUS
End Select
If CurrLogEvent.EventType = LogEvent.MachLogTypes.PART_STATUS OrElse CurrLogEvent.EventType = LogEvent.MachLogTypes.MACHGROUP_STATUS Then
Select Case m_SelPartEventType
Case 0 ' ""
bOk = bOk And True
Case 1 ' "Inizio"
bOk = bOk And CurrLogEvent.nStatus = 1
Case 2 ' "Fine"
bOk = bOk And CurrLogEvent.nStatus = 2
End Select
End If
Return bOk
End Function
Friend Sub LoadMachineLogList()
If Map.refMainWindowVM.MainWindowM.nUserLevel < 5 Then
m_colMachineLog_Type.IsVisible = False
m_colMachineLog_Description.IsVisible = False
m_colMachineLog_SupervisorId.IsVisible = False
End If
UpdateMachineLogList(True)
m_MachineLogList_View = CollectionViewSource.GetDefaultView(m_MachineLogList)
m_MachineLogList_View.Filter = AddressOf MachineLogFilter
End Sub
' indice di aggiornamento della lista rispetto a Db
Private m_nUpdateIndex As Integer
' indice di ricaricamento completo della lista dal Db
Private m_nRefreshIndex As Integer
' indice dell'ultimo update/refresh
Private m_nLastLogUpdate As Integer
Friend Sub UpdateMachineLogList(bRefresh As Boolean)
Dim nMaxIndex As Integer = Math.Max(m_nUpdateIndex, m_nRefreshIndex)
If bRefresh Then
m_nRefreshIndex = nMaxIndex + 1
Else
m_nUpdateIndex = nMaxIndex + 1
End If
End Sub
Private Sub MachineLog_Timer_Tick(sender As Object, e As EventArgs)
SyncLock m_Lock_LogList
Dim nRefresh As Integer = m_nRefreshIndex
Dim nUpdate As Integer = m_nUpdateIndex
If nRefresh > m_nLastLogUpdate Then
m_nLastLogUpdate = nRefresh
UpdateFromDb(True)
ElseIf nUpdate > m_nLastLogUpdate Then
m_nLastLogUpdate = nUpdate
UpdateFromDb(False)
End If
End SyncLock
End Sub
Friend Sub UpdateFromDb(bRefresh As Boolean)
Dim DbList As List(Of LogEvent)
Select Case m_SelDayType
Case DayTypes.PERIOD
DbList = DbControllers.m_LogMachineController.GetCoreDesc(m_dtStartDate, m_dtEndDate + TimeSpan.FromDays(1)).Select(Of LogEvent)(Function(x) New LogEvent(x)).ToList()
Case DayTypes.YESTERDAY
DbList = DbControllers.m_LogMachineController.GetCoreDesc(DateTime.Today - TimeSpan.FromDays(1), DateTime.Today).Select(Of LogEvent)(Function(x) New LogEvent(x)).ToList()
Case Else ' DayTypes.TODAY
DbList = DbControllers.m_LogMachineController.GetCoreDesc(DateTime.Today, DateTime.Today + TimeSpan.FromDays(1)).Select(Of LogEvent)(Function(x) New LogEvent(x)).ToList()
End Select
If bRefresh OrElse m_MachineLogList.Count < 1 Then
m_MachineLogList = New ObservableCollection(Of LogEvent)(DbList)
Else
' cerco in lista Db ultimo elemento della mia lista
Dim LastItem As LogEvent = m_MachineLogList(0)
Dim CommonItem As LogEvent = DbList.FirstOrDefault(Function(x) x.EventDateTime = LastItem.EventDateTime AndAlso x.EventType = LastItem.EventType AndAlso x.SupervisorId = LastItem.SupervisorId AndAlso x.Value = LastItem.Value)
Dim nCommonItemIndex As Integer
If Not IsNothing(CommonItem) Then
nCommonItemIndex = DbList.IndexOf(CommonItem)
End If
' aggiorno i successivi
If nCommonItemIndex >= 0 Then
For Index = nCommonItemIndex - 1 To 0 Step -1
m_MachineLogList.Insert(0, DbList(Index))
Next
End If
End If
NotifyPropertyChanged(NameOf(MachineLogList))
m_MachineLogList_View = CollectionViewSource.GetDefaultView(m_MachineLogList)
m_MachineLogList_View.Filter = AddressOf MachineLogFilter
End Sub
#End Region ' METHODS
#Region "COMMANDS"
#Region "Refresh"
''' <summary>
''' Returns a command that do Open.
''' </summary>
Public ReadOnly Property Refresh_Command As ICommand
Get
If m_cmdRefresh Is Nothing Then
m_cmdRefresh = New Command(AddressOf Refresh)
End If
Return m_cmdRefresh
End Get
End Property
''' <summary>
''' Execute the Open. This method is invoked by the OpenCommand.
''' </summary>
Friend Sub Refresh()
UpdateMachineLogList(False)
End Sub
#End Region ' Refresh
#End Region ' COMMANDS
End Class
Public Class MachLogType
Inherits VMBase
Private m_nId As Integer
Public ReadOnly Property nId As Integer
Get
Return m_nId
End Get
End Property
Private m_sName As String
Public ReadOnly Property sName As String
Get
Return m_sName
End Get
End Property
Private m_bOn As Boolean = False
Public Property bOn As Boolean
Get
Return m_bOn
End Get
Set(value As Boolean)
m_bOn = value
End Set
End Property
Sub New(nId As Integer, sName As String, bOn As Boolean)
m_nId = nId
m_sName = sName
m_bOn = bOn
End Sub
End Class