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