完善故障记录和上传图片的接口
This commit is contained in:
parent
0daf08eb3d
commit
4dd680b0dc
|
@ -0,0 +1,8 @@
|
|||
namespace MasstransferCommon.Model.Enum;
|
||||
|
||||
public enum ExceptionLevel : int
|
||||
{
|
||||
NORMAL,
|
||||
WARN,
|
||||
ERROR,
|
||||
}
|
|
@ -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();
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 每5分钟上传一次故障数据
|
||||
/// </summary>
|
||||
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<FaultRecord>(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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,43 @@
|
|||
using System.ComponentModel;
|
||||
using MasstransferCommon.Model.Entity;
|
||||
using MasstransferCommon.Model.Enum;
|
||||
using SQLite;
|
||||
|
||||
namespace MasstransferExporter.DataExporter.Model;
|
||||
|
||||
/// <summary>
|
||||
/// 故障记录
|
||||
/// </summary>
|
||||
[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; }
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
using Newtonsoft.Json;
|
||||
|
||||
namespace MasstransferExporter.DataExporter.Model;
|
||||
|
||||
/// <summary>
|
||||
/// 上报的故障信息
|
||||
/// </summary>
|
||||
public class FaultRecordDTO
|
||||
{
|
||||
/// <summary>
|
||||
/// 错误码
|
||||
/// </summary>
|
||||
[JsonProperty("errorCode")]
|
||||
public string? ErrorCode { get; set; }
|
||||
|
||||
[JsonProperty("timestamp")] public DateTime Timestamp { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 故障状态项
|
||||
/// 0:解除故障
|
||||
/// 1:发生故障
|
||||
/// </summary>
|
||||
[JsonProperty("status")]
|
||||
public int Status { get; set; }
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<bool>.Publish(EventType.StartUp, true);
|
||||
|
||||
DelayScheduler.Delay(async () => await FormulaService.FormulaDataExporter(),
|
||||
DelayScheduler.Delay(async () => ImageService.ImageExporter(),
|
||||
TimeSpan.FromSeconds(5));
|
||||
|
||||
// 启动与主程序的通信
|
||||
ProcessHelper.Init();
|
||||
// ProcessHelper.Init();
|
||||
|
||||
// SystemStatExporter.Collect();
|
||||
|
||||
|
|
|
@ -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}";
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue