Добавлено WitsRecordDto

This commit is contained in:
ngfrolov 2023-03-31 11:26:42 +05:00
parent 7d83a0a93d
commit 2e1678f401
Signed by: ng.frolov
GPG Key ID: E99907A0357B29A7
7 changed files with 116 additions and 76 deletions

View File

@ -0,0 +1,14 @@
namespace AsbCloudApp.Data.GTR
{
/// <summary>
/// Класс позволяющий хранить значение неопределенного типа.
/// Все возможные типы должны быть описаны в JsonValueJsonConverter.
/// </summary>
/// <param name="Value"></param>
public record JsonValue(object Value)
{
/// <inheritdoc/>
public override string ToString()
=> Value.ToString() ?? string.Empty;
}
}

View File

@ -1,25 +0,0 @@
using System;
namespace AsbCloudApp.Data.GTR
{
/// <summary>
/// класс для получения данных ГТИ с значением типа float
/// </summary>
public class WitsFloatDto : ITelemetryData
{
/// <inheritdoc/>
public DateTime DateTime { get; set; }
/// <inheritdoc/>
public int IdTelemetry { get; set; }
/// <summary>
/// ИД рекорда согласно спецификации WITS
/// </summary>
public int IdRecord { get; set; }
/// <summary>
/// ИД элемента рекорда согласно спецификации WITS
/// </summary>
public int IdItem { get; set; }
/// <inheritdoc/>
public float? Value { get; set; }
}
}

View File

@ -1,25 +0,0 @@
using System;
namespace AsbCloudApp.Data.GTR
{
/// <summary>
/// класс для получения данных ГТИ с значением типа int16 int32
/// </summary>
public class WitsIntDto
{
/// <inheritdoc/>
public DateTime DateTime { get; set; }
/// <inheritdoc/>
public int IdTelemetry { get; set; }
/// <summary>
/// ИД рекорда согласно спецификации WITS
/// </summary>
public int IdRecord { get; set; }
/// <summary>
/// ИД элемента рекорда согласно спецификации WITS
/// </summary>
public int IdItem { get; set; }
/// <inheritdoc/>
public int? Value { get; set; }
}
}

View File

@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
namespace AsbCloudApp.Data.GTR
{
/// <summary>
/// Запись WITS
/// </summary>
public class WitsRecordDto
{
/// <summary>
/// Id записи
/// </summary>
public int Id { get; set; }
/// <summary>
/// Дата создания записи
/// </summary>
public DateTime Date { get; set; }
/// <summary>
/// Параметры. Ключ - id_item. ValueContainer содержит значение.
/// </summary>
public Dictionary<int, JsonValue> Items { get; set; } = new();
}
}

View File

@ -1,25 +0,0 @@
using System;
namespace AsbCloudApp.Data.GTR
{
/// <summary>
/// класс для получения данных ГТИ с значением типа string
/// </summary>
public class WitsStrDto : WitsBaseDto
{
/// <inheritdoc/>
public DateTime DateTime { get; set; }
/// <inheritdoc/>
public int IdTelemetry { get; set; }
/// <summary>
/// ИД рекорда согласно спецификации WITS
/// </summary>
public int IdRecord { get; set; }
/// <summary>
/// ИД элемента рекорда согласно спецификации WITS
/// </summary>
public int IdItem { get; set; }
/// <inheritdoc/>
public string? Value { get; set; }
}
}

View File

@ -0,0 +1,74 @@
using System;
using System.Globalization;
using System.Text.Json.Serialization;
using System.Text.Json;
using AsbCloudApp.Data.GTR;
namespace AsbCloudWebApi.Converters
{
public class JsonValueJsonConverter : JsonConverter<JsonValue>
{
public override JsonValue Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType == JsonTokenType.String)
{
var stringVal = reader.GetString() ?? string.Empty;
return new JsonValue(stringVal);
}
if (reader.TokenType == JsonTokenType.Number)
{
if (reader.TryGetInt32(out int intVal))
return new JsonValue(intVal);
if (reader.TryGetDouble(out double doubleVal))
return new JsonValue((float)doubleVal);
}
throw new FormatException($"Wrong format at position {reader.Position}");
}
public override void Write(Utf8JsonWriter writer, JsonValue value, JsonSerializerOptions options)
{
if (value.Value is string strValue)
{
writer.WriteStringValue(FormatString(strValue));
return;
}
if (value.Value is int intValue)
{
writer.WriteNumberValue(intValue);
return;
}
if (value.Value is short shortValue)
{
writer.WriteNumberValue(shortValue);
return;
}
if (value.Value is float floatValue)
{
writer.WriteRawValue(floatValue.ToString("#0.0##", CultureInfo.InvariantCulture), true);
return;
}
if (value.Value is double doubleValue)
{
writer.WriteRawValue(doubleValue.ToString("#0.0##", CultureInfo.InvariantCulture), true);
return;
}
var typeName = value.Value.GetType().Name;
throw new NotImplementedException($"{typeName} is not supported type for WITS value");
}
private static string FormatString(string value)
=> value
.Replace("\"", "")
.Trim()
.Replace("\r", "")
.Replace("\n", "");
}
}

View File

@ -22,13 +22,14 @@ namespace AsbCloudWebApi
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers()
.AddJsonOptions(new System.Action<Microsoft.AspNetCore.Mvc.JsonOptions>(options =>
.AddJsonOptions(new System.Action<JsonOptions>(options =>
{
options.JsonSerializerOptions.NumberHandling =
System.Text.Json.Serialization.JsonNumberHandling.AllowNamedFloatingPointLiterals |
System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString;
options.JsonSerializerOptions.Converters.Add(new DateOnlyJsonConverter());
options.JsonSerializerOptions.Converters.Add(new JsonValueJsonConverter());
}))
.AddProtoBufNet();