From d6bb606b0ec2418fb1af47b3723716ff724bffc4 Mon Sep 17 00:00:00 2001 From: "David P.G" Date: Fri, 3 Oct 2025 00:05:17 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=AC=E6=AC=A1=E6=8F=90=E4=BA=A4=E5=8C=85?= =?UTF-8?q?=E5=90=AB=E4=BA=86=E4=B8=A4=E4=B8=AA=E4=B8=BB=E8=A6=81=E9=83=A8?= =?UTF-8?q?=E5=88=86=EF=BC=9A=E4=B8=80=E4=B8=AA=E5=85=B3=E9=94=AE=E7=9A=84?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E5=B9=B6=E5=8F=91=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=8C=E4=BB=A5=E5=8F=8A=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E5=85=B3=E4=BA=8E=E5=8E=86=E5=8F=B2=E8=AE=B0=E5=BD=95=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E7=9A=84=E5=A2=9E=E5=BC=BA=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 数据库并发修复 (Bug Fix): 2. 历史记录功能增强 (Feature): ` fix(db): 修复数据库并发连接问题并增强历史记录功能 ` 正文: ` 本次提交主要包含一个关键的 Bug 修复和一项功能增强。 1. 修复数据库并发问题: * 重构 SqlSugarDbContext,使其作为 SqlSugarClient 的工厂。 * GetInstance() 方法现在每次调用都会返回一个新的客户端实例,解决了因单例客户端导致的多线程并发访问 MySqlConnection 的问题。 2. 增强历史记录功能: * 为 VariableHistory 相关的模型、DTO 和实体添加了 NumericValue 属性,以便在历史记录中同时存储数值和字符串值。 * 更新了 HistoryProcessor 以保存 NumericValue。 * 对 ValueConvertProcessor 的逻辑进行了重构,以更好地支持值转换流程。 --- DMS.Application/DTOs/VariableHistoryDto.cs | 1 + .../Services/Processors/HistoryProcessor.cs | 1 + .../Processors/ValueConvertProcessor.cs | 105 ++++++------------ DMS.Core/Models/VariableHistory.cs | 1 + DMS.Infrastructure/Data/SqlSugarDbContext.cs | 20 ++-- .../Entities/DbVariableHistory.cs | 1 + 6 files changed, 47 insertions(+), 82 deletions(-) diff --git a/DMS.Application/DTOs/VariableHistoryDto.cs b/DMS.Application/DTOs/VariableHistoryDto.cs index f8bd630..f0665ff 100644 --- a/DMS.Application/DTOs/VariableHistoryDto.cs +++ b/DMS.Application/DTOs/VariableHistoryDto.cs @@ -11,5 +11,6 @@ public class VariableHistoryDto public int VariableId { get; set; } public string VariableName { get; set; } public string Value { get; set; } + public double NumericValue { get; set; } public DateTime Timestamp { get; set; } } \ No newline at end of file diff --git a/DMS.Application/Services/Processors/HistoryProcessor.cs b/DMS.Application/Services/Processors/HistoryProcessor.cs index 8ac9c02..c854f70 100644 --- a/DMS.Application/Services/Processors/HistoryProcessor.cs +++ b/DMS.Application/Services/Processors/HistoryProcessor.cs @@ -42,6 +42,7 @@ public class HistoryProcessor : IVariableProcessor, IDisposable { VariableId = context.Data.Id, Value = context.Data.DisplayValue?.ToString() ?? string.Empty, + NumericValue = context.Data.NumericValue, Timestamp = DateTime.Now // 记录当前时间 }; diff --git a/DMS.Application/Services/Processors/ValueConvertProcessor.cs b/DMS.Application/Services/Processors/ValueConvertProcessor.cs index 01d2695..233d2ae 100644 --- a/DMS.Application/Services/Processors/ValueConvertProcessor.cs +++ b/DMS.Application/Services/Processors/ValueConvertProcessor.cs @@ -3,6 +3,7 @@ using System.Globalization; using DMS.Application.DTOs; using DMS.Application.Interfaces; using DMS.Application.Models; +using DMS.Core.Enums; using Microsoft.Extensions.Logging; namespace DMS.Application.Services.Processors; @@ -19,20 +20,36 @@ public class ValueConvertProcessor : IVariableProcessor public Task ProcessAsync(VariableContext context) { var oldValue = context.Data.DataValue; - - // 步骤 1: 将原始值转换为 DataValue 和 NumericValue - ConvertS7ValueToStringAndNumeric(context.Data, context.NewValue); - - // 步骤 2: 根据公式计算 DisplayValue - CalculateDisplayValue(context.Data); - - context.Data.UpdatedAt = DateTime.Now; - // 如果值没有变化则中断处理链 - if (context.Data.DataValue == oldValue) + if (context.Data.DataValue == context.NewValue) { context.IsHandled = true; } + + // 步骤 1: 将原始值转换为 DataValue 和 NumericValue + context.Data.DataValue = context.NewValue; + if (context.Data.DataType == DataType.Bool) + { + context.Data.NumericValue=context.NewValue=="True"?1:0; + context.Data.DisplayValue = context.NewValue; + } + else + { + if (double.TryParse(context.Data.DataValue, NumberStyles.Float, CultureInfo.InvariantCulture, out var parsedFromStr)) + { + context.Data.NumericValue = parsedFromStr; + + } + // 步骤 2: 根据公式计算 DisplayValue + CalculateDisplayValue(context.Data); + } + + + + + context.Data.UpdatedAt = DateTime.Now; + + return Task.CompletedTask; } @@ -89,76 +106,20 @@ public class ValueConvertProcessor : IVariableProcessor /// /// 关联的变量 DTO /// 从 S7 读取的原始对象值 - private void ConvertS7ValueToStringAndNumeric(VariableDto variable, object value) + private void ConvertS7ValueToStringAndNumeric(VariableDto variable, string value) { if (value == null) return; string directConversion = null; double numericValue = 0.0; - - switch (value) + if (variable.DataType == DataType.Bool) { - case double d: - directConversion = d.ToString("G17", CultureInfo.InvariantCulture); - numericValue = d; - break; - case float f: - directConversion = f.ToString("G9", CultureInfo.InvariantCulture); - numericValue = f; - break; - case int i: - directConversion = i.ToString(CultureInfo.InvariantCulture); - numericValue = i; - break; - case uint ui: - directConversion = ui.ToString(CultureInfo.InvariantCulture); - numericValue = ui; - break; - case short s: - directConversion = s.ToString(CultureInfo.InvariantCulture); - numericValue = s; - break; - case ushort us: - directConversion = us.ToString(CultureInfo.InvariantCulture); - numericValue = us; - break; - case byte b: - directConversion = b.ToString(CultureInfo.InvariantCulture); - numericValue = b; - break; - case sbyte sb: - directConversion = sb.ToString(CultureInfo.InvariantCulture); - numericValue = sb; - break; - case long l: - directConversion = l.ToString(CultureInfo.InvariantCulture); - numericValue = l; - break; - case ulong ul: - directConversion = ul.ToString(CultureInfo.InvariantCulture); - numericValue = ul; - break; - case bool boolValue: - directConversion = boolValue.ToString().ToLowerInvariant(); - numericValue = boolValue ? 1.0 : 0.0; - break; - case string str: - directConversion = str; - if (double.TryParse(str, NumberStyles.Float, CultureInfo.InvariantCulture, out var parsedFromStr)) - { - numericValue = parsedFromStr; - } - break; - default: - _logger.LogWarning($"变量 {variable.Name} 读取到未预期的数据类型: {value.GetType().Name}, 值: {value}"); - directConversion = value.ToString() ?? string.Empty; - if (double.TryParse(directConversion, NumberStyles.Float, CultureInfo.InvariantCulture, out var parsedFromObj)) - { - numericValue = parsedFromObj; - } - break; + numericValue=value.ToString()=="True"?1.0:0.0; + directConversion = value.ToString(); + return; } + variable.DataValue = directConversion ?? value.ToString() ?? string.Empty; variable.NumericValue = numericValue; diff --git a/DMS.Core/Models/VariableHistory.cs b/DMS.Core/Models/VariableHistory.cs index b7ac7c6..5658265 100644 --- a/DMS.Core/Models/VariableHistory.cs +++ b/DMS.Core/Models/VariableHistory.cs @@ -9,5 +9,6 @@ public class VariableHistory public int VariableId { get; set; } public Variable Variable { get; set; } public string Value { get; set; } // 以字符串形式存储,便于通用性 + public double NumericValue { get; set; } public DateTime Timestamp { get; set; } } \ No newline at end of file diff --git a/DMS.Infrastructure/Data/SqlSugarDbContext.cs b/DMS.Infrastructure/Data/SqlSugarDbContext.cs index 28b640e..b87a271 100644 --- a/DMS.Infrastructure/Data/SqlSugarDbContext.cs +++ b/DMS.Infrastructure/Data/SqlSugarDbContext.cs @@ -5,14 +5,20 @@ namespace DMS.Infrastructure.Data; public class SqlSugarDbContext { - private readonly SqlSugarClient _db; + private readonly AppSettings _settings; public SqlSugarDbContext(AppSettings settings) { - var connectionString = settings.ToConnectionString(); - var dbType = (SqlSugar.DbType)Enum.Parse(typeof(SqlSugar.DbType), settings.Database.DbType); + _settings = settings; + } - _db = new SqlSugarClient(new ConnectionConfig + + public SqlSugarClient GetInstance() + { + var connectionString = _settings.ToConnectionString(); + var dbType = (SqlSugar.DbType)Enum.Parse(typeof(SqlSugar.DbType), _settings.Database.DbType); + + return new SqlSugarClient(new ConnectionConfig { ConnectionString = connectionString, DbType = dbType, @@ -20,10 +26,4 @@ public class SqlSugarDbContext InitKeyType = InitKeyType.Attribute }); } - - - public SqlSugarClient GetInstance() - { - return _db; - } } \ No newline at end of file diff --git a/DMS.Infrastructure/Entities/DbVariableHistory.cs b/DMS.Infrastructure/Entities/DbVariableHistory.cs index 248cca8..c7a7271 100644 --- a/DMS.Infrastructure/Entities/DbVariableHistory.cs +++ b/DMS.Infrastructure/Entities/DbVariableHistory.cs @@ -9,5 +9,6 @@ public class DbVariableHistory public long Id { get; set; } public int VariableId { get; set; } public string Value { get; set; } + public double NumericValue { get; set; } public DateTime Timestamp { get; set; } } \ No newline at end of file