From 30d8d953a0f00c6a7ef3d7f2d806a402c13c41f3 Mon Sep 17 00:00:00 2001 From: huangxianguo Date: Wed, 17 Jul 2024 14:22:08 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=B8=8A=E4=BC=A0=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E7=9B=B8=E5=85=B3=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DataExporter/CoordinateService.cs | 20 +++ .../ImageExporter/ImageService.cs | 161 ++++++++++++++++++ .../ImageExporter/Model/ImageExportData.cs | 12 ++ .../LogExporter/LogFileExporter.cs | 2 +- .../MasstransferExporter.csproj | 5 +- MasstransferExporter/Program.cs | 5 +- .../Minio/MinioHelper.cs | 4 +- 7 files changed, 200 insertions(+), 9 deletions(-) create mode 100644 MasstransferExporter/DataExporter/CoordinateService.cs create mode 100644 MasstransferExporter/ImageExporter/ImageService.cs create mode 100644 MasstransferExporter/ImageExporter/Model/ImageExportData.cs diff --git a/MasstransferExporter/DataExporter/CoordinateService.cs b/MasstransferExporter/DataExporter/CoordinateService.cs new file mode 100644 index 0000000..5dc1dea --- /dev/null +++ b/MasstransferExporter/DataExporter/CoordinateService.cs @@ -0,0 +1,20 @@ +using MasstransferInfrastructure.Database.Sqlite; + +namespace MasstransferExporter.DataExporter; + +/// +/// 坐标信息业务类 +/// +public class CoordinateService +{ + private static readonly SqliteHelper Db = SqliteHelper.GetInstance(); + + /// + /// 坐标信息导出 + /// + public static void CoordinateExporter() + { + + + } +} \ No newline at end of file diff --git a/MasstransferExporter/ImageExporter/ImageService.cs b/MasstransferExporter/ImageExporter/ImageService.cs new file mode 100644 index 0000000..6383a88 --- /dev/null +++ b/MasstransferExporter/ImageExporter/ImageService.cs @@ -0,0 +1,161 @@ +using System.Drawing; +using MasstransferCommon.Model.Constant; +using MasstransferCommunicate.Minio; +using MasstransferCommunicate.Mqtt.Client; +using MasstransferExporter.DataExporter.Model; +using MasstransferExporter.ImageExporter.Model; +using MasstransferInfrastructure.Database.Sqlite; + +namespace MasstransferExporter.ImageExporter; + +public class ImageService +{ + private static readonly MinioHelper Minio = MinioHelper.GetInstance(); + + private static readonly SqliteHelper Helper = SqliteHelper.GetInstance(); + + private const string BasePath = "masstransfer"; + + private static SystemParams? GetSystemParams() + { + return Helper.Query("select * from system_params limit 1") + .FirstOrDefault(); + } + + /// + /// 对图片生产缩略图 + /// + private static void GenerateThumbnail(DirectoryInfo dir) + { + // 获取文件夹下所有文件的信息 + var fs = dir.GetFiles(); + + if (fs != null && fs.Length > 0) + { + try + { + foreach (var file in fs) + { + if (file.Name.EndsWith(".bmp") && !file.Name.Contains("_thumbnail")) + { + // 判断是否已经存在缩略图,如果存在的话,则跳过生成过程 + var thumbnailFilePath = file.FullName.Replace(".bmp", "_thumbnail.bmp"); + if (!File.Exists(thumbnailFilePath)) + { + GenerateThumbnail(file.FullName); + } + } + } + } + catch (Exception e) + { + Console.WriteLine(e); + } + } + + // 递归遍历当前目录下的所有文件夹 + foreach (var subdir in dir.GetDirectories()) GenerateThumbnail(subdir); + } + + /// + /// 生成缩略图 + /// + /// + static void GenerateThumbnail(string filePath) + { + using (var image = Image.FromFile(filePath)) + { + var thumbnailWidth = 410; + var thumbnailHeight = 300; + var thumbnail = image.GetThumbnailImage(thumbnailWidth, thumbnailHeight, () => false, IntPtr.Zero); + + var directory = Path.GetDirectoryName(filePath); + var fileNameWithoutExt = Path.GetFileNameWithoutExtension(filePath); + var extension = Path.GetExtension(filePath); + var newFileName = $"{fileNameWithoutExt}_thumbnail{extension}"; + + var newFilePath = Path.Combine(directory, newFileName); + thumbnail.Save(newFilePath); + } + } + + + /// + /// 上传图片 + /// + public static async void ImageExporter() + { + var yesterday = DateTime.Today.AddDays(-1); + + await ImageExporter(yesterday); + } + + /// + /// 导出图片文件 + /// + /// + /// + private static async Task ImageExporter(DateTime dateTime, bool isThumbnail = true) + { + try + { + var systemParams = GetSystemParams(); + var imageStoragePath = + systemParams!.ImageStoragePath ?? Environment.GetEnvironmentVariable("USERPROFILE"); + + var date = dateTime.ToString("yyyyMMdd"); + + var dir = Path.Combine(imageStoragePath, BasePath, date); + + if (!Directory.Exists(dir)) return; + + var dirInfo = new DirectoryInfo(dir); + + // 对图片进行压缩 + GenerateThumbnail(dirInfo); + + // 文件保存路径的规则是 {user BasePath}/masstransfer/images/{yyyyMMdd}/{batchCode}/wafer/{waferCode}/{timestamp}.bmp + var files = dirInfo.GetDirectories(); + foreach (var batchDir in files) + { + var types = batchDir.GetDirectories(); + foreach (var type in types) + { + var codeDirs = type.GetDirectories(); + foreach (var codeDir in codeDirs) + { + var images = codeDir.GetFiles(); + + 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 fileName = $"123456/{codeDir.Name}/{batchDir.Name}/{type.Name}/{image.Name}"; + + var path = image.FullName; + + await Minio.UploadFileAsync("image", fileName, path); + } + + var data = new ImageExportData() + { + BatchNumber = batchDir.Name, + BizNumber = codeDir.Name, + ImageType = type.Name, + PicType = isThumbnail ? "thumbnail" : "raw" + }; + + // 上传完成后发布通知 + await MessageQueueHelper.Publish(Topics.ImageUpload, data); + } + } + } + } + catch (Exception e) + { + Console.WriteLine($"图片导出失败,{e}"); + } + } +} \ No newline at end of file diff --git a/MasstransferExporter/ImageExporter/Model/ImageExportData.cs b/MasstransferExporter/ImageExporter/Model/ImageExportData.cs new file mode 100644 index 0000000..eab390a --- /dev/null +++ b/MasstransferExporter/ImageExporter/Model/ImageExportData.cs @@ -0,0 +1,12 @@ +namespace MasstransferExporter.ImageExporter.Model; + +public class ImageExportData +{ + public string PicType { get; set; } + + public string BizNumber { get; set; } + + public string BatchNumber { get; set; } + + public string ImageType { get; set; } +} \ No newline at end of file diff --git a/MasstransferExporter/LogExporter/LogFileExporter.cs b/MasstransferExporter/LogExporter/LogFileExporter.cs index 2751680..600c662 100644 --- a/MasstransferExporter/LogExporter/LogFileExporter.cs +++ b/MasstransferExporter/LogExporter/LogFileExporter.cs @@ -32,7 +32,7 @@ public class LogFileExporter foreach (var file in files) { - var fileName = $"123456/{TimeUtil.FormatTime(yesterday, "yyyy-MM-dd")}/{level}/{file.Name}"; + var fileName = $"123456/{TimeUtil.FormatTime(yesterday, "yyyyMMdd")}/{level}/{file.Name}"; await _minio.UploadFileAsync("log", fileName, file.FullName); } diff --git a/MasstransferExporter/MasstransferExporter.csproj b/MasstransferExporter/MasstransferExporter.csproj index 8bd3601..0ef7439 100644 --- a/MasstransferExporter/MasstransferExporter.csproj +++ b/MasstransferExporter/MasstransferExporter.csproj @@ -15,6 +15,7 @@ + @@ -35,8 +36,4 @@ - - - - diff --git a/MasstransferExporter/Program.cs b/MasstransferExporter/Program.cs index 349542a..7dba110 100644 --- a/MasstransferExporter/Program.cs +++ b/MasstransferExporter/Program.cs @@ -1,6 +1,5 @@ using MasstransferCommunicate.Mqtt.Client; -using MasstransferExporter.DataExporter; -using MasstransferExporter.Stat; +using MasstransferExporter.ImageExporter; using MasstransferInfrastructure.Mqtt.Model; class Program @@ -16,7 +15,7 @@ class Program await MessageQueueHelper.InitConnect(options); - HeartbeatExporter.HeartBeat(); + ImageService.ImageExporter(); Console.WriteLine("按任意键退出"); diff --git a/MasstransferInfrastructure/Minio/MinioHelper.cs b/MasstransferInfrastructure/Minio/MinioHelper.cs index 0fab250..8113982 100644 --- a/MasstransferInfrastructure/Minio/MinioHelper.cs +++ b/MasstransferInfrastructure/Minio/MinioHelper.cs @@ -60,11 +60,13 @@ public class MinioHelper await _client.MakeBucketAsync(new MakeBucketArgs().WithBucket(bucketName)); } - await _client.PutObjectAsync(new PutObjectArgs() + var response = await _client.PutObjectAsync(new PutObjectArgs() .WithBucket(bucketName) .WithObject(fileName) .WithFileName(filePath)); + Console.WriteLine(response); + return $"{bucketName}/{fileName}"; }