Imports EgtBEAMWALL.Core Imports EgtBEAMWALL.DataLayer.DatabaseModels Public Class SupervisorComm Private m_BlockedWnd As BlockedWndV Sub New() ' imposto in Map 'Map.SetRefMachManaging(Me) End Sub Friend Sub Timer_Tick() ' se sono in pagina vista If Map.refMainMenuVM.SelPage = Pages.VIEW Then ' se non c'e' un progetto attivo, esco If IsNothing(Map.refProjManagerVM.CurrProj) Then Return ' verifico se c'e' un progetto aperto o in caricamento 'If IsNothing(Map.refProjManagerVM.CurrProj) OrElse Map.refProjManagerVM.bLoadingProj Then Return ' verifico se c'e' una sessione aperta sul progetto corrente Dim nModificationIndex As Integer = -1 Dim ActiveSessionList As List(Of StatusMapModel) = DbControllers.m_StatusMapController.GetProd() For Each ActiveSession In ActiveSessionList If ActiveSession.ItemId = Map.refProjManagerVM.CurrProj.nProdId Then nModificationIndex = ActiveSession.Index End If Next If nModificationIndex = -1 Then Return ' verifico se ci sono modifiche If nModificationIndex <> Map.refProjManagerVM.CurrProj.nModificationIndex Then ' recupero elementi modificati Dim MachGroupList As List(Of StatusMapModel) = DbControllers.m_StatusMapController.GetFrom(Map.refProjManagerVM.CurrProj.nModificationIndex + 1) Dim bReloadFile As Boolean = False If Not IsNothing(MachGroupList) Then For Each MachGroupModification In MachGroupList If MachGroupModification.ItemType = StatusMapItemType.Part Then Dim BTLPart As BTLPartVM = CALCPanelVM.GetBTLPartVMFromPartId(MachGroupModification.ItemId) Select Case MachGroupModification.Operation Case Core.StatusMapOpType.PartStart ' non faccio nulla Case Core.StatusMapOpType.PartEnd, StatusMapOpType.ResetPartStart, StatusMapOpType.ResetPartEnd BTLPart.NotifyPropertyChanged(NameOf(BTLPart.nDONE)) BTLPart.NotifyPropertyChanged(NameOf(BTLPart.Background)) End Select ElseIf MachGroupModification.ItemType = StatusMapItemType.Comm Then ' se arriva richiesta da supervisore di blocco e salvataggio Select Case MachGroupModification.Operation Case StatusMapOpType.SupervisorStopRequest ' blocco interfaccia fino a notifica di sblocco SupervisorCommThread.SetViewerOptimizerBlocked(True) '' chiedo se salvare Case StatusMapOpType.SupervisorReleaseStop SupervisorCommThread.SetViewerOptimizerBlocked(False) End Select End If Next End If ' aggiorno indice del proj Map.refProjManagerVM.CurrProj.SetModificationIndex(nModificationIndex) End If ' se sono in pagina ottimizzatore ElseIf Map.refMainMenuVM.SelPage = Pages.MACHINING Then ' se non c'e' un progetto attivo, esco If IsNothing(Map.refProdManagerVM.CurrProd) Then Return ' verifico se c'e' un progetto aperto o in caricamento 'If IsNothing(Map.refProdManagerVM.CurrProd) OrElse Map.refProdManagerVM.bLoadingProd Then Return ' verifico se c'e' una sessione aperta sul progetto corrente Dim nModificationIndex As Integer = -1 Dim ActiveSessionList As List(Of StatusMapModel) = DbControllers.m_StatusMapController.GetProd() For Each ActiveSession In ActiveSessionList If ActiveSession.ItemId = Map.refProdManagerVM.CurrProd.nProdId Then nModificationIndex = ActiveSession.Index End If Next If nModificationIndex = -1 Then Return ' verifico se ci sono modifiche If nModificationIndex <> Map.refProdManagerVM.CurrProd.nModificationIndex Then ' recupero elementi modificati Dim MachGroupList As List(Of StatusMapModel) = DbControllers.m_StatusMapController.GetFrom(Map.refProdManagerVM.CurrProd.nModificationIndex + 1) If Not IsNothing(MachGroupList) Then Dim bReloadFile As Boolean = False For Each MachGroupModification In MachGroupList If Not SupervisorCommThread.bViewerOptimizerBlocked AndAlso MachGroupModification.ItemType = StatusMapItemType.MachGroup Then Dim MachGroup As MyMachGroupVM = Map.refProjectVM.MachGroupPanelVM.MachGroupVMList.FirstOrDefault(Function(x) x.Id = MachGroupModification.ItemId) If Not IsNothing(MachGroup) Then Select Case MachGroupModification.Operation Case Core.StatusMapOpType.PartStart MachGroup.dtStartTime = MachGroupModification.DtEvent MachGroup.nProduction_State = ItemState.WIP MachGroup.NotifyPropertyChanged(NameOf(MachGroup.nProduction_State)) MachGroup.NotifyPropertyChanged(NameOf(MachGroup.Background)) Case Core.StatusMapOpType.PartEnd MachGroup.dtEndTime = MachGroupModification.DtEvent MachGroup.nProduction_State = ItemState.Produced MachGroup.NotifyPropertyChanged(NameOf(MachGroup.Background)) Case Core.StatusMapOpType.ResetPartStart MachGroup.dtStartTime = DateTime.MinValue MachGroup.nProduction_State = ItemState.Assigned MachGroup.NotifyPropertyChanged(NameOf(MachGroup.nProduction_State)) MachGroup.NotifyPropertyChanged(NameOf(MachGroup.Background)) Case Core.StatusMapOpType.ResetPartEnd MachGroup.dtEndTime = DateTime.MinValue MachGroup.nProduction_State = ItemState.WIP MachGroup.NotifyPropertyChanged(NameOf(MachGroup.nProduction_State)) MachGroup.NotifyPropertyChanged(NameOf(MachGroup.Background)) Case Core.StatusMapOpType.MachGroupRemovedFromSupervisor MachGroup.ResetSupervisorId() End Select End If ElseIf MachGroupModification.ItemType = StatusMapItemType.Part Then Dim BTLPart As BTLPartVM = CALCPanelVM.GetBTLPartVMFromPartId(MachGroupModification.ItemId) Dim Part As PartVM = CALCPanelVM.GetPartVMFromPartId(MachGroupModification.ItemId) Select Case MachGroupModification.Operation Case Core.StatusMapOpType.PartStart If Not IsNothing(Part) Then Part.dtStartTime = MachGroupModification.DtEvent Part.nProduction_State = ItemState.WIP Part.NotifyPropertyChanged(NameOf(Part.Background)) End If Case Core.StatusMapOpType.PartEnd If Not IsNothing(Part) Then Part.dtEndTime = MachGroupModification.DtEvent Part.nProduction_State = ItemState.Produced Part.NotifyPropertyChanged(NameOf(Part.Background)) End If If Not IsNothing(BTLPart) Then BTLPart.NotifyPropertyChanged(NameOf(BTLPart.nDONE)) BTLPart.NotifyPropertyChanged(NameOf(BTLPart.Background)) End If Case Core.StatusMapOpType.ResetPartStart If Not IsNothing(Part) Then Part.dtStartTime = DateTime.MinValue Part.nProduction_State = ItemState.Assigned Part.NotifyPropertyChanged(NameOf(Part.Background)) End If Case Core.StatusMapOpType.ResetPartEnd If Not IsNothing(Part) Then Part.dtEndTime = DateTime.MinValue Part.nProduction_State = ItemState.WIP Part.NotifyPropertyChanged(NameOf(Part.Background)) End If If Not IsNothing(BTLPart) Then BTLPart.NotifyPropertyChanged(NameOf(BTLPart.nDONE)) BTLPart.NotifyPropertyChanged(NameOf(BTLPart.Background)) End If End Select ElseIf MachGroupModification.ItemType = StatusMapItemType.Comm Then ' se arriva richiesta da supervisore di blocco e salvataggio Select Case MachGroupModification.Operation Case StatusMapOpType.SupervisorStopRequest ' blocco interfaccia fino a notifica di sblocco SupervisorCommThread.SetViewerOptimizerBlocked(True) '' chiedo se salvare 'Map.refMainWindowVM.m_SupervisorStop = True Case StatusMapOpType.SupervisorReleaseStop Dim MachGroupId As Integer = -1 If Not String.IsNullOrWhiteSpace(MachGroupModification.Val) Then Integer.TryParse(MachGroupModification.Val, MachGroupId) If IsNothing(MachGroupId) Then MachGroupId = -1 SupervisorCommThread.SetViewerOptimizerBlocked(False, MachGroupId) 'Map.refMainWindowVM.m_SupervisorStop = False End Select End If Next End If ' aggiorno indice del prod Map.refProdManagerVM.CurrProd.SetModificationIndex(nModificationIndex) End If End If ' se c'e' un progetto aperto o in caricamento 'If IsNothing(Map.refProdManagerVM.CurrProd) OrElse Map.refProdManagerVM.bLoadingProd Then Return '' recupero indice modifica del prod 'Dim nModificationIndex As Integer = 0 'Dim ActiveSessionList As List(Of StatusMapModel) = DbControllers.m_StatusMapController.GetProd() 'For Each ActiveSession In ActiveSessionList ' If ActiveSession.ItemId = Map.refSupervisorManagerVM.CurrProd.nProdId Then ' nModificationIndex = ActiveSession.Index ' End If 'Next '' se indice letto diverso da indice gia' presente 'If nModificationIndex <> Map.refSupervisorManagerVM.CurrProd.nModificationIndex Then ' ' recupero elementi modificati ' Dim MachGroupList As List(Of StatusMapModel) = DbControllers.m_StatusMapController.GetFrom(Map.refSupervisorManagerVM.CurrProd.nModificationIndex + 1) ' Dim bReloadFile As Boolean = False ' For Each MachGroupModification In MachGroupList ' Select Case MachGroupModification.Operation ' Case Core.StatusMapOpType.MachGroupAdd ' Map.refProjectVM.SupervisorMachGroupPanelVM.MachGroupFullList.Add(MachGroupModification.ItemId, {MachGroupModification.Index, MachGroupModification.Index}) ' Case Core.StatusMapOpType.MachGroupMod ' Map.refProjectVM.SupervisorMachGroupPanelVM.MachGroupFullList(MachGroupModification.ItemId)(0) = MachGroupModification.Index ' Case Core.StatusMapOpType.MachGroupRem ' Map.refProjectVM.SupervisorMachGroupPanelVM.MachGroupFullList.Remove(MachGroupModification.ItemId) ' Case Core.StatusMapOpType.MachGroupAssignedToSupervisor ' Dim MachgroupIndexes As Integer() = Map.refProjectVM.SupervisorMachGroupPanelVM.MachGroupFullList(MachGroupModification.ItemId) ' ' se indice di aggiornamento file diverso da indice ultima modifica ' If MachgroupIndexes(0) <> MachgroupIndexes(1) Then ' ' devo ricaricare il file ' bReloadFile = True ' ' ricarico il progetto ' Map.refProjectVM.SupervisorMachGroupPanelVM.ReloadProjectFile() ' End If ' ' lo aggiungo alla lista di MachGroup ' Map.refProjectVM.SupervisorMachGroupPanelVM.AddMachGroupToSupervisor(Map.refProjectVM.ProdMachGroupPanelVM.MachGroupVMList.FirstOrDefault(Function(x) x.Id = MachGroupModification.ItemId)) ' End Select ' Next ' ' se devo ricaricare il file ' If bReloadFile Then ' ' aggiorno indici in dictionary ' For Each MachGroupModification In Map.refProjectVM.SupervisorMachGroupPanelVM.MachGroupFullList.Where(Function(x) x.Value(0) <> x.Value(1)) ' MachGroupModification.Value(1) = MachGroupModification.Value(0) ' Next ' ' ricarico il progetto ' 'Map.refProjectVM.SupervisorMachGroupPanelVM.ReloadProjectFile() ' End If ' ' aggiorno indice del prod ' Map.refSupervisorManagerVM.CurrProd.SetModificationIndex(nModificationIndex) 'End If '' verifico se e' aperto in qualche ottimizzatore ''DbControllers.m_ProdController. ''Map.refSupervisorManagerVM.CurrProd.bIsLocked '' verifico se la mappa messaggi ha indice maggiore del mio '' ricarico il progetto '' aggiorno eventuali nuovi machgroup '' se devo ripartire a meta' di una barra '' mando messaggio di blocco dell'ottimizzatore End Sub End Class