diff --git a/MasstransferCommon/Model/Enum/ExceptionLevel.cs b/MasstransferCommon/Model/Enum/ExceptionLevel.cs new file mode 100644 index 0000000..d01875d --- /dev/null +++ b/MasstransferCommon/Model/Enum/ExceptionLevel.cs @@ -0,0 +1,8 @@ +namespace MasstransferCommon.Model.Enum; + +public enum ExceptionLevel : int +{ + NORMAL, + WARN, + ERROR, +} \ No newline at end of file diff --git a/MasstransferExporter/DataExporter/FaultRecordService.cs b/MasstransferExporter/DataExporter/FaultRecordService.cs new file mode 100644 index 0000000..26c96f6 --- /dev/null +++ b/MasstransferExporter/DataExporter/FaultRecordService.cs @@ -0,0 +1,36 @@ +using MasstransferCommon.Model.Constant; +using MasstransferCommunicate.Mqtt.Client; +using MasstransferExporter.DataExporter.Model; +using MasstransferInfrastructure.Database.Sqlite; + +namespace MasstransferExporter.DataExporter; + +public class FaultRecordService +{ + private static readonly SqliteHelper Db = SqliteHelper.GetInstance(); + + + /// + /// 每5分钟上传一次故障数据 + /// + public static async Task FaultRecordDataExporter() + { + var endTime = DateTime.Now; + var startTime = endTime.AddMinutes(-30); + + // 查询5分钟内的故障记录 + var sql = "SELECT * FROM fault_records WHERE update_time >= ? AND update_time <= ?"; + var records = Db.Query(sql, startTime, endTime); + foreach (var record in records) + { + var dto = new FaultRecordDTO() + { + ErrorCode = record.FaultCode, + Timestamp = record.UpdateTime, + Status = record.Solved ? 0 : 1 + }; + + await MessageQueueHelper.Publish(Topics.ReportFaultRecord, dto); + } + } +} \ No newline at end of file diff --git a/MasstransferExporter/DataExporter/Model/FaultRecord.cs b/MasstransferExporter/DataExporter/Model/FaultRecord.cs new file mode 100644 index 0000000..adc2f93 --- /dev/null +++ b/MasstransferExporter/DataExporter/Model/FaultRecord.cs @@ -0,0 +1,43 @@ +using System.ComponentModel; +using MasstransferCommon.Model.Entity; +using MasstransferCommon.Model.Enum; +using SQLite; + +namespace MasstransferExporter.DataExporter.Model; + +/// +/// 故障记录 +/// +[Table("fault_records"), Description("故障记录")] +public class FaultRecord : Entity +{ + [Column("source"), Description("故障来源")] + public string? Source { get; set; } + + [Column("fault_code"), Description("故障编码")] + public string? FaultCode { get; set; } + + [Column("fault_desc"), Description("故障描述")] + public string? FaultDesc { get; set; } + + [Column("fault_time"), Description("故障时间")] + public DateTime FaultTime { get; set; } + + [Column("fault_level"), Description("故障级别")] + public ExceptionLevel Level { get; set; } + + [Column("fault_message"), Description("故障信息")] + public string? FaultMessage { get; set; } + + [Column("solved"), Description("是否已处理")] + public bool Solved { get; set; } + + [Column("solved_time"), Description("处理时间")] + public DateTime? SolvedTime { get; set; } + + [Column("solved_by_user_id"), Description("处理人Id")] + public string? SolvedByUserId { get; set; } + + [Column("solved_by_user_name"), Description("处理人名称")] + public string? SolvedByUserName { get; set; } +} \ No newline at end of file diff --git a/MasstransferExporter/DataExporter/Model/FaultRecordDTO.cs b/MasstransferExporter/DataExporter/Model/FaultRecordDTO.cs new file mode 100644 index 0000000..5cafdc3 --- /dev/null +++ b/MasstransferExporter/DataExporter/Model/FaultRecordDTO.cs @@ -0,0 +1,25 @@ +using Newtonsoft.Json; + +namespace MasstransferExporter.DataExporter.Model; + +/// +/// 上报的故障信息 +/// +public class FaultRecordDTO +{ + /// + /// 错误码 + /// + [JsonProperty("errorCode")] + public string? ErrorCode { get; set; } + + [JsonProperty("timestamp")] public DateTime Timestamp { get; set; } + + /// + /// 故障状态项 + /// 0:解除故障 + /// 1:发生故障 + /// + [JsonProperty("status")] + public int Status { get; set; } +} \ No newline at end of file diff --git a/MasstransferExporter/ImageExporter/ImageService.cs b/MasstransferExporter/ImageExporter/ImageService.cs index 1ab3029..a242e2d 100644 --- a/MasstransferExporter/ImageExporter/ImageService.cs +++ b/MasstransferExporter/ImageExporter/ImageService.cs @@ -181,7 +181,7 @@ public class ImageService : Instant { var yesterday = DateTime.Today.AddDays(-2); - await ImageExporter(yesterday, false); + await ImageExporter(new DateTime(2024, 9, 9), false); } /// @@ -205,47 +205,52 @@ public class ImageService : Instant var dirInfo = new DirectoryInfo(dir); - // 文件保存路径的规则是 {user BasePath}/masstransfer/images/{batchCode}/{yyyyMMdd}/wafer/{waferCode}/{timestamp}.bmp - var files = dirInfo.GetDirectories().Where(d => d.CreationTime.Date == dateTime); - foreach (var batchDir in files) + var batchCodes = dirInfo.GetDirectories(); + foreach (var batchCode in batchCodes) { - if (isThumbnail) + // 文件保存路径的规则是 {user BasePath}/masstransfer/images/{batchCode}/{yyyyMMdd}/wafer/{waferCode}/{timestamp}.bmp + var dates = batchCode.GetDirectories().Where(d => d.CreationTime.Date == dateTime); + foreach (var dateDir in dates) { - // 对图片进行压缩 - GenerateThumbnail(batchDir); - } - - var types = batchDir.GetDirectories(); - foreach (var type in types) - { - var codeDirs = type.GetDirectories(); - foreach (var codeDir in codeDirs) + if (isThumbnail) { - var images = codeDir.GetFiles(); + // 对图片进行压缩 + GenerateThumbnail(dateDir); + } - images = isThumbnail - ? images.Where(x => x.Name.EndsWith("_thumbnail.bmp")).ToArray() - : images.Where(x => !x.Name.EndsWith("_thumbnail.bmp")).ToArray(); - - foreach (var image in images) + var types = dateDir.GetDirectories(); + foreach (var type in types) + { + var codeDirs = type.GetDirectories(); + foreach (var codeDir in codeDirs) { - var fileName = $"{Constants.SN}/{codeDir.Name}/{batchDir.Name}/{type.Name}/{image.Name}"; + var images = codeDir.GetFiles(); - var path = image.FullName; + images = isThumbnail + ? images.Where(x => x.Name.EndsWith("_thumbnail.bmp")).ToArray() + : images.Where(x => !x.Name.EndsWith("_thumbnail.bmp")).ToArray(); - await Minio.UploadFileAsync(bucket, fileName, path); + foreach (var image in images) + { + var fileName = + $"{Constants.SN}/{codeDir.Name}/{batchCode.Name}/{type.Name}/{image.Name}"; + + var path = image.FullName; + + await Minio.UploadFileAsync(bucket, fileName, path); + } + + var data = new ImageExportData() + { + BatchNumber = batchCode.Name, + BizNumber = codeDir.Name, + ImageType = type.Name, + PicType = isThumbnail ? "thumbnail" : "raw" + }; + + // 上传完成后发布通知 + await MessageQueueHelper.Publish(Topics.ImageUpload, data); } - - var data = new ImageExportData() - { - BatchNumber = batchDir.Name, - BizNumber = codeDir.Name, - ImageType = type.Name, - PicType = isThumbnail ? "thumbnail" : "raw" - }; - - // 上传完成后发布通知 - await MessageQueueHelper.Publish(Topics.ImageUpload, data); } } } diff --git a/MasstransferExporter/Program.cs b/MasstransferExporter/Program.cs index 5231f48..ba1ab6b 100644 --- a/MasstransferExporter/Program.cs +++ b/MasstransferExporter/Program.cs @@ -4,7 +4,9 @@ using MasstransferCommon.Scheduler; using MasstransferCommunicate.Mqtt.Client; using MasstransferCommunicate.Process.Client; using MasstransferExporter.DataExporter; +using MasstransferExporter.ImageExporter; using MasstransferExporter.Init; +using MasstransferExporter.Stat; using MasstransferInfrastructure.Database.Sqlite; using MasstransferInfrastructure.Mqtt.Model; @@ -35,11 +37,11 @@ class Program // 启动完成后,广播启动通知 EventBus.Publish(EventType.StartUp, true); - DelayScheduler.Delay(async () => await FormulaService.FormulaDataExporter(), + DelayScheduler.Delay(async () => ImageService.ImageExporter(), TimeSpan.FromSeconds(5)); // 启动与主程序的通信 - ProcessHelper.Init(); + // ProcessHelper.Init(); // SystemStatExporter.Collect(); diff --git a/MasstransferInfrastructure/Minio/MinioHelper.cs b/MasstransferInfrastructure/Minio/MinioHelper.cs index 27bcec0..ef6f590 100644 --- a/MasstransferInfrastructure/Minio/MinioHelper.cs +++ b/MasstransferInfrastructure/Minio/MinioHelper.cs @@ -63,12 +63,14 @@ public class MinioHelper await _client.MakeBucketAsync(new MakeBucketArgs().WithBucket(bucketName)); } + Console.WriteLine($"正在上传文件: {fileName} 到 bucket: {bucketName}"); + await _client.PutObjectAsync(new PutObjectArgs() .WithBucket(bucketName) .WithObject(fileName) .WithFileName(filePath)); - Console.WriteLine("文件上传成功"); + Console.WriteLine($"文件 {fileName} 上传成功"); return $"{bucketName}/{fileName}"; }