Imports System.Text Imports UTS_Core.Database Imports UTS_Core.UTSModule.DbConnect Imports UTS_Core.UTSModule.DbTableModel.Manage Namespace UTSModule.Service Public Class AppRegister Implements IDisposable ''' ''' 当前App所属服务索引 ''' ''' Public ReadOnly Property ServiceIndex As Integer ''' ''' 当前App名称 ''' ''' Public ReadOnly Property AppName As String ''' ''' 当前App版本 ''' ''' Public ReadOnly Property AppVersion As String ''' ''' 当前App运行信息 ''' ''' Public Property AppMsg As String ''' ''' 当前App状态,默认0为空闲 ''' ''' Public Property AppStatus As Integer Private ReadOnly _logLock As Object = New Object() Private ReadOnly _logQueue As New Queue(Of Dictionary(Of String, String)) Enum LogTypeEnum ''' ''' 调试信息 ''' Debug ''' ''' 流程信息 ''' Info ''' ''' 警告信息 ''' Warn ''' ''' 错误信息 ''' [Error] ''' ''' 致命信息 ''' Fatal End Enum Sub New(serviceIndex As Integer, appName As String, appVersion As String) Me.ServiceIndex = serviceIndex Me.AppName = appName Me.AppVersion = appVersion InitApp().GetAwaiter().GetResult() End Sub Public Property ProjectName() As String Public Property StationName() As String Public Property TestPlan() As String Private Async Function InitApp() As Task If AppRegistered() Then '更新App版本 Try Await UpdateAppVersion() Catch ex As Exception Throw New Exception($"UpdateAppVersion Error: {ex.Message}") End Try Return End If Try RegisterApp() '注册App Catch ex As Exception Throw New Exception($"RegisterApp Error: {ex.Message}") End Try End Function Private Function AppRegistered() As Boolean Dim result As Integer Dim colName As String = $"count(*)" Dim tableName As String = $"{AppListTable.TableName}" Dim condition As String = $"`{AppListTable.ColNamesEnum.ServiceID}` = {ServiceIndex} and `{AppListTable.ColNamesEnum.AppName}` = '{AppName}'" Using db As New DbExecutor(UtsDb.LocalDbType, UtsDb.LocalConnString) db.Open() Dim cmdText As String = db.CmdHelper.Search(colName, tableName, condition) result = CInt(db.ExecuteScalar(cmdText)) db.Close() End Using Return result > 0 End Function Private Sub RegisterApp() Dim tableName As String = AppListTable.TableName Dim filed As New Dictionary(Of String, String) From { {$"{AppListTable.ColNamesEnum.ServiceID}", ServiceIndex.ToString()}, {$"{AppListTable.ColNamesEnum.AppName}", AppName}, {$"{AppListTable.ColNamesEnum.AppVersion}", AppVersion}, {$"{AppListTable.ColNamesEnum.RegisterDateTime}", Now.ToString("yyyy-MM-dd HH:mm:ss")}, {$"{AppListTable.ColNamesEnum.LastActiveDateTime}", Now.ToString("yyyy-MM-dd HH:mm:ss")} } Dim saved As Boolean Dim cmdText As String Try '远程注册App Using db As New DbExecutor(UtsDb.RemoteDbType, UtsDb.RemoteConnString) db.Open() cmdText = $"call `uts_manage`.`RegisterApp` ({ServiceIndex},'{AppName}','{AppVersion}','{Now:yyyy-MM-dd HH:mm:ss}')" db.ExecuteNonQuery(cmdText) db.Close() End Using saved = True Catch ex As Exception saved = False Console.WriteLine("Register Remote App Error:" & ex.Message) End Try '本地注册App Using db As New DbExecutor(UtsDb.LocalDbType, UtsDb.LocalConnString) db.Open() cmdText = db.CmdHelper.Insert(tableName, filed) db.ExecuteNonQuery(cmdText) If saved = False Then cmdText = $"call `uts_manage`.`RegisterApp` ({ServiceIndex},'{AppName}','{AppVersion}','{Now:yyyy-MM-dd HH:mm:ss}')" DbConnector.SaveCmdStringToCacheTable(db, cmdText) End If db.Close() End Using End Sub Private Async Function UpdateAppVersion() As Task Dim tableName As String = AppListTable.TableName Dim filed As New Dictionary(Of String, String) From { {$"{AppListTable.ColNamesEnum.AppVersion}", AppVersion}, {$"{AppListTable.ColNamesEnum.LastActiveDateTime}", Now.ToString("yyyy-MM-dd HH:mm:ss")} } Dim condition As String = $"`{AppListTable.ColNamesEnum.ServiceID}` = {ServiceIndex} and `{AppListTable.ColNamesEnum.AppName}` = '{AppName}'" Dim saved As Boolean Dim cmdText As String Try '远程更新App版本 Using db As New DbExecutor(UtsDb.RemoteDbType, UtsDb.RemoteConnString) cmdText = db.CmdHelper.DbUpdate(UtsDb.RemotePublicDb, tableName, filed, condition) Await db.OpenAsync() Await db.ExecuteNonQueryAsync(cmdText) db.Close() End Using saved = True Catch ex As Exception saved = False Console.WriteLine("Update Remote AppVersion Error:" & ex.Message) End Try '本地更新App版本 Using db As New DbExecutor(UtsDb.LocalDbType, UtsDb.LocalConnString) Await db.OpenAsync() cmdText = db.CmdHelper.Update(tableName, filed, condition) Await db.ExecuteNonQueryAsync(cmdText) '保存至缓冲队列 If saved = False Then cmdText = New DbExecutor(UtsDb.RemoteDbType, UtsDb.RemoteConnString).CmdHelper.DbUpdate(UtsDb.RemotePublicDb, tableName, filed, condition) DbConnector.SaveCmdStringToCacheTable(db, cmdText) End If db.Close() End Using End Function ''' ''' 定期更新APP的活动时间,调用则会定期基于本地调用存储过程至缓存表 ''' Public Sub UpdateAliveTime() Dim sb As New StringBuilder sb.Append($"update `{UtsDb.RemotePublicDb}`.`{AppListTable.TableName}` set ") sb.Append($"`{AppListTable.ColNamesEnum.AppVersion}` = '{AppVersion}' ") sb.Append($",`{AppListTable.ColNamesEnum.LastActiveDateTime}` = current_timestamp() ") If String.IsNullOrEmpty(AppMsg) = False Then Select Case AppStatus Case 0 '空闲状态 sb.Append($",`{AppListTable.ColNamesEnum.LastInfomation}` = '{AppMsg},Status:Idle' ") Case 1 '测试中 sb.Append($",`{AppListTable.ColNamesEnum.LastInfomation}` = '{AppMsg},Status:Testing'") End Select End If sb.Append($"where `{AppListTable.ColNamesEnum.ServiceID}` = {ServiceIndex} ") sb.Append($"and `{AppListTable.ColNamesEnum.AppName}` = '{AppName}' ") Try Using db As New DbExecutor(UtsDb.RemoteDbType, UtsDb.RemoteConnString) db.Open() db.ExecuteNonQuery(sb.ToString) db.Close() End Using Catch ex As Exception Console.WriteLine($"Update AppInfo Error:{ex.Message}") End Try End Sub Public Shared Sub CreateAppLogTable() Try Using db As New DbExecutor(UtsDb.LocalDbType, UtsDb.LocalConnString) db.Open() Dim cmdText As String = AppLogTable.CreateTableString("", DbExecutor.DbTypeEnum.Sqlite) db.ExecuteNonQuery(cmdText) db.Close() End Using Catch ex As Exception Throw New Exception($"CreateAppLogTable Error:{ex.Message}") End Try End Sub Public Shared Sub CreateAppListTable() Try Using db As New DbExecutor(UtsDb.LocalDbType, UtsDb.LocalConnString) db.Open() Dim cmdText As String = AppListTable.CreateTableString("", DbExecutor.DbTypeEnum.Sqlite) db.ExecuteNonQuery(cmdText) db.Close() End Using Catch ex As Exception Throw New Exception($"CreateAppListTable Error:{ex.Message}") End Try End Sub Public Sub AppendDebugLog(logText As String) AppendLogToLogQueue(LogTypeEnum.Debug, logText) End Sub Public Sub AppendTraceLog(logText As String) AppendLogToLogQueue(LogTypeEnum.Info, logText) End Sub Public Sub AppendWarningLog(logText As String) AppendLogToLogQueue(LogTypeEnum.Warn, logText) End Sub Public Sub AppendErrorLog(logText As String) AppendLogToLogQueue(LogTypeEnum.Error, logText) End Sub Public Sub AppendFatalLog(logText As String) AppendLogToLogQueue(LogTypeEnum.Fatal, logText) End Sub ''' ''' 添加日志内容至缓存的日志队列中 ''' 调用SaveLogQueueToDb将队列中的数据写入到数据库 ''' ''' Tip:缓存队列仅记录每条日志不同的内容,例如写入时间,日志类型,日志内容等 ''' ''' ''' Public Sub AppendLogToLogQueue(logType As LogTypeEnum, logText As String) Dim dicFiled As New Dictionary(Of String, String) dicFiled.Add($"{AppLogTable.ColNamesEnum.DateTime}", $"{Now:yyyy-MM-dd HH:mm:ss}") dicFiled.Add($"{AppLogTable.ColNamesEnum.LogType}", $"{logType}") dicFiled.Add($"{AppLogTable.ColNamesEnum.LogText}", $"{logText}") SyncLock _logLock _logQueue.Enqueue(dicFiled) '将日志信息放入缓冲队列 End SyncLock End Sub Public Sub SaveLogQueueToDb() If _logQueue.Count <= 0 Then Return Dim tableName As String = AppLogTable.TableName Using db As New DbExecutor(UtsDb.LocalDbType, UtsDb.LocalConnString) db.Open() db.BeginTransaction() Dim dicFiled As Dictionary(Of String, String) Dim cmdText As String Dim cmdHelper As DbCmdHelper = DbCmdHelper.CreateCmdHelper(UtsDb.RemoteDbType) SyncLock _logLock While _logQueue.Count > 0 dicFiled = _logQueue.Dequeue() dicFiled.Add($"{AppLogTable.ColNamesEnum.ServiceID}", $"{ServiceIndex}") dicFiled.Add($"{AppLogTable.ColNamesEnum.AppName}", $"{AppName}") dicFiled.Add($"{AppLogTable.ColNamesEnum.AppVersion}", $"{AppVersion}") dicFiled.Add($"{AppLogTable.ColNamesEnum.ProjectName}", $"{ProjectName}") dicFiled.Add($"{AppLogTable.ColNamesEnum.StationName}", $"{StationName}") dicFiled.Add($"{AppLogTable.ColNamesEnum.TestPlan}", $"{TestPlan}") Try cmdText = db.CmdHelper.Insert(tableName, dicFiled) db.ExecuteNonQuery(cmdText) '执行语句 Catch ex As Exception Console.WriteLine($"Write LogQueue To Local DB Error: {ex.Message}") Continue While End Try Try cmdText = cmdHelper.DbInsert(UtsDb.RemotePublicDb, tableName, dicFiled) DbConnector.SaveCmdStringToCacheTable(db, cmdText) '执行命令入缓存库 Catch ex As Exception Console.WriteLine($"Write LogQueue To Chche DB Error: {ex.Message}") Continue While End Try End While End SyncLock db.CommitTransaction() db.Close() End Using End Sub Public Sub Dispose() Implements IDisposable.Dispose End Sub End Class End Namespace