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}";
}