Imports WINDREAMLib Imports System.IO Imports System.Net Imports Newtonsoft.Json Imports System.Text Public Class clsDateiverarbeitung #Region "***** Variablen und Konstanten*****" Public Shared _windream As New clsWindream_allgemein Public Shared pr_DTPROFIL_REGELN As DataTable Public Shared aktfile_Exportresult Public Shared CriticalError As Boolean = False Private Shared regel_TYP, regel_INDEX_NAME, regel_QUELLE1, regel_FROM1, regel_FROM2 As String Private Shared Indexe() As String = Nothing ' zum Speichern der Indexe Private Shared NI_Values() As String = Nothing ' zum Speichern der Werte Private Shared WD_aktivesDokument As WMObject Const WMObjectStreamOpenModeReadWrite = 2 Const WMObjectEditModeFileSystem = &H15 #End Region Public Shared Function InitProfilData() Try pr_DTPROFIL_REGELN = Nothing ' Profildaten der Klasse mitteilen clsLogger.AddDetailLog("InitProfilData Profildaten zugewiesen....") Return True Catch ex As Exception clsLogger.AddError(ex.Message, "cls_DV.InitProfilData") Return False End Try End Function 'Kopiert die übergebene Datei in den Zielpfad Public Shared Function Export_File(WDDatei As WMObject, Zielpfad As String) Try If Not Zielpfad.EndsWith("\") Then Zielpfad = Zielpfad & "\" End If clsLogger.Add("", False) clsLogger.Add(">> Verarbeitung von Datei: " & WDDatei.aName, False) 'Die Quelle zusammensetzen clsLogger.AddDetailLog("PFAD: " & WDLAUFWERK & ":" & WDDatei.aPath & "\" & WDDatei.aName) 'Dim Quelle As String = IO.Path.GetDirectoryName(WDLaufwerk & ":" & WDDatei.aPath & "\" & WDDatei.aName) Dim ExportFileIO = New WMOTOOLLib.WMFileIO ' CreateObject("WMOTOOLLib.WMFileIO") ' New WMOTOOLLib.WMFileIO clsLogger.AddDetailLog("ExportFileIO erzeugt.....") ' Stream Interface bereitstellen WDDatei.LockFor(WMObjectEditModeFileSystem) Try If Not WDDatei.aLocked Then WDDatei.lock() End If Catch ex As Exception clsLogger.AddError("Unvorhergesehener Fehler beim Lock-Vorgang: " & ex.Message, "clsDV.Export_File") Return False End Try Dim oWMStream = WDDatei.OpenStream("BinaryObject", WMObjectStreamOpenModeReadWrite) '### VERSIONIERUNG ### Dim version As Integer = 2 'Dim Stammname As String = System.IO.Path.GetFileNameWithoutExtension(Quelle) Dim Filename = WDDatei.aName.Substring(0, WDDatei.aName.LastIndexOf(".")) Dim Extension = WDDatei.aName.Substring(WDDatei.aName.LastIndexOf(".")) Dim tempFilename As String = Zielpfad & Filename & Extension 'Überprüfen ob File existiert Do While IO.File.Exists(tempFilename) = True tempFilename = Zielpfad & Filename & "_" & version & Extension version = version + 1 Loop clsLogger.AddDetailLog("Zieldateiname: " & tempFilename) ' den Dateiinhalt der neuen Datei zuweisen ExportFileIO.aWMStream = oWMStream ExportFileIO.bstrOriginalFileName = tempFilename 'Das eigentliche kopieren ExportFileIO.ExportOriginal(True) ' close the windream file stream oWMStream.Close() WDDatei.Save() WDDatei.unlock() EXPORTED_FILENAME = tempFilename clsLogger.Add(">> Datei erfolgreich nach '" & tempFilename & "' verschoben.", False, "clsDV Export_File") aktfile_Exportresult = tempFilename Return True Catch ex As Exception 'bei einem Fehler einen Eintrag in der Logdatei machen clsLogger.AddError("Unvorhergesehener Fehler: " & ex.Message, "clsDV.Export_File") Return False End Try End Function Public Shared Function Rename_File(WMFile As WMObject, konvention As String) Try clsLogger.AddDetailLog("Konvention: '" & konvention & "'") 'Regulären Ausdruck zum Auslesen der windream-Indexe definieren Dim preg As String = "\[%{1}[a-zA-Z0-9\!\$\&\/\(\)\=\?\,\.\-\;\:_öÖüÜäÄ\#\'\+\*\~\{\}\@\€\<\>\ ]+]{1}" ' einen Regulären Ausdruck laden Dim regulärerAusdruck As System.Text.RegularExpressions.Regex = New System.Text.RegularExpressions.Regex(preg) ' die Vorkommen im SQL-String auslesen Dim reg_elemente As System.Text.RegularExpressions.MatchCollection = regulärerAusdruck.Matches(konvention) Dim i As Integer = 0 ' alle Vorkommen der windream-Indexe im SQL-String durchlaufen For Each reg_element As System.Text.RegularExpressions.Match In reg_elemente 'die Zeichen [% und ] entfernen (liefert den wirklichen windream-Index) Dim reg_element_Ohne_SZ As String = reg_element.Value.Replace("[%", "") reg_element_Ohne_SZ = reg_element_Ohne_SZ.Replace("]", "") clsLogger.AddDetailLog("Indexwert aus Index '" & reg_element_Ohne_SZ & "' auslesen....") Dim wdIndexwert 'den Wert des Indexes für das aktuelle Dokument auslesen wdIndexwert = WMFile.GetVariableValue(reg_element_Ohne_SZ) If wdIndexwert Is Nothing = False Then If Not wdIndexwert.GetType.ToString.Contains("System.Object") Then clsLogger.AddDetailLog("Namenkonvention (" & i & ") " & konvention) wdIndexwert = wdIndexwert.ToString.TrimEnd wdIndexwert = wdIndexwert.ToString.TrimStart clsLogger.AddDetailLog("Ausgelesener Indexwert = '" & wdIndexwert & "'") konvention = konvention.Replace(reg_element.Value, wdIndexwert.ToString) i += 1 Else clsLogger.Add(">> Achtung gelesener Wert ist ein Vektorfeld - keine Umbenennung möglich ", False, "clsProfil.Profil_Durchlauf") End If End If Next Dim version As Integer = 2 Dim ZielPfad As String = Path.GetDirectoryName(aktfile_Exportresult) clsLogger.AddDetailLog("ZielPfad: " & ZielPfad) Dim Filename = konvention Dim Extension = Path.GetExtension(aktfile_Exportresult) clsLogger.AddDetailLog("Extension: " & Extension) Dim tempFilename As String = ZielPfad & "\" & Filename & Extension clsLogger.AddDetailLog("tempFilename: " & tempFilename) 'Überprüfen ob File existiert Do While IO.File.Exists(tempFilename) = True tempFilename = ZielPfad & "\" & Filename & "~" & version & Extension version += 1 Loop clsLogger.AddDetailLog("RenameFile - OLDFilename: " & aktfile_Exportresult & " - NEWFilename: " & Path.GetFileName(tempFilename)) My.Computer.FileSystem.RenameFile(aktfile_Exportresult, Path.GetFileName(tempFilename)) clsLogger.Add(">> Datei wurde erfolgreich umbenannt.", False, "clsProfil.RenameFile") Return True Catch ex As Exception clsLogger.AddError("Unvorhergesehener Fehler: " & ex.Message, "clsProfil.RenameFile") Return False End Try End Function Public Shared Function Rename_File_Vektor(WMFile As WMObject, WMINDEX_NAME As String) Try Dim WMIndexwert Dim ZielPfad As String = Path.GetDirectoryName(aktfile_Exportresult) clsLogger.AddDetailLog("ZielPfad: " & ZielPfad) Dim Extension = Path.GetExtension(aktfile_Exportresult) clsLogger.AddDetailLog("Extension: " & Extension) If WMINDEX_NAME.StartsWith("[%") Then WMINDEX_NAME = WMINDEX_NAME.Replace("[%", "") WMINDEX_NAME = WMINDEX_NAME.Replace("]", "") End If 'den Wert des Indexes für das aktuelle Dokument auslesen WMIndexwert = WMFile.GetVariableValue(WMINDEX_NAME) If WMIndexwert.GetType.ToString.Contains("System.Object") Then clsLogger.AddDetailLog("Rename_File_Vektor in Progress for index " & WMINDEX_NAME) Dim anz As Integer = 1 Dim copybasefile As String For Each WMvalue As Object In WMIndexwert 'Für jeden Value eine Datei erzeugen Try If WMvalue.ToString <> String.Empty Then Dim tempFilename As String = ZielPfad & "\" & WMvalue & Extension clsLogger.AddDetailLog("tempFilename: " & tempFilename) If anz = 1 Then clsLogger.AddDetailLog("RenameFile - OLDFilename: " & aktfile_Exportresult & " - NEWFilename: " & Path.GetFileName(tempFilename)) My.Computer.FileSystem.RenameFile(aktfile_Exportresult, Path.GetFileName(tempFilename)) copybasefile = tempFilename Else Dim version As Integer = 2 'Überprüfen ob File existiert Do While IO.File.Exists(tempFilename) = True tempFilename = ZielPfad & "\" & WMvalue & "~" & version & Extension version += 1 Loop File.Copy(copybasefile, tempFilename, True) End If anz += 1 End If Catch ex As Exception clsLogger.AddError("Unvorhergesehener Fehler: " & ex.Message, "clsDateiverarbeitung.ForEachWMvalue") End Try Next Else clsLogger.Add(">> Achtung WMIndex " & WMINDEX_NAME & " scheint kein Vektorfeld zu sein!", False, "clsDateiverarbeitung.Rename_File_Vektor") Return False End If clsLogger.Add(">> Dateien wurde erfolgreich nach Vektorfeld erzeugt.", False, "clsDateiverarbeitung.Rename_File_Vektor") Return True Catch ex As Exception clsLogger.AddError("Unvorhergesehener Fehler: " & ex.Message, "clsDateiverarbeitung.Rename_File_Vektor") End Try End Function Private Shared Function GetWMAPILink(docId As String, userId As String) Dim hostname = "http://documents.mylogitservices.syncreon.com:8100" Dim link As String = $"{hostname}/WMWebApi/windream.web.api/DigitalData/BNSDownload?docId={docId}&userId={userId}" Return link End Function ''' ''' Generiert einen Link für BNS und fügt das Dokument WMFile ''' ins BNS ein ''' ''' Das WMObject, dass das aktuelle Dokument repräsentiert ''' Die eindeutige Benutzer Kennung für die Authentifizierung in Windream Public Shared Sub BNSjsonDownload(WMFile As WMObject, userId As String) Try ' Indizes für das aktuelle Dokument auslesen Dim SENDUNGNR = WMFile.GetVariableValue("Sendungnr") Dim DOKID = WMFile.GetVariableValue("Dokument-ID") Dim DOKART = WMFile.GetVariableValue("Dokumentart") Dim now As DateTime = DateTime.Now ' Download Link für Dokument erstellen Dim link As String = GetWMAPILink(DOKID, userId) ' JSON Payload erstellen und serialisieren Dim doc As New BNSDocument() doc.Bemerkung = DOKART doc.Ivalidfrom = now doc.Ivaliduntil = now.AddDays(30) doc.Pfad = link doc.Kategorie = New List(Of BNSDocumentCategory) From { New BNSDocumentCategory With {.Name = DOKART} } Dim json As String = JsonConvert.SerializeObject(doc, Formatting.Indented) Dim bytes As Byte() = Encoding.Default.GetBytes(json) ' HTTP Request machen ' Mandanten ID ist Standartmäßig 1 Dim mandatenId As Integer = 1 ' Für Tests auf Sendung gesetzt, später sollte dieser String konfigurierbar sein Dim geschaeftsObjekt = "Sendung" ' Für Tests wird hier die Sendungsnummer verwendet, später hängt der verwendete Index von 'geschaeftsObjekt' ab Dim geschaeftsId = SENDUNGNR Dim host = "1.2.3.4" Dim url As String = $"http://{host}/onwebui/api/Customer/{mandatenId}/{geschaeftsObjekt}/{geschaeftsId}/dokument" clsLogger.Add($"Generiertes JSON: {json}", False, "BNSjsonDownload") clsLogger.Add($"Creating WebRequest for {url}", False, "BNSjsonDownload") Dim req As HttpWebRequest = WebRequest.CreateHttp(url) req.Method = "POST" req.ContentType = "application/json" req.ContentLength = bytes.Length req.Timeout = 3000 req.ServicePoint.Expect100Continue = False Dim reqStream As Stream = req.GetRequestStream() reqStream.Write(bytes, 0, bytes.Length) reqStream.Close() clsLogger.Add($"Datei wird hochgeladen... docId: {DOKID}, dokart: {DOKART}, userId: {userId}", False, "BNSjsonDownload") clsLogger.Add($"Upload URL: {url}", False, "BNSjsonDownload") Using res As HttpWebResponse = req.GetResponse() Dim code As HttpStatusCode = res.StatusCode Dim text As String = res.StatusDescription ' Status 201 Created bedeutet: Alles okay! If code = HttpStatusCode.Created Then clsLogger.Add($"Datei geschrieben! docId: {DOKID}, dokart: {DOKART}, userId: {userId}", False, "BNSjsonDownload") End If Throw New Exception($"Server Error (HTTP {code}: {text})") End Using Catch ex As Exception clsLogger.AddError("Unvorhergesehener Fehler: " & ex.Message & " - " & ex.Source, "BNSjsonDownload") End Try End Sub Public Shared Function RUN_ORACLE_COMMAND(WMFile As WMObject, OracleCS As String, OracleCommandRAW As String) Try Dim result = REGEX_REPLACE(WMFile, OracleCommandRAW) If result = Nothing Then Return False End If If clsDatatabase.ExecuteonOracleDb(OracleCS, result) = True Then Return True Else Return False End If Catch ex As Exception clsLogger.AddError("Unvorhergesehener Fehler: " & ex.Message, "RUN_ORACLE_COMMAND") Return False End Try End Function Public Shared Function RUN_MSSQL_COMMAND(WMFile As WMObject, MSSQLCS As String, SQLCommandRAW As String) Try Dim result = REGEX_REPLACE(WMFile, SQLCommandRAW) If result = Nothing Then Return False End If If clsDatatabase.ExecuteonMSSQL(MSSQLCS, result) = True Then Return True Else Return False End If Catch ex As Exception clsLogger.AddError("Unvorhergesehener Fehler: " & ex.Message, "RUN_MSSQL_COMMAND") Return False End Try End Function Private Shared Function REGEX_REPLACE(WMFile As WMObject, _STRING As String) Try ' Regulären Ausdruck zum Auslesen der windream-Indexe definieren Dim preg As String = "\[%{1}[a-zA-Z0-9\!\$\&\/\(\)\=\?\,\.\-\;\:_öÖüÜäÄ\#\'\+\*\~\{\}\@\€\<\>\ ]+]{1}" ' einen Regulären Ausdruck laden Dim regulärerAusdruck As System.Text.RegularExpressions.Regex = New System.Text.RegularExpressions.Regex(preg) ' die Vorkommen im SQL-String auslesen Dim reg_elemente As System.Text.RegularExpressions.MatchCollection = regulärerAusdruck.Matches(_STRING) Dim i As Integer = 0 ' alle Vorkommen der windream-Indexe im SQL-String durchlaufen For Each reg_element As System.Text.RegularExpressions.Match In reg_elemente ' die Zeichen [% und ] entfernen (liefert den wirklichen windream-Index) Dim reg_element_Ohne_SZ As String = reg_element.Value.Replace("[%", "") reg_element_Ohne_SZ = reg_element_Ohne_SZ.Replace("]", "") clsLogger.AddDetailLog("Indexwert aus Index/Variable '" & reg_element_Ohne_SZ & "' auslesen....") If reg_element_Ohne_SZ = "EXPORTED_FILENAME" Then If EXPORTED_FILENAME <> "" Then _STRING = _STRING.Replace(reg_element.Value, EXPORTED_FILENAME) End If Else Dim wdIndexwert ' den Wert des Indexes für das aktuelle Dokument auslesen wdIndexwert = WMFile.GetVariableValue(reg_element_Ohne_SZ) If wdIndexwert Is Nothing = False Then If Not wdIndexwert.GetType.ToString.Contains("System.Object") Then wdIndexwert = wdIndexwert.ToString.TrimEnd wdIndexwert = wdIndexwert.ToString.TrimStart clsLogger.AddDetailLog("Ausgelesener Indexwert = '" & wdIndexwert & "'") _STRING = _STRING.Replace(reg_element.Value, wdIndexwert.ToString) clsLogger.AddDetailLog("Namenkonvention (" & i & ") " & _STRING) i += 1 Else clsLogger.Add(">> Achtung gelesener Wert ist ein Vektorfeld - keine Umbenennung möglich ", False, "clsProfil.Profil_Durchlauf") Return Nothing End If End If End If Next Return _STRING Catch ex As Exception clsLogger.AddError("Unvorhergesehener Fehler: " & ex.Message, "REGEX_REPLACE") Return Nothing End Try End Function Public Class BNSDocument Public Doksourcetype As Integer = 3 Public Pfad As String Public Ivalidfrom As DateTime Public Ivaliduntil As DateTime Public Bemerkung As String Public Primaer As Boolean = False Public Kategorie As List(Of BNSDocumentCategory) End Class Public Class BNSDocumentCategory Public Name As String End Class End Class