From a7881ff7d08a1b94eb50596ed25bb4b5794fdd12 Mon Sep 17 00:00:00 2001 From: "821644@qq.com" <821644@qq.com> Date: Sun, 12 Apr 2026 23:33:22 +0800 Subject: [PATCH] Fix AlarmService.cs duplicate definitions - Rewrote AlarmService.cs to only contain IAlarmService and AlarmManager - Removed duplicate AlarmRuleService, AlarmNotificationService definitions - Removed duplicate IEmailService, ISmsService, IWechatService, IAlarmRuleRepository, IAlarmNotificationRepository Note: Haoliang.Core still has many errors due to: - Duplicate class definitions in SystemService.cs, TemplateService.cs, TemplateValidationService.cs, ServiceInfrastructure.cs - Missing types (DeviceState, NotificationChannel, etc.) - Ambiguous type references (TagData, DeviceCurrentStatus) --- Haoliang.Core/Services/AlarmService.cs | 490 ------------------ Haoliang.Core/Services/CacheService.cs | 6 +- Haoliang.Core/Services/DeviceStateMachine.cs | 4 +- .../Services/IProductionStatisticsService.cs | 4 +- .../Services/ProductionStatisticsService.cs | 8 +- Haoliang.Core/Services/RulesService.cs | 2 +- .../net8.0/Haoliang.Core.AssemblyInfo.cs | 2 +- .../Haoliang.Core.AssemblyInfoInputs.cache | 2 +- ...oliang.Core.csproj.AssemblyReference.cache | Bin 32845 -> 32845 bytes .../bin/Debug/net8.0/Haoliang.Data.dll | Bin 215040 -> 215040 bytes .../bin/Debug/net8.0/Haoliang.Data.pdb | Bin 51988 -> 51988 bytes .../bin/Debug/net8.0/Haoliang.Models.dll | Bin 182784 -> 182784 bytes .../bin/Debug/net8.0/Haoliang.Models.pdb | Bin 73492 -> 73492 bytes .../net8.0/Haoliang.Data.AssemblyInfo.cs | 2 +- .../Haoliang.Data.AssemblyInfoInputs.cache | 2 +- ...oliang.Data.csproj.AssemblyReference.cache | Bin 15336 -> 15336 bytes .../obj/Debug/net8.0/Haoliang.Data.dll | Bin 215040 -> 215040 bytes .../obj/Debug/net8.0/Haoliang.Data.pdb | Bin 51988 -> 51988 bytes .../obj/Debug/net8.0/ref/Haoliang.Data.dll | Bin 78848 -> 78848 bytes .../obj/Debug/net8.0/refint/Haoliang.Data.dll | Bin 78848 -> 78848 bytes .../bin/Debug/net8.0/Haoliang.Models.dll | Bin 182784 -> 182784 bytes .../bin/Debug/net8.0/Haoliang.Models.pdb | Bin 73492 -> 73492 bytes .../net8.0/Haoliang.Models.AssemblyInfo.cs | 2 +- .../Haoliang.Models.AssemblyInfoInputs.cache | 2 +- .../obj/Debug/net8.0/Haoliang.Models.dll | Bin 182784 -> 182784 bytes .../obj/Debug/net8.0/Haoliang.Models.pdb | Bin 73492 -> 73492 bytes .../obj/Debug/net8.0/ref/Haoliang.Models.dll | Bin 118272 -> 118272 bytes .../Debug/net8.0/refint/Haoliang.Models.dll | Bin 118272 -> 118272 bytes 28 files changed, 18 insertions(+), 508 deletions(-) diff --git a/Haoliang.Core/Services/AlarmService.cs b/Haoliang.Core/Services/AlarmService.cs index 6c8c0ee..ee79084 100644 --- a/Haoliang.Core/Services/AlarmService.cs +++ b/Haoliang.Core/Services/AlarmService.cs @@ -28,32 +28,6 @@ namespace Haoliang.Core.Services Task> GetDeviceAlarmsAsync(int deviceId, int days = 7); } - public interface IAlarmRuleService - { - Task CreateAlarmRuleAsync(AlarmRule rule); - Task UpdateAlarmRuleAsync(int ruleId, AlarmRule rule); - Task DeleteAlarmRuleAsync(int ruleId); - Task GetAlarmRuleByIdAsync(int ruleId); - Task> GetAllAlarmRulesAsync(); - Task> GetActiveAlarmRulesAsync(); - Task> GetRulesByDeviceAsync(int deviceId); - Task EvaluateAlarmRuleAsync(AlarmRule rule, DeviceCurrentStatus status); - Task GenerateAlarmFromRuleAsync(AlarmRule rule, DeviceCurrentStatus status); - Task TestAlarmRuleAsync(int ruleId); - } - - public interface IAlarmNotificationService - { - Task SendAlarmNotificationAsync(Alarm alarm); - Task SendBulkAlarmNotificationsAsync(IEnumerable alarms); - Task SendSmsNotificationAsync(string phoneNumber, string message); - Task SendEmailNotificationAsync(string email, string subject, string message); - Task SendWechatNotificationAsync(string openId, string message); - Task> GetNotificationHistoryAsync(DateTime startDate, DateTime endDate); - Task ConfigureNotificationChannelAsync(NotificationChannel channel); - Task> GetAvailableChannelsAsync(); - } - public class AlarmManager : IAlarmService { private readonly IAlarmRepository _alarmRepository; @@ -72,14 +46,11 @@ namespace Haoliang.Core.Services public async Task CreateAlarmAsync(Alarm alarm) { - // 设置初始状态 alarm.AlarmStatus = AlarmStatus.Active; alarm.CreateTime = DateTime.Now; alarm.UpdateTime = DateTime.Now; var createdAlarm = await _alarmRepository.AddAsync(alarm); - - // 发送告警通知 await _notificationService.SendAlarmNotificationAsync(createdAlarm); return createdAlarm; @@ -93,7 +64,6 @@ namespace Haoliang.Core.Services throw new KeyNotFoundException($"Alarm with ID {alarmId} not found"); } - // 更新字段 alarm.AlarmId = alarmId; alarm.UpdateTime = DateTime.Now; @@ -185,464 +155,4 @@ namespace Haoliang.Core.Services return await _alarmRepository.GetByDeviceAndDateRangeAsync(deviceId, startDate, endDate); } } - - public class AlarmRuleService : IAlarmRuleService - { - private readonly IAlarmRuleRepository _ruleRepository; - private readonly IAlarmRepository _alarmRepository; - private readonly IDeviceRepository _deviceRepository; - private readonly ILoggerService _logger; - - public AlarmRuleService( - IAlarmRuleRepository ruleRepository, - IAlarmRepository alarmRepository, - IDeviceRepository deviceRepository, - ILoggerService logger) - { - _ruleRepository = ruleRepository; - _alarmRepository = alarmRepository; - _deviceRepository = deviceRepository; - _logger = logger; - } - - public async Task CreateAlarmRuleAsync(AlarmRule rule) - { - rule.IsActive = true; - rule.CreateTime = DateTime.Now; - rule.UpdateTime = DateTime.Now; - - return await _ruleRepository.AddAsync(rule); - } - - public async Task UpdateAlarmRuleAsync(int ruleId, AlarmRule rule) - { - var existingRule = await _ruleRepository.GetByIdAsync(ruleId); - if (existingRule == null) - { - throw new KeyNotFoundException($"Alarm rule with ID {ruleId} not found"); - } - - rule.RuleId = ruleId; - rule.UpdateTime = DateTime.Now; - - return await _ruleRepository.UpdateAsync(rule); - } - - public async Task DeleteAlarmRuleAsync(int ruleId) - { - return await _ruleRepository.DeleteAsync(ruleId); - } - - public async Task GetAlarmRuleByIdAsync(int ruleId) - { - return await _ruleRepository.GetByIdAsync(ruleId); - } - - public async Task> GetAllAlarmRulesAsync() - { - return await _ruleRepository.GetAllAsync(); - } - - public async Task> GetActiveAlarmRulesAsync() - { - return await _ruleRepository.GetByStatusAsync(true); - } - - public async Task> GetRulesByDeviceAsync(int deviceId) - { - return await _ruleRepository.GetByDeviceIdAsync(deviceId); - } - - public async Task EvaluateAlarmRuleAsync(AlarmRule rule, DeviceCurrentStatus status) - { - if (!rule.IsActive || status == null) - return false; - - try - { - switch (rule.RuleType) - { - case AlarmRuleType.DeviceOffline: - return EvaluateDeviceOfflineRule(rule, status); - - case AlarmRuleType.TemperatureHigh: - return EvaluateTemperatureRule(rule, status); - - case AlarmRuleType.PressureHigh: - return EvaluatePressureRule(rule, status); - - case AlarmRuleType.ProductionStop: - return EvaluateProductionStopRule(rule, status); - - case AlarmRuleType.NetworkError: - return EvaluateNetworkErrorRule(rule, status); - - default: - return false; - } - } - catch (Exception ex) - { - await _logger.LogErrorAsync($"Failed to evaluate alarm rule {rule.RuleId}: {ex.Message}"); - return false; - } - } - - public async Task GenerateAlarmFromRuleAsync(AlarmRule rule, DeviceCurrentStatus status) - { - var alarm = new Alarm - { - DeviceId = status.DeviceId, - DeviceCode = "", // Will be populated from device - AlarmType = rule.AlarmType, - Severity = rule.Severity, - Title = rule.AlarmTitle, - Description = rule.AlarmDescription, - AlarmStatus = AlarmStatus.Active, - RuleId = rule.RuleId, - CreateTime = DateTime.Now, - UpdateTime = DateTime.Now - }; - - // Get device code - var device = await _deviceRepository.GetByIdAsync(status.DeviceId); - if (device != null) - { - alarm.DeviceCode = device.DeviceCode; - } - - return alarm; - } - - public async Task TestAlarmRuleAsync(int ruleId) - { - var rule = await _ruleRepository.GetByIdAsync(ruleId); - if (rule == null) - throw new KeyNotFoundException($"Alarm rule with ID {ruleId} not found"); - - // Get a sample device status for testing - var devices = await _deviceRepository.GetAllAsync(); - if (!devices.Any()) - throw new Exception("No devices available for testing"); - - var sampleDevice = devices.First(); - var deviceStatus = new DeviceCurrentStatus - { - DeviceId = sampleDevice.Id, - Status = "Running", - IsRunning = true, - NCProgram = "O1234", - CumulativeCount = 1000, - RecordTime = DateTime.Now - }; - - // Evaluate the rule - var shouldTrigger = await EvaluateAlarmRuleAsync(rule, deviceStatus); - - if (shouldTrigger) - { - var alarm = await GenerateAlarmFromRuleAsync(rule, deviceStatus); - alarm.Title = $"Test Alarm: {rule.AlarmTitle}"; - alarm.Description = $"This is a test alarm for rule '{rule.RuleName}'."; - - await _alarmRepository.AddAsync(alarm); - await _alarmRepository.SaveAsync(); - - await _logger.LogInformationAsync($"Test alarm created for rule {rule.RuleId}"); - } - else - { - await _logger.LogInformationAsync($"Rule {rule.RuleId} did not trigger alarm during test"); - } - } - - private bool EvaluateDeviceOfflineRule(AlarmRule rule, DeviceCurrentStatus status) - { - // Check if device status indicates offline - return status.Status?.ToLower() == "offline" || - !status.IsRunning || - string.IsNullOrEmpty(status.NCProgram); - } - - private bool EvaluateTemperatureRule(AlarmRule rule, DeviceCurrentStatus status) - { - // Find temperature tag - var temperatureTag = status.Tags?.FirstOrDefault(t => t.Id?.Contains("temp") == true || t.Id?.Contains("温度") == true); - if (temperatureTag == null || temperatureTag.Value == null) - return false; - - if (decimal.TryParse(temperatureTag.Value.ToString(), out decimal temperature)) - { - return temperature > rule.ThresholdValue; - } - - return false; - } - - private bool EvaluatePressureRule(AlarmRule rule, DeviceCurrentStatus status) - { - // Find pressure tag - var pressureTag = status.Tags?.FirstOrDefault(t => t.Id?.Contains("pressure") == true || t.Id?.Contains("压力") == true); - if (pressureTag == null || pressureTag.Value == null) - return false; - - if (decimal.TryParse(pressureTag.Value.ToString(), out decimal pressure)) - { - return pressure > rule.ThresholdValue; - } - - return false; - } - - private bool EvaluateProductionStopRule(AlarmRule rule, DeviceCurrentStatus status) - { - // Check if device has been stopped for specified duration - var stopDuration = TimeSpan.FromMinutes(rule.ThresholdValue); - return !status.IsRunning && - status.RecordTime < DateTime.Now.Subtract(stopDuration); - } - - private bool EvaluateNetworkErrorRule(AlarmRule rule, DeviceCurrentStatus status) - { - // Check for network-related errors in status - return status.Tags?.Any(t => t.Id?.Contains("error") == true && t.Value?.ToString() == "1") == true; - } - } - - public class AlarmNotificationService : IAlarmNotificationService - { - private readonly IAlarmNotificationRepository _notificationRepository; - private readonly IEmailService _emailService; - private readonly ISmsService _smsService; - private readonly IWechatService _wechatService; - private readonly ILoggerService _logger; - private readonly IDeviceRepository _deviceRepository; - - public AlarmNotificationService( - IAlarmNotificationRepository notificationRepository, - IEmailService emailService, - ISmsService smsService, - IWechatService wechatService, - ILoggerService logger, - IDeviceRepository deviceRepository) - { - _notificationRepository = notificationRepository; - _emailService = emailService; - _smsService = smsService; - _wechatService = wechatService; - _logger = logger; - _deviceRepository = deviceRepository; - } - - public async Task SendAlarmNotificationAsync(Alarm alarm) - { - try - { - var device = await _deviceRepository.GetByIdAsync(alarm.DeviceId); - var notificationChannels = await GetNotificationChannelsForDevice(alarm.DeviceId); - - foreach (var channel in notificationChannels) - { - if (channel.IsEnabled) - { - await SendNotificationViaChannel(alarm, channel, device); - } - } - - // Log the notification - await LogNotificationSent(alarm, notificationChannels.Count()); - } - catch (Exception ex) - { - await _logger.LogErrorAsync($"Failed to send alarm notification for alarm {alarm.AlarmId}: {ex.Message}"); - } - } - - public async Task SendBulkAlarmNotificationsAsync(IEnumerable alarms) - { - foreach (var alarm in alarms) - { - await SendAlarmNotificationAsync(alarm); - } - } - - public async Task SendSmsNotificationAsync(string phoneNumber, string message) - { - try - { - return await _smsService.SendSmsAsync(phoneNumber, message); - } - catch (Exception ex) - { - await _logger.LogErrorAsync($"Failed to send SMS to {phoneNumber}: {ex.Message}"); - return false; - } - } - - public async Task SendEmailNotificationAsync(string email, string subject, string message) - { - try - { - return await _emailService.SendEmailAsync(email, subject, message); - } - catch (Exception ex) - { - await _logger.LogErrorAsync($"Failed to send email to {email}: {ex.Message}"); - return false; - } - } - - public async Task SendWechatNotificationAsync(string openId, string message) - { - try - { - return await _wechatService.SendMessageAsync(openId, message); - } - catch (Exception ex) - { - await _logger.LogErrorAsync($"Failed to send WeChat message to {openId}: {ex.Message}"); - return false; - } - } - - public async Task> GetNotificationHistoryAsync(DateTime startDate, DateTime endDate) - { - return await _notificationRepository.GetByDateRangeAsync(startDate, endDate); - } - - public async Task ConfigureNotificationChannelAsync(NotificationChannel channel) - { - // Validate channel configuration - if (!ValidateChannelConfiguration(channel)) - return false; - - // Save channel configuration - return await _notificationRepository.SaveChannelAsync(channel); - } - - public async Task> GetAvailableChannelsAsync() - { - return await _notificationRepository.GetAllChannelsAsync(); - } - - private async Task> GetNotificationChannelsForDevice(int deviceId) - { - // This would typically query the database for device-specific notification settings - // For now, return a default set of channels - return new List - { - new NotificationChannel { ChannelType = NotificationChannelType.Email, IsEnabled = true }, - new NotificationChannel { ChannelType = NotificationChannelType.Sms, IsEnabled = false }, - new NotificationChannel { ChannelType = NotificationChannelType.WeChat, IsEnabled = false } - }; - } - - private async Task SendNotificationViaChannel(Alarm alarm, NotificationChannel channel, Device device) - { - var message = FormatAlarmMessage(alarm, device); - var subject = $"Alarm: {alarm.AlarmType} - {device?.DeviceCode}"; - - switch (channel.ChannelType) - { - case NotificationChannelType.Email: - if (!string.IsNullOrEmpty(channel.Recipient)) - { - await SendEmailNotificationAsync(channel.Recipient, subject, message); - } - break; - - case NotificationChannelType.Sms: - if (!string.IsNullOrEmpty(channel.Recipient)) - { - await SendSmsNotificationAsync(channel.Recipient, message); - } - break; - - case NotificationChannelType.WeChat: - if (!string.IsNullOrEmpty(channel.Recipient)) - { - await SendWechatNotificationAsync(channel.Recipient, message); - } - break; - } - } - - private string FormatAlarmMessage(Alarm alarm, Device device) - { - return $"🚨 Alarm Alert\n\n" + - $"Device: {device?.DeviceCode} ({device?.DeviceName})\n" + - $"Type: {alarm.AlarmType}\n" + - $"Severity: {alarm.Severity}\n" + - $"Title: {alarm.Title}\n" + - $"Description: {alarm.Description}\n" + - $"Time: {alarm.CreateTime:yyyy-MM-dd HH:mm:ss}\n" + - $"Device ID: {alarm.DeviceId}"; - } - - private bool ValidateChannelConfiguration(NotificationChannel channel) - { - switch (channel.ChannelType) - { - case NotificationChannelType.Email: - return !string.IsNullOrEmpty(channel.Recipient) && channel.Recipient.Contains("@"); - - case NotificationChannelType.Sms: - return !string.IsNullOrEmpty(channel.Recipient) && channel.Recipient.All(char.IsDigit); - - case NotificationChannelType.WeChat: - return !string.IsNullOrEmpty(channel.Recipient); - - default: - return false; - } - } - - private async Task LogNotificationSent(Alarm alarm, int channelCount) - { - var notification = new AlarmNotification - { - AlarmId = alarm.AlarmId, - NotificationTime = DateTime.Now, - ChannelsUsed = channelCount, - Success = true - }; - - await _notificationRepository.AddNotificationAsync(notification); - } - } - - // Additional supporting classes and interfaces - public interface IEmailService - { - Task SendEmailAsync(string email, string subject, string message); - } - - public interface ISmsService - { - Task SendSmsAsync(string phoneNumber, string message); - } - - public interface IWechatService - { - Task SendMessageAsync(string openId, string message); - } - - public interface IAlarmRuleRepository - { - Task AddAsync(AlarmRule rule); - Task UpdateAsync(AlarmRule rule); - Task DeleteAsync(int ruleId); - Task GetByIdAsync(int ruleId); - Task> GetAllAsync(); - Task> GetByStatusAsync(bool isActive); - Task> GetByDeviceIdAsync(int deviceId); - } - - public interface IAlarmNotificationRepository - { - Task AddNotificationAsync(AlarmNotification notification); - Task> GetByDateRangeAsync(DateTime startDate, DateTime endDate); - Task SaveChannelAsync(NotificationChannel channel); - Task> GetAllChannelsAsync(); - } } \ No newline at end of file diff --git a/Haoliang.Core/Services/CacheService.cs b/Haoliang.Core/Services/CacheService.cs index 9723e4d..399cc53 100644 --- a/Haoliang.Core/Services/CacheService.cs +++ b/Haoliang.Core/Services/CacheService.cs @@ -5,9 +5,9 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Caching.Memory; using Haoliang.Core.Services; -using Haoliang.Models.Models.Device; -using Haoliang.Models.Models.Production; -using Haoliang.Models.Models.System; +using Haoliang.Models.Device; +using Haoliang.Models.Production; +using Haoliang.Models.System; namespace Haoliang.Core.Services { diff --git a/Haoliang.Core/Services/DeviceStateMachine.cs b/Haoliang.Core/Services/DeviceStateMachine.cs index 84be102..ebf5232 100644 --- a/Haoliang.Core/Services/DeviceStateMachine.cs +++ b/Haoliang.Core/Services/DeviceStateMachine.cs @@ -6,8 +6,8 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Hosting; using Haoliang.Core.Services; -using Haoliang.Models.Models.Device; -using Haoliang.Models.Models.System; +using Haoliang.Models.Device; +using Haoliang.Models.System; using Haoliang.Models.Common; namespace Haoliang.Core.Services diff --git a/Haoliang.Core/Services/IProductionStatisticsService.cs b/Haoliang.Core/Services/IProductionStatisticsService.cs index 0bf72e8..5e97e70 100644 --- a/Haoliang.Core/Services/IProductionStatisticsService.cs +++ b/Haoliang.Core/Services/IProductionStatisticsService.cs @@ -1,8 +1,8 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; -using Haoliang.Models.Models.System; -using Haoliang.Models.Models.Production; +using Haoliang.Models.System; +using Haoliang.Models.Production; namespace Haoliang.Core.Services { diff --git a/Haoliang.Core/Services/ProductionStatisticsService.cs b/Haoliang.Core/Services/ProductionStatisticsService.cs index 2efb25a..f9eed6f 100644 --- a/Haoliang.Core/Services/ProductionStatisticsService.cs +++ b/Haoliang.Core/Services/ProductionStatisticsService.cs @@ -5,10 +5,10 @@ using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using Haoliang.Core.Services; using Haoliang.Data.Repositories; -using Haoliang.Models.Models.Device; -using Haoliang.Models.Models.Production; -using Haoliang.Models.Models.System; -using Haoliang.Models.Models.DataCollection; +using Haoliang.Models.Device; +using Haoliang.Models.Production; +using Haoliang.Models.System; +using Haoliang.Models.DataCollection; namespace Haoliang.Core.Services { diff --git a/Haoliang.Core/Services/RulesService.cs b/Haoliang.Core/Services/RulesService.cs index 49ee57e..e313ec3 100644 --- a/Haoliang.Core/Services/RulesService.cs +++ b/Haoliang.Core/Services/RulesService.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; -using Haoliang.Models.Models.System; +using Haoliang.Models.System; namespace Haoliang.Core.Services { diff --git a/Haoliang.Core/obj/Debug/net8.0/Haoliang.Core.AssemblyInfo.cs b/Haoliang.Core/obj/Debug/net8.0/Haoliang.Core.AssemblyInfo.cs index b3edc0e..5e5685f 100644 --- a/Haoliang.Core/obj/Debug/net8.0/Haoliang.Core.AssemblyInfo.cs +++ b/Haoliang.Core/obj/Debug/net8.0/Haoliang.Core.AssemblyInfo.cs @@ -13,7 +13,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("Haoliang.Core")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+c3d17cebb9da179f6753a56af8a0a77a244c32f3")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+816621dcb94c35c3cc1e4fd61efdefc7363e63f2")] [assembly: System.Reflection.AssemblyProductAttribute("Haoliang.Core")] [assembly: System.Reflection.AssemblyTitleAttribute("Haoliang.Core")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/Haoliang.Core/obj/Debug/net8.0/Haoliang.Core.AssemblyInfoInputs.cache b/Haoliang.Core/obj/Debug/net8.0/Haoliang.Core.AssemblyInfoInputs.cache index 65eb7e8..c16394e 100644 --- a/Haoliang.Core/obj/Debug/net8.0/Haoliang.Core.AssemblyInfoInputs.cache +++ b/Haoliang.Core/obj/Debug/net8.0/Haoliang.Core.AssemblyInfoInputs.cache @@ -1 +1 @@ -8be02421dfff2584ed0de880e6906d7bb86a51af3956a22dc9c02300e5c63caa +7c8177bddf0522256331d06c7b8179260f0ae30b251ffa6343312621856d61d8 diff --git a/Haoliang.Core/obj/Debug/net8.0/Haoliang.Core.csproj.AssemblyReference.cache b/Haoliang.Core/obj/Debug/net8.0/Haoliang.Core.csproj.AssemblyReference.cache index 9947f23f60794526a116dcd06b0641423a516450..5658080e0567d9177c5ba1a806c5abec7bf575b5 100644 GIT binary patch delta 29 lcmX@xz;w2OX+k9HZRscW%QwcYVq{&#!{xYqGcS`v9RRoi3p4-# delta 29 lcmX@xz;w2OX+k8cvd7cOOE$)>Vr12;E`G3dGcS`v9RRr!3-ka0 diff --git a/Haoliang.Data/bin/Debug/net8.0/Haoliang.Data.dll b/Haoliang.Data/bin/Debug/net8.0/Haoliang.Data.dll index 80c2e7bcc491de1166bc6b4f6a437ae3a4afda56..0a46a3468ba02d2c54a008dd85a2496bf7f928bb 100644 GIT binary patch delta 270 zcmZpez}ql^cR~k?6ZfUA#-7$5#;rX}YYqy$eG;(YV;!&GrW@01%+o zg`t_5kzq=5lBG$qv1zh#a&084#y}$utI|?cuJ>E13Wh98_HZ delta 270 zcmZpez}ql^cR~k?-aGdbjXkYBj9Yt{)*KXQvbeqM?s`j~joz0gWi1vD+3s1%*- zvT=%`d2(t}l4VMwp}A$6nYpQPqN!P8nnj{PqPcmZk%>vNu~C{a0|N^q0|SFSBZJlS zk0Q*P({GD13vXW|%-o{GvfNF!Z@P&CbAUjj`ivu!Wgd7>G_g72f3{a+`VtHLkfc-gE>PoLn=cO5LyEHiC_^+hBO8< rpo}R{O(Kvq1CnVB7C_Pfh|Pg8k-><;1PDQ<7y;#sw}-njuVexMxDHXU diff --git a/Haoliang.Data/bin/Debug/net8.0/Haoliang.Data.pdb b/Haoliang.Data/bin/Debug/net8.0/Haoliang.Data.pdb index e725920e703f355393a840b2c6ba77e7b9bc136f..55961745107437e30b1a9c333ff1a784ae6d2771 100644 GIT binary patch delta 101 zcmV-r0Gj`lmIIWQ1CV?aX~5QuKOG)OxS+t5=_HCa)jSc4v5>x3Ahfgd5QWDSsX$P< zd-GtSjbVr_hUXp^5PH8{Qefbejk9i8c>)*@_IaNGU;+TZoD4x3AX~W>R-dV1%s2ES z9IGVV9Szt8t5gb{wY2)yZ`Gap5VLMrc>)*%J2{*HU;+T6Ao89wbjnJQ`@E*f+Lx-c H|5_Dr|Fka2 diff --git a/Haoliang.Data/bin/Debug/net8.0/Haoliang.Models.dll b/Haoliang.Data/bin/Debug/net8.0/Haoliang.Models.dll index c2d95fe80c0aa53f854e82ab7c079f3e99e06611..e7ab6dccfd2bb85cbbf7d69ec62ecb0c1fe721e2 100644 GIT binary patch delta 249 zcmZpe!rd^1dqM}xb?kWOJpW=LYNWH15J#tf!lG8sr3GNb~<(tz@2U^a-A3gjm delta 249 zcmZpe!rd^1dqM|Gi{poBjXkYBj9Yt{YPJbj`Q>gXQ~KmFLu5zSVLoQL?GoFW=5T2w z8>bkWC#NPQS*9c!np>usnVT9Xnwll1StJ@HnwuvYnV2LS8>JafzjKgDhb48(tR2&N z4lxA?wC1QDyL;lc-@GvEBMG05x=qhH#1x?b743tG0@Yjmo>*|kYyXv#%gy3;Y=3fy z$%4f{nZcMLg~5=)oFSPZl_3cTErI+*u!to?8iN^7#uTU~5lET=$utHFAZY-^=0KRp WV8mbogdkIlfO5v$vyU@PWdZ>2xl>pG diff --git a/Haoliang.Data/bin/Debug/net8.0/Haoliang.Models.pdb b/Haoliang.Data/bin/Debug/net8.0/Haoliang.Models.pdb index 7c3395b97b631c2a005871f3069e45a3e881fc77..7da75140ede660a9515be6a3a5ff0e33ad13c481 100644 GIT binary patch delta 71 zcmV-N0J#5@z66xM1dx0bL<|B^Q0p>6l$4m@C;fO&Cv0Ypv5?8dAdLvrxscW+h%$3n d)ld1hp8GWVzqhF+FmY2XY7S~m<+FLln^>BGB1r%M delta 71 zcmV-N0J#5@z66xM1dx0bg={6p-N@Tco>n`=VDiOAWwe^Ov5?8dAYoWLpX0_=q+3$n dpP@y_@>HKzn<(7Z(z>% delta 16 YcmaD+{-S(BB&)K=)5%LV#&uZ(07#k$2mk;8 diff --git a/Haoliang.Data/obj/Debug/net8.0/Haoliang.Data.dll b/Haoliang.Data/obj/Debug/net8.0/Haoliang.Data.dll index 80c2e7bcc491de1166bc6b4f6a437ae3a4afda56..0a46a3468ba02d2c54a008dd85a2496bf7f928bb 100644 GIT binary patch delta 270 zcmZpez}ql^cR~k?6ZfUA#-7$5#;rX}YYqy$eG;(YV;!&GrW@01%+o zg`t_5kzq=5lBG$qv1zh#a&084#y}$utI|?cuJ>E13Wh98_HZ delta 270 zcmZpez}ql^cR~k?-aGdbjXkYBj9Yt{)*KXQvbeqM?s`j~joz0gWi1vD+3s1%*- zvT=%`d2(t}l4VMwp}A$6nYpQPqN!P8nnj{PqPcmZk%>vNu~C{a0|N^q0|SFSBZJlS zk0Q*P({GD13vXW|%-o{GvfNF!Z@P&CbAUjj`ivu!Wgd7>G_g72f3{a+`VtHLkfc-gE>PoLn=cO5LyEHiC_^+hBO8< rpo}R{O(Kvq1CnVB7C_Pfh|Pg8k-><;1PDQ<7y;#sw}-njuVexMxDHXU diff --git a/Haoliang.Data/obj/Debug/net8.0/Haoliang.Data.pdb b/Haoliang.Data/obj/Debug/net8.0/Haoliang.Data.pdb index e725920e703f355393a840b2c6ba77e7b9bc136f..55961745107437e30b1a9c333ff1a784ae6d2771 100644 GIT binary patch delta 101 zcmV-r0Gj`lmIIWQ1CV?aX~5QuKOG)OxS+t5=_HCa)jSc4v5>x3Ahfgd5QWDSsX$P< zd-GtSjbVr_hUXp^5PH8{Qefbejk9i8c>)*@_IaNGU;+TZoD4x3AX~W>R-dV1%s2ES z9IGVV9Szt8t5gb{wY2)yZ`Gap5VLMrc>)*%J2{*HU;+T6Ao89wbjnJQ`@E*f+Lx-c H|5_Dr|Fka2 diff --git a/Haoliang.Data/obj/Debug/net8.0/ref/Haoliang.Data.dll b/Haoliang.Data/obj/Debug/net8.0/ref/Haoliang.Data.dll index 4e7e210fcf4b127cc8d1dad75aa93d2764ee507f..3c8ab788e0accd45803305da8d8692ae5efe15f6 100644 GIT binary patch delta 198 zcmZp8!P4-8WkLtbirl4dH};e;3m6CfG+DKY$#qwJsPa_5nug7SEbkdN|7VSSfhm>o z&OuPa!qCjj$S@^2$o z&OuNk**L|}JUKNf$ucF;(A+Z3%-qyC(bOz4%_7kt(cC=I$iyVs*eK0-^M(HwhW^P6 z#tbP8h79Hm$qcCsNkC`` diff --git a/Haoliang.Data/obj/Debug/net8.0/refint/Haoliang.Data.dll b/Haoliang.Data/obj/Debug/net8.0/refint/Haoliang.Data.dll index 4e7e210fcf4b127cc8d1dad75aa93d2764ee507f..3c8ab788e0accd45803305da8d8692ae5efe15f6 100644 GIT binary patch delta 198 zcmZp8!P4-8WkLtbirl4dH};e;3m6CfG+DKY$#qwJsPa_5nug7SEbkdN|7VSSfhm>o z&OuPa!qCjj$S@^2$o z&OuNk**L|}JUKNf$ucF;(A+Z3%-qyC(bOz4%_7kt(cC=I$iyVs*eK0-^M(HwhW^P6 z#tbP8h79Hm$qcCsNkC`` diff --git a/Haoliang.Models/bin/Debug/net8.0/Haoliang.Models.dll b/Haoliang.Models/bin/Debug/net8.0/Haoliang.Models.dll index c2d95fe80c0aa53f854e82ab7c079f3e99e06611..e7ab6dccfd2bb85cbbf7d69ec62ecb0c1fe721e2 100644 GIT binary patch delta 249 zcmZpe!rd^1dqM}xb?kWOJpW=LYNWH15J#tf!lG8sr3GNb~<(tz@2U^a-A3gjm delta 249 zcmZpe!rd^1dqM|Gi{poBjXkYBj9Yt{YPJbj`Q>gXQ~KmFLu5zSVLoQL?GoFW=5T2w z8>bkWC#NPQS*9c!np>usnVT9Xnwll1StJ@HnwuvYnV2LS8>JafzjKgDhb48(tR2&N z4lxA?wC1QDyL;lc-@GvEBMG05x=qhH#1x?b743tG0@Yjmo>*|kYyXv#%gy3;Y=3fy z$%4f{nZcMLg~5=)oFSPZl_3cTErI+*u!to?8iN^7#uTU~5lET=$utHFAZY-^=0KRp WV8mbogdkIlfO5v$vyU@PWdZ>2xl>pG diff --git a/Haoliang.Models/bin/Debug/net8.0/Haoliang.Models.pdb b/Haoliang.Models/bin/Debug/net8.0/Haoliang.Models.pdb index 7c3395b97b631c2a005871f3069e45a3e881fc77..7da75140ede660a9515be6a3a5ff0e33ad13c481 100644 GIT binary patch delta 71 zcmV-N0J#5@z66xM1dx0bL<|B^Q0p>6l$4m@C;fO&Cv0Ypv5?8dAdLvrxscW+h%$3n d)ld1hp8GWVzqhF+FmY2XY7S~m<+FLln^>BGB1r%M delta 71 zcmV-N0J#5@z66xM1dx0bg={6p-N@Tco>n`=VDiOAWwe^Ov5?8dAYoWLpX0_=q+3$n dpP@y_@>HKzn<(7Z(?kWOJpW=LYNWH15J#tf!lG8sr3GNb~<(tz@2U^a-A3gjm delta 249 zcmZpe!rd^1dqM|Gi{poBjXkYBj9Yt{YPJbj`Q>gXQ~KmFLu5zSVLoQL?GoFW=5T2w z8>bkWC#NPQS*9c!np>usnVT9Xnwll1StJ@HnwuvYnV2LS8>JafzjKgDhb48(tR2&N z4lxA?wC1QDyL;lc-@GvEBMG05x=qhH#1x?b743tG0@Yjmo>*|kYyXv#%gy3;Y=3fy z$%4f{nZcMLg~5=)oFSPZl_3cTErI+*u!to?8iN^7#uTU~5lET=$utHFAZY-^=0KRp WV8mbogdkIlfO5v$vyU@PWdZ>2xl>pG diff --git a/Haoliang.Models/obj/Debug/net8.0/Haoliang.Models.pdb b/Haoliang.Models/obj/Debug/net8.0/Haoliang.Models.pdb index 7c3395b97b631c2a005871f3069e45a3e881fc77..7da75140ede660a9515be6a3a5ff0e33ad13c481 100644 GIT binary patch delta 71 zcmV-N0J#5@z66xM1dx0bL<|B^Q0p>6l$4m@C;fO&Cv0Ypv5?8dAdLvrxscW+h%$3n d)ld1hp8GWVzqhF+FmY2XY7S~m<+FLln^>BGB1r%M delta 71 zcmV-N0J#5@z66xM1dx0bg={6p-N@Tco>n`=VDiOAWwe^Ov5?8dAYoWLpX0_=q+3$n dpP@y_@>HKzn<(7Z(#pR@@8N*h?NTDCo`A> U)tLctDws@TFxsAdnsF)<02Yfsng9R* delta 204 zcmZpe!`?85eL@Edv$f@%jXfpI0*e(s%`+}Jl(^v1CYNFaye%0@Wk}Ni!gs#$W*?4S?7j Y2oo8M7)*c=WQq|`&UkzFX~wBc08#)yxBvhE diff --git a/Haoliang.Models/obj/Debug/net8.0/refint/Haoliang.Models.dll b/Haoliang.Models/obj/Debug/net8.0/refint/Haoliang.Models.dll index 6906f4e0cefca02e164a1c2de9a44ad6f46eb75c..ed585ee9336a1b05abfd10a6addd52771e904341 100644 GIT binary patch delta 204 zcmZpe!`?85eL@Ed|F_Ed8+%Ha1rE&Nas9O+#beUORWs*(V*IsPkmWsN^MBUu|5+I? zZo`n?{$LN|EDj9|Lo+iY!<6JCOOs?{(`4i1WW!XGv=lSL)U=e;v}AK*Gvib<<20k~ zi;gl@vHDvu7&4dvp%IWyVMu03Vz6W|0n)|{reHD|NE$Mv0>#pR@@8N*h?NTDCo`A> U)tLctDws@TFxsAdnsF)<02Yfsng9R* delta 204 zcmZpe!`?85eL@Edv$f@%jXfpI0*e(s%`+}Jl(^v1CYNFaye%0@Wk}Ni!gs#$W*?4S?7j Y2oo8M7)*c=WQq|`&UkzFX~wBc08#)yxBvhE