using FISLib.AfterSales; using System; using System.Diagnostics; using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; using Vinno.FIS.Sonopost.Common; using Vinno.FIS.Sonopost.Helpers; using Vinno.IUS.Common.Log; namespace Vinno.FIS.Sonopost.Features.AfterSales { internal class GetLogAfterSalesTask : AfterSalesTask { private DateTime _startTime; private DateTime _endTime; private string _exportLogFolder; private string _logPath; private string _targetId; private const double _prepareLogSuccess = 0.2; private const double _compressSuccessProgress = 0.4; private const double _finishProcess = 1.0; private string _remoteLogZipPath; private Stopwatch _stopwatch; private FISMasterInfo _masterInfo; public GetLogAfterSalesTask(FISMasterInfo masterInfo) { Status = AfterSalesCommandStatus.Progressing; _masterInfo = masterInfo; } protected override void OnDownloadProgressChanged(object sender, double e) { } protected override void OnDownloadResultRaised(object sender, int e) { } public override void Execute() { try { if (IsExcuting) { return; } IsExcuting = true; if (FISAdditionParameters == null) { Logger.WriteLineError($"GetLogTask FISAdditionParameters is null"); SendProcessResultToServer(new FISProcessResult(_masterInfo.UserId, FISTaskType.GetLog, FISTaskStatus.Failed, FISDetailType.GetLogDeny, 0.01, FISProcessSource.FromTerminal, string.Empty)); return; } InitParameters(); _exportLogFolder = Path.Combine(SonopostConstants.DataFolder, "ExportLogFolder"); string[] logsType = { "Logs", "SmartLogs", "TRTCClientLogs", "TRTCLogs" }; try { DirectoryHelper.DeleteDirectory(_exportLogFolder); DirectoryHelper.CreateDirectory(_exportLogFolder); foreach (var type in logsType) { GetLogsFile(type); } UploadLogFiles(_exportLogFolder); } catch (Exception ex) { Logger.WriteLineError($"OnGetLogEvent error:{ex}"); } } catch (Exception ex) { Logger.WriteLineError($"GetLogAfterSalesTask Excute Error:{ex}"); IsExcuting = false; } } private void InitParameters() { var parameterBeginTime = FISAdditionParameters.FirstOrDefault(x => x.Name == "BeginTime"); if (parameterBeginTime != null) DateTime.TryParse(parameterBeginTime.Value, out _startTime); var parameterEndTime = FISAdditionParameters.FirstOrDefault(x => x.Name == "EndTime"); if (parameterEndTime != null) DateTime.TryParse(parameterEndTime.Value, out _endTime); _targetId = _masterInfo.UserId; _remoteLogZipPath = Path.Combine(SonopostConstants.DataFolder, @"vinnologs\remotelogs.zip"); } /// /// 获取Logs /// /// private void GetLogsFile(string pathType) { string logsPath = Path.Combine(SonopostConstants.DataFolder, pathType); var exportLogFolder = Path.Combine(_exportLogFolder, pathType); if (!Directory.Exists(logsPath)) { Logger.WriteLineInfo($"No Exist Path:{logsPath}"); return; } DirectoryInfo di = new DirectoryInfo(logsPath); var fileList = di.GetFiles("*.*", SearchOption.AllDirectories); foreach (var logFile in fileList) { if (_startTime <= logFile.CreationTime.ToUniversalTime() && logFile.CreationTime.ToUniversalTime() <= _endTime) { string newFileName = logFile.FullName.Replace(logsPath, exportLogFolder); if (!newFileName.EndsWith(".log")) newFileName = newFileName + ".log"; string fileDir = Path.GetDirectoryName(newFileName); DirectoryHelper.CreateDirectory(fileDir); logFile.CopyTo(newFileName, true); } } } /// /// Uplaod Log Files /// /// file path private void UploadLogFiles(string path) { _logPath = path; var task = new Task(UploadLog, CancellationTokenSource.Token); task.Start(); } private void UploadLog() { try { var remotelogs = Directory.GetFiles(_logPath, "*.*", SearchOption.AllDirectories); if (remotelogs.Any()) { SendProcess(FISTaskStatus.Progressing, FISDetailType.PropareLogFile, _prepareLogSuccess); FileHelper.DeleteFile(_remoteLogZipPath); CompressHelper.CompressFolder(_logPath, _remoteLogZipPath); _stopwatch = new Stopwatch(); _stopwatch.Start(); OnUploadProgressChanged(this, 0.00); UploadFile(_remoteLogZipPath); } else { Logger.WriteLineError($"Upload Log Failed, because no log files found"); SendProcess(FISTaskStatus.Failed, FISDetailType.GetLogError, 0); } } catch (Exception ex) { Logger.WriteLineError($"Upload log error:{ex}"); if (CancellationTokenSource.IsCancellationRequested) { return; } SendProcess(FISTaskStatus.Failed, FISDetailType.GetLogError, 0); IsExcuting = false; } } private void SendProcess(FISTaskStatus taskStatus, FISDetailType detailType, double percent) { try { if (percent >= _finishProcess) { return; } var processInfo = new FISProcessInfo(percent, FISProgressStatus.Progressing, detailType); UpdateProgressInfo(processInfo); SendProcessResultToServer(new FISProcessResult(_targetId, FISTaskType.GetLog, taskStatus, detailType, percent, FISProcessSource.FromTerminal, string.Empty)); } catch (Exception ex) { Logger.WriteLineError($"Send process error:{ex}"); } } protected override void OnUploadProgressChanged(object sender, double uploadProgress) { var percent = uploadProgress * (1 - _compressSuccessProgress) + _compressSuccessProgress; SendProcess(FISTaskStatus.Progressing, FISDetailType.UplaodLog, percent); Logger.WriteLineInfo($"Get Log Task:OnUploadProgressChanged,Send Process {percent}"); } protected override void OnUploadResultRaised(object sender, string fileToken) { try { _stopwatch.Stop(); if (!string.IsNullOrEmpty(fileToken)) { Logger.WriteLineInfo($"Upload file to Vcloud storage finished, AVG speed:{0:F}KB/s," + $"{new FileInfo(_remoteLogZipPath).Length / 1024d / _stopwatch.Elapsed.TotalSeconds}"); var processInfo = new FISProcessInfo(_finishProcess, FISProgressStatus.Progressing, FISDetailType.GetLogSuccess); UpdateProgressInfo(processInfo); SendProcessResultToServer(new FISProcessResult(_targetId, FISTaskType.GetLog, FISTaskStatus.Finished, FISDetailType.GetLogSuccess, _finishProcess, FISProcessSource.FromTerminal, fileToken)); } else { SendProcess(FISTaskStatus.Failed, FISDetailType.GetLogError, 0); } FileHelper.DeleteFile(_remoteLogZipPath); } catch (Exception ex) { Logger.WriteLineError($"GetLogAfterSalesTask OnUploadResultRaised Error:{ex}"); } finally { CancelUpload(); IsExcuting = false; } } protected override void OnCancel() { try { var process = new FISProcessResult(_targetId, FISTaskType.GetLog, FISTaskStatus .Failed, FISDetailType.GetLogCancel, 0, FISProcessSource.FromTerminal, string.Empty); SendProcessResultToServer(process); CancellationTokenSource?.Cancel(); } catch (Exception ex) { Logger.WriteLineError($"GetLogTask OnCancel error: {ex}"); } } } }