Imports System.IO Module ArdisTextMapper Private bestandsNaam As String Private writer As System.IO.StreamWriter = Nothing Public Sub stopArdisTextOpslag() If writer IsNot Nothing Then writer.Close() End If writer = Nothing bestandsNaam = Nothing End Sub Private Sub startNieuweArdisDataOpslag(pathNaarMap As String) LogBestandTextMapper.WriteToFile("ArdisText", "Starten van nieuwe dataopslag van text bestand") Dim regDate As Date = Date.Now() Dim datum As String = regDate.ToString("yyyy-MM-dd") Dim uren As String = regDate.ToString("HH-mm-ss") bestandsNaam &= datum & "_" & uren & ".txt" Try Dim fullPath As String = Path.Combine(pathNaarMap, bestandsNaam) System.IO.File.WriteAllText(fullPath, "") writer = My.Computer.FileSystem.OpenTextFileWriter(fullPath, True) 'header (wordt genegeerd door ardis) writer.WriteLine("Rol" & vbTab & "Aantal" & vbTab & "PlaatMateriaal" & vbTab & "Barcode" & vbTab & "LadeSequentieNr" & vbTab & "DossierCode" & vbTab & "ExtraInfo" & vbTab & "Lengte" & vbTab & "Breedte" & vbTab & "Dikte" & vbTab & "Kleur" & vbTab & "Decor" & vbTab & "EtiketLijn1" & vbTab & "EtiketLijn2" & vbTab & "EtiketLijn3" & vbTab & "EtiketInfo" & vbTab & "EtiketLijn4" & vbTab & "Rework" & vbTab & "Kar" & vbTab & "Banding" & vbTab & "KamerfreesTrayId" & vbTab & "KamerfreesSlotNr") LogBestandTextMapper.WriteToFile("ArdisText", "Starten van nieuwe dataopslag van text bestand", True) Catch ex As Exception Throw New Exception("Ardis text bestand kon niet worden aangemaakt " & ex.Message) End Try End Sub Public Sub opslaan(type As ItemType, ardisdata As ArdisData, Optional trayNummer As String = "", Optional slotNummer As String = "") Dim typeNaam As String = EnumMapper.GeefArdisTextBijItemType(type) LogBestandTextMapper.WriteToFile("ArdisText", "Starten opslag " & typeNaam & " met ardisData") bestandsNaam = "ImportFile_" & typeNaam & "_" If writer Is Nothing Then startNieuweArdisDataOpslag(Configs.ardisPathTextFile()) End If opslaan(ardisdata, trayNummer, slotNummer) LogBestandTextMapper.WriteToFile("ArdisText", "Starten opslag " & typeNaam & " met ardisData", True) End Sub 'opslaan van de sifonladen die verwerkt gaan worden voor ze verwerkt zijn Public Sub opslaanSifonLadeVoorVerwerking(ardisdata As ArdisData, bestandsNaamSifon As String) LogBestandTextMapper.WriteToFile("ArdisText", "Starten opslag sifon lade voor verwerking met barcode: " & ardisdata.PartCalc) bestandsNaam = bestandsNaamSifon.Replace(".txt", "") & "_Verwerkt_Sifon_" If writer Is Nothing Then startNieuweArdisDataOpslag(Configs.sifonLadeGeefVerplaatsFolderPath) End If opslaan(ardisdata, "", "") LogBestandTextMapper.WriteToFile("ArdisText", "Starten opslag sifon lade voor verwerking met barcode: " & ardisdata.PartCalc, True) End Sub 'opslaan van de spoelbakLaden die verwerkt gaan worden voor ze verwerkt zijn Public Sub opslaanSpoelbakLadeVoorVerwerking(ardisdata As ArdisData, bestandsNaamSpoelbak As String) LogBestandTextMapper.WriteToFile("ArdisText", "Starten opslag spoelbak lade voor verwerking met barcode: " & ardisdata.PartCalc) bestandsNaam = bestandsNaamSpoelbak.Replace(".txt", "") & "_Verwerkte_Spoelbak_" If writer Is Nothing Then startNieuweArdisDataOpslag(Configs.spoelbakLadeGeefVerplaatsFolderPath) End If opslaan(ardisdata, "", "") LogBestandTextMapper.WriteToFile("ArdisText", "Starten opslag spoelbak lade voor verwerking met barcode: " & ardisdata.PartCalc, True) End Sub 'opslaan van de laden die niet voldeden aan de dossiercoden en dus niet verwerkt zijn geweest Public Sub opslaanNietVerwerkteSpecialLaden(lijnen As List(Of String), bestandsNaamSpecial As String) LogBestandTextMapper.WriteToFile("ArdisText", "Opslaan niet verwerkte special laden") Dim nieuweBestandsNaam = "" Dim indexVanUitgelezenInfo As Integer = bestandsNaamSpecial.IndexOf("_Uitgelezen_") If indexVanUitgelezenInfo > 0 Then Dim aantalKeerUitgelezen As Integer = bestandsNaamSpecial.Substring(bestandsNaamSpecial.LastIndexOf("_") + 1).Replace(".txt", "") nieuweBestandsNaam = bestandsNaamSpecial.Remove(bestandsNaamSpecial.LastIndexOf("_") + 1) & (aantalKeerUitgelezen + 1) & ".txt" Else nieuweBestandsNaam = bestandsNaamSpecial.Replace(".txt", "") & "_Uitgelezen_1" & ".txt" End If Dim fullPath As String = Path.Combine(Configs.geefPathArdisSpecialFolder, nieuweBestandsNaam) writer = My.Computer.FileSystem.OpenTextFileWriter(fullPath, True) Try For Each lijn As String In lijnen writer.WriteLine(lijn) Next LogBestandTextMapper.WriteToFile("ArdisText", "Opslaan niet verwerkte special laden", True) Catch ex As Exception Throw New Exception("Fout bij wegschrijven niet verwerkte special laden" & ex.Message) End Try End Sub Public Sub verwijderSpecialLadenBestand(bestandsNaamSpecial As String) Dim padNaarBestand As String = Configs.geefPathArdisSpecialFolder Dim fullPath As String = Path.Combine(padNaarBestand, bestandsNaamSpecial) Try File.Delete(fullPath) Catch ex As ReadOnlyException Throw New Exception("Het special laden bestand " & bestandsNaamSpecial & " is readonly") Catch ex As PathTooLongException Throw New Exception("Het path naar het special laden bestand " & bestandsNaamSpecial & " is te lang") Catch ex As IOException Throw New Exception("Het special laden bestand " & bestandsNaamSpecial & " is niet bereikbaar") End Try End Sub Private Sub opslaan(ByVal ardisdata As ArdisData, trayNummer As String, slotNummer As String) LogBestandTextMapper.WriteToFile("ArdisText", " - Starten opslag van ardisData " & If(trayNummer.Equals(""), "", "met traynummer, slotnummer: " & trayNummer & "," & slotNummer)) ardisdata.updateKommasNaarPunten() Try writer.Write(ardisdata.PartRef & vbTab) 'rol/onderdeel writer.Write(ardisdata.PartQty & vbTab) 'aantal writer.Write(ardisdata.PartMat & vbTab) 'plaatmateriaal writer.Write(ardisdata.PartCalc & vbTab) 'barcode writer.Write(ardisdata.PartRemark2 & vbTab) 'ladesequenty writer.Write(ardisdata.PartRemark & vbTab) 'dossiercode writer.Write(ardisdata.PartExt09 & vbTab) 'extrainfo writer.Write(CStr(ardisdata.PartL).Replace(",", ".") & vbTab) 'lengte writer.Write(CStr(ardisdata.PartW).Replace(",", ".") & vbTab) 'breedte writer.Write(CStr(ardisdata.PartExt06).Replace(",", ".") & vbTab) 'dikte writer.Write(ardisdata.PartExt07 & vbTab) 'kleur writer.Write(ardisdata.PartExt08 & vbTab) 'decor writer.Write(ardisdata.PartExt01 & vbTab) 'etiketlijn1 writer.Write(ardisdata.PartExt02 & vbTab) 'etiketlijn2 writer.Write(ardisdata.PartExt03 & vbTab) 'etiketlijn3 writer.Write(ardisdata.PartExt05 & vbTab) 'etiketinfo writer.Write(ardisdata.PartExt04 & vbTab) 'etiketlijn4 writer.Write(ardisdata.PartRemark3 & vbTab) 'rework writer.Write(ardisdata.PartGroup & vbTab) 'kar writer.Write(ardisdata.PartLevel & vbTab) 'banding writer.Write(trayNummer & vbTab) 'KamerfreesTrayId writer.Write(slotNummer) 'KamerfreesSlotNr writer.WriteLine() LogBestandTextMapper.WriteToFile("ArdisText", " - Starten opslag van ardisData " & If(trayNummer.Equals(""), "", "met traynummer, slotnummer: " & trayNummer & "," & slotNummer), True) Catch ex As Exception Throw New Exception("Ardis data kon niet worden opgeslagen" & ex.Message) End Try End Sub Public Function geefSpecialLadenMetDossierCode(dossierCode As String) As SpecialLadenOnderdelen LogBestandTextMapper.WriteToFile("ArdisText", "Opvragen sifonLade met dossierCode: " & dossierCode) Dim specialLaden As SpecialLadenOnderdelen = opvragenSpecialLadenOnderdelen(dossierCode, True) LogBestandTextMapper.WriteToFile("ArdisText", "Opvragen sifonLade met dossierCode: " & dossierCode, True) Return specialLaden End Function Function geefSpecialLadenMetBatchnummer(batchnummer As String) As SpecialLadenOnderdelen LogBestandTextMapper.WriteToFile("ArdisText", "Opvragen sifonLade met batchnummer: " & batchnummer) Dim specialLaden As SpecialLadenOnderdelen = opvragenSpecialLadenOnderdelen(batchnummer, False) LogBestandTextMapper.WriteToFile("ArdisText", "Opvragen sifonLade met batchnummer: " & batchnummer, True) Return specialLaden End Function Private Function opvragenSpecialLadenOnderdelen(code As String, isLadeCode As Boolean) Dim specialLaden As SpecialLadenOnderdelen For Each tekstBestandPath As String In Directory.GetFiles(Configs.geefPathArdisSpecialFolder) Dim allText As String = My.Computer.FileSystem.ReadAllText(tekstBestandPath) allText = allText.Trim 'alle lijnen van 1 bestand Dim lijnen As String() = allText.Split(New String() {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries) 'een special laden object maken gevuld met de opgehaalde waarden specialLaden = vulSpecialLade(lijnen, code, isLadeCode) specialLaden.bestandsNaam = tekstBestandPath.Substring(tekstBestandPath.LastIndexOf("\") + 1) 'controleren of dit de lade(n) bevat die we willen Dim bevatCode As Boolean If isLadeCode Then bevatCode = specialLaden.bevatDossierCode(code) Else bevatCode = specialLaden.bevatBatchnummer(code) End If If bevatCode Then Return specialLaden End If Next Throw New Exception("Gelieve een geldige code in te voeren") End Function Private Function vulSpecialLade(lijnen() As String, code As String, isLadeCode As Boolean) As SpecialLadenOnderdelen Dim nieuweSpecialLaden As New SpecialLadenOnderdelen Dim velden() As String Dim ardisData As ArdisData For Each lijn As String In lijnen 'alle velden scheiden velden = lijn.Split(New String() {vbTab}, StringSplitOptions.None) 'alleen als er wel degelijk ardisdata in het bestand staat het opslaan If velden.Count > 15 Then 'kijken of we een dossiercode moeten controleren of batchnummer Dim isGeldig As Boolean If isLadeCode Then isGeldig = velden(5).Equals(code) Else isGeldig = velden(18).Contains(code) End If 'kijken of de lade de dossiercode bevat If isGeldig Then 'kijken wat voor rol de lijn heeft (aka onderdeel: zijkantplaat, rug,...) ardisData = MaakArdisData(velden) Select Case ardisData.PartRef Case "ZijkantPlaat" nieuweSpecialLaden.voegZijkantToe(ardisData) Case "Rug" nieuweSpecialLaden.voegRugToe(ardisData) Case "Bodem" nieuweSpecialLaden.voegBodemToe(ardisData) Case "Front" nieuweSpecialLaden.voegFrontToe(ardisData) End Select Else If Not lijn.Equals("") Then nieuweSpecialLaden.voegLijnAndereLadeToe(lijn) End If End If End If Next Return nieuweSpecialLaden End Function ''' ''' Opvragen van Ardis data's aan de hand van de lade code. ''' ''' De lade code ''' Lijst van Ardis data's Public Function GeefArdisDatasMetLadeCode(ladeCode As String) As List(Of ArdisData) LogBestandTextMapper.WriteToFile("ArdisText", $"Opvragen sifonladen met lade code: {ladeCode}") Dim ardisDatas As List(Of ArdisData) = OphalenArdisDatasMetCode(ladeCode, True) LogBestandTextMapper.WriteToFile("ArdisText", $"Opvragen sifonladen met lade code: {ladeCode}", True) Return ardisDatas End Function ''' ''' Opvragen van Ardis data's aan de hand van het batch nummer. ''' ''' Het batch nummer ''' Lijst van Ardis datbatchNummera's Public Function GeefArdisDatasMetBatchNummer(batchNummer As String) As List(Of ArdisData) LogBestandTextMapper.WriteToFile("ArdisText", $"Opvragen sifonladen met batch nummer: {batchNummer}") Dim ardisDatas As List(Of ArdisData) = OphalenArdisDatasMetCode(batchNummer, False) LogBestandTextMapper.WriteToFile("ArdisText", $"Opvragen sifonladen met batch nummer: {batchNummer}", True) Return ardisDatas End Function Private Function OphalenArdisDatasMetCode(code As String, isLadeCode As Boolean) As List(Of ArdisData) Try 'Lijst initialiseren. Dim ardisDatas As New List(Of ArdisData) 'Alle bestanden overlopen in de directory met bestanden. For Each tekstBestandPath As String In Directory.GetFiles(Configs.geefPathArdisSpecialFolder) 'Alle tekst uit een bestand lezen en spaties vooraan en achteraan verwijderen. Dim allText As String = My.Computer.FileSystem.ReadAllText(tekstBestandPath).Trim() 'De verschillende lijnen omzetten in een array. Dim lijnen As String() = allText.Split(New String() {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries) 'De lijnen overlopen. For Each lijn As String In lijnen 'Controleren of een lijn de juiste code bevat. Dit gebeurt hier, omdat de conversie naar Ardis data teveel tijd zou kosten. 'Bijhouden of lijn de juiste code bevat. Dim bevatCode As Boolean = False 'Alle velden scheiden. Dim velden = lijn.Split(New String() {vbTab}, StringSplitOptions.None) 'Controleren of de lijn wel lang genoeg is. If velden.Count > 19 Then 'Genoeg lijnen, controleren welk type code is gebruikt, dossier (lade) code of batchnummer. If isLadeCode Then 'Dossier (lade) code controleren. bevatCode = velden(5).Equals(code) 'PartRemark Else 'Batch nummer controleren. De kar bevat dit nummer. bevatCode = velden(18).Contains(code) 'PartGroup End If End If 'Als de lijn de correcte code bevat wordt het geconverteerd naar Ardis data en toegevoegd aan de lijst. If bevatCode Then 'Aanmaken ardis data. Dim ardisData As ArdisData = MaakArdisData(velden) 'Toevoegen bestandsnaam. ardisData.Bestandsnaam = tekstBestandPath.Substring(tekstBestandPath.LastIndexOf("\", StringComparison.Ordinal) + 1) 'Toevoegen aan lijst. ardisDatas.Add(ardisData) End If Next Next Return ardisDatas Catch ex As Exception throw New Exception($"Kon Ardis data niet ophalen uit tekstbestand. {vbNewLine}{ex.Message}") End Try End Function ''' ''' Ardis data maken aan de hand van de verschillende velden van 1 lijn. ''' ''' Velden van 1 lijn. ''' Nieuwe Ardis data Private Function MaakArdisData(velden As String()) As ArdisData Dim ardisData As New ArdisData ardisData.PartRef = velden(0) 'rol ardisData.PartQty = velden(1) 'aantal ardisData.PartMat = velden(2) 'plaatmateriaal ardisData.PartCalc = velden(3) 'barcode ardisData.PartRemark2 = velden(4) 'ladesequentyNR ardisData.PartRemark = velden(5) 'dossiercode ardisData.PartExt09 = velden(6) 'extrainfo ardisData.PartL = velden(7) 'lengte ardisData.PartW = velden(8) 'breedte ardisData.PartExt06 = velden(9) 'dikte ardisData.PartExt07 = velden(10) 'kleur ardisData.PartExt08 = velden(11) 'decor ardisData.PartExt01 = velden(12) 'etiketlijn1 ardisData.PartExt02 = velden(13) 'etiketlijn2 ardisData.PartExt03 = velden(14) 'etiketlijn3 ardisData.PartExt05 = velden(15) 'etiketinfo ardisData.PartExt04 = velden(16) 'etiketlijn4 ardisData.PartRemark3 = velden(17) 'rework ardisData.PartGroup = velden(18) 'kar ardisData.PartLevel = velden(19) 'banding If velden.Length > 20 Then ardisData.KamerfreesTrayId = velden(20) ardisData.KamerfreesSlotNr = velden(21) Else ardisData.KamerfreesTrayId = String.Empty ardisData.KamerfreesSlotNr = String.Empty End If Return (ardisData) End Function End Module