ResulHandlerMSSQL/app/ClassWMResulthandler/clsDateiverarbeitung.vb
2018-08-16 10:58:57 +02:00

440 lines
20 KiB
VB.net

Imports WINDREAMLib
Imports System.IO
Imports System.Net
Imports Newtonsoft.Json
Imports System.Text
Public Class clsDateiverarbeitung
Private Shared Logger As NLog.Logger = NLog.LogManager.GetCurrentClassLogger
#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
Logger.Info("InitProfilData Profildaten zugewiesen....")
Return True
Catch ex As Exception
Logger.Error(ex)
'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
Logger.Info("Verarbeitung von Datei: " & WDDatei.aName)
'Die Quelle zusammensetzen
Logger.Info("PFAD: " & clsCURRENT.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
Logger.Info("ExportFileIO erzeugt.....")
' Stream Interface bereitstellen
WDDatei.LockFor(WMObjectEditModeFileSystem)
Try
If Not WDDatei.aLocked Then
WDDatei.lock()
End If
Catch ex As Exception
Logger.Error(ex) '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
Logger.Info("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()
clsCURRENT.EXPORTED_FILENAME = tempFilename
Logger.Info("Datei erfolgreich nach '" & tempFilename & "' verschoben.")
aktfile_Exportresult = tempFilename
Return True
Catch ex As Exception
'bei einem Fehler einen Eintrag in der Logdatei machen
Logger.Error(ex)
Return False
End Try
End Function
Public Shared Function Rename_File(WMFile As WMObject, konvention As String)
Try
Logger.Info("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("]", "")
Logger.Info("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
Logger.Info("Namenkonvention (" & i & ") " & konvention)
wdIndexwert = wdIndexwert.ToString.TrimEnd
wdIndexwert = wdIndexwert.ToString.TrimStart
Logger.Info("Ausgelesener Indexwert = '" & wdIndexwert & "'")
konvention = konvention.Replace(reg_element.Value, wdIndexwert.ToString)
i += 1
Else
Logger.Warn("Achtung gelesener Wert ist ein Vektorfeld - keine Umbenennung möglich ")
End If
End If
Next
Dim version As Integer = 2
Dim ZielPfad As String = Path.GetDirectoryName(aktfile_Exportresult)
Logger.Info("ZielPfad: " & ZielPfad)
Dim Filename = konvention
Dim Extension = Path.GetExtension(aktfile_Exportresult)
Logger.Info("Extension: " & Extension)
Dim tempFilename As String = ZielPfad & "\" & Filename & Extension
Logger.Info("tempFilename: " & tempFilename)
'Überprüfen ob File existiert
Do While IO.File.Exists(tempFilename) = True
tempFilename = ZielPfad & "\" & Filename & "~" & version & Extension
version += 1
Loop
Logger.Info("RenameFile - OLDFilename: " & aktfile_Exportresult & " - NEWFilename: " & Path.GetFileName(tempFilename))
My.Computer.FileSystem.RenameFile(aktfile_Exportresult, Path.GetFileName(tempFilename))
Logger.Info("Datei wurde erfolgreich umbenannt.")
Return True
Catch ex As Exception
Logger.Error(ex)
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)
Logger.Info("ZielPfad: " & ZielPfad)
Dim Extension = Path.GetExtension(aktfile_Exportresult)
Logger.Info("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
Logger.Info("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
Logger.Info("tempFilename: " & tempFilename)
If anz = 1 Then
Logger.Info("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
Logger.Error(ex)
'
End Try
Next
Else
Logger.Warn("Achtung WMIndex " & WMINDEX_NAME & " scheint kein Vektorfeld zu sein!")
Return False
End If
Logger.Info("Dateien wurde erfolgreich nach Vektorfeld erzeugt.")
Return True
Catch ex As Exception
Logger.Error(ex)
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
Private Shared Function GetDocTypeCategory(docType As String)
Select Case docType
Case "Abliefernachweis"
Return 5
Case "Begleitdokument"
Return 6
Case Else
Return 0
End Select
End Function
''' <summary>
''' Generiert einen Link für BNS und fügt das Dokument WMFile
''' ins BNS ein
''' </summary>
''' <param name="WMFile">Das WMObject, dass das aktuelle Dokument repräsentiert</param>
''' <param name="userId">Die eindeutige Benutzer Kennung für die Authentifizierung in Windream</param>
Public Shared Function BNSjsonDownload(WMFile As WMObject, userId As String, apiAddress 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
'Dokumente sollen unbegrenzt gültig sein
'doc.Ivalidfrom = now
'doc.Ivaliduntil = now.AddDays(30)
doc.Pfad = link
doc.Dateiname = WMFile.aName
doc.Kategorien = New List(Of BNSDocumentCategory) From {
New BNSDocumentCategory With {.Id = GetDocTypeCategory(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 url As String = $"http://{apiAddress}/onwebui/api/Customer/{mandatenId}/{geschaeftsObjekt}/{geschaeftsId}/dokument"
Logger.Info($">> Generiertes JSON: {json}")
Logger.Info($">> Creating WebRequest for {url}")
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()
Logger.Info($">> Datei wird hochgeladen... docId: {DOKID}, dokart: {DOKART}, userId: {userId}")
Logger.Info($">> Upload URL: {url}")
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
Logger.Info($">> Datei geschrieben! docId: {DOKID}, dokart: {DOKART}, userId: {userId}")
Else
Throw New Exception($"Server Error (HTTP {code}: {text})")
End If
End Using
Return True
Catch ex As Exception
Logger.Error(ex)
Return True
End Try
End Function
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
Logger.Error(ex)
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
Logger.Error(ex)
Return False
End Try
End Function
Public Shared Function REGEX_REPLACE(WMFile As WMObject, _STRING As String)
Try
Logger.Info("REGEX_String before replacing: '" & _STRING & "'")
' 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("]", "")
Logger.Info("read indexvalue from index '" & reg_element_Ohne_SZ & "'....")
If reg_element_Ohne_SZ = "EXPORTED_FILENAME" Then
If clsCURRENT.EXPORTED_FILENAME <> "" Then
_STRING = _STRING.Replace(reg_element.Value, clsCURRENT.EXPORTED_FILENAME)
End If
ElseIf reg_element_Ohne_SZ = "ENV_USERNAME" Then
_STRING = _STRING.Replace(reg_element.Value, Environment.UserName)
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
Logger.Info("indexvalue read is: '" & wdIndexwert & "'")
_STRING = _STRING.Replace(reg_element.Value, wdIndexwert.ToString)
Logger.Info("REGEX_String (" & i & ") " & _STRING)
i += 1
Else
Logger.Warn("Attention: WMIndex is an vectorfield - seperation of values via ;")
Logger.Info("wdIndexValue is System.Object....")
Logger.Info("trying to seperate via ,....")
Dim vector_result As String = ""
For Each WMvalue As Object In wdIndexwert
Dim x As Integer = 0
If WMvalue.ToString <> String.Empty Then
WMvalue = WMvalue.ToString.TrimEnd
WMvalue = WMvalue.ToString.TrimStart
If vector_result = "" Then
vector_result = WMvalue
Else
vector_result = vector_result & ";" & WMvalue
End If
x += 1
End If
Next
_STRING = _STRING.Replace(reg_element.Value, vector_result.ToString)
Logger.Info("REGEX_String after vector-for-each (" & i & ") " & _STRING)
End If
Else
Logger.Warn("Attention: Indexvalue is NOTHING, standardvalue '0' will be used", False, "clsDateiverarbeitung.REGEX_REPLACE")
_STRING = _STRING.Replace(reg_element.Value, "0")
End If
End If
Next
Return _STRING
Catch ex As Exception
Logger.Error(ex)
Return Nothing
End Try
End Function
Public Class BNSDocument
Public Doksourcetype As Integer = 3
Public Pfad As String
'Dokumente sollen unbegrenzt gültig sein
'Public Ivalidfrom As DateTime
'Public Ivaliduntil As DateTime
Public Bemerkung As String
Public Primaer As Boolean = False
Public Fremsysid As Integer = 1
Public Kategorien As List(Of BNSDocumentCategory)
Public Dateiname As String
End Class
Public Class BNSDocumentCategory
Public Id As Integer
End Class
End Class