Compare commits

...

4 Commits

7 changed files with 412 additions and 14 deletions

View File

@ -0,0 +1,51 @@
using MasstransferCommon.Model.Constant;
using MasstransferCommon.Utils;
using MasstransferCommunicate.Mqtt.Client;
using MasstransferExporter.DataExporter.Model;
using Masuit.Tools;
namespace MasstransferExporter.DataExporter;
/// <summary>
/// 配置服务
/// </summary>
public class ConfigService
{
/// <summary>
/// 监听配置下发事件
/// </summary>
public static async Task ListenConfigIssuedEvent()
{
await MessageQueueHelper.Subscribe(Topics.DownloadConfigData, HandleConfigIssuedEvent);
}
/// <summary>
/// 处理接收到的配置下发事件,根据配置类型执行不同的操作
/// </summary>
/// <param name="topic"></param>
/// <param name="payload"></param>
private static void HandleConfigIssuedEvent(string topic, string payload)
{
if (payload.IsNullOrEmpty()) return;
var data = JsonUtil.FromJson<ConfigData>(payload);
if (data.IsNullOrEmpty()) return;
var type = data.Type;
switch (type)
{
case "system":
SystemParamsService.HandleSystemParamsIssuedEvent(data);
break;
case "formula":
{
var param = data.Param;
var formulaDto = JsonUtil.FromJson<FormulaDTO>(JsonUtil.ToJson(param));
FormulaService.HandleFormulaIssuedEvent(formulaDto);
break;
}
}
}
}

View File

@ -4,6 +4,7 @@ using MasstransferCommunicate.Mqtt.Client;
using MasstransferCore.Model.Entity; using MasstransferCore.Model.Entity;
using MasstransferExporter.DataExporter.Model; using MasstransferExporter.DataExporter.Model;
using MasstransferInfrastructure.Database.Sqlite; using MasstransferInfrastructure.Database.Sqlite;
using Masuit.Tools;
namespace MasstransferExporter.DataExporter; namespace MasstransferExporter.DataExporter;
@ -14,6 +15,133 @@ public class FormulaService
{ {
private static readonly SqliteHelper Db = SqliteHelper.GetInstance(); private static readonly SqliteHelper Db = SqliteHelper.GetInstance();
/// <summary>
/// 处理配方下发事件
/// </summary>
public static void HandleFormulaIssuedEvent(FormulaDTO formulaDto)
{
if (formulaDto.IsNullOrEmpty() || formulaDto.Name.IsNullOrEmpty()) return;
var name = formulaDto.Name;
var formula = GetFormulaByName(name);
if (formula.IsNullOrEmpty())
{
// 当前不存在这个配方,则去创建这个配方
formula = new Formula()
{
Name = name,
Code = formulaDto.Code,
Description = formulaDto.Description,
Selected = false,
};
Db.Insert(formula);
}
// 插入其他的配方记录
var formulaId = formula.Id;
var algorithmParams = formulaDto.AlgorithmParams;
var altimetryParams = formulaDto.AltimetryParams;
var needleSetting = formulaDto.NeedleSetting;
var pcbSetting = formulaDto.PcbSetting;
var waferSetting = formulaDto.WaferSetting;
var jobSetting = formulaDto.JobSetting;
var axisPositionParams = formulaDto.AxisPositionParams;
var axisVariables = formulaDto.AxisVariables;
if (algorithmParams != null)
{
var algorithmParamsByFormulaId = GetAlgorithmParamsByFormulaId(formulaId);
if (algorithmParamsByFormulaId != null)
{
algorithmParams.Id = algorithmParamsByFormulaId.Id;
}
Db.SaveOrUpdate(algorithmParams);
}
if (altimetryParams != null)
{
var altimetryParamsByFormulaId = GetAltimetryParamsByFormulaId(formulaId);
if (altimetryParamsByFormulaId != null)
{
altimetryParams.Id = altimetryParamsByFormulaId.Id;
}
Db.SaveOrUpdate(altimetryParams);
}
if (needleSetting != null)
{
var needleSettingByFormulaId = GetNeedleSettingByFormulaId(formulaId);
if (needleSettingByFormulaId != null)
{
needleSetting.Id = needleSettingByFormulaId.Id;
}
Db.SaveOrUpdate(needleSetting);
}
if (pcbSetting != null)
{
var pcbSettingByFormulaId = GetPcbSettingByFormulaId(formulaId);
if (pcbSettingByFormulaId != null)
{
pcbSetting.Id = pcbSettingByFormulaId.Id;
}
Db.SaveOrUpdate(pcbSetting);
}
if (waferSetting != null)
{
var waferSettingByFormulaId = GetWaferSettingByFormulaId(formulaId);
if (waferSettingByFormulaId != null)
{
waferSetting.Id = waferSettingByFormulaId.Id;
}
Db.SaveOrUpdate(waferSetting);
}
if (jobSetting != null)
{
var jobSettingByFormulaId = GetJobSettingByFormulaId(formulaId);
if (jobSettingByFormulaId != null)
{
jobSetting.Id = jobSettingByFormulaId.Id;
}
Db.SaveOrUpdate(jobSetting);
}
if (axisPositionParams != null)
{
var axisPositionParamsByFormulaId = GetAxisPositionParamsByFormulaId(formulaId);
if (axisPositionParamsByFormulaId != null)
{
axisPositionParams.Id = axisPositionParamsByFormulaId.Id;
}
Db.SaveOrUpdate(axisPositionParams);
}
if (axisVariables != null)
{
var axisVariablesByFormulaId = GetAxisVariablesByFormulaId(formulaId);
if (axisVariablesByFormulaId != null)
{
axisVariables.Id = axisVariablesByFormulaId.Id;
}
Db.SaveOrUpdate(axisVariables);
}
}
/// <summary> /// <summary>
/// 获取所有的配方列表 /// 获取所有的配方列表
/// </summary> /// </summary>
@ -24,6 +152,11 @@ public class FormulaService
return BeanUtil.CopyProperties<FormulaDTO>(formulas); return BeanUtil.CopyProperties<FormulaDTO>(formulas);
} }
private static Formula GetFormulaByName(string name)
{
return Db.Query<Formula>("select * from formulas where name = ?", name).FirstOrDefault();
}
/// <summary> /// <summary>
/// 获取当前已经启用的配方 /// 获取当前已经启用的配方
/// </summary> /// </summary>

View File

@ -1,7 +1,9 @@
using MasstransferCommon.Model.Constant; using MasstransferCommon.Model.Constant;
using MasstransferCommon.Utils;
using MasstransferCommunicate.Mqtt.Client; using MasstransferCommunicate.Mqtt.Client;
using MasstransferExporter.DataExporter.Model; using MasstransferExporter.DataExporter.Model;
using MasstransferInfrastructure.Database.Sqlite; using MasstransferInfrastructure.Database.Sqlite;
using Masuit.Tools;
namespace MasstransferExporter.DataExporter; namespace MasstransferExporter.DataExporter;
@ -12,6 +14,110 @@ public class SystemParamsService
{ {
private static readonly SqliteHelper Db = SqliteHelper.GetInstance(); private static readonly SqliteHelper Db = SqliteHelper.GetInstance();
/// <summary>
/// 处理下发的系统配置参数
/// </summary>
/// <param name="data"></param>
public static void HandleSystemParamsIssuedEvent(ConfigData data)
{
if (data.IsNullOrEmpty()) return;
var name = data.Name;
var param = JsonUtil.ToJson(data.Param);
switch (name)
{
case "相机配置":
var cameraParams = JsonUtil.FromJson<CameraParams>(param);
if (cameraParams == null) break;
var cameraParamsFromDb = GetCameraParams();
if (cameraParamsFromDb != null)
{
cameraParams.Id = cameraParamsFromDb.Id;
}
Db.SaveOrUpdate(cameraParams);
break;
case "日志配置":
var logParams = JsonUtil.FromJson<LogParams>(param);
if (logParams == null) break;
var logParamsFromDb = GetLogParams();
if (logParamsFromDb != null)
{
logParams.Id = logParamsFromDb.Id;
}
Db.SaveOrUpdate(logParams);
break;
case "系统配置":
var systemParams = JsonUtil.FromJson<SystemParams>(param);
if (systemParams == null) break;
var systemParamsFromDb = GetSystemParams();
if (systemParamsFromDb != null)
{
systemParams.Id = systemParamsFromDb.Id;
}
Db.SaveOrUpdate(systemParams);
break;
case "扫描器配置":
var scannerParams = JsonUtil.FromJson<ScannerParams>(param);
if (scannerParams == null) break;
var scannerParamsFromDb = GetScannerParams();
if (scannerParamsFromDb != null)
{
scannerParams.Id = scannerParamsFromDb.Id;
}
Db.SaveOrUpdate(scannerParams);
break;
case "MinIO配置":
var minioParams = JsonUtil.FromJson<MinioParams>(param);
if (minioParams == null) break;
var minioParamsFromDb = GetMinioParams();
if (minioParamsFromDb != null)
{
minioParams.Id = minioParamsFromDb.Id;
}
Db.SaveOrUpdate(minioParams);
break;
case "MQTT配置":
var mqttParams = JsonUtil.FromJson<MqttParams>(param);
if (mqttParams == null) break;
var mqttParamsFromDb = GetMqttConnectParams();
if (mqttParamsFromDb != null)
{
mqttParams.Id = mqttParamsFromDb.Id;
}
Db.SaveOrUpdate(mqttParams);
break;
case "基板拍照相机内参":
var waferCameraInternalParams = JsonUtil.FromJson<CameraInternalParams>(param);
if (waferCameraInternalParams == null) break;
var waferCameraInternalParamsFromDb = GetWaferParams();
if (waferCameraInternalParamsFromDb != null)
{
waferCameraInternalParams.Id = waferCameraInternalParamsFromDb.Id;
}
Db.SaveOrUpdate(waferCameraInternalParams);
break;
case "基板拍照相机外参":
var substrateCameraInternalParams = JsonUtil.FromJson<CameraInternalParams>(param);
if (substrateCameraInternalParams == null) break;
var substrateCameraInternalParamsFromDb = GetSubstrateParams();
if (substrateCameraInternalParamsFromDb != null)
{
substrateCameraInternalParams.Id = substrateCameraInternalParamsFromDb.Id;
}
Db.SaveOrUpdate(substrateCameraInternalParams);
break;
}
}
/// <summary> /// <summary>
/// 系统参数上报 /// 系统参数上报
/// </summary> /// </summary>

View File

@ -1,5 +1,6 @@
using System.Drawing; using System.Drawing;
using MasstransferCommon.Model.Constant; using MasstransferCommon.Model.Constant;
using MasstransferCommon.Utils;
using MasstransferCommunicate.Minio; using MasstransferCommunicate.Minio;
using MasstransferCommunicate.Mqtt.Client; using MasstransferCommunicate.Mqtt.Client;
using MasstransferExporter.DataExporter.Model; using MasstransferExporter.DataExporter.Model;
@ -16,6 +17,103 @@ public class ImageService
private const string BasePath = "masstransfer"; private const string BasePath = "masstransfer";
/// <summary>
/// 监听图片查询事件
/// </summary>
public static async Task ListenImageQueryEvent()
{
await MessageQueueHelper.Subscribe(Topics.UpdateLicenseEvent, HandleImageQueryEvent);
}
/// <summary>
/// 处理图片查询请求
/// </summary>
private static async Task HandleImageQueryEvent(string topic, string payload)
{
if (payload == null) return;
var queryDto = JsonUtil.FromJson<ImageQueryDTO>(payload);
if (queryDto == null) return;
var batchNumber = queryDto.batchNumber;
var bizNumber = queryDto.bizNumber;
var imageType = queryDto.imageType;
var picType = queryDto.picType;
var isThumbnail = "thumbnail".Equals(imageType);
var bucket = isThumbnail ? "thumbnail" : "image";
var systemParams = GetSystemParams();
var imageStoragePath =
systemParams!.ImageStoragePath ?? Environment.GetEnvironmentVariable("USERPROFILE");
var dir = Path.Combine(imageStoragePath, BasePath);
if (!Directory.Exists(dir)) return;
var dirInfo = new DirectoryInfo(dir);
var batchDirs = dirInfo.GetDirectories().Where(d => d.Name.Equals(batchNumber));
foreach (var batchDir in batchDirs)
{
var dateDirs = batchDir.GetDirectories();
foreach (var dateDir in dateDirs)
{
var typeDirs = dateDir.GetDirectories();
foreach (var typeDir in typeDirs)
{
if (!typeDir.Name.Equals(picType.ToLower())) continue;
var codeDirs = typeDir.GetDirectories();
foreach (var codeDir in codeDirs)
{
if (!codeDir.Name.Equals(bizNumber)) continue;
var files = codeDir.GetFiles();
foreach (var file in files)
{
var path = file.FullName;
var name = file.Name;
if (isThumbnail)
{
// 先生成缩略图
if (file.Name.EndsWith(".bmp") && !file.Name.Contains("_thumbnail"))
{
// 判断是否已经存在缩略图,如果存在的话,则跳过生成过程
name = file.Name.Replace(".bmp", "_thumbnail.bmp");
path = file.FullName.Replace(".bmp", "_thumbnail.bmp");
if (!File.Exists(path))
{
GenerateThumbnail(file.FullName);
}
}
}
// 上传文件
var fileName = $"{Constants.SN}/{codeDir.Name}/{batchDir.Name}/{imageType}/{name}";
await Minio.UploadFileAsync(bucket, fileName, path);
var data = new ImageExportData()
{
BatchNumber = batchDir.Name,
BizNumber = codeDir.Name,
ImageType = imageType,
PicType = isThumbnail ? "thumbnail" : "raw"
};
// 上传完成后发布通知
await MessageQueueHelper.Publish(Topics.ImageUpload, data);
}
}
}
}
}
}
private static SystemParams? GetSystemParams() private static SystemParams? GetSystemParams()
{ {
return Helper.Query<SystemParams>("select * from system_params limit 1") return Helper.Query<SystemParams>("select * from system_params limit 1")
@ -105,24 +203,22 @@ public class ImageService
var imageStoragePath = var imageStoragePath =
systemParams!.ImageStoragePath ?? Environment.GetEnvironmentVariable("USERPROFILE"); systemParams!.ImageStoragePath ?? Environment.GetEnvironmentVariable("USERPROFILE");
var date = dateTime.ToString("yyyyMMdd"); var dir = Path.Combine(imageStoragePath, BasePath);
var dir = Path.Combine(imageStoragePath, BasePath, date);
if (!Directory.Exists(dir)) return; if (!Directory.Exists(dir)) return;
var dirInfo = new DirectoryInfo(dir); 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)
{
if (isThumbnail) if (isThumbnail)
{ {
// 对图片进行压缩 // 对图片进行压缩
GenerateThumbnail(dirInfo); GenerateThumbnail(batchDir);
} }
// 文件保存路径的规则是 {user BasePath}/masstransfer/images/{yyyyMMdd}/{batchCode}/wafer/{waferCode}/{timestamp}.bmp
var files = dirInfo.GetDirectories();
foreach (var batchDir in files)
{
var types = batchDir.GetDirectories(); var types = batchDir.GetDirectories();
foreach (var type in types) foreach (var type in types)
{ {

View File

@ -0,0 +1,12 @@
namespace MasstransferExporter.ImageExporter.Model;
public class ImageQueryDTO
{
public string picType { get; set; }
public string bizNumber { get; set; }
public string batchNumber { get; set; }
public string imageType { get; set; }
}

View File

@ -13,9 +13,9 @@ class Program
EnableTls = false EnableTls = false
}; };
await MessageQueueHelper.InitConnect(options); // await MessageQueueHelper.InitConnect(options);
CoordinateService.CoordinateExporter(); await FormulaService.FormulaDataExporter();
Console.WriteLine("按任意键退出"); Console.WriteLine("按任意键退出");

View File

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net8.0</TargetFramework> <TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>